[
  {
    "path": ".dockerignore",
    "content": "# Ignore everything\n*\n\n# Only allow\n!production/environment.yml\n"
  },
  {
    "path": ".git-blame-ignore-revs",
    "content": "# https://github.com/OpenFreeEnergy/openfe/pull/1604 - ruff formatting part 1\n3a08b6809fc57662e4146db3c7ccedfbc7c7c8df  \n\n# https://github.com/OpenFreeEnergy/openfe/pull/1610 - ruff formatting part 2\n2311a2f2d956dd30e95c180841ce19b921d89e1f\n\n# https://github.com/OpenFreeEnergy/openfe/pull/1622 - ruff formatting part 3\nd7196d119e2f65d88e488afc665f2521e4f68042\n\n# https://github.com/OpenFreeEnergy/openfe/pull/1623 - ruff formatting part 4\n036869ae81670c6dcfa2532f125ee88c3f35936c\n\n# https://github.com/OpenFreeEnergy/openfe/pull/1665 - ruff isort\n588f552ca9200a99fd77aed993ea3766b154ee53\n\n# https://github.com/OpenFreeEnergy/openfe/pull/1667 - ruff f-strings and whitespace\n18f211db974cdde38a5d88d6e74aaaf78fda8897\n\n# https://github.com/OpenFreeEnergy/openfe/pull/1668 - ruff pycodestyle changes \nb693d37c8ac0e30283bd8b5f13386fdc98901cf8\n"
  },
  {
    "path": ".gitattributes",
    "content": ""
  },
  {
    "path": ".github/CONTRIBUTING.md",
    "content": "# Contributing to OpenFE\n\nThanks for contributing to the OpenFE software project!\nRead our [code of conduct](../Code_of_Conduct.md) to understand the standards you must adhere to.\n\n## Questions\n\nIf you have any questions on using the OpenFE package, reach out on the \"Discussions\" tab above to start a conversation!\nWe are happy to get you started in using our software.\n\n## Issues\n\nIf you think you have encountered a software issue, please raise this on the \"Issues\" tab in Github.\nIn general the more details you can provide the better, \nwe recommend reading section 3.3 of [this article](https://livecomsjournal.org/index.php/livecoms/article/view/v3i1e1473)\nto understand the problem solving process.\n\n## Contributing\n\nWe welcome any fixes or code contributions.\nNote that any contributions made must be made under a MIT license.\nFeel free to reach out to the developer team who can assist you in this process.\n"
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE/release_template.md",
    "content": "<!--\nChecklist for releasing a new version of openfe. \n-->\n\nMake the PR:\n* [ ] Create a new release prep branch corresponding to the version name, e.g. `release/v1.2.0`.  Note: please follow [semantic versioning](https://semver.org/).\n* [ ] Check that all user-relevant updates are included in the `news/` rever `.rst` files. You can backfill any additional items by making a new .rst, e.g. `backfill.rst`\n* [ ] Run [rever](https://regro.github.io/rever-docs/index.html#), e.g. `rever 1.2.0`. This will auto-commit `docs/CHANGELOG.md` and remove the `.rst` files from `news/`. \n* [ ] Verify that`docs/CHANGELOG.rst` looks correct and that it renders as expected in the docs preview.\n* [ ] If needed, create a release of the [example notebooks repository](https://github.com/OpenFreeEnergy/ExampleNotebooks) and update the pinned release version in the `openfe/docs/conf.py`.\n* [ ] Make the PR and verify that CI/CD passes. \n  * [ ] [feedstock packaging tests](https://github.com/OpenFreeEnergy/openfe/actions/workflows/release-prep-feedstock.yaml)\n  * [ ] [example notebooks](https://github.com/OpenFreeEnergy/openfe/actions/workflows/release-prep-examplenotebooks.yaml)\n  * [ ] [GPU tests](https://github.com/OpenFreeEnergy/openfe/actions/workflows/aws-gpu-integration-tests.yaml)\n* [ ] Merge the PR into `main`.\n\nAfter Merging the PR [follow this guide](https://github.com/OpenFreeEnergy/openfe/wiki/How-to-create-a-new-release)\n\n"
  },
  {
    "path": ".github/pull_request_template.md",
    "content": "<!--\nThank you for pull request.\nBelow are a few things we ask you kindly to self-check before getting a review. Remove checks that are not relevant.\n-->\n\n<!--\nPlease note any issues this fixes using [closing keywords]( https://help.github.com/articles/closing-issues-using-keywords/ ):\n-->\n\n<!--\nsee https://regro.github.io/rever-docs/news.html for details on how to add news entry (you do not need to run the rever command)\n-->\n\nChecklist\n* [ ] All new code is appropriately documented (user-facing code _must_ have complete docstrings).\n* [ ] Added a ``news`` entry, or the changes are not user-facing.\n* [ ] Ran pre-commit: you can run [pre-commit](https://pre-commit.com) locally or comment on this PR with `pre-commit.ci autofix`.\n\nManual Tests: these are slow so don't need to be run every commit, only before merging and when relevant changes are made (generally at reviewer-discretion). \n* [ ] [GPU integration tests](https://github.com/OpenFreeEnergy/openfe/actions/workflows/aws-gpu-integration-tests.yaml)\n* [ ] [example notebook testing](https://github.com/OpenFreeEnergy/openfe/actions/workflows/release-prep-examplenotebooks.yaml)\n* [ ] [packaging tests](https://github.com/OpenFreeEnergy/openfe/actions/workflows/cron-package-test.yaml): run this for any large feature PRs or PRs that add test data.\n\n\n## Developers certificate of origin\n- [ ] I certify that this contribution is covered by the MIT License [here](https://github.com/OpenFreeEnergy/openfe/blob/main/LICENSE) and the **Developer Certificate of Origin** at <https://developercertificate.org/>.\n"
  },
  {
    "path": ".github/workflows/aws-cpu-long-tests.yaml",
    "content": "name: \"manual AWS: CPU long tests\"\non:\n  workflow_dispatch:\n\njobs:\n  start-aws-runner:\n    runs-on: ubuntu-latest\n    permissions:\n      id-token: write\n      contents: read\n    outputs:\n      mapping: ${{ steps.aws-start.outputs.mapping }}\n    steps:\n      - name: Configure AWS credentials\n        uses: aws-actions/configure-aws-credentials@v4\n        with:\n          role-to-assume: arn:aws:iam::010438489691:role/GHARunnerAWS\n          aws-region: us-east-2\n      - name: Create cloud runner\n        id: aws-start\n        uses: omsf/start-aws-gha-runner@v1.0.0\n        with:\n          aws_image_id: ami-0b7f661c228e6a4bb\n          aws_instance_type: c7i.xlarge\n          aws_home_dir: /home/ubuntu\n          aws_root_device_size: 125 \n        env:\n          GH_PAT: ${{ secrets.GH_PAT }}\n\n  self-hosted-test:\n    runs-on: self-hosted\n    timeout-minutes: 720  # 12 hours  \n    defaults:\n      run:\n        shell: bash -leo pipefail {0}\n    env:\n      OE_LICENSE: ${{ github.workspace }}/oe_license.txt\n\n    needs:\n      - start-aws-runner\n    steps:\n      - uses: actions/checkout@v4\n\n      - name: Print disk usage\n        run: \"df -h\"\n\n      - name: Print Docker details\n        run: \"docker version || true\"\n\n      - name: \"Setup Micromamba\"\n        uses: mamba-org/setup-micromamba@v2\n        with:\n          environment-file: environment.yml\n          environment-name: openfe_env\n          condarc: |\n            channels:\n              - conda-forge\n              - openeye\n          create-args: >-\n            espaloma_charge==0.0.8\n            espaloma==0.4.0\n            openeye-toolkits\n            python=3.12\n\n      - name: \"Check if OpenMM can get a GPU\"\n        run: python -m openmm.testInstallation\n\n      - name: \"Install\"\n        run: python -m pip install --no-deps -e .\n\n      - name: \"Test imports\"\n        run: |\n          # if we add more to this, consider changing to for + env vars\n          python -Ic \"import openfe; print(openfe.__version__)\"          \n\n      - name: \"Environment Information\"\n        run: |\n          micromamba info\n          micromamba list\n          pip list\n\n      - name: Test OE License & Write License to File\n        env:\n          OE_LICENSE_TEXT: ${{ secrets.OE_LICENSE }}\n        run: |\n          echo \"${OE_LICENSE_TEXT}\" > ${OE_LICENSE}\n          python -c \"import openeye; assert openeye.oechem.OEChemIsLicensed(), 'OpenEye license checks failed!'\"\n\n      - name: \"Run tests\"\n        env:\n          OFE_SLOW_TESTS: \"true\"\n          DUECREDIT_ENABLE: 'yes'\n          OFE_INTEGRATION_TESTS: FALSE\n        run: |\n          pytest -n logical -vv --durations=10 --runslow src/openfecli/tests/ src/openfe/tests/\n\n  stop-aws-runner:\n    runs-on: ubuntu-latest\n    permissions:\n        id-token: write\n        contents: read\n    needs:\n      - start-aws-runner\n      - self-hosted-test\n    if: ${{ always() }}\n    steps:\n      - name: Configure AWS credentials\n        uses: aws-actions/configure-aws-credentials@v4\n        with:\n          role-to-assume: arn:aws:iam::010438489691:role/GHARunnerAWS\n          aws-region: us-east-2\n      - name: Stop instances\n        uses: omsf/stop-aws-gha-runner@v1.0.0\n        with:\n          instance_mapping: ${{ needs.start-aws-runner.outputs.mapping }}\n        env:\n          GH_PAT: ${{ secrets.GH_PAT }}\n"
  },
  {
    "path": ".github/workflows/aws-gpu-integration-tests.yaml",
    "content": "name: \"manual AWS: GPU integration tests\"\non:\n  workflow_dispatch:\n\njobs:\n  start-aws-runner:\n    runs-on: ubuntu-latest\n    permissions:\n      id-token: write\n      contents: read\n    outputs:\n      mapping: ${{ steps.aws-start.outputs.mapping }}\n    steps:\n      - name: Configure AWS credentials\n        uses: aws-actions/configure-aws-credentials@v4\n        with:\n          role-to-assume: arn:aws:iam::010438489691:role/GHARunnerAWS\n          aws-region: us-east-2\n      - name: Create cloud runner\n        id: aws-start\n        uses: omsf/start-aws-gha-runner@v1.0.0\n        with:\n          aws_image_id: ami-076a54ed41e67782d\n          aws_instance_type: g4dn.xlarge\n          aws_home_dir: /home/ubuntu\n          aws_root_device_size: 125\n        env:\n          GH_PAT: ${{ secrets.GH_PAT }}\n\n  self-hosted-test:\n    runs-on: self-hosted\n    timeout-minutes: 720  # 12 hours  \n    defaults:\n      run:\n        shell: bash -leo pipefail {0}\n    env:\n      OE_LICENSE: ${{ github.workspace }}/oe_license.txt\n\n    needs:\n      - start-aws-runner\n    steps:\n      - uses: actions/checkout@v4\n\n      - name: Print disk usage\n        run: \"df -h\"\n\n      - name: Print Docker details\n        run: \"docker version || true\"\n\n      - name: Check for nvidia-smi\n        run: \"nvidia-smi\"\n\n      - name: \"Setup Micromamba\"\n        uses: mamba-org/setup-micromamba@v2\n        with:\n          environment-file: environment.yml\n          environment-name: openfe_env\n          condarc: |\n            channels:\n              - conda-forge\n              - openeye\n          create-args: >-\n            espaloma_charge==0.0.8\n            espaloma==0.4.0\n            openeye-toolkits\n            python=3.12\n            cuda-version=12.8\n\n      - name: \"Check if OpenMM can get a GPU\"\n        run: python -m openmm.testInstallation\n\n      - name: \"Install\"\n        run: python -m pip install --no-deps -e .\n\n      - name: \"Test imports\"\n        run: |\n          # if we add more to this, consider changing to for + env vars\n          python -Ic \"import openfe; print(openfe.__version__)\"          \n\n      - name: \"Environment Information\"\n        run: |\n          micromamba info\n          micromamba list\n          pip list\n\n      - name: Test OE License & Write License to File\n        env:\n          OE_LICENSE_TEXT: ${{ secrets.OE_LICENSE }}\n        run: |\n          echo \"${OE_LICENSE_TEXT}\" > ${OE_LICENSE}\n          python -c \"import openeye; assert openeye.oechem.OEChemIsLicensed(), 'OpenEye license checks failed!'\"\n\n      - name: \"Run tests\"\n        env:\n          DUECREDIT_ENABLE: 'yes'\n          OFE_INTEGRATION_TESTS: TRUE\n        run: |\n          # The -m flag will only run tests with @pytest.mark.integration\n          pytest -n logical -vv --durations=10 -m integration src/openfecli/tests/ src/openfe/tests/\n\n  stop-aws-runner:\n    runs-on: ubuntu-latest\n    permissions:\n        id-token: write\n        contents: read\n    needs:\n      - start-aws-runner\n      - self-hosted-test\n    if: ${{ always() }}\n    steps:\n      - name: Configure AWS credentials\n        uses: aws-actions/configure-aws-credentials@v4\n        with:\n          role-to-assume: arn:aws:iam::010438489691:role/GHARunnerAWS\n          aws-region: us-east-2\n      - name: Stop instances\n        uses: omsf/stop-aws-gha-runner@v1.0.0\n        with:\n          instance_mapping: ${{ needs.start-aws-runner.outputs.mapping }}\n        env:\n          GH_PAT: ${{ secrets.GH_PAT }}\n"
  },
  {
    "path": ".github/workflows/ci.yaml",
    "content": "name: \"CI\"\non:\n  pull_request:\n   # Skip CI if changed files only affect the following folders\n   # - docs: documentation changes don't need code validation\n   # See here for more details: https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#example-excluding-paths\n    paths-ignore:\n      - \"docs/*\"\n      - \"news/*\"\n      - \".readthedocs.yaml\"\n      - \".github/workflows/cpu-long-tests.yaml\"\n      - \".github/workflows/gpu-integration-tests.yaml\"\n  push:\n    branches:\n      - main\n  schedule:\n    - cron: \"0 4 * * *\"\n  workflow_dispatch:\n  release:\n    types:\n      - published\n\nconcurrency:\n  group: \"${{ github.workflow }}-${{ github.ref }}\"\n  cancel-in-progress: true\n\ndefaults:\n  run:\n    shell: bash -leo pipefail {0}\n\njobs:\n  tests:\n    runs-on: ${{ matrix.os }}\n    name: \"💻-${{matrix.os }} 🐍-${{ matrix.python-version }} oechem: ${{ matrix.openeye }}\"\n    strategy:\n      fail-fast: false\n      matrix:\n        os: [\"ubuntu-latest\"]\n        openeye: [\"no\"]\n        python-version:\n          - \"3.11\"\n          - \"3.12\"\n          - \"3.13\"\n        include:\n          - os: \"ubuntu-latest\"\n            python-version: \"3.13\"\n            openeye: \"yes\"\n          - os: \"macos-latest\"\n            python-version: \"3.12\"\n            openeye: \"no\"\n\n    env:\n      OE_LICENSE: ${{ github.workspace }}/oe_license.txt\n\n    steps:\n      - uses: actions/checkout@v4\n        with:\n          fetch-depth: 0\n\n      - name: Get current date\n        id: date\n        run: echo \"date=$(date +%Y-%m-%d)\" >> \"${GITHUB_OUTPUT}\"\n\n      - name: \"Setup Micromamba\"\n        if: ${{ matrix.python-version != '3.13' }}\n        uses: mamba-org/setup-micromamba@v2\n        with:\n          environment-file: environment.yml\n          environment-name: openfe_env\n          cache-environment: true\n          cache-downloads: true\n          cache-environment-key: environment-${{ steps.date.outputs.date }}\n          cache-downloads-key: downloads-${{ steps.date.outputs.date }}\n          create-args: >-\n            espaloma=0.4.0\n            python=${{ matrix.python-version }}\n            pydantic=${{ matrix.pydantic-version }}\n          init-shell: bash\n\n      - name: \"Setup Micromamba\"\n        # Can't install espaloma with python 3.13\n        if: ${{ matrix.python-version == '3.13' }}\n        uses: mamba-org/setup-micromamba@v2\n        with:\n          environment-file: environment.yml\n          environment-name: openfe_env\n          cache-environment: true\n          cache-downloads: true\n          cache-environment-key: environment-${{ steps.date.outputs.date }}\n          cache-downloads-key: downloads-${{ steps.date.outputs.date }}\n          create-args: >-\n            python=${{ matrix.python-version }}\n            pydantic=${{ matrix.pydantic-version }}\n          init-shell: bash\n\n      - name: \"Install OpenEye\"\n        if: ${{ !github.event.pull_request.head.repo.fork\n                && matrix.openeye == 'yes' }}\n        env:\n          OE_LICENSE_TEXT: ${{ secrets.OE_LICENSE }}\n        run: |\n          echo \"${OE_LICENSE_TEXT}\" > ${OE_LICENSE}\n          micromamba install -c openeye openeye-toolkits\n          python -c \"import openeye; assert openeye.oechem.OEChemIsLicensed(), 'oechem license check failed!'\"\n\n      - name: \"Install\"\n        run: python -m pip install --no-deps -e .\n\n      - name: \"Environment Information\"\n        run: |\n          micromamba info\n          micromamba list\n          pip list\n\n      - name: \"Test imports\"\n        run: |\n          # if we add more to this, consider changing to for + env vars\n          python -Ic \"import openfe; print(openfe.__version__)\"\n\n      - name: Cache Pooch data\n        uses: actions/cache@v4\n        with:\n          path: |\n            # linux cache location\n            ~/.cache/openfe\n            # osx cache location\n            ~/Library/Caches/openfe\n          # When files are added or changed in a pooch registry\n          # bump this key to create a new cache, for example if \n          # the key is pooch-${{ matrix.os }}-1 change it to pooch-${{ matrix.os }}-2\n          key: pooch-${{ matrix.os }}-1\n\n      - name: \"Run tests\"\n        env:\n          # Set the OFE_SLOW_TESTS to True if running a Cron job\n          OFE_SLOW_TESTS: ${{ fromJSON('{\"false\":\"false\",\"true\":\"true\"}')[github.event_name != 'pull_request'] }}\n          DUECREDIT_ENABLE: 'yes'\n        run: |\n          pytest -n auto -v --cov=openfe --cov=openfecli --cov-report=xml --durations=10\n\n      - name: codecov-pr\n        if: ${{ github.repository == 'OpenFreeEnergy/openfe'\n                && github.event_name == 'pull_request' }}\n        uses: codecov/codecov-action@v4\n        with:\n          token: ${{ secrets.CODECOV_TOKEN }}\n          file: coverage.xml\n          fail_ci_if_error: False\n          verbose: True\n          flags: fast-tests\n\n      - name: codecov-merge\n        # we only want to upload a slow report if\n        # 1) it isn't a schedule run\n        # 2) it wasn't from a PR (we don't run slow tests on PRs)\n        if: ${{ github.repository == 'OpenFreeEnergy/openfe'  \n                && github.event_name != 'schedule'            \n                && github.event_name != 'pull_request' }}     \n        uses: codecov/codecov-action@v4\n        with:\n          token: ${{ secrets.CODECOV_TOKEN }}\n          file: coverage.xml\n          fail_ci_if_error: False\n          verbose: True\n          flags: slow-tests\n"
  },
  {
    "path": ".github/workflows/clean-pr-caches.yaml",
    "content": "# from https://docs.github.com/en/actions/how-tos/manage-workflow-runs/manage-caches#force-deleting-cache-entries\nname: \"clean up github runner caches on closed pull requests\"\non:\n  workflow_dispatch:\n  pull_request:\n    types:\n      - closed\n\njobs:\n  cleanup:\n    runs-on: ubuntu-latest\n    permissions:\n      actions: write\n    steps:\n      - name: Cleanup\n        run: |\n          echo \"Fetching list of cache keys\"\n          cacheKeysForPR=$(gh cache list --ref $BRANCH --limit 100 --json id --jq '.[].id')\n\n          ## Setting this to not fail the workflow while deleting cache keys.\n          set +e\n          echo \"Deleting caches...\"\n          for cacheKey in $cacheKeysForPR\n          do\n              gh cache delete $cacheKey\n          done\n          echo \"Done\"\n        env:\n          GH_TOKEN: ${{ github.token }}\n          GH_REPO: ${{ github.repository }}\n          BRANCH: refs/pull/${{ github.event.pull_request.number }}/merge\n"
  },
  {
    "path": ".github/workflows/cron-conda.yaml",
    "content": "name: \"cron: conda builds daily tests\"\non:\n  workflow_dispatch:\n  schedule:\n    # At 05:00 UTC every day\n    - cron: \"0 5 * * *\"\n\nconcurrency:\n  group: \"${{ github.workflow }}-${{ github.ref }}\"\n  cancel-in-progress: true\n\ndefaults:\n  run:\n    shell: bash -leo pipefail {0}\n\njobs:\n  condacheck:\n    runs-on: ${{ matrix.OS }}\n    name: \"daily conda check\"\n    strategy:\n      fail-fast: false\n      matrix:\n        os: ['ubuntu-latest']\n        python-version:\n          - \"3.11\"\n          - \"3.12\"\n          - \"3.13\"\n        include:\n        - os: \"macos-latest\"\n          python-version: \"3.12\"\n          openeye: \"no\"\n    steps:\n      - name: Checkout Code\n        uses: actions/checkout@v4\n        with:\n          fetch-depth: 0\n          path: openfe_repo\n\n      - name: Get Latest Version\n        id: latest-version\n        working-directory: openfe_repo\n        run: |\n          REPO=\"${{ github.repository }}\"\n          VERSION=$(curl -s -H \"Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}\" \\\n            \"https://api.github.com/repos/$REPO/releases/latest\" | jq -r '.tag_name | ltrimstr(\"v\")')\n          echo $VERSION\n          echo \"VERSION=$VERSION\" >> $GITHUB_OUTPUT\n\n      - name: Setup Micromamba and Install openfe\n        uses: mamba-org/setup-micromamba@v2\n        with:\n          environment-name: openfe\n          create-args: >-\n            python=${{ matrix.python-version }}\n            openfe=${{ steps.latest-version.outputs.VERSION }}\n            pytest\n            pytest-xdist\n          condarc: |\n            channels:\n              - conda-forge\n          init-shell: bash\n\n\n      - name: \"env info\"\n        run: |\n          micromamba info\n          micromamba list\n\n      - id: run-tests\n        name: \"Run tests\"\n        run: |\n          # note: this only runs the fast tests\n          pytest -n auto --pyargs openfe openfecli\n"
  },
  {
    "path": ".github/workflows/cron-docker.yaml",
    "content": "name: \"cron: docker image daily tests\"\n\non:\n  push:\n    branches:\n      - main\n  schedule:\n    # nightly tests\n    - cron: \"0 14 * * 0\"\n\n  workflow_dispatch:\n\ndefaults:\n  run:\n    shell: bash -leo pipefail {0}\n\nenv:\n  REGISTRY: ghcr.io\n  IMAGE_NAME: openfreeenergy/openfe\n\njobs:\n  build-and-push-image:\n    runs-on: ubuntu-latest\n    permissions:\n      contents: read\n      packages: write\n\n    steps:\n      - name: Checkout repository\n        uses: actions/checkout@v4\n\n      - name: Use dev tag for nightly builds\n        id: latest-version\n        run: |\n          VERSION=dev\n          echo $VERSION\n          echo \"VERSION=$VERSION\" >> $GITHUB_OUTPUT\n\n      - name: Print Latest Version\n        run: echo ${{ steps.latest-version.outputs.VERSION }}\n\n      - name: Create fully qualified image registry path\n        id: fqirp\n        run: |\n          FQIRP=${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.latest-version.outputs.VERSION }}\n          echo \"FQIRP=$FQIRP\" >> $GITHUB_OUTPUT\n\n      - name: Print FQIRP\n        run: echo ${{ steps.fqirp.outputs.FQIRP  }}\n\n      - name: Log in to the Container registry\n        uses: docker/login-action@f054a8b539a109f9f41c372932f1ae047eff08c9\n        with:\n          registry: ${{ env.REGISTRY }}\n          username: ${{ github.actor }}\n          password: ${{ secrets.GITHUB_TOKEN }}\n\n      - name: Extract metadata (tags, labels) for Docker\n        id: meta\n        uses: docker/metadata-action@98669ae865ea3cffbcbaa878cf57c20bbf1c6c38\n        with:\n          images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}\n          tags: |\n            type=schedule,pattern=nightly,enable=true,priority=1000\n            type=ref,event=branch,enable=true,priority=600\n            type=ref,event=tag,enable=true,priority=600\n            type=ref,event=pr,prefix=pr-,enable=true,priority=600\n            type=semver,pattern={{major}}.{{minor}}\n            type=semver,pattern={{version}}\n            type=sha\n            ${{ steps.latest-version.outputs.VERSION }}\n\n      - name: Build and export to Docker\n        uses: docker/build-push-action@v6\n        with:\n          context: .\n          file: production/Dockerfile\n          load: true\n          tags: ${{ steps.meta.outputs.tags }}\n          labels: ${{ steps.meta.outputs.labels }}\n\n      - name: Test image\n        run: |\n          docker run --rm ${{ steps.fqirp.outputs.FQIRP }} openfe --help\n          docker run --rm ${{ steps.fqirp.outputs.FQIRP }} openfe --version\n          docker run --rm ${{ steps.fqirp.outputs.FQIRP }} python -c \"import gufe; print(f'{gufe.__version__=}')\"\n          docker run --rm ${{ steps.fqirp.outputs.FQIRP }} pytest --pyargs gufe -v\n          docker run --rm ${{ steps.fqirp.outputs.FQIRP }} pytest --pyargs openfe -v\n"
  },
  {
    "path": ".github/workflows/cron-feedstock-build-tests.yaml",
    "content": "# tests this openfe commit and gufe main to check for \n# conda-feedstock build issues\nname: \"cron: weekly feedstock package build tests\"\n\nconcurrency:\n  group: \"${{ github.workflow }}-${{ github.ref }}\"\n  cancel-in-progress: true\n\ndefaults:\n  run:\n    shell: bash -leo pipefail {0}\non:\n  workflow_dispatch:\n  schedule:\n    # 3 am weekly on monday\n    - cron: \"0 3 * * MON\"\n\njobs:\n  test-conda-build:\n    runs-on: ubuntu-latest\n    \n    steps:\n      - name: Checkout openfe repository\n        uses: actions/checkout@v4\n        with:\n          path: openfe\n      \n      - name: Checkout conda-forge feedstock\n        uses: actions/checkout@v4\n        with:\n          repository: conda-forge/openfe-feedstock\n          path: openfe-feedstock\n      \n      - name: Set up Python\n        uses: actions/setup-python@v5\n        with:\n          python-version: '3.x'\n      \n      - name: Install conda-build dependencies\n        run: |\n          pip install pyyaml\n\n      # TODO just checkout the repo where we need it?\n      - name: Copy source code to recipe folder\n        run: cp -r openfe openfe-feedstock/recipe/openfe_source\n      \n      - name: Modify feedstock to use local path\n        run: |\n          cd openfe-feedstock\n          \n          # Backup original recipe.yaml\n          cp recipe/recipe.yaml recipe/recipe.yaml.bak\n\n          # NOTE: now that we use v1 feedstock, we  can use yq to directly parse the YAML here.\n          # Add path after source: and delete url line\n          sed -i '/^source:/a\\  path: ./openfe_source' recipe/recipe.yaml\n          sed -i '/^  url:/d' recipe/recipe.yaml\n          \n          echo \"Modified recipe.yaml:\"\n          cat recipe/recipe.yaml\n                \n      - name: Run conda-forge build test\n        run: |\n          cd openfe-feedstock\n          python build-locally.py\n        continue-on-error: true\n        id: build_test\n\n          # Uncomment if build_artifacts is needed to troubleshoot build\n      \n          #      - name: Upload build logs\n          #        if: always()\n          #        uses: actions/upload-artifact@v4\n          #        with:\n          #          name: conda-build-logs\n          #          path: |\n          #            openfe-feedstock/build_artifacts/\n          #            openfe-feedstock/recipe/recipe.yaml\n          #            openfe-feedstock/recipe/recipe.yaml.bak\n          #          if-no-files-found: warn\n      \n      - name: Check build status\n        if: steps.build_test.outcome == 'failure'\n        run: |\n          echo \"❌ Conda forge build test failed. Check the uploaded logs for details.\"\n          exit 1\n"
  },
  {
    "path": ".github/workflows/cron-package-test.yaml",
    "content": "name: \"cron: package install daily tests\"\non:\n  workflow_dispatch:\n  schedule:\n    # At 03:00 UTC daily\n    - cron: \"0 3 * * *\"\n\nconcurrency:\n  group: \"${{ github.workflow }}-${{ github.ref }}\"\n  cancel-in-progress: true\n\ndefaults:\n  run:\n    shell: bash -leo pipefail {0}\n\njobs:\n  package-tests:\n    runs-on: ubuntu-latest\n    name: \"main branch long tests\"\n    steps:\n      - uses: actions/checkout@v4\n\n      - name: Get current date\n        id: date\n        run: echo \"date=$(date +%Y-%m-%d)\" >> \"${GITHUB_OUTPUT}\"\n\n      - name: \"Setup Micromamba\"\n        uses: mamba-org/setup-micromamba@v2\n        with:\n          environment-file: environment.yml\n          environment-name: openfe_env\n          cache-environment: true\n          cache-downloads: true\n          cache-environment-key: environment-${{ steps.date.outputs.date }}\n          cache-downloads-key: downloads-${{ steps.date.outputs.date }}\n          create-args: >-\n            python=3.12\n          init-shell: bash\n\n      - name: \"install extra deps\"\n        run: pip install pipx wheel twine readme-renderer\n\n      - name: \"build sdist\"\n        run: pipx run build --sdist --outdir dist\n\n      - name: \"check package build\"\n        run: |\n          dist=$(ls -t1 dist/openfe-*tar.gz | head -n1)\n          test -n \"${dist}\" || { echo \"no distribution found\"; exit 1; }\n          twine check $dist\n\n      - name: \"install from source dist\"\n        working-directory: ./dist\n        run: python -m pip install openfe-*tar.gz\n\n      - name: \"run tests\"\n        working-directory: ./dist\n        env:\n          OFE_SLOW_TESTS: \"true\"\n        run: |\n          pytest -n auto -v --pyargs openfe.tests\n          pytest -n auto -v --pyargs openfecli.tests\n"
  },
  {
    "path": ".github/workflows/griffe-api-break.yaml",
    "content": "name: \"PR: griffe check for API breaks\"\n\non:\n  pull_request_target:\n    branches:\n      - main\n\njobs:\n  check:\n    runs-on: ubuntu-latest\n    permissions:\n      pull-requests: write\n\n    steps:\n    - uses: actions/checkout@v4\n      with:\n        fetch-depth: 0\n\n    - run: git fetch --depth=1 --tags\n\n    - uses: actions/setup-python@v5\n      with:\n        python-version: \"3.13\"\n\n    - name: Check for API breaks\n      continue-on-error: true\n      id: check\n      run: |\n        pip install griffe\n        griffe check \"openfe\" -s src --verbose -a origin/main\n        griffe check \"openfecli\" -s src --verbose -a origin/main\n\n    - name: Manage PR Comments\n      uses: actions/github-script@v7\n      with:\n        script: |\n          const prNumber = context.payload.pull_request.number;\n          const identifier = '<!-- api-break-check -->';\n          const runUrl = `${context.serverUrl}/${context.repo.owner}/${context.repo.repo}/actions/runs/${context.runId}`;\n          const stepUrl = `${runUrl}#step:check`;\n\n          // Determine the outcome of the check step\n          const checkStepOutcome = '${{ steps.check.outcome }}';\n\n          // List existing comments\n          const { data: comments } = await github.rest.issues.listComments({\n            owner: context.repo.owner,\n            repo: context.repo.repo,\n            issue_number: prNumber,\n          });\n\n          // Delete previous comments from this action\n          for (const comment of comments) {\n            if (comment.body.includes(identifier)) {\n              await github.rest.issues.deleteComment({\n                owner: context.repo.owner,\n                repo: context.repo.repo,\n                comment_id: comment.id,\n              });\n            }\n          }\n\n          // Post a new comment only if the check step failed\n          if (checkStepOutcome === 'failure') {\n            await github.rest.issues.createComment({\n              owner: context.repo.owner,\n              repo: context.repo.repo,\n              issue_number: prNumber,\n              body: `${identifier}\\n🚨 API breaking changes detected! 🚨\\n[View logs for this step](${stepUrl})`\n            });\n          } else {\n            await github.rest.issues.createComment({\n              owner: context.repo.owner,\n              repo: context.repo.repo,\n              issue_number: prNumber,\n              body: `${identifier}\\nNo API break detected ✅`\n            });\n          }\n"
  },
  {
    "path": ".github/workflows/mypy.yaml",
    "content": "name: \"PR: mypy static type checking\"\non:\n  pull_request:\n    branches:\n      - main\n  push:\n    branches:\n      - main\n\nconcurrency:\n  group: \"${{ github.workflow }}-${{ github.ref }}\"\n  cancel-in-progress: true\n\ndefaults:\n  run:\n    shell: bash -leo pipefail {0}\n\njobs:\n  mypy:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v4\n\n      - name: Get current date\n        id: date\n        run: echo \"date=$(date +%Y-%m-%d)\" >> \"${GITHUB_OUTPUT}\"\n\n      - name: \"Setup Micromamba\"\n        uses: mamba-org/setup-micromamba@v2\n        with:\n          environment-file: environment.yml\n          environment-name: openfe_env\n          cache-environment: true\n          cache-downloads: true\n          cache-environment-key: environment-${{ steps.date.outputs.date }}\n          cache-downloads-key: downloads-${{ steps.date.outputs.date }}\n          create-args: >-\n            python=3.12\n            mypy>=1.17.0\n\n          init-shell: bash\n\n      - name: \"Install steps\"\n        run: |\n          python -m pip install --no-deps -e .\n\n      - name: \"Environment Information\"\n        run: |\n          micromamba info\n          micromamba list\n\n      - name: \"Lint with mypy\"\n        run: mypy \n"
  },
  {
    "path": ".github/workflows/release-docker-image.yaml",
    "content": "# This workflow uses actions that are not certified by GitHub.\n# They are provided by a third-party and are governed by\n# separate terms of service, privacy policy, and support\n# documentation.\n\n# GitHub recommends pinning actions to a commit SHA.\n# To get a newer version, you will need to update the SHA.\n# You can also reference a tag or branch, but the action may change without warning.\n\n# Workflow to automate docker image building during the openfe release process.\nname: \"release: create and publish a docker image\"\n\non:\n  workflow_dispatch:\n\ndefaults:\n  run:\n    shell: bash -leo pipefail {0}\n\nenv:\n  REGISTRY: ghcr.io\n  IMAGE_NAME: openfreeenergy/openfe\n\njobs:\n  build-and-push-image:\n    runs-on: ubuntu-latest\n    permissions:\n      contents: read\n      packages: write\n\n    steps:\n      # see https://dev.to/mathio/squeezing-disk-space-from-github-actions-runners-an-engineers-guide-3pjg\n      - name: Aggressive cleanup\n        run: |\n          # remove unneeded packages to avoid running out of memory\n          # Remove Java (JDKs)\n          sudo rm -rf /usr/lib/jvm\n      \n          # Remove .NET SDKs\n          sudo rm -rf /usr/share/dotnet\n      \n          # Remove Swift toolchain\n          sudo rm -rf /usr/share/swift\n      \n          # Remove Haskell (GHC)\n          sudo rm -rf /usr/local/.ghcup\n      \n          # Remove Julia\n          sudo rm -rf /usr/local/julia*\n      \n          # Remove Android SDKs\n          sudo rm -rf /usr/local/lib/android\n      \n          # Remove Chromium (optional if not using for browser tests)\n          sudo rm -rf /usr/local/share/chromium\n      \n          # Remove Microsoft/Edge and Google Chrome builds\n          sudo rm -rf /opt/microsoft /opt/google\n      \n          # Remove Azure CLI\n          sudo rm -rf /opt/az\n      \n          # Remove PowerShell\n          sudo rm -rf /usr/local/share/powershell\n      \n          # Remove CodeQL and other toolcaches\n          sudo rm -rf /opt/hostedtoolcache\n      \n          docker system prune -af || true\n          docker builder prune -af || true\n          df -h\n\n      - name: Checkout repository\n        uses: actions/checkout@v4\n        with:\n          fetch-depth: 0\n\n      - name: Get Latest Version\n        id: latest-version\n        run: |\n          REPO=\"${{ github.repository }}\"\n          VERSION=$(curl -s -H \"Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}\" \\\n            \"https://api.github.com/repos/$REPO/releases/latest\" | jq -r '.tag_name | ltrimstr(\"v\")')\n          echo $VERSION\n          echo \"VERSION=$VERSION\" >> $GITHUB_OUTPUT\n\n      - name: Print Latest Version\n        run: echo ${{ steps.latest-version.outputs.VERSION }}\n\n      - name: Create fully qualified image registry path\n        id: fqirp\n        run: |\n          FQIRP=${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.latest-version.outputs.VERSION }}\n          echo \"FQIRP=$FQIRP\" >> $GITHUB_OUTPUT\n\n      - name: Print FQIRP\n        run: echo ${{ steps.fqirp.outputs.FQIRP  }}\n\n      - name: Log in to the Container registry\n        uses: docker/login-action@f054a8b539a109f9f41c372932f1ae047eff08c9\n        with:\n          registry: ${{ env.REGISTRY }}\n          username: ${{ github.actor }}\n          password: ${{ secrets.GITHUB_TOKEN }}\n\n      - name: Extract metadata (tags, labels) for Docker\n        id: meta\n        uses: docker/metadata-action@98669ae865ea3cffbcbaa878cf57c20bbf1c6c38\n        with:\n          images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}\n          tags: |\n            type=schedule,pattern=nightly,enable=true,priority=1000\n            type=ref,event=branch,enable=true,priority=600\n            type=ref,event=tag,enable=true,priority=600\n            type=ref,event=pr,prefix=pr-,enable=true,priority=600\n            type=semver,pattern={{major}}.{{minor}}\n            type=semver,pattern={{version}}\n            type=sha\n            ${{ steps.latest-version.outputs.VERSION }}\n\n      - name: Build and export to Docker\n        uses: docker/build-push-action@v6\n        with:\n          context: .\n          file: production/Dockerfile\n          load: true\n          push: false\n          tags: ${{ steps.meta.outputs.tags }}\n          labels: ${{ steps.meta.outputs.labels }}\n          build-args: |\n            VERSION=${{ steps.latest-version.outputs.VERSION }}\n\n      - name: Test image\n        run: |\n          docker run --rm ${{ steps.fqirp.outputs.FQIRP }} openfe --help\n          docker run --rm ${{ steps.fqirp.outputs.FQIRP }} openfe --version\n          docker run --rm ${{ steps.fqirp.outputs.FQIRP }} python -c \"import gufe; print(f'{gufe.__version__=}')\"\n          docker run --rm ${{ steps.fqirp.outputs.FQIRP }} pytest --pyargs gufe -v\n          docker run --rm ${{ steps.fqirp.outputs.FQIRP }} pytest --pyargs openfe openfecli -v\n\n      - name: Push Docker image\n        uses: docker/build-push-action@ad44023a93711e3deb337508980b4b5e9bcdc5dc\n        with:\n          context: .\n          file: production/Dockerfile\n          push: true\n          tags: ${{ steps.meta.outputs.tags }}\n          labels: ${{ steps.meta.outputs.labels }}\n          build-args: |\n            VERSION=${{ steps.latest-version.outputs.VERSION }}\n\n      - name: Setup Apptainer\n        uses: eWaterCycle/setup-apptainer@v2\n        with:\n          apptainer-version: 1.3.4\n\n      - name: Build Apptainer Image\n        run: singularity build openfe_${{ steps.latest-version.outputs.VERSION }}.sif docker-daemon:${{ steps.fqirp.outputs.FQIRP }}\n\n      - name: Test & Push Apptainer Image\n        run: |\n          mkdir test_apptainer\n          cd test_apptainer\n          singularity run ../openfe_${{ steps.latest-version.outputs.VERSION }}.sif openfe --help\n          singularity run ../openfe_${{ steps.latest-version.outputs.VERSION }}.sif openfe --version\n          singularity run ../openfe_${{ steps.latest-version.outputs.VERSION }}.sif pytest --pyargs openfe openfecli -v -n auto\n          echo ${{ secrets.GITHUB_TOKEN }} | singularity remote login -u ${{ secrets.GHCR_USERNAME }} --password-stdin oras://ghcr.io\n          singularity push ../openfe_${{ steps.latest-version.outputs.VERSION }}.sif oras://${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.latest-version.outputs.VERSION }}-apptainer\n          singularity push ../openfe_${{ steps.latest-version.outputs.VERSION }}.sif oras://${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest-apptainer\n"
  },
  {
    "path": ".github/workflows/release-installers.yaml",
    "content": "name: \"release: make single-file installers\"\n\non:\n  workflow_dispatch:\n\ndefaults:\n  run:\n    shell: bash -leo pipefail {0}\n\njobs:\n  test:\n    name: Building single file installer on ${{ matrix.os }}\n    runs-on: ${{ matrix.os }}\n    strategy:\n      fail-fast: false\n      matrix:\n        os: [macos-latest, ubuntu-latest]\n\n    steps:\n    - name: Checkout Code\n      uses: actions/checkout@v4\n      with:\n        fetch-depth: 0\n\n    - name: Get Latest Version\n      id: latest-version\n      run: |\n        REPO=\"${{ github.repository }}\"\n        VERSION=$(curl -s -H \"Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}\" \\\n          \"https://api.github.com/repos/$REPO/releases/latest\" | jq -r '.tag_name | ltrimstr(\"v\")')\n        echo $VERSION\n        echo \"VERSION=$VERSION\" >> $GITHUB_OUTPUT\n\n    - name: Install constructor environment with Micromamba\n      uses: mamba-org/setup-micromamba@v2\n      with:\n        environment-name: installer\n        create-args: >-\n          python=3.11\n          jinja2\n          constructor\n        init-shell: bash\n\n    - name: Create installer\n      run: VERSION=${{ steps.latest-version.outputs.VERSION }} constructor devtools/installer/\n\n    - name: Get installer file name\n      id: file-name\n      run: |\n        # This should work as long as we don't have any *.sh files in our root dir\n        FILE_NAME=$(find * -maxdepth 0 -type f -name \"*.sh\")\n        echo $FILE_NAME\n        echo \"FILE_NAME=$FILE_NAME\" >> $GITHUB_OUTPUT\n\n    - name: Test installer\n      run: |\n        chmod +x ${{ steps.file-name.outputs.FILE_NAME }}\n        ./${{ steps.file-name.outputs.FILE_NAME }} -b\n        export PATH=\"$HOME/openfeforge/bin:$PATH\"\n        OFE_SLOW_TESTS=FALSE pytest -v --pyargs openfe\n        # Copy for \"latest\" release by removing version\n        # Inspired by https://github.com/conda-forge/miniforge/blob/main/.github/workflows/ci.yml\n        cp ${{ steps.file-name.outputs.FILE_NAME }} $(echo ${{ steps.file-name.outputs.FILE_NAME }} | sed -e 's/-[^-]*//')\n\n    - uses: actions/upload-artifact@v4\n      with:\n        name: ${{ steps.file-name.outputs.FILE_NAME }}\n        path: OpenFEforge*\n        if-no-files-found: error\n\n    - name: Upload openfe forge to release\n      uses: svenstaro/upload-release-action@v2\n      with:\n        repo_token: ${{ secrets.GITHUB_TOKEN }}\n        file: OpenFEforge*\n        tag: ${{ github.ref }}\n        overwrite: true\n        file_glob: true\n      if: startsWith(github.ref, 'refs/tags/')\n"
  },
  {
    "path": ".github/workflows/release-make-condalock.yaml",
    "content": "name: \"release: create openfe conda-lock file\"\n\non:\n  workflow_dispatch:\n\ndefaults:\n  run:\n    shell: bash -leo pipefail {0}\n\njobs:\n  create-conda-lock-file-and-test-linux:\n    runs-on: ubuntu-latest\n    \n    steps:  \n    - name: Install conda-lock with Micromamba\n      uses: mamba-org/setup-micromamba@v2\n      with:\n        environment-name: conda-lock\n        create-args: >-\n          conda-lock\n\n    # This saves me some time since we only need the latest tag\n    - name: Get latest tag\n      id: latest-version\n      run: |\n        REPO=\"${{ github.repository }}\"\n        VERSION=$(curl -s -H \"Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}\" \\\n          \"https://api.github.com/repos/$REPO/releases/latest\" | jq -r '.tag_name | ltrimstr(\"v\")')\n        echo $VERSION\n        echo \"VERSION=$VERSION\" >> $GITHUB_OUTPUT\n\n    - name: Print Latest Version\n      run: echo ${{ steps.latest-version.outputs.VERSION }}\n    \n    - name: Create environment file to lock\n      run: |\n        cat > environment-to-lock.yaml << 'EOF'\n        name: openfe_env\n        channels:\n          - conda-forge\n        platforms:\n          - linux-64\n          - osx-arm64\n        dependencies:\n          - openfe==${{ steps.latest-version.outputs.VERSION }}\n          - python=3.12\n        EOF\n\n    - name: Generate lock files\n      run: | \n        conda lock --with-cuda 11.8 -f environment-to-lock.yaml --lockfile openfe-conda-lock.yml \n        cp openfe-conda-lock.yml openfe-${{ steps.latest-version.outputs.VERSION }}-conda-lock.yml\n\n    - name: Test lock file (linux)\n      run: |\n        conda-lock install -p /home/runner/micromamba/envs/lf-test openfe-conda-lock.yml\n        micromamba activate /home/runner/micromamba/envs/lf-test\n        openfe test\n\n    - name: Upload file as artifact\n      uses: actions/upload-artifact@v4\n      with:\n        name: conda-lock-files\n        path: \"*conda-lock.yml\"\n\n  test-osx-lock-file:\n    needs: create-conda-lock-file-and-test-linux\n    runs-on: macos-latest\n    steps:\n    - name: Download artifact\n      uses: actions/download-artifact@v4\n      with:\n        name: conda-lock-files\n\n    - name: Install conda-lock with Micromamba\n      uses: mamba-org/setup-micromamba@v2\n      with:\n        environment-name: conda-lock\n        create-args: >-\n          conda-lock\n\n    - name: Test lock file (osx)\n      run: |\n        conda-lock install -p /Users/runner/micromamba/envs/lf-test openfe-conda-lock.yml\n        micromamba activate /Users/runner/micromamba/envs/lf-test\n        openfe test\n\n    - name: Upload lock files to release\n      uses: svenstaro/upload-release-action@v2\n      if: startsWith(github.ref, 'refs/tags/')\n      with:\n        repo_token: ${{ secrets.GITHUB_TOKEN }}\n        file: \"*conda-lock.yml\"\n        tag: ${{ github.ref }}\n        overwrite: true\n        file_glob: true\n"
  },
  {
    "path": ".github/workflows/release-prep-examplenotebooks.yaml",
    "content": "name: \"release prep: test example notebooks\"\n\non:\n  workflow_dispatch:\n\nconcurrency:\n  group: \"${{ github.workflow }}-${{ github.ref }}\"\n  cancel-in-progress: true\n\ndefaults:\n  run:\n    shell: bash -leo pipefail {0}\n\njobs:\n  test-example-notebooks:\n    runs-on: ubuntu-latest\n    \n    steps:\n      - name: Checkout openfe repository\n        uses: actions/checkout@v4\n        with:\n          path: openfe\n      \n      - name: Checkout example notebooks\n        uses: actions/checkout@v4\n        with:\n          repository: openfreeenergy/ExampleNotebooks\n          path: example-notebooks\n\n      - name: Setup Micromamba\n        uses: mamba-org/setup-micromamba@v2\n        with:\n          environment-file: openfe/environment.yml\n          environment-name: openfe_env\n          create-args: >-\n            python=3.12\n            nbval\n          init-shell: bash\n\n      - name: Install OpenFE\n        run: python -m pip install --no-deps -e ./openfe\n\n      - name: Environment Information\n        run: |\n          micromamba info\n          micromamba list\n\n      - name: Run example notebooks\n        run: |\n          cd example-notebooks\n          python -m pytest -v --nbval-lax --nbval-cell-timeout=3000 -n auto --dist loadscope\n"
  },
  {
    "path": ".github/workflows/release-prep-feedstock.yaml",
    "content": "# tests this openfe commit with the latest gufe release\n# meant to be used for release prep to catch feedstock issues before releasing on github\nname: \"release prep: test conda-forge package build\"\n\nconcurrency:\n  group: \"${{ github.workflow }}-${{ github.ref }}\"\n  cancel-in-progress: true\n\ndefaults:\n  run:\n    shell: bash -leo pipefail {0}\non:\n  workflow_dispatch:\n  # TODO: run when \"release prep\" label is added\n\njobs:\n  test-conda-build:\n    runs-on: ubuntu-latest\n    \n    steps:\n      - name: Checkout openfe repository\n        uses: actions/checkout@v4\n        with:\n          path: openfe\n      \n      - name: Checkout conda-forge feedstock\n        uses: actions/checkout@v4\n        with:\n          repository: conda-forge/openfe-feedstock\n          path: openfe-feedstock\n      \n      - name: Set up Python\n        uses: actions/setup-python@v5\n        with:\n          python-version: '3.x'\n      \n      - name: Install conda-build dependencies\n        run: |\n          pip install pyyaml\n\n      # TODO just checkout the repo where we need it?\n      - name: Copy source code to recipe folder\n        run: cp -r openfe openfe-feedstock/recipe/openfe_source\n\n      - name: Get Latest gufe Version\n        id: latest-gufe-version\n        run: |\n          REPO=\"openfreeenergy/gufe\"\n          VERSION=$(curl -s -H \"Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}\" \\\n            \"https://api.github.com/repos/$REPO/releases/latest\" | jq -r '.tag_name | ltrimstr(\"v\")')\n          echo $VERSION\n          echo \"VERSION=$VERSION\" >> $GITHUB_OUTPUT\n      \n      - name: Modify feedstock to use local path and latest gufe\n        uses: mikefarah/yq@master\n        with:\n          cmd: |\n            cd openfe-feedstock\n            \n            # Backup original recipe.yaml\n            cp recipe/recipe.yaml recipe/recipe.yaml.bak\n\n            # Add path after 'source:' and delete url line\n            yq -i '.source.path=\"./openfe_source\"' recipe/recipe.yaml\n            yq -i 'del(.source.url)' recipe/recipe.yaml\n\n            # remove existing gufe entry and add the gufe pin we want\n            yq -i 'del(.outputs.[0].requirements.run[] | select(. ==\"*gufe*\"))' recipe/recipe.yaml\n            yq -i '.outputs.[0].requirements.run += \"gufe==${{ steps.latest-gufe-version.outputs.VERSION }}\"' recipe/recipe.yaml\n            \n            \n            echo \"Modified recipe.yaml:\"\n            cat recipe/recipe.yaml\n                \n      - name: Run conda-forge build test\n        run: |\n          cd openfe-feedstock\n          python build-locally.py\n        continue-on-error: true\n        id: build_test\n\n          # Uncomment if build_artifacts is needed to troubleshoot build\n      \n          #      - name: Upload build logs\n          #        if: always()\n          #        uses: actions/upload-artifact@v4\n          #        with:\n          #          name: conda-build-logs\n          #          path: |\n          #            openfe-feedstock/build_artifacts/\n          #            openfe-feedstock/recipe/recipe.yaml\n          #            openfe-feedstock/recipe/recipe.yaml.bak\n          #          if-no-files-found: warn\n      \n      - name: Check build status\n        if: steps.build_test.outcome == 'failure'\n        run: |\n          echo \"❌ Conda forge build test failed. Check the uploaded logs for details.\"\n          exit 1\n"
  },
  {
    "path": ".gitignore",
    "content": "# custom ignores\n.duecredit.p\n.xxrun\n.idea/\n.vscode/\n\n# Byte-compiled / optimized / DLL files\n__pycache__/\n*.py[cod]\n*$py.class\n*~\n\n# C extensions\n*.so\n\n# Distribution / packaging\n.Python\nbuild/\ndevelop-eggs/\ndist/\ndownloads/\neggs/\n.eggs/\nlib/\nlib64/\nparts/\nsdist/\nvar/\nwheels/\nshare/python-wheels/\n*.egg-info/\n.installed.cfg\n*.egg\nMANIFEST\n\n# PyInstaller\n#  Usually these files are written by a python script from a template\n#  before PyInstaller builds the exe, so as to inject date/other infos into it.\n*.manifest\n*.spec\n\n# Installer logs\npip-log.txt\npip-delete-this-directory.txt\n\n# Unit test / coverage reports\nhtmlcov/\n.tox/\n.nox/\n.coverage\n.coverage.*\n.cache\nnosetests.xml\ncoverage.xml\n*.cover\n*.py,cover\n.hypothesis/\n.pytest_cache/\ncover/\n\n# Translations\n*.mo\n*.pot\n\n# Django stuff:\n*.log\nlocal_settings.py\ndb.sqlite3\ndb.sqlite3-journal\n\n# Flask stuff:\ninstance/\n.webassets-cache\n\n# Scrapy stuff:\n.scrapy\n\n# Sphinx documentation\ndocs/_build/\ndocs/reference/api/generated\ndocs/tutorials/*.png\n\n# PyBuilder\n.pybuilder/\ntarget/\n\n# Jupyter Notebook\n.ipynb_checkpoints\n\n# IPython\nprofile_default/\nipython_config.py\n\n# pyenv\n#   For a library or package, you might want to ignore these files since the code is\n#   intended to run in multiple environments; otherwise, check them in:\n# .python-version\n\n# pipenv\n#   According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.\n#   However, in case of collaboration, if having platform-specific dependencies or dependencies\n#   having no cross-platform support, pipenv may install dependencies that don't work, or not\n#   install all needed dependencies.\n#Pipfile.lock\n\n# poetry\n#   Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.\n#   This is especially recommended for binary packages to ensure reproducibility, and is more\n#   commonly ignored for libraries.\n#   https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control\n#poetry.lock\n\n# PEP 582; used by e.g. github.com/David-OConnor/pyflow\n__pypackages__/\n\n# Celery stuff\ncelerybeat-schedule\ncelerybeat.pid\n\n# SageMath parsed files\n*.sage.py\n\n# Environments\n.env\n.venv\nenv/\nvenv/\nENV/\nenv.bak/\nvenv.bak/\n\n# Spyder project settings\n.spyderproject\n.spyproject\n\n# Rope project settings\n.ropeproject\n\n# mkdocs documentation\n/site\n\n# mypy\n.mypy_cache/\n.dmypy.json\ndmypy.json\n\n# Pyre type checker\n.pyre/\n\n# pytype static type analyzer\n.pytype/\n\n# Cython debug symbols\ncython_debug/\n\n# PyCharm\n#  JetBrains specific template is maintainted in a separate JetBrains.gitignore that can\n#  be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore\n#  and can be added to the global gitignore or merged into this file.  For a more nuclear\n#  option (not recommended) you can uncomment the following to ignore the entire idea folder.\n#.idea/\n\n# vim\n*.swp\n\n# vscode\n.vscode/\n\n# Example notebooks\ndocs/ExampleNotebooks/\n\n# duecredit\n.duecredit.p\n\n# Some charge stuff\n*.model.pt\n\n# Rever\nrever/\n"
  },
  {
    "path": ".pre-commit-config.yaml",
    "content": "ci:\n    autoupdate_schedule: quarterly\n    # comment / label \"pre-commit.ci autofix\" to a pull request to manually trigger auto-fixing\n    autofix_prs: false\n    skip: []\n    submodules: false\n\nrepos:\n- repo: https://github.com/pre-commit/pre-commit-hooks\n  rev: v6.0.0\n  hooks:\n  - id: check-added-large-files\n    args: [\"--maxkb=900\"]\n  - id: check-case-conflict\n  - id: check-executables-have-shebangs\n  - id: check-symlinks\n  - id: check-toml\n  - id: check-yaml\n    exclude: devtools/installer/construct.yaml  # not a true YAML file\n  - id: debug-statements\n\n- repo: https://github.com/tox-dev/pyproject-fmt\n  rev: \"v2.21.0\"\n  hooks:\n    - id: pyproject-fmt\n\n- repo: https://github.com/astral-sh/ruff-pre-commit\n  rev: v0.15.9\n  hooks:\n    # Run the linter.\n    - id: ruff\n      args: [--fix ]\n    # Run the formatter.\n    - id: ruff-format\n"
  },
  {
    "path": ".readthedocs.yaml",
    "content": "version: 2\n\nbuild:\n  os: \"ubuntu-24.04\"\n  tools:\n    python: \"miniconda3-3.12-24.9\"\n\nsphinx:\n   configuration: docs/conf.py\n   fail_on_warning: true\n\nconda:\n  environment: docs/environment.yaml\n\npython:\n  # Install our python package before building the docs\n  install:\n    - method: pip\n      path: .\n"
  },
  {
    "path": "CITATION.cff",
    "content": "cff-version: 1.2.0\nmessage: \"If you use this software, please cite it as below.\"\nauthors:\n- family-names: \"Alibay\"\n  given-names: \"Irfan\"\n  orcid: \"https://orcid.org/0000-0001-5787-9130\"\n- family-names: \"Gowers\"\n  given-names: \"Richard J.\"\n  orcid: \"https://orcid.org/0000-0002-3241-1846\"\n- family-names: \"Swenson\"\n  given-names: \"David W.H.\"\n  orcid: \"https://orcid.org/0000-0001-9922-7923\"\n- family-names: \"Henry\"\n  given-names: \"Michael M.\"\n  orcid: \"https://orcid.org/0000-0002-3870-9993\"\n- family-names: \"Ries\"\n  given-names: \"Benjamin\"\n  orcid: \"https://orcid.org/0000-0002-0945-8304\"\n- family-names: \"Baumann\"\n  given-names: \"Hannah M.\"\n  orcid: \"https://orcid.org/0000-0002-1736-7744\"\n- family-names: \"Eastwood\"\n  given-names: \"James R. B.\"\n  orcid: \"https://orcid.org/0000-0003-3895-5227\"\n- given-names: \"Ashley\"\n  family-names: \"Mitchell\"\n  orcid: 'https://orcid.org/0000-0002-8246-5113'\n- given-names: \"David\"\n  family-names: \"Dotson\"\n  orcid: \"https://orcid.org/0000-0001-5879-2942\"\n- given-names: Joshua T.\n  family-names: Horton\n  orcid: 'https://orcid.org/0000-0001-8694-7200'\n- given-names: Matthew\n  family-names: Thompson\n  orcid: 'https://orcid.org/0000-0002-1460-3983'\n- given-names: Alyssa\n  family-names: Travitz\n  orcid: 'https://orcid.org/0000-0001-5953-8807'\ntitle: \"The Open Free Energy library\"\nversion: 1.7.0\ndate-released: 2025-04-25\nurl: \"https://openfree.energy/\"\nrepository-code: \"https://github.com/openfreeEnergy/openfe\"\ndoi: 10.5281/zenodo.8344247\n"
  },
  {
    "path": "Code_of_Conduct.md",
    "content": "## Code of Conduct ##\n\nThis project is dedicated to providing a welcoming and supportive environment for all people, regardless of background or identity. Members do not tolerate harassment for any reason, but especially harassment based on gender, sexual orientation, disability, physical appearance, body size, race, nationality, sex, color, ethnic or social origin, pregnancy, citizenship, familial status, veteran status, genetic information, religion or belief, political or any other opinion, membership of a national minority, property, age, or preference of text editor. \n\n\n### Expected Behavior ###\n\nAll participants in our events and communications are expected to show respect and courtesy to others. All interactions should be professional regardless of platform: either online or in-person. In order to foster a positive and professional working environment we encourage the following kinds of behaviors in all work events, activities, and platforms:\n\n * Use welcoming and inclusive language\n * Be respectful of different viewpoints and experiences\n * Gracefully accept constructive criticism\n * Focus on what is best for the community\n * Show courtesy and respect towards other community members\n\nNote: See the [four social rules](https://www.recurse.com/manual#sub-sec-social-rules) for further recommendations.\n\n### Unacceptable Behavior ###\n\nHarassment is any form of behavior intended to exclude, intimidate, or cause discomfort. Prohibited harassing behavior includes, but is not limited to:\n\n* written or verbal comments which have the effect of excluding people\n* causing someone to fear for their safety, such as through stalking, following, or intimidating\n* the display of sexual or violent images\n* unwelcome sexual attention\n* non-consensual or unwelcome physical contact\n* sustained disruption of talks, events, or communications\n* incitement to violence, suicide, or self-harm\n* continuing to initiate interaction (including photography or recording) with someone after being asked to stop\n\nand\n\n* publication of private comment without consent\n\nThis list should not be taken to be exhaustive, but rather as a guide to make it easier to enrich our community and all those in which we participate. All interactions should be professional regardless of location: Harassment is prohibited whether it occurs on or offline, and the same standards apply to both.\n\nEnforcement of this Code of Conduct will be respectful and not include any harassing behaviors.\n\n\nYou deserve sincere thanks for helping to make this a welcoming, friendly community for all.\n\nThis Code of Conduct was adapted from the [cmelab](https://github.com/cmelab/getting-started/blob/master/wiki/pages/Code_of_Conduct.md).\n"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) 2022 OpenFreeEnergy\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "MANIFEST.in",
    "content": "recursive-include src/openfe/tests/data/ *.sdf\nrecursive-include src/openfe/tests/data/ *.bz2\nrecursive-include src/openfe/tests/data/ *.csv\nrecursive-include src/openfe/tests/data/ *.pdb\nrecursive-include src/openfe/tests/data/ *.mol2\nrecursive-include src/openfe/tests/data/ *.xml\nrecursive-include src/openfe/tests/data/ *.graphml\nrecursive-include src/openfe/tests/data/ *.edge\nrecursive-include src/openfe/tests/data/ *.dat\nrecursive-include src/openfe/tests/data/ *.txt\nrecursive-include src/openfe/tests/data/ *.gz\nrecursive-include src/openfe/tests/data/ *json_results.gz\ninclude src/openfecli/tests/data/*.json\ninclude src/openfecli/tests/data/*.tar.gz\ninclude src/openfecli/tests/commands/test_gather/*.tsv\nrecursive-include src/openfecli/tests/ *.sdf\nrecursive-include src/openfecli/tests/ *.pdb\ninclude src/openfe/tests/data/openmm_rfe/vacuum_nocoord.nc\n"
  },
  {
    "path": "README.md",
    "content": "[![Logo](https://img.shields.io/badge/OSMF-OpenFreeEnergy-%23002f4a)](https://openfree.energy/)\n[![build](https://github.com/OpenFreeEnergy/openfe/actions/workflows/ci.yaml/badge.svg?branch=main)](https://github.com/OpenFreeEnergy/openfe/actions/workflows/ci.yaml)\n[![coverage](https://codecov.io/gh/OpenFreeEnergy/openfe/branch/main/graph/badge.svg)](https://codecov.io/gh/OpenFreeEnergy/openfe)\n[![documentation](https://readthedocs.org/projects/openfe/badge/?version=stable)](https://docs.openfree.energy/en/stable/?badge=stable)\n[![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.8344248.svg)](https://doi.org/10.5281/zenodo.17258732)\n\n\n# `openfe` - A Python package for executing alchemical free energy calculations.\n\nThe `openfe` package is the flagship project of [Open Free Energy](https://openfree.energy),\na pre competitive consortium aiming to provide robust, permissively licensed open source tools for molecular simulation in the drug discovery field.\n\nUsing `openfe` you can easily plan and execute alchemical free energy calculations.\n\nSee our [website](https://openfree.energy/) for more information on the project,\n[try for yourself](https://try.openfree.energy) from the comfort of your browser,\nand we have [documentation on using the package](https://docs.openfree.energy/en/latest/index.html).\n\n## License\n\nThis library is made available under the [MIT](https://opensource.org/licenses/MIT) open source license.\n\n## Install\n\n### Latest release\n\nThe latest release of `openfe` can be installed via `mamba`, `docker`, or a `single file installer`. See [our installation instructions](https://docs.openfree.energy/en/stable/installation.html) for more details.\nDependencies can be installed via conda through:\n\n### Development version\n\nThe development version of `openfe` can be installed directly from the `main` branch of this repository.\n\nFirst install the package dependencies using `mamba`:\n\n```bash\nmamba env create -f environment.yml\n```\n\nThe openfe library can then be installed via:\n\n```\npython -m pip install --no-deps .\n```\n\n## Authors\n\nThe OpenFE development team.\n\n## Acknowledgements\n\nOpenFE is an [Open Molecular Software Foundation](https://omsf.io/) hosted project.\n"
  },
  {
    "path": "codecov.yml",
    "content": "coverage:\n  status:\n    project: off\n"
  },
  {
    "path": "devtools/data/fix_rbfe_results.py",
    "content": "\"\"\"A script to fix up rbfe_results.tar.gz\n\nUseful if Settings are ever changed in a backwards-incompatible way\n\nWill expect \"rbfe_results.tar.gz\" in this directory, will overwrite this file\n\"\"\"\n\nimport glob\nimport json\nimport os.path\nimport tarfile\n\nfrom gufe.tokenization import JSON_HANDLER\n\nfrom openfe.protocols import openmm_rfe\n\n\ndef untar(fn):\n    \"\"\"extract tarfile called *fn*\"\"\"\n    with tarfile.open(fn) as f:\n        f.extractall()\n\n\ndef retar(loc, name):\n    \"\"\"create tar.gz called *name* of directory *loc*\"\"\"\n    with tarfile.open(name, mode=\"w:gz\") as f:\n        f.add(loc, arcname=os.path.basename(loc))\n\n\ndef replace_settings(fn, new_settings):\n    \"\"\"replace settings instances in *fn* with *new_settings*\"\"\"\n    with open(fn, \"r\") as f:\n        data = json.load(f)\n\n    for k in data[\"protocol_result\"][\"data\"]:\n        data[\"protocol_result\"][\"data\"][k][0][\"inputs\"][\"settings\"] = new_settings\n\n    for k in data[\"unit_results\"]:\n        data[\"unit_results\"][k][\"inputs\"][\"settings\"] = new_settings\n\n    with open(fn, \"w\") as f:\n        json.dump(data, f, cls=JSON_HANDLER.encoder)\n\n\ndef fix_rbfe_results():\n    untar(\"rbfe_results.tar.gz\")\n\n    # generate valid settings as defaults\n    new_settings = openmm_rfe.RelativeHybridTopologyProtocol.default_settings()\n\n    # walk over all result jsons\n    for fn in glob.glob(\"./results/*json\"):\n        # replace instances of settings within with valid settings\n        replace_settings(fn, new_settings)\n\n    retar(\"results\", \"rbfe_results.tar.gz\")\n\n\nif __name__ == \"__main__\":\n    fix_rbfe_results()\n"
  },
  {
    "path": "devtools/data/gen_serialized_results.py",
    "content": "\"\"\"\nDev script to generate some result jsons that are used for testing\n\nGenerates\n- ABFEProtocol_json_results.gz\n  - used in abfe_results_json fixture\n- SepTopProtocol_json_results.gy\n  - used in septop_json fixture\n- AHFEProtocol_json_results.gz\n  - used in afe_solvation_json fixture\n- RHFEProtocol_json_results.gz\n  - used in rfe_transformation_json fixture\n- MDProtocol_json_results.gz\n  - used in md_json fixture\n\"\"\"\n\nimport gzip\nimport json\nimport logging\nimport pathlib\nimport sys\nimport tempfile\n\nimport gufe\nfrom gufe.tokenization import JSON_HANDLER\nfrom kartograf import KartografAtomMapper\nfrom kartograf.atom_aligner import align_mol_shape\nfrom openff.toolkit import AmberToolsToolkitWrapper, Molecule, RDKitToolkitWrapper\nfrom openff.toolkit.utils.toolkit_registry import ToolkitRegistry, toolkit_registry_manager\nfrom openff.units import unit\nfrom rdkit import Chem\n\nimport openfe\nfrom openfe.protocols.openmm_afe import (\n    AbsoluteBindingProtocol,\n    AbsoluteSolvationProtocol,\n)\nfrom openfe.protocols.openmm_md.plain_md_methods import PlainMDProtocol\nfrom openfe.protocols.openmm_rfe import RelativeHybridTopologyProtocol\nfrom openfe.protocols.openmm_septop import SepTopProtocol\nfrom openfecli.utils import configure_logger\n\n# avoid problems with output not showing if queueing system kills a job\nsys.stdout.reconfigure(line_buffering=True)\n\nstdout_handler = logging.StreamHandler(sys.stdout)\nconfigure_logger(\"gufekey\", handler=stdout_handler)\nconfigure_logger(\"gufe\", handler=stdout_handler)\nconfigure_logger(\"openfe\", handler=stdout_handler)\nconfigure_logger(\"openmmtools.multistate.multistatereporter\", level=logging.DEBUG, handler=stdout_handler)  # fmt: skip\nconfigure_logger(\"openmmtools.multistate.multistatesampler\", level=logging.DEBUG, handler=stdout_handler)  # fmt: skip\n\nlogger = logging.getLogger(__name__)\n\nLIGA = \"[H]C([H])([H])C([H])([H])C(=O)C([H])([H])C([H])([H])[H]\"\nLIGB = \"[H]C([H])([H])C(=O)C([H])([H])C([H])([H])C([H])([H])[H]\"\n\namber_rdkit = ToolkitRegistry([RDKitToolkitWrapper(), AmberToolsToolkitWrapper()])\n\n\ndef get_molecule(smi, name):\n    with toolkit_registry_manager(amber_rdkit):\n        m = Molecule.from_smiles(smi)\n        m.generate_conformers()\n        m.assign_partial_charges(partial_charge_method=\"am1bcc\")\n    return openfe.SmallMoleculeComponent.from_openff(m, name=name)\n\n\ndef get_hif2a_inputs():\n    with gzip.open(\"inputs/hif2a_protein.pdb.gz\", \"r\") as f:\n        protcomp = openfe.ProteinComponent.from_pdb_file(f, name=\"hif2a_prot\")\n\n    with gzip.open(\"inputs/hif2a_ligands.sdf.gz\", \"r\") as f:\n        smcs = [\n            openfe.SmallMoleculeComponent(mol)\n            for mol in list(Chem.ForwardSDMolSupplier(f, removeHs=False))\n        ]\n\n    return smcs, protcomp\n\n\ndef execute_and_serialize(\n    dag,\n    protocol,\n    simname,\n    new_serialization: bool = False\n):  # fmt: skip\n    \"\"\"\n    Execute & serialize a DAG\n\n    Parameters\n    ----------\n    dag : gufe.ProtocolDAG\n      The DAG to execute & serialize.\n    protocol : gufe.Protocol\n      The Protocol to which the DAG belongs.\n    simname : str\n      The name of the simulation, used for the serialized file name.\n    new_serialization : bool\n      Whether or not we should use the \"new\" `to_json` serialization.\n      Default is False (for now).\n    \"\"\"\n    logger.info(f\"running {simname}\")\n    with tempfile.TemporaryDirectory() as tmpdir:\n        workdir = pathlib.Path(tmpdir)\n        dagres = gufe.protocols.execute_DAG(\n            dag,\n            shared_basedir=workdir,\n            scratch_basedir=workdir,\n            keep_shared=True,\n            raise_error=True,\n            n_retries=2,\n        )\n    protres = protocol.gather([dagres])\n\n    if new_serialization:\n        protres.to_json(f\"{simname}_json_results.json\")\n\n    else:\n        outdict = {\n            \"estimate\": protres.get_estimate(),\n            \"uncertainty\": protres.get_uncertainty(),\n            \"protocol_result\": protres.to_dict(),\n            \"unit_results\": {\n                unit.key: unit.to_keyed_dict()\n                for unit in dagres.protocol_unit_results\n            }\n        }  # fmt: skip\n\n        with gzip.open(f\"{simname}_json_results.gz\", \"wt\") as zipfile:\n            json.dump(outdict, zipfile, cls=JSON_HANDLER.encoder)\n\n\ndef generate_md_settings():\n    settings = PlainMDProtocol.default_settings()\n    settings.simulation_settings.equilibration_length_nvt = 0.01 * unit.nanosecond\n    settings.simulation_settings.equilibration_length = 0.01 * unit.nanosecond\n    settings.simulation_settings.production_length = 0.01 * unit.nanosecond\n    settings.forcefield_settings.nonbonded_method = \"nocutoff\"\n\n    return settings\n\n\ndef generate_md_json(smc):\n    protocol = PlainMDProtocol(settings=generate_md_settings())\n    system = openfe.ChemicalSystem({\"ligand\": smc})\n    dag = protocol.create(stateA=system, stateB=system, mapping=None)\n\n    execute_and_serialize(dag, protocol, \"MDProtocol\")\n\n\ndef generate_abfe_settings():\n    settings = AbsoluteBindingProtocol.default_settings()\n    settings.solvent_equil_simulation_settings.equilibration_length_nvt = 10 * unit.picosecond\n    settings.solvent_equil_simulation_settings.equilibration_length = 10 * unit.picosecond\n    settings.solvent_equil_simulation_settings.production_length = 10 * unit.picosecond\n    settings.solvent_simulation_settings.equilibration_length = 100 * unit.picosecond\n    settings.solvent_simulation_settings.production_length = 500 * unit.picosecond\n    settings.solvent_simulation_settings.time_per_iteration = 2.5 * unit.ps\n    settings.complex_equil_simulation_settings.equilibration_length_nvt = 10 * unit.picosecond\n    settings.complex_equil_simulation_settings.equilibration_length = 10 * unit.picosecond\n    settings.complex_equil_simulation_settings.production_length = 100 * unit.picosecond\n    settings.complex_simulation_settings.equilibration_length = 100 * unit.picosecond\n    settings.complex_simulation_settings.production_length = 500 * unit.picosecond\n    settings.complex_simulation_settings.time_per_iteration = 2.5 * unit.ps\n    settings.solvent_solvation_settings.box_shape = \"dodecahedron\"\n    settings.complex_solvation_settings.box_shape = \"dodecahedron\"\n    settings.solvent_solvation_settings.solvent_padding = 1.5 * unit.nanometer\n    settings.complex_solvation_settings.solvent_padding = 1.0 * unit.nanometer\n    settings.forcefield_settings.nonbonded_cutoff = 0.8 * unit.nanometer\n    settings.protocol_repeats = 3\n    settings.engine_settings.compute_platform = \"CUDA\"\n\n    return settings\n\n\ndef generate_abfe_json():\n    ligands, protein = get_hif2a_inputs()\n    protocol = AbsoluteBindingProtocol(settings=generate_abfe_settings())\n    sysA = openfe.ChemicalSystem(\n        {\n            \"ligand\": ligands[0],\n            \"protein\": protein,\n            \"solvent\": openfe.SolventComponent(),\n        }\n    )\n    sysB = openfe.ChemicalSystem(\n        {\n            \"protein\": protein,\n            \"solvent\": openfe.SolventComponent(),\n        }\n    )\n\n    dag = protocol.create(stateA=sysA, stateB=sysB, mapping=None)\n    execute_and_serialize(dag, protocol, \"ABFEProtocol\", new_serialization=True)\n\n\ndef generate_ahfe_settings():\n    settings = AbsoluteSolvationProtocol.default_settings()\n    settings.solvent_equil_simulation_settings.equilibration_length_nvt = 10 * unit.picosecond\n    settings.solvent_equil_simulation_settings.equilibration_length = 10 * unit.picosecond\n    settings.solvent_equil_simulation_settings.production_length = 10 * unit.picosecond\n    settings.solvent_simulation_settings.equilibration_length = 10 * unit.picosecond\n    settings.solvent_simulation_settings.production_length = 500 * unit.picosecond\n    settings.vacuum_equil_simulation_settings.equilibration_length = 10 * unit.picosecond\n    settings.vacuum_equil_simulation_settings.production_length = 10 * unit.picosecond\n    settings.vacuum_simulation_settings.equilibration_length = 10 * unit.picosecond\n    settings.vacuum_simulation_settings.production_length = 1000 * unit.picosecond\n    settings.lambda_settings.lambda_elec = [0.0, 0.25, 0.5, 0.75, 1.0, 1.0,\n                                            1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,\n                                            1.0]  # fmt: skip\n    settings.lambda_settings.lambda_vdw = [0.0, 0.0, 0.0, 0.0, 0.0, 0.12, 0.24,\n                                           0.36, 0.48, 0.6, 0.7, 0.77, 0.85,\n                                           1.0]  # fmt: skip\n    settings.protocol_repeats = 3\n    settings.solvent_simulation_settings.n_replicas = 14\n    settings.vacuum_simulation_settings.n_replicas = 14\n    settings.solvent_simulation_settings.early_termination_target_error = 0.12 * unit.kilocalorie_per_mole  # fmt: skip\n    settings.vacuum_simulation_settings.early_termination_target_error = 0.12 * unit.kilocalorie_per_mole  # fmt: skip\n    settings.vacuum_engine_settings.compute_platform = \"CPU\"\n    settings.solvent_engine_settings.compute_platform = \"CUDA\"\n\n    return settings\n\n\ndef generate_ahfe_json(smc):\n    protocol = AbsoluteSolvationProtocol(settings=generate_ahfe_settings())\n    sysA = openfe.ChemicalSystem({\"ligand\": smc, \"solvent\": openfe.SolventComponent()})\n    sysB = openfe.ChemicalSystem({\"solvent\": openfe.SolventComponent()})\n\n    dag = protocol.create(stateA=sysA, stateB=sysB, mapping=None)\n\n    execute_and_serialize(dag, protocol, \"AHFEProtocol\")\n\n\ndef generate_rfe_settings():\n    settings = RelativeHybridTopologyProtocol.default_settings()\n    settings.simulation_settings.equilibration_length = 10 * unit.picosecond\n    settings.simulation_settings.production_length = 250 * unit.picosecond\n    settings.forcefield_settings.nonbonded_method = \"nocutoff\"\n\n    return settings\n\n\ndef generate_rfe_json(smcA, smcB):\n    protocol = RelativeHybridTopologyProtocol(settings=generate_rfe_settings())\n\n    a_smcB = align_mol_shape(smcB, ref_mol=smcA)\n    mapper = KartografAtomMapper(atom_map_hydrogens=True)\n    mapping = next(mapper.suggest_mappings(smcA, a_smcB))\n\n    systemA = openfe.ChemicalSystem({\"ligand\": smcA})\n    systemB = openfe.ChemicalSystem({\"ligand\": a_smcB})\n\n    dag = protocol.create(stateA=systemA, stateB=systemB, mapping=mapping)\n\n    execute_and_serialize(dag, protocol, \"RHFEProtocol\")\n\n\ndef generate_septop_settings():\n    settings = SepTopProtocol.default_settings()\n    settings.solvent_equil_simulation_settings.equilibration_length_nvt = 10 * unit.picosecond\n    settings.solvent_equil_simulation_settings.equilibration_length = 10 * unit.picosecond\n    settings.solvent_equil_simulation_settings.production_length = 10 * unit.picosecond\n    settings.solvent_simulation_settings.equilibration_length = 10 * unit.picosecond\n    settings.solvent_simulation_settings.production_length = 50 * unit.picosecond\n    settings.solvent_simulation_settings.time_per_iteration = 2.5 * unit.ps\n    settings.complex_equil_simulation_settings.equilibration_length_nvt = 10 * unit.picosecond\n    settings.complex_equil_simulation_settings.equilibration_length = 10 * unit.picosecond\n    settings.complex_equil_simulation_settings.production_length = 10 * unit.picosecond\n    settings.complex_simulation_settings.equilibration_length = 10 * unit.picosecond\n    settings.complex_simulation_settings.production_length = 50 * unit.picosecond\n    settings.complex_simulation_settings.time_per_iteration = 2.5 * unit.ps\n    settings.solvent_solvation_settings.box_shape = \"dodecahedron\"\n    settings.complex_solvation_settings.box_shape = \"dodecahedron\"\n    settings.solvent_solvation_settings.solvent_padding = 1.2 * unit.nanometer\n    settings.complex_solvation_settings.solvent_padding = 1.0 * unit.nanometer\n    settings.forcefield_settings.nonbonded_cutoff = 0.9 * unit.nanometer\n    settings.protocol_repeats = 1\n    settings.engine_settings.compute_platform = \"CUDA\"\n\n    return settings\n\n\ndef generate_septop_json():\n    hif2a_ligands, hif2a_protein = get_hif2a_inputs()\n    protocol = SepTopProtocol(settings=generate_septop_settings())\n    sysA = openfe.ChemicalSystem(\n        {\n            \"ligand_A\": hif2a_ligands[0],\n            \"protein\": hif2a_protein,\n            \"solvent\": openfe.SolventComponent(),\n        }\n    )\n    sysB = openfe.ChemicalSystem(\n        {\n            \"ligand_B\": hif2a_ligands[1],\n            \"protein\": hif2a_protein,\n            \"solvent\": openfe.SolventComponent(),\n        }\n    )\n\n    dag = protocol.create(stateA=sysA, stateB=sysB, mapping=None)\n    execute_and_serialize(dag, protocol, \"SepTopProtocol\")\n\n\nif __name__ == \"__main__\":\n    molA = get_molecule(LIGA, \"ligandA\")\n    molB = get_molecule(LIGB, \"ligandB\")\n    generate_md_json(molA)\n    generate_abfe_json()\n    generate_ahfe_json(molA)\n    generate_rfe_json(molA, molB)\n    generate_septop_json()\n"
  },
  {
    "path": "devtools/debug_openmm.sh",
    "content": "#!/usr/bin/env bash\n\necho \"Run this script with your conda env activated\"\necho \"Invoke the script like this: \"\necho \"./debug_openmm.sh | tee -a debug.log\"\necho \"Then send us debug.log\"\n\nset -euo pipefail\n\ndate\n\nwhich -a python\n\nconda info -a || echo \"no conda\"\nmamba info -a || echo \"no mamba\"\nmicromamba info || echo \"no micromamba\"\n\nnvidia-smi || echo \"no nvidia-smi, are you on a gpu node?\"\n\necho \"test openmm\"\npython -m openmm.testInstallation || echo \"testing openmm\"\n\necho \"checking plugin load failures\"\npython -c \"import openmm; print(openmm.Platform.getPluginLoadFailures())\" || echo \"plugin load failures\"\n\necho \"checking which platforms support mixed precision\"\npython -c \"import openmmtools; [print(_.getName()) for _ in openmmtools.utils.get_available_platforms(minimum_precision='mixed')]\" || echo \"openmm errors\"\n\nconda list || echo \"no conda\"\nmamba list || echo \"no mamba\"\nmicromamba list || echo \"no micromamba\"\n"
  },
  {
    "path": "devtools/installer/construct.yaml",
    "content": "name: OpenFEforge\nversion: {{ environ[\"VERSION\"] }}\ncompany: OpenFE\nlicense_file: ../../LICENSE\n\nchannels:\n  - conda-forge\n\nwrite_condarc: True\nkeep_pkgs: True\ntransmute_file_type: .conda\n\nspecs:\n  - conda\n  - jupyterlab\n  - mamba\n  - notebook <7\n  - openfe=={{ environ[\"VERSION\"] }}\n  - pip\n  - pytest\n  - pytest-xdist\n  # python needs to match https://github.com/googlecolab/backend-info/blob/main/os-info.txt\n  # until colab pushes a fix\n  - python 3.12.11\n\n# Not building an .exe for windows or a .pkg for macOS\ninstaller_type: sh\n"
  },
  {
    "path": "docs/CHANGELOG.rst",
    "content": "=========\nChangelog\n=========\n\n.. current developments\n\nv1.11.1\n====================\n\n**Fixed:**\n\n* Fixed slow response time of CLI commands (`PR #1972 <https://github.com/OpenFreeEnergy/openfe/pull/1972>`_).\n\n\n\n\nv1.11.0\n====================\n\n* **openfe v1.11.0** introduces support for protein-membrane systems both with the Python API and the CLI. See our tutorial `RBFE calculations of a Protein-Membrane System <https://docs.openfree.energy/en/latest/tutorials/rbfe_membrane_protein.html>`_ for details.\n\nThe `ability to resume execution of incomplete transformations <https://docs.openfree.energy/en/v1.10.0/guide/execution/quickrun_execution.html>`_ that was introduced in ``openfe v1.10.0`` is now available for the plain MD and SepTop protocols.\n\nSee below for the full changelog for this release:\n\n**Added:**\n\n* Added support for systems with membranes to the following protocols:\n  PlainMDProtocol, RelativeHybridTopologyProtocol, SepTopProtocol, and AbsoluteBindingProtocol (`PR #1561 <https://github.com/OpenFreeEnergy/openfe/pull/1561>`_).\n* Added support for membrane systems to ``openfe plan-rbfe-network``.\n  Use ``--protein-membrane`` instead of the ``--protein`` argument, and see the tutorial on preparing membrane systems (`PR #1896 <https://github.com/OpenFreeEnergy/openfe/pull/1896>`_).\n* Added API support for resuming the PlainMDProtocol (`PR #1884 <https://github.com/OpenFreeEnergy/openfe/pull/1884>`_).\n* Added API support for resuming the SepTopProtocol. (`PR #1949 <https://github.com/OpenFreeEnergy/openfe/pull/1949>`_).\n* The ``validate`` method for the SepTopProtocol has been implemented.\n  This means that settings and system validation can mostly be done prior to Protocol execuation by calling ``SepTopProtocol.validate(stateA, stateB, mapping=None)`` (`PR #1946 <https://github.com/OpenFreeEnergy/openfe/pull/1946>`_).\n\n**Changed:**\n\n* The SepTopProtocol now has a dedicated Analysis unit.\n  At the top level API, this does not change behavior, but if you are directly interfacing with th ProtocolUnits, you will have to account for this change.\n  The SepTopProtocolResult now solely uses the Analysis units (`PR #1937 <https://github.com/OpenFreeEnergy/openfe/pull/1937>`_).\n* Updated the chemical systems user guide and the defining protocols user guide to reflect recent protocol updates, including adding membrane support (`PR #1933 <https://github.com/OpenFreeEnergy/openfe/pull/1933>`_).\n* The default value for the Hybrid TopologyProtocol setting ``turn_off_core_unique_exceptions`` has been changed to ``True``.\n  This means 1-4 interactions involving the unique alchemical atoms and core regions will now be interpolated on/off accordingly by default (`PR #1856 <https://github.com/OpenFreeEnergy/openfe/pull/1856>`_).\n\n**Deprecated:**\n\n* Perses atom mapper and scorer functionality is deprecated, now slated to be removed in ``openfe v1.12``.\n  This includes ``PersesAtomMapper`` and ``default_perses_scorer`` (`PR #1857 <https://github.com/OpenFreeEnergy/openfe/pull/1857>`_).\n\n**Fixed:**\n\n* Fix erroneous logging information message which would mention setting up the alchemical system when running simulation or analysis units with the hybrid topology, AHFE or ABFE Protocols (`PR #1915 <https://github.com/OpenFreeEnergy/openfe/pull/1915>`_).\n* System equality checks on resuming no longer expect complete equality in the force parameters.\n  This fixes a scenario where small changes in precision due to running on different machines would prevent users from restarting their simulations (`PR #1914 <https://github.com/OpenFreeEnergy/openfe/pull/1914>`_).\n\n\n\nv1.10.0\n====================\n\nThis release introduces the ability to resume execution of an incomplete transformation using ``openfe quickrun`` with the ``--resume`` flag.\nSee the `quickrun documentation <https://docs.openfree.energy/en/v1.10.0/guide/execution/quickrun_execution.html>`_ details.\n\n**Added:**\n\n* Added ``--resume`` flag to ``openfe quickrun``.\n  Quickrun now temporarily caches ``protocolDAG`` information and, when used with the ``--resume`` flag, quickrun will attempt to resume execution of an incomplete transformation (`PR #1848 <https://github.com/OpenFreeEnergy/openfe/pull/1848>`_).\n* Added API support to resume ``RelativeHybridTopologyProtocol`` simulations (`PR #1774 <https://github.com/OpenFreeEnergy/openfe/pull/1774>`_).\n* Added API support to resume ``AbsoluteBindingProtocol`` and ``AbsoluteSolvationProtocol`` simulations (`PR #1808 <https://github.com/OpenFreeEnergy/openfe/pull/1808>`_).\n\n**Deprecated:**\n\n* Perses atom mapper and scorer functionality is deprecated, slated to be removed in ``openfe v2.0``.\n  This includes ``PersesAtomMapper`` and ``default_perses_scorer`` (`PR #1857 <https://github.com/OpenFreeEnergy/openfe/pull/1857>`_).\n\n**Fixed:**\n\n* Fixed bug introduced in v1.9.0 to ``openfe gather-abfe --report=raw`` where additional unit results for Setup and Simulation units would be shown.\n  This fix restores the behavior prior to v1.9.0 (`PR #1876 <https://github.com/OpenFreeEnergy/openfe/pull/1876>`_).\n\n\n\nv1.9.1\n====================\n\n**Fixed:**\n\n* Fixed a bug in Protocol termination for the HybridTop and AFE Protocols which would unnecessarily declare an ``UnboundLocalError``.\n* Updated ``openfe_analysis`` dependency  to fix issue with RMSD analysis (`Issue #1834 <https://github.com/OpenFreeEnergy/openfe/issues/1834>`_).\n\n\n\nv1.9.0\n====================\n\n**Added:**\n\n* The ``validate`` method for the RelativeHybridTopologyProtocol has been implemented.\n  This means that settings and system validation can mostly be done prior to Protocol execution by calling ``RelativeHybridTopologyProtocol.validate(stateA, stateB, mapping)`` (`PR #1740 <https://github.com/OpenFreeEnergy/openfe/pull/1740>`_).\n\n* Added ``openfe test --download-only`` flag, which downloads all test data stored remotely to the local cache (`PR #1814 <https://github.com/OpenFreeEnergy/openfe/pull/1814>`_).\n\n**Changed:**\n\n* The absolute free energy protocols (AbsoluteBindingProtocol and AbsoluteSolvationProtocol) have been broken into multiple\n  protocol units, allowing for setup, run, and analysis to happen\n  separately in the future when relevant changes to protocol execution are\n  made (`PR #1776 <https://github.com/OpenFreeEnergy/openfe/pull/1776>`_).\n* The relative free energy protocol (RelativeHybridTopologyProtocol) has been\n  broken into multiple protocol units, allowing for the setup, run, analysis to happen\n  separately (`PR #1773 <https://github.com/OpenFreeEnergy/openfe/pull/1773>`_).\n\n**Fixed:**\n\n* Fixed bug in ligand network visualization (such as with ``openfe view-ligand-network``) so that ligand names are no longer cut off by the plot border (`PR #1822 <https://github.com/OpenFreeEnergy/openfe/pull/1822>`_).\n* Endstates in the RelativeHybridTopologyProtocol are now being created\n  in a manner that allows for isomorphic molecules that differ between\n  endstates to have different parameters (`PR #1772 <https://github.com/OpenFreeEnergy/openfe/pull/1772>`_).\n\n\n\nv1.8.1\n====================\n\n**Added:**\n\n* Added a progress bar for ``openfe gather`` JSON loading (`PR #1786 <https://github.com/OpenFreeEnergy/openfe/pull/1786>`_).\n\n**Fixed:**\n\n* Due to issues with OpenFF's handling of toolkit registries\n  with NAGL, the use of NAGL models (e.g. AshGC) when OpenEye\n  is installed but not requested as the charge backend has been\n  disabled (Issue #1760, `PR #1762 <https://github.com/OpenFreeEnergy/openfe/pull/1762>`_).\n* Fixed bug in ligand network visualization (such as with ``openfe view-ligand-network``) so that ligand names are no longer cut off by the plot border (`PR #1822 <https://github.com/OpenFreeEnergy/openfe/pull/1822>`_).\n\n\n\nv1.8.0\n====================\n\n**Added:**\n\n* The ``HybridTopologyFactory`` supports building hybrid OpenMM systems which contain ``CMAPTorsionForces`` on non-alchemical atoms.\n  This should allow for simulations using Amber ff19SB (`PR #1695 <https://github.com/OpenFreeEnergy/openfe/pull/1695>`_).\n* Added experimental features ``openfe gather-septop`` and ``openfe gather-abfe``, which are analogous to ``openfe gather`` and allow for gathering results generated by the Separated Topologies and Absolute Binding Free Energy protocols, respectively.  These commands are experimental and are liable to be changed in a future release.\n* Emit a clarifying log message when a user gets a warning from JAX (`PR #1585 <https://github.com/OpenFreeEnergy/openfe/pull/1585>`_, fixes `Issue #1499 <https://github.com/OpenFreeEnergy/openfe/issues/1499>`_).\n* Disable JAX acceleration by default, see https://docs.openfree.energy/en/latest/guide/troubleshooting.html#pymbar-disable-jax for more information (`PR #1694 <https://github.com/OpenFreeEnergy/openfe/pull/1692>`_).\n* New options have been added to the ``AlchemicalSettings`` of the ``SepTopProtocol``, ``AbsoluteSolvationProtocol`` and ``AbsoluteBindingProtocol``. Notably, these options allow users to control the softcore parameters as well as the use of long range dispersion corrections (`PR #1742 <https://github.com/OpenFreeEnergy/openfe/pull/1742>`_).\n\n**Changed:**\n\n* ``openfe gather`` is now more rigorous in extracting ligand names and run types. These are now determined directly from component attributes, rather than relying on naming conventions. (`PR #1691 <https://github.com/OpenFreeEnergy/openfe/pull/1702>`_).\n* Updated installation docs to recommend ``miniconda`` with ``conda-lock`` as the preferred installation method (`PR #1692 <https://github.com/OpenFreeEnergy/openfe/pull/1692>`_).\n\n\n\nv1.7.0\n====================\n\nThis release brings several long awaited features to OpenFE, including the SepTop and ABFE Protocols, as well as the adoption of more computationally efficient settings in the CLI and across the Python API.\n\nThe v1.7.0 release also comes with some API changes and breaks, including:\n  * \"CUDA\" is now the default platform in the settings, you will need to change this if you run on a non-NVIDIA-powered platform.\n  * The default solvation cutoff is now 1.5 nm, to avoid issues with small boxes when dealing with ligands in solvent. When calculating complexes using the MD or HybridTopology Protocols with the API, you will need to reduce this value to ~ 1 nm to avoid excessively large water boxes.\n  * The API has fully migrated to Pydantic V2 and the ``GufeQuantity`` scheme. This only affects Protocol developers. If needed, please see the `gufe typing documentation <https://gufe.openfree.energy/en/latest/generated/gufe.settings.typing.html>`_ for more details.\n\nNote that if you want to use NAGL to assign partial charges, you must use ``python >= 3.11``.\nPython 3.10 support is no longer maintained according to `SPEC 0 <https://scientific-python.org/specs/spec-0000/>`_ guidelines.\nThe openfe lock file and docker and apptainer images use Python 3.12, and so charge assignment with NAGL will work without intervention.\n\n**Added:**\n\n* Addition of an Absolute Binding Free Energy Protocol (`PR #1045 <https://github.com/OpenFreeEnergy/openfe/pull/1045>`_).\n* Added `a cookbook for using jq to inspect JSON files <https://docs.openfree.energy/en/v1.7.0/cookbook/jq_inspection.html>`_.\n* The AbsoluteSolvationProtocol now properly implements the ``validate`` method,\n  allowing users to verify inputs by calling the method directly (`PR #1572 <https://github.com/OpenFreeEnergy/openfe/pull/1572>`_).\n* Added a new RBFE protocol based on Separated Topologies (`PR #1057 <https://github.com/OpenFreeEnergy/openfe/pull/1057>`_).\n\n**Changed:**\n\n* The default atom mapper used in the CLI has been changed from ``LomapAtomMapper`` to ``KartografAtomMapper`` in line with the recommended defaults from the industry benchmarking paper. Users who wish to continue to use ``LomapAtomMapper`` can do so via the YAML configuration file. See the `documentation <https://docs.openfree.energy/en/latest/tutorials/rbfe_cli_tutorial.html#customize-your-campaign-setup>`_ for details (`PR #1530 <https://github.com/OpenFreeEnergy/openfe/pull/1530>`_).\n* An improved error message is now shown when a mapping involving a changing constraint length cannot be fixed (`PR #1529 <https://github.com/OpenFreeEnergy/openfe/pull/1529>`_).\n* The default platform for OpenMM-based Protocols is now CUDA and will fail by default on a non-Nvidia GPU enabled system (`PR #1576 <https://github.com/OpenFreeEnergy/openfe/pull/1576>`_).\n* Remove unnecessary limit on residues ids (``resids``) when getting mappings from topology in ``topology_helpers.py`` utility module (`PR #1539 <https://github.com/OpenFreeEnergy/openfe/pull/1539>`_).\n* The relative hybrid topology protocol no longer runs the FIRE minimizer when ``dry=True`` (`PR #1468 <https://github.com/OpenFreeEnergy/openfe/pull/1468>`_).\n* Units must be explicitly assigned when defining ``Settings`` parameters, and values will be converted to match the default units for a given field. For example, use ``1.0 * units.bar`` or ``\"1 bar\"`` for pressure, and ``300 * unit.kelvin`` or ``\"300 kelvin\"`` for temperature.\n* For protocol developers: ``FloatQuantity`` is no longer supported. Instead, use ``GufeQuantity`` and ``specify_quantity_units()`` to make a ``TypeAlias``. See the `gufe typing documentation <https://gufe.openfree.energy/en/latest/generated/gufe.settings.typing.html>`_ for more details.\n* The default ``time_per_iteration`` setting of the ``MultiStateSimulationSettings`` class has been increased from 1.0 ps to 2.5 ps as part of the fast settings update (`PR #1523 <https://github.com/OpenFreeEnergy/openfe/pull/1523>`_).\n\n* The default ``box_shape`` setting of the ``OpenMMSolvationSettings`` class has been changed from ``cubic`` to ``dodecahedron`` to improve simulation efficiency as part of the fast settings update (`PR #1523 <https://github.com/OpenFreeEnergy/openfe/pull/1523>`_).\n\n* The default ``solvent_padding`` settings of the ``OpenMMSolvationSettings`` class has been increased from 1.2 nm to 1.5 nm to be compatible with the new ``box_shape`` default as part of the fast settings update (`PR #1523 <https://github.com/OpenFreeEnergy/openfe/pull/1523>`_).\n\n* The default ``nonbonded_cutoff`` setting of the ``OpenMMSystemGeneratorFFSettings`` class has been decreased to 0.9 nm from 1.0 nm, in line with current force fields best practices and our newly validated fast settings (`PR #1523 <https://github.com/OpenFreeEnergy/openfe/pull/1523>`_).\n\n* When calling the CLI ``openfe plan_rbfe_network``, the ``RelativeHybridTopologyProtocol`` settings now reflects the above \"fast\" settings updates. This includes;\n\n  * Dodecahedron box solvation\n  * Solvation cutoff of 1.5 nm in solvent-only legs, and 1.0 nm in complex legs\n  * A replica exchange rate of 2.5 ps\n  * A 0.9 nm nonbonded cutoff\n\n**Deprecated:**\n\n* Deprecated ``openfe.utils.visualization_3D.view_mapping_3d()``. Use the method ``LigandAtomMapping.view_3d()`` instead (`PR #1592 <https://github.com/OpenFreeEnergy/openfe/pull/1592>`_).\n* Deprecated ``openfe.utils.ligand_utils.get_alchemical_charge_difference()``, which is replaced by ``LigandAtomMapping.get_alchemical_charge_difference()`` in ``gufe`` (`PR #1479 <https://github.com/OpenFreeEnergy/openfe/pull/1479>`_).\n\n**Fixed:**\n\n* Charged molecules are now explicitly disallowed in the\n  AbsoluteSolvationProtocol(`PR #1572 <https://github.com/OpenFreeEnergy/openfe/pull/1572>`_).\n\n\n\nv1.6.1\n====================\nThis release includes minor fixes and updates to tests.\n\n**Added:**\n\n* Added a cookbook for using ``jq`` to inspect JSON files.\n\n**Changed:**\n\n* Remove unnecessary limit on residues ids (``resids``) when getting mappings from topology in ``topology_helpers.py`` utility module.\n* The relative hybrid topology protocol no longer runs the FIRE minimizer when ``dry=True``.\n\n**Fixed:**\n\n* Updated tests to expect to find NAGL, now that it is supported.\n\n\n\nv1.6.0\n====================\nThis release adds support for OpenMM 8.3.0 and Python 3.13.\n\n**Added:**\n\n* Added support for openmm 8.3.0 (benchmarking results at `Issue #1377 <https://github.com/OpenFreeEnergy/openfe/issues/1377>`_.\n* Added support for ``python 3.13`` (we no longer guarantee support for ``python 3.10``).\n* Adds a new internal API for defining alchemical restraints (`PR #1043 <https://github.com/OpenFreeEnergy/openfe/pull/1043>`_).\n\n\n\nv1.5.0\n====================\nThis release includes support for openmm 8.2 and numpy v2. Checkpoint interval default frequency has changed, resulting in much smaller file sizes. There are also a few minor changes as a result of migrating to use **konnektor** as the backend for many network generators.\n\n\n**Added:**\n\n* Added support for openmm 8.2 (`PR #1366 <https://github.com/OpenFreeEnergy/openfe/pull/1366>`_)\n* Added optional ``n_processes`` (number of parallel processes to use when generating the network) arguments for network planners (`PR #927 <https://github.com/OpenFreeEnergy/openfe/pull/927>`_).\n* Added optional ``progress`` (whether to show progress bar) for ``openfe.setup.ligand_network_planning.generate_radial_network`` (default= ``False``, such that there is no default behavior change)(`PR #927 <https://github.com/OpenFreeEnergy/openfe/pull/927>`_).\n* Added compatibility for numpy v2 (`PR #1260 <https://github.com/OpenFreeEnergy/openfe/pull/1260>`_).\n\n**Changed:**\n\n* The checkpoint interval default frequency has been increased to every\n  nanosecond. ``real_time_analysis_interval`` no longer needs to be divisible\n  by the checkpoint interval, allowing users of the ``HybridTopologyProtocol``\n  and ``AbsoluteSolvationProtocol`` to write checkpoints less frequently and\n  yielding smaller file sizes.\n* `konnektor <https://konnektor.openfree.energy/en/latest/>`_ is now used as the backend for all network generation (`PR #927 <https://github.com/OpenFreeEnergy/openfe/pull/927>`_).\n* ``openfe.setup.ligand_network_planning.generate_maximal_network`` now returns the *best* mapping for each edge, rather than *all possible* mappings for each edge. If multiple mappers are passed but no scorer, the first mapper passed will be used, and a warning will be raised (`PR #927 <https://github.com/OpenFreeEnergy/openfe/pull/927>`_).\n\n**Fixed:**\n\n* Absolute free energy calculations (e.g. ``AbsoluteSolvationProtocol``) now\n  correctly pass the equilibrated box vectors to the alchemical simulation.\n  In the past default vectors were used, which in some cases led to random\n  crashes due to an abrupt volume change. We do not believe that this\n  significantly affected free energy results (`PR #1275 <https://github.com/OpenFreeEnergy/openfe/pull/1275>`_).\n\n\n\nv1.4.0\n====================\n\nThis release includes significant quality of life improvements for the CLI's ``openfe gather`` command.\n\n**Added:**\n\n* ``openfe gather`` now accepts any number of filepaths and/or directories containing results JSON files, instead of only accepting one results directory (`PR #1212 <https://github.com/OpenFreeEnergy/openfe/pull/1212>`_).\n* When running ``openfe gather --report=dg`` and result edges have fewer than 2 replicates, an error will be thrown up-front instead of failing downstream with a ``numpy.linalg.LinAlgError: SVD did not converge`` error (`PR #1243 <https://github.com/OpenFreeEnergy/openfe/pull/1243>`_).\n* ``openfe gather`` includes failed simulations in its output, with ``Error`` listed in place of a computed value, instead of simply omitting those results from the output table (`PR #1227 <https://github.com/OpenFreeEnergy/openfe/pull/1227>`_).\n* ``openfe gather --report=dg`` (the default) checks for connectivity of the results network and throws an error if the network is disconnected or has fewer than 3 edges (`PR #1227 <https://github.com/OpenFreeEnergy/openfe/pull/1227>`_).\n* ``openfe gather`` prints warnings for all results JSONs whose simulations have failed or are otherwise invalid  (`PR #1227 <https://github.com/OpenFreeEnergy/openfe/pull/1227>`_ ).\n* ``openfe gather`` now throws an error up-front if no valid results are provided, instead of returning an empty table (`PR #1245 <https://github.com/OpenFreeEnergy/openfe/pull/1245>`_).\n\n**Changed:**\n\n* Improved formatting of ``openfe gather`` output tables. Use ``--tsv`` to instead view the raw tsv formatted output (this was the default behavior as of v1.3.x) (`PR #1246 <https://github.com/OpenFreeEnergy/openfe/pull/1246>`_).\n* Improved responsiveness of several CLI commands (`PR #1254 <https://github.com/OpenFreeEnergy/openfe/pull/1254>`_).\n\n\nv1.3.1\n====================\nBugfix release - Improved error handling and code cleanup.\n\nWe are also dropping official support for MacOSX-x86_64.\nAny platform-specific bugs will be addressed when possible, but as a low priority.\n\n**Added:**\n\n* ``openfe gather`` now detects failed simulations up-front and prints warnings to stdout (`PR #1207 <https://github.com/OpenFreeEnergy/openfe/pull/1207>`_).\n\n**Changed:**\n\n* Temporarily disabled bootstrap uncertainties in forward/reverse analysis due to solver loop issues when dealing with too small a set of samples (`PR #1174 <https://github.com/OpenFreeEnergy/openfe/pull/1174>`_).\n\n**Removed:**\n\n* Dropped official support for MacOSX-x86_64. Any platform-specific bugs will be addressed when possible, but as a low priority.\n* Unused trajectory handling code was removed from ``openfe.utils``, please use ``openfe-analysis`` instead (`PR #1182 <https://github.com/OpenFreeEnergy/openfe/pull/1182>`_).\n\n**Fixed:**\n\n* Fixed `issue #1178 <https://github.com/OpenFreeEnergy/openfe/issues/1178>`_ -- The GPU system probe is now more robust to different ways the ``nvidia-smi`` command can fail (`PR #1186 <https://github.com/OpenFreeEnergy/openfe/pull/1186>`_)\n* Fixed bug where openmm protocols using default settings would re-load from JSON as a different gufe key due to unit name string representation discrepancies (`PR #1210 <https://github.com/OpenFreeEnergy/openfe/pull/1210>`_)\n\n\nv1.3.0\n====================\n\n**Added:**\n\n* Added CLI support for ``generate_lomap_network``. This option can be specified as a `YAML-defined setting <https://docs.openfree.energy/en/stable/guide/cli/cli_yaml.html>`_\n* Added ``--n-protocol-repeats`` CLI option to allow user-defined number of repeats per quickrun execution. This allows for parallelizing execution of repeats by setting ``--n-protocol-repeats=1`` and calling ``quickrun`` on the same input file multiple times.\n* Added a new CLI command (``charge-molecules``) to bulk assign partial charges to molecules `PR#1068 <https://github.com/OpenFreeEnergy/openfe/pull/1068>`_\n* CLI setup will raise warnings for unsupported top-level YAML fields.\n* OpenMMEngineSettings now has a `gpu_device_index` attribute allowing users to pass through a list of ``ints`` to select the GPU devices to run their simulations on.\n* Add support for variable position/velocity trajectory writing.\n* ``openfe gather`` now supports replicates that have been submitted in parallel across separate directories.\n\n**Changed:**\n\n* Networks planned using the CLI will now automatically use an extended protocol for transformations involving a net charge change `PR#1053 <https://github.com/OpenFreeEnergy/openfe/pull/1053>`_\n* The ``plan-rhfe-network`` and ``plan-rbfe-network`` CLI commands will now assign partial charges before planning the network if charges are not present, the charge assignment method can be controlled via the yaml settings file `PR#1068 <https://github.com/OpenFreeEnergy/openfe/pull/1068>`_\n* `openfe.protocols.openmm_rfe._rfe_utils.compute` has been moved to `openfe.protocols.openmm_utils.omm_compute`.\n* ``openfe gather`` now includes *all* edges with missing runs (instead of just the first failing edge) when raising a \"missing runs\" error.\n* ``openfe quickrun`` now creates the parent directory as-needed for user-defined output json paths (``-o``).\n* The MBAR bootstrap (1000 iterations) error is used to estimate protocol uncertainty instead of the statistical uncertainty (one standard deviation) and pymbar3 is no longer supported `PR#1077 <https://github.com/OpenFreeEnergy/openfe/pull/1077>`_\n* CLI network planners' default names use prefixes `rbfe_` or `rhfe_` , instead of `easy_rbfe` or `easy_rhfe`, to simplify default transformation names.\n\n**Removed:**\n\n* openfe is no longer tested against macos-12. macos support is, for now, limited to osx-arm64 (macos-14+).\n\n**Fixed:**\n\n* ``openfe quickrun`` now creates the parent directory as-needed for user-defined output json paths (``-o``).\n* OpenMM CPU vacuum calculations now enforce the use of a single CPU to avoid large performance losses.\n\n\n\nv1.2.0\n====================\n\n**Added:**\n\n* New `cookbook featuring bespokefit <https://docs.openfree.energy/en/stable/cookbook/bespoke_parameters.html>`_\n\n**Fixed:**\n\n* Improved responsiveness of CLI calls\n* Fixed bug where `openfe gather --report raw` was only including first replicates.\n\n\n\nv1.1.0\n====================\n\n**Added:**\n\n* Extended system solvation tooling, including support for; non-cubic boxes,\n  explicitly defining the number of waters added, the box vectors, and box size\n  as supported by `Modeller.addSolvent` in OpenMM 8.0 and above.\n\n**Changed:**\n\n* Improved documentation of the OpenMMSolvationSettings.\n* The `PersesAtomMapper` now uses openff.units inline with the rest of the package.\n* Structural analysis data is no longer written to `structural_analysis.json`\n  but rather a 32bit numpy compressed file named `structural_analysis.npz`\n  (`PR #937 <https://github.com/OpenFreeEnergy/openfe/pull/937>`_).\n* Structural analysis array data is no longer directly returned in the\n  RelativeHybridTopologyProtocol result dictionary. Instead it should\n  be accessed from the serialized NPZ file `structural_analysis.npz`.\n  The `structural_analysis` key now contains a path to the NPZ file,\n  if the structural analysis did not fail (the `structural_analysis_error`\n  key will instead be present on failure) (`PR #937 <https://github.com/OpenFreeEnergy/openfe/pull/937>`_).\n* Add duecredit citations for pymbar when calling\n  `openfe.protocols.openmm_utils.multistate_analysis`.\n\n**Fixed:**\n\n* 2D RMSD plotting now allows for fewer than 5 states (`PR #896 <https://github.com/OpenFreeEnergy/openfe/pull/896>`_).\n* 2D RMSD plotting no longer draws empty axes when\n  the number of states - 1 is not divisible by 4 (`PR #896 <https://github.com/OpenFreeEnergy/openfe/pull/896>`_).\n* The RelativeHybridTopologyProtocol result unit is now much smaller,\n  due to the removal of structural analysis data (`PR #937 <https://github.com/OpenFreeEnergy/openfe/pull/937>`_).\n\n\n\nv1.0.1\n====================\n\n**Added:**\n\n* Debug script in devtools to test OpenMM installation.\n* Use rever to manage changelog.\n\n**Changed:**\n\n* Updated docs to reference miniforge instead of mambaforge since they are the same now, see https://github.com/conda-forge/miniforge?tab=readme-ov-file#whats-the-difference-between-mambaforge-and-miniforge.\n* The LomapAtomMapper defaults have now changed to better reflect real-life usage. Key kwarg changes include; `max3d=1.0` and `shift=False`.\n\n**Fixed:**\n\n* Calling `get_forward_and_reverse_energy_analysis` in the RFE and AFE protocols now results a warning if any results are ``None`` due to MBAR convergence issues.\n* Checkpoint interval default value has been set to 250 ps instead of 1 ps.\n  This better matches the previous default for openfe versions < 1.0rc\n  (See `issue #772 <https://github.com/OpenFreeEnergy/openfe/issues/772>`_ ).\n\n\n"
  },
  {
    "path": "docs/Makefile",
    "content": "# Minimal makefile for Sphinx documentation\n#\n\n# You can set these variables from the command line, and also\n# from the environment for the first two.\nSPHINXOPTS    ?= -v -W --keep-going\nSPHINXBUILD   ?= sphinx-build\nSOURCEDIR     = .\nBUILDDIR      = _build\n\n# Put it first so that \"make\" without argument is like \"make help\".\nhelp:\n\t@$(SPHINXBUILD) -M help \"$(SOURCEDIR)\" \"$(BUILDDIR)\" $(SPHINXOPTS) $(O)\n\n.PHONY: help Makefile\n\n# Catch-all target: route all unknown targets to Sphinx using the new\n# \"make mode\" option.  $(O) is meant as a shortcut for $(SPHINXOPTS).\n%: Makefile\n\t@$(SPHINXBUILD) -M $@ \"$(SOURCEDIR)\" \"$(BUILDDIR)\" $(SPHINXOPTS) $(O)\n"
  },
  {
    "path": "docs/_ext/sass.py",
    "content": "\"\"\"\nsphinxcontrib-sass\nhttps://github.com/attakei-lab/sphinxcontrib-sass\nKayuza Takei\nApache 2.0\n\nModified to:\n- Write directly to Sphinx output directory\n- Infer targets if not given\n- Ensure ``target: Path`` in ``configure_path()``\n- Return version number and thread safety from ``setup()``\n- Use compressed style by default\n- More complete type checking\n\"\"\"\n\nfrom os import PathLike\nfrom pathlib import Path\nfrom typing import Optional, Union\n\nimport sass\nfrom sphinx.application import Sphinx\nfrom sphinx.environment import BuildEnvironment\nfrom sphinx.util import logging\n\nlogger = logging.getLogger(__name__)\n\n\ndef configure_path(conf_dir: str, src: Optional[Union[PathLike, Path]]) -> Path:\n    if src is None:\n        target = Path(conf_dir)\n    else:\n        target = Path(src)\n    if not target.is_absolute():\n        target = Path(conf_dir) / target\n    return target\n\n\ndef get_targets(app: Sphinx) -> dict[Path, Path]:\n    src_dir = configure_path(app.confdir, app.config.sass_src_dir)\n    dst_dir = configure_path(app.outdir, app.config.sass_out_dir)\n\n    if isinstance(app.config.sass_targets, dict):\n        targets = app.config.sass_targets\n    else:\n        targets = {\n            path: path.relative_to(src_dir).with_suffix(\".css\")\n            for path in src_dir.glob(\"**/[!_]*.s[ca]ss\")\n        }\n\n    return {src_dir / src: dst_dir / dst for src, dst in targets.items()}\n\n\ndef build_sass_sources(app: Sphinx, env: BuildEnvironment):\n    logger.debug(\"Building stylesheet files\")\n    include_paths = [str(p) for p in app.config.sass_include_paths]\n    targets = get_targets(app)\n    output_style = app.config.sass_output_style\n    # Build css files\n    for src, dst in targets.items():\n        content = src.read_text()\n        css = sass.compile(\n            string=content,\n            output_style=output_style,\n            include_paths=[str(src.parent)] + include_paths,\n        )\n        dst.parent.mkdir(exist_ok=True, parents=True)\n        dst.write_text(css)\n\n\ndef setup(app: Sphinx):\n    \"\"\"\n    Setup function for this extension.\n    \"\"\"\n    logger.debug(f\"Using {__name__}\")\n    app.add_config_value(\"sass_include_paths\", [], \"html\")\n    app.add_config_value(\"sass_src_dir\", None, \"html\")\n    app.add_config_value(\"sass_out_dir\", None, \"html\")\n    app.add_config_value(\"sass_targets\", None, \"html\")\n    app.add_config_value(\"sass_output_style\", \"compressed\", \"html\")\n    app.connect(\"env-updated\", build_sass_sources)\n\n    return {\n        \"version\": \"0.3.4ofe\",\n        \"parallel_read_safe\": True,\n        \"parallel_write_safe\": True,\n    }\n"
  },
  {
    "path": "docs/_sass/deflist-flowchart.scss",
    "content": ":root {\n    --arrow-thickness: 4px;\n    --arrow-head-size: 7px;\n    --arrow-length: 2em;\n    --arrow-multiple-gap: 20px;\n    --arrow-color: var(--pst-color-text-muted);\n    --arrow-fade-dist: 0px;\n    --flowchart-def-bg-color: var(--pst-color-surface);\n    --flowchart-bg-color: var(--pst-color-background);\n    --flowchart-def-border-color: var(--pst-color-border);\n    --flowchart-unit-width: 45px;\n    --flowchart-spacing: 0.5rem;\n    --flowchart-column-gap: calc(1.5 * var(--flowchart-spacing));\n    --flowchart-top-label-space: 26px;\n}\n.arrow.thick {\n    --arrow-thickness: 6px;\n    --arrow-head-size: 10px;\n}\n\n.deflist-flowchart ul,\nul.deflist-flowchart {\n  display: flex;\n  flex-direction: column;\n  justify-content: space-between;\n  height: 100%;\n  grid-column-gap: var(--flowchart-column-gap);\n  margin: 0;\n  padding: 0;\n}\n\n.deflist-flowchart {\n  margin: 1em 0;\n\n  p:first-child {\n    margin-top: 0;\n  }\n\n  p:last-child {\n    margin-bottom: 0;\n  }\n\n  li,\n  li ul\n  {\n    margin: 0;\n    padding: 0;\n  }\n\n  li:empty:not([class])\n  {\n    display: None;\n  }\n\n  li {\n    list-style: none;\n  }\n\n  .arrow-down::after,\n  .arrow-up::after,\n  .arrow-multiple.arrow-down::before,\n  .arrow-multiple.arrow-up::before,\n  .arrow-cycle::after,\n  .arrow-cycle::before {\n    content: \"\";\n  }\n\n  .arrow-down,\n  .arrow-up,\n  .arrow-cycle\n  {\n    --arrow-head-size-clamped: calc(min(var(--arrow-head-size), var(--arrow-length) / 2));\n\n    display: flex;\n    justify-content: center;\n    align-items: center;\n    flex-grow: 1;\n    min-height: var(--arrow-length);\n    width: 100%;\n    margin: calc(2 * var(--flowchart-spacing)) auto;\n    position: relative;\n    z-index: 1;\n    padding: calc(var(--arrow-length) / 4) 0;\n\n    &::before, &::after {\n      --actual-arrow-length: max(var(--arrow-length), 100%);\n      --arrow-tail-gradient:\n        linear-gradient(\n          45deg,\n          transparent calc(50% - var(--arrow-thickness)/2),\n          var(--arrow-color) calc(50% - var(--arrow-thickness)/2),\n          var(--arrow-color) calc(50% + var(--arrow-thickness)/2),\n          transparent calc(50% + var(--arrow-thickness)/2)\n        );\n      --arrow-head-gradient:\n        linear-gradient(\n          -45deg,\n          var(--arrow-color) var(--arrow-head-size-clamped),\n          transparent var(--arrow-head-size-clamped)\n        );\n      height: calc(var(--actual-arrow-length)/1.4142);\n      width: auto;\n      aspect-ratio: 1;\n      padding: 0;\n      display: inline-block;\n      transform: rotate(45deg);\n      background-image:\n        var(--arrow-tail-gradient),\n        var(--arrow-head-gradient);\n      position: absolute;\n      top: 0;\n      left: 50%;\n      transform-origin: 0 0;\n      z-index: -1;\n    }\n\n    &.arrow-tail {\n      &::before, &::after {\n        background-image:\n          var(--arrow-tail-gradient);\n      }\n    }\n\n    > p {\n      background: linear-gradient(\n        transparent,\n        var(--flowchart-bg-color) var(--arrow-fade-dist),\n        var(--flowchart-bg-color) calc(100% - var(--arrow-fade-dist)),\n        transparent,\n      );\n      line-height: 1.5;\n      z-index: 10;\n    }\n  }\n\n  .arrow-down:not(.arrow-tail),\n  .arrow-cycle {\n    padding-bottom: calc(var(--arrow-head-size-clamped) + var(--arrow-length) / 4);\n  }\n\n  .arrow-up:not(.arrow-tail),\n  .arrow-cycle {\n    padding-top: calc(var(--arrow-head-size-clamped) + var(--arrow-length) / 4);\n  }\n\n  .arrow-cycle, .arrow-multiple {\n    &::after {\n      translate: calc(0.5 * var(--arrow-multiple-gap)) 0;\n    }\n    &::before {\n      translate: calc(-0.5 * var(--arrow-multiple-gap)) 0;\n    }\n  }\n\n  .arrow-up::after,\n  .arrow-multiple.arrow-up::before,\n  .arrow-cycle::before\n  {\n    transform: rotate(-135deg);\n    translate: 0 calc(var(--actual-arrow-length) + 2 * var(--flowchart-spacing) + var(--arrow-head-size-clamped) / 2);\n  }\n\n  .arrow-cycle::before {\n    translate:\n      calc(-0.5 * var(--arrow-multiple-gap))\n      140%;\n  }\n\n  .arrow-aside {\n    margin-left: calc(8 * var(--arrow-head-size-clamped));\n    &::after {\n      left: calc(-4 * var(--arrow-head-size-clamped));\n    }\n  }\n\n  .arrow-multiple-combine {\n    &::before {\n      content: \"\";\n      width: var(--arrow-multiple-gap);\n      border: var(--arrow-thickness) solid var(--arrow-color);\n      height: calc(var(--arrow-length) / 2);\n      background: var(--flowchart-bg-color);\n      transform: none;\n      left: auto;\n      z-index: 2;\n    }\n\n    &.arrow-down {\n      padding-top: calc(0.75 * var(--arrow-length) - var(--arrow-head-size-clamped) / 2);\n      padding-bottom: calc(0.5 * var(--arrow-head-size-clamped) + 0.25 * var(--arrow-length));\n      &::before {\n        border-top: 1px solid var(--flowchart-bg-color);\n      }\n    }\n\n    &.arrow-up {\n      &::before {\n        border-bottom: 1px solid var(--flowchart-bg-color);\n        top: auto;\n        bottom: -1px;\n      }\n    }\n  }\n\n  .arrow-tail {\n    &.arrow-down {\n      margin-bottom: 0;\n    }\n    &.arrow-up {\n      margin-top: 0;\n    }\n  }\n\n  .arrow-head {\n    &.arrow-up {\n      margin-bottom: 0;\n    }\n    &.arrow-down {\n      margin-top: 0;\n    }\n  }\n\n  .arrow-combine, .arrow-combine-left, .arrow-combine-right {\n    &.arrow-down.arrow-tail, &.arrow-up.arrow-head {\n      --arrow-combine-gradient-angle: 0deg;\n      padding-bottom: calc(0.5 * var(--arrow-thickness));\n      margin-bottom: calc(-0.5 * var(--arrow-thickness));\n    }\n    &.arrow-up.arrow-tail, &.arrow-down.arrow-head {\n      --arrow-combine-gradient-angle: 180deg;\n      padding-top: calc(0.5 * var(--arrow-thickness));\n      margin-top: calc(-0.5 * var(--arrow-thickness));\n    }\n    background-image:\n      linear-gradient(\n        var(--arrow-combine-gradient-angle),\n        var(--arrow-color) var(--arrow-thickness),\n        transparent var(--arrow-thickness)\n      );\n    background-repeat: no-repeat;\n\n    width: calc(max(100% + 2 * var(--flowchart-column-gap), var(--flowchart-unit-width)));\n    margin-left: calc(-1 * var(--flowchart-column-gap));\n\n    &.arrow-combine-left, &.arrow-combine-right {\n      background-size: 50%;\n\n      &.arrow-multiple {\n        background-size: calc(50% + 0.5 * var(--arrow-multiple-gap));\n      }\n    }\n\n    &.arrow-combine-right {\n      background-position-x: 100%;\n    }\n  }\n\n  > ul > li {\n    &.arrow-down,\n    &.arrow-up,\n    &.arrow-cycle {\n      width: calc(100% - var(--flowchart-top-label-space));\n      margin-left: 0;\n    }\n  }\n  \n  dl {\n    display: flex;\n    flex-direction: row-reverse;\n    margin: 0;\n    padding: 0 var(--flowchart-spacing);\n  }\n  dt {\n    display: inline-block;\n    writing-mode: vertical-rl;\n    margin-top: .25rem;\n    flex-grow: 0;\n    width: var(--flowchart-top-label-space);\n    font-size: 1.1em;\n  }\n  dd {\n    text-align: center;\n    position: relative;\n    border: 1px solid var(--flowchart-def-border-color);\n    border-radius: .25rem;\n    margin: 0;\n    display: inline-block;\n    flex-grow: 1;\n    container-type: inline-size;\n    container-name: flowchart;\n    overflow-x: auto;\n  }\n\n  dd dl {\n    background-color: var(--flowchart-def-bg-color);\n    border-radius: 4px;\n    box-shadow: 0 6px 10px 0 rgba(0,0,0,0.14),\n                0 1px 18px 0 rgba(0,0,0,0.12),\n                0 3px 5px -1px rgba(0,0,0,0.4);\n    display: block;\n    margin: 0 auto;\n    padding: calc(var(--flowchart-spacing) / 2);\n    max-width: calc(100cqw - 2 * var(--flowchart-spacing));\n    min-width: calc(2 * var(--flowchart-unit-width) + var(--flowchart-column-gap));\n  }\n  dd dt {\n    writing-mode: horizontal-tb;\n    display: block;\n    margin-top: 0;\n    width: unset;\n    font-size: unset;\n  }\n  dd dd {\n    border: none;\n    display: block;\n    container-type: unset;\n    overflow-x: unset;\n    padding: calc(var(--flowchart-spacing) / 2);\n  }\n\n  dd > ul {\n    width: fit-content;\n    padding: var(--flowchart-spacing);\n    margin: 0 auto;\n    overflow: hidden;\n  }\n\n  dd dd > ul {\n    min-width: unset;\n    padding: 0;\n    margin: 0;\n  }\n\n  dl a, a {\n    font-weight: bold;\n  }\n\n  div.flowchart-sidebyside > ul:only-child {\n    display: flex;\n    flex-direction: row;\n    flex-wrap: nowrap;\n    justify-content: space-between;\n  }\n\n  .flowchart-spacer {\n    height: 100%;\n    flex-shrink: 9999;\n    min-height: calc(2 * var(--flowchart-spacing))\n  }\n\n  .width-1 {\n    width: calc(var(--flowchart-unit-width));\n  }\n  .width-2 {\n    width: calc(2 * var(--flowchart-unit-width) + var(--flowchart-column-gap));\n  }\n  .width-3 {\n    width: calc(3 * var(--flowchart-unit-width) + 2 * var(--flowchart-column-gap));\n  }\n  .width-4 {\n    width: calc(4 * var(--flowchart-unit-width) + 3 * var(--flowchart-column-gap));\n  }\n  .width-5 {\n    width: calc(5 * var(--flowchart-unit-width) + 4 * var(--flowchart-column-gap));\n  }\n  .width-6 {\n    width: calc(6 * var(--flowchart-unit-width) + 5 * var(--flowchart-column-gap));\n  }\n  .width-7 {\n    width: calc(7 * var(--flowchart-unit-width) + 6 * var(--flowchart-column-gap));\n  }\n  .width-8 {\n    width: calc(8 * var(--flowchart-unit-width) + 7 * var(--flowchart-column-gap));\n  }\n  .width-9 {\n    width: calc(9 * var(--flowchart-unit-width) + 8 * var(--flowchart-column-gap));\n  }\n  .width-10 {\n    width: calc(10 * var(--flowchart-unit-width) + 9 * var(--flowchart-column-gap));\n  }\n  li {\n    &.width-2,\n    &.width-3,\n    &.width-4,\n    &.width-5,\n    &.width-6,\n    &.width-7,\n    &.width-8,\n    &.width-9,\n    &.width-10,\n    &.width-full {\n      > dl {\n        max-width: unset;\n      }\n    }\n  }\n}"
  },
  {
    "path": "docs/_templates/autosummary/base.rst",
    "content": ".. title:: {{ objname }}\n\n.. currentmodule:: {{ module }}\n\n.. auto{{ objtype }}:: {{ objname }}\n"
  },
  {
    "path": "docs/_templates/autosummary/class.rst",
    "content": ".. title:: {{ objname }}\n\n.. currentmodule:: {{ module }}\n\n.. auto{{ objtype }}:: {{ objname }}\n"
  },
  {
    "path": "docs/conf.py",
    "content": "# Configuration file for the Sphinx documentation builder.\n#\n# This file only contains a selection of the most common options. For a full\n# list see the documentation:\n# https://www.sphinx-doc.org/en/master/usage/configuration.html\n\n# -- Path setup --------------------------------------------------------------\n\n# If extensions (or modules to document with autodoc) are in another directory,\n# add these directories to sys.path here. If the directory is relative to the\n# documentation root, use os.path.abspath to make it absolute, like shown here.\n#\nimport os\nimport sys\nfrom importlib.metadata import version\nfrom inspect import cleandoc\nfrom pathlib import Path\n\nimport git\nimport nbformat\nimport nbsphinx\nfrom packaging.version import parse\n\nsys.path.insert(0, os.path.abspath(\"../\"))\n\n\nos.environ[\"SPHINX\"] = \"True\"\n\n# -- Project information -----------------------------------------------------\n\nproject = \"OpenFE\"\ncopyright = \"2022, The OpenFE Development Team\"\nauthor = \"The OpenFE Development Team\"\n# don't include patch version (https://github.com/OpenFreeEnergy/openfe/issues/1261)\nversion = f\"{parse(version('openfe')).major}.{parse(version('openfe')).minor}\"\n\n# -- General configuration ---------------------------------------------------\n\n# Add any Sphinx extension module names here, as strings. They can be\n# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom\n# ones.\nextensions = [\n    \"sphinx.ext.autodoc\",\n    \"sphinx.ext.napoleon\",\n    \"sphinx_click.ext\",\n    \"sphinxcontrib.autodoc_pydantic\",\n    \"sphinx_toolbox.collapse\",\n    \"sphinx.ext.autosectionlabel\",\n    \"sphinx_design\",\n    \"sphinx.ext.intersphinx\",\n    \"sphinx.ext.autosummary\",\n    \"docs._ext.sass\",\n    \"myst_parser\",\n    \"nbsphinx\",\n    \"nbsphinx_link\",\n    \"sphinx.ext.mathjax\",\n]\nsuppress_warnings = [\"config.cache\"]  # https://github.com/sphinx-doc/sphinx/issues/12300\n\nintersphinx_mapping = {\n    \"python\": (\"https://docs.python.org/3.9\", None),\n    \"numpy\": (\"https://numpy.org/doc/stable\", None),\n    \"scikit.learn\": (\"https://scikit-learn.org/stable\", None),\n    \"openmm\": (\"https://docs.openmm.org/latest/api-python/\", None),\n    \"rdkit\": (\"https://www.rdkit.org/docs\", None),\n    \"openeye\": (\"https://docs.eyesopen.com/toolkits/python/\", None),\n    \"mdtraj\": (\"https://www.mdtraj.org/1.9.5/\", None),\n    \"openff.units\": (\"https://docs.openforcefield.org/projects/units/en/stable\", None),\n    \"gufe\": (\"https://gufe.openfree.energy/en/latest/\", None),\n}\n\nautoclass_content = \"both\"\n# Make sure labels are unique\n# https://www.sphinx-doc.org/en/master/usage/extensions/autosectionlabel.html#confval-autosectionlabel_prefix_document\nautosectionlabel_prefix_document = True\n\nautodoc_pydantic_model_show_json = False\n\nautodoc_default_options = {\n    \"members\": True,\n    \"member-order\": \"bysource\",\n    \"inherited-members\": \"GufeTokenizable,BaseModel\",\n    \"undoc-members\": True,\n    \"special-members\": \"__call__\",\n}\ntoc_object_entries_show_parents = \"hide\"\n\n# Add any paths that contain templates here, relative to this directory.\ntemplates_path = [\"_templates\"]\n\n# List of patterns, relative to source directory, that match files and\n# directories to ignore when looking for source files.\n# This pattern also affects html_static_path and html_extra_path.\nexclude_patterns = [\n    \"_build\",\n    \"**/Thumbs.db\",\n    \"**/.DS_Store\",\n    \"_ext\",\n    \"_sass\",\n    \"**/README.md\",\n    \"ExampleNotebooks\",\n]\n\nautodoc_mock_imports = [\n    \"cinnabar\",\n    \"dill\",\n    \"MDAnalysis\",\n    \"matplotlib\",\n    \"mdtraj\",\n    \"openfe_analysis\",\n    \"openmmforcefields\",\n    \"openmmtools\",\n    \"pymbar\",\n    \"openff.interchange\",\n    \"openmmforcefields\",\n    \"psutil\",\n    \"py3Dmol\",\n    \"zstandard\",\n]\n\n# Extensions for the myst parser\nmyst_enable_extensions = [\n    \"dollarmath\",\n    \"colon_fence\",\n    \"smartquotes\",\n    \"replacements\",\n    \"deflist\",\n    \"attrs_inline\",\n]\nmyst_heading_anchors = 3\n\n# -- Options for HTML output -------------------------------------------------\n\n# The theme to use for HTML and HTML Help pages.  See the documentation for\n# a list of builtin themes.\n#\nhtml_theme = \"ofe_sphinx_theme\"\nhtml_theme_options = {\n    \"logo\": {\"text\": \"OpenFE docs\"},\n    \"icon_links\": [\n        {\n            \"name\": \"GitHub\",\n            \"url\": \"https://github.com/OpenFreeEnergy/openfe\",\n            \"icon\": \"fa-brands fa-square-github\",\n            \"type\": \"fontawesome\",\n        }\n    ],\n    \"accent_color\": \"cantina-purple\",\n    \"navigation_with_keys\": False,\n}\nhtml_logo = \"_static/OFE-color-icon.svg\"\nhtml_favicon = \"_static/OFE-color-icon.svg\"\n# temporary fix, see https://github.com/pydata/pydata-sphinx-theme/issues/1662\nhtml_sidebars = {\n    \"installation\": [],\n    \"CHANGELOG\": [],\n}\n# Add any paths that contain custom static files (such as style sheets) here,\n# relative to this directory. They are copied after the builtin static files,\n# so a file named \"default.css\" will overwrite the builtin \"default.css\".\n# html_static_path = ['_static']\n\n\n# replace macros\nrst_prolog = \"\"\"\n.. |rdkit.mol| replace:: :class:`rdkit.Chem.rdchem.Mol`\n\"\"\"\n\n# Add any paths that contain custom static files (such as style sheets) here,\n# relative to this directory. They are copied after the builtin static files,\n# so a file named \"default.css\" will overwrite the builtin \"default.css\".\nhtml_static_path = [\"_static\"]\nhtml_css_files = [\n    \"css/custom.css\",\n    \"css/custom-api.css\",\n    \"css/deflist-flowchart.css\",\n]\n\n# custom-api.css is compiled from custom-api.scss\nsass_src_dir = \"_sass\"\nsass_out_dir = \"_static/css\"\n\n# Clone or update ExampleNotebooks\nexample_notebooks_path = Path(\"ExampleNotebooks\")\ntry:\n    if example_notebooks_path.exists():\n        repo = git.Repo(example_notebooks_path)\n        try:\n            repo.remote(\"origin\").pull()\n        except git.exc.GitCommandError:\n            # cannot pull if on a tag\n            pass\n    else:\n        repo = git.Repo.clone_from(\n            \"https://github.com/OpenFreeEnergy/ExampleNotebooks.git\",\n            branch=\"2026.04.28\",\n            to_path=example_notebooks_path,\n        )\nexcept Exception as e:\n    from sphinx.util.logging import getLogger\n\n    filename = e.__traceback__.tb_frame.f_code.co_filename\n    lineno = e.__traceback__.tb_lineno\n    getLogger(\"sphinx.ext.openfe_git\").warning(\n        f\"Getting ExampleNotebooks failed in {filename} line {lineno}: {e}\"\n    )\n\n\n# First, create links at top of notebook pages\n# All notebooks are in ExampleNotebooks repo, so link to that\n# Finally, add sphinx reference anchor in prolog so that we can make refs\nnbsphinx_prolog = cleandoc(r\"\"\"\n    {%- set gh_repo = \"OpenFreeEnergy/ExampleNotebooks\" -%}\n    {%- set gh_branch = \"main\" -%}\n    {%- set path = env.doc2path(env.docname, base=None) -%}\n    {%- if path.endswith(\".nblink\") -%}\n        {%- set path = env.metadata[env.docname][\"nbsphinx-link-target\"] -%}\n    {%- endif -%}\n    {%- if path.startswith(\"ExampleNotebooks/\") -%}\n        {%- set path = path.replace(\"ExampleNotebooks/\", \"\", 1) -%}\n    {%- endif -%}\n    {%- set gh_url =\n        \"https://www.github.com/\"\n        ~ gh_repo\n        ~ \"/blob/\"\n        ~ gh_branch\n        ~ \"/\"\n        ~ path\n    -%}\n    {%- set dl_url =\n        \"https://raw.githubusercontent.com/\"\n        ~ gh_repo\n        ~ \"/\"\n        ~ gh_branch\n        ~ \"/\"\n        ~ path\n    -%}\n\n    .. container:: ofe-top-of-notebook\n\n        .. button-link:: {{gh_url}}\n            :color: primary\n            :shadow:\n            :outline:\n\n            :octicon:`mark-github` View on GitHub\n\n        .. button-link:: {{dl_url}}\n            :color: primary\n            :shadow:\n            :outline:\n\n            :octicon:`download` Download Notebook\n\n    .. _{{ env.doc2path(env.docname, base=None) }}:\n\"\"\")\n"
  },
  {
    "path": "docs/cookbook/bespoke_parameters.nblink",
    "content": "{\n   \"path\": \"../ExampleNotebooks/cookbook/bespoke_parameters_showcase.ipynb\"\n}"
  },
  {
    "path": "docs/cookbook/choose_protocol.nblink",
    "content": "{\n   \"path\": \"../ExampleNotebooks/cookbook/choose_protocol.ipynb\"\n}\n"
  },
  {
    "path": "docs/cookbook/create_alchemical_network.nblink",
    "content": "{\n   \"path\": \"../ExampleNotebooks/cookbook/create_alchemical_network.ipynb\"\n}\n"
  },
  {
    "path": "docs/cookbook/dumping_transformation.rst",
    "content": ".. _dumping_transformations:\n\nDumping a ``Transformation`` to JSON\n====================================\n\nIf you're trying to run a full campaign of simulations representing an\nalchemical network, we generally recommend saving objects using our storage\ntools, when avoids saving duplicate information to disk.\n\n.. TODO: add links to storage tools once they're complete\n\nHowever, there are situations where it is reasonable to serialize a single\n:class:`.Transformation`. For example, this can be useful when trying to\ncompare results run on different machines. This also provides a trivial way\nfor a user to run edges in parallel, if they don't want to use the more\nsophisticated techniques we have developed.\n\nFor these cases, we have made it very easy for a user to dump a\ntransformation to JSON. Simply use the method\n:meth:`.Transformation.to_json`. For example:\n\n.. code::\n\n    transformation.to_json(\"mytransformation.json\")\n\nWhen you do dump a single transformation, it can be reloaded into memory\nwith the :meth:`.Transformation.from_json` method:\n\n.. code::\n\n    transformation = Transformation.from_json(\"mytransformation.json\")\n\nOnce you've saved to it JSON, you can also run this transformation with the\n``openfe`` command line tool's :ref:`cli_quickrun`, e.g.:\n\n.. code:: bash\n\n    $ openfe quickrun mytransformation.json -d dir_for_files -o output.json\n"
  },
  {
    "path": "docs/cookbook/generate_ligand_network.nblink",
    "content": "{\n   \"path\": \"../ExampleNotebooks/cookbook/generate_ligand_network.ipynb\"\n}\n"
  },
  {
    "path": "docs/cookbook/hand_write_ligand_network.nblink",
    "content": "{\n   \"path\": \"../ExampleNotebooks/cookbook/hand_write_ligand_network.ipynb\"\n}\n"
  },
  {
    "path": "docs/cookbook/index.rst",
    "content": ".. _cookbooks:\n\nCookbook\n========\n\nThis section describes common tasks involving the OpenFE Python API.\n\nThe :any:`OpenFE CLI<cli-reference>` provides a simple way to perform the most common procedures for free energy calculations, but does not provide much flexibility for fine-tuning your approach or combining OpenFE with other tools. The :any:`Python API<api>` allows that flexibility, but using it is more complex. This cookbook breaks down common steps that would be implemented in Python to help navigate that complexity.\n\n.. note:: This section is a work-in-progress.\n\n.. module:: openfe\n    :noindex:\n\nThe Basic Workflow\n------------------\n\nThe typical way to use the Python API is to load a number of molecules you want to calculate free energies of, construct a :class:`LigandNetwork` connecting them in an efficient way, and then combine that with information for how each ligand should be simulated to construct an :class:`AlchemicalNetwork`, which specifies the entire simulation campaign. This provides a lot of flexibility in how molecules are specified, mapped, connected, and simulated, without exposing a great deal of complexity. OpenFE recommends this workflow for most users.\n\n.. container:: deflist-flowchart\n\n    * Setup\n        - .. container:: flowchart-sidebyside\n\n            -   -\n                    .. rst-class:: flowchart-spacer\n                -\n\n                    .. rst-class:: arrow-down arrow-from-nothing\n                - :any:`choose_protocol`\n\n                - :class:`Protocol`\n                    Simulation procedure for an alchemic mutation.\n\n                    .. rst-class:: arrow-down arrow-tail arrow-combine-right\n                -\n\n            -   -\n                    .. rst-class:: width-8\n                -  Chemical component definition\n                    SDF, PDB, RDKit, OpenFF Molecule, solvent spec, etc.\n\n                - .. container:: flowchart-sidebyside\n\n                    - .. rst-class:: width-3\n\n                        -\n\n                            .. rst-class:: arrow-down arrow-multiple\n                        - :any:`Loading proteins`, :any:`Defining solvents`\n\n                        - :class:`SolventComponent` and :class:`ProteinComponent`\n                            Other chemical components needed to simulate the ligand.\n\n                            .. rst-class:: arrow-down arrow-multiple arrow-tail arrow-combine\n                        -\n\n                    -   - .. container:: flowchart-sidebyside\n\n                            - .. rst-class:: width-5\n\n                                -\n                                    .. rst-class:: arrow-down arrow-multiple\n                                - :any:`Loading small molecules`\n\n\n                                - :class:`SmallMoleculeComponent`\n                                    The ligands that will be mutated.\n\n                            - .. rst-class:: width-3\n\n                                -\n                                    .. rst-class:: flowchart-spacer\n                                -\n\n                                - Orion/FEP+\n                                    Network from another tool.\n\n\n                        - .. container:: flowchart-sidebyside\n\n                            - .. rst-class:: width-2\n\n                                -\n                                    .. rst-class:: arrow-down arrow-multiple\n                                - :any:`generate_ligand_network`\n\n                            - .. rst-class:: width-2\n\n                                -\n                                    .. rst-class:: arrow-down arrow-multiple\n                                - :any:`hand_write_ligand_network`\n\n                            - .. rst-class:: width-1\n\n                                -\n                                    .. rst-class:: arrow-down arrow-tail arrow-multiple arrow-combine-right\n                                -\n\n                                    .. rst-class:: flowchart-spacer\n                                -\n\n                            - .. rst-class:: width-3\n\n                                -\n                                    .. rst-class:: arrow-down arrow-tail arrow-combine-left\n                                -\n\n                                    .. rst-class:: arrow-down arrow-head flowchart-spacer\n                                - :any:`network_from_orion_fepp`\n\n                        - :class:`LigandNetwork <openfe.setup.LigandNetwork>`\n                            A network of ligand transformations.\n\n                        - .. container:: flowchart-sidebyside\n\n                            -   -\n                                    .. rst-class:: arrow-down arrow-tail arrow-combine-left width-4\n                                -\n\n                            -   -\n                                    .. rst-class:: arrow-cycle width-4\n                                -\n\n                                - :any:`ligandnetwork_vis`\n\n\n            .. rst-class:: arrow-down arrow-head\n        - :any:`create_alchemical_network`\n\n        - :class:`AlchemicalNetwork`\n            A complete simulation campaign.\n\n      .. rst-class:: arrow-down\n    * :any:`dumping_transformations`\n\n    * Run\n        - :any:`openfe quickrun <cli_quickrun>`\n            OpenFE recommends using the ``openfe quickrun`` CLI command to execute a transformation.\n\n      .. rst-class:: arrow-down\n    *\n\n    * Gather\n        - :any:`openfe gather <cli_gather>`\n            OpenFE recommends using the ``openfe gather`` CLI command to collect the results of a transformation.\n\nList of Cookbooks\n-----------------\n\n.. toctree::\n    :maxdepth: 1\n\n    loading_molecules\n    dumping_transformation\n    jq_inspection\n    choose_protocol\n    generate_ligand_network\n    rfe_alchemical_planners\n    network_from_orion_fepp\n    hand_write_ligand_network\n    ligandnetwork_vis\n    create_alchemical_network\n    user_charges\n    bespoke_parameters\n\n    \n"
  },
  {
    "path": "docs/cookbook/jq_inspection.rst",
    "content": ".. _jq_inspection:\n\nUsing ``jq`` to inspect OpenFE JSONs\n==============================================\nSometimes you may want to get a sense of the contents of JSON files, but the files are too unwieldy to inspect one-by-one in a code editor.\n\n`jq <https://github.com/jqlang/jq>`_ is a helpful command-line tool that we recommend for for quickly inspecting JSON files.\n\nBelow is a common use-case to get you started, but you can do much more by checking out the `jq manual <https://jqlang.org/manual/>`_.\n\nTo view all the top-level JSON keys, use ``jq \"keys\" filename.json``, for example with a results JSON from the tutorial:\n\n.. code:: bash\n\n    $ jq \"keys\" rbfe_lig_ejm_46_solvent_lig_jmc_28_solvent.json\n    [\n    \"estimate\",\n    \"protocol_result\",\n    \"uncertainty\",\n    \"unit_results\"\n    ]\n\n.. note::\n\n    You can use ``\"keys[]\"`` instead of ``\"keys\"`` for a cleaner output.\n\nNow that you know ``estimate`` is at the top-level of the JSON, you can use the following pattern to see the next level of keys:\n\n.. code:: bash\n\n    $ jq \".estimate | keys \" rbfe_lig_ejm_46_solvent_lig_jmc_28_solvent.json\n    {\n    \"magnitude\",\n    \"unit\":,\n    \":is_custom:\":,\n    \"pint_unit_registry\":\n    }\n\n\nIf you want to show all the keys _and_ their values, simply omit ``| key`` from the query:\n\n.. code:: bash\n\n    $ jq \".estimate\" rbfe_lig_ejm_46_solvent_lig_jmc_28_solvent.json\n    {\n    \"magnitude\": 23.347074789078682,\n    \"unit\": \"kilocalorie / mole\",\n    \":is_custom:\": true,\n    \"pint_unit_registry\": \"openff_units\"\n    }\n\n\nThis can be very helpful for quickly checking results for many files, for example:\n\n.. code:: bash\n\n    $ jq \".estimate.magnitude\" rbfe*.json\n    -14.925911852820793\n    -40.72063957254803\n    -27.76541486479537\n    -16.023754604070007\n    -57.38608716292447\n    -15.748326155729705\n    -39.933880531487326\n    -27.780933075807425\n    -16.76023951588401\n    -58.36294851896545\n    -19.038006312251575\n    -20.26856586311034\n    17.338257573349775\n    15.775784163095102\n    23.134622420900932\n    17.071712542470248\n    15.873122071409249\n    23.347074789078682\n"
  },
  {
    "path": "docs/cookbook/ligandnetwork_vis.nblink",
    "content": "{\n   \"path\": \"../ExampleNotebooks/cookbook/ligandnetwork_vis.ipynb\"\n}\n"
  },
  {
    "path": "docs/cookbook/loading_molecules.nblink",
    "content": "{\n   \"path\": \"../ExampleNotebooks/cookbook/loading_molecules.ipynb\"\n}\n"
  },
  {
    "path": "docs/cookbook/network_from_orion_fepp.nblink",
    "content": "{\n   \"path\": \"../ExampleNotebooks/cookbook/network_from_orion_fepp.ipynb\"\n}\n"
  },
  {
    "path": "docs/cookbook/rfe_alchemical_planners.nblink",
    "content": "{\n   \"path\": \"../ExampleNotebooks/cookbook/rfe_alchemical_planners.ipynb\"\n}\n"
  },
  {
    "path": "docs/cookbook/user_charges.nblink",
    "content": "{\n   \"path\": \"../ExampleNotebooks/cookbook/user_charges.ipynb\"\n}\n"
  },
  {
    "path": "docs/environment.yaml",
    "content": "name: openfe-docs\nchannels:\n- https://conda.anaconda.org/conda-forge\n\n# explicit pins to speed up build:\ndependencies:\n- autodoc-pydantic >= 2.1\n- docutils == 0.20\n- gitpython\n- libsass\n- myst-parser\n- nbsphinx\n- nbsphinx-link\n- openff-toolkit-base == 0.17.0\n- openff-units == 0.3.1\n- openmm == 8.3.1\n- packaging\n- pip\n- plugcli >= 0.2.1\n- python\n- pydantic >=2.0.0, <2.12.0  # https://github.com/openforcefield/openff-interchange/issues/1346\n- sphinx ==7.2.6 # TODO: debug \"duplicate object\" warning with later versions\n- sphinx-click\n- sphinx-design\n- sphinx-toolbox\n- threadpoolctl\n- tqdm\n- pip:\n  - git+https://github.com/OpenFreeEnergy/gufe@main\n  - git+https://github.com/OpenFreeEnergy/ofe-sphinx-theme@v0.3.1\n  # pip install these so that we can make sure docs build on main while these packages' docs are under development\n  - git+https://github.com/OpenFreeEnergy/kartograf@main\n  - git+https://github.com/OpenFreeEnergy/konnektor@main\n  - git+https://github.com/OpenFreeEnergy/lomap@main\n\n# These are added automatically by RTD, so we include them here\n# for a consistent environment.\n- mock\n- pillow\n# - sphinx\n# - sphinx_rtd_theme\n"
  },
  {
    "path": "docs/guide/cli/cli_basics.rst",
    "content": "CLI basics\n==========\n\nThe ``openfe`` command consists of several subcommands. This is similar to\ntools like ``gmx``, which has subcommands like ``gmx mdrun``, or ``conda``,\nwhich has subcommands like ``conda install``.\n\nTo get a list of the subcommands and their descriptions, call ``openfe`` (or\n``openfe -h``):\n\n.. TODO autogenerate using sphinxcontrib-programoutput\n\n.. code:: none\n\n    Usage: openfe [OPTIONS] COMMAND [ARGS]...\n\n      This is the command line tool to provide easy access to functionality from\n      the OpenFE Python library.\n\n    Options:\n      --version   Show the version and exit.\n      --log PATH  logging configuration file\n      -h, --help  Show this message and exit.\n\n    Network Planning Commands:\n      plan-rhfe-network    Plan a relative hydration free energy network, saved as\n                          JSON files for the quickrun command.\n      plan-rbfe-network    Plan a relative binding free energy network, saved as\n                          JSON files for the quickrun command.\n      view-ligand-network  Visualize a ligand network\n\n    Quickrun Executor Commands:\n      gather    Gather result jsons for network of RFE results into a TSV file\n      quickrun  Run a given transformation, saved as a JSON file\n\n    Miscellaneous Commands:\n      fetch             Fetch tutorial or other resource.\n      charge-molecules  Generate partial charges for a set of molecules.\n      test              Run the OpenFE test suite\n\nThe ``--log`` option takes a logging configuration file and sets that\nlogging behavior. If you use it, it must come before the subcommand name.\n\nYou can find out more about each subcommand by putting ``--help`` *after*\nthe subcommand name, e.g., ``openfe quickrun --help``, which returns\n\n.. code:: none\n\n    Usage: openfe quickrun [OPTIONS] TRANSFORMATION\n\n      Run the transformation (edge) in the given JSON file.\n\n      Simulation JSON files can be created with the :ref:`cli_plan-rbfe-network`\n      or from Python a :class:`.Transformation` can be saved using its to_json\n      method::\n\n          transformation.to_json(\"filename.json\")\n\n      That will save a JSON file suitable to be input for this command.\n\n      Running this command will execute the simulation defined in the JSON file,\n      creating a directory for each individual task (``Unit``) in the workflow.\n      For example, when running the OpenMM HREX Protocol a directory will be\n      created for each repeat of the sampling process (by default 3).\n\n    Options:\n      -d, --work-dir DIRECTORY  Directory in which to store files in (defaults to\n                                current directory). If the directory does not\n                                exist, it will be created at runtime.\n      -o PATH                   Filepath at which to create and write the JSON-\n                                formatted results.\n      --resume                  Attempt to resume this transformation's execution\n                                using the cache.\n      -h, --help                Show this message and exit.\n\nFor more details on various commands, see the :ref:`cli-reference`.\n"
  },
  {
    "path": "docs/guide/cli/cli_yaml.rst",
    "content": ".. _userguide_cli_yaml_interface:\n\nCustomising CLI planning with YAML settings\n===========================================\n\nThe planning commands in the CLI can be made more powerful by supplying\nYAML-formatted files to customise the planning algorithms.\n\nThis settings file has a series of sections for customising the different algorithms.\nFor example, the settings file which re-specifies the default behaviour would look like ::\n\n  network:\n    method: generate_minimal_spanning_network\n  mapper:\n    method: LomapAtomMapper\n    settings:\n      time: 1\n      threed: True\n      max3d: 0.95\n      element_change: True\n  partial_charge:\n    method: am1bcc\n    settings:\n      off_toolkit_backend: ambertools\n\nThe name of the algorithm is given behind the ``method:`` key and the arguments to the\nalgorithm are then optionally given behind the ``settings:`` key.\nAll sections of the file ``network:``, ``mapper:``  and ``partial_charge:`` are optional.\n\nThe settings YAML file is then provided to the ``-s`` option of ``openfe plan-rbfe-network``: ::\n\n  openfe plan-rbfe-network -M molecules.sdf -p protein.pdb -s settings.yaml\n\nCustomising the atom mapper\n---------------------------\n\nThere is a choice to be made as to which atom mapper is used,\ncurrently included are the :class:`.LomapAtomMapper` and the :class:`.KartografAtomMapper` (full details in the `Kartograf documentation`_.)\n\n.. _Kartograf documentation: https://kartograf.readthedocs.io/en/latest/api/kartograf.mappers.html#kartograf.atom_mapper.KartografAtomMapper\n\nFor example, to switch to using the ``Kartograf`` atom mapper, this settings YAML could be used ::\n\n  mapper:\n    method: KartografAtomMapper\n    settings:\n      atom_max_distance: 0.95\n      atom_map_hydrogens: True\n      map_hydrogens_on_hydrogens_only: False\n      map_exact_ring_matches_only: True\n\n\nCustomising the network planner\n-------------------------------\n\nThere are a variety of network planning options available, including\n:func:`.generate_radial_network`,\n:func:`.generate_minimal_spanning_network`, and\n:func:`.generate_minimal_redundant_network`.\n\nFor example, to plan a radial network using a ligand called 'CHEMBL1078774' as the central ligand, this settings YAML\ncould be given ::\n\n  network:\n    method: generate_radial_network\n    settings:\n      central_ligand: CHEMBL1078774\n\nWhere the required ``central_ligand`` argument has been passed inside the ``settings:`` section.\n\nNote that there is a subtle distinction when ligand names could be interpreted as integers.\nTo select the first ligand, the **integer** 0 can be given ::\n\n  network:\n    method: generate_radial_network\n    settings:\n      central_ligand: 0\n\nWhereas if we wanted to specify the ligand named \"0\", we would instead explicitly pass this as **a string** to the YAML\nsettings file ::\n\n  network:\n    method: generate_radial_network\n    settings:\n      central_ligand: '0'\n\nCustomising the partial charge generation\n-----------------------------------------\n\nThere are a range of partial charge generation schemes available, including\n\n* ``am1bcc``\n* ``am1bccelf10`` (only possible if ``off_toolkit_backend`` in settings is set to ``openeye``)\n* ``nagl`` (must have ``openff-nagl`` installed)\n* ``espaloma`` (must have ``espaloma_charge`` installed)\n\nThe following settings can also be set\n\n* ``off_toolkit_backend`` The backend to use for partial charge generation. Choose from  ``ambertools`` (default), ``openeye`` or ``rdkit``.\n* ``number_of_conformers`` The number of conformers to use for partial charge generation. If unset (default), the input conformer will be used.\n* ``nagl_model``: The NAGL model to use. If unset (default), the latest available production charge model will be used.\n\nFor example, to generate the partial charges using the ``am1bccelf10`` method from ``openeye`` the following should be added to the YAML settings file ::\n\n partial_charge:\n   method: am1bccelf10\n   settings:\n     off_toolkit_backend: openeye\n\nFor more information on the different options, please refer to the :class:`.OpenFFPartialChargeSettings`.\n"
  },
  {
    "path": "docs/guide/cli/index.rst",
    "content": ".. _userguide_cli_interface:\n\nCLI Interface\n=============\n\nIn addition to the powerful Python API, OpenFE provides a simple command\nline interface to facilitate some more common (and less complicated) tasks.\nThe Python API tries to be as easy to use as possible, but the CLI provides\nwrappers around some parts of the Python API to make it easier to integrate\ninto non-Python workflows.\n\n\n.. toctree::\n   cli_basics\n   cli_yaml\n"
  },
  {
    "path": "docs/guide/execution/execution_theory.rst",
    "content": ".. _userguide_execution_theory:\n\nProtocols and the Execution Model Theory\n========================================\n\nProtocols in OpenFE are built on a flexible execution model. \nResult objects are shaped by this model, and therefore some basic\nbackground on it can be useful when looking into the details of simulation\nresults. In general, most users don't need to work with the details of the\nexecution model, but the general ideas can be useful.\n\n.. TODO figure showing an example dag\n\nEach protocol involves a number of steps (called ``ProtocolUnit``\\ s) which occur in\nsome order. Formally, this is described by a directed acyclic graph (DAG),\nso the collection of steps to run is called a ``ProtocolDAG``. A\n:class:`.Protocol` creates the ``ProtocolDAG``, and a single ``ProtocolDAG``\nshould give information necessary to obtain an estimate of the desired\nthermodynamic observable. Over the course of a campaign, a single\n:class:`.Protocol` may create multiple ``ProtocolDAG``\\ s, e.g., to extend a\nsimulation. NB: While independent runs can be created as separate\n``ProtocolDAG``\\ s, the recommend way to do independent runs is as a\n``repeats`` part of the settings for the protocol, which puts the\nindependent runs in a single ``ProtocolDAG``.\n\n.. TODO review recommendation for repeats in context of NEQ protocol\n\nThere are results objects at each level of this: so the\n:class:`.ProtocolResult` is associated with the :class:`.Protocol`. Just as\nthe :class:`.Protocol` may create one or more ``ProtocolDAG``\\ s, the\n:class:`.ProtocolResult` will be made from one or more\n:class:`.ProtocolDAGResult`\\ s.  Finally, each :class:`.ProtocolDAGResult`\nmay carry information about multiple :class:`.ProtocolUnitResult`\\ s, just a\nsingle ``ProtocolDAG`` may involve multiple ``ProtocolUnit``\\ s.\n\n.. TODO FUTURE: figure showing the relations of protocol objects and result\n   objects\n\n.. TODO FUTURE: add information about scratch/shared/permanent storage\n   once that becomes relevant\n"
  },
  {
    "path": "docs/guide/execution/index.rst",
    "content": ".. _userguide_execution:\n\nExecution\n=========\n\nWith a :class:`.Transformation` defined, the next step is to execute this.\nThe easiest way to run it is to use the :ref:`quickrun CLI tool <userguide_quickrun>`.\nMore advanced options are available through first considering the\n:ref:`theory of the execution model<userguide_execution_theory>`\nthen :ref:`reading on the available Python functions<reference_execution>`.\n\n.. toctree::\n   quickrun_execution\n   execution_theory\n"
  },
  {
    "path": "docs/guide/execution/quickrun_execution.rst",
    "content": ".. _userguide_quickrun:\n\nExecution with Quickrun\n=======================\n\nThe planning and preparation of a campaign of alchemical simulations using ``openfe`` is intended to be achievable on a local workstation in a matter of minutes.\nThe *execution* of these simulations however requires a large amount of computational power, and beyond running single calculations locally, is intended to be distributed across a HPC environment.\nDoing this requires storing and sending the details of the simulation from the local workstation to a HPC environment, which can be done via the :func:`.Transformation.to_json` function which :ref:`creates a saved JSON version of the data<dumping_transformations>`.\nThese serialized JSON files are the currency of executing a campaign of simulations and contain all the information required to execute a single simulation.\n\nTo read the ``Transformation`` information and execute the simulation, the command line interface provides the ``openfe quickrun`` command, the full details of which are given in :ref:`the CLI reference section<cli_quickrun>`.\n\n\nBasic quickrun usage\n--------------------\n\nThe ``quickrun`` command takes in the ``Transformation`` information represented as JSON, then executes a simulation according to those specifications.\nFor example, the following command executes a simulation defined by ``transformation.json`` and produces a results file named ``results.json``.\n\n::\n\n  > openfe quickrun transformation.json -d workdir/ -o workdir/results.json\n\nThe ``-d`` / ``--work-dir`` flag controls where working files (checkpoints, trajectory data, etc...) are written.\nIf it is omitted, the current directory will be used.\n\nThe ``-o`` flag controls where the results file will be written.\nIf it is omitted, results are written to a file named ``<transformation_key>_results.json`` in the working directory, where ``<transformation_key>`` is a unique identifier.\n\n\nResuming a halted job\n---------------------\n\nWhen ``openfe quickrun`` starts, it saves a plan of the simulation to a cache file before execution begins:\n\n.. code:: bash\n\n    <work-dir>/quickrun_cache/dag-cache-<key>.json\n\nWhere ``<key>`` is a unique identifier based on the ``-o`` file path and Transformation.\nThis cache is automatically removed once the job completes.\n\nIf a job is interrupted (e.g. due to a wall-time limit, node failure, or manual cancellation), you can resume the interrupted job by passing the ``--resume`` flag:\n\n.. code:: bash\n\n    > openfe quickrun transformation.json -d workdir/ -o workdir/results.json --resume\n\nThe planned simulation cache will be used to identify where in the simulation process it left off and, if supported by the Transformation Protocol, how to resume.\n\n.. note::\n\n    The same ``-d`` / ``--work-dir`` and ``-o`` flag arguments used in the\n    original run must be specified so that ``quickrun`` can locate the cache file.\n\nIf you pass ``--resume`` but no cache file is found (e.g. the job never started), the following warning is printed and a fresh execution begins.\n\n.. code:: bash\n\n    openfe quickrun was run with --resume, but no cached results found at\n    <path-to-cache-file>. Starting new execution.\n\nIf the cache file is corrupted (e.g. due to an incomplete write at the moment of interruption), ``quickrun --resume`` will raise an error with instructions to rerun the simulation:\n\n.. code:: bash\n\n    Recovery failed, please remove <work-dir>/quickrun_cache/dag-cache-<key>.json\n    before executing a new transformation simulation.\n\nIf you do not pass the ``--resume`` flag, the code will detect the partially complete transformation and prevent you from accidentally starting a duplicate run.\nThe following error will be raised:\n\n.. code:: bash\n\n    Transformation has been started but is incomplete. Please remove\n    <work-dir>/quickrun_cache/dag-cache-<key>.json and rerun, or resume\n    execution using the ``--resume`` flag.\n\n\nExecuting within a job submission script\n----------------------------------------\n\nYou may need to submit computational jobs to a queueing engine, such as Slurm.\nThe ``openfe quickrun`` command can be used within a submission script as follows:\n\n.. code-block:: bash\n\n  #!/bin/bash\n\n  #SBATCH --job-name=\"openfe job\"\n  #SBATCH --mem-per-cpu=2G\n\n  # activate an appropriate conda environment, or any \"module load\" commands required to\n  conda activate openfe_env\n\n  openfe quickrun transformation.json -d workdir/ -o workdir/results.json\n\n\nParallel execution of repeats with Quickrun\n===========================================\n\nSerial execution of multiple repeats of a transformation can be inefficient when simulation times are long.\nHigher throughput can be achieved with parallel execution by running one repeat per HPC job.\nMost protocols are set up to run three repeats in serial by default, but this can be changed by either:\n\n1. Defining the protocol setting ``protocol_repeats`` - see the :ref:`protocol configuration guide <cookbook/choose_protocol.nblink>` for more details.\n2. Using the ``openfe plan-rhfe-network`` (or ``plan-rbfe-network``) command line flag ``--n-protocol-repeats``.\n\nEach transformation can then be executed multiple times via the ``openfe quickrun`` command to produce a set of repeats.\nHowever, **you must use unique results files for each repeat to ensure they don't overwrite each other**.\nWe recommend using folders named ``results_x`` where x is 0-2 to store the repeated calculations as our :ref:`openfe gather <cli_gather>` command also supports this file structure.\n\nBelow is an example of a simple script that will create and submit a separate job script (``\\*.job`` named file) for every alchemical transformation (for the simplest SLURM use case) in a network running each repeat in parallel and writing the results to a unique folder:\n\n.. code-block:: bash\n\n   for file in network_setup/transformations/*.json; do\n     relpath=\"${file:30}\"  # strip off \"network_setup/\"\n     dirpath=${relpath%.*}  # strip off final \".json\"\n     jobpath=\"network_setup/transformations/${dirpath}.job\"\n     if [ -f \"${jobpath}\" ]; then\n       echo \"${jobpath} already exists\"\n       exit 1\n     fi\n     for repeat in {0..2}; do\n       cmd=\"openfe quickrun ${file} -o results_${repeat}/${relpath} -d results_${repeat}/${dirpath} --n-protocol-repeats 1\"\n       echo -e \"#!/usr/bin/env bash\\n${cmd}\" > \"${jobpath}\"\n       sbatch \"${jobpath}\"\n     done\n   done\n\nThis should result in the following file structure after execution:\n\n::\n\n    results_parallel\n    ├── results_0\n    │   ├── rbfe_lig_ejm_31_complex_lig_ejm_42_complex.json\n    │   ├── shared_HybridTopologyMultiStateAnalysisUnit-5e0825de1dd045818cdc3428205c1cf7_attempt_0\n    │   │   ├── forward_reverse_convergence.png\n    │   │   ├── ligand_RMSD.png\n    │   │   ├── mbar_overlap_matrix.png\n    │   │   ├── replica_exchange_matrix.png\n    │   │   ├── replica_state_timeseries.png\n    │   │   └── structural_analysis.npz\n    │   ├── shared_HybridTopologyMultiStateSimulationUnit-144be594cf024cb19152cfe5e0b3fb7d_attempt_0\n    │   │   ├── checkpoint.chk\n    │   │   ├── simulation.nc\n    │   │   └── simulation_real_time_analysis.yaml\n    │   └── shared_HybridTopologySetupUnit-01b5afe1972c4e2f9d0943da43b4b19c_attempt_0\n    │       ├── A_db.json\n    │       ├── B_db.json\n    │       ├── hybrid_positions.npy\n    │       ├── hybrid_system.pdb\n    │       └── hybrid_system.xml.bz2\n    ├── results_1\n    │   ├── rbfe_lig_ejm_31_complex_lig_ejm_42_complex.json\n    │   ├── shared_HybridTopologyMultiStateAnalysisUnit-7986bec616a74929aee85e900535f4a2_attempt_0\n    │   │   ├── forward_reverse_convergence.png\n    │   │   ├── ligand_RMSD.png\n    │   │   ├── mbar_overlap_matrix.png\n    │   │   ├── replica_exchange_matrix.png\n    │   │   ├── replica_state_timeseries.png\n    │   │   └── structural_analysis.npz\n    │   ├── shared_HybridTopologyMultiStateSimulationUnit-18eb295b7123444f9ac66ff3caffcab8_attempt_0\n    │   │   ├── checkpoint.chk\n    │   │   ├── simulation.nc\n    │   │   └── simulation_real_time_analysis.yaml\n    │   └── shared_HybridTopologySetupUnit-3d8ccb1ef5124bd4ba20e0047aad0b5f_attempt_0\n    │       ├── A_db.json\n    │       ├── B_db.json\n    │       ├── hybrid_positions.npy\n    │       ├── hybrid_system.pdb\n    │       └── hybrid_system.xml.bz2\n    └── results_2\n        ├── rbfe_lig_ejm_31_complex_lig_ejm_42_complex.json\n        ├── shared_HybridTopologyMultiStateAnalysisUnit-ac5fad8ad1fb49598f80018713dce070_attempt_0\n        │   ├── forward_reverse_convergence.png\n        │   ├── ligand_RMSD.png\n        │   ├── mbar_overlap_matrix.png\n        │   ├── replica_exchange_matrix.png\n        │   ├── replica_state_timeseries.png\n        │   └── structural_analysis.npz\n        ├── shared_HybridTopologyMultiStateSimulationUnit-73abea21b423444881bd8f21415c937f_attempt_0\n        │   ├── checkpoint.chk\n        │   ├── simulation.nc\n        │   └── simulation_real_time_analysis.yaml\n        └── shared_HybridTopologySetupUnit-79bc9b63321945338a3b69d9f94ee15b_attempt_0\n            ├── A_db.json\n            ├── B_db.json\n            ├── hybrid_positions.npy\n            ├── hybrid_system.pdb\n            └── hybrid_system.xml.bz2\n\nThe results of which can be gathered from the CLI using the ``openfe gather`` command, in this case you should direct\nit to the root directory which includes the repeat results and it will automatically collate the information\n\n::\n\n  > openfe gather results_parallel\n\nOptimizing GPU performance with NVIDIA MPS\n==========================================\n\nYou can further optimize execution of ``openfe quickrun`` using NVIDIA's Multi-Process Service (MPS).\nSee NVIDIA's documentation on `MPS for OpenFE free energy calculations <https://developer.nvidia.com/blog/maximizing-openmm-molecular-dynamics-throughput-with-nvidia-multi-process-service/?ref=blog.omsf.io#mps_for_openfe_free_energy_calculations>`_ for details.\n\nSee Also\n--------\n\n- :ref:`userguide_results` - details on inspecting these results.\n- :ref:`cli-reference` - full CLI reference for ``openfe quickrun``\n- :ref:`rbfe_cli_tutorial` - a tutorial on how to use the CLI to run hybrid topology relative binding free energy calculations.\n"
  },
  {
    "path": "docs/guide/index.rst",
    "content": "User\\ |nbsp|\\ Guide\n===================\n\n.. toctree::\n    :maxdepth: 2\n\n    introduction\n    setup/index\n    execution/index\n    results/index\n    cli/index\n    protocols/index\n    under_the_hood\n    troubleshooting\n\n.. |nbsp| unicode:: 0xA0 .. copyright sign\n    :trim:"
  },
  {
    "path": "docs/guide/introduction.rst",
    "content": ".. _guide-introduction:\n\nIntroduction \n============\n\nHere we present an overview of the workflow for calculating free energies in\nOpenFE in the broadest strokes possible. This workflow is reflected in both\nthe Python API and in the command line interface, and so we have a section\nfor each.\n\nWorkflow overview\n-----------------\n\nThe overall workflow of OpenFE involves three stages:\n\n1. :ref:`Simulation setup <userguide_setup>`: Defining the simulation campaign you are going to run.\n2. :ref:`Execution <userguide_execution>`: Running and performing initial analysis of your\n   simulation campaign.\n3. :ref:`Gather results <userguide_results>`: Assembling the results from the simulation\n   campaign for further analysis.\n\nIn many use cases, these stages may be done on different machines. For\nexample, you are likely to make use of HPC or cloud computing resources to\nrun the simulation campaign. Because of this, each stage has a defined output which \nis then the input for the next stage:\n\n.. TODO make figure\n.. .. figure:: ???\n    :alt: Setup -> (AlchemicalNetwork) -> Execution -> (ProtocolResults) -> Gather\n\n    The main stages of a free energy calculation in OpenFE, and the intermediates between them.\n\nThe output of the :ref:`simulation setup <userguide_setup>` stage is an :class:`.AlchemicalNetwork`. This contains all\nthe information about what is being simulated (e.g., what ligands, host proteins, solvation details, etc.) and the\ninformation about how to perform the simulation (the Protocol).\n\nThe output of the :ref:`execution <userguide_execution>` stage is the basic results from each edge.\nThis can depend of the specific analysis intended, but will either involve a\n:class:`.ProtocolResult` representing the calculated :math:`\\Delta G` for\neach edge or the :class:`.ProtocolDAGResult` linked to the data needed to\ncalculate that :math:`\\Delta G`.\n\nThe :ref:`gather results <userguide_results>` stage aggregates the individual results for further analysis. For example, the CLI's ``gather`` command will create a\ntable of the :math:`\\Delta G` for each leg.\n\nFor more workflow details, see :ref:`under-the-hood`.\n\n.. TODO: Should the CLI workflow be moved to under \"CLI Interface\"?\n\nCLI Workflow\n------------\n\nWe have separate CLI commands for each stage of setup, execution, and\ngathering results. With the CLI, the Python objects of\n:class:`.AlchemicalNetwork` and :class:`.ProtocolResult` are stored to disk\nin an intermediate representation between the commands.\n\n.. TODO make figure\n.. .. figure:: ???\n   :alt: [NetworkPlanner -> AlchemicalNetwork] -> Transformation JSON -> quickrun -> Result JSON -> gather\n\n   The CLI workflow, with intermediates. The setup stage uses a network\n   planner to generate the network, before saving each transformation as a\n   JSON file.\n\nThe commands used to generate an :class:`.AlchemicalNetwork` using the CLI are:\n\n* :ref:`cli_plan-rbfe-network`\n* :ref:`cli_plan-rhfe-network`\n\n.. note::\n\n   To ensure a consistent set of partial charges are used for each molecule across different transformations, the CLI\n   network planners will now automatically generate charges ahead of planning the network. The partial charge generation\n   scheme can be configured using the :ref:`YAML settings <userguide_cli_yaml_interface>`. We also provide tooling to\n   generate the partial charges as a separate CLI step which can be run before network planning, see the :ref:`tutorial <charge_molecules_cli_tutorial>`\n   for more details.\n\n\nFor example, you can create a relative binding free energy (RBFE) network using\n\n.. code:: bash\n\n    $ openfe plan-rbfe-network -p protein.pdb -M dir_with_sdfs/\n\nThis will save the alchemical network represented as a JSON file for each\nedge of the :class:`.AlchemicalNetwork` (i.e., each leg of the alchemical cycle).\n\nTo run a given transformation, use the :ref:`cli_quickrun`; for example:\n\n.. code:: bash\n\n    $ openfe quickrun mytransformation.json -d dir_for_files -o output.json\n\nIn many cases, you will want to create a job script for a queuing system\n(e.g., SLURM) that wraps that command. You can do this for all JSON files\nfrom the network planning command with something like this:\n\n.. TODO Link to example here. I think this is waiting on the CLI example\n   being merged into example notebooks?\n\nFinally, assuming all results (and only results) are in the `results/` directory,\nuse the :ref:`cli_gather` to generate a summary table:\n\n.. code:: bash\n\n    $ openfe gather ./results/ -o final_results.tsv\n\nThis will output a tab-separated file with the ligand pair, the estimated\n:math:`\\Delta G` and the uncertainty in that estimate.\n\nThe CLI provides a very straightforward user experience that works with the\nmost simple use cases. For use cases that need more workflow customization,\nthe Python API makes it relatively straightforward to define exactly the\nsimulation you want to run. The next sections of this user guide will\nillustrate how to customize the behavior to your needs.\n"
  },
  {
    "path": "docs/guide/protocols/absolutebinding.rst",
    "content": ".. _userguide_abfe_protocol:\n\nAbsolute Binding Protocol\n=========================\n\nOverview\n--------\n\nThe :class:`AbsoluteBindingProtocol <.AbsoluteBindingProtocol>` calculates the absolute binding free energy,\nwhich is the free energy difference between a ligand in solution and the ligand bound to a protein.\n\nThe absolute binding free energy is calculated through a thermodynamic cycle.\nIn this cycle, the interactions of the molecule are decoupled, meaning turned off,\nusing a partial annihilation scheme (see below) both in the solvent and in the complex phases.\n\nRestraints are required to keep the weakly\ncoupled and fully decoupled ligand in the binding site region and thereby reduce the phase\nspace that needs to be sampled. In the :class:`AbsoluteBindingProtocol <.AbsoluteBindingProtocol>`\nwe apply orientational, or Boresch-style, restraints, as described below.\n\nThe absolute binding free energy is then obtained via summation of free energy differences along the thermodynamic cycle.\n\n.. figure:: img/abfe-cycle.png\n   :scale: 50%\n\n   Thermodynamic cycle for the absolute binding free energy protocol.\n\nScientific Details\n------------------\n\nOrientational restraints\n~~~~~~~~~~~~~~~~~~~~~~~~\n\nOrientational, or Boresch-style, restraints are automatically (unless manually specified) applied between three\nprotein and three ligand atoms using one bond, two angle, and three dihedral restraints.\nReference atoms are picked based on different criteria, such as the root mean squared\nfluctuation of the atoms in a short MD simulation, the secondary structure of the protein,\nand the distance between atoms, based on heuristics from Baumann et al. [1]_ and Alibay et al. [2]_.\nTwo strategies for selecting protein atoms are available, either picking atoms that are bonded to each other or that can span multiple residues.\nThis can be specified using the ``restraint_settings.anchor_finding_strategy`` settings.\n\nPartial annihilation scheme\n~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nIn the :class:`.AbsoluteBindingProtocol` the coulombic interactions of the molecule are fully turned off (annihilated).\nThe Lennard-Jones interactions are instead decoupled, meaning the intermolecular interactions are turned off, keeping the intramolecular Lennard-Jones interactions.\n\nThe lambda schedule\n~~~~~~~~~~~~~~~~~~~\n\nMolecular interactions are turned off during an alchemical path using a discrete set of lambda windows.\nFor the transformation in the binding site, the following steps are carried out, starting with the ligand fully interacting in the binding site.\n\n1. Restrain the ligand using orientational restraints.\n2. Turn off the electrostatic interactions of the ligand.\n3. Decouple Lennard-Jones interactions of the ligand.\n4. Release the restraints of the now dummy ligand analytically.\n\nThe lambda schedule in the solvent phase is similar to the one in the complex, except that no restraints are applied.\nA soft-core potential is applied to the Lennard-Jones potential to avoid instablilites in intermediate lambda windows.\nThe soft-core potential function from Beutler et al. [3]_ is used by default.\nThe lambda schedule is defined in the ``lambda_settings`` objects ``lambda_elec``, ``lambda_vdw``, and ``lambda_restraints``.\n\nSimulation overview\n~~~~~~~~~~~~~~~~~~~\n\nThe :class:`.ProtocolDAG` of the :class:`.AbsoluteBindingProtocol` contains :class:`.ProtocolUnit`\\ s from both the complex and solvent transformations.\nThis means that both legs of the thermodynamic cycle are constructed and run concurrently in the same :class:`.ProtocolDAG`.\nThis is different from the :class:`.RelativeHybridTopologyProtocol` where the :class:`.ProtocolDAG` only runs a single leg of a thermodynamic cycle.\nIf multiple ``protocol_repeats`` are run (default: ``protocol_repeats=3``), the :class:`.ProtocolDAG` contains multiple :class:`.ProtocolUnit`\\ s of both complex and solvent transformations.\n\nSimulation steps\n\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\n\nEach :class:`.ProtocolUnit` (whether complex or solvent) carries out the following steps:\n\n1. Parameterize the system using `OpenMMForceFields <https://github.com/openmm/openmmforcefields>`_ and `Open Force Field <https://github.com/openforcefield/openff-forcefields>`_.\n2. Equilibrate the fully interacting system using a short MD simulation using the same approach as the :class:`.PlainMDProtocol` (including rounds of NVT and NPT equilibration).\n3. Create an alchemical system.\n4. Add orientational restraints to the complex system.\n5. Minimize the alchemical system.\n6. Equilibrate and production simulate the alchemical system using the chosen multistate sampling method (under NPT conditions).\n7. Analyze results for the transformation.\n\n.. note:: Three different types of multistate sampling (i.e. replica swapping between lambda states) methods can be chosen; HREX, SAMS, and independent (no lambda swaps attempted).\n          By default the HREX approach is selected, this can be altered using ``solvent_simulation_settings.sampler_method`` or ``complex_simulation_settings.sampler_method`` (default: ``repex``).\n\nSimulation details\n\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\n\nHere are some details of how the simulation is carried out which are not detailed in the :class:`.AbsoluteBindingSettings`:\n\n* The protocol applies a `LangevinMiddleIntegrator <https://openmmtools.readthedocs.io/en/latest/api/generated/openmmtools.mcmc.LangevinDynamicsMove.html>`_ which uses Langevin dynamics, with the LFMiddle discretization [4]_.\n* A MonteCarloBarostat is used in the NPT ensemble to maintain constant pressure.\n\nGetting the free energy estimate\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nThe free energy differences are obtained from simulation data using the `MBAR estimator <https://www.alchemistry.org/wiki/Multistate_Bennett_Acceptance_Ratio>`_ (multistate Bennett acceptance ratio estimator) as implemented in the `PyMBAR package <https://pymbar.readthedocs.io/en/master/mbar.html>`_.\nBoth the MBAR estimates of the two legs of the thermodynamic cycle, and the overall absolute binding free energy (of the entire cycle) are obtained,\nwhich is different compared to the results in the :class:`.RelativeHybridTopologyProtocol` where results from two legs of the thermodynamic cycle are obtained separately.\n\nIn addition to the estimates of the free energy changes and their uncertainty, the protocol also returns some metrics to help assess convergence of the results, these are detailed in the :ref:`multistate analysis section <multistate_analysis>`.\n\nSee Also\n--------\n\n**Setting up AFE calculations**\n\n* :ref:`Defining the Protocol <defining-protocols>`\n\n\n**Tutorials**\n\n* :any:`Absolute Binding Free Energies tutorial <../../tutorials/abfe_tutorial>`\n\n**Cookbooks**\n\n:ref:`Cookbooks <cookbooks>`\n\n**API Documentation**\n\n* :ref:`OpenMM Absolute Binding Free Energy <afe binding protocol api>`\n* :ref:`OpenMM Protocol Settings <openmm protocol settings api>`\n\nReferences\n----------\n\n* `pymbar <https://pymbar.readthedocs.io/en/stable/>`_\n* `yank <http://getyank.org/latest/>`_\n* `OpenMMTools <https://openmmtools.readthedocs.io/en/stable/>`_\n* `OpenMM <https://openmm.org/>`_\n\n.. [1] Broadening the Scope of Binding Free Energy Calculations Using a Separated Topologies Approach, H. Baumann, E. Dybeck, C. McClendon, F. Pickard IV, V. Gapsys, L. Pérez-Benito, D. Hahn, G. Tresadern, A. Mathiowetz, D. Mobley, J. Chem. Theory Comput., 2023, 19, 15, 5058–5076\n.. [2] Evaluating the use of absolute binding free energy in the fragment optimisation process, I. Alibay, A. Magarkar, D. Seeliger, P. Biggin, Commun Chem 5, 105 (2022)\n.. [3] Avoiding singularities and numerical instabilities in free energy calculations based on molecular simulations, T.C. Beutler, A.E. Mark, R.C. van Schaik, P.R. Greber, and W.F. van Gunsteren, Chem. Phys. Lett., 222 529–539 (1994)\n.. [4] Unified Efficient Thermostat Scheme for the Canonical Ensemble with Holonomic or Isokinetic Constraints via Molecular Dynamics, Zhijun Zhang, Xinzijian Liu, Kangyu Yan, Mark E. Tuckerman, and Jian Liu, J. Phys. Chem. A 2019, 123, 28, 6056-6079\n"
  },
  {
    "path": "docs/guide/protocols/absolutesolvation.rst",
    "content": "Absolute Solvation Protocol\n===========================\n\nOverview\n--------\n\nThe :class:`AbsoluteSolvationProtocol <.AbsoluteSolvationProtocol>` calculates the free energy change \nassociate with transferring a molecule from vacuum into a solvent.\n\n.. note::\n   Currently, water is the only supported solvent, however, more solvents might be possible in the future.\n\nThe absolute solvation free energy is calculated through a thermodynamic cycle. \nIn this cycle, the interactions of the molecule are decoupled, meaning turned off, using a partial annihilation scheme (see below) both in the solvent and in the vacuum phases.\nThe absolute solvation free energy is then obtained via summation of free energy differences along the thermodynamic cycle.\n\n.. figure:: img/ahfe_thermocycle.png\n   :scale: 80%\n\n   Thermodynamic cycle for the absolute solvation free energy protocol.\n\nScientific Details\n------------------\n\nPartial annihilation scheme\n~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nIn the :class:`.AbsoluteSolvationProtocol` the coulombic interactions of the molecule are fully turned off (annihilated). \nThe Lennard-Jones interactions are instead decoupled, meaning the intermolecular interactions turned off, keeping the intramolecular Lennard-Jones interactions.\n\nThe lambda schedule\n~~~~~~~~~~~~~~~~~~~\n\nMolecular interactions are turned off during an alchemical path using a discrete set of lambda windows. The electrostatic interactions are turned off first, followed by the decoupling of the Lennard-Jones interactions. \nA soft-core potential is applied to the Lennard-Jones potential to avoid instablilites in intermediate lambda windows. \nBoth the soft-core potential functions from Beutler et al. [1]_ and from Gapsys et al. [2]_ are available and can be specified in the ``alchemical_settings.softcore_LJ`` settings\n(default: ``gapsys``).\nThe lambda schedule is defined in the ``lambda_settings`` objects ``lambda_elec`` and ``lambda_vdw``. Note that the ``lambda_restraints`` setting is ignored for the :class:`.AbsoluteSolvationProtocol`.\n\nSimulation overview\n~~~~~~~~~~~~~~~~~~~\n\nThe :class:`.ProtocolDAG` of the :class:`.AbsoluteSolvationProtocol` contains :class:`.ProtocolUnit`\\ s from both the vacuum and solvent transformations.\nThis means that both legs of the thermodynamic cycle are constructed and run concurrently in the same :class:`.ProtocolDAG`. This is different from the :class:`.RelativeHybridTopologyProtocol` where the :class:`.ProtocolDAG` only runs a single leg of a thermodynamic cycle.\nIf multiple ``protocol_repeats`` are run (default: ``protocol_repeats=3``), the :class:`.ProtocolDAG` contains multiple :class:`.ProtocolUnit`\\ s of both vacuum and solvent transformations.\n\nSimulation steps\n\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\n\nEach :class:`.ProtocolUnit` (whether vacuum or solvent) carries out the following steps:\n\n1. Parameterize the system using `OpenMMForceFields <https://github.com/openmm/openmmforcefields>`_ and `Open Force Field <https://github.com/openforcefield/openff-forcefields>`_.\n2. Equilibrate the fully interacting system using a short MD simulation using the same approach as the :class:`.PlainMDProtocol` (in the solvent leg this will include rounds of NVT and NPT equilibration).\n3. Create an alchemical system.\n4. Minimize the alchemical system.\n5. Equilibrate and production simulate the alchemical system using the chosen multistate sampling method (under NPT conditions if solvent is present).\n6. Analyze results for the transformation.\n\nNote: three different types of multistate sampling (i.e. replica swapping between lambda states) methods can be chosen; HREX, SAMS, and independent (no lambda swaps attempted). By default the HREX approach is selected, this can be altered using ``solvent_simulation_settings.sampler_method`` or ``vacuum_simulation_settings.sampler_method`` (default: ``repex``).\n\nSimulation details\n\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\n\nHere are some details of how the simulation is carried out which are not detailed in the :class:`.AbsoluteSolvationSettings`:\n\n* The protocol applies a `LangevinMiddleIntegrator <https://openmmtools.readthedocs.io/en/latest/api/generated/openmmtools.mcmc.LangevinDynamicsMove.html>`_ which uses Langevin dynamics, with the LFMiddle discretization [3]_.\n* A MonteCarloBarostat is used in the NPT ensemble to maintain constant pressure.\n\nGetting the free energy estimate\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nThe free energy differences are obtained from simulation data using the `MBAR estimator <https://www.alchemistry.org/wiki/Multistate_Bennett_Acceptance_Ratio>`_ (multistate Bennett acceptance ratio estimator) as implemented in the `PyMBAR package <https://pymbar.readthedocs.io/en/master/mbar.html>`_.\nBoth the MBAR estimates of the two legs of the thermodynamic cycle, and the overall absolute solvation free energy (of the entire cycle) are obtained,\nwhich is different compared to the results in the :class:`.RelativeHybridTopologyProtocol` where results from two legs of the thermodynamic cycle are obtained separately.\n\nIn addition to the estimates of the free energy changes and their uncertainty, the protocol also returns some metrics to help assess convergence of the results, these are detailed in the :ref:`multistate analysis section <multistate_analysis>`.\n\n.. todo: issue 792 change this reference to point to the new results section\n\n\nSee Also\n--------\n\n**Setting up AFE calculations**\n\n* :ref:`Defining the Protocol <defining-protocols>`\n\n..\n  To be added: Setting up AHFE calculations\n\n**Tutorials**\n\n* :any:`Absolute Hydration Free Energies tutorial <../../tutorials/ahfe_tutorial>`\n\n**Cookbooks**\n\n:ref:`Cookbooks <cookbooks>`\n\n**API Documentation**\n\n* :ref:`OpenMM Absolute Solvation Free Energy <afe solvation protocol api>`\n* :ref:`OpenMM Protocol Settings <openmm protocol settings api>`\n\nReferences\n----------\n\n* `pymbar <https://pymbar.readthedocs.io/en/stable/>`_\n* `yank <http://getyank.org/latest/>`_\n* `OpenMMTools <https://openmmtools.readthedocs.io/en/stable/>`_\n* `OpenMM <https://openmm.org/>`_\n\n.. [1] Avoiding singularities and numerical instabilities in free energy calculations based on molecular simulations, T.C. Beutler, A.E. Mark, R.C. van Schaik, P.R. Greber, and W.F. van Gunsteren, Chem. Phys. Lett., 222 529–539 (1994)\n.. [2] New Soft-Core Potential Function for Molecular Dynamics Based Alchemical Free Energy Calculations, V. Gapsys, D. Seeliger, and B.L. de Groot, J. Chem. Theor. Comput., 8 2373-2382 (2012)\n.. [3] Unified Efficient Thermostat Scheme for the Canonical Ensemble with Holonomic or Isokinetic Constraints via Molecular Dynamics, Zhijun Zhang, Xinzijian Liu, Kangyu Yan, Mark E. Tuckerman, and Jian Liu, J. Phys. Chem. A 2019, 123, 28, 6056-6079\n"
  },
  {
    "path": "docs/guide/protocols/index.rst",
    "content": ".. _userguide_protocols:\n\nDetails of Specific Protocols\n=============================\n\nDetails on the theory and behaviour of different Protocols are listed here.\n\n.. toctree::\n   relativehybridtopology\n   absolutebinding\n   absolutesolvation\n   septop\n   plainmd\n"
  },
  {
    "path": "docs/guide/protocols/plainmd.rst",
    "content": "Plain MD Protocol\n=================\n\nOverview\n--------\n\nThe :class:`.PlainMDProtocol` enables the user to run a Molecular Dynamics (MD) simulation of a :class:`.ChemicalSystem`, which can contain e.g. a solvated protein-ligand complex, a molecule and water, or a molecule in vacuum.\n\n.. todo: Later add ref to ChemicalSystem section\n\nScientific Details\n------------------\n\nThe :class:`.PlainMDProtocol` runs MD simulations of a system either in solvent or vacuum, depending on the input provided by the user in the :class:`.ChemicalSystem`.\nThe protocol applies a \n`LangevinMiddleIntegrator <http://docs.openmm.org/development/api-python/generated/openmm.openmm.LangevinMiddleIntegrator.html>`_ \nwhich uses Langevin dynamics, with the LFMiddle discretization [1]_.  \n\nSimulation Steps and Outputs\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nIf there is a ``SolventComponent`` in the :class:`.ChemicalSystem`, the each :class:`.ProtocolUnit` carries out the following steps:\n\n.. list-table:: \n  :widths: 50 50\n  :header-rows: 1\n\n  * - Step\n    - Outputs (with default names)\n  * - 1. Parameterize the system using `OpenMMForceFields <https://github.com/openmm/openmmforcefields>`_ and `Open Force Field <https://github.com/openforcefield/openff-forcefields>`_\n    - Forcefield cache (``db.json``)\n  * - 2. OpenMM object creation\n    - Structure of the full system (``system.pdb``)\n  * - 3. Minimize the system\n    - Minimized Structure (``minimized.pdb``)\n  * - 4. Equilibrate in the canonical (NVT) ensemble\n    - NVT equilibrated structure (``equil_nvt.pdb``)\n  * - 5. Equilibrate the system under isobaric-isothermal (NPT) conditions\n    - NPT equilibrated structure (``equil_npt.pdb``)\n  * - 6. Production simulate the system under isobaric-isothermal (NPT) conditions\n    - Simulation trajectory (``simulation.xtc``), Checkpoint file (``checkpoint.chk``), Log output (``simulation.log``)\n\nA MonteCarloBarostat is used in the NPT ensemble to maintain constant pressure.\nRelevant settings under solvent conditions include the solvation settings that control the ``solvent_model`` and ``solvent_padding``.\n\nIf the :class:`.ChemicalSystem` does not contain a ``SolventComponent``, the protocol runs an MD simulation in vacuum. After a minimization, the protocol performs an equilibration, followed by a production run with no periodic boundary conditions and infinite cutoffs. Settings that control the barostat or the solvation are ignored for vacuum MD simulations.\n\nPerformance consideration for gas phase MD simulations\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nFor gas phase MD simulations, we suggest setting ``OPENMM_CPU_THREADS=1`` to obtain good performance.\n\nSee Also\n--------\n\n**Tutorials**\n\n* :any:`MD tutorial <../../tutorials/md_tutorial>`\n\n**API Documentation**\n\n* :ref:`OpenMM plain MD protocol <md protocol api>`\n* :ref:`OpenMM Protocol Settings <openmm protocol settings api>`\n\nReferences\n----------\n* `OpenMMTools <https://openmmtools.readthedocs.io/en/stable/>`_\n* `OpenMM <https://openmm.org/>`_\n\n.. [1] Unified Efficient Thermostat Scheme for the Canonical Ensemble with Holonomic or Isokinetic Constraints via Molecular Dynamics, Zhijun Zhang, Xinzijian Liu, Kangyu Yan, Mark E. Tuckerman, and Jian Liu, J. Phys. Chem. A 2019, 123, 28, 6056-6079\n"
  },
  {
    "path": "docs/guide/protocols/relativehybridtopology.rst",
    "content": ".. _userguide_relative_hybrid_topology_protocol:\n\nRelative Hybrid Topology Protocol\n=================================\n\nOverview\n--------\n\nThe relative free energy calculation approach calculates the difference in \nfree energy between two similar ligands. Depending on the :class:`.ChemicalSystem` \nprovided, the protocol either calculates the relative binding free energy \n(RBFE), or the relative hydration free energy (RHFE).\nFurther information on constructing chemical systems to define thermodynamic cycles,\nsee :ref:`userguide_chemicalsystems_and_components`\n\nIn a thermodynamic \ncycle, one ligand is converted into the other ligand by alchemically \ntransforming the atoms that vary between the two ligands. The \ntransformation is carried out in both environments, meaning both in the \nsolvent (ΔG\\ :sub:`solv`\\) and in the binding site (ΔG\\ :sub:`site`\\) for RBFE calculations \nand in the solvent (ΔG\\ :sub:`solv`\\) and vacuum (ΔG\\ :sub:`vacuum`\\) for RHFE calculations.\n\n.. _label: Thermodynamic cycle for the relative binding free energy protocol\n.. figure:: img/rbfe_thermocycle.png\n   :scale: 50%\n\n   Thermodynamic cycle for the relative binding free energy protocol.\n   \nScientific Details\n------------------\n\nThis :class:`.RelativeHybridTopologyProtocol` is based off the `Perses implementation <https://perses.readthedocs.io/en/latest/>`_.\n\nThe Hybrid Topology approach\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nThe :class:`.RelativeHybridTopologyProtocol` uses a hybrid topology approach to represent the two\nligands, meaning that a single set of coordinates is used to represent the\ncommon core of the two ligands while the atoms that differ between the two\nligands are represented separately. An atom map defines which atoms belong\nto the core (mapped atoms) and which atoms are unique and represented\nseparately (see :ref:`Creating atom mappings <Creating Atom Mappings>`). During the alchemical transformation, mapped atoms are interpolated\nfrom their type in the ligand at state A to the type in the other ligand at state B, while unique atoms\natoms (commonly known as dummy atoms) are switched, inserted or uncoupled, depending on which ligand they belong to. By default all nonbonded interactions between the\ndummy region and the core region are removed to avoid coupling their motion.\n\n.. note:: In this hybrid topology approach, all bonded interactions between the dummy region and the core region are kept. \n          As pointed out by Fleck et al. [1]_, this can lead to systematic errors if the contribution of the dummy group does not cancel out\n          in the thermodynamic cycle (no separability of the partition function). We are currently working on fixing this issue.\n\nThe lambda schedule\n~~~~~~~~~~~~~~~~~~~\n\nThe protocol interpolates molecular interactions between the initial and final state of the perturbation using a discrete set of lambda windows. A function describes how the different lambda components (bonded and nonbonded terms) are interpolated.\nOnly parameters that differ between state A (``lambda=0``) and state B (``lambda=1``) are interpolated. \nIn the default lambda function in the :class:`.RelativeHybridTopologyProtocol`, first the electrostatic interactions of state A are turned off while simultaneously turning on the steric interactions of state B. Then, the steric interactions of state A are turned off while simultaneously turning on the electrostatic interactions of state B. Bonded interactions are interpolated linearly between ``lambda=0`` and ``lambda=1``. The ``lambda_settings`` ``lambda_functions`` and ``lambda_windows`` define the alchemical pathway.\nA soft-core potential is applied to the Lennard-Jones potential to avoid instablilites in intermediate lambda windows.\nBoth the soft-core potential functions from Beutler et al. [2]_ and from Gapsys et al. [3]_ are available and can be specified in the ``alchemical_settings.softcore_LJ`` settings\n(default: ``gapsys``).\n\nSimulation overview\n~~~~~~~~~~~~~~~~~~~\n\nThe :class:`.ProtocolDAG` of the :class:`.RelativeHybridTopologyProtocol` contains the :class:`.ProtocolUnit`\\ s from one leg of the thermodynamic\ncycle. \nThis means that each :class:`.ProtocolDAG` only runs a single leg of a thermodynamic cycle and therefore two Protocol instances need to be run to get the overall relative free energy difference, ΔΔG. \nIf multiple ``protocol_repeats`` are run (default: ``protocol_repeats=3``), the :class:`.ProtocolDAG` contains multiple :class:`.ProtocolUnit`\\ s of both vacuum and solvent transformations.\n\nSimulation Steps\n\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\n\nEach :class:`.ProtocolUnit` carries out the following steps:\n\n1. Parameterize the system using `OpenMMForceFields <https://github.com/openmm/openmmforcefields>`_ and `Open Force Field <https://github.com/openforcefield/openff-forcefields>`_.\n2. Create an alchemical system (hybrid topology).\n3. Minimize the alchemical system.\n4. Equilibrate and production simulate the alchemical system using the chosen multistate sampling method (under NPT conditions if solvent is present).\n\n.. note::\n   **Equilibration method:**\n   The current implementation uses a simple equilibration protocol **without any positional restraints** or **temperature annealing**.\n   The system is equilibrated directly under the target thermodynamic conditions, therefore the input structures should be stable under these conditions.\n\n5. Analyze results for the transformation (for a single leg in the thermodynamic cycle).\n\nNote: three different types of multistate sampling (i.e. replica swapping between lambda states) methods can be chosen; HREX, SAMS, and independent (no lambda swaps attempted). By default the HREX approach is selected, this can be altered using ``simulation_settings.sampler_method`` (default: ``repex``).\n\nSimulation details\n\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\n\nHere are some details of how the simulation is carried out which are not detailed in the :class:`.RelativeHybridTopologySettings`:\n\n* The protocol applies a `LangevinMiddleIntegrator <https://openmmtools.readthedocs.io/en/latest/api/generated/openmmtools.mcmc.LangevinDynamicsMove.html>`_ which uses Langevin dynamics, with the LFMiddle discretization [4]_.\n* A MonteCarloBarostat is used in the NPT ensemble to maintain constant pressure.\n\nGetting the free energy estimate\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nThe free energy differences are obtained from simulation data using the `MBAR estimator <https://www.alchemistry.org/wiki/Multistate_Bennett_Acceptance_Ratio>`_ (multistate Bennett acceptance ratio estimator)\nas implemented in the `PyMBAR package <https://pymbar.readthedocs.io/en/master/mbar.html>`_.\nIn addition to the MBAR estimates of the two legs of the thermodynamic cycle and the overall relative binding free energy difference,\nthe protocol also returns some metrics to help assess convergence of the results,\nthese are detailed in the :ref:`multistate analysis section <multistate_analysis>`.\n\n.. note:: The MBAR uncertainty of each individual transformation is estimated using bootstrapping for 1000 iterations,\n          this leads to larger errors compared to the previous error estimate method. The only exception are\n          the forward and reverse convergence plots which use the MBAR analytical error.\n\n.. todo: issue 792, consolidate this page into its own analysis page and link both RBFE and AFE pages to it\n.. _multistate_analysis:\n\nAnalysis\n~~~~~~~~\n\nAs standard, some analysis of the each simulation repeat is performed.\nThis analysis is made available through either the dictionary of results in the execution output,\nor through some ready-made plots for quick inspection.\nThis analysis can be categorised as relating\nto the energetics of the different lambda states that were sampled,\nor to the analysis of the change in structural conformation over time in each state.\n\nEnergetic and replica exchange analysis\n\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\n\nThese analyses consider the swapping and energetic overlap between the\ndifferent simulated states to help assess the convergence and correctness of the estimate of free energy\ndifference produced.\n\n.. list-table:: Energetic Analysis examples\n  :widths: 75 25\n  :header-rows: 1\n\n  * - Description\n    - Example\n  * - **MBAR overlap matrix.**\n\n      This plot is used to assess if the different lambda states simulated overlapped energetically.\n      Each matrix element represents the probability of a sample from a given row state being observable in a given column\n      state.\n      Since the accuracy of the MBAR estimator depends on sufficient overlap between lambda states, this is a very\n      important metric.\n      This plot should show that the diagonal of the matrix has some \"width\" so that the two end states are connected,\n      with elements adjacent to the diagonal being at least 0.03 [5]_.\n    - .. image:: img/mbar_overlap_matrix.png\n  * - **Replica exchange probability matrix** (for replica exchange sampler simulations only).\n\n      Similar to the MBAR overlap matrix, this shows the probability of a given lambda state being exchanged with another.\n      Again, the diagonal of this matrix should be at least tridiagonal wide for the two end states to be connected.\n    - .. image:: img/replica_exchange_matrix.png\n  * - **Forward and reverse convergence of free energy estimates.**\n\n      Using increasingly larger portions of the total data,\n      this analysis calculates the free energy difference, both in forward and backward directions.\n      In this analysis, forward and backward estimates that agree within error using only a fraction of the total data\n      suggest convergence [5]_. Note: the error bars reported in this plot are\n      MBAR analytical errors instead of bootstrap errors.\n    - .. image:: img/forward_reverse_convergence.png\n  * - **Timeseries of replica states.**\n\n      This plot shows the time evolution of the different system configurations as they are\n      exchanged between different lambda states.\n      This plot should show that the states are freely mixing and that there are no cliques forming.\n    - .. image:: img/replica_state_timeseries.png\n\nStructural analysis\n\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\n\nIf a protein was present, these analyses first center and align the system so that\nthe protein is considered the frame of reference.\nFurther analysis can be performed by inspecting the ``simulation.nc`` and ``hybrid_system.pdb`` files,\nwhich contain a multistate trajectory and topology for the hybrid system respectively.\nThese files can be loaded into an MDAnalysis Universe object using the `openfe_analysis`_ package.\n\n.. list-table:: Structural Analysis examples\n  :widths: 75 25\n  :header-rows: 1\n\n  * - Description\n    - Example\n  * - **Ligand RMSD.**\n\n      This produces a plot called ``ligand_RMSD.png`` and a results entry ``ligand_RMSD`` which gives the\n      RMSD of the ligand molecule over time relative to the first frame of the production phase, for each simulated state.\n      Large RMSD values, e.g. greater than 5 angstrom (system dependent), would indicate an unstable ligand binding mode.\n    - .. image:: img/ligand_RMSD.png\n  * - **Ligand COM drift.**\n\n      For simulations with a protein present, this metric gives the total distance of the ligand COM\n      from its initial starting (docked) position.  If this metric increases over the course of the simulation (beyond 5\n      angstrom) it indicates that the ligand drifted from the binding pocket, and the simulation is unreliable.\n      This produces a plot called ``ligand_COM_drift.png`` and a results entry ``ligand_COM_drift``.\n    - .. image:: img/ligand_COM_drift.png\n  * - **Protein 2D RMSD.**\n\n      For simulations with a protein present, this metric gives, for each lambda state, the RMSD of the\n      protein structure over time, using each frame analysed as a reference frame, to produce a 2 dimensional heatmap.\n      This plot should show no significant spikes in RMSD (which will appear as brightly coloured areas).\n    - .. image:: img/protein_2D_RMSD.png\n\n\nSee Also\n--------\n\n**Setting up RFE calculations**\n\n* :ref:`Setting up alchemical networks <alchemical_network_creation>`\n\n**Tutorials**\n\n* :any:`Relative Free Energies with the OpenFE CLI <rbfe_cli_tutorial>`\n* :any:`Relative Free Energies with the OpenFE Python API <tutorials/rbfe_python_tutorial.nblink>`\n\n**Cookbooks**\n\n:ref:`Cookbooks <cookbooks>`\n\n**API Documentation**\n\n* :ref:`OpenMM Relative Hybrid Topology Protocol <rfe protocol api>`\n* :ref:`OpenMM Protocol Settings <openmm protocol settings api>`\n\nReferences\n----------\n* `pymbar <https://pymbar.readthedocs.io/en/stable/>`_\n* `perses <https://perses.readthedocs.io/en/latest/>`_\n* `OpenMMTools <https://openmmtools.readthedocs.io/en/stable/>`_\n* `OpenMM <https://openmm.org/>`_\n\n.. [1] Dummy Atoms in Alchemical Free Energy Calculations, Markus Fleck, Marcus Wieder, and Stefan Boresch, J. Chem. Theory Comput.2021, 17, 4403−4419\n.. [2] Avoiding singularities and numerical instabilities in free energy calculations based on molecular simulations, T.C. Beutler, A.E. Mark, R.C. van Schaik, P.R. Greber, and W.F. van Gunsteren, Chem. Phys. Lett., 222 529–539 (1994)\n.. [3] New Soft-Core Potential Function for Molecular Dynamics Based Alchemical Free Energy Calculations, V. Gapsys, D. Seeliger, and B.L. de Groot, J. Chem. Theor. Comput., 8 2373-2382 (2012)\n.. [4] Unified Efficient Thermostat Scheme for the Canonical Ensemble with Holonomic or Isokinetic Constraints via Molecular Dynamics, Zhijun Zhang, Xinzijian Liu, Kangyu Yan, Mark E. Tuckerman, and Jian Liu, J. Phys. Chem. A 2019, 123, 28, 6056-6079\n.. [5] Guidelines for the analysis of free energy calculations, Pavel V. Klimovich, Michael R. Shirts, and David L. Mobley, J Comput Aided Mol Des. 2015 May; 29(5):397-411. doi: 10.1007/s10822-015-9840-9\n\n.. _openfe_analysis: https://github.com/OpenFreeEnergy/openfe_analysis\n"
  },
  {
    "path": "docs/guide/protocols/septop.rst",
    "content": ".. _userguide_septop_protocol:\n\nSeparated Topologies Protocol\n=============================\n\nOverview\n--------\n\nThe :class:`SepTopProtocol <.SepTopProtocol>` [1]_, [2]_ calculates the difference in binding free energy between two ligands.\nThis protocol essentially performs two absolute binding free energy calculations simultaneously in opposite directions,\nby (alchemically) inserting one ligand into the binding site, while removing the other ligand at the same time.\nIn contrast to the :ref:`RelativeHybridTopologyProtocol <userguide_relative_hybrid_topology_protocol>`, the two ligand topologies are\ncompletely separate (meaning there is no common core), making atom mapping unnecessary and allowing transformations between chemically diverse ligands.\n\nThe relative binding free energy is calculated through a thermodynamic cycle by transforming one ligand into the other ligand\nboth in the solvent and in the binding site.\n\nRestraints are required to keep the weakly\ncoupled and fully decoupled ligand in the binding site region and thereby reduce the phase\nspace that needs to be sampled. In the :class:`SepTopProtocol <.SepTopProtocol>`\nwe apply orientational, or Boresch-style, restraints, as described below.\n\nIn this cycle, the interactions of one molecule are turned off while simultaneously turning on interactions of the other molecule both in the solvent and complex phases.\nThe relative binding free energy is then obtained via summation of free energy differences along the thermodynamic cycle.\n\n.. figure:: img/septop_cycle.png\n   :scale: 50%\n\n   Thermodynamic cycle for the SepTop free energy protocol.\n\nScientific Details\n------------------\n\nOrientational restraints\n~~~~~~~~~~~~~~~~~~~~~~~~\n\nOrientational, or Boresch-style, restraints are automatically (unless manually specified) applied between three protein and three ligand atoms using one bond,\ntwo angle, and three dihedral restraints. Reference atoms are picked based on different criteria, such as the root mean squared\nfluctuation of the atoms in a short MD simulation, the secondary structure of the protein, and the distance between atoms,\nbased on heuristics from Baumann et al. [2]_ and Alibay et al. [3]_.\nTwo strategies for selecting protein atoms are available, either picking atoms that are bonded to each other or that can span multiple residues.\nThis can be specified using the ``restraint_settings.anchor_finding_strategy`` settings.\n\nPartial annihilation scheme\n~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nIn the :class:`SepTopProtocol <.SepTopProtocol>` the coulombic interactions of the molecules are fully turned off (annihilated) in the respective non-interacting end states.\nThe Lennard-Jones interactions are instead decoupled, meaning the intermolecular interactions are turned off, keeping the intramolecular Lennard-Jones interactions.\n\nThe lambda schedule\n~~~~~~~~~~~~~~~~~~~\n\nMolecular interactions are modified along an alchemical path using a discrete set of lambda windows.\nFor the transformation of ligand A to ligand B in the binding site, the following steps are carried out, starting with ligand A being fully interacting in the binding site while ligand B is decoupled.\n\n1. Restrain the non-interacting dummy ligand B in the binding site. The contribution of the restraints is calculated analytically.\n2. Turn on the van der Waals (vdW) interactions of ligand B while also turning on orientational restraints on ligand A.\n3. Turn on the electrostatic interactions of ligand B while at the same time turning off the electrostatics of ligand A.\n4. Turn off vdW interactions of ligand A while simultaneously releasing restraints on ligand B.\n5. Release the restraints of the now dummy ligand A analytically.\n\nThe lambda schedule in the solvent phase is similar to the one in the complex, except that a single harmonic distance restraint is\napplied between the respective central atom in the two ligands to keep the ligands apart while doing the alchemical transformation.\nA soft-core potential from Beutler et al. [4]_ is applied to the Lennard-Jones potential to avoid instablilites in intermediate lambda windows.\nThe lambda schedule is defined in the ``lambda_settings`` objects ``lambda_elec_A``, ``lambda_elec_B``,  ``lambda_vdw_A``, ``lambda_vdw_B``,\n``lambda_restraints_A``, and ``lambda_restraints_B``.\n\nSimulation overview\n~~~~~~~~~~~~~~~~~~~\n\nThe :class:`.ProtocolDAG` of the :class:`SepTopProtocol <.SepTopProtocol>` contains :class:`.ProtocolUnit`\\ s from both\nthe complex and solvent transformations.\nThis means that both legs of the thermodynamic cycle are constructed and run sequentially in the same\n:class:`.ProtocolDAG`. This is different from the :class:`.RelativeHybridTopologyProtocol` where the\n:class:`.ProtocolDAG` only runs a single leg of a thermodynamic cycle.\nIf multiple ``protocol_repeats`` are run (default: ``protocol_repeats=3``), the :class:`.ProtocolDAG`\ncontains multiple :class:`.ProtocolUnit`\\ s of both complex and solvent transformations.\nIn that case, every :class:`.ProtocolUnit` would be run N times, where N is the number of ``protocol_repeats``. This means that also the\nselection of the atoms for restraints would be performed multiple times.\n\nSimulation steps\n\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\n\nEach :class:`.ProtocolUnit` (whether complex or solvent) carries out the following steps:\n\n1. Parameterize the system using `OpenMMForceFields <https://github.com/openmm/openmmforcefields>`_ and `Open Force Field <https://github.com/openforcefield/openff-forcefields>`_.\n2. Equilibrate the fully interacting system using a short MD simulation using the same approach as the :class:`.PlainMDProtocol` (in the solvent leg this will include rounds of NVT and NPT equilibration).\n3. Add restraints to the system: Orientational restraints in the complex, a single harmonic distance restraint in the solvent leg.\n4. Create an alchemical system.\n5. Minimize the alchemical system.\n6. Equilibrate and production simulate the alchemical system using the chosen multistate sampling method (under NPT conditions).\n7. Analyze results for the transformation.\n\n\n.. note:: Three different types of multistate sampling (i.e. replica swapping between lambda states) methods can be chosen; HREX, SAMS, and independent (no lambda swaps attempted).\n          By default the HREX approach is selected, this can be altered using ``solvent_simulation_settings.sampler_method`` or ``complex_simulation_settings.sampler_method`` (default: ``repex``).\n\n\nSimulation details\n\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\n\nHere are some details of how the simulation is carried out which are not detailed in the :class:`SepTopProtocol <.SepTopProtocol>`:\n\n* The protocol applies a `LangevinMiddleIntegrator <https://openmmtools.readthedocs.io/en/latest/api/generated/openmmtools.mcmc.LangevinDynamicsMove.html>`_ which uses Langevin dynamics, with the LFMiddle discretization [5]_.\n* A `Monte Carlo barostat <https://docs.openmm.org/latest/api-python/generated/openmm.openmm.MonteCarloBarostat.html>`_ is used in the NPT ensemble to maintain constant pressure.\n\nGetting the free energy estimate\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nThe free energy differences are obtained from simulation data using the `MBAR estimator <https://www.alchemistry.org/wiki/Multistate_Bennett_Acceptance_Ratio>`_ (multistate Bennett acceptance ratio estimator) as implemented in the `PyMBAR package <https://pymbar.readthedocs.io/en/master/mbar.html>`_.\nBoth the MBAR estimates of the two legs of the thermodynamic cycle, and the overall relative binding free energy (of the entire cycle) are obtained,\nwhich is different compared to the results in the :class:`.RelativeHybridTopologyProtocol` where results from two legs of the thermodynamic cycle are obtained separately.\n\nIn addition to the estimates of the free energy changes and their uncertainty, the protocol also returns some metrics to help assess convergence of the results, these are detailed in the :ref:`multistate analysis section <multistate_analysis>`.\n\nSee Also\n--------\n\n**Tutorials**\n\n* :any:`Separated Topologies Free Energies tutorial <../../tutorials/septop_tutorial>`\n\n**Cookbooks**\n\n:ref:`Cookbooks <cookbooks>`\n\n**API Documentation**\n\n* :ref:`OpenMM Protocol Settings <openmm protocol settings api>`\n\nReferences\n----------\n\n* `pymbar <https://pymbar.readthedocs.io/en/stable/>`_\n* `yank <http://getyank.org/latest/>`_\n* `OpenMMTools <https://openmmtools.readthedocs.io/en/stable/>`_\n* `OpenMM <https://openmm.org/>`_\n\n.. [1] Separated topologies--a method for relative binding free energy calculations using orientational restraints, G. Rocklin, D. Mobley, K. Dill;  Chem Phys, 2013; 138(8):085104. doi: 10.1063/1.4792251.\n.. [2] Broadening the Scope of Binding Free Energy Calculations Using a Separated Topologies Approach, H. Baumann, E. Dybeck, C. McClendon, F. Pickard IV, V. Gapsys, L. Pérez-Benito, D. Hahn, G. Tresadern, A. Mathiowetz, D. Mobley, J. Chem. Theory Comput., 2023, 19, 15, 5058–5076\n.. [3] Evaluating the use of absolute binding free energy in the fragment optimisation process, I. Alibay, A. Magarkar, D. Seeliger, P. Biggin, Commun Chem 5, 105 (2022)\n.. [4] Avoiding singularities and numerical instabilities in free energy calculations based on molecular simulations, T.C. Beutler, A.E. Mark, R.C. van Schaik, P.R. Greber, and W.F. van Gunsteren, Chem. Phys. Lett., 222 529–539 (1994)\n.. [5] Unified Efficient Thermostat Scheme for the Canonical Ensemble with Holonomic or Isokinetic Constraints via Molecular Dynamics, Zhijun Zhang, Xinzijian Liu, Kangyu Yan, Mark E. Tuckerman, and Jian Liu, J. Phys. Chem. A 2019, 123, 28, 6056-6079\n"
  },
  {
    "path": "docs/guide/results/index.rst",
    "content": ".. _userguide_results:\n\nResults Gathering\n=================\n\nWith simulations completed,\nthe results of individual simulations can be inspected,\nand entire networks of results analysed.\n\n.. toctree::\n   working_with_results\n   working_with_networks\n"
  },
  {
    "path": "docs/guide/results/working_with_networks.rst",
    "content": ".. _userguide_result_networks:\n\nWorking with networks of results\n================================\n\nAfter running a **network** of free energy calculations,\nwe often want to analyse the corresponding network of results.\n\n.. _userguide_MLE:\n\nConverting relative results to absolute estimates\n-------------------------------------------------\n\nWhen a network of relative free energies has been calculated,\na commonly performed task is to transform these pairwise estimations of **relative** free energy differences (:math:`\\Delta \\Delta G`)\ninto **absolute** free energy differences (:math:`\\Delta G`).\nThis is done using a maximum likelihood estimator (MLE) [1]_,\nas implemented in the `cinnabar`_ package.\nThis approach uses the matrix of relative pairwise measurements and their uncertainties,\nto estimate the overall ranking of ligands.\nTo use this approach the network of pairwise measurements needs to be fully connected,\ni.e. there should be a way to trace a path along pairwise measurements between any two nodes (ligands) on the network.\n\n.. note::\n   The results of a MLE estimation will have a **mean** of 0.0,\n   meaning that there will be some estimates with positive values and some estimates with negative values.\n   These predictions (:math:`\\Delta G_{pred}`) can be shifted to match the magnitude of the experimental data,\n   to satisfy the below equation where the sum is performed over N molecules that have experimental data (:math:`\\Delta G_{exp}`) [2]_.\n\n   .. math::\n\n      \\sum_i^N \\Delta G^i_{exp} = \\sum_i^N \\Delta G^i_{pred}\n\nGathering using the command line\n--------------------------------\n\nAfter running calculations using the :ref:`quickrun command <userguide_quickrun>`,\nthe :ref:`openfe gather <cli_gather>` command offers a way to collate information across many different individual\nsimulations and prepare a table of results.\nThe tool offers a summary of the relative binding affinities (``--report ddg``),\nor their :ref:`corresponding MLE values <userguide_MLE>` (``--report dg``).\n\nUsing cinnabar directly\n-----------------------\n\nThe `cinnabar`_ package can be used from within Python to manipulate networks of free energy estimates.\nA tutorial on using this is provided here :ref:`here <tutorials/plotting_with_cinnabar.nblink>`\n\nSee also\n--------\n\nFor handling the results of a single calculation, please consult :ref:`userguide_individual_results`\n\n.. [1] Optimal Measurement Network of Pairwise Differences, Huafeng Xu, J. Chem. Inf. Model. 2019, 59, 11, 4720-4728\n.. [2] Accurate and Reliable Prediction of Relative Ligand Binding Potency in Prospective Drug Discovery by Way of a Modern Free-Energy Calculation Protocol and Force Field\n       Lingle Wang, Yujie Wu, Yuqing Deng, Byungchan Kim, Levi Pierce, Goran Krilov, Dmitry Lupyan, Shaughnessy Robinson, Markus K. Dahlgren, Jeremy Greenwood, Donna L. Romero, Craig Masse, Jennifer L. Knight, Thomas Steinbrecher, Thijs Beuming, Wolfgang Damm, Ed Harder, Woody Sherman, Mark Brewer, Ron Wester, Mark Murcko, Leah Frye, Ramy Farid, Teng Lin, David L. Mobley, William L. Jorgensen, Bruce J. Berne, Richard A. Friesner, and Robert Abel\n       Journal of the American Chemical Society 2015 137 (7), 2695-2703 DOI: 10.1021/ja512751q\n.. _cinnabar: https://github.com/OpenFreeEnergy/cinnabar\n"
  },
  {
    "path": "docs/guide/results/working_with_results.rst",
    "content": ".. _userguide_individual_results:\n\nWorking with individual results\n===============================\n\nWith :ref:`execution of your calculations <userguide_execution>` completed,\nwe can now start looking at what has been produced.\nThe majority of Protocols will produce estimates of free energy differences between two or more ``ChemicalSystem`` \\s\n(the current exception being the :class:`.PlainMDProtocol` which just simulates the dynamics of a single system).\nBeyond this, the exact data produced by a given Protocol can vary significantly,\nfor example the :class:`.RelativeHybridTopologyProtocol` protocol will produce graphs to assess the quality of the simulation, alongside trajectory data files.\nBy comparison, the :class:`.PlainMDProtocol` will only produce the latter.\nFor exact details on what is produced consult the :ref:`pages for each Protocol<userguide_protocols>`.\n\n.. todo crossref to HREX and MD Protocol docs from issue 743\n\nHow you can inspect these results depends on whether you have executed your simulations\nfrom the command line or a Python script.\n\nFrom command line execution\n---------------------------\n\nIf you had executed your calculation using the :ref:`quickrun <cli_quickrun>` command,\nthen a ``.json`` results log file as well as a directory of files will have been produced.\nThis directory will have various plots and results of analysis, the exact details of which are described\nin the :ref:`pages for each Protocol<userguide_protocols>`.\n\nMost importantly, the ``.json`` results file has ``estimate`` and ``uncertainty`` keys,\nwhich serve the same purpose as the ``get_estimate()`` and ``get_uncertainty()`` methods described below.\nThe full ``json`` results file can be reloaded into a Python session as::\n\n  >>> import gufe\n  >>> import json\n  >>>\n  >>> with open('././Transformation-97d7223f918bbdb0570edc2a49bbc43e_results.json', 'r') as f:\n  ...     results = json.load(f, cls=gufe.tokenization.JSON_HANDLER.decoder)\n  >>> results['estimate']\n  -19.889719513104342 <Unit('kilocalorie_per_mole')>\n  >>> results['uncertainty']\n  0.574685524681712 <Unit('kilocalorie_per_mole')>\n\n\nFrom Python execution\n---------------------\n\nExecuting a :class:`.ProtocolDAG` using :func:`openfe.execute_DAG` will produce a :class:`.ProtocolDAGResult`,\nrepresenting a single iteration of estimating the free energy difference.\nOne or more of these can be put into the ``.gather()`` method of the ``Protocol`` to form a :class:`.ProtocolResult`,\nthis class takes care of the averaging and concatenation of different iterations of the estimation process.\nThis ``ProtocolResult`` class has ``.get_estimate()`` and ``.get_uncertainty()`` methods which return the estimates\nof free energy difference along with its uncertainty.\n\nSee Also\n--------\n\nFor how to deal with multiple results forming a network consult the :ref:`working with networks<userguide_result_networks>`\npage.\n"
  },
  {
    "path": "docs/guide/setup/alchemical_network_model.rst",
    "content": ".. _alchemical_network_model:\n\nAlchemical Networks: Planning a Simulation Campaign\n===================================================\n\nThe ultimate goal of the setup stage is to create an :class:`.AlchemicalNetwork`,\nwhich contains all the information needed for a campaign of simulations, including the \n``openfe`` objects that define the chemical systems and alchemical transformations.\n\n.. TODO provide a written or image based comparison between alchemical and thermodynamic cycles\n\nLike any network, an :class:`.AlchemicalNetwork` can be described in terms\nof nodes and edges between nodes. The nodes are :class:`.ChemicalSystem`\\s,\nwhich describe the specific molecules involved. The edges are\n:class:`.Transformation` objects, which carry all the information about how\nthe simulation is to be performed.\n\n\n.. figure:: img/AlchemicalNetwork.png\n\nIn practice, nodes must be associated with a transformation in order to be\nrelevant in an alchemical network; that is, there are no disconnected nodes.\nThis means that the alchemical network can be fully described by just the\nedges (which contain information on the nodes they connect). Note that this\ndoes not mean that the entire network must be fully connected -- just that\nthere are no solitary nodes.\n\nEach :class:`.Transformation` represents everything that is needed to\ncalculate the free energy differences between the two\n:class:`.ChemicalSystem`\\ s that are the nodes for that edge. In addition to\ncontaining the information for each :class:`.ChemicalSystem`, the\n:class:`.Transformation` also contains a :class:`.Protocol` and, when\nrelevant, atom mapping information for alchemical transformations. The latter\nis often done through a :class:`.LigandNetwork`.\n\n.. _alchemical_network_creation:\n\n3 Ways to Create an Alchemical Network\n--------------------------------------\n\n1. Python API \n^^^^^^^^^^^^^\n\nYou can manually create a :class:`.AlchemicalNetwork` by creating a list\nof :class:`.Transformation` objects. For examples using the Python API,\nsee :ref:`cookbook on creating alchemical networks <cookbook/create_alchemical_network.nblink>`.\n\n2. Python ``NetworkPlanner`` Convenience Classes\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nOpenFE also provides the convenience classes :class:`.RBFEAlchemicalNetworkPlanner` and :class:`.RHFEAlchemicalNetworkPlanner`,\nwhich use the :class:`.RelativeHybridTopologyProtocol` for creating :class:`.AlchemicalNetwork`\\s.\nFor example usage of these convenience classes, see :ref:`Relative Alchemical Network Planners cookbook <cookbook/rfe_alchemical_planners.nblink>`.\n\n.. note::\n   The Network Planners are provided for user convenience. While they cover\n   majority of use cases, they may not currently offer the complete range\n   of options available through the Python API.\n\n3. Command Line ``NetworkPlanner`` \n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nThe Alchemical Network Planners can also be called directly from the \n:ref:`command line interface <userguide_cli_interface>`.\n\nFor example, you can create a Relative Hydration Free Energy (RHFE) network\nusing:\n\n.. code:: bash\n\n    $ openfe plan-rhfe-network -M dir_with_sdfs/\n\nor a Relative Binding Free Energy (RBFE) network using:\n\n.. code:: bash\n\n    $ openfe plan-rbfe-network -p protein.pdb -M dir_with_sdfs/\n\n\nFor more CLI details, see :ref:`RBFE CLI tutorial <rbfe_cli_tutorial>` and the :ref:`userguide_cli_interface`.\n\nSee Also\n--------\n* :ref:`Alchemical Network API reference <Alchemical Network Planning>`\n* :ref:`Chemical Systems UserGuide entry <userguide_chemicalsystems_and_components>`"
  },
  {
    "path": "docs/guide/setup/chemical_systems_and_thermodynamic_cycles.rst",
    "content": ".. _userguide_chemicalsystems_and_components:\n\nComponents, Chemical Systems and Thermodynamic Cycles\n=====================================================\n\nThis page describes the core building blocks used to define simulation states in openfe:\n:class:`.Component`\\s, which describe what is physically present in a system;\n:class:`.ChemicalSystem`\\s, which combine components into a complete end state;\nand thermodynamic cycles, which connect end states via alchemical transformations.\n\n.. _userguide_components:\n\nComponents\n----------\n\nComponents are the composable building blocks that define the chemical\ncomposition of a simulated system. Splitting a system into components serves three purposes:\n\n1. Alchemical transformations can be easily understood by comparing the differences in components.\n2. Components can be reused to compose different systems.\n3. :class:`.Protocol`\\s can apply component-specific behaviour, e.g. different force fields per component.\n\n\nComponent types — overview\n~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n.. list-table::\n   :header-rows: 1\n   :widths: 25 30 45\n\n   * - Component\n     - Role\n     - Key notes\n   * - :class:`.ProteinComponent`\n     - Biological assembly\n     - Typically the contents of a PDB file. May include crystallographic waters and ions (defined as HETATM entries),\n       and disulfide bonds (defined via CONECT records).\n   * - :class:`.SmallMoleculeComponent`\n     - Ligands and cofactors\n     - Can optionally contain atomic partial charges. If present, those will be used in the simulation.\n   * - :class:`.SolventComponent`\n     - Abstract solvent definition\n     - Defines solvent conditions and ion concentration. Does **not** include coordinates or box vectors. Solvent is added by the protocol at runtime.\n   * - :class:`.SolvatedPDBComponent`\n     - Explicitly solvated system\n     - Includes atomic coordinates and box vectors. Solvent is already present,\n       the protocol does not add any further solvation.\n   * - :class:`.ProteinMembraneComponent`\n     - Protein-membrane complex\n     - Subclass of :class:`.SolvatedPDBComponent`. Includes protein, membrane, solvent,\n       and box vectors. Replaces :class:`.ProteinComponent` in membrane systems.\n\n.. _userguide_solvation_models:\n\nAbstract vs explicit solvation\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nThese two approaches are **mutually exclusive**:\n\n* **Abstract solvation** — use a :class:`.SolventComponent`. The protocol adds solvent\n  during system preparation.\n* **Explicit solvation** — use a :class:`.SolvatedPDBComponent` or\n  :class:`.ProteinMembraneComponent`. Solvent molecule coordinates (waters and ions) are explicitly defined in the inputs.\n\nEither define the solvent abstractly, or provide a fully solvated system — do not mix\nboth for the same leg of a transformation.\n\n.. note::\n\n   Some protocols, such as :class:`.SepTopProtocol` and :class:`.AbsoluteBindingProtocol`,\n   use a single :class:`.ChemicalSystem` to represent both the complex and solvent legs.\n   In this case, a :class:`.ChemicalSystem` may contain both a :class:`.SolventComponent`\n   and a :class:`.ProteinMembraneComponent`. However, these apply to *different* legs: the\n   :class:`.SolventComponent` is used only for the solvent leg, and the\n   :class:`.ProteinMembraneComponent` (which is already explicitly solvated) is used only\n   for the complex leg. The mutual exclusivity rule still holds per leg.\n\nBox vectors for explicitly solvated systems\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nThe components :class:`.SolvatedPDBComponent` and :class:`.ProteinMembraneComponent`\nrequire periodic box vectors. These can be provided in three ways:\n\n1. **CRYST record in the PDB file** — OpenMM reads box vectors automatically. No additional arguments are needed::\n\n     membrane_protein = openfe.ProteinMembraneComponent.from_pdb_file('./protein_membrane.pdb')\n\n2. **Manual specification** — box vectors can be provided explicitly as numpy arrays with OpenFF units in OpenMM format via the ``box_vectors`` argument::\n\n     import numpy as np\n     import openff.units as offunit\n\n     box_vectors = np.array([\n         [6.9587, 0.0, 0.0],\n         [0.0, 5.9164, 0.0],\n         [0.0, 0.0, 9.2692]\n     ]) * offunit.nanometer\n\n     membrane_protein = openfe.ProteinMembraneComponent.from_pdb_file(\n         './protein_membrane.pdb', box_vectors=box_vectors\n     )\n\n3. **Inference from atomic coordinates** — box vectors can be estimated from the atomic\n   positions by passing ``infer_box_vectors=True``::\n\n     membrane_protein = openfe.ProteinMembraneComponent.from_pdb_file(\n         './protein_membrane.pdb', infer_box_vectors=True\n     )\n\n   .. warning::\n\n      Inferring box vectors from atomic positions can be inaccurate if the PDB originates\n      from a previous simulation where atoms may be distributed across periodic images.\n\n\n.. _userguide_chemical_systems:\n\nChemicalSystem\n--------------\n\nA :class:`.ChemicalSystem` is composed of components that together describe a model of the system to be simulated.\nsimulated system. It represents the **end state** of an alchemical transformation\nand is the primary input a :class:`.Protocol` consumes to define a simulation state.\n\n**What a ChemicalSystem defines**\n\n* Exact atomic information (including protonation state) of protein, ligands,\n  cofactors, and any crystallographic waters.\n* Atomic positions of all explicitly defined components such as ligands or proteins.\n* The abstract or explicit definition of the solvent environment (SolventComponent).\n\n**What a ChemicalSystem does NOT define**, and are instead handled by the Protocol:\n\nAny simulation parameters including:\n* Forcefield applied to any component, including water model or virtual particles.\n* Thermodynamic conditions (e.g. temperature or pressure).\n* These are handled by the :class:`.Protocol`.\n\n.. _userguide_system_composition:\n\nSystem composition examples\n---------------------------\n\nThe components that make up each :class:`.ChemicalSystem` depend on the protocol and\nthe nature of the system. The table below summarises the composition for each combination.\n\n\n.. note::\n\n   Protocol-specific behaviour:\n   For :class:`.SepTopProtocol` and :class:`.AbsoluteBindingProtocol`, a single\n   :class:`.ChemicalSystem` represents both legs of the thermodynamic cycle. The protocol\n   determines internally what is the complex leg and what is the solvent leg.\n   This differs from the :class:`.RelativeHybridTopologyProtocol`, where each leg (e.g. complex and solvent) is defined by\n   separate :class:`.ChemicalSystem`\\s. This behaviour is expected to change in future versions.\n\n.. list-table::\n   :header-rows: 1\n   :widths: 20 40 40\n\n   * - System\n     - :ref:`RBFE <userguide_relative_hybrid_topology_protocol>` (:class:`.RelativeHybridTopologyProtocol`)\n     - :ref:`SepTop <userguide_septop_protocol>` / :ref:`ABFE <userguide_abfe_protocol>` (:class:`.SepTopProtocol`, :class:`.AbsoluteBindingProtocol`)\n   * - **Standard protein–ligand**\n     - | **Complex leg:**\n       | :class:`.ProteinComponent` + :class:`.SmallMoleculeComponent`\\s + :class:`.SolventComponent`\n       |\n       | **Solvent leg:**\n       | :class:`.SmallMoleculeComponent`\\s + :class:`.SolventComponent`\n     - | **Single ChemicalSystem (both legs):**\n       | :class:`.ProteinComponent` + :class:`.SmallMoleculeComponent`\\s + :class:`.SolventComponent`\n   * - **Membrane system**\n     - | **Complex leg:**\n       | :class:`.ProteinMembraneComponent` + :class:`.SmallMoleculeComponent`\\s\n       | *(no* :class:`.SolventComponent` *— already explicitly solvated)*\n       |\n       | **Solvent leg:**\n       | :class:`.SmallMoleculeComponent`\\s + :class:`.SolventComponent`\n     - | **Single ChemicalSystem (both legs):**\n       | :class:`.ProteinMembraneComponent` + :class:`.SmallMoleculeComponent`\\s + :class:`.SolventComponent`\n       | *(protocol applies* :class:`.SolventComponent` *only in the solvent leg)*\n\n\nThermodynamic Cycles\n--------------------\n\nA thermodynamic cycle can be described as a set of :class:`.ChemicalSystem`\\s (nodes) connected by\nalchemical transformations (edges). The :class:`.Protocol` defines how the\n:class:`.ChemicalSystem`\\s map onto the cycle and how they are used in practice.\nThe same :class:`.ChemicalSystem` can be reused across multiple thermodynamic states\ndepending on the protocol. For details of which end states to construct, consult the\n:ref:`pages for each specific Protocol <userguide_protocols>`.\n\nHybrid topology RBFE example\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nAs an example, the relative binding free energy cycle requires four\n:class:`.ChemicalSystem`\\s — one for each node in the cycle:\n\n.. figure:: ../protocols/img/rbfe_thermocycle.png\n   :scale: 40%\n   :alt: RBFE thermodynamic cycle\n\n   Illustration of the relative binding free energy thermodynamic cycles and the chemical systems at each end state.\n\n::\n\n  import openfe\n\n  # two small molecules defined in a molfile format\n  ligand_A = openfe.SmallMoleculeComponent.from_sdf_file('./ligand_A.sdf')\n  ligand_B = openfe.SmallMoleculeComponent.from_sdf_file('./ligand_B.sdf')\n  # a complete biological assembly\n  protein = openfe.ProteinComponent.from_pdb_file('./protein.pdb')\n  # defines an aqueous solvent environment, with a concentration of ions\n  solvent = openfe.SolventComponent(smiles='O')\n\n  # ligand_A + protein + solvent\n  ligand_A_complex = openfe.ChemicalSystem(components={'ligand': ligand_A, 'protein': protein, 'solvent': solvent})\n  # ligand_B + protein + solvent\n  ligand_B_complex = openfe.ChemicalSystem(components={'ligand': ligand_B, 'protein': protein, 'solvent': solvent})\n  # ligand_A + solvent\n  ligand_A_solvent = openfe.ChemicalSystem(components={'ligand': ligand_A, 'solvent': solvent})\n  # ligand_B + solvent\n  ligand_B_solvent = openfe.ChemicalSystem(components={'ligand': ligand_B, 'solvent': solvent})\n\nExplicitly solvated variant\n~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nWhen using a :class:`.SolvatedPDBComponent` or :class:`.ProteinMembraneComponent`, replace :class:`.ProteinComponent`\nand :class:`.SolventComponent` for the complex leg. No separate :class:`.SolventComponent`\nis required:\n\n::\n\n  # explicitly solvated protein-membrane complex (box vectors read from CRYST1 record)\n  protein_membrane = openfe.ProteinMembraneComponent.from_pdb_file('./protein_membrane.pdb')\n\n  # ligand_A + explicitly solvated protein-membrane — no SolventComponent needed\n  ligand_A_complex = openfe.ChemicalSystem(components={'ligand': ligand_A, 'protein_membrane': protein_membrane})\n\n\nSee Also\n--------\n\n* To see how to construct a :class:`.ChemicalSystem` from your files, see :ref:`the cookbook entry on loading molecules <Loading Molecules>`\n* For details of which thermodynamic cycles to construct, consult the :ref:`pages for each specific Protocol <userguide_protocols>`\n"
  },
  {
    "path": "docs/guide/setup/creating_atom_mappings_and_scores.rst",
    "content": ".. _userguide_mappings:\n.. _Creating Atom Mappings:\n\nCreating Atom Mappings\n======================\n\n``Atom Mapping`` objects are used to define the relationship between\n:ref:`components <userguide_components>` from different :class:`.ChemicalSystem`\\s.\nThis guide will show how ``Atom Mappings``  can describe the transformation between a pair of ligands.\n\nGenerating Mappings\n-------------------\n\nThe :class:`.LigandAtomMapper` takes pairs of :class:`openfe.SmallMoleculeComponent`\\s and returns zero\n(in the case that no mapping can be found) or more possible mappings.\n\nBuilt in to the ``openfe`` package are bindings to the `Lomap <https://github.com/OpenFreeEnergy/Lomap>`_ package,\nincluding the :class:`.openfe.setup.LomapAtomMapper`, which uses an MCS approach based on RDKit.\n\n.. TODO: insert example output\n\nThis is how we can create a mapping between two ligands: \n\n.. code::\n\n   import openfe\n   from openfe import setup\n\n   # as previously detailed, load a pair of ligands\n   m1 = SmallMoleculeComponent(...)\n   m2 = SmallMoleculeComponent(...)\n\n   # first create an atom mapper\n   mapper = setup.LomapAtomMapper(threed=True)\n   # this returns an iterable of possible mappings\n   mapping_gen = mapper.suggest_mappings(m1, m2)\n   # extract all possible mappings into a list\n   mappings = list(mapping_gen)\n   # Lomap always produces a single Mapping, so extract it from the list\n   mapping = mappings[0]\n\n\nThe two molecules passed into the ``suggest_mappings()`` method are then referred to\nas ``componentA`` and ``componentB`` (in the above example, ``m1`` is ``componentA``  and  ``m2`` is ``componentB``).\n\nThe atom mapping can be accessed through the ``componentA_to_componentB`` attribute, which returns a dictionary \nwhere keys refer to the indices of atoms in the \"A\" component, and values refer to indices of atoms in the \"B\" component.\nIf a given index does not appear, then it is unmapped.\n\n\n.. note::\n   Like the Component objects, a Mapping object is immutable once created!\n\n\nVisualising Mappings\n--------------------\n\nIn an interactive notebook we can view a 2D representation of the mapping.\nIn this view,\natoms that are deleted are coloured red, while atoms that undergo an elemental transformation are coloured blue.\nSimilarly, bonds that are deleted are coloured red,\nwhile bonds that change (either bond order change or element change), are coloured blue.\n\n\n.. image:: img/2d_mapping.png\n   :width: 90%\n   :align: center\n   :alt: Sample output of 2d mapping visualisation\n\n\nThese 2D mappings can be saved to file using the :func:`LigandAtomMapping.draw_to_file()` method.\n\nWith the ``py3dmol`` package, we can inspect the spatial overlap of the mapping in 3D.\nIn a notebook, this produces an interactive rotatable view of the mapping.\nThe left and rightmost views show the \"A\" and \"B\" molecules\nwith coloured spheres on each showing the correspondence between atoms.\nThe centre view shows both molecules overlaid, allowing the spatial correspondence to be directly viewed.\n\n.. code::\n\n   from openfe.utils import visualization_3D\n\n   view = mapping.view_3d()\n\n\n.. image:: img/3d_mapping.png\n   :width: 90%\n   :align: center\n   :alt: Sample output of view_3d() function\n\n\nThe cartesian distance between pairs of atom mapping is also available via the :meth:`.get_distances()` method.\nThis returns a numpy array.\n\n.. code::\n\n   mapping.get_distances()\n\n.. _Scoring Atom Mappings:\n\nScoring Mappings\n----------------\n\nMapping **scorers**, or \"scoring functions\", evaluate the quality of an atom mapping and\ncan be used as objective functions for optimizing ligand networks.\n**Scorers** take a :class:`.LigandAtomMapping` object and return a value from 0.0 (indicating a terrible mapping)\nto 1.0 (indicating a great mapping). \n\nBecause **scorers** are normalized, it is possible to use multiple **scorers** together.\nFor example, the built-in Lomap scorer :func:`default_lomap_score` combines several criteria\n(such as the number of heavy atoms, if certain chemical changes are present,\nand if ring sizes are being mutated), into a single value.\nIt is possible to combine scoring functions in this way because each scoring function returns a normalized value.\n\n\n.. code::\n\n   from openfe.setup.lomap_scorers\n\n   mapping = next(mapper.suggest_mappings(m1, m2))\n\n   score = lomap_scorers.default_lomap_scorer(mapping)\n"
  },
  {
    "path": "docs/guide/setup/creating_ligand_networks.rst",
    "content": ".. _userguide_ligand_network:\n\nDefining the Ligand Network\n===========================\nA :class:`.LigandNetwork` is a network where nodes are :class:`.SmallMoleculeComponent`\\ s and edges are :class:`.LigandAtomMapping`\\ s.\nFor example, a :class:`.LigandNetwork` with drug candidates as nodes can be used to conduct a free energy campaign and compute ligand rankings.\n\n**openfe** includes an interface to common :any:`Ligand Network Planners`, which are implemented in OpenFE's `konnektor <https://github.com/OpenFreeEnergy/konnektor>`_ package.\n(See `konnektor's documentation <https://konnektor.openfree.energy/en/latest/>`_ for more information on network generators.)\n\nA :class:`.LigandNetwork` is constructed from :class:`.SmallMoleculeComponent`, which represent the nodes and optionally :class:`.LigandAtomMapping`, which represent the edges of the network.\nA :class:`.LigandAtomMapping` can have a :ref:`score associated with the mapping <Scoring Atom Mappings>` which can be used by some network generators to construct more efficient network topologies.\n\nBelow is an example of a ``LigandNetwork`` with scores assigned to each atom mapping:\n\n.. image:: img/ligand_network.png\n   :width: 80%\n   :align: center\n   :alt: Concept of a simple MST ligand network\n\n\nGenerating Ligand Networks\n--------------------------\n\n:class:`.LigandNetwork` generation can typically described by three steps:\n\n1. Generate the :ref:`Atom Mappings<Creating Atom Mappings>`  of all pairwise combinations of :class:`.SmallMoleculeComponent`\\ s\n2. :ref:`Calculate scores<Scoring Atom Mappings>` for each :class:`.LigandAtomMapping`\n3. Build a :class:`.LigandNetwork` with all possible mappings directed by their scores.\n\n.. code:: python\n\n   import openfe\n   from openfe import setup\n\n   # load a set of ligands\n   mols = [SmallMoleculeComponent.from_rdkit(x) for x in rdmols]\n\n   # generate the required mapper, scorer, and planner objects\n   mapper = setup.KartografAtomMapper()\n   scorer = setup.lomap_scorers.default_lomap_score\n   network_planner =  setup.ligand_network_planning.generate_minimal_spanning_network\n\n   # plan the ligand network\n   ligand_network = network_planner(ligands=mols, mappers=[mapper], scorer=scorer)\n\nPractical information on generating ligand networks can be found in our :ref:`cookbook for ligand network generation <cookbook/generate_ligand_network.nblink>`.\n\n.. note::\n   Like the Component objects, a ``LigandNetwork`` object is immutable once created!\n"
  },
  {
    "path": "docs/guide/setup/defining_protocols.rst",
    "content": ".. _defining-protocols:\n\nProtocols in OpenFE\n============================\n\nA :class:`.Protocol` is a computational method for estimating the free energy difference between two chemical systems.\n\nJust as there are multiple possible methods for estimating free energy differences,\nthere are multiple available ``Protocol``\\s to choose from.\n\nFor example, included in the ``openfe`` package are the following:\n   * :class:`.RelativeHybridTopologyProtocol`\n   * :class:`.AbsoluteBindingProtocol`\n   * :class:`.SepTopProtocol`\n   * :class:`.AbsoluteSolvationProtocol`\n   * :class:`.PlainMDProtocol`\n\nMore protocols are in development, and a full list of available protocols\ncan be found at :ref:`userguide_protocols`.\n\nBecause :class:`.Protocol`\\s share a common interface for how they are created and executed,\nit is relatively straightforward to try out a new method,\nor benchmark several to choose the best for a particular project.\n\nDefining Settings and Creating Protocols\n----------------------------------------\n\nA ``Settings`` object contains all the parameters needed by a ``Protocol``.\nEach ``Protocol`` has a ``.default_settings()`` method, which will provide a sensible default\nstarting point and relevant documentation.\n\n.. TODO: print what a settings object looks like, or how you might define custom settings\n\nFor example, to create an instance of the OpenMM RFE Protocol with default settings::\n\n   from openfe.protocols import openmm_rfe\n\n   settings = openmm_rfe.RelativeHybridTopologyProtocol.default_settings()\n   protocol = openmm_rfe.RelativeHybridTopologyProtocol(settings)\n\n``Protocol`` objects **cannot be modified once created**. This is crucial for data provenance.\nTherefore, the ``Settings`` objects must be customised *before* the ``Protocol`` object is created.\nFor example, to customise the production run length of the RFE Protocol::\n\n   from openfe.protocols import openmm_rfe\n\n   settings = openmm_rfe.RelativeHybridTopologyProtocol.default_settings()\n   settings.simulation_settings.production_length = '10 ns'\n\n   protocol = openmm_rfe.RelativeHybridTopologyProtocol(settings)\n\nAdaptive Settings\n~~~~~~~~~~~~~~~~~\n\n.. warning::\n\n  The ``_adaptive_settings()`` method is experimental and subject to change.\n\nIn addition to the ``.default_settings()`` method, some protocols\nprovide an ``_adaptive_settings`` method. This method generates recommended settings\nbased on properties of the input :class:`.ChemicalSystem`\\s and, where required, the :class:`.AtomMapping`.\n\nFor example::\n\n   from openfe.protocols import openmm_rfe\n\n   settings = openmm_rfe.RelativeHybridTopologyProtocol._adaptive_settings(\n       stateA=stateA,\n       stateB=stateB,\n       mapping=mapping,\n   )\n\n   protocol = openmm_rfe.RelativeHybridTopologyProtocol(settings)\n\nThe adaptive settings may modify parameters based on properties of the input systems.\nFor example (:class:`.RelativeHybridTopologyProtocol`):\n\n* Transformations involving a change in net charge use a larger number of lambda windows and longer production simulations.\n* If both states contain a :class:`.ProteinComponent`, the solvation padding is set to 1 nm.\n\nOptionally, you can pass a preexisting settings object to the ``_adaptive_settings`` method via the ``initial_settings`` argument. If provided, an adapted copy of these settings will be returned instead\nof using the default settings.\n\nIn systems containing membrane-protein complexes (i.e. using a\n:class:`.ProteinMembraneComponent`), adaptive settings select a membrane-appropriate barostat, the ``MonteCarloMembraneBarostat``.\n\nCreating Transformations from Protocols\n-----------------------------------------\n\nWith only ``settings`` defined, a ``Protocol`` contains no chemistry-specific information.\nThis means that a single ``Protocol`` object can be applied to multiple pairs of ``ChemicalSystem`` objects\nto measure each free energy difference.\n\nThe :class:`.Transformation` class connects two ``ChemicalSystem`` objects with a ``Protocol``, and\noften a :ref:`AtomMapping <userguide_mappings>` (depending on the system).\n\nA ``Transformation`` object is then capable of creating computational work via the :func:`.Transformation.create()` method.\nFor further details on this, refer to the :ref:`userguide_execution` section.\n\nFinally, a ``Protocol`` is responsible for using the data generated in this process to perform further analysis,\nsuch as generating an estimate of the free energy difference.\nFor further details on this refer to the :ref:`userguide_results` section,\nor the details of each method in :ref:`userguide_protocols`.\n"
  },
  {
    "path": "docs/guide/setup/index.rst",
    "content": ".. _userguide_setup:\n\nSimulation Setup\n================\n\nThis section provides details on how to set up a free energy calculation or MD simulations.\n\nAll protocols in OpenFE follow the same general structure: \n\n* Reading in input structures and creating :class:`.ChemicalSystem` \\s\n* Defining the :class:`.Protocol` with specific `ProtocolSettings`.\n* Creating :class:`.LigandAtomMapping` \\s for relative free energy calculation `Protocols`.\n\n.. image:: img/setup_1x.png\n   :width: 70%\n   :align: center\n   :alt: Concept of a ChemicalSystems and Transformations\n\nThe image below demonstrates how, for relative free energy calculations, you plan a\nnetwork of ligand transformations starting from input SDF / MOL2 / PDB files:\n\n.. image:: img/setup_2x.png\n   :width: 70%\n   :align: center\n   :alt: Concept of a LigandNetwork and AlchemicalNetwork\n\nThe procedure for setting up a simulation depends on the\ntype of free energy calculation you are running. More detailed\ninstructions can be found in the following sections:\n\n.. toctree::\n   :maxdepth: 1\n\n   chemical_systems_and_thermodynamic_cycles\n   creating_atom_mappings_and_scores\n   defining_protocols\n   creating_ligand_networks\n   alchemical_network_model\n\nTo set up your alchemical network using the Python interface, but run it using the CLI,\nyou will need to export the network in the same format used by the CLI.\nSee :ref:`dumping transformations <dumping_transformations>` for more details.\n"
  },
  {
    "path": "docs/guide/troubleshooting.rst",
    "content": "\nTroubleshooting Simulations \n===========================\n\nThis guide covers tips and strategies for troubleshooting simulation failures.\n\nLog Debug information\n---------------------\n\n.. note::\n\n   When using a scheduler (e.g. SLURM), be sure to specify output files for standard out and standard error.\n   For example, when using SLURM both ``--output=`` and ``--error=`` must be set to view errors.\n\nOne of the first troubleshooting steps is to increase the verbosity of the logging.\n``openfe`` uses Python's native logging library which can be `configured <https://docs.python.org/3/howto/logging.html#configuring-logging>`_ either using a Python API or a configuration file.\n\n.. warning::\n\n   **We do not recommend setting the log level to debug for production runs,** as the logging may slow down the simulation and add a lot of noise to the output.\n\nWhen using ``openfe quickrun``, the configuration file is more convenient.\nBelow is an example logging configuration file that can be used to set the log level to ``DEBUG``:\n\n.. code-block:: ini\n\n   [loggers]\n   keys=root\n   \n   [handlers]\n   keys=stdout\n   \n   [formatters]\n   keys=standardFormatter,msgOnly\n   \n   [handler_stdout]\n   class=StreamHandler\n   level=DEBUG\n   formatter=standardFormatter\n   args=(sys.stdout,)\n   \n   [logger_root]\n   level=DEBUG\n   handlers=stdout\n   \n   [formatter_standardFormatter]\n   format=%(asctime)s %(levelname)s %(name)s: %(message)s\n   \n   [formatter_msgOnly]\n   format=%(message)s\n\nSave this configuration file as ``debug_logging.conf`` and then run ``openfe quickrun`` with the ``--log`` flag, for example:\n\n.. code-block:: bash\n\n   $ openfe --log debug_logging.conf quickrun -d results/ -o results/result_lig_ejm_31_solvent_lig_ejm_42_solvent.json transformations/rbfe_lig_ejm_31_solvent_lig_ejm_42_solvent.json\n\nNote that the ``--log debug_logging.conf`` argument goes between ``openfe`` and ``quickrun`` on the command line.\n\nThis will cause every package to log at the debug level, which may be quite verbose and noisy but should aid in identify what is going on right before the exception is thrown.\n\nJAX warnings\n------------\n\nWe use ``pymbar`` to analyze the free energy of the system.\n``pymbar`` uses JAX to accelerate computation.\nThe JAX library can utilize a GPU to further accelerate computation.\nIf the necessary libraries for GPU acceleration are not installed and JAX detects a GPU, JAX will print a warning like this:\n\n.. code-block:: bash\n\n   WARNING:2025-06-10 09:01:40,857:jax._src.xla_bridge:966: An NVIDIA GPU may be present on this machine, but a CUDA-enabled jaxlib is not installed. Falling back to cpu.\n\nThis warning does not mean that the *molecular dynamics* simulation will fall back to using the CPU.\nThe simulation will still use the computing platform specified in the settings.\n\nPYMBAR_DISABLE_JAX\n------------------\n\nDue to a suspected memory leak in the JAX acceleration code in ``pymbar`` we disable JAX acceleration by default.\nThis memory leak may result in the simulation crashing, wasting compute time.\nThe error message may look like this:\n\n.. code-block:: bash\n\n   LLVM compilation error: Cannot allocate memory\n   LLVM ERROR: Unable to allocate section memory!\n\nWe have decided to disable JAX acceleration by default to prevent wasted compute.\nHowever, if you wish to use the JAX acceleration, you may set ``PYMBAR_DISABLE_JAX`` to ``TRUE`` (e.g. put ``export PYMBAR_DISABLE_JAX=FALSE`` in your submission script before running ``openfe quickrun``).\nFor more information, see these issues on github:\n\n- https://github.com/choderalab/pymbar/issues/564\n- https://github.com/OpenFreeEnergy/openfe/issues/1534\n- https://github.com/OpenFreeEnergy/openfe/issues/1654\n"
  },
  {
    "path": "docs/guide/under_the_hood.rst",
    "content": ".. _under-the-hood:\n\nUnder the Hood\n==============\n\n.. module:: openfe\n    :noindex:\n\nIf you want to implement your own atom mapper or free energy procedure, or you want to do something a bit more bespoke, it's helpful to understand how OpenFE thinks about individual alchemic mutation specifications. A :class:`Transformation` stores all the information needed to run an alchemic mutation from one chemical system to another and is the basic unit of an OpenFE simulation campaign. Indeed, :class:`Transformation` objects describe the edges of the graph in the :class:`AlchemicalNetwork` class.\n\n.. container:: deflist-flowchart\n\n    * Setup\n        - .. container:: flowchart-sidebyside\n\n            -   -\n                  .. rst-class:: flowchart-spacer\n                -\n\n                - :class:`Protocol`\n                    Simulation procedure for an alchemic mutation.\n\n                    .. rst-class:: arrow-down arrow-tail arrow-combine-right\n                -\n\n            -   - Chemical component definition\n                    SDF, PDB, RDKit, OpenFF Molecule, solvent spec, etc.\n\n                  .. rst-class:: arrow-down arrow-tail\n                - :any:`Loading Molecules`\n\n                - .. container:: flowchart-sidebyside\n\n                    -   -\n                            .. rst-class:: arrow-down arrow-head arrow-combine-right\n                        -\n\n                        - :class:`SmallMoleculeComponent`\n                            The ligands that will be mutated.\n\n                            .. rst-class:: arrow-down\n                        - :any:`Creating Atom Mappings`\n\n                        - :class:`LigandAtomMapping`\n                            Corresponds atoms in one small molecule to those in another.\n\n                            .. rst-class:: arrow-down arrow-tail arrow-combine\n                        -\n\n                    -   -\n                            .. rst-class:: arrow-down arrow-head arrow-combine-left\n                        -\n\n                        - :class:`SmallMoleculeComponent`, :class:`SolventComponent` and :class:`ProteinComponent`\n                            The components that make up the chemical system.\n\n                            .. rst-class:: arrow-down arrow-multiple-combine\n                        - :any:`Assembling into ChemicalSystems`\n\n                        - :class:`ChemicalSystem`\n                            Each of the chemical systems, composed of components, that the :class:`Transformation` mutates between.\n\n                            .. rst-class:: arrow-down arrow-tail arrow-combine-left arrow-multiple\n                        -\n\n            .. rst-class:: arrow-down arrow-head\n        -\n\n        - :class:`Transformation`\n            A single alchemic mutation from one chemical system to another.\n\n      .. rst-class:: arrow-down\n    *\n\n    * Run\n        - :class:`Transformation`\n            A single alchemic mutation from one chemical system to another.\n\n            .. rst-class:: arrow-down\n        -\n\n        - :class:`ProtocolDAG`\n            A directed acyclic graph describing how to compute a :class:`Transformation`.\n\n        - .. container:: flowchart-sidebyside\n\n            -\n                -\n                    .. rst-class:: arrow-down arrow-multiple\n                -\n\n                - :class:`ProtocolUnit`\n                    A single unit of computation within a :class:`ProtocolDAG`\n\n                    .. rst-class:: arrow-down\n                -\n\n                - :class:`ProtocolUnitResult`\n                    The result of a completed :class:`ProtocolUnit`\n\n                    .. rst-class:: arrow-down arrow-multiple-combine\n                -\n\n            -\n                -\n                    .. rst-class:: arrow-down\n                - :any:`executors`\n\n        - :class:`ProtocolDAGResult`\n            A completed transformation.\n\n      .. rst-class:: arrow-down\n    *\n\n    * Gather\n        - .. container:: flowchart-sidebyside\n\n            -\n\n                - :class:`Transformation`\n                    The specification for the alchemic mutation.\n\n                    .. rst-class:: arrow-down\n                -\n\n                - :class:`Protocol`\n                    A completed single run of a transformation.\n\n                    .. rst-class:: arrow-down arrow-combine-right arrow-tail\n                -\n\n            -\n\n                - :class:`ProtocolResult`\n                    A completed single run of a transformation.\n\n                    .. rst-class:: arrow-down arrow-combine-left arrow-multiple arrow-tail\n                -\n\n            .. rst-class:: arrow-down arrow-head\n        -\n\n        - :class:`ProtocolDAGResult`\n                A completed transformation with multiple user-defined replicas.\n\n"
  },
  {
    "path": "docs/index.rst",
    "content": ".. template taken from SciPy who took it from Pandas (keep the chain going)\n\n.. module:: openfe\n\n=====================================\nWelcome to OpenFE's documentation!\n=====================================\n\nThe **OpenFE** toolkit provides a free and open-source framework for alchemical free energy calculations.\nUsing this toolkit you can plan, execute, and analyze free energy calculations using a variety of methods.\n\n**Useful Links**:\n`OpenFE Website <https://openfree.energy/>`__ |\n`Example Tutorial notebooks <https://github.com/OpenFreeEnergy/ExampleNotebooks/>`__ |\n`Source Repository <https://github.com/OpenFreeEnergy/openfe/>`__ |\n`Issues & Ideas <https://github.com/OpenFreeEnergy/openfe/issues/>`__\n\n.. grid:: 1 2 2 4\n    :gutter: 3\n\n    .. grid-item-card:: :fas:`download` Install openfe\n        :text-align: center\n        :link: installation\n        :link-type: doc\n\n        Follow our installation guide to get **openfe** running on your machine!\n\n    .. grid-item-card:: :fas:`laptop-code` CLI Quickstart\n        :text-align: center\n        :link: tutorials/rbfe_cli_tutorial\n        :link-type: doc\n\n        Get started with **openfe**\\'s command line interface.\n\n    .. grid-item-card:: :fas:`person-chalkboard` Tutorials\n        :text-align: center\n        :link: tutorials/index\n        :link-type: doc\n\n        Step-by-step examples showing how to use the OpenFE toolkit.\n\n    .. grid-item-card:: :fas:`book-open-reader` User Guide\n        :text-align: center\n        :link: guide/index\n        :link-type: doc\n\n        Explanations of key concept underlying the OpenFE toolkit.\n\n    .. grid-item-card:: :fas:`table-list` Cookbooks\n        :text-align: center\n        :link: cookbook/index\n        :link-type: doc\n\n        How-to guides for common tasks.\n\n    .. grid-item-card:: :fas:`code` API Reference\n        :text-align: center\n        :link: reference/index\n        :link-type: doc\n\n        Comprehensive details of the **openfe** Python and CLI APIs.\n\n    .. grid-item-card:: :fas:`gears` Protocols\n        :text-align: center\n        :link: guide/protocols/index\n        :link-type: doc\n\n        Details of the specific Free Energy Protocols included in **openfe**.\n\n    .. grid-item-card:: :fas:`clock-rotate-left` Changelog \n        :text-align: center\n        :link: CHANGELOG\n        :link-type: doc\n\n        A history of **openfe** releases.\n\n.. toctree::\n   :maxdepth: 2\n   :hidden:\n\n   installation\n   tutorials/index\n   guide/index\n   cookbook/index\n   reference/index\n   CHANGELOG\n\nOther OpenFE Ecosystem Projects:\n--------------------------------\n\n**openfe** is Open Free Energy's user-facing software for performing alchemical free energy calculations.\nBelow are other software projects the Open Free Energy team maintains, many of which are used by **openfe** itself.\n\n* `konnektor <https://github.com/OpenFreeEnergy/konnektor/>`_: free energy network planning, modification, and analysis\n* `kartograf <https://github.com/OpenFreeEnergy/kartograf/>`_: atom mappings focusing on 3D geometries\n* `Lomap <https://github.com/OpenFreeEnergy/Lomap/>`_: planning perturbation networks for free energy calculations\n* `cinnabar <https://github.com/OpenFreeEnergy/cinnabar/>`_ (formerly arsenic): plotting free energy calculation results\n* `gufe <https://gufe.openfree.energy/en/latest/>`_ : data structures and models underlying the OpenFE ecosystem\n\nCommunity-Developed Projects:\n-----------------------------\n\n* `alchemiscale <https://docs.alchemiscale.org/en/stable/>`_: high-throughput alchemical free energy execution, developed by `Datryllic <https://datryllic.com/>`_.\n"
  },
  {
    "path": "docs/installation.rst",
    "content": "Installation\n============\n\n**openfe** is currently only compatible with POSIX systems (macOS and UNIX/Linux). \nSee `Supported Hardware`_ for more details.\n\nWe try to follow `SPEC0 <https://scientific-python.org/specs/spec-0000/>`_ as far as minimum supported dependencies, with the following caveats:\n\n- OpenMM 8.0, 8.1.2, 8.2, and 8.4 - **OpenMM v8.3.0 is not supported**\n\nWhen you install **openfe** through any of the methods described below, you will install both the core library and the command line interface (CLI).\n\nInstallation with ``micromamba`` (recommended)\n----------------------------------------------\n\nOpenFE recommends ``micromamba`` as a package manager for most users, as it is a lightweight version of ``mamba``, which is a must faster drop-in replacement for ``conda`` .\n\nIf you prefer to use ``mamba`` or ``conda`` instead of ``micromamba`` because of its additional functionality, we suggest following our `Miniforge Installation Guide`_.\n\nIn the instructions below, we will use the ``micromamba`` command, but you can use ``conda`` or ``mamba`` in the same way.\n\nOnce you have one of `micromamba <https://mamba.readthedocs.io/en/latest/installation/micromamba-installation.html>`_, `mamba <https://mamba.readthedocs.io/en/latest/installation/mamba-installation.html>`_, or `conda <https://docs.conda.io/projects/conda/en/stable/user-guide/install/index.html>`_ installed, you can continue to the **openfe** installation instructions below.\n\n.. note::\n\n  After installing, you must run ``micromamba activate openfe`` in each shell session where you want to use **openfe**!\n\n\nReproducible builds with a ``conda-lock`` file\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n.. _conda-lock: https://github.com/conda/conda-lock?tab=readme-ov-file#conda-lock\n\nWe recommend building from **openfe**'s ``conda-lock`` file in most cases, since it allows for building packages in a reproducible way on multiple platforms.\n\nUnlike the single file installer, an internet connection is required to install from a ``conda-lock`` file.\n\nThe ``conda-lock`` files for the latest version of **openfe** can be downloaded with ::\n\n  $ curl -LOJ https://github.com/OpenFreeEnergy/openfe/releases/latest/download/openfe-conda-lock.yml\n\nIf a particular version is required, the URL will look like this (using the ``openfe 1.6.1`` release as an example) ::\n\n  $ curl -LOJ https://github.com/OpenFreeEnergy/openfe/releases/download/v1.6.1/openfe-1.6.1-conda-lock.yml\n\n``micromamba`` supports ``conda-lock`` files and can be used directly to create a virtual environment ::\n\n    $ micromamba create -n openfe --file openfe-conda-lock.yml\n    $ micromamba activate openfe\n\n\n.. note::\n\n   If you are having trouble building from the conda-lock file, you may need to build directly with ``conda-lock``.\n   We recommend installing ``conda-lock`` in a new virtual environment.\n   This will reduce the chance of dependency conflicts ::\n\n       $ # Install conda lock into a virtual environment\n       $ micromamba create -n conda-lock conda-lock\n       $ # Activate the environment to use the conda-lock command\n       $ micromamba activate conda-lock\n       $ conda-lock install -n openfe openfe-conda-lock.yml\n       $ micromamba activate openfe\n\nTo make sure everything is working, :ref:`run the tests <testing>`.\n\nWith that, you should be ready to use **openfe**!\n\nStandard Installation with ``micromamba``\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nThere may be some instances where you don't want to use a lock-file, e.g. you may want to specify a dependency that differs from the lock file.\n\nIn these cases, you can simply install **openfe** from conda-forge:\n\n.. parsed-literal::\n\n  micromamba create -c conda-forge -n openfe openfe=\\ |version|\n  micromamba activate openfe\n\n\nSingle file installer\n---------------------\n\n.. warning::\n\n   The single file installer may modify your ``.bashrc`` in a way that requires manual intervention to access your previous ``conda`` installation\n\n.. _releases on GitHub: https://github.com/OpenFreeEnergy/openfe/releases\n\nSingle file installers are available for x86_64 Linux and MacOS.\nThey are attached to our `releases on GitHub`_ and can be downloaded with a browser or ``curl`` (or similar tool).\nFor example, the Linux installer can be downloaded with ::\n\n  $ curl -LOJ https://github.com/OpenFreeEnergy/openfe/releases/latest/download/OpenFEforge-Linux-x86_64.sh\n\nAnd the MacOS (arm64) installer ::\n\n  $ curl -LOJ https://github.com/OpenFreeEnergy/openfe/releases/latest/download/OpenFEforge-MacOSX-arm64.sh\n\nMacOS x86_64 is no longer supported.\n\nThe single file installer contains all of the dependencies required for **openfe** and does not require internet access to use.\n\nBoth ``conda`` and ``mamba`` are also available in the environment created by the single file installer and can be used to install additional packages.\nThe installer can be installed in batch mode or interactively  ::\n\n  $ chmod +x ./OpenFEforge-Linux-x86_64.sh # Make installer executable\n  $ ./OpenFEforge-Linux-x86_64.sh # Run the installer\n\nExample installer output is shown below (click to expand \"Installer Output\")\n\n.. collapse:: Installer Output\n\n  .. code-block::\n\n      Welcome to OpenFEforge 0.7.4\n\n      In order to continue the installation process, please review the license\n      agreement.\n      Please, press ENTER to continue\n      >>>\n      MIT License\n\n      Copyright (c) 2022 OpenFreeEnergy\n\n      Permission is hereby granted, free of charge, to any person obtaining a copy\n      of this software and associated documentation files (the \"Software\"), to deal\n      in the Software without restriction, including without limitation the rights\n      to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n      copies of the Software, and to permit persons to whom the Software is\n      furnished to do so, subject to the following conditions:\n\n      The above copyright notice and this permission notice shall be included in all\n      copies or substantial portions of the Software.\n\n      THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n      IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n      FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n      AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n      LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n      OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n      SOFTWARE.\n\n\n      Do you accept the license terms? [yes|no]\n      [no] >>> yes\n\n  .. note::\n     The install location will be different when you run the installer.\n\n  .. code-block::\n\n      OpenFEforge will now be installed into this location:\n      /home/mmh/openfeforge\n\n      - Press ENTER to confirm the location\n      - Press CTRL-C to abort the installation\n      - Or specify a different location below\n\n      [/home/mmh/openfeforge] >>>\n      PREFIX=/home/mmh/openfeforge\n      Unpacking payload ...\n\n      Installing base environment...\n\n\n      Downloading and Extracting Packages\n\n\n      Downloading and Extracting Packages\n\n      Preparing transaction: done\n      Executing transaction: \\ By downloading and using the CUDA Toolkit conda packages, you accept the terms and conditions of the CUDA End User License Agreement (EULA): https://docs.nvidia.com/cuda/eula/index.html\n\n      | Enabling notebook extension jupyter-js-widgets/extension...\n            - Validating: OK\n\n      done\n      installation finished.\n      Do you wish the installer to initialize OpenFEforge\n      by running conda init? [yes|no]\n      [no] >>> yes\n      no change     /home/mmh/openfeforge/condabin/conda\n      no change     /home/mmh/openfeforge/bin/conda\n      no change     /home/mmh/openfeforge/bin/conda-env\n      no change     /home/mmh/openfeforge/bin/activate\n      no change     /home/mmh/openfeforge/bin/deactivate\n      no change     /home/mmh/openfeforge/etc/profile.d/conda.sh\n      no change     /home/mmh/openfeforge/etc/fish/conf.d/conda.fish\n      no change     /home/mmh/openfeforge/shell/condabin/Conda.psm1\n      no change     /home/mmh/openfeforge/shell/condabin/conda-hook.ps1\n      no change     /home/mmh/openfeforge/lib/python3.9/site-packages/xontrib/conda.xsh\n      no change     /home/mmh/openfeforge/etc/profile.d/conda.csh\n      modified      /home/mmh/.bashrc\n\n      ==> For changes to take effect, close and re-open your current shell. <==\n\n\n                        __    __    __    __\n                       /  \\  /  \\  /  \\  /  \\\n                      /    \\/    \\/    \\/    \\\n      ███████████████/  /██/  /██/  /██/  /████████████████████████\n                    /  / \\   / \\   / \\   / \\  \\____\n                   /  /   \\_/   \\_/   \\_/   \\    o \\__,\n                  / _/                       \\_____/  `\n                  |/\n              ███╗   ███╗ █████╗ ███╗   ███╗██████╗  █████╗\n              ████╗ ████║██╔══██╗████╗ ████║██╔══██╗██╔══██╗\n              ██╔████╔██║███████║██╔████╔██║██████╔╝███████║\n              ██║╚██╔╝██║██╔══██║██║╚██╔╝██║██╔══██╗██╔══██║\n              ██║ ╚═╝ ██║██║  ██║██║ ╚═╝ ██║██████╔╝██║  ██║\n              ╚═╝     ╚═╝╚═╝  ╚═╝╚═╝     ╚═╝╚═════╝ ╚═╝  ╚═╝\n\n              mamba (1.4.2) supported by @QuantStack\n\n              GitHub:  https://github.com/mamba-org/mamba\n              Twitter: https://twitter.com/QuantStack\n\n      █████████████████████████████████████████████████████████████\n\n      no change     /home/mmh/openfeforge/condabin/conda\n      no change     /home/mmh/openfeforge/bin/conda\n      no change     /home/mmh/openfeforge/bin/conda-env\n      no change     /home/mmh/openfeforge/bin/activate\n      no change     /home/mmh/openfeforge/bin/deactivate\n      no change     /home/mmh/openfeforge/etc/profile.d/conda.sh\n      no change     /home/mmh/openfeforge/etc/fish/conf.d/conda.fish\n      no change     /home/mmh/openfeforge/shell/condabin/Conda.psm1\n      no change     /home/mmh/openfeforge/shell/condabin/conda-hook.ps1\n      no change     /home/mmh/openfeforge/lib/python3.9/site-packages/xontrib/conda.xsh\n      no change     /home/mmh/openfeforge/etc/profile.d/conda.csh\n      no change     /home/mmh/.bashrc\n      No action taken.\n      Added mamba to /home/mmh/.bashrc\n\n      ==> For changes to take effect, close and re-open your current shell. <==\n\n      If you'd prefer that conda's base environment not be activated on startup,\n         set the auto_activate_base parameter to false:\n\n      conda config --set auto_activate_base false\n\n      Thank you for installing OpenFEforge!\n\nAfter the installer completes, close and reopen your shell.\nTo check if your path is setup correctly, run ``which python`` your output should look something like this ::\n\n   (base) $ which python\n   /home/mmh/openfeforge/bin/python\n\n.. note::\n   Your path will be different, but the important part is ``openfeforge/bin/python``\n\nNow the CLI tool should work as well ::\n\n   (base) $ openfe --help\n   Usage: openfe [OPTIONS] COMMAND [ARGS]...\n\n     This is the command line tool to provide easy access to functionality from\n     the OpenFE Python library.\n\n   Options:\n     --version   Show the version and exit.\n     --log PATH  logging configuration file\n     -h, --help  Show this message and exit.\n\n   Network Planning Commands:\n     plan-rhfe-network    Plan a relative hydration free energy network, saved as\n                          JSON files for the quickrun command.\n     plan-rbfe-network    Plan a relative binding free energy network, saved as\n                          JSON files for the quickrun command.\n     view-ligand-network  Visualize a ligand network\n\n   Quickrun Executor Commands:\n     gather    Gather result jsons for network of RFE results into a TSV file\n     quickrun  Run a given transformation, saved as a JSON file\n\n   Miscellaneous Commands:\n     fetch             Fetch tutorial or other resource.\n     charge-molecules  Generate partial charges for a set of molecules.\n     test              Run the OpenFE test suite\n\n\nTo make sure everything is working, :ref:`run the tests <testing>`.\n\nWith that, you should be ready to use **openfe**!\n\n.. _installation:containers:\n\nContainerized  Distributions\n----------------------------\n\nWe provide an official docker and Apptainer (formerly Singularity) image.\nThe docker image is tagged with the version of **openfe** on the image and can be pulled with ::\n\n  $ docker pull ghcr.io/openfreeenergy/openfe:latest\n\nThe Apptainer image is pre-built and can be pulled with ::\n\n  $ singularity pull oras://ghcr.io/openfreeenergy/openfe:latest-apptainer\n\n.. warning::\n\n   For production use, we recommend using version tags to prevent disruptions in workflows e.g.\n\n   .. parsed-literal::\n\n     $ docker pull ghcr.io/openfreeenergy/openfe:\\ |version|\n     $ singularity pull oras://ghcr.io/openfreeenergy/openfe:\\ |version|-apptainer\n\nWe recommend testing the container to ensure that it can access a GPU (if desired).\nThis can be done with the following command ::\n\n  $ singularity run --nv openfe_latest-apptainer.sif python -m openmm.testInstallation\n\n  OpenMM Version: 8.0\n  Git Revision: a7800059645f4471f4b91c21e742fe5aa4513cda\n\n  There are 3 Platforms available:\n\n  1 Reference - Successfully computed forces\n  2 CPU - Successfully computed forces\n  3 CUDA - Successfully computed forces\n\n  Median difference in forces between platforms:\n\n  Reference vs. CPU: 6.29328e-06\n  Reference vs. CUDA: 6.7337e-06\n  CPU vs. CUDA: 7.44698e-07\n\n  All differences are within tolerance.\n\nThe ``--nv`` flag is required for the Apptainer image to access the GPU on the host.\nYour output may produce different values for the forces, but should list the CUDA platform if everything is working properly.\n\nYou can access the **openfe** CLI from the Singularity image with ::\n\n  $ singularity run --nv openfe_latest-apptainer.sif openfe --help\n\nTo make sure everything is working, run the tests ::\n\n  $ singularity run --nv openfe_latest-apptainer.sif openfe test\n\nYou can also run the long tests with ``openfe test --long``, as explained in `Testing Your Installation`_.\n\nWith that, you should be ready to use **openfe**!\n\n.. note::\n\n   If building a custom docker image, you may need to need to add ``--ulimit nofile=262144:262144`` to the ``docker build`` command.\n   See this `issue <https://github.com/OpenFreeEnergy/openfe/issues/1269>`_ for details.\n\nHPC Environments\n----------------\n\nWhen using High Performance Computing resources, jobs are typically submitted to a queue from a \"login node\" and then run at a later time, often on different hardware and in a different software environment.\nThis can complicate installation as getting something working on the login node does not guarantee it will work in the job.\nWe recommend using `Apptainer (formerly Singularity) <https://apptainer.org/>`_ when running **openfe** workflows in HPC environments.\nThis images provide a software environment that is isolated from the host which can make workflow execution easier to setup and more reproducible.\nSee our guide on :ref:`containers <installation:containers>` for how to get started using Apptainer/Singularity.\n\n.. _installation:mamba_hpc:\n\n``micromamba`` in HPC Environments\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n.. _virtual packages: https://docs.conda.io/projects/conda/en/latest/user-guide/tasks/manage-virtual.html#managing-virtual-packages\n\nWe recommend using a :ref:`container <installation:containers>` to install **openfe** in HPC environments.\nNonetheless, **openfe** can be installed via Conda Forge on these environments also.\nConda Forge distributes its own CUDA binaries for interfacing with the GPU, rather than use the host drivers.\n``conda``, ``mamba`` and ``micromamba`` all use `virtual packages`_ to detect and specify which version of CUDA should be installed.\nThis is a common point of difference in hardware between the login and job nodes in an HPC environment.\n\nIn order to determine the correct ``cuda-version`` version, we recommend connecting to the node where the simulation will be executed and run ``nvidia-smi``.\nFor example ::\n\n  $ nvidia-smi\n  Tue Mar 31 19:46:32 2026\n  +-----------------------------------------------------------------------------------------+\n  | NVIDIA-SMI 590.48.01              Driver Version: 590.48.01      CUDA Version: 13.1     |\n  +-----------------------------------------+------------------------+----------------------+\n  | GPU  Name                 Persistence-M | Bus-Id          Disp.A | Volatile Uncorr. ECC |\n  | Fan  Temp   Perf          Pwr:Usage/Cap |           Memory-Usage | GPU-Util  Compute M. |\n  |                                         |                        |               MIG M. |\n  |=========================================+========================+======================|\n  |   0  NVIDIA A100 80GB PCIe          On  |   00000000:65:00.0 Off |                    0 |\n  | N/A   32C    P0             44W /  300W |       0MiB /  81920MiB |      0%      Default |\n  |                                         |                        |             Disabled |\n  +-----------------------------------------+------------------------+----------------------+\n  \n  +-----------------------------------------------------------------------------------------+\n  | Processes:                                                                              |\n  |  GPU   GI   CI              PID   Type   Process name                        GPU Memory |\n  |        ID   ID                                                               Usage      |\n  |=========================================================================================|\n  |  No running processes found                                                             |\n  +-----------------------------------------------------------------------------------------+\n\nin this output of ``nvidia-smi`` we can see in the upper right of the output ``CUDA Version: 13.1`` which means the installed driver will support a CUDA version up to ``13.1``.\nTo install a version of **openfe** which is compatible with CUDA ``13.1``, run:\n\n.. parsed-literal::\n\n  $ micromamba create -n openfe cuda-version=13.1 openfe=\\ |version|\n\n\n\nDeveloper install\n-----------------\n\nIf you're going to be developing for **openfe**, you will want an\ninstallation where your changes to the code are immediately reflected in the\nfunctionality. This is called a \"developer\" or \"editable\" installation.\n\nGetting a developer installation for **openfe** first installing the\nrequirements, and then creating the editable installation. We recommend\ndoing that with ``micromamba`` using the following procedure:\n\nFirst, clone the **openfe** repository, and switch into its root directory::\n\n  $ git clone https://github.com/OpenFreeEnergy/openfe.git\n  $ cd openfe\n\nNext create a ``conda`` environment containing the requirements from the\nspecification in that directory::\n\n  $ micromamba create -f environment.yml\n\nThen activate the openfe environment with::\n\n  $ micromamba activate openfe_env\n\nFinally, create the editable installation::\n\n  $ python -m pip install --no-deps -e .\n\nNote the ``.`` at the end of that command, which indicates the current\ndirectory.\n\n\n.. _testing:\n\nTesting Your Installation\n-------------------------\n\nAfter installing **openfe**, make sure everything is working as expected by running the test suite with ::\n\n  $ openfe test\n\nThe test suite contains several hundred individual tests.\nThis will take a few minutes, and all tests should complete with status either passed, skipped, or xfailed (expected fail).\n\nThe very first time you run this, the initial check that you can import ``openfe`` will take a while, because some code is compiled the first time it is encountered.\nThat compilation only happens once per installation, and so subsequent calls to ``openfe`` will be faster.\n\nA more expansive test suite can be run using ::\n\n  $ openfe test --long\n\nThis test suite contains several hundred individual tests.\nThis may take up to an hour, and all tests should complete with status either passed, skipped, or xfailed (expected fail).\nThis \"long\" test suite should be run as a job on the compute hardware intended to run openfe jobs, as it will test GPU specific features.\n\n\nTroubleshooting Your Installation\n---------------------------------\n\nWe have created a script that can be run locally to assist in troubleshooting errors.\nThe script does not upload any information and the output may be inspected before the output is sent to us.\nWe recommend running the script in the same environment where the error was observed.\nFor example, if you had an error when creating a system on your local workstation, run the script locally with the same conda environment active as when the error occurred.\nIf the error occurred when running the job on an HPC resource, then run the script (ideally) on the same node where the problem occurred.\nThis helps to debug issues such as a CUDA and NVIDIA driver mismatch (which would be impossible to diagnose if the script was ran on a login node without a GPU).\n\nThe script is available here: https://github.com/OpenFreeEnergy/openfe/blob/main/devtools/debug_openmm.sh\nFor your convenience, this command will download the script and save the output as ``debug.log``\n\n.. parsed-literal::\n\n  $ bash -c \"$(curl -Ls https://raw.githubusercontent.com/OpenFreeEnergy/openfe/main/devtools/debug_openmm.sh)\" | tee -a debug.log\n\nThe output of the script will also be printed to standard out as it is executed.\nWhile no sensitive information is extracted, it is good practice to review the output before sending it or posting it to ensure that nothing needs to be redacted.\nFor example, if your python path was ``/data/SECRET_COMPOUND_NAME/python`` then that would show up in ``debug.log``.\n\n\nCommon Errors\n-------------\n\n.. parsed-literal::\n\n  openmm.OpenMMException: Error loading CUDA module: CUDA_ERROR_UNSUPPORTED_PTX_VERSION (222)\n\nThis error likely means that the CUDA version that ``openmm`` was built with is incompatible with the CUDA driver.\nTry re-making the environment while specifying the correct CUDA toolkit version for your hardware and driver.\nSee :ref:`installation:mamba_hpc` for more details.\n\nOptional dependencies\n---------------------\n\nCertain functionalities are only available if you also install other,\noptional packages.\n\n* **perses tools**: To use perses, you need to install perses and OpenEye,\n  and you need a valid OpenEye license. To install both packages, use::\n\n    $ mamba install -c openeye perses openeye-toolkits\n\nSupported Hardware\n------------------\n\nWe currently support the following CPU architectures:\n\n* ``linux-64``\n* ``osx-arm64``\n\nFor simulation preparation, any supported platform is suitable.\nWe test our software regularly by performing vacuum transformations on ``linux-64`` using the OpenMM CUDA platform.\nWhile OpenMM supports OpenCL, we do not regularly test that platform (the CUDA platform is more performant) so we do not recommend using that platform without performing your own verification of correctness.\nFor production use, we recommend the ``linux-64`` platform with NVIDIA GPUs for optimal performance.\nWhen using an OpenMM based protocol on NVIDIA GPUs, we recommend driver version ``525.60.13`` or greater.\nThe minimum driver version required when installing from conda-forge is ``450.36.06``, but newer versions of OpenMM may not support that driver version as CUDA 11 will be removed the build matrix.\n\n\nMiniforge Installation Guide\n----------------------------\n\n.. _Miniforge: https://github.com/conda-forge/miniforge?tab=readme-ov-file#miniforge\n\n`Miniforge`_  provides minimal installers for either ``conda`` or ``mamba``, and enables easy installation of other software that ``openfe`` needs, such as OpenMM and AmberTools.\nWe recommend using ``miniforge`` to install ``mamaba`` because it is faster than ``conda`` and comes preconfigured to use ``conda-forge``.\n\nTo install and configure ``miniforge``, you need to know your operating system, your machine architecture (output of ``uname -m``), and your shell (in most cases, can be determined from ``echo $SHELL``).\nSelect your operating system and architecture from the tool below, and run the commands it suggests.\n\n.. raw:: html\n\n    <select id=\"miniforge-os\" onchange=\"javascript: setArchitectureOptions(this.options[this.selectedIndex].value)\">\n        <option value=\"Linux\">Linux</option>\n        <option value=\"MacOSX\">macOS</option>\n    </select>\n    <select id=\"miniforge-architecture\" onchange=\"updateInstructions()\">\n    </select>\n    <select id=\"miniforge-shell\" onchange=\"updateInstructions()\">\n        <option value=\"bash\">bash</option>\n        <option value=\"zsh\">zsh</option>\n        <option value=\"tcsh\">tcsh</option>\n        <option value=\"fish\">fish</option>\n        <option value=\"xonsh\">xonsh</option>\n    </select>\n    <br />\n    <pre><span id=\"miniforge-curl-install\"></span></pre>\n    <script>\n      function setArchitectureOptions(os) {\n          let options = {\n              \"MacOSX\": [\n                  [\"x86_64\", \"\"],\n                  [\"arm64\", \" (Apple Silicon)\"]\n              ],\n              \"Linux\": [\n                  [\"x86_64\", \" (amd64)\"],\n                  [\"aarch64\", \" (arm64)\"],\n                  [\"ppc64le\", \" (POWER8/9)\"]\n              ]\n          };\n          choices = options[os];\n          let htmlString = \"\"\n          for (const [val, extra] of choices) {\n              htmlString += `<option value=\"${val}\">${val}${extra}</option>`;\n          }\n          let arch = document.getElementById(\"miniforge-architecture\");\n          arch.innerHTML = htmlString\n          updateInstructions()\n      }\n\n      function updateInstructions() {\n          let cmd = document.getElementById(\"miniforge-curl-install\");\n          let osElem = document.getElementById(\"miniforge-os\");\n          let archElem = document.getElementById(\"miniforge-architecture\");\n          let shellElem = document.getElementById(\"miniforge-shell\");\n          let os = osElem[osElem.selectedIndex].value;\n          let arch = archElem[archElem.selectedIndex].value;\n          let shell = shellElem[shellElem.selectedIndex].value;\n          let filename = \"Miniforge3-\" + os + \"-\" + arch + \".sh\"\n          let cmdArr = [\n              (\n                  \"curl -OL https://github.com/conda-forge/miniforge/\"\n                  + \"releases/latest/download/\" + filename\n              ),\n              \"sh \" + filename + \" -b\",\n              \"~/miniforge3/bin/mamba init \" + shell,\n              \"rm -f \" + filename,\n          ]\n          cmd.innerHTML = cmdArr.join(\"\\n\")\n      }\n\n      setArchitectureOptions(\"Linux\");  // default\n    </script>\n\nYou should then close your current session and open a fresh login to ensure that everything is properly registered.\nYou can now proceed to use ``mamba`` commands as instructed above.\n"
  },
  {
    "path": "docs/make.bat",
    "content": "@ECHO OFF\n\npushd %~dp0\n\nREM Command file for Sphinx documentation\n\nif \"%SPHINXBUILD%\" == \"\" (\n\tset SPHINXBUILD=sphinx-build\n)\nset SOURCEDIR=.\nset BUILDDIR=_build\n\nif \"%1\" == \"\" goto help\n\n%SPHINXBUILD% >NUL 2>NUL\nif errorlevel 9009 (\n\techo.\n\techo.The 'sphinx-build' command was not found. Make sure you have Sphinx\n\techo.installed, then set the SPHINXBUILD environment variable to point\n\techo.to the full path of the 'sphinx-build' executable. Alternatively you\n\techo.may add the Sphinx directory to PATH.\n\techo.\n\techo.If you don't have Sphinx installed, grab it from\n\techo.https://www.sphinx-doc.org/\n\texit /b 1\n)\n\n%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%\ngoto end\n\n:help\n%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%\n\n:end\npopd\n"
  },
  {
    "path": "docs/reference/api/alchemical_network_planning.rst",
    "content": ".. _Alchemical Network Planning:\n\nSimulation Campaign Planning\n============================\n\nWhile a :class:`LigandNetwork` describes a network of ligands and their atom\nmappings, a :class:`AlchemicalNetwork` describes a single replicate of a\nsimulation campaign. It includes all the information needed to perform the\nsimulation, and so implicitly includes the :class:`LigandNetwork`.\n\nAlchemical Simulations\n~~~~~~~~~~~~~~~~~~~~~~\n\nDescriptions of anticipated alchemical simulation campaigns.\n\n.. module:: openfe\n    :noindex:\n\n.. autosummary::\n    :nosignatures:\n    :toctree: generated/\n\n    Transformation\n    AlchemicalNetwork\n\nAlchemical Network Planners\n---------------------------\nAlchemical network planners are objects that pull all the ideas in OpenFE\ninto a quick setup for simulation. The goal is to create the\n:class:`.AlchemicalNetwork` that represents an entire simulation campaign,\nstarting from a bare amount of user input.\n\n.. module:: openfe.setup\n    :noindex:\n\n.. autosummary::\n    :nosignatures:\n    :toctree: generated/\n\n    RBFEAlchemicalNetworkPlanner\n    RHFEAlchemicalNetworkPlanner\n"
  },
  {
    "path": "docs/reference/api/atom_mappers.rst",
    "content": ".. _Atom Mappers:\n\nAtom Mappings\n=============\n\nTools for mapping atoms in one molecule to those in another. Used to generate efficient ligand networks.\n\n.. module:: openfe.setup.atom_mapping\n\n.. rubric:: Abstract Base Class\n\n.. autosummary::\n    :nosignatures:\n    :toctree: generated/\n\n    LigandAtomMapper\n\n.. rubric:: Implementations\n\n.. autosummary::\n    :nosignatures:\n    :toctree: generated/\n\n    KartografAtomMapper\n    LomapAtomMapper\n    PersesAtomMapper\n\n.. rubric:: Data Types\n\n.. autosummary::\n    :nosignatures:\n    :toctree: generated/\n\n    LigandAtomMapping\n\n.. _Atom Map Scorers:\n\nAtom Map Scorers\n----------------\n\nScoring functions for a mapping between ligands. These are used as objective functions for :any:`Ligand Network Planners`.\n\n\nLomap Scorers\n~~~~~~~~~~~~~\n\nScorers implemented by the `LOMAP <https://github.com/OpenFreeEnergy/Lomap>`_ package.\n\n.. apparently we need the atom_mapping because internally autofunction is\n    trying ``import openfe.setup.lomap_scorers``, which doesn't work (whereas\n    ``from openfe.setup import lomap_scorers`` does)\n.. module:: openfe.setup.atom_mapping.lomap_scorers\n\n.. autosummary::\n    :nosignatures:\n    :toctree: generated/\n\n    default_lomap_score\n    ecr_score\n    mcsr_score\n    mncar_score\n    atomic_number_score\n    hybridization_score\n    sulfonamides_score\n    heterocycles_score\n    transmuting_methyl_into_ring_score\n    transmuting_ring_sizes_score\n\n\nPerses Scorers\n~~~~~~~~~~~~~~\n\nScorers implemented by the `Perses <https://github.com/choderalab/perses>`_ package.\n\n.. module:: openfe.setup.atom_mapping.perses_scorers\n\n.. autosummary::\n    :nosignatures:\n    :toctree: generated/\n\n    default_perses_scorer\n"
  },
  {
    "path": "docs/reference/api/defining_and_executing_simulations.rst",
    "content": ".. _reference_execution:\n\nDefining and Executing Simulations\n==================================\n\n.. _executors:\n\nExecuting Simulations\n---------------------\n\n.. module:: openfe\n    :noindex:\n\n.. autosummary::\n    :nosignatures:\n    :toctree: generated/\n\n    execute_DAG\n\nGeneral classes\n---------------\n\n.. module:: openfe\n    :noindex:\n\n.. autosummary::\n    :nosignatures:\n    :toctree: generated/\n\n    ProtocolDAG\n    ProtocolUnitResult\n    ProtocolUnitFailure\n    ProtocolDAGResult\n\nSpecialised classes\n-------------------\n\nThese classes are abstract classes that are specialised (subclassed) for an individual Protocol.\n\n.. module:: openfe\n    :noindex:\n\n.. autosummary::\n    :nosignatures:\n    :toctree: generated/\n\n    Protocol\n    ProtocolUnit\n    ProtocolResult\n"
  },
  {
    "path": "docs/reference/api/index.rst",
    "content": ".. _api:\n\n.. note::\n   We have reproduced API documentation from the `gufe`_ package here for convenience.\n   `gufe`_ serves as a foundation layer for openfe, providing abstract base classes and object models, and so might be more useful for developers.\n\nPython API Reference\n====================\n\n.. toctree::\n    :maxdepth: 2\n\n    systems_and_components\n    atom_mappers\n    ligand_network\n    alchemical_network_planning\n    defining_and_executing_simulations\n    openmm_rfe\n    openmm_solvation_afe\n    openmm_binding_afe\n    openmm_septop\n    openmm_md\n    openmm_protocol_settings\n\n.. _gufe: https://gufe.openfree.energy/en/stable/api.html\n"
  },
  {
    "path": "docs/reference/api/ligand_network.rst",
    "content": "Ligand Network Tools\n====================\n\n.. module:: openfe.setup\n    :noindex:\n\nLigand Network\n--------------\n\nA network of mutations between ligands.\n\n.. autosummary::\n    :nosignatures:\n    :toctree: generated/\n\n    LigandNetwork\n\n\n.. _Ligand Network Planners:\n\nNetwork Planners\n~~~~~~~~~~~~~~~~\n\n.. module:: openfe.setup.ligand_network_planning\n\nFunctions that build a :class:`.LigandNetwork` from a collection of :class:`SmallMoleculeComponents` by optimizing over a `scoring function <Atom Map Scorers>`_.\n\n.. autosummary::\n    :nosignatures:\n    :toctree: generated/\n\n    generate_radial_network\n    generate_maximal_network\n    generate_minimal_spanning_network\n    generate_minimal_redundant_network\n    generate_lomap_network\n\n\n.. _Ligand Network Loaders:\n\nNetwork Loaders\n~~~~~~~~~~~~~~~\n\nFunctions to load a :class:`.LigandNetwork` from equivalent classes in other packages, or to specify one by hand.\n\n.. autosummary::\n    :nosignatures:\n    :toctree: generated/\n\n    generate_network_from_names\n    generate_network_from_indices\n    load_orion_network\n    load_fepplus_network\n\n"
  },
  {
    "path": "docs/reference/api/openmm_binding_afe.rst",
    "content": "OpenMM Absolute Binding Free Energy Protocol\n============================================\n\n.. _afe binding protocol api:\n\nThis section provides details about the OpenMM Absolute Binding Free Energy Protocol\nimplemented in OpenFE.\n\nProtocol API specification\n--------------------------\n\n.. module:: openfe.protocols.openmm_afe.equil_binding_afe_method\n\n.. autosummary::\n   :nosignatures:\n   :toctree: generated/\n\n   AbsoluteBindingProtocol\n   ABFEComplexAnalysisUnit\n   ABFEComplexSetupUnit\n   ABFEComplexSimUnit\n   ABFESolventAnalysisUnit\n   ABFESolventSetupUnit\n   ABFESolventSimUnit\n   AbsoluteBindingProtocolResult\n\nProtocol Settings\n-----------------\n\n\nBelow are the settings which can be tweaked in the protocol. The default settings (accessed using :meth:`AbsoluteBindingProtocol.default_settings`) will automatically populate settings which we have found to be useful for running binding free energy calculations. There will however be some cases (such as when calculating difficult to converge systems) where you will need to tweak some of the following settings.\n\n\n.. module:: openfe.protocols.openmm_afe.equil_afe_settings\n\n.. autopydantic_model:: AbsoluteBindingSettings\n   :model-show-json: False\n   :model-show-field-summary: False\n   :model-show-config-member: False\n   :model-show-config-summary: False\n   :model-show-validator-members: False\n   :model-show-validator-summary: False\n   :field-list-validators: False\n   :inherited-members: SettingsBaseModel\n   :exclude-members: get_defaults\n   :member-order: bysource\n"
  },
  {
    "path": "docs/reference/api/openmm_md.rst",
    "content": "OpenMM Molecular Dynamics (MD) Protocol\n=======================================\n\n.. _md protocol api:\n\nA Protocol for running MD simulation using OpenMM.\n\n\nProtocol API Specification\n--------------------------\n\n.. module:: openfe.protocols.openmm_md\n\n.. autosummary::\n   :nosignatures:\n   :toctree: generated/\n\n   PlainMDProtocol\n   PlainMDSetupUnit\n   PlainMDSimulationUnit\n   PlainMDProtocolResult\n\n\nProtocol Settings\n-----------------\n\n.. module:: openfe.protocols.openmm_md.plain_md_settings\n\n.. autopydantic_model:: PlainMDProtocolSettings\n   :model-show-json: False\n   :model-show-field-summary: False\n   :model-show-config-member: False\n   :model-show-config-summary: False\n   :model-show-validator-members: False\n   :model-show-validator-summary: False\n   :field-list-validators: False\n   :inherited-members: SettingsBaseModel\n   :exclude-members: get_defaults\n   :member-order: bysource\n\n"
  },
  {
    "path": "docs/reference/api/openmm_protocol_settings.rst",
    "content": "OpenMM Protocol Settings\n========================\n\n.. _openmm protocol settings api:\n\nThis page documents the Settings classes used by OpenMM-based Protocols.\n\nDetails on which of these Settings classes are used by a given Protocol\ncan be found on the individual Protocol API reference documentation pages:\n\n* :ref:`OpenMM Absolute Solvation Free Energy <afe solvation protocol api>`\n* :ref:`OpenMM Relative Free Energy <rfe protocol api>`\n* :ref:`OpenMM Relative Free Energy using SepTop <septop protocol api>`\n* :ref:`OpenMM Molecular Dynamics Protocol <md protocol api>`\n\n\nShared OpenMM Protocol Settings\n-------------------------------\n\nThe following are Settings classes which are shared between multiple\nOpenMM-based Protocols. Please note that not all Protocols use these\nSettings classes.\n\n\n.. module:: openfe.protocols.openmm_utils.omm_settings\n\n.. autopydantic_model:: IntegratorSettings\n   :model-show-json: False\n   :model-show-field-summary: False\n   :model-show-config-member: False\n   :model-show-config-summary: False\n   :model-show-validator-members: False\n   :model-show-validator-summary: False\n   :field-list-validators: False\n   :inherited-members: SettingsBaseModel\n   :member-order: bysource\n\n.. autopydantic_model:: MDOutputSettings\n   :model-show-json: False\n   :model-show-field-summary: False\n   :model-show-config-member: False\n   :model-show-config-summary: False\n   :model-show-validator-members: False\n   :model-show-validator-summary: False\n   :field-list-validators: False\n   :inherited-members: SettingsBaseModel\n   :member-order: bysource\n\n.. autopydantic_model:: MDSimulationSettings\n   :model-show-json: False\n   :model-show-field-summary: False\n   :model-show-config-member: False\n   :model-show-config-summary: False\n   :model-show-validator-members: False\n   :model-show-validator-summary: False\n   :field-list-validators: False\n   :inherited-members: SettingsBaseModel\n   :member-order: bysource\n\n.. autopydantic_model:: OpenMMEngineSettings\n   :model-show-json: False\n   :model-show-field-summary: False\n   :model-show-config-member: False\n   :model-show-config-summary: False\n   :model-show-validator-members: False\n   :model-show-validator-summary: False\n   :field-list-validators: False\n   :inherited-members: SettingsBaseModel\n   :member-order: bysource\n\n.. autopydantic_model:: OpenFFPartialChargeSettings\n   :model-show-json: False\n   :model-show-field-summary: False\n   :model-show-config-member: False\n   :model-show-config-summary: False\n   :model-show-validator-members: False\n   :model-show-validator-summary: False\n   :field-list-validators: False\n   :inherited-members: SettingsBaseModel\n   :member-order: bysource\n\n.. autopydantic_model:: OpenMMSolvationSettings\n   :model-show-json: False\n   :model-show-field-summary: False\n   :model-show-config-member: False\n   :model-show-config-summary: False\n   :model-show-validator-members: False\n   :model-show-validator-summary: False\n   :field-list-validators: False\n   :inherited-members: SettingsBaseModel\n   :member-order: bysource\n\n.. autopydantic_model:: OpenMMSystemGeneratorFFSettings\n   :model-show-json: False\n   :model-show-field-summary: False\n   :model-show-config-member: False\n   :model-show-config-summary: False\n   :model-show-validator-members: False\n   :model-show-validator-summary: False\n   :field-list-validators: False\n   :inherited-members: SettingsBaseModel\n   :member-order: bysource\n\n.. autopydantic_model:: ThermoSettings\n   :model-show-json: False\n   :model-show-field-summary: False\n   :model-show-config-member: False\n   :model-show-config-summary: False\n   :model-show-validator-members: False\n   :model-show-validator-summary: False\n   :field-list-validators: False\n   :inherited-members: SettingsBaseModel\n   :member-order: bysource\n\n\nShared MultiState OpenMM Protocol Settings\n------------------------------------------\n\nProtocol Settings shared between MultiState simulation protocols.\n\nThese currently include the following Protocols:\n\n* :ref:`OpenMM Absolute Solvation Free Energy <afe solvation protocol api>`\n* :ref:`OpenMM Relative Free Energy <rfe protocol api>`\n* :ref:`OpenMM Relative Free Energy using SepTop <septop protocol api>`\n\n\n.. autopydantic_model:: MultiStateOutputSettings\n   :model-show-json: False\n   :model-show-field-summary: False\n   :model-show-config-member: False\n   :model-show-config-summary: False\n   :model-show-validator-members: False\n   :model-show-validator-summary: False\n   :field-list-validators: False\n   :inherited-members: SettingsBaseModel\n   :member-order: bysource\n\n.. autopydantic_model:: MultiStateSimulationSettings\n   :model-show-json: False\n   :model-show-field-summary: False\n   :model-show-config-member: False\n   :model-show-config-summary: False\n   :model-show-validator-members: False\n   :model-show-validator-summary: False\n   :field-list-validators: False\n   :inherited-members: SettingsBaseModel\n   :member-order: bysource\n\n"
  },
  {
    "path": "docs/reference/api/openmm_rfe.rst",
    "content": "OpenMM Relative Free Energy Protocol\n====================================\n\n.. _rfe protocol api:\n\nThis section provides details about the OpenMM Relative Free Energy Protocol\nimplemented in OpenFE.\n\nProtocol API specification\n--------------------------\n\n.. module:: openfe.protocols.openmm_rfe.equil_rfe_methods\n\n.. autosummary::\n   :nosignatures:\n   :toctree: generated/\n\n   RelativeHybridTopologyProtocol\n   HybridTopologySetupUnit\n   HybridTopologyMultiStateSimulationUnit\n   HybridTopologyMultiStateAnalysisUnit\n   RelativeHybridTopologyProtocolResult\n\nProtocol Settings\n-----------------\n\n\nBelow are the settings which can be tweaked in the protocol. The default settings (accessed using :meth:`RelativeHybridTopologyProtocol.default_settings`) will automatically populate a settings which we have found to be useful for running relative binding free energies using explicit solvent. There will however be some cases (such as when doing gas phase calculations) where you will need to tweak some of the following settings.\n\n.. autopydantic_model:: openfe.protocols.openmm_rfe.equil_rfe_settings.RelativeHybridTopologyProtocolSettings\n   :model-show-json: False\n   :model-show-field-summary: False\n   :model-show-config-member: False\n   :model-show-config-summary: False\n   :model-show-validator-members: False\n   :model-show-validator-summary: False\n   :field-list-validators: False\n   :inherited-members: SettingsBaseModel\n   :exclude-members: get_defaults\n   :member-order: bysource\n\n\nProtocol Specific Settings Classes\n----------------------------------\n\nBelow are Settings classes which are unique to the ``RelativeHybridTopologyProtocol``.\n\n.. autopydantic_model:: openfe.protocols.openmm_rfe.equil_rfe_settings.AlchemicalSettings\n   :model-show-json: False\n   :model-show-field-summary: False\n   :model-show-config-member: False\n   :model-show-config-summary: False\n   :model-show-validator-members: False\n   :model-show-validator-summary: False\n   :field-list-validators: False\n   :inherited-members: SettingsBaseModel\n   :member-order: bysource\n\n.. autopydantic_model:: openfe.protocols.openmm_rfe.equil_rfe_settings.LambdaSettings\n   :model-show-json: False\n   :model-show-field-summary: False\n   :model-show-config-member: False\n   :model-show-config-summary: False\n   :model-show-validator-members: False\n   :model-show-validator-summary: False\n   :field-list-validators: False\n   :inherited-members: SettingsBaseModel\n   :member-order: bysource\n"
  },
  {
    "path": "docs/reference/api/openmm_septop.rst",
    "content": "OpenMM Separated Topologies Protocol\n====================================\n\n.. _septop protocol api:\n\nThis section provides details about the OpenMM Separated Topologies Protocol\nimplemented in OpenFE.\n\nProtocol API specification\n--------------------------\n\n.. module:: openfe.protocols.openmm_septop.equil_septop_method\n\n.. autosummary::\n   :nosignatures:\n   :toctree: generated/\n\n   SepTopProtocol\n   SepTopComplexSetupUnit\n   SepTopComplexRunUnit\n   SepTopComplexAnalysisUnit\n   SepTopSolventSetupUnit\n   SepTopSolventRunUnit\n   SepTopSolventAnalysisUnit\n   SepTopProtocolResult\n\nProtocol Settings\n-----------------\n\nBelow are the settings which can be tweaked in the protocol. The default settings (accessed using :meth:`SepTopProtocol.default_settings`) will automatically populate settings which we have found to be useful for running a Separated Topologies free energy calculation. There will however be some cases (such as when calculating difficult to converge systems) where you will need to tweak some of the following settings.\n\n\n.. module:: openfe.protocols.openmm_septop.equil_septop_settings\n\n.. autopydantic_model:: SepTopSettings\n   :model-show-json: False\n   :model-show-field-summary: False\n   :model-show-config-member: False\n   :model-show-config-summary: False\n   :model-show-validator-members: False\n   :model-show-validator-summary: False\n   :field-list-validators: False\n   :inherited-members: SettingsBaseModel\n   :exclude-members: get_defaults\n   :member-order: bysource\n\n\nProtocol Specific Settings Classes\n----------------------------------\n\nBelow are Settings classes which are unique to the `SepTopProtocol`.\n\n\n.. autopydantic_model:: AlchemicalSettings\n   :model-show-json: False\n   :model-show-field-summary: False\n   :model-show-config-member: False\n   :model-show-config-summary: False\n   :model-show-validator-members: False\n   :model-show-validator-summary: False\n   :field-list-validators: False\n   :inherited-members: SettingsBaseModel\n   :member-order: bysource\n\n.. autopydantic_model:: LambdaSettings\n   :model-show-json: False\n   :model-show-field-summary: False\n   :model-show-config-member: False\n   :model-show-config-summary: False\n   :model-show-validator-members: False\n   :model-show-validator-summary: False\n   :field-list-validators: False\n   :inherited-members: SettingsBaseModel\n   :member-order: bysource\n\n.. autopydantic_model:: SepTopEquilOutputSettings\n   :model-show-json: False\n   :model-show-field-summary: False\n   :model-show-config-member: False\n   :model-show-config-summary: False\n   :model-show-validator-members: False\n   :model-show-validator-summary: False\n   :field-list-validators: False\n   :inherited-members: SettingsBaseModel\n   :member-order: bysource\n"
  },
  {
    "path": "docs/reference/api/openmm_solvation_afe.rst",
    "content": "OpenMM Absolute Solvation Free Energy Protocol\n==============================================\n\n.. _afe solvation protocol api:\n\nThis section provides details about the OpenMM Absolute Solvation Free Energy Protocol\nimplemented in OpenFE.\n\nProtocol API specification\n--------------------------\n\n.. module:: openfe.protocols.openmm_afe.equil_solvation_afe_method\n\n.. autosummary::\n   :nosignatures:\n   :toctree: generated/\n\n   AbsoluteSolvationProtocol\n   AHFESolventAnalysisUnit\n   AHFESolventSetupUnit\n   AHFESolventSimUnit\n   AHFEVacuumAnalysisUnit\n   AHFEVacuumSetupUnit\n   AHFEVacuumSimUnit\n   AbsoluteSolvationProtocolResult\n\nProtocol Settings\n-----------------\n\n\nBelow are the settings which can be tweaked in the protocol. The default settings (accessed using :meth:`AbsoluteSolvationProtocol.default_settings`) will automatically populate settings which we have found to be useful for running solvation free energy calculations. There will however be some cases (such as when calculating difficult to converge systems) where you will need to tweak some of the following settings.\n\n\n.. autopydantic_model:: openfe.protocols.openmm_afe.equil_afe_settings.AbsoluteSolvationSettings\n   :model-show-json: False\n   :model-show-field-summary: False\n   :model-show-config-member: False\n   :model-show-config-summary: False\n   :model-show-validator-members: False\n   :model-show-validator-summary: False\n   :field-list-validators: False\n   :inherited-members: SettingsBaseModel\n   :exclude-members: get_defaults\n   :member-order: bysource\n\n\nProtocol Specific Settings Classes\n----------------------------------\n\nBelow are Settings classes which are unique to the ``AbsoluteSolvationProtocol``.\n\n.. autopydantic_model:: openfe.protocols.openmm_afe.equil_afe_settings.AlchemicalSettings\n   :model-show-json: False\n   :model-show-field-summary: False\n   :model-show-config-member: False\n   :model-show-config-summary: False\n   :model-show-validator-members: False\n   :model-show-validator-summary: False\n   :field-list-validators: False\n   :inherited-members: SettingsBaseModel\n   :member-order: bysource\n\n.. autopydantic_model:: openfe.protocols.openmm_afe.equil_afe_settings.LambdaSettings\n   :model-show-json: False\n   :model-show-field-summary: False\n   :model-show-config-member: False\n   :model-show-config-summary: False\n   :model-show-validator-members: False\n   :model-show-validator-summary: False\n   :field-list-validators: False\n   :inherited-members: SettingsBaseModel\n   :member-order: bysource\n"
  },
  {
    "path": "docs/reference/api/systems_and_components.rst",
    "content": "Chemical Systems and Components\n===============================\n\nWe describe a chemical system as being made up of one or more \"components,\" e.g., solvent, protein, or small molecule. The :class:`.ChemicalSystem` object joins components together into a simulation system.\n\n.. module:: openfe\n    :noindex:\n\n.. autosummary::\n    :nosignatures:\n    :toctree: generated/\n\n    ChemicalSystem\n    Transformation\n    Component\n    SmallMoleculeComponent\n    ProteinComponent\n    ProteinMembraneComponent\n    SolventComponent\n    SolvatedPDBComponent\n\n\nChemical System Generators\n--------------------------\n\n.. module:: openfe.setup.chemicalsystem_generator\n\n.. autosummary::\n    :nosignatures:\n    :toctree: generated/\n\n    EasyChemicalSystemGenerator\n"
  },
  {
    "path": "docs/reference/cli/charge_molecules.rst",
    "content": ".. _cli_charge_molecules:\n\n``charge-molecules`` command\n============================\n\n.. click:: openfecli.commands.generate_partial_charges:charge_molecules\n   :prog: openfe charge-molecules"
  },
  {
    "path": "docs/reference/cli/gather.rst",
    "content": ".. _cli_gather:\n\n``gather`` command\n====================\n\nCurrently, ``openfe gather`` is only able to gather results from Relative Binding Free Energy (RBFE) calculations.\n\nTo gather results from ABFE or SepTop protocols, you may use the experimental :ref:`openfe gather-abfe <gather-abfe>` and  :ref:`openfe gather-septop <gather-septop>` CLI commands, but please note that these commands are still under development and liable to change in future releases, and meant to be used only for exploratory work.\n\n.. click:: openfecli.commands.gather:gather\n   :prog: openfe gather\n\n\n.. _gather-abfe:\n\n.. click:: openfecli.commands.gather_abfe:gather_abfe\n   :prog: openfe gather-abfe\n\n\n.. _gather-septop:\n\n.. click:: openfecli.commands.gather_septop:gather_septop\n   :prog: openfe gather-septop\n"
  },
  {
    "path": "docs/reference/cli/index.rst",
    "content": ".. _cli-reference:\n\nCLI Reference\n=============\n\n.. toctree::\n    :maxdepth: 1\n\n    charge_molecules\n    plan_rhfe_network\n    plan_rbfe_network\n    quickrun\n    gather\n"
  },
  {
    "path": "docs/reference/cli/plan_rbfe_network.rst",
    "content": ".. _cli_plan-rbfe-network:\n\n``plan-rbfe-network`` command\n=============================\n\n.. click:: openfecli.commands.plan_rbfe_network:plan_rbfe_network\n   :prog: openfe plan-rbfe-network\n"
  },
  {
    "path": "docs/reference/cli/plan_rhfe_network.rst",
    "content": ".. _cli_plan-rhfe-network:\n\n``plan-rhfe-network`` command\n=============================\n\n.. click:: openfecli.commands.plan_rhfe_network:plan_rhfe_network\n   :prog: openfe plan-rhfe-network\n"
  },
  {
    "path": "docs/reference/cli/quickrun.rst",
    "content": ".. _cli_quickrun:\n\n``quickrun`` command\n====================\n\n.. click:: openfecli.commands.quickrun:quickrun\n   :prog: openfe quickrun\n"
  },
  {
    "path": "docs/reference/index.rst",
    "content": "Reference\n=========\n\nThis contains details of the Python API as well as a reference to the\ncommand line interface.\n\n.. note::\n   We have reproduced API documentation from the `gufe`_ package here for convenience.\n   `gufe`_ serves as a foundation layer for openfe, providing abstract base classes and object models, and so might be more useful for developers.\n\n.. toctree::\n    :maxdepth: 2\n\n    api/index\n    cli/index\n\n.. _gufe: https://gufe.readthedocs.io/en/latest/api.html\n"
  },
  {
    "path": "docs/tutorials/.gitignore",
    "content": "assets/\ninputs/"
  },
  {
    "path": "docs/tutorials/abfe_analysis_tutorial.nblink",
    "content": "{\n   \"path\": \"../ExampleNotebooks/abfe_tutorial/abfe_analysis.ipynb\"\n}\n"
  },
  {
    "path": "docs/tutorials/abfe_tutorial.nblink",
    "content": "{\n   \"path\": \"../ExampleNotebooks/abfe_tutorial/abfe_tutorial.ipynb\",\n   \"extra-media\": [\n      \"../ExampleNotebooks/abfe_tutorial/abfe-cycle.png\"\n   ]\n}\n"
  },
  {
    "path": "docs/tutorials/ahfe_tutorial.nblink",
    "content": "{\n   \"path\": \"../ExampleNotebooks/ahfe_tutorial/ahfe_tutorial.ipynb\",\n   \"extra-media\": [\n      \"../ExampleNotebooks/ahfe_tutorial/ahfe_cycle.png\"\n   ]\n}\n"
  },
  {
    "path": "docs/tutorials/charge_molecules_cli_tutorial.rst",
    "content": ".. _charge_molecules_cli_tutorial:\n\n.. include:: /ExampleNotebooks/cli_tutorials/cli_charge_molecules.md\n   :parser: myst_parser.sphinx_\n"
  },
  {
    "path": "docs/tutorials/index.rst",
    "content": "Tutorials\n=========\n\n.. todo: make sure we can inline the tutorial, for now we only provide links\n\nBelow is a collection of tutorials that demonstrate key elements of OpenFE tooling.\n\nYou can clone the `Example Notebooks Repository <https://github.com/OpenFreeEnergy/ExampleNotebooks>`_ to explore any of these tutorials interactively.\n\n\nRelative Free Energies\n----------------------\n\n- :any:`Python API Showcase <showcase_notebook>`: Start here! An introduction to OpenFE's Python API and approach to performing a relative binding free energy calculation.\n- :any:`RBFE using the Python API <rbfe_python_tutorial>`: A step-by-step tutorial for using the Python API to calculate relative binding free energies for TYK2.\n- :ref:`RBFE using the CLI <rbfe_cli_tutorial>`: A step-by-step tutorial for using the OpenFE command line interface (CLI) to calculate relative binding free energies for TYK2.\n- :any:`RBFE with membrane systems <rbfe_membrane_protein>`: A step-by-step guide to setting up an RBFE calculation with special considerations for membrane systems.\n\nAbsolute Free Energies\n----------------------\n\n- :any:`Absolute Absolute Free Energy Protocol <abfe_tutorial>`: A walk-through of calculating the absolute binding free energy of toluene to T4 Lysozyme.\n- :any:`Absolute Solvation Free Energy Protocol <ahfe_tutorial>`: A walk-through of calculating the hydration free energy of a benzene ligand.\n\nRelative Free Energies using Separated Topologies\n-------------------------------------------------\n\n- :any:`SepTop Protocol <septop_tutorial>`: A walk-through of calculating the relative binding free energy between TYK2 ligands using a Separated Topologies approach.\n\nMolecular Dynamics (MD)\n-----------------------\n\n- :any:`MD protocol <md_tutorial>`: A walk-through of running a conventional (non-alchemical) MD simulation of benzene bound to T4-lysozyme L99A.\n\nPost-Simulation Analysis\n------------------------\n\n- :any:`Cinnabar tutorial <plotting_with_cinnabar>`: A tutorial for using the `cinnabar <https://github.com/OpenFreeEnergy/cinnabar>`_ Python package to analyze (e.g. generating MLE estimates of absolute free energies) and plot networks of relative free energy results.\n\nGenerating Partial Charges\n--------------------------\n\n.. todo: this should be in cookbook\n\n-  :ref:`Generating Partial Charges CLI tutorial <charge_molecules_cli_tutorial>`: how to use the CLI to assign and store partial charges for mall molecules which can be used throughout the OpenFE ecosystem.\n\n.. toctree::\n    :maxdepth: 1\n    :hidden:\n\n    showcase_notebook\n    rbfe_python_tutorial\n    rbfe_cli_tutorial\n    rbfe_membrane_protein\n    abfe_tutorial\n    abfe_analysis_tutorial\n    ahfe_tutorial\n    septop_tutorial\n    septop_analysis_tutorial\n    md_tutorial\n    plotting_with_cinnabar\n    charge_molecules_cli_tutorial\n"
  },
  {
    "path": "docs/tutorials/md_tutorial.nblink",
    "content": "{\n   \"path\": \"../ExampleNotebooks/openmm_md/plain_md.ipynb\",\n   \"extra-media\": [\n      \"../ExampleNotebooks/openmm_md/assets/\"\n   ]\n}\n"
  },
  {
    "path": "docs/tutorials/plotting_with_cinnabar.nblink",
    "content": "{\n   \"path\": \"../ExampleNotebooks/plotting_rbfes_with_cinnabar/PlottingFreeEnergiesUsingCinnabar.ipynb\"\n}\n"
  },
  {
    "path": "docs/tutorials/rbfe_cli_tutorial.rst",
    "content": ".. _rbfe_cli_tutorial:\n\n.. include:: /ExampleNotebooks/rbfe_tutorial/cli_tutorial.md\n   :parser: myst_parser.sphinx_\n"
  },
  {
    "path": "docs/tutorials/rbfe_membrane_protein.nblink",
    "content": "{\n   \"path\": \"../ExampleNotebooks/membranes/rbfe_membrane_protein.ipynb\"\n}\n"
  },
  {
    "path": "docs/tutorials/rbfe_python_tutorial.nblink",
    "content": "{\n   \"path\": \"../ExampleNotebooks/rbfe_tutorial/rbfe_python_tutorial.ipynb\"\n}\n"
  },
  {
    "path": "docs/tutorials/septop_analysis_tutorial.nblink",
    "content": "{\n   \"path\": \"../ExampleNotebooks/openmm_septop/septop_analysis.ipynb\"\n}\n"
  },
  {
    "path": "docs/tutorials/septop_tutorial.nblink",
    "content": "{\n   \"path\": \"../ExampleNotebooks/openmm_septop/septop_tutorial.ipynb\",\n   \"extra-media\": [\n      \"../ExampleNotebooks/openmm_septop/septop_cycle.png\"\n   ]\n}\n"
  },
  {
    "path": "docs/tutorials/showcase_notebook.nblink",
    "content": "{\n   \"path\": \"../ExampleNotebooks/showcase/openfe_showcase.ipynb\",\n   \"extra-media\": [\n      \"../ExampleNotebooks/showcase/tyk2.png\",\n      \"../ExampleNotebooks/showcase/OFE-color-horizontal.png\",\n      \"../ExampleNotebooks/showcase/inputs\"\n   ]\n}\n"
  },
  {
    "path": "environment.yml",
    "content": "name: openfe_env\nchannels:\n  - conda-forge\ndependencies:\n  - cinnabar ~=0.5.0\n  - click >=8.2.0\n  - coverage\n  - dask>=2025  # temporary fix for https://github.com/openforcefield/openff-units/issues/140\n  - duecredit<0.10\n  - kartograf>=1.2.0\n  - konnektor~=0.2.0\n  - lomap2>=3.2.1\n  - networkx\n  - numpy\n  - openfe-analysis>=0.4.0 # min pin https://github.com/OpenFreeEnergy/openfe/issues/1834#issuecomment-3920079481, no max to check issues with new versions\n  - openff-interchange-base >=0.5.0,!= 0.5.1  # https://github.com/openforcefield/openff-interchange/issues/1450 and https://github.com/OpenFreeEnergy/openfe/pull/1901\n  - openff-nagl-base >=0.3.3\n  - openff-nagl-models>=0.1.2\n  - openff-toolkit-base >=0.16.2\n  - openff-units==0.3.1  # https://github.com/OpenFreeEnergy/openfe/pull/1374\n  - openmm ~=8.4.0  # omit 8.3.0 and 8.3.1 due to https://github.com/openmm/openmm/pull/5069\n  - openmmforcefields >=0.15.1  # min needed for https://github.com/openmm/openmmforcefields/pull/414\n  - openmmtools >=0.26  # fix to support membrane barostat: https://github.com/choderalab/openmmtools/pull/798\n  - packaging\n  - pandas\n  - parmed >=4.3.1  # fix to support numpy >=2.3: https://github.com/ParmEd/ParmEd/pull/1387\n  - perses>=0.10.3\n  - plugcli\n  - pint>=0.24.0\n  - pip\n  - pooch >= 1.9.0  # min needed for https://github.com/fatiando/pooch/issues/502\n  - py3dmol\n  - pydantic >= 2.0.0, <2.12.0  # https://github.com/openforcefield/openff-interchange/issues/1346\n  - pygraphviz\n  - pytest\n  - pytest-xdist\n  - pytest-cov\n  - pytest-regressions\n  - pytest-rerunfailures\n  - pyyaml\n  - rdkit\n  - rich\n  - tqdm\n  - typing-extensions\n  - zstandard\n  # Issue #443\n  - pymbar>4.0\n  # docs\n  - autodoc-pydantic>=2.0\n  - pydata-sphinx-theme\n  - sphinx-click\n  - sphinx-toolbox\n  # Control blas/openmp threads\n  - threadpoolctl\n  - pip:\n    - git+https://github.com/OpenFreeEnergy/gufe@main\n  - run_constrained:\n    # drop this pin when handled upstream in espaloma-feedstock\n    - smirnoff99frosst>=1.1.0.1  #https://github.com/openforcefield/smirnoff99Frosst/issues/109\n"
  },
  {
    "path": "news/TEMPLATE.rst",
    "content": "**Added:**\n\n* <news item>\n\n**Changed:**\n\n* <news item>\n\n**Deprecated:**\n\n* <news item>\n\n**Removed:**\n\n* <news item>\n\n**Fixed:**\n\n* <news item>\n\n**Security:**\n\n* <news item>\n"
  },
  {
    "path": "production/Dockerfile",
    "content": "FROM mambaorg/micromamba:1.4.1\n\nLABEL org.opencontainers.image.source=https://github.com/OpenFreeEnergy/openfe\nLABEL org.opencontainers.image.description=\"A Python package for executing alchemical free energy calculations.\"\nLABEL org.opencontainers.image.licenses=MIT\n# OpenFE Version we want to build\nARG VERSION\n\n# install ps\nUSER root\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n    procps \\\n    && rm -rf /var/lib/apt/lists/*\nUSER $MAMBA_USER\n\n# Don't buffer stdout & stderr streams, so if there is a crash no partial buffer output is lost\n# https://docs.python.org/3/using/cmdline.html#cmdoption-u\nENV PYTHONUNBUFFERED=1\n\nCOPY --chown=$MAMBA_USER:$MAMBA_USER production/environment.yml /tmp/env.yaml\nRUN micromamba install -y -n base git \"openfe==$VERSION\" -f /tmp/env.yaml && \\\n    micromamba clean --all --yes\n\n# Ensure that conda environment is automatically activated\n# https://github.com/mamba-org/micromamba-docker#running-commands-in-dockerfile-within-the-conda-environment\nARG MAMBA_DOCKERFILE_ACTIVATE=1\n"
  },
  {
    "path": "production/environment.yml",
    "content": "name: openfe_env\nchannels:\n  - conda-forge\ndependencies:\n  - cudatoolkit==11.8\n  - jupyterlab\n  - notebook\n  - openfe\n  - pip\n  - py3dmol\n  - pytest\n  - pytest-xdist\n  - python==3.12.*\n  - rdkit==2025.09.1\n"
  },
  {
    "path": "pyproject.toml",
    "content": "[build-system]\nbuild-backend = \"setuptools.build_meta\"\nrequires = [\n  \"setuptools>=77.0.3\",\n  \"setuptools-scm>=8\",\n]\n\n[project]\nname = \"openfe\"\ndescription = \"\"\nreadme = \"README.md\"\nlicense = \"MIT\"\nlicense-files = [ \"LICENSE\" ]\nauthors = [ { name = \"The OpenFE developers\", email = \"openfreeenergy@omsf.io\" } ]\nrequires-python = \">=3.11\"\nclassifiers = [\n  \"Development Status :: 5 - Production/Stable\",\n  \"Intended Audience :: Science/Research\",\n  \"Operating System :: POSIX\",\n  \"Programming Language :: Python :: 3 :: Only\",\n  \"Programming Language :: Python :: 3.11\",\n  \"Programming Language :: Python :: 3.12\",\n  \"Programming Language :: Python :: 3.13\",\n  \"Programming Language :: Python :: 3.14\",\n  \"Topic :: Scientific/Engineering :: Bio-Informatics\",\n  \"Topic :: Scientific/Engineering :: Chemistry\",\n]\ndynamic = [ \"version\" ]\nurls = { Homepage = \"https://github.com/OpenFreeEnergy/openfe\" }\nscripts.openfe = \"openfecli.cli:main\"\n\n[tool.setuptools]\nzip-safe = false\ninclude-package-data = true\npackage-data.openfe = [ '\"./src/openfe/tests/data/lomap_basic/toluene.mol2\"' ]\npackages.find.where = [ \"src\" ]\npackages.find.namespaces = false\n\n[tool.setuptools_scm]\nfallback_version = \"0.0.0\"\n\n[tool.ruff]\nline-length = 100\nformat.docstring-code-format = true\n# Enable Pyflakes (`F`) and a subset of the pycodestyle (`E`)  codes by default.\nlint.select = [\n  \"E\", # pycodestyle errors\n  \"F\", # Pyflakes\n  \"I\", # isort\n  \"W\", # pycodestyle warnings\n  # \"C901\"  # mccabe complexity  TODO: add this back in\n  # \"UP\", # TODO: add this in\n]\nlint.ignore = [\n  \"E402\", # module-level import not at top (conflicts w/ isort)\n  \"E501\", # line length too long, resolve this for comments\n  \"F401\", # unused imports (TODO: we should fix these)\n  \"F811\",\n  \"F841\",\n  \"UP03\", # pyupgrade linting (TODO: we should fix these)\n]\nlint.isort.known-first-party = [ \"openfe\" ]\n\n[tool.mypy]\nfiles = \"src/openfe\"  # TODO: add src/openfecli\nignore_missing_imports = true\nwarn_unused_ignores = true\n\n[tool.coverage]\nrun.omit = [\n  \"src/*/tests/dev/*py\",\n  \"src/*/tests/protocols/test_openmm_rfe_slow.py\",\n  \"src/openfe/due.py\",\n]\nreport.exclude_lines = [\n  \"-no-cov\",\n  'if __name__ == \"__main__\"',\n  \"pragma: no cover\",\n  \"pragma: no-cover\",\n  \"raise NotImplementedError\",\n]\n"
  },
  {
    "path": "rever.xsh",
    "content": "$PROJECT = $GITHUB_REPO = 'openfe'\n$GITHUB_ORG = 'OpenFreeEnergy'\n\n$ACTIVITIES = ['changelog']\n\n$CHANGELOG_FILENAME = 'docs/CHANGELOG.rst'\n$CHANGELOG_TEMPLATE = 'TEMPLATE.rst'\n"
  },
  {
    "path": "src/openfe/__init__.py",
    "content": "# Before we do anything else, we want to disable JAX\n# acceleration by default but if a user has set\n# PYMBAR_DISABLE_JAX to some value, we want to keep\n# it\n\nimport logging\nimport os\n\nlogger = logging.getLogger(__name__)\n\nif \"PYMBAR_DISABLE_JAX\" in os.environ:\n    logger.info(\n        f\"PYMBAR_DISABLE_JAX set to {os.environ.get('PYMBAR_DISABLE_JAX')}. See https://docs.openfree.energy/en/latest/guide/troubleshooting.html#pymbar-disable-jax for more details\"\n    )\n\n# setdefault will only set PYMBAR_DISABLE_JAX if it is unset\nos.environ.setdefault(\"PYMBAR_DISABLE_JAX\", \"TRUE\")\n\n\n# We need to do this first so that we can set up our\n# log control since some modules have warnings on import\nfrom openfe.utils import logging_control\n\nlogging_control._silence_message(\n    msg=[\n        \"****** PyMBAR will use 64-bit JAX! *******\",\n    ],\n    logger_names=[\n        \"pymbar.mbar_solvers\",\n    ],\n)\n\nlogging_control._silence_message(\n    msg=[\n        \"Warning on use of the timeseries module:\",\n    ],\n    logger_names=[\n        \"pymbar.timeseries\",\n    ],\n)\n\nlogging_control._append_logger(\n    suffix=\"\\n \\n[OPENFE]: The simulation is still using the compute platform specified in the settings \\n See this URL for more information: https://docs.openfree.energy/en/latest/guide/troubleshooting.html#jax-warnings \\n\\n\",\n    logger_names=\"jax._src.xla_bridge\",\n)\n\n\nfrom importlib.metadata import version\n\nfrom gufe import (\n    AlchemicalNetwork,\n    ChemicalSystem,\n    Component,\n    LigandAtomMapping,\n    NonTransformation,\n    ProteinComponent,\n    ProteinMembraneComponent,\n    SmallMoleculeComponent,\n    SolvatedPDBComponent,\n    SolventComponent,\n    Transformation,\n)\nfrom gufe.protocols import (\n    Protocol,\n    ProtocolDAG,\n    ProtocolDAGResult,\n    ProtocolResult,\n    ProtocolUnit,\n    ProtocolUnitFailure,\n    ProtocolUnitResult,\n    execute_DAG,\n)\n\nfrom . import analysis, orchestration, setup, utils\nfrom .setup import (\n    KartografAtomMapper,\n    LigandAtomMapper,\n    LigandNetwork,\n    LomapAtomMapper,\n    PersesAtomMapper,\n    ligand_network_planning,\n    lomap_scorers,\n    perses_scorers,\n)\n\n__version__ = version(\"openfe\")\n"
  },
  {
    "path": "src/openfe/analysis/__init__.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\nfrom . import plotting\n"
  },
  {
    "path": "src/openfe/analysis/plotting.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\nimport warnings\nfrom typing import Optional, Union\n\nimport matplotlib.pyplot as plt\nimport numpy as np\nimport numpy.typing as npt\nfrom matplotlib.axes import Axes\nfrom openff.units import Quantity\n\n\ndef plot_lambda_transition_matrix(matrix: npt.NDArray) -> Axes:\n    \"\"\"\n    Plot out a transition matrix.\n\n    Parameters\n    ----------\n    matrix : npt.NDArray\n      A nstates by nstates matrix of transition estimates.\n\n    Returns\n    -------\n    ax : matplotlib.axes.Axes\n      An Axes object to plot.\n\n    Raises\n    ------\n    UserWarning\n      If any row or column exceeds a sum value of 1.01. This indicates\n      an incorrect overlap/probability matrix.\n\n    Notes\n    -----\n    Borrowed from `alchemlyb <https://github.com/alchemistry/alchemlyb/blob/master/src/alchemlyb/visualisation/mbar_matrix.py>`_\n    which itself borrows from `alchemical-analysis <https://github.com/MobleyLab/alchemical-analysis>`_.\n    \"\"\"\n    num_states = len(matrix)\n\n    # Check if any row or column isn't close to 1.0\n    # Throw a warning if it's the case\n    if not np.allclose(matrix.sum(axis=0), 1.0) or not np.allclose(matrix.sum(axis=1), 1.0):\n        wmsg = (\n            \"Overlap/probability matrix exceeds a sum of 1.0 in one or \"\n            \"more columns or rows of the matrix. This indicates an \"\n            \"incorrect overlap/probability matrix.\"\n        )\n        warnings.warn(wmsg)\n\n    fig, ax = plt.subplots(figsize=(num_states / 2, num_states / 2))\n    ax.axis(\"off\")\n    for i in range(num_states):\n        if i != 0:\n            ax.axvline(x=i, ls=\"-\", lw=0.5, color=\"k\", alpha=0.25)\n            ax.axhline(y=i, ls=\"-\", lw=0.5, color=\"k\", alpha=0.25)\n        for j in range(num_states):\n            val = matrix[i, j]\n\n            # Catch if 0.05 from 0 or 1\n            # https://github.com/OpenFreeEnergy/openfe/issues/806\n            if matrix[j, i] < 0.005:\n                # This replicates the same behaviour as alchemical-analysis & alchemlyb\n                # i.e. near-zero values will just not be annotated\n                val_str = \"\"\n            elif matrix[j, i] > 0.995:\n                val_str = \"{:.2f}\".format(matrix[j, i])[:4]\n            else:\n                val_str = \"{:.2f}\".format(matrix[j, i])[1:]\n\n            rel_prob = val / matrix.max()\n\n            # shade box\n            ax.fill_between(\n                [i, i + 1],\n                [num_states - j, num_states - j],\n                [num_states - (j + 1), num_states - (j + 1)],\n                color=\"k\",\n                alpha=rel_prob,\n            )\n            # annotate box\n            ax.annotate(\n                val_str,\n                xy=(i, j),\n                xytext=(i + 0.5, num_states - (j + 0.5)),\n                size=8,\n                va=\"center\",\n                ha=\"center\",\n                color=(\"k\" if rel_prob < 0.5 else \"w\"),\n            )\n\n        # annotate axes\n        base_settings: dict[str, Union[str, int]] = {\n            \"size\": 10,\n            \"va\": \"center\",\n            \"ha\": \"center\",\n            \"color\": \"k\",\n            \"family\": \"sans-serif\",\n        }\n        for i in range(num_states):\n            ax.annotate(\n                text=f\"{i}\",\n                xy=(i + 0.5, 1),\n                xytext=(i + 0.5, num_states + 0.5),\n                xycoords=\"data\",\n                textcoords=None,\n                arrowprops=None,\n                annotation_clip=None,\n                **base_settings,\n            )\n            ax.annotate(\n                text=f\"{i}\",\n                xy=(-0.5, num_states - (num_states - 0.5)),\n                xytext=(-0.5, num_states - (i + 0.5)),\n                xycoords=\"data\",\n                textcoords=None,\n                arrowprops=None,\n                annotation_clip=None,\n                **base_settings,\n            )\n\n        ax.annotate(\n            r\"$\\lambda$\",\n            xy=(-0.5, num_states - (num_states - 0.5)),\n            xytext=(-0.5, num_states + 0.5),\n            xycoords=\"data\",\n            textcoords=None,\n            arrowprops=None,\n            annotation_clip=None,\n            **base_settings,\n        )\n\n    # add border\n    ax.plot([0, num_states], [0, 0], \"k-\", lw=2.0)\n    ax.plot([num_states, num_states], [0, num_states], \"k-\", lw=2.0)\n    ax.plot([0, num_states], [num_states, num_states], \"k-\", lw=2.0)\n    ax.plot([0, 0], [0, num_states], \"k-\", lw=2.0)\n\n    return ax\n\n\ndef plot_convergence(\n    forward_and_reverse: dict[str, Union[npt.NDArray, Quantity]], units: Quantity\n) -> Axes:\n    \"\"\"\n    Plot a Reverse and Forward convergence analysis of the\n    free energies.\n\n    Parameters\n    ----------\n    forward_and_reverse : dict[str, npt.NDArray]\n      A dictionary containing the reverse and forward\n      values of the free energies sampled along a given fraction\n      of the sample size.\n    units : openff.units.Quantity\n      The units the free energies are provided in.\n\n    Returns\n    -------\n    ax : matplotlib.axes.Axes\n      An Axes object to plot.\n\n    Notes\n    -----\n    Modified from `alchemical analysis <<https://github.com/MobleyLab/alchemical-analysis>>`_\n    \"\"\"\n    known_units = {\n        \"kilojoule_per_mole\": \"kJ/mol\",\n        \"kilojoules_per_mole\": \"kJ/mol\",\n        \"kilocalorie_per_mole\": \"kcal/mol\",\n        \"kilocalories_per_mole\": \"kcal/mol\",\n    }\n\n    try:\n        plt_units = known_units[str(units)]\n    except KeyError:\n        errmsg = (\n            f\"Unknown plotting units {units} passed, acceptable \"\n            \"values are kilojoule(s)_per_mole and \"\n            \"kilocalorie(s)_per_mole\"\n        )\n        raise ValueError(errmsg)\n\n    fig, ax = plt.subplots(figsize=(8, 6))\n\n    # Old style alchemical analysis formatting\n    plt.setp(ax.spines[\"bottom\"], color=\"#D2B9D3\", lw=3, zorder=-2)\n    plt.setp(ax.spines[\"left\"], color=\"#D2B9D3\", lw=3, zorder=-2)\n\n    for dire in [\"top\", \"right\"]:\n        ax.spines[dire].set_color(\"none\")\n\n    ax.xaxis.set_ticks_position(\"bottom\")\n    ax.yaxis.set_ticks_position(\"left\")\n\n    # Set the overall error bar to the final error for the reverse results\n    overall_error = forward_and_reverse[\"reverse_dDGs\"][-1].m  # type: ignore\n    final_value = forward_and_reverse[\"reverse_DGs\"][-1].m  # type: ignore\n    ax.fill_between(\n        [0, 1], final_value - overall_error, final_value + overall_error, color=\"#D2B9D3\", zorder=1\n    )\n\n    ax.errorbar(\n        forward_and_reverse[\"fractions\"],  # type: ignore\n        [val.m for val in forward_and_reverse[\"forward_DGs\"]],  # type: ignore\n        yerr=[err.m for err in forward_and_reverse[\"forward_dDGs\"]],  # type: ignore\n        color=\"#736AFF\",\n        lw=3,\n        zorder=2,\n        marker=\"o\",\n        mfc=\"w\",\n        mew=2.5,\n        mec=\"#736AFF\",\n        ms=8,\n        label=\"Forward\",\n    )\n\n    ax.errorbar(\n        forward_and_reverse[\"fractions\"],  # type: ignore\n        [val.m for val in forward_and_reverse[\"reverse_DGs\"]],  # type: ignore\n        yerr=[err.m for err in forward_and_reverse[\"reverse_dDGs\"]],  # type: ignore\n        color=\"#C11B17\",\n        lw=3,\n        zorder=2,\n        marker=\"o\",\n        mfc=\"w\",\n        mew=2.5,\n        mec=\"#C11B17\",\n        ms=8,\n        label=\"Reverse\",\n    )\n    ax.legend(frameon=False)\n\n    ax.set_ylabel(r\"$\\Delta G$\" + f\" ({plt_units})\")\n    ax.set_xlabel(\"Fraction of uncorrelated samples\")\n\n    return ax\n\n\ndef plot_replica_timeseries(\n    state_timeseries: npt.NDArray,\n    equilibration_iterations: Optional[int] = None,\n) -> Axes:\n    \"\"\"\n    Plot a the state timeseries of a set of replicas.\n\n    Parameters\n    ----------\n    state_timeseries : npt.NDArray\n      A 2D n_iterattions by n_states array of the replica timeseries.\n    equilibration_iterations : Optional[int]\n      The number of iterations used up as equilibration time.\n\n    Returns\n    -------\n    ax : matplotlib.axes.Axes\n      An Axes object to plot.\n    \"\"\"\n    num_states = len(state_timeseries.T)\n\n    fig, ax = plt.subplots(figsize=(num_states, 4))\n    iterations = [i for i in range(len(state_timeseries))]\n\n    for i in range(num_states):\n        ax.scatter(iterations, state_timeseries.T[i], label=f\"replica {i}\", s=8)\n\n    ax.set_xlabel(\"Number of simulation iterations\")\n    ax.set_ylabel(\"Lambda state\")\n    ax.set_title(\"Change in replica lambda state over time\")\n\n    if equilibration_iterations is not None:\n        ax.axvline(\n            x=equilibration_iterations, color=\"grey\", linestyle=\"--\", label=\"equilibration limit\"\n        )\n\n    ax.legend(loc=\"center left\", bbox_to_anchor=(1, 0.5))\n    return ax\n\n\ndef plot_2D_rmsd(data: list[list[float]], vmax=5.0) -> plt.Figure:\n    \"\"\"Plots 2D RMSD for many states\n\n    Parameters\n    ----------\n    data : list[list[float]]\n      for each state, the 2D RMSD\n    vmax : float, optional\n      the value to consider \"high\" in the colourmap to flag bad values,\n      defaults to 5.0 (A)\n\n    Returns\n    -------\n    matplotlib Figure\n    \"\"\"\n    twod_rmsd_arrs = []\n    for state in data:\n        # unpack 2D RMSD data\n        # we store N(N-1)//2 values, so find N then make symmetric array\n        N = int((1 + np.sqrt(8 * len(state) + 1)) / 2)\n        arr = np.zeros((N, N))\n        arr[np.triu_indices_from(arr, k=1)] = state\n        arr += arr.T\n\n        twod_rmsd_arrs.append(arr)\n\n    nplots = len(data) + 1  # + colorbar\n\n    # plot on 4 x n grid\n    nrows = nplots // 4 + (1 if nplots % 4 else 0)\n\n    fig, axes = plt.subplots(nrows, 4)\n\n    for i, (arr, ax) in enumerate(zip(twod_rmsd_arrs, axes.flatten())):\n        ax.imshow(arr, vmin=0, vmax=vmax, cmap=plt.get_cmap(\"cividis\"))\n        ax.axis(\"off\")  # turn off ticks/labels\n        ax.set_title(f\"State {i}\")\n\n    # if we have any leftover plots then we turn them off\n    # except the last one!\n    overage = len(axes.flatten()) - len(twod_rmsd_arrs)\n    for i in range(overage, len(axes.flatten()) - 1):\n        axes.flatten()[i].set_axis_off()\n\n    plt.colorbar(\n        axes.flatten()[0].images[0],\n        cax=axes.flatten()[-1],\n        label=\"RMSD scale (A)\",\n        orientation=\"horizontal\",\n    )\n\n    fig.suptitle(\"Protein 2D RMSD\")\n    fig.tight_layout()\n\n    return fig\n\n\ndef plot_ligand_COM_drift(time: list[float], data: list[list[float]]):\n    fig, ax = plt.subplots()\n\n    for i, s in enumerate(data):\n        ax.plot(time, s, label=f\"State {i}\")\n\n    ax.legend(loc=\"upper left\")\n    ax.set_xlabel(\"Time (ps)\")\n    ax.set_ylabel(\"Distance (A)\")\n    ax.set_title(\"Ligand COM drift\")\n\n    return fig\n\n\ndef plot_ligand_RMSD(time: list[float], data: list[list[float]]):\n    fig, ax = plt.subplots()\n\n    for i, s in enumerate(data):\n        ax.plot(time, s, label=f\"State {i}\")\n\n    ax.legend(loc=\"upper left\")\n    ax.set_xlabel(\"Time (ps)\")\n    ax.set_ylabel(\"RMSD (A)\")\n    ax.set_title(\"Ligand RMSD\")\n\n    return fig\n"
  },
  {
    "path": "src/openfe/data/__init__.py",
    "content": ""
  },
  {
    "path": "src/openfe/data/_downloader.py",
    "content": "import pooch\n\nfrom ._registry import zenodo_data_registry\n\n\ndef retrieve_registry_data(zenodo_registry: list[dict], path: str) -> None:\n    \"\"\"Helper function for pulling all test data up-front.\n\n    Parameters\n    ----------\n    path : str\n        path to store the data - usually a pooch.os_cache instance.\n\n    \"\"\"\n    downloader = pooch.DOIDownloader(progressbar=True)\n\n    def _infer_processor(fname: str):\n        if fname.endswith(\"tar.gz\"):\n            return pooch.Untar()\n        elif fname.endswith(\"zip\"):\n            return pooch.Unzip()\n        else:\n            return None\n\n    for d in zenodo_registry:\n        pooch.retrieve(\n            url=d[\"base_url\"] + d[\"fname\"],\n            known_hash=d[\"known_hash\"],\n            fname=d[\"fname\"],\n            processor=_infer_processor(d[\"fname\"]),\n            downloader=downloader,\n            path=path,\n        )\n"
  },
  {
    "path": "src/openfe/data/_registry.py",
    "content": "import pooch\n\nPOOCH_CACHE = pooch.os_cache(\"openfe\")\n\nzenodo_rfe_simulation_nc = dict(\n    base_url=\"doi:10.5281/zenodo.15375081/\",\n    fname=\"simulation.nc\",\n    known_hash=\"md5:bc4e842b47de17704d804ae345b91599\",\n)\nzenodo_t4_lysozyme_traj = dict(\n    base_url=\"doi:10.5281/zenodo.15212342\",\n    fname=\"t4_lysozyme_trajectory.zip\",\n    known_hash=\"sha256:e985d055db25b5468491e169948f641833a5fbb67a23dbb0a00b57fb7c0e59c8\",\n)\nzenodo_industry_benchmark_systems = dict(\n    base_url=\"doi:10.5281/zenodo.15212342\",\n    fname=\"industry_benchmark_systems.zip\",\n    known_hash=\"sha256:2bb5eee36e29b718b96bf6e9350e0b9957a592f6c289f77330cbb6f4311a07bd\",\n)\nzenodo_resume_data = dict(\n    base_url=\"doi:10.5281/zenodo.19694844\",\n    fname=\"multistate_checkpoints.zip\",\n    known_hash=\"md5:a6bdceff0c4a2f200538edb17c21d443\",\n)\nzenodo_md_resume_data = dict(\n    base_url=\"doi:10.5281/zenodo.19694944\",\n    fname=\"checkpoint.xml\",\n    known_hash=\"md5:0f3957c263b5def8de727c5c419b31b5\",\n)\n\nzenodo_data_registry = [\n    zenodo_rfe_simulation_nc,\n    zenodo_t4_lysozyme_traj,\n    zenodo_industry_benchmark_systems,\n    zenodo_resume_data,\n    zenodo_md_resume_data,\n]\n"
  },
  {
    "path": "src/openfe/due.py",
    "content": "# emacs: at the end of the file\n# ex: set sts=4 ts=4 sw=4 et:\n# ## ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### #\n\"\"\"\n\nStub file for a guaranteed safe import of duecredit constructs:  if duecredit\nis not available.\n\nTo use it, place it into your project codebase to be imported, e.g. copy as\n\n    cp stub.py /path/tomodule/module/due.py\n\nNote that it might be better to avoid naming it duecredit.py to avoid shadowing\ninstalled duecredit.\n\nThen use in your code as\n\n    from .due import due, Doi, BibTeX, Text\n\nSee  https://github.com/duecredit/duecredit/blob/master/README.md for examples.\n\nOrigin:     Originally a part of the duecredit\nCopyright:  2015-2021  DueCredit developers\nLicense:    BSD-2\n\"\"\"\n\n__version__ = \"0.0.9\"\n\n\nclass InactiveDueCreditCollector(object):\n    \"\"\"Just a stub at the Collector which would not do anything\"\"\"\n\n    def _donothing(self, *args, **kwargs):\n        \"\"\"Perform no good and no bad\"\"\"\n        pass\n\n    def dcite(self, *args, **kwargs):\n        \"\"\"If I could cite I would\"\"\"\n\n        def nondecorating_decorator(func):\n            return func\n\n        return nondecorating_decorator\n\n    active = False\n    activate = add = cite = dump = load = _donothing\n\n    def __repr__(self):\n        return self.__class__.__name__ + \"()\"\n\n\ndef _donothing_func(*args, **kwargs):\n    \"\"\"Perform no good and no bad\"\"\"\n    pass\n\n\ntry:\n    from duecredit import BibTeX, Doi, Text, Url, due  # lgtm [py/unused-import]\n\n    if \"due\" in locals() and not hasattr(due, \"cite\"):\n        raise RuntimeError(\"Imported due lacks .cite. DueCredit is now disabled\")\nexcept Exception as e:\n    if not isinstance(e, ImportError):\n        import logging\n\n        logging.getLogger(\"duecredit\").error(\"Failed to import duecredit due to %s\" % str(e))\n    # Initiate due stub\n    due = InactiveDueCreditCollector()\n    BibTeX = Doi = Url = Text = _donothing_func\n\n# Emacs mode definitions\n# Local Variables:\n# mode: python\n# py-indent-offset: 4\n# tab-width: 4\n# indent-tabs-mode: nil\n# End:\n"
  },
  {
    "path": "src/openfe/orchestration/__init__.py",
    "content": ""
  },
  {
    "path": "src/openfe/protocols/__init__.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\n"
  },
  {
    "path": "src/openfe/protocols/openmm_afe/__init__.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\n\"\"\"\nRun absolute free energy calculations using OpenMM and OpenMMTools.\n\n\"\"\"\n\nfrom .abfe_units import (\n    ABFEComplexAnalysisUnit,\n    ABFEComplexSetupUnit,\n    ABFEComplexSimUnit,\n    ABFESolventAnalysisUnit,\n    ABFESolventSetupUnit,\n    ABFESolventSimUnit,\n)\nfrom .afe_protocol_results import (\n    AbsoluteBindingProtocolResult,\n    AbsoluteSolvationProtocolResult,\n)\nfrom .ahfe_units import (\n    AHFESolventAnalysisUnit,\n    AHFESolventSetupUnit,\n    AHFESolventSimUnit,\n    AHFEVacuumAnalysisUnit,\n    AHFEVacuumSetupUnit,\n    AHFEVacuumSimUnit,\n)\nfrom .equil_binding_afe_method import (\n    AbsoluteBindingProtocol,\n    AbsoluteBindingSettings,\n)\nfrom .equil_solvation_afe_method import (\n    AbsoluteSolvationProtocol,\n    AbsoluteSolvationSettings,\n)\n\n__all__ = [\n    \"AbsoluteSolvationProtocol\",\n    \"AbsoluteSolvationSettings\",\n    \"AbsoluteSolvationProtocolResult\",\n    \"AHFESolventSetupUnit\",\n    \"AHFESolventSimUnit\",\n    \"AHFESolventAnalysisUnit\",\n    \"AHFEVacuumSetupUnit\",\n    \"AHFEVacuumSimUnit\",\n    \"AHFEVacuumAnalysisUnit\",\n    \"AbsoluteBindingProtocol\",\n    \"AbsoluteBindingSettings\",\n    \"AbsoluteBindingProtocolResult\",\n    \"ABFEComplexSetupUnit\",\n    \"ABFEComplexSimUnit\",\n    \"ABFEComplexAnalysisUnit\",\n    \"ABFESolventSetupUnit\",\n    \"ABFESolventSimUnit\",\n    \"ABFESolventAnalysisUnit\",\n]\n"
  },
  {
    "path": "src/openfe/protocols/openmm_afe/abfe_units.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\n\"\"\"ABFE Protocol Units --- :mod:`openfe.protocols.openmm_afe.abfe_units`\n========================================================================\nThis module defines the ProtocolUnits for the\n:class:`AbsoluteBindingProtocol`.\n\"\"\"\n\nimport logging\nimport pathlib\nfrom collections.abc import Iterable\n\nimport MDAnalysis as mda\nimport numpy as np\nimport numpy.typing as npt\nfrom gufe import (\n    SolventComponent,\n)\nfrom gufe.components import Component, SolvatedPDBComponent\nfrom openff.units import Quantity\nfrom openff.units.openmm import to_openmm\nfrom openmm import System\nfrom openmm import unit as ommunit\nfrom openmm.app import Topology as omm_topology\nfrom openmmtools.states import ThermodynamicState\nfrom rdkit import Chem\n\nfrom openfe.protocols.openmm_afe.equil_afe_settings import (\n    BoreschRestraintSettings,\n    SettingsBaseModel,\n)\nfrom openfe.protocols.openmm_utils import system_validation\nfrom openfe.protocols.restraint_utils import geometry\nfrom openfe.protocols.restraint_utils.geometry.boresch import BoreschRestraintGeometry\nfrom openfe.protocols.restraint_utils.openmm import omm_restraints\nfrom openfe.protocols.restraint_utils.openmm.omm_restraints import BoreschRestraint\n\nfrom .base_afe_units import (\n    BaseAbsoluteMultiStateAnalysisUnit,\n    BaseAbsoluteMultiStateSimulationUnit,\n    BaseAbsoluteSetupUnit,\n)\n\nlogger = logging.getLogger(__name__)\n\n\nclass ComplexComponentsMixin:\n    def _get_components(self):\n        \"\"\"\n        Get the relevant components for a complex transformation.\n\n        Returns\n        -------\n        alchem_comps : dict[str, Component]\n          A dict of alchemical components\n        solv_comp : SolventComponent\n          The SolventComponent of the system\n        prot_comp : ProteinComponent | None\n          The protein component of the system, if it exists.\n        small_mols : dict[SmallMoleculeComponent: OFFMolecule]\n          SmallMoleculeComponents to add to the system.\n        \"\"\"\n        stateA = self._inputs[\"stateA\"]\n        alchem_comps = self._inputs[\"alchemical_components\"]\n\n        solv_comp, prot_comp, small_mols = system_validation.get_components(stateA)\n        off_comps = {m: m.to_openff() for m in small_mols}\n\n        # We don't need to check that solv_comp is not None, otherwise\n        # an error will have been raised when calling `validate_solvent`\n        # in the Protocol's `_create`.\n        # Similarly we don't need to check prot_comp\n\n        # If there is an SolvatedPDBComponent, we set the solv_comp\n        # in the complex to the SolvatedPDBComponent, as the SolventComponent\n        # is only used in the solvent leg\n        if isinstance(prot_comp, SolvatedPDBComponent):\n            solv_comp = prot_comp\n\n        return alchem_comps, solv_comp, prot_comp, off_comps\n\n\nclass ComplexSettingsMixin:\n    def _get_settings(self) -> dict[str, SettingsBaseModel]:\n        \"\"\"\n        Extract the relevant settings for a complex transformation.\n\n        Returns\n        -------\n        settings : dict[str, SettingsBaseModel]\n          A dictionary with the following entries:\n            * forcefield_settings : OpenMMSystemGeneratorFFSettings\n            * thermo_settings : ThermoSettings\n            * charge_settings : OpenFFPartialChargeSettings\n            * solvation_settings : OpenMMSolvationSettings\n            * alchemical_settings : AlchemicalSettings\n            * lambda_settings : LambdaSettings\n            * engine_settings : OpenMMEngineSettings\n            * integrator_settings : IntegratorSettings\n            * equil_simulation_settings : MDSimulationSettings\n            * equil_output_settings : ABFEPreEquilOutputSettings\n            * simulation_settings : SimulationSettings\n            * output_settings: MultiStateOutputSettings\n            * restraint_settings: BaseRestraintSettings\n        \"\"\"\n        prot_settings = self._inputs[\"protocol\"].settings  # type: ignore[attr-defined]\n\n        settings = {}\n        settings[\"forcefield_settings\"] = prot_settings.forcefield_settings\n        settings[\"thermo_settings\"] = prot_settings.thermo_settings\n        settings[\"charge_settings\"] = prot_settings.partial_charge_settings\n        settings[\"solvation_settings\"] = prot_settings.complex_solvation_settings\n        settings[\"alchemical_settings\"] = prot_settings.alchemical_settings\n        settings[\"lambda_settings\"] = prot_settings.complex_lambda_settings\n        settings[\"engine_settings\"] = prot_settings.engine_settings\n        settings[\"integrator_settings\"] = prot_settings.complex_integrator_settings\n        settings[\"equil_simulation_settings\"] = prot_settings.complex_equil_simulation_settings\n        settings[\"equil_output_settings\"] = prot_settings.complex_equil_output_settings\n        settings[\"simulation_settings\"] = prot_settings.complex_simulation_settings\n        settings[\"output_settings\"] = prot_settings.complex_output_settings\n        settings[\"restraint_settings\"] = prot_settings.restraint_settings\n\n        return settings\n\n\nclass ABFEComplexSetupUnit(ComplexComponentsMixin, ComplexSettingsMixin, BaseAbsoluteSetupUnit):\n    \"\"\"\n    Setup unit for the complex phase of absolute binding free energy\n    transformations.\n    \"\"\"\n\n    simtype = \"complex\"\n\n    @staticmethod\n    def _get_mda_universe(\n        topology: omm_topology,\n        positions: ommunit.Quantity | None,\n        trajectory: pathlib.Path | None,\n    ) -> mda.Universe:\n        \"\"\"\n        Helper method to get a Universe from an openmm Topology,\n        and either an input trajectory or a set of positions.\n\n        Parameters\n        ----------\n        topology : openmm.app.Topology\n          An OpenMM Topology that defines the System.\n        positions: openmm.unit.Quantity | None\n          The System's current positions.\n          Used if a trajectory file is None or is not a file.\n        trajectory: pathlib.Path | None\n          A Path to a trajectory file to read positions from.\n\n        Returns\n        -------\n        mda.Universe\n          An MDAnalysis Universe of the System.\n        \"\"\"\n        from MDAnalysis.coordinates.memory import MemoryReader\n\n        # If the trajectory file doesn't exist, then we use positions\n        if trajectory is not None and trajectory.is_file():\n            return mda.Universe(\n                topology,\n                trajectory,\n                topology_format=\"OPENMMTOPOLOGY\",\n            )\n        else:\n            if positions is None:\n                raise ValueError(\"No positions to create the Universe with\")\n\n            # Positions is an openmm Quantity in nm we need\n            # to convert to angstroms\n            return mda.Universe(\n                topology,\n                np.array(positions._value) * 10,\n                topology_format=\"OPENMMTOPOLOGY\",\n                trajectory_format=MemoryReader,\n            )\n\n    @staticmethod\n    def _get_idxs_from_residxs(\n        topology: omm_topology,\n        residxs: Iterable[int],\n    ) -> list[int]:\n        \"\"\"\n        Helper method to get the a list of atom indices which belong to a list\n        of residues.\n\n        Parameters\n        ----------\n        topology : openmm.app.Topology\n          An OpenMM Topology that defines the System.\n        residxs : Iterable[int]\n          A list of residue numbers who's atoms we should get atom indices.\n\n        Returns\n        -------\n        atom_ids : list[int]\n          A list of atom indices.\n\n        TODO\n        ----\n        * Check how this works when we deal with virtual sites.\n        \"\"\"\n        atom_ids = []\n\n        for r in topology.residues():\n            if r.index in residxs:\n                atom_ids.extend([at.index for at in r.atoms()])\n\n        return atom_ids\n\n    @staticmethod\n    def _get_boresch_restraint(\n        universe: mda.Universe,\n        guest_rdmol: Chem.Mol,\n        guest_atom_ids: list[int],\n        host_atom_ids: list[int],\n        temperature: Quantity,\n        settings: BoreschRestraintSettings,\n    ) -> tuple[BoreschRestraintGeometry, BoreschRestraint]:\n        \"\"\"\n        Get a Boresch-like restraint Geometry and OpenMM restraint force\n        supplier.\n\n        Parameters\n        ----------\n        universe : mda.Universe\n          An MDAnalysis Universe defining the system to get the restraint for.\n        guest_rdmol : Chem.Mol\n          An RDKit Molecule defining the guest molecule in the system.\n        guest_atom_ids: list[int]\n          A list of atom indices defining the guest molecule in the universe.\n        host_atom_ids : list[int]\n          A list of atom indices defining the host molecules in the universe.\n        temperature : openff.units.Quantity\n          The temperature of the simulation where the restraint will be added.\n        settings : BoreschRestraintSettings\n          Settings on how the Boresch-like restraint should be defined.\n\n        Returns\n        -------\n        geom : BoreschRestraintGeometry\n          A class defining the Boresch-like restraint.\n        restraint : BoreschRestraint\n          A factory class for generating Boresch restraints in OpenMM.\n        \"\"\"\n        # Take the minimum of the two possible force constants to check against\n        frc_const = min(settings.K_thetaA, settings.K_thetaB)\n\n        geom = geometry.boresch.find_boresch_restraint(\n            universe=universe,\n            guest_rdmol=guest_rdmol,\n            guest_idxs=guest_atom_ids,\n            host_idxs=host_atom_ids,\n            host_selection=settings.host_selection,\n            anchor_finding_strategy=settings.anchor_finding_strategy,\n            dssp_filter=settings.dssp_filter,\n            rmsf_cutoff=settings.rmsf_cutoff,\n            host_min_distance=settings.host_min_distance,\n            host_max_distance=settings.host_max_distance,\n            angle_force_constant=frc_const,\n            temperature=temperature,\n        )\n\n        restraint = omm_restraints.BoreschRestraint(settings)\n        return geom, restraint\n\n    def _add_restraints(\n        self,\n        system: System,\n        topology: omm_topology,\n        positions: ommunit.Quantity,\n        alchem_comps: dict[str, list[Component]],\n        comp_resids: dict[Component, npt.NDArray],\n        settings: dict[str, SettingsBaseModel],\n    ) -> tuple[\n        Quantity,\n        System,\n        geometry.HostGuestRestraintGeometry,\n    ]:\n        \"\"\"\n        Find and add restraints to the OpenMM System.\n\n        Notes\n        -----\n        Currently, only Boresch-like restraints are supported.\n\n        Parameters\n        ----------\n        system : openmm.System\n          The System to add the restraint to.\n        topology : openmm.app.Topology\n          An OpenMM Topology that defines the System.\n        positions: openmm.unit.Quantity\n          The System's current positions.\n          Used if a trajectory file isn't found.\n        alchem_comps: dict[str, list[Component]]\n          A dictionary with a list of alchemical components\n          in both state A and B.\n        comp_resids: dict[Component, npt.NDArray]\n          A dictionary keyed by each Component in the System\n          which contains arrays with the residue indices that is contained\n          by that Component.\n        settings : dict[str, SettingsBaseModel]\n          A dictionary of settings that defines how to find and set\n          the restraint.\n\n        Returns\n        -------\n        correction : openff.units.Quantity\n          The standard state correction for the restraint.\n        system : openmm.System\n          A copy of the System with the restraint added.\n        rest_geom : geometry.HostGuestRestraintGeometry\n          The restraint Geometry object.\n        \"\"\"\n        if self.verbose:\n            self.logger.info(\"Generating restraints\")\n\n        # Get the guest rdmol\n        guest_rdmol = alchem_comps[\"stateA\"][0].to_rdkit()\n\n        # sanitize the rdmol if possible - warn if you can't\n        err = Chem.SanitizeMol(guest_rdmol, catchErrors=True)\n\n        if err:\n            msg = \"restraint generation: could not sanitize ligand rdmol\"\n            logger.warning(msg)\n\n        # Get the guest idxs\n        # concatenate a list of residue indexes for all alchemical components\n        residxs = np.concatenate([comp_resids[key] for key in alchem_comps[\"stateA\"]])\n\n        # get the alchemicical atom ids\n        guest_atom_ids = self._get_idxs_from_residxs(topology, residxs)\n\n        # Now get the host idxs\n        # We assume this is everything but the alchemical component\n        # and the solvent.\n        solv_comps = [c for c in comp_resids if isinstance(c, SolventComponent)]\n        exclude_comps = [alchem_comps[\"stateA\"]] + solv_comps\n        residxs = np.concatenate([v for i, v in comp_resids.items() if i not in exclude_comps])\n\n        host_atom_ids = self._get_idxs_from_residxs(topology, residxs)\n\n        # Finally create an MDAnalysis Universe\n        # We try to pass the equilibration production file path through\n        # In some cases (debugging / dry runs) this won't be available\n        # so we'll default to using input positions.\n        univ = self._get_mda_universe(\n            topology,\n            positions,\n            self.shared_basepath / settings[\"equil_output_settings\"].production_trajectory_filename,\n        )\n\n        if isinstance(settings[\"restraint_settings\"], BoreschRestraintSettings):\n            rest_geom, restraint = self._get_boresch_restraint(\n                univ,\n                guest_rdmol,\n                guest_atom_ids,\n                host_atom_ids,\n                settings[\"thermo_settings\"].temperature,\n                settings[\"restraint_settings\"],\n            )\n        else:\n            # TODO turn this into a direction for different restraint types supported?\n            raise NotImplementedError(\"Other restraint types are not yet available\")\n\n        if self.verbose:\n            self.logger.info(f\"restraint geometry is: {rest_geom}\")\n\n        # We need a temporary thermodynamic state to add the restraint\n        # & get the correction\n        thermodynamic_state = ThermodynamicState(\n            system,\n            temperature=to_openmm(settings[\"thermo_settings\"].temperature),\n            pressure=to_openmm(settings[\"thermo_settings\"].pressure),\n        )\n\n        # Add the force to the thermodynamic state\n        restraint.add_force(\n            thermodynamic_state,\n            rest_geom,\n            controlling_parameter_name=\"lambda_restraints\",\n        )\n        # Get the standard state correction as a unit.Quantity\n        correction = restraint.get_standard_state_correction(\n            thermodynamic_state,\n            rest_geom,\n        )\n\n        return (\n            correction,\n            # Remove the thermostat, otherwise you'll get an\n            # Andersen thermostat by default!\n            thermodynamic_state.get_system(remove_thermostat=True),\n            rest_geom,\n        )\n\n\nclass ABFEComplexSimUnit(\n    ComplexComponentsMixin, ComplexSettingsMixin, BaseAbsoluteMultiStateSimulationUnit\n):\n    \"\"\"\n    Multi-state simulation (e.g. multi replica methods like Hamiltonian\n    replica exchange) unit for the complex phase of absolute binding\n    free energy transformations.\n    \"\"\"\n\n    simtype = \"complex\"\n\n\nclass ABFEComplexAnalysisUnit(ComplexSettingsMixin, BaseAbsoluteMultiStateAnalysisUnit):\n    \"\"\"\n    Analysis unit for multi-state simulations with the complex phase\n    of absolute binding free energy transformations.\n    \"\"\"\n\n    simtype = \"complex\"\n\n\nclass SolventComponentsMixin:\n    def _get_components(self):\n        \"\"\"\n        Get the relevant components for a solvent transformation.\n\n        Returns\n        -------\n        alchem_comps : dict[str, Component]\n          A list of alchemical components\n        solv_comp : SolventComponent\n          The SolventComponent of the system\n        prot_comp : ProteinComponent | None\n          The protein component of the system, if it exists.\n        small_mols : dict[SmallMoleculeComponent: OFFMolecule]\n          SmallMoleculeComponents to add to the system.\n        \"\"\"\n        stateA = self._inputs[\"stateA\"]\n        alchem_comps = self._inputs[\"alchemical_components\"]\n\n        solv_comp, prot_comp, small_mols = system_validation.get_components(stateA)\n        off_comps = {m: m.to_openff() for m in alchem_comps[\"stateA\"]}\n\n        # We don't need to check that solv_comp is not None, otherwise\n        # an error will have been raised when calling `validate_solvent`\n        # in the Protocol's `_create`.\n        # Similarly we don't need to check prot_comp just return None\n        return alchem_comps, solv_comp, None, off_comps\n\n\nclass SolventSettingsMixin:\n    def _get_settings(self) -> dict[str, SettingsBaseModel]:\n        \"\"\"\n        Extract the relevant settings for a solvent transformation.\n\n        Returns\n        -------\n        settings : dict[str, SettingsBaseModel]\n          A dictionary with the following entries:\n            * forcefield_settings : OpenMMSystemGeneratorFFSettings\n            * thermo_settings : ThermoSettings\n            * charge_settings : OpenFFPartialChargeSettings\n            * solvation_settings : OpenMMSolvationSettings\n            * alchemical_settings : AlchemicalSettings\n            * lambda_settings : LambdaSettings\n            * engine_settings : OpenMMEngineSettings\n            * integrator_settings : IntegratorSettings\n            * equil_simulation_settings : MDSimulationSettings\n            * equil_output_settings : ABFEPreEquilOutputSettings\n            * simulation_settings : MultiStateSimulationSettings\n            * output_settings: MultiStateOutputSettings\n        \"\"\"\n        prot_settings = self._inputs[\"protocol\"].settings  # type: ignore[attr-defined]\n\n        settings = {}\n        settings[\"forcefield_settings\"] = prot_settings.forcefield_settings\n        settings[\"thermo_settings\"] = prot_settings.thermo_settings\n        settings[\"charge_settings\"] = prot_settings.partial_charge_settings\n        settings[\"solvation_settings\"] = prot_settings.solvent_solvation_settings\n        settings[\"alchemical_settings\"] = prot_settings.alchemical_settings\n        settings[\"lambda_settings\"] = prot_settings.solvent_lambda_settings\n        settings[\"engine_settings\"] = prot_settings.engine_settings\n        settings[\"integrator_settings\"] = prot_settings.solvent_integrator_settings\n        settings[\"equil_simulation_settings\"] = prot_settings.solvent_equil_simulation_settings\n        settings[\"equil_output_settings\"] = prot_settings.solvent_equil_output_settings\n        settings[\"simulation_settings\"] = prot_settings.solvent_simulation_settings\n        settings[\"output_settings\"] = prot_settings.solvent_output_settings\n\n        return settings\n\n\nclass ABFESolventSetupUnit(SolventComponentsMixin, SolventSettingsMixin, BaseAbsoluteSetupUnit):\n    \"\"\"\n    Setup unit for the solvent phase of absolute binding free energy\n    transformations.\n    \"\"\"\n\n    simtype = \"solvent\"\n\n\nclass ABFESolventSimUnit(\n    SolventComponentsMixin, SolventSettingsMixin, BaseAbsoluteMultiStateSimulationUnit\n):\n    \"\"\"\n    Multi-state simulation (e.g. multi replica methods like Hamiltonian\n    replica exchange) unit for the solvent phase of absolute binding\n    free energy transformations.\n    \"\"\"\n\n    simtype = \"solvent\"\n\n\nclass ABFESolventAnalysisUnit(SolventSettingsMixin, BaseAbsoluteMultiStateAnalysisUnit):\n    \"\"\"\n    Analysis unit for multi-state simulations with the solvent phase\n    of absolute binding free energy transformations.\n    \"\"\"\n\n    simtype = \"solvent\"\n"
  },
  {
    "path": "src/openfe/protocols/openmm_afe/afe_protocol_results.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\n\"\"\"\nResult classes for the Absolute Free Energy Protocols\n=====================================================\n\nThis module implements :class:`gufe.ProtocolResult` classes for the absolute\nfree energy Protocols.\n\nSpecifically it implements:\n  * AbsoluteBindingProtocolResult\n  * AbsoluteSolvationProtocolResult\n\"\"\"\n\nimport itertools\nimport logging\nimport pathlib\nimport warnings\nfrom typing import Optional, Union\n\nimport gufe\nimport numpy as np\nimport numpy.typing as npt\nfrom openff.units import Quantity\nfrom openff.units import unit as offunit\nfrom openmmtools import multistate\n\nfrom openfe.protocols.restraint_utils.geometry.boresch import BoreschRestraintGeometry\n\nlogger = logging.getLogger(__name__)\n\n\nclass AbsoluteProtocolResultMixin:\n    bound_state = \"solvent\"\n    unbound_state = \"vacuum\"\n\n    def __init__(self, **data):\n        super().__init__(**data)\n        # TODO: Detect when we have extensions and stitch these together?\n        if any(\n            len(pur_list) > 2\n            for pur_list in itertools.chain(\n                self.data[self.bound_state].values(), self.data[self.unbound_state].values()\n            )\n        ):\n            raise NotImplementedError(\"Can't stitch together results yet\")\n\n    def get_forward_and_reverse_energy_analysis(\n        self,\n    ) -> dict[str, list[Optional[dict[str, Union[npt.NDArray, Quantity]]]]]:\n        \"\"\"\n        Get the reverse and forward analysis of the free energies.\n\n        Returns\n        -------\n        forward_reverse : dict[str, list[Optional[dict[str, Union[npt.NDArray, openff.units.Quantity]]]]]\n            A dictionary, keyed for each leg of the thermodynamic cycle,\n            either ``solvent`` and ``vacuum` for a solvation free energy or\n          ``solvent`` and ``complex`` for a binding free energy,\n            with each containing a list of dictionaries containing the forward\n            and reverse analysis of each repeat of that simulation type.\n\n            The forward and reverse analysis dictionaries contain:\n              - `fractions`: npt.NDArray\n                  The fractions of data used for the estimates\n              - `forward_DGs`, `reverse_DGs`: openff.units.Quantity\n                  The forward and reverse estimates for each fraction of data\n              - `forward_dDGs`, `reverse_dDGs`: openff.units.Quantity\n                  The forward and reverse estimate uncertainty for each\n                  fraction of data.\n\n            If one of the cycle leg list entries is ``None``, this indicates\n            that the analysis could not be carried out for that repeat. This\n            is most likely caused by MBAR convergence issues when attempting to\n            calculate free energies from too few samples.\n\n        Raises\n        ------\n        UserWarning\n          * If any of the forward and reverse dictionaries are ``None`` in a\n            given thermodynamic cycle leg.\n        \"\"\"\n\n        forward_reverse: dict[str, list[Optional[dict[str, Union[npt.NDArray, Quantity]]]]] = {}\n\n        for key in [self.bound_state, self.unbound_state]:\n            forward_reverse[key] = [\n                pus[0].outputs[\"forward_and_reverse_energies\"]\n                for pus in self.data[key].values()  # type: ignore[attr-defined]\n            ]\n\n            if None in forward_reverse[key]:\n                wmsg = (\n                    \"One or more ``None`` entries were found in the forward \"\n                    f\"and reverse dictionaries of the repeats of the {key} \"\n                    \"calculations. This is likely caused by an MBAR convergence \"\n                    \"failure caused by too few independent samples when \"\n                    \"calculating the free energies of the 10% timeseries slice.\"\n                )\n                warnings.warn(wmsg)\n\n        return forward_reverse\n\n    def get_overlap_matrices(self) -> dict[str, list[dict[str, npt.NDArray]]]:\n        \"\"\"\n        Get a the MBAR overlap estimates for all legs of the simulation.\n\n        Returns\n        -------\n        overlap_stats : dict[str, list[dict[str, npt.NDArray]]]\n          A dictionary keyed for each leg of the thermodynamic cycle, either\n          ``solvent`` and ``vacuum` for a solvation free energy or\n          ``solvent`` and ``complex`` for a binding free energy,\n          with each containing a list of dictionaries with the MBAR overlap\n          estimates of each repeat of that simulation type.\n\n          The underlying MBAR dictionaries contain the following keys:\n            * ``scalar``: One minus the largest nontrivial eigenvalue\n            * ``eigenvalues``: The sorted (descending) eigenvalues of the\n              overlap matrix\n            * ``matrix``: Estimated overlap matrix of observing a sample from\n              state i in state j\n        \"\"\"\n        # Loop through and get the repeats and get the matrices\n        overlap_stats: dict[str, list[dict[str, npt.NDArray]]] = {}\n\n        for key in [self.bound_state, self.unbound_state]:\n            overlap_stats[key] = [\n                pus[0].outputs[\"unit_mbar_overlap\"]\n                for pus in self.data[key].values()  # type: ignore[attr-defined]\n            ]\n\n        return overlap_stats\n\n    def get_replica_transition_statistics(self) -> dict[str, list[dict[str, npt.NDArray]]]:\n        \"\"\"\n        Get the replica exchange transition statistics for all\n        legs of the simulation.\n\n        Note\n        ----\n        This is currently only available in cases where a replica exchange\n        simulation was run.\n\n        Returns\n        -------\n        repex_stats : dict[str, list[dict[str, npt.NDArray]]]\n          A dictionary with keys for each leg of the thermodynamic cycle, either\n          ``solvent`` and ``vacuum` for a solvation free energy or\n          ``solvent`` and ``complex`` for a binding free energy,\n          with each containing a list of dictionaries containing the replica\n          transition statistics for each repeat of that simulation type.\n\n          The replica transition statistics dictionaries contain the following:\n            * ``eigenvalues``: The sorted (descending) eigenvalues of the\n              lambda state transition matrix\n            * ``matrix``: The transition matrix estimate of a replica switching\n              from state i to state j.\n        \"\"\"\n        repex_stats: dict[str, list[dict[str, npt.NDArray]]] = {}\n        try:\n            for key in [self.bound_state, self.unbound_state]:\n                repex_stats[key] = [\n                    pus[0].outputs[\"replica_exchange_statistics\"]\n                    for pus in self.data[key].values()  # type: ignore[attr-defined]\n                ]\n        except KeyError:\n            errmsg = \"Replica exchange statistics were not found, did you run a repex calculation?\"\n            raise ValueError(errmsg)\n\n        return repex_stats\n\n    def get_replica_states(self) -> dict[str, list[npt.NDArray]]:\n        \"\"\"\n        Get the timeseries of replica states for all simulation legs.\n\n        Returns\n        -------\n        replica_states : dict[str, list[npt.NDArray]]\n          Dictionary keyed for each leg of the thermodynamic cycle, either\n          `solvent` and `vacuum` for solvation free energies,\n          or `complex` and `solvent` for binding free energies,\n          with lists of replica states timeseries for each repeat of that\n          simulation type.\n        \"\"\"\n        replica_states: dict[str, list[npt.NDArray]] = {\n            self.bound_state: [],\n            self.unbound_state: [],\n        }\n\n        def is_file(filename: str):\n            p = pathlib.Path(filename)\n\n            if not p.exists():\n                errmsg = f\"File could not be found {p}\"\n                raise ValueError(errmsg)\n\n            return p\n\n        def get_replica_state(nc, chk):\n            nc = is_file(nc)\n            dir_path = nc.parents[0]\n            chk = is_file(dir_path / chk).name\n\n            reporter = multistate.MultiStateReporter(\n                storage=nc, checkpoint_storage=chk, open_mode=\"r\"\n            )\n\n            retval = np.asarray(reporter.read_replica_thermodynamic_states())\n            reporter.close()\n\n            return retval\n\n        for key in [self.bound_state, self.unbound_state]:\n            for pus in self.data[key].values():  # type: ignore[attr-defined]\n                states = get_replica_state(\n                    pus[0].outputs[\"trajectory\"],\n                    pus[0].outputs[\"checkpoint\"],\n                )\n                replica_states[key].append(states)\n\n        return replica_states\n\n    def equilibration_iterations(self) -> dict[str, list[float]]:\n        \"\"\"\n        Get the number of equilibration iterations for each simulation.\n\n        Returns\n        -------\n        equilibration_lengths : dict[str, list[float]]\n          Dictionary keyed for each leg of the thermodynamic cycle, either\n         `solvent` and `vacuum` for solvation free energies,\n          or `complex` and `solvent` for binding free energies,\n          with lists containing the number of equilibration iterations for\n          each repeat of that simulation type.\n        \"\"\"\n        equilibration_lengths: dict[str, list[float]] = {}\n\n        for key in [self.bound_state, self.unbound_state]:\n            equilibration_lengths[key] = [\n                pus[0].outputs[\"equilibration_iterations\"]\n                for pus in self.data[key].values()  # type: ignore[attr-defined]\n            ]\n\n        return equilibration_lengths\n\n    def production_iterations(self) -> dict[str, list[float]]:\n        \"\"\"\n        Get the number of production iterations for each simulation.\n        Returns the number of uncorrelated production samples for each\n        repeat of the calculation.\n\n        Returns\n        -------\n        production_lengths : dict[str, list[float]]\n          Dictionary keyed for each leg of the thermodynamic cycle, either\n         `solvent` and `vacuum` for solvation free energies,\n          or `complex` and `solvent` for binding free energies,\n          with lists containing the number of equilibration iterations for\n          each repeat of that simulation type.\n        \"\"\"\n        production_lengths: dict[str, list[float]] = {}\n\n        for key in [self.bound_state, self.unbound_state]:\n            production_lengths[key] = [\n                pus[0].outputs[\"production_iterations\"]\n                for pus in self.data[key].values()  # type: ignore[attr-defined]\n            ]\n\n        return production_lengths\n\n    def selection_indices(self) -> dict[str, list[Optional[npt.NDArray]]]:\n        \"\"\"\n        Get the system selection indices used to write PDB and\n        trajectory files.\n\n        Returns\n        -------\n        indices : dict[str, list[npt.NDArray]]\n          A dictionary keyed for each state, either\n         `solvent` and `vacuum` for solvation free energies,\n          or `complex` and `solvent` for binding free energies,\n          each containing a list of NDArrays containing the corresponding\n          full system atom indices for each atom written in the production\n          trajectory files for each replica.\n        \"\"\"\n        indices: dict[str, list[Optional[npt.NDArray]]] = {}\n\n        for key in [self.bound_state, self.unbound_state]:\n            indices[key] = []\n            for pus in self.data[key].values():  # type: ignore[attr-defined]\n                indices[key].append(pus[0].outputs[\"selection_indices\"])\n\n        return indices\n\n\nclass AbsoluteSolvationProtocolResult(gufe.ProtocolResult, AbsoluteProtocolResultMixin):\n    \"\"\"\n    Protocol results with the output of a AbsoluteSolvationProtocol\n    \"\"\"\n\n    bound_state = \"solvent\"\n    unbound_state = \"vacuum\"\n\n    def get_individual_estimates(self) -> dict[str, list[tuple[Quantity, Quantity]]]:\n        \"\"\"\n        Get the individual estimate of the free energies.\n\n        Returns\n        -------\n        dGs : dict[str, list[tuple[openff.units.Quantity, openff.units.Quantity]]]\n          A dictionary, keyed `solvent` and `vacuum` for each leg\n          of the thermodynamic cycle, with lists of tuples containing\n          the individual free energy estimates and associated MBAR\n          uncertainties for each repeat of that simulation type.\n        \"\"\"\n        dGs = {}\n\n        for state in [self.bound_state, self.unbound_state]:\n            state_dGs = [\n                (pus[0].outputs[\"unit_estimate\"], pus[0].outputs[\"unit_estimate_error\"])\n                for pus in self.data[state].values()\n            ]\n            dGs[state] = state_dGs\n\n        return dGs\n\n    def get_estimate(self):\n        \"\"\"Get the solvation free energy estimate for this calculation.\n\n        Returns\n        -------\n        dG : openff.units.Quantity\n          The solvation free energy. This is a Quantity defined with units.\n        \"\"\"\n\n        def _get_average(estimates):\n            # Get the unit value of the first value in the estimates\n            u = estimates[0][0].u\n            # Loop through estimates and get the free energy values\n            # in the unit of the first estimate\n            dGs = [i[0].to(u).m for i in estimates]\n\n            return np.average(dGs) * u\n\n        individual_estimates = self.get_individual_estimates()\n        vac_dG = _get_average(individual_estimates[\"vacuum\"])\n        solv_dG = _get_average(individual_estimates[\"solvent\"])\n\n        return vac_dG - solv_dG\n\n    def get_uncertainty(self):\n        \"\"\"Get the solvation free energy error for this calculation.\n\n        Returns\n        -------\n        err : openff.units.Quantity\n          The standard deviation between estimates of the solvation free\n          energy. This is a Quantity defined with units.\n        \"\"\"\n\n        def _get_stdev(estimates):\n            # Get the unit value of the first value in the estimates\n            u = estimates[0][0].u\n            # Loop through estimates and get the free energy values\n            # in the unit of the first estimate\n            dGs = [i[0].to(u).m for i in estimates]\n\n            return np.std(dGs) * u\n\n        individual_estimates = self.get_individual_estimates()\n        vac_err = _get_stdev(individual_estimates[\"vacuum\"])\n        solv_err = _get_stdev(individual_estimates[\"solvent\"])\n\n        # return the combined error\n        return np.sqrt(vac_err**2 + solv_err**2)\n\n\nclass AbsoluteBindingProtocolResult(gufe.ProtocolResult, AbsoluteProtocolResultMixin):\n    \"\"\"\n    Protocol results with the output of a AbsoluteBindingProtocol.\n    \"\"\"\n\n    bound_state = \"complex\"\n    unbound_state = \"solvent\"\n\n    def get_individual_estimates(\n        self,\n    ) -> dict[str, list[tuple[Quantity, Quantity]]]:\n        \"\"\"\n        Get the individual estimate of the free energies.\n\n        Returns\n        -------\n        dGs : dict[str, list[tuple[openff.units.Quantity, openff.units.Quantity]]]\n          A dictionary, keyed `solvent`, `complex`, and 'standard_state'\n          representing each portion of the thermodynamic cycle,\n          with lists of tuples containing the individual free energy\n          estimates and, for 'solvent' and 'complex', the associated MBAR\n          uncertainties for each repeat of that simulation type.\n\n        Notes\n        -----\n        * Standard state correction has no error and so will return a value\n          of 0.\n        \"\"\"\n        complex_dGs = []\n        correction_dGs = []\n        solv_dGs = []\n\n        for pus in self.data[\"complex\"].values():\n            complex_dGs.append(\n                (pus[0].outputs[\"unit_estimate\"], pus[0].outputs[\"unit_estimate_error\"])\n            )\n            correction_dGs.append(\n                (\n                    pus[0].outputs[\"standard_state_correction\"],\n                    0 * offunit.kilocalorie_per_mole,  # correction has no error\n                )\n            )\n\n        for pus in self.data[\"solvent\"].values():\n            solv_dGs.append(\n                (pus[0].outputs[\"unit_estimate\"], pus[0].outputs[\"unit_estimate_error\"])\n            )\n\n        return {\n            \"solvent\": solv_dGs,\n            \"complex\": complex_dGs,\n            \"standard_state_correction\": correction_dGs,\n        }\n\n    @staticmethod\n    def _add_complex_standard_state_corr(\n        complex_dG: list[tuple[Quantity, Quantity]],\n        standard_state_dG: list[tuple[Quantity, Quantity]],\n    ) -> list[tuple[Quantity, Quantity]]:\n        \"\"\"\n        Helper method to combine the\n        complex & standard state corrections legs.\n\n        Parameters\n        ----------\n        complex_dG : list[tuple[openff.units.Quantity, openff.units.Quantity]]\n          The individual estimates of the complex leg,\n          where the first entry of each tuple is the dG estimate\n          and the second entry is the MBAR error.\n        standard_state_dG : list[tuple[Quantity, Quantity]]\n          The individual standard state corrections for each corresponding\n          complex leg. The first entry is the correction, the second\n          is an empty error value of 0.\n\n        Returns\n        -------\n        combined_dG : list[tuple[openff.units.Quantity,openff.units. Quantity]]\n          A list of dG estimates & MBAR errors for the combined\n          complex & standard state correction of each repeat.\n\n        Notes\n        -----\n        We assume that both list of items are in the right order.\n        \"\"\"\n        combined_dG: list[tuple[Quantity, Quantity]] = []\n        for comp, corr in zip(complex_dG, standard_state_dG):\n            # No need to convert unit types, since pint takes care of that\n            # except that mypy hates it because pint isn't typed properly...\n            # No need to add errors since there's just the one\n            combined_dG.append((comp[0] + corr[0], comp[1]))  # type: ignore[operator]\n\n        return combined_dG\n\n    def get_estimate(self) -> Quantity:\n        \"\"\"Get the binding free energy estimate for this calculation.\n\n        Returns\n        -------\n        dG : openff.units.Quantity\n          The binding free energy. This is a Quantity defined with units.\n        \"\"\"\n\n        def _get_average(estimates):\n            # Get the unit value of the first value in the estimates\n            u = estimates[0][0].u\n            # Loop through estimates and get the free energy values\n            # in the unit of the first estimate\n            dGs = [i[0].to(u).m for i in estimates]\n\n            return np.average(dGs) * u\n\n        individual_estimates = self.get_individual_estimates()\n        complex_dG = _get_average(\n            self._add_complex_standard_state_corr(\n                individual_estimates[\"complex\"],\n                individual_estimates[\"standard_state_correction\"],\n            )\n        )\n        solv_dG = _get_average(individual_estimates[\"solvent\"])\n\n        return -complex_dG + solv_dG\n\n    def get_uncertainty(self) -> Quantity:\n        \"\"\"Get the binding free energy error for this calculation.\n\n        Returns\n        -------\n        err : openff.units.Quantity\n          The standard deviation between estimates of the binding free\n          energy. This is a Quantity defined with units.\n        \"\"\"\n\n        def _get_stdev(estimates):\n            # Get the unit value of the first value in the estimates\n            u = estimates[0][0].u\n            # Loop through estimates and get the free energy values\n            # in the unit of the first estimate\n            dGs = [i[0].to(u).m for i in estimates]\n\n            return np.std(dGs) * u\n\n        individual_estimates = self.get_individual_estimates()\n\n        complex_err = _get_stdev(\n            self._add_complex_standard_state_corr(\n                individual_estimates[\"complex\"],\n                individual_estimates[\"standard_state_correction\"],\n            )\n        )\n        solv_err = _get_stdev(individual_estimates[\"solvent\"])\n\n        # return the combined error\n        return np.sqrt(complex_err**2 + solv_err**2)\n\n    def restraint_geometries(self) -> list[BoreschRestraintGeometry]:\n        \"\"\"\n        Get a list of the restraint geometries for the\n        complex simulations. These define the atoms that have\n        been restrained in the system.\n\n        Returns\n        -------\n        geometries : list[dict[str, Any]]\n          A list of dictionaries containing the details of the atoms\n          in the system that are involved in the restraint.\n        \"\"\"\n        geometries = [\n            BoreschRestraintGeometry.model_validate(pus[0].outputs[\"restraint_geometry\"])\n            for pus in self.data[\"complex\"].values()\n        ]\n\n        return geometries\n"
  },
  {
    "path": "src/openfe/protocols/openmm_afe/ahfe_units.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\n\"\"\"\nAHFE Protocol Units --- :mod:`openfe.protocols.openmm_afe.ahfe_units`\n=====================================================================\n\nThis module defines the ProtocolUnits for the\n:class:`AbsoluteSolvationProtocol`.\n\"\"\"\n\nimport logging\n\nfrom openfe.protocols.openmm_afe.equil_afe_settings import (\n    SettingsBaseModel,\n)\n\nfrom ..openmm_utils import system_validation\nfrom .base_afe_units import (\n    BaseAbsoluteMultiStateAnalysisUnit,\n    BaseAbsoluteMultiStateSimulationUnit,\n    BaseAbsoluteSetupUnit,\n)\n\nlogger = logging.getLogger(__name__)\n\n\nclass VacuumComponentsMixin:\n    def _get_components(self):\n        \"\"\"\n        Get the relevant components for a vacuum transformation.\n\n        Returns\n        -------\n        alchem_comps : dict[str, list[Component]]\n          A list of alchemical components\n        solv_comp : None\n          For the gas phase transformation, None will always be returned\n          for the solvent component of the chemical system.\n        prot_comp : Optional[ProteinComponent]\n          The protein component of the system, if it exists.\n        small_mols : dict[Component, OpenFF Molecule]\n          The openff Molecules to add to the system. This\n          is equivalent to the alchemical components in stateA (since\n          we only allow for disappearing ligands).\n        \"\"\"\n        stateA = self._inputs[\"stateA\"]\n        alchem_comps = self._inputs[\"alchemical_components\"]\n\n        off_comps = {m: m.to_openff() for m in alchem_comps[\"stateA\"]}\n\n        _, prot_comp, _ = system_validation.get_components(stateA)\n\n        # Notes:\n        # 1. Our input state will contain a solvent, we ``None`` that out\n        # since this is the gas phase unit.\n        # 2. Our small molecules will always just be the alchemical components\n        # (of stateA since we enforce only one disappearing ligand)\n        return alchem_comps, None, prot_comp, off_comps\n\n\nclass VacuumSettingsMixin:\n    def _get_settings(self) -> dict[str, SettingsBaseModel]:\n        \"\"\"\n        Extract the relevant settings for a vacuum transformation.\n\n        Returns\n        -------\n        settings : dict[str, SettingsBaseModel]\n          A dictionary with the following entries:\n            * forcefield_settings : OpenMMSystemGeneratorFFSettings\n            * thermo_settings : ThermoSettings\n            * charge_settings : OpenFFPartialChargeSettings\n            * solvation_settings : OpenMMSolvationSettings\n            * alchemical_settings : AlchemicalSettings\n            * lambda_settings : LambdaSettings\n            * engine_settings : OpenMMEngineSettings\n            * integrator_settings : IntegratorSettings\n            * equil_simulation_settings : MDSimulationSettings\n            * equil_output_settings : MDOutputSettings\n            * simulation_settings : SimulationSettings\n            * output_settings: MultiStateOutputSettings\n        \"\"\"\n        prot_settings = self._inputs[\"protocol\"].settings  # type: ignore[attr-defined]\n\n        settings = {}\n        settings[\"forcefield_settings\"] = prot_settings.vacuum_forcefield_settings\n        settings[\"thermo_settings\"] = prot_settings.thermo_settings\n        settings[\"charge_settings\"] = prot_settings.partial_charge_settings\n        settings[\"solvation_settings\"] = prot_settings.solvation_settings\n        settings[\"alchemical_settings\"] = prot_settings.alchemical_settings\n        settings[\"lambda_settings\"] = prot_settings.lambda_settings\n        settings[\"engine_settings\"] = prot_settings.vacuum_engine_settings\n        settings[\"integrator_settings\"] = prot_settings.integrator_settings\n        settings[\"equil_simulation_settings\"] = prot_settings.vacuum_equil_simulation_settings\n        settings[\"equil_output_settings\"] = prot_settings.vacuum_equil_output_settings\n        settings[\"simulation_settings\"] = prot_settings.vacuum_simulation_settings\n        settings[\"output_settings\"] = prot_settings.vacuum_output_settings\n\n        return settings\n\n\nclass AHFEVacuumSetupUnit(VacuumComponentsMixin, VacuumSettingsMixin, BaseAbsoluteSetupUnit):\n    \"\"\"\n    Setup unit for the vacuum phase of absolute hydration free energy\n    transformations.\n    \"\"\"\n\n    simtype = \"vacuum\"\n\n\nclass AHFEVacuumSimUnit(\n    VacuumComponentsMixin, VacuumSettingsMixin, BaseAbsoluteMultiStateSimulationUnit\n):\n    \"\"\"\n    Multi-state simulation (e.g. multi replica methods like Hamiltonian\n    replica exchange) unit for the vacuum phase of absolute hydration\n    free energy transformations.\n    \"\"\"\n\n    simtype = \"vacuum\"\n\n\nclass AHFEVacuumAnalysisUnit(VacuumSettingsMixin, BaseAbsoluteMultiStateAnalysisUnit):\n    \"\"\"\n    Analysis unit for multi-state simulations with the vacuum phase\n    of absolute hydration free energy transformations.\n    \"\"\"\n\n    simtype = \"vacuum\"\n\n\nclass SolventComponentsMixin:\n    def _get_components(self):\n        \"\"\"\n        Get the relevant components for a solvent transformation.\n\n        Returns\n        -------\n        alchem_comps : dict[str, Component]\n          A list of alchemical components\n        solv_comp : SolventComponent\n          The SolventComponent of the system\n        prot_comp : Optional[ProteinComponent]\n          The protein component of the system, if it exists.\n        small_mols : dict[SmallMoleculeComponent: OFFMolecule]\n          SmallMoleculeComponents to add to the system.\n        \"\"\"\n        stateA = self._inputs[\"stateA\"]\n        alchem_comps = self._inputs[\"alchemical_components\"]\n\n        solv_comp, prot_comp, small_mols = system_validation.get_components(stateA)\n        off_comps = {m: m.to_openff() for m in small_mols}\n\n        # We don't need to check that solv_comp is not None, otherwise\n        # an error will have been raised when calling `validate_solvent`\n        # in the Protocol's `_create`.\n        # Similarly we don't need to check prot_comp since that's also\n        # disallowed on create\n        return alchem_comps, solv_comp, prot_comp, off_comps\n\n\nclass SolventSettingsMixin:\n    def _get_settings(self) -> dict[str, SettingsBaseModel]:\n        \"\"\"\n        Extract the relevant settings for a solvent transformation.\n\n        Returns\n        -------\n        settings : dict[str, SettingsBaseModel]\n          A dictionary with the following entries:\n            * forcefield_settings : OpenMMSystemGeneratorFFSettings\n            * thermo_settings : ThermoSettings\n            * charge_settings : OpenFFPartialChargeSettings\n            * solvation_settings : OpenMMSolvationSettings\n            * alchemical_settings : AlchemicalSettings\n            * lambda_settings : LambdaSettings\n            * engine_settings : OpenMMEngineSettings\n            * integrator_settings : IntegratorSettings\n            * equil_simulation_settings : MDSimulationSettings\n            * equil_output_settings : MDOutputSettings\n            * simulation_settings : MultiStateSimulationSettings\n            * output_settings: MultiStateOutputSettings\n        \"\"\"\n        prot_settings = self._inputs[\"protocol\"].settings  # type: ignore[attr-defined]\n\n        settings = {}\n        settings[\"forcefield_settings\"] = prot_settings.solvent_forcefield_settings\n        settings[\"thermo_settings\"] = prot_settings.thermo_settings\n        settings[\"charge_settings\"] = prot_settings.partial_charge_settings\n        settings[\"solvation_settings\"] = prot_settings.solvation_settings\n        settings[\"alchemical_settings\"] = prot_settings.alchemical_settings\n        settings[\"lambda_settings\"] = prot_settings.lambda_settings\n        settings[\"engine_settings\"] = prot_settings.solvent_engine_settings\n        settings[\"integrator_settings\"] = prot_settings.integrator_settings\n        settings[\"equil_simulation_settings\"] = prot_settings.solvent_equil_simulation_settings\n        settings[\"equil_output_settings\"] = prot_settings.solvent_equil_output_settings\n        settings[\"simulation_settings\"] = prot_settings.solvent_simulation_settings\n        settings[\"output_settings\"] = prot_settings.solvent_output_settings\n\n        return settings\n\n\nclass AHFESolventSetupUnit(SolventComponentsMixin, SolventSettingsMixin, BaseAbsoluteSetupUnit):\n    \"\"\"\n    Setup unit for the solvent phase of absolute hydration free energy\n    transformations.\n    \"\"\"\n\n    simtype = \"solvent\"\n\n\nclass AHFESolventSimUnit(\n    SolventComponentsMixin, SolventSettingsMixin, BaseAbsoluteMultiStateSimulationUnit\n):\n    \"\"\"\n    Multi-state simulation (e.g. multi replica methods like Hamiltonian\n    replica exchange) unit for the solvent phase of absolute hydration\n    free energy transformations.\n    \"\"\"\n\n    simtype = \"solvent\"\n\n\nclass AHFESolventAnalysisUnit(SolventSettingsMixin, BaseAbsoluteMultiStateAnalysisUnit):\n    \"\"\"\n    Analysis unit for multi-state simulations with the solvent phase\n    of absolute hydration free energy transformations.\n    \"\"\"\n\n    simtype = \"solvent\"\n"
  },
  {
    "path": "src/openfe/protocols/openmm_afe/base_afe_units.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\n\"\"\"OpenMM AFE Protocol base classes\n===================================\n\nBase classes for the OpenMM absolute free energy ProtocolUnits.\n\nThis mostly implements BaseAbsoluteUnit whose methods can be\noverridden to define different types of alchemical transformations.\n\nTODO\n----\n* Add in all the AlchemicalFactory and AlchemicalRegion kwargs\n  as settings.\n* Allow for a more flexible setting of Lambda regions.\n\"\"\"\n\nimport abc\nimport copy\nimport logging\nimport os\nimport pathlib\nfrom typing import Any\n\nimport gufe\nimport numpy as np\nimport numpy.typing as npt\nimport openmm\nimport openmmtools\nfrom gufe import (\n    BaseSolventComponent,\n    ProteinComponent,\n    SmallMoleculeComponent,\n    SolventComponent,\n)\nfrom gufe.components import Component\nfrom gufe.protocols.errors import ProtocolUnitExecutionError\nfrom openff.toolkit.topology import Molecule as OFFMolecule\nfrom openff.units import Quantity\nfrom openff.units import unit as offunit\nfrom openff.units.openmm import ensure_quantity, from_openmm, to_openmm\nfrom openmm import app\nfrom openmm import unit as ommunit\nfrom openmmforcefields.generators import SystemGenerator\nfrom openmmtools import multistate\nfrom openmmtools.alchemy import (\n    AbsoluteAlchemicalFactory,\n    AlchemicalRegion,\n    AlchemicalState,\n)\nfrom openmmtools.states import (\n    GlobalParameterState,\n    SamplerState,\n    ThermodynamicState,\n    create_thermodynamic_state_protocol,\n)\n\nimport openfe\nfrom openfe.protocols.openmm_afe.equil_afe_settings import (\n    AlchemicalSettings,\n    BaseSolvationSettings,\n    IntegratorSettings,\n    MultiStateOutputSettings,\n    MultiStateSimulationSettings,\n    OpenFFPartialChargeSettings,\n    ThermoSettings,\n)\nfrom openfe.protocols.openmm_md.plain_md_methods import PlainMDSimulationUnit\nfrom openfe.protocols.openmm_utils import (\n    charge_generation,\n    multistate_analysis,\n    omm_compute,\n    settings_validation,\n    system_creation,\n    system_validation,\n)\nfrom openfe.protocols.openmm_utils.mdtraj_utils import (\n    mdtraj_from_openmm,\n)\nfrom openfe.protocols.openmm_utils.omm_settings import (\n    SettingsBaseModel,\n)\nfrom openfe.protocols.openmm_utils.serialization import (\n    deserialize,\n    make_vec3_box,\n    serialize,\n)\nfrom openfe.protocols.restraint_utils import geometry\nfrom openfe.protocols.restraint_utils.openmm import omm_restraints\nfrom openfe.utils import log_system_probe, without_oechem_backend\n\nlogger = logging.getLogger(__name__)\n\n\nclass AbsoluteUnitMixin:\n    def _prepare(\n        self,\n        verbose: bool,\n        scratch_basepath: pathlib.Path | None,\n        shared_basepath: pathlib.Path | None,\n    ):\n        \"\"\"\n        Set basepaths and do some initial logging.\n\n        Parameters\n        ----------\n        verbose : bool\n          Verbose output of the simulation progress. Output is provided via\n          INFO level logging.\n        scratch_basepath : pathlib.Path | None\n          Optional base path to write scratch files to.\n        shared_basepath : pathlib.Path | None\n          Optional base path to write shared files to.\n        \"\"\"\n        self.verbose = verbose\n\n        # set basepaths\n        def _set_optional_path(basepath):\n            if basepath is None:\n                return pathlib.Path(\".\")\n            return basepath\n\n        self.scratch_basepath = _set_optional_path(scratch_basepath)\n        self.shared_basepath = _set_optional_path(shared_basepath)\n\n    @abc.abstractmethod\n    def _get_settings(self) -> dict[str, SettingsBaseModel]:\n        \"\"\"\n        Get a dictionary with the following entries:\n          * forcefield_settings : OpenMMSystemGeneratorFFSettings\n          * thermo_settings : ThermoSettings\n          * solvation_settings : BaseSolvationSettings\n          * alchemical_settings : AlchemicalSettings\n          * lambda_settings : LambdaSettings\n          * engine_settings : OpenMMEngineSettings\n          * integrator_settings : IntegratorSettings\n          * equil_simulation_settings : MDSimulationSettings\n          * equil_output_settings : MDOutputSettings\n          * simulation_settings : MultiStateSimulationSettings\n          * output_settings : MultiStateOutputSettings\n\n        Settings may change depending on what type of simulation you are\n        running. Cherry pick them and return them to be available later on.\n\n        This method should also add various validation checks as necessary.\n\n        Note\n        ----\n        Must be implemented in the child class.\n        \"\"\"\n        ...\n\n    @staticmethod\n    def _verify_execution_environment(\n        setup_outputs: dict[str, Any],\n    ) -> None:\n        \"\"\"\n        Check that the Python environment hasn't changed based on the\n        relevant Python library versions stored in the setup outputs.\n        \"\"\"\n        try:\n            if (\n                (gufe.__version__ != setup_outputs[\"gufe_version\"])\n                or (openfe.__version__ != setup_outputs[\"openfe_version\"])\n                or (openmm.__version__ != setup_outputs[\"openmm_version\"])\n            ):\n                errmsg = \"Python environment has changed, cannot continue Protocol execution.\"\n                raise ProtocolUnitExecutionError(errmsg)\n        except KeyError:\n            errmsg = \"Missing environment information from setup outputs.\"\n            raise ProtocolUnitExecutionError(errmsg)\n\n\nclass BaseAbsoluteSetupUnit(gufe.ProtocolUnit, AbsoluteUnitMixin):\n    \"\"\"\n    Base class for setting up an absolute free energy transformations.\n    \"\"\"\n\n    @abc.abstractmethod\n    def _get_components(\n        self,\n    ) -> tuple[\n        dict[str, list[Component]],\n        gufe.SolventComponent | None,\n        gufe.ProteinComponent | None,\n        dict[SmallMoleculeComponent, OFFMolecule],\n    ]:\n        \"\"\"\n        Get the relevant components to create the alchemical system with.\n\n        Note\n        ----\n        Must be implemented in the child class.\n        \"\"\"\n        ...\n\n    @staticmethod\n    def _get_alchemical_indices(\n        omm_top: openmm.app.Topology,\n        comp_resids: dict[Component, npt.NDArray],\n        alchem_comps: dict[str, list[Component]],\n    ) -> list[int]:\n        \"\"\"\n        Get a list of atom indices for all the alchemical species\n\n        Parameters\n        ----------\n        omm_top : openmm.Topology\n          Topology of OpenMM System.\n        comp_resids : dict[Component, npt.NDArray]\n          A dictionary of residues for each component in the System.\n        alchem_comps : dict[str, list[Component]]\n          A dictionary of alchemical components for each end state.\n\n        Return\n        ------\n        atom_ids : list[int]\n          A list of atom indices for the alchemical species\n        \"\"\"\n\n        # concatenate a list of residue indexes for all alchemical components\n        residxs = np.concatenate([comp_resids[key] for key in alchem_comps[\"stateA\"]])\n\n        # get the alchemicical atom ids\n        atom_ids = []\n\n        for r in omm_top.residues():\n            if r.index in residxs:\n                atom_ids.extend([at.index for at in r.atoms()])\n\n        return atom_ids\n\n    def _pre_equilibrate(\n        self,\n        system: openmm.System,\n        topology: openmm.app.Topology,\n        positions: ommunit.Quantity,\n        settings: dict[str, SettingsBaseModel],\n        dry: bool,\n    ) -> tuple[ommunit.Quantity, ommunit.Quantity]:\n        \"\"\"\n        Run a non-alchemical equilibration to get a stable system.\n\n        Parameters\n        ----------\n        system : openmm.System\n          The OpenMM System to equilibrate.\n        topology : openmm.app.Topology\n          OpenMM Topology of the System.\n        positions : openmm.unit.Quantity\n          Initial positions for the system.\n        settings : dict[str, SettingsBaseModel]\n          A dictionary of settings objects. Expects the\n          following entries:\n          * `forcefield_settings`\n          * `engine_settings`\n          * `thermo_settings`\n          * `integrator_settings`\n          * `equil_simulation_settings`\n          * `equil_output_settings`\n        dry: bool\n          Whether or not this is a dry run.\n\n        Returns\n        -------\n        equilibrated_positions : npt.NDArray\n          Equilibrated system positions\n        box : openmm.unit.Quantity\n          Box vectors of the equilibrated system.\n        \"\"\"\n        # Prep the simulation object\n        # Restrict CPU count if running vacuum simulation\n        restrict_cpu = settings[\"forcefield_settings\"].nonbonded_method.lower() == \"nocutoff\"\n        platform = omm_compute.get_openmm_platform(\n            platform_name=settings[\"engine_settings\"].compute_platform,\n            gpu_device_index=settings[\"engine_settings\"].gpu_device_index,\n            restrict_cpu_count=restrict_cpu,\n        )\n\n        integrator = openmm.LangevinMiddleIntegrator(\n            to_openmm(settings[\"thermo_settings\"].temperature),\n            to_openmm(settings[\"integrator_settings\"].langevin_collision_rate),\n            to_openmm(settings[\"integrator_settings\"].timestep),\n        )\n\n        simulation = openmm.app.Simulation(\n            topology=topology,\n            system=system,\n            integrator=integrator,\n            platform=platform,\n        )\n\n        # Get the necessary number of steps\n        if settings[\"equil_simulation_settings\"].equilibration_length_nvt is not None:\n            equil_steps_nvt = settings_validation.get_simsteps(\n                sim_length=settings[\"equil_simulation_settings\"].equilibration_length_nvt,\n                timestep=settings[\"integrator_settings\"].timestep,\n                mc_steps=1,\n            )\n        else:\n            equil_steps_nvt = None\n\n        equil_steps_npt = settings_validation.get_simsteps(\n            sim_length=settings[\"equil_simulation_settings\"].equilibration_length,\n            timestep=settings[\"integrator_settings\"].timestep,\n            mc_steps=1,\n        )\n\n        prod_steps_npt = settings_validation.get_simsteps(\n            sim_length=settings[\"equil_simulation_settings\"].production_length,\n            timestep=settings[\"integrator_settings\"].timestep,\n            mc_steps=1,\n        )\n\n        if self.verbose:\n            self.logger.info(\"running non-alchemical equilibration MD\")\n\n        # Don't do anything if we're doing a dry run\n        if dry:\n            box = system.getDefaultPeriodicBoxVectors()\n            return positions, to_openmm(from_openmm(box))\n\n        # Use the _run_MD method from the PlainMDSimulationUnit\n        # Should in-place modify the simulation\n        PlainMDSimulationUnit._run_MD(\n            simulation=simulation,\n            positions=positions,\n            simulation_settings=settings[\"equil_simulation_settings\"],\n            output_settings=settings[\"equil_output_settings\"],\n            temperature=settings[\"thermo_settings\"].temperature,\n            barostat_frequency=settings[\"integrator_settings\"].barostat_frequency,\n            timestep=settings[\"integrator_settings\"].timestep,\n            equil_steps_nvt=equil_steps_nvt,\n            equil_steps_npt=equil_steps_npt,\n            prod_steps=prod_steps_npt,\n            verbose=self.verbose,\n            shared_basepath=self.shared_basepath,\n        )\n\n        # TODO: if we still see crashes, see if using enforcePeriodicBox is necessary\n        # on newer tests, these were not necessary.\n        state = simulation.context.getState(getPositions=True)\n        equilibrated_positions = state.getPositions(asNumpy=True)\n        box = state.getPeriodicBoxVectors()\n\n        # cautiously delete out contexts & integrator\n        del simulation.context, integrator\n\n        return equilibrated_positions, to_openmm(from_openmm(box))\n\n    @staticmethod\n    def _assign_partial_charges(\n        partial_charge_settings: OpenFFPartialChargeSettings,\n        small_mols: dict[SmallMoleculeComponent, OFFMolecule],\n    ) -> None:\n        \"\"\"\n        Assign partial charges to the OpenFF Molecules associated with\n        all the SmallMoleculeComponents in the transformation.\n\n        Parameters\n        ----------\n        charge_settings : OpenFFPartialChargeSettings\n          Settings for controlling how the partial charges are assigned.\n        small_mols : dict[SmallMoleculeComponent, openff.toolkit.Molecule]\n          Dictionary of OpenFF Molecules to add, keyed by their\n          associated SmallMoleculeComponent.\n        \"\"\"\n        for mol in small_mols.values():\n            charge_generation.assign_offmol_partial_charges(\n                offmol=mol,\n                overwrite=False,\n                method=partial_charge_settings.partial_charge_method,\n                toolkit_backend=partial_charge_settings.off_toolkit_backend,\n                generate_n_conformers=partial_charge_settings.number_of_conformers,\n                nagl_model=partial_charge_settings.nagl_model,\n            )\n\n    @staticmethod\n    def _get_system_generator(\n        settings: dict[str, SettingsBaseModel],\n        solvent_component: BaseSolventComponent | None,\n        openff_molecules: list[OFFMolecule],\n        ffcache: pathlib.Path | None,\n    ) -> SystemGenerator:\n        \"\"\"\n        Get a system generator through the system creation\n        utilities\n\n        Parameters\n        ----------\n        settings : dict[str, SettingsBaseModel]\n          A dictionary of settings object for the unit.\n        solvent_comp : BaseSolventComponent | None\n          The solvent component of this system, if there is one.\n        openff_molecules : list[openff.toolkit.Molecule] | None\n          A list of OpenFF Molecules to generate templates for, if any.\n        ffcache : pathlib.Path | None\n          Path to the force field parameter cache.\n\n        Returns\n        -------\n        system_generator : openmmforcefields.generator.SystemGenerator\n          System Generator to parameterise this unit.\n        \"\"\"\n        system_generator = system_creation.get_system_generator(\n            forcefield_settings=settings[\"forcefield_settings\"],\n            integrator_settings=settings[\"integrator_settings\"],\n            thermo_settings=settings[\"thermo_settings\"],\n            cache=ffcache,\n            has_solvent=solvent_component is not None,\n        )\n\n        # Handle openff Molecule templates\n        # TODO: revisit this once the SystemGenerator update happens\n        if openff_molecules is None:\n            return system_generator\n\n        # Register all the templates, pass unique molecules to avoid clashes\n        system_generator.add_molecules(list(set(openff_molecules)))\n\n        return system_generator\n\n    @staticmethod\n    def _get_modeller(\n        protein_component: ProteinComponent | None,\n        solvent_component: BaseSolventComponent | None,\n        small_mols: dict[SmallMoleculeComponent, OFFMolecule],\n        system_generator: SystemGenerator,\n        solvation_settings: BaseSolvationSettings,\n    ) -> tuple[app.Modeller, dict[Component, npt.NDArray]]:\n        \"\"\"\n        Get an OpenMM Modeller object and a list of residue indices\n        for each component in the system.\n\n        Parameters\n        ----------\n        protein_component : ProteinComponent | None\n          Protein Component, if it exists.\n        solvent_component : BaseSolventComponent | None\n          The solvent component, if it exists.\n        small_mols : dict[SmallMoleculeComponent, openff.toolkit.Molecule]\n          Dictionary of OpenFF Molecules to add, keyed by\n          SmallMoleculeComponent.\n        system_generator : openmmforcefields.generator.SystemGenerator\n          System Generator to parameterise this unit.\n        solvation_settings : BaseSolvationSettings\n          Settings detailing how to solvate the system.\n\n        Returns\n        -------\n        system_modeller : app.Modeller\n          OpenMM Modeller object generated from ProteinComponent and\n          OpenFF Molecules.\n        comp_resids : dict[Component, npt.NDArray]\n          Dictionary of residue indices for each component in system.\n        \"\"\"\n        # get OpenMM modeller + dictionary of resids for each component\n        system_modeller, comp_resids = system_creation.get_omm_modeller(\n            protein_comp=protein_component,\n            solvent_comp=solvent_component,\n            small_mols=small_mols,\n            omm_forcefield=system_generator.forcefield,\n            solvent_settings=solvation_settings,\n        )\n\n        return system_modeller, comp_resids\n\n    def _get_omm_objects(\n        self,\n        settings: dict[str, SettingsBaseModel],\n        protein_component: ProteinComponent | None,\n        solvent_component: BaseSolventComponent | None,\n        small_mols: dict[SmallMoleculeComponent, OFFMolecule],\n    ) -> tuple[\n        app.Topology,\n        openmm.System,\n        openmm.unit.Quantity,\n        dict[Component, npt.NDArray],\n    ]:\n        \"\"\"\n        Get the OpenMM Topology, Positions and System of the\n        parameterised system.\n\n        Parameters\n        ----------\n        settings : dict[str, SettingsBaseModel]\n          Protocol settings\n        protein_component : ProteinComponent | None\n          Protein component for the system.\n        solvent_component : BaseSolventComponent | None\n         Solvent component for the system, if it exists.\n        small_mols : dict[str, openff.toolkit.Molecule]\n          Dictionary of SmallMoleculeComponents and OpenFF Molecules\n          defining the ligands to be added to the system\n\n        Returns\n        -------\n        topology : app.Topology\n          OpenMM Topology object describing the parameterized system.\n        system : openmm.System\n          A non-alchemical OpenMM System of the simulated system.\n        positions : openmm.unit.Quantity\n          Positions of the system.\n        comp_resids : dict[Component, npt.NDArray]\n          A dictionary of the residues for each component in the System.\n        \"\"\"\n        if self.verbose:\n            self.logger.info(\"Parameterizing system\")\n\n        with without_oechem_backend():\n            system_generator = self._get_system_generator(\n                settings=settings,\n                solvent_component=solvent_component,\n                openff_molecules=list(small_mols.values()),\n                ffcache=self.shared_basepath / settings[\"output_settings\"].forcefield_cache,\n            )\n\n            modeller, comp_resids = self._get_modeller(\n                protein_component=protein_component,\n                solvent_component=solvent_component,\n                small_mols=small_mols,\n                system_generator=system_generator,\n                solvation_settings=settings[\"solvation_settings\"],\n            )\n\n            system = system_generator.create_system(\n                topology=modeller.topology,\n                molecules=list(small_mols.values()),\n            )\n\n        topology = modeller.getTopology()\n        # roundtrip positions to remove vec3 issues\n        positions = to_openmm(from_openmm(modeller.getPositions()))\n\n        return topology, system, positions, comp_resids\n\n    def _add_restraints(\n        self,\n        system: openmm.System,\n        topology: GlobalParameterState,\n        positions: openmm.unit.Quantity,\n        alchem_comps: dict[str, list[Component]],\n        comp_resids: dict[Component, npt.NDArray],\n        settings: dict[str, SettingsBaseModel],\n    ) -> tuple[\n        Quantity | None,\n        openmm.System | None,\n        geometry.BaseRestraintGeometry | None,\n    ]:\n        \"\"\"\n        Placeholder method to add restraints if necessary\n        \"\"\"\n        return None, system, None\n\n    def _get_alchemical_system(\n        self,\n        topology: app.Topology,\n        system: openmm.System,\n        comp_resids: dict[Component, npt.NDArray],\n        alchem_comps: dict[str, list[Component]],\n        alchemical_settings: AlchemicalSettings,\n    ) -> tuple[AbsoluteAlchemicalFactory, openmm.System, list[int]]:\n        \"\"\"\n        Get an alchemically modified system and its associated factory\n\n        Parameters\n        ----------\n        topology : openmm.Topology\n          Topology of OpenMM System.\n        system : openmm.System\n          System to alchemically modify.\n        comp_resids : dict[str, npt.NDArray]\n          A dictionary of residues for each component in the System.\n        alchem_comps : dict[str, list[Component]]\n          A dictionary of alchemical components for each end state.\n        alchemical_settings : AlchemicalSettings\n          Settings controlling how the alchemical system is built.\n\n        Returns\n        -------\n        alchemical_factory : AbsoluteAlchemicalFactory\n          Factory for creating an alchemically modified system.\n        alchemical_system : openmm.System\n          Alchemically modified system\n        alchemical_indices : list[int]\n          A list of atom indices for the alchemically modified\n          species in the system.\n\n        TODO\n        ----\n        * Add support for all alchemical factory options\n        \"\"\"\n        alchemical_indices = self._get_alchemical_indices(topology, comp_resids, alchem_comps)\n\n        alchemical_region = AlchemicalRegion(\n            alchemical_atoms=alchemical_indices,\n            softcore_alpha=alchemical_settings.softcore_alpha,\n            annihilate_electrostatics=True,\n            annihilate_sterics=alchemical_settings.annihilate_sterics,\n            softcore_a=alchemical_settings.softcore_a,\n            softcore_b=alchemical_settings.softcore_b,\n            softcore_c=alchemical_settings.softcore_c,\n            softcore_beta=0.0,\n            softcore_d=1.0,\n            softcore_e=1.0,\n            softcore_f=2.0,\n        )\n\n        alchemical_factory = AbsoluteAlchemicalFactory(\n            consistent_exceptions=False,\n            switch_width=1.0 * ommunit.angstroms,\n            alchemical_pme_treatment=\"exact\",\n            alchemical_rf_treatment=\"switched\",\n            disable_alchemical_dispersion_correction=alchemical_settings.disable_alchemical_dispersion_correction,\n            split_alchemical_forces=True,\n        )\n        alchemical_system = alchemical_factory.create_alchemical_system(system, alchemical_region)\n\n        return alchemical_factory, alchemical_system, alchemical_indices\n\n    @staticmethod\n    def _subsample_topology(\n        topology: openmm.app.Topology,\n        positions: openmm.unit.Quantity,\n        output_selection: str,\n        output_file: pathlib.Path,\n    ) -> npt.NDArray:\n        \"\"\"\n        Subsample the system based on user-selected output selection\n        and write the subsampled topology to a PDB file.\n\n        Parameters\n        ----------\n        topology : openmm.app.Topology\n          The system topology to subsample.\n        positions : openmm.unit.Quantity\n          The system positions.\n        output_selection : str\n          An MDTraj selection string to subsample the topology with.\n        output_file : pathlib.Path\n          Path to the file to write the PDB to.\n\n        Returns\n        -------\n        selection_indices : npt.NDArray\n          The indices of the subselected system.\n        \"\"\"\n        traj = mdtraj_from_openmm(topology, positions)\n\n        selection_indices = traj.topology.select(output_selection)\n\n        # Write out the subselected structure to PDB if not empty\n        if len(selection_indices) > 0:\n            sub_traj = traj.atom_slice(selection_indices)\n            sub_traj.save_pdb(output_file)\n\n        return selection_indices\n\n    def run(\n        self,\n        dry: bool = False,\n        verbose: bool = True,\n        scratch_basepath: pathlib.Path | None = None,\n        shared_basepath: pathlib.Path | None = None,\n    ) -> dict[str, Any]:\n        \"\"\"Run the setup phase of an absolute free energy calculation.\n\n        Parameters\n        ----------\n        dry : bool\n          Do a dry run of the calculation, creating all necessary alchemical\n          system components (topology, system, etc...) but without\n          running the simulation, default False\n        verbose : bool\n          Verbose output of the simulation progress. Output is provided via\n          INFO level logging, default True\n        scratch_basepath : pathlib.Path | None\n          Path to the scratch (temporary) directory space. Defaults to the\n          current working directory if ``None``.\n        shared_basepath : pathlib.Path | None\n          Path to the shared (persistent) directory space. Defaults to the\n          current working directory if ``None``.\n\n        Returns\n        -------\n        dict\n          Outputs created in the basepath directory or the debug objects\n          (i.e. sampler) if ``dry==True``.\n        \"\"\"\n        # General preparation tasks\n        self._prepare(verbose, scratch_basepath, shared_basepath)\n\n        if self.verbose:\n            self.logger.info(\"Starting system setup unit\")\n\n        # Get components\n        alchem_comps, solv_comp, prot_comp, small_mols = self._get_components()\n\n        # Get settings\n        settings = self._get_settings()\n\n        # Assign partial charges now to avoid any discrepancies later\n        self._assign_partial_charges(settings[\"charge_settings\"], small_mols)\n\n        # Get OpenMM topology, positions, system, and comp_resids\n        omm_topology, omm_system, positions, comp_resids = self._get_omm_objects(\n            settings=settings,\n            protein_component=prot_comp,\n            solvent_component=solv_comp,\n            small_mols=small_mols,\n        )\n\n        # Pre-equilbrate System (Test + Avoid NaNs + get stable system)\n        positions, box_vectors = self._pre_equilibrate(\n            omm_system, omm_topology, positions, settings, dry\n        )\n\n        # Add restraints\n        # Note: when no restraint is applied, restrained_omm_system == omm_system\n        (\n            standard_state_corr,\n            restrained_omm_system,\n            restraint_geometry,\n        ) = self._add_restraints(\n            omm_system,\n            omm_topology,\n            positions,\n            alchem_comps,\n            comp_resids,\n            settings,\n        )\n\n        # Get alchemical system\n        alchem_factory, alchem_system, alchem_indices = self._get_alchemical_system(\n            topology=omm_topology,\n            system=restrained_omm_system,\n            comp_resids=comp_resids,\n            alchem_comps=alchem_comps,\n            alchemical_settings=settings[\"alchemical_settings\"],\n        )\n\n        # Subselect system based on user inputs & write initial PDB\n        selection_indices = self._subsample_topology(\n            topology=omm_topology,\n            positions=positions,\n            output_selection=settings[\"output_settings\"].output_indices,\n            output_file=self.shared_basepath / settings[\"output_settings\"].output_structure,\n        )\n\n        # Serialize relevant outputs\n        system_outfile = self.shared_basepath / \"alchemical_system.xml.bz2\"\n        serialize(alchem_system, system_outfile)\n\n        positions_outfile = self.shared_basepath / \"system_positions.npy\"\n        npy_positions = from_openmm(positions).to(\"nanometer\").m\n        np.save(positions_outfile, npy_positions)\n\n        # Set the PDB file name\n        if len(selection_indices) > 0:\n            pdb_structure = self.shared_basepath / settings[\"output_settings\"].output_structure\n        else:\n            pdb_structure = None\n\n        unit_results_dict = {\n            \"system\": system_outfile,\n            \"positions\": positions_outfile,\n            \"pdb_structure\": pdb_structure,\n            \"selection_indices\": selection_indices,\n            \"box_vectors\": from_openmm(box_vectors),\n        }\n\n        if standard_state_corr is not None:\n            unit_results_dict[\"standard_state_correction\"] = standard_state_corr.to(\n                \"kilocalorie_per_mole\"\n            )\n        else:\n            unit_results_dict[\"standard_state_correction\"] = 0 * offunit.kilocalorie_per_mole\n\n        if restraint_geometry is not None:\n            unit_results_dict[\"restraint_geometry\"] = restraint_geometry.model_dump()\n        else:\n            unit_results_dict[\"restraint_geometry\"] = None\n\n        if dry:\n            unit_results_dict |= {\n                \"standard_system\": omm_system,\n                \"restrained_system\": restrained_omm_system,\n                \"alchem_system\": alchem_system,\n                \"alchem_indices\": alchem_indices,\n                \"alchem_factory\": alchem_factory,\n                \"debug_positions\": positions,\n            }\n        return unit_results_dict\n\n    def _execute(\n        self,\n        ctx: gufe.Context,\n        **inputs,\n    ) -> dict[str, Any]:\n        log_system_probe(logging.INFO, paths=[ctx.scratch])\n\n        outputs = self.run(scratch_basepath=ctx.scratch, shared_basepath=ctx.shared)\n\n        return {\n            \"repeat_id\": self._inputs[\"repeat_id\"],\n            \"generation\": self._inputs[\"generation\"],\n            \"simtype\": self.simtype,\n            \"openmm_version\": openmm.__version__,\n            \"openfe_version\": openfe.__version__,\n            \"gufe_version\": gufe.__version__,\n            **outputs,\n        }\n\n\nclass BaseAbsoluteMultiStateSimulationUnit(gufe.ProtocolUnit, AbsoluteUnitMixin):\n    @staticmethod\n    def _check_restart(output_settings: SettingsBaseModel, shared_path: pathlib.Path):\n        \"\"\"\n        Check if we are doing a restart.\n\n        Parameters\n        ----------\n        output_settings : SettingsBaseModel\n          The simulation output settings\n        shared_path : pathlib.Path\n          The shared directory where we should be looking for existing files.\n\n        Raises\n        ------\n        IOError\n          If one of the trajectory or checkpoint files are present\n          without the other.\n\n        Notes\n        -----\n        For now this just checks if the netcdf files are present in the\n        shared directory but in the future this may expand depending on\n        how warehouse works.\n        \"\"\"\n        trajectory = shared_path / output_settings.output_filename\n        checkpoint = shared_path / output_settings.checkpoint_storage_filename\n\n        if trajectory.is_file() and checkpoint.is_file():\n            return True\n        elif trajectory.is_file() ^ checkpoint.is_file():\n            if trajectory.is_file():\n                errmsg = \"the trajectory file is present but not the checkpoint file. \"\n            else:\n                errmsg = \"the checkpoint file is present but not the trajectory file. \"\n\n            errmsg = (\n                \"Attempting to restart but \"\n                + errmsg\n                + \"This should not happen under normal circumstances.\"\n            )\n            raise IOError(errmsg)\n        else:\n            return False\n\n    @abc.abstractmethod\n    def _get_components(\n        self,\n    ) -> tuple[\n        dict[str, list[Component]],\n        gufe.SolventComponent | None,\n        gufe.ProteinComponent | None,\n        dict[SmallMoleculeComponent, OFFMolecule],\n    ]:\n        \"\"\"\n        Get the relevant components to create the alchemical system with.\n\n        Note\n        ----\n        Must be implemented in the child class.\n        \"\"\"\n        ...\n\n    def _get_lambda_schedule(\n        self, settings: dict[str, SettingsBaseModel]\n    ) -> dict[str, list[float]]:\n        \"\"\"\n        Create the lambda schedule\n\n        Parameters\n        ----------\n        settings : dict[str, SettingsBaseModel]\n          Settings for the unit.\n\n        Returns\n        -------\n        lambdas : dict[str, list[float]]\n\n        TODO\n        ----\n        * Augment this by using something akin to the RFE protocol's\n          LambdaProtocol\n        \"\"\"\n        lambdas = dict()\n\n        lambda_elec = settings[\"lambda_settings\"].lambda_elec\n        lambda_vdw = settings[\"lambda_settings\"].lambda_vdw\n        lambda_rest = settings[\"lambda_settings\"].lambda_restraints\n\n        # Reverse lambda schedule for vdw, end elec,\n        # since in AbsoluteAlchemicalFactory 1 means fully\n        # interacting (which would be non-interacting for us)\n        lambdas[\"lambda_electrostatics\"] = [1 - x for x in lambda_elec]\n        lambdas[\"lambda_sterics\"] = [1 - x for x in lambda_vdw]\n        lambdas[\"lambda_restraints\"] = [x for x in lambda_rest]\n\n        return lambdas\n\n    def _get_states(\n        self,\n        alchemical_system: openmm.System,\n        positions: openmm.unit.Quantity,\n        box_vectors: openmm.unit.Quantity,\n        thermodynamic_settings: ThermoSettings,\n        lambdas: dict[str, list[float]],\n        solvent_component: BaseSolventComponent | None,\n        alchemically_restrained: bool,\n    ) -> tuple[list[SamplerState], list[ThermodynamicState]]:\n        \"\"\"\n        Get a list of sampler and thermodynmic states from an\n        input alchemical system.\n\n        Parameters\n        ----------\n        alchemical_system : openmm.System\n          Alchemical system to get states for.\n        positions : openmm.unit.Quantity\n          Positions of the alchemical system.\n        box_vectors :  openmm.unit.Quantity\n          Box vectors of the alchemical system.\n        thermodynamic_settings : ThermoSettings\n          Settings controlling the thermodynamic parameters.\n        lambdas : dict[str, list[float]]\n          A dictionary of lambda scales.\n        solvent_component : BaseSolventComponent | None\n          The solvent component of the system, if there is one.\n        alchemically_restrained : bool\n          Whether or not the system requires a control parameter\n          for any alchemical restraints.\n\n        Returns\n        -------\n        sampler_states : list[SamplerState]\n          A list of SamplerStates for each replica in the system.\n        cmp_states : list[ThermodynamicState]\n          A list of ThermodynamicState for each replica in the system.\n        \"\"\"\n        # Fetch an alchemical state\n        alchemical_state = AlchemicalState.from_system(alchemical_system)\n\n        # Set up the system constants\n        temperature = thermodynamic_settings.temperature\n        pressure = thermodynamic_settings.pressure\n        constants = dict()\n        constants[\"temperature\"] = ensure_quantity(temperature, \"openmm\")\n\n        if solvent_component is not None:\n            constants[\"pressure\"] = ensure_quantity(pressure, \"openmm\")\n\n        # Get the thermodynamic parameter protocol\n        param_protocol = copy.deepcopy(lambdas)\n\n        # Get the composable states\n        if alchemically_restrained:\n            restraint_state = omm_restraints.RestraintParameterState(lambda_restraints=1.0)\n            composable_states = [alchemical_state, restraint_state]\n        else:\n            composable_states = [alchemical_state]\n\n            # In this case we also don't have a restraint being controlled\n            # so we drop it from the protocol\n            param_protocol.pop(\"lambda_restraints\", None)\n\n        cmp_states = create_thermodynamic_state_protocol(\n            alchemical_system,\n            protocol=param_protocol,\n            constants=constants,\n            composable_states=composable_states,\n        )\n\n        sampler_state = SamplerState(positions=positions)\n        if alchemical_system.usesPeriodicBoundaryConditions():\n            sampler_state.box_vectors = box_vectors\n\n        sampler_states = [sampler_state for _ in cmp_states]\n\n        return sampler_states, cmp_states\n\n    @staticmethod\n    def _get_integrator(\n        integrator_settings: IntegratorSettings,\n        simulation_settings: MultiStateSimulationSettings,\n        system: openmm.System,\n    ) -> openmmtools.mcmc.LangevinDynamicsMove:\n        \"\"\"\n        Return a LangevinDynamicsMove integrator\n\n        Parameters\n        ----------\n        integrator_settings : IntegratorSettings\n          Settings controlling the Langevin integrator\n        simulation_settings : MultiStateSimulationSettings\n          Settings controlling the simulation.\n        system : openmm.System\n          The OpenMM System.\n\n        Returns\n        -------\n        integrator : openmmtools.mcmc.LangevinDynamicsMove\n          A configured integrator object.\n\n        Raises\n        ------\n        ValueError\n          If there are virtual sites in the system, but\n          velocities are not being reassigned after every MCMC move.\n        \"\"\"\n        steps_per_iteration = settings_validation.convert_steps_per_iteration(\n            simulation_settings, integrator_settings\n        )\n\n        integrator = openmmtools.mcmc.LangevinDynamicsMove(\n            timestep=to_openmm(integrator_settings.timestep),\n            collision_rate=to_openmm(integrator_settings.langevin_collision_rate),\n            n_steps=steps_per_iteration,\n            reassign_velocities=integrator_settings.reassign_velocities,\n            n_restart_attempts=integrator_settings.n_restart_attempts,\n            constraint_tolerance=integrator_settings.constraint_tolerance,\n        )\n\n        # Validate for known issue when dealing with virtual sites\n        # and mutltistate simulations\n        if not integrator_settings.reassign_velocities:\n            for particle_idx in range(system.getNumParticles()):\n                if system.isVirtualSite(particle_idx):\n                    errmsg = (\n                        \"Simulations with virtual sites without velocity \"\n                        \"reassignments are unstable with MCMC integrators. \"\n                        \"You can set `reassign_velocities` to ``True`` in the \"\n                        \"`integrator_settings` to avoid this issue.\"\n                    )\n                    raise ValueError(errmsg)\n\n        return integrator\n\n    @staticmethod\n    def _get_reporter(\n        storage_path: pathlib.Path,\n        selection_indices: npt.NDArray,\n        simulation_settings: MultiStateSimulationSettings,\n        output_settings: MultiStateOutputSettings,\n    ) -> multistate.MultiStateReporter:\n        \"\"\"\n        Get a MultistateReporter for the simulation you are running.\n\n        Parameters\n        ----------\n        storage_path : pathlib.Path\n          Path to the directory where files should be written.\n        selection_indices : npt.NDArray\n          Array of system particle indices to subsample the system by.\n        simulation_settings : MultiStateSimulationSettings\n          Multistate simulation control settings, specifically containing\n          the amount of time per state sampling iteration.\n        output_settings: MultiStateOutputSettings\n          Output settings for the simulations\n\n        Returns\n        -------\n        reporter : multistate.MultiStateReporter\n          The reporter for the simulation.\n\n        Notes\n        -----\n        All this does is create the reporter, it works for both\n        new reporters and if we are doing a restart.\n        \"\"\"\n        # Define the trajectory & checkpoint files\n        nc = storage_path / output_settings.output_filename\n        # The checkpoint file in openmmtools is taken as a file relative\n        # to the location of the nc file, so you only want the filename\n        chk = output_settings.checkpoint_storage_filename\n\n        if output_settings.positions_write_frequency is not None:\n            pos_interval = settings_validation.divmod_time_and_check(\n                numerator=output_settings.positions_write_frequency,\n                denominator=simulation_settings.time_per_iteration,\n                numerator_name=\"output settings' position_write_frequency\",\n                denominator_name=\"simulation settings' time_per_iteration\",\n            )\n        else:\n            pos_interval = 0\n\n        if output_settings.velocities_write_frequency is not None:\n            vel_interval = settings_validation.divmod_time_and_check(\n                numerator=output_settings.velocities_write_frequency,\n                denominator=simulation_settings.time_per_iteration,\n                numerator_name=\"output settings' velocity_write_frequency\",\n                denominator_name=\"simulation settings' time_per_iteration\",\n            )\n        else:\n            vel_interval = 0\n\n        chk_intervals = settings_validation.convert_checkpoint_interval_to_iterations(\n            checkpoint_interval=output_settings.checkpoint_interval,\n            time_per_iteration=simulation_settings.time_per_iteration,\n        )\n\n        return multistate.MultiStateReporter(\n            storage=nc,\n            analysis_particle_indices=selection_indices,\n            checkpoint_interval=chk_intervals,\n            checkpoint_storage=chk,\n            position_interval=pos_interval,\n            velocity_interval=vel_interval,\n        )\n\n    @staticmethod\n    def _get_sampler(\n        integrator: openmmtools.mcmc.LangevinDynamicsMove,\n        reporter: openmmtools.multistate.MultiStateReporter,\n        simulation_settings: MultiStateSimulationSettings,\n        thermodynamic_settings: ThermoSettings,\n        compound_states: list[ThermodynamicState],\n        sampler_states: list[SamplerState],\n        platform: openmm.Platform,\n        restart: bool,\n    ) -> multistate.MultiStateSampler:\n        \"\"\"\n        Get a sampler based on the equilibrium sampling method requested.\n\n        Parameters\n        ----------\n        integrator : openmmtools.mcmc.LangevinDynamicsMove\n          The simulation integrator.\n        reporter : openmmtools.multistate.MultiStateReporter\n          The reporter to hook up to the sampler.\n        simulation_settings : MultiStateSimulationSettings\n          Settings for the alchemical sampler.\n        thermodynamic_settings : ThermoSettings\n          Thermodynamic settings\n        compound_states : list[ThermodynamicState]\n          A list of thermodynamic states to sample.\n        sampler_states : list[SamplerState]\n          A list of sampler states.\n        platform : openmm.Platform\n          The compute platform to use.\n        restart : bool\n          ``True`` if we are doing a simulation restart.\n\n        Returns\n        -------\n        sampler : multistate.MultistateSampler\n          A sampler configured for the chosen sampling method.\n        \"\"\"\n        _SAMPLERS = {\n            \"repex\": multistate.ReplicaExchangeSampler,\n            \"sams\": multistate.SAMSSampler,\n            \"independent\": multistate.MultiStateSampler,\n        }\n\n        sampler_method = simulation_settings.sampler_method.lower()\n        try:\n            sampler_class = _SAMPLERS[sampler_method]\n        except KeyError:\n            errmsg = f\"Unknown sampler {sampler_method}\"\n            raise AttributeError(errmsg)\n\n        # Get the real time analysis values to use\n        rta_its, rta_min_its = settings_validation.convert_real_time_analysis_iterations(\n            simulation_settings=simulation_settings,\n        )\n\n        # Get the number of production iterations to run for\n        steps_per_iteration = integrator.n_steps\n        timestep = from_openmm(integrator.timestep)\n        number_of_iterations = int(\n            settings_validation.get_simsteps(\n                sim_length=simulation_settings.production_length,\n                timestep=timestep,\n                mc_steps=steps_per_iteration,\n            )\n            / steps_per_iteration\n        )\n\n        # convert early_termination_target_error from kcal/mol to kT\n        early_termination_target_error = (\n            settings_validation.convert_target_error_from_kcal_per_mole_to_kT(\n                thermodynamic_settings.temperature,\n                simulation_settings.early_termination_target_error,\n            )\n        )\n\n        sampler_kwargs = {\n            \"mcmc_moves\": integrator,\n            \"online_analysis_interval\": rta_its,\n            \"online_analysis_target_error\": early_termination_target_error,\n            \"online_analysis_minimum_iterations\": rta_min_its,\n            \"number_of_iterations\": number_of_iterations,\n        }\n\n        if sampler_method == \"sams\":\n            sampler_kwargs |= {\n                \"flatness_criteria\": simulation_settings.sams_flatness_criteria,\n                \"gamma0\": simulation_settings.sams_gamma0,\n            }\n\n        if sampler_method == \"repex\":\n            sampler_kwargs |= {\n                \"replica_mixing_scheme\": \"swap-all\",\n            }\n\n        # Restarting so we just rebuild from storage.\n        if restart:\n            sampler = sampler_class.from_storage(reporter)\n\n            # We do some checks to make sure we are running the same system\n            # including ensuring that we have the same thermodynamic parameters and\n            # that the lambda schedule is the same.\n            for index, thermostate in enumerate(sampler._thermodynamic_states):\n                system_validation.assert_multistate_system_equality(\n                    ref_system=compound_states[index].get_system(remove_thermostat=True),\n                    stored_system=thermostate.get_system(remove_thermostat=True),\n                )\n\n                # Loop over each composable state (e.g. GlobalParameterState object)\n                # get the parameters and check that the values are the same.\n                for composable_state in compound_states[index]._composable_states:\n                    for param in composable_state._parameters:\n                        expected = getattr(compound_states[index], param)\n                        stored = getattr(thermostate, param)\n                        if expected != stored:\n                            errmsg = (\n                                f\"System parameter {param} in checkpoint does \"\n                                \"not match protocol system, cannot resume\"\n                            )\n                            raise ValueError(errmsg)\n\n            if (\n                (simulation_settings.n_replicas != sampler.n_states)\n                or (simulation_settings.n_replicas != sampler.n_replicas)\n                or (sampler.mcmc_moves[0].n_steps != steps_per_iteration)\n                or (sampler.mcmc_moves[0].timestep != integrator.timestep)\n            ):\n                errmsg = \"System in checkpoint does not match protocol system, cannot resume\"\n                raise ValueError(errmsg)\n        else:\n            sampler = sampler_class(**sampler_kwargs)\n\n            sampler.create(\n                thermodynamic_states=compound_states,\n                sampler_states=sampler_states,\n                storage=reporter,\n            )\n\n        # Get and set the context caches\n        sampler.energy_context_cache = openmmtools.cache.ContextCache(\n            capacity=None,\n            time_to_live=None,\n            platform=platform,\n        )\n\n        sampler.sampler_context_cache = openmmtools.cache.ContextCache(\n            capacity=None,\n            time_to_live=None,\n            platform=platform,\n        )\n\n        return sampler\n\n    def _run_simulation(\n        self,\n        sampler: multistate.MultiStateSampler,\n        reporter: multistate.MultiStateReporter,\n        settings: dict[str, SettingsBaseModel],\n        dry: bool,\n    ):\n        \"\"\"\n        Run the simulation.\n\n        Parameters\n        ----------\n        sampler : multistate.MultiStateSampler\n          The sampler associated with the simulation to run.\n        reporter : multistate.MultiStateReporter\n          The reporter associated with the sampler.\n        settings : dict[str, SettingsBaseModel]\n          The dictionary of settings for the protocol.\n        dry : bool\n          Whether or not to dry run the simulation\n        \"\"\"\n        # Get the relevant simulation steps\n        mc_steps = settings_validation.convert_steps_per_iteration(\n            simulation_settings=settings[\"simulation_settings\"],\n            integrator_settings=settings[\"integrator_settings\"],\n        )\n\n        equil_steps = settings_validation.get_simsteps(\n            sim_length=settings[\"simulation_settings\"].equilibration_length,\n            timestep=settings[\"integrator_settings\"].timestep,\n            mc_steps=mc_steps,\n        )\n        prod_steps = settings_validation.get_simsteps(\n            sim_length=settings[\"simulation_settings\"].production_length,\n            timestep=settings[\"integrator_settings\"].timestep,\n            mc_steps=mc_steps,\n        )\n\n        if not dry:  # pragma: no-cover\n            # No production steps have been taken, so start from scratch\n            if sampler._iteration == 0:\n                # minimize\n                if self.verbose:\n                    self.logger.info(\"minimizing systems\")\n\n                sampler.minimize(max_iterations=settings[\"simulation_settings\"].minimization_steps)\n\n                # equilibrate\n                if self.verbose:\n                    self.logger.info(\"equilibrating systems\")\n\n                sampler.equilibrate(int(equil_steps / mc_steps))\n\n            # At this point we are ready for production\n            if self.verbose:\n                self.logger.info(\"running production phase\")\n\n            # We use `run` so that we're limited by the number of iterations\n            # we passed when we built the sampler.\n            sampler.run(n_iterations=int(prod_steps / mc_steps) - sampler._iteration)\n\n            if self.verbose:\n                self.logger.info(\"production phase complete\")\n\n        else:\n            # close reporter when you're done, prevent file handle clashes\n            reporter.close()\n\n            # clean up the reporter file\n            fns = [\n                self.shared_basepath / settings[\"output_settings\"].output_filename,\n                self.shared_basepath / settings[\"output_settings\"].checkpoint_storage_filename,\n            ]\n            for fn in fns:\n                fn.unlink()\n\n    def run(\n        self,\n        *,\n        system: openmm.System,\n        positions: openmm.unit.Quantity,\n        box_vectors: Quantity,\n        selection_indices: npt.NDArray,\n        alchemical_restraints: bool,\n        dry: bool = False,\n        verbose: bool = True,\n        scratch_basepath: pathlib.Path | None = None,\n        shared_basepath: pathlib.Path | None = None,\n    ) -> dict[str, Any]:\n        \"\"\"\n        Run the free energy calculation using a multistate sampler.\n\n        Parameters\n        ----------\n        system : openmm.System\n          The System to simulate.\n        positions : openmm.unit.Quantity\n          The positions of the System.\n        box_vectors : openff.units.Quantity\n          The box vectors of the System.\n        selection_indices : npt.NDArray\n          Indices of the System particles to write to file.\n        alchemical_restraints: bool,\n          Whether or not the system has alchemical restraints.\n        dry: bool\n          Do a dry run of the calculation, creating all the necessary\n          components, but without running the simulation.\n        verbose : bool\n          Verbose output of the simulation progress. Output is provided at\n          the INFO logging level.\n        scratch_basepath : pathlib.Path | None\n          Where to store temporary files, defaults to the current working\n          directory if ``None``.\n        shared_basepath : pathlib.Path | None\n          Where to store calculation outputs, defaults to the current working\n          directory if ``None``.\n\n        Returns\n        -------\n        dict\n          Outputs created by the unit, including the debug objects\n          (i.e. sampler) if ``dry==True``\n        \"\"\"\n        # Prepare paths & verbosity\n        self._prepare(verbose, scratch_basepath, shared_basepath)\n\n        if self.verbose:\n            self.logger.info(\"Starting simulation unit\")\n\n        # Get the settings\n        settings = self._get_settings()\n\n        # Check for a restart\n        self.restart = self._check_restart(\n            output_settings=settings[\"output_settings\"],\n            shared_path=self.shared_basepath,\n        )\n\n        # Get the components\n        alchem_comps, solv_comp, prot_comp, small_mols = self._get_components()\n\n        # Get the lambda schedule\n        lambdas = self._get_lambda_schedule(settings)\n\n        # Get the compute platform\n        restrict_cpu = settings[\"forcefield_settings\"].nonbonded_method.lower() == \"nocutoff\"\n        platform = omm_compute.get_openmm_platform(\n            platform_name=settings[\"engine_settings\"].compute_platform,\n            gpu_device_index=settings[\"engine_settings\"].gpu_device_index,\n            restrict_cpu_count=restrict_cpu,\n        )\n\n        # Get compound and sampler states\n        sampler_states, cmp_states = self._get_states(\n            alchemical_system=system,\n            positions=positions,\n            # convert the box vectors to vec3 from openff\n            box_vectors=make_vec3_box(box_vectors),\n            thermodynamic_settings=settings[\"thermo_settings\"],\n            lambdas=lambdas,\n            solvent_component=solv_comp,\n            alchemically_restrained=alchemical_restraints,\n        )\n\n        # Get the integrator\n        integrator = self._get_integrator(\n            integrator_settings=settings[\"integrator_settings\"],\n            simulation_settings=settings[\"simulation_settings\"],\n            system=system,\n        )\n\n        try:\n            # Create or get the multistate reporter\n            reporter = self._get_reporter(\n                storage_path=self.shared_basepath,\n                selection_indices=selection_indices,\n                simulation_settings=settings[\"simulation_settings\"],\n                output_settings=settings[\"output_settings\"],\n            )\n\n            # Get the sampler\n            sampler = self._get_sampler(\n                integrator=integrator,\n                reporter=reporter,\n                simulation_settings=settings[\"simulation_settings\"],\n                thermodynamic_settings=settings[\"thermo_settings\"],\n                compound_states=cmp_states,\n                sampler_states=sampler_states,\n                platform=platform,\n                restart=self.restart,\n            )\n\n            # Run the simulation\n            self._run_simulation(\n                sampler=sampler,\n                reporter=reporter,\n                settings=settings,\n                dry=dry,\n            )\n\n        finally:\n            # Have to wrap this in a try/except, because we might\n            # be in a situation where the reporter or sampler weren't created\n            try:\n                # Order is reporter, contexts, sampler, integrator\n                reporter.close()  # close to prevent file handle clashes\n\n                # clear GPU context\n                # Note: use cache.empty() when openmmtools #690 is resolved\n                for context in list(sampler.energy_context_cache._lru._data.keys()):\n                    del sampler.energy_context_cache._lru._data[context]\n                for context in list(sampler.sampler_context_cache._lru._data.keys()):\n                    del sampler.sampler_context_cache._lru._data[context]\n                # cautiously clear out the global context cache too\n                for context in list(openmmtools.cache.global_context_cache._lru._data.keys()):\n                    del openmmtools.cache.global_context_cache._lru._data[context]\n\n                del sampler.sampler_context_cache, sampler.energy_context_cache\n\n                # Keep these around in a dry run so we can inspect things\n                if not dry:\n                    # At this point we know the sampler exists, so we del the integrator\n                    # first since it's associated with the sampler\n                    del integrator, sampler\n            except UnboundLocalError:\n                pass\n\n        if not dry:\n            nc = self.shared_basepath / settings[\"output_settings\"].output_filename\n            chk = self.shared_basepath / settings[\"output_settings\"].checkpoint_storage_filename\n            return {\n                \"trajectory\": nc,\n                \"checkpoint\": chk,\n            }\n        else:\n            return {\n                \"sampler\": sampler,\n                \"integrator\": integrator,\n            }\n\n    def _execute(\n        self,\n        ctx: gufe.Context,\n        *,\n        setup_results,\n        **inputs,\n    ) -> dict[str, Any]:\n        log_system_probe(logging.INFO, paths=[ctx.scratch])\n\n        # Ensure the environment hasn't changed\n        self._verify_execution_environment(setup_results.outputs)\n\n        # Get the relevant inputs for running the unit\n        system = deserialize(setup_results.outputs[\"system\"])\n        positions = to_openmm(np.load(setup_results.outputs[\"positions\"]) * offunit.nanometer)\n        selection_indices = setup_results.outputs[\"selection_indices\"]\n        box_vectors = setup_results.outputs[\"box_vectors\"]\n\n        if setup_results.outputs[\"restraint_geometry\"] is not None:\n            alchemical_restraints = True\n        else:\n            alchemical_restraints = False\n\n        outputs = self.run(\n            system=system,\n            positions=positions,\n            box_vectors=box_vectors,\n            selection_indices=selection_indices,\n            alchemical_restraints=alchemical_restraints,\n            scratch_basepath=ctx.scratch,\n            shared_basepath=ctx.shared,\n        )\n\n        return {\n            \"repeat_id\": self._inputs[\"repeat_id\"],\n            \"generation\": self._inputs[\"generation\"],\n            \"simtype\": self.simtype,\n            **outputs,\n        }\n\n\nclass BaseAbsoluteMultiStateAnalysisUnit(gufe.ProtocolUnit, AbsoluteUnitMixin):\n    @staticmethod\n    def _analyze_multistate_energies(\n        trajectory: pathlib.Path,\n        checkpoint: pathlib.Path,\n        sampler_method: str,\n        output_directory: pathlib.Path,\n        dry: bool,\n    ):\n        \"\"\"\n        Analyze multistate energies and generate plots.\n\n        Parameters\n        ----------\n        trajectory : pathlib.Path\n          Path to the NetCDF trajectory file.\n        checkpoint : pathlib.Path\n          The name of the checkpoint file. Note this is\n          relative in path to the trajectory file.\n        sampler_method : str\n          The multistate sampler method used.\n        output_directory : pathlib.Path\n          The path to where plots will be written.\n        dry : bool\n          Whether or not we are running a dry run.\n        \"\"\"\n        reporter = multistate.MultiStateReporter(\n            storage=trajectory,\n            # Note: openmmtools only wants the name of the checkpoint\n            # file, it assumes it to be in the same place as the trajectory\n            checkpoint_storage=checkpoint.name,\n            open_mode=\"r\",\n        )\n\n        analyzer = multistate_analysis.MultistateEquilFEAnalysis(\n            reporter=reporter,\n            sampling_method=sampler_method,\n            result_units=offunit.kilocalorie_per_mole,\n        )\n\n        # Only create plots when not doing a dry run\n        if not dry:\n            analyzer.plot(filepath=output_directory, filename_prefix=\"\")\n\n        analyzer.close()\n        reporter.close()\n        return analyzer.unit_results_dict\n\n    def run(\n        self,\n        *,\n        trajectory: pathlib.Path,\n        checkpoint: pathlib.Path,\n        dry: bool = False,\n        verbose: bool = True,\n        scratch_basepath: pathlib.Path | None = None,\n        shared_basepath: pathlib.Path | None = None,\n    ) -> dict[str, Any]:\n        \"\"\"Analyze the multistate simulation.\n\n        Parameters\n        ----------\n        trajectory : pathlib.Path\n          Path to the MultiStateReporter generated NetCDF file.\n        checkpoint : pathlib.Path\n          Path to the checkpoint file generated by MultiStateReporter.\n        dry : bool\n          Do a dry run of the calculation, creating all necessary hybrid\n          system components (topology, system, sampler, etc...) but without\n          running the simulation.\n        verbose : bool\n          Verbose output of the simulation progress. Output is provided via\n          INFO level logging.\n        scratch_basepath: pathlib.Path | None\n          Where to store temporary files, defaults to current working directory\n        shared_basepath : pathlib.Path | None\n          Where to run the calculation, defaults to current working directory\n\n        Returns\n        -------\n        dict\n          Outputs created in the basepath directory or the debug objects\n          (i.e. sampler) if ``dry==True``.\n        \"\"\"\n        # Prepare paths & verbosity\n        self._prepare(verbose, scratch_basepath, shared_basepath)\n\n        if self.verbose:\n            self.logger.info(\"Starting simulation analysis unit\")\n\n        # Get the settings\n        settings = self._get_settings()\n\n        # Energies analysis\n        if verbose:\n            self.logger.info(\"Analyzing energies\")\n\n        energy_analysis = self._analyze_multistate_energies(\n            trajectory=trajectory,\n            checkpoint=checkpoint,\n            sampler_method=settings[\"simulation_settings\"].sampler_method.lower(),\n            output_directory=self.shared_basepath,\n            dry=dry,\n        )\n\n        return energy_analysis\n\n    def _execute(\n        self,\n        ctx: gufe.Context,\n        *,\n        setup_results,\n        simulation_results,\n        **inputs,\n    ) -> dict[str, Any]:\n        log_system_probe(logging.INFO, paths=[ctx.scratch])\n\n        # Ensure the environment hasn't changed\n        self._verify_execution_environment(setup_results.outputs)\n\n        # Get the relevant inputs for running the unit\n        pdb_file = setup_results.outputs[\"pdb_structure\"]\n        selection_indices = setup_results.outputs[\"selection_indices\"]\n        restraint_geometry = setup_results.outputs[\"restraint_geometry\"]\n        standard_state_corr = setup_results.outputs[\"standard_state_correction\"]\n        trajectory = simulation_results.outputs[\"trajectory\"]\n        checkpoint = simulation_results.outputs[\"checkpoint\"]\n\n        outputs = self.run(\n            trajectory=trajectory,\n            checkpoint=checkpoint,\n            scratch_basepath=ctx.scratch,\n            shared_basepath=ctx.shared,\n        )\n\n        return {\n            \"repeat_id\": self._inputs[\"repeat_id\"],\n            \"generation\": self._inputs[\"generation\"],\n            \"simtype\": self.simtype,\n            # We re-include things here also to make\n            # life easier when gathering results.\n            \"pdb_structure\": pdb_file,\n            \"trajectory\": trajectory,\n            \"checkpoint\": checkpoint,\n            \"selection_indices\": selection_indices,\n            \"restraint_geometry\": restraint_geometry,\n            \"standard_state_correction\": standard_state_corr,\n            **outputs,\n        }\n"
  },
  {
    "path": "src/openfe/protocols/openmm_afe/equil_afe_settings.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\n\n\"\"\"Settings class for equilibrium AFE Protocols using OpenMM + OpenMMTools\n\nThis module implements the necessary settings necessary to run absolute free\nenergies using OpenMM.\n\nSee Also\n--------\nopenfe.protocols.openmm_afe.AbsoluteSolvationProtocol\n\nTODO\n----\n* Add support for restraints\n\n\"\"\"\n\nimport numpy as np\nfrom gufe.settings import (\n    OpenMMSystemGeneratorFFSettings,\n    SettingsBaseModel,\n    ThermoSettings,\n)\nfrom pydantic import field_validator\n\nfrom openfe.protocols.openmm_utils.omm_settings import (\n    BaseSolvationSettings,\n    IntegratorSettings,\n    MDOutputSettings,\n    MDSimulationSettings,\n    MultiStateOutputSettings,\n    MultiStateSimulationSettings,\n    OpenFFPartialChargeSettings,\n    OpenMMEngineSettings,\n    OpenMMSolvationSettings,\n)\nfrom openfe.protocols.restraint_utils.settings import (\n    BaseRestraintSettings,\n    BoreschRestraintSettings,\n)\n\n\nclass AlchemicalSettings(SettingsBaseModel):\n    \"\"\"\n    Alchemical settings for Protocols which use the\n    AbsoluteAlchemicalFactory.\n    \"\"\"\n\n    disable_alchemical_dispersion_correction: bool = False\n    \"\"\"\n    If True, the long-range dispersion correction will not\n    be included for the alchemical region, avoiding the need\n    to recompute the correction. This can improve performance,\n    at the cost of accuracy. Default is False.\n    \"\"\"\n    annihilate_sterics: bool = False\n    \"\"\"\n    If True, sterics (Lennard-Jones) will be annihilated instead\n    of decoupled. Default is False.\n    \"\"\"\n    softcore_alpha: float = 0.5\n    \"\"\"\n    Alchemical softcore parameter for the Lennard-Jones interactions\n    (default is 0.5).\n\n    The generalized softcore potential formalism introduced by\n    Pham and Shirts, J. Chem. Phys. 135, 034114 (2011), equation 13,\n    is used here. The ``softcore_a``, ``softcore_b``, and\n    ``softcore_c`` parameters are used alongside ``softcore_alpha``\n    to control how the potential is scaled.\n    \"\"\"\n    softcore_a: float = 1.0\n    \"\"\"\n    Scaling constant ``a`` in\n    Eq. 13 from Pham and Shirts, J. Chem. Phys. 135, 034114 (2011).\n    \"\"\"\n    softcore_b: float = 1.0\n    \"\"\"\n    Scaling constant ``b`` in\n    Eq. 13 from Pham and Shirts, J. Chem. Phys. 135, 034114 (2011).\n    \"\"\"\n    softcore_c: float = 6.0\n    \"\"\"\n    Scaling constant ``c`` in\n    Eq. 13 from Pham and Shirts, J. Chem. Phys. 135, 034114 (2011).\n    \"\"\"\n\n\nclass LambdaSettings(SettingsBaseModel):\n    \"\"\"Lambda schedule settings.\n\n    Defines lists of floats to control various aspects of the alchemical\n    transformation.\n\n    Notes\n    -----\n    * In all cases a lambda value of 0 defines the system in state A, whilst\n      a value of 1 defines the system in state B. In an absolute transformation,\n      state A means a fully interacting ligand without any restraints applied,\n      and state B means a fully non-interacting ligand, with optional restraints\n      applied.\n    * ``lambda_elec``, ``lambda_vdw``, and ``lambda_restraints`` must all be of\n      the same length, defining all the windows of the transformation.\n    \"\"\"\n\n    # fmt: off\n    lambda_elec: list[float] = [\n        0.0, 0.25, 0.5, 0.75, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,\n        1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,\n    ]\n    # fmt: on\n    \"\"\"\n    List of floats of lambda values for the electrostatics.\n    Zero means fully interacting (state A),\n    and one means annihilated (state B).\n    Length of this list needs to match length of lambda_vdw and\n    lambda_restraints.\n    \"\"\"\n    # fmt: off\n    lambda_vdw: list[float] = [\n        0.0, 0.0, 0.0, 0.0, 0.0, 0.05, 0.1, 0.2, 0.3, 0.4,\n        0.5, 0.6, 0.65, 0.7, 0.75, 0.8, 0.85, 0.9, 0.95, 1.0,\n    ]\n    # fmt: on\n    \"\"\"\n    List of floats of lambda values for the van der Waals.\n    Zero means full interacting (state A) and one means decoupled (state B).\n    Length of this list needs to match length of lambda_elec and\n    lambda_restraints.\n    \"\"\"\n    # fmt: off\n    lambda_restraints: list[float] = [\n        0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,\n        0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,\n    ]\n    # fmt: on\n    \"\"\"\n    List of floats of lambda values for the restraints.\n    Zero means no restraints are applied (state A), and\n    one means restraints are fully applied (state B).\n\n    Note: The length of this list needs to match length of lambda_vdw and lambda_elec.\n    \"\"\"\n\n    @field_validator(\"lambda_elec\", \"lambda_vdw\", \"lambda_restraints\")\n    def must_be_between_0_and_1(cls, v):\n        for window in v:\n            if not 0 <= window <= 1:\n                errmsg = (\n                    f\"Lambda windows must be between 0 and 1, got a window with value {window}.\"\n                )\n                raise ValueError(errmsg)\n        return v\n\n    @field_validator(\"lambda_elec\", \"lambda_vdw\", \"lambda_restraints\")\n    def must_be_monotonic(cls, v):\n        difference = np.diff(v)\n        monotonic = np.all(difference >= 0)\n\n        if not monotonic:\n            errmsg = (\n                \"The lambda schedule is not monotonically increasing, \"\n                f\"got the following schedule: {v}.\"\n            )\n            raise ValueError(errmsg)\n\n        return v\n\n\nclass ABFEPreEquilOutputSettings(MDOutputSettings):\n    output_indices: str = \"all\"\n    \"\"\"\n    Selection string for which part of the system to write coordinates for.\n    For now, must be \"all\".\n    \"\"\"\n\n    equil_nvt_structure: str | None = \"equil_nvt_structure.pdb\"\n    \"\"\"\n    Name of the PDB file containing the system after NVT pre-equilibration.\n    Only the atom subset specified by output_indices is saved.\n    Default 'equil_nvt_structure.pdb'.\n    \"\"\"\n\n    equil_npt_structure: str | None = \"equil_npt_structure.pdb\"\n    \"\"\"\n    Name of the PDB file containing the system after NPT pre-equilibration.\n    Only the atom subset specified by output_indices is saved.\n    Default 'equil_npt_structure.pdb'.\n    \"\"\"\n\n    production_trajectory_filename: str | None = \"production_equil.xtc\"\n    \"\"\"\n    Name pre-equilibration \"production\" (i.e. extended NPT) trajectory file.\n    Only the atom subset specified by output_indices is saved.\n    Default `production_equil.xtc`.\n    \"\"\"\n\n    log_output: str | None = \"production_equil_simulation.log\"\n    \"\"\"\n    Filename for writing the pre-equilibration extended NPT MD simulation\n    log file. This includes ns/day, timesteps, energies, density, etc.\n    Default 'production_equil_simulation.log'\n    \"\"\"\n\n    @field_validator(\"output_indices\")\n    def must_be_all(cls, v):\n        # Would be better if this was just changed to a Literal\n        # but changing types in child classes in pydantic is messy\n        if v != \"all\":\n            msg = \"output_indices must be all for ABFE pre-equilibration simulations\"\n            raise ValueError(msg)\n        return v\n\n\n# This subclasses from SettingsBaseModel as it has vacuum_forcefield and\n# solvent_forcefield fields, not just a single forcefield_settings field\nclass AbsoluteSolvationSettings(SettingsBaseModel):\n    \"\"\"\n    Configuration object for ``AbsoluteSolvationProtocol``.\n\n    See Also\n    --------\n    openfe.protocols.openmm_afe.AbsoluteSolvationProtocol\n    \"\"\"\n\n    protocol_repeats: int\n    \"\"\"\n    The number of completely independent repeats of the entire sampling\n    process. The mean of the repeats defines the final estimate of FE\n    difference, while the variance between repeats is used as the uncertainty.\n    \"\"\"\n\n    @field_validator(\"protocol_repeats\")\n    def must_be_positive(cls, v):\n        if v <= 0:\n            errmsg = f\"protocol_repeats must be a positive value, got {v}.\"\n            raise ValueError(errmsg)\n        return v\n\n    # Inherited things\n    solvent_forcefield_settings: OpenMMSystemGeneratorFFSettings\n    vacuum_forcefield_settings: OpenMMSystemGeneratorFFSettings\n    \"\"\"Parameters to set up the force field with OpenMM Force Fields\"\"\"\n    thermo_settings: ThermoSettings\n    \"\"\"Settings for thermodynamic parameters\"\"\"\n\n    solvation_settings: OpenMMSolvationSettings\n    \"\"\"Settings for solvating the system.\"\"\"\n\n    # Alchemical settings\n    alchemical_settings: AlchemicalSettings\n    \"\"\"\n    Alchemical protocol settings.\n    \"\"\"\n    lambda_settings: LambdaSettings\n    \"\"\"\n    Settings for controlling the lambda schedule for the different components\n    (vdw, elec, restraints).\n    \"\"\"\n\n    # MD Engine things\n    vacuum_engine_settings: OpenMMEngineSettings\n    \"\"\"\n    Settings specific to the OpenMM engine, such as the compute platform\n    for the vacuum transformation.\n    \"\"\"\n    solvent_engine_settings: OpenMMEngineSettings\n    \"\"\"\n    Settings specific to the OpenMM engine, such as the compute platform\n    for the solvent transformation.\n    \"\"\"\n\n    # Sampling State defining things\n    integrator_settings: IntegratorSettings\n    \"\"\"\n    Settings for controlling the integrator, such as the timestep and\n    barostat settings.\n    \"\"\"\n\n    # Simulation run settings\n    vacuum_equil_simulation_settings: MDSimulationSettings\n    \"\"\"\n    Pre-alchemical vacuum simulation control settings.\n\n    Notes\n    -----\n    The `NVT` equilibration should be set to 0 * unit.nanosecond\n    as it will not be run.\n    \"\"\"\n    vacuum_simulation_settings: MultiStateSimulationSettings\n    \"\"\"\n    Simulation control settings, including simulation lengths\n    for the vacuum transformation.\n    \"\"\"\n    solvent_equil_simulation_settings: MDSimulationSettings\n    \"\"\"\n    Pre-alchemical solvent simulation control settings.\n    \"\"\"\n    solvent_simulation_settings: MultiStateSimulationSettings\n    \"\"\"\n    Simulation control settings, including simulation lengths\n    for the solvent transformation.\n    \"\"\"\n    vacuum_equil_output_settings: MDOutputSettings\n    \"\"\"\n    Simulation output settings for the vacuum non-alchemical equilibration.\n    \"\"\"\n    vacuum_output_settings: MultiStateOutputSettings\n    \"\"\"\n    Simulation output settings for the vacuum transformation.\n    \"\"\"\n    solvent_equil_output_settings: MDOutputSettings\n    \"\"\"\n    Simulation output settings for the solvent non-alchemical equilibration.\n    \"\"\"\n    solvent_output_settings: MultiStateOutputSettings\n    \"\"\"\n    Simulation output settings for the solvent transformation.\n    \"\"\"\n    partial_charge_settings: OpenFFPartialChargeSettings\n    \"\"\"\n    Settings for controlling how to assign partial charges,\n    including the partial charge assignment method, and the\n    number of conformers used to generate the partial charges.\n    \"\"\"\n\n\nclass AbsoluteBindingSettings(SettingsBaseModel):\n    \"\"\"\n    Configuration object for ``AbsoluteBindingPProtocol``\n\n    See Also\n    --------\n    openfe.protocols.openmm_afe.AbsoluteBindingProtocol\n    \"\"\"\n\n    protocol_repeats: int\n    \"\"\"\n    The number of completely independent repeats of the entire sampling\n    process. The mean of the repeats defines the final estimate of FE\n    difference, while the variance between repeats is used as the uncertainty.\n    \"\"\"\n\n    @field_validator(\"protocol_repeats\")\n    def must_be_positive(cls, v):\n        if v <= 0:\n            errmsg = f\"protocol_repeats must be a positive value, got {v}.\"\n            raise ValueError(errmsg)\n        return v\n\n    forcefield_settings: OpenMMSystemGeneratorFFSettings\n    \"\"\"Parameters to set up the force field with OpenMM Force Fields\"\"\"\n    thermo_settings: ThermoSettings\n    \"\"\"Settings for thermodynamic parameters\"\"\"\n\n    solvent_solvation_settings: OpenMMSolvationSettings\n    \"\"\"Settings for solvating the system in the solvent.\"\"\"\n    complex_solvation_settings: OpenMMSolvationSettings\n    \"\"\"Settings for solvating the system in the complex.\"\"\"\n\n    # Alchemical settings\n    alchemical_settings: AlchemicalSettings\n    \"\"\"\n    Alchemical protocol settings.\n    \"\"\"\n    complex_lambda_settings: LambdaSettings\n    \"\"\"\n    Settings for controlling the complex transformation leg\n    lambda schedule for the different components (vdw, elec, restraints).\n    \"\"\"\n    solvent_lambda_settings: LambdaSettings\n    \"\"\"\n    Settings for controlling the solvent transformation leg\n    lambda schedule for the different components (vdw, elec, restraints).\n\n    Notes\n    -----\n    * The `restraints` entry of the lambda settings will be ignored in the\n      solvent leg.\n    \"\"\"\n\n    # MD Engine things\n    engine_settings: OpenMMEngineSettings\n    \"\"\"\n    Settings specific to the OpenMM engine, such as the compute platform.\n    \"\"\"\n\n    # Sampling State defining things\n    solvent_integrator_settings: IntegratorSettings\n    \"\"\"\n    Settings for controlling the integrator, such as the timestep and\n    barostat settings in the solvent.\n    \"\"\"\n    complex_integrator_settings: IntegratorSettings\n    \"\"\"\n    Settings for controlling the integrator, such as the timestep and\n    barostat settings in the complex.\n    \"\"\"\n\n    # Simulation run settings\n    complex_equil_simulation_settings: MDSimulationSettings\n    \"\"\"\n    Pre-alchemical complex simulation control settings.\n    \"\"\"\n    complex_simulation_settings: MultiStateSimulationSettings\n    \"\"\"\n    Simulation control settings, including simulation lengths\n    for the complex transformation.\n    \"\"\"\n    solvent_equil_simulation_settings: MDSimulationSettings\n    \"\"\"\n    Pre-alchemical solvent simulation control settings.\n    \"\"\"\n    solvent_simulation_settings: MultiStateSimulationSettings\n    \"\"\"\n    Simulation control settings, including simulation lengths\n    for the solvent transformation.\n    \"\"\"\n\n    # Simulation output settings\n    complex_equil_output_settings: ABFEPreEquilOutputSettings\n    \"\"\"\n    Simulation output settings for the complex non-alchemical equilibration.\n    \"\"\"\n    complex_output_settings: MultiStateOutputSettings\n    \"\"\"\n    Simulation output settings for the complex transformation.\n    \"\"\"\n    solvent_equil_output_settings: ABFEPreEquilOutputSettings\n    \"\"\"\n    Simulation output settings for the solvent non-alchemical equilibration.\n    \"\"\"\n    solvent_output_settings: MultiStateOutputSettings\n    \"\"\"\n    Simulation output settings for the solvent transformation.\n    \"\"\"\n    partial_charge_settings: OpenFFPartialChargeSettings\n    \"\"\"\n    Settings for controlling how to assign partial charges,\n    including the partial charge assignment method, and the\n    number of conformers used to generate the partial charges.\n    \"\"\"\n    restraint_settings: BaseRestraintSettings\n    \"\"\"\n    Settings controlling how restraints are added to the system in the\n    complex simulation.\n    \"\"\"\n"
  },
  {
    "path": "src/openfe/protocols/openmm_afe/equil_binding_afe_method.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\n\"\"\"OpenMM Equilibrium Binding AFE Protocol --- :mod:`openfe.protocols.openmm_afe.equil_binding_afe_method`\n==========================================================================================================\n\nThis module implements the necessary methodology tooling to calculate an\nabsolute binding free energy using OpenMM tools and one of the following\nalchemical sampling methods:\n\n* Hamiltonian Replica Exchange\n* Self-adjusted mixture sampling\n* Independent window sampling\n\nCurrent limitations\n-------------------\n* Alchemical species with a net charge are not currently supported.\n* Disappearing molecules are only allowed in state A.\n* Only small molecules are allowed to act as alchemical molecules.\n\nAcknowledgements\n----------------\n* This Protocol re-implements components from\n  `Yank <https://github.com/choderalab/yank>`_.\n\n\"\"\"\n\nimport logging\nimport uuid\nimport warnings\nfrom collections import defaultdict\nfrom typing import Any, Iterable\n\nimport gufe\nfrom gufe import (\n    ChemicalSystem,\n    ProteinComponent,\n    ProteinMembraneComponent,\n    SmallMoleculeComponent,\n    SolventComponent,\n    settings,\n)\nfrom openff.units import unit as offunit\n\nfrom openfe.due import Doi, due\nfrom openfe.protocols.openmm_afe.equil_afe_settings import (\n    ABFEPreEquilOutputSettings,\n    AbsoluteBindingSettings,\n    AlchemicalSettings,\n    BoreschRestraintSettings,\n    IntegratorSettings,\n    LambdaSettings,\n    MDSimulationSettings,\n    MultiStateOutputSettings,\n    MultiStateSimulationSettings,\n    OpenFFPartialChargeSettings,\n    OpenMMEngineSettings,\n    OpenMMSolvationSettings,\n)\nfrom openfe.protocols.openmm_utils import (\n    settings_validation,\n    system_validation,\n)\n\nfrom .abfe_units import (\n    ABFEComplexAnalysisUnit,\n    ABFEComplexSetupUnit,\n    ABFEComplexSimUnit,\n    ABFESolventAnalysisUnit,\n    ABFESolventSetupUnit,\n    ABFESolventSimUnit,\n)\nfrom .afe_protocol_results import AbsoluteBindingProtocolResult\n\ndue.cite(\n    Doi(\"10.5281/zenodo.596504\"),\n    description=\"Yank\",\n    path=\"openfe.protocols.openmm_afe.equil_binding_afe_method\",\n    cite_module=True,\n)\n\ndue.cite(\n    Doi(\"10.5281/zenodo.596622\"),\n    description=\"OpenMMTools\",\n    path=\"openfe.protocols.openmm_afe.equil_binding_afe_method\",\n    cite_module=True,\n)\n\ndue.cite(\n    Doi(\"10.1371/journal.pcbi.1005659\"),\n    description=\"OpenMM\",\n    path=\"openfe.protocols.openmm_afe.equil_binding_afe_method\",\n    cite_module=True,\n)\n\n\nlogger = logging.getLogger(__name__)\n\n\nclass AbsoluteBindingProtocol(gufe.Protocol):\n    \"\"\"\n    Absolute binding free energy calculations using OpenMM and OpenMMTools.\n\n    See Also\n    --------\n    :mod:`openfe.protocols`\n    :class:`openfe.protocols.openmm_afe.AbsoluteBindingSettings`\n    :class:`openfe.protocols.openmm_afe.AbsoluteBindingProtocolResult`\n    :class:`openfe.protocols.openmm_afe.AbsoluteBindingSolventUnit`\n    :class:`openfe.protocols.openmm_afe.AbsoluteBindingComplexUnit`\n    \"\"\"\n\n    result_cls = AbsoluteBindingProtocolResult\n    _settings_cls = AbsoluteBindingSettings\n    _settings: AbsoluteBindingSettings\n\n    @classmethod\n    def _default_settings(cls):\n        \"\"\"A dictionary of initial settings for this creating this Protocol\n\n        These settings are intended as a suitable starting point for creating\n        an instance of this protocol.  It is recommended, however that care is\n        taken to inspect and customize these before performing a Protocol.\n\n        Returns\n        -------\n        Settings\n          a set of default settings\n        \"\"\"\n        # fmt: off\n        return AbsoluteBindingSettings(\n            protocol_repeats=3,\n            forcefield_settings=settings.OpenMMSystemGeneratorFFSettings(),\n            thermo_settings=settings.ThermoSettings(\n                temperature=298.15 * offunit.kelvin,\n                pressure=1 * offunit.bar,\n            ),\n            alchemical_settings=AlchemicalSettings(),\n            solvent_lambda_settings=LambdaSettings(\n                lambda_elec=[\n                    0.0, 0.25, 0.5, 0.75, 1.0,\n                    1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,\n                ],\n                lambda_vdw=[\n                    0.0, 0.0, 0.0, 0.0, 0.0,\n                    0.12, 0.24, 0.36, 0.48, 0.6, 0.7, 0.77, 0.85, 1.0\n                ],\n                lambda_restraints=[\n                    0.0, 0.0, 0.0, 0.0, 0.0,\n                    0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0\n                ],\n            ),\n            complex_lambda_settings=LambdaSettings(\n                lambda_elec=[\n                    0.0, 0.0, 0.0, 0.0, 0.0, 0.0,\n                    0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0,\n                    1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.00, 1.0, 1.00, 1.0, 1.00, 1.0, 1.00, 1.0\n                ],\n                lambda_vdw=[\n                    0.0, 0.0, 0.0, 0.0, 0.0, 0.0,\n                    0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,\n                    0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.65, 0.7, 0.75, 0.8, 0.85, 0.9, 0.95, 1.0\n                ],\n                lambda_restraints=[\n                    0.0, 0.2, 0.4, 0.6, 0.8, 1.0,\n                    1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,\n                    1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.00, 1.0, 1.00, 1.0, 1.00, 1.0, 1.00, 1.0\n                ],\n            ),\n            partial_charge_settings=OpenFFPartialChargeSettings(),\n            complex_solvation_settings=OpenMMSolvationSettings(\n                solvent_padding=1.0 * offunit.nanometer,\n            ),\n            solvent_solvation_settings=OpenMMSolvationSettings(),\n            engine_settings=OpenMMEngineSettings(),\n            solvent_integrator_settings=IntegratorSettings(),\n            complex_integrator_settings=IntegratorSettings(),\n            restraint_settings=BoreschRestraintSettings(),\n            solvent_equil_simulation_settings=MDSimulationSettings(\n                equilibration_length_nvt=0.1 * offunit.nanosecond,\n                equilibration_length=0.2 * offunit.nanosecond,\n                production_length=0.5 * offunit.nanosecond,\n            ),\n            solvent_equil_output_settings=ABFEPreEquilOutputSettings(),\n            solvent_simulation_settings=MultiStateSimulationSettings(\n                n_replicas=14,\n                equilibration_length=1.0 * offunit.nanosecond,\n                production_length=10.0 * offunit.nanosecond,\n            ),\n            solvent_output_settings=MultiStateOutputSettings(\n                output_structure=\"alchemical_system.pdb\",\n                output_filename=\"solvent.nc\",\n                checkpoint_storage_filename=\"solvent_checkpoint.nc\",\n            ),\n            complex_equil_simulation_settings=MDSimulationSettings(\n                equilibration_length_nvt=0.25 * offunit.nanosecond,\n                equilibration_length=0.5 * offunit.nanosecond,\n                production_length=5.0 * offunit.nanosecond,\n            ),\n            complex_equil_output_settings=ABFEPreEquilOutputSettings(),\n            complex_simulation_settings=MultiStateSimulationSettings(\n                n_replicas=30,\n                equilibration_length=1 * offunit.nanosecond,\n                production_length=10.0 * offunit.nanosecond,\n            ),\n            complex_output_settings=MultiStateOutputSettings(\n                output_structure=\"alchemical_system.pdb\",\n                output_filename=\"complex.nc\",\n                checkpoint_storage_filename=\"complex_checkpoint.nc\",\n            ),\n        )\n        # fmt: on\n\n    @classmethod\n    def _adaptive_settings(\n        cls,\n        stateA: ChemicalSystem,\n        stateB: ChemicalSystem,\n        initial_settings: None | AbsoluteBindingSettings = None,\n    ) -> AbsoluteBindingSettings:\n        \"\"\"\n        Get the recommended OpenFE settings for this Protocol based on the input states involved in the\n        transformation.\n\n        These are intended as a suitable starting point, which can be further\n        customized before creating a Protocol.\n\n        Parameters\n        ----------\n        stateA : ChemicalSystem\n            The initial state of the transformation.\n        stateB : ChemicalSystem\n            The final state of the transformation.\n        initial_settings : None | AbsoluteBindingSettings, optional\n            Initial settings to adapt. If None, default settings are used.\n\n        Returns\n        -------\n        AbsoluteBindingSettings\n            The recommended settings for this protocol based on the input states.\n        \"\"\"\n        # use initial settings or default settings\n        if initial_settings is not None:\n            protocol_settings = initial_settings.model_copy(deep=True)\n        else:\n            protocol_settings = cls.default_settings()\n\n        # adapt the barostat based on the ProteinComponent\n        if stateA.contains(ProteinMembraneComponent):\n            protocol_settings.complex_integrator_settings.barostat = \"MonteCarloMembraneBarostat\"\n\n        return protocol_settings\n\n    @staticmethod\n    def _validate_endstates(\n        stateA: ChemicalSystem,\n        stateB: ChemicalSystem,\n    ) -> None:\n        \"\"\"\n        A binding transformation is defined (in terms of gufe components)\n        as starting from one or more ligands with one protein and solvent,\n        that then ends up in a state with one less ligand.\n\n        Parameters\n        ----------\n        stateA : ChemicalSystem\n          The chemical system of end state A\n        stateB : ChemicalSystem\n          The chemical system of end state B\n\n        Raises\n        ------\n        ValueError\n          If stateA & stateB do not contain a ProteinComponent.\n          If stateA & stateB do not contain a SolventComponent.\n          If stateA has more than one unique Component.\n          If the stateA unique Component is not a SmallMoleculeComponent.\n          If stateB contains any unique Components.\n          If the alchemical species is charged.\n        \"\"\"\n        if not (stateA.contains(ProteinComponent) and stateB.contains(ProteinComponent)):\n            errmsg = \"No ProteinComponent found\"\n            raise ValueError(errmsg)\n\n        if not (stateA.contains(SolventComponent) and stateB.contains(SolventComponent)):\n            errmsg = \"No SolventComponent found\"\n            raise ValueError(errmsg)\n\n        # Needs gufe 1.3\n        diff = stateA.component_diff(stateB)\n        if len(diff[0]) != 1:\n            errmsg = (\n                \"Only one alchemical species is supported. \"\n                f\"Number of unique components found in stateA: {len(diff[0])}.\"\n            )\n            raise ValueError(errmsg)\n\n        if not isinstance(diff[0][0], SmallMoleculeComponent):\n            errmsg = (\n                \"Only disappearing small molecule components \"\n                \"are supported by this protocol. \"\n                f\"Found a {type(diff[0][0])}\"\n            )\n            raise ValueError(errmsg)\n\n        # Check that the state A unique isn't charged\n        if diff[0][0].total_charge != 0:\n            errmsg = (\n                \"Charged alchemical molecules are not currently \"\n                \"supported for solvation free energies. \"\n                f\"Molecule total charge: {diff[0][0].total_charge}.\"\n            )\n            raise ValueError(errmsg)\n\n        # If there are any alchemical Components in state B\n        if len(diff[1]) > 0:\n            errmsg = \"Components appearing in state B are not currently supported\"\n            raise ValueError(errmsg)\n\n    @staticmethod\n    def _validate_lambda_schedule(\n        lambda_settings: LambdaSettings,\n        simulation_settings: MultiStateSimulationSettings,\n    ) -> None:\n        \"\"\"\n        Checks that the lambda schedule is set up correctly.\n\n        Parameters\n        ----------\n        lambda_settings : LambdaSettings\n          the lambda schedule Settings\n        simulation_settings : MultiStateSimulationSettings\n          the settings for either the complex or solvent phase\n\n        Raises\n        ------\n        ValueError\n          If the number of lambda windows differs for electrostatics, sterics,\n          and restraints.\n          If the number of replicas does not match the number of lambda windows.\n          If there are states with naked charges.\n        \"\"\"\n\n        lambda_elec = lambda_settings.lambda_elec\n        lambda_vdw = lambda_settings.lambda_vdw\n        lambda_restraints = lambda_settings.lambda_restraints\n        n_replicas = simulation_settings.n_replicas\n\n        # Ensure that all lambda components have equal amount of windows\n        lambda_components = [lambda_vdw, lambda_elec, lambda_restraints]\n        it = iter(lambda_components)\n        the_len = len(next(it))\n        if not all(len(lambda_comp) == the_len for lambda_comp in it):\n            errmsg = (\n                \"Components elec, vdw, and restraints must have equal amount\"\n                f\" of lambda windows. Got {len(lambda_elec)} elec lambda\"\n                f\" windows, {len(lambda_vdw)} vdw lambda windows, and\"\n                f\"{len(lambda_restraints)} restraints lambda windows.\"\n            )\n            raise ValueError(errmsg)\n\n        # Ensure that number of overall lambda windows matches number of lambda\n        # windows for individual components\n        if n_replicas != len(lambda_vdw):\n            errmsg = (\n                f\"Number of replicas {n_replicas} does not equal the\"\n                f\" number of lambda windows {len(lambda_vdw)}\"\n            )\n            raise ValueError(errmsg)\n\n        # Check if there are no lambda windows with naked charges\n        for inx, lam in enumerate(lambda_elec):\n            if lam < 1 and lambda_vdw[inx] == 1:\n                errmsg = (\n                    \"There are states along this lambda schedule \"\n                    \"where there are atoms with charges but no LJ \"\n                    f\"interactions: lambda {inx}: \"\n                    f\"elec {lam} vdW {lambda_vdw[inx]}\"\n                )\n                raise ValueError(errmsg)\n\n    def _validate(\n        self,\n        *,\n        stateA: ChemicalSystem,\n        stateB: ChemicalSystem,\n        mapping: gufe.ComponentMapping | list[gufe.ComponentMapping] | None = None,\n        extends: gufe.ProtocolDAGResult | None = None,\n    ):\n        # Check we're not extending\n        if extends is not None:\n            # This technically should be NotImplementedError\n            # but gufe.Protocol.validate calls `_validate` wrapped around an\n            # except for NotImplementedError, so we can't raise it here\n            raise ValueError(\"Can't extend simulations yet\")\n\n        # Check we're not using a mapping, since we're not doing anything with it\n        if mapping is not None:\n            wmsg = \"A mapping was passed but is not used by this Protocol.\"\n            warnings.warn(wmsg)\n\n        # Validate the end states & alchemical components\n        system_validation.validate_chemical_system(stateA)\n        system_validation.validate_chemical_system(stateB)\n        self._validate_endstates(stateA, stateB)\n\n        # Validate the complex lambda schedule\n        self._validate_lambda_schedule(\n            self.settings.complex_lambda_settings,\n            self.settings.complex_simulation_settings,\n        )\n\n        # If the complex restraints schedule is all zero, it might be bad\n        # but we don't disallow it.\n        if all([i == 0.0 for i in self.settings.complex_lambda_settings.lambda_restraints]):\n            wmsg = (\n                \"No restraints are being applied in the complex phase, \"\n                \"this will likely lead to problematic results.\"\n            )\n            warnings.warn(wmsg)\n\n        # Validate the solvent lambda schedule\n        self._validate_lambda_schedule(\n            self.settings.solvent_lambda_settings,\n            self.settings.solvent_simulation_settings,\n        )\n\n        # If the solvent restraints schedule is not all one, it was likely\n        # copied from the complex schedule. In this case we just ignore\n        # the values and let the user know.\n        # P.S. we don't need to change the settings at this point\n        # the list gets popped out later in the SolventUnit, because we\n        # don't have a restraint parameter state.\n\n        if any([i != 0.0 for i in self.settings.solvent_lambda_settings.lambda_restraints]):\n            wmsg = (\n                \"There is an attempt to add restraints in the solvent \"\n                \"phase. This protocol does not apply restraints in the \"\n                \"solvent phase. These restraint lambda values will be ignored.\"\n            )\n            warnings.warn(wmsg)\n\n        # Check nonbond & solvent compatibility\n        nonbonded_method = self.settings.forcefield_settings.nonbonded_method\n        # Use the more complete system validation solvent checks\n        system_validation.validate_solvent(stateA, nonbonded_method)\n\n        # Validate the barostat used in combination with the protein component\n        system_validation.validate_barostat(\n            stateA, self.settings.complex_integrator_settings.barostat\n        )\n\n        # Validate solvation settings\n        settings_validation.validate_openmm_solvation_settings(\n            self.settings.solvent_solvation_settings\n        )\n        settings_validation.validate_openmm_solvation_settings(\n            self.settings.complex_solvation_settings\n        )\n\n        # Validate integrator things\n        # We validate the timstep for both the complex & solvent settings\n        settings_validation.validate_timestep(\n            self.settings.forcefield_settings.hydrogen_mass,\n            self.settings.complex_integrator_settings.timestep,\n        )\n\n        settings_validation.validate_timestep(\n            self.settings.forcefield_settings.hydrogen_mass,\n            self.settings.solvent_integrator_settings.timestep,\n        )\n\n    def _create(\n        self,\n        stateA: ChemicalSystem,\n        stateB: ChemicalSystem,\n        mapping: gufe.ComponentMapping | list[gufe.ComponentMapping] | None = None,\n        extends: gufe.ProtocolDAGResult | None = None,\n    ) -> list[gufe.ProtocolUnit]:\n        # Validate inputs\n        self.validate(stateA=stateA, stateB=stateB, mapping=mapping, extends=extends)\n\n        # Get the alchemical components\n        alchem_comps = system_validation.get_alchemical_components(\n            stateA,\n            stateB,\n        )\n\n        # Get the name of the alchemical species\n        alchname = alchem_comps[\"stateA\"][0].name\n        unit_classes: dict[str, dict[str, type[gufe.ProtocolUnit]]] = {\n            \"solvent\": {\n                \"setup\": ABFESolventSetupUnit,\n                \"simulation\": ABFESolventSimUnit,\n                \"analysis\": ABFESolventAnalysisUnit,\n            },\n            \"complex\": {\n                \"setup\": ABFEComplexSetupUnit,\n                \"simulation\": ABFEComplexSimUnit,\n                \"analysis\": ABFEComplexAnalysisUnit,\n            },\n        }\n\n        protocol_units: dict[str, list[gufe.ProtocolUnit]] = {\"solvent\": [], \"complex\": []}\n\n        for phase in [\"solvent\", \"complex\"]:\n            for i in range(self.settings.protocol_repeats):\n                repeat_id = int(uuid.uuid4())\n\n                setup = unit_classes[phase][\"setup\"](\n                    protocol=self,\n                    stateA=stateA,\n                    stateB=stateB,\n                    alchemical_components=alchem_comps,\n                    generation=0,\n                    repeat_id=repeat_id,\n                    name=f\"ABFE Setup: {alchname} {phase} leg: repeat {i} generation 0\",\n                )\n\n                simulation = unit_classes[phase][\"simulation\"](\n                    protocol=self,\n                    # only need state A & alchem comps\n                    stateA=stateA,\n                    alchemical_components=alchem_comps,\n                    setup_results=setup,\n                    generation=0,\n                    repeat_id=repeat_id,\n                    name=f\"ABFE Simulation: {alchname} {phase} leg: repeat {i} generation 0\",\n                )\n\n                analysis = unit_classes[phase][\"analysis\"](\n                    protocol=self,\n                    setup_results=setup,\n                    simulation_results=simulation,\n                    generation=0,\n                    repeat_id=repeat_id,\n                    name=f\"ABFE Analysis: {alchname} {phase} leg, repeat {i} generation 0\",\n                )\n\n                protocol_units[phase] += [setup, simulation, analysis]\n\n        return protocol_units[\"solvent\"] + protocol_units[\"complex\"]\n\n    def _gather(\n        self, protocol_dag_results: Iterable[gufe.ProtocolDAGResult]\n    ) -> dict[str, dict[str, Any]]:\n        # result units will have a repeat_id and generation\n        # first group according to repeat_id\n        unsorted_solvent_repeats = defaultdict(list)\n        unsorted_complex_repeats = defaultdict(list)\n        for d in protocol_dag_results:\n            pu: gufe.ProtocolUnitResult\n            for pu in d.protocol_unit_results:\n                if (\"Analysis\" not in pu.name) or (not pu.ok()):\n                    continue\n                if pu.outputs[\"simtype\"] == \"solvent\":\n                    unsorted_solvent_repeats[pu.outputs[\"repeat_id\"]].append(pu)\n                else:\n                    unsorted_complex_repeats[pu.outputs[\"repeat_id\"]].append(pu)\n\n        repeats: dict[str, dict[str, list[gufe.ProtocolUnitResult]]] = {\n            \"solvent\": {},\n            \"complex\": {},\n        }\n        for k, v in unsorted_solvent_repeats.items():\n            repeats[\"solvent\"][str(k)] = sorted(v, key=lambda x: x.outputs[\"generation\"])\n\n        for k, v in unsorted_complex_repeats.items():\n            repeats[\"complex\"][str(k)] = sorted(v, key=lambda x: x.outputs[\"generation\"])\n        return repeats\n"
  },
  {
    "path": "src/openfe/protocols/openmm_afe/equil_solvation_afe_method.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\n\"\"\"OpenMM Equilibrium Solvation AFE Protocol --- :mod:`openfe.protocols.openmm_afe.equil_solvation_afe_method`\n===============================================================================================================\n\nThis module implements the necessary methodology tooling to run calculate an\nabsolute solvation free energy using OpenMM tools and one of the following\nalchemical sampling methods:\n\n* Hamiltonian Replica Exchange\n* Self-adjusted mixture sampling\n* Independent window sampling\n\nCurrent limitations\n-------------------\n* Alchemical species with a net charge are not currently supported.\n* Disappearing molecules are only allowed in state A. Support for\n  appearing molecules will be added in due course.\n* Only small molecules are allowed to act as alchemical molecules.\n  Alchemically changing protein or solvent components would induce\n  perturbations which are too large to be handled by this Protocol.\n\n\nAcknowledgements\n----------------\n* Originally based on hydration.py in\n  `espaloma_charge <https://github.com/choderalab/espaloma_charge>`_\n\n\"\"\"\n\nimport logging\nimport uuid\nimport warnings\nfrom collections import defaultdict\nfrom typing import Any, Iterable, Optional, Union\n\nimport gufe\nimport numpy as np\nfrom gufe import (\n    ChemicalSystem,\n    ProteinComponent,\n    SmallMoleculeComponent,\n    SolventComponent,\n    settings,\n)\nfrom openff.units import unit as offunit\n\nfrom openfe.due import Doi, due\nfrom openfe.protocols.openmm_afe.equil_afe_settings import (\n    AbsoluteSolvationSettings,\n    AlchemicalSettings,\n    IntegratorSettings,\n    LambdaSettings,\n    MDOutputSettings,\n    MDSimulationSettings,\n    MultiStateOutputSettings,\n    MultiStateSimulationSettings,\n    OpenFFPartialChargeSettings,\n    OpenMMEngineSettings,\n    OpenMMSolvationSettings,\n)\n\nfrom ..openmm_utils import settings_validation, system_validation\nfrom .afe_protocol_results import AbsoluteSolvationProtocolResult\nfrom .ahfe_units import (\n    AHFESolventAnalysisUnit,\n    AHFESolventSetupUnit,\n    AHFESolventSimUnit,\n    AHFEVacuumAnalysisUnit,\n    AHFEVacuumSetupUnit,\n    AHFEVacuumSimUnit,\n)\n\ndue.cite(\n    Doi(\"10.5281/zenodo.596504\"),\n    description=\"Yank\",\n    path=\"openfe.protocols.openmm_afe.equil_solvation_afe_method\",\n    cite_module=True,\n)\n\ndue.cite(\n    Doi(\"10.48550/ARXIV.2302.06758\"),\n    description=\"EspalomaCharge\",\n    path=\"openfe.protocols.openmm_afe.equil_solvation_afe_method\",\n    cite_module=True,\n)\n\ndue.cite(\n    Doi(\"10.5281/zenodo.596622\"),\n    description=\"OpenMMTools\",\n    path=\"openfe.protocols.openmm_afe.equil_solvation_afe_method\",\n    cite_module=True,\n)\n\ndue.cite(\n    Doi(\"10.1371/journal.pcbi.1005659\"),\n    description=\"OpenMM\",\n    path=\"openfe.protocols.openmm_afe.equil_solvation_afe_method\",\n    cite_module=True,\n)\n\n\nlogger = logging.getLogger(__name__)\n\n\nclass AbsoluteSolvationProtocol(gufe.Protocol):\n    \"\"\"\n    Absolute solvation free energy calculations using OpenMM and OpenMMTools.\n\n    See Also\n    --------\n    :mod:`openfe.protocols`\n    :class:`openfe.protocols.openmm_afe.AbsoluteSolvationSettings`\n    :class:`openfe.protocols.openmm_afe.AbsoluteSolvationProtocolResult`\n    :class:`openfe.protocols.openmm_afe.AbsoluteSolvationVacuumUnit`\n    :class:`openfe.protocols.openmm_afe.AbsoluteSolvationSolventUnit`\n    \"\"\"\n\n    result_cls = AbsoluteSolvationProtocolResult\n    _settings_cls = AbsoluteSolvationSettings\n    _settings: AbsoluteSolvationSettings\n\n    @classmethod\n    def _default_settings(cls):\n        \"\"\"A dictionary of initial settings for this creating this Protocol\n\n        These settings are intended as a suitable starting point for creating\n        an instance of this protocol.  It is recommended, however that care is\n        taken to inspect and customize these before performing a Protocol.\n\n        Returns\n        -------\n        Settings\n          a set of default settings\n        \"\"\"\n        return AbsoluteSolvationSettings(\n            protocol_repeats=3,\n            solvent_forcefield_settings=settings.OpenMMSystemGeneratorFFSettings(),\n            vacuum_forcefield_settings=settings.OpenMMSystemGeneratorFFSettings(\n                nonbonded_method=\"nocutoff\",\n            ),\n            thermo_settings=settings.ThermoSettings(\n                temperature=298.15 * offunit.kelvin,\n                pressure=1 * offunit.bar,\n            ),\n            alchemical_settings=AlchemicalSettings(),\n            lambda_settings=LambdaSettings(\n                lambda_elec=[\n                    0.0, 0.25, 0.5, 0.75, 1.0, 1.0, 1.0,\n                    1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0],\n                lambda_vdw=[\n                    0.0, 0.0, 0.0, 0.0, 0.0, 0.12, 0.24,\n                    0.36, 0.48, 0.6, 0.7, 0.77, 0.85, 1.0],\n                lambda_restraints=[\n                    0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,\n                    0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],\n            ),\n            partial_charge_settings=OpenFFPartialChargeSettings(),\n            solvation_settings=OpenMMSolvationSettings(),\n            vacuum_engine_settings=OpenMMEngineSettings(),\n            solvent_engine_settings=OpenMMEngineSettings(),\n            integrator_settings=IntegratorSettings(),\n            solvent_equil_simulation_settings=MDSimulationSettings(\n                equilibration_length_nvt=0.1 * offunit.nanosecond,\n                equilibration_length=0.2 * offunit.nanosecond,\n                production_length=0.5 * offunit.nanosecond,\n            ),\n            solvent_equil_output_settings=MDOutputSettings(\n                equil_nvt_structure=\"equil_nvt_structure.pdb\",\n                equil_npt_structure=\"equil_npt_structure.pdb\",\n                production_trajectory_filename=\"production_equil.xtc\",\n                log_output=\"equil_simulation.log\",\n            ),\n            solvent_simulation_settings=MultiStateSimulationSettings(\n                n_replicas=14,\n                equilibration_length=1.0 * offunit.nanosecond,\n                production_length=10.0 * offunit.nanosecond,\n            ),\n            solvent_output_settings=MultiStateOutputSettings(\n                output_filename=\"solvent.nc\",\n                checkpoint_storage_filename=\"solvent_checkpoint.nc\",\n            ),\n            vacuum_equil_simulation_settings=MDSimulationSettings(\n                equilibration_length_nvt=None,\n                equilibration_length=0.2 * offunit.nanosecond,\n                production_length=0.5 * offunit.nanosecond,\n            ),\n            vacuum_equil_output_settings=MDOutputSettings(\n                equil_nvt_structure=None,\n                equil_npt_structure=\"equil_structure.pdb\",\n                production_trajectory_filename=\"production_equil.xtc\",\n                log_output=\"equil_simulation.log\",\n            ),\n            vacuum_simulation_settings=MultiStateSimulationSettings(\n                n_replicas=14,\n                equilibration_length=0.5 * offunit.nanosecond,\n                production_length=2.0 * offunit.nanosecond,\n            ),\n            vacuum_output_settings=MultiStateOutputSettings(\n                output_filename=\"vacuum.nc\",\n                checkpoint_storage_filename=\"vacuum_checkpoint.nc\",\n            ),\n        )  # fmt: skip\n\n    @staticmethod\n    def _validate_endstates(\n        stateA: ChemicalSystem,\n        stateB: ChemicalSystem,\n    ) -> None:\n        \"\"\"\n        A solvent transformation is defined (in terms of gufe components)\n        as starting from one or more ligands in solvent and\n        ending up in a state with one less ligand.\n\n        No protein components are allowed.\n\n        Parameters\n        ----------\n        stateA : ChemicalSystem\n          The chemical system of end state A\n        stateB : ChemicalSystem\n          The chemical system of end state B\n\n        Raises\n        ------\n        ValueError\n          If stateA or stateB contains a ProteinComponent.\n          If there is no SolventComponent in either stateA or stateB.\n          If there are alchemical components in state B.\n          If there are non SmallMoleculeComponent alchemical species.\n          If there are more than one alchemical species.\n          If the alchemical species is charged.\n\n        Notes\n        -----\n        * Currently doesn't support alchemical components in state B.\n        * Currently doesn't support alchemical components which are not\n          SmallMoleculeComponents.\n        * Currently doesn't support more than one alchemical component\n          being desolvated.\n        * Currently doesn't support charged alchemical components.\n        * Solvent must always be present in both end states.\n        \"\"\"\n        # Check that there are no protein components\n        if stateA.contains(ProteinComponent) or stateB.contains(ProteinComponent):\n            errmsg = \"Protein components are not allowed for absolute solvation free energies.\"\n            raise ValueError(errmsg)\n\n        # Check that there is a solvent component in both end states\n        if not (stateA.contains(SolventComponent) and stateB.contains(SolventComponent)):\n            errmsg = \"No SolventComponent found in stateA and/or stateB\"\n            raise ValueError(errmsg)\n\n        # Now we check the alchemical Components\n        diff = stateA.component_diff(stateB)\n\n        # Check that there's only one state A unique Component\n        if len(diff[0]) != 1:\n            errmsg = (\n                \"Only one alchemical species is supported \"\n                \"for absolute solvation free energies. \"\n                f\"Number of unique components found in stateA: {len(diff[0])}.\"\n            )\n            raise ValueError(errmsg)\n\n        # Make sure that the state A unique is an SMC\n        if not isinstance(diff[0][0], SmallMoleculeComponent):\n            errmsg = (\n                \"Only disappearing SmallMoleculeComponents \"\n                \"are supported by this protocol. \"\n                f\"Found a {type(diff[0][0])}\"\n            )\n            raise ValueError(errmsg)\n\n        # Check that the state A unique isn't charged\n        if diff[0][0].total_charge != 0:\n            errmsg = (\n                \"Charged alchemical molecules are not currently \"\n                \"supported for solvation free energies. \"\n                f\"Molecule total charge: {diff[0][0].total_charge}.\"\n            )\n            raise ValueError(errmsg)\n\n        # If there are any alchemical Components in state B\n        if len(diff[1]) > 0:\n            errmsg = \"Components appearing in state B are not currently supported\"\n            raise ValueError(errmsg)\n\n    @staticmethod\n    def _validate_lambda_schedule(\n        lambda_settings: LambdaSettings,\n        simulation_settings: MultiStateSimulationSettings,\n    ) -> None:\n        \"\"\"\n        Checks that the lambda schedule is set up correctly.\n\n        Parameters\n        ----------\n        lambda_settings : LambdaSettings\n          the lambda schedule Settings\n        simulation_settings : MultiStateSimulationSettings\n          the settings for either the vacuum or solvent phase\n\n        Raises\n        ------\n        ValueError\n          If the number of lambda windows differs for electrostatics and sterics.\n          If the number of replicas does not match the number of lambda windows.\n          If there are states with naked charges.\n        Warnings\n          If there are non-zero values for restraints (lambda_restraints).\n        \"\"\"\n\n        lambda_elec = lambda_settings.lambda_elec\n        lambda_vdw = lambda_settings.lambda_vdw\n        lambda_restraints = lambda_settings.lambda_restraints\n        n_replicas = simulation_settings.n_replicas\n\n        # Ensure that all lambda components have equal amount of windows\n        lambda_components = [lambda_vdw, lambda_elec, lambda_restraints]\n        it = iter(lambda_components)\n        the_len = len(next(it))\n        if not all(len(lambda_comp) == the_len for lambda_comp in it):\n            errmsg = (\n                \"Components elec, vdw, and restraints must have equal amount\"\n                f\" of lambda windows. Got {len(lambda_elec)} elec lambda\"\n                f\" windows, {len(lambda_vdw)} vdw lambda windows, and\"\n                f\"{len(lambda_restraints)} restraints lambda windows.\"\n            )\n            raise ValueError(errmsg)\n\n        # Ensure that number of overall lambda windows matches number of lambda\n        # windows for individual components\n        if n_replicas != len(lambda_vdw):\n            errmsg = (\n                f\"Number of replicas {n_replicas} does not equal the\"\n                f\" number of lambda windows {len(lambda_vdw)}\"\n            )\n            raise ValueError(errmsg)\n\n        # Check if there are lambda windows with naked charges\n        for inx, lam in enumerate(lambda_elec):\n            if lam < 1 and lambda_vdw[inx] == 1:\n                errmsg = (\n                    \"There are states along this lambda schedule \"\n                    \"where there are atoms with charges but no LJ \"\n                    f\"interactions: lambda {inx}: \"\n                    f\"elec {lam} vdW {lambda_vdw[inx]}\"\n                )\n                raise ValueError(errmsg)\n\n        # Check if there are lambda windows with non-zero restraints\n        if len([r for r in lambda_restraints if r != 0]) > 0:\n            wmsg = (\n                \"Non-zero restraint lambdas applied. The absolute \"\n                \"solvation protocol doesn't apply restraints, \"\n                \"therefore restraints won't be applied. \"\n                f\"Given lambda_restraints: {lambda_restraints}\"\n            )\n            logger.warning(wmsg)\n            warnings.warn(wmsg)\n\n    def _validate(\n        self,\n        *,\n        stateA: ChemicalSystem,\n        stateB: ChemicalSystem,\n        mapping: Optional[Union[gufe.ComponentMapping, list[gufe.ComponentMapping]]] = None,\n        extends: Optional[gufe.ProtocolDAGResult] = None,\n    ):\n        # Check we're not extending\n        if extends is not None:\n            # This should be a NotImplementedError, but the underlying\n            # `validate` method wraps a call to `_validate` around a\n            # NotImplementedError exception guard\n            raise ValueError(\"Can't extend simulations yet\")\n\n        # Check we're not using a mapping, since we're not doing anything with it\n        if mapping is not None:\n            wmsg = \"A mapping was passed but is not used by this Protocol.\"\n            warnings.warn(wmsg)\n\n        # Validate the endstates & alchemical components\n        system_validation.validate_chemical_system(stateA)\n        system_validation.validate_chemical_system(stateB)\n        self._validate_endstates(stateA, stateB)\n\n        # Validate the lambda schedule\n        for solv_sets in (\n            self.settings.solvent_simulation_settings,\n            self.settings.vacuum_simulation_settings,\n        ):\n            self._validate_lambda_schedule(\n                self.settings.lambda_settings,\n                solv_sets,\n            )\n\n        # Check nonbond & solvent compatibility\n        solv_nonbonded_method = self.settings.solvent_forcefield_settings.nonbonded_method\n        vac_nonbonded_method = self.settings.vacuum_forcefield_settings.nonbonded_method\n\n        # Use the more complete system validation solvent checks\n        system_validation.validate_solvent(stateA, solv_nonbonded_method)\n\n        # Gas phase is always gas phase\n        if vac_nonbonded_method.lower() != \"nocutoff\":\n            errmsg = (\n                \"Only the nocutoff nonbonded_method is supported for \"\n                f\"vacuum calculations, {vac_nonbonded_method} was \"\n                \"passed\"\n            )\n            raise ValueError(errmsg)\n\n        # Validate solvation settings\n        settings_validation.validate_openmm_solvation_settings(self.settings.solvation_settings)\n\n        # Check vacuum equilibration MD settings is 0 ns\n        nvt_time = self.settings.vacuum_equil_simulation_settings.equilibration_length_nvt\n        if nvt_time is not None:\n            if not np.allclose(nvt_time, 0 * offunit.nanosecond):\n                errmsg = \"NVT equilibration cannot be run in vacuum simulation\"\n                raise ValueError(errmsg)\n\n        # Validate integrator things\n        settings_validation.validate_timestep(\n            self.settings.vacuum_forcefield_settings.hydrogen_mass,\n            self.settings.integrator_settings.timestep,\n        )\n\n        settings_validation.validate_timestep(\n            self.settings.solvent_forcefield_settings.hydrogen_mass,\n            self.settings.integrator_settings.timestep,\n        )\n\n    def _create(\n        self,\n        stateA: ChemicalSystem,\n        stateB: ChemicalSystem,\n        mapping: Optional[Union[gufe.ComponentMapping, list[gufe.ComponentMapping]]] = None,\n        extends: Optional[gufe.ProtocolDAGResult] = None,\n    ) -> list[gufe.ProtocolUnit]:\n        # Validate inputs\n        self.validate(stateA=stateA, stateB=stateB, mapping=mapping, extends=extends)\n\n        # Get the alchemical components\n        alchem_comps = system_validation.get_alchemical_components(\n            stateA,\n            stateB,\n        )\n\n        # Get the name of the alchemical species\n        alchname = alchem_comps[\"stateA\"][0].name\n\n        unit_classes: dict[str, dict[str, type[gufe.ProtocolUnit]]] = {\n            \"solvent\": {\n                \"setup\": AHFESolventSetupUnit,\n                \"simulation\": AHFESolventSimUnit,\n                \"analysis\": AHFESolventAnalysisUnit,\n            },\n            \"vacuum\": {\n                \"setup\": AHFEVacuumSetupUnit,\n                \"simulation\": AHFEVacuumSimUnit,\n                \"analysis\": AHFEVacuumAnalysisUnit,\n            },\n        }\n\n        protocol_units: dict[str, list[gufe.ProtocolUnit]] = {\"solvent\": [], \"vacuum\": []}\n\n        for phase in [\"solvent\", \"vacuum\"]:\n            for i in range(self.settings.protocol_repeats):\n                repeat_id = int(uuid.uuid4())\n\n                setup = unit_classes[phase][\"setup\"](\n                    protocol=self,\n                    stateA=stateA,\n                    stateB=stateB,\n                    alchemical_components=alchem_comps,\n                    generation=0,\n                    repeat_id=repeat_id,\n                    name=f\"AHFE Setup: {alchname} {phase} leg: repeat {i} generation 0\",\n                )\n\n                simulation = unit_classes[phase][\"simulation\"](\n                    protocol=self,\n                    # only need state A & alchem comps\n                    stateA=stateA,\n                    alchemical_components=alchem_comps,\n                    setup_results=setup,\n                    generation=0,\n                    repeat_id=repeat_id,\n                    name=f\"AHFE Simulation: {alchname} {phase} leg: repeat {i} generation 0\",\n                )\n\n                analysis = unit_classes[phase][\"analysis\"](\n                    protocol=self,\n                    setup_results=setup,\n                    simulation_results=simulation,\n                    generation=0,\n                    repeat_id=repeat_id,\n                    name=f\"AHFE Analysis: {alchname} {phase} leg, repeat {i} generation 0\",\n                )\n\n                protocol_units[phase] += [setup, simulation, analysis]\n\n        return protocol_units[\"solvent\"] + protocol_units[\"vacuum\"]\n\n    def _gather(\n        self, protocol_dag_results: Iterable[gufe.ProtocolDAGResult]\n    ) -> dict[str, dict[str, Any]]:\n        # result units will have a repeat_id and generation\n        # first group according to repeat_id\n        unsorted_solvent_repeats = defaultdict(list)\n        unsorted_vacuum_repeats = defaultdict(list)\n        for d in protocol_dag_results:\n            pu: gufe.ProtocolUnitResult\n            for pu in d.protocol_unit_results:\n                if (\"Analysis\" not in pu.name) or (not pu.ok()):\n                    continue\n                if pu.outputs[\"simtype\"] == \"solvent\":\n                    unsorted_solvent_repeats[pu.outputs[\"repeat_id\"]].append(pu)\n                else:\n                    unsorted_vacuum_repeats[pu.outputs[\"repeat_id\"]].append(pu)\n\n        repeats: dict[str, dict[str, list[gufe.ProtocolUnitResult]]] = {\n            \"solvent\": {},\n            \"vacuum\": {},\n        }\n        for k, v in unsorted_solvent_repeats.items():\n            repeats[\"solvent\"][str(k)] = sorted(v, key=lambda x: x.outputs[\"generation\"])\n\n        for k, v in unsorted_vacuum_repeats.items():\n            repeats[\"vacuum\"][str(k)] = sorted(v, key=lambda x: x.outputs[\"generation\"])\n        return repeats\n"
  },
  {
    "path": "src/openfe/protocols/openmm_md/__init__.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\n\"\"\"\nRun MD simulation using OpenMM and OpenMMTools.\n\n\"\"\"\n\nfrom .plain_md_methods import (\n    PlainMDProtocol,\n    PlainMDProtocolResult,\n    PlainMDProtocolSettings,\n    PlainMDSetupUnit,\n    PlainMDSimulationUnit,\n)\n\n__all__ = [\n    \"PlainMDProtocol\",\n    \"PlainMDProtocolSettings\",\n    \"PlainMDProtocolResult\",\n    \"PlainMDSetupUnit\",\n    \"PlainMDSimulationUnit\",\n]\n"
  },
  {
    "path": "src/openfe/protocols/openmm_md/plain_md_methods.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\n\n\"\"\"OpenMM MD Protocol --- :mod:`openfe.protocols.openmm_md.plain_md_methods`\n===========================================================================================\n\nThis module implements the necessary methodology tools to run an MD\nsimulation using OpenMM tools.\n\n\"\"\"\n\nfrom __future__ import annotations\n\nimport logging\nimport pathlib\nimport time\nimport uuid\nimport warnings\nfrom collections import defaultdict\nfrom typing import Any, Iterable, Optional\n\nimport gufe\nimport mdtraj\nimport numpy as np\nimport openmm\nimport openmm.unit as omm_unit\nfrom gufe import (\n    BaseSolventComponent,\n    ChemicalSystem,\n    SmallMoleculeComponent,\n    SolvatedPDBComponent,\n    settings,\n)\nfrom gufe.protocols.errors import ProtocolUnitExecutionError\nfrom gufe.settings.typing import KelvinQuantity\nfrom mdtraj.reporters import XTCReporter\nfrom openff.toolkit.topology import Molecule as OFFMolecule\nfrom openff.units import Quantity, unit\nfrom openff.units.openmm import from_openmm, to_openmm\nfrom openmm import MonteCarloBarostat, MonteCarloMembraneBarostat\n\nimport openfe\nfrom openfe.protocols.openmm_md.plain_md_settings import (\n    IntegratorSettings,\n    MDOutputSettings,\n    MDSimulationSettings,\n    OpenFFPartialChargeSettings,\n    OpenMMEngineSettings,\n    OpenMMSolvationSettings,\n    PlainMDProtocolSettings,\n)\nfrom openfe.protocols.openmm_utils import (\n    charge_generation,\n    omm_compute,\n    serialization,\n    settings_validation,\n    system_creation,\n    system_validation,\n)\nfrom openfe.protocols.openmm_utils.omm_settings import (\n    BasePartialChargeSettings,\n    FemtosecondQuantity,\n)\nfrom openfe.utils import log_system_probe, without_oechem_backend\n\nlogger = logging.getLogger(__name__)\n\n\nclass PlainMDProtocolResult(gufe.ProtocolResult):\n    \"\"\"\n    Dict-like container for the output of a PlainMDProtocol.\n\n    Provides access to simulation outputs including the pre-minimized\n    system PDB and production trajectory files.\n    \"\"\"\n\n    def __init__(self, **data):\n        super().__init__(**data)\n        # data is mapping of str(repeat_id): list[protocolunitresults]\n        if any(len(pur_list) > 2 for pur_list in self.data.values()):\n            raise NotImplementedError(\"Can't stitch together results yet\")\n\n    def get_estimate(self):\n        \"\"\"Since no results as output --> returns None\n\n        Returns\n        -------\n        None\n        \"\"\"\n\n        return None\n\n    def get_uncertainty(self):\n        \"\"\"Since no results as output --> returns None\"\"\"\n\n        return None\n\n    def get_traj_filename(self) -> list[pathlib.Path]:\n        \"\"\"\n        Get a list of trajectory paths\n\n        Returns\n        -------\n        traj : list[pathlib.Path]\n          list of paths (pathlib.Path) to the simulation trajectory\n        \"\"\"\n        traj = [pus[0].outputs[\"nc\"] for pus in self.data.values()]\n\n        return traj\n\n    def get_pdb_filename(self) -> list[pathlib.Path]:\n        \"\"\"\n        Get a list of paths to the pdb files of the pre-minimized system.\n\n        Returns\n        -------\n        pdbs : list[pathlib.Path]\n          list of paths (pathlib.Path) to the pdb files\n        \"\"\"\n        pdbs = [pus[0].outputs[\"system_pdb\"] for pus in self.data.values()]\n\n        return pdbs\n\n\nclass PlainMDProtocol(gufe.Protocol):\n    \"\"\"\n    Protocol for running Molecular Dynamics simulations using OpenMM.\n\n    See Also\n    --------\n    :mod:`openfe.protocols`\n    :class:`openfe.protocols.openmm_md.PlainMDProtocolSettings`\n    :class:`openfe.protocols.openmm_md.PlainMDProtocolUnit`\n    :class:`openfe.protocols.openmm_md.PlainMDProtocolResult`\n    \"\"\"\n\n    result_cls = PlainMDProtocolResult\n    _settings_cls = PlainMDProtocolSettings\n    _settings: PlainMDProtocolSettings\n\n    @classmethod\n    def _default_settings(cls):\n        \"\"\"A dictionary of initial settings for this creating this Protocol\n\n        These settings are intended as a suitable starting point for creating\n        an instance of this protocol.  It is recommended, however that care is\n        taken to inspect and customize these before performing a Protocol.\n\n        Returns\n        -------\n        Settings\n          a set of default settings\n        \"\"\"\n        return PlainMDProtocolSettings(\n            forcefield_settings=settings.OpenMMSystemGeneratorFFSettings(),\n            thermo_settings=settings.ThermoSettings(\n                temperature=298.15 * unit.kelvin,\n                pressure=1 * unit.bar,\n            ),\n            partial_charge_settings=OpenFFPartialChargeSettings(),\n            solvation_settings=OpenMMSolvationSettings(),\n            engine_settings=OpenMMEngineSettings(),\n            integrator_settings=IntegratorSettings(),\n            simulation_settings=MDSimulationSettings(\n                equilibration_length_nvt=0.1 * unit.nanosecond,\n                equilibration_length=1.0 * unit.nanosecond,\n                production_length=5.0 * unit.nanosecond,\n            ),\n            output_settings=MDOutputSettings(checkpoint_storage_filename=\"checkpoint.xml\"),\n            protocol_repeats=1,\n        )\n\n    def _validate(\n        self,\n        stateA: ChemicalSystem,\n        stateB: ChemicalSystem,\n        mapping: Optional[dict[str, gufe.ComponentMapping]] = None,\n        extends: Optional[gufe.ProtocolDAGResult] = None,\n    ):\n        # Check we're not extending\n        if extends is not None:\n            # This technically should be NotImplementedError\n            # but gufe.Protocol.validate calls `_validate` wrapped around an\n            # except for NotImplementedError, so we can't raise it here\n            raise ValueError(\"Can't extend simulations yet\")\n\n        # Check we're not using a mapping, since we're not doing anything with it\n        if mapping is not None:\n            wmsg = \"A mapping was passed but is not used by this Protocol.\"\n            warnings.warn(wmsg)\n\n        # check that stateA and stateB are the same\n        if stateA is not stateB:\n            errmsg = \"The two end states do not match.\"\n            raise ValueError(errmsg)\n\n        # Validate the ChemicalSystem\n        system_validation.validate_chemical_system(stateA)\n\n        # Validate solvent component if present\n        nonbond = self.settings.forcefield_settings.nonbonded_method\n        system_validation.validate_solvent(stateA, nonbond)\n\n        # Validate the BaseSolventComponents\n        base_solvent = stateA.get_components_of_type(BaseSolventComponent)\n        if len(base_solvent) > 1:\n            errmsg = \"Multiple BaseSolventComponents found, only one is supported.\"\n            raise ValueError(errmsg)\n\n        # Validate protein component if present\n        system_validation.validate_protein(stateA)\n\n        # Validate the barostat used in combination with the protein component\n        system_validation.validate_barostat(stateA, self.settings.integrator_settings.barostat)\n\n        # Validate solvation settings\n        settings_validation.validate_openmm_solvation_settings(self.settings.solvation_settings)\n\n        # is the timestep good for the mass?\n        settings_validation.validate_timestep(\n            self.settings.forcefield_settings.hydrogen_mass,\n            self.settings.integrator_settings.timestep,\n        )\n\n    def _create(\n        self,\n        stateA: ChemicalSystem,\n        stateB: ChemicalSystem,\n        mapping: Optional[dict[str, gufe.ComponentMapping]] = None,\n        extends: Optional[gufe.ProtocolDAGResult] = None,\n    ) -> list[gufe.ProtocolUnit]:\n        # validate the inputs\n        self.validate(stateA=stateA, stateB=stateB, mapping=mapping, extends=extends)\n\n        # actually create and return Units\n        # TODO: Deal with multiple ProteinComponents\n        solvent_comp, protein_comp, small_mols = system_validation.get_components(stateA)\n\n        system_name = \"Solvent MD\" if stateA.contains(BaseSolventComponent) else \"Vacuum MD\"\n\n        for comp in [protein_comp] + small_mols:\n            if comp is not None:\n                comp_type = comp.__class__.__name__\n                if len(comp.name) == 0:\n                    comp_name = \"NoName\"\n                else:\n                    comp_name = comp.name\n                system_name += f\" {comp_type}:{comp_name}\"\n\n        # make the DAG from the setup and simulation units\n        n_repeats = self.settings.protocol_repeats\n        units = []\n        for i in range(n_repeats):\n            repeat_id = int(uuid.uuid4())\n\n            setup = PlainMDSetupUnit(\n                protocol=self,\n                stateA=stateA,\n                generation=0,\n                repeat_id=repeat_id,\n                name=f\"MD Setup: {system_name} repeat {i} generation 0\",\n            )\n            sim = PlainMDSimulationUnit(\n                protocol=self,\n                stateA=stateA,\n                generation=0,\n                repeat_id=repeat_id,\n                setup_results=setup,\n                name=f\"MD Simulation: {system_name} repeat {i} generation 0\",\n            )\n\n            units.extend([setup, sim])\n\n        return units\n\n    def _gather(self, protocol_dag_results: Iterable[gufe.ProtocolDAGResult]) -> dict[str, Any]:\n        # result units will have a repeat_id and generations within this\n        # repeat_id\n        # first group according to repeat_id\n        unsorted_repeats = defaultdict(list)\n        for d in protocol_dag_results:\n            pu: gufe.ProtocolUnitResult\n            for pu in d.protocol_unit_results:\n                # Only keep the simulation units which are ok\n                if (\"Simulation\" not in pu.name) or (not pu.ok()):\n                    continue\n\n                unsorted_repeats[pu.outputs[\"repeat_id\"]].append(pu)\n\n        # then sort by generation within each repeat_id list\n        repeats: dict[str, list[gufe.ProtocolUnitResult]] = {}\n        for k, v in unsorted_repeats.items():\n            repeats[str(k)] = sorted(v, key=lambda x: x.outputs[\"generation\"])\n\n        # returns a dict of repeat_id: sorted list of ProtocolUnitResult\n        return repeats\n\n\nclass PlainMDUnitMixin:\n    def _prepare(\n        self,\n        verbose: bool,\n        scratch_basepath: pathlib.Path | None,\n        shared_basepath: pathlib.Path | None,\n    ):\n        \"\"\"\n        Set basepaths and do some initial logging.\n\n        Parameters\n        ----------\n        verbose : bool\n          Verbose output of the simulation progress. Output is provided via\n          INFO level logging.\n        scratch_basepath : pathlib.Path | None\n          Optional base path to write scratch files to.\n        shared_basepath : pathlib.Path | None\n          Optional base path to write shared files to.\n        \"\"\"\n        self.verbose = verbose\n\n        # set basepaths\n        def _set_optional_path(basepath):\n            if basepath is None:\n                return pathlib.Path(\".\")\n            return basepath\n\n        self.scratch_basepath = _set_optional_path(scratch_basepath)\n        self.shared_basepath = _set_optional_path(shared_basepath)\n\n\nclass PlainMDSetupUnit(PlainMDUnitMixin, gufe.ProtocolUnit):\n    \"\"\"\n    Protocol setup unit for plain MD simulations which handles charging, system building and solvation.\n    \"\"\"\n\n    @staticmethod\n    def _assign_partial_charges(\n        charge_settings: OpenFFPartialChargeSettings,\n        smc_components: dict[SmallMoleculeComponent, OFFMolecule],\n    ) -> None:\n        \"\"\"\n        Assign partial charges to SMCs.\n\n        Parameters\n        ----------\n        charge_settings : OpenFFPartialChargeSettings\n          Settings for controlling how the partial charges are assigned.\n        smc_components : dict[SmallMoleculeComponent, openff.toolkit.Molecule]\n          Dictionary of OpenFF Molecules to add, keyed by\n          SmallMoleculeComponent.\n        \"\"\"\n        for mol in smc_components.values():\n            charge_generation.assign_offmol_partial_charges(\n                offmol=mol,\n                overwrite=False,\n                method=charge_settings.partial_charge_method,\n                toolkit_backend=charge_settings.off_toolkit_backend,\n                generate_n_conformers=charge_settings.number_of_conformers,\n                nagl_model=charge_settings.nagl_model,\n            )\n\n    def run(\n        self,\n        *,\n        dry: bool = False,\n        verbose: bool = True,\n        scratch_basepath: pathlib.Path | None = None,\n        shared_basepath: pathlib.Path | None = None,\n    ) -> dict[str, Any]:\n        \"\"\"Setup a plain MD system.\n\n        Parameters\n        ----------\n        dry : bool\n          Do a dry run of the calculation, creating all necessary hybrid\n          system components (topology, system, sampler, etc...) but without\n          running the simulation.\n        verbose : bool\n          Verbose output of the simulation progress. Output is provided via\n          INFO level logging.\n        scratch_basepath: pathlib.Path | None\n          Where to store temporary files, defaults to current working directory\n        shared_basepath : pathlib.Path | None\n          Where to run the calculation, defaults to current working directory\n\n        Returns\n        -------\n        dict\n          Outputs created by the setup unit or the debug objects\n          (e.g. HybridTopologyFactory) if ``dry==True``.\n\n        Raises\n        ------\n        error\n          Exception if anything failed\n        \"\"\"\n        # Prepare paths and set verbosity\n        self._prepare(verbose, scratch_basepath, shared_basepath)\n\n        if verbose:\n            self.logger.info(\"Creating system\")\n\n        # 0. General setup and settings dependency resolution step\n        # Extract relevant settings\n        protocol_settings: PlainMDProtocolSettings = self._inputs[\"protocol\"].settings\n        stateA = self._inputs[\"stateA\"]\n\n        forcefield_settings: settings.OpenMMSystemGeneratorFFSettings = (\n            protocol_settings.forcefield_settings\n        )\n        thermo_settings: settings.ThermoSettings = protocol_settings.thermo_settings\n        solvation_settings: OpenMMSolvationSettings = protocol_settings.solvation_settings\n        charge_settings: BasePartialChargeSettings = protocol_settings.partial_charge_settings\n        sim_settings: MDSimulationSettings = protocol_settings.simulation_settings\n        output_settings: MDOutputSettings = protocol_settings.output_settings\n        integrator_settings: IntegratorSettings = protocol_settings.integrator_settings\n        timestep = integrator_settings.timestep\n\n        # is the timestep good for the mass?\n        settings_validation.validate_timestep(forcefield_settings.hydrogen_mass, timestep)\n\n        # do step validation early and pass through the units\n        if sim_settings.equilibration_length_nvt is not None:\n            equil_steps_nvt = settings_validation.get_simsteps(\n                sim_length=sim_settings.equilibration_length_nvt,\n                timestep=timestep,\n                mc_steps=1,\n            )\n        else:\n            equil_steps_nvt = None\n\n        equil_steps_npt = settings_validation.get_simsteps(\n            sim_length=sim_settings.equilibration_length,\n            timestep=timestep,\n            mc_steps=1,\n        )\n        prod_steps = settings_validation.get_simsteps(\n            sim_length=sim_settings.production_length,\n            timestep=timestep,\n            mc_steps=1,\n        )\n\n        solvent_comp, protein_comp, small_mols = system_validation.get_components(stateA)\n        if isinstance(protein_comp, SolvatedPDBComponent):\n            solvent_comp = protein_comp\n\n        # 1. Create stateA system\n        # Create a dictionary of OFFMol for each SMC for bookkeeping\n        smc_components: dict[SmallMoleculeComponent, OFFMolecule] = {\n            i: i.to_openff() for i in small_mols\n        }\n\n        # a. assign partial charges to smcs\n        self._assign_partial_charges(charge_settings, smc_components)\n\n        # b. get a system generator\n        if output_settings.forcefield_cache is not None:\n            ffcache = self.shared_basepath / output_settings.forcefield_cache\n        else:\n            ffcache = None\n\n        # Note: we block out the oechem backend for all systemgenerator\n        # linked operations to avoid any smiles operations that can\n        # go wrong when doing rdkit->OEchem roundtripping\n        with without_oechem_backend():\n            system_generator = system_creation.get_system_generator(\n                forcefield_settings=forcefield_settings,\n                integrator_settings=integrator_settings,\n                thermo_settings=thermo_settings,\n                cache=ffcache,\n                has_solvent=solvent_comp is not None,\n            )\n\n            # Force creation of smc templates so we can solvate later\n            for mol in smc_components.values():\n                system_generator.create_system(mol.to_topology().to_openmm(), molecules=[mol])\n\n            # c. get OpenMM Modeller + a resids dictionary for each component\n            stateA_modeller, comp_resids = system_creation.get_omm_modeller(\n                protein_comp=protein_comp,\n                solvent_comp=solvent_comp,\n                small_mols=smc_components,\n                omm_forcefield=system_generator.forcefield,\n                solvent_settings=solvation_settings,\n            )\n\n            # d. get topology & positions\n            # Note: roundtrip positions to remove vec3 issues\n            stateA_topology = stateA_modeller.getTopology()\n            stateA_positions = to_openmm(from_openmm(stateA_modeller.getPositions()))\n\n            # e. create the stateA System\n            stateA_system = system_generator.create_system(\n                stateA_topology,\n                molecules=[s.to_openff() for s in small_mols],\n            )\n\n        # f. Save pdb of entire system topology to file, this is always needed for restarts\n        with open(self.shared_basepath / output_settings.preminimized_structure, \"w\") as f:\n            openmm.app.PDBFile.writeFile(stateA_topology, stateA_positions, file=f, keepIds=True)\n\n        # g. Save the system and positions to file\n        system_outfile = self.shared_basepath / \"system.xml.bz2\"\n        serialization.serialize(stateA_system, system_outfile)\n        positions_outfile = self.shared_basepath / \"input_positions.npy\"\n        np.save(positions_outfile, stateA_positions.value_in_unit(omm_unit.nanometers))\n\n        unit_results_dict = {\n            \"system\": system_outfile,\n            # save the positions to higher precision\n            \"positions\": positions_outfile,\n            \"system_pdb\": self.shared_basepath / output_settings.preminimized_structure,\n            \"equil_steps_nvt\": equil_steps_nvt,\n            \"equil_steps_npt\": equil_steps_npt,\n            \"prod_steps\": prod_steps,\n        }\n        if dry:\n            # add non serialised stuff for testing\n            debug_info = {\n                \"system\": stateA_system,\n                \"positions\": stateA_positions,\n                \"topology\": stateA_topology,\n            }\n            unit_results_dict[\"debug\"] = debug_info\n\n        return unit_results_dict\n\n    def _execute(\n        self,\n        ctx: gufe.Context,\n        **kwargs,\n    ) -> dict[str, Any]:\n        log_system_probe(logging.INFO, paths=[ctx.scratch])\n\n        outputs = self.run(scratch_basepath=ctx.scratch, shared_basepath=ctx.shared)\n\n        return {\n            \"repeat_id\": self._inputs[\"repeat_id\"],\n            \"generation\": self._inputs[\"generation\"],\n            # track some version restart info to check compatibility\n            \"openmm_version\": openmm.__version__,\n            \"openfe_version\": openfe.__version__,\n            \"gufe_version\": gufe.__version__,\n            **outputs,\n        }\n\n\nclass PlainMDSimulationUnit(PlainMDUnitMixin, gufe.ProtocolUnit):\n    \"\"\"\n    Protocol unit for plain MD simulation equilibration and production runs (NonTransformation).\n    \"\"\"\n\n    @staticmethod\n    def _check_restart(output_settings: MDOutputSettings, shared_path: pathlib.Path):\n        \"\"\"\n        Check if we are doing a restart.\n\n        Parameters\n        ----------\n        output_settings : MDOutputSettings\n          The simulation output settings\n        shared_path : pathlib.Path\n          The shared directory where we should be looking for existing files.\n\n        Notes\n        -----\n        For now this just checks if the checkpoint state file is present in the\n        shared directory but in the future this may expand depending on\n        how warehouse works.\n        \"\"\"\n        checkpoint = shared_path / output_settings.checkpoint_storage_filename\n\n        return checkpoint.is_file()\n\n    @staticmethod\n    def _verify_execution_environment(\n        setup_outputs: dict[str, Any],\n    ) -> None:\n        \"\"\"\n        Check that the Python environment hasn't changed based on the\n        relevant Python library versions stored in the setup outputs.\n        \"\"\"\n        try:\n            if (\n                (gufe.__version__ != setup_outputs[\"gufe_version\"])\n                or (openfe.__version__ != setup_outputs[\"openfe_version\"])\n                or (openmm.__version__ != setup_outputs[\"openmm_version\"])\n            ):\n                errmsg = \"Python environment has changed, cannot continue Protocol execution.\"\n                raise ProtocolUnitExecutionError(errmsg)\n        except KeyError:\n            errmsg = \"Missing environment information from setup outputs.\"\n            raise ProtocolUnitExecutionError(errmsg)\n\n    @staticmethod\n    def _save_pdb_subset(\n        simulation: openmm.app.Simulation,\n        output_settings: MDOutputSettings,\n        file_name: pathlib.Path,\n    ):\n        # get the positions\n        positions = to_openmm(\n            from_openmm(\n                simulation.context.getState(\n                    getPositions=True, enforcePeriodicBox=False\n                ).getPositions()\n            )\n        )\n        # get the subset from the output settings\n        mdtraj_top = mdtraj.Topology.from_openmm(simulation.topology)\n        selection_indices = mdtraj_top.select(output_settings.output_indices)\n        traj = mdtraj.Trajectory(\n            positions[selection_indices, :],\n            mdtraj_top.subset(selection_indices),\n        )\n        traj.save_pdb(file_name)\n\n    @staticmethod\n    def _run_dynamics(\n        simulation: openmm.app.Simulation,\n        steps: int,\n        temperature: KelvinQuantity,\n        barostat_frequency: Quantity,\n        output_settings: MDOutputSettings,\n        verbose: bool = True,\n        output_path: None | pathlib.Path = None,\n        reinitialize_velocities: bool = True,\n    ):\n        \"\"\"\n        Worker method to set the temperature, barostat and run dynamics and save final structure output.\n        \"\"\"\n        # only set the velocities to temperature if we are not restarting this section\n        if reinitialize_velocities:\n            # set the velocities to temperature\n            simulation.context.setVelocitiesToTemperature(to_openmm(temperature))\n\n        # Setup the barostat\n        for x in simulation.context.getSystem().getForces():\n            if isinstance(x, (MonteCarloBarostat, MonteCarloMembraneBarostat)):\n                x.setFrequency(barostat_frequency.m)\n\n        # run the simulation\n        t0 = time.time()\n        simulation.step(steps)\n        t1 = time.time()\n        if verbose:\n            logger.info(f\"Completed dynamics in {t1 - t0} seconds\")\n\n        # save the final frame if a file path is passed\n        if output_path is not None:\n            PlainMDSimulationUnit._save_pdb_subset(\n                simulation,\n                output_settings,\n                output_path,\n            )\n\n    @staticmethod\n    def _get_remaining_steps(\n        current_step_count: int,\n        equil_steps_nvt: int,\n        equil_steps_npt: int,\n        prod_steps: int,\n    ) -> tuple[int, int, int, bool]:\n        \"\"\"\n        Work out the remaining steps for each phase of the simulation based on the current step count,\n        and determine if production has already started.\n\n        Returns\n        -------\n        equil_steps_nvt : int\n            The number of nvt steps left to run\n        equil_steps_npt : int\n            The number of npt steps left to run\n        prod_steps : int\n            The number of production steps left to run\n        production_started : bool\n            Whether the production phase has already started or not\n        \"\"\"\n        nvt_end = equil_steps_nvt\n        npt_end = equil_steps_nvt + equil_steps_npt\n        prod_end = equil_steps_nvt + equil_steps_npt + prod_steps\n\n        if npt_end < current_step_count <= prod_end:\n            # In the production phase\n            return 0, 0, prod_end - current_step_count, True\n\n        elif nvt_end < current_step_count <= npt_end:\n            # In the NPT equilibration phase\n            return 0, npt_end - current_step_count, prod_steps, False\n\n        else:\n            # In the NVT equilibration phase\n            return nvt_end - current_step_count, equil_steps_npt, prod_steps, False\n\n    @staticmethod\n    def _run_MD(\n        simulation: openmm.app.Simulation,\n        positions: omm_unit.Quantity,\n        simulation_settings: MDSimulationSettings,\n        output_settings: MDOutputSettings,\n        temperature: KelvinQuantity,\n        barostat_frequency: Quantity,\n        timestep: FemtosecondQuantity,\n        equil_steps_nvt: int | None,\n        equil_steps_npt: int,\n        prod_steps: int,\n        verbose: bool = True,\n        shared_basepath: pathlib.Path | None = None,\n        restart: bool = False,\n    ) -> None:\n        \"\"\"\n        Energy minimization, Equilibration and Production MD to be reused\n        in multiple protocols\n\n        Parameters\n        ----------\n        simulation : openmm.app.Simulation\n          An OpenMM simulation to simulate.\n        positions : openmm.unit.Quantity\n          Initial positions for the system.\n        simulation_settings : SimulationSettingsMD\n          Settings for MD simulation\n        output_settings: OutputSettingsMD\n          Settings for output of MD simulation\n        temperature: KelvinQuantity\n          temperature setting\n        barostat_frequency: openff.units.Quantity\n          Frequency for the barostat\n        timestep: FemtosecondQuantity\n          Simulation integration timestep\n        equil_steps_nvt: Optional[int]\n          number of steps for NVT equilibration\n          if None, no NVT equilibration will be performed\n        equil_steps_npt: int\n          number of steps for NPT equilibration\n        prod_steps: int\n          number of steps for the production run\n        verbose: bool\n          Verbose output of the simulation progress. Output is provided via\n          INFO level logging.\n        shared_basepath : Pathlike, optional\n          Where to run the calculation, defaults to current working directory\n        restart: bool, optional, default=False\n          Whether we are restarting from a previous simulation or not, the checkpoint file should be\n          present in the shared directories.\n\n        \"\"\"\n        if shared_basepath is None:\n            shared_basepath = pathlib.Path(\".\")\n\n        # get the checkpointing interval for states and positions\n        checkpoint_interval = settings_validation.get_simsteps(\n            sim_length=output_settings.checkpoint_interval,\n            timestep=timestep,\n            mc_steps=1,\n        )\n\n        # as nvt steps can be None set to 0 in this case\n        equil_steps_nvt = equil_steps_nvt or 0\n\n        # track if production has already been started\n        production_started = False\n        # track if we need to reinitialize velocities for a phase\n        # on a fresh run, reinitialize velocities for the first phase.\n        # on a restart, preserve the checkpoint velocities for the phase being restarted.\n        reinitialize_velocities = not restart\n        # if restarting skip setup and minimization as they should be completed by the time the checkpoint reporter is used\n        if restart:\n            if verbose:\n                logger.info(\"Restarting simulation from checkpoint state\")\n            simulation.loadState(str(shared_basepath / output_settings.checkpoint_storage_filename))\n\n            # workout the number of steps to run in each phase based on the current simulation step count\n            current_step_count = simulation.context.getStepCount()\n            equil_steps_nvt, equil_steps_npt, prod_steps, production_started = (\n                PlainMDSimulationUnit._get_remaining_steps(\n                    current_step_count=current_step_count,\n                    equil_steps_nvt=equil_steps_nvt,\n                    equil_steps_npt=equil_steps_npt,\n                    prod_steps=prod_steps,\n                )\n            )\n\n        else:\n            # this is the non restart case and requires minimization before moving on\n            simulation.context.setPositions(positions)\n            # minimize\n            if verbose:\n                logger.info(\"Minimizing systems\")\n\n            simulation.minimizeEnergy(maxIterations=simulation_settings.minimization_steps)\n\n            if output_settings.minimized_structure:\n                PlainMDSimulationUnit._save_pdb_subset(\n                    simulation,\n                    output_settings,\n                    shared_basepath / output_settings.minimized_structure,\n                )\n\n        # add the checkpoint reporter so we can recover during the equilibration / production phases\n        if output_settings.checkpoint_storage_filename:\n            simulation.reporters.append(\n                openmm.app.CheckpointReporter(\n                    file=str(shared_basepath / output_settings.checkpoint_storage_filename),\n                    reportInterval=checkpoint_interval,\n                    writeState=True,  # writes portable XML via simulation.saveState()\n                )\n            )\n\n        # equilibrate\n        # NVT equilibration\n        if equil_steps_nvt > 0:\n            if verbose:\n                logger.info(f\"Running NVT equilibration for {equil_steps_nvt} steps\")\n            # setup the output path if we have one for the nvt equilibration\n            if output_settings.equil_nvt_structure is not None:\n                output_path = shared_basepath / output_settings.equil_nvt_structure\n            else:\n                output_path = None\n            PlainMDSimulationUnit._run_dynamics(\n                simulation=simulation,\n                steps=equil_steps_nvt,\n                temperature=temperature,\n                barostat_frequency=0 * unit.timestep,  # turn off the barostat for this stage\n                output_settings=output_settings,\n                verbose=verbose,\n                output_path=output_path,\n                reinitialize_velocities=reinitialize_velocities,\n            )\n            # if we have run this stage we then need to reinitialize velocities in the next stages\n            reinitialize_velocities = True\n\n        # NPT equilibration\n        if equil_steps_npt > 0:\n            if verbose:\n                logger.info(f\"Running NPT equilibration for {equil_steps_npt} steps\")\n            # setup the output path if we have one for the npt equilibration\n            if output_settings.equil_npt_structure is not None:\n                output_path = shared_basepath / output_settings.equil_npt_structure\n            else:\n                output_path = None\n\n            PlainMDSimulationUnit._run_dynamics(\n                simulation=simulation,\n                steps=equil_steps_npt,\n                temperature=temperature,\n                barostat_frequency=barostat_frequency,\n                output_settings=output_settings,\n                verbose=verbose,\n                output_path=output_path,\n                reinitialize_velocities=reinitialize_velocities,\n            )\n            # the production stage can use these same velocities\n            reinitialize_velocities = False\n\n        # production\n        if verbose:\n            logger.info(f\"Running production phase for {prod_steps} steps\")\n\n        # Setup the reporters\n        write_interval = settings_validation.divmod_time_and_check(\n            output_settings.trajectory_write_interval,\n            timestep,\n            \"trajectory_write_interval\",\n            \"timestep\",\n        )\n\n        if output_settings.production_trajectory_filename:\n            # Get the sub selection of the system to save coords for\n            selection_indices = mdtraj.Topology.from_openmm(simulation.topology).select(\n                output_settings.output_indices\n            )\n            xtc_reporter = XTCReporter(\n                file=str(shared_basepath / output_settings.production_trajectory_filename),\n                reportInterval=write_interval,\n                atomSubset=selection_indices,\n                # append to the trajectory if restarting and we have run the production stage before\n                append=production_started,\n            )\n            simulation.reporters.append(xtc_reporter)\n\n        if output_settings.log_output:\n            simulation.reporters.append(\n                openmm.app.StateDataReporter(\n                    str(shared_basepath / output_settings.log_output),\n                    checkpoint_interval,\n                    step=True,\n                    time=True,\n                    potentialEnergy=True,\n                    kineticEnergy=True,\n                    totalEnergy=True,\n                    temperature=True,\n                    volume=True,\n                    density=True,\n                    speed=True,\n                    append=production_started,\n                )\n            )\n\n        PlainMDSimulationUnit._run_dynamics(\n            simulation=simulation,\n            steps=prod_steps,\n            temperature=temperature,\n            barostat_frequency=barostat_frequency,\n            output_settings=output_settings,\n            verbose=verbose,\n            output_path=None,  # the trajectory is saved for the production run so don't save again\n            reinitialize_velocities=reinitialize_velocities,\n        )\n\n    def run(\n        self,\n        *,\n        system: openmm.System,\n        positions: openmm.unit.Quantity,\n        topology: openmm.app.Topology,\n        equil_steps_nvt: int | None,\n        equil_steps_npt: int,\n        prod_steps: int,\n        dry: bool = False,\n        verbose: bool = True,\n        scratch_basepath: pathlib.Path | None = None,\n        shared_basepath: pathlib.Path | None = None,\n    ) -> dict[str, Any]:\n        \"\"\"Run the MD simulation.\n\n        Parameters\n        ----------\n        system : openmm.System\n          The System to simulate.\n        positions : openmm.unit.Quantity\n          The positions of the System.\n        topology: openmm.app.Topology\n            The topology of the System.\n        equil_steps_nvt : int\n            The number of nvt equilibration steps.\n        equil_steps_npt : int\n            The number of npt equilibration steps.\n        prod_steps : int\n            The number of production steps.\n        dry : bool\n          Do a dry run of the calculation, creating all necessary hybrid\n          system components (topology, system, sampler, etc...) but without\n          running the simulation.\n        verbose : bool\n          Verbose output of the simulation progress. Output is provided via\n          INFO level logging.\n        scratch_basepath: Pathlike, optional\n          Where to store temporary files, defaults to current working directory\n        shared_basepath : Pathlike, optional\n          Where to run the calculation, defaults to current working directory\n\n        Returns\n        -------\n        dict\n          Outputs created in the basepath directory or the debug objects\n          (i.e. sampler) if ``dry==True``.\n\n        Raises\n        ------\n        error\n          Exception if anything failed\n        \"\"\"\n        # Prepare paths and set verbosity\n        self._prepare(verbose, scratch_basepath, shared_basepath)\n\n        # Extract relevant settings\n        protocol_settings: PlainMDProtocolSettings = self._inputs[\"protocol\"].settings\n\n        forcefield_settings: settings.OpenMMSystemGeneratorFFSettings = (\n            protocol_settings.forcefield_settings\n        )\n        thermo_settings: settings.ThermoSettings = protocol_settings.thermo_settings\n        sim_settings: MDSimulationSettings = protocol_settings.simulation_settings\n        output_settings: MDOutputSettings = protocol_settings.output_settings\n        timestep = protocol_settings.integrator_settings.timestep\n        integrator_settings = protocol_settings.integrator_settings\n\n        # Get platform\n        restrict_cpu = forcefield_settings.nonbonded_method.lower() == \"nocutoff\"\n        platform = omm_compute.get_openmm_platform(\n            platform_name=protocol_settings.engine_settings.compute_platform,\n            gpu_device_index=protocol_settings.engine_settings.gpu_device_index,\n            restrict_cpu_count=restrict_cpu,\n        )\n\n        # Set the integrator\n        integrator = openmm.LangevinMiddleIntegrator(\n            to_openmm(thermo_settings.temperature),\n            to_openmm(integrator_settings.langevin_collision_rate),\n            to_openmm(timestep),\n        )\n        # Build the simulation\n        simulation = openmm.app.Simulation(\n            topology,\n            system,\n            integrator,\n            platform,\n        )\n\n        try:\n            if not dry:  # pragma: no-cover\n                # check for a restart\n                restart = self._check_restart(output_settings, self.shared_basepath)\n                # start the simulation\n                self._run_MD(\n                    simulation,\n                    positions,\n                    sim_settings,\n                    output_settings,\n                    thermo_settings.temperature,\n                    integrator_settings.barostat_frequency,\n                    timestep,\n                    equil_steps_nvt,\n                    equil_steps_npt,\n                    prod_steps,\n                    shared_basepath=self.shared_basepath,\n                    restart=restart,\n                    verbose=self.verbose,\n                )\n\n        finally:\n            if not dry:\n                del integrator, simulation\n\n        if not dry:  # pragma: no-cover\n            output = {\n                \"system_pdb\": self.shared_basepath / output_settings.preminimized_structure,\n                \"minimized_pdb\": self.shared_basepath / output_settings.minimized_structure,\n                \"nc\": self.shared_basepath / output_settings.production_trajectory_filename,\n                \"last_checkpoint\": self.shared_basepath\n                / output_settings.checkpoint_storage_filename,\n            }\n            # The checkpoint file can not exist if frequency > sim length\n            if not output[\"last_checkpoint\"].exists():\n                output[\"last_checkpoint\"] = None\n\n            # The NVT PDB can be omitted if we don't run the simulation\n            # Note: we could also just check the file exist\n            if (\n                output_settings.equil_nvt_structure\n                and sim_settings.equilibration_length_nvt is not None\n            ):\n                output[\"nvt_equil_pdb\"] = self.shared_basepath / output_settings.equil_nvt_structure\n            else:\n                output[\"nvt_equil_pdb\"] = None\n\n            if output_settings.equil_npt_structure:\n                output[\"npt_equil_pdb\"] = self.shared_basepath / output_settings.equil_npt_structure\n            else:\n                output[\"npt_equil_pdb\"] = None\n\n            return output\n        else:\n            return {\"debug\": {\"system\": system}}\n\n    def _execute(\n        self,\n        ctx: gufe.Context,\n        setup_results,\n        **kwargs,\n    ) -> dict[str, Any]:\n        log_system_probe(logging.INFO, paths=[ctx.scratch])\n        # Ensure that the environment hasn't changed\n        self._verify_execution_environment(setup_results.outputs)\n\n        # Get the relevant inputs for running the unit\n        system = serialization.deserialize(setup_results.outputs[\"system\"])\n        positions = (\n            np.load(setup_results.outputs[\"positions\"]) * omm_unit.nanometers\n        )  # convert to openmm units\n        topology = openmm.app.PDBFile(str(setup_results.outputs[\"system_pdb\"])).getTopology()\n        equil_steps_nvt = setup_results.outputs[\"equil_steps_nvt\"]\n        equil_steps_npt = setup_results.outputs[\"equil_steps_npt\"]\n        prod_steps = setup_results.outputs[\"prod_steps\"]\n\n        outputs = self.run(\n            system=system,\n            positions=positions,\n            topology=topology,\n            equil_steps_nvt=equil_steps_nvt,\n            equil_steps_npt=equil_steps_npt,\n            prod_steps=prod_steps,\n            scratch_basepath=ctx.scratch,\n            shared_basepath=ctx.shared,\n        )\n\n        return {\n            \"repeat_id\": self._inputs[\"repeat_id\"],\n            \"generation\": self._inputs[\"generation\"],\n            **outputs,\n        }\n"
  },
  {
    "path": "src/openfe/protocols/openmm_md/plain_md_settings.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\n\n\"\"\"Settings class for plain MD Protocols using OpenMM + OpenMMTools\n\nThis module implements the settings necessary to run MD simulations using\n:class:`openfe.protocols.openmm_md.plain_md_methods.py`\n\n\"\"\"\n\nfrom gufe.settings import OpenMMSystemGeneratorFFSettings, SettingsBaseModel\nfrom pydantic import ConfigDict, field_validator\n\nfrom openfe.protocols.openmm_utils.omm_settings import (\n    IntegratorSettings,\n    MDOutputSettings,\n    MDSimulationSettings,\n    OpenFFPartialChargeSettings,\n    OpenMMEngineSettings,\n    OpenMMSolvationSettings,\n    Settings,\n)\n\n\nclass PlainMDProtocolSettings(Settings):\n    model_config = ConfigDict(arbitrary_types_allowed=True)\n\n    protocol_repeats: int\n    \"\"\"\n    Number of independent MD runs to perform.\n    \"\"\"\n\n    @field_validator(\"protocol_repeats\")\n    def must_be_positive(cls, v):\n        if v <= 0:\n            errmsg = f\"protocol_repeats must be a positive value, got {v}.\"\n            raise ValueError(errmsg)\n        return v\n\n    # Things for creating the systems\n    forcefield_settings: OpenMMSystemGeneratorFFSettings\n    partial_charge_settings: OpenFFPartialChargeSettings\n    solvation_settings: OpenMMSolvationSettings\n\n    # MD Engine things\n    engine_settings: OpenMMEngineSettings\n\n    # Sampling State defining things\n    integrator_settings: IntegratorSettings\n\n    # Simulation run settings\n    simulation_settings: MDSimulationSettings\n\n    # Simulations output settings\n    output_settings: MDOutputSettings\n"
  },
  {
    "path": "src/openfe/protocols/openmm_rfe/__init__.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\n\nfrom . import _rfe_utils\nfrom .equil_rfe_settings import RelativeHybridTopologyProtocolSettings\nfrom .hybridtop_protocol_results import RelativeHybridTopologyProtocolResult\nfrom .hybridtop_protocols import RelativeHybridTopologyProtocol\nfrom .hybridtop_units import (\n    HybridTopologyMultiStateAnalysisUnit,\n    HybridTopologyMultiStateSimulationUnit,\n    HybridTopologySetupUnit,\n)\n"
  },
  {
    "path": "src/openfe/protocols/openmm_rfe/_rfe_utils/__init__.py",
    "content": "from . import (\n    lambdaprotocol,\n    multistate,\n    relative,\n    topologyhelpers,\n)\n"
  },
  {
    "path": "src/openfe/protocols/openmm_rfe/_rfe_utils/lambdaprotocol.py",
    "content": "# Very slightly adapted from perses https://github.com/choderalab/perses\n# License: MIT\n# OpenFE note: eventually we aim to move this to openmmtools where possible\n\n# turn off formatting since this is mostly vendored code\n# fmt: off\n\nimport copy\nimport warnings\n\nimport numpy as np\nfrom openmmtools.alchemy import AlchemicalState\n\n\nclass LambdaProtocol(object):\n    \"\"\"Protocols for perturbing each of the component energy terms in alchemical\n    free energy simulations.\n\n    TODO\n    ----\n    * Class needs cleaning up and made more consistent\n    \"\"\"\n\n    default_functions = {'lambda_sterics_core':\n                         lambda x: x,\n                         'lambda_electrostatics_core':\n                         lambda x: x,\n                         'lambda_sterics_insert':\n                         lambda x: 2.0 * x if x < 0.5 else 1.0,\n                         'lambda_sterics_delete':\n                         lambda x: 0.0 if x < 0.5 else 2.0 * (x - 0.5),\n                         'lambda_electrostatics_insert':\n                         lambda x: 0.0 if x < 0.5 else 2.0 * (x - 0.5),\n                         'lambda_electrostatics_delete':\n                         lambda x: 2.0 * x if x < 0.5 else 1.0,\n                         'lambda_bonds':\n                         lambda x: x,\n                         'lambda_angles':\n                         lambda x: x,\n                         'lambda_torsions':\n                         lambda x: x\n                         }\n\n    # lambda components for each component,\n    # all run from 0 -> 1 following master lambda\n    def __init__(self, functions='default', windows=10, lambda_schedule=None):\n        \"\"\"Instantiates lambda protocol to be used in a free energy\n        calculation. Can either be user defined, by passing in a dict, or using\n        one of the pregenerated sets by passing in a string 'default', 'namd'\n        or 'quarters'\n\n        All protocols must begin and end at 0 and 1 respectively. Any energy\n        term not defined in `functions` dict will be set to the function in\n        `default_functions`\n\n        Pre-coded options:\n        default : ele and LJ terms of the old system are turned off between\n        0.0 -> 0.5 ele and LJ terms of the new system are turned on between\n        0.5 -> 1.0 core terms treated linearly\n\n        quarters : 0.25 of the protocol is used in turn to individually change\n        the (a) off old ele, (b) off old sterics, (c) on new sterics (d) on new\n        ele core terms treated linearly\n\n        namd : follows the protocol outlined here:\n        https://pubs.acs.org/doi/full/10.1021/acs.jcim.9b00362#\n        Jiang, Wei, Christophe Chipot, and Benoît Roux. \"Computing Relative\n        Binding Affinity of Ligands to Receptor: An Effective Hybrid\n        Single-Dual-Topology Free-Energy Perturbation Approach in NAMD.\"\n        Journal of chemical information and modeling 59.9 (2019): 3794-3802.\n\n        ele-scaled : all terms are treated as in default, except for the old\n        and new ele these are scaled with lambda^0.5, so as to be linear in\n        energy, rather than lambda\n\n        Parameters\n        ----------\n        functions : str or dict\n            One of the predefined lambda protocols\n            ['default','namd','quarters'] or a dictionary. Default \"default\".\n        windows : int\n            Number of windows which this lambda schedule is intended to be used\n            with. This value is used to validate the lambda function.\n        lambda_schedule : list of floats\n            Schedule of lambda windows to be sampled. If ``None`` will default\n            to a linear spacing of windows as defined by\n            ``np.linspace(0. ,1. ,windows)``. Default ``None``.\n\n        Attributes\n        ----------\n        functions : dict\n            Lambda protocol to be used.\n        lambda_schedule : list\n            Schedule of windows to be sampled.\n        \"\"\"\n        self.functions = copy.deepcopy(functions)\n\n        # set the lambda schedule\n        self.lambda_schedule = self._validate_schedule(lambda_schedule,\n                                                       windows)\n        if lambda_schedule:\n            self.lambda_schedule = lambda_schedule\n        else:\n            self.lambda_schedule = np.linspace(0., 1., windows)\n\n        if isinstance(self.functions,  dict):\n            self.type = 'user-defined'\n        elif isinstance(self.functions, str):\n            self.functions = None  # will be set later\n            self.type = functions\n\n        if self.functions is None:\n            if self.type == 'default':\n                self.functions = copy.deepcopy(\n                                     LambdaProtocol.default_functions)\n            elif self.type == 'namd':\n                self.functions = {\n                    'lambda_sterics_core': lambda x: x,\n                    'lambda_electrostatics_core': lambda x: x,\n                    'lambda_sterics_insert': lambda x: (3. / 2.) * x if x < (2. / 3.) else 1.0,\n                    'lambda_sterics_delete': lambda x: 0.0 if x < (1. / 3.) else (x - (1. / 3.)) * (3. / 2.),\n                    'lambda_electrostatics_insert': lambda x: 0.0 if x < 0.5 else 2.0 * (x - 0.5),\n                    'lambda_electrostatics_delete': lambda x: 2.0 * x if x < 0.5 else 1.0,\n                    'lambda_bonds': lambda x: x,\n                    'lambda_angles': lambda x: x,\n                    'lambda_torsions': lambda x: x\n                }\n            elif self.type == 'quarters':\n                self.functions = {\n                    'lambda_sterics_core': lambda x: x,\n                    'lambda_electrostatics_core': lambda x: x,\n                    'lambda_sterics_insert': lambda x: 0. if x < 0.5 else 1 if x > 0.75 else 4 * (x - 0.5),\n                    'lambda_sterics_delete': lambda x: 0. if x < 0.25 else 1 if x > 0.5 else 4 * (x - 0.25),\n                    'lambda_electrostatics_insert': lambda x: 0. if x < 0.75 else 4 * (x - 0.75),\n                    'lambda_electrostatics_delete': lambda x: 4.0 * x if x < 0.25 else 1.0,\n                    'lambda_bonds': lambda x: x,\n                    'lambda_angles': lambda x: x,\n                    'lambda_torsions': lambda x: x\n                }\n            elif self.type == 'ele-scaled':\n                self.functions = {\n                    'lambda_electrostatics_insert': lambda x: 0.0 if x < 0.5 else ((2*(x-0.5))**0.5),\n                    'lambda_electrostatics_delete': lambda x: (2*x)**2 if x < 0.5 else 1.0\n                }\n            elif self.type == 'user-defined':\n                self.functions = functions\n            else:\n                errmsg = f\"LambdaProtocol type : {self.type} not recognised \"\n                raise ValueError(errmsg)\n\n        self._validate_functions(n=windows)\n        self._check_for_naked_charges()\n\n    @staticmethod\n    def _validate_schedule(schedule, windows):\n        \"\"\"\n        Checks that the input lambda schedule is valid.\n\n        Rules are:\n          - Must begin at 0 and end at 1\n          - Must be monotonically increasing\n\n        Parameters\n        ----------\n        schedule : list of floats\n            The lambda schedule. If ``None`` the method returns\n            ``np.linspace(0. ,1. ,windows)``.\n        windows : int\n            Number of windows to be sampled.\n\n        Returns\n        -------\n        schedule : list of floats\n            A valid lambda schedule.\n        \"\"\"\n        if schedule is None:\n            return np.linspace(0., 1., windows)\n\n        # Check end states\n        if schedule[0] != 0 or schedule[-1] != 1:\n            errmsg = (\"end and start lambda windows must be lambda 0 and 1 \"\n                      \"respectively\")\n            raise ValueError(errmsg)\n\n        # Check monotonically increasing\n        difference = np.diff(schedule)\n\n        if not all(i >= 0. for i in difference):\n            errmsg = \"The lambda schedule is not monotonic\"\n            raise ValueError(errmsg)\n\n        return schedule\n\n    def _validate_functions(self, n=10):\n        \"\"\"Ensures that all the lambda functions adhere to the rules:\n            - must begin at 0.\n            - must finish at 1.\n            - must be monotonically increasing\n\n        Parameters\n        ----------\n        n : int, default 10\n            number of grid points used to check monotonicity\n        \"\"\"\n        # the individual lambda functions that must be defined for\n        required_functions = list(LambdaProtocol.default_functions.keys())\n\n        for function in required_functions:\n            if function not in self.functions:\n                # IA switched from warn to error here\n                errmsg = (f\"function {function} is missing from \"\n                          \"self.lambda_functions.\")\n                raise ValueError(errmsg)\n\n            # Check that the function starts and ends at 0 and 1 respectively\n            if self.functions[function](0) != 0:\n                raise ValueError(\"lambda functions must start at 0\")\n            if self.functions[function](1) != 1:\n                raise ValueError(\"lambda functions must end at 1\")\n\n            # now validatate that it's monotonic\n            global_lambda = np.linspace(0., 1., n)\n            sub_lambda = [self.functions[function](lam) for\n                          lam in global_lambda]\n            difference = np.diff(sub_lambda)\n\n            if not all(i >= 0. for i in difference):\n                wmsg = (f\"The function {function} is not monotonic as \"\n                        \"typically expected.\")\n                warnings.warn(wmsg)\n\n    def _check_for_naked_charges(self):\n        \"\"\"\n        Checks that there are no cases where atoms have charge but no sterics.\n\n        This avoids issues with singularities and/or excessive forces near\n        the end states (even when using softcore electrostatics).\n        \"\"\"\n        global_lambda = self.lambda_schedule\n\n        def check_overlap(ele, sterics, global_lambda, functions, endstate):\n            for lam in global_lambda:\n                ele_val = functions[ele](lam)\n                ster_val = functions[sterics](lam)\n                # if charge > 0 and sterics == 0 raise error\n                if ele_val != endstate and ster_val == endstate:\n                    errmsg = (\"There are states along this lambda schedule \"\n                              \"where there are atoms with charges but no LJ \"\n                              f\"interactions: {lam} {ele_val} {ster_val}\")\n                    raise ValueError(errmsg)\n\n        # checking unique new terms first\n        ele = 'lambda_electrostatics_insert'\n        sterics = 'lambda_sterics_insert'\n        check_overlap(ele, sterics, global_lambda, self.functions, endstate=0)\n\n        # checking unique old terms now\n        ele = 'lambda_electrostatics_delete'\n        sterics = 'lambda_sterics_delete'\n        check_overlap(ele, sterics, global_lambda, self.functions, endstate=1)\n\n    def get_functions(self):\n        return self.functions\n\n    def plot_functions(self, lambda_schedule=None):\n        \"\"\"\n        Plot the function for ease of visualisation.\n\n        Parameters\n        ----------\n        schedule : np.ndarray\n            The lambda schedule to plot the function along. If ``None`` plot\n            the one stored within this class. Default ``None``.\n        \"\"\"\n        import matplotlib.pyplot as plt\n\n        fig = plt.figure(figsize=(10, 5))\n\n        global_lambda = lambda_schedule if lambda_schedule else self.lambda_schedule\n\n        for f in self.functions:\n            plt.plot(global_lambda,\n                     [self.functions[f](lam) for lam in global_lambda],\n                     alpha=0.5, label=f)\n\n        plt.xlabel('global lambda')\n        plt.ylabel('sub-lambda')\n        plt.legend()\n        plt.show()\n\n\nclass RelativeAlchemicalState(AlchemicalState):\n    \"\"\"\n    Relative AlchemicalState to handle all lambda parameters required for\n    relative perturbations\n    lambda = 1 refers to ON, i.e. fully interacting while\n    lambda = 0 refers to OFF, i.e. non-interacting with the system\n    all lambda functions will follow from 0 -> 1 following the master lambda\n    lambda*core parameters perturb linearly\n    lambda_sterics_insert and lambda_electrostatics_delete perturb in the\n    first half of the protocol 0 -> 0.5\n    lambda_sterics_delete and lambda_electrostatics_insert perturb in the\n    second half of the protocol 0.5 -> 1\n\n    Attributes\n    ----------\n    lambda_sterics_core\n    lambda_electrostatics_core\n    lambda_sterics_insert\n    lambda_sterics_delete\n    lambda_electrostatics_insert\n    lambda_electrostatics_delete\n    \"\"\"\n\n    class _LambdaParameter(AlchemicalState._LambdaParameter):\n        pass\n\n    lambda_sterics_core = _LambdaParameter('lambda_sterics_core')\n    lambda_electrostatics_core = _LambdaParameter('lambda_electrostatics_core')\n    lambda_sterics_insert = _LambdaParameter('lambda_sterics_insert')\n    lambda_sterics_delete = _LambdaParameter('lambda_sterics_delete')\n    lambda_electrostatics_insert = _LambdaParameter(\n                                       'lambda_electrostatics_insert')\n    lambda_electrostatics_delete = _LambdaParameter(\n                                      'lambda_electrostatics_delete')\n\n    def set_alchemical_parameters(self, global_lambda,\n                                  lambda_protocol=LambdaProtocol()):\n        \"\"\"Set each lambda value according to the lambda_functions protocol.\n        The undefined parameters (i.e. those being set to None) remain\n        undefined.\n        Parameters\n        ----------\n        lambda_value : float\n            The new value for all defined parameters.\n        \"\"\"\n        self.global_lambda = global_lambda\n        for parameter_name in lambda_protocol.functions:\n            lambda_value = lambda_protocol.functions[parameter_name](global_lambda)\n            setattr(self, parameter_name, lambda_value)\n"
  },
  {
    "path": "src/openfe/protocols/openmm_rfe/_rfe_utils/multistate.py",
    "content": "#############################################################################\n# HYBRID SYSTEM SAMPLERS\n#############################################################################\n\"\"\"\nThis is adapted from Perses: https://github.com/choderalab/perses/\nSee here for the license: https://github.com/choderalab/perses/blob/main/LICENSE\n\"\"\"\n# turn off formatting since this is mostly vendored code\n# fmt: off\n\nimport copy\nimport logging\nimport warnings\n\nimport numpy as np\nimport openmm\nimport openmmtools.states as states\nfrom openmm import unit\nfrom openmmtools import cache\nfrom openmmtools.integrators import FIREMinimizationIntegrator\nfrom openmmtools.multistate import multistatesampler, replicaexchange, sams\nfrom openmmtools.states import CompoundThermodynamicState, SamplerState, ThermodynamicState\n\nfrom .lambdaprotocol import RelativeAlchemicalState\n\nlogger = logging.getLogger(__name__)\n\n\nclass HybridCompatibilityMixin:\n    \"\"\"\n    Mixin that allows the MultistateSampler to accommodate the situation where\n    unsampled endpoints have a different number of degrees of freedom.\n    \"\"\"\n\n    def __init__(\n        self,\n        *args,\n        hybrid_system: openmm.System | None = None,\n        hybrid_positions: unit.Quantity | None = None,\n        **kwargs\n    ):\n        self._hybrid_system = hybrid_system\n        self._hybrid_positions = hybrid_positions\n        super(HybridCompatibilityMixin, self).__init__(*args, **kwargs)\n\n    def setup(self, reporter, lambda_protocol,\n              temperature=298.15 * unit.kelvin, n_replicas=None,\n              endstates=True, minimization_steps=100,\n              minimization_platform=\"CPU\"):\n        \"\"\"\n        Setup MultistateSampler based on the input lambda protocol and number\n        of replicas.\n\n        Parameters\n        ----------\n        reporter : OpenMM reporter\n            Simulation reporter to attach to each simulation replica.\n        lambda_protocol : LambdaProtocol\n            The lambda protocol to be used for simulation. Default to a default\n            class creation of LambdaProtocol.\n        temperature : openmm.Quantity\n            Simulation temperature, default to 298.15 K\n        n_replicas : int\n            Number of replicas to simulate. Sets to the number of lambda\n            states (as defined by lambda_protocol) if ``None``.\n            Default ``None``.\n        endstates : bool\n            Whether or not to generate unsampled endstates (i.e. dispersion\n            correction).\n        minimization_steps : Optional[int]\n            Number of steps to pre-minimize states.\n        minimization_platform : str\n            Platform to do the initial pre-minimization with.\n\n        Attributes\n        ----------\n        n_states : int\n            Number of states / windows which are to be sampled. Obtained from\n            lambda_protocol.\n        \"\"\"\n        n_states = len(lambda_protocol.lambda_schedule)\n\n        lambda_zero_state = RelativeAlchemicalState.from_system(self._hybrid_system)\n\n        thermostate = ThermodynamicState(\n            self._hybrid_system,\n            temperature=temperature\n        )\n\n        compound_thermostate = CompoundThermodynamicState(\n            thermostate,\n            composable_states=[lambda_zero_state]\n        )\n\n        # create lists for storing thermostates and sampler states\n        thermodynamic_state_list = []\n        sampler_state_list = []\n\n        if n_replicas is None:\n            msg = (f\"setting number of replicas to number of states: {n_states}\")\n            warnings.warn(msg)\n            n_replicas = n_states\n        elif n_replicas > n_states:\n            wmsg = (f\"More sampler states: {n_replicas} requested than the \"\n                    f\"number of available states: {n_states}. Setting \"\n                    \"the number of replicas to the number of states\")\n            warnings.warn(wmsg)\n            n_replicas = n_states\n\n        lambda_schedule = lambda_protocol.lambda_schedule\n        if len(lambda_schedule) != n_states:\n            errmsg = (\"length of lambda_schedule must match the number of \"\n                      \"states, n_states\")\n            raise ValueError(errmsg)\n\n        # starting with the hybrid factory positions\n        box = self._hybrid_system.getDefaultPeriodicBoxVectors()\n        sampler_state = SamplerState(\n            self._hybrid_positions,\n            box_vectors=box\n        )\n\n        # Loop over the lambdas and create & store a compound thermostate at\n        # that lambda value\n        for lambda_val in lambda_schedule:\n            compound_thermostate_copy = copy.deepcopy(compound_thermostate)\n            compound_thermostate_copy.set_alchemical_parameters(\n                lambda_val,\n                lambda_protocol\n            )\n            thermodynamic_state_list.append(compound_thermostate_copy)\n\n            # now generating a sampler_state for each thermodyanmic state,\n            # with relaxed positions\n            # Note: remove once  choderalab/openmmtools#672 is completed\n            minimize(compound_thermostate_copy, sampler_state,\n                     max_iterations=minimization_steps,\n                     platform_name=minimization_platform)\n            sampler_state_list.append(copy.deepcopy(sampler_state))\n\n        del compound_thermostate, sampler_state\n\n        # making sure number of sampler states equals n_replicas\n        if len(sampler_state_list) != n_replicas:\n            # picking roughly evenly spaced sampler states\n            # if n_replicas == 1, then it will pick the first in the list\n            samples = np.linspace(0, len(sampler_state_list) - 1,\n                                  n_replicas)\n            idx = np.round(samples).astype(int)\n            sampler_state_list = [state for i, state in\n                                  enumerate(sampler_state_list) if i in idx]\n\n        assert len(sampler_state_list) == n_replicas\n\n        if endstates:\n            # generating unsampled endstates\n            unsampled_dispersion_endstates = create_endstates(\n                copy.deepcopy(thermodynamic_state_list[0]),\n                copy.deepcopy(thermodynamic_state_list[-1])\n            )\n            self.create(thermodynamic_states=thermodynamic_state_list,\n                        sampler_states=sampler_state_list, storage=reporter,\n                        unsampled_thermodynamic_states=unsampled_dispersion_endstates)\n        else:\n            self.create(thermodynamic_states=thermodynamic_state_list,\n                        sampler_states=sampler_state_list, storage=reporter)\n\n\nclass HybridRepexSampler(HybridCompatibilityMixin,\n                         replicaexchange.ReplicaExchangeSampler):\n    \"\"\"\n    ReplicaExchangeSampler that supports unsampled end states with a different\n    number of positions\n    \"\"\"\n\n    def __init__(\n        self,\n        *args,\n        hybrid_system: openmm.System | None = None,\n        hybrid_positions: unit.Quantity | None = None,\n        **kwargs\n    ):\n        super(HybridRepexSampler, self).__init__(\n            *args,\n            hybrid_system=hybrid_system,\n            hybrid_positions=hybrid_positions,\n            **kwargs\n        )\n\n\nclass HybridSAMSSampler(HybridCompatibilityMixin, sams.SAMSSampler):\n    \"\"\"\n    SAMSSampler that supports unsampled end states with a different number\n    of positions\n    \"\"\"\n\n    def __init__(\n        self,\n        *args,\n        hybrid_system: openmm.System | None = None,\n        hybrid_positions: unit.Quantity | None = None,\n        **kwargs\n    ):\n        super(HybridSAMSSampler, self).__init__(\n            *args,\n            hybrid_system=hybrid_system,\n            hybrid_positions=hybrid_positions,\n            **kwargs\n        )\n\n\nclass HybridMultiStateSampler(HybridCompatibilityMixin,\n                              multistatesampler.MultiStateSampler):\n    \"\"\"\n    MultiStateSampler that supports unsample end states with a different\n    number of positions\n    \"\"\"\n    def __init__(\n        self,\n        *args,\n        hybrid_system: openmm.System | None = None,\n        hybrid_positions: unit.Quantity | None = None,\n        **kwargs\n    ):\n        super(HybridMultiStateSampler, self).__init__(\n            *args,\n            hybrid_system=hybrid_system,\n            hybrid_positions=hybrid_positions,\n            **kwargs\n        )\n\n\ndef create_endstates(first_thermostate, last_thermostate):\n    \"\"\"\n    Utility function to generate unsampled endstates\n    1. Move all alchemical atom LJ parameters from CustomNonbondedForce to\n       NonbondedForce.\n    2. Delete the CustomNonbondedForce.\n    3. Set PME tolerance to 1e-5.\n    4. Enable LJPME to handle long range dispersion corrections in a physically\n       reasonable manner.\n\n    Parameters\n    ----------\n    first_thermostate : openmmtools.states.CompoundThermodynamicState\n        The first thermodynamic state for which an unsampled endstate will be\n        created.\n    last_thermostate : openmmtools.states.CompoundThermodynamicState\n        The last thermodynamic state for which an unsampled endstate will be\n        created.\n\n    Returns\n    -------\n    unsampled_endstates : list of openmmtools.states.CompoundThermodynamicState\n        The corrected unsampled endstates.\n    \"\"\"\n    unsampled_endstates = []\n    for master_lambda, endstate in zip([0., 1.],\n                                       [first_thermostate, last_thermostate]):\n        dispersion_system = endstate.get_system()\n        energy_unit = unit.kilocalories_per_mole\n        # Find the NonbondedForce (there must be only one)\n        forces = {force.__class__.__name__: force for\n                  force in dispersion_system.getForces()}\n        # Set NonbondedForce to use LJPME\n        ljpme = openmm.NonbondedForce.LJPME\n        forces['NonbondedForce'].setNonbondedMethod(ljpme)\n        # Set tight PME tolerance\n        TIGHT_PME_TOLERANCE = 1.0e-5\n        forces['NonbondedForce'].setEwaldErrorTolerance(TIGHT_PME_TOLERANCE)\n        # Move alchemical LJ sites from CustomNonbondedForce back to\n        # NonbondedForce\n        for particle_index in range(forces['NonbondedForce'].getNumParticles()):\n            charge, sigma, epsilon = forces['NonbondedForce'].getParticleParameters(particle_index)\n            sigmaA, epsilonA, sigmaB, epsilonB, unique_old, unique_new = forces['CustomNonbondedForce'].getParticleParameters(particle_index)\n            if (epsilon/energy_unit == 0.0) and ((epsilonA > 0.0) or (epsilonB > 0.0)):\n                sigma = (1-master_lambda)*sigmaA + master_lambda*sigmaB\n                epsilon = (1-master_lambda)*epsilonA + master_lambda*epsilonB\n                forces['NonbondedForce'].setParticleParameters(\n                                             particle_index, charge,\n                                             sigma, epsilon)\n\n        # Delete the CustomNonbondedForce since we have moved all alchemical\n        # particles out of it\n        for force_index, force in enumerate(list(dispersion_system.getForces())):\n            if force.__class__.__name__ == 'CustomNonbondedForce':\n                custom_nonbonded_force_index = force_index\n                break\n\n        dispersion_system.removeForce(custom_nonbonded_force_index)\n        # Set all parameters to master lambda\n        for force_index, force in enumerate(list(dispersion_system.getForces())):\n            if hasattr(force, 'getNumGlobalParameters'):\n                for parameter_index in range(force.getNumGlobalParameters()):\n                    if force.getGlobalParameterName(parameter_index)[0:7] == 'lambda_':\n                        force.setGlobalParameterDefaultValue(parameter_index,\n                                                             master_lambda)\n\n        # Store the unsampled endstate\n        unsampled_endstates.append(ThermodynamicState(\n            dispersion_system, temperature=endstate.temperature))\n\n    return unsampled_endstates\n\n\ndef minimize(thermodynamic_state: states.ThermodynamicState,\n             sampler_state: states.SamplerState,\n             max_iterations: int=100,\n             platform_name: str=\"CPU\") -> states.SamplerState:\n    \"\"\"\n    Adapted from perses.dispersed.feptasks.minimize\n\n    Minimize the given system and state, up to a maximum number of steps.\n    This does not return a copy of the samplerstate; it is an update-in-place.\n\n    Parameters\n    ----------\n    thermodynamic_state : openmmtools.states.ThermodynamicState\n        The state at which the system could be minimized\n    sampler_state : openmmtools.states.SamplerState\n        The starting state at which to minimize the system.\n    max_iterations : Optional[int]\n        The maximum number of minimization steps. Default is 100.\n    platform_name : str\n        The OpenMM platform name to carry out the minimization with.\n\n    Returns\n    -------\n    sampler_state : openmmtools.states.SamplerState\n        The positions and accompanying state following minimization\n    \"\"\"\n    # Only run a minimization if max_iterations is not None\n    if max_iterations is not None:\n        # we won't take any steps, so use a simple integrator\n        integrator = openmm.VerletIntegrator(1.0)\n        platform = openmm.Platform.getPlatformByName(platform_name)\n        dummy_cache = cache.DummyContextCache(platform=platform)\n        context, integrator = dummy_cache.get_context(\n            thermodynamic_state, integrator\n        )\n        try:\n            sampler_state.apply_to_context(\n                context, ignore_velocities=True\n            )\n            openmm.LocalEnergyMinimizer.minimize(\n                context, maxIterations=max_iterations\n            )\n            sampler_state.update_from_context(context)\n        finally:\n            del context, integrator, dummy_cache\n"
  },
  {
    "path": "src/openfe/protocols/openmm_rfe/_rfe_utils/relative.py",
    "content": "# This code is a slightly modified version of the HybridTopologyFactory code\n# from https://github.com/choderalab/perses\n# The eventual goal is to move a version of this towards openmmtools\n# LICENSE: MIT\n\n# turn off formatting since this is mostly vendored code\n# fmt: off\n\nimport copy\nimport itertools\nimport logging\n\nimport mdtraj as mdt\nimport numpy as np\nimport openmm\nfrom openmm import app, unit\n\n# OpenMM constant for Coulomb interactions (implicitly in md_unit_system units)\nfrom openmmtools.constants import ONE_4PI_EPS0\n\nlogger = logging.getLogger(__name__)\n\n\nclass HybridTopologyFactory:\n    \"\"\"\n    This class generates a hybrid topology based on two input systems and an\n    atom mapping. For convenience the states are called \"old\" and \"new\"\n    respectively, defining the starting and end states along the alchemical\n    transformation.\n\n    The input systems are assumed to have:\n        1. The total number of molecules\n        2. The same coordinates for equivalent atoms\n\n    Atoms in the resulting hybrid system are treated as being from one\n    of four possible types:\n\n    unique_old_atom : These atoms are not mapped and only present in the old\n        system. Their interactions will be on for lambda=0, off for lambda=1\n    unique_new_atom : These atoms are not mapped and only present in the new\n        system. Their interactions will be off for lambda=0, on for lambda=1\n    core_atom : These atoms are mapped between the two end states, and are\n        part of a residue that is changing alchemically. Their interactions\n        will be those corresponding to the old system at lambda=0, and those\n        corresponding to the new system at lambda=1\n    environment_atom : These atoms are mapped between the two end states, and\n        are not part of a residue undergoing an alchemical change. Their\n        interactions are always on and are alchemically unmodified.\n\n    Properties\n    ----------\n    hybrid_system : openmm.System\n        The hybrid system for simulation\n    new_to_hybrid_atom_map : dict of int : int\n        The mapping of new system atoms to hybrid atoms\n    old_to_hybrid_atom_map : dict of int : int\n        The mapping of old system atoms to hybrid atoms\n    hybrid_positions : [n, 3] np.ndarray\n        The positions of the hybrid system\n    hybrid_topology : mdtraj.Topology\n        The topology of the hybrid system\n    omm_hybrid_topology : openmm.app.Topology\n        The OpenMM topology object corresponding to the hybrid system\n\n    .. warning :: This API is experimental and subject to change.\n\n    Notes\n    -----\n    * Logging has been removed and will be revamped at a later date.\n    * The ability to define custom functions has been removed for now.\n    * Neglected angle terms have been removed for now.\n    * RMSD restraint option has been removed for now.\n    * Endstate support has been removed for now.\n    * Bond softening has been removed for now.\n    * Unused InteractionGroup code paths have been removed.\n\n    TODO\n    ----\n    * Document how positions for hybrid system are constructed.\n    * Allow support for annealing in omitted terms.\n    * Implement omitted terms (this was not available in the original class).\n\n    \"\"\"\n\n    def __init__(self,\n                 old_system, old_positions, old_topology,\n                 new_system, new_positions, new_topology,\n                 old_to_new_atom_map, old_to_new_core_atom_map,\n                 use_dispersion_correction=False,\n                 softcore_alpha=0.5,\n                 softcore_LJ_v2=True,\n                 softcore_LJ_v2_alpha=0.85,\n                 interpolate_old_and_new_14s=False):\n        \"\"\"\n        Initialize the Hybrid topology factory.\n\n        Parameters\n        ----------\n        old_system : openmm.System\n            OpenMM system defining the \"old\" (i.e. starting) state.\n        old_positions : [n,3] np.ndarray of float\n            The positions of the \"old system\".\n        old_topology : openmm.Topology\n            OpenMM topology defining the \"old\" state.\n        new_system: opemm.System\n            OpenMM system defining the \"new\" (i.e. end) state.\n        new_positions : [m,3] np.ndarray of float\n            The positions of the \"new system\"\n        new_topology : openmm.Topology\n            OpenMM topology defining the \"new\" state.\n        old_to_new_atom_map : dict of int : int\n            Dictionary of corresponding atoms between the old and new systems.\n            Unique atoms are not included in this atom map.\n        old_to_new_core_atom_map : dict of int : int\n            Dictionary of corresponding atoms between the alchemical \"core\n            atoms\" (i.e. residues which are changing) between the old and\n            new systems.\n        use_dispersion_correction : bool, default False\n            Whether to use the long range correction in the custom sterics\n            force. This can be very expensive for NCMC.\n        softcore_alpha: float, default None\n            \"alpha\" parameter of softcore sterics, default 0.5.\n        softcore_LJ_v2 : bool, default True\n            Implement the softcore LJ as defined by Gapsys et al. JCTC 2012.\n        softcore_LJ_v2_alpha : float, default 0.85\n            Softcore alpha parameter for LJ v2\n        interpolate_old_and_new_14s : bool, default False\n            Whether to turn off interactions for new exceptions (not just\n            1,4s) at lambda = 0 and old exceptions at lambda = 1; if False,\n            they are present in the nonbonded force.\n        \"\"\"\n\n        # Assign system positions and force\n        # IA - Are deep copies really needed here?\n        self._old_system = copy.deepcopy(old_system)\n        self._old_positions = old_positions\n        self._old_topology = old_topology\n        self._new_system = copy.deepcopy(new_system)\n        self._new_positions = new_positions\n        self._new_topology = new_topology\n        self._hybrid_system_forces = dict()\n\n        # Set mappings (full, core, and env maps)\n        self._set_mappings(old_to_new_atom_map, old_to_new_core_atom_map)\n\n        # Other options\n        self._use_dispersion_correction = use_dispersion_correction\n        self._interpolate_14s = interpolate_old_and_new_14s\n\n        # Sofcore options\n        self._softcore_alpha = softcore_alpha\n        self._check_bounds(softcore_alpha, \"softcore_alpha\")  # [0,1] check\n\n        self._softcore_LJ_v2 = softcore_LJ_v2\n        if self._softcore_LJ_v2:\n            self._check_bounds(softcore_LJ_v2_alpha, \"softcore_LJ_v2_alpha\")\n            self._softcore_LJ_v2_alpha = softcore_LJ_v2_alpha\n\n        # TODO: end __init__ here and move everything else to\n        # create_hybrid_system() or equivalent\n\n        self._check_and_store_system_forces()\n\n        logger.info(\"Creating hybrid system\")\n        # Create empty system that will become the hybrid system\n        self._hybrid_system = openmm.System()\n\n        # Add particles to system\n        self._add_particles()\n\n        # Add box + barostat\n        self._handle_box()\n\n        # Assign atoms to one of the classes described in the class docstring\n        # Renamed from original _determine_atom_classes\n        self._set_atom_classes()\n\n        # Construct dictionary of exceptions in old and new systems\n        self._old_system_exceptions = self._generate_dict_from_exceptions(\n            self._old_system_forces['NonbondedForce'])\n        self._new_system_exceptions = self._generate_dict_from_exceptions(\n            self._new_system_forces['NonbondedForce'])\n\n        # check for exceptions clashes between unique and env atoms\n        self._validate_disjoint_sets()\n\n        logger.info(\"Setting force field terms\")\n        # Copy constraints, checking to make sure they are not changing\n        self._handle_constraints()\n\n        # Copy over relevant virtual sites - pick up refactor from here\n        self._handle_virtual_sites()\n\n        # TODO - move to a single method call? Would be good to group these\n        # Call each of the force methods to add the corresponding force terms\n        # and prepare the forces:\n        self._add_bond_force_terms()\n\n        self._add_angle_force_terms()\n\n        self._add_torsion_force_terms()\n\n        has_nonbonded_force = ('NonbondedForce' in self._old_system_forces or\n                               'NonbondedForce' in self._new_system_forces)\n\n        if has_nonbonded_force:\n            self._add_nonbonded_force_terms()\n\n        # Call each force preparation method to generate the actual\n        # interactions that we need:\n        logger.info(\"Adding forces\")\n        self._handle_harmonic_bonds()\n\n        self._handle_harmonic_angles()\n\n        self._handle_periodic_torsion_force()\n\n        # add cmap terms if possible\n        self._handle_cmap_torsion_force()\n\n        if has_nonbonded_force:\n            self._handle_nonbonded()\n            if not (len(self._old_system_exceptions.keys()) == 0 and\n                    len(self._new_system_exceptions.keys()) == 0):\n                self._handle_old_new_exceptions()\n\n        # Get positions for the hybrid\n        self._hybrid_positions = self._compute_hybrid_positions()\n\n        # Get an MDTraj topology for writing\n        self._hybrid_topology = self._create_mdtraj_topology()\n        self._omm_hybrid_topology = self._create_hybrid_topology()\n        logger.info(\"Hybrid system created\")\n\n    @staticmethod\n    def _verify_cmap_compatibility(\n        cmap_old: openmm.CMAPTorsionForce,\n        cmap_new: openmm.CMAPTorsionForce,\n    ) -> tuple[\n        int,\n        int,\n        int,\n        int,\n    ]:\n        \"\"\"\n        Verify CMAPTorsionForce compatibility between two systems.\n\n        Parameters\n        ----------\n        cmap_old : openmm.CMAPTorsionForce\n           CMAPTorsionForce from the old system\n        cmap_new : openmm.CMAPTorsionForce\n           CMAPTorsionForce from the new system\n\n        Returns\n        -------\n        tuple\n            (old_num_maps, new_num_maps, old_num_torsions, new_num_torsions)\n            four integers describing the number of maps and\n            torsions in each force.\n\n        Raises\n        ------\n        RuntimeError\n           If only one of the forces is present, or if the number of maps or the\n           number of torsions differs between the two forces.\n        \"\"\"\n        logger.info(\"CMAPTorsionForce found checking compatibility\")\n\n        # some quick checks on compatibility like the number of maps and total number of terms\n        old_num_maps = cmap_old.getNumMaps()\n        new_num_maps = cmap_new.getNumMaps()\n        if old_num_maps != new_num_maps:\n            raise RuntimeError(\n                f\"Incompatible CMAPTorsionForce between end states expected to have same number of maps, \"\n                f\"found old: {old_num_maps} and new: {new_num_maps}\")\n\n        old_num_torsions = cmap_old.getNumTorsions()\n        new_num_torsions = cmap_new.getNumTorsions()\n        if old_num_torsions != new_num_torsions:\n            raise RuntimeError(\n                f\"Incompatible CMAPTorsionForce between end states expected to have same number of torsions, \"\n                f\"found old: {old_num_torsions} and new: {new_num_torsions}\")\n\n        return old_num_maps, new_num_maps, old_num_torsions, new_num_torsions\n\n    def _handle_cmap_torsion_force(self):\n        \"\"\"\n        This method does the following in order:\n            - Some basic checks that the CMAPTorsionForce exists in both old/new systems.\n            - Adds the CMAPTorsionForce from the old system\n            - Checks that the new system CMAPTorsionForce terms are equal to the old system's (we do not allow for alchemically changing CMAP terms).\n        \"\"\"\n        cmap_old = self._old_system_forces.get(\"CMAPTorsionForce\", None)\n        cmap_new = self._new_system_forces.get(\"CMAPTorsionForce\", None)\n\n        # if only one has cmap raise an error\n        if (cmap_new is None) ^ (cmap_old is None):\n            raise RuntimeError(f\"Inconsistent CMAPTorsionForce between end states expected to be present in both\"\n                               f\"but found in old: {bool(cmap_old)} and new: {bool(cmap_new)}\")\n\n        if cmap_new == cmap_old is None:\n            logger.info(\"No CMAPTorsionForce found. Skipping adding force.\")\n            return\n\n        # verify compatibility and extract numbers of maps and torsions\n        (\n            old_num_maps,\n            new_num_maps,\n            old_num_torsions,\n            new_num_torsions\n        ) = self._verify_cmap_compatibility(\n            cmap_old, cmap_new\n        )\n\n        logger.info(\"Adding CMAPTorsionForce to hybrid system\")\n        # start looping through the old system terms and add them to the hybrid system\n        # track the terms we add so we can cross compare with the new system and also make sure we don't hit\n        # an index in the alchemical region\n        hybrid_cmap_force = openmm.CMAPTorsionForce()\n        self._hybrid_system.addForce(hybrid_cmap_force)\n        self._hybrid_system_forces[\"cmap_torsion_force\"] = hybrid_cmap_force\n\n        old_system_maps = {}\n        old_system_terms = {}\n\n        logger.info(\"Adding CMAP forces\")\n        # add all the old maps\n        for i in range(old_num_maps):\n            size, energy = cmap_old.getMapParameters(i)\n            old_system_maps[i] = (size, energy)\n            # also add the map to the hybrid system\n            hybrid_cmap_force.addMap(size, energy)\n\n        logger.info(\"Adding CMAP force terms\")\n        # now add the terms we need to map from the old to the new index\n        old_to_hybrid_index = self._old_to_hybrid_map\n        new_to_hybrid_index = self._new_to_hybrid_map\n        for i in range(old_num_torsions):\n            # get the parameters for the torsion using the same notation as OpenMM\n            map_index, a1, a2, a3, a4, b1, b2, b3, b4 = cmap_old.getTorsionParameters(i)\n            atom_ids = [a1, a2, a3, a4, b1, b2, b3, b4]\n            # map to hybrid indices\n            hybrid_atom_ids = [old_to_hybrid_index[a_id] for a_id in atom_ids]\n            # add to the hybrid system using the hybrid index\n            hybrid_cmap_force.addTorsion(map_index, *hybrid_atom_ids)\n            # track the atoms we add in the hybrid system to cross compare with new system\n            old_system_terms[tuple(hybrid_atom_ids)] = map_index\n\n        # gather all alchemical atoms, use a copy so we don't change the groups\n        alchemical_atoms = self._atom_classes[\"core_atoms\"].copy()\n        alchemical_atoms.update(self._atom_classes[\"unique_old_atoms\"], self._atom_classes[\"unique_new_atoms\"])\n        # check if any of the atoms added are in the alchemical region\n        old_added_atoms = {atom_id for atoms in old_system_terms.keys() for atom_id in atoms}\n        if overlap_atoms := alchemical_atoms.intersection(old_added_atoms):\n            raise RuntimeError(\n                f\"Incompatible CMAPTorsionForce term found in alchemical region for old system atoms {overlap_atoms}\")\n\n        # now loop over the new system force and check the terms are compatible\n        # we expect to add no new terms\n        for i in range(new_num_maps):\n            size, energy = cmap_new.getMapParameters(i)\n            if (size, energy) != old_system_maps[i]:\n                raise RuntimeError(f\"Incompatible CMAPTorsionForce map parameters found between end states for map {i} \"\n                                   f\"expected {old_system_maps[i]} found {(size, energy)}\")\n\n        for i in range(new_num_torsions):\n            map_index, a1, a2, a3, a4, b1, b2, b3, b4 = cmap_new.getTorsionParameters(i)\n            atom_ids = [a1, a2, a3, a4, b1, b2, b3, b4]\n            # map to hybrid indices\n            hybrid_atom_ids = [new_to_hybrid_index[a_id] for a_id in atom_ids]\n            # check its in the old system terms\n            if tuple(hybrid_atom_ids) not in old_system_terms.keys():\n                raise RuntimeError(\n                    f\"Incompatible CMAPTorsionForce term found between end states for atoms {hybrid_atom_ids} \"\n                    f\"not found in old system terms.\")\n            # check the map index is the same\n            if map_index != old_system_terms[tuple(hybrid_atom_ids)]:\n                raise RuntimeError(\n                    f\"Incompatible CMAPTorsionForce map index found between end states for atoms {hybrid_atom_ids} \"\n                    f\"expected {old_system_terms[tuple(hybrid_atom_ids)]} found {map_index}\")\n        logger.info(\"CMAPTorsionForce added to the hybrid system\")\n\n    @staticmethod\n    def _check_bounds(value, varname, minmax=(0, 1)):\n        \"\"\"\n        Convenience method to check the bounds of a value.\n\n        Parameters\n        ----------\n        value : float\n            Value to evaluate.\n        varname : str\n            Name of value to raise in error message\n        minmax : tuple\n            Two element tuple with the lower and upper bounds to check.\n\n        Raises\n        ------\n        AssertionError\n            If value is lower or greater than bounds.\n        \"\"\"\n        if value < minmax[0] or value > minmax[1]:\n            raise AssertionError(f\"{varname} is not in {minmax}\")\n\n    @staticmethod\n    def _invert_dict(dictionary):\n        \"\"\"\n        Convenience method to invert a dictionary (since we do it so often).\n\n        Parameters:\n        ----------\n        dictionary : dict\n            Dictionary you want to invert\n        \"\"\"\n        return {v: k for k, v in dictionary.items()}\n\n    def _set_mappings(self, old_to_new_map, core_old_to_new_map):\n        \"\"\"\n        Parameters\n        ----------\n        old_to_new_map : dict of int : int\n            Dictionary mapping atoms between the old and new systems.\n\n        Notes\n        -----\n        * For now this directly sets the system, core and env old_to_new_map,\n          new_to_old_map, an empty new_to_hybrid_map and an empty\n          old_to_hybrid_map. In the future this will be moved to the one\n          dictionary to make things a lot less confusing.\n        \"\"\"\n        self._old_to_new_map = old_to_new_map\n        self._core_old_to_new_map = core_old_to_new_map\n        self._new_to_old_map = self._invert_dict(old_to_new_map)\n        self._core_new_to_old_map = self._invert_dict(core_old_to_new_map)\n        self._old_to_hybrid_map = {}\n        self._new_to_hybrid_map = {}\n\n        # Get unique atoms\n        # old system first\n        self._unique_old_atoms = []\n        for particle_idx in range(self._old_system.getNumParticles()):\n            if particle_idx not in self._old_to_new_map.keys():\n                self._unique_old_atoms.append(particle_idx)\n\n        self._unique_new_atoms = []\n        for particle_idx in range(self._new_system.getNumParticles()):\n            if particle_idx not in self._new_to_old_map.keys():\n                self._unique_new_atoms.append(particle_idx)\n\n        # Get env atoms (i.e. atoms mapped not in core)\n        self._env_old_to_new_map = {}\n        for key, value in old_to_new_map.items():\n            if key not in self._core_old_to_new_map.keys():\n                self._env_old_to_new_map[key] = value\n\n        self._env_new_to_old_map = self._invert_dict(self._env_old_to_new_map)\n\n        # IA - Internal check for now (move to test later)\n        num_env = len(self._env_old_to_new_map.keys())\n        num_core = len(self._core_old_to_new_map.keys())\n        num_total = len(self._old_to_new_map.keys())\n        assert num_env + num_core == num_total\n\n    def _check_and_store_system_forces(self):\n        \"\"\"\n        Conveniently stores the system forces and checks that no unknown\n        forces exist.\n        \"\"\"\n\n        def _check_unknown_forces(forces, system_name):\n            # TODO: double check that CMMotionRemover is ok being here\n            known_forces = {\n                'HarmonicBondForce', 'HarmonicAngleForce',\n                'PeriodicTorsionForce', 'NonbondedForce',\n                'MonteCarloBarostat', 'CMMotionRemover',\n                'CMAPTorsionForce', 'MonteCarloMembraneBarostat',\n            }\n\n            force_names = forces.keys()\n            unknown_forces = set(force_names) - set(known_forces)\n            if unknown_forces:\n                errmsg = (f\"Unknown forces {unknown_forces} encountered in \"\n                          f\"{system_name} system\")\n                raise ValueError(errmsg)\n\n        # Prepare dicts of forces, which will be useful later\n        # TODO: Store this as self._system_forces[name], name in ('old',\n        # 'new', 'hybrid') for compactness\n        self._old_system_forces = {type(force).__name__: force for force in\n                                   self._old_system.getForces()}\n        _check_unknown_forces(self._old_system_forces, 'old')\n        self._new_system_forces = {type(force).__name__: force for force in\n                                   self._new_system.getForces()}\n        _check_unknown_forces(self._new_system_forces, 'new')\n\n        # TODO: check if this is actually used much, otherwise ditch it\n        # Get and store the nonbonded method from the system:\n        self._nonbonded_method = self._old_system_forces['NonbondedForce'].getNonbondedMethod()\n\n    def _add_particles(self):\n        \"\"\"\n        Adds particles to the hybrid system.\n\n        This does not copy over interactions, but does copy over the masses.\n\n        Note\n        ----\n        * If there is a difference in masses between the old and new systems\n          the average mass of the two is used.\n\n        TODO\n        ----\n        * Review influence of lack of mass scaling.\n        \"\"\"\n        # Begin by copying all particles in the old system\n        for particle_idx in range(self._old_system.getNumParticles()):\n            mass_old = self._old_system.getParticleMass(particle_idx)\n\n            if particle_idx in self._old_to_new_map.keys():\n                particle_idx_new_system = self._old_to_new_map[particle_idx]\n                mass_new = self._new_system.getParticleMass(\n                    particle_idx_new_system)\n                # Take the average of the masses if the atom is mapped\n                particle_mass = (mass_old + mass_new) / 2\n            else:\n                particle_mass = mass_old\n\n            hybrid_idx = self._hybrid_system.addParticle(particle_mass)\n            self._old_to_hybrid_map[particle_idx] = hybrid_idx\n\n            # If the particle index in question is mapped, make sure to add it\n            # to the new to hybrid map as well.\n            if particle_idx in self._old_to_new_map.keys():\n                self._new_to_hybrid_map[particle_idx_new_system] = hybrid_idx\n\n        # Next, add the remaining unique atoms from the new system to the\n        # hybrid system and map accordingly.\n        for particle_idx in self._unique_new_atoms:\n            particle_mass = self._new_system.getParticleMass(particle_idx)\n            hybrid_idx = self._hybrid_system.addParticle(particle_mass)\n            self._new_to_hybrid_map[particle_idx] = hybrid_idx\n\n        # Create the opposite atom maps for later use (nonbonded processing)\n        self._hybrid_to_old_map = self._invert_dict(self._old_to_hybrid_map)\n        self._hybrid_to_new_map = self._invert_dict(self._new_to_hybrid_map)\n\n    def _handle_box(self):\n        \"\"\"\n        Copies over the barostat and box vectors as necessary.\n        \"\"\"\n        # Check that if there is a barostat in the old system,\n        # it is added to the hybrid system\n        present_barostat = [\n            i for i in self._old_system_forces.keys()\n            if i in [\"MonteCarloBarostat\", \"MonteCarloMembraneBarostat\"]\n        ]\n        if len(present_barostat) == 1:\n            barostat = copy.deepcopy(\n                self._old_system_forces[present_barostat[0]])\n            self._hybrid_system.addForce(barostat)\n        elif len(present_barostat) > 1:\n            errmsg = \"More than 1 barostat are present which is not supported\"\n            raise ValueError(errmsg)\n\n        # Copy over the box vectors from the old system\n        box_vectors = self._old_system.getDefaultPeriodicBoxVectors()\n        self._hybrid_system.setDefaultPeriodicBoxVectors(*box_vectors)\n\n    def _set_atom_classes(self):\n        \"\"\"\n        This method determines whether each atom belongs to unique old,\n        unique new, core, or environment, as defined in the class docstring.\n        All indices are indices in the hybrid system.\n        \"\"\"\n        self._atom_classes = {'unique_old_atoms': set(),\n                              'unique_new_atoms': set(),\n                              'core_atoms': set(),\n                              'environment_atoms': set()}\n\n        # First, find the unique old atoms\n        for atom_idx in self._unique_old_atoms:\n            hybrid_idx = self._old_to_hybrid_map[atom_idx]\n            self._atom_classes['unique_old_atoms'].add(hybrid_idx)\n\n        # Then the unique new atoms\n        for atom_idx in self._unique_new_atoms:\n            hybrid_idx = self._new_to_hybrid_map[atom_idx]\n            self._atom_classes['unique_new_atoms'].add(hybrid_idx)\n\n        # The core atoms:\n        for new_idx, old_idx in self._core_new_to_old_map.items():\n            new_to_hybrid_idx = self._new_to_hybrid_map[new_idx]\n            old_to_hybrid_idx = self._old_to_hybrid_map[old_idx]\n            if new_to_hybrid_idx != old_to_hybrid_idx:\n                errmsg = (f\"there is an index collision in hybrid indices of \"\n                          f\"the core atom map: {self._core_new_to_old_map}\")\n                raise AssertionError(errmsg)\n            self._atom_classes['core_atoms'].add(new_to_hybrid_idx)\n\n        # The environment atoms:\n        for new_idx, old_idx in self._env_new_to_old_map.items():\n            new_to_hybrid_idx = self._new_to_hybrid_map[new_idx]\n            old_to_hybrid_idx = self._old_to_hybrid_map[old_idx]\n            if new_to_hybrid_idx != old_to_hybrid_idx:\n                errmsg = (f\"there is an index collion in hybrid indices of \"\n                          f\"the environment atom map: \"\n                          f\"{self._env_new_to_old_map}\")\n                raise AssertionError(errmsg)\n            self._atom_classes['environment_atoms'].add(new_to_hybrid_idx)\n\n    @staticmethod\n    def _generate_dict_from_exceptions(force):\n        \"\"\"\n        This is a utility function to generate a dictionary of the form\n        (particle1_idx, particle2_idx) : [exception parameters].\n        This will facilitate access and search of exceptions.\n\n        Parameters\n        ----------\n        force : openmm.NonbondedForce object\n            a force containing exceptions\n\n        Returns\n        -------\n        exceptions_dict : dict\n            Dictionary of exceptions\n        \"\"\"\n        exceptions_dict = {}\n\n        for exception_index in range(force.getNumExceptions()):\n            [index1, index2, chargeProd, sigma, epsilon] = force.getExceptionParameters(exception_index)\n            exceptions_dict[(index1, index2)] = [chargeProd, sigma, epsilon]\n\n        return exceptions_dict\n\n    def _validate_disjoint_sets(self):\n        \"\"\"\n        Conduct a sanity check to make sure that the hybrid maps of the old\n        and new system exception dict keys do not contain both environment\n        and unique_old/new atoms.\n\n        TODO: repeated code - condense\n        \"\"\"\n        for old_indices in self._old_system_exceptions.keys():\n            hybrid_indices = (self._old_to_hybrid_map[old_indices[0]],\n                              self._old_to_hybrid_map[old_indices[1]])\n            old_env_intersection = set(old_indices).intersection(\n                self._atom_classes['environment_atoms'])\n            if old_env_intersection:\n                if set(old_indices).intersection(\n                    self._atom_classes['unique_old_atoms']\n                ):\n                    errmsg = (f\"old index exceptions {old_indices} include \"\n                              \"unique old and environment atoms, which is \"\n                              \"disallowed\")\n                    raise AssertionError(errmsg)\n\n        for new_indices in self._new_system_exceptions.keys():\n            hybrid_indices = (self._new_to_hybrid_map[new_indices[0]],\n                              self._new_to_hybrid_map[new_indices[1]])\n            new_env_intersection = set(hybrid_indices).intersection(\n                self._atom_classes['environment_atoms'])\n            if new_env_intersection:\n                if set(hybrid_indices).intersection(\n                    self._atom_classes['unique_new_atoms']\n                ):\n                    errmsg = (f\"new index exceptions {new_indices} include \"\n                              \"unique new and environment atoms, which is \"\n                              \"disallowed\")\n                    raise AssertionError\n\n    def _handle_constraints(self):\n        \"\"\"\n        This method adds relevant constraints from the old and new systems.\n\n        First, all constraints from the old systenm are added.\n        Then, constraints to atoms unique to the new system are added.\n\n        TODO: condense duplicated code\n        \"\"\"\n        # lengths of constraints already added\n        constraint_lengths = dict()\n\n        # old system\n        hybrid_map = self._old_to_hybrid_map\n        for const_idx in range(self._old_system.getNumConstraints()):\n            at1, at2, length = self._old_system.getConstraintParameters(\n                const_idx)\n            hybrid_atoms = tuple(sorted([hybrid_map[at1], hybrid_map[at2]]))\n            if hybrid_atoms not in constraint_lengths.keys():\n                self._hybrid_system.addConstraint(hybrid_atoms[0],\n                                                  hybrid_atoms[1], length)\n                constraint_lengths[hybrid_atoms] = length\n            else:\n\n                if constraint_lengths[hybrid_atoms] != length:\n                    raise AssertionError('constraint length is changing')\n\n        # new system\n        hybrid_map = self._new_to_hybrid_map\n        for const_idx in range(self._new_system.getNumConstraints()):\n            at1, at2, length = self._new_system.getConstraintParameters(\n                const_idx)\n            hybrid_atoms = tuple(sorted([hybrid_map[at1], hybrid_map[at2]]))\n            if hybrid_atoms not in constraint_lengths.keys():\n                self._hybrid_system.addConstraint(hybrid_atoms[0],\n                                                  hybrid_atoms[1], length)\n                constraint_lengths[hybrid_atoms] = length\n            else:\n                if constraint_lengths[hybrid_atoms] != length:\n                    raise AssertionError('constraint length is changing')\n\n    @staticmethod\n    def _copy_threeparticleavg(atm_map, env_atoms, vs):\n        \"\"\"\n        Helper method to copy a ThreeParticleAverageSite virtual site\n        from two mapped Systems.\n\n        Parameters\n        ----------\n        atm_map : dict[int, int]\n          The atom map correspondence between the two Systems.\n        env_atoms: set[int]\n          A list of environment atoms for the target System. This\n          checks that no alchemical atoms are being tied to.\n        vs : openmm.ThreeParticleAverageSite\n\n        Returns\n        -------\n        openmm.ThreeParticleAverageSite\n        \"\"\"\n        particles = {}\n        weights = {}\n        for i in range(vs.getNumParticles()):\n            particles[i] = atm_map[vs.getParticle(i)]\n            weights[i] = vs.getWeight(i)\n        if not all(i in env_atoms for i in particles.values()):\n            errmsg = (\"Virtual sites bound to non-environment atoms \"\n                      \"are not supported\")\n            raise ValueError(errmsg)\n        return openmm.ThreeParticleAverageSite(\n            particles[0], particles[1], particles[2],\n            weights[0], weights[1], weights[2],\n        )\n\n    def _handle_virtual_sites(self):\n        \"\"\"\n        Ensure that all virtual sites in old and new system are copied over to\n        the hybrid system. Note that we do not support virtual sites in the\n        changing region.\n\n        TODO - remerge into a single loop\n        TODO - check that it's fine to double count here (even so, there's\n               an optimisation that could be done here...)\n        \"\"\"\n        # old system\n        # Loop through virtual sites\n        for particle_idx in range(self._old_system.getNumParticles()):\n            if self._old_system.isVirtualSite(particle_idx):\n                # If it's a virtual site, make sure it is not in the unique or\n                # core atoms, since this is currently unsupported\n                hybrid_idx = self._old_to_hybrid_map[particle_idx]\n                if hybrid_idx not in self._atom_classes['environment_atoms']:\n                    errmsg = (\"Virtual sites in changing residue are \"\n                              \"unsupported.\")\n                    raise ValueError(errmsg)\n                else:\n                    virtual_site = self._old_system.getVirtualSite(\n                        particle_idx)\n                    if isinstance(\n                        virtual_site, openmm.ThreeParticleAverageSite):\n                        vs_copy = self._copy_threeparticleavg(\n                            self._old_to_hybrid_map,\n                            self._atom_classes['environment_atoms'],\n                            virtual_site,\n                        )\n                    else:\n                        errmsg = (\"Unsupported VirtualSite \"\n                                  f\"class: {virtual_site}\")\n                        raise ValueError(errmsg)\n\n                    self._hybrid_system.setVirtualSite(hybrid_idx,\n                                                       vs_copy)\n\n        # new system - there should be nothing left to add\n        # Loop through virtual sites\n        for particle_idx in range(self._new_system.getNumParticles()):\n            if self._new_system.isVirtualSite(particle_idx):\n                # If it's a virtual site, make sure it is not in the unique or\n                # core atoms, since this is currently unsupported\n                hybrid_idx = self._new_to_hybrid_map[particle_idx]\n                if hybrid_idx not in self._atom_classes['environment_atoms']:\n                    errmsg = (\"Virtual sites in changing residue are \"\n                              \"unsupported.\")\n                    raise ValueError(errmsg)\n                else:\n                    if not self._hybrid_system.isVirtualSite(hybrid_idx):\n                        errmsg = (\"Environment virtual site in new system \"\n                                  \"found not copied from old system\")\n                        raise ValueError(errmsg)\n\n    def _add_bond_force_terms(self):\n        \"\"\"\n        This function adds the appropriate bond forces to the system\n        (according to groups defined in the main class docstring). Note that\n        it does _not_ add the particles to the force. It only adds the force\n        to facilitate another method adding the particles to the force.\n\n        Notes\n        -----\n        * User defined functions have been removed for now.\n        \"\"\"\n        core_energy_expression = '(K/2)*(r-length)^2;'\n        # linearly interpolate spring constant\n        core_energy_expression += 'K = (1-lambda_bonds)*K1 + lambda_bonds*K2;'\n        # linearly interpolate bond length\n        core_energy_expression += 'length = (1-lambda_bonds)*length1 + lambda_bonds*length2;'\n\n        # Create the force and add the relevant parameters\n        custom_core_force = openmm.CustomBondForce(core_energy_expression)\n        custom_core_force.addPerBondParameter('length1')  # old bond length\n        custom_core_force.addPerBondParameter('K1')  # old spring constant\n        custom_core_force.addPerBondParameter('length2')  # new bond length\n        custom_core_force.addPerBondParameter('K2')  # new spring constant\n\n        custom_core_force.addGlobalParameter('lambda_bonds', 0.0)\n\n        self._hybrid_system.addForce(custom_core_force)\n        self._hybrid_system_forces['core_bond_force'] = custom_core_force\n\n        # Add a bond force for environment and unique atoms (bonds are never\n        # scaled for these):\n        standard_bond_force = openmm.HarmonicBondForce()\n        self._hybrid_system.addForce(standard_bond_force)\n        self._hybrid_system_forces['standard_bond_force'] = standard_bond_force\n\n    def _add_angle_force_terms(self):\n        \"\"\"\n        This function adds the appropriate angle force terms to the hybrid\n        system. It does not add particles or parameters to the force; this is\n        done elsewhere.\n\n        Notes\n        -----\n        * User defined functions have been removed for now.\n        * Neglected angle terms have been removed for now.\n        \"\"\"\n        energy_expression = '(K/2)*(theta-theta0)^2;'\n        # linearly interpolate spring constant\n        energy_expression += 'K = (1.0-lambda_angles)*K_1 + lambda_angles*K_2;'\n        # linearly interpolate equilibrium angle\n        energy_expression += 'theta0 = (1.0-lambda_angles)*theta0_1 + lambda_angles*theta0_2;'\n\n        # Create the force and add relevant parameters\n        custom_core_force = openmm.CustomAngleForce(energy_expression)\n        # molecule1 equilibrium angle\n        custom_core_force.addPerAngleParameter('theta0_1')\n        # molecule1 spring constant\n        custom_core_force.addPerAngleParameter('K_1')\n        # molecule2 equilibrium angle\n        custom_core_force.addPerAngleParameter('theta0_2')\n        # molecule2 spring constant\n        custom_core_force.addPerAngleParameter('K_2')\n\n        custom_core_force.addGlobalParameter('lambda_angles', 0.0)\n\n        # Add the force to the system and the force dict.\n        self._hybrid_system.addForce(custom_core_force)\n        self._hybrid_system_forces['core_angle_force'] = custom_core_force\n\n        # Add an angle term for environment/unique interactions -- these are\n        # never scaled\n        standard_angle_force = openmm.HarmonicAngleForce()\n        self._hybrid_system.addForce(standard_angle_force)\n        self._hybrid_system_forces['standard_angle_force'] = standard_angle_force\n\n    def _add_torsion_force_terms(self):\n        \"\"\"\n        This function adds the appropriate PeriodicTorsionForce terms to the\n        system. Core torsions are interpolated, while environment and unique\n        torsions are always on.\n\n        Notes\n        -----\n        * User defined functions have been removed for now.\n        * Options for add_custom_core_force (default True) and\n          add_unique_atom_torsion_force (default True) have been removed for\n          now.\n        \"\"\"\n        energy_expression = '(1-lambda_torsions)*U1 + lambda_torsions*U2;'\n        energy_expression += 'U1 = K1*(1+cos(periodicity1*theta-phase1));'\n        energy_expression += 'U2 = K2*(1+cos(periodicity2*theta-phase2));'\n\n        # Create the force and add the relevant parameters\n        custom_core_force = openmm.CustomTorsionForce(energy_expression)\n        # molecule1 periodicity\n        custom_core_force.addPerTorsionParameter('periodicity1')\n        # molecule1 phase\n        custom_core_force.addPerTorsionParameter('phase1')\n        # molecule1 spring constant\n        custom_core_force.addPerTorsionParameter('K1')\n        # molecule2 periodicity\n        custom_core_force.addPerTorsionParameter('periodicity2')\n        # molecule2 phase\n        custom_core_force.addPerTorsionParameter('phase2')\n        # molecule2 spring constant\n        custom_core_force.addPerTorsionParameter('K2')\n\n        custom_core_force.addGlobalParameter('lambda_torsions', 0.0)\n\n        # Add the force to the system\n        self._hybrid_system.addForce(custom_core_force)\n        self._hybrid_system_forces['custom_torsion_force'] = custom_core_force\n\n        # Create and add the torsion term for unique/environment atoms\n        unique_atom_torsion_force = openmm.PeriodicTorsionForce()\n        self._hybrid_system.addForce(unique_atom_torsion_force)\n        self._hybrid_system_forces['unique_atom_torsion_force'] = unique_atom_torsion_force\n\n    @staticmethod\n    def _nonbonded_custom(v2):\n        \"\"\"\n        Get a part of the nonbonded energy expression when there is no cutoff.\n\n        Parameters\n        ----------\n        v2 : bool\n            Whether to use the softcore methods as defined by Gapsys et al.\n            JCTC 2012.\n\n        Returns\n        -------\n        sterics_energy_expression : str\n            The energy expression for U_sterics\n        electrostatics_energy_expression : str\n            The energy expression for electrostatics\n\n        TODO\n        ----\n        * Move to a dictionary or equivalent.\n        \"\"\"\n        # Soft-core Lennard-Jones\n        if v2:\n            sterics_energy_expression = \"U_sterics = select(step(r - r_LJ), 4*epsilon*x*(x-1.0), U_sterics_quad);\"\n            sterics_energy_expression += \"U_sterics_quad = Force*(((r - r_LJ)^2)/2 - (r - r_LJ)) + U_sterics_cut;\"\n            sterics_energy_expression += \"U_sterics_cut = 4*epsilon*((sigma/r_LJ)^6)*(((sigma/r_LJ)^6) - 1.0);\"\n            sterics_energy_expression += \"Force = -4*epsilon*((-12*sigma^12)/(r_LJ^13) + (6*sigma^6)/(r_LJ^7));\"\n            sterics_energy_expression += \"x = (sigma/r)^6;\"\n            sterics_energy_expression += \"r_LJ = softcore_alpha*((26/7)*(sigma^6)*lambda_sterics_deprecated)^(1/6);\"\n            sterics_energy_expression += \"lambda_sterics_deprecated = new_interaction*(1.0 - lambda_sterics_insert) + old_interaction*lambda_sterics_delete;\"\n        else:\n            sterics_energy_expression = \"U_sterics = 4*epsilon*x*(x-1.0); x = (sigma/reff_sterics)^6;\"\n\n        return sterics_energy_expression\n\n    @staticmethod\n    def _nonbonded_custom_sterics_common():\n        \"\"\"\n        Get a custom sterics expression using amber softcore expression\n\n        Returns\n        -------\n        sterics_addition : str\n            The common softcore sterics energy expression\n\n        TODO\n        ----\n        * Move to a dictionary or equivalent.\n        \"\"\"\n        # interpolation\n        sterics_addition = \"epsilon = (1-lambda_sterics)*epsilonA + lambda_sterics*epsilonB;\"\n        # effective softcore distance for sterics\n        sterics_addition += \"reff_sterics = sigma*((softcore_alpha*lambda_alpha + (r/sigma)^6))^(1/6);\"\n        sterics_addition += \"sigma = (1-lambda_sterics)*sigmaA + lambda_sterics*sigmaB;\"\n\n        sterics_addition += \"lambda_alpha = new_interaction*(1-lambda_sterics_insert) + old_interaction*lambda_sterics_delete;\"\n        sterics_addition += \"lambda_sterics = core_interaction*lambda_sterics_core + new_interaction*lambda_sterics_insert + old_interaction*lambda_sterics_delete;\"\n        sterics_addition += \"core_interaction = delta(unique_old1+unique_old2+unique_new1+unique_new2);new_interaction = max(unique_new1, unique_new2);old_interaction = max(unique_old1, unique_old2);\"\n\n        return sterics_addition\n\n    @staticmethod\n    def _nonbonded_custom_mixing_rules():\n        \"\"\"\n        Mixing rules for the custom nonbonded force.\n\n        Returns\n        -------\n        sterics_mixing_rules : str\n            The mixing expression for sterics\n        electrostatics_mixing_rules : str\n            The mixiing rules for electrostatics\n\n        TODO\n        ----\n        * Move to a dictionary or equivalent.\n        \"\"\"\n        # Define mixing rules.\n        # mixing rule for epsilon\n        sterics_mixing_rules = \"epsilonA = sqrt(epsilonA1*epsilonA2);\"\n        # mixing rule for epsilon\n        sterics_mixing_rules += \"epsilonB = sqrt(epsilonB1*epsilonB2);\"\n        # mixing rule for sigma\n        sterics_mixing_rules += \"sigmaA = 0.5*(sigmaA1 + sigmaA2);\"\n        # mixing rule for sigma\n        sterics_mixing_rules += \"sigmaB = 0.5*(sigmaB1 + sigmaB2);\"\n        return sterics_mixing_rules\n\n    @staticmethod\n    def _translate_nonbonded_method_to_custom(standard_nonbonded_method):\n        \"\"\"\n        Utility function to translate the nonbonded method enum from the\n        standard nonbonded force to the custom version\n        `CutoffPeriodic`, `PME`, and `Ewald` all become `CutoffPeriodic`;\n        `NoCutoff` becomes `NoCutoff`; `CutoffNonPeriodic` becomes\n        `CutoffNonPeriodic`\n\n        Parameters\n        ----------\n        standard_nonbonded_method : openmm.NonbondedForce.NonbondedMethod\n            the nonbonded method of the standard force\n\n        Returns\n        -------\n        custom_nonbonded_method : openmm.CustomNonbondedForce.NonbondedMethod\n            the nonbonded method for the equivalent customnonbonded force\n        \"\"\"\n        if standard_nonbonded_method in [openmm.NonbondedForce.CutoffPeriodic,\n                                         openmm.NonbondedForce.PME,\n                                         openmm.NonbondedForce.Ewald]:\n            return openmm.CustomNonbondedForce.CutoffPeriodic\n        elif standard_nonbonded_method == openmm.NonbondedForce.NoCutoff:\n            return openmm.CustomNonbondedForce.NoCutoff\n        elif standard_nonbonded_method == openmm.NonbondedForce.CutoffNonPeriodic:\n            return openmm.CustomNonbondedForce.CutoffNonPeriodic\n        else:\n            errmsg = \"This nonbonded method is not supported.\"\n            raise NotImplementedError(errmsg)\n\n    def _add_nonbonded_force_terms(self):\n        \"\"\"\n        Add the nonbonded force terms to the hybrid system. Note that as with\n        the other forces, this method does not add any interactions. It only\n        sets up the forces.\n\n        Notes\n        -----\n        * User defined functions have been removed for now.\n        * Argument `add_custom_sterics_force` (default True) has been removed\n          for now.\n\n        TODO\n        ----\n        * Move nonbonded_method defn here to avoid just setting it globally\n          and polluting `self`.\n        \"\"\"\n        # Add a regular nonbonded force for all interactions that are not\n        # changing.\n        standard_nonbonded_force = openmm.NonbondedForce()\n        self._hybrid_system.addForce(standard_nonbonded_force)\n        self._hybrid_system_forces['standard_nonbonded_force'] = standard_nonbonded_force\n\n        # Create a CustomNonbondedForce to handle alchemically interpolated\n        # nonbonded parameters.\n        # Select functional form based on nonbonded method.\n        # TODO: check _nonbonded_custom_ewald and _nonbonded_custom_cutoff\n        # since they take arguments that are never used...\n        r_cutoff = self._old_system_forces['NonbondedForce'].getCutoffDistance()\n        sterics_energy_expression = self._nonbonded_custom(self._softcore_LJ_v2)\n        if self._nonbonded_method in [openmm.NonbondedForce.NoCutoff]:\n            sterics_energy_expression = self._nonbonded_custom(\n                self._softcore_LJ_v2)\n        elif self._nonbonded_method in [openmm.NonbondedForce.CutoffPeriodic,\n                                        openmm.NonbondedForce.CutoffNonPeriodic]:\n            epsilon_solvent = self._old_system_forces['NonbondedForce'].getReactionFieldDielectric()\n            standard_nonbonded_force.setReactionFieldDielectric(\n                epsilon_solvent)\n            standard_nonbonded_force.setCutoffDistance(r_cutoff)\n        elif self._nonbonded_method in [openmm.NonbondedForce.PME,\n                                        openmm.NonbondedForce.Ewald]:\n            [alpha_ewald, nx, ny, nz] = self._old_system_forces['NonbondedForce'].getPMEParameters()\n            delta = self._old_system_forces['NonbondedForce'].getEwaldErrorTolerance()\n            standard_nonbonded_force.setPMEParameters(alpha_ewald, nx, ny, nz)\n            standard_nonbonded_force.setEwaldErrorTolerance(delta)\n            standard_nonbonded_force.setCutoffDistance(r_cutoff)\n        else:\n            errmsg = f\"Nonbonded method {self._nonbonded_method} not supported\"\n            raise ValueError(errmsg)\n\n        standard_nonbonded_force.setNonbondedMethod(self._nonbonded_method)\n\n        sterics_energy_expression += self._nonbonded_custom_sterics_common()\n\n        sterics_mixing_rules = self._nonbonded_custom_mixing_rules()\n\n        custom_nonbonded_method = self._translate_nonbonded_method_to_custom(\n            self._nonbonded_method)\n\n        total_sterics_energy = \"U_sterics;\" + sterics_energy_expression + sterics_mixing_rules\n\n        sterics_custom_nonbonded_force = openmm.CustomNonbondedForce(\n            total_sterics_energy)\n        # Match cutoff from non-custom NB forces\n        sterics_custom_nonbonded_force.setCutoffDistance(r_cutoff)\n\n        if self._softcore_LJ_v2:\n            sterics_custom_nonbonded_force.addGlobalParameter(\n                \"softcore_alpha\", self._softcore_LJ_v2_alpha)\n        else:\n            sterics_custom_nonbonded_force.addGlobalParameter(\n                \"softcore_alpha\", self._softcore_alpha)\n\n        # Lennard-Jones sigma initial\n        sterics_custom_nonbonded_force.addPerParticleParameter(\"sigmaA\")\n        # Lennard-Jones epsilon initial\n        sterics_custom_nonbonded_force.addPerParticleParameter(\"epsilonA\")\n        # Lennard-Jones sigma final\n        sterics_custom_nonbonded_force.addPerParticleParameter(\"sigmaB\")\n        # Lennard-Jones epsilon final\n        sterics_custom_nonbonded_force.addPerParticleParameter(\"epsilonB\")\n        # 1 = hybrid old atom, 0 otherwise\n        sterics_custom_nonbonded_force.addPerParticleParameter(\"unique_old\")\n        # 1 = hybrid new atom, 0 otherwise\n        sterics_custom_nonbonded_force.addPerParticleParameter(\"unique_new\")\n\n        sterics_custom_nonbonded_force.addGlobalParameter(\n            \"lambda_sterics_core\", 0.0)\n        sterics_custom_nonbonded_force.addGlobalParameter(\n            \"lambda_electrostatics_core\", 0.0)\n        sterics_custom_nonbonded_force.addGlobalParameter(\n            \"lambda_sterics_insert\", 0.0)\n        sterics_custom_nonbonded_force.addGlobalParameter(\n            \"lambda_sterics_delete\", 0.0)\n\n        sterics_custom_nonbonded_force.setNonbondedMethod(\n            custom_nonbonded_method)\n\n        self._hybrid_system.addForce(sterics_custom_nonbonded_force)\n        self._hybrid_system_forces['core_sterics_force'] = sterics_custom_nonbonded_force\n\n        # Set the use of dispersion correction to be the same between the new\n        # nonbonded force and the old one:\n        if self._old_system_forces['NonbondedForce'].getUseDispersionCorrection():\n            self._hybrid_system_forces['standard_nonbonded_force'].setUseDispersionCorrection(True)\n            if self._use_dispersion_correction:\n                sterics_custom_nonbonded_force.setUseLongRangeCorrection(True)\n        else:\n            self._hybrid_system_forces['standard_nonbonded_force'].setUseDispersionCorrection(False)\n\n        if self._old_system_forces['NonbondedForce'].getUseSwitchingFunction():\n            switching_distance = self._old_system_forces['NonbondedForce'].getSwitchingDistance()\n            standard_nonbonded_force.setUseSwitchingFunction(True)\n            standard_nonbonded_force.setSwitchingDistance(switching_distance)\n            sterics_custom_nonbonded_force.setUseSwitchingFunction(True)\n            sterics_custom_nonbonded_force.setSwitchingDistance(switching_distance)\n        else:\n            standard_nonbonded_force.setUseSwitchingFunction(False)\n            sterics_custom_nonbonded_force.setUseSwitchingFunction(False)\n\n    @staticmethod\n    def _find_bond_parameters(bond_force, index1, index2):\n        \"\"\"\n        This is a convenience function to find bond parameters in another\n        system given the two indices.\n\n        Parameters\n        ----------\n        bond_force : openmm.HarmonicBondForce\n            The bond force where the parameters should be found\n        index1 : int\n           Index1 (order does not matter) of the bond atoms\n        index2 : int\n           Index2 (order does not matter) of the bond atoms\n\n        Returns\n        -------\n        bond_parameters : list\n            List of relevant bond parameters\n        \"\"\"\n        index_set = {index1, index2}\n        # Loop through all the bonds:\n        for bond_index in range(bond_force.getNumBonds()):\n            parms = bond_force.getBondParameters(bond_index)\n            if index_set == {parms[0], parms[1]}:\n                return parms\n\n        return []\n\n    def _handle_harmonic_bonds(self):\n        \"\"\"\n        This method adds the appropriate interaction for all bonds in the\n        hybrid system. The scheme used is:\n\n        1) If the two atoms are both in the core, then we add to the\n            CustomBondForce and interpolate between the two parameters\n        2) If one of the atoms is in core and the other is environment, we\n           have to assert that the bond parameters do not change between the\n           old and the new system; then, the parameters are added to the\n           regular bond force\n        3) Otherwise, we add the bond to a regular bond force.\n\n        Notes\n        -----\n        * Bond softening logic has been removed for now.\n        \"\"\"\n        old_system_bond_force = self._old_system_forces['HarmonicBondForce']\n        new_system_bond_force = self._new_system_forces['HarmonicBondForce']\n\n        # First, loop through the old system bond forces and add relevant terms\n        for bond_index in range(old_system_bond_force.getNumBonds()):\n            # Get each set of bond parameters\n            [index1_old, index2_old, r0_old, k_old] = old_system_bond_force.getBondParameters(bond_index)\n\n            # Map the indices to the hybrid system, for which our atom classes\n            # are defined.\n            index1_hybrid = self._old_to_hybrid_map[index1_old]\n            index2_hybrid = self._old_to_hybrid_map[index2_old]\n            index_set = {index1_hybrid, index2_hybrid}\n\n            # Now check if it is a subset of the core atoms (that is, both\n            # atoms are in the core)\n            # If it is, we need to find the parameters in the old system so\n            # that we can interpolate\n            if index_set.issubset(self._atom_classes['core_atoms']):\n                index1_new = self._old_to_new_map[index1_old]\n                index2_new = self._old_to_new_map[index2_old]\n                new_bond_parameters = self._find_bond_parameters(\n                    new_system_bond_force, index1_new, index2_new)\n                if not new_bond_parameters:\n                    r0_new = r0_old\n                    k_new = 0.0*unit.kilojoule_per_mole/unit.angstrom**2\n                else:\n                    # TODO - why is this being recalculated?\n                    [index1, index2, r0_new, k_new] = self._find_bond_parameters(\n                        new_system_bond_force, index1_new, index2_new)\n                self._hybrid_system_forces['core_bond_force'].addBond(\n                    index1_hybrid, index2_hybrid,\n                    [r0_old, k_old, r0_new, k_new])\n\n            # Check if the index set is a subset of anything besides\n            # environment (in the case of environment, we just add the bond to\n            # the regular bond force)\n            # that would mean that this bond is core-unique_old or\n            # unique_old-unique_old\n            # NOTE - These are currently all the same because we don't soften\n            # TODO - work these out somewhere else, this is terribly difficult\n            #        to understand logic.\n            elif (index_set.issubset(self._atom_classes['unique_old_atoms']) or\n                  (len(index_set.intersection(self._atom_classes['unique_old_atoms'])) == 1\n                   and len(index_set.intersection(self._atom_classes['core_atoms'])) == 1)):\n\n                # We can just add it to the regular bond force.\n                self._hybrid_system_forces['standard_bond_force'].addBond(\n                    index1_hybrid, index2_hybrid, r0_old, k_old)\n\n            elif (len(index_set.intersection(self._atom_classes['environment_atoms'])) == 1 and\n                  len(index_set.intersection(self._atom_classes['core_atoms'])) == 1):\n                self._hybrid_system_forces['standard_bond_force'].addBond(\n                    index1_hybrid, index2_hybrid, r0_old, k_old)\n\n            # Otherwise, we just add the same parameters as those in the old\n            # system (these are environment atoms, and the parameters are the\n            # same)\n            elif index_set.issubset(self._atom_classes['environment_atoms']):\n                self._hybrid_system_forces['standard_bond_force'].addBond(\n                    index1_hybrid, index2_hybrid, r0_old, k_old)\n            else:\n                errmsg = (f\"hybrid index set {index_set} does not fit into a \"\n                          \"canonical atom type\")\n                raise ValueError(errmsg)\n\n        # Now loop through the new system to get the interactions that are\n        # unique to it.\n        for bond_index in range(new_system_bond_force.getNumBonds()):\n            # Get each set of bond parameters\n            [index1_new, index2_new, r0_new, k_new] = new_system_bond_force.getBondParameters(bond_index)\n\n            # Convert indices to hybrid, since that is how we represent atom classes:\n            index1_hybrid = self._new_to_hybrid_map[index1_new]\n            index2_hybrid = self._new_to_hybrid_map[index2_new]\n            index_set = {index1_hybrid, index2_hybrid}\n\n            # If the intersection of this set and unique new atoms contains\n            # anything, the bond is unique to the new system and must be added\n            # all other bonds in the new system have been accounted for already\n            # NOTE - These are mostly all the same because we don't soften\n            if (len(index_set.intersection(self._atom_classes['unique_new_atoms'])) == 2 or\n                (len(index_set.intersection(self._atom_classes['unique_new_atoms'])) == 1 and\n                 len(index_set.intersection(self._atom_classes['core_atoms'])) == 1)):\n\n                # If we aren't softening bonds, then just add it to the standard bond force\n                self._hybrid_system_forces['standard_bond_force'].addBond(\n                    index1_hybrid, index2_hybrid, r0_new, k_new)\n\n            # If the bond is in the core, it has probably already been added\n            # in the above loop. However, there are some circumstances\n            # where it was not (closing a ring). In that case, the bond has\n            # not been added and should be added here.\n            # This has some peculiarities to be discussed...\n            # TODO - Work out what the above peculiarities are...\n            elif index_set.issubset(self._atom_classes['core_atoms']):\n                if not self._find_bond_parameters(\n                        self._hybrid_system_forces['core_bond_force'],\n                        index1_hybrid, index2_hybrid):\n                    r0_old = r0_new\n                    k_old = 0.0*unit.kilojoule_per_mole/unit.angstrom**2\n                    self._hybrid_system_forces['core_bond_force'].addBond(\n                        index1_hybrid, index2_hybrid,\n                        [r0_old, k_old, r0_new, k_new])\n            elif index_set.issubset(self._atom_classes['environment_atoms']):\n                # Already been added\n                pass\n\n            elif (len(index_set.intersection(self._atom_classes['environment_atoms'])) == 1 and\n                  len(index_set.intersection(self._atom_classes['core_atoms'])) == 1):\n                pass\n\n            else:\n                errmsg = (f\"hybrid index set {index_set} does not fit into a \"\n                          \"canonical atom type\")\n                raise ValueError(errmsg)\n\n    @staticmethod\n    def _find_angle_parameters(angle_force, indices):\n        \"\"\"\n        Convenience function to find the angle parameters corresponding to a\n        particular set of indices\n\n        Parameters\n        ----------\n        angle_force : openmm.HarmonicAngleForce\n            The force where the angle of interest may be found.\n        indices : list of int\n            The indices (any order) of the angle atoms\n\n        Returns\n        -------\n        angle_params : list\n            list of angle parameters\n        \"\"\"\n        indices_reversed = indices[::-1]\n\n        # Now loop through and try to find the angle:\n        for angle_index in range(angle_force.getNumAngles()):\n            angle_params = angle_force.getAngleParameters(angle_index)\n\n            # Get a set representing the angle indices\n            angle_param_indices = angle_params[:3]\n\n            if (indices == angle_param_indices or\n                    indices_reversed == angle_param_indices):\n                return angle_params\n        return []  # Return empty if no matching angle found\n\n    def _handle_harmonic_angles(self):\n        \"\"\"\n        This method adds the appropriate interaction for all angles in the\n        hybrid system. The scheme used, as with bonds, is:\n\n        1) If the three atoms are all in the core, then we add to the\n           CustomAngleForce and interpolate between the two parameters\n        2) If the three atoms contain at least one unique new, check if the\n           angle is in the neglected new list, and if so, interpolate from\n           K_1 = 0; else, if the three atoms contain at least one unique old,\n           check if the angle is in the neglected old list, and if so,\n           interpolate from K_2 = 0.\n        3) If the angle contains at least one environment and at least one\n           core atom, assert there are no unique new atoms and that the angle\n           terms are preserved between the new and the old system.  Then add to\n           the standard angle force.\n        4) Otherwise, we add the angle to a regular angle force since it is\n           environment.\n\n        Notes\n        -----\n        * Removed softening and neglected angle functionality\n        \"\"\"\n        old_system_angle_force = self._old_system_forces['HarmonicAngleForce']\n        new_system_angle_force = self._new_system_forces['HarmonicAngleForce']\n\n        # First, loop through all the angles in the old system to determine\n        # what to do with them. We will only use the\n        # custom angle force if all atoms are part of \"core.\" Otherwise, they\n        # are either unique to one system or never change.\n        for angle_index in range(old_system_angle_force.getNumAngles()):\n\n            old_angle_parameters = old_system_angle_force.getAngleParameters(\n                                       angle_index)\n\n            # Get the indices in the hybrid system\n            hybrid_index_list = [\n                self._old_to_hybrid_map[old_atomid] for old_atomid in old_angle_parameters[:3]\n            ]\n            hybrid_index_set = set(hybrid_index_list)\n\n            # If all atoms are in the core, we'll need to find the\n            # corresponding parameters in the old system and interpolate\n            if hybrid_index_set.issubset(self._atom_classes['core_atoms']):\n                # Get the new indices so we can get the new angle parameters\n                new_indices = [\n                    self._old_to_new_map[old_atomid] for old_atomid in old_angle_parameters[:3]\n                ]\n                new_angle_parameters = self._find_angle_parameters(\n                    new_system_angle_force, new_indices\n                )\n                if not new_angle_parameters:\n                    new_angle_parameters = [\n                        0, 0, 0, old_angle_parameters[3],\n                        0.0*unit.kilojoule_per_mole/unit.radian**2\n                    ]\n\n                # Add to the hybrid force:\n                # the parameters at indices 3 and 4 represent theta0 and k,\n                # respectively.\n                hybrid_force_parameters = [\n                    old_angle_parameters[3], old_angle_parameters[4],\n                    new_angle_parameters[3], new_angle_parameters[4]\n                ]\n                self._hybrid_system_forces['core_angle_force'].addAngle(\n                    hybrid_index_list[0], hybrid_index_list[1],\n                    hybrid_index_list[2], hybrid_force_parameters\n                )\n\n            # Check if the atoms are neither all core nor all environment,\n            # which would mean they involve unique old interactions\n            elif not hybrid_index_set.issubset(\n                    self._atom_classes['environment_atoms']):\n                # if there is an environment atom\n                if hybrid_index_set.intersection(\n                        self._atom_classes['environment_atoms']):\n                    if hybrid_index_set.intersection(\n                            self._atom_classes['unique_old_atoms']):\n                        errmsg = \"we disallow unique-environment terms\"\n                        raise ValueError(errmsg)\n\n                    self._hybrid_system_forces['standard_angle_force'].addAngle(\n                        hybrid_index_list[0], hybrid_index_list[1],\n                        hybrid_index_list[2], old_angle_parameters[3],\n                        old_angle_parameters[4]\n                    )\n                else:\n                    # There are no env atoms, so we can treat this term\n                    # appropriately\n\n                    # We don't soften so just add this to the standard angle\n                    # force\n                    self._hybrid_system_forces['standard_angle_force'].addAngle(\n                        hybrid_index_list[0], hybrid_index_list[1],\n                        hybrid_index_list[2], old_angle_parameters[3],\n                        old_angle_parameters[4]\n                    )\n\n            # Otherwise, only environment atoms are in this interaction, so\n            # add it to the standard angle force\n            elif hybrid_index_set.issubset(\n                    self._atom_classes['environment_atoms']):\n                self._hybrid_system_forces['standard_angle_force'].addAngle(\n                    hybrid_index_list[0], hybrid_index_list[1],\n                    hybrid_index_list[2], old_angle_parameters[3],\n                    old_angle_parameters[4]\n                )\n            else:\n                errmsg = (f\"handle_harmonic_angles: angle_index {angle_index} \"\n                          \"does not fit a canonical form.\")\n                raise ValueError(errmsg)\n\n        # Finally, loop through the new system force to add any unique new\n        # angles\n        for angle_index in range(new_system_angle_force.getNumAngles()):\n\n            new_angle_parameters = new_system_angle_force.getAngleParameters(\n                                       angle_index)\n\n            # Get the indices in the hybrid system\n            hybrid_index_list = [\n                self._new_to_hybrid_map[new_atomid] for new_atomid in new_angle_parameters[:3]\n            ]\n            hybrid_index_set = set(hybrid_index_list)\n\n            # If the intersection of this hybrid set with the unique new atoms\n            # is nonempty, it must be added:\n            # TODO - there's a ton of len > 0 on sets, empty sets == False,\n            #        so we can simplify this logic.\n            if len(hybrid_index_set.intersection(\n                    self._atom_classes['unique_new_atoms'])) > 0:\n                if hybrid_index_set.intersection(\n                        self._atom_classes['environment_atoms']):\n                    errmsg = (\"we disallow angle terms with unique new and \"\n                              \"environment atoms\")\n                    raise ValueError(errmsg)\n\n                # Not softening just add to the nonalchemical force\n                self._hybrid_system_forces['standard_angle_force'].addAngle(\n                    hybrid_index_list[0], hybrid_index_list[1],\n                    hybrid_index_list[2], new_angle_parameters[3],\n                    new_angle_parameters[4]\n                )\n\n            elif hybrid_index_set.issubset(self._atom_classes['core_atoms']):\n                if not self._find_angle_parameters(self._hybrid_system_forces['core_angle_force'],\n                                                   hybrid_index_list):\n                    hybrid_force_parameters = [\n                        new_angle_parameters[3],\n                        0.0*unit.kilojoule_per_mole/unit.radian**2,\n                        new_angle_parameters[3], new_angle_parameters[4]\n                    ]\n                    self._hybrid_system_forces['core_angle_force'].addAngle(\n                        hybrid_index_list[0], hybrid_index_list[1],\n                        hybrid_index_list[2], hybrid_force_parameters\n                    )\n            elif hybrid_index_set.issubset(self._atom_classes['environment_atoms']):\n                # We have already added the appropriate environmental atom\n                # terms\n                pass\n            elif hybrid_index_set.intersection(self._atom_classes['environment_atoms']):\n                if hybrid_index_set.intersection(self._atom_classes['unique_new_atoms']):\n                    errmsg = (\"we disallow angle terms with unique new and \"\n                              \"environment atoms\")\n                    raise ValueError(errmsg)\n            else:\n                errmsg = (f\"hybrid index list {hybrid_index_list} does not \"\n                          \"fit into a canonical atom set\")\n                raise ValueError(errmsg)\n\n    @staticmethod\n    def _find_torsion_parameters(torsion_force, indices):\n        \"\"\"\n        Convenience function to find the torsion parameters corresponding to a\n        particular set of indices.\n\n        Parameters\n        ----------\n        torsion_force : openmm.PeriodicTorsionForce\n            torsion force where the torsion of interest may be found\n        indices : list of int\n            The indices of the atoms of the torsion\n\n        Returns\n        -------\n        torsion_parameters : list\n            torsion parameters\n        \"\"\"\n        indices_reversed = indices[::-1]\n\n        torsion_params_list = list()\n\n        # Now loop through and try to find the torsion:\n        for torsion_idx in range(torsion_force.getNumTorsions()):\n            torsion_params = torsion_force.getTorsionParameters(torsion_idx)\n\n            # Get a set representing the torsion indices:\n            torsion_param_indices = torsion_params[:4]\n\n            if (indices == torsion_param_indices or\n                    indices_reversed == torsion_param_indices):\n                torsion_params_list.append(torsion_params)\n\n        return torsion_params_list\n\n    def _handle_periodic_torsion_force(self):\n        \"\"\"\n        Handle the torsions defined in the new and old systems as such:\n\n        1. old system torsions will enter the ``custom_torsion_force`` if they\n           do not contain ``unique_old_atoms`` and will interpolate from ``on``\n           to ``off`` from ``lambda_torsions`` = 0 to 1, respectively.\n        2. new system torsions will enter the ``custom_torsion_force`` if they\n           do not contain ``unique_new_atoms`` and will interpolate from\n           ``off`` to ``on`` from ``lambda_torsions`` = 0 to 1, respectively.\n        3. old *and* new system torsions will enter the\n           ``unique_atom_torsion_force`` (``standard_torsion_force``) and will\n           *not* be interpolated.\n\n        Notes\n        -----\n        * Torsion flattening logic has been removed for now.\n        \"\"\"\n        old_system_torsion_force = self._old_system_forces['PeriodicTorsionForce']\n        new_system_torsion_force = self._new_system_forces['PeriodicTorsionForce']\n\n        auxiliary_custom_torsion_force = []\n        old_custom_torsions_to_standard = []\n\n        # We need to keep track of what torsions we added so that we do not\n        # double count\n        # added_torsions = []\n        # TODO: Commented out since this actually isn't being done anywhere?\n        #       Is it necessary? Should we add this logic back in?\n        for torsion_index in range(old_system_torsion_force.getNumTorsions()):\n\n            torsion_parameters = old_system_torsion_force.getTorsionParameters(\n                                     torsion_index)\n\n            # Get the indices in the hybrid system\n            hybrid_index_list = [\n                self._old_to_hybrid_map[old_index] for old_index in torsion_parameters[:4]\n            ]\n            hybrid_index_set = set(hybrid_index_list)\n\n            # If all atoms are in the core, we'll need to find the\n            # corresponding parameters in the old system and interpolate\n            if hybrid_index_set.intersection(self._atom_classes['unique_old_atoms']):\n                # Then it goes to a standard force...\n                self._hybrid_system_forces['unique_atom_torsion_force'].addTorsion(\n                    hybrid_index_list[0], hybrid_index_list[1],\n                    hybrid_index_list[2], hybrid_index_list[3],\n                    torsion_parameters[4], torsion_parameters[5],\n                    torsion_parameters[6]\n                )\n            else:\n                # It is a core-only term, an environment-only term, or a\n                # core/env term; in any case, it goes to the core torsion_force\n                # TODO - why are we even adding the 0.0, 0.0, 0.0 section?\n                hybrid_force_parameters = [\n                    torsion_parameters[4], torsion_parameters[5],\n                    torsion_parameters[6], 0.0, 0.0, 0.0\n                ]\n                auxiliary_custom_torsion_force.append(\n                    [hybrid_index_list[0], hybrid_index_list[1],\n                     hybrid_index_list[2], hybrid_index_list[3],\n                     hybrid_force_parameters[:3]]\n                )\n\n        for torsion_index in range(new_system_torsion_force.getNumTorsions()):\n            torsion_parameters = new_system_torsion_force.getTorsionParameters(torsion_index)\n\n            # Get the indices in the hybrid system:\n            hybrid_index_list = [\n                self._new_to_hybrid_map[new_index] for new_index in torsion_parameters[:4]]\n            hybrid_index_set = set(hybrid_index_list)\n\n            if hybrid_index_set.intersection(self._atom_classes['unique_new_atoms']):\n                # Then it goes to the custom torsion force (scaled to zero)\n                self._hybrid_system_forces['unique_atom_torsion_force'].addTorsion(\n                    hybrid_index_list[0], hybrid_index_list[1],\n                    hybrid_index_list[2], hybrid_index_list[3],\n                    torsion_parameters[4], torsion_parameters[5],\n                    torsion_parameters[6]\n                )\n            else:\n                hybrid_force_parameters = [\n                    0.0, 0.0, 0.0, torsion_parameters[4],\n                    torsion_parameters[5], torsion_parameters[6]]\n\n                # Check to see if this term is in the olds...\n                term = [hybrid_index_list[0], hybrid_index_list[1],\n                        hybrid_index_list[2], hybrid_index_list[3],\n                        hybrid_force_parameters[3:]]\n                if term in auxiliary_custom_torsion_force:\n                    # Then this terms has to go to standard and be deleted...\n                    old_index = auxiliary_custom_torsion_force.index(term)\n                    old_custom_torsions_to_standard.append(old_index)\n                    self._hybrid_system_forces['unique_atom_torsion_force'].addTorsion(\n                        hybrid_index_list[0], hybrid_index_list[1],\n                        hybrid_index_list[2], hybrid_index_list[3],\n                        torsion_parameters[4], torsion_parameters[5],\n                        torsion_parameters[6]\n                    )\n                else:\n                    # Then this term has to go to the core force...\n                    self._hybrid_system_forces['custom_torsion_force'].addTorsion(\n                        hybrid_index_list[0], hybrid_index_list[1],\n                        hybrid_index_list[2], hybrid_index_list[3],\n                        hybrid_force_parameters\n                    )\n\n        # Now we have to loop through the aux custom torsion force\n        for index in [q for q in range(len(auxiliary_custom_torsion_force))\n                      if q not in old_custom_torsions_to_standard]:\n            terms = auxiliary_custom_torsion_force[index]\n            hybrid_index_list = terms[:4]\n            hybrid_force_parameters = terms[4] + [0., 0., 0.]\n            self._hybrid_system_forces['custom_torsion_force'].addTorsion(\n                hybrid_index_list[0], hybrid_index_list[1],\n                hybrid_index_list[2], hybrid_index_list[3],\n                hybrid_force_parameters\n            )\n\n    def _handle_nonbonded(self):\n        \"\"\"\n        Handle the nonbonded interactions defined in the new and old systems.\n\n        TODO\n        ----\n        * Expand this docstring to explain the logic.\n        * A lot of this logic is duplicated, probably turn it into a couple of\n          functions.\n        \"\"\"\n        def _check_indices(idx1, idx2):\n            if idx1 != idx2:\n                errmsg = (\"Attempting to add incorrect particle to hybrid \"\n                          \"system\")\n                raise ValueError(errmsg)\n\n        old_system_nonbonded_force = self._old_system_forces['NonbondedForce']\n        new_system_nonbonded_force = self._new_system_forces['NonbondedForce']\n        hybrid_to_old_map = self._hybrid_to_old_map\n        hybrid_to_new_map = self._hybrid_to_new_map\n\n        # Define new global parameters for NonbondedForce\n        self._hybrid_system_forces['standard_nonbonded_force'].addGlobalParameter('lambda_electrostatics_core', 0.0)\n        self._hybrid_system_forces['standard_nonbonded_force'].addGlobalParameter('lambda_sterics_core', 0.0)\n        self._hybrid_system_forces['standard_nonbonded_force'].addGlobalParameter(\"lambda_electrostatics_delete\", 0.0)\n        self._hybrid_system_forces['standard_nonbonded_force'].addGlobalParameter(\"lambda_electrostatics_insert\", 0.0)\n\n        # We have to loop through the particles in the system, because\n        # nonbonded force does not accept index\n        for particle_index in range(self._hybrid_system.getNumParticles()):\n\n            if particle_index in self._atom_classes['unique_old_atoms']:\n                # Get the parameters in the old system\n                old_index = hybrid_to_old_map[particle_index]\n                [charge, sigma, epsilon] = old_system_nonbonded_force.getParticleParameters(old_index)\n\n                # Add the particle to the hybrid custom sterics and\n                # electrostatics.\n                # turning off sterics in forward direction\n                check_index = self._hybrid_system_forces['core_sterics_force'].addParticle(\n                    [sigma, epsilon, sigma, 0.0*epsilon, 1, 0]\n                )\n                _check_indices(particle_index, check_index)\n\n                # Add particle to the regular nonbonded force, but\n                # Lennard-Jones will be handled by CustomNonbondedForce\n                check_index = self._hybrid_system_forces['standard_nonbonded_force'].addParticle(\n                    charge, sigma, 0.0*epsilon\n                )\n                _check_indices(particle_index, check_index)\n\n                # Charge will be turned off at\n                # lambda_electrostatics_delete = 0, on at\n                # lambda_electrostatics_delete = 1; kill charge with\n                # lambda_electrostatics_delete = 0 --> 1\n                self._hybrid_system_forces['standard_nonbonded_force'].addParticleParameterOffset(\n                    'lambda_electrostatics_delete', particle_index,\n                    -charge, 0*sigma, 0*epsilon\n                )\n\n            elif particle_index in self._atom_classes['unique_new_atoms']:\n                # Get the parameters in the new system\n                new_index = hybrid_to_new_map[particle_index]\n                [charge, sigma, epsilon] = new_system_nonbonded_force.getParticleParameters(new_index)\n\n                # Add the particle to the hybrid custom sterics and electrostatics\n                # turning on sterics in forward direction\n                check_index = self._hybrid_system_forces['core_sterics_force'].addParticle(\n                    [sigma, 0.0*epsilon, sigma, epsilon, 0, 1]\n                )\n                _check_indices(particle_index, check_index)\n\n                # Add particle to the regular nonbonded force, but\n                # Lennard-Jones will be handled by CustomNonbondedForce\n                check_index = self._hybrid_system_forces['standard_nonbonded_force'].addParticle(\n                    0.0, sigma, 0.0\n                )  # charge starts at zero\n                _check_indices(particle_index, check_index)\n\n                # Charge will be turned off at lambda_electrostatics_insert = 0\n                # on at lambda_electrostatics_insert = 1;\n                # add charge with lambda_electrostatics_insert = 0 --> 1\n                self._hybrid_system_forces['standard_nonbonded_force'].addParticleParameterOffset(\n                    'lambda_electrostatics_insert', particle_index,\n                    +charge, 0, 0\n                )\n\n            elif particle_index in self._atom_classes['core_atoms']:\n                # Get the parameters in the new and old systems:\n                old_index = hybrid_to_old_map[particle_index]\n                [charge_old, sigma_old, epsilon_old] = old_system_nonbonded_force.getParticleParameters(old_index)\n                new_index = hybrid_to_new_map[particle_index]\n                [charge_new, sigma_new, epsilon_new] = new_system_nonbonded_force.getParticleParameters(new_index)\n\n                # Add the particle to the custom forces, interpolating between\n                # the two parameters; add steric params and zero electrostatics\n                # to core_sterics per usual\n                check_index = self._hybrid_system_forces['core_sterics_force'].addParticle(\n                    [sigma_old, epsilon_old, sigma_new, epsilon_new, 0, 0])\n                _check_indices(particle_index, check_index)\n\n                # Still add the particle to the regular nonbonded force, but\n                # with zeroed out parameters; add old charge to\n                # standard_nonbonded and zero sterics\n                check_index = self._hybrid_system_forces['standard_nonbonded_force'].addParticle(\n                    # this term is off due to epsilon = 0, but just set sigma to the initial value to not confuse things\n                    charge_old, sigma_old, 0.0)\n                _check_indices(particle_index, check_index)\n\n                # Charge is charge_old at lambda_electrostatics = 0,\n                # charge_new at lambda_electrostatics = 1\n                # TODO: We could also interpolate the Lennard-Jones here\n                # instead of core_sterics force so that core_sterics_force\n                # could just be softcore.\n\n                # Interpolate between old and new charge with\n                # lambda_electrostatics core make sure to keep sterics off\n                self._hybrid_system_forces['standard_nonbonded_force'].addParticleParameterOffset(\n                    'lambda_electrostatics_core', particle_index,\n                    (charge_new - charge_old), 0, 0\n                )\n\n            # Otherwise, the particle is in the environment\n            else:\n                # The parameters will be the same in new and old system, so\n                # just take the old parameters\n                old_index = hybrid_to_old_map[particle_index]\n                [charge, sigma, epsilon] = old_system_nonbonded_force.getParticleParameters(old_index)\n\n                # Add the particle to the hybrid custom sterics, but they dont\n                # change; electrostatics are ignored\n                self._hybrid_system_forces['core_sterics_force'].addParticle(\n                    [sigma, epsilon, sigma, epsilon, 0, 0]\n                )\n\n                # Add the environment atoms to the regular nonbonded force as\n                # well: should we be adding steric terms here, too?\n                self._hybrid_system_forces['standard_nonbonded_force'].addParticle(\n                    charge, sigma, epsilon\n                )\n\n        # Now loop pairwise through (unique_old, unique_new) and add exceptions\n        # so that they never interact electrostatically\n        # (place into Nonbonded Force)\n        unique_old_atoms = self._atom_classes['unique_old_atoms']\n        unique_new_atoms = self._atom_classes['unique_new_atoms']\n\n        for old in unique_old_atoms:\n            for new in unique_new_atoms:\n                self._hybrid_system_forces['standard_nonbonded_force'].addException(\n                    old, new, 0.0*unit.elementary_charge**2,\n                    1.0*unit.nanometers, 0.0*unit.kilojoules_per_mole)\n                # This is only necessary to avoid the 'All forces must have\n                # identical exclusions' rule\n                self._hybrid_system_forces['core_sterics_force'].addExclusion(old, new)\n\n        self._handle_interaction_groups()\n\n        self._handle_hybrid_exceptions()\n\n        self._handle_original_exceptions()\n\n    def _handle_interaction_groups(self):\n        \"\"\"\n        Create the appropriate interaction groups for the custom nonbonded\n        forces. The groups are:\n\n        1) Unique-old - core\n        2) Unique-old - environment\n        3) Unique-new - core\n        4) Unique-new - environment\n        5) Core - environment\n        6) Core - core\n\n        Unique-old and Unique new are prevented from interacting this way,\n        and intra-unique interactions occur in an unmodified nonbonded force.\n\n        Must be called after particles are added to the Nonbonded forces\n        TODO: we should also be adding the following interaction groups...\n        7) Unique-new - Unique-new\n        8) Unique-old - Unique-old\n        \"\"\"\n        # Get the force objects for convenience:\n        sterics_custom_force = self._hybrid_system_forces['core_sterics_force']\n\n        # Also prepare the atom classes\n        core_atoms = self._atom_classes['core_atoms']\n        unique_old_atoms = self._atom_classes['unique_old_atoms']\n        unique_new_atoms = self._atom_classes['unique_new_atoms']\n        environment_atoms = self._atom_classes['environment_atoms']\n\n        sterics_custom_force.addInteractionGroup(unique_old_atoms, core_atoms)\n\n        sterics_custom_force.addInteractionGroup(unique_old_atoms,\n                                                 environment_atoms)\n\n        sterics_custom_force.addInteractionGroup(unique_new_atoms,\n                                                 core_atoms)\n\n        sterics_custom_force.addInteractionGroup(unique_new_atoms,\n                                                 environment_atoms)\n\n        sterics_custom_force.addInteractionGroup(core_atoms, environment_atoms)\n\n        sterics_custom_force.addInteractionGroup(core_atoms, core_atoms)\n\n        sterics_custom_force.addInteractionGroup(unique_new_atoms,\n                                                 unique_new_atoms)\n\n        sterics_custom_force.addInteractionGroup(unique_old_atoms,\n                                                 unique_old_atoms)\n\n    def _handle_hybrid_exceptions(self):\n        \"\"\"\n        Instead of excluding interactions that shouldn't occur, we provide\n        exceptions for interactions that were zeroed out but should occur.\n        \"\"\"\n        # TODO - are these actually used anywhere? Flake8 says no\n        old_system_nonbonded_force = self._old_system_forces['NonbondedForce']\n        new_system_nonbonded_force = self._new_system_forces['NonbondedForce']\n\n        # Prepare the atom classes\n        unique_old_atoms = self._atom_classes['unique_old_atoms']\n        unique_new_atoms = self._atom_classes['unique_new_atoms']\n\n        # Get the list of interaction pairs for which we need to set exceptions\n        unique_old_pairs = list(itertools.combinations(unique_old_atoms, 2))\n        unique_new_pairs = list(itertools.combinations(unique_new_atoms, 2))\n\n        # Add back the interactions of the old unique atoms, unless there are\n        # exceptions\n        for atom_pair in unique_old_pairs:\n            # Since the pairs are indexed in the dictionary by the old system\n            # indices, we need to convert\n            old_index_atom_pair = (self._hybrid_to_old_map[atom_pair[0]],\n                                   self._hybrid_to_old_map[atom_pair[1]])\n\n            # Now we check if the pair is in the exception dictionary\n            if old_index_atom_pair in self._old_system_exceptions:\n                [chargeProd, sigma, epsilon] = self._old_system_exceptions[old_index_atom_pair]\n                # if we are interpolating 1,4 exceptions then we have to\n                if self._interpolate_14s:\n                    self._hybrid_system_forces['standard_nonbonded_force'].addException(\n                        atom_pair[0], atom_pair[1], chargeProd*0.0,\n                        sigma, epsilon*0.0\n                    )\n                else:\n                    self._hybrid_system_forces['standard_nonbonded_force'].addException(\n                        atom_pair[0], atom_pair[1], chargeProd, sigma, epsilon\n                    )\n\n                # Add exclusion to ensure exceptions are consistent\n                self._hybrid_system_forces['core_sterics_force'].addExclusion(\n                    atom_pair[0], atom_pair[1]\n                )\n\n            # Check if the pair is in the reverse order and use that if so\n            elif old_index_atom_pair[::-1] in self._old_system_exceptions:\n                [chargeProd, sigma, epsilon] = self._old_system_exceptions[old_index_atom_pair[::-1]]\n                # If we are interpolating 1,4 exceptions then we have to\n                if self._interpolate_14s:\n                    self._hybrid_system_forces['standard_nonbonded_force'].addException(\n                        atom_pair[0], atom_pair[1], chargeProd*0.0,\n                        sigma, epsilon*0.0\n                    )\n                else:\n                    self._hybrid_system_forces['standard_nonbonded_force'].addException(\n                        atom_pair[0], atom_pair[1], chargeProd, sigma, epsilon)\n\n                # Add exclusion to ensure exceptions are consistent\n                self._hybrid_system_forces['core_sterics_force'].addExclusion(\n                    atom_pair[0], atom_pair[1])\n\n            # TODO: work out why there's a bunch of commented out code here\n            # Excerpt:\n            # If it's not handled by an exception in the original system, we\n            # just add the regular parameters as an exception\n            # TODO: this implies that the old-old nonbonded interactions (those\n            # which are not exceptions) are always self-interacting throughout\n            # lambda protocol...\n\n        # Add back the interactions of the new unique atoms, unless there are\n        # exceptions\n        for atom_pair in unique_new_pairs:\n            # Since the pairs are indexed in the dictionary by the new system\n            # indices, we need to convert\n            new_index_atom_pair = (self._hybrid_to_new_map[atom_pair[0]],\n                                   self._hybrid_to_new_map[atom_pair[1]])\n\n            # Now we check if the pair is in the exception dictionary\n            if new_index_atom_pair in self._new_system_exceptions:\n                [chargeProd, sigma, epsilon] = self._new_system_exceptions[new_index_atom_pair]\n                if self._interpolate_14s:\n                    self._hybrid_system_forces['standard_nonbonded_force'].addException(\n                        atom_pair[0], atom_pair[1], chargeProd*0.0,\n                        sigma, epsilon*0.0\n                    )\n                else:\n                    self._hybrid_system_forces['standard_nonbonded_force'].addException(\n                        atom_pair[0], atom_pair[1], chargeProd, sigma, epsilon\n                    )\n\n                self._hybrid_system_forces['core_sterics_force'].addExclusion(\n                    atom_pair[0], atom_pair[1]\n                )\n\n            # Check if the pair is present in the reverse order and use that if so\n            elif new_index_atom_pair[::-1] in self._new_system_exceptions:\n                [chargeProd, sigma, epsilon] = self._new_system_exceptions[new_index_atom_pair[::-1]]\n                if self._interpolate_14s:\n                    self._hybrid_system_forces['standard_nonbonded_force'].addException(\n                        atom_pair[0], atom_pair[1], chargeProd*0.0,\n                        sigma, epsilon*0.0\n                    )\n                else:\n                    self._hybrid_system_forces['standard_nonbonded_force'].addException(\n                        atom_pair[0], atom_pair[1], chargeProd, sigma, epsilon\n                    )\n\n                self._hybrid_system_forces['core_sterics_force'].addExclusion(\n                    atom_pair[0], atom_pair[1]\n                )\n\n\n            # TODO: work out why there's a bunch of commented out code here\n            # If it's not handled by an exception in the original system, we\n            # just add the regular parameters as an exception\n\n    @staticmethod\n    def _find_exception(force, index1, index2):\n        \"\"\"\n        Find the exception that corresponds to the given indices in the given\n        system\n\n        Parameters\n        ----------\n        force : openmm.NonbondedForce object\n            System containing the exceptions\n        index1 : int\n            The index of the first atom (order is unimportant)\n        index2 : int\n            The index of the second atom (order is unimportant)\n\n        Returns\n        -------\n        exception_parameters : list\n            List of exception parameters\n        \"\"\"\n        index_set = {index1, index2}\n\n        # Loop through the exceptions and try to find one matching the criteria\n        for exception_idx in range(force.getNumExceptions()):\n            exception_parameters = force.getExceptionParameters(exception_idx)\n            if index_set==set(exception_parameters[:2]):\n                return exception_parameters\n        return []\n\n    def _handle_original_exceptions(self):\n        \"\"\"\n        This method ensures that exceptions present in the original systems are\n        present in the hybrid appropriately.\n        \"\"\"\n        # Get what we need to find the exceptions from the new and old systems:\n        old_system_nonbonded_force = self._old_system_forces['NonbondedForce']\n        new_system_nonbonded_force = self._new_system_forces['NonbondedForce']\n        hybrid_to_old_map = self._hybrid_to_old_map\n        hybrid_to_new_map = self._hybrid_to_new_map\n\n        # First, loop through the old system's exceptions and add them to the\n        # hybrid appropriately:\n        for exception_pair, exception_parameters in self._old_system_exceptions.items():\n\n            [index1_old, index2_old] = exception_pair\n            [chargeProd_old, sigma_old, epsilon_old] = exception_parameters\n\n            # Get hybrid indices:\n            index1_hybrid = self._old_to_hybrid_map[index1_old]\n            index2_hybrid = self._old_to_hybrid_map[index2_old]\n            index_set = {index1_hybrid, index2_hybrid}\n\n\n            # In this case, the interaction is only covered by the regular\n            # nonbonded force, and as such will be copied to that force\n            # In the unique-old case, it is handled elsewhere due to internal\n            # peculiarities regarding exceptions\n            if index_set.issubset(self._atom_classes['environment_atoms']):\n                self._hybrid_system_forces['standard_nonbonded_force'].addException(\n                    index1_hybrid, index2_hybrid, chargeProd_old,\n                    sigma_old, epsilon_old\n                )\n                self._hybrid_system_forces['core_sterics_force'].addExclusion(\n                    index1_hybrid, index2_hybrid\n                )\n\n            # We have already handled unique old - unique old exceptions\n            elif len(index_set.intersection(self._atom_classes['unique_old_atoms'])) == 2:\n                continue\n\n            # Otherwise, check if one of the atoms in the set is in the\n            # unique_old_group and the other is not:\n            elif len(index_set.intersection(self._atom_classes['unique_old_atoms'])) == 1:\n                if self._interpolate_14s:\n                    self._hybrid_system_forces['standard_nonbonded_force'].addException(\n                        index1_hybrid, index2_hybrid, chargeProd_old*0.0,\n                        sigma_old, epsilon_old*0.0\n                    )\n                else:\n                    self._hybrid_system_forces['standard_nonbonded_force'].addException(\n                        index1_hybrid, index2_hybrid, chargeProd_old,\n                        sigma_old, epsilon_old\n                    )\n\n                self._hybrid_system_forces['core_sterics_force'].addExclusion(\n                    index1_hybrid, index2_hybrid\n                )\n\n            # If the exception particles are neither solely old unique, solely\n            # environment, nor contain any unique old atoms, they are either\n            # core/environment or core/core\n            # In this case, we need to get the parameters from the exception in\n            # the other (new) system, and interpolate between the two\n            else:\n                # First get the new indices.\n                index1_new = hybrid_to_new_map[index1_hybrid]\n                index2_new = hybrid_to_new_map[index2_hybrid]\n                # Get the exception parameters:\n                new_exception_parms= self._find_exception(\n                                         new_system_nonbonded_force,\n                                         index1_new, index2_new)\n\n                # If there's no new exception, then we should just set the\n                # exception parameters to be the nonbonded parameters\n                if not new_exception_parms:\n                    [charge1_new, sigma1_new, epsilon1_new] = new_system_nonbonded_force.getParticleParameters(index1_new)\n                    [charge2_new, sigma2_new, epsilon2_new] = new_system_nonbonded_force.getParticleParameters(index2_new)\n\n                    chargeProd_new = charge1_new * charge2_new\n                    sigma_new = 0.5 * (sigma1_new + sigma2_new)\n                    epsilon_new = unit.sqrt(epsilon1_new*epsilon2_new)\n                else:\n                    [index1_new, index2_new, chargeProd_new, sigma_new, epsilon_new] = new_exception_parms\n\n                # Interpolate between old and new\n                exception_index = self._hybrid_system_forces['standard_nonbonded_force'].addException(\n                    index1_hybrid, index2_hybrid, chargeProd_old,\n                    sigma_old, epsilon_old\n                )\n                self._hybrid_system_forces['standard_nonbonded_force'].addExceptionParameterOffset(\n                    'lambda_electrostatics_core', exception_index,\n                    (chargeProd_new - chargeProd_old), 0, 0\n                )\n                self._hybrid_system_forces['standard_nonbonded_force'].addExceptionParameterOffset(\n                    'lambda_sterics_core', exception_index, 0,\n                    (sigma_new - sigma_old), (epsilon_new - epsilon_old)\n                )\n                self._hybrid_system_forces['core_sterics_force'].addExclusion(\n                    index1_hybrid, index2_hybrid\n                )\n\n        # Now, loop through the new system to collect remaining interactions.\n        # The only that remain here are uniquenew-uniquenew, uniquenew-core,\n        # and uniquenew-environment. There might also be core-core, since not\n        # all core-core exceptions exist in both\n        for exception_pair, exception_parameters in self._new_system_exceptions.items():\n            [index1_new, index2_new] = exception_pair\n            [chargeProd_new, sigma_new, epsilon_new] = exception_parameters\n\n            # Get hybrid indices:\n            index1_hybrid = self._new_to_hybrid_map[index1_new]\n            index2_hybrid = self._new_to_hybrid_map[index2_new]\n\n            index_set = {index1_hybrid, index2_hybrid}\n\n            # If it's a subset of unique_new_atoms, then this is an\n            # intra-unique interaction and should have its exceptions\n            # specified in the regular nonbonded force. However, this is\n            # handled elsewhere as above due to peculiarities with exception\n            # handling\n            if index_set.issubset(self._atom_classes['unique_new_atoms']):\n                continue\n\n            # Look for the final class- interactions between uniquenew-core and\n            # uniquenew-environment. They are treated similarly: they are\n            # simply on and constant the entire time (as a valence term)\n            elif len(index_set.intersection(self._atom_classes['unique_new_atoms'])) > 0:\n                if self._interpolate_14s:\n                    self._hybrid_system_forces['standard_nonbonded_force'].addException(\n                        index1_hybrid, index2_hybrid, chargeProd_new*0.0,\n                        sigma_new, epsilon_new*0.0\n                    )\n                else:\n                    self._hybrid_system_forces['standard_nonbonded_force'].addException(\n                        index1_hybrid, index2_hybrid, chargeProd_new,\n                        sigma_new, epsilon_new\n                    )\n\n                self._hybrid_system_forces['core_sterics_force'].addExclusion(\n                    index1_hybrid, index2_hybrid\n                )\n\n            # However, there may be a core exception that exists in one system\n            # but not the other (ring closure)\n            elif index_set.issubset(self._atom_classes['core_atoms']):\n\n                # Get the old indices\n                try:\n                    index1_old = self._new_to_old_map[index1_new]\n                    index2_old = self._new_to_old_map[index2_new]\n                except KeyError:\n                    continue\n\n                # See if it's also in the old nonbonded force. if it is, then we don't need to add it.\n                # But if it's not, we need to interpolate\n                if not self._find_exception(old_system_nonbonded_force, index1_old, index2_old):\n\n                    [charge1_old, sigma1_old, epsilon1_old] = old_system_nonbonded_force.getParticleParameters(index1_old)\n                    [charge2_old, sigma2_old, epsilon2_old] = old_system_nonbonded_force.getParticleParameters(index2_old)\n\n                    chargeProd_old = charge1_old*charge2_old\n                    sigma_old = 0.5 * (sigma1_old + sigma2_old)\n                    epsilon_old = unit.sqrt(epsilon1_old*epsilon2_old)\n\n                    exception_index = self._hybrid_system_forces['standard_nonbonded_force'].addException(\n                                          index1_hybrid, index2_hybrid,\n                                          chargeProd_old, sigma_old,\n                                          epsilon_old)\n\n                    self._hybrid_system_forces['standard_nonbonded_force'].addExceptionParameterOffset(\n                        'lambda_electrostatics_core', exception_index,\n                        (chargeProd_new - chargeProd_old), 0, 0\n                    )\n\n                    self._hybrid_system_forces['standard_nonbonded_force'].addExceptionParameterOffset(\n                        'lambda_sterics_core', exception_index, 0,\n                        (sigma_new - sigma_old), (epsilon_new - epsilon_old)\n                    )\n\n                    self._hybrid_system_forces['core_sterics_force'].addExclusion(\n                        index1_hybrid, index2_hybrid\n                    )\n\n    def _handle_old_new_exceptions(self):\n        \"\"\"\n        Find the exceptions associated with old-old and old-core interactions,\n        as well as new-new and new-core interactions.  These exceptions will\n        be placed in CustomBondedForce that will interpolate electrostatics and\n        a softcore potential.\n\n        TODO\n        ----\n        * Move old_new_bond_exceptions to a dictionary or similar.\n        \"\"\"\n\n        old_new_nonbonded_exceptions = \"U_electrostatics + U_sterics;\"\n\n        if self._softcore_LJ_v2:\n            old_new_nonbonded_exceptions += \"U_sterics = select(step(r - r_LJ), 4*epsilon*x*(x-1.0), U_sterics_quad);\"\n            old_new_nonbonded_exceptions += \"U_sterics_quad = Force*(((r - r_LJ)^2)/2 - (r - r_LJ)) + U_sterics_cut;\"\n            old_new_nonbonded_exceptions += \"U_sterics_cut = 4*epsilon*((sigma/r_LJ)^6)*(((sigma/r_LJ)^6) - 1.0);\"\n            old_new_nonbonded_exceptions += \"Force = -4*epsilon*((-12*sigma^12)/(r_LJ^13) + (6*sigma^6)/(r_LJ^7));\"\n            old_new_nonbonded_exceptions += \"x = (sigma/r)^6;\"\n            old_new_nonbonded_exceptions += \"r_LJ = softcore_alpha*((26/7)*(sigma^6)*lambda_sterics_deprecated)^(1/6);\"\n            old_new_nonbonded_exceptions += \"lambda_sterics_deprecated = new_interaction*(1.0 - lambda_sterics_insert) + old_interaction*lambda_sterics_delete;\"\n        else:\n            old_new_nonbonded_exceptions += \"U_sterics = 4*epsilon*x*(x-1.0); x = (sigma/reff_sterics)^6;\"\n            old_new_nonbonded_exceptions += \"reff_sterics = sigma*((softcore_alpha*lambda_alpha + (r/sigma)^6))^(1/6);\"\n            old_new_nonbonded_exceptions += \"reff_sterics = sigma*((softcore_alpha*lambda_alpha + (r/sigma)^6))^(1/6);\" # effective softcore distance for sterics\n            old_new_nonbonded_exceptions += \"lambda_alpha = new_interaction*(1-lambda_sterics_insert) + old_interaction*lambda_sterics_delete;\"\n\n        old_new_nonbonded_exceptions += \"U_electrostatics = (lambda_electrostatics_insert * unique_new + unique_old * (1 - lambda_electrostatics_delete)) * ONE_4PI_EPS0*chargeProd/r;\"\n        old_new_nonbonded_exceptions += \"ONE_4PI_EPS0 = %f;\" % ONE_4PI_EPS0\n\n        old_new_nonbonded_exceptions += \"epsilon = (1-lambda_sterics)*epsilonA + lambda_sterics*epsilonB;\" # interpolation\n        old_new_nonbonded_exceptions += \"sigma = (1-lambda_sterics)*sigmaA + lambda_sterics*sigmaB;\"\n\n        old_new_nonbonded_exceptions += \"lambda_sterics = new_interaction*lambda_sterics_insert + old_interaction*lambda_sterics_delete;\"\n        old_new_nonbonded_exceptions += \"new_interaction = delta(1-unique_new); old_interaction = delta(1-unique_old);\"\n\n\n        nonbonded_exceptions_force = openmm.CustomBondForce(\n                                         old_new_nonbonded_exceptions)\n        name = f\"{nonbonded_exceptions_force.__class__.__name__}_exceptions\"\n        nonbonded_exceptions_force.setName(name)\n        self._hybrid_system.addForce(nonbonded_exceptions_force)\n\n        # For reference, set name in force dict\n        self._hybrid_system_forces['old_new_exceptions_force'] = nonbonded_exceptions_force\n\n        if self._softcore_LJ_v2:\n            nonbonded_exceptions_force.addGlobalParameter(\n                \"softcore_alpha\", self._softcore_LJ_v2_alpha\n            )\n        else:\n            nonbonded_exceptions_force.addGlobalParameter(\n                \"softcore_alpha\", self._softcore_alpha\n            )\n\n        # electrostatics insert\n        nonbonded_exceptions_force.addGlobalParameter(\n            \"lambda_electrostatics_insert\", 0.0\n        )\n        # electrostatics delete\n        nonbonded_exceptions_force.addGlobalParameter(\n            \"lambda_electrostatics_delete\", 0.0\n        )\n        # sterics insert\n        nonbonded_exceptions_force.addGlobalParameter(\n            \"lambda_sterics_insert\", 0.0\n        )\n        # steric delete\n        nonbonded_exceptions_force.addGlobalParameter(\n            \"lambda_sterics_delete\", 0.0\n        )\n\n        for parameter in ['chargeProd','sigmaA', 'epsilonA', 'sigmaB',\n                          'epsilonB', 'unique_old', 'unique_new']:\n            nonbonded_exceptions_force.addPerBondParameter(parameter)\n\n        # Prepare for exceptions loop by grabbing nonbonded forces,\n        # hybrid_to_old/new maps\n        old_system_nonbonded_force = self._old_system_forces['NonbondedForce']\n        new_system_nonbonded_force = self._new_system_forces['NonbondedForce']\n        hybrid_to_old_map = self._hybrid_to_old_map\n        hybrid_to_new_map = self._hybrid_to_new_map\n\n        # First, loop through the old system's exceptions and add them to the\n        # hybrid appropriately:\n        for exception_pair, exception_parameters in self._old_system_exceptions.items():\n\n            [index1_old, index2_old] = exception_pair\n            [chargeProd_old, sigma_old, epsilon_old] = exception_parameters\n\n            # Get hybrid indices:\n            index1_hybrid = self._old_to_hybrid_map[index1_old]\n            index2_hybrid = self._old_to_hybrid_map[index2_old]\n            index_set = {index1_hybrid, index2_hybrid}\n\n            # Otherwise, check if one of the atoms in the set is in the\n            # unique_old_group and the other is not:\n            if (len(index_set.intersection(self._atom_classes['unique_old_atoms'])) > 0 and\n                (chargeProd_old.value_in_unit_system(unit.md_unit_system) != 0.0 or\n                 epsilon_old.value_in_unit_system(unit.md_unit_system) != 0.0)):\n                if self._interpolate_14s:\n                    # If we are interpolating 1,4s, then we anneal this term\n                    # off; otherwise, the exception force is constant and\n                    # already handled in the standard nonbonded force\n                    nonbonded_exceptions_force.addBond(\n                        index1_hybrid, index2_hybrid,\n                        [chargeProd_old, sigma_old, epsilon_old, sigma_old,\n                         epsilon_old*0.0, 1, 0]\n                    )\n\n\n\n        # Next, loop through the new system's exceptions and add them to the\n        # hybrid appropriately\n        for exception_pair, exception_parameters in self._new_system_exceptions.items():\n            [index1_new, index2_new] = exception_pair\n            [chargeProd_new, sigma_new, epsilon_new] = exception_parameters\n\n            # Get hybrid indices:\n            index1_hybrid = self._new_to_hybrid_map[index1_new]\n            index2_hybrid = self._new_to_hybrid_map[index2_new]\n\n            index_set = {index1_hybrid, index2_hybrid}\n\n            # Look for the final class- interactions between uniquenew-core and\n            # uniquenew-environment. They are treated\n            # similarly: they are simply on and constant the entire time\n            # (as a valence term)\n            if (len(index_set.intersection(self._atom_classes['unique_new_atoms'])) > 0 and\n                (chargeProd_new.value_in_unit_system(unit.md_unit_system) != 0.0 or\n                 epsilon_new.value_in_unit_system(unit.md_unit_system) != 0.0)):\n                if self._interpolate_14s:\n                    # If we are interpolating 1,4s, then we anneal this term\n                    # on; otherwise, the exception force is constant and\n                    # already handled in the standard nonbonded force\n                    nonbonded_exceptions_force.addBond(\n                        index1_hybrid, index2_hybrid,\n                        [chargeProd_new, sigma_new, epsilon_new*0.0,\n                         sigma_new, epsilon_new, 0, 1]\n                    )\n\n    def _compute_hybrid_positions(self):\n        \"\"\"\n        The positions of the hybrid system. Dimensionality is (n_environment +\n        n_core + n_old_unique + n_new_unique),\n        The positions are assigned by first copying all the mapped positions\n        from the old system in, then copying the\n        mapped positions from the new system. This means that there is an\n        assumption that the positions common to old and new are the same\n        (which is the case for perses as-is).\n\n        Returns\n        -------\n        hybrid_positions : np.ndarray [n, 3]\n            Positions of the hybrid system, in nm\n        \"\"\"\n        # Get unitless positions\n        old_pos_without_units = np.array(\n            self._old_positions.value_in_unit(unit.nanometer))\n        new_pos_without_units = np.array(\n            self._new_positions.value_in_unit(unit.nanometer))\n\n        # Determine the number of particles in the system\n        n_atoms_hybrid = self._hybrid_system.getNumParticles()\n\n        # Initialize an array for hybrid positions\n        hybrid_pos_array = np.zeros([n_atoms_hybrid, 3])\n\n        # Loop through the old system indices, and assign positions.\n        for old_idx, hybrid_idx in self._old_to_hybrid_map.items():\n            hybrid_pos_array[hybrid_idx, :] = old_pos_without_units[old_idx, :]\n\n        # Do the same for new indices. Note that this overwrites some\n        # coordinates, but as stated above, the assumption is that these are\n        # the same.\n        for new_idx, hybrid_idx in self._new_to_hybrid_map.items():\n            hybrid_pos_array[hybrid_idx, :] = new_pos_without_units[new_idx, :]\n\n        return unit.Quantity(hybrid_pos_array, unit=unit.nanometers)\n\n    def _create_mdtraj_topology(self):\n        \"\"\"\n        Create an MDTraj trajectory of the hybrid system.\n\n        Note\n        ----\n        This is purely for writing out trajectories and is not expected to be\n        parametrized.\n\n        TODO\n        ----\n        * A lot of this can be simplified / reworked.\n        \"\"\"\n        old_top = mdt.Topology.from_openmm(self._old_topology)\n        new_top = mdt.Topology.from_openmm(self._new_topology)\n\n        hybrid_topology = copy.deepcopy(old_top)\n\n        added_atoms = dict()\n\n        # Get the core atoms in the new index system (as opposed to the hybrid\n        # index system). We will need this later\n        core_atoms_new_indices = set(self._core_old_to_new_map.values())\n\n        # Now, add each unique new atom to the topology (this is the same order\n        # as the system)\n        for particle_idx in self._unique_new_atoms:\n            new_particle_hybrid_idx = self._new_to_hybrid_map[particle_idx]\n            new_system_atom = new_top.atom(particle_idx)\n\n            # First, we get the residue in the new system associated with this\n            # atom\n            new_system_res = new_system_atom.residue\n\n            # Next, we have to enumerate the other atoms in that residue to\n            # find mapped atoms\n            new_system_atom_set = {atom.index for atom in new_system_res.atoms}\n\n            # Now, we find the subset of atoms that are mapped. These must be\n            # in the \"core\" category, since they are mapped and part of a\n            # changing residue\n            mapped_new_atom_indices = core_atoms_new_indices.intersection(\n                                          new_system_atom_set)\n\n            # Now get the old indices of the above atoms so that we can find\n            # the appropriate residue in the old system for this we can use the\n            # new to old atom map\n            mapped_old_atom_indices = [self._new_to_old_map[atom_idx] for\n                                       atom_idx in mapped_new_atom_indices]\n\n            # We can just take the first one--they all have the same residue\n            first_mapped_old_atom_index = mapped_old_atom_indices[0]\n\n            # Get the atom object corresponding to this index from the hybrid\n            # (which is a deepcopy of the old)\n            mapped_hybrid_system_atom = hybrid_topology.atom(\n                                            first_mapped_old_atom_index)\n\n            # Get the residue that is relevant to this atom\n            mapped_residue = mapped_hybrid_system_atom.residue\n\n            # Add the atom using the mapped residue\n            added_atoms[new_particle_hybrid_idx] = hybrid_topology.add_atom(\n                                                       new_system_atom.name,\n                                                       new_system_atom.element,\n                                                       mapped_residue)\n\n        # Now loop through the bonds in the new system, and if the bond\n        # contains a unique new atom, then add it to the hybrid topology\n        for (atom1, atom2) in new_top.bonds:\n            at1_hybrid_idx = self._new_to_hybrid_map[atom1.index]\n            at2_hybrid_idx = self._new_to_hybrid_map[atom2.index]\n\n            # If at least one atom is in the unique new class, we need to add\n            # it to the hybrid system\n            at1_uniq = at1_hybrid_idx in self._atom_classes['unique_new_atoms']\n            at2_uniq = at2_hybrid_idx in self._atom_classes['unique_new_atoms']\n            if at1_uniq or at2_uniq:\n                if at1_uniq:\n                    atom1_to_bond = added_atoms[at1_hybrid_idx]\n                else:\n                    old_idx = self._hybrid_to_old_map[at1_hybrid_idx]\n                    atom1_to_bond = hybrid_topology.atom(old_idx)\n\n                if at2_uniq:\n                    atom2_to_bond = added_atoms[at2_hybrid_idx]\n                else:\n                    old_idx = self._hybrid_to_old_map[at2_hybrid_idx]\n                    atom2_to_bond = hybrid_topology.atom(old_idx)\n\n                hybrid_topology.add_bond(atom1_to_bond, atom2_to_bond)\n\n        return hybrid_topology\n\n\n    def _create_hybrid_topology(self):\n        \"\"\"\n        Create a hybrid openmm.app.Topology from the input old and new\n        Topologies.\n\n        Note\n        ----\n        * This is not intended for parameterisation purposes, but instead\n          for system visualisation.\n        * Unlike the MDTraj Topology object, the residues of the alchemical\n          species are not squashed.\n        \"\"\"\n\n        hybrid_top = app.Topology()\n\n        # In the first instance, create a list of necessary atoms from\n        # both old & new Topologies\n        atom_list = []\n        # iterate once over the topologies for speed\n        old_topology_atoms = list(self._old_topology.atoms())\n        new_topology_atoms = list(self._new_topology.atoms())\n\n        for pidx in range(self.hybrid_system.getNumParticles()):\n            if pidx in self._hybrid_to_old_map:\n                idx = self._hybrid_to_old_map[pidx]\n                atom_list.append(old_topology_atoms[idx])\n            else:\n                idx = self._hybrid_to_new_map[pidx]\n                atom_list.append(new_topology_atoms[idx])\n\n        # Now we loop over the atoms and add them in alongside chains & resids\n\n        # Non ideal variables to track the previous set of residues & chains\n        # without having to constantly search backwards\n        prev_res = None\n        prev_chain = None\n\n        for at in atom_list:\n            if at.residue.chain != prev_chain:\n                hybrid_chain = hybrid_top.addChain()\n                prev_chain = at.residue.chain\n\n            if at.residue != prev_res:\n                hybrid_residue = hybrid_top.addResidue(\n                    at.residue.name, hybrid_chain, at.residue.id\n                )\n                prev_res = at.residue\n\n            hybrid_atom = hybrid_top.addAtom(\n                at.name, at.element, hybrid_residue, at.id\n            )\n\n        # Next we deal with bonds\n        # loop over the topology atoms once to avoid repeated calls\n        hybrid_top_atom_list = list(hybrid_top.atoms())\n        # First we add in all the old topology bonds\n        for bond in self._old_topology.bonds():\n            at1 = self.old_to_hybrid_atom_map[bond.atom1.index]\n            at2 = self.old_to_hybrid_atom_map[bond.atom2.index]\n\n            hybrid_top.addBond(\n                hybrid_top_atom_list[at1],\n                hybrid_top_atom_list[at2],\n                bond.type, bond.order,\n            )\n\n        # Finally we add in all the bonds from the unique atoms in the\n        # new Topology\n        for bond in self._new_topology.bonds():\n            at1 = self.new_to_hybrid_atom_map[bond.atom1.index]\n            at2 = self.new_to_hybrid_atom_map[bond.atom2.index]\n            if ((at1 in self._atom_classes['unique_new_atoms']) or\n                (at2 in self._atom_classes['unique_new_atoms'])):\n                hybrid_top.addBond(\n                    hybrid_top_atom_list[at1],\n                    hybrid_top_atom_list[at2],\n                    bond.type, bond.order,\n                )\n\n        return hybrid_top\n\n    def old_positions(self, hybrid_positions):\n        \"\"\"\n        From input hybrid positions, get the positions which would correspond\n        to the old system\n\n        Parameters\n        ----------\n        hybrid_positions : [n, 3] np.ndarray or simtk.unit.Quantity\n            The positions of the hybrid system\n\n        Returns\n        -------\n        old_positions : [m, 3] np.ndarray with unit\n            The positions of the old system\n        \"\"\"\n        n_atoms_old = self._old_system.getNumParticles()\n        # making sure hybrid positions are simtk.unit.Quantity objects\n        if not isinstance(hybrid_positions, unit.Quantity):\n            hybrid_positions = unit.Quantity(hybrid_positions,\n                                             unit=unit.nanometer)\n        old_positions = unit.Quantity(np.zeros([n_atoms_old, 3]),\n                                      unit=unit.nanometer)\n        for idx in range(n_atoms_old):\n            hyb_idx = self._old_to_hybrid_map[idx]\n            old_positions[idx, :] = hybrid_positions[hyb_idx, :]\n        return old_positions\n\n    def new_positions(self, hybrid_positions):\n        \"\"\"\n        From input hybrid positions, get the positions which could correspond\n        to the new system.\n\n        Parameters\n        ----------\n        hybrid_positions : [n, 3] np.ndarray or simtk.unit.Quantity\n            The positions of the hybrid system\n\n        Returns\n        -------\n        new_positions : [m, 3] np.ndarray with unit\n            The positions of the new system\n        \"\"\"\n        n_atoms_new = self._new_system.getNumParticles()\n        # making sure hybrid positions are simtk.unit.Quantity objects\n        if not isinstance(hybrid_positions, unit.Quantity):\n            hybrid_positions = unit.Quantity(hybrid_positions,\n                                             unit=unit.nanometer)\n        new_positions = unit.Quantity(np.zeros([n_atoms_new, 3]),\n                                      unit=unit.nanometer)\n        for idx in range(n_atoms_new):\n            hyb_idx = self._new_to_hybrid_map[idx]\n            new_positions[idx, :] = hybrid_positions[hyb_idx, :]\n        return new_positions\n\n    @property\n    def hybrid_system(self):\n        \"\"\"\n        The hybrid system.\n\n        Returns\n        -------\n        hybrid_system : openmm.System\n            The system representing a hybrid between old and new topologies\n        \"\"\"\n        return self._hybrid_system\n\n    @property\n    def new_to_hybrid_atom_map(self):\n        \"\"\"\n        Give a dictionary that maps new system atoms to the hybrid system.\n\n        Returns\n        -------\n        new_to_hybrid_atom_map : dict of {int, int}\n            The mapping of atoms from the new system to the hybrid\n        \"\"\"\n        return self._new_to_hybrid_map\n\n    @property\n    def old_to_hybrid_atom_map(self):\n        \"\"\"\n        Give a dictionary that maps old system atoms to the hybrid system.\n\n        Returns\n        -------\n        old_to_hybrid_atom_map : dict of {int, int}\n            The mapping of atoms from the old system to the hybrid\n        \"\"\"\n        return self._old_to_hybrid_map\n\n    @property\n    def hybrid_positions(self):\n        \"\"\"\n        The positions of the hybrid system. Dimensionality is (n_environment +\n        n_core + n_old_unique + n_new_unique).\n        The positions are assigned by first copying all the mapped positions\n        from the old system in, then copying the mapped positions from the new\n        system.\n\n        Returns\n        -------\n        hybrid_positions : [n, 3] Quantity nanometers\n        \"\"\"\n        return self._hybrid_positions\n\n    @property\n    def hybrid_topology(self):\n        \"\"\"\n        An MDTraj hybrid topology for the purpose of writing out trajectories.\n\n        Note that we do not expect this to be able to be parameterized by the\n        openmm forcefield class.\n\n        Returns\n        -------\n        hybrid_topology : mdtraj.Topology\n        \"\"\"\n        return self._hybrid_topology\n\n    @property\n    def omm_hybrid_topology(self):\n        \"\"\"\n        An OpenMM format of the hybrid topology. Also cannot be used to\n        parameterize system, only to write out trajectories.\n\n        Returns\n        -------\n        hybrid_topology : simtk.openmm.app.Topology\n\n\n        .. versionchanged:: OpenFE 0.11\n           Now returns a Topology directly constructed from the input\n           old / new Topologies, instead of trying to roundtrip an\n           mdtraj topology.\n        \"\"\"\n        return self._omm_hybrid_topology\n\n    @property\n    def has_virtual_sites(self):\n        \"\"\"\n        Checks the hybrid system and tells us if we have any virtual sites.\n\n        Returns\n        -------\n        bool\n          ``True`` if there are virtual sites, otherwise ``False``.\n        \"\"\"\n        for ix in range(self._hybrid_system.getNumParticles()):\n            if self._hybrid_system.isVirtualSite(ix):\n                return True\n        return False\n"
  },
  {
    "path": "src/openfe/protocols/openmm_rfe/_rfe_utils/topologyhelpers.py",
    "content": "# This code is in parts based on TopologyProposal in perses\n# (https://github.com/choderalab/perses)\n# The eventual goal is to move this to the OpenFE alchemical topology\n# building toolsets.\n# LICENSE: MIT\n\n# turn off formatting since this is mostly vendored code\n# fmt: off\n\nimport itertools\nimport logging\nimport warnings\nfrom copy import deepcopy\nfrom typing import Optional, Union\n\nimport mdtraj as mdt\nimport numpy as np\nimport numpy.typing as npt\nfrom mdtraj.core.residue_names import _SOLVENT_TYPES\nfrom openff.units import Quantity, unit\nfrom openmm import NonbondedForce, System, app\nfrom openmm import unit as omm_unit\n\nfrom openfe import SolventComponent\n\nlogger = logging.getLogger(__name__)\n\n\ndef _get_ion_and_water_parameters(\n    topology: app.Topology,\n    system: System,\n    ion_resname: str,\n    water_resname: str = 'HOH',\n):\n    \"\"\"\n    Get ion, and water (oxygen and hydrogen) atoms parameters.\n\n    Parameters\n    ----------\n    topology : app.Topology\n      The topology to search for the ion and water\n    system : app.System\n      The system associated with the input topology object.\n    ion_resname : str\n      The residue name of the ion to get parameters for\n    water_resname : str\n      The residue name of the water to get parameters for. Default 'HOH'.\n\n    Returns\n    -------\n    ion_charge : float\n      The partial charge of the ion atom\n    ion_sigma : float\n      The NonbondedForce sigma parameter of the ion atom\n    ion_epsilon : float\n      The NonbondedForce epsilon parameter of the ion atom\n    o_charge : float\n      The partial charge of the water oxygen.\n    h_charge : float\n      The partial charge of the water hydrogen.\n\n    Raises\n    ------\n    ValueError\n      If there are no ``ion_resname`` or ``water_resname`` named residues in\n      the input ``topology``.\n\n    Attribution\n    -----------\n    Based on `perses.utils.charge_changing.get_ion_and_water_parameters`.\n    \"\"\"\n    def _find_atom(topology, resname, elementname):\n        for atom in topology.atoms():\n            if atom.residue.name == resname:\n                if (elementname is None or atom.element.symbol == elementname):\n                    return atom.index\n        errmsg = (\"Error encountered when attempting to explicitly handle \"\n                  \"charge changes using an alchemical water. No residue \"\n                  f\"named: {resname} found, with element {elementname}\")\n        raise ValueError(errmsg)\n\n    ion_index = _find_atom(topology, ion_resname, None)\n    oxygen_index = _find_atom(topology, water_resname, 'O')\n    hydrogen_index = _find_atom(topology, water_resname, 'H')\n\n    nbf = [i for i in system.getForces()\n           if isinstance(i, NonbondedForce)][0]\n\n    ion_charge, ion_sigma, ion_epsilon = nbf.getParticleParameters(ion_index)\n    o_charge, _, _ = nbf.getParticleParameters(oxygen_index)\n    h_charge, _, _ = nbf.getParticleParameters(hydrogen_index)\n\n    return ion_charge, ion_sigma, ion_epsilon, o_charge, h_charge\n\n\ndef _fix_alchemical_water_atom_mapping(\n    system_mapping: dict[str, Union[dict[int, int], list[int]]],\n    b_idx: int,\n) -> None:\n    \"\"\"\n    In-place fix atom mapping to account for alchemical water.\n\n    Parameters\n    ----------\n    system_mapping : dict\n      Dictionary of system mappings.\n    b_idx : int\n      The index of the state B particle.\n    \"\"\"\n    a_idx = system_mapping['new_to_old_atom_map'][b_idx]\n\n    # Note, because these are already shared positions, we don't\n    # append alchemical molecule indices in the new & old molecule\n    # i.e. the `old_mol_indices` and `new_mol_indices` lists\n\n    # remove atom from the environment atom map\n    system_mapping['old_to_new_env_atom_map'].pop(a_idx)\n    system_mapping['new_to_old_env_atom_map'].pop(b_idx)\n\n    # add atom to the new_to_old_core atom maps\n    system_mapping['old_to_new_core_atom_map'][a_idx] = b_idx\n    system_mapping['new_to_old_core_atom_map'][b_idx] = a_idx\n\n\ndef handle_alchemical_waters(\n    water_resids: list[int], topology: app.Topology,\n    system: System, system_mapping: dict,\n    charge_difference: int,\n    solvent_component: SolventComponent,\n):\n    \"\"\"\n    Add alchemical waters from a pre-defined list.\n\n    Parameters\n    ----------\n    water_resids : list[int]\n      A list of alchemical water residues.\n    topology : app.Topology\n      The topology to search for the ion and water\n    system : app.System\n      The system associated with the input topology object.\n    system_mapping : dictionary\n      A dictionary of system mappings between the stateA and stateB systems\n    charge_difference : int\n      The charge difference between state A and state B.\n    positive_ion_resname : str\n      The name of a positive ion to replace the water with if the absolute\n      charge difference is positive.\n    negative_ion_resname : str\n      The name of a negative ion to replace the water with if the absolute\n      charge difference is negative.\n    water_resname : str\n      The residue name of the water to get parameters for. Default 'HOH'.\n\n    Raises\n    ------\n    ValueError\n      If the absolute charge difference is not equalent to the number of\n      alchemical water resids.\n      If the chosen alchemical water has virtual sites (i.e. is not\n      a 3 site water molecule).\n\n    Attribution\n    -----------\n    Based on `perses.utils.charge_changing.transform_waters_into_ions`.\n    \"\"\"\n\n    if abs(charge_difference) != len(water_resids):\n        errmsg = (\"There should be as many alchemical water residues: \"\n                  f\"{len(water_resids)} as the absolute charge \"\n                  f\"difference: {abs(charge_difference)}\")\n        raise ValueError(errmsg)\n\n    if charge_difference > 0:\n        ion_resname = solvent_component.positive_ion.strip('-+').upper()\n    elif charge_difference < 0:\n        ion_resname = solvent_component.negative_ion.strip('-+').upper()\n    # if there's no charge difference then just skip altogether\n    else:\n        return None\n\n    ion_charge, ion_sigma, ion_epsilon, o_charge, h_charge = _get_ion_and_water_parameters(\n        topology, system, ion_resname,\n        'HOH',  # Modeller always adds HOH waters\n    )\n\n    # get the nonbonded forces\n    nbfrcs = [i for i in system.getForces()\n              if isinstance(i, NonbondedForce)]\n    if len(nbfrcs) > 1:\n        raise ValueError(\"Too many NonbondedForce forces found\")\n\n    # for convenience just grab the first & only entry\n    nbf = nbfrcs[0]\n\n    # Loop through residues, check if they match the residue index\n    # mutate the atom as necessary\n    for res in topology.residues():\n        if res.index in water_resids:\n            # if the number of atoms > 3, then we have virtual sites which are\n            # not supported currently\n            if len([at for at in res.atoms()]) > 3:\n                errmsg = (\"Non 3-site waters (i.e. waters with virtual sites) \"\n                          \"are not currently supported as alchemical waters\")\n                raise ValueError(errmsg)\n\n            for at in res.atoms():\n                idx = at.index\n                charge, sigma, epsilon = nbf.getParticleParameters(idx)\n                _fix_alchemical_water_atom_mapping(system_mapping, idx)\n\n                if charge == o_charge:\n                    nbf.setParticleParameters(\n                        idx, ion_charge, ion_sigma, ion_epsilon\n                    )\n                else:\n                    if charge != h_charge:\n                        errmsg = (\"modifying an atom that doesn't match known \"\n                                  \"water parameters\")\n                        raise ValueError(errmsg)\n\n                    nbf.setParticleParameters(idx, 0.0, sigma, epsilon)\n\n\ndef get_alchemical_waters(\n    topology: app.Topology,\n    positions: npt.NDArray,\n    charge_difference: int,\n    distance_cutoff: Quantity = 0.8 * unit.nanometer,\n) -> list[int]:\n    \"\"\"\n    Pick a list of waters to be used for alchemical charge correction.\n\n    Parameters\n    ----------\n    topology : openmm.app.Topology\n      The topology to search for an alchemical water.\n    positions : npt.NDArray\n      The coordinates of the atoms associated with the ``topology``.\n    charge_difference : int\n      The charge difference between the two end states\n      calculated as stateA_formal_charge - stateB_formal_charge.\n    distance_cutoff : openff.units.Quantity\n      The minimum distance away from the solutes from which an alchemical\n      water can be chosen.\n\n\n    Returns\n    -------\n    chosen_residues : list[int]\n        A list of residue indices for each chosen alchemical water.\n\n    Notes\n    -----\n    Based off perses.utils.charge_changing.get_water_indices.\n    \"\"\"\n    # if the charge difference is 0 then no waters are needed\n    # return early with an empty list\n    if charge_difference == 0:\n        return []\n\n    # construct a new mdt trajectory\n    traj = mdt.Trajectory(\n        positions[np.newaxis, ...],\n        mdt.Topology.from_openmm(topology)\n    )\n\n    water_atoms = traj.topology.select(\"water\")\n    solvent_residue_names = list(_SOLVENT_TYPES)\n    solute_atoms = [atom.index for atom in traj.topology.atoms\n                    if atom.residue.name not in solvent_residue_names]\n\n    excluded_waters = mdt.compute_neighbors(\n        traj, distance_cutoff.to(unit.nanometer).m,\n        solute_atoms, haystack_indices=water_atoms,\n        periodic=True,\n    )[0]\n\n    solvent_indices = set([\n        atom.residue.index for atom in traj.topology.atoms\n        if (atom.index in water_atoms) and (atom.index not in excluded_waters)\n    ])\n\n    if len(solvent_indices) < 1:\n        errmsg = (\"There are no waters outside of a \"\n                  f\"{distance_cutoff.to(unit.nanometer)} nanometer distance \"\n                  \"of the system solutes to be used as alchemical waters\")\n        raise ValueError(errmsg)\n\n    # unlike the original perses approach, we stick to the first water index\n    # in order to make sure we somewhat reproducibily pick the same water\n    chosen_residues = list(solvent_indices)[:abs(charge_difference)]\n\n    return chosen_residues\n\n\ndef combined_topology(topology1: app.Topology,\n                      topology2: app.Topology,\n                      exclude_resids: Optional[npt.NDArray] = None,):\n    \"\"\"\n    Create a new topology combining these two topologies.\n\n    The box information from the *first* topology will be copied over\n\n    Parameters\n    ----------\n    topology1 : openmm.app.Topology\n      Topology of the template system to graft topology2 into.\n    topology2 : openmm.app.Topology\n      Topology to combine (not in place) with topology1.\n    exclude_resids : npt.NDArray\n      Residue indices in topology 1 to exclude from the combined topology.\n\n    Returns\n    -------\n    new : openmm.app.Topology\n    appended_resids : npt.NDArray\n      Residue indices of the residues appended from topology2 in the new\n      topology.\n    \"\"\"\n    if exclude_resids is None:\n        exclude_resids = np.array([])\n\n    top = app.Topology()\n\n    # create list of excluded residues from topology\n    excluded_res = [\n        r for r in topology1.residues() if r.index in exclude_resids\n    ]\n\n    # get a list of all excluded atoms\n    excluded_atoms = set(itertools.chain.from_iterable(\n        r.atoms() for r in excluded_res)\n    )\n\n    # add new copies of selected chains, residues, and atoms; keep mapping\n    # of old atoms to new for adding bonds later\n    old_to_new_atom_map = {}\n    appended_resids = []\n    for chain_id, chain in enumerate(\n            itertools.chain(topology1.chains(), topology2.chains())):\n        # TODO: is chain ID int or str? I recall it being int in MDTraj....\n        # are there any issues if we just add a blank chain?\n        new_chain = top.addChain(chain_id)\n        for residue in chain.residues():\n            if residue in excluded_res:\n                continue\n\n            new_res = top.addResidue(residue.name,\n                                     new_chain,\n                                     residue.id)\n\n            # append the new resindex if it's part of topology2\n            if residue in list(topology2.residues()):\n                appended_resids.append(new_res.index)\n\n            for atom in residue.atoms():\n                new_atom = top.addAtom(atom.name,\n                                       atom.element,\n                                       new_res,\n                                       atom.id)\n                old_to_new_atom_map[atom] = new_atom\n\n    # figure out which bonds to keep: drop any that involve removed atoms\n    def atoms_for_bond(bond):\n        return {bond.atom1, bond.atom2}\n\n    keep_bonds = (bond for bond in itertools.chain(topology1.bonds(),\n                                                   topology2.bonds())\n                  if not (atoms_for_bond(bond) & excluded_atoms))\n\n    # add bonds to topology\n    for bond in keep_bonds:\n        top.addBond(old_to_new_atom_map[bond.atom1],\n                    old_to_new_atom_map[bond.atom2],\n                    bond.type,\n                    bond.order)\n\n    # Copy over the box vectors\n    top.setPeriodicBoxVectors(topology1.getPeriodicBoxVectors())\n\n    return top, np.array(appended_resids)\n\n\ndef _get_indices(topology, resids):\n    \"\"\"\n    Get the atoms indices from an array of residue indices in an OpenMM Topology\n\n    Parameters\n    ----------\n    topology : openmm.app.Topology\n        Topology to search from.\n    resids : npt.NDArrayLike\n        An array of residue indices which match the residues we want to get\n        atom indices for.\n    \"\"\"\n    # create list of openmm residues\n    top_res = [r for r in topology.residues() if r.index in resids]\n\n    # get a list of all atoms in residues\n    top_atoms = list(itertools.chain.from_iterable(r.atoms() for r in top_res))\n\n    return [at.index for at in top_atoms]\n\n\ndef _remove_constraints(old_to_new_atom_map, old_system, old_topology,\n                        new_system, new_topology):\n    \"\"\"\n    Adapted from Perses' Topology Proposal. Adjusts atom mapping to account for\n    any bonds that are constrained but change in length.\n\n    Parameters\n    ----------\n    old_to_new_atom_map : dict of int : int\n        Atom mapping between the old and new systems.\n    old_system : openmm.app.System\n        System of the \"old\" alchemical state.\n    old_topology : openmm.app.Topology\n        Topology of the \"old\" alchemical state.\n    new_system : openmm.app.System\n        System of the \"new\" alchemical state.\n    new_topology : openmm.app.Topology\n        Topology of the \"new\" alchemical state.\n\n    Returns\n    -------\n    no_const_old_to_new_atom_map : dict of int : int\n        Adjusted version of the input mapping but with atoms involving changes\n        in lengths of constrained bonds removed.\n\n    TODO\n    ----\n    * Very slow, needs refactoring\n    * Can we drop having topologies as inputs here?\n    \"\"\"\n    from collections import Counter\n\n    no_const_old_to_new_atom_map = deepcopy(old_to_new_atom_map)\n\n    h_elem = app.Element.getByAtomicNumber(1)\n    old_H_atoms = {i for i, atom in enumerate(old_topology.atoms())\n                   if atom.element == h_elem and i in old_to_new_atom_map}\n    new_H_atoms = {i for i, atom in enumerate(new_topology.atoms())\n                   if atom.element == h_elem and i in old_to_new_atom_map.values()}\n\n    def pick_H(i, j, x, y) -> int:\n        \"\"\"Identify which atom to remove to resolve constraint violation\n\n        i maps to x, j maps to y\n\n        Returns either i or j (whichever is H) to remove from mapping\n        \"\"\"\n        if i in old_H_atoms or x in new_H_atoms:\n            return i\n        elif j in old_H_atoms or y in new_H_atoms:\n            return j\n        else:\n            raise ValueError(f\"Couldn't resolve constraint demapping for atoms\"\n                             f\" A: {i}-{j} B: {x}-{y}\")\n\n    old_constraints: dict[[int, int], float] = dict()\n    for idx in range(old_system.getNumConstraints()):\n        atom1, atom2, length = old_system.getConstraintParameters(idx)\n\n        if atom1 in old_to_new_atom_map and atom2 in old_to_new_atom_map:\n            old_constraints[atom1, atom2] = length\n\n    new_constraints = dict()\n    for idx in range(new_system.getNumConstraints()):\n        atom1, atom2, length = new_system.getConstraintParameters(idx)\n\n        if (atom1 in old_to_new_atom_map.values() and\n                atom2 in old_to_new_atom_map.values()):\n            new_constraints[atom1, atom2] = length\n\n    # there are two reasons constraints would invalidate a mapping entry\n    # 1) length of constraint changed (but both constrained)\n    # 2) constraint removed to harmonic bond (only one constrained)\n    to_del = []\n    for (i, j), l_old in old_constraints.items():\n        x, y = old_to_new_atom_map[i], old_to_new_atom_map[j]\n\n        try:\n            l_new = new_constraints.pop((x, y))\n        except KeyError:\n            try:\n                l_new = new_constraints.pop((y, x))\n            except KeyError:\n                # type 2) constraint doesn't exist in new system\n                to_del.append(pick_H(i, j, x, y))\n                continue\n\n        # type 1) constraint length changed\n        if l_old != l_new:\n            to_del.append(pick_H(i, j, x, y))\n\n    # iterate over new_constraints (we were .popping items out)\n    # (if any left these are type 2))\n    if new_constraints:\n        new_to_old = {v: k for k, v in old_to_new_atom_map.items()}\n\n        for x, y in new_constraints:\n            i, j = new_to_old[x], new_to_old[y]\n\n            to_del.append(pick_H(i, j, x, y))\n\n    # count the number of times each atom appears\n    to_del_counts = Counter(to_del)\n    # if a H-atom appears more than once, it means it was involved in\n    # multiple different constraints at the end states but that the atom is in the core region\n    # this should not happen\n    for idx, count in to_del_counts.items():\n        if count > 1:\n            # this is raised before we hit the KeyError below\n            raise ValueError(f\"Atom {idx} was involved in {count} unique constraints \"\n                             f\" that changed between the two end-states. This should not happen for core \"\n                             f\"atoms, please check your atom mapping. Please raise an issue on the openfe github with \"\n                             f\"the steps to reproduce this error for more help.\")\n    for idx in to_del:\n        del no_const_old_to_new_atom_map[idx]\n\n    return no_const_old_to_new_atom_map\n\n\ndef get_system_mappings(old_to_new_atom_map,\n                        old_system, old_topology, old_resids,\n                        new_system, new_topology, new_resids,\n                        fix_constraints=True):\n    \"\"\"\n    From a starting alchemical map between two molecules, get the mappings\n    between two alchemical end state systems.\n\n    Optionally, also fixes the mapping to account for a) element changes, and\n    b) changes in bond lengths for constraints.\n\n    Parameters\n    ----------\n    old_to_new_atom_map : dict of int : int\n        Atom mapping between the old and new systems.\n    old_system : openmm.app.System\n        System of the \"old\" alchemical state.\n    old_topology : openmm.app.Topology\n        Topology of the \"old\" alchemical state.\n    old_resids : npt.NDArray\n        Residue ids of the alchemical residues in the \"old\" topology.\n    new_system : openmm.app.System\n        System of the \"new\" alchemical state.\n    new_topology : openmm.app.Topology\n        Topology of the \"new\" alchemical state.\n    new_resids : npt.NDArray\n        Residue ids of the alchemical residues in the \"new\" topology.\n    fix_constraints : bool, default True\n        Whether to fix the atom mapping by removing any atoms which are\n        involved in constrained bonds that change length across the alchemical\n        change.\n\n    Returns\n    -------\n    mappings : dictionary\n        A dictionary with all the necessary mappings for the two systems.\n        These include:\n            1. old_to_new_atom_map\n              This includes all the atoms mapped between the two systems\n              (including non-core atoms, i.e. environment).\n            2. new_to_old_atom_map\n              The inverted dictionary of old_to_new_atom_map\n            3. old_to_new_core_atom_map\n              The atom mapping of the \"core\" atoms (i.e. atoms in alchemical\n              residues) between the old and new systems\n            4. new_to_old_core_atom_map\n              The inverted dictionary of old_to_new_core_atom_map\n            5. old_to_new_env_atom_map\n              The atom mapping of solely the \"environment\" atoms between the\n              old and new systems.\n            6. new_to_old_env_atom_map\n              The inverted dictionaryu of old_to_new_env_atom_map.\n            7. old_mol_indices\n              Indices of the alchemical molecule in the old system.\n              Note: This will not contain the indices of any alchemical waters!\n            8. new_mol_indices\n              Indices of the alchemical molecule in the new system.\n              Note: This will not contain the indices of any alchemical waters!\n    \"\"\"\n    # Get the indices of the atoms in the alchemical residue of interest for\n    # both the old and new systems\n    old_at_indices = _get_indices(old_topology, old_resids)\n    new_at_indices = _get_indices(new_topology, new_resids)\n\n    # We assume that the atom indices are linear in the residue so we shift\n    # by the index of the first atom in each residue\n    adjusted_old_to_new_map = {}\n    for (key, value) in old_to_new_atom_map.items():\n        shift_old = old_at_indices[0] + key\n        shift_new = new_at_indices[0] + value\n        adjusted_old_to_new_map[shift_old] = shift_new\n\n    # TODO: the original intent here was to apply over the full mapping of all\n    # the atoms in the two systems. For now we are only doing the alchemical\n    # residues. We might want to change this as necessary in the future.\n    if not fix_constraints:\n        wmsg = (\"Not attempting to fix atom mapping to account for \"\n                \"constraints. Please note that core atoms which have \"\n                \"constrained bonds and changing bond lengths are not allowed.\")\n        warnings.warn(wmsg)\n    else:\n        adjusted_old_to_new_map = _remove_constraints(\n            adjusted_old_to_new_map, old_system, old_topology,\n            new_system, new_topology)\n\n    # We return a dictionary with all the necessary mappings (as they are\n    # needed downstream). These include:\n    #  1. old_to_new_atom_map\n    #     This includes all the atoms mapped between the two systems\n    #     (including non-core atoms, i.e. environment).\n    #  2. new_to_old_atom_map\n    #     The inverted dictionary of old_to_new_atom_map\n    #  3. old_to_new_core_atom_map\n    #     The atom mapping of the \"core\" atoms (i.e. atoms in alchemical\n    #     residues) between the old and new systems\n    #  4. new_to_old_core_atom_map\n    #     The inverted dictionary of old_to_new_core_atom_map\n    #  5. old_to_new_env_atom_map\n    #     The atom mapping of solely the \"environment\" atoms between the old\n    #     and new systems.\n    #  6. new_to_old_env_atom_map\n    #     The inverted dictionaryu of old_to_new_env_atom_map.\n\n    # Because of how we append the topologies, we can assume that the last\n    # residue in the \"new\" topology is the ligand, just to be sure we check\n    # this here - temp fix for now\n    for at in new_topology.atoms():\n        if at.index > new_at_indices[-1]:\n            raise ValueError(\"residues are appended after the new ligand\")\n\n    # We assume that all the atoms up until the first ligand atom match\n    # except from the indices of the ligand in the old topology.\n    new_to_old_all_map = {}\n    old_mol_offset = len(old_at_indices)\n    for i in range(new_at_indices[0]):\n        if i >= old_at_indices[0]:\n            old_idx = i + old_mol_offset\n        else:\n            old_idx = i\n        new_to_old_all_map[i] = old_idx\n\n    # At this point we only have environment atoms so make a copy\n    new_to_old_env_map = deepcopy(new_to_old_all_map)\n\n    # Next we append the contents of the \"core\" map we already have\n    for key, value in adjusted_old_to_new_map.items():\n        # reverse order because we are going new->old instead of old->new\n        new_to_old_all_map[value] = key\n\n    # Now let's create our output dictionary\n    mappings = {}\n    mappings['new_to_old_atom_map'] = new_to_old_all_map\n    mappings['old_to_new_atom_map'] = {v: k for k, v in new_to_old_all_map.items()}\n    mappings['new_to_old_core_atom_map'] = {v: k for k, v in adjusted_old_to_new_map.items()}\n    mappings['old_to_new_core_atom_map'] = adjusted_old_to_new_map\n    mappings['new_to_old_env_atom_map'] = new_to_old_env_map\n    mappings['old_to_new_env_atom_map'] = {v: k for k, v in new_to_old_env_map.items()}\n    mappings['old_mol_indices'] = old_at_indices\n    mappings['new_mol_indices'] = new_at_indices\n\n    return mappings\n\n\ndef set_and_check_new_positions(mapping, old_topology, new_topology,\n                                old_positions, insert_positions,\n                                tolerance=1.0):\n    \"\"\"\n    Utility to create new positions given a mapping, the old positions and\n    the positions of the molecule being inserted, defined by `insert_positions.\n\n    This will also softly check that the RMS distance between the core atoms\n    of the old and new atoms do not differ by more than the amount specified\n    by `tolerance`.\n\n    Parameters\n    ----------\n    mapping : dict of int : int\n        Dictionary of atom mappings between the old and new systems.\n    old_topology : openmm.app.Topology\n        Topology of the \"old\" alchemical state.\n    new_topology : openmm.app.Topology\n        Topology of the \"new\" alchemical state.\n    old_positions : simtk.unit.Quantity\n        Position of the \"old\" alchemical state.\n    insert_positions : simtk.unit.Quantity\n        Positions of the alchemically changing molecule in the \"new\" alchemical\n        state.\n    tolerance : float\n        Warning threshold for deviations along any dimension (x,y,z) in mapped\n        atoms between the \"old\" and \"new\" positions. Default 1.0.\n    \"\"\"\n    # Get the positions in Angstrom as raw numpy arrays\n    old_pos_array = old_positions.value_in_unit(omm_unit.angstrom)\n    add_pos_array = insert_positions.value_in_unit(omm_unit.angstrom)\n\n    # Create empty ndarray of size atoms to hold the positions\n    new_pos_array = np.zeros((new_topology.getNumAtoms(), 3))\n\n    # get your mappings\n    new_idxs = list(mapping['old_to_new_atom_map'].values())\n    old_idxs = list(mapping['old_to_new_atom_map'].keys())\n    new_mol_idxs = mapping['new_mol_indices']\n\n    # copy over the old positions for mapped atoms\n    new_pos_array[new_idxs, :] = old_pos_array[old_idxs, :]\n    # copy over the new alchemical molecule positions\n    new_pos_array[new_mol_idxs, :] = add_pos_array\n\n    # loop through all mapped atoms and make sure we don't deviate by more than\n    # tolerance - not super necessary, but it's a nice sanity check\n    for key, val in mapping['old_to_new_atom_map'].items():\n        if np.any(\n            np.abs(new_pos_array[val] - old_pos_array[key]) > tolerance):\n            wmsg = f\"mapping {key} : {val} deviates by more than {tolerance}\"\n            warnings.warn(wmsg)\n            logging.warning(wmsg)\n\n    return new_pos_array * omm_unit.angstrom\n"
  },
  {
    "path": "src/openfe/protocols/openmm_rfe/equil_rfe_methods.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\n\"\"\"Equilibrium Relative Free Energy Protocol using OpenMM and OpenMMTools in a\nPerses-like manner.\n\nThis module implements the necessary tooling to calculate the\nrelative free energy of a ligand transformation using OpenMM tools and one of\nthe following methods:\n    - Hamiltonian Replica Exchange\n    - Self-adjusted mixture sampling\n    - Independent window sampling\n\nAcknowledgements\n----------------\nThis Protocol is based on, and leverages components originating from\nthe Perses toolkit (https://github.com/choderalab/perses).\n\"\"\"\n\nfrom .equil_rfe_settings import RelativeHybridTopologyProtocolSettings\nfrom .hybridtop_protocol_results import RelativeHybridTopologyProtocolResult\nfrom .hybridtop_protocols import RelativeHybridTopologyProtocol\nfrom .hybridtop_units import (\n    HybridTopologyMultiStateAnalysisUnit,\n    HybridTopologyMultiStateSimulationUnit,\n    HybridTopologySetupUnit,\n)\n"
  },
  {
    "path": "src/openfe/protocols/openmm_rfe/equil_rfe_settings.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\n\"\"\"Equilibrium Relative Free Energy Protocol input settings.\n\nThis module implements the necessary settings necessary to run relative free\nenergies using :class:`openfe.protocols.openmm_rfe.equil_rfe_methods.py`\n\n\"\"\"\n\nfrom __future__ import annotations\n\nfrom typing import Literal\n\nfrom gufe.settings import (\n    OpenMMSystemGeneratorFFSettings,\n    Settings,\n    SettingsBaseModel,\n    ThermoSettings,\n)\nfrom gufe.settings.typing import NanometerQuantity\nfrom openff.units import unit\nfrom pydantic import ConfigDict, field_validator\n\nfrom openfe.protocols.openmm_utils.omm_settings import (\n    IntegratorSettings,\n    MultiStateOutputSettings,\n    MultiStateSimulationSettings,\n    OpenFFPartialChargeSettings,\n    OpenMMEngineSettings,\n    OpenMMSolvationSettings,\n)\n\n\nclass LambdaSettings(SettingsBaseModel):\n    model_config = ConfigDict(extra=\"ignore\", arbitrary_types_allowed=True)\n\n    \"\"\"Lambda schedule settings.\n\n    Settings controlling the lambda schedule, these include the switching\n    function type, and the number of windows.\n    \"\"\"\n    lambda_functions: str = \"default\"\n    \"\"\"\n    Key of which switching functions to use for alchemical mutation.\n    Default 'default'.\n    \"\"\"\n    lambda_windows: int = 11\n    \"\"\"Number of lambda windows to calculate. Default 11.\"\"\"\n\n\nclass AlchemicalSettings(SettingsBaseModel):\n    model_config = ConfigDict(extra=\"ignore\", arbitrary_types_allowed=True)\n\n    \"\"\"Settings for the alchemical protocol\n\n    This describes the creation of the hybrid system.\n    \"\"\"\n\n    endstate_dispersion_correction: bool = False\n    \"\"\"\n    Whether to have extra unsampled endstate windows for long range\n    correction. Default False.\n    \"\"\"\n\n    # alchemical settings\n    use_dispersion_correction: bool = False\n    \"\"\"\n    Whether to use dispersion correction in the hybrid topology state.\n    Default False.\n    \"\"\"\n    softcore_LJ: Literal[\"gapsys\", \"beutler\"]\n    \"\"\"\n    Whether to use the LJ softcore function as defined by Gapsys et al.\n    JCTC 2012, or the one by Beutler et al. Chem. Phys. Lett. 1994.\n    Default 'gapsys'.\n    \"\"\"\n    softcore_alpha: float = 0.85\n    \"\"\"Softcore alpha parameter. Default 0.85\"\"\"\n    turn_off_core_unique_exceptions: bool = True\n    \"\"\"\n    Whether to turn off interactions for new exceptions (not just 1,4s)\n    at lambda 0 and old exceptions at lambda 1 between unique atoms and core\n    atoms. If False they are present in the nonbonded force. Default True.\n    \"\"\"\n    explicit_charge_correction: bool = False\n    \"\"\"\n    Whether to explicitly account for a charge difference during the\n    alchemical transformation by transforming a water to a counterion\n    of the opposite charge of the formal charge difference.\n\n    Please note that this feature is currently in beta and poorly tested.\n\n    Absolute charge changes greater than 1 are\n    currently not supported.\n\n    Default False.\n    \"\"\"\n    explicit_charge_correction_cutoff: NanometerQuantity = 0.8 * unit.nanometer\n    \"\"\"\n    The minimum distance from the system solutes from which an\n    alchemical water can be chosen. Default 0.8 * unit.nanometer.\n    \"\"\"\n\n\nclass RelativeHybridTopologyProtocolSettings(Settings):\n    protocol_repeats: int\n    \"\"\"\n    The number of completely independent repeats of the entire sampling\n    process. The mean of the repeats defines the final estimate of FE\n    difference, while the variance between repeats is used as the uncertainty.\n    \"\"\"\n\n    @field_validator(\"protocol_repeats\")\n    def must_be_positive(cls, v):\n        if v <= 0:\n            errmsg = f\"protocol_repeats must be a positive value, got {v}.\"\n            raise ValueError(errmsg)\n        return v\n\n    # Inherited things\n\n    forcefield_settings: OpenMMSystemGeneratorFFSettings\n    \"\"\"Parameters to set up the force field with OpenMM Force Fields.\"\"\"\n    thermo_settings: ThermoSettings\n    \"\"\"Settings for thermodynamic parameters.\"\"\"\n\n    # Things for creating the systems\n    solvation_settings: OpenMMSolvationSettings\n    \"\"\"Settings for solvating the system.\"\"\"\n    partial_charge_settings: OpenFFPartialChargeSettings\n    \"\"\"Settings for assigning partial charges to small molecules.\"\"\"\n\n    # Alchemical settings\n    lambda_settings: LambdaSettings\n    \"\"\"\n    Lambda protocol settings including lambda windows and lambda functions.\n    \"\"\"\n    alchemical_settings: AlchemicalSettings\n    \"\"\"\n    Alchemical protocol settings including soft core scaling.\n    \"\"\"\n    simulation_settings: MultiStateSimulationSettings\n    \"\"\"\n    Settings for alchemical sampler.\n    \"\"\"\n\n    # MD Engine things\n    engine_settings: OpenMMEngineSettings\n    \"\"\"Settings specific to the OpenMM engine such as the compute platform.\"\"\"\n\n    # Sampling State defining things\n    integrator_settings: IntegratorSettings\n    \"\"\"Settings for the integrator such as timestep and barostat settings.\"\"\"\n\n    output_settings: MultiStateOutputSettings\n    \"\"\"\n    Simulation output control settings.\n    \"\"\"\n"
  },
  {
    "path": "src/openfe/protocols/openmm_rfe/hybridtop_protocol_results.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\n\"\"\"\nProtocolUnitResults for Hybrid Topology methods using\nOpenMM and OpenMMTools in a Perses-like manner.\n\"\"\"\n\nimport logging\nimport pathlib\nimport warnings\nfrom typing import Optional, Union\n\nimport gufe\nimport numpy as np\nimport numpy.typing as npt\nfrom openff.units import Quantity\nfrom openmmtools import multistate\n\nlogger = logging.getLogger(__name__)\n\n\nclass RelativeHybridTopologyProtocolResult(gufe.ProtocolResult):\n    \"\"\"\n    Protocol results with the output of a RelativeHybridTopologyProtocol.\n    \"\"\"\n\n    def __init__(self, **data):\n        super().__init__(**data)\n        # data is mapping of str(repeat_id): list[protocolunitresults]\n        # TODO: Detect when we have extensions and stitch these together?\n        if any(len(pur_list) > 2 for pur_list in self.data.values()):\n            raise NotImplementedError(\"Can't stitch together results yet\")\n\n    @staticmethod\n    def compute_mean_estimate(dGs: list[Quantity]) -> Quantity:\n        u = dGs[0].u\n        # convert all values to units of the first value, then take average of magnitude\n        # this would avoid an edge case where each value was in different units\n        vals = np.asarray([dG.to(u).m for dG in dGs])\n\n        return np.average(vals) * u\n\n    def get_estimate(self) -> Quantity:\n        \"\"\"Average free energy difference of this transformation\n\n        Returns\n        -------\n        dG : openff.units.Quantity\n          The free energy difference between the first and last states. This is\n          a Quantity defined with units.\n        \"\"\"\n        # TODO: Check this holds up completely for SAMS.\n        dGs = [pus[0].outputs[\"unit_estimate\"] for pus in self.data.values()]\n        return self.compute_mean_estimate(dGs)\n\n    @staticmethod\n    def compute_uncertainty(dGs: list[Quantity]) -> Quantity:\n        u = dGs[0].u\n        # convert all values to units of the first value, then take average of magnitude\n        # this would avoid a screwy case where each value was in different units\n        vals = np.asarray([dG.to(u).m for dG in dGs])\n\n        return np.std(vals) * u\n\n    def get_uncertainty(self) -> Quantity:\n        \"\"\"The uncertainty/error in the dG value: The std of the estimates of\n        each independent repeat\n        \"\"\"\n\n        dGs = [pus[0].outputs[\"unit_estimate\"] for pus in self.data.values()]\n        return self.compute_uncertainty(dGs)\n\n    def get_individual_estimates(self) -> list[tuple[Quantity, Quantity]]:\n        \"\"\"Return a list of tuples containing the individual free energy\n        estimates and associated MBAR errors for each repeat.\n\n        Returns\n        -------\n        dGs : list[tuple[openff.units.Quantity]]\n          n_replicate simulation list of tuples containing the free energy\n          estimates (first entry) and associated MBAR estimate errors\n          (second entry).\n        \"\"\"\n        dGs = [\n            (pus[0].outputs[\"unit_estimate\"], pus[0].outputs[\"unit_estimate_error\"])\n            for pus in self.data.values()\n        ]\n        return dGs\n\n    def get_forward_and_reverse_energy_analysis(\n        self,\n    ) -> list[Optional[dict[str, Union[npt.NDArray, Quantity]]]]:\n        \"\"\"\n        Get a list of forward and reverse analysis of the free energies\n        for each repeat using uncorrelated production samples.\n\n        The returned dicts have keys:\n        'fractions' - the fraction of data used for this estimate\n        'forward_DGs', 'reverse_DGs' - for each fraction of data, the estimate\n        'forward_dDGs', 'reverse_dDGs' - for each estimate, the uncertainty\n\n        The 'fractions' values are a numpy array, while the other arrays are\n        Quantity arrays, with units attached.\n\n        If the list entry is ``None`` instead of a dictionary, this indicates\n        that the analysis could not be carried out for that repeat. This\n        is most likely caused by MBAR convergence issues when attempting to\n        calculate free energies from too few samples.\n\n\n        Returns\n        -------\n        forward_reverse : list[Optional[dict[str, Union[npt.NDArray, openff.units.Quantity]]]]\n\n\n        Raises\n        ------\n        UserWarning\n          If any of the forward and reverse entries are ``None``.\n        \"\"\"\n        forward_reverse = [\n            pus[0].outputs[\"forward_and_reverse_energies\"] for pus in self.data.values()\n        ]\n\n        if None in forward_reverse:\n            wmsg = (\n                \"One or more ``None`` entries were found in the list of \"\n                \"forward and reverse analyses. This is likely caused by \"\n                \"an MBAR convergence failure caused by too few independent \"\n                \"samples when calculating the free energies of the 10% \"\n                \"timeseries slice.\"\n            )\n            warnings.warn(wmsg)\n\n        return forward_reverse\n\n    def get_overlap_matrices(self) -> list[dict[str, npt.NDArray]]:\n        \"\"\"\n        Return a list of dictionary containing the MBAR overlap estimates\n        calculated for each repeat.\n\n        Returns\n        -------\n        overlap_stats : list[dict[str, npt.NDArray]]\n          A list of dictionaries containing the following keys:\n            * ``scalar``: One minus the largest nontrivial eigenvalue\n            * ``eigenvalues``: The sorted (descending) eigenvalues of the\n              overlap matrix\n            * ``matrix``: Estimated overlap matrix of observing a sample from\n              state i in state j\n        \"\"\"\n        # Loop through and get the repeats and get the matrices\n        overlap_stats = [pus[0].outputs[\"unit_mbar_overlap\"] for pus in self.data.values()]\n\n        return overlap_stats\n\n    def get_replica_transition_statistics(self) -> list[dict[str, npt.NDArray]]:\n        \"\"\"The replica lambda state transition statistics for each repeat.\n\n        Note\n        ----\n        This is currently only available in cases where a replica exchange\n        simulation was run.\n\n        Returns\n        -------\n        repex_stats : list[dict[str, npt.NDArray]]\n          A list of dictionaries containing the following:\n            * ``eigenvalues``: The sorted (descending) eigenvalues of the\n              lambda state transition matrix\n            * ``matrix``: The transition matrix estimate of a replica switching\n              from state i to state j.\n        \"\"\"\n        try:\n            repex_stats = [\n                pus[0].outputs[\"replica_exchange_statistics\"] for pus in self.data.values()\n            ]\n        except KeyError:\n            errmsg = \"Replica exchange statistics were not found, did you run a repex calculation?\"\n            raise ValueError(errmsg)\n\n        return repex_stats\n\n    def get_replica_states(self) -> list[npt.NDArray]:\n        \"\"\"\n        Returns the timeseries of replica states for each repeat.\n\n        Returns\n        -------\n        replica_states : List[npt.NDArray]\n          List of replica states for each repeat\n        \"\"\"\n\n        def is_file(filename: str):\n            p = pathlib.Path(filename)\n            if not p.exists():\n                errmsg = f\"File could not be found {p}\"\n                raise ValueError(errmsg)\n            return p\n\n        replica_states = []\n\n        for pus in self.data.values():\n            nc = is_file(pus[0].outputs[\"trajectory\"])\n            dir_path = nc.parents[0]\n            chk = is_file(pus[0].outputs[\"checkpoint\"]).name\n            reporter = multistate.MultiStateReporter(\n                storage=nc, checkpoint_storage=chk, open_mode=\"r\"\n            )\n            replica_states.append(np.asarray(reporter.read_replica_thermodynamic_states()))\n            reporter.close()\n\n        return replica_states\n\n    def equilibration_iterations(self) -> list[float]:\n        \"\"\"\n        Returns the number of equilibration iterations for each repeat\n        of the calculation.\n\n        Returns\n        -------\n        equilibration_lengths : list[float]\n        \"\"\"\n        equilibration_lengths = [\n            pus[0].outputs[\"equilibration_iterations\"] for pus in self.data.values()\n        ]\n\n        return equilibration_lengths\n\n    def production_iterations(self) -> list[float]:\n        \"\"\"\n        Returns the number of uncorrelated production samples for each\n        repeat of the calculation.\n\n        Returns\n        -------\n        production_lengths : list[float]\n        \"\"\"\n        production_lengths = [pus[0].outputs[\"production_iterations\"] for pus in self.data.values()]\n\n        return production_lengths\n"
  },
  {
    "path": "src/openfe/protocols/openmm_rfe/hybridtop_protocols.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\n\"\"\"\nHybrid Topology Protocols using OpenMM and OpenMMTools in a Perses-like manner.\n\nAcknowledgements\n----------------\nThese Protocols are based on, and leverages components originating from\nthe Perses toolkit (https://github.com/choderalab/perses).\n\"\"\"\n\nfrom __future__ import annotations\n\nimport logging\nimport uuid\nimport warnings\nfrom collections import defaultdict\nfrom typing import Any, Iterable, Optional, Union\n\nimport gufe\nimport numpy as np\nfrom gufe import (\n    BaseSolventComponent,\n    ChemicalSystem,\n    Component,\n    ComponentMapping,\n    LigandAtomMapping,\n    ProteinComponent,\n    ProteinMembraneComponent,\n    SmallMoleculeComponent,\n    SolventComponent,\n    settings,\n)\nfrom openff.units import unit as offunit\n\nfrom openfe.due import Doi, due\n\nfrom ..openmm_utils import (\n    settings_validation,\n    system_validation,\n)\nfrom .equil_rfe_settings import (\n    AlchemicalSettings,\n    IntegratorSettings,\n    LambdaSettings,\n    MultiStateOutputSettings,\n    MultiStateSimulationSettings,\n    OpenFFPartialChargeSettings,\n    OpenMMEngineSettings,\n    OpenMMSolvationSettings,\n    RelativeHybridTopologyProtocolSettings,\n)\nfrom .hybridtop_protocol_results import RelativeHybridTopologyProtocolResult\nfrom .hybridtop_units import (\n    HybridTopologyMultiStateAnalysisUnit,\n    HybridTopologyMultiStateSimulationUnit,\n    HybridTopologySetupUnit,\n)\n\nlogger = logging.getLogger(__name__)\n\n\ndue.cite(\n    Doi(\"10.5281/zenodo.1297683\"),\n    description=\"Perses\",\n    path=\"openfe.protocols.openmm_rfe.hybridtop_protocols\",\n    cite_module=True,\n)\n\ndue.cite(\n    Doi(\"10.5281/zenodo.596622\"),\n    description=\"OpenMMTools\",\n    path=\"openfe.protocols.openmm_rfe.hybridtop_protocols\",\n    cite_module=True,\n)\n\ndue.cite(\n    Doi(\"10.1371/journal.pcbi.1005659\"),\n    description=\"OpenMM\",\n    path=\"openfe.protocols.openmm_rfe.hybridtop_protocols\",\n    cite_module=True,\n)\n\n\nclass RelativeHybridTopologyProtocol(gufe.Protocol):\n    \"\"\"\n    Relative Free Energy calculations using a Hybrid Topology scheme\n    using OpenMM and OpenMMTools.\n\n    Based on `Perses <https://github.com/choderalab/perses>`_\n\n    See Also\n    --------\n    :mod:`openfe.protocols`\n    :class:`openfe.protocols.openmm_rfe.RelativeHybridTopologySettings`\n    :class:`openfe.protocols.openmm_rfe.RelativeHybridTopologyResult`\n    :class:`openfe.protocols.openmm_rfe.RelativeHybridTopologyProtocolUnit`\n    \"\"\"\n\n    result_cls = RelativeHybridTopologyProtocolResult\n    _settings_cls = RelativeHybridTopologyProtocolSettings\n    _settings: RelativeHybridTopologyProtocolSettings\n\n    @classmethod\n    def _default_settings(cls):\n        \"\"\"A dictionary of initial settings for this creating this Protocol\n\n        These settings are intended as a suitable starting point for creating\n        an instance of this protocol.  It is recommended, however that care is\n        taken to inspect and customize these before performing a Protocol.\n\n        Returns\n        -------\n        Settings\n          a set of default settings\n        \"\"\"\n        return RelativeHybridTopologyProtocolSettings(\n            protocol_repeats=3,\n            forcefield_settings=settings.OpenMMSystemGeneratorFFSettings(),\n            thermo_settings=settings.ThermoSettings(\n                temperature=298.15 * offunit.kelvin,\n                pressure=1 * offunit.bar,\n            ),\n            partial_charge_settings=OpenFFPartialChargeSettings(),\n            solvation_settings=OpenMMSolvationSettings(),\n            alchemical_settings=AlchemicalSettings(softcore_LJ=\"gapsys\"),\n            lambda_settings=LambdaSettings(),\n            simulation_settings=MultiStateSimulationSettings(\n                equilibration_length=1.0 * offunit.nanosecond,\n                production_length=5.0 * offunit.nanosecond,\n            ),\n            engine_settings=OpenMMEngineSettings(),\n            integrator_settings=IntegratorSettings(),\n            output_settings=MultiStateOutputSettings(),\n        )\n\n    @classmethod\n    def _adaptive_settings(\n        cls,\n        stateA: ChemicalSystem,\n        stateB: ChemicalSystem,\n        mapping: gufe.LigandAtomMapping | list[gufe.LigandAtomMapping],\n        initial_settings: None | RelativeHybridTopologyProtocolSettings = None,\n    ) -> RelativeHybridTopologyProtocolSettings:\n        \"\"\"\n        Get the recommended OpenFE settings for this protocol based on the input states involved in the\n        transformation.\n\n        These are intended as a suitable starting point for creating an instance of this protocol, which can be further\n        customized before performing a Protocol.\n\n        Parameters\n        ----------\n        stateA : ChemicalSystem\n            The initial state of the transformation.\n        stateB : ChemicalSystem\n            The final state of the transformation.\n        mapping : LigandAtomMapping | list[LigandAtomMapping]\n            The mapping(s) between transforming components in stateA and stateB.\n        initial_settings : None | RelativeHybridTopologyProtocolSettings, optional\n            Initial settings to base the adaptive settings on. If None, default settings are used.\n\n        Returns\n        -------\n        RelativeHybridTopologyProtocolSettings\n            The recommended settings for this protocol based on the input states.\n\n        Notes\n        -----\n        - If the transformation involves a change in net charge, the settings are adapted to use a more expensive\n          protocol with 22 lambda windows and 20 ns production length per window.\n        - If both states contain a ProteinComponent, the solvation padding is set to 1 nm.\n        - If initial_settings is provided, the adaptive settings are based on a copy of these settings.\n        \"\"\"\n        # use initial settings or default settings\n        # this is needed for the CLI so we don't override user settings\n        if initial_settings is not None:\n            protocol_settings = initial_settings.model_copy(deep=True)\n        else:\n            protocol_settings = cls.default_settings()\n\n        if isinstance(mapping, list):\n            mapping = mapping[0]\n\n        if mapping.get_alchemical_charge_difference() != 0:\n            # apply the recommended charge change settings taken from the industry benchmarking as fast settings not validated\n            # <https://github.com/OpenFreeEnergy/IndustryBenchmarks2024/blob/2df362306e2727321d55d16e06919559338c4250/industry_benchmarks/utils/plan_rbfe_network.py#L128-L146>\n            info = (\n                \"Charge changing transformation between ligands \"\n                f\"{mapping.componentA.name} and {mapping.componentB.name}. \"\n                \"A more expensive protocol with 22 lambda windows, sampled \"\n                \"for 20 ns each, will be used here.\"\n            )\n            logger.info(info)\n            protocol_settings.alchemical_settings.explicit_charge_correction = True\n            protocol_settings.simulation_settings.production_length = 20 * offunit.nanosecond\n            protocol_settings.simulation_settings.n_replicas = 22\n            protocol_settings.lambda_settings.lambda_windows = 22\n\n        # adapt the solvation padding based on the system components\n        if stateA.contains(ProteinComponent):\n            protocol_settings.solvation_settings.solvent_padding = 1 * offunit.nanometer\n\n        # adapt the barostat based on the system components\n        if stateA.contains(ProteinMembraneComponent):\n            protocol_settings.integrator_settings.barostat = \"MonteCarloMembraneBarostat\"\n\n        return protocol_settings\n\n    @staticmethod\n    def _validate_endstates(\n        stateA: ChemicalSystem,\n        stateB: ChemicalSystem,\n    ) -> None:\n        \"\"\"\n        Validates the end states for the RFE protocol.\n\n        Parameters\n        ----------\n        stateA : ChemicalSystem\n          The chemical system of end state A.\n        stateB : ChemicalSystem\n          The chemical system of end state B.\n\n        Raises\n        ------\n        ValueError\n          * If either state contains more than one unique Component.\n          * If unique components are not SmallMoleculeComponents.\n        \"\"\"\n        # Get the difference in Components between each state\n        diff = stateA.component_diff(stateB)\n\n        for i, entry in enumerate(diff):\n            state_label = \"A\" if i == 0 else \"B\"\n\n            # Check that there is only one unique Component in each state\n            if len(entry) != 1:\n                errmsg = (\n                    \"Only one alchemical component is allowed per end state. \"\n                    f\"Found {len(entry)} in state {state_label}.\"\n                )\n                raise ValueError(errmsg)\n\n            # Check that the unique Component is a SmallMoleculeComponent\n            if not isinstance(entry[0], SmallMoleculeComponent):\n                errmsg = (\n                    f\"Alchemical component in state {state_label} is of type \"\n                    f\"{type(entry[0])}, but only SmallMoleculeComponents \"\n                    \"transformations are currently supported.\"\n                )\n                raise ValueError(errmsg)\n\n    @staticmethod\n    def _validate_mapping(\n        mapping: Optional[Union[ComponentMapping, list[ComponentMapping]]],\n        alchemical_components: dict[str, list[Component]],\n    ) -> None:\n        \"\"\"\n        Validates that the provided mapping(s) are suitable for the RFE protocol.\n\n        Parameters\n        ----------\n        mapping : Optional[Union[ComponentMapping, list[ComponentMapping]]]\n          all mappings between transforming components.\n        alchemical_components : dict[str, list[Component]]\n          Dictionary containing the alchemical components for\n          states A and B.\n\n        Raises\n        ------\n        ValueError\n          * If there are more than one mapping or mapping is None\n          * If the mapping components are not in the alchemical components.\n        UserWarning\n          * Mappings which involve element changes in core atoms\n        \"\"\"\n        # if a single mapping is provided, convert to list\n        if isinstance(mapping, ComponentMapping):\n            mapping = [mapping]\n\n        # For now we only support a single mapping\n        if mapping is None or len(mapping) > 1:\n            errmsg = \"A single LigandAtomMapping is expected for this Protocol\"\n            raise ValueError(errmsg)\n\n        # check that the mapping components are in the alchemical components\n        for m in mapping:\n            for state in [\"A\", \"B\"]:\n                comp = getattr(m, f\"component{state}\")\n                if comp not in alchemical_components[f\"state{state}\"]:\n                    raise ValueError(\n                        f\"Mapping component{state} {comp} not \"\n                        f\"in alchemical components of state{state}\"\n                    )\n\n        # TODO: remove - this is now the default behaviour?\n        # Check for element changes in mappings\n        for m in mapping:\n            molA = m.componentA.to_rdkit()\n            molB = m.componentB.to_rdkit()\n            for i, j in m.componentA_to_componentB.items():\n                atomA = molA.GetAtomWithIdx(i)\n                atomB = molB.GetAtomWithIdx(j)\n                if atomA.GetAtomicNum() != atomB.GetAtomicNum():\n                    wmsg = (\n                        f\"Element change in mapping between atoms \"\n                        f\"Ligand A: {i} (element {atomA.GetAtomicNum()}) and \"\n                        f\"Ligand B: {j} (element {atomB.GetAtomicNum()})\\n\"\n                        \"No mass scaling is attempted in the hybrid topology, \"\n                        \"the average mass of the two atoms will be used in the \"\n                        \"simulation\"\n                    )\n                    logger.warning(wmsg)\n                    warnings.warn(wmsg)\n\n    @staticmethod\n    def _validate_smcs(\n        stateA: ChemicalSystem,\n        stateB: ChemicalSystem,\n    ) -> None:\n        \"\"\"\n        Validates the SmallMoleculeComponents.\n\n        Parameters\n        ----------\n        stateA : ChemicalSystem\n          The chemical system of end state A.\n        stateB : ChemicalSystem\n          The chemical system of end state B.\n\n        Raises\n        ------\n        ValueError\n          * If there are isomorphic SmallMoleculeComponents with\n            different charges within a given ChemicalSystem.\n        \"\"\"\n        smcs_A = stateA.get_components_of_type(SmallMoleculeComponent)\n        smcs_B = stateB.get_components_of_type(SmallMoleculeComponent)\n        smcs_all = list(set(smcs_A).union(set(smcs_B)))\n\n        def _equal_charges(moli, molj):\n            # Base case, both molecules don't have charges\n            if (moli.partial_charges is None) & (molj.partial_charges is None):\n                return True\n            # If either is None but not the other\n            if (moli.partial_charges is None) ^ (molj.partial_charges is None):\n                return False\n            # Check if the charges are close to each other\n            return np.allclose(moli.partial_charges, molj.partial_charges)\n\n        clashes = []\n\n        for smcs in [smcs_A, smcs_B]:\n            offmols = [m.to_openff() for m in smcs]\n            for i, moli in enumerate(offmols):\n                for molj in offmols:\n                    if moli.is_isomorphic_with(molj):\n                        if not _equal_charges(moli, molj):\n                            clashes.append(smcs[i])\n\n        if len(clashes) > 0:\n            errmsg = (\n                \"Found SmallMoleculeComponents that are isomorphic \"\n                \"but with different charges, this is not currently allowed. \"\n                f\"Affected components: {clashes}\"\n            )\n            raise ValueError(errmsg)\n\n    @staticmethod\n    def _validate_charge_difference(\n        mapping: LigandAtomMapping,\n        nonbonded_method: str,\n        explicit_charge_correction: bool,\n        solvent_component: SolventComponent | None,\n    ):\n        \"\"\"\n        Validates the net charge difference between the two states.\n\n        Parameters\n        ----------\n        mapping : dict[str, ComponentMapping]\n          Dictionary of mappings between transforming components.\n        nonbonded_method : str\n          The OpenMM nonbonded method used for the simulation.\n        explicit_charge_correction : bool\n          Whether or not to use an explicit charge correction.\n        solvent_component : openfe.SolventComponent | None\n          The SolventComponent of the simulation.\n\n        Raises\n        ------\n        ValueError\n          * If an explicit charge correction is attempted and the\n            nonbonded method is not PME.\n          * If the absolute charge difference is greater than one\n            and an explicit charge correction is attempted.\n          * If an explicit charge correction is attempted and there is no\n            solvent present.\n        UserWarning\n          * If there is any charge difference.\n        \"\"\"\n        difference = mapping.get_alchemical_charge_difference()\n\n        if abs(difference) == 0:\n            return\n\n        if not explicit_charge_correction:\n            wmsg = (\n                f\"A charge difference of {difference} is observed \"\n                \"between the end states. No charge correction has \"\n                \"been requested, please account for this in your \"\n                \"final results.\"\n            )\n            logger.warning(wmsg)\n            warnings.warn(wmsg)\n            return\n\n        if solvent_component is None:\n            errmsg = \"Cannot use explicit charge correction without solvent\"\n            raise ValueError(errmsg)\n\n        # We implicitly check earlier that we have to have pme for a solvated\n        # system, so we only need to check the nonbonded method here\n        if nonbonded_method.lower() != \"pme\":\n            errmsg = \"Explicit charge correction when not using PME is not currently supported.\"\n            raise ValueError(errmsg)\n\n        if abs(difference) > 1:\n            errmsg = (\n                f\"A charge difference of {difference} is observed \"\n                \"between the end states and an explicit charge  \"\n                \"correction has been requested. Unfortunately \"\n                \"only absolute differences of 1 are supported.\"\n            )\n            raise ValueError(errmsg)\n\n        ion = {-1: solvent_component.positive_ion, 1: solvent_component.negative_ion}[difference]\n\n        wmsg = (\n            f\"A charge difference of {difference} is observed \"\n            \"between the end states. This will be addressed by \"\n            f\"transforming a water into a {ion} ion\"\n        )\n        logger.info(wmsg)\n\n    @staticmethod\n    def _validate_simulation_settings(\n        simulation_settings: MultiStateSimulationSettings,\n        integrator_settings: IntegratorSettings,\n        output_settings: MultiStateOutputSettings,\n    ):\n        \"\"\"\n        Validate various simulation settings, including but not limited to\n        timestep conversions, and output file write frequencies.\n\n        Parameters\n        ----------\n        simulation_settings : MultiStateSimulationSettings\n          The sampler simulation settings.\n        integrator_settings : IntegratorSettings\n          Settings defining the behaviour of the integrator.\n        output_settings : MultiStateOutputSettings\n          Settings defining the simulation file writing behaviour.\n\n        Raises\n        ------\n        ValueError\n          * If the\n        \"\"\"\n\n        steps_per_iteration = settings_validation.convert_steps_per_iteration(\n            simulation_settings=simulation_settings,\n            integrator_settings=integrator_settings,\n        )\n\n        _ = settings_validation.get_simsteps(\n            sim_length=simulation_settings.equilibration_length,\n            timestep=integrator_settings.timestep,\n            mc_steps=steps_per_iteration,\n        )\n\n        _ = settings_validation.get_simsteps(\n            sim_length=simulation_settings.production_length,\n            timestep=integrator_settings.timestep,\n            mc_steps=steps_per_iteration,\n        )\n\n        _ = settings_validation.convert_checkpoint_interval_to_iterations(\n            checkpoint_interval=output_settings.checkpoint_interval,\n            time_per_iteration=simulation_settings.time_per_iteration,\n        )\n\n        if output_settings.positions_write_frequency is not None:\n            _ = settings_validation.divmod_time_and_check(\n                numerator=output_settings.positions_write_frequency,\n                denominator=simulation_settings.time_per_iteration,\n                numerator_name=\"output settings' positions_write_frequency\",\n                denominator_name=\"sampler settings' time_per_iteration\",\n            )\n\n        if output_settings.velocities_write_frequency is not None:\n            _ = settings_validation.divmod_time_and_check(\n                numerator=output_settings.velocities_write_frequency,\n                denominator=simulation_settings.time_per_iteration,\n                numerator_name=\"output settings' velocities_write_frequency\",\n                denominator_name=\"sampler settings' time_per_iteration\",\n            )\n\n        _, _ = settings_validation.convert_real_time_analysis_iterations(\n            simulation_settings=simulation_settings,\n        )\n\n    def _validate(\n        self,\n        stateA: ChemicalSystem,\n        stateB: ChemicalSystem,\n        mapping: gufe.ComponentMapping | list[gufe.ComponentMapping] | None,\n        extends: gufe.ProtocolDAGResult | None = None,\n    ) -> None:\n        # Check we're not trying to extend\n        if extends:\n            # This technically should be NotImplementedError\n            # but gufe.Protocol.validate calls `_validate` wrapped around an\n            # except for NotImplementedError, so we can't raise it here\n            raise ValueError(\"Can't extend simulations yet\")\n\n        # Validate the end states\n        system_validation.validate_chemical_system(stateA)\n        system_validation.validate_chemical_system(stateB)\n        self._validate_endstates(stateA, stateB)\n\n        # Validate the mapping\n        alchem_comps = system_validation.get_alchemical_components(stateA, stateB)\n        self._validate_mapping(mapping, alchem_comps)\n\n        # Validate the small molecule components\n        self._validate_smcs(stateA, stateB)\n\n        # Validate solvent component\n        nonbond = self.settings.forcefield_settings.nonbonded_method\n        system_validation.validate_solvent(stateA, nonbond)\n\n        # Validate the BaseSolventComponents\n        base_solvent = stateA.get_components_of_type(BaseSolventComponent)\n        if len(base_solvent) > 1:\n            errmsg = \"Multiple BaseSolventComponents found, only one is supported.\"\n            raise ValueError(errmsg)\n\n        # Validate solvation settings\n        settings_validation.validate_openmm_solvation_settings(self.settings.solvation_settings)\n\n        # Validate protein component\n        system_validation.validate_protein(stateA)\n\n        # Validate the barostat used in combination with the protein component\n        system_validation.validate_barostat(stateA, self.settings.integrator_settings.barostat)\n\n        # Validate charge difference\n        # Note: validation depends on the mapping & solvent component checks\n        if stateA.contains(SolventComponent):\n            solv_comp = stateA.get_components_of_type(SolventComponent)[0]\n        else:\n            solv_comp = None\n\n        self._validate_charge_difference(\n            mapping=mapping[0] if isinstance(mapping, list) else mapping,\n            nonbonded_method=self.settings.forcefield_settings.nonbonded_method,\n            explicit_charge_correction=self.settings.alchemical_settings.explicit_charge_correction,\n            solvent_component=solv_comp,\n        )\n\n        # Validate integrator things\n        settings_validation.validate_timestep(\n            self.settings.forcefield_settings.hydrogen_mass,\n            self.settings.integrator_settings.timestep,\n        )\n\n        # Validate simulation & output settings\n        self._validate_simulation_settings(\n            self.settings.simulation_settings,\n            self.settings.integrator_settings,\n            self.settings.output_settings,\n        )\n\n        # Validate alchemical settings\n        # PR #125 temporarily pin lambda schedule spacing to n_replicas\n        if (\n            self.settings.simulation_settings.n_replicas\n            != self.settings.lambda_settings.lambda_windows\n        ):\n            errmsg = (\n                \"Number of replicas in ``simulation_settings``: \"\n                f\"{self.settings.simulation_settings.n_replicas} must equal \"\n                \"the number of lambda windows in lambda_settings: \"\n                f\"{self.settings.lambda_settings.lambda_windows}.\"\n            )\n            raise ValueError(errmsg)\n\n    def _create(\n        self,\n        stateA: ChemicalSystem,\n        stateB: ChemicalSystem,\n        mapping: Optional[Union[gufe.ComponentMapping, list[gufe.ComponentMapping]]],\n        extends: Optional[gufe.ProtocolDAGResult] = None,\n    ) -> list[gufe.ProtocolUnit]:\n        # validate inputs\n        self.validate(stateA=stateA, stateB=stateB, mapping=mapping, extends=extends)\n\n        # get alchemical components and mapping\n        alchem_comps = system_validation.get_alchemical_components(stateA, stateB)\n        ligandmapping = mapping[0] if isinstance(mapping, list) else mapping\n\n        # actually create and return Units\n        Anames = \",\".join(c.name for c in alchem_comps[\"stateA\"])\n        Bnames = \",\".join(c.name for c in alchem_comps[\"stateB\"])\n\n        # DAG dependency is setup -> simulation -> analysis\n        #                     |--------------------->\n        setup_units = []\n        simulation_units = []\n        analysis_units = []\n\n        for i in range(self.settings.protocol_repeats):\n            repeat_id = int(uuid.uuid4())\n\n            setup = HybridTopologySetupUnit(\n                protocol=self,\n                stateA=stateA,\n                stateB=stateB,\n                ligandmapping=ligandmapping,\n                alchemical_components=alchem_comps,\n                generation=0,\n                repeat_id=repeat_id,\n                name=(f\"HybridTopology Setup: {Anames} to {Bnames} repeat {i} generation 0\"),\n            )\n\n            simulation = HybridTopologyMultiStateSimulationUnit(\n                protocol=self,\n                setup_results=setup,\n                generation=0,\n                repeat_id=repeat_id,\n                name=(f\"HybridTopology Simulation: {Anames} to {Bnames} repeat {i} generation 0\"),\n            )\n\n            analysis = HybridTopologyMultiStateAnalysisUnit(\n                protocol=self,\n                setup_results=setup,\n                simulation_results=simulation,\n                generation=0,\n                repeat_id=repeat_id,\n                name=(f\"HybridTopology Analysis: {Anames} to {Bnames} repeat {i} generation 0\"),\n            )\n            setup_units.append(setup)\n            simulation_units.append(simulation)\n            analysis_units.append(analysis)\n\n        return [*setup_units, *simulation_units, *analysis_units]\n\n    def _gather(self, protocol_dag_results: Iterable[gufe.ProtocolDAGResult]) -> dict[str, Any]:\n        # result units will have a repeat_id and generations within this repeat_id\n        # first group according to repeat_id\n        unsorted_repeats = defaultdict(list)\n        for d in protocol_dag_results:\n            pu: gufe.ProtocolUnitResult\n            for pu in d.protocol_unit_results:\n                # We only need the analysis units that are ok\n                if (\"Analysis\" not in pu.name) or (not pu.ok()):\n                    continue\n\n                unsorted_repeats[pu.outputs[\"repeat_id\"]].append(pu)\n\n        # then sort by generation within each repeat_id list\n        repeats: dict[str, list[gufe.ProtocolUnitResult]] = {}\n        for k, v in unsorted_repeats.items():\n            repeats[str(k)] = sorted(v, key=lambda x: x.outputs[\"generation\"])\n\n        # returns a dict of repeat_id: sorted list of ProtocolUnitResult\n        return repeats\n"
  },
  {
    "path": "src/openfe/protocols/openmm_rfe/hybridtop_units.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\n\"\"\"\nProtocolUnits for Hybrid Topology methods using OpenMM and OpenMMTools in a\nPerses-like manner.\n\nAcknowledgements\n----------------\nThese ProtocolUnits are based on, and leverage components originating from\nthe Perses toolkit (https://github.com/choderalab/perses).\n\"\"\"\n\nimport logging\nimport os\nimport pathlib\nimport subprocess\nfrom itertools import chain\nfrom typing import Any\n\nimport gufe\nimport matplotlib.pyplot as plt\nimport mdtraj as mdt\nimport numpy as np\nimport numpy.typing as npt\nimport openmm\nimport openmmtools\nfrom gufe import (\n    ChemicalSystem,\n    Component,\n    LigandAtomMapping,\n    ProteinComponent,\n    SmallMoleculeComponent,\n    SolvatedPDBComponent,\n    SolventComponent,\n)\nfrom gufe.protocols.errors import ProtocolUnitExecutionError\nfrom gufe.settings import (\n    SettingsBaseModel,\n    ThermoSettings,\n)\nfrom openff.toolkit.topology import Molecule as OFFMolecule\nfrom openff.units import Quantity\nfrom openff.units import unit as offunit\nfrom openff.units.openmm import ensure_quantity, from_openmm, to_openmm\nfrom openmmforcefields.generators import SystemGenerator\nfrom openmmtools import multistate\n\nimport openfe\nfrom openfe.protocols.openmm_utils.omm_settings import (\n    BasePartialChargeSettings,\n)\n\nfrom ...analysis import plotting\nfrom ...utils import log_system_probe, without_oechem_backend\nfrom ..openmm_utils import (\n    charge_generation,\n    multistate_analysis,\n    omm_compute,\n    settings_validation,\n    system_creation,\n    system_validation,\n)\nfrom ..openmm_utils.serialization import (\n    deserialize,\n    serialize,\n)\nfrom . import _rfe_utils\nfrom ._rfe_utils.relative import HybridTopologyFactory\nfrom .equil_rfe_settings import (\n    AlchemicalSettings,\n    IntegratorSettings,\n    LambdaSettings,\n    MultiStateOutputSettings,\n    MultiStateSimulationSettings,\n    OpenFFPartialChargeSettings,\n    OpenMMEngineSettings,\n    OpenMMSolvationSettings,\n    RelativeHybridTopologyProtocolSettings,\n)\n\nlogger = logging.getLogger(__name__)\n\n\nclass HybridTopologyUnitMixin:\n    def _prepare(\n        self,\n        verbose: bool,\n        scratch_basepath: pathlib.Path | None,\n        shared_basepath: pathlib.Path | None,\n    ):\n        \"\"\"\n        Set basepaths and do some initial logging.\n\n        Parameters\n        ----------\n        verbose : bool\n          Verbose output of the simulation progress. Output is provided at the\n          INFO level logging.\n        scratch_basepath : pathlib.Path | None\n          Optional scratch base path to write scratch files to.\n        shared_basepath : pathlib.Path | None\n          Optional shared base path to write shared files to.\n        \"\"\"\n        self.verbose = verbose\n\n        # set basepaths\n        def _set_optional_path(basepath):\n            if basepath is None:\n                return pathlib.Path(\".\")\n            return basepath\n\n        self.scratch_basepath = _set_optional_path(scratch_basepath)\n        self.shared_basepath = _set_optional_path(shared_basepath)\n\n    @staticmethod\n    def _get_settings(\n        settings: RelativeHybridTopologyProtocolSettings,\n    ) -> dict[str, SettingsBaseModel]:\n        \"\"\"\n        Get a dictionary of Protocol settings.\n\n        Returns\n        -------\n        protocol_settings : dict[str, SettingsBaseModel]\n\n        Notes\n        -----\n        We return a dict so that we can duck type behaviour between phases.\n        For example subclasses may contain both `solvent` and `complex`\n        settings, using this approach we can extract the relevant entry\n        to the same key and pass it to other methods in a seamless manner.\n        \"\"\"\n        protocol_settings: dict[str, SettingsBaseModel] = {}\n        protocol_settings[\"forcefield_settings\"] = settings.forcefield_settings\n        protocol_settings[\"thermo_settings\"] = settings.thermo_settings\n        protocol_settings[\"alchemical_settings\"] = settings.alchemical_settings\n        protocol_settings[\"lambda_settings\"] = settings.lambda_settings\n        protocol_settings[\"charge_settings\"] = settings.partial_charge_settings\n        protocol_settings[\"solvation_settings\"] = settings.solvation_settings\n        protocol_settings[\"simulation_settings\"] = settings.simulation_settings\n        protocol_settings[\"output_settings\"] = settings.output_settings\n        protocol_settings[\"integrator_settings\"] = settings.integrator_settings\n        protocol_settings[\"engine_settings\"] = settings.engine_settings\n        return protocol_settings\n\n    @staticmethod\n    def _verify_execution_environment(\n        setup_outputs: dict[str, Any],\n    ) -> None:\n        \"\"\"\n        Check that the Python environment hasn't changed based on the\n        relevant Python library versions stored in the setup outputs.\n        \"\"\"\n        try:\n            if (\n                (gufe.__version__ != setup_outputs[\"gufe_version\"])\n                or (openfe.__version__ != setup_outputs[\"openfe_version\"])\n                or (openmm.__version__ != setup_outputs[\"openmm_version\"])\n            ):\n                errmsg = \"Python environment has changed, cannot continue Protocol execution.\"\n                raise ProtocolUnitExecutionError(errmsg)\n        except KeyError:\n            errmsg = \"Missing environment information from setup outputs.\"\n            raise ProtocolUnitExecutionError(errmsg)\n\n\nclass HybridTopologySetupUnit(gufe.ProtocolUnit, HybridTopologyUnitMixin):\n    \"\"\"\n    Setup unit for Hybrid Topology Protocol transformations.\n    \"\"\"\n\n    @staticmethod\n    def _get_components(\n        stateA: ChemicalSystem, stateB: ChemicalSystem\n    ) -> tuple[SolventComponent, ProteinComponent, dict[SmallMoleculeComponent, OFFMolecule]]:\n        \"\"\"\n        Get the components from the ChemicalSystem inputs.\n\n        Parameters\n        ----------\n        stateA : ChemicalSystem\n          ChemicalSystem defining the state A components.\n        stateB : CHemicalSystem\n          ChemicalSystem defining the state B components.\n\n        Returns\n        -------\n        solv_comp : SolventComponent\n            The solvent component.\n        protein_comp : ProteinComponent\n            The protein component.\n        small_mols : dict[SmallMoleculeComponent, openff.toolkit.Molecule]\n            Dictionary of small molecule components paired\n            with their OpenFF Molecule.\n        \"\"\"\n        solvent_comp, protein_comp, smcs_A = system_validation.get_components(stateA)\n        _, _, smcs_B = system_validation.get_components(stateB)\n\n        small_mols = {m: m.to_openff() for m in set(smcs_A).union(set(smcs_B))}\n\n        # If there is a SolvatedPDBComponent, we set the solvent_comp\n        if isinstance(protein_comp, SolvatedPDBComponent):\n            solvent_comp = protein_comp\n\n        return solvent_comp, protein_comp, small_mols\n\n    @staticmethod\n    def _assign_partial_charges(\n        charge_settings: OpenFFPartialChargeSettings,\n        small_mols: dict[SmallMoleculeComponent, OFFMolecule],\n    ) -> None:\n        \"\"\"\n        Assign partial charges to the OpenFF Molecules associated with all\n        the SmallMoleculeComponents in the transformation.\n\n        Parameters\n        ----------\n        charge_settings : OpenFFPartialChargeSettings\n          Settings for controlling how the partial charges are assigned.\n        small_mols : dict[SmallMoleculeComponent, openff.toolkit.Molecule]\n          Dictionary of OpenFF Molecules to add, keyed by\n          their associated SmallMoleculeComponent.\n        \"\"\"\n        for smc, mol in small_mols.items():\n            charge_generation.assign_offmol_partial_charges(\n                offmol=mol,\n                overwrite=False,\n                method=charge_settings.partial_charge_method,\n                toolkit_backend=charge_settings.off_toolkit_backend,\n                generate_n_conformers=charge_settings.number_of_conformers,\n                nagl_model=charge_settings.nagl_model,\n            )\n\n    @staticmethod\n    def _get_system_generator(\n        settings: dict[str, SettingsBaseModel],\n        solvent_component: SolventComponent | None,\n        openff_molecules: list[OFFMolecule] | None,\n        ffcache: pathlib.Path | None,\n    ) -> SystemGenerator:\n        \"\"\"\n        Get an OpenMM SystemGenerator.\n\n        Parameters\n        ----------\n        settings : dict[str, SettingsBaseModel]\n          A dictionary of protocol settings.\n        solvent_component : SolventComponent | None\n          The solvent component of the system, if any.\n        openff_molecules : list[openff.toolkit.Molecule] | None\n          A list of openff molecules to generate templates for, if any.\n        ffcache : pathlib.Path | None\n          Path to the force field parameter cache.\n\n        Returns\n        -------\n        system_generator : openmmtools.SystemGenerator\n          The SystemGenerator for the protocol.\n        \"\"\"\n        system_generator = system_creation.get_system_generator(\n            forcefield_settings=settings[\"forcefield_settings\"],\n            integrator_settings=settings[\"integrator_settings\"],\n            thermo_settings=settings[\"thermo_settings\"],\n            cache=ffcache,\n            has_solvent=solvent_component is not None,\n        )\n\n        # Handle openff Molecule templates\n        # TODO: revisit this once the SystemGenerator update happens\n        # and we start loading the whole protein into OpenFF Topologies\n        if openff_molecules is None:\n            return system_generator\n\n        # Register all the templates, pass unique molecules to avoid clashes\n        system_generator.add_molecules(list(set(openff_molecules)))\n\n        return system_generator\n\n    @staticmethod\n    def _create_stateA_system(\n        small_mols: dict[SmallMoleculeComponent, OFFMolecule],\n        protein_component: ProteinComponent | None,\n        solvent_component: SolventComponent | None,\n        system_generator: SystemGenerator,\n        solvation_settings: OpenMMSolvationSettings,\n    ) -> tuple[\n        openmm.System, openmm.app.Topology, openmm.unit.Quantity, dict[Component, npt.NDArray]\n    ]:\n        \"\"\"\n        Create an OpenMM System for state A.\n\n        Parameters\n        ----------\n        small_mols : dict[SmallMoleculeComponent, openff.toolkit.Molecule]\n          A list of small molecules to include in the System.\n        protein_component : ProteinComponent | None\n          Optionally, the protein component to include in the System.\n        solvent_component : SolventComponent | None\n          Optionally, the solvent component to include in the System.\n        system_generator : SystemGenerator\n          The SystemGenerator object ot use to construct the System.\n        solvation_settings : OpenMMSolvationSettings\n          Settings defining how to build the System.\n\n        Returns\n        -------\n        system : openmm.System\n          The System that defines state A.\n        topology : openmm.app.Topology\n          The Topology defining the returned System.\n        positions : openmm.unit.Quantity\n          The positions of the particles in the System.\n        comp_residues : dict[Component, npt.NDArray]\n          A dictionary defining which residues in the System\n          belong to which ChemicalSystem Component.\n        \"\"\"\n        modeller, comp_resids = system_creation.get_omm_modeller(\n            protein_comp=protein_component,\n            solvent_comp=solvent_component,\n            small_mols=small_mols,\n            omm_forcefield=system_generator.forcefield,\n            solvent_settings=solvation_settings,\n        )\n\n        topology = modeller.getTopology()\n        # Note: roundtrip positions to remove vec3 issues\n        positions = to_openmm(from_openmm(modeller.getPositions()))\n\n        system = system_generator.create_system(\n            modeller.topology,\n            molecules=list(small_mols.values()),\n        )\n\n        return system, topology, positions, comp_resids\n\n    @staticmethod\n    def _create_stateB_system(\n        small_mols: dict[SmallMoleculeComponent, OFFMolecule],\n        mapping: LigandAtomMapping,\n        stateA_topology: openmm.app.Topology,\n        exclude_resids: npt.NDArray,\n        system_generator: SystemGenerator,\n    ) -> tuple[openmm.System, openmm.app.Topology, npt.NDArray]:\n        \"\"\"\n        Create the state B System from the state A Topology.\n\n        Parameters\n        ----------\n        small_mols : dict[SmallMoleculeComponent, openff.toolkit.Molecule]\n          Dictionary of OpenFF Molecules keyed by SmallMoleculeComponent\n          to be present in system B.\n        mapping : LigandAtomMapping\n          LigandAtomMapping defining the correspondence between state A\n          and B's alchemical ligand.\n        stateA_topology : openmm.app.Topology\n          The OpenMM topology for state A.\n        exclude_resids : npt.NDArray\n          A list of residues to exclude from state A when building state B.\n        system_generator : SystemGenerator\n          The SystemGenerator to use to build System B.\n\n        Returns\n        -------\n        system : openmm.System\n          The state B System.\n        topology : openmm.app.Topology\n          The OpenMM Topology associated with the state B System.\n        alchem_resids : npt.NDArray\n          The residue indices of the state B alchemical species.\n        \"\"\"\n        topology, alchem_resids = _rfe_utils.topologyhelpers.combined_topology(\n            topology1=stateA_topology,\n            topology2=small_mols[mapping.componentB].to_topology().to_openmm(),\n            exclude_resids=exclude_resids,\n        )\n\n        system = system_generator.create_system(\n            topology,\n            molecules=list(small_mols.values()),\n        )\n\n        return system, topology, alchem_resids\n\n    @staticmethod\n    def _handle_net_charge(\n        stateA_topology: openmm.app.Topology,\n        stateA_positions: openmm.unit.Quantity,\n        stateB_topology: openmm.app.Topology,\n        stateB_system: openmm.System,\n        charge_difference: int,\n        system_mappings: dict[str, dict[int, int]],\n        distance_cutoff: Quantity,\n        solvent_component: SolventComponent | None,\n    ) -> None:\n        \"\"\"\n        Handle system net charge by adding an alchemical water.\n\n        Parameters\n        ----------\n        stateA_topology : openmm.app.Topology\n        stateA_positions : openmm.unit.Quantity\n        stateB_topology : openmm.app.Topology\n        stateB_system : openmm.System\n        charge_difference : int\n        system_mappings : dict[str, dict[int, int]]\n        distance_cutoff : Quantity\n        solvent_component : SolventComponent | None\n        \"\"\"\n        # Base case, return if no net charge\n        if charge_difference == 0:\n            return\n\n        # Get the residue ids for waters to turn alchemical\n        alchem_water_resids = _rfe_utils.topologyhelpers.get_alchemical_waters(\n            topology=stateA_topology,\n            positions=stateA_positions,\n            charge_difference=charge_difference,\n            distance_cutoff=distance_cutoff,\n        )\n\n        # In-place modify state B alchemical waters to ions\n        _rfe_utils.topologyhelpers.handle_alchemical_waters(\n            water_resids=alchem_water_resids,\n            topology=stateB_topology,\n            system=stateB_system,\n            system_mapping=system_mappings,\n            charge_difference=charge_difference,\n            solvent_component=solvent_component,\n        )\n\n    def _get_omm_objects(\n        self,\n        stateA: ChemicalSystem,\n        stateB: ChemicalSystem,\n        mapping: LigandAtomMapping,\n        settings: dict[str, SettingsBaseModel],\n        protein_component: ProteinComponent | None,\n        solvent_component: SolventComponent | None,\n        small_mols: dict[SmallMoleculeComponent, OFFMolecule],\n    ) -> tuple[\n        openmm.System,\n        openmm.app.Topology,\n        openmm.unit.Quantity,\n        openmm.System,\n        openmm.app.Topology,\n        openmm.unit.Quantity,\n        dict[str, dict[int, int]],\n    ]:\n        \"\"\"\n        Get OpenMM objects for both end states A and B.\n\n        Parameters\n        ----------\n        stateA : ChemicalSystem\n          ChemicalSystem defining end state A.\n        stateB : ChemicalSystem\n          ChemicalSystem defining end state B.\n        mapping : LigandAtomMapping\n          The mapping for alchemical components between state A and B.\n        settings : dict[str, SettingsBaseModel]\n          Settings for the transformation.\n        protein_component : ProteinComponent | None\n          The common ProteinComponent between the end states, if there is is one.\n        solvent_component : SolventComponent | None\n          The common SolventComponent between the end states, if there is one.\n        small_mols : dict[SmallMoleculeComponent, openff.toolkit.Molecule]\n          The small molecules for both end states.\n\n        Returns\n        -------\n        stateA_system : openmm.System\n          OpenMM System for state A.\n        stateA_topology : openmm.app.Topology\n          OpenMM Topology for the state A System.\n        stateA_positions : openmm.unit.Quantity\n          Positions of partials for state A System.\n        stateB_system : openmm.System\n          OpenMM System for state B.\n        stateB_topology : openmm.app.Topology\n          OpenMM Topology for the state B System.\n        stateB_positions : openmm.unit.Quantity\n          Positions of partials for state B System.\n        system_mapping : dict[str, dict[int, int]]\n          Dictionary of mappings defining the correspondence between\n          the two state Systems.\n        \"\"\"\n        if self.verbose:\n            self.logger.info(\"Parameterizing systems\")\n\n        def _filter_small_mols(smols, state):\n            return {smc: offmol for smc, offmol in smols.items() if state.contains(smc)}\n\n        states_inputs = {\n            \"A\": {\"state\": stateA, \"mols\": _filter_small_mols(small_mols, stateA)},\n            \"B\": {\"state\": stateB, \"mols\": _filter_small_mols(small_mols, stateB)},\n        }\n\n        # Everything involving systemgenerator handling has a risk of\n        # oechem <-> rdkit smiles conversion clashes, cautiously ban it.\n        with without_oechem_backend():\n            # Get the system generators with all the templates registered\n            for state in [\"A\", \"B\"]:\n                ffcache = settings[\"output_settings\"].forcefield_cache\n                if ffcache is not None:\n                    ffcache = self.shared_basepath / (f\"{state}_\" + ffcache)\n\n                states_inputs[state][\"generator\"] = self._get_system_generator(\n                    settings=settings,\n                    solvent_component=solvent_component,\n                    openff_molecules=list(states_inputs[state][\"mols\"].values()),\n                    ffcache=ffcache,\n                )\n\n            (stateA_system, stateA_topology, stateA_positions, comp_resids) = (\n                self._create_stateA_system(\n                    small_mols=states_inputs[\"A\"][\"mols\"],\n                    protein_component=protein_component,\n                    solvent_component=solvent_component,\n                    system_generator=states_inputs[\"A\"][\"generator\"],\n                    solvation_settings=settings[\"solvation_settings\"],\n                )\n            )\n\n            (stateB_system, stateB_topology, stateB_alchem_resids) = self._create_stateB_system(\n                small_mols=states_inputs[\"B\"][\"mols\"],\n                mapping=mapping,\n                stateA_topology=stateA_topology,\n                exclude_resids=comp_resids[mapping.componentA],\n                system_generator=states_inputs[\"B\"][\"generator\"],\n            )\n\n        # Get the mapping between the two systems\n        system_mappings = _rfe_utils.topologyhelpers.get_system_mappings(\n            old_to_new_atom_map=mapping.componentA_to_componentB,\n            old_system=stateA_system,\n            old_topology=stateA_topology,\n            old_resids=comp_resids[mapping.componentA],\n            new_system=stateB_system,\n            new_topology=stateB_topology,\n            new_resids=stateB_alchem_resids,\n            # These are non-optional settings for this method\n            fix_constraints=True,\n        )\n\n        # Net charge: add alchemical water if needed\n        # Must be done here as we in-place modify the particles of state B.\n        if settings[\"alchemical_settings\"].explicit_charge_correction:\n            self._handle_net_charge(\n                stateA_topology=stateA_topology,\n                stateA_positions=stateA_positions,\n                stateB_topology=stateB_topology,\n                stateB_system=stateB_system,\n                charge_difference=mapping.get_alchemical_charge_difference(),\n                system_mappings=system_mappings,\n                distance_cutoff=settings[\"alchemical_settings\"].explicit_charge_correction_cutoff,\n                solvent_component=solvent_component,\n            )\n\n        # Finally get the state B positions\n        stateB_positions = _rfe_utils.topologyhelpers.set_and_check_new_positions(\n            system_mappings,\n            stateA_topology,\n            stateB_topology,\n            old_positions=ensure_quantity(stateA_positions, \"openmm\"),\n            insert_positions=ensure_quantity(\n                small_mols[mapping.componentB].conformers[0], \"openmm\"\n            ),\n        )\n\n        return (\n            stateA_system,\n            stateA_topology,\n            stateA_positions,\n            stateB_system,\n            stateB_topology,\n            stateB_positions,\n            system_mappings,\n        )\n\n    @staticmethod\n    def _get_alchemical_system(\n        stateA_system: openmm.System,\n        stateA_positions: openmm.unit.Quantity,\n        stateA_topology: openmm.app.Topology,\n        stateB_system: openmm.System,\n        stateB_positions: openmm.unit.Quantity,\n        stateB_topology: openmm.app.Topology,\n        system_mappings: dict[str, dict[int, int]],\n        alchemical_settings: AlchemicalSettings,\n    ):\n        \"\"\"\n        Get the hybrid topology alchemical system.\n\n        Parameters\n        ----------\n        stateA_system : openmm.System\n          State A OpenMM System\n        stateA_positions : openmm.unit.Quantity\n          Positions of state A System\n        stateA_topology : openmm.app.Topology\n          Topology of state A System\n        stateB_system : openmm.System\n          State B OpenMM System\n        stateB_positions : openmm.unit.Quantity\n          Positions of state B System\n        stateB_topology : openmm.app.Topology\n          Topology of state B System\n        system_mappings : dict[str, dict[int, int]]\n          Mapping of corresponding atoms between the two Systems.\n        alchemical_settings : AlchemicalSettings\n          The alchemical settings defining how the alchemical system\n          will be built.\n\n        Returns\n        -------\n        hybrid_factory : HybridTopologyFactory\n          The factory creating the hybrid system.\n        hybrid_system : openmm.System\n          The hybrid System.\n        \"\"\"\n        if alchemical_settings.softcore_LJ.lower() == \"gapsys\":\n            softcore_LJ_v2 = True\n        elif alchemical_settings.softcore_LJ.lower() == \"beutler\":\n            softcore_LJ_v2 = False\n\n        hybrid_factory = _rfe_utils.relative.HybridTopologyFactory(\n            stateA_system,\n            stateA_positions,\n            stateA_topology,\n            stateB_system,\n            stateB_positions,\n            stateB_topology,\n            old_to_new_atom_map=system_mappings[\"old_to_new_atom_map\"],\n            old_to_new_core_atom_map=system_mappings[\"old_to_new_core_atom_map\"],\n            use_dispersion_correction=alchemical_settings.use_dispersion_correction,\n            softcore_alpha=alchemical_settings.softcore_alpha,\n            softcore_LJ_v2=softcore_LJ_v2,\n            softcore_LJ_v2_alpha=alchemical_settings.softcore_alpha,\n            interpolate_old_and_new_14s=alchemical_settings.turn_off_core_unique_exceptions,\n        )\n\n        return hybrid_factory, hybrid_factory.hybrid_system\n\n    def _subsample_topology(\n        self,\n        hybrid_topology: mdt.Topology,\n        hybrid_positions: openmm.unit.Quantity,\n        output_selection: str,\n        output_filename: str,\n        atom_classes: dict[str, set[int]],\n    ) -> npt.NDArray:\n        \"\"\"\n        Subsample the hybrid topology based on user-selected output selection\n        and write the subsampled topology to a PDB file.\n\n        Parameters\n        ----------\n        hybrid_topology : mdtraj.Topology\n          The hybrid system topology to subsample.\n        hybrid_positions : openmm.unit.Quantity\n          The hybrid system positions.\n        output_selection : str\n          An MDTraj selection string to subsample the topology with.\n        output_filename : str\n          The name of the file to write the PDB to.\n        atom_classes : dict[str, set[int]]\n          A dictionary defining what atoms belong to the different\n          components of the hybrid system.\n\n        Returns\n        -------\n        selection_indices : npt.NDArray\n          The indices of the subselected system.\n\n        TODO\n        ----\n        * Modify this to also store the full system.\n        * Use the mdtraj_from_openmm utility.\n        \"\"\"\n        selection_indices = hybrid_topology.select(output_selection)\n\n        # Write out a PDB containing the subsampled hybrid state\n        # We use bfactors as a hack to label different states\n        # bfactor of 0 is environment atoms\n        # bfactor of 0.25 is unique old atoms\n        # bfactor of 0.5 is core atoms\n        # bfactor of 0.75 is unique new atoms\n        bfactors = np.zeros_like(selection_indices, dtype=float)\n        bfactors[np.isin(selection_indices, list(atom_classes[\"unique_old_atoms\"]))] = 0.25\n        bfactors[np.isin(selection_indices, list(atom_classes[\"core_atoms\"]))] = 0.50\n        bfactors[np.isin(selection_indices, list(atom_classes[\"unique_new_atoms\"]))] = 0.75\n\n        if len(selection_indices) > 0:\n            traj = mdt.Trajectory(\n                hybrid_positions[selection_indices, :],\n                hybrid_topology.subset(selection_indices),\n            ).save_pdb(\n                self.shared_basepath / output_filename,\n                bfactors=bfactors,\n            )\n\n        return selection_indices\n\n    def run(\n        self,\n        *,\n        dry: bool = False,\n        verbose: bool = True,\n        scratch_basepath: pathlib.Path | None = None,\n        shared_basepath: pathlib.Path | None = None,\n    ) -> dict[str, Any]:\n        \"\"\"Setup a hybrid topology system.\n\n        Parameters\n        ----------\n        dry : bool\n          Do a dry run of the calculation, creating all necessary hybrid\n          system components (topology, system, sampler, etc...) but without\n          running the simulation.\n        verbose : bool\n          Verbose output of the simulation progress. Output is provided via\n          INFO level logging.\n        scratch_basepath: pathlib.Path | None\n          Where to store temporary files, defaults to current working directory\n        shared_basepath : pathlib.Path | None\n          Where to run the calculation, defaults to current working directory\n\n        Returns\n        -------\n        dict\n          Outputs created by the setup unit or the debug objects\n          (e.g. HybridTopologyFactory) if ``dry==True``.\n\n        Raises\n        ------\n        error\n          Exception if anything failed\n        \"\"\"\n        # Prepare paths & verbosity\n        self._prepare(verbose, scratch_basepath, shared_basepath)\n\n        if self.verbose:\n            self.logger.info(\"Starting system setup unit\")\n\n        # Get settings\n        settings = self._get_settings(self._inputs[\"protocol\"].settings)\n\n        # Get components\n        stateA = self._inputs[\"stateA\"]\n        stateB = self._inputs[\"stateB\"]\n        mapping = self._inputs[\"ligandmapping\"]\n        alchem_comps = self._inputs[\"alchemical_components\"]\n        solvent_comp, protein_comp, small_mols = self._get_components(stateA, stateB)\n\n        # Assign partial charges now to avoid any discrepancies later\n        self._assign_partial_charges(settings[\"charge_settings\"], small_mols)\n\n        (\n            stateA_system,\n            stateA_topology,\n            stateA_positions,\n            stateB_system,\n            stateB_topology,\n            stateB_positions,\n            system_mappings,\n        ) = self._get_omm_objects(\n            stateA=stateA,\n            stateB=stateB,\n            mapping=mapping,\n            settings=settings,\n            protein_component=protein_comp,\n            solvent_component=solvent_comp,\n            small_mols=small_mols,\n        )\n\n        # Get the hybrid factory & system\n        hybrid_factory, hybrid_system = self._get_alchemical_system(\n            stateA_system=stateA_system,\n            stateA_positions=stateA_positions,\n            stateA_topology=stateA_topology,\n            stateB_system=stateB_system,\n            stateB_positions=stateB_positions,\n            stateB_topology=stateB_topology,\n            system_mappings=system_mappings,\n            alchemical_settings=settings[\"alchemical_settings\"],\n        )\n\n        # Subselect system based on user inputs & write initial PDB\n        selection_indices = self._subsample_topology(\n            hybrid_topology=hybrid_factory.hybrid_topology,\n            hybrid_positions=hybrid_factory.hybrid_positions,\n            output_selection=settings[\"output_settings\"].output_indices,\n            output_filename=settings[\"output_settings\"].output_structure,\n            atom_classes=hybrid_factory._atom_classes,\n        )\n\n        # Serialize things\n        # OpenMM System\n        system_outfile = self.shared_basepath / \"hybrid_system.xml.bz2\"\n        serialize(hybrid_system, system_outfile)\n\n        # Positions\n        positions_outfile = self.shared_basepath / \"hybrid_positions.npy\"\n        npy_positions = from_openmm(hybrid_factory.hybrid_positions).to(\"nanometer\").m\n        np.save(positions_outfile, npy_positions)\n\n        unit_results_dict = {\n            \"system\": system_outfile,\n            \"positions\": positions_outfile,\n            \"pdb_structure\": self.shared_basepath / settings[\"output_settings\"].output_structure,\n            \"selection_indices\": selection_indices,\n        }\n\n        if dry:\n            unit_results_dict |= {\n                # Adding unserialized objects so we can directly use them\n                # to chain units in tests\n                \"hybrid_factory\": hybrid_factory,\n                \"hybrid_system\": hybrid_system,\n                \"hybrid_positions\": hybrid_factory.hybrid_positions,\n            }\n\n        return unit_results_dict\n\n    def _execute(\n        self,\n        ctx: gufe.Context,\n        **inputs,\n    ) -> dict[str, Any]:\n        log_system_probe(logging.INFO, paths=[ctx.scratch])\n        outputs = self.run(scratch_basepath=ctx.scratch, shared_basepath=ctx.shared)\n\n        return {\n            \"repeat_id\": self._inputs[\"repeat_id\"],\n            \"generation\": self._inputs[\"generation\"],\n            \"openmm_version\": openmm.__version__,\n            \"openfe_version\": openfe.__version__,\n            \"gufe_version\": gufe.__version__,\n            **outputs,\n        }\n\n\nclass HybridTopologyMultiStateSimulationUnit(gufe.ProtocolUnit, HybridTopologyUnitMixin):\n    \"\"\"\n    Multi-state simulation (e.g. multi replica methods like hamiltonian\n    replica exchange) unit for Hybrid Topology Protocol transformations.\n    \"\"\"\n\n    @staticmethod\n    def _check_restart(output_settings: SettingsBaseModel, shared_path: pathlib.Path):\n        \"\"\"\n        Check if we are doing a restart.\n\n        Parameters\n        ----------\n        output_settings : SettingsBaseModel\n          The simulation output settings\n        shared_path : pathlib.Path\n          The shared directory where we should be looking for existing files.\n\n        Notes\n        -----\n        For now this just checks if the netcdf files are present in the\n        shared directory but in the future this may expand depending on\n        how warehouse works.\n\n        Raises\n        ------\n        IOError\n          If either the checkpoint or trajectory files don't exist.\n        \"\"\"\n        trajectory = shared_path / output_settings.output_filename\n        checkpoint = shared_path / output_settings.checkpoint_storage_filename\n\n        if trajectory.is_file() and checkpoint.is_file():\n            return True\n        elif trajectory.is_file() ^ checkpoint.is_file():\n            if trajectory.is_file():\n                errmsg = \"the trajectory file is present but not the checkpoint file. \"\n            else:\n                errmsg = \"the checkpoint file is present but not the trajectory file. \"\n\n            errmsg = (\n                \"Attempting to restart but \"\n                + errmsg\n                + \"This should not happen under normal circumstances.\"\n            )\n            raise IOError(errmsg)\n        else:\n            return False\n\n    @staticmethod\n    def _get_integrator(\n        integrator_settings: IntegratorSettings,\n        simulation_settings: MultiStateSimulationSettings,\n        system: openmm.System,\n    ) -> openmmtools.mcmc.LangevinDynamicsMove:\n        \"\"\"\n        Get and validate the integrator\n\n        Parameters\n        ----------\n        integrator_settings : IntegratorSettings\n          Settings controlling the Langevin integrator.\n        simulation_settings : MultiStateSimulationSettings\n          Settings controlling the simulation.\n        system : openmm.System\n          The OpenMM System.\n\n        Returns\n        -------\n        integrator : openmmtools.mcmc.LangevinDynamicsMove\n          The LangevinDynamicsMove integrator.\n\n        Raises\n        ------\n        ValueError\n          If there are virtual sites in the system, but velocities\n          are not being reassigned after every MCMC move.\n        \"\"\"\n        steps_per_iteration = settings_validation.convert_steps_per_iteration(\n            simulation_settings, integrator_settings\n        )\n\n        integrator = openmmtools.mcmc.LangevinDynamicsMove(\n            timestep=to_openmm(integrator_settings.timestep),\n            collision_rate=to_openmm(integrator_settings.langevin_collision_rate),\n            n_steps=steps_per_iteration,\n            reassign_velocities=integrator_settings.reassign_velocities,\n            n_restart_attempts=integrator_settings.n_restart_attempts,\n            constraint_tolerance=integrator_settings.constraint_tolerance,\n        )\n\n        # Validate for known issue when dealing with virtual sites\n        # and multistate simulations\n        if not integrator_settings.reassign_velocities:\n            for particle_idx in range(system.getNumParticles()):\n                if system.isVirtualSite(particle_idx):\n                    errmsg = (\n                        \"Simulations with virtual sites without velocity \"\n                        \"reassignments are unstable with MCMC integrators.\"\n                    )\n                    raise ValueError(errmsg)\n\n        return integrator\n\n    @staticmethod\n    def _get_reporter(\n        storage_path: pathlib.Path,\n        selection_indices: npt.NDArray,\n        output_settings: MultiStateOutputSettings,\n        simulation_settings: MultiStateSimulationSettings,\n    ) -> multistate.MultiStateReporter:\n        \"\"\"\n        Get the multistate reporter.\n\n        Parameters\n        ----------\n        storage_path : pathlib.Path\n          Path to the directory where files should be written.\n        selection_indices : npt.NDArray\n          The set of system indices to report positions & velocities for.\n        output_settings : MultiStateOutputSettings\n          Settings defining how outputs should be written.\n        simulation_settings : MultiStateSimulationSettings\n          Settings defining out the simulation should be run.\n\n        Notes\n        -----\n        All this does is create the reporter, it works for both\n        new reporters and if we are doing a restart.\n        \"\"\"\n        # Define the trajectory & checkpoint files\n        nc = storage_path / output_settings.output_filename\n        # The checkpoint file in openmmtools is taken as a file relative\n        # to the location of the nc file, so you only want the filename\n        chk = output_settings.checkpoint_storage_filename\n\n        if output_settings.positions_write_frequency is not None:\n            pos_interval = settings_validation.divmod_time_and_check(\n                numerator=output_settings.positions_write_frequency,\n                denominator=simulation_settings.time_per_iteration,\n                numerator_name=\"output settings' position_write_frequency\",\n                denominator_name=\"simulation settings' time_per_iteration\",\n            )\n        else:\n            pos_interval = 0\n\n        if output_settings.velocities_write_frequency is not None:\n            vel_interval = settings_validation.divmod_time_and_check(\n                numerator=output_settings.velocities_write_frequency,\n                denominator=simulation_settings.time_per_iteration,\n                numerator_name=\"output settings' velocity_write_frequency\",\n                denominator_name=\"sampler settings' time_per_iteration\",\n            )\n        else:\n            vel_interval = 0\n\n        chk_intervals = settings_validation.convert_checkpoint_interval_to_iterations(\n            checkpoint_interval=output_settings.checkpoint_interval,\n            time_per_iteration=simulation_settings.time_per_iteration,\n        )\n\n        return multistate.MultiStateReporter(\n            storage=nc,\n            analysis_particle_indices=selection_indices,\n            checkpoint_interval=chk_intervals,\n            checkpoint_storage=chk,\n            position_interval=pos_interval,\n            velocity_interval=vel_interval,\n        )\n\n    @staticmethod\n    def _get_sampler(\n        system: openmm.System,\n        positions: openmm.unit.Quantity,\n        lambdas: _rfe_utils.lambdaprotocol.LambdaProtocol,\n        integrator: openmmtools.mcmc.MCMCMove,\n        reporter: multistate.MultiStateReporter,\n        simulation_settings: MultiStateSimulationSettings,\n        thermo_settings: ThermoSettings,\n        alchem_settings: AlchemicalSettings,\n        platform: openmm.Platform,\n        restart: bool,\n        dry: bool,\n    ) -> multistate.MultiStateSampler:\n        \"\"\"\n        Get the MultiStateSampler.\n\n        Parameters\n        ----------\n        system : openmm.System\n          The OpenMM System to simulate.\n        positions : openmm.unit.Quantity\n          The positions of the OpenMM System.\n        lambdas : LambdaProtocol\n          The lambda protocol to sample along.\n        integrator : openmmtools.mcmc.MCMCMove\n          The integrator to use.\n        reporter : multistate.MultiStateReporter\n          The reporter to attach to the sampler.\n        simulation_settings : MultiStateSimulationSettings\n          The simulation control settings.\n        thermo_settings : ThermoSettings\n          The thermodynamic control settings.\n        alchem_settings : AlchemicalSettings\n          The alchemical transformation settings.\n        platform : openmm.Platform\n          The compute platform to use.\n        restart : bool\n          ``True`` if we are doing a simulation restart.\n        dry : bool\n          Whether or not this is a dry run.\n\n        Returns\n        -------\n        sampler : multistate.MultiStateSampler\n          The requested sampler.\n        \"\"\"\n        _SAMPLERS = {\n            \"repex\": _rfe_utils.multistate.HybridRepexSampler,\n            \"sams\": _rfe_utils.multistate.HybridSAMSSampler,\n            \"independent\": _rfe_utils.multistate.HybridMultiStateSampler,\n        }\n\n        # note we if/else around sampler method because in the future\n        # we will try to reuse this method and just have _SAMPLERs be\n        # defined elsewhere\n        sampler_method = simulation_settings.sampler_method.lower()\n        try:\n            sampler_class = _SAMPLERS[sampler_method]\n        except KeyError:\n            errmsg = f\"Unknown sampler {sampler_method}\"\n            raise AttributeError(errmsg)\n\n        # Get the real time analysis values to use\n        rta_its, rta_min_its = settings_validation.convert_real_time_analysis_iterations(\n            simulation_settings=simulation_settings,\n        )\n\n        # Get the number of production iterations to run for\n        steps_per_iteration = integrator.n_steps\n        timestep = from_openmm(integrator.timestep)\n        number_of_iterations = int(\n            settings_validation.get_simsteps(\n                sim_length=simulation_settings.production_length,\n                timestep=timestep,\n                mc_steps=steps_per_iteration,\n            )\n            / steps_per_iteration\n        )\n\n        # convert early_termination_target_error from kcal/mol to kT\n        early_termination_target_error = (\n            settings_validation.convert_target_error_from_kcal_per_mole_to_kT(\n                thermo_settings.temperature,\n                simulation_settings.early_termination_target_error,\n            )\n        )\n\n        sampler_kwargs = {\n            \"mcmc_moves\": integrator,\n            \"hybrid_system\": system,\n            \"hybrid_positions\": positions,\n            \"online_analysis_interval\": rta_its,\n            \"online_analysis_target_error\": early_termination_target_error,\n            \"online_analysis_minimum_iterations\": rta_min_its,\n            \"number_of_iterations\": number_of_iterations,\n        }\n\n        if sampler_method == \"sams\":\n            sampler_kwargs |= {\n                \"flatness_criteria\": simulation_settings.sams_flatness_criteria,\n                \"gamma0\": simulation_settings.sams_gamma0,\n            }\n\n        if sampler_method == \"repex\":\n            sampler_kwargs |= {\"replica_mixing_scheme\": \"swap-all\"}\n\n        # Restarting doesn't need any setup, we just rebuild from storage.\n        if restart:\n            sampler = sampler_class.from_storage(reporter)  # type: ignore[attr-defined]\n\n            # We do some checks to make sure we are running the same system\n            system_validation.assert_multistate_system_equality(\n                ref_system=system,\n                stored_system=sampler._thermodynamic_states[0].get_system(remove_thermostat=True),\n            )\n\n            # We do check to make sure we have the same thermodynamic\n            # parameters and that the lambda schedule is the same.\n            for index, thermostate in enumerate(sampler._thermodynamic_states):\n                assert thermostate.temperature == to_openmm(thermo_settings.temperature)\n                assert thermostate.pressure == to_openmm(thermo_settings.pressure)\n\n                for key in lambdas.functions:\n                    lambda_value = lambdas.lambda_schedule[index]\n                    expected = lambdas.functions[key](lambda_value)\n                    stored = getattr(thermostate, key)\n                    assert expected == stored\n\n            # Finally we check that some of the sampler parameters haven't changed\n            if (\n                (simulation_settings.n_replicas != sampler.n_states)\n                or (simulation_settings.n_replicas != sampler.n_replicas)\n                or (sampler.mcmc_moves[0].n_steps != steps_per_iteration)\n                or (sampler.mcmc_moves[0].timestep != integrator.timestep)\n            ):\n                errmsg = \"Sampler in checkpoint does not match Protocol settings, cannot resume.\"\n                raise ValueError(errmsg)\n\n        else:\n            sampler = sampler_class(**sampler_kwargs)\n\n            sampler.setup(\n                n_replicas=simulation_settings.n_replicas,\n                reporter=reporter,\n                lambda_protocol=lambdas,\n                temperature=to_openmm(thermo_settings.temperature),\n                endstates=alchem_settings.endstate_dispersion_correction,\n                minimization_platform=platform.getName(),\n                # Set minimization steps to None when running in dry mode\n                # otherwise do a very small one to avoid NaNs\n                minimization_steps=100 if not dry else None,\n            )\n\n        # Get and set the context caches\n        sampler.energy_context_cache = openmmtools.cache.ContextCache(\n            capacity=None,\n            time_to_live=None,\n            platform=platform,\n        )\n        sampler.sampler_context_cache = openmmtools.cache.ContextCache(\n            capacity=None,\n            time_to_live=None,\n            platform=platform,\n        )\n\n        return sampler\n\n    def _run_simulation(\n        self,\n        sampler: multistate.MultiStateSampler,\n        reporter: multistate.MultiStateReporter,\n        simulation_settings: MultiStateSimulationSettings,\n        integrator_settings: IntegratorSettings,\n        output_settings: MultiStateOutputSettings,\n        dry: bool,\n    ):\n        \"\"\"\n        Run the simulation.\n\n        Parameters\n        ----------\n        sampler : multistate.MultiStateSampler.\n          The sampler associated with the simulation to run.\n        reporter : multistate.MultiStateReporter\n          The reporter associated with the sampler.\n        simulation_settings : MultiStateSimulationSettings\n          Simulation control settings.\n        integrator_settings : IntegratorSettings\n          Integrator control settings.\n        output_settings : MultiStateOutputSettings\n          Simulation output control settings.\n        dry : bool\n          Whether or not to dry run the simulation.\n        \"\"\"\n        # Get the relevant simulation steps\n        mc_steps = settings_validation.convert_steps_per_iteration(\n            simulation_settings=simulation_settings,\n            integrator_settings=integrator_settings,\n        )\n\n        equil_steps = settings_validation.get_simsteps(\n            sim_length=simulation_settings.equilibration_length,\n            timestep=integrator_settings.timestep,\n            mc_steps=mc_steps,\n        )\n        prod_steps = settings_validation.get_simsteps(\n            sim_length=simulation_settings.production_length,\n            timestep=integrator_settings.timestep,\n            mc_steps=mc_steps,\n        )\n\n        if not dry:  # pragma: no-cover\n            # No productions steps have been taken, so start from scratch\n            if sampler._iteration == 0:\n                # minimize\n                if self.verbose:\n                    self.logger.info(\"minimizing systems\")\n\n                sampler.minimize(max_iterations=simulation_settings.minimization_steps)\n\n                # equilibrate\n                if self.verbose:\n                    self.logger.info(\"equilibrating systems\")\n\n                sampler.equilibrate(int(equil_steps / mc_steps))\n\n            # At this point we are ready for production\n            if self.verbose:\n                self.logger.info(\"running production phase\")\n\n            # We use `run` so that we're limited by the number of iterations\n            # we passed when we built the sampler.\n            # TODO: I'm being extra prudent by passing in n_iterations here - remove?\n            sampler.run(n_iterations=int(prod_steps / mc_steps) - sampler._iteration)\n\n            if self.verbose:\n                self.logger.info(\"production phase complete\")\n        else:\n            # We ran a dry simulation\n            # close reporter when you're done, prevent file handle clashes\n            reporter.close()\n\n            # TODO: review this is likely no longer necessary\n            # clean up the reporter file\n            fns = [\n                self.shared_basepath / output_settings.output_filename,\n                self.shared_basepath / output_settings.checkpoint_storage_filename,\n            ]\n            for fn in fns:\n                os.remove(fn)\n\n    def run(\n        self,\n        *,\n        system: openmm.System,\n        positions: openmm.unit.Quantity,\n        selection_indices: npt.NDArray,\n        dry: bool = False,\n        verbose: bool = True,\n        scratch_basepath: pathlib.Path | None = None,\n        shared_basepath: pathlib.Path | None = None,\n    ) -> dict[str, Any]:\n        \"\"\"Run the free energy calculation using a multistate sampler.\n\n        Parameters\n        ----------\n        system : openmm.System\n          The System to simulate.\n        positions : openmm.unit.Quantity\n          The positions of the System.\n        selection_indices : npt.NDArray\n          Indices of the System particles to write to file.\n        dry : bool\n          Do a dry run of the calculation, creating all necessary hybrid\n          system components (topology, system, sampler, etc...) but without\n          running the simulation.\n        verbose : bool\n          Verbose output of the simulation progress. Output is provided via\n          INFO level logging.\n        scratch_basepath: pathlib.Path | None\n          Where to store temporary files, defaults to current working directory\n        shared_basepath : pathlib.Path | None\n          Where to run the calculation, defaults to current working directory\n\n        Returns\n        -------\n        dict\n          Outputs created in the basepath directory or the debug objects\n          (i.e. sampler) if ``dry==True``.\n\n        Raises\n        ------\n        error\n          Exception if anything failed\n        \"\"\"\n        # Prepare paths & verbosity\n        self._prepare(verbose, scratch_basepath, shared_basepath)\n\n        if self.verbose:\n            self.logger.info(\"Starting simulation unit\")\n\n        # Get the settings\n        settings = self._get_settings(self._inputs[\"protocol\"].settings)\n\n        # Check for a restart\n        self.restart = self._check_restart(\n            output_settings=settings[\"output_settings\"], shared_path=self.shared_basepath\n        )\n\n        # Get the lambda schedule\n        # TODO - this should be better exposed to users\n        lambdas = _rfe_utils.lambdaprotocol.LambdaProtocol(\n            functions=settings[\"lambda_settings\"].lambda_functions,\n            windows=settings[\"lambda_settings\"].lambda_windows,\n        )\n\n        # Get the compute platform\n        restrict_cpu = settings[\"forcefield_settings\"].nonbonded_method.lower() == \"nocutoff\"\n        platform = omm_compute.get_openmm_platform(\n            platform_name=settings[\"engine_settings\"].compute_platform,\n            gpu_device_index=settings[\"engine_settings\"].gpu_device_index,\n            restrict_cpu_count=restrict_cpu,\n        )\n\n        # Get the integrator\n        integrator = self._get_integrator(\n            integrator_settings=settings[\"integrator_settings\"],\n            simulation_settings=settings[\"simulation_settings\"],\n            system=system,\n        )\n\n        try:\n            # Get the reporter\n            reporter = self._get_reporter(\n                storage_path=self.shared_basepath,\n                selection_indices=selection_indices,\n                output_settings=settings[\"output_settings\"],\n                simulation_settings=settings[\"simulation_settings\"],\n            )\n\n            # Get the sampler\n            sampler = self._get_sampler(\n                system=system,\n                positions=positions,\n                lambdas=lambdas,\n                integrator=integrator,\n                reporter=reporter,\n                simulation_settings=settings[\"simulation_settings\"],\n                thermo_settings=settings[\"thermo_settings\"],\n                alchem_settings=settings[\"alchemical_settings\"],\n                platform=platform,\n                restart=self.restart,\n                dry=dry,\n            )\n\n            # Run the simulation\n            self._run_simulation(\n                sampler=sampler,\n                reporter=reporter,\n                simulation_settings=settings[\"simulation_settings\"],\n                integrator_settings=settings[\"integrator_settings\"],\n                output_settings=settings[\"output_settings\"],\n                dry=dry,\n            )\n        finally:\n            # Have to wrap this in a try/except, because we might\n            # be in a situation where the reporter or sampler wasn't created\n            try:\n                # Order is reporter, contexts, sampler, integrator\n                reporter.close()  # close to prevent file handle clashes\n\n                # clear GPU context\n                # Note: use cache.empty() when openmmtools #690 is resolved\n                for context in list(sampler.energy_context_cache._lru._data.keys()):\n                    del sampler.energy_context_cache._lru._data[context]\n                for context in list(sampler.sampler_context_cache._lru._data.keys()):\n                    del sampler.sampler_context_cache._lru._data[context]\n                # cautiously clear out the global context cache too\n                for context in list(openmmtools.cache.global_context_cache._lru._data.keys()):\n                    del openmmtools.cache.global_context_cache._lru._data[context]\n\n                del sampler.sampler_context_cache, sampler.energy_context_cache\n\n                # Keep these around in a dry run so we can inspect things\n                if not dry:\n                    # At this point we know the sampler exists, so we del the integrator\n                    # first since it's associated with the sampler\n                    del integrator, sampler\n            except UnboundLocalError:\n                pass\n\n        if not dry:  # pragma: no-cover\n            return {\n                \"nc\": self.shared_basepath / settings[\"output_settings\"].output_filename,\n                \"checkpoint\": self.shared_basepath\n                / settings[\"output_settings\"].checkpoint_storage_filename,\n            }\n        else:\n            return {\n                \"sampler\": sampler,\n                \"integrator\": integrator,\n            }\n\n    def _execute(\n        self,\n        ctx: gufe.Context,\n        *,\n        setup_results,\n        **inputs,\n    ) -> dict[str, Any]:\n        log_system_probe(logging.INFO, paths=[ctx.scratch])\n        # Ensure that the environment hasn't changed\n        self._verify_execution_environment(setup_results.outputs)\n\n        # Get the relevant inputs for running the unit\n        system = deserialize(setup_results.outputs[\"system\"])\n        positions = to_openmm(np.load(setup_results.outputs[\"positions\"]) * offunit.nm)\n        selection_indices = setup_results.outputs[\"selection_indices\"]\n\n        # Run the unit\n        outputs = self.run(\n            system=system,\n            positions=positions,\n            selection_indices=selection_indices,\n            scratch_basepath=ctx.scratch,\n            shared_basepath=ctx.shared,\n        )\n\n        return {\n            \"repeat_id\": self._inputs[\"repeat_id\"],\n            \"generation\": self._inputs[\"generation\"],\n            **outputs,\n        }\n\n\nclass HybridTopologyMultiStateAnalysisUnit(gufe.ProtocolUnit, HybridTopologyUnitMixin):\n    \"\"\"\n    Analysis unit for multi-state Hybrid Topology Protocol transformations.\n    \"\"\"\n\n    @staticmethod\n    def _analyze_multistate_energies(\n        trajectory: pathlib.Path,\n        checkpoint: pathlib.Path,\n        sampler_method: str,\n        output_directory: pathlib.Path,\n        dry: bool,\n    ):\n        \"\"\"\n        Analyze multistate energies and generate plots.\n\n        Parameters\n        ----------\n        trajectory : pathlib.Path\n          Path to the NetCDF trajectory file.\n        checkpoint : pathlib.Path\n          The name of the checkpoint file. Note this is\n          relative in path to the trajectory file.\n        sampler_method : str\n          The multistate sampler method used.\n        output_directory : pathlib.Path\n          The path to where plots will be written.\n        dry : bool\n          Whether or not we are running a dry run.\n        \"\"\"\n        reporter = multistate.MultiStateReporter(\n            storage=trajectory,\n            # Note: openmmtools only wants the name of the checkpoint\n            # file, it assumes it to be in the same place as the trajectory\n            checkpoint_storage=checkpoint.name,\n            open_mode=\"r\",\n        )\n\n        analyzer = multistate_analysis.MultistateEquilFEAnalysis(\n            reporter=reporter,\n            sampling_method=sampler_method,\n            result_units=offunit.kilocalorie_per_mole,\n        )\n\n        # Only create plots when not doing a dry run\n        if not dry:\n            analyzer.plot(filepath=output_directory, filename_prefix=\"\")\n\n        analyzer.close()\n        reporter.close()\n        return analyzer.unit_results_dict\n\n    @staticmethod\n    def _structural_analysis(\n        pdb_file: pathlib.Path,\n        trj_file: pathlib.Path,\n        output_directory: pathlib.Path,\n        dry: bool,\n    ) -> dict[str, str | pathlib.Path]:\n        \"\"\"\n        Run structural analysis using ``openfe-analysis``.\n\n        Parameters\n        ----------\n        pdb_file : pathlib.Path\n          Path to the PDB file.\n        trj_file : pathlib.Path\n          Path to the trajectory file.\n        output_directory : pathlib.Path\n          The output directory where plots and the data NPZ file\n          will be stored.\n        dry : bool\n          Whether or not we are running a dry run.\n\n        Returns\n        -------\n        dict[str, str | pathlib.Path]\n          Dictionary containing either the path to the NPZ\n          file with the structural data, or the analysis error.\n\n        Notes\n        -----\n        Don't put energy analysis here as it uses the MultiStateReporter,\n        the structural analysis requires the file handle to be closed.\n        \"\"\"\n        from openfe_analysis import rmsd\n\n        try:\n            data = rmsd.gather_rms_data(pdb_file, trj_file)\n        # TODO: eventually change this to more specific exception types\n        except Exception as e:\n            return {\"structural_analysis_error\": str(e)}\n\n        # Generate relevant plots if not a dry run\n        if not dry:\n            if d := data[\"protein_2D_RMSD\"]:\n                fig = plotting.plot_2D_rmsd(d)\n                fig.savefig(output_directory / \"protein_2D_RMSD.png\")\n                plt.close(fig)\n                f2 = plotting.plot_ligand_COM_drift(data[\"time(ps)\"], data[\"ligand_wander\"])\n                f2.savefig(output_directory / \"ligand_COM_drift.png\")\n                plt.close(f2)\n\n            f3 = plotting.plot_ligand_RMSD(data[\"time(ps)\"], data[\"ligand_RMSD\"])\n            f3.savefig(output_directory / \"ligand_RMSD.png\")\n            plt.close(f3)\n\n        # Write out an NPZ with all the relevant analysis data\n        npz_file = output_directory / \"structural_analysis.npz\"\n        np.savez_compressed(\n            npz_file,\n            protein_RMSD=np.asarray(data[\"protein_RMSD\"], dtype=np.float32),\n            ligand_RMSD=np.asarray(data[\"ligand_RMSD\"], dtype=np.float32),\n            ligand_COM_drift=np.asarray(data[\"ligand_wander\"], dtype=np.float32),\n            protein_2D_RMSD=np.asarray(data[\"protein_2D_RMSD\"], dtype=np.float32),\n            time_ps=np.asarray(data[\"time(ps)\"], dtype=np.float32),\n        )\n\n        return {\"structural_analysis\": npz_file}\n\n    def run(\n        self,\n        *,\n        pdb_file: pathlib.Path,\n        trajectory: pathlib.Path,\n        checkpoint: pathlib.Path,\n        dry: bool = False,\n        verbose: bool = True,\n        scratch_basepath: pathlib.Path | None = None,\n        shared_basepath: pathlib.Path | None = None,\n    ) -> dict[str, Any]:\n        \"\"\"Analyze the multistate simulation.\n\n        Parameters\n        ----------\n        pdb_file : pathlib.Path\n          Path to the PDB file representing the subsampled structure.\n        trajectory : pathlib.Path\n          Path to the MultiStateReporter generated NetCDF file.\n        checkpoint : pathlib.Path\n          Path to the checkpoint file generated by MultiStateReporter.\n        dry : bool\n          Do a dry run of the calculation, creating all necessary hybrid\n          system components (topology, system, sampler, etc...) but without\n          running the simulation.\n        verbose : bool\n          Verbose output of the simulation progress. Output is provided via\n          INFO level logging.\n        scratch_basepath: pathlib.Path | None\n          Where to store temporary files, defaults to current working directory\n        shared_basepath : pathlib.Path | None\n          Where to run the calculation, defaults to current working directory\n\n        Returns\n        -------\n        dict\n          Outputs created in the basepath directory or the debug objects\n          (i.e. sampler) if ``dry==True``.\n\n        Raises\n        ------\n        error\n          Exception if anything failed\n        \"\"\"\n        # Prepare paths & verbosity\n        self._prepare(verbose, scratch_basepath, shared_basepath)\n\n        if self.verbose:\n            self.logger.info(\"Starting simulation analysis unit\")\n\n        # Get the settings\n        settings = self._get_settings(self._inputs[\"protocol\"].settings)\n\n        # Energies analysis\n        if verbose:\n            self.logger.info(\"Analyzing energies\")\n\n        energy_analysis = self._analyze_multistate_energies(\n            trajectory=trajectory,\n            checkpoint=checkpoint,\n            sampler_method=settings[\"simulation_settings\"].sampler_method.lower(),\n            output_directory=self.shared_basepath,\n            dry=dry,\n        )\n\n        # Structural analysis\n        if verbose:\n            self.logger.info(\"Analyzing structural outputs\")\n\n        structural_analysis = self._structural_analysis(\n            pdb_file=pdb_file,\n            trj_file=trajectory,\n            output_directory=self.shared_basepath,\n            dry=dry,\n        )\n\n        # Return relevant things\n        outputs = energy_analysis | structural_analysis\n        return outputs\n\n    def _execute(\n        self,\n        ctx: gufe.Context,\n        *,\n        setup_results,\n        simulation_results,\n        **inputs,\n    ) -> dict[str, Any]:\n        log_system_probe(logging.INFO, paths=[ctx.scratch])\n\n        # Ensure that we the environment hasn't changed\n        self._verify_execution_environment(setup_results.outputs)\n\n        pdb_file = setup_results.outputs[\"pdb_structure\"]\n        selection_indices = setup_results.outputs[\"selection_indices\"]\n        trajectory = simulation_results.outputs[\"nc\"]\n        checkpoint = simulation_results.outputs[\"checkpoint\"]\n\n        outputs = self.run(\n            pdb_file=pdb_file,\n            trajectory=trajectory,\n            checkpoint=checkpoint,\n            scratch_basepath=ctx.scratch,\n            shared_basepath=ctx.shared,\n        )\n\n        return {\n            \"repeat_id\": self._inputs[\"repeat_id\"],\n            \"generation\": self._inputs[\"generation\"],\n            # We include various other outputs here to make\n            # things easier when gathering.\n            \"pdb_structure\": pdb_file,\n            \"trajectory\": trajectory,\n            \"checkpoint\": checkpoint,\n            \"selection_indices\": selection_indices,\n            **outputs,\n        }\n"
  },
  {
    "path": "src/openfe/protocols/openmm_septop/__init__.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\n\"\"\"\nRun SepTop free energy calculations using OpenMM and OpenMMTools.\n\n\"\"\"\n\nfrom .equil_septop_method import (\n    SepTopComplexAnalysisUnit,\n    SepTopComplexRunUnit,\n    SepTopComplexSetupUnit,\n    SepTopProtocol,\n    SepTopProtocolResult,\n    SepTopSolventAnalysisUnit,\n    SepTopSolventRunUnit,\n    SepTopSolventSetupUnit,\n)\nfrom .equil_septop_settings import (\n    SepTopSettings,\n)\n\n__all__ = [\n    \"SepTopProtocol\",\n    \"SepTopSettings\",\n    \"SepTopProtocolResult\",\n    \"SepTopComplexSetupUnit\",\n    \"SepTopSolventSetupUnit\",\n    \"SepTopSolventRunUnit\",\n    \"SepTopComplexRunUnit\",\n    \"SepTopSolventAnalysisUnit\",\n    \"SeptopComplexAnalysisUnit\",\n]\n"
  },
  {
    "path": "src/openfe/protocols/openmm_septop/base_units.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\n\"\"\"OpenMM Equilibrium SepTop Protocol base classes\n==================================================\n\nBase classes for the equilibrium OpenMM SepTop free energy ProtocolUnits.\n\nThis mostly implements BaseSepTopUnit whose methods can be\noverridden to define different types of alchemical transformations.\n\nTODO\n----\n* Add in all the AlchemicalFactory and AlchemicalRegion kwargs\n  as settings.\n\"\"\"\n\nimport abc\nimport logging\nimport pathlib\nfrom typing import Any, Literal, Optional\n\nimport gufe\nimport numpy.typing as npt\nimport openmm\nimport openmmtools\nfrom gufe import (\n    ChemicalSystem,\n    ProteinComponent,\n    SmallMoleculeComponent,\n    SolventComponent,\n)\nfrom gufe.components import Component\nfrom gufe.protocols.errors import ProtocolUnitExecutionError\nfrom openff.toolkit.topology import Molecule as OFFMolecule\nfrom openff.units import unit as offunit\nfrom openff.units.openmm import ensure_quantity, from_openmm, to_openmm\nfrom openmm import unit as omm_unit\nfrom openmmforcefields.generators import SystemGenerator\nfrom openmmtools import multistate\nfrom openmmtools.alchemy import AbsoluteAlchemicalFactory, AlchemicalRegion\nfrom openmmtools.states import (\n    SamplerState,\n    ThermodynamicState,\n    create_thermodynamic_state_protocol,\n)\n\nimport openfe\nfrom openfe.protocols.openmm_afe.equil_afe_settings import (\n    AlchemicalSettings,\n    BaseSolvationSettings,\n    IntegratorSettings,\n    MultiStateOutputSettings,\n    MultiStateSimulationSettings,\n    OpenFFPartialChargeSettings,\n    OpenMMEngineSettings,\n    OpenMMSystemGeneratorFFSettings,\n    ThermoSettings,\n)\nfrom openfe.protocols.openmm_md.plain_md_methods import PlainMDSimulationUnit\nfrom openfe.protocols.openmm_utils import omm_compute\nfrom openfe.protocols.openmm_utils.omm_settings import SettingsBaseModel\nfrom openfe.protocols.openmm_utils.serialization import deserialize\nfrom openfe.utils import log_system_probe, without_oechem_backend\n\nfrom ..openmm_utils import (\n    charge_generation,\n    multistate_analysis,\n    settings_validation,\n    system_creation,\n    system_validation,\n)\nfrom ..openmm_utils.mdtraj_utils import mdtraj_from_openmm\nfrom .utils import SepTopParameterState\n\nlogger = logging.getLogger(__name__)\n\n\ndef _pre_equilibrate(\n    system: openmm.System,\n    topology: openmm.app.Topology,\n    positions: omm_unit.Quantity,\n    settings: dict[str, SettingsBaseModel],\n    endstate: Literal[\"A\", \"B\", \"AB\"],\n    dry: bool,\n    shared_basepath: pathlib.Path,\n    platform: openmm.Platform,\n    verbose: bool,\n    logger,\n) -> tuple[omm_unit.Quantity, omm_unit.Quantity]:\n    \"\"\"\n    Run a non-alchemical equilibration to get a stable system.\n\n    Parameters\n    ----------\n    system : openmm.System\n      An OpenMM System to equilibrate.\n    topology : openmm.app.Topology\n      OpenMM Topology of the System.\n    positions : openmm.unit.Quantity\n      Initial positions for the system.\n    settings : dict[str, SettingsBaseModel]\n      A dictionary of settings objects. Expects the\n      following entries:\n      * `engine_settings`\n      * `thermo_settings`\n      * `integrator_settings`\n      * `equil_simulation_settings`\n      * `equil_output_settings`\n    endstate: Literal['A', 'B', 'AB']\n      The endstate that is pre-equilibrated,can be 'A', 'B' or 'AB'.\n    dry: bool\n      Whether or not this is a dry run.\n    shared_basepath: pathlib.Path\n      The Path to the shared storage.\n    verbose: bool\n      Whether to print extra information\n    logger: logging.getLogger\n      Name of the logger\n\n    Returns\n    -------\n    equilibrated_positions : npt.NDArray\n      Equilibrated system positions\n    box : openmm.unit.Quantity\n      Box vectors of the equilibrated system.\n    \"\"\"\n    # Prep the simulation object\n    integrator = openmm.LangevinMiddleIntegrator(\n        to_openmm(settings[\"thermo_settings\"].temperature),\n        to_openmm(settings[\"integrator_settings\"].langevin_collision_rate),\n        to_openmm(settings[\"integrator_settings\"].timestep),\n    )\n\n    simulation = openmm.app.Simulation(\n        topology=topology,\n        system=system,\n        integrator=integrator,\n        platform=platform,\n    )\n\n    # Get the necessary number of steps\n    if settings[\"equil_simulation_settings\"].equilibration_length_nvt is not None:\n        equil_steps_nvt = settings_validation.get_simsteps(\n            sim_length=settings[\"equil_simulation_settings\"].equilibration_length_nvt,\n            timestep=settings[\"integrator_settings\"].timestep,\n            mc_steps=1,\n        )\n    else:\n        equil_steps_nvt = None\n\n    equil_steps_npt = settings_validation.get_simsteps(\n        sim_length=settings[\"equil_simulation_settings\"].equilibration_length,\n        timestep=settings[\"integrator_settings\"].timestep,\n        mc_steps=1,\n    )\n\n    prod_steps_npt = settings_validation.get_simsteps(\n        sim_length=settings[\"equil_simulation_settings\"].production_length,\n        timestep=settings[\"integrator_settings\"].timestep,\n        mc_steps=1,\n    )\n\n    if verbose:\n        logger.info(\"running non-alchemical equilibration MD\")\n\n    # Don't do anything if we're doing a dry run\n    if dry:\n        box = system.getDefaultPeriodicBoxVectors()\n        return positions, to_openmm(from_openmm(box))\n\n    # TODO: Refactor this part to live outside the method call\n    # We have to modify the output settings to have different output\n    # names for the files from the two end states\n    unfrozen_outsettings = settings[\"equil_output_settings\"].unfrozen_copy()\n\n    if endstate == \"A\" or endstate == \"B\" or endstate == \"AB\":\n        if unfrozen_outsettings.production_trajectory_filename:\n            unfrozen_outsettings.production_trajectory_filename = (\n                unfrozen_outsettings.production_trajectory_filename + f\"_state{endstate}.xtc\"\n            )\n        if unfrozen_outsettings.preminimized_structure:\n            unfrozen_outsettings.preminimized_structure = (\n                unfrozen_outsettings.preminimized_structure + f\"_state{endstate}.pdb\"\n            )\n        if unfrozen_outsettings.minimized_structure:\n            unfrozen_outsettings.minimized_structure = (\n                unfrozen_outsettings.minimized_structure + f\"_state{endstate}.pdb\"\n            )\n        if unfrozen_outsettings.equil_nvt_structure:\n            unfrozen_outsettings.equil_nvt_structure = (\n                unfrozen_outsettings.equil_nvt_structure + f\"_state{endstate}.pdb\"\n            )\n        if unfrozen_outsettings.equil_npt_structure:\n            unfrozen_outsettings.equil_npt_structure = (\n                unfrozen_outsettings.equil_npt_structure + f\"_state{endstate}.pdb\"\n            )\n        if unfrozen_outsettings.log_output:\n            unfrozen_outsettings.log_output = (\n                unfrozen_outsettings.log_output + f\"_state{endstate}.log\"\n            )\n    else:\n        errmsg = f\"Only 'A', 'B', and 'AB' are accepted as endstates. Got {endstate}\"\n        raise ValueError(errmsg)\n\n    # Use the _run_MD method from the PlainMDSimulationUnit\n    # Should in-place modify the simulation\n    PlainMDSimulationUnit._run_MD(\n        simulation=simulation,\n        positions=positions,\n        simulation_settings=settings[\"equil_simulation_settings\"],\n        output_settings=unfrozen_outsettings,\n        temperature=settings[\"thermo_settings\"].temperature,\n        barostat_frequency=settings[\"integrator_settings\"].barostat_frequency,\n        timestep=settings[\"integrator_settings\"].timestep,\n        equil_steps_nvt=equil_steps_nvt,\n        equil_steps_npt=equil_steps_npt,\n        prod_steps=prod_steps_npt,\n        verbose=verbose,\n        shared_basepath=shared_basepath,\n    )\n    state = simulation.context.getState(\n        getPositions=True,\n    )\n    equilibrated_positions = state.getPositions(asNumpy=True)\n    box = state.getPeriodicBoxVectors()\n\n    # cautiously delete out contexts & integrator\n    del simulation.context, integrator\n\n    return equilibrated_positions, to_openmm(from_openmm(box))\n\n\nclass SepTopUnitMixin:\n    \"\"\"\n    Mixin for SepTop ProtocolUnits, defining some of the common methods.\n    \"\"\"\n\n    def _prepare(\n        self,\n        verbose: bool,\n        scratch_basepath: pathlib.Path | None,\n        shared_basepath: pathlib.Path | None,\n    ):\n        \"\"\"\n        Set basepaths and do some initial logging.\n\n        Parameters\n        ----------\n        verbose : bool\n          Verbose output of the simulation progress. Output is provided via\n          INFO level logging.\n        scratch_basepath : pathlib.Path | None\n          Optional base path to write scratch files to.\n        shared_basepath : pathlib.Path | None\n          Optional base path to write shared files to.\n        \"\"\"\n        self.verbose = verbose\n\n        # set basepaths\n        def _set_optional_path(basepath):\n            if basepath is None:\n                return pathlib.Path(\".\")\n            return basepath\n\n        self.scratch_basepath = _set_optional_path(scratch_basepath)\n        self.shared_basepath = _set_optional_path(shared_basepath)\n\n    @abc.abstractmethod\n    def _get_settings(self) -> dict[str, SettingsBaseModel]:\n        \"\"\"\n        Get a dictionary with the following entries:\n          * forcefield_settings : OpenMMSystemGeneratorFFSettings\n          * thermo_settings : ThermoSettings\n          * solvation_settings : BaseSolvationSettings\n          * alchemical_settings : AlchemicalSettings\n          * lambda_settings : LambdaSettings\n          * engine_settings : OpenMMEngineSettings\n          * integrator_settings : IntegratorSettings\n          * equil_simulation_settings : MDSimulationSettings\n          * equil_output_settings : MDOutputSettings\n          * simulation_settings : MultiStateSimulationSettings\n          * output_settings : MultiStateOutputSettings\n\n        Settings may change depending on what type of simulation you are\n        running. Cherry pick them and return them to be available later on.\n\n        This method should also add various validation checks as necessary.\n\n        Note\n        ----\n        Must be implemented in the child class.\n        \"\"\"\n        ...\n\n    @staticmethod\n    def _verify_execution_environment(\n        setup_outputs: dict[str, Any],\n    ) -> None:\n        \"\"\"\n        Check that the Python environment hasn't changed based on the\n        relevant Python library versions stored in the setup outputs.\n        \"\"\"\n        try:\n            if (\n                (gufe.__version__ != setup_outputs[\"gufe_version\"])\n                or (openfe.__version__ != setup_outputs[\"openfe_version\"])\n                or (openmm.__version__ != setup_outputs[\"openmm_version\"])\n            ):\n                errmsg = \"Python environment has changed, cannot continue Protocol execution.\"\n                raise ProtocolUnitExecutionError(errmsg)\n        except KeyError as e:\n            errmsg = \"Missing environment information from setup outputs.\"\n            raise ProtocolUnitExecutionError(errmsg) from e\n\n\nclass BaseSepTopSetupUnit(gufe.ProtocolUnit, SepTopUnitMixin):\n    \"\"\"\n    Base class for the setup of ligand SepTop RBFE free energy transformations.\n    \"\"\"\n\n    def _get_alchemical_system(\n        self,\n        system: openmm.System,\n        alchem_indices_A: list[int],\n        alchem_indices_B: list[int],\n        alchemical_settings: AlchemicalSettings,\n    ) -> tuple[AbsoluteAlchemicalFactory, openmm.System]:\n        \"\"\"\n        Get an alchemically modified system and its associated factory\n\n        Parameters\n        ----------\n        system : openmm.System\n          System to alchemically modify.\n        alchem_indices_A : list[int]\n          A list of atom indices for the alchemically modified\n          ligand A in the system.\n        alchem_indices_B : list[int]\n          A list of atom indices for the alchemically modified\n          ligand B in the system.\n        alchemical_settings : AlchemicalSettings\n          Settings controlling how the alchemical system will be built.\n\n        Returns\n        -------\n        alchemical_factory : AbsoluteAlchemicalFactory\n          Factory for creating an alchemically modified system.\n        alchemical_system : openmm.System\n          Alchemically modified system\n        \"\"\"\n\n        alchemical_factory = AbsoluteAlchemicalFactory(\n            consistent_exceptions=False,\n            switch_width=1.0 * offunit.angstroms,\n            alchemical_pme_treatment=\"exact\",\n            alchemical_rf_treatment=\"switched\",\n            disable_alchemical_dispersion_correction=alchemical_settings.disable_alchemical_dispersion_correction,\n            split_alchemical_forces=True,\n        )\n\n        # Alchemical Region for ligand A\n        alchemical_region_A = AlchemicalRegion(\n            alchemical_atoms=alchem_indices_A,\n            name=\"A\",\n            softcore_alpha=alchemical_settings.softcore_alpha,\n            annihilate_electrostatics=True,\n            annihilate_sterics=alchemical_settings.annihilate_sterics,\n            softcore_a=alchemical_settings.softcore_a,\n            softcore_b=alchemical_settings.softcore_b,\n            softcore_c=alchemical_settings.softcore_c,\n            softcore_beta=0.0,\n            softcore_d=1.0,\n            softcore_e=1.0,\n            softcore_f=2.0,\n        )\n\n        # Alchemical Region for ligand B\n        alchemical_region_B = AlchemicalRegion(\n            alchemical_atoms=alchem_indices_B,\n            name=\"B\",\n            softcore_alpha=alchemical_settings.softcore_alpha,\n            annihilate_electrostatics=True,\n            annihilate_sterics=alchemical_settings.annihilate_sterics,\n            softcore_a=alchemical_settings.softcore_a,\n            softcore_b=alchemical_settings.softcore_b,\n            softcore_c=alchemical_settings.softcore_c,\n            softcore_beta=0.0,\n            softcore_d=1.0,\n            softcore_e=1.0,\n            softcore_f=2.0,\n        )\n\n        alchemical_system = alchemical_factory.create_alchemical_system(\n            system, [alchemical_region_A, alchemical_region_B]\n        )\n\n        return alchemical_factory, alchemical_system\n\n    @abc.abstractmethod\n    def _get_components(\n        self,\n    ) -> tuple[\n        dict[str, list[Component]],\n        Optional[gufe.SolventComponent],\n        Optional[gufe.ProteinComponent],\n        dict[SmallMoleculeComponent, OFFMolecule],\n    ]:\n        \"\"\"\n        Get the relevant components to create the alchemical system with.\n\n        Note\n        ----\n        Must be implemented in the child class.\n        \"\"\"\n        ...\n\n    def _get_system_generator(\n        self,\n        settings: dict[str, SettingsBaseModel],\n        solvent_comp: Optional[SolventComponent],\n    ) -> SystemGenerator:\n        \"\"\"\n        Get a system generator through the system creation\n        utilities\n\n        Parameters\n        ----------\n        settings : dict[str, SettingsBaseModel]\n          A dictionary of settings object for the unit.\n        solvent_comp : Optional[SolventComponent]\n          The solvent component of this system, if there is one.\n\n        Returns\n        -------\n        system_generator : openmmforcefields.generator.SystemGenerator\n          System Generator to parameterise this unit.\n        \"\"\"\n        ffcache = settings[\"output_settings\"].forcefield_cache\n        if ffcache is not None:\n            ffcache = self.shared_basepath / ffcache\n\n        # Block out oechem backend to avoid any issues with\n        # smiles roundtripping between rdkit and oechem\n        with without_oechem_backend():\n            system_generator = system_creation.get_system_generator(\n                forcefield_settings=settings[\"forcefield_settings\"],\n                integrator_settings=settings[\"integrator_settings\"],\n                thermo_settings=settings[\"thermo_settings\"],\n                cache=ffcache,\n                has_solvent=solvent_comp is not None,\n            )\n        return system_generator\n\n    @staticmethod\n    def _assign_partial_charges(\n        partial_charge_settings: OpenFFPartialChargeSettings,\n        smc_components: dict[SmallMoleculeComponent, OFFMolecule],\n    ) -> None:\n        \"\"\"\n        Assign partial charges to OFFMolecules inplace.\n\n        Parameters\n        ----------\n        charge_settings : OpenFFPartialChargeSettings\n          Settings for controlling how the partial charges are assigned.\n        smc_components : dict[SmallMoleculeComponent, openff.toolkit.Molecule]\n          Dictionary of OpenFF Molecules to add, keyed by\n          SmallMoleculeComponent.\n        \"\"\"\n        for mol in smc_components.values():\n            charge_generation.assign_offmol_partial_charges(\n                offmol=mol,\n                overwrite=False,\n                method=partial_charge_settings.partial_charge_method,\n                toolkit_backend=partial_charge_settings.off_toolkit_backend,\n                generate_n_conformers=partial_charge_settings.number_of_conformers,\n                nagl_model=partial_charge_settings.nagl_model,\n            )\n\n    def _get_modeller(\n        self,\n        protein_component: Optional[ProteinComponent],\n        solvent_component: SolventComponent,\n        smc_components: dict[SmallMoleculeComponent, OFFMolecule],\n        system_generator: SystemGenerator,\n        solvation_settings: BaseSolvationSettings,\n    ) -> tuple[openmm.app.Modeller, dict[Component, npt.NDArray]]:\n        \"\"\"\n        Get an OpenMM Modeller object and a list of residue indices\n        for each component in the system.\n\n        Parameters\n        ----------\n        protein_component : Optional[ProteinComponent]\n          Protein Component, if it exists.\n        solvent_component : SolventComponent\n          Solvent Component.\n        smc_components : dict[SmallMoleculeComponent, openff.toolkit.Molecule]\n          Dictionary of OpenFF Molecules to add, keyed by\n          SmallMoleculeComponent.\n        system_generator : openmmforcefields.generator.SystemGenerator\n          System Generator to parameterise this unit.\n        partial_charge_settings : BasePartialChargeSettings\n          Settings detailing how to assign partial charges to the\n          SMCs of the system.\n        solvation_settings : BaseSolvationSettings\n          Settings detailing how to solvate the system.\n\n        Returns\n        -------\n        system_modeller : openmm.app.Modeller\n          OpenMM Modeller object generated from ProteinComponent and\n          OpenFF Molecules.\n        comp_resids : dict[Component, npt.NDArray]\n          Dictionary of residue indices for each component in system.\n        \"\"\"\n        if self.verbose:\n            self.logger.info(\"Parameterizing molecules\")\n\n        # TODO: guard the following from non-RDKit backends\n        # force the creation of parameters for the small molecules\n        # this is necessary because we need to have the FF generated ahead\n        # of solvating the system.\n        # Block out oechem backend to avoid any issues with\n        # smiles roundtripping between rdkit and oechem\n        with without_oechem_backend():\n            for mol in smc_components.values():\n                system_generator.create_system(mol.to_topology().to_openmm(), molecules=[mol])\n\n            # get OpenMM modeller + dictionary of resids for each component\n            system_modeller, comp_resids = system_creation.get_omm_modeller(\n                protein_comp=protein_component,\n                solvent_comp=solvent_component,\n                small_mols=smc_components,\n                omm_forcefield=system_generator.forcefield,\n                solvent_settings=solvation_settings,\n            )\n\n        return system_modeller, comp_resids\n\n    def _get_omm_objects(\n        self,\n        system_modeller: openmm.app.Modeller,\n        system_generator: SystemGenerator,\n        smc_components: list[OFFMolecule],\n    ) -> tuple[openmm.app.Topology, openmm.unit.Quantity, openmm.System]:\n        \"\"\"\n        Get the OpenMM Topology, Positions and System of the\n        parameterised system.\n\n        Parameters\n        ----------\n        system_modeller : openmm.app.Modeller\n          OpenMM Modeller object representing the system to be\n          parametrized.\n        system_generator : SystemGenerator\n          The SystemGenerator object to create a System with.\n        smc_components : list[openff.toolkit.Molecule]\n          A list of openff Molecules to add to the system.\n\n        Returns\n        -------\n        topology : openmm.app.Topology\n          Topology object describing the parameterized system\n        system : openmm.System\n          An OpenMM System of the alchemical system.\n        positions : openmm.unit.Quantity\n          Positions of the system.\n        \"\"\"\n        topology = system_modeller.getTopology()\n        # roundtrip positions to remove vec3 issues\n        positions = to_openmm(from_openmm(system_modeller.getPositions()))\n\n        # Block out oechem backend to avoid any issues with\n        # smiles roundtripping between rdkit and oechem\n        with without_oechem_backend():\n            system = system_generator.create_system(\n                system_modeller.topology,\n                molecules=smc_components,\n            )\n        return topology, system, positions\n\n    @staticmethod\n    def _get_atom_indices(\n        omm_topology: openmm.app.Topology,\n        comp_resids: dict[Component, npt.NDArray],\n    ) -> dict[Component, list]:\n        \"\"\"\n        Get all the atom indices for each component in the system, based on\n        the dictionary of residue indices for each component.\n\n        Parameters\n        ----------\n        omm_topology: openmm.app.Topology\n          OpenMM Topology object with the full system.\n        comp_resids: dict[Component, npt.NDArray]\n          Dictionary of the components in the topology with their residue indices.\n\n        Returns\n        -------\n        comp_atomids: dict[Component, list]\n          A dictionary of atom indices for each component in the System.\n        \"\"\"\n        comp_atomids = {}\n        for key, values in comp_resids.items():\n            atom_indices = []\n            for residue in omm_topology.residues():\n                if residue.index in values:\n                    atom_indices.extend([atom.index for atom in residue.atoms()])\n            comp_atomids[key] = atom_indices\n        return comp_atomids\n\n    @staticmethod\n    def get_smc_comps(\n        alchem_comps: dict[str, list[Component]],\n        smc_comps: dict[SmallMoleculeComponent, OFFMolecule],\n    ) -> tuple[\n        dict[SmallMoleculeComponent, OFFMolecule],\n        dict[SmallMoleculeComponent, OFFMolecule],\n        dict[SmallMoleculeComponent, OFFMolecule],\n    ]:\n        # Get smcs for the different states and the common smcs\n        smc_off_A = {m: m.to_openff() for m in alchem_comps[\"stateA\"]}\n        smc_off_B = {m: m.to_openff() for m in alchem_comps[\"stateB\"]}\n        # Common smcs could e.g. be cofactors\n        smc_off_both = {\n            m: m.to_openff()\n            for m in smc_comps\n            if (m not in alchem_comps[\"stateA\"] and m not in alchem_comps[\"stateB\"])\n        }\n        smc_comps_A = smc_off_A | smc_off_both\n        smc_comps_B = smc_off_B | smc_off_both\n        smc_comps_AB = smc_off_A | smc_off_B | smc_off_both\n\n        return smc_comps_A, smc_comps_B, smc_comps_AB\n\n    def get_system(\n        self,\n        solv_comp: SolventComponent,\n        prot_comp: ProteinComponent,\n        smc_comp: dict[SmallMoleculeComponent, OFFMolecule],\n        settings: dict[str, SettingsBaseModel],\n    ):\n        \"\"\"\n        Creates an OpenMM system, topology, positions, modeller and also\n        residue IDs of the different components\n\n        Parameters\n        ----------\n        solv_comp: SolventComponent\n        prot_comp: Optional[ProteinComponent]\n        smc_comp: dict[SmallMoleculeComponent,OFFMolecule]\n        settings: dict[str, SettingsBaseModel]\n          A dictionary of settings object for the unit.\n\n        Returns\n        -------\n        omm_system: openmm.app.System\n        omm_topology: openmm.app.Topology\n        positions: openmm.unit.Quantity\n        system_modeller: openmm.app.Modeller\n        comp_resids: dict[Component, npt.NDArray]\n          A dictionary of residues for each component in the System.\n        \"\"\"\n        # Get system generator\n        system_generator = self._get_system_generator(settings, solv_comp)\n\n        # Get modeller\n        system_modeller, comp_resids = self._get_modeller(\n            prot_comp,\n            solv_comp,\n            smc_comp,\n            system_generator,\n            settings[\"solvation_settings\"],\n        )\n\n        # Get OpenMM topology, positions and system\n        omm_topology, omm_system, positions = self._get_omm_objects(\n            system_modeller, system_generator, list(smc_comp.values())\n        )\n\n        return omm_system, omm_topology, positions, system_modeller, comp_resids\n\n    @staticmethod\n    def _subsample_topology(\n        topology: openmm.app.Topology,\n        positions: openmm.unit.Quantity,\n        output_selection: str,\n        output_file: pathlib.Path,\n    ) -> npt.NDArray:\n        \"\"\"\n        Subsample the system based on user-selected output selection\n        and write the subsampled topology to a PDB file.\n\n        Parameters\n        ----------\n        topology : openmm.app.Topology\n          The system topology to subsample.\n        positions : openmm.unit.Quantity\n          The system positions.\n        output_selection : str\n          An MDTraj selection string to subsample the topology with.\n        output_file : pathlib.Path\n          Path to the file to write the PDB to.\n\n        Returns\n        -------\n        selection_indices : npt.NDArray\n          The indices of the subselected system.\n        \"\"\"\n        traj = mdtraj_from_openmm(topology, positions)\n\n        selection_indices = traj.topology.select(output_selection)\n\n        # Write out the subselected structure to PDB if not empty\n        if len(selection_indices) > 0:\n            sub_traj = traj.atom_slice(selection_indices)\n            sub_traj.save_pdb(output_file)\n\n        return selection_indices\n\n    def _execute(\n        self,\n        ctx: gufe.Context,\n        **kwargs,\n    ) -> dict[str, Any]:\n        log_system_probe(logging.INFO, paths=[ctx.scratch])\n\n        outputs = self.run(scratch_basepath=ctx.scratch, shared_basepath=ctx.shared)\n\n        return {\n            \"repeat_id\": self._inputs[\"repeat_id\"],\n            \"generation\": self._inputs[\"generation\"],\n            \"simtype\": self.simtype,\n            \"openmm_version\": openmm.__version__,\n            \"openfe_version\": openfe.__version__,\n            \"gufe_version\": gufe.__version__,\n            **outputs,\n        }\n\n\nclass BaseSepTopRunUnit(gufe.ProtocolUnit, SepTopUnitMixin):\n    \"\"\"\n    Base class for running ligand SepTop RBFE free energy transformations.\n    \"\"\"\n\n    @staticmethod\n    def _check_restart(output_settings: SettingsBaseModel, shared_path: pathlib.Path):\n        \"\"\"\n        Check if we are doing a restart.\n\n        Parameters\n        ----------\n        output_settings : SettingsBaseModel\n          The simulation output settings\n        shared_path : pathlib.Path\n          The shared directory where we should be looking for existing files.\n\n        Raises\n        ------\n        IOError\n          If one of the trajectory or checkpoint files are present\n          without the other.\n\n        Notes\n        -----\n        For now this just checks if the netcdf files are present in the\n        shared directory but in the future this may expand depending on\n        how warehouse works.\n        \"\"\"\n        trajectory = shared_path / output_settings.output_filename\n        checkpoint = shared_path / output_settings.checkpoint_storage_filename\n\n        if trajectory.is_file() and checkpoint.is_file():\n            return True\n        elif trajectory.is_file() ^ checkpoint.is_file():\n            if trajectory.is_file():\n                errmsg = \"the trajectory file is present but not the checkpoint file. \"\n            else:\n                errmsg = \"the checkpoint file is present but not the trajectory file. \"\n\n            errmsg = (\n                \"Attempting to restart but \"\n                + errmsg\n                + \"This should not happen under normal circumstances.\"\n            )\n            raise IOError(errmsg)\n        else:\n            return False\n\n    @abc.abstractmethod\n    def _get_components(\n        self,\n    ) -> tuple[\n        dict[str, list[Component]],\n        Optional[gufe.SolventComponent],\n        Optional[gufe.ProteinComponent],\n        dict[SmallMoleculeComponent, OFFMolecule],\n    ]:\n        \"\"\"\n        Get the relevant components to create the alchemical system with.\n\n        Note\n        ----\n        Must be implemented in the child class.\n        \"\"\"\n        ...\n\n    @abc.abstractmethod\n    def _get_lambda_schedule(\n        self, settings: dict[str, SettingsBaseModel]\n    ) -> dict[str, list[float]]:\n        \"\"\"\n        Create the lambda schedule\n\n        Parameters\n        ----------\n        settings : dict[str, SettingsBaseModel]\n          Settings for the unit.\n\n        Returns\n        -------\n        lambdas : dict[str, list[float]]\n\n        Note\n        ----\n        Must be implemented in the child class.\n        \"\"\"\n        ...\n\n    def _get_states(\n        self,\n        alchemical_system: openmm.System,\n        positions: openmm.unit.Quantity,\n        box_vectors: Optional[openmm.unit.Quantity],\n        settings: dict[str, SettingsBaseModel],\n        lambdas: dict[str, list[float]],\n        solvent_comp: Optional[SolventComponent],\n    ) -> tuple[list[SamplerState], list[ThermodynamicState]]:\n        \"\"\"\n        Get a list of sampler and thermodynmic states from an\n        input alchemical system.\n\n        Parameters\n        ----------\n        alchemical_system : openmm.System\n          Alchemical system to get states for.\n        positions : openmm.unit.Quantity\n          Positions of the alchemical system.\n        box_vectors : Optional[openmm.unit.Quantity]\n          Box vectors of the alchemical system.\n        settings : dict[str, SettingsBaseModel]\n          A dictionary of settings for the protocol unit.\n        lambdas : dict[str, list[float]]\n          A dictionary of lambda scales.\n        solvent_comp : Optional[SolventComponent]\n          The solvent component of the system, if there is one.\n\n        Returns\n        -------\n        sampler_states : list[SamplerState]\n          A list of SamplerStates for each replica in the system.\n        cmp_states : list[ThermodynamicState]\n          A list of ThermodynamicState for each replica in the system.\n        \"\"\"\n        alchemical_state = SepTopParameterState.from_system(alchemical_system)\n\n        # Set up the system constants\n        temperature = settings[\"thermo_settings\"].temperature\n        pressure = settings[\"thermo_settings\"].pressure\n        constants = dict()\n        constants[\"temperature\"] = ensure_quantity(temperature, \"openmm\")\n        if solvent_comp is not None:\n            constants[\"pressure\"] = ensure_quantity(pressure, \"openmm\")\n\n        cmp_states = create_thermodynamic_state_protocol(\n            alchemical_system,\n            protocol=lambdas,\n            constants=constants,\n            composable_states=[alchemical_state],\n        )\n\n        sampler_state = SamplerState(positions=positions)\n        if alchemical_system.usesPeriodicBoundaryConditions():\n            sampler_state.box_vectors = box_vectors\n        sampler_states = [sampler_state for _ in cmp_states]\n\n        return sampler_states, cmp_states\n\n    @staticmethod\n    def _get_integrator(\n        integrator_settings: IntegratorSettings,\n        simulation_settings: MultiStateSimulationSettings,\n        system: openmm.System,\n    ) -> openmmtools.mcmc.LangevinDynamicsMove:\n        \"\"\"\n        Return a LangevinDynamicsMove integrator\n\n        Parameters\n        ----------\n        integrator_settings : IntegratorSettings\n          Settings controlling the Langevin integrator.\n        simulation_settings : MultiStateSimulationSettings\n          Settings controlling the simulation.\n        system: openmm.System\n          The OpenMM System being simulated.\n\n        Returns\n        -------\n        integrator : openmmtools.mcmc.LangevinDynamicsMove\n          A configured integrator object.\n        \"\"\"\n        steps_per_iteration = settings_validation.convert_steps_per_iteration(\n            simulation_settings, integrator_settings\n        )\n\n        integrator = openmmtools.mcmc.LangevinDynamicsMove(\n            timestep=to_openmm(integrator_settings.timestep),\n            collision_rate=to_openmm(integrator_settings.langevin_collision_rate),\n            n_steps=steps_per_iteration,\n            reassign_velocities=integrator_settings.reassign_velocities,\n            n_restart_attempts=integrator_settings.n_restart_attempts,\n            constraint_tolerance=integrator_settings.constraint_tolerance,\n        )\n\n        # Validate for known issue when dealing with virtual sites\n        # and mutltistate simulations\n        if not integrator_settings.reassign_velocities:\n            for particle_idx in range(system.getNumParticles()):\n                if system.isVirtualSite(particle_idx):\n                    errmsg = (\n                        \"Simulations with virtual sites without velocity \"\n                        \"reassignments are unstable with MCMC integrators. \"\n                        \"You can set `reassign_velocities` to ``True`` in the \"\n                        \"`integrator_settings` to avoid this issue.\"\n                    )\n                    raise ValueError(errmsg)\n\n        return integrator\n\n    @staticmethod\n    def _get_reporter(\n        storage_path: pathlib.Path,\n        selection_indices: npt.NDArray,\n        simulation_settings: MultiStateSimulationSettings,\n        output_settings: MultiStateOutputSettings,\n    ) -> multistate.MultiStateReporter:\n        \"\"\"\n        Get a MultistateReporter for the simulation you are running.\n\n        Parameters\n        ----------\n        storage_path : pathlib.Path\n          Path to the directory where files should be written.\n        selection_indices : npt.NDArray\n          Array of system particle indices to subsample the system by.\n        simulation_settings : MultiStateSimulationSettings\n          Multistate simulation control settings, specifically containing\n          the amount of time per state sampling iteration.\n        output_settings: MultiStateOutputSettings\n          Output settings for the simulations\n\n        Returns\n        -------\n        reporter : multistate.MultiStateReporter\n          The reporter for the simulation.\n\n        Notes\n        -----\n        All this does is create the reporter, it works for both\n        new reporters and if we are doing a restart.\n        \"\"\"\n        # Define the trajectory & checkpoint files\n        nc = storage_path / output_settings.output_filename\n        # The checkpoint file in openmmtools is taken as the file relative\n        # to the location of the nc file, so you only want the filename\n        chk = output_settings.checkpoint_storage_filename\n\n        if output_settings.positions_write_frequency is not None:\n            pos_interval = settings_validation.divmod_time_and_check(\n                numerator=output_settings.positions_write_frequency,\n                denominator=simulation_settings.time_per_iteration,\n                numerator_name=\"output settings' position_write_frequency\",\n                denominator_name=\"simulation settings' time_per_iteration\",\n            )\n        else:\n            pos_interval = 0\n\n        if output_settings.velocities_write_frequency is not None:\n            vel_interval = settings_validation.divmod_time_and_check(\n                numerator=output_settings.velocities_write_frequency,\n                denominator=simulation_settings.time_per_iteration,\n                numerator_name=\"output settings' velocity_write_frequency\",\n                denominator_name=\"simulation settings' time_per_iteration\",\n            )\n        else:\n            vel_interval = 0\n\n        chk_intervals = settings_validation.convert_checkpoint_interval_to_iterations(\n            checkpoint_interval=output_settings.checkpoint_interval,\n            time_per_iteration=simulation_settings.time_per_iteration,\n        )\n\n        return multistate.MultiStateReporter(\n            storage=nc,\n            analysis_particle_indices=selection_indices,\n            checkpoint_interval=chk_intervals,\n            checkpoint_storage=chk,\n            position_interval=pos_interval,\n            velocity_interval=vel_interval,\n        )\n\n    @staticmethod\n    def _get_sampler(\n        integrator: openmmtools.mcmc.LangevinDynamicsMove,\n        reporter: openmmtools.multistate.MultiStateReporter,\n        simulation_settings: MultiStateSimulationSettings,\n        thermodynamic_settings: ThermoSettings,\n        compound_states: list[ThermodynamicState],\n        sampler_states: list[SamplerState],\n        platform: openmm.Platform,\n        restart: bool,\n    ) -> multistate.MultiStateSampler:\n        \"\"\"\n        Get a sampler based on the equilibrium sampling method requested.\n\n        Parameters\n        ----------\n        integrator : openmmtools.mcmc.LangevinDynamicsMove\n          The simulation integrator.\n        reporter : openmmtools.multistate.MultiStateReporter\n          The reporter to hook up to the sampler.\n        simulation_settings : MultiStateSimulationSettings\n          Settings for the alchemical sampler.\n        thermodynamic_settings : ThermoSettings\n          Thermodynamic settings\n        compound_states : list[ThermodynamicState]\n          A list of thermodynamic states to sample.\n        sampler_states : list[SamplerState]\n          A list of sampler states.\n        platform : openmm.Platform\n          The compute platform to use.\n        restart : bool\n          If we are restarting the simulation.\n\n        Returns\n        -------\n        sampler : multistate.MultistateSampler\n          A sampler configured for the chosen sampling method.\n        \"\"\"\n        _SAMPLERS = {\n            \"repex\": multistate.ReplicaExchangeSampler,\n            \"sams\": multistate.SAMSSampler,\n            \"independent\": multistate.MultiStateSampler,\n        }\n\n        sampler_method = simulation_settings.sampler_method.lower()\n        try:\n            sampler_class = _SAMPLERS[sampler_method]\n        except KeyError:\n            errmsg = f\"Unknown sampler {sampler_method}\"\n            raise AttributeError(errmsg)\n\n        # Get the real time analysis values to use\n        rta_its, rta_min_its = settings_validation.convert_real_time_analysis_iterations(\n            simulation_settings=simulation_settings,\n        )\n\n        # Get the number of production iterations to run for\n        steps_per_iteration = integrator.n_steps\n        timestep = from_openmm(integrator.timestep)\n        number_of_iterations = int(\n            settings_validation.get_simsteps(\n                sim_length=simulation_settings.production_length,\n                timestep=timestep,\n                mc_steps=steps_per_iteration,\n            )\n            / steps_per_iteration\n        )\n\n        # convert early_termination_target_error from kcal/mol to kT\n        early_termination_target_error = (\n            settings_validation.convert_target_error_from_kcal_per_mole_to_kT(\n                thermodynamic_settings.temperature,\n                simulation_settings.early_termination_target_error,\n            )\n        )\n\n        sampler_kwargs = {\n            \"mcmc_moves\": integrator,\n            \"online_analysis_interval\": rta_its,\n            \"online_analysis_target_error\": early_termination_target_error,\n            \"online_analysis_minimum_iterations\": rta_min_its,\n            \"number_of_iterations\": number_of_iterations,\n        }\n\n        if sampler_method == \"sams\":\n            sampler_kwargs |= {\n                \"flatness_criteria\": simulation_settings.sams_flatness_criteria,\n                \"gamma0\": simulation_settings.sams_gamma0,\n            }\n\n        if sampler_method == \"repex\":\n            sampler_kwargs |= {\n                \"replica_mixing_scheme\": \"swap-all\",\n            }\n\n        if restart:\n            sampler = sampler_class.from_storage(reporter)\n\n            # We do some checks to make sure we are running the same system\n            # including ensuring that we have the same thermodynamic parameters and\n            # that the lambda schedule is the same.\n            for index, thermostate in enumerate(sampler._thermodynamic_states):\n                system_validation.assert_multistate_system_equality(\n                    ref_system=compound_states[index].get_system(remove_thermostat=True),\n                    stored_system=thermostate.get_system(remove_thermostat=True),\n                )\n\n                # Loop over each composable state (e.g. GlobalParameterState object)\n                # get the parameters and check that the values are the same.\n                for composable_state in compound_states[index]._composable_states:\n                    for param in composable_state._parameters:\n                        expected = getattr(compound_states[index], param)\n                        stored = getattr(thermostate, param)\n                        if expected != stored:\n                            errmsg = (\n                                f\"System parameter {param} in checkpoint does \"\n                                \"not match protocol system, cannot resume\"\n                            )\n                            raise ValueError(errmsg)\n\n            if (\n                (simulation_settings.n_replicas != sampler.n_states)\n                or (simulation_settings.n_replicas != sampler.n_replicas)\n                or (sampler.mcmc_moves[0].n_steps != steps_per_iteration)\n                or (sampler.mcmc_moves[0].timestep != integrator.timestep)\n            ):\n                errmsg = \"System in checkpoint does not match protocol system, cannot resume\"\n                raise ValueError(errmsg)\n        else:\n            sampler = sampler_class(**sampler_kwargs)\n\n            sampler.create(\n                thermodynamic_states=compound_states,\n                sampler_states=sampler_states,\n                storage=reporter,\n            )\n\n        # Get and set the context caches\n        sampler.energy_context_cache = openmmtools.cache.ContextCache(\n            capacity=None,\n            time_to_live=None,\n            platform=platform,\n        )\n\n        sampler.sampler_context_cache = openmmtools.cache.ContextCache(\n            capacity=None,\n            time_to_live=None,\n            platform=platform,\n        )\n\n        return sampler\n\n    def _run_simulation(\n        self,\n        sampler: multistate.MultiStateSampler,\n        reporter: multistate.MultiStateReporter,\n        settings: dict[str, SettingsBaseModel],\n        dry: bool,\n    ):\n        \"\"\"\n        Run the simulation.\n\n        Parameters\n        ----------\n        sampler : multistate.MultiStateSampler\n          The sampler associated with the simulation to run.\n        reporter : multistate.MultiStateReporter\n          The reporter associated with the sampler.\n        settings : dict[str, SettingsBaseModel]\n          The dictionary of settings for the protocol.\n        dry : bool\n          Whether or not to dry run the simulation\n\n        Returns\n        -------\n        unit_results_dict : Optional[dict]\n          A dictionary containing all the free energy results,\n          if not a dry run.\n        \"\"\"\n        # Get the relevant simulation steps\n        mc_steps = settings_validation.convert_steps_per_iteration(\n            simulation_settings=settings[\"simulation_settings\"],\n            integrator_settings=settings[\"integrator_settings\"],\n        )\n\n        equil_steps = settings_validation.get_simsteps(\n            sim_length=settings[\"simulation_settings\"].equilibration_length,\n            timestep=settings[\"integrator_settings\"].timestep,\n            mc_steps=mc_steps,\n        )\n        prod_steps = settings_validation.get_simsteps(\n            sim_length=settings[\"simulation_settings\"].production_length,\n            timestep=settings[\"integrator_settings\"].timestep,\n            mc_steps=mc_steps,\n        )\n\n        if not dry:  # pragma: no-cover\n            if sampler._iteration == 0:\n                # minimize\n                if self.verbose:\n                    self.logger.info(\"minimizing systems\")\n\n                sampler.minimize(max_iterations=settings[\"simulation_settings\"].minimization_steps)\n\n                # equilibrate\n                if self.verbose:\n                    self.logger.info(\"equilibrating systems\")\n\n                sampler.equilibrate(int(equil_steps / mc_steps))\n\n            # At this point we are ready for production\n            if self.verbose:\n                self.logger.info(\"running production phase\")\n\n            # We use `run` so that we're limited by the number of iterations\n            # we passed when we built the sampler.\n            sampler.run(n_iterations=int(prod_steps / mc_steps) - sampler._iteration)\n\n            if self.verbose:\n                self.logger.info(\"production phase complete\")\n\n        else:\n            # close reporter when you're done, prevent file handle clashes\n            reporter.close()\n\n            # clean up the reporter file\n            fns = [\n                self.shared_basepath / settings[\"output_settings\"].output_filename,\n                self.shared_basepath / settings[\"output_settings\"].checkpoint_storage_filename,\n            ]\n            for fn in fns:\n                fn.unlink()\n\n    def run(\n        self,\n        system: openmm.System,\n        pdb_file: openmm.app.pdbfile.PDBFile,\n        selection_indices: npt.NDArray,\n        dry: bool = False,\n        verbose: bool = True,\n        scratch_basepath: pathlib.Path | None = None,\n        shared_basepath: pathlib.Path | None = None,\n    ) -> dict[str, Any]:\n        \"\"\"\n        Run the simulation part of the SepTop protocol.\n\n        Parameters\n        ----------\n        system: openmm.System\n          System used for the SepTop calculation.\n        pdb_file: openmm.app.pdbfile.PDBFile\n          OpenMM PDBFile object representing the SepTop System.\n        selection_indices: npt.NDArray\n          The indices of the particles to output in the trajectory.\n        dry: bool\n          Do a dry run of the calculation, creating all necessary alchemical\n          system components (topology, system, sampler, etc...) but without\n          running the simulation, default False\n        verbose: bool\n          Verbose output of the simulation progress. Output is provided via\n          INFO level logging, default True\n        scratch_basepath : pathlib.Path | None\n          Path to the scratch (temporary) directory space.\n        shared_basepath : pathlib.Path | None\n          Path to the shared (persistent) directory space.\n\n        Returns\n        -------\n        dict: dict[str, Any]\n          Dictionary of the outputs created in the basepath directory\n          (e.g. path to the simulation .nc file, checkpoint file)\n          or the sampler if ``dry==True``.\n        \"\"\"\n        # 0. General preparation tasks\n        self._prepare(verbose, scratch_basepath, shared_basepath)\n\n        if self.verbose:\n            self.logger.info(\"Running the SepTop simulation.\")\n\n        # Get settings, components, and positions\n        settings = self._get_settings()\n        alchem_comps, solv_comp, prot_comp, smc_comps = self._get_components()\n        positions = pdb_file.getPositions(asNumpy=True)\n\n        # Check for a restart\n        self.restart = self._check_restart(\n            output_settings=settings[\"output_settings\"],\n            shared_path=self.shared_basepath,\n        )\n\n        # Get the compute platform\n        platform = omm_compute.get_openmm_platform(\n            platform_name=settings[\"engine_settings\"].compute_platform,\n            gpu_device_index=settings[\"engine_settings\"].gpu_device_index,\n            restrict_cpu_count=False,\n        )\n\n        # Check that the restraints are correctly applied by running a short equilibration\n        if not self.restart:\n            equil_positions, box_AB = _pre_equilibrate(\n                system=system,\n                topology=pdb_file.topology,\n                positions=positions,\n                settings=settings,\n                endstate=\"AB\",\n                dry=dry,\n                shared_basepath=self.shared_basepath,\n                platform=platform,\n                verbose=self.verbose,\n                logger=self.logger,\n            )\n        else:\n            # If we are doing a restart, we will be using the positions\n            # in the existing checkpoint file and equil_positions is purely\n            # used to create the sampler & compound states (only used for\n            # checking the sampler being created in restarts).\n            # For the sake of simplicity, we assign equil_positions to\n            # the PDB positions and box_AB to the system vectors\n            equil_positions = positions\n            box_AB = system.getDefaultPeriodicBoxVectors()\n\n        # Get the lambda schedule\n        lambdas = self._get_lambda_schedule(settings)\n\n        # Get compound and sampler states\n        sampler_states, cmp_states = self._get_states(\n            alchemical_system=system,\n            positions=equil_positions,\n            box_vectors=box_AB,\n            settings=settings,\n            lambdas=lambdas,\n            solvent_comp=solv_comp,\n        )\n\n        # Get the integrator\n        integrator = self._get_integrator(\n            integrator_settings=settings[\"integrator_settings\"],\n            simulation_settings=settings[\"simulation_settings\"],\n            system=system,\n        )\n\n        # Wrap in try/finally to avoid memory leak issues\n        try:\n            # Get the reporter\n            reporter = self._get_reporter(\n                storage_path=self.shared_basepath,\n                selection_indices=selection_indices,\n                simulation_settings=settings[\"simulation_settings\"],\n                output_settings=settings[\"output_settings\"],\n            )\n\n            # Get the sampler\n            sampler = self._get_sampler(\n                integrator=integrator,\n                reporter=reporter,\n                simulation_settings=settings[\"simulation_settings\"],\n                thermodynamic_settings=settings[\"thermo_settings\"],\n                compound_states=cmp_states,\n                sampler_states=sampler_states,\n                platform=platform,\n                restart=self.restart,\n            )\n\n            # 8. Run simulation\n            self._run_simulation(\n                sampler,\n                reporter,\n                settings,\n                dry,\n            )\n\n        finally:\n            # Have to wrap this in a try/except, because we might\n            # be in a situatino where the reporter and sampler weren't created\n            try:\n                # Order is reporter, contexts, sampler, integrator\n                reporter.close()\n\n                # clear GPU context\n                # Note: use cache.empty() when openmmtools #690 is resolved\n                for context in list(sampler.energy_context_cache._lru._data.keys()):\n                    del sampler.energy_context_cache._lru._data[context]\n                for context in list(sampler.sampler_context_cache._lru._data.keys()):\n                    del sampler.sampler_context_cache._lru._data[context]\n                # cautiously clear out the global context cache too\n                for context in list(openmmtools.cache.global_context_cache._lru._data.keys()):\n                    del openmmtools.cache.global_context_cache._lru._data[context]\n\n                del sampler.sampler_context_cache, sampler.energy_context_cache\n\n                # Keep these around in a dry run so we can inspect things\n                if not dry:\n                    # At this point we know the sampler exists, so we del the integrator\n                    # first since it's associated with the sampler\n                    del integrator, sampler\n            except UnboundLocalError:\n                pass\n\n        if not dry:\n            nc = self.shared_basepath / settings[\"output_settings\"].output_filename\n            chk = self.shared_basepath / settings[\"output_settings\"].checkpoint_storage_filename\n            return {\n                \"trajectory\": nc,\n                \"checkpoint\": chk,\n            }\n        else:\n            return {\n                \"sampler\": sampler,\n                \"integrator\": integrator,\n                \"equil_positions\": equil_positions,\n            }\n\n    def _execute(\n        self,\n        ctx: gufe.Context,\n        *,\n        setup,\n        **kwargs,\n    ) -> dict[str, Any]:\n        log_system_probe(logging.INFO, paths=[ctx.scratch])\n\n        # Ensure the environment hasn't changed\n        self._verify_execution_environment(setup.outputs)\n\n        # Get the relevant inputs for running the unit\n        system = deserialize(setup.outputs[\"system\"])\n        pdb_file = openmm.app.pdbfile.PDBFile(str(setup.outputs[\"topology\"]))\n        selection_indices = setup.outputs[\"selection_indices\"]\n\n        outputs = self.run(\n            system=system,\n            pdb_file=pdb_file,\n            selection_indices=selection_indices,\n            scratch_basepath=ctx.scratch,\n            shared_basepath=ctx.shared,\n        )\n\n        return {\n            \"repeat_id\": self._inputs[\"repeat_id\"],\n            \"generation\": self._inputs[\"generation\"],\n            \"simtype\": self.simtype,\n            **outputs,\n        }\n\n\nclass BaseSepTopAnalysisUnit(gufe.ProtocolUnit, SepTopUnitMixin):\n    @staticmethod\n    def _analyze_multistate_energies(\n        trajectory: pathlib.Path,\n        checkpoint: pathlib.Path,\n        sampler_method: str,\n        output_directory: pathlib.Path,\n        dry: bool,\n    ):\n        \"\"\"\n        Analyze multistate energies and generate plots.\n\n        Parameters\n        ----------\n        trajectory : pathlib.Path\n          Path to the NetCDF trajectory file.\n        checkpoint : pathlib.Path\n          The name of the checkpoint file. Note this is\n          relative in path to the trajectory file.\n        sampler_method : str\n          The multistate sampler method used.\n        output_directory : pathlib.Path\n          The path to where plots will be written.\n        dry : bool\n          Whether or not we are running a dry run.\n        \"\"\"\n        reporter = multistate.MultiStateReporter(\n            storage=trajectory,\n            # Note: openmmtools only wants the name of the checkpoint\n            # file, it assumes it to be in the same place as the trajectory\n            checkpoint_storage=checkpoint.name,\n            open_mode=\"r\",\n        )\n\n        analyzer = multistate_analysis.MultistateEquilFEAnalysis(\n            reporter=reporter,\n            sampling_method=sampler_method,\n            result_units=offunit.kilocalorie_per_mole,\n        )\n\n        # Only create plots when not doing a dry run\n        if not dry:\n            analyzer.plot(filepath=output_directory, filename_prefix=\"\")\n\n        analyzer.close()\n        reporter.close()\n        return analyzer.unit_results_dict\n\n    def run(\n        self,\n        *,\n        trajectory: pathlib.Path,\n        checkpoint: pathlib.Path,\n        dry: bool = False,\n        verbose: bool = True,\n        scratch_basepath: pathlib.Path | None = None,\n        shared_basepath: pathlib.Path | None = None,\n    ) -> dict[str, Any]:\n        \"\"\"Analyze the multistate simulation.\n\n        Parameters\n        ----------\n        trajectory : pathlib.Path\n          Path to the MultiStateReporter generated NetCDF file.\n        checkpoint : pathlib.Path\n          Path to the checkpoint file generated by MultiStateReporter.\n        dry : bool\n          Do a dry run of the calculation, creating all necessary hybrid\n          system components (topology, system, sampler, etc...) but without\n          running the simulation.\n        verbose : bool\n          Verbose output of the simulation progress. Output is provided via\n          INFO level logging.\n        scratch_basepath: pathlib.Path | None\n          Where to store temporary files, defaults to current working directory\n        shared_basepath : pathlib.Path | None\n          Where to run the calculation, defaults to current working directory\n\n        Returns\n        -------\n        dict\n          Outputs created in the basepath directory or the debug objects\n          (i.e. sampler) if ``dry==True``.\n        \"\"\"\n        # Prepare paths & verbosity\n        self._prepare(verbose, scratch_basepath, shared_basepath)\n\n        if self.verbose:\n            self.logger.info(\"Starting simulation analysis unit\")\n\n        # Get the settings\n        settings = self._get_settings()\n\n        # Energies analysis\n        if verbose:\n            self.logger.info(\"Analyzing energies\")\n\n        energy_analysis = self._analyze_multistate_energies(\n            trajectory=trajectory,\n            checkpoint=checkpoint,\n            sampler_method=settings[\"simulation_settings\"].sampler_method.lower(),\n            output_directory=self.shared_basepath,\n            dry=dry,\n        )\n\n        return energy_analysis\n\n    def _execute(\n        self,\n        ctx: gufe.Context,\n        *,\n        setup,\n        simulation,\n        **inputs,\n    ) -> dict[str, Any]:\n        log_system_probe(logging.INFO, paths=[ctx.scratch])\n\n        # Ensure the environment hasn't changed\n        self._verify_execution_environment(setup.outputs)\n\n        # Get the relevant inputs for running the unit\n        trajectory = simulation.outputs[\"trajectory\"]\n        checkpoint = simulation.outputs[\"checkpoint\"]\n\n        outputs = self.run(\n            trajectory=trajectory,\n            checkpoint=checkpoint,\n            scratch_basepath=ctx.scratch,\n            shared_basepath=ctx.shared,\n        )\n\n        # We re-include things here to make life easier when gathering results\n        if self.simtype == \"complex\":\n            previous_outputs = {\n                \"standard_state_correction_A\": setup.outputs[\"standard_state_correction_A\"],\n                \"standard_state_correction_B\": setup.outputs[\"standard_state_correction_B\"],\n                \"restraint_geometry_A\": setup.outputs[\"restraint_geometry_A\"],\n                \"restraint_geometry_B\": setup.outputs[\"restraint_geometry_B\"],\n            }\n        else:\n            previous_outputs = {\n                \"standard_state_correction\": setup.outputs[\"standard_state_correction\"]\n            }\n\n        previous_outputs[\"subsampled_pdb_structure\"] = setup.outputs[\"subsampled_pdb_structure\"]\n        previous_outputs[\"selection_indices\"] = setup.outputs[\"selection_indices\"]\n        previous_outputs[\"trajectory\"] = trajectory\n        previous_outputs[\"checkpoint\"] = checkpoint\n\n        return {\n            \"repeat_id\": self._inputs[\"repeat_id\"],\n            \"generation\": self._inputs[\"generation\"],\n            \"simtype\": self.simtype,\n            **outputs,\n            **previous_outputs,\n        }\n"
  },
  {
    "path": "src/openfe/protocols/openmm_septop/equil_septop_method.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\n\"\"\"OpenMM Equilibrium SepTop RBFE Protocol --- :mod:`openfe.protocols.openmm_septop.equil_septop_method`\n========================================================================================================\n\nThis module implements the necessary methodology tooling to run a\nSeparated Topologies RBFE calculation using OpenMM tools and one of the\nfollowing alchemical sampling methods:\n\n* Hamiltonian Replica Exchange\n* Self-adjusted mixture sampling\n* Independent window sampling\n\nCurrent limitations\n-------------------\n\n* Transformations that involve net charge changes are currently not supported.\n  The ligands must have the same net charge.\n* Only small molecules are allowed to act as alchemical molecules.\n  Alchemically changing protein or solvent components would induce\n  perturbations which are too large to be handled by this Protocol.\n\n\nAcknowledgements\n----------------\nThis Protocol is based on and inspired by the SepTop implementation from\nthe Mobleylab (https://github.com/MobleyLab/SeparatedTopologies) as well as\nfemto (https://github.com/Psivant/femto).\n\n\"\"\"\n\nfrom __future__ import annotations\n\nimport logging\nimport uuid\nimport warnings\nfrom collections import defaultdict\nfrom typing import Any, Iterable, Optional, Union\n\nimport gufe\nfrom gufe import (\n    ChemicalSystem,\n    ProteinComponent,\n    ProteinMembraneComponent,\n    SmallMoleculeComponent,\n    SolvatedPDBComponent,\n    SolventComponent,\n    settings,\n)\nfrom gufe.components import Component\nfrom openff.units import unit as offunit\nfrom rdkit import Chem\n\nfrom openfe.due import Doi, due\nfrom openfe.protocols.openmm_septop.equil_septop_settings import (\n    AlchemicalSettings,\n    IntegratorSettings,\n    LambdaSettings,\n    MDSimulationSettings,\n    MultiStateOutputSettings,\n    MultiStateSimulationSettings,\n    OpenFFPartialChargeSettings,\n    OpenMMEngineSettings,\n    OpenMMSolvationSettings,\n    SepTopEquilOutputSettings,\n    SepTopSettings,\n    SettingsBaseModel,\n)\n\nfrom ..openmm_utils import settings_validation, system_validation\nfrom ..restraint_utils.settings import (\n    BoreschRestraintSettings,\n    DistanceRestraintSettings,\n)\nfrom .septop_protocol_results import SepTopProtocolResult\nfrom .septop_units import (\n    SepTopComplexAnalysisUnit,\n    SepTopComplexRunUnit,\n    SepTopComplexSetupUnit,\n    SepTopSolventAnalysisUnit,\n    SepTopSolventRunUnit,\n    SepTopSolventSetupUnit,\n)\n\ndue.cite(\n    Doi(\"10.1021/acs.jctc.3c00282\"),\n    description=\"Separated Topologies method\",\n    path=\"openfe.protocols.openmm_septop.equil_septop_method\",\n    cite_module=True,\n)\n\ndue.cite(\n    Doi(\"10.5281/zenodo.596622\"),\n    description=\"OpenMMTools\",\n    path=\"openfe.protocols.openmm_septop.equil_septop_method\",\n    cite_module=True,\n)\n\ndue.cite(\n    Doi(\"10.1371/journal.pcbi.1005659\"),\n    description=\"OpenMM\",\n    path=\"openfe.protocols.openmm_septop.equil_septop_method\",\n    cite_module=True,\n)\n\n\nlogger = logging.getLogger(__name__)\n\n\ndef _check_alchemical_charge_difference(\n    ligandA: SmallMoleculeComponent,\n    ligandB: SmallMoleculeComponent,\n):\n    \"\"\"\n    Checks and returns the difference in formal charge between state A\n    and B.\n\n    Raises\n    ------\n    ValueError\n      * If a change in net charge is detected.\n\n    Parameters\n    ----------\n    ligandA: SmallMoleculeComponent\n    ligandB: SmallMoleculeComponent\n    \"\"\"\n    chg_A = Chem.rdmolops.GetFormalCharge(ligandA.to_rdkit())\n    chg_B = Chem.rdmolops.GetFormalCharge(ligandB.to_rdkit())\n\n    difference = chg_A - chg_B\n\n    if abs(difference) != 0:\n        errmsg = (\n            f\"A charge difference of {difference} is observed \"\n            \"between the end states. Unfortunately this protocol \"\n            \"currently does not support net charge changes.\"\n        )\n        raise ValueError(errmsg)\n\n\nclass SepTopProtocol(gufe.Protocol):\n    \"\"\"\n    SepTop RBFE calculations using OpenMM and OpenMMTools.\n\n    See Also\n    --------\n    :mod:`openfe.protocols`\n    :class:`openfe.protocols.openmm_septop.SepTopSettings`\n    :class:`openfe.protocols.openmm_septop.SepTopProtocolResult`\n    :class:`openfe.protocols.openmm_septop.SepTopComplexSetupUnit`\n    :class:`openfe.protocols.openmm_septop.SepTopComplexRunUnit`\n    :class:`openfe.protocols.openmm_septop.SepTopSolventSetupUnit`\n    :class:`openfe.protocols.openmm_septop.SepTopSolventRunUnit`\n    \"\"\"\n\n    result_cls = SepTopProtocolResult\n    _settings_cls = SepTopSettings\n    _settings: SepTopSettings\n\n    @classmethod\n    def _default_settings(cls):\n        \"\"\"A dictionary of initial settings for this creating this Protocol\n\n        These settings are intended as a suitable starting point for creating\n        an instance of this protocol.  It is recommended, however that care is\n        taken to inspect and customize these before performing a Protocol.\n\n        Returns\n        -------\n        Settings\n          a set of default settings\n        \"\"\"\n        return SepTopSettings(\n            protocol_repeats=3,\n            forcefield_settings=settings.OpenMMSystemGeneratorFFSettings(),\n            thermo_settings=settings.ThermoSettings(\n                temperature=298.15 * offunit.kelvin,\n                pressure=1 * offunit.bar,\n            ),\n            alchemical_settings=AlchemicalSettings(),\n            solvent_lambda_settings=LambdaSettings(\n                lambda_elec_A=[\n                    0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,\n                    0.0, 0.125, 0.25, 0.375, 0.5, 0.625, 0.75, 0.875, 1.0,\n                    1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,\n                ],\n                lambda_elec_B=[\n                    1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,\n                    1.0, 0.875, 0.75, 0.625, 0.5, 0.375, 0.25, 0.125, 0.0,\n                    0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,\n                ],\n                lambda_vdw_A=[\n                    0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,\n                    0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,\n                    0.15, 0.23, 0.3, 0.4, 0.52, 0.64, 0.76, 0.88, 1.0,\n                ],\n                lambda_vdw_B=[\n                    1.0, 0.85, 0.77, 0.7, 0.6, 0.48, 0.36, 0.24, 0.12,\n                    0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,\n                    0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,\n                ],\n                lambda_restraints_A=[\n                    0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,\n                    0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,\n                    0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,\n                ],\n                lambda_restraints_B=[\n                    0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,\n                    0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,\n                    0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,\n                ],\n            ),\n            complex_lambda_settings=LambdaSettings(),\n            partial_charge_settings=OpenFFPartialChargeSettings(),\n            solvent_solvation_settings=OpenMMSolvationSettings(),\n            complex_solvation_settings=OpenMMSolvationSettings(\n                solvent_padding=1.0 * offunit.nanometer,\n            ),\n            engine_settings=OpenMMEngineSettings(),\n            solvent_integrator_settings=IntegratorSettings(),\n            complex_integrator_settings=IntegratorSettings(),\n            solvent_equil_simulation_settings=MDSimulationSettings(\n                equilibration_length_nvt=0.1 * offunit.nanosecond,\n                equilibration_length=0.1 * offunit.nanosecond,\n                production_length=2.0 * offunit.nanosecond,\n            ),\n            solvent_equil_output_settings=SepTopEquilOutputSettings(\n                equil_nvt_structure=None,\n                equil_npt_structure=\"equil_npt\",\n                production_trajectory_filename=\"equil_npt\",\n                log_output=\"equil_simulation\",\n            ),\n            solvent_simulation_settings=MultiStateSimulationSettings(\n                n_replicas=27,\n                minimization_steps=5000,\n                equilibration_length=1.0 * offunit.nanosecond,\n                production_length=10.0 * offunit.nanosecond,\n            ),\n            solvent_output_settings=MultiStateOutputSettings(\n                output_structure=\"alchemical_system.pdb\",\n                output_filename=\"solvent.nc\",\n                checkpoint_storage_filename=\"solvent_checkpoint.nc\",\n            ),\n            complex_equil_simulation_settings=MDSimulationSettings(\n                equilibration_length_nvt=0.1 * offunit.nanosecond,\n                equilibration_length=0.1 * offunit.nanosecond,\n                production_length=2.0 * offunit.nanosecond,\n            ),\n            complex_equil_output_settings=SepTopEquilOutputSettings(\n                equil_nvt_structure=None,\n                equil_npt_structure=\"equil_npt\",\n                production_trajectory_filename=\"equil_production\",\n                log_output=\"equil_simulation\",\n            ),\n            complex_simulation_settings=MultiStateSimulationSettings(\n                n_replicas=19,\n                equilibration_length=1.0 * offunit.nanosecond,\n                production_length=10.0 * offunit.nanosecond,\n            ),\n            complex_output_settings=MultiStateOutputSettings(\n                output_structure=\"alchemical_system.pdb\",\n                output_filename=\"complex.nc\",\n                checkpoint_storage_filename=\"complex_checkpoint.nc\",\n            ),\n            solvent_restraint_settings=DistanceRestraintSettings(\n                spring_constant=1000.0 * offunit.kilojoule_per_mole / offunit.nanometer**2,\n            ),\n            complex_restraint_settings=BoreschRestraintSettings(),\n        )  # fmt: skip\n\n    @classmethod\n    def _adaptive_settings(\n        cls,\n        stateA: ChemicalSystem,\n        stateB: ChemicalSystem,\n        initial_settings: None | SepTopSettings = None,\n    ) -> SepTopSettings:\n        \"\"\"\n        Get the recommended OpenFE settings for this Protocol based on the input states involved in the\n        transformation.\n\n        These are intended as a suitable starting point, which can be further\n        customized before creating a Protocol.\n\n        Parameters\n        ----------\n        stateA : ChemicalSystem\n            The initial state of the transformation.\n        stateB : ChemicalSystem\n            The final state of the transformation.\n        initial_settings : None | SepTopSettings, optional\n            Initial settings to adapt. If None, default settings are used.\n\n        Returns\n        -------\n        SepTopSettings\n            The recommended settings for this protocol based on the input states.\n        \"\"\"\n        # use initial settings or default settings\n        if initial_settings is not None:\n            protocol_settings = initial_settings.model_copy(deep=True)\n        else:\n            protocol_settings = cls.default_settings()\n\n        # adapt the barostat based on the ProteinComponent\n        if stateA.contains(ProteinMembraneComponent):\n            protocol_settings.complex_integrator_settings.barostat = \"MonteCarloMembraneBarostat\"\n\n        return protocol_settings\n\n    @staticmethod\n    def _validate_endstates(\n        stateA: ChemicalSystem,\n        stateB: ChemicalSystem,\n    ) -> None:\n        \"\"\"\n        A complex relative transformation is defined (in terms of gufe components)\n        as starting from one or more ligands and a protein in solvent and\n        ending up in a state with one ligand that is different.\n\n        Parameters\n        ----------\n        stateA : ChemicalSystem\n          The chemical system of end state A\n        stateB : ChemicalSystem\n          The chemical system of end state B\n\n        Raises\n        ------\n        ValueError\n          If there is no SolventComponent and no ProteinComponent\n          in either stateA or stateB.\n          If there are no or more than one alchemical components in state A.\n          If there are no or more than one alchemical components in state B.\n          If there are any alchemical components that are not SmallMoleculeComponents.\n          If a change in net charge between the alchemical components is detected.\n        \"\"\"\n        # check that there is a protein component\n        if not stateA.contains(ProteinComponent):\n            errmsg = \"No ProteinComponent found in stateA\"\n            raise ValueError(errmsg)\n\n        if not stateB.contains(ProteinComponent):\n            errmsg = \"No ProteinComponent found in stateB\"\n            raise ValueError(errmsg)\n\n        # check that there is only one protein component\n        system_validation.validate_protein(stateA)\n        system_validation.validate_protein(stateB)\n\n        # check that there is a SolventComponent\n        if not stateA.contains(SolventComponent):\n            errmsg = \"No SolventComponent found in stateA\"\n            raise ValueError(errmsg)\n\n        if not stateB.contains(SolventComponent):\n            errmsg = \"No SolventComponent found in stateB\"\n            raise ValueError(errmsg)\n\n        # Check the difference between the endstates\n        diff = stateA.component_diff(stateB)\n\n        for i, state in enumerate([\"stateA\", \"stateB\"]):\n            # Error if there isn't exactly one alchemical component\n            if len(diff[i]) != 1:\n                errmsg = (\n                    \"Only one alchemical species is supported. \"\n                    f\"Number of unique components found in {state}: {len(diff[i])}.\"\n                )\n                raise ValueError(errmsg)\n\n            # Error if the component isn't an SMC\n            if not isinstance(diff[i][0], SmallMoleculeComponent):\n                errmsg = (\n                    \"Only transforming SmallMoleculeComponents are supported \"\n                    f\"by this Protocol. Found a {type(diff[i][0])}.\"\n                )\n                raise ValueError(errmsg)\n\n        # Raise an error if there is a change in net charge\n        _check_alchemical_charge_difference(diff[0][0], diff[1][0])\n\n    @staticmethod\n    def _validate_lambda_schedule(\n        lambda_settings: LambdaSettings,\n        simulation_settings: MultiStateSimulationSettings,\n    ) -> None:\n        \"\"\"\n        Checks that the lambda schedule is set up correctly.\n\n        Parameters\n        ----------\n        lambda_settings : LambdaSettings\n          the lambda schedule Settings\n        simulation_settings : MultiStateSimulationSettings\n          the settings for either the complex or solvent phase\n\n        Raises\n        ------\n        ValueError\n          If the number of lambda windows differs for electrostatics and sterics.\n          If the number of replicas does not match the number of lambda windows.\n\n        TODO\n        ----\n        Add a warning if all the lambda restraints are zero? Issue #1945.\n        \"\"\"\n\n        lambda_elec_A = lambda_settings.lambda_elec_A\n        lambda_elec_B = lambda_settings.lambda_elec_B\n        lambda_vdw_A = lambda_settings.lambda_vdw_A\n        lambda_vdw_B = lambda_settings.lambda_vdw_B\n        lambda_restraints_A = lambda_settings.lambda_restraints_A\n        lambda_restraints_B = lambda_settings.lambda_restraints_B\n        n_replicas = simulation_settings.n_replicas\n\n        # Ensure that all lambda components have equal amount of windows\n        lambda_components = [\n            lambda_vdw_A,\n            lambda_vdw_B,\n            lambda_elec_A,\n            lambda_elec_B,\n            lambda_restraints_A,\n            lambda_restraints_B,\n        ]\n        lengths = {len(lam) for lam in lambda_components}\n        if len(lengths) != 1:\n            errmsg = (\n                \"Components elec, vdw, and restraints must have equal amount\"\n                f\" of lambda windows. Got {len(lambda_elec_A)} and \"\n                f\"{len(lambda_elec_B)} elec lambda windows, \"\n                f\"{len(lambda_vdw_A)} and {len(lambda_vdw_B)} vdw \"\n                f\"lambda windows, and {len(lambda_restraints_A)} and \"\n                f\"{len(lambda_restraints_B)} restraints lambda windows.\"\n            )\n            raise ValueError(errmsg)\n\n        # Ensure that number of overall lambda windows matches number of lambda\n        # windows for individual components\n        if n_replicas != len(lambda_vdw_B):\n            errmsg = (\n                f\"Number of replicas {n_replicas} does not equal the\"\n                f\" number of lambda windows {len(lambda_vdw_B)}\"\n            )\n            raise ValueError(errmsg)\n\n        # Check if there are lambda windows with naked charges\n        for state, elec, vdw in (\n            (\"A\", lambda_elec_A, lambda_vdw_A),\n            (\"B\", lambda_elec_B, lambda_vdw_B),\n        ):\n            for idx, (e, v) in enumerate(zip(elec, vdw)):\n                if e < 1 and v == 1:\n                    raise ValueError(\n                        \"There are states along this lambda schedule where \"\n                        \"there are atoms with charges but no LJ interactions: \"\n                        f\"State {state}: lambda {idx}: elec {e} vdW {v}\"\n                    )\n\n    def _validate(\n        self,\n        stateA: ChemicalSystem,\n        stateB: ChemicalSystem,\n        mapping: gufe.ComponentMapping | list[gufe.ComponentMapping] | None,\n        extends: gufe.ProtocolDAGResult | None = None,\n    ) -> None:\n        # Check we're not trying to extend\n        if extends:\n            # This technically should be NotImplementedError\n            # but gufe.Protocol.validate calls `_validate` wrapped\n            # around a try/except for that error type\n            raise ValueError(\"Can't extend simulations yet\")\n\n        # Check the mappping\n        if mapping is not None:\n            wmsg = \"A mapping was passed but is not used by this Protocol\"\n            warnings.warn(wmsg)\n\n        # Validate end states\n        system_validation.validate_chemical_system(stateA)\n        system_validation.validate_chemical_system(stateB)\n        self._validate_endstates(stateA, stateB)\n\n        # Validate the lambda schedule\n        self._validate_lambda_schedule(\n            self.settings.solvent_lambda_settings,\n            self.settings.solvent_simulation_settings,\n        )\n\n        self._validate_lambda_schedule(\n            self.settings.complex_lambda_settings,\n            self.settings.complex_simulation_settings,\n        )\n\n        # Check nonbonded and solvent compatibility\n        nonbonded_method = self.settings.forcefield_settings.nonbonded_method\n        # Validate solvent component\n        system_validation.validate_solvent(stateA, nonbonded_method)\n\n        # Validate solvation settings\n        settings_validation.validate_openmm_solvation_settings(\n            self.settings.solvent_solvation_settings\n        )\n        settings_validation.validate_openmm_solvation_settings(\n            self.settings.complex_solvation_settings\n        )\n\n        # Validate the barostat used in combination with the protein component\n        system_validation.validate_barostat(\n            stateA, self.settings.complex_integrator_settings.barostat\n        )\n\n    def _create(\n        self,\n        stateA: ChemicalSystem,\n        stateB: ChemicalSystem,\n        mapping: gufe.ComponentMapping | list[gufe.ComponentMapping] | None = None,\n        extends: gufe.ProtocolDAGResult | None = None,\n    ) -> list[gufe.ProtocolUnit]:\n        self.validate(stateA=stateA, stateB=stateB, mapping=mapping, extends=extends)\n\n        # Get the alchemical components\n        alchem_comps = system_validation.get_alchemical_components(\n            stateA,\n            stateB,\n        )\n\n        # Create list units for complex and solvent transforms\n        alchname_A = alchem_comps[\"stateA\"][0].name\n        alchname_B = alchem_comps[\"stateB\"][0].name\n\n        unit_classes: dict[str, dict[str, type[gufe.ProtocolUnit]]] = {\n            \"solvent\": {\n                \"setup\": SepTopSolventSetupUnit,\n                \"simulation\": SepTopSolventRunUnit,\n                \"analysis\": SepTopSolventAnalysisUnit,\n            },\n            \"complex\": {\n                \"setup\": SepTopComplexSetupUnit,\n                \"simulation\": SepTopComplexRunUnit,\n                \"analysis\": SepTopComplexAnalysisUnit,\n            },\n        }\n\n        protocol_units: dict[str, list[gufe.ProtocolUnit]] = {\"solvent\": [], \"complex\": []}\n\n        for i in range(self.settings.protocol_repeats):\n            repeat_id = int(uuid.uuid4())\n            for phase in [\"solvent\", \"complex\"]:\n                setup = unit_classes[phase][\"setup\"](\n                    protocol=self,\n                    stateA=stateA,\n                    stateB=stateB,\n                    alchemical_components=alchem_comps,\n                    generation=0,\n                    repeat_id=repeat_id,\n                    name=(\n                        f\"SepTop RBFE Setup, transformation {alchname_A} to \"\n                        f\"{alchname_B}, {phase} leg: repeat {i} generation 0\"\n                    ),\n                )\n\n                simulation = unit_classes[phase][\"simulation\"](\n                    protocol=self,\n                    stateA=stateA,\n                    stateB=stateB,\n                    alchemical_components=alchem_comps,\n                    setup=setup,\n                    generation=0,\n                    repeat_id=repeat_id,\n                    name=(\n                        f\"SepTop RBFE Run, transformation {alchname_A} to \"\n                        f\"{alchname_B}, {phase} leg: repeat {i} generation 0\"\n                    ),\n                )\n\n                analysis = unit_classes[phase][\"analysis\"](\n                    protocol=self,\n                    setup=setup,\n                    simulation=simulation,\n                    generation=0,\n                    repeat_id=repeat_id,\n                    name=(\n                        f\"SepTop RBFE Analysis, transformation {alchname_A} to \"\n                        f\"{alchname_B}, {phase} leg: repeat {i} generation 0\"\n                    ),\n                )\n\n                protocol_units[phase] += [setup, simulation, analysis]\n\n        return protocol_units[\"solvent\"] + protocol_units[\"complex\"]\n\n    def _gather(\n        self, protocol_dag_results: Iterable[gufe.ProtocolDAGResult]\n    ) -> dict[str, dict[str, Any]]:\n        # result units will have a repeat_id and generation\n        # first group according to repeat_id\n        unsorted_solvent_repeats = defaultdict(list)\n        unsorted_complex_repeats = defaultdict(list)\n\n        for d in protocol_dag_results:\n            pu: gufe.ProtocolUnitResult\n            for pu in d.protocol_unit_results:\n                if (\"Analysis\" not in pu.name) or (not pu.ok()):\n                    continue\n                if pu.outputs[\"simtype\"] == \"solvent\":\n                    unsorted_solvent_repeats[pu.outputs[\"repeat_id\"]].append(pu)\n                else:\n                    unsorted_complex_repeats[pu.outputs[\"repeat_id\"]].append(pu)\n\n        repeats: dict[str, dict[str, list[gufe.ProtocolUnitResult]]] = {\n            \"solvent\": {},\n            \"complex\": {},\n        }\n\n        for k, v in unsorted_solvent_repeats.items():\n            repeats[\"solvent\"][str(k)] = sorted(v, key=lambda x: x.outputs[\"generation\"])\n\n        for k, v in unsorted_complex_repeats.items():\n            repeats[\"complex\"][str(k)] = sorted(v, key=lambda x: x.outputs[\"generation\"])\n        return repeats\n"
  },
  {
    "path": "src/openfe/protocols/openmm_septop/equil_septop_settings.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\n\n\"\"\"Settings class for equilibrium SepTop Protocols using OpenMM + OpenMMTools\n\nThis module implements the necessary settings necessary to run SepTop RBFE\ncalculations using OpenMM.\n\nSee Also\n--------\nopenfe.protocols.openmm_septop.SepTopProtocol\n\"\"\"\n\nfrom typing import Optional\n\nimport numpy as np\nfrom gufe.settings import (\n    OpenMMSystemGeneratorFFSettings,\n    SettingsBaseModel,\n    ThermoSettings,\n)\nfrom gufe.settings.typing import PicosecondQuantity\nfrom openff.units import unit as offunit\nfrom pydantic import field_validator\n\nfrom openfe.protocols.openmm_afe.equil_afe_settings import AlchemicalSettings\nfrom openfe.protocols.openmm_utils.omm_settings import (\n    IntegratorSettings,\n    MDOutputSettings,\n    MDSimulationSettings,\n    MultiStateOutputSettings,\n    MultiStateSimulationSettings,\n    OpenFFPartialChargeSettings,\n    OpenMMEngineSettings,\n    OpenMMSolvationSettings,\n)\nfrom openfe.protocols.restraint_utils.settings import BaseRestraintSettings\n\n\nclass LambdaSettings(SettingsBaseModel):\n    \"\"\"Lambda schedule settings.\n\n    Defines lists of floats to control various aspects of the alchemical\n    transformation.\n\n    Notes\n    -----\n    * In all cases a lambda value of 0 defines a fully interacting state A and\n      a non-interacting state B, whilst a value of 1 defines a fully interacting\n      state B and a non-interacting state A.\n    * ``lambda_elec``, `lambda_vdw``, and ``lambda_restraints`` must all be of\n      the same length, defining all the windows of the transformation.\n\n    \"\"\"\n\n    # fmt: off\n    lambda_elec_A: list[float] = [\n        0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,\n        0.0, 0.25, 0.5, 0.75, 1.0,\n        1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,\n    ]\n    # fmt: on\n    \"\"\"\n    List of floats of the lambda values for the electrostatics of ligand A.\n    Zero means fully interacting and 1 means fully decoupled.\n    Length of this list needs to match length of lambda_vdw and lambda_restraints.\n    \"\"\"\n    # fmt: off\n    lambda_elec_B: list[float] = [\n        1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,\n        1.0, 0.75, 0.5, 0.25, 0.0,\n        0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,\n    ]\n    # fmt: on\n    \"\"\"\n    List of floats of the lambda values for the electrostatics of ligand B.\n    Zero means fully interacting and 1 means fully decoupled.\n    Length of this list needs to match length of lambda_vdw and\n    lambda_restraints.\n    \"\"\"\n    # fmt: off\n    lambda_vdw_A: list[float] = [\n        0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,\n        0.0, 0.0, 0.0, 0.0, 0.0,\n        0.14285714285714285, 0.2857142857142857, 0.42857142857142855, 0.5714285714285714, 0.7142857142857142, 0.8571428571428571, 1.0,\n    ]\n    # fmt: on\n    \"\"\"\n    List of floats of lambda values for the van der Waals of ligand A.\n    Zero means fully interacting and 1 means fully decoupled.\n    Length of this list needs to match length of lambda_elec and\n    lambda_restraints.\n    \"\"\"\n    # fmt: off\n    lambda_vdw_B: list[float] = [\n        1.0, 0.8571428571428572, 0.7142857142857143, 0.5714285714285714, 0.4285714285714286, 0.2857142857142858, 0.1428571428571429,\n        0.0, 0.0, 0.0, 0.0, 0.0,\n        0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,\n    ]\n    # fmt: on\n    \"\"\"\n    List of floats of lambda values for the van der Waals of ligand B.\n    Zero means fully interacting and 1 means fully decoupled.\n    Length of this list needs to match length of lambda_elec and lambda_restraints.\n    \"\"\"\n    # fmt: off\n    lambda_restraints_A: list[float] = [\n        0.0, 0.05, 0.1, 0.3, 0.5, 0.75, 1.0,\n        1.0, 1.0, 1.0, 1.0, 1.0,\n        1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,\n    ]\n    # fmt: on\n    \"\"\"\n    List of floats of lambda values for the restraints of ligand A.\n    Zero means no restraints are applied and 1 means restraints are fully applied.\n    Length of this list needs to match length of lambda_vdw and lambda_elec.\n    \"\"\"\n    # fmt: off\n    lambda_restraints_B: list[float] = [\n        1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,\n        1.0, 1.0, 1.0, 1.0, 1.0,\n        1.0, 0.75, 0.5, 0.3, 0.1, 0.05, 0.0,\n    ]\n    # fmt: on\n    \"\"\"\n    List of floats of lambda values for the restraints of ligand B.\n    Zero means no restraints are applied and 1 means restraints are fully applied.\n    Length of this list needs to match length of lambda_vdw and lambda_elec.\n    \"\"\"\n\n    @field_validator(\n        \"lambda_elec_A\",\n        \"lambda_elec_B\",\n        \"lambda_vdw_A\",\n        \"lambda_vdw_B\",\n        \"lambda_restraints_A\",\n        \"lambda_restraints_B\",\n    )\n    def must_be_between_0_and_1(cls, v):\n        for window in v:\n            if not 0 <= window <= 1:\n                errmsg = (\n                    f\"Lambda windows must be between 0 and 1, got a window with value {window}.\"\n                )\n                raise ValueError(errmsg)\n        return v\n\n    @field_validator(\n        \"lambda_elec_A\",\n        \"lambda_vdw_A\",\n        \"lambda_restraints_A\",\n    )\n    def must_be_monotonically_increasing_A(cls, v):\n        difference = np.diff(v)\n\n        monotonic = np.all(difference >= 0)\n\n        if not monotonic:\n            errmsg = (\n                \"The lambda schedule for ligand A is not monotonically\"\n                f\" increasing, got schedule {v}.\"\n            )\n            raise ValueError(errmsg)\n\n        return v\n\n    @field_validator(\n        \"lambda_elec_B\",\n        \"lambda_vdw_B\",\n        \"lambda_restraints_B\",\n    )\n    def must_be_monotonically_decreasing_B(cls, v):\n        difference = np.diff(v)\n\n        monotonic = np.all(difference <= 0)\n\n        if not monotonic:\n            errmsg = (\n                \"The lambda schedule for ligand B is not monotonically\"\n                f\" decreasing, got schedule {v}.\"\n            )\n            raise ValueError(errmsg)\n\n        return v\n\n\nclass SepTopEquilOutputSettings(MDOutputSettings):\n    # reporter settings\n    output_indices: str = \"all\"\n    \"\"\"\n    Selection string for which part of the system to write coordinates for.\n    The SepTop protocol enforces \"all\" since the full system output is\n    required in the complex leg.\n    Default \"all\".\n    \"\"\"\n    production_trajectory_filename: Optional[str] = \"simulation\"\n    \"\"\"\n    Basename for the path to the storage file for analysis. The protocol will\n    append a '_stateA.xtc' and a '_stateB.xtc' for the output files of the\n    respective endstates. Default 'simulation'.\n    \"\"\"\n    trajectory_write_interval: PicosecondQuantity = 20.0 * offunit.picosecond\n    \"\"\"\n    Frequency to write the xtc file. Default 20 * offunit.picosecond.\n    \"\"\"\n    preminimized_structure: Optional[str] = \"system\"\n    \"\"\"\n    Basename for the path to the pdb file of the full pre-minimized systems.\n    The protocol will append a '_stateA.pdb' and a '_stateB.pdb' for the output\n    files of the respective endstates. Default 'system'.\n    \"\"\"\n    minimized_structure: Optional[str] = \"minimized\"\n    \"\"\"\n    Basename for the path to the pdb file of the systems after minimization.\n    The protocol will append a '_stateA.pdb' and a '_stateB.pdb' for the output\n    files of the respective endstates. Default 'minimized'.\n    \"\"\"\n    equil_nvt_structure: Optional[str] = \"equil_nvt\"\n    \"\"\"\n    Basename for the path to the pdb file of the systems after NVT equilibration.\n    The protocol will append a '_stateA' and a '_stateB' for the output files\n    of the respective endstates. Default 'equil_nvt.pdb'.\n    \"\"\"\n    equil_npt_structure: Optional[str] = \"equil_npt\"\n    \"\"\"\n    Basename for the path to the pdb file of the systems after NPT equilibration.\n    The protocol will append a '_stateA.pdb' and a '_stateB.pdb' for the output\n    files of the respective endstates. Default 'equil_npt'.\n    \"\"\"\n    log_output: Optional[str] = \"simulation\"\n    \"\"\"\n    Basename for the filename for writing the log of the MD simulation,\n    including timesteps, energies, density, etc.\n    The protocol will append a '_stateA.pdb' and a '_stateB.pdb' for the output\n    files of the respective endstates. Default 'simulation'.\n    \"\"\"\n\n    @field_validator(\"output_indices\")\n    def must_be_all(cls, v):\n        if v != \"all\":\n            errmsg = f\"Equilibration simulations need to output the full system, got {v}.\"\n            raise ValueError(errmsg)\n        return v\n\n\nclass SepTopSettings(SettingsBaseModel):\n    \"\"\"\n    Configuration object for ``SepTopProtocol``.\n\n    See Also\n    --------\n    openfe.protocols.openmm_septop.SepTopProtocol\n    \"\"\"\n\n    protocol_repeats: int\n    \"\"\"\n    The number of completely independent repeats of the entire sampling\n    process. The mean of the repeats defines the final estimate of FE\n    difference, while the variance between repeats is used as the uncertainty.\n    \"\"\"\n\n    @field_validator(\"protocol_repeats\")\n    def must_be_positive(cls, v):\n        if v <= 0:\n            errmsg = f\"protocol_repeats must be a positive value, got {v}.\"\n            raise ValueError(errmsg)\n        return v\n\n    # Inherited things\n    forcefield_settings: OpenMMSystemGeneratorFFSettings\n    \"\"\"Parameters to set up the force field with OpenMM Force Fields\"\"\"\n    thermo_settings: ThermoSettings\n    \"\"\"Settings for thermodynamic parameters\"\"\"\n\n    solvent_solvation_settings: OpenMMSolvationSettings\n    \"\"\"Settings for solvating the solvent system.\"\"\"\n\n    complex_solvation_settings: OpenMMSolvationSettings\n    \"\"\"Settings for solvating the complex system.\"\"\"\n\n    # Alchemical settings\n    alchemical_settings: AlchemicalSettings\n    \"\"\"\n    Alchemical protocol settings.\n    \"\"\"\n    solvent_lambda_settings: LambdaSettings\n    \"\"\"\n    Settings for controlling the lambda schedule for the different components\n    (vdw, elec, restraints) in the solvent.\n    \"\"\"\n    complex_lambda_settings: LambdaSettings\n    \"\"\"\n    Settings for controlling the lambda schedule for the different components\n    (vdw, elec, restraints) in the complex.\n    \"\"\"\n\n    # MD Engine things\n    engine_settings: OpenMMEngineSettings\n    \"\"\"\n    Settings specific to the OpenMM engine, such as the compute platform.\n    \"\"\"\n\n    # Sampling State defining things\n    solvent_integrator_settings: IntegratorSettings\n    \"\"\"\n    Settings for controlling the integrator, such as the timestep and\n    barostat settings in the solvent.\n    \"\"\"\n    complex_integrator_settings: IntegratorSettings\n    \"\"\"\n    Settings for controlling the integrator, such as the timestep and\n    barostat settings in the complex.\n    \"\"\"\n\n    # Simulation run settings\n    complex_equil_simulation_settings: MDSimulationSettings\n    \"\"\"\n    Pre-alchemical complex simulation control settings.\n    \"\"\"\n    complex_simulation_settings: MultiStateSimulationSettings\n    \"\"\"\n    Simulation control settings, including simulation lengths\n    for the complex transformation.\n    \"\"\"\n    solvent_equil_simulation_settings: MDSimulationSettings\n    \"\"\"\n    Pre-alchemical solvent simulation control settings.\n    \"\"\"\n    solvent_simulation_settings: MultiStateSimulationSettings\n    \"\"\"\n    Simulation control settings, including simulation lengths\n    for the solvent transformation.\n    \"\"\"\n    complex_equil_output_settings: SepTopEquilOutputSettings\n    \"\"\"\n    Simulation output settings for the complex non-alchemical equilibration.\n    \"\"\"\n    complex_output_settings: MultiStateOutputSettings\n    \"\"\"\n    Simulation output settings for the complex transformation.\n    \"\"\"\n    solvent_equil_output_settings: SepTopEquilOutputSettings\n    \"\"\"\n    Simulation output settings for the solvent non-alchemical equilibration.\n    \"\"\"\n    solvent_output_settings: MultiStateOutputSettings\n    \"\"\"\n    Simulation output settings for the solvent transformation.\n    \"\"\"\n    partial_charge_settings: OpenFFPartialChargeSettings\n    \"\"\"\n    Settings for controlling how to assign partial charges,\n    including the partial charge assignment method, and the\n    number of conformers used to generate the partial charges.\n    \"\"\"\n    solvent_restraint_settings: BaseRestraintSettings\n    \"\"\"\n    Settings for the harmonic restraint in the solvent\n    \"\"\"\n    complex_restraint_settings: BaseRestraintSettings\n    \"\"\"\n    Settings for the Boresch restraints in the complex\n    \"\"\"\n"
  },
  {
    "path": "src/openfe/protocols/openmm_septop/septop_protocol_results.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\n\"\"\"Result class for the SepTop Protocol :class:`openfe.protocols.openmm_septop.SepTopProtocolResult`\n====================================================================================================\n\nThis module implement a :class:`gufe.ProtocolResult` class to contain the results of\na :class:`openfe.protocols.openmm_septop.SepTopProtocol` free energy simulation.\n\"\"\"\n\nfrom __future__ import annotations\n\nimport itertools\nimport logging\nimport pathlib\nimport warnings\nfrom typing import Any, Optional, Union\n\nimport gufe\nimport numpy as np\nimport numpy.typing as npt\nfrom openff.units import Quantity\nfrom openff.units import unit as offunit\nfrom openmmtools import multistate\n\nfrom openfe.protocols.restraint_utils.geometry.boresch import BoreschRestraintGeometry\n\nlogger = logging.getLogger(__name__)\n\n\nclass SepTopProtocolResult(gufe.ProtocolResult):\n    \"\"\"Dict-like container for the output of a SepTopProtocol\"\"\"\n\n    def __init__(self, **data):\n        super().__init__(**data)\n        # TODO: Detect when we have extensions and stitch these together?\n        if any(\n            len(pur_list) > 2\n            for pur_list in itertools.chain(\n                self.data[\"solvent\"].values(), self.data[\"complex\"].values()\n            )\n        ):\n            raise NotImplementedError(\"Can't stitch together results yet\")\n\n    def get_individual_estimates(\n        self,\n    ) -> dict[str, list[tuple[Quantity, Quantity]]]:\n        \"\"\"\n        Get the individual estimate of the free energies.\n\n        Returns\n        -------\n        dGs : dict[str, list[tuple[unit.Quantity, unit.Quantity]]]\n          A dictionary, keyed ``solvent`` and ``complex`` for each leg\n          of the thermodynamic cycle, with lists of tuples containing\n          the individual free energy estimates and associated MBAR\n          uncertainties for each repeat of that simulation type.\n        \"\"\"\n        complex_dGs = []\n        complex_correction_dGs_A = []\n        complex_correction_dGs_B = []\n        solv_dGs = []\n        solv_correction_dGs: list[tuple[Any, Any]] = []\n\n        for pus in self.data[\"complex\"].values():\n            complex_dGs.append(\n                (pus[0].outputs[\"unit_estimate\"], pus[0].outputs[\"unit_estimate_error\"])\n            )\n            complex_correction_dGs_A.append(\n                (\n                    pus[0].outputs[\"standard_state_correction_A\"],\n                    0 * offunit.kilocalorie_per_mole,  # correction has no error\n                )\n            )\n            complex_correction_dGs_B.append(\n                (\n                    pus[0].outputs[\"standard_state_correction_B\"],\n                    0 * offunit.kilocalorie_per_mole,  # correction has no error\n                )\n            )\n\n        for pus in self.data[\"solvent\"].values():\n            solv_dGs.append(\n                (pus[0].outputs[\"unit_estimate\"], pus[0].outputs[\"unit_estimate_error\"])\n            )\n            solv_correction_dGs.append(\n                (\n                    pus[0].outputs[\"standard_state_correction\"],\n                    0 * offunit.kilocalorie_per_mole,  # correction has no error\n                )\n            )\n\n        return {\n            \"solvent\": solv_dGs,\n            \"complex\": complex_dGs,\n            \"standard_state_correction_complex_A\": complex_correction_dGs_A,\n            \"standard_state_correction_complex_B\": complex_correction_dGs_B,\n            \"standard_state_correction_solvent\": solv_correction_dGs,\n        }\n\n    @staticmethod\n    def _add_complex_standard_state_corr(\n        complex_dG: list[tuple[Quantity, Quantity]],\n        standard_state_corrA_dG: list[tuple[Quantity, Quantity]],\n        standard_state_corrB_dG: list[tuple[Quantity, Quantity]],\n    ) -> list[tuple[Quantity, Quantity]]:\n        \"\"\"\n        Helper method to combine the\n        complex & standard state corrections legs.\n\n        Parameters\n        ----------\n        complex_dG : list[tuple[openff.units.Quantity, openff.units.Quantity]]\n          The individual estimates of the complex leg,\n          where the first entry of each tuple is the dG estimate\n          and the second entry is the MBAR error.\n        standard_state_corrA_dG : list[tuple[Quantity, Quantity]]\n          The individual standard state corrections of state A\n          for each corresponding complex leg. The first entry is the\n          correction, the second is an empty error value of 0.\n        standard_state_corrB_dG : list[tuple[Quantity, Quantity]]\n          The individual standard state corrections of state B\n          for each corresponding complex leg. The first entry is the\n          correction, the second is an empty error value of 0.\n\n        Returns\n        -------\n        combined_dG : list[tuple[openff.units.Quantity,openff.units. Quantity]]\n          A list of dG estimates & MBAR errors for the combined\n          complex & standard state correction of each repeat.\n\n        Notes\n        -----\n        We assume that both list of items are in the right order.\n        \"\"\"\n        combined_dG: list[tuple[Quantity, Quantity]] = []\n        for comp, corrA, corrB in zip(complex_dG, standard_state_corrA_dG, standard_state_corrB_dG):\n            # No need to convert unit types, since pint takes care of that\n            # except that mypy hates it because pint isn't typed properly...\n            # No need to add errors since there's just the one\n            combined_dG.append((comp[0] + corrA[0] + corrB[0], comp[1]))  # type: ignore[operator]\n\n        return combined_dG\n\n    @staticmethod\n    def _add_solvent_standard_state_corr(\n        solvent_dG: list[tuple[Quantity, Quantity]],\n        standard_state_corr_dG: list[tuple[Quantity, Quantity]],\n    ) -> list[tuple[Quantity, Quantity]]:\n        \"\"\"\n        Helper method to combine the\n        solvent & standard state corrections legs.\n\n        Parameters\n        ----------\n        solvent_dG : list[tuple[openff.units.Quantity, openff.units.Quantity]]\n          The individual estimates of the solvent leg,\n          where the first entry of each tuple is the dG estimate\n          and the second entry is the MBAR error.\n        standard_state_corrA_dG : list[tuple[Quantity, Quantity]]\n          The individual solvent standard state corrections.\n          The first entry is the correction, the second is an empty error\n          value of 0.\n\n        Returns\n        -------\n        combined_dG : list[tuple[openff.units.Quantity,openff.units. Quantity]]\n          A list of dG estimates & MBAR errors for the combined\n          solvent & standard state correction of each repeat.\n\n        Notes\n        -----\n        We assume that both list of items are in the right order.\n        \"\"\"\n        combined_dG: list[tuple[Quantity, Quantity]] = []\n        for comp, corr in zip(solvent_dG, standard_state_corr_dG):\n            # No need to convert unit types, since pint takes care of that\n            # except that mypy hates it because pint isn't typed properly...\n            # No need to add errors since there's just the one\n            combined_dG.append((comp[0] + corr[0], comp[1]))  # type: ignore[operator]\n\n        return combined_dG\n\n    def get_estimate(self) -> Quantity:\n        \"\"\"Get the difference in binding free energy estimate for this calculation.\n\n        Returns\n        -------\n        ddG : openff.units.Quantity\n          The difference in binding free energy.\n          This is a Quantity defined with units.\n        \"\"\"\n\n        def _get_average(estimates):\n            # Get the unit value of the first value in the estimates\n            u = estimates[0][0].u\n            # Loop through estimates and get the free energy values\n            # in the unit of the first estimate\n            ddGs = [i[0].to(u).m for i in estimates]\n\n            return np.average(ddGs) * u\n\n        individual_estimates = self.get_individual_estimates()\n        solv_ddG = _get_average(\n            self._add_solvent_standard_state_corr(\n                individual_estimates[\"solvent\"],\n                individual_estimates[\"standard_state_correction_solvent\"],\n            )\n        )\n        complex_ddG = _get_average(\n            self._add_complex_standard_state_corr(\n                individual_estimates[\"complex\"],\n                individual_estimates[\"standard_state_correction_complex_A\"],\n                individual_estimates[\"standard_state_correction_complex_B\"],\n            )\n        )\n\n        return complex_ddG - solv_ddG\n\n    def get_uncertainty(self) -> Quantity:\n        \"\"\"Get the relative free energy error for this calculation.\n\n        Returns\n        -------\n        err : unit.Quantity\n          The standard deviation between estimates of the relative binding free\n          energy. This is a Quantity defined with units.\n        \"\"\"\n\n        def _get_stdev(estimates):\n            # Get the unit value of the first value in the estimates\n            u = estimates[0][0].u\n            # Loop through estimates and get the free energy values\n            # in the unit of the first estimate\n            ddGs = [i[0].to(u).m for i in estimates]\n\n            return np.std(ddGs) * u\n\n        individual_estimates = self.get_individual_estimates()\n        solv_err = _get_stdev(\n            self._add_solvent_standard_state_corr(\n                individual_estimates[\"solvent\"],\n                individual_estimates[\"standard_state_correction_solvent\"],\n            )\n        )\n        complex_err = _get_stdev(\n            self._add_complex_standard_state_corr(\n                individual_estimates[\"complex\"],\n                individual_estimates[\"standard_state_correction_complex_A\"],\n                individual_estimates[\"standard_state_correction_complex_B\"],\n            )\n        )\n\n        # return the combined error\n        return np.sqrt(solv_err**2 + complex_err**2)\n\n    def get_forward_and_reverse_energy_analysis(\n        self,\n    ) -> dict[str, list[Optional[dict[str, Union[npt.NDArray, Quantity]]]]]:\n        \"\"\"\n        Get the reverse and forward analysis of the free energies.\n\n        Returns\n        -------\n        forward_reverse : dict[str, list[Optional[dict[str, Union[npt.NDArray, unit.Quantity]]]]]\n            A dictionary, keyed `complex` and `solvent` for each leg of the\n            thermodynamic cycle which each contain a list of dictionaries\n            containing the forward and reverse analysis of each repeat\n            of that simulation type.\n\n            The forward and reverse analysis dictionaries contain:\n              - `fractions`: npt.NDArray\n                  The fractions of data used for the estimates\n              - `forward_DDGs`, `reverse_DDGs`: unit.Quantity\n                  The forward and reverse estimates for each fraction of data\n              - `forward_dDDGs`, `reverse_dDDGs`: unit.Quantity\n                  The forward and reverse estimate uncertainty for each\n                  fraction of data.\n\n            If one of the cycle leg list entries is ``None``, this indicates\n            that the analysis could not be carried out for that repeat. This\n            is most likely caused by MBAR convergence issues when attempting to\n            calculate free energies from too few samples.\n\n        Raises\n        ------\n        UserWarning\n          * If any of the forward and reverse dictionaries are ``None`` in a\n            given thermodynamic cycle leg.\n        \"\"\"\n\n        forward_reverse: dict[str, list[Optional[dict[str, Union[npt.NDArray, Quantity]]]]] = {}\n\n        for key in [\"complex\", \"solvent\"]:\n            forward_reverse[key] = [\n                pus[0].outputs[\"forward_and_reverse_energies\"] for pus in self.data[key].values()\n            ]\n\n            if None in forward_reverse[key]:\n                wmsg = (\n                    \"One or more ``None`` entries were found in the forward \"\n                    f\"and reverse dictionaries of the repeats of the {key} \"\n                    \"calculations. This is likely caused by an MBAR convergence \"\n                    \"failure caused by too few independent samples when \"\n                    \"calculating the free energies of the 10% timeseries slice.\"\n                )\n                warnings.warn(wmsg)\n\n        return forward_reverse\n\n    def get_overlap_matrices(self) -> dict[str, list[dict[str, npt.NDArray]]]:\n        \"\"\"\n        Get a the MBAR overlap estimates for all legs of the simulation.\n\n        Returns\n        -------\n        overlap_stats : dict[str, list[dict[str, npt.NDArray]]]\n          A dictionary with keys `complex` and `solvent` for each\n          leg of the thermodynamic cycle, which each containing a\n          list of dictionaries with the MBAR overlap estimates of\n          each repeat of that simulation type.\n\n          The underlying MBAR dictionaries contain the following keys:\n            * ``scalar``: One minus the largest nontrivial eigenvalue\n            * ``eigenvalues``: The sorted (descending) eigenvalues of the\n              overlap matrix\n            * ``matrix``: Estimated overlap matrix of observing a sample from\n              state i in state j\n        \"\"\"\n        # Loop through and get the repeats and get the matrices\n        overlap_stats: dict[str, list[dict[str, npt.NDArray]]] = {}\n\n        for key in [\"complex\", \"solvent\"]:\n            overlap_stats[key] = [\n                pus[0].outputs[\"unit_mbar_overlap\"] for pus in self.data[key].values()\n            ]\n\n        return overlap_stats\n\n    def get_replica_transition_statistics(\n        self,\n    ) -> dict[str, list[dict[str, npt.NDArray]]]:\n        \"\"\"\n        Get the replica exchange transition statistics for all\n        legs of the simulation.\n\n        Note\n        ----\n        This is currently only available in cases where a replica exchange\n        simulation was run.\n\n        Returns\n        -------\n        repex_stats : dict[str, list[dict[str, npt.NDArray]]]\n          A dictionary with keys `complex` and `solvent` for each\n          leg of the thermodynamic cycle, which each containing\n          a list of dictionaries containing the replica transition\n          statistics for each repeat of that simulation type.\n\n          The replica transition statistics dictionaries contain the following:\n            * ``eigenvalues``: The sorted (descending) eigenvalues of the\n              lambda state transition matrix\n            * ``matrix``: The transition matrix estimate of a replica switching\n              from state i to state j.\n        \"\"\"\n        repex_stats: dict[str, list[dict[str, npt.NDArray]]] = {}\n        try:\n            for key in [\"complex\", \"solvent\"]:\n                repex_stats[key] = [\n                    pus[0].outputs[\"replica_exchange_statistics\"] for pus in self.data[key].values()\n                ]\n        except KeyError:\n            errmsg = \"Replica exchange statistics were not found, did you run a repex calculation?\"\n            raise ValueError(errmsg)\n\n        return repex_stats\n\n    def get_replica_states(self) -> dict[str, list[npt.NDArray]]:\n        \"\"\"\n        Get the timeseries of replica states for all simulation legs.\n\n        Returns\n        -------\n        replica_states : dict[str, list[npt.NDArray]]\n          Dictionary keyed `complex` and `solvent` for each leg of\n          the thermodynamic cycle, with lists of replica states\n          timeseries for each repeat of that simulation type.\n        \"\"\"\n        replica_states: dict[str, list[npt.NDArray]] = {\"complex\": [], \"solvent\": []}\n\n        def is_file(filename: str):\n            p = pathlib.Path(filename)\n\n            if not p.exists():\n                errmsg = f\"File could not be found {p}\"\n                raise ValueError(errmsg)\n\n            return p\n\n        def get_replica_state(nc, chk):\n            nc = is_file(nc)\n            dir_path = nc.parents[0]\n            chk = is_file(dir_path / chk).name\n\n            reporter = multistate.MultiStateReporter(\n                storage=nc, checkpoint_storage=chk, open_mode=\"r\"\n            )\n\n            retval = np.asarray(reporter.read_replica_thermodynamic_states())\n            reporter.close()\n\n            return retval\n\n        for key in [\"complex\", \"solvent\"]:\n            for pus in self.data[key].values():\n                states = get_replica_state(\n                    pus[0].outputs[\"trajectory\"],\n                    pus[0].outputs[\"checkpoint\"],\n                )\n                replica_states[key].append(states)\n\n        return replica_states\n\n    def equilibration_iterations(self) -> dict[str, list[float]]:\n        \"\"\"\n        Get the number of equilibration iterations for each simulation.\n\n        Returns\n        -------\n        equilibration_lengths : dict[str, list[float]]\n          Dictionary keyed `complex` and `solvent` for each leg\n          of the thermodynamic cycle, with lists containing the\n          number of equilibration iterations for each repeat\n          of that simulation type.\n        \"\"\"\n        equilibration_lengths: dict[str, list[float]] = {}\n\n        for key in [\"complex\", \"solvent\"]:\n            equilibration_lengths[key] = [\n                pus[0].outputs[\"equilibration_iterations\"] for pus in self.data[key].values()\n            ]\n\n        return equilibration_lengths\n\n    def production_iterations(self) -> dict[str, list[float]]:\n        \"\"\"\n        Get the number of production iterations for each simulation.\n        Returns the number of uncorrelated production samples for each\n        repeat of the calculation.\n\n        Returns\n        -------\n        production_lengths : dict[str, list[float]]\n          Dictionary keyed `complex` and `solvent` for each leg of the\n          thermodynamic cycle, with lists with the number\n          of production iterations for each repeat of that simulation\n          type.\n        \"\"\"\n        production_lengths: dict[str, list[float]] = {}\n\n        for key in [\"complex\", \"solvent\"]:\n            production_lengths[key] = [\n                pus[0].outputs[\"production_iterations\"] for pus in self.data[key].values()\n            ]\n\n        return production_lengths\n\n    def restraint_geometries(\n        self,\n    ) -> tuple[list[BoreschRestraintGeometry], list[BoreschRestraintGeometry]]:\n        \"\"\"\n        Get a list of the restraint geometries for the\n        complex simulations. These define the atoms that have\n        been restrained in the system.\n\n        Returns\n        -------\n        geometry_A : list[dict[str, Any]]\n          A list of dictionaries containing the details of the atoms\n          in the system that are involved in the restraint of ligand A.\n        geometry_B : list[dict[str, Any]]\n          A list of dictionaries containing the details of the atoms\n          in the system that are involved in the restraint of ligand B.\n        \"\"\"\n        geometry_A = [\n            BoreschRestraintGeometry.model_validate(pus[0].outputs[\"restraint_geometry_A\"])\n            for pus in self.data[\"complex\"].values()\n        ]\n        geometry_B = [\n            BoreschRestraintGeometry.model_validate(pus[0].outputs[\"restraint_geometry_B\"])\n            for pus in self.data[\"complex\"].values()\n        ]\n\n        return geometry_A, geometry_B\n\n    def selection_indices(self) -> dict[str, list[Optional[npt.NDArray]]]:\n        \"\"\"\n        Get the system selection indices used to write PDB and\n        trajectory files.\n\n        Returns\n        -------\n        indices : dict[str, list[npt.NDArray]]\n          A dictionary keyed as `complex` and `solvent` for each\n          state, each containing a list of NDArrays containing the corresponding\n          full system atom indices for each atom written in the production\n          trajectory files for each replica.\n        \"\"\"\n        indices: dict[str, list[Optional[npt.NDArray]]] = {}\n\n        for key in [\"complex\", \"solvent\"]:\n            indices[key] = []\n            for pus in self.data[key].values():\n                indices[key].append(pus[0].outputs[\"selection_indices\"])\n\n        return indices\n"
  },
  {
    "path": "src/openfe/protocols/openmm_septop/septop_units.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\nr\"\"\"OpenMM Equilibrium SepTop RBFE Protocol Units\n================================================\n\nThis module implements the :class:`gufe.ProtocolUnit`\\s for the\nSeparated Topologies RBFE protocol.\n\"\"\"\n\nfrom __future__ import annotations\n\nimport copy\nimport itertools\nimport logging\nimport pathlib\nfrom typing import Any\n\nimport MDAnalysis as mda\nimport mdtraj as md\nimport numpy as np\nimport openmm\nimport openmm.unit\nimport openmm.unit as omm_units\nfrom gufe import (\n    SmallMoleculeComponent,\n    SolvatedPDBComponent,\n    SolventComponent,\n)\nfrom gufe.settings import SettingsBaseModel\nfrom MDAnalysis.coordinates.memory import MemoryReader\nfrom openff.toolkit.topology import Molecule as OFFMolecule\nfrom openff.units import Quantity\nfrom openff.units.openmm import from_openmm, to_openmm\nfrom openmmtools.states import ThermodynamicState\nfrom rdkit import Chem\n\nfrom openfe.protocols.openmm_utils import omm_compute\nfrom openfe.protocols.openmm_utils.serialization import serialize\nfrom openfe.protocols.restraint_utils import geometry\nfrom openfe.protocols.restraint_utils.geometry.boresch import BoreschRestraintGeometry\nfrom openfe.protocols.restraint_utils.openmm import omm_restraints\nfrom openfe.protocols.restraint_utils.openmm.omm_restraints import (\n    BoreschRestraint,\n    add_force_in_separate_group,\n)\n\nfrom ..openmm_utils import (\n    settings_validation,\n    system_validation,\n)\nfrom ..openmm_utils.mdtraj_utils import mdtraj_from_openmm\nfrom ..restraint_utils.settings import (\n    BoreschRestraintSettings,\n    DistanceRestraintSettings,\n)\nfrom .base_units import (\n    BaseSepTopAnalysisUnit,\n    BaseSepTopRunUnit,\n    BaseSepTopSetupUnit,\n    _pre_equilibrate,\n)\n\nlogger = logging.getLogger(__name__)\n\n\nclass SepTopComplexMixin:\n    \"\"\"\n    A mixin to get the components and the settings for the Complex Units.\n    \"\"\"\n\n    def _get_components(self):\n        \"\"\"\n        Get the relevant components for a complex transformation.\n\n        Returns\n        -------\n        alchem_comps : dict[str, Component]\n          A list of alchemical components\n        solv_comp : SolventComponent\n          The SolventComponent of the system\n        prot_comp : ProteinComponent | None\n          The protein component of the system, if it exists.\n        small_mols : dict[SmallMoleculeComponent: OFFMolecule]\n          SmallMoleculeComponents to add to the system.\n        \"\"\"\n        stateA = self._inputs[\"stateA\"]\n        alchem_comps = self._inputs[\"alchemical_components\"]\n\n        solv_comp, prot_comp, small_mols = system_validation.get_components(stateA)\n        small_mols = {m: m.to_openff() for m in small_mols}\n        # Also get alchemical smc from state B\n        small_mols_B = {m: m.to_openff() for m in alchem_comps[\"stateB\"]}\n        small_mols = small_mols | small_mols_B\n\n        # If there is a SolvatedPDBComponent, we set the solv_comp in the\n        # complex to that, as the SolventComponent is only used in the solvent leg\n        if isinstance(prot_comp, SolvatedPDBComponent):\n            solv_comp = prot_comp\n\n        return alchem_comps, solv_comp, prot_comp, small_mols\n\n    def _get_settings(self) -> dict[str, SettingsBaseModel]:\n        \"\"\"\n        Extract the relevant settings for a complex transformation.\n\n        Returns\n        -------\n        settings : dict[str, SettingsBaseModel]\n          A dictionary with the following entries:\n            * forcefield_settings : OpenMMSystemGeneratorFFSettings\n            * thermo_settings : ThermoSettings\n            * charge_settings : OpenFFPartialChargeSettings\n            * solvation_settings : OpenMMSolvationSettings\n            * alchemical_settings : AlchemicalSettings\n            * lambda_settings : LambdaSettings\n            * engine_settings : OpenMMEngineSettings\n            * integrator_settings : IntegratorSettings\n            * equil_simulation_settings : MDSimulationSettings\n            * equil_output_settings : SepTopEquilOutputSettings\n            * simulation_settings : SimulationSettings\n            * output_settings: MultiStateOutputSettings\n            * restraint_settings: BoreschRestraintSettings\n        \"\"\"\n        prot_settings = self._inputs[\"protocol\"].settings  # type: ignore\n\n        settings = {\n            \"forcefield_settings\": prot_settings.forcefield_settings,\n            \"thermo_settings\": prot_settings.thermo_settings,\n            \"charge_settings\": prot_settings.partial_charge_settings,\n            \"solvation_settings\": prot_settings.complex_solvation_settings,\n            \"alchemical_settings\": prot_settings.alchemical_settings,\n            \"lambda_settings\": prot_settings.complex_lambda_settings,\n            \"engine_settings\": prot_settings.engine_settings,\n            \"integrator_settings\": prot_settings.complex_integrator_settings,\n            \"equil_simulation_settings\": prot_settings.complex_equil_simulation_settings,\n            \"equil_output_settings\": prot_settings.complex_equil_output_settings,\n            \"simulation_settings\": prot_settings.complex_simulation_settings,\n            \"output_settings\": prot_settings.complex_output_settings,\n            \"restraint_settings\": prot_settings.complex_restraint_settings,\n        }\n\n        settings_validation.validate_timestep(\n            settings[\"forcefield_settings\"].hydrogen_mass,\n            settings[\"integrator_settings\"].timestep,\n        )\n\n        return settings\n\n\nclass SepTopSolventMixin:\n    \"\"\"\n    A mixin to get the components and the settings for the Solvent Units.\n    \"\"\"\n\n    def _get_components(self):\n        \"\"\"\n        Get the relevant components for a solvent transformation.\n\n        Note\n        -----\n        The solvent portion of the transformation is the transformation of one\n        ligand into the other in the solvent. The only thing that\n        should be present is the alchemical species in state A and state B\n        and the SolventComponent.\n\n        Returns\n        -------\n        alchem_comps : dict[str, Component]\n          A list of alchemical components\n        solv_comp : SolventComponent\n          The SolventComponent of the system\n        prot_comp : ProteinComponent | None\n          The protein component of the system, if it exists.\n        small_mols : dict[SmallMoleculeComponent: OFFMolecule]\n          SmallMoleculeComponents to add to the system.\n        \"\"\"\n        stateA = self._inputs[\"stateA\"]\n        alchem_comps = self._inputs[\"alchemical_components\"]\n\n        small_mols_A = {m: m.to_openff() for m in alchem_comps[\"stateA\"]}\n        small_mols_B = {m: m.to_openff() for m in alchem_comps[\"stateB\"]}\n        small_mols = small_mols_A | small_mols_B\n\n        solv_comp, _, _ = system_validation.get_components(stateA)\n\n        return alchem_comps, solv_comp, None, small_mols\n\n    def _get_settings(self) -> dict[str, SettingsBaseModel]:\n        \"\"\"\n        Extract the relevant settings for a solvent transformation.\n\n        Returns\n        -------\n        settings : dict[str, SettingsBaseModel]\n          A dictionary with the following entries:\n            * forcefield_settings : OpenMMSystemGeneratorFFSettings\n            * thermo_settings : ThermoSettings\n            * charge_settings : OpenFFPartialChargeSettings\n            * solvation_settings : OpenMMSolvationSettings\n            * alchemical_settings : AlchemicalSettings\n            * lambda_settings : LambdaSettings\n            * engine_settings : OpenMMEngineSettings\n            * integrator_settings : IntegratorSettings\n            * equil_simulation_settings : MDSimulationSettings\n            * equil_output_settings : SepTopEquilOutputSettings\n            * simulation_settings : MultiStateSimulationSettings\n            * output_settings: MultiStateOutputSettings\n            * restraint_settings: BaseRestraintsSettings\n        \"\"\"\n        prot_settings = self._inputs[\"protocol\"].settings  # type: ignore\n\n        settings = {\n            \"forcefield_settings\": prot_settings.forcefield_settings,\n            \"thermo_settings\": prot_settings.thermo_settings,\n            \"charge_settings\": prot_settings.partial_charge_settings,\n            \"solvation_settings\": prot_settings.solvent_solvation_settings,\n            \"alchemical_settings\": prot_settings.alchemical_settings,\n            \"lambda_settings\": prot_settings.solvent_lambda_settings,\n            \"engine_settings\": prot_settings.engine_settings,\n            \"integrator_settings\": prot_settings.solvent_integrator_settings,\n            \"equil_simulation_settings\": prot_settings.solvent_equil_simulation_settings,\n            \"equil_output_settings\": prot_settings.solvent_equil_output_settings,\n            \"simulation_settings\": prot_settings.solvent_simulation_settings,\n            \"output_settings\": prot_settings.solvent_output_settings,\n            \"restraint_settings\": prot_settings.solvent_restraint_settings,\n        }\n\n        settings_validation.validate_timestep(\n            settings[\"forcefield_settings\"].hydrogen_mass,\n            settings[\"integrator_settings\"].timestep,\n        )\n\n        return settings\n\n\nclass SepTopComplexSetupUnit(SepTopComplexMixin, BaseSepTopSetupUnit):\n    \"\"\"\n    Protocol Unit for the complex phase of a SepTop free energy calculation\n    \"\"\"\n\n    simtype = \"complex\"\n\n    def get_system_AB(\n        self,\n        solv_comp: SolventComponent,\n        system_modeller_A: openmm.app.Modeller,\n        smc_comps_AB: dict[SmallMoleculeComponent, OFFMolecule],\n        smc_off_B: dict[SmallMoleculeComponent, OFFMolecule],\n        settings: dict[str, SettingsBaseModel],\n    ):\n        \"\"\"\n        Creates an OpenMM system, topology, positions, and modeller for a\n        complex system that contains a protein and two ligands. This takes\n        the modeller of complex A (solvated protein-ligand A complex) and\n        inserts ligand B into that complex.\n\n        Parameters\n        ----------\n        solv_comp: SolventComponent\n          The SolventComponent\n        system_modeller_A: openmm.app.Modeller\n        smc_comps_AB: dict[SmallMoleculeComponent,OFFMolecule]\n          The dictionary of all SmallMoleculeComponents in the system.\n        smc_off_B: dict[SmallMoleculeComponent,OFFMolecule]\n          The dictionary of the SmallMoleculeComponent and OFF Molecule of\n          ligand B\n        settings: dict[str, SettingsBaseModel]\n          A dictionary of settings objects for the unit.\n\n        Returns\n        -------\n        omm_system_AB: openmm.System\n        omm_topology_AB: openmm.app.Topology\n        positions_AB: openmm.unit.Quantity\n        system_modeller_AB: openmm.app.Modeller\n        \"\"\"\n        # Get system generator\n        system_generator = self._get_system_generator(settings, solv_comp)\n\n        # Get modeller B only ligand B\n        modeller_ligandB, comp_resids_ligB = self._get_modeller(\n            None,\n            None,\n            smc_off_B,\n            system_generator,\n            settings[\"solvation_settings\"],\n        )\n\n        # Take the modeller from system A --> every water/ion should be in\n        # the same location\n        system_modeller_AB = copy.copy(system_modeller_A)\n        system_modeller_AB.add(modeller_ligandB.topology, modeller_ligandB.positions)\n\n        omm_topology_AB, omm_system_AB, positions_AB = self._get_omm_objects(\n            system_modeller_AB, system_generator, list(smc_comps_AB.values())\n        )\n\n        return omm_system_AB, omm_topology_AB, positions_AB, system_modeller_AB\n\n    @staticmethod\n    def _get_selection_atom_indices(\n        traj: md.Trajectory,\n        selection: str = \"backbone\",\n    ):\n        \"\"\"\n        Get the atom indices of a MDTraj object, given a selection string.\n        Parameters\n        ----------\n        traj: md.Trajectory\n          The Mdtraj trajectory for which to get the atom indices.\n        selection: str\n          The selection string. Default: 'backbone'\n\n        Returns\n        -------\n        indices: list\n          The list of atom indices that satisfy the selection string.\n\n        Raises\n        ------\n        ValueError\n          If less than three atom indices are found for the selection string.\n        \"\"\"\n        indices = traj.topology.select(selection)\n        if len(indices) < 3:\n            errmsg = (\n                f\"Less than 3 ({len(indices)} backbone atoms were found For \"\n                \"complex A. No alignment of structures is possible.\"\n                \"Currently only proteins are supported as hosts.\"\n            )\n            raise ValueError(errmsg)\n        return indices\n\n    @staticmethod\n    def _update_positions(\n        omm_topology_A: openmm.app.Topology,\n        omm_topology_B: openmm.app.Topology,\n        positions_A: openmm.unit.Quantity,\n        positions_B: openmm.unit.Quantity,\n    ) -> openmm.unit.Quantity:\n        \"\"\"\n        Aligns the protein from complex B onto the protein from complex A and\n        updates the positions of complex B.\n\n        Parameters\n        ----------\n        omm_topology_A: openmm.app.Topology\n          OpenMM topology from complex A\n        omm_topology_B: openmm.app.Topology\n          OpenMM topology from complex B\n        positions_A: openmm.unit.Quantity\n          Positions of the system in state A\n        positions_B: openmm.unit.Quantity\n          Positions of the system in state B\n\n        Returns\n        -------\n        updated_positions_B: openmm.unit.Quantity\n          Updated positions of the complex B\n        \"\"\"\n        mdtraj_complex_A = mdtraj_from_openmm(omm_topology_A, positions_A)\n        mdtraj_complex_B = mdtraj_from_openmm(omm_topology_B, positions_B)\n        alignment_indices = SepTopComplexSetupUnit._get_selection_atom_indices(mdtraj_complex_A)\n        imaged_complex_B = mdtraj_complex_B.image_molecules()\n        imaged_complex_B.superpose(\n            mdtraj_complex_A,\n            atom_indices=alignment_indices,\n        )\n        # Extract updated system positions.\n        updated_positions_B = imaged_complex_B.openmm_positions(-1)\n\n        return updated_positions_B\n\n    @staticmethod\n    def _get_mda_universe(\n        topology: openmm.app.Topology,\n        positions: openmm.unit.Quantity,\n        trajectory: pathlib.Path | None,\n        settings: dict[str, SettingsBaseModel],\n    ) -> mda.Universe:\n        \"\"\"\n        Helper method to get a Universe from an openmm Topology,\n        and either an input trajectory or a set of positions.\n\n        Parameters\n        ----------\n        topology : openmm.app.Topology\n          An OpenMM Topology that defines the System.\n        positions: openmm.unit.Quantity\n          The System's current positions.\n          Used if a trajectory file is None or is not a file.\n        trajectory: pathlib.Path\n          A Path to a trajectory file to read positions from.\n        settings: dict\n          The settings dictionary\n\n        Returns\n        -------\n        mda.Universe\n          An MDAnalysis Universe of the System.\n        \"\"\"\n\n        # If the trajectory file doesn't exist, then we use positions\n        write_int = settings[\"equil_output_settings\"].trajectory_write_interval\n        prod_length = settings[\"equil_simulation_settings\"].production_length\n        if trajectory is not None and trajectory.is_file() and write_int <= prod_length:\n            return mda.Universe(\n                topology,\n                trajectory,\n                topology_format=\"OPENMMTOPOLOGY\",\n            )\n        else:\n            # Positions is an openmm Quantity in nm we need\n            # to convert to angstroms\n            return mda.Universe(\n                topology,\n                np.array(positions._value) * 10,\n                topology_format=\"OPENMMTOPOLOGY\",\n                trajectory_format=MemoryReader,\n            )\n\n    @staticmethod\n    def _get_boresch_restraint(\n        universe: mda.Universe,\n        guest_rdmol: Chem.Mol,\n        guest_atom_ids: list[int],\n        host_atom_ids: list[int],\n        temperature: Quantity,\n        settings: BoreschRestraintSettings,\n    ) -> tuple[BoreschRestraintGeometry, BoreschRestraint]:\n        \"\"\"\n        Get a Boresch-like restraint Geometry and OpenMM restraint force\n        supplier.\n\n        Parameters\n        ----------\n        universe : mda.Universe\n          An MDAnalysis Universe defining the system to get the restraint for.\n        guest_rdmol : Chem.Mol\n          An RDKit Molecule defining the guest molecule in the system.\n        guest_atom_ids: list[int]\n          A list of atom indices defining the guest molecule in the universe.\n        host_atom_ids : list[int]\n          A list of atom indices defining the host molecules in the universe.\n        temperature : unit.Quantity\n          The temperature of the simulation where the restraint will be added.\n        settings : BoreschRestraintSettings\n          Settings on how the Boresch-like restraint should be defined.\n\n        Returns\n        -------\n        geom : BoreschRestraintGeometry\n          A class defining the Boresch-like restraint.\n        restraint : BoreschRestraint\n          A factory class for generating Boresch restraints in OpenMM.\n        \"\"\"\n        frc_const = min(settings.K_thetaA, settings.K_thetaB)\n\n        geom = geometry.boresch.find_boresch_restraint(\n            universe=universe,\n            guest_rdmol=guest_rdmol,\n            guest_idxs=guest_atom_ids,\n            host_idxs=host_atom_ids,\n            host_selection=settings.host_selection,\n            anchor_finding_strategy=settings.anchor_finding_strategy,\n            dssp_filter=settings.dssp_filter,\n            rmsf_cutoff=settings.rmsf_cutoff,\n            host_min_distance=settings.host_min_distance,\n            host_max_distance=settings.host_max_distance,\n            angle_force_constant=frc_const,\n            temperature=temperature,\n        )\n\n        restraint = omm_restraints.BoreschRestraint(settings)\n        return geom, restraint\n\n    def _add_restraints(\n        self,\n        system: openmm.System,\n        topology_A: openmm.app.Topology,\n        topology_B: openmm.app.Topology,\n        positions_A: openmm.unit.Quantity,\n        positions_B: openmm.unit.Quantity,\n        mol_A: SmallMoleculeComponent,\n        mol_B: SmallMoleculeComponent,\n        ligand_A_inxs: list[int],\n        ligand_B_inxs: list[int],\n        ligand_B_inxs_B: list[int],\n        protein_inxs: list[int],\n        settings: dict[str, SettingsBaseModel],\n    ) -> tuple[\n        Quantity,\n        Quantity,\n        openmm.System,\n        geometry.HostGuestRestraintGeometry,\n        geometry.HostGuestRestraintGeometry,\n    ]:\n        \"\"\"\n        Adds Boresch restraints to the system.\n\n        Parameters\n        ----------\n        system: openmm.System\n          The OpenMM system where the restraints will be applied to.\n        topology_A: openmm.app.Topology\n          The OpenMM topology that defines the system A\n        topology_B: openmm.app.Topology\n          The OpenMM topology that defines the system B\n        positions_A: openmm.unit.Quantity\n          Positions of the system A. This could be a single set of positions,\n          or a full trajectory.\n        positions_B: openmm.unit.Quantity\n          Positions of the system B. This could be a single set of positions,\n          or a full trajectory.\n        mol_A: SmallMoleculeComponent\n          The SmallMoleculeComponent of ligand A\n        mol_B: SmallMoleculeComponent\n          The SmallMoleculeComponent of ligand B\n        ligand_A_inxs: list[int]\n          Atom indices of ligand A in the complex A\n        ligand_B_inxs: list[int]\n          Atom indices of ligand B in the complex B\n        ligand_B_inxs_B: list[int]\n          Atom indices of ligand B in the full system (AB)\n        protein_inxs: list[int]\n          Atom indices from the protein atoms\n        settings: dict[str, SettingsBaseModel]\n          The settings dict\n\n        Returns\n        -------\n        correction_A: unit.Quantity\n          The standard state correction for the restraint for ligand A.\n        correction_B: unit.Quantity\n          The standard state correction for the restraint for ligand B.\n        restrained_system: openmm.System\n          The OpenMM system with the added restraints forces\n        rest_geom_A: geometry.HostGuestRestraintGeometry\n          The restraint Geometry object for ligand A.\n        rest_geom_B: geometry.HostGuestRestraintGeometry\n          The restraint Geometry object for ligand B.\n        \"\"\"\n        # Get the MDA Universe for the restraints selection\n        # We try to pass the equilibration production file path through\n        # In some cases (debugging / dry runs) this won't be available\n        # so we'll default to using input positions.\n        out_traj = (\n            self.shared_basepath / settings[\"equil_output_settings\"].production_trajectory_filename\n        )\n        u_A = self._get_mda_universe(\n            topology_A,\n            positions_A,\n            pathlib.Path(f\"{out_traj}_stateA.xtc\"),\n            settings,\n        )\n        u_B = self._get_mda_universe(\n            topology_B,\n            positions_B,\n            pathlib.Path(f\"{out_traj}_stateB.xtc\"),\n            settings,\n        )\n        rdmol_A = mol_A.to_rdkit()\n        rdmol_B = mol_B.to_rdkit()\n        Chem.SanitizeMol(rdmol_A)\n        Chem.SanitizeMol(rdmol_B)\n\n        rest_geom_A, restraint_A = self._get_boresch_restraint(\n            u_A,\n            rdmol_A,\n            ligand_A_inxs,\n            protein_inxs,\n            settings[\"thermo_settings\"].temperature,\n            settings[\"restraint_settings\"],\n        )\n\n        rest_geom_B, restraint_B = self._get_boresch_restraint(\n            u_B,\n            rdmol_B,\n            ligand_B_inxs_B,\n            protein_inxs,\n            settings[\"thermo_settings\"].temperature,\n            settings[\"restraint_settings\"],\n        )\n        # We have to update the indices for ligand B to match the AB complex\n        new_boresch_B_indices = [ligand_B_inxs_B.index(i) for i in rest_geom_B.guest_atoms]\n        rest_geom_B.guest_atoms = [ligand_B_inxs[i] for i in new_boresch_B_indices]\n\n        if self.verbose:\n            self.logger.info(\n                f\"restraint geometry is: ligand A: {rest_geom_A}and ligand B: {rest_geom_B}.\"\n            )\n\n        # We need a temporary thermodynamic state to add the restraint\n        # & get the correction\n        thermodynamic_state = ThermodynamicState(\n            system,\n            temperature=to_openmm(settings[\"thermo_settings\"].temperature),\n            pressure=to_openmm(settings[\"thermo_settings\"].pressure),\n        )\n\n        # Add the force to the thermodynamic state\n        restraint_A.add_force(\n            thermodynamic_state,\n            rest_geom_A,\n            controlling_parameter_name=\"lambda_restraints_A\",\n        )\n        restraint_B.add_force(\n            thermodynamic_state,\n            rest_geom_B,\n            controlling_parameter_name=\"lambda_restraints_B\",\n        )\n        # Get the standard state correction as a unit.Quantity\n        correction_A = restraint_A.get_standard_state_correction(\n            thermodynamic_state,\n            rest_geom_A,\n        )\n        correction_B = restraint_B.get_standard_state_correction(\n            thermodynamic_state,\n            rest_geom_B,\n        )\n        # Multiply the correction for ligand B by -1 as for this ligands,\n        # Boresch restraint has to be turned on in the analytical corr.\n        correction_B = -correction_B  # type: ignore[operator]\n\n        # Get the system\n        # Note:  you have to remove the thermostat, otherwise you end up\n        # with an Andersen thermostat by default!\n        restrained_system = thermodynamic_state.get_system(remove_thermostat=True)\n\n        return (\n            correction_A,\n            correction_B,\n            restrained_system,\n            rest_geom_A,\n            rest_geom_B,\n        )\n\n    def run(\n        self,\n        dry=False,\n        verbose=True,\n        scratch_basepath=None,\n        shared_basepath=None,\n    ) -> dict[str, Any]:\n        \"\"\"\n        Run the SepTop free energy calculation.\n\n        Parameters\n        ----------\n        dry : bool\n          Do a dry run of the calculation, creating all necessary alchemical\n          system components (topology, system, sampler, etc...) but without\n          running the simulation, default False\n        verbose : bool\n          Verbose output of the simulation progress. Output is provided via\n          INFO level logging, default True\n        scratch_basepath : pathlib.Path\n          Path to the scratch (temporary) directory space.\n        shared_basepath : pathlib.Path\n          Path to the shared (persistent) directory space.\n\n        Returns\n        -------\n        dict\n          Outputs created in the basepath directory or the debug objects\n          (i.e. sampler) if ``dry==True``.\n        \"\"\"\n        # 0. General preparation tasks\n        self._prepare(verbose, scratch_basepath, shared_basepath)\n\n        self.logger.info(\"Setting up SepTop complex system.\")\n\n        # 1. Get components\n        self.logger.info(\"Creating and setting up the OpenMM systems\")\n        alchem_comps, solv_comp, prot_comp, smc_comps = self._get_components()\n        smc_comps_A, smc_comps_B, smc_comps_AB = self.get_smc_comps(alchem_comps, smc_comps)\n\n        # 3. Get settings\n        settings = self._get_settings()\n\n        # 4. Assign partial charges\n        self._assign_partial_charges(settings[\"charge_settings\"], smc_comps_AB)\n\n        # 5. Get the OpenMM systems\n        omm_system_A, omm_topology_A, positions_A, modeller_A, comp_resids_A = (\n            self.get_system(\n                solv_comp,\n                prot_comp,\n                smc_comps_A,\n                settings,\n            )\n        )  # fmt: skip\n\n        omm_system_B, omm_topology_B, positions_B, modeller_B, comp_resids_B = (\n            self.get_system(\n                solv_comp,\n                prot_comp,\n                smc_comps_B,\n                settings,\n            )\n        )  # fmt: skip\n\n        smc_B_unique_keys = smc_comps_B.keys() - smc_comps_A.keys()\n        smc_comp_B_unique = {key: smc_comps_B[key] for key in smc_B_unique_keys}\n        omm_system_AB, omm_topology_AB, positions_AB, modeller_AB = self.get_system_AB(\n            solv_comp,\n            modeller_A,\n            smc_comps_AB,\n            smc_comp_B_unique,\n            settings,\n        )\n\n        # Get the comp_resids of the AB system\n        resids_A = list(itertools.chain(*comp_resids_A.values()))\n        resids_AB = [r.index for r in modeller_AB.topology.residues()]\n        diff_resids = list(set(resids_AB) - set(resids_A))\n        comp_resids_AB = comp_resids_A | {alchem_comps[\"stateB\"][0]: np.array(diff_resids)}\n\n        # 6. Pre-equilbrate System (for restraint selection)\n        platform = omm_compute.get_openmm_platform(\n            platform_name=settings[\"engine_settings\"].compute_platform,\n            gpu_device_index=settings[\"engine_settings\"].gpu_device_index,\n            restrict_cpu_count=False,\n        )\n\n        self.logger.info(\"Pre-equilibrating the systems\")\n\n        equil_positions_A, box_A = _pre_equilibrate(\n            system=omm_system_A,\n            topology=omm_topology_A,\n            positions=positions_A,\n            settings=settings,\n            endstate=\"A\",\n            dry=dry,\n            shared_basepath=self.shared_basepath,\n            platform=platform,\n            verbose=self.verbose,\n            logger=self.logger,\n        )\n\n        equil_positions_B, box_B = _pre_equilibrate(\n            system=omm_system_B,\n            topology=omm_topology_B,\n            positions=positions_B,\n            settings=settings,\n            endstate=\"B\",\n            dry=dry,\n            shared_basepath=self.shared_basepath,\n            platform=platform,\n            verbose=self.verbose,\n            logger=self.logger,\n        )\n\n        # 7. Get all the right atom indices for alignments\n        comp_atomids_A = self._get_atom_indices(omm_topology_A, comp_resids_A)\n        all_atom_ids_A = list(itertools.chain(*comp_atomids_A.values()))\n        comp_atomids_B = self._get_atom_indices(omm_topology_B, comp_resids_B)\n\n        # Get the atom indices of ligand B in system B\n        atom_indices_B = comp_atomids_B[alchem_comps[\"stateB\"][0]]\n\n        # 8. Update the positions of system B: Align protein\n        updated_positions_B = self._update_positions(\n            omm_topology_A,\n            omm_topology_B,\n            equil_positions_A,\n            equil_positions_B,\n        )\n\n        # Get atom indices for ligand A and ligand B and the solvent in the\n        # system AB\n        comp_atomids_AB = self._get_atom_indices(omm_topology_AB, comp_resids_AB)\n        atom_indices_AB_B = comp_atomids_AB[alchem_comps[\"stateB\"][0]]\n        atom_indices_AB_A = comp_atomids_AB[alchem_comps[\"stateA\"][0]]\n\n        # Update positions from AB system\n        positions_AB[all_atom_ids_A[0] : all_atom_ids_A[-1] + 1, :] = equil_positions_A\n        positions_AB[atom_indices_AB_B[0] : atom_indices_AB_B[-1] + 1, :] = updated_positions_B[\n            atom_indices_B[0] : atom_indices_B[-1] + 1\n        ]\n\n        # 9. Create the alchemical system\n        self.logger.info(\"Creating the alchemical system and applying restraints\")\n\n        alchemical_factory, alchemical_system = self._get_alchemical_system(\n            omm_system_AB,\n            atom_indices_AB_A,\n            atom_indices_AB_B,\n            settings[\"alchemical_settings\"],\n        )\n\n        # 10. Apply Restraints\n        corr_A, corr_B, system, restraint_geom_A, restraint_geom_B = self._add_restraints(\n            alchemical_system,\n            omm_topology_A,\n            omm_topology_B,\n            equil_positions_A,\n            equil_positions_B,\n            alchem_comps[\"stateA\"][0],\n            alchem_comps[\"stateB\"][0],\n            atom_indices_AB_A,\n            atom_indices_AB_B,\n            atom_indices_B,\n            comp_atomids_AB[prot_comp],\n            settings,\n        )\n\n        equil_positions_AB, box_AB = _pre_equilibrate(\n            system=system,\n            topology=omm_topology_AB,\n            positions=positions_AB,\n            settings=settings,\n            endstate=\"AB\",\n            dry=dry,\n            platform=platform,\n            shared_basepath=self.shared_basepath,\n            verbose=self.verbose,\n            logger=self.logger,\n        )\n\n        # Update box vectors\n        omm_topology_AB.setPeriodicBoxVectors(box_AB)\n\n        # Subselect system based on user inputs & write initial subsampled PDB\n        sub_pdb_structure = self.shared_basepath / settings[\"output_settings\"].output_structure\n        selection_indices = self._subsample_topology(\n            topology=omm_topology_AB,\n            positions=positions_AB,\n            output_selection=settings[\"output_settings\"].output_indices,\n            output_file=self.shared_basepath / settings[\"output_settings\"].output_structure,\n        )\n        # The subsampled PDB may not have been written if selection_indices == 0\n        # Issue #1942 - maybe move this to the method?\n        if len(selection_indices) == 0:\n            sub_pdb_structure = None\n\n        # Serialize the system and PDB topology\n        system_outfile = self.shared_basepath / \"system.xml.bz2\"\n        serialize(system, system_outfile)\n\n        topology_file = self.shared_basepath / \"topology.pdb\"\n        openmm.app.pdbfile.PDBFile.writeFile(\n            omm_topology_AB,\n            equil_positions_AB,\n            open(topology_file, \"w\"),\n        )\n\n        if not dry:\n            return {\n                \"system\": system_outfile,\n                \"topology\": topology_file,\n                \"standard_state_correction_A\": corr_A.to(\"kilocalorie_per_mole\"),\n                \"standard_state_correction_B\": corr_B.to(\"kilocalorie_per_mole\"),\n                \"restraint_geometry_A\": restraint_geom_A.model_dump(),\n                \"restraint_geometry_B\": restraint_geom_B.model_dump(),\n                \"selection_indices\": selection_indices,\n                \"subsampled_pdb_structure\": sub_pdb_structure,\n            }\n        else:\n            return {\n                # Add in various objects we can use to test the system\n                \"system\": system_outfile,\n                \"topology\": topology_file,\n                \"system_A\": omm_system_A,\n                \"system_B\": omm_system_B,\n                \"system_AB\": omm_system_AB,\n                \"alchem_restrained_system\": system,\n                \"alchem_system\": alchemical_system,\n                \"alchem_factory\": alchemical_factory,\n                \"positions\": equil_positions_AB,\n                \"selection_indices\": selection_indices,\n                \"subsampled_pdb_structure\": sub_pdb_structure,\n            }\n\n\nclass SepTopSolventSetupUnit(SepTopSolventMixin, BaseSepTopSetupUnit):\n    \"\"\"\n    Protocol Unit for the solvent phase of a relative SepTop free energy\n    \"\"\"\n\n    simtype = \"solvent\"\n\n    @staticmethod\n    def _update_positions(\n        mol_A: SmallMoleculeComponent,\n        mol_B: SmallMoleculeComponent,\n    ) -> SmallMoleculeComponent:\n        \"\"\"\n        Computes the amount to offset the second ligand by in the solution\n        phase during RBFE calculations and applies the offset to the ligand,\n        returning the SmallMoleculeComponent with the updated positions.\n\n        Parameters\n        ----------\n        mol_A: SmallMoleculeComponent\n          The SmallMoleculeComponent of ligand A\n        mol_B: SmallMoleculeComponent\n          The SmallMoleculeComponent of ligand B\n        Returns\n        -------\n        updated_mol_B: SmallMoleculeComponent\n          The SmallMoleculeComponent of ligand B after updating its positions\n          to be a certain distance away from ligand A\n        \"\"\"\n\n        # Convert SmallMolecule to Rdkit Molecule\n        rdmol_A = mol_A.to_rdkit()\n        rdmol_B = mol_B.to_rdkit()\n        # Offset ligand B from ligand A in the solvent\n        pos_ligandA = rdmol_A.GetConformers()[0].GetPositions()\n        pos_ligandB = rdmol_B.GetConformers()[0].GetPositions()\n\n        ligand_1_radius = np.linalg.norm(pos_ligandA - pos_ligandA.mean(axis=0), axis=1).max()\n        ligand_2_radius = np.linalg.norm(pos_ligandB - pos_ligandB.mean(axis=0), axis=1).max()\n        ligand_distance = (ligand_1_radius + ligand_2_radius) * 1.5\n\n        ligand_offset = pos_ligandA.mean(0) - pos_ligandB.mean(0)\n        ligand_offset[0] += ligand_distance\n\n        # Offset the ligandB.\n        pos_ligandB += ligand_offset\n\n        # Extract updated system positions.\n        rdmol_B.GetConformers()[0].SetPositions(pos_ligandB)\n\n        updated_mol_B = SmallMoleculeComponent(rdmol_B)\n\n        return updated_mol_B\n\n    def _add_restraints(\n        self,\n        system: openmm.System,\n        ligand_1: Chem.rdchem.Mol,\n        ligand_2: Chem.rdchem.Mol,\n        ligand_1_inxs: list[int],\n        ligand_2_inxs: list[int],\n        settings: dict[str, SettingsBaseModel],\n        positions_AB: openmm.unit.Quantity,\n    ) -> tuple[\n        Quantity,\n        openmm.System,\n    ]:\n        \"\"\"\n        Apply the distance restraint between the ligands.\n\n        Parameters\n        ----------\n        system: openmm.System\n          The OpenMM system where the restraints will be applied to.\n        ligand_1: Chem.rdchem.Mol\n          The RDKit Molecule of ligand A\n        ligand_2: Chem.rdchem.Mol\n          The RDKit Molecule of ligand B\n        ligand_1_idxs: list[int]\n          Atom indices from the ligand A in the system.\n        ligand_2_idxs: list[int]\n          Atom indices from the ligand B in the system.\n        settings: dict[str, SettingsBaseModel]\n          The settings dict\n        positions_AB: openmm.unit.Quantity\n          The positions of the OpenMM system\n\n        Returns\n        -------\n        correction: unit.Quantity\n          Standard state correction for the harmonic distance restraint.\n        system: openmm.System\n          The OpenMM system with the added restraints forces\n        \"\"\"\n\n        if isinstance(settings[\"restraint_settings\"], DistanceRestraintSettings):\n            rest_geom = geometry.harmonic.get_molecule_centers_restraint(\n                molA_rdmol=ligand_1,\n                molB_rdmol=ligand_2,\n                molA_idxs=ligand_1_inxs,\n                molB_idxs=ligand_2_inxs,\n            )\n\n        else:\n            # TODO turn this into a direction for different restraint types supported?\n            raise NotImplementedError(\"Other restraint types are not yet available\")\n\n        if self.verbose:\n            self.logger.info(f\"restraint geometry is: {rest_geom}\")\n\n        distance = np.linalg.norm(\n            positions_AB[rest_geom.guest_atoms[0]] - positions_AB[rest_geom.host_atoms[0]]\n        )\n\n        k_distance = to_openmm(settings[\"restraint_settings\"].spring_constant)\n\n        force = openmm.HarmonicBondForce()\n        force.addBond(\n            rest_geom.guest_atoms[0],\n            rest_geom.host_atoms[0],\n            distance * openmm.unit.nanometers,\n            k_distance,\n        )\n        force.setName(\"alignment_restraint\")\n        # Add force to a separate force group\n        add_force_in_separate_group(system, force)\n\n        # No correction necessary as only a single harmonic bond is applied between the ligands\n        correction = (\n            from_openmm(\n                openmm.unit.MOLAR_GAS_CONSTANT_R\n                * to_openmm(settings[\"thermo_settings\"].temperature)\n            )\n            * 0.0\n        )\n\n        return correction, system\n\n    def run(\n        self, dry=False, verbose=True, scratch_basepath=None, shared_basepath=None\n    ) -> dict[str, Any]:\n        \"\"\"\n        Run the SepTop free energy calculation.\n\n        Parameters\n        ----------\n        dry : bool\n          Do a dry run of the calculation, creating all necessary alchemical\n          system components (topology, system, sampler, etc...) but without\n          running the simulation, default False\n        verbose : bool\n          Verbose output of the simulation progress. Output is provided via\n          INFO level logging, default True\n        scratch_basepath : pathlib.Path\n          Path to the scratch (temporary) directory space.\n        shared_basepath : pathlib.Path\n          Path to the shared (persistent) directory space.\n\n        Returns\n        -------\n        dict\n          Outputs created in the basepath directory or the debug objects\n          (i.e. sampler) if ``dry==True``.\n        \"\"\"\n        # 0. General preparation tasks\n        self._prepare(verbose, scratch_basepath, shared_basepath)\n\n        self.logger.info(\"Setting up SepTop solvent system.\")\n\n        # 1. Get components\n        self.logger.info(\"Creating and setting up the OpenMM systems\")\n        alchem_comps, solv_comp, prot_comp, smc_comps = self._get_components()\n        smc_comps_A, smc_comps_B, smc_comps_AB = self.get_smc_comps(alchem_comps, smc_comps)\n\n        # 2. Get settings\n        settings = self._get_settings()\n\n        # 3. Assign partial charges\n        self._assign_partial_charges(settings[\"charge_settings\"], smc_comps_AB)\n\n        # 4. Update the positions of ligand B:\n        #    - solvent: Offset ligand B with respect to ligand A\n        smc_B = self._update_positions(\n            alchem_comps[\"stateA\"][0],\n            alchem_comps[\"stateB\"][0],\n        )\n        smc_off_B = {smc_B: smc_B.to_openff()}\n\n        # 5. Get the OpenMM systems\n        omm_system_AB, omm_topology_AB, positions_AB, modeller_AB, comp_resids_AB = (\n            self.get_system(\n                solv_comp,\n                prot_comp,\n                smc_comps_A | smc_off_B,\n                settings,\n            )\n        )  # fmt: skip\n\n        # 6. Get atom indices for ligand A and ligand B and the solvent in the\n        # system AB\n        comp_atomids_AB = self._get_atom_indices(omm_topology_AB, comp_resids_AB)\n        atom_indices_AB_A = comp_atomids_AB[alchem_comps[\"stateA\"][0]]\n        atom_indices_AB_B = comp_atomids_AB[smc_B]\n\n        # 7. Create the alchemical system\n        self.logger.info(\"Creating the alchemical system and applying restraints\")\n\n        alchemical_factory, alchemical_system = self._get_alchemical_system(\n            omm_system_AB,\n            atom_indices_AB_A,\n            atom_indices_AB_B,\n            settings[\"alchemical_settings\"],\n        )\n\n        # 8. Apply Restraints\n        rdmol_A = alchem_comps[\"stateA\"][0].to_rdkit()\n        rdmol_B = smc_B.to_rdkit()\n        Chem.SanitizeMol(rdmol_A)\n        Chem.SanitizeMol(rdmol_B)\n\n        corr, system = self._add_restraints(\n            alchemical_system,\n            rdmol_A,\n            rdmol_B,\n            atom_indices_AB_A,\n            atom_indices_AB_B,\n            settings,\n            positions_AB,\n        )\n\n        # Write the full system PDB\n        topology_file = self.shared_basepath / \"topology.pdb\"\n        openmm.app.pdbfile.PDBFile.writeFile(\n            omm_topology_AB, positions_AB, open(topology_file, \"w\")\n        )\n\n        # Subselect system based on user inputs & write initial subsampled PDB\n        sub_pdb_structure = self.shared_basepath / settings[\"output_settings\"].output_structure\n        selection_indices = self._subsample_topology(\n            topology=omm_topology_AB,\n            positions=positions_AB,\n            output_selection=settings[\"output_settings\"].output_indices,\n            output_file=self.shared_basepath / settings[\"output_settings\"].output_structure,\n        )\n        # The subsampled PDB may not have been written if selection_indices == 0\n        # Issue #1942 - maybe move this to the method?\n        if len(selection_indices) == 0:\n            sub_pdb_structure = None\n\n        # Serialize the system\n        system_outfile = self.shared_basepath / \"system.xml.bz2\"\n        serialize(system, system_outfile)\n\n        if not dry:\n            return {\n                \"system\": system_outfile,\n                \"topology\": topology_file,\n                \"standard_state_correction\": corr.to(\"kilocalorie_per_mole\"),\n                \"selection_indices\": selection_indices,\n                \"subsampled_pdb_structure\": sub_pdb_structure,\n            }\n        else:\n            return {\n                # Add in various objects we can used to test the system\n                \"system\": system_outfile,\n                \"topology\": topology_file,\n                \"system_AB\": omm_system_AB,\n                \"alchem_restrained_system\": system,\n                \"alchem_system\": alchemical_system,\n                \"alchem_factory\": alchemical_factory,\n                \"positions\": positions_AB,\n                \"selection_indices\": selection_indices,\n                \"subsampled_pdb_structure\": sub_pdb_structure,\n            }\n\n\nclass SepTopSolventRunUnit(SepTopSolventMixin, BaseSepTopRunUnit):\n    \"\"\"\n    Protocol Unit for the solvent phase of a relative SepTop free energy\n    \"\"\"\n\n    simtype = \"solvent\"\n\n    def _get_lambda_schedule(\n        self, settings: dict[str, SettingsBaseModel]\n    ) -> dict[str, list[float]]:\n        lambdas = dict()\n\n        lambda_elec_A = settings[\"lambda_settings\"].lambda_elec_A\n        lambda_vdw_A = settings[\"lambda_settings\"].lambda_vdw_A\n        lambda_elec_B = settings[\"lambda_settings\"].lambda_elec_B\n        lambda_vdw_B = settings[\"lambda_settings\"].lambda_vdw_B\n\n        # Reverse lambda schedule since in AbsoluteAlchemicalFactory 1\n        # means fully interacting, not stateB\n        lambda_elec_A = [1 - x for x in lambda_elec_A]\n        lambda_vdw_A = [1 - x for x in lambda_vdw_A]\n        lambda_elec_B = [1 - x for x in lambda_elec_B]\n        lambda_vdw_B = [1 - x for x in lambda_vdw_B]\n        # # Set lambda restraint for the solvent to 1\n        # lambda_restraints = len(lambda_elec_A) * [1]\n\n        lambdas[\"lambda_electrostatics_A\"] = lambda_elec_A\n        lambdas[\"lambda_sterics_A\"] = lambda_vdw_A\n        lambdas[\"lambda_electrostatics_B\"] = lambda_elec_B\n        lambdas[\"lambda_sterics_B\"] = lambda_vdw_B\n        # lambdas['lambda_restraints'] = lambda_restraints\n\n        return lambdas\n\n\nclass SepTopComplexRunUnit(SepTopComplexMixin, BaseSepTopRunUnit):\n    \"\"\"\n    Protocol Unit for the complex phase of a relative SepTop free energy\n    \"\"\"\n\n    simtype = \"complex\"\n\n    def _get_lambda_schedule(\n        self, settings: dict[str, SettingsBaseModel]\n    ) -> dict[str, list[float]]:\n        lambdas = dict()\n\n        lambda_elec_A = settings[\"lambda_settings\"].lambda_elec_A\n        lambda_vdw_A = settings[\"lambda_settings\"].lambda_vdw_A\n        lambda_elec_B = settings[\"lambda_settings\"].lambda_elec_B\n        lambda_vdw_B = settings[\"lambda_settings\"].lambda_vdw_B\n        lambda_restraints_A = settings[\"lambda_settings\"].lambda_restraints_A\n        lambda_restraints_B = settings[\"lambda_settings\"].lambda_restraints_B\n\n        # Reverse lambda schedule since in AbsoluteAlchemicalFactory 1\n        # means fully interacting, not stateB\n        lambda_elec_A = [1 - x for x in lambda_elec_A]\n        lambda_vdw_A = [1 - x for x in lambda_vdw_A]\n        lambda_elec_B = [1 - x for x in lambda_elec_B]\n        lambda_vdw_B = [1 - x for x in lambda_vdw_B]\n\n        lambdas[\"lambda_electrostatics_A\"] = lambda_elec_A\n        lambdas[\"lambda_sterics_A\"] = lambda_vdw_A\n        lambdas[\"lambda_electrostatics_B\"] = lambda_elec_B\n        lambdas[\"lambda_sterics_B\"] = lambda_vdw_B\n        lambdas[\"lambda_restraints_A\"] = lambda_restraints_A\n        lambdas[\"lambda_restraints_B\"] = lambda_restraints_B\n\n        return lambdas\n\n\nclass SepTopSolventAnalysisUnit(SepTopSolventMixin, BaseSepTopAnalysisUnit):\n    \"\"\"\n    Protocol Unit for the analysis of the solvent phase of a relative SepTop free energy\n    \"\"\"\n\n    simtype = \"solvent\"\n\n\nclass SepTopComplexAnalysisUnit(SepTopComplexMixin, BaseSepTopAnalysisUnit):\n    \"\"\"\n    Protocol Unit for the analysis of the complex phase of a relative SepTop free energy\n    \"\"\"\n\n    simtype = \"complex\"\n"
  },
  {
    "path": "src/openfe/protocols/openmm_septop/utils.py",
    "content": "from openmmtools import states\nfrom openmmtools.states import GlobalParameterState\n\n\nclass SepTopParameterState(GlobalParameterState):\n    \"\"\"\n    Composable state to control lambda parameters for two ligands.\n    See :class:`openmmtools.states.GlobalParameterState` for more details.\n    Parameters\n    ----------\n    parameters_name_suffix : Optional[str]\n      If specified, the state will control a modified version of the parameter\n      ``lambda_restraints_{parameters_name_suffix}` instead of just\n      ``lambda_restraints``.\n    lambda_sterics_A : Optional[float]\n      The value for the vdW interactions for ligand A.\n      If defined, must be between 0 and 1.\n    lambda_electrosterics_A : Optional[float]\n      The value for the electrostatics interactions for ligand A.\n      If defined, must be between 0 and 1.\n    lambda_restraints_A : Optional[float]\n      The strength of the restraint for ligand A.\n      If defined, must be between 0 and 1.\n    lambda_bonds_A : Optional[float]\n      The value for modifying bonds for ligand A.\n      If defined, must be between 0 and 1.\n    lambda_angles_A : Optional[float]\n      The value for modifying angles for ligand A.\n      If defined, must be between 0 and 1.\n    lambda_dihedrals_A : Optional[float]\n      The value for modifying dihedrals for ligand A.\n      If defined, must be between 0 and 1.\n    lambda_sterics_B : Optional[float]\n      The value for the vdW interactions for ligand B.\n      If defined, must be between 0 and 1.\n    lambda_electrosterics_B : Optional[float]\n      The value for the electrostatics interactions for ligand B.\n      If defined, must be between 0 and 1.\n    lambda_restraints_B : Optional[float]\n      The strength of the restraint for ligand B.\n      If defined, must be between 0 and 1.\n    lambda_bonds_B : Optional[float]\n      The value for modifying bonds for ligand B.\n      If defined, must be between 0 and 1.\n    lambda_angles_B : Optional[float]\n      The value for modifying angles for ligand B.\n      If defined, must be between 0 and 1.\n    lambda_dihedrals_B : Optional[float]\n      The value for modifying dihedrals for ligand B.\n      If defined, must be between 0 and 1.\n    \"\"\"\n\n    class _LambdaParameter(states.GlobalParameterState.GlobalParameter):\n        \"\"\"A global parameter in the interval [0, 1] with standard\n        value 1.\"\"\"\n\n        def __init__(self, parameter_name):\n            super().__init__(parameter_name, standard_value=1.0, validator=self.lambda_validator)\n\n        @staticmethod\n        def lambda_validator(self, instance, parameter_value):\n            if parameter_value is None:\n                return parameter_value\n            if not (0.0 <= parameter_value <= 1.0):\n                raise ValueError(\"{} must be between 0 and 1.\".format(self.parameter_name))\n            return float(parameter_value)\n\n    # Lambda parameters for ligand A\n    lambda_sterics_A = _LambdaParameter(\"lambda_sterics_A\")\n    lambda_electrostatics_A = _LambdaParameter(\"lambda_electrostatics_A\")\n    lambda_restraints_A = _LambdaParameter(\"lambda_restraints_A\")\n    lambda_bonds_A = _LambdaParameter(\"lambda_bonds_A\")\n    lambda_angles_A = _LambdaParameter(\"lambda_angles_A\")\n    lambda_torsions_A = _LambdaParameter(\"lambda_torsions_A\")\n\n    # Lambda parameters for ligand B\n    lambda_sterics_B = _LambdaParameter(\"lambda_sterics_B\")\n    lambda_electrostatics_B = _LambdaParameter(\"lambda_electrostatics_B\")\n    lambda_restraints_B = _LambdaParameter(\"lambda_restraints_B\")\n    lambda_bonds_B = _LambdaParameter(\"lambda_bonds_B\")\n    lambda_angles_B = _LambdaParameter(\"lambda_angles_B\")\n    lambda_torsions_B = _LambdaParameter(\"lambda_torsions_B\")\n\n    # # Restraints solvent\n    # lambda_restraints = _LambdaParameter('lambda_restraints')\n"
  },
  {
    "path": "src/openfe/protocols/openmm_utils/__init__.py",
    "content": "\n"
  },
  {
    "path": "src/openfe/protocols/openmm_utils/charge_generation.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\n\"\"\"\nReusable utilities for assigning partial charges to ChemicalComponents.\n\"\"\"\n\nimport copy\nimport sys\nimport warnings\nfrom typing import Callable, Literal\n\nimport numpy as np\nfrom gufe import SmallMoleculeComponent\nfrom openff.toolkit import Molecule as OFFMol\nfrom openff.toolkit.utils.base_wrapper import ToolkitWrapper\nfrom openff.toolkit.utils.toolkit_registry import ToolkitRegistry\nfrom openff.toolkit.utils.toolkits import (\n    AmberToolsToolkitWrapper,\n    OpenEyeToolkitWrapper,\n    RDKitToolkitWrapper,\n)\nfrom openff.units import unit\nfrom threadpoolctl import threadpool_limits\n\ntry:\n    import openeye\nexcept ImportError:\n    HAS_OPENEYE = False\nelse:\n    HAS_OPENEYE = True\n\ntry:\n    from openff.toolkit.utils.toolkit_registry import (\n        toolkit_registry_manager,\n    )\nexcept ImportError:\n    # toolkit_registry_manager was made non private in 0.14.4\n    from openff.toolkit.utils.toolkit_registry import (\n        _toolkit_registry_manager as toolkit_registry_manager,\n    )\n\n\ntry:\n    from openff.nagl_models import (\n        get_models_by_type,\n        validate_nagl_model_path,\n    )\n    from openff.toolkit.utils.nagl_wrapper import NAGLToolkitWrapper\nexcept ImportError:\n    HAS_NAGL = False\nelse:\n    HAS_NAGL = True\n\n\ntry:\n    from espaloma_charge.openff_wrapper import EspalomaChargeToolkitWrapper\nexcept ImportError:\n    HAS_ESPALOMA_CHARGE = False\nelse:\n    HAS_ESPALOMA_CHARGE = True\n\n\n# Dictionary of lists for the various backend options we allow.\n# Note: can't create the classes ahead of time in case we end\n# up with a case where the tool is not available, e.g. if OpenEye tk\n# is not installed.\nBACKEND_OPTIONS: dict[str, list[ToolkitWrapper]] = {\n    \"ambertools\": [RDKitToolkitWrapper, AmberToolsToolkitWrapper],\n    \"openeye\": [OpenEyeToolkitWrapper],\n    \"rdkit\": [RDKitToolkitWrapper],\n}\n\n\ndef assign_offmol_espaloma_charges(offmol: OFFMol, toolkit_registry: ToolkitRegistry) -> None:\n    \"\"\"\n    Assign Espaloma charges using the OpenFF toolkit.\n\n    Parameters\n    ----------\n    offmol : openff.toolkit.Molecule\n      OpenFF molecule to assign NAGL partial charges for.\n    toolkit_registry : ToolkitRegistry\n      Toolkit registry to use for assigning partial charges.\n      This strictly limits available toolkit wrappers by\n      overwriting the global registry during the partial charge\n      assignment stage.\n    \"\"\"\n    if not HAS_ESPALOMA_CHARGE:\n        errmsg = \"The Espaloma ToolkiWrapper is not available, please install espaloma_charge\"\n        raise ImportError(errmsg)\n\n    warnings.warn(\"Using espaloma to assign charges is not well tested\", category=RuntimeWarning)\n\n    # make a copy to remove conformers as espaloma enforces\n    # a 0 conformer check\n    offmol_copy = copy.deepcopy(offmol)\n    offmol_copy._conformers = None\n\n    # We are being overly cautious by applying the manager here\n    # this is to avoid issues like:\n    # https://github.com/openforcefield/openff-nagl/issues/69\n    with toolkit_registry_manager(toolkit_registry):\n        offmol_copy.assign_partial_charges(\n            partial_charge_method=\"espaloma-am1bcc\",\n            toolkit_registry=EspalomaChargeToolkitWrapper(),\n        )\n\n    # Copy back charges into the original offmol object\n    offmol.partial_charges = offmol_copy.partial_charges\n\n\ndef assign_offmol_nagl_charges(\n    offmol: OFFMol,\n    toolkit_registry: ToolkitRegistry,\n    nagl_model: str | None = None,\n) -> None:\n    \"\"\"\n    Assign NAGL charges using the OpenFF toolkit.\n\n    Parameters\n    ----------\n    offmol : openff.toolkit.Molecule\n      OpenFF molecule to assign NAGL partial charges for.\n    toolkit_registry : ToolkitRegistry\n      Toolkit registry to use for assigning partial charges.\n      This strictly limits available toolkit wrappers by\n      overwriting the global registry during the partial charge\n      assignment stage.\n    nagl_model : str | None\n      The NAGL model to use when assigning partial charges.\n      If ``None``, will fetch the latest production \"am1bcc\" model.\n    \"\"\"\n    if not HAS_NAGL:\n        errmsg = (\n            \"The NAGL toolkit is not available, you may \"\n            \"be using an older version of the OpenFF \"\n            \"toolkit - you need v0.14.4 or above\"\n        )\n        raise ImportError(errmsg)\n\n    if nagl_model is None:\n        prod_models = get_models_by_type(model_type=\"am1bcc\", production_only=True)\n        try:\n            nagl_model = prod_models[-1]\n        except IndexError:\n            errmsg = (\n                \"No production am1bcc NAGL models were found, \"\n                \"please manually select a candidate release model.\"\n            )\n            raise ValueError(errmsg)\n\n    model_path = validate_nagl_model_path(nagl_model)\n\n    # We are being overly cautious by applying the manager here\n    # this is to avoid issues like:\n    # https://github.com/openforcefield/openff-nagl/issues/69\n    with toolkit_registry_manager(toolkit_registry):\n        offmol.assign_partial_charges(\n            partial_charge_method=model_path,\n            toolkit_registry=NAGLToolkitWrapper(),\n        )\n\n\ndef assign_offmol_am1bcc_charges(\n    offmol: OFFMol,\n    partial_charge_method: Literal[\"am1bcc\", \"am1bccelf10\"],\n    toolkit_registry: ToolkitRegistry,\n) -> None:\n    \"\"\"\n    Assign AM1BCC charges using the OpenFF toolkit.\n\n    Parameters\n    ----------\n    offmol : openff.toolkit.Molecule\n      OpenFF Molecule to assign AM1BCC charges for.\n      Must already have a conformer.\n    partial_charge_method : Literal['am1bcc', 'am1bccelf10']\n      The partial charge method to employ.\n      Options include `am1bcc`, `am1bccelf10`.\n    toolkit_registry : ToolkitRegistry\n      Toolkit registry to use for assigning partial charges.\n      This strictly limits available toolkit wrappers by\n      overwriting the global registry during the partial charge\n      assignment stage.\n\n    Raises\n    ------\n    ValueError\n      If the ``offmol`` does not have any conformers.\n    \"\"\"\n    if offmol.n_conformers == 0:\n        errmsg = \"method expects at least one conformer\"\n        raise ValueError(errmsg)\n\n    # We are being overly cautious by both passing the\n    # registry and applying the manager here - this is\n    # to avoid issues like:\n    # https://github.com/openforcefield/openff-nagl/issues/69\n    with toolkit_registry_manager(toolkit_registry):\n        offmol.assign_partial_charges(\n            partial_charge_method=partial_charge_method,\n            use_conformers=offmol.conformers,\n            toolkit_registry=toolkit_registry,\n        )\n\n\ndef _generate_offmol_conformers(\n    offmol: OFFMol,\n    max_conf: int,\n    toolkit_registry: ToolkitRegistry,\n    generate_n_conformers: int | None,\n) -> None:\n    \"\"\"\n    Helper method for OFF Molecule conformer generation in charge assignment.\n\n    Parameters\n    ----------\n    offmol : openff.toolkit.Molecule\n      OpenFF Molecule to generate conformers for\n    max_conf : int\n      The maximum number of conformers supported by requested charge method.\n    toolkit_registry : ToolkitRegistry\n      Toolkit registry to use for generating conformers.\n      This strictly limits available toolkit wrappers by\n      overwriting the global registry during the conformer generation step.\n    generate_n_conformers : int | None\n      The number of conformers to generate. If ``None``, the existing\n      conformers are retained & used.\n\n    Raises\n    ------\n    ValueError\n      If the ``generate_n_conformers`` is ``None`` and there are either\n      no conformers or more than ``max_conf`` conformers associated with\n      the input ``offmol``.\n      If ``generate_n_conformers`` is greater than the value of ``max_conf``.\n    \"\"\"\n    # Check number of conformers if generate_n_conformers is None and return\n    if generate_n_conformers is None:\n        if offmol.n_conformers == 0:\n            errmsg = (\n                \"No conformers are associated with input OpenFF \"\n                \"Molecule. Need at least one for partial charge \"\n                \"assignment\"\n            )\n            raise ValueError(errmsg)\n        if offmol.n_conformers > max_conf:\n            errmsg = (\n                \"OpenFF Molecule has too many conformers: \"\n                f\"{offmol.n_conformers}, selected partial charge \"\n                f\"method can only support a maximum of {max_conf} \"\n                \"conformers.\"\n            )\n            raise ValueError(errmsg)\n        return\n\n    # Check that generate_n_conformers < max_conf\n    if generate_n_conformers > max_conf:\n        errmsg = (\n            f\"{generate_n_conformers} conformers were requested \"\n            \"for partial charge generation, but the selected \"\n            \"method only supports up to {max_conf} conformers.\"\n        )\n        raise ValueError(errmsg)\n\n    # Generate conformers\n\n    # OpenEye tk needs cis carboxylic acids\n    make_carbox_cis = any(\n        [isinstance(i, OpenEyeToolkitWrapper) for i in toolkit_registry.registered_toolkits]\n    )\n\n    # We are being overly cautious by both passing the\n    # registry and applying the manager here - this is\n    # to avoid issues like:\n    # https://github.com/openforcefield/openff-nagl/issues/69\n    with toolkit_registry_manager(toolkit_registry):\n        offmol.generate_conformers(\n            n_conformers=generate_n_conformers,\n            rms_cutoff=0.25 * unit.angstrom,\n            make_carboxylic_acids_cis=make_carbox_cis,\n            toolkit_registry=toolkit_registry,\n        )\n\n\ndef assign_offmol_partial_charges(\n    offmol: OFFMol,\n    overwrite: bool,\n    method: Literal[\"am1bcc\", \"am1bccelf10\", \"nagl\", \"espaloma\"],\n    toolkit_backend: Literal[\"ambertools\", \"openeye\", \"rdkit\"],\n    generate_n_conformers: int | None,\n    nagl_model: str | None,\n) -> OFFMol:\n    \"\"\"\n    Assign partial charges to an OpenFF Molecule based on a selected method.\n\n    Parameters\n    ----------\n    offmol : openff.toolkit.Molecule\n      The Molecule to assign partial charges to.\n    overwrite : bool\n      Whether or not to overwrite any existing non-zero partial charges.\n      Note that zeroed charges will always be overwritten.\n    method : Literal['am1bcc', 'am1bccelf10', 'nagl', 'espaloma']\n      Partial charge assignment method.\n      Supported methods include; am1bcc, am1bccelf10, nagl, and espaloma.\n    toolkit_backend : Literal['ambertools', 'openeye', 'rdkit']\n      OpenFF toolkit backend employed for charge generation.\n      Supported options:\n        * ``ambertools``: selects both the AmberTools and RDKit Toolkit Wrapper\n        * ``openeye``: selects the OpenEye toolkit Wrapper\n        * ``rdkit``: selects the RDKit toolkit Wrapper\n      Note that the ``rdkit`` backend cannot be used for `am1bcc` or\n      ``am1bccelf10`` partial charge methods.\n    generate_n_conformers : int | None\n      Number of conformers to generate for partial charge generation.\n      If ``None``, the input conformer will be used.\n      Values greater than 1 can only be used alongside ``am1bccelf10``.\n    nagl_model : str | None\n      The NAGL model to use for charge assignment if method is ``nagl``.\n      If ``None``, the latest am1bcc NAGL charge model is used.\n\n    Raises\n    ------\n    ValueError\n      If the ``toolkit_backend`` is not supported by the selected ``method``.\n      If ``generate_n_conformers`` is ``None``, but the input ``offmol``\n      has no associated conformers.\n      If the number of conformers passed or generated exceeds the number\n      of conformers selected by the partial charge ``method``.\n\n    Returns\n    -------\n     The Molecule with partial charges assigned.\n    \"\"\"\n\n    # If you have non-zero charges and not overwriting, just return\n    if offmol.partial_charges is not None and np.any(offmol.partial_charges):\n        if not overwrite:\n            return offmol\n\n    # Dictionary for each available charge method\n    # The idea of this pattern is to allow for maximum flexibility by\n    # allowing for swapping out method calls as necessary.\n    #\n    # Must include:\n    # 1. `confgen_func`: the conformer generation method\n    # 2. `charge_func`: the partial charge assignment method\n    # 2. `backends`: the allowed backends for the method\n    # 3. `max_conf`: maximum number of allowed conformations for the method\n    # 4. `charge_extra_kwargs`: any additional kwargs to be passed to the\n    #    partial charge assignment method beyond the input offmol and\n    #    the toolkitregistry\n    CHARGE_METHODS = {\n        \"am1bcc\": {\n            \"confgen_func\": _generate_offmol_conformers,\n            \"charge_func\": assign_offmol_am1bcc_charges,\n            \"backends\": [\"ambertools\", \"openeye\"],\n            \"max_conf\": 1,\n            \"charge_extra_kwargs\": {\"partial_charge_method\": \"am1bcc\"},\n        },\n        \"am1bccelf10\": {\n            \"confgen_func\": _generate_offmol_conformers,\n            \"charge_func\": assign_offmol_am1bcc_charges,\n            \"backends\": [\"openeye\"],\n            \"max_conf\": sys.maxsize,\n            \"charge_extra_kwargs\": {\"partial_charge_method\": \"am1bccelf10\"},\n        },\n        \"nagl\": {\n            \"confgen_func\": _generate_offmol_conformers,\n            \"charge_func\": assign_offmol_nagl_charges,\n            \"backends\": [\"openeye\", \"rdkit\", \"ambertools\"],\n            \"max_conf\": 1,\n            \"charge_extra_kwargs\": {\"nagl_model\": nagl_model},\n        },\n        \"espaloma\": {\n            \"confgen_func\": _generate_offmol_conformers,\n            \"charge_func\": assign_offmol_espaloma_charges,\n            \"backends\": [\"rdkit\", \"ambertools\"],\n            \"max_conf\": 1,\n            \"charge_extra_kwargs\": {},\n        },\n    }\n\n    # Grab the backends and also check our method\n    try:\n        backends = CHARGE_METHODS[method.lower()][\"backends\"]\n    except KeyError:\n        errmsg = f\"Unknown partial charge method {method}\"\n        raise ValueError(errmsg)\n\n    # Check our method actually supports the toolkit backend selected\n    if toolkit_backend.lower() not in backends:  # type: ignore\n        errmsg = (\n            f\"Selected toolkit_backend ({toolkit_backend}) cannot \"\n            f\"be used with the selected method ({method}). \"\n            f\"Available backends are: {backends}\"\n        )\n        raise ValueError(errmsg)\n\n    # OpenEye is the only optional dependency in the toolkit backends\n    if toolkit_backend.lower() == \"openeye\" and not HAS_OPENEYE:\n        errmsg = \"OpenEye is not available and cannot be selected as a backend\"\n        raise ImportError(errmsg)\n\n    # Issue 1760\n    if HAS_OPENEYE and method.lower() == \"nagl\":\n        if toolkit_backend.lower() != \"openeye\":\n            errmsg = \"OpenEye toolkit is installed but not used in the OpenFF toolkit registry backend. This is not possible with NAGL charges.\"\n            raise ValueError(errmsg)\n\n    toolkits = ToolkitRegistry([i() for i in BACKEND_OPTIONS[toolkit_backend.lower()]])\n\n    # We make a copy of the molecule since we're going to modify conformers\n    offmol_copy = copy.deepcopy(offmol)\n\n    # Generate conformers - note this method may differ based on the partial\n    # charge method employed\n    CHARGE_METHODS[method.lower()][\"confgen_func\"](\n        offmol=offmol_copy,\n        max_conf=CHARGE_METHODS[method.lower()][\"max_conf\"],\n        toolkit_registry=toolkits,\n        generate_n_conformers=generate_n_conformers,\n    )  # type: ignore\n\n    # limit the number of threads used by SQM\n    # <https://github.com/openforcefield/openff-toolkit/issues/1831>\n    with threadpool_limits(limits=1):\n        # Call selected method to assign partial charges\n        CHARGE_METHODS[method.lower()][\"charge_func\"](\n            offmol=offmol_copy,\n            toolkit_registry=toolkits,\n            **CHARGE_METHODS[method.lower()][\"charge_extra_kwargs\"],\n        )  # type: ignore\n\n    # Copy partial charges back\n    offmol.partial_charges = offmol_copy.partial_charges\n    return offmol\n\n\ndef bulk_assign_partial_charges(\n    molecules: list[SmallMoleculeComponent],\n    overwrite: bool,\n    method: Literal[\"am1bcc\", \"am1bccelf10\", \"nagl\", \"espaloma\"],\n    toolkit_backend: Literal[\"ambertools\", \"openeye\", \"rdkit\"],\n    generate_n_conformers: int | None,\n    nagl_model: str | None,\n    processors: int = 1,\n) -> list[SmallMoleculeComponent]:\n    \"\"\"\n    Assign partial charges to a list of SmallMoleculeComponents using multiprocessing.\n\n    Parameters\n    ----------\n    molecules : list[gufe.SmallMoleculeComponent]\n      The list of molecules who should have partial charges assigned.\n    overwrite : bool\n      Whether or not to overwrite any existing non-zero partial charges.\n      Note that zeroed charges will always be overwritten.\n    method : Literal['am1bcc', 'am1bccelf10', 'nagl', 'espaloma']\n      Partial charge assignment method.\n      Supported methods include; am1bcc, am1bccelf10, nagl, and espaloma.\n    toolkit_backend : Literal['ambertools', 'openeye', 'rdkit']\n      OpenFF toolkit backend employed for charge generation.\n      Supported options:\n        * ``ambertools``: selects both the AmberTools and RDKit Toolkit Wrapper\n        * ``openeye``: selects the OpenEye toolkit Wrapper\n        * ``rdkit``: selects the RDKit toolkit Wrapper\n      Note that the ``rdkit`` backend cannot be used for `am1bcc` or\n      ``am1bccelf10`` partial charge methods.\n    generate_n_conformers : int | None\n      Number of conformers to generate for partial charge generation.\n      If ``None``, the input conformer will be used.\n      Values greater than 1 can only be used alongside ``am1bccelf10``.\n    nagl_model : str | None\n      The NAGL model to use for charge assignment if method is ``nagl``.\n      If ``None``, the latest am1bcc NAGL charge model is used.\n    processors: int, default 1\n        The number of processors which should be used to generate the charges.\n\n    Raises\n    ------\n    ValueError\n      If the ``toolkit_backend`` is not supported by the selected ``method``.\n      If ``generate_n_conformers`` is ``None``, but the input ``offmol``\n      has no associated conformers.\n      If the number of conformers passed or generated exceeds the number\n      of conformers selected by the partial charge ``method``.\n\n    Returns\n    -------\n        A list of SmallMoleculeComponents with the charges assigned.\n    \"\"\"\n    import tqdm\n\n    charge_keywords = {\n        \"overwrite\": overwrite,\n        \"method\": method,\n        \"toolkit_backend\": toolkit_backend,\n        \"generate_n_conformers\": generate_n_conformers,\n        \"nagl_model\": nagl_model,\n    }\n    charged_ligands = []\n\n    if processors > 1:\n        from concurrent.futures import ProcessPoolExecutor, as_completed\n\n        with ProcessPoolExecutor(max_workers=processors) as pool:\n            work_list = [\n                pool.submit(\n                    assign_offmol_partial_charges,\n                    m.to_openff(),\n                    **charge_keywords,  # type: ignore\n                )\n                for m in molecules\n            ]\n\n            for work in tqdm.tqdm(\n                as_completed(work_list), desc=\"Generating charges\", ncols=80, total=len(molecules)\n            ):\n                charged_ligands.append(SmallMoleculeComponent.from_openff(work.result()))\n\n    else:\n        for m in tqdm.tqdm(molecules, desc=\"Generating charges\", ncols=80, total=len(molecules)):\n            mol_with_charge = assign_offmol_partial_charges(m.to_openff(), **charge_keywords)  # type: ignore\n            charged_ligands.append(SmallMoleculeComponent.from_openff(mol_with_charge))\n\n    return charged_ligands\n"
  },
  {
    "path": "src/openfe/protocols/openmm_utils/mdtraj_utils.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\n\nimport mdtraj as mdt\nimport numpy as np\nimport openmm\nfrom openmm import unit as omm_unit\n\n\ndef mdtraj_from_openmm(\n    omm_topology: openmm.app.Topology,\n    omm_positions: openmm.unit.Quantity,\n):\n    \"\"\"\n    Get an mdtraj object from an OpenMM topology and positions.\n\n    Parameters\n    ----------\n    omm_topology : openmm.app.Topology\n      The OpenMM topology\n    omm_positions : openmm.unit.Quantity\n      The OpenMM positions\n\n    Returns\n    -------\n    mdtraj_trajectory : md.Trajectory\n    \"\"\"\n    mdtraj_topology = mdt.Topology.from_openmm(omm_topology)\n    positions_in_mdtraj_format = omm_positions.value_in_unit(omm_unit.nanometers)\n\n    box = omm_topology.getPeriodicBoxVectors()\n    if box is not None:\n        x, y, z = [np.array(b._value) for b in box]\n        lx = np.linalg.norm(x)\n        ly = np.linalg.norm(y)\n        lz = np.linalg.norm(z)\n        # angle between y and z\n        alpha = np.arccos(np.dot(y, z) / (ly * lz))\n        # angle between x and z\n        beta = np.arccos(np.dot(x, z) / (lx * lz))\n        # angle between x and y\n        gamma = np.arccos(np.dot(x, y) / (lx * ly))\n\n        unitcell_lengths = np.array([lx, ly, lz])\n        unitcell_angles = np.array([np.rad2deg(alpha), np.rad2deg(beta), np.rad2deg(gamma)])\n    else:\n        unitcell_lengths = None\n        unitcell_angles = None\n\n    mdtraj_trajectory = mdt.Trajectory(\n        positions_in_mdtraj_format,\n        mdtraj_topology,\n        unitcell_lengths=unitcell_lengths,\n        unitcell_angles=unitcell_angles,\n    )\n\n    return mdtraj_trajectory\n"
  },
  {
    "path": "src/openfe/protocols/openmm_utils/multistate_analysis.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\n\"\"\"\nReusable utility methods to analyze results from multistate calculations.\n\"\"\"\n\nimport warnings\nfrom pathlib import Path\nfrom typing import Optional, Union\n\nimport matplotlib.pyplot as plt\nimport numpy as np\nimport numpy.typing as npt\nfrom openff.units import Quantity, unit\nfrom openff.units.openmm import from_openmm\nfrom openmmtools import multistate\n\nfrom openfe.analysis import plotting\nfrom openfe.due import Doi, due\n\ndue.cite(\n    Doi(\"10.5281/zenodo.596622\"),\n    description=\"OpenMMTools\",\n    path=\"openfe.protocols.openmm_utils.multistate_analysis\",\n    cite_module=True,\n)\n\n\ndue.cite(\n    Doi(\"10.1063/1.2978177\"),\n    description=\"MBAR paper\",\n    path=\"openfe.protocols.openmm_utils.multistate_analysis\",\n    cite_module=True,\n)\n\n\ndue.cite(\n    Doi(\"10.1021/ct0502864\"),\n    description=\"MBAR timeseries algorithms\",\n    path=\"openfe.protocols.openmm_utils.multistate_analysis\",\n    cite_module=True,\n)\n\n\ndue.cite(\n    Doi(\"10.1021/acs.jctc.5b00784\"),\n    description=\"Automatic equilibration detection method\",\n    path=\"openfe.protocols.openmm_utils.multistate_analysis\",\n    cite_module=True,\n)\n\n\ndue.cite(\n    Doi(\"10.5281/zenodo.596220\"),\n    description=\"pyMBAR zenodo\",\n    path=\"openfe.protocols.openmm_utils.multistate_analysis\",\n    cite_module=True,\n)\n\n\nclass MultistateEquilFEAnalysis:\n    \"\"\"\n    A class to generate and plot all necessary analyses for a free energy\n    calculation using a :class:`openmmtools.MultiStateSampler`.\n\n    Currently implemented analyses are:\n      - Decorrelated MBAR analysis of free energies (and associated errors)\n      - Number of equilibration & sampling steps\n      - MBAR overlap matrices\n      - Replica lambda traversal (exchange matrix and timeseries)\n      - Forward and reverse analysis of free energies\n\n    Parameters\n    ----------\n    reporter : openmmtools.MultiStateReporter\n      Reporter for the MultiStateSampler\n    sampling_method : str\n      The sampling method. Expected values are `repex`, `sams`,\n      and `independent`.\n    result_units : openff.units.Quantity\n      Units to report results in.\n    forward_reverse_samples : int\n      The number of samples to use in the forward and reverse analysis\n      of the free energies. Default 10.\n    \"\"\"\n\n    def __init__(\n        self,\n        reporter: multistate.MultiStateReporter,\n        sampling_method: str,\n        result_units: Quantity,\n        forward_reverse_samples: int = 10,\n    ):\n        self.analyzer = multistate.MultiStateSamplerAnalyzer(reporter)\n        self.units = result_units\n\n        if sampling_method.lower() not in [\"repex\", \"sams\", \"independent\"]:\n            wmsg = f\"Unknown sampling method {sampling_method}\"\n            warnings.warn(wmsg)\n        self.sampling_method = sampling_method.lower()\n\n        # Do a first pass at the analysis\n        self._analyze(forward_reverse_samples)\n\n    def plot(self, filepath: Path, filename_prefix: str):\n        \"\"\"\n        Plot out results from the free energy analyses.\n\n        Specifically the following plots are generated:\n          * The free energy overlap matrix\n          * The replica exchange overlap matrix (if sampler_method is repex)\n          * The timeseries of replica states over time\n          * The forward and reverse estimate of the free energies\n\n        Parameters\n        ----------\n        filepath : pathlib.Path\n          The path to where files should be written.\n        filename_prefix : str\n          A prefix for the written filenames.\n        \"\"\"\n        # MBAR overlap matrix\n        ax = plotting.plot_lambda_transition_matrix(self.free_energy_overlaps[\"matrix\"])\n        ax.set_title(\"MBAR overlap matrix\")\n        ax.figure.savefig(  # type: ignore\n            filepath / (filename_prefix + \"mbar_overlap_matrix.png\")\n        )\n        plt.close(ax.figure)  # type: ignore\n\n        # Reverse and forward analysis\n        if self.forward_and_reverse_free_energies is not None:\n            ax = plotting.plot_convergence(self.forward_and_reverse_free_energies, self.units)\n            ax.set_title(\"Forward and Reverse free energy convergence\")\n            ax.figure.savefig(  # type: ignore\n                filepath / (filename_prefix + \"forward_reverse_convergence.png\")\n            )\n            plt.close(ax.figure)  # type: ignore\n\n        # Replica state timeseries plot\n        ax = plotting.plot_replica_timeseries(self.replica_states, self.equilibration_iterations)\n        ax.set_title(\"Change in replica state over time\")\n        ax.figure.savefig(  # type: ignore\n            filepath / (filename_prefix + \"replica_state_timeseries.png\")\n        )\n        plt.close(ax.figure)  # type: ignore\n\n        # Replica exchange transition matrix\n        if self.sampling_method == \"repex\":\n            ax = plotting.plot_lambda_transition_matrix(self.replica_exchange_statistics[\"matrix\"])\n            ax.set_title(\"Replica exchange transition matrix\")\n            ax.figure.savefig(  # type: ignore\n                filepath / (filename_prefix + \"replica_exchange_matrix.png\")\n            )\n            plt.close(ax.figure)  # type: ignore\n\n    def _analyze(self, forward_reverse_samples: int):\n        \"\"\"\n        Run the following analyses:\n          * MBAR free energy difference between end states using\n            post-equilibration decorrelated samples of the energies.\n          * Forward and reverse fractional analysis of free energies over\n            the equilibrated & decorrelated data points.\n          * MBAR estimate of the overlap matrix across states.\n          * Replica exchange transition matrix\n            (if sampler_method is ``repex``)\n\n        Parameters\n        ----------\n        forward_reverse_samples : int\n          Number of samples to take in the forward and reverse analysis of\n          the free energies.\n        \"\"\"\n        # Do things that get badly cached later\n        self._replica_states = self.analyzer.reporter.read_replica_thermodynamic_states()\n        # convert full masked array to simple array\n        # downcast to int32, we don't have more than 4 billion states thankfully\n        self._replica_states = np.asarray(self._replica_states, dtype=np.int32)\n        # float conversions to avoid having to deal with numpy dtype serialization\n        self._equil_iters = float(self.analyzer.n_equilibration_iterations)\n        self._prod_iters = float(self.analyzer._equilibration_data[2])\n\n        # Gather estimate of free energy\n        self._free_energy, self._free_energy_err = self.get_equil_free_energy()\n\n        # forward and reverse analysis\n        self._forward_reverse = self.get_forward_and_reverse_analysis(forward_reverse_samples)\n\n        # Gather overlap matrix\n        self._overlap_matrix = self.get_overlap_matrix()\n\n        # Gather exchange transition matrix\n        # Note we only generate these for replica exchange calculations\n        # TODO: consider if this would also work for SAMS\n        if self.sampling_method == \"repex\":\n            self._exchange_matrix = self.get_exchanges()\n\n    @staticmethod\n    def _get_free_energy(\n        analyzer: multistate.MultiStateSamplerAnalyzer,\n        u_ln: npt.NDArray,\n        N_l: npt.NDArray,\n        bootstraps: int = 1000,\n        return_units: Quantity = unit.kilocalorie_per_mole,\n    ) -> tuple[Quantity, Quantity]:\n        \"\"\"\n        Helper method to create an MBAR object and extract free energies\n        between end states.\n\n        Parameters\n        ----------\n        analyzer : multistate.MultiStateSamplerAnalyzer\n          MultiStateSamplerAnalyzer to extract free energies from.\n        u_ln : npt.NDArray\n          A n_states x (n_sampled_states * n_iterations)\n          array of energies (in kT).\n        N_l : npt.NDArray\n          An array containing the total number of samples drawn from each\n          state.\n        bootstraps : int\n          How many bootstrap samples will be computed. If 0, no bootstraps\n          will be computed and analytical errors will be returned.\n        return_units : openff.units.Quantity\n          The return units the results will be provided in.\n\n        Returns\n        -------\n        DG : openff.units.Quantity\n          The free energy difference between the end states.\n        dDG : openff.units.Quantity\n          The MBAR bootstrap (1000 iterations) error estimate for the free energy difference.\n\n        TODO\n        ----\n        * Allow folks to pass in extra options for bootstrapping etc..\n        * Add standard test against analyzer.get_free_energy()\n        \"\"\"\n        # pymbar has some side effects when imported so we only import it right when we\n        # need it\n        from pymbar import MBAR\n\n        mbar = MBAR(\n            u_ln,\n            N_l,\n            solver_protocol=\"robust\",\n            n_bootstraps=bootstraps,\n            bootstrap_solver_protocol=\"robust\",\n        )\n        if bootstraps > 0:\n            uncertainty_method = \"bootstrap\"\n        else:\n            uncertainty_method = None\n\n        r = mbar.compute_free_energy_differences(\n            compute_uncertainty=True,\n            uncertainty_method=uncertainty_method,\n        )\n\n        DF_ij = r[\"Delta_f\"]\n        dDF_ij = r[\"dDelta_f\"]\n\n        DG = DF_ij[0, -1] * analyzer.kT\n        dDG = dDF_ij[0, -1] * analyzer.kT\n\n        return (from_openmm(DG).to(return_units), from_openmm(dDG).to(return_units))\n\n    def get_equil_free_energy(self) -> tuple[Quantity, Quantity]:\n        \"\"\"\n        Extract unbiased and uncorrelated estimates of the free energy\n        and the associated error from a MultiStateSamplerAnalyzer object.\n\n        Returns\n        -------\n        DG : openff.units.Quantity\n          The free energy difference between the end states.\n        dDG : openff.units.Quantity\n          The MBAR error for the free energy difference estimate.\n        \"\"\"\n        u_ln_decorr = self.analyzer._unbiased_decorrelated_u_ln\n        N_l_decorr = self.analyzer._unbiased_decorrelated_N_l\n\n        DG, dDG = self._get_free_energy(self.analyzer, u_ln_decorr, N_l_decorr, 1000, self.units)\n\n        return DG, dDG\n\n    def get_forward_and_reverse_analysis(\n        self, num_samples: int = 10\n    ) -> Optional[dict[str, Union[npt.NDArray, Quantity]]]:\n        \"\"\"\n        Calculate free energies with a progressively larger\n        fraction of the decorrelated timeseries data in both\n        the forward and reverse direction.\n\n        Parameters\n        ----------\n        num_samples : int\n          The number data points to sample.\n\n        Returns\n        -------\n        forward_reverse : Optional[dict[str, Union[npt.NDArray, openff.units.Quantity]]]\n          If this analysis fails, returns None; otherwise returns a dictionary\n          containing;\n            * ``fractions``: fractions of sample used to calculate free energies\n            * ``forward_DGs`` and `forward_dDGs`: the free energy estimates\n              and errors along each sample fraction in the forward direction\n            * ``reverse_DGs`` and `reverse_dDGs`: the free energy estimates\n              and errors along each sample fraction in the reverse direction\n\n        Notes\n        -----\n        * This method does not currently use bootstrap uncertainties due to\n          issues with the solver when using low amounts of data points. All\n          uncertainties are MBAR analytical errors.\n        \"\"\"\n        # pymbar has some side effects from being imported, so we only want to import\n        # it right when we need it\n        from pymbar.utils import ParameterError\n\n        try:\n            u_ln = self.analyzer._unbiased_decorrelated_u_ln\n            N_l = self.analyzer._unbiased_decorrelated_N_l\n            n_states = len(N_l)\n\n            # Check that the N_l is the same across all states\n            if not np.all(N_l == N_l[0]):\n                errmsg = f\"The number of samples is not equivalent across all states {N_l}\"\n                raise ValueError(errmsg)\n\n            # Get the chunks of N_l going from 10% to ~ 100%\n            # Note: you always lose out a few data points but it's fine\n            chunks = [max(int(N_l[0] / num_samples * i), 1) for i in range(1, num_samples + 1)]\n\n            forward_DGs = []\n            forward_dDGs = []\n            reverse_DGs = []\n            reverse_dDGs = []\n            fractions = []\n\n            for chunk in chunks:\n                new_N_l = np.array([chunk for _ in range(n_states)])\n                samples = chunk * n_states\n\n                # Forward\n                DG, dDG = self._get_free_energy(\n                    self.analyzer,\n                    u_ln[:, :samples],\n                    new_N_l,\n                    0,\n                    self.units,\n                )\n                forward_DGs.append(DG)\n                forward_dDGs.append(dDG)\n\n                # Reverse\n                DG, dDG = self._get_free_energy(\n                    self.analyzer,\n                    u_ln[:, -samples:],\n                    new_N_l,\n                    0,\n                    self.units,\n                )\n                reverse_DGs.append(DG)\n                reverse_dDGs.append(dDG)\n\n                fractions.append(chunk / N_l[0])\n        except ParameterError:\n            return None\n\n        forward_reverse = {\n            \"fractions\": np.array(fractions),\n            \"forward_DGs\": Quantity.from_list(forward_DGs),  # type: ignore\n            \"forward_dDGs\": Quantity.from_list(forward_dDGs),  # type: ignore\n            \"reverse_DGs\": Quantity.from_list(reverse_DGs),  # type: ignore\n            \"reverse_dDGs\": Quantity.from_list(reverse_dDGs),  # type: ignore\n        }\n        return forward_reverse\n\n    def get_overlap_matrix(self) -> dict[str, npt.NDArray]:\n        \"\"\"\n        Generate an overlap matrix across lambda states.\n\n        Return\n        ------\n        overlap_matrix : dict[str, npt.NDArray]\n          A dictionary containing the following keys:\n            * ``scalar``: One minus the largest nontrivial eigenvalue\n            * ``eigenvalues``: The sorted (descending) eigenvalues of the\n              overlap matrix\n            * ``matrix``: Estimated overlap matrix of observing a sample from\n              state i in state j\n        \"\"\"\n        return self.analyzer.mbar.compute_overlap()\n\n    def get_exchanges(self) -> dict[str, npt.NDArray]:\n        \"\"\"\n        Gather both the transition matrix (and relevant eigenvalues) between\n        replicas.\n\n        Return\n        ------\n        transition_matrix : dict[str, npt.NDArray]\n          A dictionary containing the following:\n            * ``eigenvalues``: The sorted (descending) eigenvalues of the\n              lambda state transition matrix\n            * ``matrix``: The transition matrix estimate of a replica switching\n              from state i to state j.\n        \"\"\"\n        # Get replica mixing statistics\n        mixing_stats = self.analyzer.generate_mixing_statistics()\n        transition_matrix = {\n            \"eigenvalues\": mixing_stats.eigenvalues,\n            \"matrix\": mixing_stats.transition_matrix,\n        }\n        return transition_matrix\n\n    @property\n    def replica_states(self):\n        \"\"\"\n        Timeseries of states for each replica.\n        \"\"\"\n        return self._replica_states\n\n    @property\n    def equilibration_iterations(self):\n        \"\"\"\n        Number of iterations discarded as equilibration.\n        \"\"\"\n        return self._equil_iters\n\n    @property\n    def production_iterations(self):\n        \"\"\"\n        Number of production iterations from which energies are sampled.\n        \"\"\"\n        return self._prod_iters\n\n    @property\n    def free_energy(self):\n        \"\"\"\n        The free energy estimate from decorrelated unbiased samples\n        \"\"\"\n        return self._free_energy\n\n    @property\n    def free_energy_error(self):\n        \"\"\"\n        The MBAR estimate of the free energy estimate\n        \"\"\"\n        return self._free_energy_err\n\n    @property\n    def forward_and_reverse_free_energies(self):\n        \"\"\"\n        The dictionary forward and reverse analysis of the free energies\n        using the number of samples defined at class initialization\n        \"\"\"\n        return self._forward_reverse\n\n    @property\n    def free_energy_overlaps(self):\n        \"\"\"\n        A dictionary containing the estimated overlap matrix and corresponding\n        eigenvalues and scalars of the free energies.\n        \"\"\"\n        return self._overlap_matrix\n\n    @property\n    def replica_exchange_statistics(self):\n        \"\"\"\n        A dictionary containing the estimated replica exchange matrix\n        and corresponding eigenvalues.\n        \"\"\"\n        if hasattr(self, \"_exchange_matrix\"):\n            return self._exchange_matrix\n        else:\n            errmsg = (\n                \"Exchange matrix was not generated, this is likely \"\n                f\"{self.sampling_method} is not repex.\"\n            )\n            raise ValueError(errmsg)\n\n    @property\n    def unit_results_dict(self):\n        results_dict = {\n            \"unit_estimate\": self.free_energy,\n            \"unit_estimate_error\": self.free_energy_error,\n            \"unit_mbar_overlap\": self.free_energy_overlaps,\n            \"forward_and_reverse_energies\": self.forward_and_reverse_free_energies,\n            \"production_iterations\": self.production_iterations,\n            \"equilibration_iterations\": self.equilibration_iterations,\n        }\n\n        if hasattr(self, \"_exchange_matrix\"):\n            results_dict[\"replica_exchange_statistics\"] = self.replica_exchange_statistics\n\n        return results_dict\n\n    def close(self):\n        self.analyzer.clear()\n"
  },
  {
    "path": "src/openfe/protocols/openmm_utils/omm_compute.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\n# Adapted Perses' perses.app.setup_relative_calculation.get_openmm_platform\nimport logging\nimport os\nimport warnings\nfrom typing import Optional\n\nlogger = logging.getLogger(__name__)\n\n\ndef get_openmm_platform(\n    platform_name: Optional[str] = None,\n    gpu_device_index: Optional[list[int]] = None,\n    restrict_cpu_count: bool = False,\n):\n    \"\"\"\n    Return OpenMM's platform object based on given name. Setting to mixed\n    precision if using CUDA or OpenCL.\n\n    Parameters\n    ----------\n    platform_name : Optional[str]\n        String with the platform name. If None, it will use the fastest\n        platform supporting mixed precision.\n        Default ``None``.\n    gpu_device_index : Optional[list[str]]\n        GPU device index selection. If ``None`` the default OpenMM\n        GPU selection will be used.\n        See the `OpenMM platform properties documentation <http://docs.openmm.org/latest/userguide/library/04_platform_specifics.html>`_\n        for more details.\n        Default ``None``.\n    restrict_cpu_count : bool\n        Optional hint to restrict the CPU count to 1 when\n        ``platform_name`` is CPU. This allows Protocols to ensure\n        that no large performance in cases like vacuum simulations.\n\n    Returns\n    -------\n    platform : openmm.Platform\n        OpenMM platform object.\n    \"\"\"\n    if platform_name is None:\n        # No platform is specified, so retrieve fastest platform that supports\n        # 'mixed' precision\n        from openmmtools.utils import get_fastest_platform\n\n        platform = get_fastest_platform(minimum_precision=\"mixed\")\n    else:\n        try:\n            platform_name = {\n                \"cpu\": \"CPU\",\n                \"opencl\": \"OpenCL\",\n                \"cuda\": \"CUDA\",\n            }[str(platform_name).lower()]\n        except KeyError:\n            pass\n\n        from openmm import Platform\n\n        platform = Platform.getPlatformByName(platform_name)\n    # Set precision and properties\n    name = platform.getName()\n    if name in [\"CUDA\", \"OpenCL\"]:\n        platform.setPropertyDefaultValue(\"Precision\", \"mixed\")\n        if gpu_device_index is not None:\n            index_list = \",\".join(str(i) for i in gpu_device_index)\n            platform.setPropertyDefaultValue(\"DeviceIndex\", index_list)\n\n    if name == \"CUDA\":\n        platform.setPropertyDefaultValue(\"DeterministicForces\", \"true\")\n\n    if name != \"CUDA\":\n        wmsg = (\n            f\"Non-CUDA platform selected: {name}, this may significantly \"\n            \"impact simulation performance\"\n        )\n        warnings.warn(wmsg)\n        logging.warning(wmsg)\n\n    if name == \"CPU\" and restrict_cpu_count:\n        threads = os.getenv(\"OPENMM_CPU_THREADS\", \"1\")\n        platform.setPropertyDefaultValue(\"Threads\", threads)\n\n    return platform\n"
  },
  {
    "path": "src/openfe/protocols/openmm_utils/omm_settings.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\n\"\"\"Equilibrium Free Energy Protocols input settings.\n\nThis module implements base settings necessary to run\nfree energy calculations using OpenMM +/- Tools, such\nas :mod:`openfe.protocols.openmm_rfe.equil_rfe_methods.py`\nand :mod`openfe.protocols.openmm_afe.equil_afe_methods.py`\n\"\"\"\n\nfrom typing import Annotated, Literal, Optional, TypeAlias\n\nfrom gufe.settings import (\n    OpenMMSystemGeneratorFFSettings as OpenMMSystemGeneratorFFSettings,\n)\nfrom gufe.settings import (\n    Settings as Settings,\n)\nfrom gufe.settings import (\n    SettingsBaseModel,\n)\nfrom gufe.settings import (\n    ThermoSettings as ThermoSettings,\n)\nfrom gufe.settings.typing import (\n    BoxQuantity,\n    GufeQuantity,\n    KCalPerMolQuantity,\n    NanometerArrayQuantity,\n    NanometerQuantity,\n    NanosecondQuantity,\n    PicosecondQuantity,\n    specify_quantity_units,\n)\nfrom openff.interchange.components._packmol import _box_vectors_are_in_reduced_form\nfrom openff.units import unit\nfrom pydantic import ConfigDict, field_validator, model_validator\n\nFemtosecondQuantity: TypeAlias = Annotated[GufeQuantity, specify_quantity_units(\"femtosecond\")]\nInversePicosecondQuantity: TypeAlias = Annotated[\n    GufeQuantity, specify_quantity_units(\"1/picosecond\")\n]\nTimestepQuantity: TypeAlias = Annotated[GufeQuantity, specify_quantity_units(\"timestep\")]\nSurfaceTensionQuantity: TypeAlias = Annotated[GufeQuantity, specify_quantity_units(\"bar*nanometer\")]\n\n\nclass BaseSolvationSettings(SettingsBaseModel):\n    \"\"\"\n    Base class for SolvationSettings objects.\n    \"\"\"\n\n    model_config = ConfigDict(arbitrary_types_allowed=True)\n\n\nclass OpenMMSolvationSettings(BaseSolvationSettings):\n    \"\"\"Settings for controlling how a system is solvated using OpenMM tooling.\n\n    Defining the number of waters\n    -----------------------------\n\n    The number of waters is controlled by either:\n      a) defining a solvent padding (``solvent_padding``) in combination\n         with a box shape\n      b) defining the number of solvent molecules\n         (``number_of_solvent_molecules``)\n         alongside the box shape (``box_shape``)\n      c) defining the box directly either through the box vectors\n         (``box_vectors``) or rectangular box lengths (``box_size``)\n\n    When using ``solvent_padding``, ``box_vectors``, or ``box_size``,\n    the exact number of waters added is determined automatically by OpenMM\n    through :meth:`openmm.app.Modeller.addSolvent` internal heuristics.\n    Briefly, the necessary volume required by a single water is estimated\n    and then the defined target cell is packed with waters avoiding clashes\n    with existing solutes and box edges.\n\n\n    Defining the periodic cell size\n    -------------------------------\n\n    The periodic cell size is defined by one, and only one, of the following:\n      * ``solvent_padding`` in combination with ``box_shape``,\n      * ``number_of_solvent_molecules`` in combination with ``box_shape``,\n      * ``box_vectors``,\n      * ``box_size``\n\n    When using ``number_of_solvent_molecules``, the size of the cell is\n    defined by :meth:`openmm.app.Modeller.addSolvent` internal heuristics,\n    automatically selecting a padding value that is large enough to contain\n    the number of waters based on a geometric estimate of the volume required\n    by each water molecule.\n\n\n    Defining the periodic cell shape\n    ---------------------------------\n\n    The periodic cell shape is defined by one, and only one, of the following:\n      * ``box_shape``,\n      * ``box_vectors``,\n      * ``box_size``\n\n    Default settings will create a cubic box, although more space efficient\n    shapes (e.g. ``dodecahedrons``) are recommended to improve simulation\n    performance.\n\n\n    Notes\n    -----\n    * The number of water molecules added will be affected by the number of\n      ions defined in SolventComponent. For example, the value of\n      ``number_of_solvent_molecules`` is the sum of the number of counterions\n      added and the number of water molecules added.\n    * Solvent addition does not account for any pre-existing waters explicitly\n      defined in the :class:`openfe.ChemicalSystem`. Any waters will be added\n      in addition to those pre-existing waters.\n    * No solvation will happen if a SolventComponent is not passed.\n\n\n    See Also\n    --------\n    :mod:`openmm.app.Modeller`\n    Base class for SolvationSettings objects\n    \"\"\"\n\n    solvent_model: Literal[\"tip3p\", \"spce\", \"tip4pew\", \"tip5p\"] = \"tip3p\"\n    \"\"\"\n    Force field water model to use when solvating and defining the model\n    properties (e.g. adding virtual site particles).\n\n    Allowed values are: ``tip3p``, ``spce``, ``tip4pew``, and ``tip5p``.\n    \"\"\"\n    solvent_padding: NanometerQuantity | None = 1.5 * unit.nanometer\n    \"\"\"\n    Minimum distance from any solute bounding sphere to the edge of the box.\n\n    Note\n    ----\n    * Cannot be defined alongside ``number_of_solvent_molecules``,\n      ``box_size``, or ``box_vectors``.\n    \"\"\"\n    box_shape: Optional[Literal[\"cube\", \"dodecahedron\", \"octahedron\"]] = \"dodecahedron\"\n    \"\"\"\n    The shape of the periodic box to create.\n\n    Notes\n    -----\n    * Must be one of `cube`, `dodecahedron`, or `octahedron`.\n    * Cannot be defined alongside ``box_vectors`` or ``box_size``.\n    \"\"\"\n    number_of_solvent_molecules: Optional[int] = None\n    \"\"\"\n    The number of solvent molecules (water + ions) to add.\n\n    Note\n    ----\n    * Cannot be defined alongside ``solvent_padding``, ``box_size``,\n      or ``box_vectors``.\n    \"\"\"\n    box_vectors: BoxQuantity | None = None\n    \"\"\"\n    `OpenMM reduced form box vectors <http://docs.openmm.org/latest/userguide/theory/05_other_features.html#periodic-boundary-conditions>`.\n\n    Notes\n    -----\n    * Cannot be defined alongside ``solvent_padding``,\n      ``number_of_solvent_molecules``, or ``box_size``.\n\n    See Also\n    --------\n    :mod:`openff.interchange.components.interchange`\n    :mod:`openff.interchange.components._packmol`\n    \"\"\"\n    box_size: NanometerArrayQuantity | None = None  # TODO: make this a better check!\n    \"\"\"\n    X, Y, and Z lengths of the unit cell for a rectangular box.\n\n    Notes\n    -----\n    * Cannot be defined alongside ``solvent_padding``,\n      ``number_of_solvent_molecules``, or ``box_vectors``.\n    \"\"\"\n\n    @field_validator(\"box_vectors\")\n    def supported_vectors(cls, v):\n        if v is not None:\n            if not _box_vectors_are_in_reduced_form(v):\n                errmsg = f\"box_vectors: {v} are not in OpenMM reduced form\"\n                raise ValueError(errmsg)\n        return v\n\n    @field_validator(\"solvent_padding\")\n    def is_positive_distance(cls, v):\n        # these are time units, not simulation steps\n        if v is None:\n            return v\n\n        if not v.is_compatible_with(unit.nanometer):\n            raise ValueError(\"solvent_padding must be in distance units (i.e. nanometers)\")\n        if v < 0:\n            errmsg = \"solvent_padding must be a positive value\"\n            raise ValueError(errmsg)\n\n        return v\n\n    @field_validator(\"number_of_solvent_molecules\")\n    def positive_solvent_number(cls, v):\n        if v is None:\n            return v\n\n        if v <= 0:\n            errmsg = f\"number_of_solvent molecules: {v} must be positive\"\n            raise ValueError(errmsg)\n\n        return v\n\n    @field_validator(\"box_size\")\n    def box_size_properties(cls, v):\n        if v is None:\n            return v\n\n        if v.shape != (3,):\n            errmsg = f\"box_size must be a 1-D array of length 3 got {v} with shape {v.shape}\"\n            raise ValueError(errmsg)\n\n        return v\n\n\nclass BasePartialChargeSettings(SettingsBaseModel):\n    \"\"\"\n    Base class for partial charge assignment.\n    \"\"\"\n\n    model_config = ConfigDict(arbitrary_types_allowed=True)\n\n\nclass OpenFFPartialChargeSettings(BasePartialChargeSettings):\n    \"\"\"\n    Settings for controlling partial charge assignment using the OpenFF tooling\n    \"\"\"\n\n    partial_charge_method: Literal[\"am1bcc\", \"am1bccelf10\", \"nagl\", \"espaloma\"] = \"am1bcc\"\n    \"\"\"\n    Selection of method for partial charge generation.\n\n    Description of options\n    ----------------------\n    ``am1bcc``:\n      Generate partial charges using the AM1-BCC approach, as detailed\n      by Araz Jalkalian et al. J. Comp. Chem. 2000.\n      AM1-BCC charges are either assigned using AmberTools (via SQM)\n      if ``off_toolkit_backend`` is set to ``ambertools`, or\n      using the OpenEye Toolkit (via Quacpac) if ``off_toolkit_backend``\n      is set to ``openeye``. A maximum of one conformer is allowed.\n\n    ``am1bccelf10``:\n      Assign AM1-BCC partialk charges using the `ELF10 method\n      <https://docs.eyesopen.com/toolkits/python/quacpactk/molchargetheory.html#elf-conformer-selection>`_\n      This is only currently possible via the OpenEye toolkit\n      if setting ``off_toolkit_backend`` to ``openeye``.\n      We recommend setting ``number_of_conformers`` to at least `500`.\n\n    ``nagl``:\n      Assign partial charges using the `OpenFF NAGL ML method\n      <https://github.com/openforcefield/openff-nagl>`_\n      All ``off_toolkit_backend`` options are supported.\n      A maximum of one conformer is allowed.\n\n    ``espaloma``:\n      Assign partial charges using the `Espaloma Charge method\n      <https://github.com/choderalab/espaloma_charge>`_\n      Only ``ambertools`` and ``rdkit`` `off_toolkit_backend`` options\n      are supported. A maximum of one conformer is allowed.\n\n    \"\"\"\n    off_toolkit_backend: Literal[\"ambertools\", \"openeye\", \"rdkit\"] = \"ambertools\"\n    \"\"\"\n    The OpenFF toolkit registry backend to use for partial charge generation.\n\n\n    OpenFF backend selection options\n    --------------------------------\n\n    ``ambertools``:\n      This limits partial charge generation to using a mixture of AmberTools\n      and RDKit.\n\n    ``openeye``:\n      This limits partial charge generation to using the OpenEye toolkit.\n      This cannot be used with ``espaloma`` as the ``partial_charge_method``\n\n    ``rdkit``:\n      This limits partial charge generation to using the RDKit toolkit.\n      Note that this alone cannot be used for conventional am1bcc partial\n      charge generation, but is usually used in combination with\n      the ``nagl`` or ``espaloma`` ``partial_charge_method`` selections.\n\n    \"\"\"\n    number_of_conformers: Optional[int] = None\n    \"\"\"\n    Number of conformers to generate as part of the partial charge assignment.\n\n    If ``None`` (default), the existing conformer of the input\n    SmallMoleculeComponent will be used.\n\n    Values greater than 1 or ``None`` are only allowed when calculating\n    partial charges through ``am1bccelf10``. See ``partial_charge_method``'s\n    ``Description of options`` documentation.\n    \"\"\"\n    nagl_model: Optional[str] = None\n    \"\"\"\n    The `NAGL <https://github.com/openforcefield/openff-nagl>`_ model to use\n    for partial charge assignment.\n\n    If ``None`` (default) and ``partial_charge_method`` is set to ``nagl``,\n    the latest available production am1bcc charge model will be used.\n    \"\"\"\n\n\nclass OpenMMEngineSettings(SettingsBaseModel):\n    \"\"\"OpenMM MD engine settings\"\"\"\n\n    \"\"\"\n    TODO\n    ----\n    * In the future make precision and deterministic forces user defined too.\n    \"\"\"\n\n    compute_platform: Optional[str] = \"cuda\"\n    \"\"\"\n    OpenMM compute platform to perform MD integration with. If ``None``, will\n    choose fastest available platform.\n    Allowed platforms are; ``cuda``, ``opencl``, ``cpu``.\n    Default ``cuda``.\n\n    \"\"\"\n    gpu_device_index: Optional[list[int]] = None\n    \"\"\"\n    List of integer indices for the GPU device to select when\n    ``compute_platform`` is either set to ``CUDA`` or ``OpenCL``.\n\n    If ``None``, the default OpenMM GPU selection behaviour is used.\n\n    See the `OpenMM platform properties documentation <http://docs.openmm.org/latest/userguide/library/04_platform_specifics.html>`_\n    for more details.\n\n    Default ``None``.\n    \"\"\"\n\n    @field_validator(\"compute_platform\")\n    def supported_sampler(cls, v):\n        supported = [\"cpu\", \"opencl\", \"cuda\"]\n        if v is not None and v.lower() not in supported:\n            errmsg = f\"Only the following OpenMM compute backends are supported: {supported}\"\n            raise ValueError(errmsg)\n        return v\n\n\nclass IntegratorSettings(SettingsBaseModel):\n    \"\"\"Settings for the `LangevinDynamicsMove integrator <https://openmmtools.readthedocs.io/en/latest/api/generated/openmmtools.mcmc.LangevinDynamicsMove.html>`_.\n\n    Note\n    ----\n    For some Protocols, an MC \"move\" (e.g. replica exchange swap) is applied\n    at a given frequency. In most Protocols the move frequency is defined in\n    ``MultiStateSimulationSettings.time_per_iteration``.\n    \"\"\"\n\n    model_config = ConfigDict(arbitrary_types_allowed=True)\n\n    timestep: FemtosecondQuantity = 4.0 * unit.femtosecond\n    \"\"\"Size of the simulation timestep in femtoseconds. Default 4.0 * unit.femtosecond.\"\"\"\n    langevin_collision_rate: InversePicosecondQuantity = 1.0 / unit.picosecond\n    \"\"\"Collision frequency in picoseconds. Default 1.0 / unit.picosecond.\"\"\"\n    reassign_velocities: bool = False\n    \"\"\"\n    If ``True``, velocities are reassigned from the Maxwell-Boltzmann\n    distribution at the beginning of each MC move. Default ``False``.\n    \"\"\"\n    n_restart_attempts: int = 20\n    \"\"\"\n    Number of attempts to restart from Context if there are NaNs in the\n    energies after integration. Default 20.\n    \"\"\"\n    constraint_tolerance: float = 1e-06\n    \"\"\"Tolerance for the constraint solver. Default 1e-6.\"\"\"\n    barostat: Literal[\"MonteCarloBarostat\", \"MonteCarloMembraneBarostat\"] = \"MonteCarloBarostat\"\n    \"\"\"\n    The barostat to be used in the simulations. Default MonteCarloBarostat.\n    Notes\n    -----\n    If the system contains a membrane, use the `MonteCarloMembraneBarostat`.\n    \"\"\"\n    barostat_frequency: TimestepQuantity = 25.0 * unit.timestep\n    \"\"\"\n    Frequency at which volume scaling changes should be attempted.\n    Note: The barostat frequency is ignored for gas-phase simulations.\n    Default 25 * unit.timestep.\n    \"\"\"\n    surface_tension: Optional[SurfaceTensionQuantity] = 0 * unit.bar * unit.nanometer\n    \"\"\"\n    The surface tension in bar*nm to define the `MonteCarloMembraneBarostat`.\n    Default 0 * unit.bar * unit.nanometer.\n    Notes\n    -----\n    The `surface_tension` is ignored when the `MonteCarloMembraneBarostat` is\n    not used.\n    \"\"\"\n    remove_com: bool = False\n    \"\"\"\n    Whether or not to remove the center of mass motion. Default ``False``.\n    \"\"\"\n\n    @field_validator(\"langevin_collision_rate\", \"n_restart_attempts\")\n    def must_be_positive_or_zero(cls, v):\n        if v < 0:\n            errmsg = (\n                \"langevin_collision_rate, and n_restart_attempts must be\"\n                f\" zero or positive values, got {v}.\"\n            )\n            raise ValueError(errmsg)\n        return v\n\n    @field_validator(\"timestep\", \"constraint_tolerance\")\n    def must_be_positive(cls, v):\n        if v <= 0:\n            errmsg = f\"timestep, and constraint_tolerance must be positive values, got {v}.\"\n            raise ValueError(errmsg)\n        return v\n\n    @field_validator(\"timestep\")\n    def is_time(cls, v):\n        # these are time units, not simulation steps\n        if not v.is_compatible_with(unit.picosecond):\n            raise ValueError(\"timestep must be in time units (i.e. picoseconds)\")\n        return v\n\n    @field_validator(\"langevin_collision_rate\")\n    def must_be_inverse_time(cls, v):\n        if not v.is_compatible_with(1 / unit.picosecond):\n            raise ValueError(\"langevin collision_rate must be in inverse time (i.e. 1/picoseconds)\")\n        return v\n\n    @model_validator(mode=\"after\")\n    def validate_surface_tension(self):\n        if self.barostat == \"MonteCarloMembraneBarostat\" and self.surface_tension is None:\n            raise ValueError(\n                \"surface_tension must be set (may be zero) when using MonteCarloMembraneBarostat\"\n            )\n        if self.barostat == \"MonteCarloBarostat\" and self.surface_tension:\n            raise ValueError(\n                \"Got a nonzero surface_tension which is not allowed when using \"\n                f\"the MonteCarloBarostat. Got surface_tension {self.surface_tension}\"\n            )\n        return self\n\n\nclass OutputSettings(SettingsBaseModel):\n    \"\"\"\n    Settings for simulation output settings,\n    writing to disk, etc...\n    \"\"\"\n\n    model_config = ConfigDict(arbitrary_types_allowed=True)\n\n    # reporter settings\n    output_indices: str = \"not water\"\n    \"\"\"\n    Selection string for which part of the system to write coordinates for.\n    Default 'not water'.\n    \"\"\"\n    checkpoint_interval: NanosecondQuantity = 1.0 * unit.nanosecond\n    \"\"\"\n    Frequency to write the checkpoint file. Default 1 * unit.nanosecond.\n    \"\"\"\n    checkpoint_storage_filename: str = \"checkpoint.chk\"\n    \"\"\"\n    Separate filename for the checkpoint file. Note, this should\n    not be a full path, just a filename. Default 'checkpoint.chk'.\n    \"\"\"\n    forcefield_cache: Optional[str] = \"db.json\"\n    \"\"\"\n    Filename for caching small molecule residue templates so they can be\n    later reused.\n    \"\"\"\n\n    @field_validator(\"checkpoint_interval\")\n    def must_be_positive(cls, v):\n        if v <= 0:\n            errmsg = f\"Checkpoint intervals must be positive, got {v}.\"\n            raise ValueError(errmsg)\n        return v\n\n\nclass MultiStateOutputSettings(OutputSettings):\n    \"\"\"\n    Settings for MultiState simulation output settings,\n    writing to disk, etc...\n    \"\"\"\n\n    model_config = ConfigDict(arbitrary_types_allowed=True)\n\n    # reporter settings\n    output_filename: str = \"simulation.nc\"\n    \"\"\"Path to the trajectory storage file. Default 'simulation.nc'.\"\"\"\n    output_structure: str = \"hybrid_system.pdb\"\n    \"\"\"\n    Path of the output hybrid topology structure file. This is used\n    to visualise and further manipulate the system.\n    Default 'hybrid_system.pdb'.\n    \"\"\"\n    positions_write_frequency: PicosecondQuantity | None = 100.0 * unit.picosecond\n    \"\"\"\n    Frequency at which positions are written to the simulation trajectory\n    storage file (defined by ``output_filename``).\n\n    If ``None``, no positions will be written to the trajectory.\n\n    Unless set to ``None``, must be divisible by\n    ``MultiStateSimulationSettings.time_per_iteration``.\n    \"\"\"\n    velocities_write_frequency: PicosecondQuantity | None = None\n    \"\"\"\n    Frequency at which velocities are written to the simulation\n    trajectory storage file (defined by ``output_filename``).\n\n    If ``None`` (default), no velocities will be written to the trajectory.\n\n    Unless set to ``None``, must be divisible by\n    ``MultiStateSimulationSettings.time_per_iteration``.\n    \"\"\"\n\n    @field_validator(\"positions_write_frequency\", \"velocities_write_frequency\")\n    def must_be_positive(cls, v):\n        if v is not None and v < 0:\n            errmsg = (\n                \"Position_write_frequency and velocities_write_frequency\"\n                f\" must be positive (or None), got {v}.\"\n            )\n            raise ValueError(errmsg)\n        return v\n\n\nclass SimulationSettings(SettingsBaseModel):\n    \"\"\"\n    Settings for simulation control, including lengths, etc...\n    \"\"\"\n\n    model_config = ConfigDict(arbitrary_types_allowed=True)\n\n    minimization_steps: int = 5000\n    \"\"\"Number of minimization steps to perform. Default 5000.\"\"\"\n    equilibration_length: NanosecondQuantity\n    \"\"\"\n    Length of the equilibration phase in units of time.\n    Must be divisible by the :class:`IntegratorSettings.timestep`.\n    \"\"\"\n    production_length: NanosecondQuantity\n    \"\"\"\n    Length of the production phase in units of time.\n    Must be divisible by the :class:`IntegratorSettings.timestep`.\n    \"\"\"\n\n    @field_validator(\"equilibration_length\", \"production_length\")\n    def is_time(cls, v):\n        # these are time units, not simulation steps\n        if not v.is_compatible_with(unit.picosecond):\n            raise ValueError(\"Durations must be in time units\")\n        return v\n\n    @field_validator(\"minimization_steps\", \"equilibration_length\", \"production_length\")\n    def must_be_positive(cls, v):\n        if v <= 0:\n            errmsg = f\"Minimization steps, and MD lengths must be positive, got {v}\"\n            raise ValueError(errmsg)\n        return v\n\n\nclass MultiStateSimulationSettings(SimulationSettings):\n    \"\"\"\n    Settings for simulation control for multistate simulations,\n    including simulation length and details of the alchemical sampler.\n    \"\"\"\n\n    \"\"\"\n    TODO\n    ----\n    * It'd be great if we could pass in the sampler object rather than using\n      strings to define which one we want.\n    * Make n_replicas optional such that: If ``None`` or greater than the\n      number of lambda windows set in :class:`LambdaSettings`, this will\n      default to the number of lambda windows. If less than the number of\n      lambda windows, the replica lambda states will be picked at equidistant\n      intervals along the lambda schedule.\n    \"\"\"\n    model_config = ConfigDict(arbitrary_types_allowed=True)\n\n    sampler_method: str = \"repex\"\n    \"\"\"\n    Alchemical sampling method, must be one of;\n    `repex` (Hamiltonian Replica Exchange),\n    `sams` (Self-Adjusted Mixture Sampling),\n    or `independent` (independently sampled lambda windows).\n    Default `repex`.\n    \"\"\"\n    time_per_iteration: PicosecondQuantity = 2.5 * unit.picosecond\n    # todo: Add validators in the protocol\n    \"\"\"\n    Simulation time between each MCMC move attempt. Default 2.5 * unit.picosecond.\n    \"\"\"\n    real_time_analysis_interval: PicosecondQuantity | None = 250.0 * unit.picosecond\n    # todo: Add validators in the protocol\n    \"\"\"\n    Time interval at which to perform an analysis of the free energies.\n\n    At each interval, real time analysis data (e.g. current free energy\n    estimate and timing data) will be written to a yaml file named\n    ``<OutputSettings.output_filename>_real_time_analysis.yaml``. The\n    current error in the estimate will also be assessed and if it drops\n    below ``MultiStateSimulationSettings.early_termination_target_error``\n    the simulation will be terminated.\n\n    If ``None``, no real time analysis will be performed and the yaml\n    file will not be written.\n\n    Default `250`.\n\n    \"\"\"\n    early_termination_target_error: KCalPerMolQuantity | None = 0.0 * unit.kilocalorie_per_mole\n    # todo: have default ``None`` or ``0.0 * unit.kilocalorie_per_mole``\n    #  (later would give an example of unit).\n    \"\"\"\n    Target error for the real time analysis measured in kcal/mol. Once the MBAR\n    error of the free energy is at or below this value, the simulation will be\n    considered complete.\n    A suggested value of 0.12 * `unit.kilocalorie_per_mole` has\n    shown to be effective in both hydration and binding free energy benchmarks.\n    Default ``None``, i.e. no early termination will occur.\n    \"\"\"\n    real_time_analysis_minimum_time: PicosecondQuantity = 500.0 * unit.picosecond\n    # todo: Add validators in the protocol\n    \"\"\"\n    Simulation time which must pass before real time analysis is\n    carried out.\n\n    Default 500 * unit.picosecond.\n    \"\"\"\n\n    sams_flatness_criteria: str = \"logZ-flatness\"\n    \"\"\"\n    SAMS only. Method for assessing when to switch to asymptomatically\n    optimal scheme.\n    One of ['logZ-flatness', 'minimum-visits', 'histogram-flatness'].\n    Default 'logZ-flatness'.\n    \"\"\"\n    sams_gamma0: float = 1.0\n    \"\"\"SAMS only. Initial weight adaptation rate. Default 1.0.\"\"\"\n    n_replicas: int = 11\n    \"\"\"Number of replicas to use. Default 11.\"\"\"\n\n    @field_validator(\"sams_flatness_criteria\")\n    def supported_flatness(cls, v):\n        supported = [\"logz-flatness\", \"minimum-visits\", \"histogram-flatness\"]\n        if v.lower() not in supported:\n            errmsg = f\"Only the following sams_flatness_criteria are supported: {supported}\"\n            raise ValueError(errmsg)\n        return v\n\n    @field_validator(\"sampler_method\")\n    def supported_sampler(cls, v):\n        supported = [\"repex\", \"sams\", \"independent\"]\n        if v.lower() not in supported:\n            errmsg = f\"Only the following sampler_method values are supported: {supported}\"\n            raise ValueError(errmsg)\n        return v\n\n    @field_validator(\"n_replicas\", \"time_per_iteration\")\n    def must_be_positive(cls, v):\n        if v <= 0:\n            errmsg = f\"n_replicas and steps_per_iteration must be positive values, got {v}.\"\n            raise ValueError(errmsg)\n        return v\n\n    @field_validator(\n        \"early_termination_target_error\",\n        \"real_time_analysis_minimum_time\",\n        \"sams_gamma0\",\n        \"n_replicas\",\n    )\n    def must_be_zero_or_positive(cls, v):\n        if v < 0:\n            errmsg = (\n                \"Early termination target error, minimum iteration and\"\n                f\" SAMS gamma0 must be 0 or positive values, got {v}.\"\n            )\n            raise ValueError(errmsg)\n        return v\n\n\nclass MDSimulationSettings(SimulationSettings):\n    \"\"\"\n    Settings for simulation control for plain MD simulations\n    \"\"\"\n\n    model_config = ConfigDict(arbitrary_types_allowed=True)\n\n    equilibration_length_nvt: NanosecondQuantity | None\n    \"\"\"\n    Length of the equilibration phase in the NVT ensemble in units of time.\n    The total number of steps from this equilibration length\n    (i.e. ``equilibration_length_nvt`` / :class:`IntegratorSettings.timestep`).\n    If None, no NVT equilibration will be performed.\n    \"\"\"\n\n\nclass MDOutputSettings(OutputSettings):\n    \"\"\"Settings for simulation output settings for plain MD simulations.\"\"\"\n\n    model_config = ConfigDict(arbitrary_types_allowed=True)\n\n    # reporter settings\n    production_trajectory_filename: Optional[str] = \"simulation.xtc\"\n    \"\"\"Path to the storage file for analysis. Default 'simulation.xtc'.\"\"\"\n    trajectory_write_interval: PicosecondQuantity = 20.0 * unit.picosecond\n    \"\"\"\n    Frequency to write the xtc file. Default 5000 * unit.timestep.\n    \"\"\"\n    preminimized_structure: Optional[str] = \"system.pdb\"\n    \"\"\"Path to the pdb file of the full pre-minimized system.\n    Default 'system.pdb'.\"\"\"\n    minimized_structure: Optional[str] = \"minimized.pdb\"\n    \"\"\"Path to the pdb file of the system after minimization.\n    Only the specified atom subset is saved. Default 'minimized.pdb'.\"\"\"\n    equil_nvt_structure: Optional[str] = \"equil_nvt.pdb\"\n    \"\"\"Path to the pdb file of the system after NVT equilibration.\n    Only the specified atom subset is saved. Default 'equil_nvt.pdb'.\"\"\"\n    equil_npt_structure: Optional[str] = \"equil_npt.pdb\"\n    \"\"\"Path to the pdb file of the system after NPT equilibration.\n    Only the specified atom subset is saved. Default 'equil_npt.pdb'.\"\"\"\n    log_output: Optional[str] = \"simulation.log\"\n    \"\"\"\n    Filename for writing the log of the MD simulation, including timesteps,\n    energies, density, etc.\n    \"\"\"\n"
  },
  {
    "path": "src/openfe/protocols/openmm_utils/serialization.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\n\nimport os\nimport pathlib\n\nfrom gufe.settings.typing import NanometerArrayQuantity\nfrom openff.units import Quantity\nfrom openmm import Vec3\nfrom openmm import unit as ommunit\n\n\ndef serialize(item, filename: pathlib.Path):\n    \"\"\"\n    Serialize an OpenMM System, State, or Integrator.\n\n    Parameters\n    ----------\n    item : System, State, or Integrator\n        The thing to be serialized\n    filename : str\n        The filename to serialize to\n    \"\"\"\n    from openmm import XmlSerializer\n\n    # Create parent directory if it doesn't exist\n    filename_basedir = filename.parent\n    if not filename_basedir.exists():\n        os.makedirs(filename_basedir)\n\n    if filename.suffix == \".bz2\":\n        import bz2\n\n        with bz2.open(filename, mode=\"wb\") as outfile:\n            serialized_thing = XmlSerializer.serialize(item)\n            outfile.write(serialized_thing.encode())\n    else:\n        with open(filename, mode=\"w\") as outfile:\n            serialized_thing = XmlSerializer.serialize(item)\n            outfile.write(serialized_thing)\n\n\ndef deserialize(filename: pathlib.Path):\n    \"\"\"\n    Deserialize an OpenMM System, State, or Integrator.\n\n    Parameters\n    ----------\n    item : System, State, or Integrator\n        The thing to be serialized\n    filename : str\n        The filename to serialize to\n    \"\"\"\n    from openmm import XmlSerializer\n\n    # Create parent directory if it doesn't exist\n    filename_basedir = filename.parent\n    if not filename_basedir.exists():\n        os.makedirs(filename_basedir)\n\n    if filename.suffix == \".bz2\":\n        import bz2\n\n        with bz2.open(filename, mode=\"rb\") as infile:\n            serialized_thing = infile.read().decode()\n            item = XmlSerializer.deserialize(serialized_thing)\n    else:\n        with open(filename) as infile:\n            serialized_thing = infile.read()\n            item = XmlSerializer.deserialize(serialized_thing)\n\n    return item\n\n\ndef make_vec3_box(dimensions: NanometerArrayQuantity) -> Vec3:\n    \"\"\"\n    Convert an OpenFF box dimensions Quantity back into Vec3 format.\n\n    Parameters\n    ----------\n    dimensions : gufe.settings.typing.NanometerArrayQuantity\n      United array to turn to Vec3 format.\n\n    Returns\n    -------\n    openmm.Vec3\n      The input array in Vec3 format.\n    \"\"\"\n    return [\n        Vec3(float(row[0]), float(row[1]), float(row[2])) * ommunit.nanometer\n        for row in dimensions.m_as(\"nanometer\")\n    ]\n"
  },
  {
    "path": "src/openfe/protocols/openmm_utils/settings_validation.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\n\"\"\"\nReusable utility methods to validate input settings to OpenMM-based alchemical\nProtocols.\n\"\"\"\n\nfrom typing import Optional\n\nfrom openff.units import Quantity, unit\n\nfrom openfe.protocols.openmm_utils.omm_settings import OpenMMSolvationSettings\n\nfrom .omm_settings import (\n    IntegratorSettings,\n    MultiStateSimulationSettings,\n)\n\n\ndef validate_openmm_solvation_settings(settings: OpenMMSolvationSettings) -> None:\n    \"\"\"\n    Checks that the OpenMMSolvation settings are correct.\n\n    Raises\n    ------\n    ValueError\n      If more than one of ``solvent_padding``, ``number_of_solvent_molecules``,\n      ``box_vectors``, or ``box_size`` are defined.\n      If ``box_shape`` is defined alongside either ``box_vectors``,\n      or ``box_size``.\n    \"\"\"\n    unique_attributes = (\n        settings.solvent_padding,\n        settings.number_of_solvent_molecules,\n        settings.box_vectors,\n        settings.box_size,\n    )\n    if len([x for x in unique_attributes if x is not None]) > 1:\n        errmsg = (\n            \"Only one of solvent_padding, number_of_solvent_molecules, \"\n            \"box_vectors, and box_size can be defined in the solvation \"\n            \"settings.\"\n        )\n        raise ValueError(errmsg)\n\n    if settings.box_shape is not None:\n        if settings.box_size is not None or settings.box_vectors is not None:\n            errmsg = (\n                \"box_shape cannot be defined alongside either box_size \"\n                \"or box_vectors in the solvation settings.\"\n            )\n            raise ValueError(errmsg)\n\n\ndef validate_timestep(hmass: float, timestep: Quantity):\n    \"\"\"\n    Check that the input timestep is suitable for the given hydrogen\n    mass.\n\n    Parameters\n    ----------\n    hmass : float\n      The target hydrogen mass (assumed units of amu).\n    timestep : openff.units.Quantity\n      The integration time step.\n\n\n    Raises\n    ------\n    ValueError\n      If the hydrogen mass is less than 3 amu and the timestep is\n      greater than 2 fs.\n    \"\"\"\n    if hmass < 3.0:\n        if timestep > 2.0 * unit.femtoseconds:\n            errmsg = f\"timestep {timestep} too large for hydrogen mass {hmass}\"\n            raise ValueError(errmsg)\n\n\ndef get_simsteps(sim_length: Quantity, timestep: Quantity, mc_steps: int) -> int:\n    \"\"\"\n    Gets and validates the number of simulation steps.\n\n    Parameters\n    ----------\n    sim_length : openff.units.Quantity\n      Simulation length.\n    timestep : openff.units.Quantity\n      Integration timestep.\n    mc_steps : int\n      Number of integration timesteps between MCMC moves.\n\n    Returns\n    -------\n    sim_steps : int\n      The number of simulation timesteps.\n    \"\"\"\n\n    sim_time = round(sim_length.to(\"attosecond\").m)  # type: ignore\n    ts = round(timestep.to(\"attosecond\").m)  # type: ignore\n\n    sim_steps, mod = divmod(sim_time, ts)\n    if mod != 0:\n        raise ValueError(\"Simulation time not divisible by timestep\")\n\n    if (sim_steps % mc_steps) != 0:\n        errmsg = (\n            f\"Simulation time {sim_time / 1000000} ps should contain a \"\n            \"number of steps divisible by the number of integrator \"\n            f\"timesteps between MC moves {mc_steps}\"\n        )\n        raise ValueError(errmsg)\n\n    return sim_steps\n\n\ndef divmod_time(\n    time: Quantity,\n    time_per_iteration: Quantity,\n) -> tuple[int, int]:\n    \"\"\"\n    Convert a set amount of time to a number of iterations.\n\n    Parameters\n    ---------\n    time: openff.units.Quantity\n      The time to convert.\n    time_per_iteration : openff.units.Quantity\n      The amount of time which each iteration takes.\n\n    Returns\n    -------\n    iterations : int\n      The number of iterations covered by the input time.\n    remainder : int\n      The remainder of the input time and time_per_iteration division.\n    \"\"\"\n    time_ats = round(time.to(unit.attosecond).m)  # type: ignore\n    tpi_ats = round(time_per_iteration.to(unit.attosecond).m)  # type: ignore\n\n    iterations, remainder = divmod(time_ats, tpi_ats)\n\n    return iterations, remainder\n\n\ndef divmod_time_and_check(\n    numerator: Quantity, denominator: Quantity, numerator_name: str, denominator_name: str\n) -> int:\n    \"\"\"Perform a division of time, failing if there is a remainder\n\n    For example numerator 20.0 ps and denominator 4.0 fs gives 5000\n\n    Parameters\n    ----------\n    numerator, denominator : openff.units.Quantity\n      the division to perform\n    numerator_name, denominator_name : str\n      used for the error generated if there is any remainder\n\n    Returns\n    -------\n    iterations : int\n      the result of the division\n\n    Raises\n    ------\n    ValueError\n      if the division results in any remainder, will include a formatted error\n      message\n    \"\"\"\n    its, rem = divmod_time(numerator, denominator)\n\n    if rem:\n        errmsg = (\n            f\"The {numerator_name} ({numerator}) \"\n            \"does not evenly divide by the \"\n            f\"{denominator_name} ({denominator})\"\n        )\n        raise ValueError(errmsg)\n\n    return its\n\n\ndef convert_checkpoint_interval_to_iterations(\n    checkpoint_interval: Quantity,\n    time_per_iteration: Quantity,\n) -> int:\n    \"\"\"\n    Get the number of iterations per checkpoint interval.\n\n    This is necessary as our input settings define checkpoints intervals in\n    units of time, but OpenMMTools' MultiStateReporter requires them defined\n    in the number of MC intervals.\n\n    Parameters\n    ----------\n    checkpoint_interval : openff.units.Quantity\n      The amount of time per checkpoints written.\n    time_per_iteration : openff.units.Quantity\n      The amount of time each MC iteration takes.\n\n    Returns\n    -------\n    iterations : int\n      The number of iterations per checkpoint.\n    \"\"\"\n    iterations, rem = divmod_time(checkpoint_interval, time_per_iteration)\n\n    if rem:\n        errmsg = (\n            f\"The amount of time per checkpoint {checkpoint_interval} \"\n            \"does not evenly divide by the amount of time per \"\n            f\"state MCMC move attempt {time_per_iteration}\"\n        )\n        raise ValueError(errmsg)\n\n    return iterations\n\n\ndef convert_steps_per_iteration(\n    simulation_settings: MultiStateSimulationSettings,\n    integrator_settings: IntegratorSettings,\n) -> int:\n    \"\"\"Convert time per iteration to steps\n\n    Parameters\n    ----------\n    simulation_settings: MultiStateSimulationSettings\n    integrator_settings: IntegratorSettings\n\n    Returns\n    -------\n    steps_per_iteration : int\n      suitable for input to Integrator\n    \"\"\"\n    return divmod_time_and_check(\n        simulation_settings.time_per_iteration,\n        integrator_settings.timestep,\n        \"time_per_iteration\",\n        \"timestep\",\n    )\n\n\ndef convert_real_time_analysis_iterations(\n    simulation_settings: MultiStateSimulationSettings,\n) -> tuple[Optional[int], Optional[int]]:\n    \"\"\"Convert time units in Settings to various other units\n\n    Internally openmmtools uses various quantities with units of time,\n    steps, and iterations.\n\n    Our Settings objects instead have things defined in time (fs or ps).\n\n    This function generates suitable inputs for the openmmtools objects\n\n    Parameters\n    ----------\n    simulation_settings: MultiStateSimulationSettings\n\n    Returns\n    -------\n    real_time_analysis_iterations : Optional[int]\n      suitable for input to online_analysis_interval\n    real_time_analysis_minimum_iterations : Optional[int]\n      suitable for input to real_time_analysis_minimum_iterations\n    \"\"\"\n    if simulation_settings.real_time_analysis_interval is None:\n        # option to turn off real time analysis\n        return None, None\n\n    rta_its = divmod_time_and_check(\n        simulation_settings.real_time_analysis_interval,\n        simulation_settings.time_per_iteration,\n        \"real_time_analysis_interval\",\n        \"time_per_iteration\",\n    )\n    rta_min_its = divmod_time_and_check(\n        simulation_settings.real_time_analysis_minimum_time,\n        simulation_settings.time_per_iteration,\n        \"real_time_analysis_minimum_time\",\n        \"time_per_iteration\",\n    )\n\n    return rta_its, rta_min_its\n\n\ndef convert_target_error_from_kcal_per_mole_to_kT(\n    temperature,\n    target_error,\n) -> float:\n    \"\"\"Convert kcal/mol target error to kT units\n\n    If target_error is 0.0, returns 0.0\n\n    Parameters\n    ----------\n    temperature : openff.units.Quantity\n      temperature in K\n    target_error : openff.units.Quantity\n      error in kcal/mol\n\n    Returns\n    -------\n    early_termination_target_error : float\n      in units of kT, suitable for input as \"online_analysis_target_error\" in a\n      Sampler\n    \"\"\"\n    if target_error:\n        kB = 0.001987204 * unit.kilocalorie_per_mole / unit.kelvin\n        kT = temperature * kB\n        early_termination_target_error = target_error / kT\n    else:\n        return 0.0\n\n    return early_termination_target_error.m\n"
  },
  {
    "path": "src/openfe/protocols/openmm_utils/system_creation.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\n\"\"\"\nReusable utility methods to create Systems for OpenMM-based alchemical\nProtocols.\n\"\"\"\n\nfrom pathlib import Path\nfrom typing import Optional\n\nimport numpy as np\nimport numpy.typing as npt\nfrom gufe import (\n    BaseSolventComponent,\n    Component,\n    ProteinComponent,\n    ProteinMembraneComponent,\n    SmallMoleculeComponent,\n    SolvatedPDBComponent,\n    SolventComponent,\n)\nfrom gufe.settings import OpenMMSystemGeneratorFFSettings, ThermoSettings\nfrom openff.toolkit import Molecule as OFFMol\nfrom openff.units.openmm import ensure_quantity, to_openmm\nfrom openmm import MonteCarloBarostat, MonteCarloMembraneBarostat, app\nfrom openmm import unit as omm_unit\nfrom openmmforcefields.generators import SystemGenerator\n\nfrom openfe.protocols.openmm_utils.omm_settings import (\n    IntegratorSettings,\n    OpenMMSolvationSettings,\n)\n\n\ndef get_system_generator(\n    forcefield_settings: OpenMMSystemGeneratorFFSettings,\n    thermo_settings: ThermoSettings,\n    integrator_settings: IntegratorSettings,\n    cache: Optional[Path],\n    has_solvent: bool,\n) -> SystemGenerator:\n    \"\"\"\n    Create a SystemGenerator based on Protocol settings.\n\n    Parameters\n    ---------\n    forcefield_settings : OpenMMSystemGeneratorFFSettings\n      Force field settings, including necessary information\n      for constraints, hydrogen mass, rigid waters,\n      non-ligand FF xmls, and the ligand FF name.\n    thermo_settings : ThermoSettings\n      Thermodynamic settings, including necessary settings\n      for defining the ensemble conditions.\n    integrator_settings : IntegratorSettings\n      Integrator settings, including barostat control variables and COM removal.\n    cache : Optional[pathlib.Path]\n      Path to openff force field cache.\n    has_solvent : bool\n      Whether or not the target system has solvent (and by extension\n      might require a barostat).\n\n    Returns\n    -------\n    system_generator : openmmforcefields.generator.SystemGenerator\n      System Generator to use for this Protocol.\n\n    TODO\n    ----\n    * Investigate how RF can be passed to non-periodic kwargs.\n    \"\"\"\n    # get the right constraint\n    constraints = {\n        \"hbonds\": app.HBonds,\n        \"none\": None,\n        \"allbonds\": app.AllBonds,\n        \"hangles\": app.HAngles,\n        # vvv can be None so string it\n    }[str(forcefield_settings.constraints).lower()]\n\n    # create forcefield_kwargs entry\n    forcefield_kwargs = {\n        \"constraints\": constraints,\n        \"rigidWater\": forcefield_settings.rigid_water,\n        \"removeCMMotion\": integrator_settings.remove_com,\n        \"hydrogenMass\": forcefield_settings.hydrogen_mass * omm_unit.amu,\n    }\n\n    # get the right nonbonded method\n    nonbonded_method = {\n        \"pme\": app.PME,\n        \"nocutoff\": app.NoCutoff,\n        \"cutoffnonperiodic\": app.CutoffNonPeriodic,\n        \"cutoffperiodic\": app.CutoffPeriodic,\n        \"ewald\": app.Ewald,\n    }[forcefield_settings.nonbonded_method.lower()]\n\n    nonbonded_cutoff = to_openmm(\n        forcefield_settings.nonbonded_cutoff,\n    )\n\n    # create the periodic_kwarg entry\n    periodic_kwargs = {\n        \"nonbondedMethod\": nonbonded_method,\n        \"nonbondedCutoff\": nonbonded_cutoff,\n    }\n\n    # Currently the else is a dead branch, we will want to investigate the\n    # possibility of using CutoffNonPeriodic at some point though (for RF)\n    if nonbonded_method is not app.CutoffNonPeriodic:\n        nonperiodic_kwargs = {\n            \"nonbondedMethod\": app.NoCutoff,\n        }\n    else:  # pragma: no-cover\n        nonperiodic_kwargs = periodic_kwargs\n\n    # Add barostat if necessary\n    # For membrane systems, add a MonteCarloMembraneBarostat.\n    if has_solvent:\n        if integrator_settings.barostat == \"MonteCarloMembraneBarostat\":\n            barostat = MonteCarloMembraneBarostat(\n                ensure_quantity(thermo_settings.pressure, \"openmm\"),\n                to_openmm(integrator_settings.surface_tension),\n                ensure_quantity(thermo_settings.temperature, \"openmm\"),\n                MonteCarloMembraneBarostat.XYIsotropic,\n                MonteCarloMembraneBarostat.ZFree,\n                integrator_settings.barostat_frequency.m,\n            )\n\n        else:\n            barostat = MonteCarloBarostat(\n                ensure_quantity(thermo_settings.pressure, \"openmm\"),\n                ensure_quantity(thermo_settings.temperature, \"openmm\"),\n                integrator_settings.barostat_frequency.m,\n            )\n    else:\n        barostat = None\n\n    system_generator = SystemGenerator(\n        forcefields=forcefield_settings.forcefields,\n        small_molecule_forcefield=forcefield_settings.small_molecule_forcefield,\n        forcefield_kwargs=forcefield_kwargs,\n        nonperiodic_forcefield_kwargs=nonperiodic_kwargs,\n        periodic_forcefield_kwargs=periodic_kwargs,\n        cache=str(cache) if cache is not None else None,\n        barostat=barostat,\n    )\n\n    return system_generator\n\n\nModellerReturn = tuple[app.Modeller, dict[Component, npt.NDArray]]\n\n\ndef get_omm_modeller(\n    protein_comp: Optional[ProteinComponent],\n    solvent_comp: Optional[BaseSolventComponent],\n    small_mols: dict[SmallMoleculeComponent, OFFMol],\n    omm_forcefield: app.ForceField,\n    solvent_settings: OpenMMSolvationSettings,\n) -> ModellerReturn:\n    \"\"\"\n    Generate an OpenMM Modeller class based on a potential input ProteinComponent,\n    SolventComponent, and a set of small molecules.\n\n    Parameters\n    ----------\n    protein_comp : Optional[ProteinComponent]\n      Protein Component, if it exists.\n    solvent_comp : Optional[BaseSolventComponent]\n      Base Solvent Component, if it exists.\n    small_mols : dict\n      Small molecules to add.\n    omm_forcefield : app.ForceField\n      ForceField object for system.\n    solvent_settings : SolvationSettings\n      Solvation settings.\n\n    Returns\n    -------\n    system_modeller : app.Modeller\n      OpenMM Modeller object generated from ProteinComponent and\n      OpenFF Molecules.\n    component_resids : dict[Component, npt.NDArray]\n      Dictionary of residue indices for each component in system.\n    \"\"\"\n    component_resids = {}\n\n    def _add_small_mol(\n        comp, mol, system_modeller: app.Modeller, comp_resids: dict[Component, npt.NDArray]\n    ):\n        \"\"\"\n        Helper method to add OFFMol to an existing Modeller object and\n        update a dictionary tracking residue indices for each component.\n        \"\"\"\n        omm_top = mol.to_topology().to_openmm()\n        system_modeller.add(omm_top, ensure_quantity(mol.conformers[0], \"openmm\"))\n\n        nres = omm_top.getNumResidues()\n        resids = [res.index for res in system_modeller.topology.residues()]\n        comp_resids[comp] = np.array(resids[-nres:])\n\n    # Create empty modeller\n    system_modeller = app.Modeller(app.Topology(), [])\n\n    # If there's a protein in the system, we add it first to the Modeller\n    if protein_comp is not None:\n        system_modeller.add(protein_comp.to_openmm_topology(), protein_comp.to_openmm_positions())\n        # add missing virtual particles (from crystal waters)\n        system_modeller.addExtraParticles(omm_forcefield)\n        component_resids[protein_comp] = np.array(\n            [r.index for r in system_modeller.topology.residues()]\n        )\n        # if we solvate temporarily rename water molecules to 'WAT'\n        # see openmm issue #4103\n        if isinstance(solvent_comp, SolventComponent):\n            for r in system_modeller.topology.residues():\n                if r.name == \"HOH\":\n                    r.name = \"WAT\"\n\n    # Now loop through small mols\n    for comp, mol in small_mols.items():\n        _add_small_mol(comp, mol, system_modeller, component_resids)\n\n    # Add solvent if needed\n    if isinstance(solvent_comp, SolventComponent):\n        # Do unit conversions if necessary\n        solvent_padding = None\n        box_size = None\n        box_vectors = None\n\n        if solvent_settings.solvent_padding is not None:\n            solvent_padding = to_openmm(solvent_settings.solvent_padding)\n\n        if solvent_settings.box_size is not None:\n            box_size = to_openmm(solvent_settings.box_size)\n\n        if solvent_settings.box_vectors is not None:\n            box_vectors = to_openmm(solvent_settings.box_vectors)\n\n        system_modeller.addSolvent(\n            omm_forcefield,\n            model=solvent_settings.solvent_model,\n            padding=solvent_padding,\n            positiveIon=solvent_comp.positive_ion,\n            negativeIon=solvent_comp.negative_ion,\n            ionicStrength=to_openmm(solvent_comp.ion_concentration),\n            neutralize=solvent_comp.neutralize,\n            boxSize=box_size,\n            boxVectors=box_vectors,\n            boxShape=solvent_settings.box_shape,\n            numAdded=solvent_settings.number_of_solvent_molecules,\n        )\n\n        all_resids = np.array([r.index for r in system_modeller.topology.residues()])\n\n        existing_resids = np.concatenate([resids for resids in component_resids.values()])\n\n        component_resids[solvent_comp] = np.setdiff1d(all_resids, existing_resids)\n        # undo rename of pre-existing waters\n        for r in system_modeller.topology.residues():\n            if r.name == \"WAT\":\n                r.name = \"HOH\"\n    # If we are working with a presolvated system (with solvent\n    # already added) and we have predefined box vectors, then skip solvation\n    # with Modeller and set box vectors.\n    elif isinstance(solvent_comp, SolvatedPDBComponent):\n        # Set the periodic box vectors\n        system_modeller.topology.setPeriodicBoxVectors(to_openmm(solvent_comp.box_vectors))\n\n    return system_modeller, component_resids\n"
  },
  {
    "path": "src/openfe/protocols/openmm_utils/system_validation.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\n\"\"\"\nReusable utility methods to validate input systems to OpenMM-based alchemical\nProtocols.\n\"\"\"\n\nimport logging\nimport warnings\nfrom typing import Optional, Tuple\n\nimport numpy as np\nimport openmm\nfrom gufe import (\n    BaseSolventComponent,\n    ChemicalSystem,\n    Component,\n    ProteinComponent,\n    ProteinMembraneComponent,\n    SmallMoleculeComponent,\n    SolvatedPDBComponent,\n    SolventComponent,\n)\nfrom gufe.components.errors import ComponentValidationError\nfrom openff.toolkit import Molecule as OFFMol\n\nlogger = logging.getLogger(__name__)\n\n\ndef get_alchemical_components(\n    stateA: ChemicalSystem,\n    stateB: ChemicalSystem,\n) -> dict[str, list[Component]]:\n    \"\"\"\n    Checks the equality between Components of two end state ChemicalSystems\n    and identify which components do not match.\n\n    Parameters\n    ----------\n    stateA : ChemicalSystem\n      The chemical system of end state A.\n    stateB : ChemicalSystem\n      The chemical system of end state B.\n\n    Returns\n    -------\n    alchemical_components : dict[str, list[Component]]\n      Dictionary containing a list of alchemical components for each state.\n\n    Raises\n    ------\n    ValueError\n      If there are any duplicate components in states A or B.\n    \"\"\"\n    matched_components: dict[Component, Component] = {}\n    alchemical_components: dict[str, list[Component]] = {\n        \"stateA\": [],\n        \"stateB\": [],\n    }\n\n    for keyA, valA in stateA.components.items():\n        for keyB, valB in stateB.components.items():\n            if valA == valB:\n                if valA not in matched_components.keys():\n                    matched_components[valA] = valB\n                else:\n                    # Could be that either we have a duplicate component\n                    # in stateA or in stateB\n                    errmsg = (\n                        f\"state A components {keyA}: {valA} matches \"\n                        \"multiple components in stateA or stateB\"\n                    )\n                    raise ValueError(errmsg)\n\n    # populate stateA alchemical components\n    for valA in stateA.components.values():\n        if valA not in matched_components.keys():\n            alchemical_components[\"stateA\"].append(valA)\n\n    # populate stateB alchemical components\n    for valB in stateB.components.values():\n        if valB not in matched_components.values():\n            alchemical_components[\"stateB\"].append(valB)\n\n    return alchemical_components\n\n\ndef validate_solvent(state: ChemicalSystem, nonbonded_method: str):\n    \"\"\"\n    Checks that the ChemicalSystem component has the right solvent\n    composition for an input nonbonded_methtod.\n\n    Supported configurations are:\n      * Vacuum (no BaseSolventComponent)\n      * One BaseSolventComponent\n      * One SolventComponent paired with one SolvatedPDBComponent\n\n    Parameters\n    ----------\n    state : ChemicalSystem\n      The chemical system to inspect.\n    nonbonded_method : str\n      The nonbonded method to be applied for the simulation.\n\n    Raises\n    ------\n    ValueError\n      * If there are more than two BaseSolventComponents in the ChemicalSystem.\n      * If there are multiple SolventComponents or SolvatedPDBComponents in the ChemicalSystem.\n      * If `nocutoff` is requested with any BaseSolventComponent present.\n      * If there is no BaseSolventComponent and the `nonbonded_method` is `pme`.\n      * If the SolventComponent solvent is not water.\n    \"\"\"\n    nb_method = nonbonded_method.lower()\n    base_solv_comps = state.get_components_of_type(BaseSolventComponent)\n    solvation_comps = state.get_components_of_type(SolventComponent)\n    solvated_comps = state.get_components_of_type(SolvatedPDBComponent)\n\n    if len(solvated_comps) > 1:\n        raise ValueError(\"Multiple SolvatedPDBComponent found, only one is supported\")\n\n    if len(solvation_comps) > 1:\n        raise ValueError(\"Multiple SolventComponent found, only one is supported\")\n\n    # Any BaseSolventComponent present → nocutoff is invalid\n    if base_solv_comps and nb_method == \"nocutoff\":\n        raise ValueError(\"nocutoff cannot be used for solvent transformations\")\n\n    # Vacuum transform\n    if not base_solv_comps:\n        if nb_method == \"pme\":\n            raise ValueError(\"PME cannot be used for vacuum transform\")\n        return\n\n    # Solvent-specific checks\n    if solvation_comps:\n        solvent = solvation_comps[0]\n\n        if solvent.smiles != \"O\":\n            raise ValueError(\"Non water solvent is not currently supported\")\n\n\ndef validate_protein(state: ChemicalSystem):\n    \"\"\"\n    Checks that the ChemicalSystem's ProteinComponent are suitable for the\n    alchemical protocol.\n\n    Parameters\n    ----------\n    state : ChemicalSystem\n      The chemical system to inspect.\n\n    Raises\n    ------\n    ValueError\n      If there are multiple ProteinComponent in the ChemicalSystem.\n    \"\"\"\n    prot_comps = state.get_components_of_type(ProteinComponent)\n\n    if len(prot_comps) > 1:\n        errmsg = \"Multiple ProteinComponent found, only one is supported\"\n        raise ValueError(errmsg)\n\n\ndef validate_barostat(state: ChemicalSystem, barostat: str):\n    \"\"\"\n    Warn if there is a mismatch between the protein component type and barostat.\n\n    A ProteinMembraneComponent should generally be simulated with a\n    MonteCarloMembraneBarostat, while non-membrane protein systems should\n    use a MonteCarloBarostat.\n\n    Parameters\n    ----------\n    state : ChemicalSystem\n      The chemical system to inspect.\n    barostat: str\n      The barostat to be applied to the simulation\n    \"\"\"\n    prot_comps = state.get_components_of_type(ProteinComponent)\n    protein_membrane = state.get_components_of_type(ProteinMembraneComponent)\n\n    if not prot_comps:\n        return\n\n    if protein_membrane:\n        if barostat != \"MonteCarloMembraneBarostat\":\n            wmsg = (\n                \"A ProteinMembraneComponent is present, but a membrane-specific \"\n                \"barostat (MonteCarloMembraneBarostat) is not specified. If you \"\n                \"are simulating a system with a membrane, consider using \"\n                \"integrator_settings.barostat='MonteCarloMembraneBarostat'.\"\n            )\n            warnings.warn(wmsg)\n            logger.warning(wmsg)\n\n    elif barostat == \"MonteCarloMembraneBarostat\":\n        wmsg = (\n            \"A MonteCarloMembraneBarostat is specified, but no \"\n            \"ProteinMembraneComponent is present. If you are not simulating a \"\n            \"membrane system, consider using \"\n            \"integrator_settings.barostat='MonteCarloBarostat'.\"\n        )\n        warnings.warn(wmsg)\n        logger.warning(wmsg)\n\n\nParseCompRet = Tuple[\n    Optional[SolventComponent],\n    Optional[ProteinComponent],\n    list[SmallMoleculeComponent],\n]\n\n\ndef get_components(state: ChemicalSystem) -> ParseCompRet:\n    \"\"\"\n    Establish all necessary Components for the transformation.\n\n    Parameters\n    ----------\n    state : ChemicalSystem\n      ChemicalSystem to get all necessary components from.\n\n    Returns\n    -------\n    solvent_comp : Optional[SolventComponent]\n      If it exists, the SolventComponent for the state, otherwise None.\n    protein_comp : Optional[ProteinComponent]\n      If it exists, the ProteinComponent for the state, otherwise None.\n    small_mols : list[SmallMoleculeComponent]\n    \"\"\"\n\n    def _get_single_comps(state, comptype):\n        comps = state.get_components_of_type(comptype)\n\n        if len(comps) > 0:\n            return comps[0]\n        else:\n            return None\n\n    solvent_comp: Optional[SolventComponent] = _get_single_comps(state, SolventComponent)\n\n    protein_comp: Optional[ProteinComponent] = _get_single_comps(state, ProteinComponent)\n\n    small_mols = state.get_components_of_type(SmallMoleculeComponent)\n\n    return solvent_comp, protein_comp, small_mols\n\n\ndef assert_multistate_system_equality(\n    ref_system: openmm.System,\n    stored_system: openmm.System,\n):\n    \"\"\"\n    Verify the equality of a MultiStateReporter\n    stored system, with that of a pre-exisiting\n    standard system.\n\n\n    Raises\n    ------\n    ValueError\n      * If the particles in the two System don't match.\n      * If the constraints in the two System don't match.\n      * If the forces in the two systems don't match.\n    \"\"\"\n\n    # Assert particle equality\n    def _get_masses(system):\n        return np.array(\n            [\n                system.getParticleMass(i).value_in_unit(openmm.unit.dalton)\n                for i in range(system.getNumParticles())\n            ]\n        )\n\n    ref_masses = _get_masses(ref_system)\n    stored_masses = _get_masses(stored_system)\n\n    if not ((ref_masses.shape == stored_masses.shape) and (np.allclose(ref_masses, stored_masses))):\n        errmsg = \"Stored checkpoint System particles do not match those of the simulated System\"\n        raise ValueError(errmsg)\n\n    # Assert constraint equality\n    def _get_constraints(system):\n        constraints = []\n        for index in range(system.getNumConstraints()):\n            i, j, d = system.getConstraintParameters(index)\n            constraints.append([i, j, d.value_in_unit(openmm.unit.nanometer)])\n\n        return np.array(constraints)\n\n    ref_constraints = _get_constraints(ref_system)\n    stored_constraints = _get_constraints(stored_system)\n\n    if not (\n        (ref_constraints.shape == stored_constraints.shape)\n        and (np.allclose(ref_constraints, stored_constraints))\n    ):\n        errmsg = \"Stored checkpoint System constraints do not match those of the simulation System\"\n        raise ValueError(errmsg)\n\n    # Assert force equality\n    # Notes:\n    # * Store forces are in different order\n    # * The barostat doesn't exactly match because seeds have changed\n\n    # Create dictionaries of forces keyed by their hash\n    # Note: we can't rely on names because they may clash\n    ref_force_dict = {hash(openmm.XmlSerializer.serialize(f)): f for f in ref_system.getForces()}\n    stored_force_dict = {\n        hash(openmm.XmlSerializer.serialize(f)): f for f in stored_system.getForces()\n    }\n\n    # Assert the number of forces is equal\n    if len(ref_force_dict) != len(stored_force_dict):\n        errmsg = \"Number of forces stored in checkpoint System does not match simulation System\"\n        raise ValueError(errmsg)\n\n    # Loop through forces and check for equality\n    for sfhash, sforce in stored_force_dict.items():\n        # Barostat case - seed changed so we need to check manually\n        if isinstance(sforce, (openmm.MonteCarloBarostat, openmm.MonteCarloMembraneBarostat)):\n            # Find the equivalent force in the reference\n            rforce = [\n                f\n                for f in ref_force_dict.values()\n                if isinstance(f, (openmm.MonteCarloBarostat, openmm.MonteCarloMembraneBarostat))\n            ][0]\n\n            if (\n                (sforce.getFrequency() != rforce.getFrequency())\n                or (sforce.getForceGroup() != rforce.getForceGroup())\n                or (sforce.getDefaultPressure() != rforce.getDefaultPressure())\n                or (sforce.getDefaultTemperature() != rforce.getDefaultTemperature())\n            ):\n                errmsg = (\n                    f\"Barostat Force {sforce.getName()} in the stored checkpoint \"\n                    \"System does not match the same force in the simulated System.\"\n                )\n                raise ValueError(errmsg)\n\n        else:\n            if sfhash not in ref_force_dict:\n                msg = (\n                    f\"Force {sforce.getName()} in the stored checkpoint System \"\n                    \"does not exactly match one of the forces in the simulated System \"\n                    \"this may be due to machine precision issues.\"\n                )\n                logger.info(msg)\n\n\ndef validate_chemical_system(system: ChemicalSystem):\n    \"\"\"\n    Validate that the input ChemicalSystem is suitable for use in an OpenMM-based\n    alchemical protocol.\n\n    Parameters\n    ----------\n    state : ChemicalSystem\n      The chemical system to validate.\n\n    Raises\n    ------\n    ComponentValidationError\n      If any component in the ChemicalSystem fails validation.\n    \"\"\"\n    for entry in system.components:\n        try:\n            system.components[entry].validate()\n        except ComponentValidationError as e:\n            errmsg = f\"Component {entry} from ChemicalSystem {system.name} failed validation: {e}\"\n            raise ComponentValidationError(errmsg)\n"
  },
  {
    "path": "src/openfe/protocols/restraint_utils/__init__.py",
    "content": ""
  },
  {
    "path": "src/openfe/protocols/restraint_utils/geometry/__init__.py",
    "content": "from .base import BaseRestraintGeometry, HostGuestRestraintGeometry\nfrom .boresch import BoreschRestraintGeometry\nfrom .flatbottom import FlatBottomDistanceGeometry\nfrom .harmonic import DistanceRestraintGeometry\n"
  },
  {
    "path": "src/openfe/protocols/restraint_utils/geometry/base.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\n\"\"\"\nRestraint Geometry classes\n\nTODO\n----\n* Add relevant duecredit entries.\n\"\"\"\n\nimport abc\n\nfrom pydantic import BaseModel, ConfigDict, field_validator\n\n\nclass BaseRestraintGeometry(BaseModel, abc.ABC):\n    \"\"\"\n    A base class for a restraint geometry.\n    \"\"\"\n\n    model_config = ConfigDict(arbitrary_types_allowed=True)\n\n\nclass HostGuestRestraintGeometry(BaseRestraintGeometry):\n    \"\"\"\n    An ordered list of guest atoms to restrain.\n\n    Note\n    ----\n    The order matters! It will be used to define the underlying\n    force.\n    \"\"\"\n\n    guest_atoms: list[int]\n    \"\"\"\n    An ordered list of host atoms to restrain.\n\n    Note\n    ----\n    The order matters! It will be used to define the underlying\n    force.\n    \"\"\"\n    host_atoms: list[int]\n\n    @field_validator(\"guest_atoms\", \"host_atoms\")\n    def positive_idxs(cls, v):\n        if v is not None and any([i < 0 for i in v]):  # TODO: when would None be valid here?\n            errmsg = \"negative indices passed\"\n            raise ValueError(errmsg)\n        return v\n"
  },
  {
    "path": "src/openfe/protocols/restraint_utils/geometry/boresch/__init__.py",
    "content": "from .geometry import (\n    BoreschRestraintGeometry,\n    find_boresch_restraint,\n    find_guest_atom_candidates,\n)\n"
  },
  {
    "path": "src/openfe/protocols/restraint_utils/geometry/boresch/geometry.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\n\"\"\"\nRestraint Geometry classes\n\nTODO\n----\n* Add relevant duecredit entries.\n\"\"\"\n\nfrom typing import Annotated, Literal, Optional, TypeAlias\n\nimport MDAnalysis as mda\nfrom gufe.settings.typing import GufeQuantity, NanometerQuantity, specify_quantity_units\nfrom MDAnalysis.lib.distances import calc_angles, calc_bonds, calc_dihedrals\nfrom openff.units import Quantity, unit\nfrom rdkit import Chem\n\nfrom openfe.protocols.restraint_utils.geometry.base import HostGuestRestraintGeometry\n\nfrom .guest import find_guest_atom_candidates\nfrom .host import (\n    find_host_anchor_bonded,\n    find_host_anchor_multi,\n    find_host_atom_candidates,\n)\n\nRadiansQuantity: TypeAlias = Annotated[GufeQuantity, specify_quantity_units(\"radians\")]\n\n\nclass BoreschRestraintGeometry(HostGuestRestraintGeometry):\n    \"\"\"\n    A class that defines the restraint geometry for a Boresch restraint.\n\n    The restraint is defined by the following:\n\n      H2                         G2\n       -                        -\n        -                      -\n         H1 - - H0 -- G0 - - G1\n\n    Where HX represents the X index of ``host_atoms`` and GX\n    the X index of ``guest_atoms``.\n    \"\"\"\n\n    r_aA0: NanometerQuantity\n    \"\"\"\n    The equilibrium distance between H0 and G0.\n    \"\"\"\n    theta_A0: RadiansQuantity\n    \"\"\"\n    The equilibrium angle value between H1, H0, and G0.\n    \"\"\"\n    theta_B0: RadiansQuantity\n    \"\"\"\n    The equilibrium angle value between H0, G0, and G1.\n    \"\"\"\n    phi_A0: RadiansQuantity\n    \"\"\"\n    The equilibrium dihedral value between H2, H1, H0, and G0.\n    \"\"\"\n    phi_B0: RadiansQuantity\n\n    \"\"\"\n    The equilibrium dihedral value between H1, H0, G0, and G1.\n    \"\"\"\n    phi_C0: RadiansQuantity\n\n    \"\"\"\n    The equilibrium dihedral value between H0, G0, G1, and G2.\n    \"\"\"\n\n\ndef _get_restraint_distances(\n    atomgroup: mda.AtomGroup,\n) -> tuple[Quantity, Quantity, Quantity, Quantity, Quantity, Quantity]:\n    \"\"\"\n    Get the bond, angle, and dihedral distances for an input atomgroup\n    defining the six atoms for a Boresch-like restraint.\n\n    The atoms must be in the order of H0, H1, H2, G0, G1, G2.\n\n    Parameters\n    ----------\n    atomgroup : mda.AtomGroup\n      An AtomGroup defining the restrained atoms in order.\n\n    Returns\n    -------\n    bond : openff.units.Quantity\n      The H0-G0 bond value.\n    angle1 : openff.units.Quantity\n      The H1-H0-G0 angle value.\n    angle2 : openff.units.Quantity\n      The H0-G0-G1 angle value.\n    dihed1 : openff.units.Quantity\n      The H2-H1-H0-G0 dihedral value.\n    dihed2 : openff.units.Quantity\n      The H1-H0-G0-G1 dihedral value.\n    dihed3 : openff.units.Quantity\n      The H0-G0-G1-G2 dihedral value.\n    \"\"\"\n    bond = (\n        calc_bonds(\n            atomgroup.atoms[0].position,\n            atomgroup.atoms[3].position,\n            box=atomgroup.dimensions,\n        )\n        * unit.angstroms\n    )\n\n    angles = []\n    for idx_set in [[1, 0, 3], [0, 3, 4]]:\n        angle = calc_angles(\n            atomgroup.atoms[idx_set[0]].position,\n            atomgroup.atoms[idx_set[1]].position,\n            atomgroup.atoms[idx_set[2]].position,\n            box=atomgroup.dimensions,\n        )\n        angles.append(angle * unit.radians)\n\n    dihedrals = []\n    for idx_set in [[2, 1, 0, 3], [1, 0, 3, 4], [0, 3, 4, 5]]:\n        dihed = calc_dihedrals(\n            atomgroup.atoms[idx_set[0]].position,\n            atomgroup.atoms[idx_set[1]].position,\n            atomgroup.atoms[idx_set[2]].position,\n            atomgroup.atoms[idx_set[3]].position,\n            box=atomgroup.dimensions,\n        )\n        dihedrals.append(dihed * unit.radians)\n\n    return bond, angles[0], angles[1], dihedrals[0], dihedrals[1], dihedrals[2]\n\n\ndef find_boresch_restraint(\n    universe: mda.Universe,\n    guest_rdmol: Chem.Mol,\n    guest_idxs: list[int],\n    host_idxs: list[int],\n    guest_restraint_atoms_idxs: Optional[list[int]] = None,\n    host_restraint_atoms_idxs: Optional[list[int]] = None,\n    host_selection: str = \"all\",\n    anchor_finding_strategy: Literal[\"multi-residue\", \"bonded\"] = \"multi-residue\",\n    dssp_filter: bool = False,\n    rmsf_cutoff: Quantity = 0.1 * unit.nanometer,\n    host_min_distance: Quantity = 1 * unit.nanometer,\n    host_max_distance: Quantity = 3 * unit.nanometer,\n    angle_force_constant: Quantity = (83.68 * unit.kilojoule_per_mole / unit.radians**2),\n    temperature: Quantity = 298.15 * unit.kelvin,\n) -> BoreschRestraintGeometry:\n    \"\"\"\n    Find suitable Boresch-style restraints between a host and guest entity\n    based on the approach of Baumann et al. [1] with some modifications.\n\n    Parameters\n    ----------\n    universe : mda.Universe\n      An MDAnalysis Universe defining the system and its coordinates.\n    guest_rdmol : Chem.Mol\n      An RDKit Mol for the guest molecule.\n    guest_idxs : list[int]\n      Indices in the topology for the guest molecule.\n    host_idxs : list[int]\n      Indices in the topology for the host molecule.\n    guest_restraint_atoms_idxs : Optional[list[int]]\n      User selected indices of the guest molecule itself (i.e. indexed\n      starting a 0 for the guest molecule). This overrides the\n      restraint search and a restraint using these indices will\n      be returned. Must be defined alongside ``host_restraint_atoms_idxs``.\n    host_restraint_atoms_idxs : Optional[list[int]]\n      User selected indices of the host molecule itself (i.e. indexed\n      starting a 0 for the hosts molecule). This overrides the\n      restraint search and a restraint using these indices will\n      be returned. Must be defined alongside ``guest_restraint_atoms_idxs``.\n    host_selection : str\n      An MDAnalysis selection string to sub-select the host atoms.\n    anchor_finding_strategy: Literal['multi-residue', 'bonded']\n      How host anchor atoms are found. Default `multi-residue`, attempts\n      to find host anchors across multiple residues.\n    dssp_filter : bool\n      Whether or not to filter the host atoms by their secondary structure.\n    rmsf_cutoff : openff.units.Quantity\n      The cutoff value for atom root mean square fluctuation. Atoms with RMSF\n      values above this cutoff will be disregarded.\n      Must be in units compatible with nanometer.\n    host_min_distance : openff.units.Quantity\n      The minimum distance between any host atom and the guest G0 atom.\n      Must be in units compatible with nanometer.\n    host_max_distance : openff.units.Quantity\n      The maximum distance between any host atom and the guest G0 atom.\n      Must be in units compatible with nanometer.\n    angle_force_constant : openff.units.Quantity\n      The force constant for the G1-G0-H0 and G0-H0-H1 angles. Must be\n      in units compatible with kilojoule / mole / radians ** 2.\n    temperature : openff.units.Quantity\n      The system temperature in units compatible with Kelvin.\n\n    Returns\n    -------\n    BoreschRestraintGeometry\n      An object defining the parameters of the Boresch-like restraint.\n\n    References\n    ----------\n    [1] Baumann, Hannah M., et al. \"Broadening the scope of binding free energy\n        calculations using a Separated Topologies approach.\" (2023).\n    \"\"\"\n    if (guest_restraint_atoms_idxs is not None) and (host_restraint_atoms_idxs is not None):  # fmt: skip\n        # In this case assume the picked atoms were intentional /\n        # representative of the input and go with it\n        guest_ag = universe.atoms[guest_idxs]\n        guest_atoms = [at.ix for at in guest_ag.atoms[guest_restraint_atoms_idxs]]\n        host_ag = universe.atoms[host_idxs]\n        host_atoms = [at.ix for at in host_ag.atoms[host_restraint_atoms_idxs]]\n\n        # Set the equilibrium values as those of the final frame\n        universe.trajectory[-1]\n        atomgroup = universe.atoms[host_atoms + guest_atoms]\n        bond, ang1, ang2, dih1, dih2, dih3 = _get_restraint_distances(atomgroup)\n\n        # TODO: add checks to warn if this is a badly picked\n        # set of atoms.\n        return BoreschRestraintGeometry(\n            host_atoms=host_atoms,\n            guest_atoms=guest_atoms,\n            r_aA0=bond,\n            theta_A0=ang1,\n            theta_B0=ang2,\n            phi_A0=dih1,\n            phi_B0=dih2,\n            phi_C0=dih3,\n        )\n\n    if (guest_restraint_atoms_idxs is not None) ^ (host_restraint_atoms_idxs is not None):  # fmt: skip\n        # This is not an intended outcome, crash out here\n        errmsg = (\n            \"both ``guest_restraints_atoms_idxs`` and \"\n            \"``host_restraint_atoms_idxs`` \"\n            \"must be set or both must be None. \"\n            f\"Got {guest_restraint_atoms_idxs} and {host_restraint_atoms_idxs}\"\n        )\n        raise ValueError(errmsg)\n\n    # 1. Fetch the guest anchors\n    guest_anchors = find_guest_atom_candidates(\n        universe=universe,\n        rdmol=guest_rdmol,\n        guest_idxs=guest_idxs,\n        rmsf_cutoff=rmsf_cutoff,\n    )\n\n    if len(guest_anchors) == 0:\n        errmsg = \"No suitable ligand atoms found for the restraint.\"\n        raise ValueError(errmsg)\n\n    # 2. We then loop through the guest anchors to find suitable host atoms\n    for guest_anchor in guest_anchors:\n        # We next fetch the host atom pool\n        # Note: return is a set, so need to convert it later on\n        host_pool = find_host_atom_candidates(\n            universe=universe,\n            host_idxs=host_idxs,\n            guest_anchor_idx=guest_anchor[0],\n            host_selection=host_selection,\n            dssp_filter=dssp_filter,\n            rmsf_cutoff=rmsf_cutoff,\n            min_search_distance=host_min_distance,\n            max_search_distance=host_max_distance,\n        )\n\n        if anchor_finding_strategy == \"multi-residue\":\n            host_anchor = find_host_anchor_multi(\n                guest_atoms=universe.atoms[list(guest_anchor)],\n                host_atom_pool=universe.atoms[list(host_pool)],\n                host_minimum_distance=0.5 * unit.nanometer,\n                # TODO: work out a rename for this, it's confusing\n                guest_minimum_distance=host_min_distance,\n                angle_force_constant=angle_force_constant,\n                temperature=temperature,\n            )\n        elif anchor_finding_strategy == \"bonded\":\n            host_anchor = find_host_anchor_bonded(\n                guest_atoms=universe.atoms[list(guest_anchor)],\n                host_atom_pool=universe.atoms[list(host_pool)],\n                guest_minimum_distance=host_min_distance,\n                angle_force_constant=angle_force_constant,\n                temperature=temperature,\n            )\n        else:\n            # We're doing something we shouldn't be\n            errmsg = f\"Unknown anchor finding strategy: {anchor_finding_strategy}\"\n            raise NotImplementedError(errmsg)\n\n        # continue if it's empty, otherwise stop\n        if host_anchor is not None:\n            break\n\n    if host_anchor is None:\n        errmsg = \"No suitable host atoms could be found\"\n        raise ValueError(errmsg)\n\n    # Set the equilibrium values as those of the final frame\n    universe.trajectory[-1]\n    atomgroup = universe.atoms[list(host_anchor) + list(guest_anchor)]\n    bond, ang1, ang2, dih1, dih2, dih3 = _get_restraint_distances(atomgroup)\n\n    return BoreschRestraintGeometry(\n        host_atoms=list(host_anchor),\n        guest_atoms=list(guest_anchor),\n        r_aA0=bond,\n        theta_A0=ang1,\n        theta_B0=ang2,\n        phi_A0=dih1,\n        phi_B0=dih2,\n        phi_C0=dih3,\n    )\n"
  },
  {
    "path": "src/openfe/protocols/restraint_utils/geometry/boresch/guest.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\n\"\"\"\nRestraint Geometry classes\n\nTODO\n----\n* Add relevant duecredit entries.\n\"\"\"\n\nfrom typing import Iterable, Optional\n\nimport MDAnalysis as mda\nfrom openff.units import Quantity, unit\nfrom rdkit import Chem\n\nfrom openfe.protocols.restraint_utils.geometry.utils import (\n    get_aromatic_rings,\n    get_central_atom_idx,\n    get_heavy_atom_idxs,\n    get_local_rmsf,\n    is_collinear,\n)\n\n\ndef _sort_by_distance_from_atom(\n    rdmol: Chem.Mol, target_idx: int, atom_idxs: Iterable[int]\n) -> list[int]:\n    \"\"\"\n    Sort a list of RDMol atoms by their distance from a target atom.\n\n    Parameters\n    ----------\n    rdmol : Chem.Mol\n      RDKit Molecule the atoms belong to.\n    target_idx : int\n      The idx of the atom to measure from.\n    atom_idxs : list[int]\n      The idx values of the atoms to sort.\n\n    Returns\n    -------\n    list[int]\n      The input atom idxs sorted by their distance from the target atom.\n    \"\"\"\n    distances = []\n\n    conformer = rdmol.GetConformer()\n    # Get the target atom position\n    target_pos = conformer.GetAtomPosition(target_idx)\n\n    for idx in atom_idxs:\n        pos = conformer.GetAtomPosition(idx)\n        distances.append(((target_pos - pos).Length(), idx))\n\n    return [i[1] for i in sorted(distances)]\n\n\ndef _bonded_angles_from_pool(\n    rdmol: Chem.Mol,\n    atom_idx: int,\n    atom_pool: list[int],\n    aromatic_only: bool,\n) -> list[tuple[int, int, int]]:\n    \"\"\"\n    Get all bonded angles starting from ``atom_idx`` from a pool of atoms.\n\n    Parameters\n    ----------\n    rdmol : Chem.Mol\n      The RDKit Molecule\n    atom_idx : int\n      The index of the atom to search angles from.\n    atom_pool : list[int]\n      The list of indices to pick possible angle partners from.\n    aromatic_only : bool\n      Prune any angles that include non-aromatic bonds.\n\n    Returns\n    -------\n    list[tuple[int, int, int]]\n      A list of tuples containing all the angles.\n\n    Notes\n    -----\n    * In the original SepTop code at3 is picked as directly bonded to at1.\n      By comparison here we instead follow the case that at3 is bonded to\n      at2 but not bonded to at1.\n    \"\"\"\n    angles = []\n\n    # Get the base atom and its neighbors\n    at1 = rdmol.GetAtomWithIdx(atom_idx)\n    at1_neighbors = [at.GetIdx() for at in at1.GetNeighbors()]\n\n    # We loop at2 and at3 through the sorted atom_pool in order to get\n    # a list of angles in the branch that are sorted by how close the atoms\n    # are from the central atom\n    for at2 in atom_pool:\n        if at2 in at1_neighbors:\n            at2_neighbors = [at.GetIdx() for at in rdmol.GetAtomWithIdx(at2).GetNeighbors()]\n            for at3 in atom_pool:\n                if at3 != atom_idx and at3 in at2_neighbors:\n                    angles.append((atom_idx, at2, at3))\n\n    if aromatic_only:  # TODO: move this to its own method?\n        aromatic_rings = get_aromatic_rings(rdmol)\n\n        def _belongs_to_ring(angle, aromatic_rings):\n            for ring in aromatic_rings:\n                if all(a in ring for a in angle):\n                    return True\n            return False\n\n        # build a list of angles to remove\n        angles_to_remove = [\n            angle for angle in angles if not _belongs_to_ring(angle, aromatic_rings)\n        ]\n        for angle in angles_to_remove:\n            angles.remove(angle)\n\n    return angles\n\n\ndef _get_guest_atom_pool(\n    rdmol: Chem.Mol,\n    rmsf,  #: ArrayQuantity, TODO: new pydantic v2-compatible quantity needed here.\n    rmsf_cutoff: Quantity,\n) -> tuple[Optional[set[int]], bool]:\n    \"\"\"\n    Filter atoms based on rmsf & rings, defaulting to heavy atoms if\n    there are not enough.\n\n    Parameters\n    ----------\n    rdmol : Chem.Mol\n      The RDKit Molecule to search through\n    rmsf : Quantity\n      A 1-D Quantity array of RMSF values for each atom.\n    rmsf_cutoff : openff.units.Quantity\n      The rmsf cutoff value for selecting atoms in units compatible with\n      nanometer.\n\n    Returns\n    -------\n    atom_pool : Optional[set[int]]\n      A pool of candidate atoms.\n    ring_atoms_only : bool\n      True if only ring atoms were selected.\n    \"\"\"\n    # Get a list of all the aromatic rings\n    # Note: no need to keep track of rings because we'll filter by\n    # bonded terms after, so if we only keep rings then all the bonded\n    # atoms should be within the same ring system.\n    atom_pool: set[int] = set()\n    ring_atoms_only: bool = True\n    for ring in get_aromatic_rings(rdmol):\n        max_rmsf = rmsf[list(ring)].max()\n        if max_rmsf < rmsf_cutoff:\n            atom_pool.update(ring)\n\n    # if we don't have enough atoms just get all the heavy atoms\n    if len(atom_pool) < 3:\n        ring_atoms_only = False\n        heavy_atoms = get_heavy_atom_idxs(rdmol)\n        atom_pool = set(idx for idx in heavy_atoms if rmsf[idx] < rmsf_cutoff)\n        if len(atom_pool) < 3:\n            return None, False\n\n    return atom_pool, ring_atoms_only\n\n\ndef find_guest_atom_candidates(\n    universe: mda.Universe,\n    rdmol: Chem.Mol,\n    guest_idxs: list[int],\n    rmsf_cutoff: Quantity = 1 * unit.nanometer,\n) -> list[tuple[int, int, int]]:\n    \"\"\"\n    Get a list of potential ligand atom choices for a Boresch restraint\n    being applied to a given small molecule.\n\n    Parameters\n    ----------\n    universe : mda.Universe\n      An MDAnalysis Universe defining the system and its coordinates.\n    rdmol : Chem.Mol\n      An RDKit Molecule representing the small molecule ordered in\n      the same way as it is listed in the topology.\n    guest_idxs : list[int]\n      The ligand indices in the topology.\n    rmsf_cutoff : openff.units.Quantity\n      The RMSF filter cut-off.\n\n    Returns\n    -------\n    angle_list : list[tuple[int]]\n      A list of tuples for each valid G0, G1, G2 angle. If ``None``, no\n      angles could be found.\n\n    Raises\n    ------\n    ValueError\n      If no suitable ligand atoms could be found.\n\n    TODO\n    ----\n    Should the RDMol have a specific frame position?\n    \"\"\"\n    ligand_ag = universe.atoms[guest_idxs]\n\n    # 0. Get the ligand RMSF\n    rmsf = get_local_rmsf(ligand_ag)\n    universe.trajectory[-1]  # forward to the last frame\n\n    # 1. Get the pool of atoms to work with\n    atom_pool, rings_only = _get_guest_atom_pool(rdmol, rmsf, rmsf_cutoff)\n\n    if atom_pool is None:\n        # We don't have enough atoms so we raise an error\n        errmsg = \"No suitable ligand atoms were found for the restraint\"\n        raise ValueError(errmsg)\n\n    # 2. Get the central atom\n    center = get_central_atom_idx(rdmol)\n\n    # 3. Sort the atom pool based on their distance from the center\n    sorted_atom_pool = _sort_by_distance_from_atom(rdmol, center, atom_pool)\n\n    # 4. Get a list of probable angles\n    angles_list = []\n    for atom in sorted_atom_pool:\n        angles = _bonded_angles_from_pool(\n            rdmol=rdmol,\n            atom_idx=atom,\n            atom_pool=sorted_atom_pool,\n            aromatic_only=rings_only,\n        )\n        for angle in angles:\n            # Check that the angle is at least not collinear\n            angle_ag = ligand_ag.atoms[list(angle)]\n            if not is_collinear(ligand_ag.positions, angle, universe.dimensions):\n                angles_list.append(\n                    (angle_ag.atoms[0].ix, angle_ag.atoms[1].ix, angle_ag.atoms[2].ix)\n                )\n\n    return angles_list\n"
  },
  {
    "path": "src/openfe/protocols/restraint_utils/geometry/boresch/host.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\n\"\"\"\nRestraint Geometry classes\n\nTODO\n----\n* Add relevant duecredit entries.\n\"\"\"\n\nimport warnings\nfrom typing import Optional\n\nimport MDAnalysis as mda\nimport numpy as np\nimport numpy.typing as npt\nfrom MDAnalysis.analysis.base import AnalysisBase\nfrom MDAnalysis.lib.distances import calc_angles, calc_bonds, calc_dihedrals\nfrom openff.units import Quantity, unit\nfrom scipy.stats import circvar\n\nfrom openfe.protocols.restraint_utils.geometry.utils import (\n    CentroidDistanceSort,\n    FindHostAtoms,\n    check_angle_not_flat,\n    check_angular_variance,\n    check_dihedral_bounds,\n    get_local_rmsf,\n    is_collinear,\n    protein_chain_selection,\n    stable_secondary_structure_selection,\n)\n\n\ndef _host_atoms_search(\n    atomgroup: mda.AtomGroup,\n    guest_anchor_idx: int,\n    rmsf_cutoff: Quantity,\n    min_search_distance: Quantity,\n    max_search_distance: Quantity,\n) -> npt.NDArray:\n    \"\"\"\n    Helper method to get a set of host atoms with minimal RMSF\n    within a given distance of a guest anchor.\n\n    Parameters\n    ----------\n    atomgroup : mda.AtomGroup\n      An AtomGroup to find host atoms in.\n    guest_anchor_idx : int\n      The index of the proposed guest anchor binding atom.\n    rmsf_cutoff : Quantity\n      The maximum allowed RMSF value for any candidate host atom.\n    min_search_distance : Quantity\n      The minimum host atom search distance around the guest anchor.\n    max_search_distance : Quantity\n      The maximum host atom search distance around the guest anchor.\n\n    Return\n    ------\n    NDArray\n      Array of host atom indexes\n    \"\"\"\n    # 0 Deal with the empty case\n    if len(atomgroup) == 0:\n        return np.array([], dtype=int)\n\n    # 1 Get the RMSF & filter to create a new AtomGroup\n    rmsf = get_local_rmsf(atomgroup)\n    filtered_atomgroup = atomgroup.atoms[rmsf < rmsf_cutoff]\n\n    # 2. Search for atoms within the min/max cutoff of the guest anchor\n    atom_finder = FindHostAtoms(\n        host_atoms=filtered_atomgroup,\n        guest_atoms=atomgroup.universe.atoms[guest_anchor_idx],\n        min_search_distance=min_search_distance,\n        max_search_distance=max_search_distance,\n    )\n    atom_finder.run()\n\n    return atom_finder.results.host_idxs\n\n\ndef find_host_atom_candidates(\n    universe: mda.Universe,\n    host_idxs: list[int],\n    guest_anchor_idx: int,\n    host_selection: str,\n    dssp_filter: bool = False,\n    rmsf_cutoff: Quantity = 0.1 * unit.nanometer,\n    min_search_distance: Quantity = 0.5 * unit.nanometer,\n    max_search_distance: Quantity = 1.5 * unit.nanometer,\n) -> npt.NDArray:\n    \"\"\"\n    Get a list of suitable host atoms.\n\n    Parameters\n    ----------\n    universe : mda.Universe\n      An MDAnalysis Universe defining the system and its coordinates.\n    host_idxs : list[int]\n      A list of the host indices in the system topology.\n    guest_anchor_idx : int\n      The index of the proposed l1 binding atom.\n    host_selection : str\n      An MDAnalysis selection string to filter the host by.\n    dssp_filter : bool\n      Whether or not to apply a DSSP filter on the host selection.\n    rmsf_cutoff : openff.units.Quantity\n      The maximum RMSF value allowed for any candidate host atom.\n    min_search_distance : openff.units.Quantity\n      The minimum search distance around l1 for suitable candidate atoms.\n    max_search_distance : openff.units.Quantity\n      The maximum search distance around l1 for suitable candidate atoms.\n\n    Return\n    ------\n    NDArray\n      Array of host atom indexes sorted by distance from `guest_anchor_idx`\n    \"\"\"\n    # Get an AtomGroup for the host based on the input host indices\n    host_ag = universe.atoms[host_idxs]\n\n    # Filter the host AtomGroup based on ``host_selection`\n    selected_host_ag = host_ag.select_atoms(host_selection)\n\n    # If the host_selection does not work, raise an error\n    if len(selected_host_ag) < 3:\n        errmsg = (\n            \"Boresch-like restraint generation: \"\n            f\"too few atoms selected by ``host_selection``: {host_selection}\"\n        )\n        raise ValueError(errmsg)\n\n    # None filtered_host_ixs for condition checking later\n    filtered_host_idxs = None\n\n    # If requested, filter the host atoms based on if their residues exist\n    # within stable secondary structures.\n    if dssp_filter:\n        # TODO: allow more user-supplied kwargs here\n        filtered_host_idxs = _host_atoms_search(\n            atomgroup=stable_secondary_structure_selection(selected_host_ag),\n            guest_anchor_idx=guest_anchor_idx,\n            rmsf_cutoff=rmsf_cutoff,\n            min_search_distance=min_search_distance,\n            max_search_distance=max_search_distance,\n        )\n\n        if len(filtered_host_idxs) < 20:\n            wmsg = (\n                \"Restraint generation: DSSP filter found too few host atoms \"\n                f\"({len(filtered_host_idxs)} found). Will attempt to use all protein chains.\"\n            )\n            warnings.warn(wmsg)\n            filtered_host_idxs = _host_atoms_search(\n                atomgroup=protein_chain_selection(selected_host_ag),\n                guest_anchor_idx=guest_anchor_idx,\n                rmsf_cutoff=rmsf_cutoff,\n                min_search_distance=min_search_distance,\n                max_search_distance=max_search_distance,\n            )\n\n        if len(filtered_host_idxs) < 20:\n            wmsg = (\n                \"Restraint generation: protein chain filter found too few \"\n                f\"host atoms ({len(filtered_host_idxs)} found). Will attempt to use all host atoms in \"\n                f\"selection: {host_selection}.\"\n            )\n            warnings.warn(wmsg)\n            filtered_host_idxs = None\n\n    if filtered_host_idxs is None:\n        filtered_host_idxs = _host_atoms_search(\n            atomgroup=selected_host_ag,\n            guest_anchor_idx=guest_anchor_idx,\n            rmsf_cutoff=rmsf_cutoff,\n            min_search_distance=min_search_distance,\n            max_search_distance=max_search_distance,\n        )\n\n    # Crash out if no atoms were found\n    if len(filtered_host_idxs) == 0:\n        errmsg = (\n            f\"No host atoms found within the search distance \"\n            f\"{min_search_distance}-{max_search_distance}. Consider widening the search window.\"\n        )\n        raise ValueError(errmsg)\n\n    # Now we sort them by their distance from the guest anchor\n    atom_sorter = CentroidDistanceSort(\n        sortable_atoms=universe.atoms[filtered_host_idxs],\n        reference_atoms=universe.atoms[guest_anchor_idx],\n    )\n    atom_sorter.run()\n\n    return atom_sorter.results.sorted_atomgroup.ix\n\n\nclass EvaluateBoreschAtoms(AnalysisBase):\n    \"\"\"\n    Class to evaluate the geometric suitability of Boresch restraints.\n\n    Parameters\n    ----------\n    restraints : list[MDAnalysis.AtomGroup]\n      A list of AtomGroup defining the H2-H1-H0-G0-G1-G2 atoms,\n      in that order.\n    angle_force_constant : openff.units.Quantity\n      The force constant for the angle.\n    temperature : openff.units.Quantity\n      The system temperature in units compatible with Kelvin.\n    \"\"\"\n\n    def __init__(\n        self,\n        restraints: list[mda.AtomGroup],\n        angle_force_constant: Quantity,\n        temperature: Quantity,\n        **kwargs,\n    ):\n        if len(restraints) < 1:\n            errmsg = \"Need to have at least one restraint\"\n            raise ValueError(errmsg)\n\n        super().__init__(restraints[0].universe.trajectory, **kwargs)\n\n        if not all(len(rest) == 6 for rest in restraints):\n            errmsg = \"Incorrect number of restraint atoms passed\"\n            raise ValueError(errmsg)\n\n        self.restraints = restraints\n        self.angle_force_constant = angle_force_constant\n        self.temperature = temperature\n\n    def _prepare(self):\n        nrests = len(self.restraints)\n        # Whether or not the restraint is valid\n        self.results.valid = np.ones((nrests), dtype=bool)\n        # Containers\n        self.results.collinear = np.empty((nrests, self.n_frames), dtype=bool)\n        self.results.bonds = np.zeros((nrests, self.n_frames))\n        self.results.angles = np.zeros((nrests, 2, self.n_frames))\n        self.results.dihedrals = np.zeros((nrests, 3, self.n_frames))\n\n    def _single_frame(self):\n        # Loop through all the restraints and gather bond / angle info.\n        for ridx, restraint in enumerate(self.restraints):\n            self.results.collinear[ridx, self._frame_index] = is_collinear(\n                positions=restraint.positions,\n                atoms=[0, 1, 2, 3, 4, 5],\n                dimensions=restraint.dimensions,\n            )\n\n            # bonds\n            self.results.bonds[ridx, self._frame_index] = calc_bonds(\n                restraint.atoms[2].position,\n                restraint.atoms[3].position,\n                box=restraint.dimensions,\n            )\n\n            # angles\n            for i in range(1, 3):\n                self.results.angles[ridx, i - 1, self._frame_index] = calc_angles(\n                    restraint.atoms[i].position,\n                    restraint.atoms[i + 1].position,\n                    restraint.atoms[i + 2].position,\n                    box=restraint.dimensions,\n                )\n\n            # dihedrals\n            for i in range(3):\n                self.results.dihedrals[ridx, i, self._frame_index] = calc_dihedrals(\n                    restraint.atoms[i].position,\n                    restraint.atoms[i + 1].position,\n                    restraint.atoms[i + 2].position,\n                    restraint.atoms[i + 3].position,\n                    box=restraint.dimensions,\n                )\n\n    def _conclude(self):\n        for ridx in range(len(self.restraints)):\n            # Check angles\n            angle_bounds = True\n            angle_variance = True\n            for i in range(2):\n                bounds = all(\n                    check_angle_not_flat(\n                        angle=angle * unit.radians,\n                        force_constant=self.angle_force_constant,\n                        temperature=self.temperature,\n                    )\n                    for angle in self.results.angles[ridx, i]\n                )\n                variance = check_angular_variance(\n                    self.results.angles[ridx, i] * unit.radians,\n                    upper_bound=np.pi * unit.radians,\n                    lower_bound=0 * unit.radians,\n                    width=1.745 * unit.radians,\n                )\n                angle_bounds &= bounds\n                angle_variance &= variance\n\n            # Check dihedrals\n            dihed_bounds = True\n            dihed_variance = True\n            for i in range(3):\n                bounds = all(\n                    check_dihedral_bounds(dihed * unit.radians)\n                    for dihed in self.results.dihedrals[ridx, i]\n                )\n                variance = check_angular_variance(\n                    self.results.dihedrals[ridx, i] * unit.radians,\n                    upper_bound=np.pi * unit.radians,\n                    lower_bound=-np.pi * unit.radians,\n                    width=5.23 * unit.radians,\n                )\n\n                dihed_bounds &= bounds\n                dihed_variance &= variance\n\n            not_collinear = not all(self.results.collinear[ridx])\n\n            self.results.valid[ridx] = all(\n                [\n                    angle_bounds,\n                    angle_variance,\n                    dihed_bounds,\n                    dihed_variance,\n                    not_collinear,\n                ]\n            )\n\n\nclass EvaluateHostAtoms1(AnalysisBase):\n    \"\"\"\n    Class to evaluate the suitability of a set of host atoms\n    as either H0 or H1 atoms (i.e. the first and second host atoms).\n\n    Parameters\n    ----------\n    reference : MDAnalysis.AtomGroup\n      The reference preceding three atoms.\n    host_atom_pool : MDAnalysis.AtomGroup\n      The pool of atoms to pick an atom from.\n    minimum_distance : openff.units.Quantity\n      The minimum distance from the bound reference atom.\n    angle_force_constant : openff.units.Quantity\n      The force constant for the angle.\n    temperature : openff.units.Quantity\n      The system temperature in units compatible with Kelvin\n    \"\"\"\n\n    def __init__(\n        self,\n        reference: mda.AtomGroup,\n        host_atom_pool: mda.AtomGroup,\n        minimum_distance: Quantity,\n        angle_force_constant: Quantity,\n        temperature: Quantity,\n        **kwargs,\n    ):\n        super().__init__(reference.universe.trajectory, **kwargs)\n\n        if len(reference) != 3:\n            errmsg = \"Incorrect number of reference atoms passed\"\n            raise ValueError(errmsg)\n\n        self.reference = reference\n        self.host_atom_pool = host_atom_pool\n        self.minimum_distance = minimum_distance.to(\"angstrom\").m\n        self.angle_force_constant = angle_force_constant\n        self.temperature = temperature\n\n    def _prepare(self):\n        self.results.distances = np.zeros((len(self.host_atom_pool), self.n_frames))\n        self.results.angles = np.zeros((len(self.host_atom_pool), self.n_frames))\n        self.results.dihedrals = np.zeros((len(self.host_atom_pool), self.n_frames))\n        self.results.collinear = np.empty(\n            (len(self.host_atom_pool), self.n_frames),\n            dtype=bool,\n        )\n        self.results.valid = np.empty(\n            len(self.host_atom_pool),\n            dtype=bool,\n        )\n        # Set everything to False to begin with\n        self.results.valid[:] = False\n\n    def _single_frame(self):\n        for i, at in enumerate(self.host_atom_pool):\n            distance = calc_bonds(\n                at.position,\n                self.reference.atoms[0].position,\n                box=self.reference.dimensions,\n            )\n            angle = calc_angles(\n                at.position,\n                self.reference.atoms[0].position,\n                self.reference.atoms[1].position,\n                box=self.reference.dimensions,\n            )\n            dihedral = calc_dihedrals(\n                at.position,\n                self.reference.atoms[0].position,\n                self.reference.atoms[1].position,\n                self.reference.atoms[2].position,\n                box=self.reference.dimensions,\n            )\n            collinear = is_collinear(\n                positions=np.vstack((at.position, self.reference.positions)),\n                atoms=[0, 1, 2, 3],\n                dimensions=self.reference.dimensions,\n            )\n            self.results.distances[i][self._frame_index] = distance\n            self.results.angles[i][self._frame_index] = angle\n            self.results.dihedrals[i][self._frame_index] = dihedral\n            self.results.collinear[i][self._frame_index] = collinear\n\n    def _conclude(self):\n        for i, at in enumerate(self.host_atom_pool):\n            # Check distances\n            distance_bounds = all(self.results.distances[i] > self.minimum_distance)\n            # Check angles\n            angle_bounds = all(\n                check_angle_not_flat(\n                    angle=angle * unit.radians,\n                    force_constant=self.angle_force_constant,\n                    temperature=self.temperature,\n                )\n                for angle in self.results.angles[i]\n            )\n            angle_variance = check_angular_variance(\n                self.results.angles[i] * unit.radians,\n                upper_bound=np.pi * unit.radians,\n                lower_bound=0 * unit.radians,\n                width=1.745 * unit.radians,\n            )\n            # Check dihedrals\n            dihed_bounds = all(\n                check_dihedral_bounds(dihed * unit.radians)\n                for dihed in self.results.dihedrals[i]\n            )  # fmt: skip\n            dihed_variance = check_angular_variance(\n                self.results.dihedrals[i] * unit.radians,\n                upper_bound=np.pi * unit.radians,\n                lower_bound=-np.pi * unit.radians,\n                width=5.23 * unit.radians,\n            )\n            not_collinear = not all(self.results.collinear[i])\n            if all(\n                [\n                    distance_bounds,\n                    angle_bounds,\n                    angle_variance,\n                    dihed_bounds,\n                    dihed_variance,\n                    not_collinear,\n                ]\n            ):\n                self.results.valid[i] = True\n\n\nclass EvaluateHostAtoms2(EvaluateHostAtoms1):\n    \"\"\"\n    Class to evaluate the suitability of a set of host atoms\n    as H2 atoms (i.e. the third host atoms).\n\n    Parameters\n    ----------\n    reference : MDAnalysis.AtomGroup\n      The reference preceding three atoms.\n    host_atom_pool : MDAnalysis.AtomGroup\n      The pool of atoms to pick an atom from.\n    minimum_distance : unit.Quantity\n      The minimum distance from the bound reference atom.\n    angle_force_constant : unit.Quantity\n      The force constant for the angle.\n    temperature : unit.Quantity\n      The system temperature in Kelvin\n    \"\"\"\n\n    def _prepare(self):\n        self.results.distances1 = np.zeros((len(self.host_atom_pool), self.n_frames))\n        self.results.distances2 = np.zeros((len(self.host_atom_pool), self.n_frames))\n        self.results.dihedrals = np.zeros((len(self.host_atom_pool), self.n_frames))\n        self.results.collinear = np.empty(\n            (len(self.host_atom_pool), self.n_frames),\n            dtype=bool,\n        )\n        self.results.valid = np.empty(\n            len(self.host_atom_pool),\n            dtype=bool,\n        )\n        # Default to valid == False\n        self.results.valid[:] = False\n\n    def _single_frame(self):\n        for i, at in enumerate(self.host_atom_pool):\n            distance1 = calc_bonds(\n                at.position,\n                self.reference.atoms[0].position,\n                box=self.reference.dimensions,\n            )\n            distance2 = calc_bonds(\n                at.position,\n                self.reference.atoms[1].position,\n                box=self.reference.dimensions,\n            )\n            dihedral = calc_dihedrals(\n                at.position,\n                self.reference.atoms[0].position,\n                self.reference.atoms[1].position,\n                self.reference.atoms[2].position,\n                box=self.reference.dimensions,\n            )\n            collinear = is_collinear(\n                positions=np.vstack((at.position, self.reference.positions)),\n                atoms=[0, 1, 2, 3],\n                dimensions=self.reference.dimensions,\n            )\n            self.results.distances1[i][self._frame_index] = distance1\n            self.results.distances2[i][self._frame_index] = distance2\n            self.results.dihedrals[i][self._frame_index] = dihedral\n            self.results.collinear[i][self._frame_index] = collinear\n\n    def _conclude(self):\n        for i, at in enumerate(self.host_atom_pool):\n            distance1_bounds = all(self.results.distances1[i] > self.minimum_distance)\n            distance2_bounds = all(self.results.distances2[i] > self.minimum_distance)\n            dihed_bounds = all(\n                check_dihedral_bounds(dihed * unit.radians)\n                for dihed in self.results.dihedrals[i]\n            )  # fmt: skip\n            dihed_variance = check_angular_variance(\n                self.results.dihedrals[i] * unit.radians,\n                upper_bound=np.pi * unit.radians,\n                lower_bound=-np.pi * unit.radians,\n                width=5.23 * unit.radians,\n            )\n            not_collinear = not all(self.results.collinear[i])\n            if all(\n                [\n                    distance1_bounds,\n                    distance2_bounds,\n                    dihed_bounds,\n                    dihed_variance,\n                    not_collinear,\n                ]\n            ):\n                self.results.valid[i] = True\n\n\ndef _get_lowest_variance_restraint_hostanchor(\n    proposed_restraints: list[mda.AtomGroup],\n    angle_force_constant: Quantity,\n    temperature: Quantity\n) -> list[int] | None:  # fmt: skip\n    \"\"\"\n    Evaluate a list of proposed restraints and return the lowest variance\n    valid restraint.\n\n    Parameters\n    ----------\n    proposed_restraints : list[MDAnalysis.AtomGroup]\n      A proposed list of AtomGroup defining the H2-H1-H0-G0-G1-G2\n      restraint atoms, in that order.\n    angle_force_constant : openff.units.Quantity\n      The force constant for the angle.\n    temperature : openff.units.Quantity\n      The system temperature in units compatible with Kelvin.\n\n    Returns\n    -------\n    list[int] | None\n      The H0, H1, H2 host atom indices for the picked restraint, or None\n      if no suitable restraints are found.\n    \"\"\"\n    # Evaluate all the restraints\n    restraints_eval = EvaluateBoreschAtoms(\n        restraints=proposed_restraints,\n        angle_force_constant=angle_force_constant,\n        temperature=temperature,\n    ).run()\n\n    # If there are no valid restraints, we have nothing\n    if not any(restraints_eval.results.valid):\n        return None\n\n    valid_indices = []\n    valid_variances = []\n    for ridx in range(len(proposed_restraints)):\n        if restraints_eval.results.valid[ridx]:\n            valid_indices.append(ridx)\n\n            dih_variance = sum(\n                [\n                    circvar(diheds, high=np.pi, low=-np.pi)\n                    for diheds in restraints_eval.results.dihedrals[ridx]\n                ]\n            )\n\n            ang_variance = sum(\n                [\n                    circvar(angles, high=np.pi, low=0)\n                    for angles in restraints_eval.results.angles[ridx]\n                ]\n            )\n\n            bond_variance = np.var(restraints_eval.results.bonds[ridx])\n\n            valid_variances.append(dih_variance + ang_variance + bond_variance)\n\n    # get the restraint with the lowest summed variance\n    restraint_index = valid_indices[np.argmin(valid_variances)]\n    restraint = restraints_eval.restraints[restraint_index]\n    # we reverse the indices to get H0, H1, H2\n    host_indices = [i for i in restraint.atoms.ix[:3][::-1]]\n    return host_indices\n\n\ndef find_host_anchor_bonded(\n    guest_atoms: mda.AtomGroup,\n    host_atom_pool: mda.AtomGroup,\n    guest_minimum_distance: Quantity,\n    angle_force_constant: Quantity,\n    temperature: Quantity,\n) -> list[int] | None:\n    \"\"\"\n    Find suitable atoms for the H0-H1-H2 portion of the restraint\n    where all host atoms are bonded to each other.\n\n    Parameters\n    ----------\n    guest_atoms : mda.AtomGroup\n      The guest anchor atoms for G0-G1-G2\n    host_atom_pool : mda.AtomGroup\n      The host atoms to search from.\n    guest_minimum_distance: openff.units.Quantity\n      The minimum distance between host atoms and the guest anchor.\n    angle_force_constant : openff.units.Quantity\n      The force constant for the G1-G0-H0 and G0-H0-H1 angles.\n    temperature : openff.units.Quantity\n      The target system temperature.\n\n    Returns\n    -------\n    Optional[list[int]]\n      A list of indices for a selected combination of H0, H1, and H2.\n    \"\"\"\n    if not hasattr(guest_atoms, \"angles\"):\n        warnings.warn(\"no angles found - will attempt to guess\")\n        guest_atoms.universe.guess_TopologyAttrs(context=\"default\", to_guess=[\"angles\"])\n\n    # Evaluate the host_atom_pool for suitability as H0 atoms\n    h0_eval = EvaluateHostAtoms1(\n        reference=guest_atoms,\n        host_atom_pool=host_atom_pool,\n        minimum_distance=guest_minimum_distance,\n        angle_force_constant=angle_force_constant,\n        temperature=temperature,\n    ).run()\n\n    # Get a list of proposed restraints\n    proposed_restraints = []\n\n    for i, valid_h0 in enumerate(h0_eval.results.valid):\n        # If valid H0 atom, get all the angles it's involved in.\n        if valid_h0:\n            # note: i indexes host_atom_pool but not the universe!\n            # from here on, we will switch to using atom.ix instead of i\n            atom = host_atom_pool.atoms[i]\n            angles = atom.angles.atomgroup_intersection(host_atom_pool, strict=True)\n            for indices in angles.indices:\n                if atom.ix == indices[0] or atom.ix == indices[-1]:\n                    if atom.ix == indices[0]:\n                        indices = indices[::-1]\n                else:\n                    continue\n\n                proposed_restraints.append(host_atom_pool.universe.atoms[indices] + guest_atoms)\n\n    # If there are no proposed restraints, return with nothing\n    if len(proposed_restraints) == 0:\n        return None\n\n    # Otherwise, evaluate the restraints, and return the anchor\n    # atoms from the lowest variance restraint, if any valid restraints\n    # are found\n    return _get_lowest_variance_restraint_hostanchor(\n        proposed_restraints=proposed_restraints,\n        angle_force_constant=angle_force_constant,\n        temperature=temperature,\n    )\n\n\ndef find_host_anchor_multi(\n    guest_atoms: mda.AtomGroup,\n    host_atom_pool: mda.AtomGroup,\n    host_minimum_distance: Quantity,\n    guest_minimum_distance: Quantity,\n    angle_force_constant: Quantity,\n    temperature: Quantity,\n) -> Optional[list[int]]:\n    \"\"\"\n    Find suitable atoms for the H0-H1-H2 portion of the restraint.\n\n    Parameters\n    ----------\n    guest_atoms : mda.AtomGroup\n      The guest anchor atoms for G0-G1-G2\n    host_atom_pool : mda.AtomGroup\n      The host atoms to search from.\n    host_minimum_distance : openff.units.Quantity\n      The minimum distance to pick host atoms from each other.\n    guest_minimum_distance: openff.units.Quantity\n      The minimum distance between host atoms and the guest anchor.\n    angle_force_constant : openff.units.Quantity\n      The force constant for the G1-G0-H0 and G0-H0-H1 angles.\n    temperature : openff.units.Quantity\n      The target system temperature.\n\n    Returns\n    -------\n    Optional[list[int]]\n      A list of indices for a selected combination of H0, H1, and H2.\n    \"\"\"\n    # Evaluate the host_atom_pool for suitability as H0 atoms\n    h0_eval = EvaluateHostAtoms1(\n        reference=guest_atoms,\n        host_atom_pool=host_atom_pool,\n        minimum_distance=guest_minimum_distance,\n        angle_force_constant=angle_force_constant,\n        temperature=temperature,\n    )\n    h0_eval.run()\n\n    for i, valid_h0 in enumerate(h0_eval.results.valid):\n        # If valid H0 atom, evaluate rest of host_atom_pool for suitability\n        # as H1 atoms.\n        if valid_h0:\n            h0g0g1_atoms = host_atom_pool.atoms[i] + guest_atoms.atoms[:2]\n            h1_eval = EvaluateHostAtoms1(\n                reference=h0g0g1_atoms,\n                host_atom_pool=host_atom_pool,\n                minimum_distance=host_minimum_distance,\n                angle_force_constant=angle_force_constant,\n                temperature=temperature,\n            )\n            h1_eval.run()\n            for j, valid_h1 in enumerate(h1_eval.results.valid):\n                # If valid H1 atom, evaluate rest of host_atom_pool for\n                # suitability as H2 atoms\n                if valid_h1:\n                    h1h0g0_atoms = host_atom_pool.atoms[j] + h0g0g1_atoms.atoms[:2]\n                    h2_eval = EvaluateHostAtoms2(\n                        reference=h1h0g0_atoms,\n                        host_atom_pool=host_atom_pool,\n                        minimum_distance=host_minimum_distance,\n                        angle_force_constant=angle_force_constant,\n                        temperature=temperature,\n                    )\n                    h2_eval.run()\n\n                    if any(h2_eval.results.valid):\n                        # Get the sum of the average distances (dsum_avgs)\n                        # for all the host_atom_pool atoms\n                        distance1_avgs = np.array([d.mean() for d in h2_eval.results.distances1])\n                        distance2_avgs = np.array([d.mean() for d in h2_eval.results.distances2])\n                        dsum_avgs = distance1_avgs + distance2_avgs\n\n                        # Now filter by validity as H2 atom\n                        h2_dsum_avgs = [\n                            (idx, val)\n                            for idx, val in enumerate(dsum_avgs)\n                            if h2_eval.results.valid[idx]\n                        ]\n\n                        # Get the index of the H2 atom with the lowest\n                        # average distance\n                        k = sorted(h2_dsum_avgs, key=lambda x: x[1])[0][0]\n\n                        return list(host_atom_pool.atoms[[i, j, k]].ix)\n    return None\n"
  },
  {
    "path": "src/openfe/protocols/restraint_utils/geometry/flatbottom.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\n\"\"\"\nRestraint Geometry classes\n\nTODO\n----\n* Add relevant duecredit entries.\n\"\"\"\n\nfrom typing import Optional\n\nimport MDAnalysis as mda\nimport numpy as np\nfrom gufe.settings.typing import NanometerQuantity\nfrom MDAnalysis.analysis.base import AnalysisBase\nfrom MDAnalysis.lib.distances import calc_bonds\nfrom openff.units import Quantity, unit\n\nfrom .harmonic import DistanceRestraintGeometry\nfrom .utils import _get_mda_selection\n\n\nclass FlatBottomDistanceGeometry(DistanceRestraintGeometry):\n    \"\"\"\n    A geometry class for a flat bottom distance restraint between two groups\n    of atoms.\n    \"\"\"\n\n    well_radius: NanometerQuantity\n\n\nclass COMDistanceAnalysis(AnalysisBase):\n    \"\"\"\n    Get a timeseries of COM distances between two AtomGroups\n\n    Parameters\n    ----------\n    group1 : MDAnalysis.AtomGroup\n      Atoms defining the first centroid.\n    group2 : MDAnalysis.AtomGroup\n      Atoms defining the second centroid.\n    \"\"\"\n\n    _analysis_algorithm_is_parallelizable = False\n\n    def __init__(self, group1, group2, **kwargs):\n        super().__init__(group1.universe.trajectory, **kwargs)\n\n        self.ag1 = group1\n        self.ag2 = group2\n\n    def _prepare(self):\n        self.results.distances = np.zeros(self.n_frames)\n\n    def _single_frame(self):\n        com_dist = calc_bonds(\n            self.ag1.center_of_mass(),\n            self.ag2.center_of_mass(),\n            box=self.ag1.universe.dimensions,\n        )\n        self.results.distances[self._frame_index] = com_dist\n\n    def _conclude(self):\n        pass\n\n\ndef get_flatbottom_distance_restraint(\n    universe: mda.Universe,\n    host_atoms: Optional[list[int]] = None,\n    guest_atoms: Optional[list[int]] = None,\n    host_selection: Optional[str] = None,\n    guest_selection: Optional[str] = None,\n    padding: Quantity = 0.5 * unit.nanometer,\n) -> FlatBottomDistanceGeometry:\n    \"\"\"\n    Get a FlatBottomDistanceGeometry by analyzing the COM distance\n    change between two sets of atoms.\n\n    The ``well_radius`` is defined as the maximum COM distance plus\n    ``padding``.\n\n    Parameters\n    ----------\n    universe : mda.Universe\n      An MDAnalysis Universe defining the system and its coordinates.\n    host_atoms : Optional[list[int]]\n      A list of host atoms indices. Either ``host_atoms`` or\n      ``host_selection`` must be defined.\n    guest_atoms : Optional[list[int]]\n      A list of guest atoms indices. Either ``guest_atoms`` or\n      ``guest_selection`` must be defined.\n    host_selection : Optional[str]\n      An MDAnalysis selection string to define the host atoms.\n      Either ``host_atoms`` or ``host_selection`` must be defined.\n    guest_selection : Optional[str]\n      An MDAnalysis selection string to define the guest atoms.\n      Either ``guest_atoms`` or ``guest_selection`` must be defined.\n    padding : openff.units.Quantity\n      A padding value to add to the ``well_radius`` definition.\n      Must be in units compatible with nanometers.\n\n    Returns\n    -------\n    FlatBottomDistanceGeometry\n      An object defining a flat bottom restraint geometry.\n    \"\"\"\n    guest_ag = _get_mda_selection(universe, guest_atoms, guest_selection)\n    host_ag = _get_mda_selection(universe, host_atoms, host_selection)\n    guest_idxs = [a.ix for a in guest_ag]\n    host_idxs = [a.ix for a in host_ag]\n\n    if len(host_idxs) == 0 or len(guest_idxs) == 0:\n        errmsg = (\n            \"no atoms found in either the host or guest atom groups\"\n            f\"host_atoms: {host_idxs}\"\n            f\"guest_atoms: {guest_idxs}\"\n        )\n        raise ValueError(errmsg)\n\n    com_dists = COMDistanceAnalysis(guest_ag, host_ag)\n    com_dists.run()\n\n    well_radius = com_dists.results.distances.max() * unit.angstrom + padding\n    return FlatBottomDistanceGeometry(\n        guest_atoms=guest_idxs, host_atoms=host_idxs, well_radius=well_radius\n    )\n"
  },
  {
    "path": "src/openfe/protocols/restraint_utils/geometry/harmonic.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\n\"\"\"\nRestraint Geometry classes\n\nTODO\n----\n* Add relevant duecredit entries.\n\"\"\"\n\nfrom typing import Optional\n\nimport MDAnalysis as mda\nfrom rdkit import Chem\n\nfrom .base import HostGuestRestraintGeometry\nfrom .utils import _get_mda_selection, get_central_atom_idx\n\n\nclass DistanceRestraintGeometry(HostGuestRestraintGeometry):\n    \"\"\"\n    A geometry class for a distance restraint between two groups of atoms.\n    \"\"\"\n\n\ndef get_distance_restraint(\n    universe: mda.Universe,\n    host_atoms: Optional[list[int]] = None,\n    guest_atoms: Optional[list[int]] = None,\n    host_selection: Optional[str] = None,\n    guest_selection: Optional[str] = None,\n) -> DistanceRestraintGeometry:\n    \"\"\"\n    Get a DistanceRestraintGeometry between two groups of atoms.\n\n    You can either select the groups by passing through a set of indices\n    or an MDAnalysis selection.\n\n    Parameters\n    ----------\n    universe : mda.Universe\n      An MDAnalysis Universe defining the system and its coordinates.\n    host_atoms : Optional[list[int]]\n      A list of host atoms indices. Either ``host_atoms`` or\n      ``host_selection`` must be defined.\n    guest_atoms : Optional[list[int]]\n      A list of guest atoms indices. Either ``guest_atoms`` or\n      ``guest_selection`` must be defined.\n    host_selection : Optional[str]\n      An MDAnalysis selection string to define the host atoms.\n      Either ``host_atoms`` or ``host_selection`` must be defined.\n    guest_selection : Optional[str]\n      An MDAnalysis selection string to define the guest atoms.\n      Either ``guest_atoms`` or ``guest_selection`` must be defined.\n\n    Returns\n    -------\n    DistanceRestraintGeometry\n      An object that defines a distance restraint geometry.\n    \"\"\"\n    guest_ag = _get_mda_selection(universe, guest_atoms, guest_selection)\n    guest_atoms = [a.ix for a in guest_ag]\n    host_ag = _get_mda_selection(universe, host_atoms, host_selection)\n    host_atoms = [a.ix for a in host_ag]\n\n    return DistanceRestraintGeometry(guest_atoms=guest_atoms, host_atoms=host_atoms)\n\n\ndef get_molecule_centers_restraint(\n    molA_rdmol: Chem.Mol,\n    molB_rdmol: Chem.Mol,\n    molA_idxs: list[int],\n    molB_idxs: list[int],\n):\n    \"\"\"\n    Get a DistanceRestraintGeometry between the central atoms of\n    two molecules.\n\n    Parameters\n    ----------\n    molA_rdmol : Chem.Mol\n      An RDKit Molecule for the first molecule.\n    molB_rdmol : Chem.Mol\n      An RDKit Molecule for the second molecule.\n    molA_idxs : list[int]\n      The indices of the first molecule in the system. Note we assume these\n      to be sorted in the same order as the input rdmol.\n    molB_idxs : list[int]\n      The indices of the second molecule in the system. Note we assume these\n      to be sorted in the same order as the input rdmol.\n\n    Returns\n    -------\n    DistanceRestraintGeometry\n      An object that defines a distance restraint geometry.\n    \"\"\"\n    # We assume that the mol idxs are ordered\n    centerA = molA_idxs[get_central_atom_idx(molA_rdmol)]\n    centerB = molB_idxs[get_central_atom_idx(molB_rdmol)]\n\n    return DistanceRestraintGeometry(guest_atoms=[centerA], host_atoms=[centerB])\n"
  },
  {
    "path": "src/openfe/protocols/restraint_utils/geometry/utils.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\n\"\"\"\nSearch methods for generating Geometry objects\n\nTODO\n----\n* Add relevant duecredit entries.\n\"\"\"\n\nimport warnings\nfrom itertools import combinations, groupby\nfrom typing import Optional, Union\n\nimport MDAnalysis as mda\nimport networkx as nx\nimport numpy as np\nimport numpy.typing as npt\n\n# from gufe.vendor.openff.models.types import ArrayQuantity  TODO: write a custom quantity to replace this in pydantic v2\nfrom MDAnalysis.analysis.base import AnalysisBase\nfrom MDAnalysis.analysis.dssp import DSSP\nfrom MDAnalysis.analysis.rms import RMSF\nfrom MDAnalysis.lib.distances import capped_distance, distance_array, minimize_vectors\nfrom MDAnalysis.transformations.nojump import NoJump\nfrom openfe_analysis.transformations import Aligner\nfrom openff.toolkit import Molecule as OFFMol\nfrom openff.units import Quantity, unit\nfrom rdkit import Chem\nfrom scipy.stats import circvar\n\nDEFAULT_ANGLE_FRC_CONSTANT = 83.68 * unit.kilojoule_per_mole / unit.radians**2\n\n\ndef _get_mda_selection(\n    universe: Union[mda.Universe, mda.AtomGroup],\n    atom_list: Optional[list[int]] = None,\n    selection: Optional[str] = None,\n) -> mda.AtomGroup:\n    \"\"\"\n    Return an AtomGroup based on either a list of atom indices or an\n    mdanalysis string selection.\n\n    Parameters\n    ----------\n    universe : Union[mda.Universe, mda.AtomGroup]\n      The MDAnalysis Universe or AtomGroup to get the AtomGroup from.\n    atom_list : Optional[list[int]]\n      A list of atom indices.\n    selection : Optional[str]\n      An MDAnalysis selection string.\n\n    Returns\n    -------\n    ag : mda.AtomGroup\n      An atom group selected from the inputs.\n\n    Raises\n    ------\n    ValueError\n      If both ``atom_list`` and ``selection`` are ``None``\n      or are defined.\n    \"\"\"\n    if atom_list is None:\n        if selection is None:\n            raise ValueError(\"one of either the atom lists or selections must be defined\")\n\n        ag = universe.select_atoms(selection)\n    else:\n        if selection is not None:\n            raise ValueError(\"both atom_list and selection cannot be defined together\")\n        ag = universe.atoms[atom_list]\n    return ag\n\n\ndef get_aromatic_rings(rdmol: Chem.Mol) -> list[set[int]]:\n    \"\"\"\n    Get a list of tuples with the indices for each ring in an rdkit Molecule.\n\n    Parameters\n    ----------\n    rdmol : Chem.Mol\n      RDKit Molecule\n\n    Returns\n    -------\n    list[set[[int]]\n      List of tuples for each ring.\n    \"\"\"\n\n    ringinfo = rdmol.GetRingInfo()\n    arom_idxs = get_aromatic_atom_idxs(rdmol)\n\n    aromatic_rings = []\n\n    # Add to the aromatic_rings list if all the atoms in a ring are aromatic\n    for ring in ringinfo.AtomRings():\n        if all(a in arom_idxs for a in ring):\n            aromatic_rings.append(set(ring))\n\n    # Reduce the ring list by merging any rings that have colliding atoms\n    for x, y in combinations(aromatic_rings, 2):\n        if not x.isdisjoint(y):\n            x.update(y)\n            aromatic_rings.remove(y)\n\n    return aromatic_rings\n\n\ndef get_aromatic_atom_idxs(rdmol: Chem.Mol) -> list[int]:\n    \"\"\"\n    Helper method to get aromatic atoms idxs\n    in a RDKit Molecule\n\n    Parameters\n    ----------\n    rdmol : Chem.Mol\n      RDKit Molecule\n\n    Returns\n    -------\n    list[int]\n      A list of the aromatic atom idxs\n    \"\"\"\n    idxs = [at.GetIdx() for at in rdmol.GetAtoms() if at.GetIsAromatic()]\n    return idxs\n\n\ndef get_heavy_atom_idxs(rdmol: Chem.Mol) -> list[int]:\n    \"\"\"\n    Get idxs of heavy atoms in an RDKit Molecule\n\n    Parameters\n    ----------\n    rmdol : Chem.Mol\n\n    Returns\n    -------\n    list[int]\n      A list of heavy atom idxs\n    \"\"\"\n    idxs = [at.GetIdx() for at in rdmol.GetAtoms() if at.GetAtomicNum() > 1]\n    return idxs\n\n\ndef get_central_atom_idx(rdmol: Chem.Mol) -> int:\n    \"\"\"\n    Get the central atom in an rdkit Molecule.\n\n    Parameters\n    ----------\n    rdmol : Chem.Mol\n      RDKit Molecule to query\n\n    Returns\n    -------\n    int\n      Index of central atom in Molecule\n\n    Note\n    ----\n    If there are equal likelihood centers, will return\n    the first entry.\n    \"\"\"\n    # TODO: switch to a manual conversion to avoid an OpenFF dependency\n    offmol = OFFMol(rdmol, allow_undefined_stereo=True)\n    nx_mol = offmol.to_networkx()\n\n    if not nx.is_weakly_connected(nx_mol.to_directed()):\n        errmsg = \"A disconnected molecule was passed, cannot find the center\"\n        raise ValueError(errmsg)\n\n    # Get a list of all shortest paths\n    # Note: we call dict on shortest_path to support py3.10 which doesn't\n    # support networkx 3.5\n    shortest_paths = [\n        path\n        for node_paths in dict(nx.shortest_path(nx_mol)).values()\n        for path in node_paths.values()\n    ]\n\n    # Get the longest of these paths (returns first instance)\n    longest_path = max(shortest_paths, key=len)\n\n    # Return the index of the central atom\n    return longest_path[len(longest_path) // 2]\n\n\ndef is_collinear(\n    positions: npt.NDArray,\n    atoms: Union[list[int], tuple[int, ...]],\n    dimensions=None,\n    threshold=0.9,\n):\n    \"\"\"\n    Check whether any sequential vectors in a sequence of atoms are collinear.\n\n    Approach: for each sequential set of 3 atoms (defined as A, B, and C),\n    calculates the normalized inner product (i.e. cos^-1(angle)) between\n    vectors AB and BC. If the absolute value  of this inner product is\n    close to 1 (i.e. an angle of 0 radians), then the three atoms are\n    considered as collinear. You can use ``threshold`` to define how close\n    to 1 is considered \"flat\".\n\n    Parameters\n    ----------\n    positions : npt.NDArray\n      System positions.\n    atoms : list[int]\n      The indices of the atoms to test.\n    dimensions : Optional[npt.NDArray]\n      The dimensions of the system to minimize vectors.\n    threshold : float\n      Atoms are not collinear if their sequential vector separation dot\n      products are less than ``threshold``. Default 0.9.\n\n    Returns\n    -------\n    result : bool\n        Returns True if any sequential pair of vectors is collinear;\n        False otherwise.\n\n    Notes\n    -----\n    Originally from Yank.\n    \"\"\"\n    if len(atoms) < 3:\n        raise ValueError(\"Too few atoms passed for co-linearity test\")\n    if len(positions) < len(atoms) or len(positions) < max(atoms) + 1:\n        errmsg = \"atoms indices do not match the positions array passed\"\n        raise ValueError(errmsg)\n    if not all(isinstance(x, int) for x in atoms):\n        errmsg = \"atoms is not a list of index integers\"\n        raise ValueError(errmsg)\n\n    result = False\n    for i in range(len(atoms) - 2):\n        v1 = positions[atoms[i + 1], :] - positions[atoms[i], :]\n        v2 = positions[atoms[i + 2], :] - positions[atoms[i + 1], :]\n        if dimensions is not None:\n            v1 = minimize_vectors(v1, box=dimensions)\n            v2 = minimize_vectors(v2, box=dimensions)\n\n        normalized_inner_product = np.dot(v1, v2) / np.sqrt(np.dot(v1, v1) * np.dot(v2, v2))\n        result = result or (np.abs(normalized_inner_product) > threshold)\n    return result\n\n\ndef _wrap_angle(angle: Quantity) -> Quantity:\n    \"\"\"\n    Wrap an angle to -pi to pi radians.\n\n    Parameters\n    ----------\n    angle : openff.units.Quantity\n      An angle in radians compatible units.\n\n    Returns\n    -------\n    openff.units.Quantity\n      The angle in units of radians wrapped.\n\n    Notes\n    -----\n    Pint automatically converts the angle to radians\n    as it passes it through arctan2.\n    \"\"\"\n    return np.arctan2(np.sin(angle), np.cos(angle))  # type: ignore\n\n\ndef check_angle_not_flat(\n    angle: Quantity,\n    force_constant: Quantity = DEFAULT_ANGLE_FRC_CONSTANT,\n    temperature: Quantity = 298.15 * unit.kelvin,\n) -> bool:\n    \"\"\"\n    Check whether the chosen angle is less than 10 kT from 0 or pi radians\n\n    Parameters\n    ----------\n    angle : openff.units.Quantity\n      The angle to check in units compatible with radians.\n    force_constant : openff.units.Quantity\n      Force constant of the angle in units compatible with\n      kilojoule_per_mole / radians ** 2.\n    temperature : openff.units.Quantity\n      The system temperature in units compatible with Kelvin.\n\n    Returns\n    -------\n    bool\n      False if the angle is less than 10 kT from 0 or pi radians\n\n    Note\n    ----\n    We assume the temperature to be 298.15 Kelvin.\n\n    Acknowledgements\n    ----------------\n    This code was initially contributed by Vytautas Gapsys.\n    \"\"\"\n    # Convert things\n    angle_rads = _wrap_angle(angle)\n    frc_const = force_constant.to(\"unit.kilojoule_per_mole / unit.radians**2\")\n    temp_kelvin = temperature.to(\"kelvin\")\n    RT = 8.31445985 * 0.001 * temp_kelvin  # type: ignore[operator]\n\n    # check if angle is <10kT from 0 or 180\n    check1 = 0.5 * frc_const * np.power((angle_rads - 0.0), 2)  # type: ignore[operator]\n    check2 = 0.5 * frc_const * np.power((angle_rads - np.pi), 2)  # type: ignore[operator]\n    ang_check_1 = check1 / RT\n    ang_check_2 = check2 / RT\n    if ang_check_1.m < 10.0 or ang_check_2.m < 10.0:\n        return False\n    return True\n\n\ndef check_dihedral_bounds(\n    dihedral: Quantity,\n    lower_cutoff: Quantity = -2.618 * unit.radians,\n    upper_cutoff: Quantity = 2.618 * unit.radians,\n) -> bool:\n    \"\"\"\n    Check that a dihedral does not exceed the bounds set by\n    lower_cutoff and upper_cutoff on a -pi to pi range.\n\n    All angles and cutoffs are wrapped to -pi to pi before\n    applying the check.\n\n    Parameters\n    ----------\n    dihedral : openff.units.Quantity\n      Dihedral in units compatible with radians.\n    lower_cutoff : openff.units.Quantity\n      Dihedral lower cutoff in units compatible with radians.\n    upper_cutoff : openff.units.Quantity\n      Dihedral upper cutoff in units compatible with radians.\n\n    Returns\n    -------\n    bool\n      ``True`` if the dihedral is within the upper and lower\n      cutoff bounds.\n    \"\"\"\n    dihed = _wrap_angle(dihedral)\n    lower = _wrap_angle(lower_cutoff)\n    upper = _wrap_angle(upper_cutoff)\n    if (dihed < lower) or (dihed > upper):  # type: ignore[operator]\n        return False\n    return True\n\n\ndef check_angular_variance(\n    angles: Quantity,\n    upper_bound: Quantity,\n    lower_bound: Quantity,\n    width: Quantity,\n) -> bool:\n    \"\"\"\n    Check that the variance of a list of ``angles`` does not exceed\n    a given ``width``\n\n    Parameters\n    ----------\n    angles : ArrayLike openff.units.Quantity\n      An array of angles in units compatible with radians.\n    upper_bound: openff.units.Quantity\n      The upper bound in the angle range in radians compatible units.\n    lower_bound: openff.units.Quantity\n      The lower bound in the angle range in radians compatible units.\n    width : openff.units.Quantity\n      The width to check the variance against, in units compatible with\n      radians.\n\n    Returns\n    -------\n    bool\n      ``True`` if the variance of the angles is less than the width.\n\n    \"\"\"\n    # scipy circ methods already recasts internally so we shouldn't\n    # need to wrap the angles\n    variance = circvar(\n        angles.to(\"radians\").m,\n        high=upper_bound.to(\"radians\").m,\n        low=lower_bound.to(\"radians\").m,\n    )\n    return not (variance * unit.radians > width)\n\n\nclass CentroidDistanceSort(AnalysisBase):\n    \"\"\"\n    Sort (from shortest to longest) an input AtomGroup\n    based on their distance from the center of geometry\n    of another AtomGroup.\n\n    Parameters\n    ----------\n    sortable_atoms : MDAnalysis.AtomGroup\n      AtomGroup to sort based on distance to center of geometry of\n      ``reference_atoms``.\n    reference_atoms : MDAnalysis.AtomGroup\n      AtomGroup who's center of geometry will be used to distance sort\n      ``sortable_atoms`` with.\n\n    Attributes\n    ----------\n    results.distances : np.array\n      A numpy array of the distances from the centroid of\n      ``reference_atoms`` for each frame.\n    results.sorted_atomgroup : MDAnalysis.AtomGroup\n      A copy of ``sortable_atoms`` where the atoms are sorted by\n      their distance from the centroid of ``reference_atoms``.\n    \"\"\"\n\n    _analysis_algorithm_is_parallelizable = False\n\n    def __init__(\n        self,\n        sortable_atoms,\n        reference_atoms,\n        **kwargs,\n    ):\n        super().__init__(sortable_atoms.universe.trajectory, **kwargs)\n\n        def get_atomgroup(ag):\n            \"\"\"\n            We need this in case someone passes an Atom not an AG\n            \"\"\"\n            if ag._is_group:\n                return ag\n            return mda.AtomGroup([ag])\n\n        self.sortable_ag = get_atomgroup(sortable_atoms)\n        self.reference_ag = get_atomgroup(reference_atoms)\n\n    def _prepare(self):\n        self.results.distances = np.zeros((self.n_frames, len(self.sortable_ag)))\n\n    def _single_frame(self):\n        self.results.distances[self._frame_index] = distance_array(\n            self.reference_ag.center_of_geometry(),\n            self.sortable_ag.atoms.positions,\n            box=self.reference_ag.dimensions,\n        )\n\n    def _conclude(self):\n        idxs = np.argsort(np.mean(self.results.distances, axis=0))\n        self.results.sorted_atomgroup = self.sortable_ag.atoms[idxs]\n\n\nclass FindHostAtoms(AnalysisBase):\n    \"\"\"\n    Class filter host atoms based on their distance\n    from a set of guest atoms.\n\n    Parameters\n    ----------\n    host_atoms : MDAnalysis.AtomGroup\n      Initial selection of host atoms to filter from.\n    guest_atoms : MDAnalysis.AtomGroup\n      Selection of guest atoms to search around.\n    min_search_distance: openff.units.Quantity\n      Minimum distance to filter atoms within.\n    max_search_distance: openff.units.Quantity\n      Maximum distance to filter atoms within.\n\n    Attributes\n    ----------\n    results.host_idxs : np.ndarray\n      A NumPy array of host indices in the Universe.\n    \"\"\"\n\n    _analysis_algorithm_is_parallelizable = False\n\n    def __init__(\n        self,\n        host_atoms,\n        guest_atoms,\n        min_search_distance,\n        max_search_distance,\n        **kwargs,\n    ):\n        super().__init__(host_atoms.universe.trajectory, **kwargs)\n\n        def get_atomgroup(ag):\n            if ag._is_group:\n                return ag\n            return mda.AtomGroup([ag])\n\n        self.host_ag = get_atomgroup(host_atoms)\n        self.guest_ag = get_atomgroup(guest_atoms)\n        self.min_cutoff = min_search_distance.to(\"angstrom\").m\n        self.max_cutoff = max_search_distance.to(\"angstrom\").m\n\n    def _prepare(self):\n        self.results.host_idxs = set(self.host_ag.atoms.ix)\n\n    def _single_frame(self):\n        pairs = capped_distance(\n            reference=self.guest_ag.positions,\n            configuration=self.host_ag.positions,\n            max_cutoff=self.max_cutoff,\n            min_cutoff=self.min_cutoff,\n            box=self.guest_ag.universe.dimensions,\n            return_distances=False,\n        )\n\n        host_idxs = set(self.host_ag.atoms[p].ix for p in pairs[:, 1])\n\n        # We do an intersection as we go along to prune atoms that don't pass\n        # the distance selection criteria\n        self.results.host_idxs = self.results.host_idxs.intersection(host_idxs)\n\n    def _conclude(self):\n        self.results.host_idxs = np.array(list(self.results.host_idxs))\n\n\n# TODO: needs custom type https://github.com/OpenFreeEnergy/openfe/issues/1569\ndef get_local_rmsf(atomgroup: mda.AtomGroup):  # -> ArrayQuantity:\n    \"\"\"\n    Get the RMSF of an AtomGroup when aligned upon itself.\n\n    Parameters\n    ----------\n    atomgroup : MDAnalysis.AtomGroup\n\n    Return\n    ------\n    rmsf : openff.units.Quantity\n      ArrayQuantity of RMSF values.\n    \"\"\"\n    # The no trajectory case\n    if len(atomgroup.universe.trajectory) < 2:\n        return np.zeros(atomgroup.n_atoms) * unit.angstrom\n\n    # First let's copy our Universe\n    copy_u = atomgroup.universe.copy()\n    ag = copy_u.atoms[atomgroup.atoms.ix]\n\n    # Reset the trajectory index, otherwise we'll get in trouble with nojump\n    copy_u.trajectory[0]\n\n    nojump = NoJump()\n    align = Aligner(ag)\n    copy_u.trajectory.add_transformations(nojump, align)\n\n    rmsf = RMSF(ag)\n    rmsf.run()\n    return rmsf.results.rmsf * unit.angstrom\n\n\ndef _atomgroup_has_bonds(atomgroup: Union[mda.AtomGroup, mda.Universe]) -> bool:\n    \"\"\"\n    Check if all residues in an AtomGroup or Universe have bonds.\n\n    Parameters\n    ----------\n    atomgroup : Union[mda.Atomgroup, mda.Universe]\n      Either an MDAnalysis AtomGroup or Universe to check for bonds.\n\n    Returns\n    -------\n    bool\n      True if all residues contain at least one bond, False otherwise.\n    \"\"\"\n    if not hasattr(atomgroup, \"bonds\"):\n        return False\n\n    # Assume that any residue with more than one atom should have a bond\n    if not all(len(r.atoms.bonds) > 0 for r in atomgroup.residues if len(r.atoms) > 1):\n        return False\n\n    return True\n\n\ndef stable_secondary_structure_selection(\n    atomgroup: mda.AtomGroup,\n    trim_chain_start: int = 10,\n    trim_chain_end: int = 10,\n    min_structure_size: int = 6,\n    trim_structure_ends: int = 2,\n) -> mda.AtomGroup:\n    \"\"\"\n    Select all atoms in a given AtomGroup which belong to residues with a\n    stable secondary structure as defined by Baumann et al.[1]\n\n    The selection algorithm works in the following manner:\n      1. Protein residues are selected from the ``atomgroup``.\n      2. If there are fewer than 30 protein residues, raise an error.\n      3. Split the protein residues by fragment, guessing bonds if necessary.\n      4. Discard the first ``trim_chain_start`` and the last\n         ``trim_chain_end`` residues per fragment.\n      5. Run DSSP using the last trajectory frame on the remaining\n         fragment residues.\n      6. Extract all contiguous structure units that are longer than\n         ``min_structure_size``, removing ``trim_structure_ends``\n         residues from each end of the structure.\n      7. For all extract structures, if there are more beta-sheet\n         residues than there are alpha-helix residues, then allow\n         residues to be selected from either structure type. If not,\n         then only allow alpha-helix residues.\n      8. Select all atoms in the ``atomgroup`` that belong to residues\n         from extracted structure units of the selected structure type.\n\n    Parameters\n    ----------\n    atomgroup : mda.AtomgGroup\n      The AtomGroup to select atoms from.\n    trim_chain_start: int\n      The number of residues to trim from the start of each\n      protein chain. Default 10.\n    trim_chain_end : int\n      The number of residues to trim from the end of each\n      protein chain. Default 10.\n    min_structure_size : int\n      The minimum number of residues needed in a given\n      secondary structure unit to be considered stable. Default 8.\n    trim_structure_ends : int\n      The number of residues to trim from the end of each\n      secondary structure units. Default 3.\n\n    Returns\n    -------\n    AtomGroup : mda.AtomGroup\n      An AtomGroup containing all the atoms from the input AtomGroup\n      which belong to stable secondary structure residues.\n\n    Raises\n    ------\n    UserWarning\n      If there are no bonds for the protein atoms in the input\n      host residue. In this case, the bonds will be guessed\n      using a simple distance metric.\n\n    Notes\n    -----\n    * This selection algorithm assumes contiguous & ordered residues.\n    * We recommend always trimming at least one residue at the ends of\n      each chain using ``trim_chain_start`` and ``trim_chain_end`` to\n      avoid issues with capping residues.\n    * DSSP assignment is done on the final frame of the trajectory.\n\n    References\n    ----------\n    [1] Baumann, Hannah M., et al. \"Broadening the scope of binding free energy\n        calculations using a Separated Topologies approach.\" (2023).\n    \"\"\"\n    # First let's copy our Universe so we don't overwrite its current state\n    copy_u = atomgroup.universe.copy()\n\n    # Create an AtomGroup that contains all the protein residues in the\n    # input Universe - we will filter by what matches in the atomgroup later\n    copy_protein_ag = copy_u.select_atoms(\"protein\").atoms\n\n    # We need to split by fragments to account for multiple chains\n    # To do this, we need bonds!\n    if not _atomgroup_has_bonds(copy_protein_ag):\n        wmsg = \"No bonds found in input Universe, will attempt to guess them.\"\n        warnings.warn(wmsg)\n        copy_protein_ag.guess_bonds()\n\n    structures = []  # container for all contiguous secondary structure units\n    # Counter for each residue type found\n    structure_residue_counts = {\"H\": 0, \"E\": 0, \"-\": 0}\n    # THe minimum length any chain must have\n    min_chain_length = trim_chain_start + trim_chain_end + min_structure_size\n\n    # Loop over each continually bonded section (i.e. chain) of the protein\n    for frag in copy_protein_ag.fragments:\n        # If this fragment is too small, skip processing it\n        if len(frag.residues) < min_chain_length:\n            continue\n\n        # Trim the chain ends\n        chain = frag.residues[trim_chain_start:-trim_chain_end].atoms\n\n        try:\n            # Run on the last frame\n            # TODO: maybe filter out any residue that changes secondary\n            # structure during the trajectory\n            dssp = DSSP(chain).run(start=-1)\n        except ValueError:\n            # DSSP may fail if it doesn't recognise the system's atom names\n            # or non-canonical residues are included, in this case just skip\n            continue\n\n        # Tag each residue structure by its resindex\n        dssp_results = [\n            (structure, resid)\n            for structure, resid in zip(dssp.results.dssp[0], chain.residues.resindices)\n        ]\n\n        # Group by contiguous secondary structure\n        for _, group_iter in groupby(dssp_results, lambda x: x[0]):\n            group = list(group_iter)\n            if len(group) >= min_structure_size:\n                structures.append(group[trim_structure_ends:-trim_structure_ends])\n                num_residues = len(group) - (2 * trim_structure_ends)\n                structure_residue_counts[group[0][0]] += num_residues\n\n    # Pick atoms in both helices and beta sheets\n    allowed_structures = [\"H\", \"E\"]\n\n    allowed_residxs = []\n    for structure in structures:\n        if structure[0][0] in allowed_structures:\n            allowed_residxs.extend([residue[1] for residue in structure])\n\n    # Resindexes are keyed at the Universe scale not AtomGroup\n    allowed_atoms = atomgroup.universe.residues[allowed_residxs].atoms\n\n    # Pick up all the atoms that intersect the initial selection and\n    # those allowed.\n    return atomgroup.intersection(allowed_atoms)\n\n\ndef protein_chain_selection(\n    atomgroup: mda.AtomGroup,\n    min_chain_length: int = 30,\n    trim_chain_start: int = 10,\n    trim_chain_end: int = 10,\n) -> mda.AtomGroup:\n    \"\"\"\n    Return a sub-selection of the input AtomGroup which belongs to protein\n    chains trimmed by ``trim_chain_start`` and ``trim_chain_end``.\n\n    Protein chains are defined as any continuously bonded part of system with\n    at least ``min_chain_length`` (default: 30) residues which match the\n    ``protein`` selection of MDAnalysis.\n\n    Parameters\n    ----------\n    atomgroup : mda.AtomgGroup\n      The AtomGroup to select atoms from.\n    min_chain_length : int\n      The minimum number of residues to be considered a protein chain. Default 30.\n    trim_chain_start : int\n      The number of residues to trim from the start of each\n      protein chain. Default 10.\n    trim_chain_end : int\n      The number of residues to trim from the end of each\n      protein chain. Default 10.\n\n    Returns\n    -------\n    atomgroup : mda.AtomGroup\n      An AtomGroup containing all the atoms from the input AtomGroup\n      which belong to the trimmed protein chains.\n    \"\"\"\n    # First let's copy our Universe so we don't overwrite its current state\n    copy_u = atomgroup.universe.copy()\n\n    # Create an AtomGroup that contains all the protein residues in the\n    # input Universe - we will filter by what matches in the atomgroup later\n    copy_protein_ag = copy_u.select_atoms(\"protein\").atoms\n\n    # We need to split by fragments to account for multiple chains\n    # To do this, we need bonds!\n    if not _atomgroup_has_bonds(copy_protein_ag):\n        wmsg = \"No bonds found in input Universe, will attempt to guess them.\"\n        warnings.warn(wmsg)\n        copy_protein_ag.guess_bonds()\n\n    copy_chains_ags_list = []\n\n    # Loop over each continually bonded section (i.e. chain) of the protein\n    for frag in copy_protein_ag.fragments:\n        # If this chain is less than min_chain_length residues, it's probably a peptide\n        if len(frag.residues) < min_chain_length:\n            continue\n\n        chain = frag.residues[trim_chain_start:-trim_chain_end].atoms\n        copy_chains_ags_list.append(chain)\n\n    # If the list is empty, return an empty atomgroup\n    if not copy_chains_ags_list:\n        return atomgroup.atoms[[]]\n\n    # Create a single atomgroup from all chains\n    copy_chains_ag = sum(copy_chains_ags_list)\n\n    # Now get a list of all the chain atoms in the original Universe\n    # Resindexes are keyed at the Universe scale not AtomGroup\n    chain_atoms = atomgroup.universe.atoms[copy_chains_ag.atoms.ix]\n\n    # Return all atoms at the intersection of the input atomgroup and\n    # the chains atomgroup\n    return atomgroup.intersection(chain_atoms)\n"
  },
  {
    "path": "src/openfe/protocols/restraint_utils/openmm/__init__.py",
    "content": ""
  },
  {
    "path": "src/openfe/protocols/restraint_utils/openmm/omm_forces.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\n\"\"\"\nCustom OpenMM Forces\n\nTODO\n----\n* Add relevant duecredit entries.\n\"\"\"\n\nimport numpy as np\nimport openmm\n\n\ndef get_boresch_energy_function(\n    control_parameter: str,\n) -> str:\n    \"\"\"\n    Return a Boresch-style energy function for a CustomCompoundForce.\n\n    Parameters\n    ----------\n    control_parameter : str\n      A string for the lambda scaling control parameter\n\n    Returns\n    -------\n    str\n      The energy function string.\n    \"\"\"\n    energy_function = (\n        f\"{control_parameter} * E; \"\n        \"E = (K_r/2)*(distance(p3,p4) - r_aA0)^2 \"\n        \"+ (K_thetaA/2)*(angle(p2,p3,p4)-theta_A0)^2 + (K_thetaB/2)*(angle(p3,p4,p5)-theta_B0)^2 \"\n        \"+ (K_phiA/2)*dphi_A^2 + (K_phiB/2)*dphi_B^2 + (K_phiC/2)*dphi_C^2; \"\n        \"dphi_A = dA - floor(dA/(2.0*pi)+0.5)*(2.0*pi); dA = dihedral(p1,p2,p3,p4) - phi_A0; \"\n        \"dphi_B = dB - floor(dB/(2.0*pi)+0.5)*(2.0*pi); dB = dihedral(p2,p3,p4,p5) - phi_B0; \"\n        \"dphi_C = dC - floor(dC/(2.0*pi)+0.5)*(2.0*pi); dC = dihedral(p3,p4,p5,p6) - phi_C0; \"\n        f\"pi = {np.pi}; \"\n    )\n    return energy_function\n\n\ndef get_periodic_boresch_energy_function(\n    control_parameter: str,\n) -> str:\n    \"\"\"\n    Return a Boresch-style energy function with a periodic torsion for a\n    CustomCompoundForce.\n\n    Parameters\n    ----------\n    control_parameter : str\n      A string for the lambda scaling control parameter\n\n    Returns\n    -------\n    str\n      The energy function string.\n    \"\"\"\n    energy_function = (\n        f\"{control_parameter} * E; \"\n        \"E = (K_r/2)*(distance(p3,p4) - r_aA0)^2 \"\n        \"+ (K_thetaA/2)*(angle(p2,p3,p4)-theta_A0)^2 + (K_thetaB/2)*(angle(p3,p4,p5)-theta_B0)^2 \"\n        \"+ (K_phiA/2)*uphi_A + (K_phiB/2)*uphi_B + (K_phiC/2)*uphi_C; \"\n        \"uphi_A = (1-cos(dA)); dA = dihedral(p1,p2,p3,p4) - phi_A0; \"\n        \"uphi_B = (1-cos(dB)); dB = dihedral(p2,p3,p4,p5) - phi_B0; \"\n        \"uphi_C = (1-cos(dC)); dC = dihedral(p3,p4,p5,p6) - phi_C0; \"\n        f\"pi = {np.pi}; \"\n    )\n    return energy_function\n\n\ndef get_custom_compound_bond_force(\n    energy_function: str,\n    n_particles: int = 6,\n):\n    \"\"\"\n    Return an OpenMM CustomCompoundForce\n\n    TODO\n    ----\n    Change this to a direct subclass like openmmtools.force.\n\n    Acknowledgements\n    ----------------\n    Boresch-like energy functions are reproduced from `Yank <https://github.com/choderalab/yank>`_\n    \"\"\"\n    return openmm.CustomCompoundBondForce(n_particles, energy_function)\n\n\ndef add_force_in_separate_group(\n    system: openmm.System,\n    force: openmm.Force,\n):\n    \"\"\"\n    Add force to a System in a separate force group.\n\n    Parameters\n    ----------\n    system : openmm.System\n      System to add the Force to.\n    force : openmm.Force\n      The Force to add to the System.\n\n    Raises\n    ------\n    ValueError\n      If all 32 force groups are occupied.\n\n\n    TODO\n    ----\n    Unlike the original Yank implementation, we assume that\n    all 32 force groups will not be filled. Should this be an issue\n    we can consider just separating it from NonbondedForce.\n\n    Acknowledgements\n    ----------------\n    Mostly reproduced from `Yank <https://github.com/choderalab/yank>`_.\n    \"\"\"\n    available_force_groups = set(range(32))\n    for existing_force in system.getForces():\n        available_force_groups.discard(existing_force.getForceGroup())\n\n    if len(available_force_groups) == 0:\n        errmsg = \"No available force groups could be found\"\n        raise ValueError(errmsg)\n\n    force.setForceGroup(min(available_force_groups))\n    system.addForce(force)\n"
  },
  {
    "path": "src/openfe/protocols/restraint_utils/openmm/omm_restraints.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\n\"\"\"\nClasses for applying restraints to OpenMM Systems.\n\nAcknowledgements\n----------------\nMany of the classes here are at least in part inspired from\n`Yank <https://github.com/choderalab/yank/>`_ and\n`OpenMMTools <https://github.com/choderalab/openmmtools>`_.\n\nTODO\n----\n* Add relevant duecredit entries.\n* Add Periodic Torsion Boresch class\n\"\"\"\n\nimport abc\n\nimport numpy as np\nimport openmm\nfrom gufe.settings.models import SettingsBaseModel\nfrom openff.units import Quantity, unit\nfrom openff.units.openmm import from_openmm, to_openmm\nfrom openmm import unit as omm_unit\nfrom openmmtools.forces import (\n    FlatBottomRestraintBondForce,\n    FlatBottomRestraintForce,\n    HarmonicRestraintBondForce,\n    HarmonicRestraintForce,\n)\nfrom openmmtools.states import GlobalParameterState, ThermodynamicState\n\nfrom openfe.protocols.restraint_utils.geometry import (\n    BaseRestraintGeometry,\n    BoreschRestraintGeometry,\n    DistanceRestraintGeometry,\n    FlatBottomDistanceGeometry,\n    HostGuestRestraintGeometry,\n)\nfrom openfe.protocols.restraint_utils.settings import (\n    BoreschRestraintSettings,\n    DistanceRestraintSettings,\n    FlatBottomRestraintSettings,\n)\n\nfrom .omm_forces import (\n    add_force_in_separate_group,\n    get_boresch_energy_function,\n    get_custom_compound_bond_force,\n)\n\n\nclass RestraintParameterState(GlobalParameterState):\n    \"\"\"\n    Composable state to control `lambda_restraints` OpenMM Force parameters.\n\n    See :class:`openmmtools.states.GlobalParameterState` for more details.\n\n    Parameters\n    ----------\n    parameters_name_suffix : Optional[str]\n      If specified, the state will control a modified version of the parameter\n      ``lambda_restraints_{parameters_name_suffix}` instead of just\n      ``lambda_restraints``.\n    lambda_restraints : Optional[float]\n      The scaling parameter for the restraint. If defined,\n      must be between 0 and 1. In most cases, a value of 1 indicates that the\n      restraint is fully turned on, whilst a value of 0 indicates that it is\n      inactive.\n\n    Acknowledgement\n    ---------------\n    Partially reproduced from Yank.\n    \"\"\"\n\n    # We set the standard system to a fully interacting restraint\n    lambda_restraints = GlobalParameterState.GlobalParameter(\n        \"lambda_restraints\", standard_value=1.0\n    )\n\n    @lambda_restraints.validator  # type: ignore\n    def lambda_restraints(self, instance, new_value):\n        if new_value is not None and not (0.0 <= new_value <= 1.0):\n            errmsg = f\"lambda_restraints must be between 0.0 and 1.0 and got {new_value}\"\n            raise ValueError(errmsg)\n        # Not crashing out on None to match upstream behaviour\n        return new_value\n\n\nclass BaseHostGuestRestraints(abc.ABC):\n    \"\"\"\n    An abstract base class for defining objects that apply a restraint between\n    two entities (referred to as a Host and a Guest).\n\n    The following class variables must be set to the intended class to allow for type validation during the\n    instantiation of the restraints.\n\n    TODO\n    ----\n    Add some developer examples here.\n    \"\"\"\n\n    _settings_cls: type[SettingsBaseModel]\n    _geometry_cls: type[BaseRestraintGeometry]\n\n    def __init__(\n        self,\n        restraint_settings: SettingsBaseModel,\n    ):\n        self.settings = restraint_settings\n        self._verify_inputs()\n\n    def _verify_inputs(self):\n        \"\"\"\n        Method for validating that the inputs to the class are correct.\n        \"\"\"\n        if not isinstance(self.settings, self._settings_cls):\n            errmsg = f\"Incorrect settings type {self.settings.__class__.__qualname__} passed through expected a `{self._settings_cls.__qualname__}` instance\"\n            raise ValueError(errmsg)\n\n    def _verify_geometry(self, geometry):\n        \"\"\"\n        Method for validating that the geometry object passed is correct.\n        \"\"\"\n        if not isinstance(geometry, self._geometry_cls):\n            errmsg = f\"Incorrect geometry class type {geometry.__class__.__qualname__} passed through expected a `{self._geometry_cls.__qualname__}` instance\"\n            raise ValueError(errmsg)\n\n    @abc.abstractmethod\n    def add_force(\n        self,\n        thermodynamic_state: ThermodynamicState,\n        geometry,\n        controlling_parameter_name: str,\n    ):\n        \"\"\"\n        Method for in-place adding the Force to the System of a\n        ThermodynamicState.\n\n        Parameters\n        ----------\n        thermodynamic_state : ThermodynamicState\n          The ThermodynamicState with a System to inplace modify with the\n          new force.\n        geometry : BaseRestraintGeometry\n          A geometry object defining the restraint parameters.\n        controlling_parameter_name : str\n          The name of the controlling parameter for the Force.\n        \"\"\"\n        pass\n\n    @abc.abstractmethod\n    def get_standard_state_correction(\n        self,\n        thermodynamic_state: ThermodynamicState,\n        geometry,\n    ) -> Quantity:\n        \"\"\"\n        Get the standard state correction for the Force when\n        applied to the input ThermodynamicState.\n\n        Parameters\n        ----------\n        thermodynamic_state : ThermodynamicState\n          The ThermodynamicState with a System to inplace modify with the\n          new force.\n        geometry : BaseRestraintGeometry\n          A geometry object defining the restraint parameters.\n\n        Returns\n        -------\n        correction : openff.units.Quantity\n          The standard state correction free energy in units compatible\n          with kilojoule per mole.\n        \"\"\"\n        pass\n\n    @abc.abstractmethod\n    def _get_force(\n        self,\n        geometry,\n        controlling_parameter_name: str,\n    ):\n        \"\"\"\n        Helper method to get the relevant OpenMM Force for this\n        class, given an input geometry.\n        \"\"\"\n        pass\n\n\nclass SingleBondMixin:\n    \"\"\"\n    A mixin to extend geometry checks for Forces that can only hold\n    a single atom.\n    \"\"\"\n\n    def _verify_geometry(self, geometry: HostGuestRestraintGeometry):\n        if len(geometry.host_atoms) != 1 or len(geometry.guest_atoms) != 1:\n            errmsg = (\n                \"host_atoms and guest_atoms must only include a single index \"\n                f\"each, got {len(geometry.host_atoms)} and \"\n                f\"{len(geometry.guest_atoms)} respectively.\"\n            )\n            raise ValueError(errmsg)\n        super(SingleBondMixin, self)._verify_geometry(geometry)  # type: ignore[misc]\n\n\nclass BaseRadiallySymmetricRestraintForce(BaseHostGuestRestraints):\n    \"\"\"\n    A base class for all radially symmetric Forces acting between\n    two sets of atoms.\n\n    Must be subclassed.\n    \"\"\"\n\n    _settings_cls = DistanceRestraintSettings\n    _geometry_cls = DistanceRestraintGeometry\n\n    def add_force(\n        self,\n        thermodynamic_state: ThermodynamicState,\n        geometry: DistanceRestraintGeometry,\n        controlling_parameter_name: str = \"lambda_restraints\",\n    ) -> None:\n        \"\"\"\n        Method for in-place adding the Force to the System of the\n        given ThermodynamicState.\n\n        Parameters\n        ----------\n        thermodynamic_state : ThermodynamicState\n          The ThermodynamicState with a System to inplace modify with the\n          new force.\n        geometry : BaseRestraintGeometry\n          A geometry object defining the restraint parameters.\n        controlling_parameter_name : str\n          The name of the controlling parameter for the Force.\n        \"\"\"\n        self._verify_geometry(geometry)\n        force = self._get_force(geometry, controlling_parameter_name)\n        force.setUsesPeriodicBoundaryConditions(thermodynamic_state.is_periodic)\n        # Note .system is a call to get_system() so it's returning a copy\n        system = thermodynamic_state.system\n        add_force_in_separate_group(system, force)\n        thermodynamic_state.system = system\n\n    def get_standard_state_correction(\n        self,\n        thermodynamic_state: ThermodynamicState,\n        geometry: DistanceRestraintGeometry,\n    ) -> Quantity:\n        \"\"\"\n        Get the standard state correction for the Force when\n        applied to the input ThermodynamicState.\n\n        Parameters\n        ----------\n        thermodynamic_state : ThermodynamicState\n          The ThermodynamicState with a System to inplace modify with the\n          new force.\n        geometry : BaseRestraintGeometry\n          A geometry object defining the restraint parameters.\n\n        Returns\n        -------\n        correction : openff.units.Quantity\n          The standard state correction free energy in units compatible\n          with kilojoule per mole.\n        \"\"\"\n        self._verify_geometry(geometry)\n        # Note: this is a throw-away force, so we hard code the\n        # controlling parameter name\n        force = self._get_force(geometry, \"lambda_restraints\")\n        corr = force.compute_standard_state_correction(thermodynamic_state, max_volume=\"system\")\n        dg = corr * thermodynamic_state.kT\n        return from_openmm(dg).to(\"kilojoule_per_mole\")\n\n    def _get_force(self, geometry, controlling_parameter_name: str):\n        raise NotImplementedError(\"only implemented in child classes\")\n\n\nclass HarmonicBondRestraint(SingleBondMixin, BaseRadiallySymmetricRestraintForce):\n    \"\"\"\n    A class to add a harmonic restraint between two atoms\n    in an OpenMM system.\n\n    The restraint is defined as a\n    :class:`openmmtools.forces.HarmonicRestraintBondForce`.\n\n    Notes\n    -----\n    * Settings must contain a ``spring_constant`` for the\n      Force in units compatible with kilojoule/mole/nm**2.\n    \"\"\"\n\n    def _get_force(\n        self,\n        geometry: DistanceRestraintGeometry,\n        controlling_parameter_name: str,\n    ) -> openmm.Force:\n        \"\"\"\n        Get the HarmonicRestraintBondForce given an input geometry.\n\n        Parameters\n        ----------\n        geometry : DistanceRestraintGeometry\n          A geometry class that defines how the Force is applied.\n        controlling_parameter_name : str\n          The name of the controlling parameter for the Force.\n\n        Returns\n        -------\n        HarmonicRestraintBondForce\n          An OpenMM Force that applies a harmonic restraint between\n          two atoms.\n        \"\"\"\n        spring_constant = to_openmm(self.settings.spring_constant).value_in_unit_system(\n            omm_unit.md_unit_system\n        )\n        return HarmonicRestraintBondForce(\n            spring_constant=spring_constant,\n            restrained_atom_index1=geometry.host_atoms[0],\n            restrained_atom_index2=geometry.guest_atoms[0],\n            controlling_parameter_name=controlling_parameter_name,\n        )\n\n\nclass FlatBottomBondRestraint(SingleBondMixin, BaseRadiallySymmetricRestraintForce):\n    \"\"\"\n    A class to add a flat bottom restraint between two atoms\n    in an OpenMM system.\n\n    The restraint is defined as a\n    :class:`openmmtools.forces.FlatBottomRestraintBondForce`.\n\n    Notes\n    -----\n    * Settings must contain a ``spring_constant`` for the\n      Force in units compatible with kilojoule/mole/nm**2.\n    \"\"\"\n\n    _settings_cls = FlatBottomRestraintSettings\n    _geometry_cls: type[FlatBottomDistanceGeometry] = FlatBottomDistanceGeometry\n\n    def _get_force(\n        self,\n        geometry: FlatBottomDistanceGeometry,\n        controlling_parameter_name: str,\n    ) -> openmm.Force:\n        \"\"\"\n        Get the FlatBottomRestraintBondForce given an input geometry.\n\n        Parameters\n        ----------\n        geometry : DistanceRestraintGeometry\n          A geometry class that defines how the Force is applied.\n        controlling_parameter_name : str\n          The name of the controlling parameter for the Force.\n\n        Returns\n        -------\n        FlatBottomRestraintBondForce\n          An OpenMM Force that applies a flat bottom restraint between\n          two atoms.\n        \"\"\"\n        spring_constant = to_openmm(self.settings.spring_constant).value_in_unit_system(\n            omm_unit.md_unit_system\n        )\n        well_radius = to_openmm(geometry.well_radius).value_in_unit_system(omm_unit.md_unit_system)\n        return FlatBottomRestraintBondForce(\n            spring_constant=spring_constant,\n            well_radius=well_radius,\n            restrained_atom_index1=geometry.host_atoms[0],\n            restrained_atom_index2=geometry.guest_atoms[0],\n            controlling_parameter_name=controlling_parameter_name,\n        )\n\n\nclass CentroidHarmonicRestraint(BaseRadiallySymmetricRestraintForce):\n    \"\"\"\n    A class to add a harmonic restraint between the centroid of\n    two sets of atoms in an OpenMM system.\n\n    The restraint is defined as a\n    :class:`openmmtools.forces.HarmonicRestraintForce`.\n\n    Notes\n    -----\n    * Settings must contain a ``spring_constant`` for the\n      Force in units compatible with kilojoule/mole/nm**2.\n    \"\"\"\n\n    def _get_force(\n        self,\n        geometry: DistanceRestraintGeometry,\n        controlling_parameter_name: str,\n    ) -> openmm.Force:\n        \"\"\"\n        Get the HarmonicRestraintForce given an input geometry.\n\n        Parameters\n        ----------\n        geometry : DistanceRestraintGeometry\n          A geometry class that defines how the Force is applied.\n        controlling_parameter_name : str\n          The name of the controlling parameter for the Force.\n\n        Returns\n        -------\n        HarmonicRestraintForce\n          An OpenMM Force that applies a harmonic restraint between\n          the centroid of two sets of atoms.\n        \"\"\"\n        spring_constant = to_openmm(self.settings.spring_constant).value_in_unit_system(\n            omm_unit.md_unit_system\n        )\n        return HarmonicRestraintForce(\n            spring_constant=spring_constant,\n            restrained_atom_indices1=geometry.host_atoms,\n            restrained_atom_indices2=geometry.guest_atoms,\n            controlling_parameter_name=controlling_parameter_name,\n        )\n\n\nclass CentroidFlatBottomRestraint(BaseRadiallySymmetricRestraintForce):\n    \"\"\"\n    A class to add a flat bottom restraint between the centroid\n    of two sets of atoms in an OpenMM system.\n\n    The restraint is defined as a\n    :class:`openmmtools.forces.FlatBottomRestraintForce`.\n\n    Notes\n    -----\n    * Settings must contain a ``spring_constant`` for the\n      Force in units compatible with kilojoule/mole/nm**2.\n    \"\"\"\n\n    def _get_force(\n        self,\n        geometry: FlatBottomDistanceGeometry,\n        controlling_parameter_name: str,\n    ) -> openmm.Force:\n        \"\"\"\n        Get the FlatBottomRestraintForce given an input geometry.\n\n        Parameters\n        ----------\n        geometry : DistanceRestraintGeometry\n          A geometry class that defines how the Force is applied.\n        controlling_parameter_name : str\n          The name of the controlling parameter for the Force.\n\n        Returns\n        -------\n        FlatBottomRestraintForce\n          An OpenMM Force that applies a flat bottom restraint between\n          the centroid of two sets of atoms.\n        \"\"\"\n        spring_constant = to_openmm(self.settings.spring_constant).value_in_unit_system(\n            omm_unit.md_unit_system\n        )\n        # the geometry will take precedence over the settings\n        well_radius = self.settings.well_radius or geometry.well_radius\n        well_radius = to_openmm(well_radius).value_in_unit_system(omm_unit.md_unit_system)\n        return FlatBottomRestraintForce(\n            spring_constant=spring_constant,\n            well_radius=well_radius,\n            restrained_atom_indices1=geometry.host_atoms,\n            restrained_atom_indices2=geometry.guest_atoms,\n            controlling_parameter_name=controlling_parameter_name,\n        )\n\n\nclass BoreschRestraint(BaseHostGuestRestraints):\n    \"\"\"\n    A class to add a Boresch-like restraint between six atoms,\n\n    The restraint is defined as a\n    :class:`openmmtools.forces.CustomCompoundForce` with the\n    following energy function:\n\n        lambda_control_parameter * E;\n        E = (K_r/2)*(distance(p3,p4) - r_aA0)^2\n        + (K_thetaA/2)*(angle(p2,p3,p4)-theta_A0)^2\n        + (K_thetaB/2)*(angle(p3,p4,p5)-theta_B0)^2\n        + (K_phiA/2)*dphi_A^2 + (K_phiB/2)*dphi_B^2\n        + (K_phiC/2)*dphi_C^2;\n        dphi_A = dA - floor(dA/(2.0*pi)+0.5)*(2.0*pi);\n        dA = dihedral(p1,p2,p3,p4) - phi_A0;\n        dphi_B = dB - floor(dB/(2.0*pi)+0.5)*(2.0*pi);\n        dB = dihedral(p2,p3,p4,p5) - phi_B0;\n        dphi_C = dC - floor(dC/(2.0*pi)+0.5)*(2.0*pi);\n        dC = dihedral(p3,p4,p5,p6) - phi_C0;\n\n    Where p1, p2, p3, p4, p5, p6 represent host atoms 2, 1, 0,\n    and guest atoms 0, 1, 2 respectively.\n\n    ``lambda_control_parameter`` is a control parameter for\n    scaling the Force.\n\n    ``K_r`` is defined as the bond spring constant between\n    p3 and p4 and must be provided in the settings in units\n    compatible with kilojoule / mole.\n\n    ``r_aA0`` is the equilibrium distance of the bond between\n    p3 and p4. This must be provided by the Geometry class in\n    units compatiblle with nanometer.\n\n    ``K_thetaA`` and ``K_thetaB`` are the spring constants for the angles\n    formed by (p2, p3, p4) and (p3, p4, p5). They must be provided in the\n    settings in units compatible with kilojoule / mole / radians**2.\n\n    ``theta_A0`` and ``theta_B0`` are the equilibrium values for angles\n    (p2, p3, p4) and (p3, p4, p5). They must be provided by the\n    Geometry class in units compatible with radians.\n\n    ``K_phiA``, ``K_phiB``, and ``K_phiC`` are the equilibrium force constants\n    for the dihedrals formed by (p1, p2, p3, p4), (p2, p3, p4, p5), and\n    (p3, p4, p5, p6). They must be provided in the settings in units\n    compatible with kilojoule / mole / radians ** 2.\n\n    ``phi_A0``, ``phi_B0``, and ``phi_C0`` are the equilibrium values\n    for the dihedrals formed by (p1, p2, p3, p4), (p2, p3, p4, p5), and\n    (p3, p4, p5, p6). They must be provided in the Geometry class in\n    units compatible with radians.\n\n\n    Notes\n    -----\n    * Settings must define the ``K_r`` (d)\n    \"\"\"\n\n    _settings_cls = BoreschRestraintSettings\n    _geometry_cls = BoreschRestraintGeometry\n\n    def add_force(\n        self,\n        thermodynamic_state: ThermodynamicState,\n        geometry: BoreschRestraintGeometry,\n        controlling_parameter_name: str,\n    ) -> None:\n        \"\"\"\n        Method for in-place adding the Boresch CustomCompoundForce\n        to the System of the given ThermodynamicState.\n\n        Parameters\n        ----------\n        thermodynamic_state : ThermodynamicState\n          The ThermodynamicState with a System to inplace modify with the\n          new force.\n        geometry : BaseRestraintGeometry\n          A geometry object defining the restraint parameters.\n        controlling_parameter_name : str\n          The name of the controlling parameter for the Force.\n        \"\"\"\n        self._verify_geometry(geometry)\n        force = self._get_force(\n            geometry,\n            controlling_parameter_name,\n        )\n        force.setUsesPeriodicBoundaryConditions(thermodynamic_state.is_periodic)\n        # Note .system is a call to get_system() so it's returning a copy\n        system = thermodynamic_state.system\n        add_force_in_separate_group(system, force)\n        thermodynamic_state.system = system\n\n    def _get_force(\n        self, geometry: BoreschRestraintGeometry, controlling_parameter_name: str\n    ) -> openmm.CustomCompoundBondForce:\n        \"\"\"\n        Get the CustomCompoundForce with a Boresch-like energy function\n        given an input geometry.\n\n        Parameters\n        ----------\n        geometry : DistanceRestraintGeometry\n          A geometry class that defines how the Force is applied.\n        controlling_parameter_name : str\n          The name of the controlling parameter for the Force.\n\n        Returns\n        -------\n        CustomCompoundForce\n          An OpenMM CustomCompoundForce that applies a Boresch-like\n          restraint between 6 atoms.\n        \"\"\"\n        efunc = get_boresch_energy_function(controlling_parameter_name)\n\n        force = get_custom_compound_bond_force(\n            energy_function=efunc,\n            n_particles=6,\n        )\n\n        param_values = []\n\n        parameter_dict = {\n            \"K_r\": self.settings.K_r,\n            \"r_aA0\": geometry.r_aA0,\n            \"K_thetaA\": self.settings.K_thetaA,\n            \"theta_A0\": geometry.theta_A0,\n            \"K_thetaB\": self.settings.K_thetaB,\n            \"theta_B0\": geometry.theta_B0,\n            \"K_phiA\": self.settings.K_phiA,\n            \"phi_A0\": geometry.phi_A0,\n            \"K_phiB\": self.settings.K_phiB,\n            \"phi_B0\": geometry.phi_B0,\n            \"K_phiC\": self.settings.K_phiC,\n            \"phi_C0\": geometry.phi_C0,\n        }\n        for key, val in parameter_dict.items():\n            param_values.append(to_openmm(val).value_in_unit_system(omm_unit.md_unit_system))\n            force.addPerBondParameter(key)\n\n        force.addGlobalParameter(controlling_parameter_name, 1.0)\n        atoms = [\n            geometry.host_atoms[2],\n            geometry.host_atoms[1],\n            geometry.host_atoms[0],\n            geometry.guest_atoms[0],\n            geometry.guest_atoms[1],\n            geometry.guest_atoms[2],\n        ]\n        force.addBond(atoms, param_values)\n        force.setName(\"Boresch-like\")\n        return force\n\n    def get_standard_state_correction(\n        self,\n        thermodynamic_state: ThermodynamicState,\n        geometry: BoreschRestraintGeometry,\n    ) -> Quantity:\n        \"\"\"\n        Get the standard state correction for the Boresch-like\n        restraint when applied to the input ThermodynamicState.\n\n        The correction is calculated using the analytical method\n        as defined by Boresch et al. [1]\n\n        Parameters\n        ----------\n        thermodynamic_state : ThermodynamicState\n          The ThermodynamicState with a System to inplace modify with the\n          new force.\n        geometry : BaseRestraintGeometry\n          A geometry object defining the restraint parameters.\n\n        Returns\n        -------\n        correction : openff.units.Quantity\n          The standard state correction free energy in units compatible\n          with kilojoule per mole.\n\n        References\n        ----------\n        [1] Boresch S, Tettinger F, Leitgeb M, Karplus M. J Phys Chem B. 107:9535, 2003.\n            http://dx.doi.org/10.1021/jp0217839\n        \"\"\"\n        self._verify_geometry(geometry)\n\n        StandardV = 1.66053928 * unit.nanometer**3\n        kt = from_openmm(thermodynamic_state.kT)\n\n        # distances\n        r_aA0 = geometry.r_aA0.to(\"nm\")\n        sin_thetaA0 = np.sin(geometry.theta_A0.to(\"radians\"))\n        sin_thetaB0 = np.sin(geometry.theta_B0.to(\"radians\"))\n\n        # restraint energies\n        K_r = self.settings.K_r.to(\"kilojoule_per_mole / nm ** 2\")\n        K_thetaA = self.settings.K_thetaA.to(\"kilojoule_per_mole / radians ** 2\")\n        K_thetaB = self.settings.K_thetaB.to(\"kilojoule_per_mole / radians ** 2\")\n        K_phiA = self.settings.K_phiA.to(\"kilojoule_per_mole / radians ** 2\")\n        K_phiB = self.settings.K_phiB.to(\"kilojoule_per_mole / radians ** 2\")\n        K_phiC = self.settings.K_phiC.to(\"kilojoule_per_mole / radians ** 2\")\n\n        numerator1 = 8.0 * (np.pi**2) * StandardV\n        denum1 = (r_aA0**2) * sin_thetaA0 * sin_thetaB0\n        numerator2 = np.sqrt(K_r * K_thetaA * K_thetaB * K_phiA * K_phiB * K_phiC)\n        denum2 = (2.0 * np.pi * kt) ** 3\n\n        dG = -kt * np.log((numerator1 / denum1) * (numerator2 / denum2))\n\n        return dG\n"
  },
  {
    "path": "src/openfe/protocols/restraint_utils/settings.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\n\"\"\"\nSettings for adding restraints.\n\nTODO\n----\n* Rename from host/guest to molA/molB?\n* Add all the restraint settings entries.\n\"\"\"\n\nfrom typing import Annotated, Literal, Optional, TypeAlias\n\nfrom gufe.settings import SettingsBaseModel\nfrom gufe.settings.typing import GufeQuantity, NanometerQuantity, specify_quantity_units\nfrom openff.units import unit\nfrom pydantic import ConfigDict, field_validator\n\nSpringConstantLinearQuantity: TypeAlias = Annotated[\n    GufeQuantity, specify_quantity_units(\"kilojoule_per_mole / nm ** 2\")\n]\nSpringConstantAngularQuantity: TypeAlias = Annotated[\n    GufeQuantity, specify_quantity_units(\"kilojoule_per_mole / radians ** 2\")\n]\n\n\nclass BaseRestraintSettings(SettingsBaseModel):\n    \"\"\"\n    Base class for RestraintSettings objects.\n    \"\"\"\n\n    model_config = ConfigDict(arbitrary_types_allowed=True)\n\n\nclass DistanceRestraintSettings(BaseRestraintSettings):\n    \"\"\"\n    Settings defining a distance restraint between\n    two groups of atoms defined as ``host`` and ``guest``.\n    \"\"\"\n\n    spring_constant: SpringConstantLinearQuantity\n    \"\"\"\n    The distance restraint potential spring constant.\n    \"\"\"\n    host_atoms: Optional[list[int]] = None\n    \"\"\"\n    The indices of the host component atoms to restrain.\n    If defined, these will override any automatic selection.\n    \"\"\"\n    guest_atoms: Optional[list[int]] = None\n    \"\"\"\n    The indices of the guest component atoms to restraint.\n    If defined, these will override any automatic selection.\n    \"\"\"\n    central_atoms_only: bool = False\n    \"\"\"\n    Whether to apply the restraint solely to the central atoms\n    of each group.\n\n    Note: this can only be applied if ``host`` and ``guest``\n    represent small molecules.\n    \"\"\"\n\n    @field_validator(\"guest_atoms\", \"host_atoms\")\n    def positive_idxs(cls, v):\n        if v is not None and any([i < 0 for i in v]):\n            errmsg = \"negative indices passed\"\n            raise ValueError(errmsg)\n        return v\n\n\nclass FlatBottomRestraintSettings(DistanceRestraintSettings):\n    \"\"\"\n    Settings to define a flat bottom restraint between two\n    groups of atoms named ``host`` and ``guest``.\n    \"\"\"\n\n    well_radius: NanometerQuantity | None = None\n    \"\"\"\n    The distance at which the harmonic restraint is imposed\n    in units of distance.\n    \"\"\"\n\n    @field_validator(\"well_radius\")\n    def positive_value(cls, v):\n        if v is not None and v.m < 0:\n            errmsg = f\"well radius cannot be negative {v}\"\n            raise ValueError(errmsg)\n        return v\n\n\nclass BoreschRestraintSettings(BaseRestraintSettings):\n    \"\"\"\n    Settings to define a Boresch-style restraint between\n    two groups of atoms named ``host`` and ``guest``.\n\n    The restraint is defined in the following manner:\n\n      H2                         G2\n       -                        -\n        -                      -\n         H1 - - H0 -- G0 - - G1\n\n    Where HX represents the X index of ``host_atoms``\n    and GX the X indexx of ``guest_atoms``.\n\n    By default, the Boresch-like restraint will be\n    obtained using a modified version of the\n    search algorithm implemented by Baumann et al. [1].\n\n    If ``guest_atoms`` and ``host_atoms`` are defined,\n    these indices will be used instead.\n\n    References\n    ----------\n    [1] Baumann, Hannah M., et al. \"Broadening the scope of binding free\n        energy calculations using a Separated Topologies approach.\" (2023).\n    [2] Wu, Zhiyi, et al. \"Optimizing Absolute Binding Free Energy\n        Calculations for Production Usage.\"\n        (2025; DOI 10.26434/chemrxiv-2025-q08ld-v2)\n    \"\"\"\n\n    K_r: SpringConstantLinearQuantity = 4184.0 * unit.kilojoule_per_mole / unit.nm**2\n    \"\"\"\n    The bond spring constant between H0 and G0. Default 10 kcal/mol/Å²\n    \"\"\"\n    K_thetaA: SpringConstantAngularQuantity = 334.72 * unit.kilojoule_per_mole / unit.radians**2\n    \"\"\"\n    The spring constant for the angle formed by H1-H0-G0.\n    Default 80 kcal/mol/rad²\n    \"\"\"\n    K_thetaB: SpringConstantAngularQuantity = 334.72 * unit.kilojoule_per_mole / unit.radians**2\n    \"\"\"\n    The spring constant for the angle formed by H0-G0-G1.\n    Default 80 kcal/mol/rad²\n    \"\"\"\n    K_phiA: SpringConstantAngularQuantity = 334.72 * unit.kilojoule_per_mole / unit.radians**2\n    \"\"\"\n    The equilibrium force constant for the dihedral formed by\n    H2-H1-H0-G0. Default 80 kcal/mol/rad²\n    \"\"\"\n    K_phiB: SpringConstantAngularQuantity = 334.72 * unit.kilojoule_per_mole / unit.radians**2\n    \"\"\"\n    The equilibrium force constant for the dihedral formed by\n    H1-H0-G0-G1. Default 80 kcal/mol/rad²\n    \"\"\"\n    K_phiC: SpringConstantAngularQuantity = 334.72 * unit.kilojoule_per_mole / unit.radians**2\n    \"\"\"\n    The equilibrium force constant for the dihedral formed by\n    H0-G0-G1-G2. Default 80 kcal/mol/rad²\n    \"\"\"\n    host_selection: str = \"backbone\"\n    \"\"\"\n    Boresch-like restraint search parameter.\n    An MDAnalysis selection string to sub-select the host atoms which will be involved in the restraint.\n    \"\"\"\n    dssp_filter: bool = True\n    \"\"\"\n    Boresch-like restraint search parameter.\n    Whether or not to try to do a DSSP filter on the host atoms.\n    \"\"\"\n    rmsf_cutoff: NanometerQuantity = 0.1 * unit.nanometer\n    \"\"\"\n    Boresch-like restraint search parameter.\n    The cutoff value for filtering atoms by their root mean square fluctuation. Atoms with values above this cutoff will be disregarded.\n    \"\"\"\n    host_min_distance: NanometerQuantity = 0.5 * unit.nanometer\n    \"\"\"\n    Boresch-like restraint search parameter.\n    The minimum distance between any host atom and the guest G0 atom. Must be in units compatible with nanometer.\n    \"\"\"\n    host_max_distance: NanometerQuantity = 1.5 * unit.nanometer\n    \"\"\"\n    Boresch-like restraint search parameter.\n    The maximum distance between any host atom and the guest G0 atom. Must be in units compatible with nanometer.\n    \"\"\"\n    # TODO: re-enable this (Issue #1555)\n    # host_atoms: Optional[list[int]] = None\n    # \"\"\"\n    # The indices of the host component atoms to restrain.\n    # If defined, these will override any automatic selection.\n    # \"\"\"\n    # guest_atoms: Optional[list[int]] = None\n    # \"\"\"\n    # The indices of the guest component atoms to restraint.\n    # If defined, these will override any automatic selection.\n    # \"\"\"\n    anchor_finding_strategy: Literal[\"multi-residue\", \"bonded\"] = \"bonded\"\n    \"\"\"\n    The Boresch atom picking strategy to use.\n\n    Current options:\n      * `bonded`: pick host atoms that are bonded to each other.\n      * `multi-residue`: pick host atoms which can span multiple residues.\n    \"\"\"\n\n\n#     @field_validator(\"guest_atoms\", \"host_atoms\")\n#     def positive_idxs_list(cls, v):\n#         if v is not None and any([i < 0 for i in v]):\n#             errmsg = \"negative indices passed\"\n#             raise ValueError(errmsg)\n#         return v\n"
  },
  {
    "path": "src/openfe/setup/__init__.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\n\n\nfrom .atom_mapping import (\n    KartografAtomMapper,\n    LigandAtomMapper,\n    LigandAtomMapping,\n    LomapAtomMapper,\n    PersesAtomMapper,\n    lomap_scorers,\n    perses_scorers,\n)\n\n# TODO: circular import risk with LigandNetwork\n# isort: off\nfrom gufe import LigandNetwork\nfrom . import ligand_network_planning\n\nfrom .alchemical_network_planner import RHFEAlchemicalNetworkPlanner, RBFEAlchemicalNetworkPlanner\n"
  },
  {
    "path": "src/openfe/setup/alchemical_network_planner/__init__.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\n\nfrom .relative_alchemical_network_planner import (\n    RBFEAlchemicalNetworkPlanner,\n    RHFEAlchemicalNetworkPlanner,\n)\n"
  },
  {
    "path": "src/openfe/setup/alchemical_network_planner/abstract_alchemical_network_planner.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\n\nimport abc\nfrom typing import Iterable\n\nfrom gufe import AlchemicalNetwork\n\n\nclass AbstractAlchemicalNetworkPlanner(abc.ABC):\n    \"\"\"\n    this abstract class defines the interface for the alchemical Network Planners.\n    \"\"\"\n\n    @abc.abstractmethod\n    def __call__(self, *args, **kwargs) -> AlchemicalNetwork:\n        raise NotImplementedError()\n"
  },
  {
    "path": "src/openfe/setup/alchemical_network_planner/relative_alchemical_network_planner.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\nimport abc\nimport warnings\nfrom typing import Callable, Iterable, Optional, Type\n\nfrom gufe import (\n    AlchemicalNetwork,\n    ChemicalSystem,\n    LigandAtomMapping,\n    LigandNetwork,\n    ProteinComponent,\n    Protocol,\n    SmallMoleculeComponent,\n    SolventComponent,\n    Transformation,\n)\n\nfrom ...protocols.openmm_rfe.equil_rfe_methods import RelativeHybridTopologyProtocol\nfrom .. import LomapAtomMapper\nfrom ..atom_mapping.ligandatommapper import LigandAtomMapper\nfrom ..atom_mapping.lomap_scorers import default_lomap_score\nfrom ..chemicalsystem_generator import (\n    EasyChemicalSystemGenerator,\n    RFEComponentLabels,\n)\nfrom ..chemicalsystem_generator.abstract_chemicalsystem_generator import (\n    AbstractChemicalSystemGenerator,\n)\nfrom ..ligand_network_planning import generate_minimal_spanning_network\nfrom .abstract_alchemical_network_planner import (\n    AbstractAlchemicalNetworkPlanner,\n)\n\n# TODO: move/or find better structure for protocol_generator combinations!\nPROTOCOL_GENERATOR = {\n    RelativeHybridTopologyProtocol: EasyChemicalSystemGenerator,\n}\n\n\nclass RelativeAlchemicalNetworkPlanner(AbstractAlchemicalNetworkPlanner, abc.ABC):\n    _chemical_system_generator: AbstractChemicalSystemGenerator\n\n    def __init__(\n        self,\n        name: str = \"easy_rfe_calculation\",  # TODO: remove 'easy'\n        mappers: Optional[Iterable[LigandAtomMapper]] = None,\n        mapping_scorer: Callable[[LigandAtomMapping], float] = default_lomap_score,\n        ligand_network_planner: Callable = generate_minimal_spanning_network,\n        protocol: Optional[Protocol] = None,\n    ):\n        \"\"\"A simple strategy for executing a given protocol with mapper, mapping_scorers and networks for relative FE approaches.\n\n        Parameters\n        ----------\n        name : str, optional\n            name of the approach/project the rfe, by default \"easy_rfe_calculation\"\n        mappers : Iterable[LigandAtomMapper], optional\n            mappers used to connect the ligands, by default the LomapAtomMapper\n            with sensible default settings\n        mapping_scorer : Callable, optional\n            scorer evaluating the quality of the atom mappings, by default default_lomap_score\n        ligand_network_planner : Callable, optional\n            network using mapper and mapping_scorer to build up an optimal network, by default generate_minimal_spanning_network\n        protocol : Protocol, optional\n            FE-protocol for each transformation (edge of ligand network) that is required in order to calculate the\n            FE graph, by default RelativeHybridTopologyProtocol( RelativeHybridTopologyProtocol._default_settings() )\n        \"\"\"\n        if protocol is None:\n            protocol = RelativeHybridTopologyProtocol(\n                RelativeHybridTopologyProtocol.default_settings()\n            )\n        if mappers is None:\n            mappers = [\n                LomapAtomMapper(\n                    time=20,\n                    threed=True,\n                    max3d=1.0,\n                    element_change=True,\n                    shift=False,\n                )\n            ]\n\n        self.name = name\n        self._mappers = mappers\n        self._mapping_scorer = mapping_scorer\n        self._ligand_network_planner = ligand_network_planner\n        self._protocol = protocol\n        self._chemical_system_generator_type = PROTOCOL_GENERATOR[protocol.__class__]\n\n    @abc.abstractmethod\n    def __call__(self, *args, **kwargs) -> AlchemicalNetwork: ...  # -no-cov-\n\n    @property\n    def mappers(self) -> Iterable[LigandAtomMapper]:\n        return self._mappers\n\n    @property\n    def mapping_scorer(self) -> Callable:\n        return self._mapping_scorer\n\n    @property\n    def ligand_network_planner(self) -> Callable:\n        return self._ligand_network_planner\n\n    @property\n    def transformation_protocol(self) -> Protocol:\n        return self._protocol\n\n    @property\n    def chemical_system_generator_type(\n        self,\n    ) -> Type[AbstractChemicalSystemGenerator]:\n        return self._chemical_system_generator_type\n\n    def _construct_ligand_network(self, ligands: Iterable[SmallMoleculeComponent]) -> LigandNetwork:\n        ligand_network = self._ligand_network_planner(\n            ligands=ligands, mappers=self.mappers, scorer=self.mapping_scorer\n        )\n\n        return ligand_network\n\n    def _build_transformations(\n        self,\n        ligand_network_edges: Iterable[LigandAtomMapping],\n        protocol: Protocol,\n        chemical_system_generator: AbstractChemicalSystemGenerator,\n    ) -> AlchemicalNetwork:\n        \"\"\"Construct alchemical network by building transformations from ligand network and adding the given protocol to each transformation.\n\n        Parameters\n        ----------\n        ligand_network_edges : Iterable[LigandAtomMapping]\n            result from the ligand network planner connecting all Ligands, planning the transformations.\n        protocol : Protocol\n            simulation protocol for each transformation.\n        chemical_system_generator : AbstractChemicalSystemGenerator\n            generator, constructing all required chemical systems for each transformation.\n\n        Returns\n        -------\n        AlchemicalNetwork\n            knows all transformations and their states that need to be simulated.\n        \"\"\"\n        transformation_edges = []\n        end_state_nodes = []\n\n        for ligand_mapping_edge in ligand_network_edges:\n            for stateA_env, stateB_env in zip(\n                chemical_system_generator(ligand_mapping_edge.componentA),\n                chemical_system_generator(ligand_mapping_edge.componentB),\n            ):\n                transformation_edge = self._build_transformation(\n                    ligand_mapping_edge=ligand_mapping_edge,\n                    stateA=stateA_env,\n                    stateB=stateB_env,\n                    transformation_protocol=protocol,\n                )\n\n                transformation_edges.append(transformation_edge)\n                end_state_nodes.extend([stateA_env, stateB_env])\n\n        # Todo: make the code here more stable in future: Name doubling check\n        all_transformation_labels = list(map(lambda x: x.name, transformation_edges))\n\n        if len(all_transformation_labels) != len(set(all_transformation_labels)):\n            raise ValueError(\n                \"There were multiple transformations with the same edge label! This might lead to overwriting your files. \\n labels: \"\n                + str(len(all_transformation_labels))\n                + \"\\nunique: \"\n                + str(len(set(all_transformation_labels)))\n                + \"\\ngot: \\n\\t\"\n                + \"\\n\\t\".join(all_transformation_labels)\n            )\n\n        alchemical_network = AlchemicalNetwork(\n            nodes=end_state_nodes, edges=transformation_edges, name=self.name\n        )\n        return alchemical_network\n\n    def _build_transformation(\n        self,\n        ligand_mapping_edge: LigandAtomMapping,\n        stateA: ChemicalSystem,\n        stateB: ChemicalSystem,\n        transformation_protocol: Protocol,\n    ) -> Transformation:\n        \"\"\"\n            This function is the core of building transformations. it builds a transformation with the given protocol.\n\n        Parameters\n        ----------\n        ligand_mapping_edge: LigandAtomMapping\n        stateA: ChemicalSystem\n        stateB: ChemicalSystem\n\n        Returns\n        -------\n        Transformation\n\n        \"\"\"\n        transformation_name = self.name + \"_\" + stateA.name + \"_\" + stateB.name\n\n        # Todo: Another dirty hack! - START\n        protocol_settings = transformation_protocol.settings.unfrozen_copy()\n        if \"vacuum\" in transformation_name:\n            protocol_settings.forcefield_settings.nonbonded_method = \"nocutoff\"\n\n        transformation_protocol = transformation_protocol.__class__(settings=protocol_settings)\n\n        return Transformation(\n            stateA=stateA,\n            stateB=stateB,\n            mapping=ligand_mapping_edge,\n            name=transformation_name,\n            protocol=transformation_protocol,\n        )\n\n\nclass RHFEAlchemicalNetworkPlanner(RelativeAlchemicalNetworkPlanner):\n    \"\"\"\n    Plan alchemical networks  for Relative Hydration Free Energy calculations.\n\n    Create an instance of the class with a simulation protocol and ligand\n    network planning scheme, then call it on a collection of ligands and solvent\n    to create the network.\n    \"\"\"\n\n    def __init__(\n        self,\n        name: str = \"rhfe\",\n        mappers: Optional[Iterable[LigandAtomMapper]] = None,\n        mapping_scorer: Callable[[LigandAtomMapping], float] = default_lomap_score,\n        ligand_network_planner: Callable = generate_minimal_spanning_network,\n        protocol: Optional[Protocol] = None,\n    ):\n        super().__init__(\n            name=name,\n            mappers=mappers,\n            mapping_scorer=mapping_scorer,\n            ligand_network_planner=ligand_network_planner,\n            protocol=protocol,\n        )\n\n    def __call__(\n        self,\n        ligands: Iterable[SmallMoleculeComponent],\n        solvent: SolventComponent,\n    ) -> AlchemicalNetwork:\n        \"\"\"plan the alchemical network for the given ligands and solvent.\n\n        Parameters\n        ----------\n        ligands : Iterable[SmallMoleculeComponent]\n            ligands that shall be used for the alchemical network.\n        solvent : SolventComponent\n            solvent for solvated simulations\n\n        Returns\n        -------\n        AlchemicalNetwork\n            RHFE network for the given ligands and solvent.\n        \"\"\"\n        # components might be given differently!\n        # throw into ligand_network_planning\n        self._ligand_network = self._construct_ligand_network(ligands)\n\n        # Prepare system generation\n        self._chemical_system_generator = self._chemical_system_generator_type(\n            solvent=solvent,\n            do_vacuum=True,\n        )\n\n        # Build transformations\n        self._alchemical_network = self._build_transformations(\n            ligand_network_edges=self._ligand_network.edges,\n            protocol=self.transformation_protocol,\n            chemical_system_generator=self._chemical_system_generator,\n        )\n\n        return self._alchemical_network\n\n\nclass RBFEAlchemicalNetworkPlanner(RelativeAlchemicalNetworkPlanner):\n    \"\"\"\n    Plan alchemical networks for Relative Binding Free Energy calculations.\n\n    Create an instance of the class with a simulation protocol and ligand\n    network planning scheme, then call it on a collection of ligands, protein,\n    solvent, and co-factors to create the network.\n    \"\"\"\n\n    def __init__(\n        self,\n        name: str = \"rbfe\",\n        mappers: Optional[Iterable[LigandAtomMapper]] = None,\n        mapping_scorer: Callable[[LigandAtomMapping], float] = default_lomap_score,\n        ligand_network_planner: Callable = generate_minimal_spanning_network,\n        protocol: Optional[Protocol] = None,\n    ):\n        super().__init__(\n            name=name,\n            mappers=mappers,\n            mapping_scorer=mapping_scorer,\n            ligand_network_planner=ligand_network_planner,\n            protocol=protocol,\n        )\n\n    def _build_transformation(\n        self,\n        ligand_mapping_edge: LigandAtomMapping,\n        stateA: ChemicalSystem,\n        stateB: ChemicalSystem,\n        transformation_protocol: Protocol,\n    ) -> Transformation:\n        \"\"\"\n        Overwrite the default method to handle net charge change transformations with our default protocol.\n        \"\"\"\n        transformation_name = self.name + \"_\" + stateA.name + \"_\" + stateB.name\n\n        protocol_settings = transformation_protocol.settings.unfrozen_copy()\n\n        if isinstance(transformation_protocol, RelativeHybridTopologyProtocol):\n            # adaptive transformation settings are only supported for RelativeHybridTopologyProtocol currently\n            protocol_settings = transformation_protocol._adaptive_settings(\n                stateA=stateA,\n                stateB=stateB,\n                mapping=ligand_mapping_edge,\n                initial_settings=protocol_settings,\n            )\n\n        if \"vacuum\" in transformation_name:\n            protocol_settings.nonbonded_method = \"nocutoff\"\n\n        transformation_protocol = transformation_protocol.__class__(settings=protocol_settings)\n        transformation_protocol.validate(stateA=stateA, stateB=stateB, mapping=ligand_mapping_edge)\n        return Transformation(\n            stateA=stateA,\n            stateB=stateB,\n            mapping=ligand_mapping_edge,\n            name=transformation_name,\n            protocol=transformation_protocol,\n        )\n\n    def __call__(\n        self,\n        ligands: Iterable[SmallMoleculeComponent],\n        solvent: SolventComponent,\n        protein: ProteinComponent,\n        cofactors: Optional[Iterable[SmallMoleculeComponent]] = None,\n    ) -> AlchemicalNetwork:\n        \"\"\"plan the alchemical network for RBFE calculations with the given ligands, protein and solvent.\n\n        Parameters\n        ----------\n        ligands : Iterable[SmallMoleculeComponent]\n            ligands that shall be used for the alchemical network.\n        solvent : SolventComponent\n            solvent for solvated and complex simulations\n        protein : ProteinComponent\n            protein for complex simulations\n        cofactors : Iterable[SmallMoleculeComponent]\n            any cofactors in the system, can be empty list\n\n        Returns\n        -------\n        AlchemicalNetwork\n            RBFE network for the given ligands, protein and solvent.\n        \"\"\"\n        # components might be given differently!\n        # throw into ligand_network_planning\n        self._ligand_network = self._construct_ligand_network(ligands)\n\n        # Prepare system generation\n        self._chemical_system_generator = self._chemical_system_generator_type(\n            solvent=solvent,\n            protein=protein,\n            cofactors=cofactors,\n        )\n\n        # Build transformations\n        self._alchemical_network = self._build_transformations(\n            ligand_network_edges=self._ligand_network.edges,\n            protocol=self._protocol,\n            chemical_system_generator=self._chemical_system_generator,\n        )\n\n        return self._alchemical_network\n"
  },
  {
    "path": "src/openfe/setup/atom_mapping/__init__.py",
    "content": "from gufe import LigandAtomMapping\nfrom kartograf import KartografAtomMapper\n\nfrom . import lomap_scorers, perses_scorers\nfrom .ligandatommapper import LigandAtomMapper\nfrom .lomap_mapper import LomapAtomMapper\nfrom .perses_mapper import PersesAtomMapper\n"
  },
  {
    "path": "src/openfe/setup/atom_mapping/ligandatommapper.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\nimport abc\nfrom typing import Iterable\n\nimport gufe\nfrom gufe import SmallMoleculeComponent\n\nfrom . import LigandAtomMapping\n\n\nclass LigandAtomMapper(gufe.AtomMapper):\n    \"\"\"\n    Suggest atom mappings between two :class:`SmallMoleculeComponent` instances.\n\n    Subclasses will typically implement the ``_mappings_generator`` method,\n    which returns an iterable of :class:`.LigandAtomMapping` suggestions.\n    \"\"\"\n\n    @abc.abstractmethod\n    def _mappings_generator(\n        self,\n        componentA: SmallMoleculeComponent,\n        componentB: SmallMoleculeComponent,\n    ) -> Iterable[dict[int, int]]:\n        \"\"\"\n        Suggest mapping options for the input molecules.\n\n        Parameters\n        ----------\n        componentA, componentB : rdkit.Mol\n            the two molecules to create a mapping for\n\n        Returns\n        -------\n        Iterable[dict[int, int]] :\n            an iterable over proposed mappings from componentA to componentB\n        \"\"\"\n        ...\n\n    def suggest_mappings(\n        self,\n        componentA: SmallMoleculeComponent,\n        componentB: SmallMoleculeComponent,\n    ) -> Iterable[LigandAtomMapping]:\n        \"\"\"\n        Suggest :class:`.LigandAtomMapping` options for the input molecules.\n\n        Parameters\n        ---------\n        componentA, componentB : :class:`.SmallMoleculeComponent`\n            the two molecules to create a mapping for\n\n        Returns\n        -------\n        Iterable[LigandAtomMapping] :\n            an iterable over proposed mappings\n        \"\"\"\n        # For this base class, implementation is redundant with\n        # _mappings_generator. However, we keep it separate so that abstract\n        # subclasses of this can customize suggest_mappings while always\n        # maintaining the consistency that concrete implementations must\n        # implement _mappings_generator.\n\n        for map_dct in self._mappings_generator(componentA, componentB):\n            yield LigandAtomMapping(componentA, componentB, map_dct)\n"
  },
  {
    "path": "src/openfe/setup/atom_mapping/lomap_mapper.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\n\n\"\"\"\nThe MCS class from Lomap shamelessly wrapped and used here to match our API.\n\n\"\"\"\n\nfrom lomap import LomapAtomMapper\n"
  },
  {
    "path": "src/openfe/setup/atom_mapping/lomap_scorers.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\n\nfrom lomap.gufe_bindings.scorers import (\n    atomic_number_score,\n    default_lomap_score,\n    ecr_score,\n    heterocycles_score,\n    hybridization_score,\n    mcsr_score,\n    mncar_score,\n    sulfonamides_score,\n    tmcsr_score,\n    transmuting_methyl_into_ring_score,\n    transmuting_ring_sizes_score,\n)  # looks like we gotta make it detailed for mypy and RTD\n"
  },
  {
    "path": "src/openfe/setup/atom_mapping/perses_mapper.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\n\n\"\"\"\nThe MCS class from Perses shamelessly wrapped and used here to match our API.\n\n\"\"\"\n\nimport warnings\n\nfrom gufe.settings.typing import AngstromQuantity\nfrom openff.units import Quantity, unit\nfrom openff.units.openmm import to_openmm\n\nfrom openfe.utils import requires_package\n\nfrom ...utils.silence_root_logging import silence_root_logging\n\ntry:\n    with silence_root_logging():\n        from perses.rjmc.atom_mapping import AtomMapper, InvalidMappingException\nexcept ImportError:\n    pass  # Don't throw  error, will happen later\n\nfrom .ligandatommapper import LigandAtomMapper\n\n\nclass PersesAtomMapper(LigandAtomMapper):\n    allow_ring_breaking: bool\n    preserve_chirality: bool\n    use_positions: bool\n    coordinate_tolerance: AngstromQuantity\n\n    def _to_dict(self) -> dict:\n        # strip units but record values\n        return {\n            \"allow_ring_breaking\": self.allow_ring_breaking,\n            \"preserve_chirality\": self.preserve_chirality,\n            \"use_positions\": self.use_positions,\n            \"coordinate_tolerance\": self.coordinate_tolerance.m_as(unit.angstrom),\n            \"_tolerance_unit\": \"angstrom\",\n        }\n\n    @classmethod\n    def _from_dict(cls, dct: dict):\n        # attach units again\n        tolerence_unit = dct.pop(\"_tolerance_unit\")\n        dct[\"coordinate_tolerance\"] *= getattr(unit, tolerence_unit)\n        return cls(**dct)\n\n    @classmethod\n    def _defaults(cls):\n        return {}\n\n    @requires_package(\"perses\")\n    def __init__(\n        self,\n        allow_ring_breaking: bool = True,\n        preserve_chirality: bool = True,\n        use_positions: bool = True,\n        coordinate_tolerance: Quantity = 0.25 * unit.angstrom,\n    ):\n        \"\"\"\n        Suggest atom mappings with the Perses atom mapper.\n\n        Parameters\n        ----------\n        allow_ring_breaking: bool, optional\n            this option checks if on only full cycles of the molecules shall\n            be mapped, default: False\n        preserve_chirality: bool, optional\n            if mappings must strictly preserve chirality, default: True\n        use_positions: bool, optional\n            this option defines, if the\n        coordinate_tolerance: openff.units.unit.Quantity, optional\n            tolerance on how close coordinates need to be, such they\n            can be mapped, default: 0.25*unit.angstrom\n\n        \"\"\"\n        warnings.warn(\n            \"PersesAtomMapper is deprecated and is planned to be removed in openfe v2.0. If you have questions related to this, please open an issue at https://github.com/OpenFreeEnergy/openfe/issues.\",\n            DeprecationWarning,\n        )\n        self.allow_ring_breaking = allow_ring_breaking\n        self.preserve_chirality = preserve_chirality\n        self.use_positions = use_positions\n        self.coordinate_tolerance = coordinate_tolerance\n\n    def _mappings_generator(self, componentA, componentB):\n        # Construct Perses Mapper\n        _atom_mapper = AtomMapper(\n            use_positions=self.use_positions,\n            coordinate_tolerance=to_openmm(self.coordinate_tolerance),\n            allow_ring_breaking=self.allow_ring_breaking,\n        )\n\n        # Try generating a mapping\n        try:\n            _atom_mappings = _atom_mapper.get_all_mappings(\n                old_mol=componentA.to_openff(), new_mol=componentB.to_openff()\n            )\n        except InvalidMappingException:\n            return\n\n        # Catch empty mappings here\n        if _atom_mappings is None:\n            return\n\n        # Post processing\n        if self.preserve_chirality:\n            for x in _atom_mappings:\n                x.preserve_chirality()\n\n        # Translate mapping objects\n        mapping_dict = (x.old_to_new_atom_map for x in _atom_mappings)\n\n        yield from mapping_dict\n"
  },
  {
    "path": "src/openfe/setup/atom_mapping/perses_scorers.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\n\nimport warnings\nfrom typing import Callable\n\nfrom openfe.utils import requires_package\n\nfrom ...utils.silence_root_logging import silence_root_logging\n\ntry:\n    with silence_root_logging():\n        from perses.rjmc.atom_mapping import AtomMapper, AtomMapping\nexcept ImportError:\n    pass  # Don't throw  error, will happen later\n\nfrom . import LigandAtomMapping\n\n\n# Helper Function / reducing code amount\ndef _get_all_mapped_atoms_with(\n    oeyMolA,\n    oeyMolB,\n    numMaxPossibleMappingAtoms: int,\n    criterium: Callable,\n) -> int:\n    molA_allAtomsWith = len(list(filter(criterium, oeyMolA.GetAtoms())))\n    molB_allAtomsWith = len(list(filter(criterium, oeyMolB.GetAtoms())))\n\n    if molA_allAtomsWith > molB_allAtomsWith and molA_allAtomsWith <= numMaxPossibleMappingAtoms:\n        numMaxPossibleMappings = molA_allAtomsWith\n    else:\n        numMaxPossibleMappings = molB_allAtomsWith\n\n    return numMaxPossibleMappings\n\n\n@requires_package(\"perses\")\ndef default_perses_scorer(\n    mapping: LigandAtomMapping,\n    use_positions: bool = False,\n    normalize: bool = True,\n) -> float:\n    \"\"\"\n    Score an atom mapping with the default Perses score function.\n\n    Parameters\n    ----------\n    mapping: LigandAtomMapping\n        is an OpenFE Ligand Mapping, that should be mapped\n    use_positions: bool, optional\n        if the positions are used, perses takes the inverse eucledian distance\n        of mapped atoms into account.\n        else the number of mapped atoms is used for the score.\n        default True\n    normalize: bool, optional\n        if true, the scores get normalized, such that different molecule pairs\n        can be compared for one scorer metric, default = True\n        *Warning* does not work for use_positions right now!\n\n    Raises\n    ------\n    NotImplementedError\n        Normalization of the score using positions is not implemented right\n        now.\n\n    Returns\n    -------\n        float\n    \"\"\"\n    warnings.warn(\n        \"default_perses_scorer is deprecated and is planned to be removed in openfe v2.0. If you have questions related to this, please open an issue at https://github.com/OpenFreeEnergy/openfe/issues\",\n        DeprecationWarning,\n    )\n\n    score = AtomMapper(use_positions=use_positions).score_mapping(\n        AtomMapping(\n            old_mol=mapping.componentA.to_openff(),\n            new_mol=mapping.componentB.to_openff(),\n            old_to_new_atom_map=mapping.componentA_to_componentB,\n        )\n    )\n\n    # normalize\n    if normalize:\n        oeyMolA = mapping.componentA.to_openff().to_openeye()\n        oeyMolB = mapping.componentB.to_openff().to_openeye()\n        if use_positions:\n            raise NotImplementedError(\"normalizing using positions is not currently implemented\")\n        else:\n            smallerMolecule = oeyMolA if (oeyMolA.NumAtoms() < oeyMolB.NumAtoms()) else oeyMolB\n            numMaxPossibleMappingAtoms = smallerMolecule.NumAtoms()\n            # Max possible Aromatic mappings\n            numMaxPossibleAromaticMappings = _get_all_mapped_atoms_with(\n                oeyMolA=oeyMolA,\n                oeyMolB=oeyMolB,\n                numMaxPossibleMappingAtoms=numMaxPossibleMappingAtoms,\n                criterium=lambda x: x.IsAromatic(),\n            )\n\n            # Max possible heavy mappings\n            numMaxPossibleHeavyAtomMappings = _get_all_mapped_atoms_with(\n                oeyMolA=oeyMolA,\n                oeyMolB=oeyMolB,\n                numMaxPossibleMappingAtoms=numMaxPossibleMappingAtoms,\n                criterium=lambda x: x.GetAtomicNum() > 1,\n            )\n\n            # Max possible ring mappings\n            numMaxPossibleRingMappings = _get_all_mapped_atoms_with(\n                oeyMolA=oeyMolA,\n                oeyMolB=oeyMolB,\n                numMaxPossibleMappingAtoms=numMaxPossibleMappingAtoms,\n                criterium=lambda x: x.IsInRing(),\n            )\n\n            # These weights are totally arbitrary\n            normalize_score = (\n                1.0 * numMaxPossibleMappingAtoms\n                + 0.8 * numMaxPossibleAromaticMappings\n                + 0.5 * numMaxPossibleHeavyAtomMappings\n                + 0.4 * numMaxPossibleRingMappings\n            )\n\n        score /= normalize_score  # final normalize score\n\n    return score\n"
  },
  {
    "path": "src/openfe/setup/chemicalsystem_generator/__init__.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\n\n\nfrom .abstract_chemicalsystem_generator import RFEComponentLabels\nfrom .easy_chemicalsystem_generator import EasyChemicalSystemGenerator\n"
  },
  {
    "path": "src/openfe/setup/chemicalsystem_generator/abstract_chemicalsystem_generator.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\nimport abc\nfrom enum import Enum\nfrom typing import Iterable\n\nfrom gufe import ChemicalSystem\n\n# Todo: connect to protocols - use this for labels?\n\n\nclass RFEComponentLabels(str, Enum):\n    PROTEIN = \"protein\"\n    LIGAND = \"ligand\"\n    SOLVENT = \"solvent\"\n    COFACTOR = \"cofactor\"\n\n\nclass AbstractChemicalSystemGenerator(abc.ABC):\n    \"\"\"\n    this abstract class defines the interface for the chemical system generators.\n    \"\"\"\n\n    @abc.abstractmethod\n    def __call__(self, *args, **kwargs) -> Iterable[ChemicalSystem]:\n        raise NotImplementedError()\n"
  },
  {
    "path": "src/openfe/setup/chemicalsystem_generator/easy_chemicalsystem_generator.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\n\nfrom typing import Iterable, Optional\n\nfrom gufe import (\n    ChemicalSystem,\n    Component,\n    ProteinComponent,\n    ProteinMembraneComponent,\n    SmallMoleculeComponent,\n    SolventComponent,\n)\n\nfrom .abstract_chemicalsystem_generator import (\n    AbstractChemicalSystemGenerator,\n    RFEComponentLabels,\n)\n\n\nclass EasyChemicalSystemGenerator(AbstractChemicalSystemGenerator):\n    def __init__(\n        self,\n        solvent: SolventComponent | None = None,\n        protein: ProteinComponent | None = None,\n        cofactors: Iterable[SmallMoleculeComponent] | None = None,\n        do_vacuum: bool = False,\n    ):\n        \"\"\"\n        Generate consistent chemical systems given a :class:`SmallMoleculeComponent`.\n\n        This class aids preparation of :class:`ChemicalSystem` instances for\n        free energy simulations. Construct an instance of the class with all the\n        components except the :class:`SmallMoleculeComponent` that will be\n        mutated, and then call the instance on each mutation target to prepare\n        systems in vacuum, solvent, and with protein.\n\n        This class is a easy generator class, for generating chemical systems\n        with a focus on a given SmallMoleculeComponent. Depending on which\n        parameters are given, the following systems will be generated in\n        order:\n\n            vacuum -> solvent -> protein\n\n        Parameters\n        ----------\n        solvent : SolventComponent, optional\n            if a SolventComponent is given, solvated chemical systems will be generated, by default None\n        protein : ProteinComponent, optional\n            if a ProteinComponent is given, complex chemical systems will be generated, by default None\n        cofactors : Iterable[SmallMoleculeComponent], optional\n            any cofactors in the system.  will be put in any systems containing\n            the protein\n        do_vacuum : bool, optional\n            if true a chemical system in vacuum is returned, by default False\n\n        Raises\n        ------\n        ValueError\n            If neither a solvent nor protein is provided and ``do_vacuum`` is\n            false.\n        \"\"\"\n        self.solvent = solvent\n        self.protein = protein\n        self.cofactors = cofactors or []\n        self.do_vacuum = do_vacuum\n\n        if solvent is None and protein is None and not do_vacuum:\n            raise ValueError(\n                \"Chemical system generator is unable to generate any chemical systems with neither protein nor solvent nor do_vacuum\"\n            )\n\n    def __call__(self, component: SmallMoleculeComponent) -> Iterable[ChemicalSystem]:\n        \"\"\"Generate systems around the given :class:`SmallMoleculeComponent`.\n\n        Parameters\n        ----------\n        component : SmallMoleculeComponent\n            The molecule for the system generation.\n\n        Returns\n        -------\n        Iterable[ChemicalSystem]\n            Generator for systems with the given environments. Returns a\n            vacuum system first in ``self.do_vacuum`` is true, then a solvated\n            system without protein, then finally a solvated system with protein\n            if the protein component is set.\n\n        \"\"\"\n\n        if self.do_vacuum:\n            chem_sys = ChemicalSystem(\n                components={RFEComponentLabels.LIGAND.value: component},\n                name=component.name + \"_vacuum\",\n            )\n            yield chem_sys\n\n        if self.solvent is not None:\n            chem_sys = ChemicalSystem(\n                components={\n                    RFEComponentLabels.LIGAND.value: component,\n                    RFEComponentLabels.SOLVENT.value: self.solvent,\n                },\n                name=component.name + \"_solvent\",\n            )\n            yield chem_sys\n\n        components: dict[str, Component]\n        if self.protein is not None:\n            components = {\n                RFEComponentLabels.LIGAND.value: component,\n                RFEComponentLabels.PROTEIN.value: self.protein,\n            }\n            for i, c in enumerate(self.cofactors):\n                components.update({f\"{RFEComponentLabels.COFACTOR.value}{i + 1}\": c})\n\n            # ProteinMembraneComponent has its own solvent.\n            if self.solvent is not None and not isinstance(self.protein, ProteinMembraneComponent):\n                components.update({RFEComponentLabels.SOLVENT.value: self.solvent})\n            chem_sys = ChemicalSystem(components=components, name=component.name + \"_complex\")\n            yield chem_sys\n\n        return\n"
  },
  {
    "path": "src/openfe/setup/ligand_network_planning.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\n\nfrom pathlib import Path\nfrom typing import Callable, Iterable, Optional, Union\n\nimport networkx as nx\nfrom gufe import AtomMapper, SmallMoleculeComponent\nfrom konnektor import network_analysis, network_planners, network_tools\nfrom konnektor.network_planners import (\n    ExplicitNetworkGenerator,\n    MaximalNetworkGenerator,\n    MinimalSpanningTreeNetworkGenerator,\n    RedundantMinimalSpanningTreeNetworkGenerator,\n    StarNetworkGenerator,\n)\nfrom lomap import LomapAtomMapper\n\n# import to expose generate_lomap_network in openfe\nfrom lomap import generate_lomap_network as generate_lomap_network\nfrom lomap.dbmol import _find_common_core\n\nfrom openfe.setup import LigandNetwork\nfrom openfe.setup.atom_mapping import LigandAtomMapping\n\n\ndef _hasten_lomap(mapper, ligands):\n    \"\"\"take a mapper and some ligands, put a common core arg into the mapper\"\"\"\n    if mapper.seed:\n        return mapper\n\n    try:\n        core = _find_common_core(\n            [m.to_rdkit() for m in ligands], element_change=mapper.element_change\n        )\n    except RuntimeError:  # in case MCS throws a hissy fit\n        core = \"\"\n\n    return LomapAtomMapper(\n        time=mapper.time,\n        threed=mapper.threed,\n        max3d=mapper.max3d,\n        element_change=mapper.element_change,\n        seed=core,\n        shift=mapper.shift,\n    )\n\n\ndef generate_radial_network(\n    ligands: Iterable[SmallMoleculeComponent],\n    central_ligand: Union[SmallMoleculeComponent, str, int],\n    mappers: Union[AtomMapper, Iterable[AtomMapper]],\n    scorer: Optional[Callable[[LigandAtomMapping], float]] = None,\n    progress: bool = False,\n    n_processes: int = 1,\n) -> LigandNetwork:\n    \"\"\"\n    Plan a radial network with all ligands connected to a central node.\n\n    Also known as hub and spoke or star-map, this plans a LigandNetwork where\n    all ligands are connected via a central ligand.\n\n    Parameters\n    ----------\n    ligands : iterable of SmallMoleculeComponents\n      the ligands to arrange around the central ligand.  If the central ligand\n      is present it will be ignored (i.e. avoiding a self edge)\n    central_ligand : SmallMoleculeComponent or str or int\n      the ligand to use as the hub/central ligand.\n      If this is a string, this should match to one and only one ligand name.\n      If this is an integer, this refers to the index from within ligands\n    mappers : AtomMapper or iterable of AtomMappers\n      mapper(s) to use, at least 1 required\n    scorer : scoring function, optional\n      a callable which returns a float for any LigandAtomMapping.  Used to\n      assign scores to potential mappings; higher scores indicate better\n      mappings.\n    progress : bool\n      If True, show a tqdm progress bar. (default=True)\n    n_processes: int\n        number of cpu processes to use if parallelizing network generation.\n\n    Raises\n    ------\n    ValueError\n      if no mapping between the central ligand and any other ligand can be\n      found\n\n    Returns\n    -------\n    network : LigandNetwork\n      will have an edge between each ligand and the central ligand, with the\n      mapping being the best possible mapping found using the supplied atom\n      mappers.\n      If no scorer is supplied, the first mapping provided by the iterable\n      of mappers will be used.\n    \"\"\"\n    if isinstance(mappers, AtomMapper):\n        mappers = [mappers]\n    mappers = [\n        _hasten_lomap(m, ligands) if isinstance(m, LomapAtomMapper)\n        else m for m in mappers\n        ]  # fmt: skip\n\n    ligands = list(ligands)\n\n    # handle central_ligand arg possibilities\n    # after this, central_ligand is resolved to a SmallMoleculeComponent\n    if isinstance(central_ligand, int):\n        try:\n            central_ligand = ligands[central_ligand]\n            ligands.remove(central_ligand)\n        except IndexError:\n            raise ValueError(\n                f\"index '{central_ligand}' out of bounds, there are {len(ligands)} ligands\"\n            )\n    elif isinstance(central_ligand, str):\n        possibles = [lig for lig in ligands if lig.name == central_ligand]\n        if not possibles:\n            raise ValueError(\n                f\"No ligand called '{central_ligand}' \"\n                f\"available: {', '.join(lig.name for lig in ligands)}\"\n            )\n        if len(possibles) > 1:\n            raise ValueError(f\"Multiple ligands called '{central_ligand}'\")\n        central_ligand = possibles[0]\n        ligands.remove(central_ligand)\n\n    # Construct network\n    network_planner = StarNetworkGenerator(\n        mappers=mappers,\n        scorer=scorer,\n        progress=progress,\n        n_processes=n_processes,\n    )\n\n    network = network_planner.generate_ligand_network(\n        components=ligands, central_component=central_ligand\n    )\n\n    if network.is_connected():\n        connected_nodes = network.nodes\n    else:\n        connected_nodes = max(nx.weakly_connected_components(network.graph), key=len)\n\n    # check for disconnected nodes\n    missing_nodes = set(ligands + [central_ligand]) - set(connected_nodes)\n    missing_node_names = [node.name for node in missing_nodes]\n    if missing_nodes:\n        raise RuntimeError(\n            f\"ERROR: No mapping found between the central ligand ('{central_ligand.name}') and the following node(s): {missing_node_names}\"\n        )\n\n    return network\n\n\ndef generate_maximal_network(\n    ligands: Iterable[SmallMoleculeComponent],\n    mappers: Union[AtomMapper, Iterable[AtomMapper]],\n    scorer: Optional[Callable[[LigandAtomMapping], float]] = None,\n    progress: bool = True,\n    n_processes: int = 1,\n) -> LigandNetwork:\n    \"\"\"\n    Plan a network with all possible proposed mappings.\n\n    This will attempt to create (and optionally score) all possible mappings\n    (up to :math:`N(N-1)/2` for each mapper given). There may be fewer actual\n    mappings that this because, when a mapper cannot return a mapping for a\n    given pair, there is simply no suggested mapping for that pair.\n    This network is typically used as the starting point for other network\n    generators (which then optimize based on the scores) or to debug atom\n    mappers (to see which mappings the mapper fails to generate).\n\n\n    Parameters\n    ----------\n    ligands : Iterable[SmallMoleculeComponent]\n      the ligands to include in the LigandNetwork\n    mappers : AtomMapper or Iterable[AtomMapper]\n      the AtomMapper(s) to use to propose mappings.  At least 1 required,\n      but many can be given.\n    scorer : Scoring function\n      any callable which takes a LigandAtomMapping and returns a float\n    progress : bool\n      If True, show a tqdm progress bar. (default=True)\n    n_processes: int\n      number of cpu processes to use if parallelizing network generation.\n    \"\"\"\n    if isinstance(mappers, AtomMapper):\n        mappers = [mappers]\n    mappers = [_hasten_lomap(m, ligands) if isinstance(m, LomapAtomMapper) else m for m in mappers]\n    nodes = list(ligands)\n\n    # Construct network\n    network_planner = MaximalNetworkGenerator(\n        mappers=mappers,\n        scorer=scorer,\n        progress=progress,\n        n_processes=n_processes,\n    )\n\n    network = network_planner.generate_ligand_network(nodes)\n\n    return network\n\n\ndef generate_minimal_spanning_network(\n    ligands: Iterable[SmallMoleculeComponent],\n    mappers: Union[AtomMapper, Iterable[AtomMapper]],\n    # TODO: scorer is currently required, but not actually necessary.\n    scorer: Callable[[LigandAtomMapping], float],\n    progress: bool = True,\n    n_processes: int = 1,\n) -> LigandNetwork:\n    \"\"\"\n    Plan a network with as few edges as possible with maximum total score\n\n    Parameters\n    ----------\n    ligands : Iterable[SmallMoleculeComponent]\n      the ligands to include in the LigandNetwork\n    mappers : AtomMapper or Iterable[AtomMapper]\n      the AtomMapper(s) to use to propose mappings.  At least 1 required,\n      but many can be given, in which case all will be tried to find the\n      highest score edges\n    scorer : Scoring function\n      any callable which takes a LigandAtomMapping and returns a float\n    progress : bool\n      If True, show a tqdm progress bar. (default=True)\n    n_processes: int\n        number of cpu processes to use if parallelizing network generation.\n    \"\"\"\n    if isinstance(mappers, AtomMapper):\n        mappers = [mappers]\n    mappers = [_hasten_lomap(m, ligands) if isinstance(m, LomapAtomMapper) else m for m in mappers]\n    nodes = list(ligands)\n\n    # Construct network\n    network_planner = MinimalSpanningTreeNetworkGenerator(\n        mappers=mappers,\n        scorer=scorer,\n        progress=progress,\n        n_processes=n_processes,\n    )\n\n    network = network_planner.generate_ligand_network(nodes)\n\n    return network\n\n\ndef generate_minimal_redundant_network(\n    ligands: Iterable[SmallMoleculeComponent],\n    mappers: Union[AtomMapper, Iterable[AtomMapper]],\n    scorer: Callable[[LigandAtomMapping], float],\n    progress: bool = True,\n    mst_num: int = 2,\n    n_processes: int = 1,\n) -> LigandNetwork:\n    \"\"\"\n    Plan a network with a specified amount of redundancy for each node\n\n    Creates a network with as few edges as possible with maximum total score,\n    ensuring that every node is connected to two edges to introduce\n    statistical redundancy.\n\n    Parameters\n    ----------\n    ligands : Iterable[SmallMoleculeComponent]\n      the ligands to include in the LigandNetwork\n    mappers : AtomMapper or Iterable[AtomMapper]\n      the AtomMapper(s) to use to propose mappings.  At least 1 required,\n      but many can be given, in which case all will be tried to find the\n      highest score edges\n    scorer : Scoring function\n      any callable which takes a LigandAtomMapping and returns a float\n    progress : bool\n      If True, show a tqdm progress bar. (default=True)\n    mst_num : int\n      Minimum Spanning Tree number: the number of minimum spanning trees to\n      generate. If two, the second-best edges are included in the returned\n      network. If three, the third-best edges are also included, etc.\n    n_processes: int\n        number of threads to use if parallelizing network generation\n\n    \"\"\"\n    if isinstance(mappers, AtomMapper):\n        mappers = [mappers]\n    mappers = [_hasten_lomap(m, ligands) if isinstance(m, LomapAtomMapper) else m for m in mappers]\n    nodes = list(ligands)\n\n    # Construct network\n    network_planner = RedundantMinimalSpanningTreeNetworkGenerator(\n        mappers=mappers,\n        scorer=scorer,\n        progress=progress,\n        n_redundancy=mst_num,\n        n_processes=n_processes,\n    )\n\n    network = network_planner.generate_ligand_network(nodes)\n\n    return network\n\n\ndef generate_network_from_names(\n    ligands: list[SmallMoleculeComponent],\n    mapper: AtomMapper,\n    names: list[tuple[str, str]],\n) -> LigandNetwork:\n    \"\"\"\n    Generate a :class:`.LigandNetwork` by specifying edges as tuples of names.\n\n    Parameters\n    ----------\n    ligands : list of SmallMoleculeComponent\n      the small molecules to place into the network\n    mapper: AtomMapper\n      the atom mapper to use to construct edges\n    names : list of tuples of names\n      the edges to form where the values refer to names of the small molecules,\n      eg `[('benzene', 'toluene'), ...]` will create an edge between the\n      molecule with names 'benzene' and 'toluene'\n\n    Returns\n    -------\n    LigandNetwork\n\n    Raises\n    ------\n    KeyError\n      if an invalid name is requested\n    ValueError\n      if multiple molecules have the same name (this would otherwise be\n      problematic)\n    \"\"\"\n    nodes = list(ligands)\n\n    network_planner = ExplicitNetworkGenerator(mappers=mapper, scorer=None)\n\n    network = network_planner.generate_network_from_names(components=nodes, names=names)\n\n    return network\n\n\ndef generate_network_from_indices(\n    ligands: list[SmallMoleculeComponent],\n    mapper: AtomMapper,\n    indices: list[tuple[int, int]],\n) -> LigandNetwork:\n    \"\"\"\n    Generate a :class:`.LigandNetwork` by specifying edges as tuples of indices.\n\n    Parameters\n    ----------\n    ligands : list of SmallMoleculeComponent\n      the small molecules to place into the network\n    mapper: AtomMapper\n      the atom mapper to use to construct edges\n    indices : list of tuples of indices\n      the edges to form where the values refer to names of the small molecules,\n      eg `[(3, 4), ...]` will create an edge between the 3rd and 4th molecules\n      remembering that Python uses 0-based indexing\n\n    Returns\n    -------\n    LigandNetwork\n\n    Raises\n    ------\n    IndexError\n      if an invalid ligand index is requested\n    \"\"\"\n    nodes = list(ligands)\n\n    network_planner = ExplicitNetworkGenerator(mappers=mapper, scorer=None)\n    network = network_planner.generate_network_from_indices(components=nodes, indices=indices)\n    return network\n\n\ndef load_orion_network(\n    ligands: list[SmallMoleculeComponent],\n    mapper: AtomMapper,\n    network_file: Union[str, Path],\n) -> LigandNetwork:\n    \"\"\"Load a :class:`.LigandNetwork` from an Orion NES network file.\n\n    Parameters\n    ----------\n    ligands : list of SmallMoleculeComponent\n      the small molecules to place into the network\n    mapper: AtomMapper\n      the atom mapper to use to construct edges\n    network_file : str\n      path to NES network file.\n\n    Returns\n    -------\n    LigandNetwork\n\n    Raises\n    ------\n    KeyError\n      If an unexpected line format is encountered.\n    \"\"\"\n\n    with open(network_file, \"r\") as f:\n        network_lines = [\n            line.strip().split(\" \") for line in f\n            if not line.startswith(\"#\")\n            ]  # fmt: skip\n\n    names = []\n    for entry in network_lines:\n        if len(entry) != 3 or entry[1] != \">>\":\n            errmsg = f\"line does not match expected name >> name format: {entry}\"\n            raise KeyError(errmsg)\n\n        names.append((entry[0], entry[2]))\n\n    network_planner = ExplicitNetworkGenerator(mappers=mapper, scorer=None)\n    network = network_planner.generate_network_from_names(components=ligands, names=names)\n\n    return network\n\n\ndef load_fepplus_network(\n    ligands: list[SmallMoleculeComponent],\n    mapper: AtomMapper,\n    network_file: Union[str, Path],\n) -> LigandNetwork:\n    \"\"\"Load a :class:`.LigandNetwork` from an FEP+ edges network file.\n\n    Parameters\n    ----------\n    ligands : list of SmallMoleculeComponent\n      the small molecules to place into the network\n    mapper: AtomMapper\n      the atom mapper to use to construct edges\n    network_file : str\n      path to edges network file.\n\n    Returns\n    -------\n    LigandNetwork\n\n    Raises\n    ------\n    KeyError\n      If an unexpected line format is encountered.\n    \"\"\"\n\n    with open(network_file, \"r\") as f:\n        network_lines = [line.split() for line in f.readlines()]\n\n    names = []\n    for entry in network_lines:\n        if len(entry) != 5 or entry[1] != \"#\" or entry[3] != \"->\":\n            errmsg = (\n                \"line does not match expected format \"\n                \"hash:hash # name -> name\\n\"\n                f\"line format: {entry}\"\n            )\n            raise KeyError(errmsg)\n\n        names.append((entry[2], entry[4]))\n\n    network_planner = ExplicitNetworkGenerator(mappers=mapper, scorer=None)\n    network = network_planner.generate_network_from_names(components=ligands, names=names)\n\n    return network\n"
  },
  {
    "path": "src/openfe/storage/__init__.py",
    "content": ""
  },
  {
    "path": "src/openfe/storage/metadatastore.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/gufe\nimport abc\nimport collections\nimport json\nfrom typing import Dict, Tuple\n\nfrom gufe.storage.errors import ChangedExternalResourceError, MissingExternalResourceError\nfrom gufe.storage.externalresource.base import Metadata\n\n\nclass MetadataStore(collections.abc.Mapping):\n    def __init__(self, external_store):\n        self.external_store = external_store\n        self._metadata_cache = self.load_all_metadata()\n\n    @abc.abstractmethod\n    def store_metadata(self, location: str, metadata: Metadata):\n        raise NotImplementedError()\n\n    @abc.abstractmethod\n    def load_all_metadata(self) -> Dict[str, Metadata]:\n        raise NotImplementedError()\n\n    @abc.abstractmethod\n    def __delitem__(self, location):\n        raise NotImplementedError()\n\n    def __getitem__(self, location):\n        return self._metadata_cache[location]\n\n    def __iter__(self):\n        return iter(self._metadata_cache)\n\n    def __len__(self):\n        return len(self._metadata_cache)\n\n\nclass JSONMetadataStore(MetadataStore):\n    # Using JSON for now because it is easy to write this class and doesn't\n    # require any external dependencies. It is NOT the right way to go in\n    # the long term. API will probably stay the same, though.\n    def _dump_file(self):\n        metadata_dict = {key: val.to_dict() for key, val in self._metadata_cache.items()}\n        metadata_bytes = json.dumps(metadata_dict).encode(\"utf-8\")\n        self.external_store.store_bytes(\"metadata.json\", metadata_bytes)\n\n    def store_metadata(self, location: str, metadata: Metadata):\n        self._metadata_cache[location] = metadata\n        self._dump_file()\n\n    def load_all_metadata(self):\n        if not self.external_store.exists(\"metadata.json\"):\n            return {}\n\n        with self.external_store.load_stream(\"metadata.json\") as json_f:\n            all_metadata_dict = json.loads(json_f.read().decode(\"utf-8\"))\n\n        all_metadata = {key: Metadata(**val) for key, val in all_metadata_dict.items()}\n\n        return all_metadata\n\n    def __delitem__(self, location):\n        del self._metadata_cache[location]\n        self._dump_file()\n\n\nclass PerFileJSONMetadataStore(MetadataStore):\n    _metadata_prefix = \"metadata/\"\n\n    def _metadata_path(self, location):\n        return self._metadata_prefix + location + \".json\"\n\n    def store_metadata(self, location: str, metadata: Metadata):\n        self._metadata_cache[location] = metadata\n        path = self._metadata_path(location)\n        dct = {\n            \"path\": location,\n            \"metadata\": metadata.to_dict(),\n        }\n        metadata_bytes = json.dumps(dct).encode(\"utf-8\")\n        self.external_store.store_bytes(path, metadata_bytes)\n\n    def load_all_metadata(self):\n        metadata_cache = {}\n        prefix = self._metadata_prefix\n        for location in self.external_store.iter_contents(prefix=prefix):\n            if location.endswith(\".json\"):\n                with self.external_store.load_stream(location) as f:\n                    dct = json.loads(f.read().decode(\"utf-8\"))\n\n                if set(dct) != {\"path\", \"metadata\"}:\n                    raise ChangedExternalResourceError(f\"Bad metadata file: '{location}'\")\n                metadata_cache[dct[\"path\"]] = Metadata(**dct[\"metadata\"])\n\n        return metadata_cache\n\n    def __delitem__(self, location):\n        del self._metadata_cache[location]\n        self.external_store.delete(self._metadata_path(location))\n"
  },
  {
    "path": "src/openfe/storage/resultclient.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/gufe\nimport abc\nimport json\nimport re\nfrom typing import Any\n\nfrom gufe.tokenization import (\n    JSON_HANDLER,\n    from_dict,\n    get_all_gufe_objs,\n    key_decode_dependencies,\n)\n\nfrom .metadatastore import JSONMetadataStore\nfrom .resultserver import ResultServer\n\nGUFEKEY_JSON_REGEX = re.compile('\":gufe-key:\": \"(?P<token>[A-Za-z0-9_]+-[0-9a-f]+)\"')\n\n\nclass _ResultContainer(abc.ABC):\n    \"\"\"\n    Abstract class, represents all data under some level of the hierarchy.\n    \"\"\"\n\n    def __init__(self, parent, path_component):\n        self.parent = parent\n        self._path_component = self._to_path_component(path_component)\n        self._cache = {}\n\n    def __eq__(self, other):\n        return isinstance(other, self.__class__) and self.path == other.path\n\n    @staticmethod\n    def _to_path_component(item: Any) -> str:\n        \"\"\"Convert input (object or string) to path string\"\"\"\n        if isinstance(item, str):\n            return item\n\n        # TODO: instead of str(hash(...)), this should return the digest\n        # that is being introduced in another PR; Python hash is not stable\n        # across sessions\n        return str(hash(item))\n\n    def __getitem__(self, item):\n        # code for the case this is a file\n        if item in self.result_server:\n            return self.result_server.load_stream(item)\n\n        # code for the case this is a \"directory\"\n        hash_item = self._to_path_component(item)\n\n        if hash_item not in self._cache:\n            self._cache[hash_item] = self._load_next_level(item)\n\n        return self._cache[hash_item]\n\n    def __truediv__(self, item):\n        return self[item]\n\n    @abc.abstractmethod\n    def _load_next_level(self, item):\n        raise NotImplementedError()\n\n    def __iter__(self):\n        for loc in self.result_server:\n            if loc.startswith(self.path):\n                yield loc\n\n    def load_stream(self, location, *, allow_changed=False):\n        return self.result_server.load_stream(location, allow_changed)\n\n    def load_bytes(self, location, *, allow_changed=False):\n        with self.load_stream(location, allow_changed=allow_changed) as f:\n            byte_data = f.read()\n\n        return byte_data\n\n    @property\n    def path(self):\n        return self.parent.path + \"/\" + self._path_component\n\n    @property\n    def result_server(self):\n        return self.parent.result_server\n\n    def __repr__(self):\n        # probably should include repr of external store, too\n        return f\"{self.__class__.__name__}({self.path})\"\n\n\nclass ResultClient(_ResultContainer):\n    def __init__(self, external_store):\n        # default client is using JSONMetadataStore with the given external\n        # result store; users could easily write a subblass that behaves\n        # differently\n        metadata_store = JSONMetadataStore(external_store)\n        self._result_server = ResultServer(external_store, metadata_store)\n        super().__init__(parent=self, path_component=None)\n\n    def delete(self, location):\n        self._result_server.delete(location)\n\n    @staticmethod\n    def _gufe_key_to_storage_key(prefix: str, key: str):\n        \"\"\"Create the storage key from the gufe key.\n\n        Parameters\n        ----------\n        prefix : str\n            the prefix defining which section of storage should be used for\n            this (e.g., ``setup``, ...)\n        key : str\n            the GufeKey for a GufeTokenizable (technically, is likely to be\n            passed as a :class:`.GufeKey`, which is a subclass of ``str``)\n\n        Returns\n        -------\n        str :\n            storage key (string identifier used by storage to locate this\n            object)\n        \"\"\"\n        pref = prefix.split(\"/\")  # remove this if we switch to tuples\n        cls, token = key.split(\"-\")\n        tup = tuple(list(pref) + [cls, f\"{token}.json\"])\n        # right now we're using strings, but we've talked about switching\n        # that to tuples\n        return \"/\".join(tup)\n\n    def _store_gufe_tokenizable(self, prefix, obj):\n        \"\"\"generic function for deduplicating/storing a GufeTokenizable\"\"\"\n        for o in get_all_gufe_objs(obj):\n            key = self._gufe_key_to_storage_key(prefix, o.key)\n\n            # we trust that if we get the same key, it's the same object, so\n            # we only store on keys that we don't already know\n            if key not in self.result_server:\n                data = json.dumps(\n                    o.to_keyed_dict(), cls=JSON_HANDLER.encoder, sort_keys=True\n                ).encode(\"utf-8\")\n                self.result_server.store_bytes(key, data)\n\n    def store_transformation(self, transformation):\n        \"\"\"Store a :class:`.Transformation`.\n\n        Parameters\n        ---------\n        transformation: :class:`.Transformation`\n            the transformation to store\n        \"\"\"\n        self._store_gufe_tokenizable(\"setup\", transformation)\n\n    def store_network(self, network):\n        \"\"\"Store a :class:`.AlchemicalNetwork`.\n\n        Parameters\n        ---------\n        network: :class:`.AlchemicalNetwork`\n            the network to store\n        \"\"\"\n        self._store_gufe_tokenizable(\"setup\", network)\n\n    def _load_gufe_tokenizable(self, prefix, gufe_key):\n        \"\"\"generic function to load deduplicated object from a key\"\"\"\n        registry = {}\n\n        def recursive_build_object_cache(gufe_key):\n            \"\"\"DFS to rebuild object hierarchy\"\"\"\n            # This implementation is a bit fragile, because ensuring that we\n            # don't duplicate objects in memory depends on the fact that\n            # `key_decode_dependencies` gets keyencoded objects from a cache\n            # (they are cached on creation).\n            storage_key = self._gufe_key_to_storage_key(prefix, gufe_key)\n            with self.load_stream(storage_key) as f:\n                keyencoded_json = f.read().decode(\"utf-8\")\n\n            dct = json.loads(keyencoded_json, cls=JSON_HANDLER.decoder)\n            # this implementation may seem strange, but it will be a\n            # faster than traversing the dict\n            key_encoded = set(GUFEKEY_JSON_REGEX.findall(keyencoded_json))\n\n            # this approach takes the dct instead of the json str\n            # found = []\n            # modify_dependencies(dct, found.append, is_gufe_key_dict)\n            # key_encoded = {d[\":gufe-key:\"] for d in found}\n\n            for key in key_encoded:\n                # we're actually only doing this for the side effect of\n                # generating the objects and adding them to the registry\n                recursive_build_object_cache(key)\n\n            if len(key_encoded) == 0:\n                # fast path for objects that don't contain other gufe\n                # objects (these tend to be larger dicts; avoid walking\n                # them)\n                obj = from_dict(dct)\n            else:\n                # objects that contain other gufe objects need be walked to\n                # replace everything\n                obj = key_decode_dependencies(dct, registry)\n\n            registry[obj.key] = obj\n            return obj\n\n        return recursive_build_object_cache(gufe_key)\n\n    def load_transformation(self, key: str):\n        \"\"\"Load a :class:`.Transformation` from its GufeKey\n\n        Parameters\n        ----------\n        key: str\n            the gufe key for this object\n\n        Returns\n        -------\n        :class:`.Transformation`\n            the desired transformation\n        \"\"\"\n        return self._load_gufe_tokenizable(\"setup\", key)\n\n    def load_network(self, key: str):\n        \"\"\"Load a :class:`.AlchemicalNetwork` from its GufeKey\n\n        Parameters\n        ----------\n        key: str\n            the gufe key for this object\n\n        Returns\n        -------\n        :class:`.AlchemicalNetwork`\n            the desired network\n        \"\"\"\n        return self._load_gufe_tokenizable(\"setup\", key)\n\n    def _load_next_level(self, transformation):\n        return TransformationResult(self, transformation)\n\n    # override these two inherited properties since this is always the end of\n    # the recursive chain\n    @property\n    def path(self):\n        return \"transformations\"\n\n    @property\n    def result_server(self):\n        return self._result_server\n\n\nclass TransformationResult(_ResultContainer):\n    def __init__(self, parent, transformation):\n        super().__init__(parent, transformation)\n        self.transformation = transformation\n\n    def _load_next_level(self, clone):\n        return CloneResult(self, clone)\n\n\nclass CloneResult(_ResultContainer):\n    def __init__(self, parent, clone):\n        super().__init__(parent, clone)\n        self.clone = clone\n\n    @staticmethod\n    def _to_path_component(item):\n        return str(item)\n\n    def _load_next_level(self, extension):\n        return ExtensionResult(self, extension)\n\n\nclass ExtensionResult(_ResultContainer):\n    def __init__(self, parent, extension):\n        super().__init__(parent, str(extension))\n        self.extension = extension\n\n    @staticmethod\n    def _to_path_component(item):\n        return str(item)\n\n    def __getitem__(self, filename):\n        # different here -- we don't cache the actual file objects\n        return self._load_next_level(filename)\n\n    def _load_next_level(self, filename):\n        return self.result_server.load_stream(self.path + \"/\" + filename)\n"
  },
  {
    "path": "src/openfe/storage/resultserver.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/gufe\nimport warnings\nfrom typing import ClassVar\n\nfrom gufe.storage.errors import ChangedExternalResourceError, MissingExternalResourceError\n\n\nclass ResultServer:\n    \"\"\"Class to manage communication between metadata and data storage.\n\n    At this level, we provide an abstraction where client code no longer\n    needs to be aware of the nature of the metadata, or even that it exists.\n    \"\"\"\n\n    def __init__(self, external_store, metadata_store):\n        self.external_store = external_store\n        self.metadata_store = metadata_store\n\n    def _store_metadata(self, location):\n        metadata = self.external_store.get_metadata(location)\n        self.metadata_store.store_metadata(location, metadata)\n\n    def store_bytes(self, location, byte_data):\n        self.external_store.store_bytes(location, byte_data)\n        self._store_metadata(location)\n\n    def store_path(self, location, path):\n        self.external_store.store_path(location, path)\n        self._store_metadata(location)\n\n    def delete(self, location):\n        del self.metadata_store[location]\n        self.external_store.delete(location)\n\n    def validate(self, location, allow_changed=False):\n        try:\n            metadata = self.metadata_store[location]\n        except KeyError:\n            raise MissingExternalResourceError(f\"Metadata for '{location}' not found\")\n\n        if not self.external_store.get_metadata(location) == metadata:\n            msg = f\"Metadata mismatch for {location}: this object may have changed.\"\n            if not allow_changed:\n                raise ChangedExternalResourceError(\n                    msg + \" To allow this, set ExternalStorage.allow_changed = True\"\n                )\n            else:\n                warnings.warn(msg)\n\n    def __iter__(self):\n        return iter(self.metadata_store)\n\n    def find_missing_files(self):\n        \"\"\"Identify files listed in metadata but unavailable in storage\"\"\"\n        return [f for f in self if not self.external_store.exists(f)]\n\n    def load_stream(self, location, allow_changed=False):\n        self.validate(location, allow_changed)\n        return self.external_store.load_stream(location)\n"
  },
  {
    "path": "src/openfe/tests/__init__.py",
    "content": ""
  },
  {
    "path": "src/openfe/tests/analysis/__init__.py",
    "content": ""
  },
  {
    "path": "src/openfe/tests/analysis/test_plotting.py",
    "content": "import matplotlib\nimport matplotlib.pyplot as plt\nimport numpy as np\nimport pytest\n\nfrom openfe.analysis.plotting import (\n    plot_2D_rmsd,\n    plot_lambda_transition_matrix,\n)\n\nMBAR_HIGH_FLOAT_PREC = np.array([\n    [4.04963280e-01, 2.64851626e-01, 1.55960834e-01,\n     8.70071466e-02, 4.65819362e-02, 2.21166590e-02,\n     5.28613476e-19, 1.21332039e-39, 9.53847574e-47,\n     1.08409130e-49, 1.00129930e-50],\n    [2.64851626e-01, 2.38999336e-01, 1.90795611e-01,\n     1.39227718e-01, 9.35391162e-02, 5.40680743e-02,\n     4.14462223e-18, 9.51310340e-39, 7.47869291e-46,\n     8.49987577e-49, 7.85074074e-50],\n    [1.55960834e-01, 1.90795611e-01, 1.99215052e-01,\n     1.82450137e-01, 1.49240018e-01, 1.03819831e-01,\n     2.12518612e-17, 4.87791510e-38, 3.83475587e-45,\n     4.35837503e-48, 4.02552618e-49],\n    [8.70071466e-02, 1.39227718e-01, 1.82450137e-01,\n     2.03476122e-01, 2.00318604e-01, 1.69001754e-01,\n     7.63228831e-17, 1.75183030e-37, 1.37719525e-44,\n     1.56524525e-47, 1.44570756e-48],\n    [4.65819362e-02, 9.35391162e-02, 1.49240018e-01,\n     2.00318604e-01, 2.39174175e-01, 2.52627633e-01,\n     2.01399730e-16, 4.62270467e-37, 3.63412308e-44,\n     4.13034672e-47, 3.81491237e-48],\n    [2.21166590e-02, 5.40680743e-02, 1.03819831e-01,\n     1.69001754e-01, 2.52627633e-01, 3.79847531e-01,\n     3.76232213e-16, 8.63561442e-37, 6.78885803e-44,\n     7.71584694e-47, 7.12658815e-48],\n    [5.28613476e-19, 4.14462223e-18, 2.12518612e-17,\n     7.63228831e-17, 2.01399730e-16, 3.76232213e-16,\n     1.01326575e+00, 8.95334208e-03, 5.08819552e-07,\n     9.41453345e-09, 2.77171908e-09],\n    [1.21332039e-39, 9.51310340e-39, 4.87791510e-38,\n     1.75183030e-37, 4.62270467e-37, 8.63561442e-37,\n     8.95334208e-03, 8.92862646e-01, 1.07782005e-01,\n     9.27776485e-03, 3.34696054e-03],\n    [9.53847574e-47, 7.47869291e-46, 3.83475587e-45,\n     1.37719525e-44, 3.63412308e-44, 6.78885803e-44,\n     5.08819552e-07, 1.07782005e-01, 5.54361284e-01,\n     2.25806184e-01, 1.34272920e-01],\n    [1.08409130e-49, 8.49987577e-49, 4.35837503e-48,\n     1.56524525e-47, 4.13034672e-47, 7.71584694e-47,\n     9.41453345e-09, 9.27776485e-03, 2.25806184e-01,\n     3.94054662e-01, 3.93084315e-01],\n    [1.00129930e-50, 7.85074074e-50, 4.02552618e-49,\n     1.44570756e-48, 3.81491237e-48, 7.12658815e-48,\n     2.77171908e-09, 3.34696054e-03, 1.34272920e-01,\n     3.93084315e-01, 4.91518742e-01],\n])  # fmt: skip\n\n\nMBAR_HIGH_FLOAT_ABNORMAL = np.array([\n    [2.34151792e-001, 1.39888121e-001, 7.84874621e-002,\n     4.18336072e-002, 2.05969028e-002, 7.26433700e-003,\n     8.59588359e-069, 9.82810344e-154, 2.86854631e-174,\n     3.61851838e-179, 2.03347234e-180],\n    [1.39888121e-001, 1.33087532e-001, 1.06283463e-001,\n     7.48596022e-002, 4.71944621e-002, 2.09090412e-002,\n     2.61632960e-069, 9.87687147e-154, 3.04564890e-174,\n     1.01323581e-178, 5.71180108e-180],\n    [7.84874621e-002, 1.06283463e-001, 1.12085643e-001,\n     1.01164236e-001, 8.02528014e-002, 4.39486161e-002,\n     4.65970677e-070, 5.76131562e-154, 2.05138486e-174,\n     1.68711540e-178, 9.52136287e-180],\n    [4.18336072e-002, 7.48596022e-002, 1.01164236e-001,\n     1.15030824e-001, 1.12925630e-001, 7.64083221e-002,\n     5.56609447e-071, 2.25203208e-154, 1.10970982e-174,\n     1.88729763e-178, 1.06553350e-179],\n    [2.05969028e-002, 4.71944621e-002, 8.02528014e-002,\n     1.12925630e-001, 1.37008472e-001, 1.24243953e-001,\n     4.63825760e-072, 6.26556483e-155, 5.47382223e-175,\n     1.47688013e-178, 8.33933879e-180],\n    [7.26433700e-003, 2.09090412e-002, 4.39486161e-002,\n     7.64083221e-002, 1.24243953e-001, 2.49447953e-001,\n     2.15384511e-073, 9.78751994e-156, 1.89651311e-175,\n     6.46075564e-179, 3.64830252e-180],\n    [8.59588359e-069, 2.61632960e-069, 4.65970677e-070,\n     5.56609447e-071, 4.63825760e-072, 2.15384511e-073,\n     1.54873255e+000, 2.33585672e-002, 2.78272533e-006,\n     4.61271012e-008, 9.81085527e-009],\n    [9.82810344e-154, 9.87687147e-154, 5.76131562e-154,\n     2.25203208e-154, 6.26556483e-155, 9.78751994e-156,\n     2.33585672e-002, 1.36721112e+000, 1.64391352e-001,\n     1.39600025e-002, 4.59238353e-003],\n    [2.86854631e-174, 3.04564890e-174, 2.05138486e-174,\n     1.10970982e-174, 5.47382223e-175, 1.89651311e-175,\n     2.78272533e-006, 1.64391352e-001, 8.87029135e-001,\n     3.45990080e-001, 1.76251997e-001],\n    [3.61851838e-179, 1.01323581e-178, 1.68711540e-178,\n     1.88729763e-178, 1.47688013e-178, 6.46075564e-179,\n     4.61271012e-008, 1.39600025e-002, 3.45990080e-001,\n     6.27268856e-001, 5.86475486e-001],\n    [2.03347234e-180, 5.71180108e-180, 9.52136287e-180,\n     1.06553350e-179, 8.33933879e-180, 3.64830252e-180,\n     9.81085527e-009, 4.59238353e-003, 1.76251997e-001,\n     5.86475486e-001, 8.06379597e-001],\n])  # fmt: skip\n\n\n@pytest.mark.parametrize(\n    \"matrix\",\n    [MBAR_HIGH_FLOAT_PREC, MBAR_HIGH_FLOAT_ABNORMAL],\n)\ndef test_mbar_overlap_plot_high_warn(matrix):\n    wmsg = \"Overlap/probability matrix exceeds\"\n    with pytest.warns(match=wmsg):\n        ax = plot_lambda_transition_matrix(matrix)\n    assert isinstance(ax, matplotlib.axes.Axes)\n\n\nMBAR_OVERLAP_NORMAL = np.array([\n    [5.40693861e-01, 3.01639682e-01, 1.21556611e-01, 3.23719204e-02,\n     3.58389041e-03, 1.48665588e-04, 5.24585724e-06, 1.21058499e-07,\n     1.77358642e-09, 1.47315799e-11, 5.95535941e-14],\n    [3.01639682e-01, 3.31228861e-01, 2.43846627e-01, 1.08013742e-01,\n     1.43267020e-02, 8.83652857e-04, 5.81705578e-05, 2.49870089e-06,\n     6.30913374e-08, 8.22822509e-10, 5.45494512e-12],\n    [1.21556611e-01, 2.43846627e-01, 3.25955156e-01, 2.56738695e-01,\n     4.67483791e-02, 4.53599666e-03, 5.71365908e-04, 4.52123401e-05,\n     1.91542154e-06, 4.11083861e-08, 4.89327222e-10],\n    [3.23719204e-02, 1.08013742e-01, 2.56738695e-01, 4.09261028e-01,\n     1.58278950e-01, 2.79859170e-02, 6.41857330e-03, 8.67983163e-04,\n     6.08822529e-05, 2.26213546e-06, 4.64070520e-08],\n    [3.58389041e-03, 1.43267020e-02, 4.67483791e-02, 1.58278950e-01,\n     4.25994251e-01, 2.44226615e-01, 8.69755675e-02, 1.78548481e-02,\n     1.90728937e-03, 1.00948754e-04, 2.55919445e-06],\n    [1.48665588e-04, 8.83652857e-04, 4.53599666e-03, 2.79859170e-02,\n     2.44226615e-01, 3.71598157e-01, 2.43792854e-01, 8.89756349e-02,\n     1.63090400e-02, 1.47914160e-03, 6.43253565e-05],\n    [5.24585724e-06, 5.81705578e-05, 5.71365908e-04, 6.41857330e-03,\n     8.69755675e-02, 2.43792854e-01, 3.28134403e-01, 2.34652614e-01,\n     8.31489505e-02, 1.49645600e-02, 1.27769523e-03],\n    [1.21058499e-07, 2.49870089e-06, 4.52123401e-05, 8.67983163e-04,\n     1.78548481e-02, 8.89756349e-02, 2.34652614e-01, 3.26504455e-01,\n     2.32499832e-01, 8.43901256e-02, 1.42066757e-02],\n    [1.77358642e-09, 6.30913374e-08, 1.91542154e-06, 6.08822529e-05,\n     1.90728937e-03, 1.63090400e-02, 8.31489505e-02, 2.32499832e-01,\n     3.36922669e-01, 2.44443192e-01, 8.47061646e-02],\n    [1.47315799e-11, 8.22822509e-10, 4.11083861e-08, 2.26213546e-06,\n     1.00948754e-04, 1.47914160e-03, 1.49645600e-02, 8.43901256e-02,\n     2.44443192e-01, 3.65791191e-01, 2.88828537e-01],\n    [5.95535941e-14, 5.45494512e-12, 4.89327222e-10, 4.64070520e-08,\n     2.55919445e-06, 6.43253565e-05, 1.27769523e-03, 1.42066757e-02,\n     8.47061646e-02, 2.88828537e-01, 6.10913996e-01]\n])  # fmt: skip\n\n\ndef test_mbar_overlap_plot():\n    ax = plot_lambda_transition_matrix(MBAR_OVERLAP_NORMAL)\n    assert isinstance(ax, matplotlib.axes.Axes)\n\n\n@pytest.mark.parametrize(\"num\", [i for i in range(1, 30)])\ndef test_plot_2D_rmsd(num):\n    \"\"\"\n    Smoke test:\n      Loop through and test plotting fictitious 2D data\n    \"\"\"\n    points = num * (num - 1) // 2\n    data = [[0.5 for x in range(points)] for i in range(num)]\n    fig = plot_2D_rmsd(data)\n    plt.close(fig)\n"
  },
  {
    "path": "src/openfe/tests/conftest.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\nimport gzip\nimport os\nimport pathlib\nimport urllib.error\nimport urllib.request\nfrom importlib import resources\n\nimport gufe\nimport mdtraj\nimport numpy as np\nimport openmm\nimport pandas as pd\nimport pytest\nfrom gufe import AtomMapper, LigandAtomMapping, ProteinComponent, SmallMoleculeComponent\nfrom openff.toolkit import ForceField\nfrom openff.units import unit as offunit\nfrom openmm import unit as ommunit\nfrom rdkit import Chem\nfrom rdkit.Chem import AllChem\n\nimport openfe\nfrom openfe.data._registry import POOCH_CACHE\nfrom openfe.protocols.openmm_rfe import RelativeHybridTopologyProtocol\nfrom openfe.protocols.openmm_rfe._rfe_utils.relative import HybridTopologyFactory\nfrom openfe.protocols.openmm_utils.serialization import deserialize\nfrom openfe.tests.protocols.openmm_rfe.helpers import make_htf\n\n\nclass SlowTests:\n    \"\"\"Plugin for handling fixtures that skips slow tests\n\n    Fixtures\n    --------\n\n    Currently two fixture types are handled:\n      * `integration`:\n        Extremely slow tests that are meant to be run to truly put the code\n        through a real run.\n\n      * `slow`:\n        Unit tests that just take too long to be running regularly.\n\n\n    How to use the fixtures\n    -----------------------\n\n    To add these fixtures simply add `@pytest.mark.integration` or\n    `@pytest.mark.slow` decorator to the relevant function or class.\n\n\n    How to run tests marked by these fixtures\n    -----------------------------------------\n\n    To run the `integration` tests, either use the `--integration` flag\n    when invoking pytest, or set the environment variable\n    `OFE_INTEGRATION_TESTS` to `true`. Note: triggering `integration` will\n    automatically also trigger tests marked as `slow`.\n\n    To run the `slow` tests, either use the `--runslow` flag when invoking\n    pytest, or set the environment variable `OFE_SLOW_TESTS` to `true`\n    \"\"\"\n\n    def __init__(self, config):\n        self.config = config\n\n    @staticmethod\n    def _modify_slow(items, config):\n        msg = (\n            \"need --runslow pytest cli option or the environment variable \"\n            \"`OFE_SLOW_TESTS` set to `True` to run\"\n        )\n        skip_slow = pytest.mark.skip(reason=msg)\n        for item in items:\n            if \"slow\" in item.keywords:\n                item.add_marker(skip_slow)\n\n    @staticmethod\n    def _modify_integration(items, config):\n        msg = (\n            \"need --integration pytest cli option or the environment \"\n            \"variable `OFE_INTEGRATION_TESTS` set to `True` to run\"\n        )\n        skip_int = pytest.mark.skip(reason=msg)\n        for item in items:\n            if \"integration\" in item.keywords:\n                item.add_marker(skip_int)\n\n    def pytest_collection_modifyitems(self, items, config):\n        if (\n            config.getoption(\"--integration\")\n            or os.getenv(\"OFE_INTEGRATION_TESTS\", default=\"false\").lower() == \"true\"\n        ):\n            return\n        elif (\n            config.getoption(\"--runslow\")\n            or os.getenv(\"OFE_SLOW_TESTS\", default=\"false\").lower() == \"true\"\n        ):\n            self._modify_integration(items, config)\n        else:\n            self._modify_integration(items, config)\n            self._modify_slow(items, config)\n\n\n# allow for optional slow tests\n# See: https://docs.pytest.org/en/latest/example/simple.html\ndef pytest_addoption(parser):\n    parser.addoption(\"--runslow\", action=\"store_true\", default=False, help=\"run slow tests\")\n    parser.addoption(\"--integration\", action=\"store_true\", default=False, help=\"run long integration tests\")  # fmt: skip\n\n\ndef pytest_configure(config):\n    config.pluginmanager.register(SlowTests(config), \"slow\")\n    config.addinivalue_line(\"markers\", \"slow: mark test as slow\")\n    config.addinivalue_line(\"markers\", \"integration: mark test as long integration test\")\n\n\ndef mol_from_smiles(smiles: str) -> Chem.Mol:\n    m = Chem.MolFromSmiles(smiles)\n    AllChem.Compute2DCoords(m)  # type: ignore[attr-defined]\n\n    return m\n\n\n@pytest.fixture(scope=\"session\")\ndef simple_mapping():\n    \"\"\"Disappearing oxygen on end\n\n    C C O\n\n    C C\n    \"\"\"\n    molA = SmallMoleculeComponent(mol_from_smiles(\"CCO\"))\n    molB = SmallMoleculeComponent(mol_from_smiles(\"CC\"))\n\n    m = LigandAtomMapping(molA, molB, componentA_to_componentB={0: 0, 1: 1})\n\n    return m\n\n\n@pytest.fixture(scope=\"session\")\ndef other_mapping():\n    \"\"\"Disappearing middle carbon\n\n    C C O\n\n    C   C\n    \"\"\"\n    molA = SmallMoleculeComponent(mol_from_smiles(\"CCO\"))\n    molB = SmallMoleculeComponent(mol_from_smiles(\"CC\"))\n\n    m = LigandAtomMapping(molA, molB, componentA_to_componentB={0: 0, 2: 1})\n\n    return m\n\n\n@pytest.fixture()\ndef lomap_basic_test_files_dir(tmp_path_factory):\n    # for lomap, which wants the files in a directory\n    lomap_files = tmp_path_factory.mktemp(\"lomap_files\")\n    lomap_basic = \"openfe.tests.data.lomap_basic\"\n\n    for f in resources.contents(lomap_basic):\n        if not f.endswith(\"mol2\"):\n            continue\n        stuff = resources.read_binary(lomap_basic, f)\n\n        with open(lomap_files / f, \"wb\") as fout:\n            fout.write(stuff)\n\n    yield str(lomap_files)\n\n\n@pytest.fixture(scope=\"session\")\ndef atom_mapping_basic_test_files():\n    # a dict of {filenames.strip(mol2): SmallMoleculeComponent} for a simple\n    # set of ligands\n    files = {}\n    for f in [\n        \"1,3,7-trimethylnaphthalene\",\n        \"1-butyl-4-methylbenzene\",\n        \"2,6-dimethylnaphthalene\",\n        \"2-methyl-6-propylnaphthalene\",\n        \"2-methylnaphthalene\",\n        \"2-naftanol\",\n        \"methylcyclohexane\",\n        \"toluene\",\n    ]:\n        with resources.as_file(resources.files(\"openfe.tests.data.lomap_basic\")) as d:\n            fn = str(d / (f + \".mol2\"))\n            mol = Chem.MolFromMol2File(fn, removeHs=False)\n            files[f] = SmallMoleculeComponent(mol, name=f)\n\n    return files\n\n\n@pytest.fixture()\ndef lomap_old_mapper() -> AtomMapper:\n    \"\"\"\n    LomapAtomMapper with the old default settings.\n\n    This is necessary as atom_mapping_basic_test_files are not all fully aligned\n    and need both shift and a large max3d value.\n    \"\"\"\n    return openfe.setup.atom_mapping.LomapAtomMapper(\n        time=20,\n        threed=True,\n        max3d=1000.0,\n        element_change=True,\n        seed=\"\",\n        shift=True,\n    )\n\n\n@pytest.fixture\ndef benzene_toluene_topology():\n    \"\"\"Load the mdtraj hybrid topology reference for benzene to toluene.\"\"\"\n    with resources.as_file(resources.files(\"openfe.tests.data.openmm_rfe\")) as d:\n        atoms = pd.read_csv(d / \"benzene_toluene_hybrid_top\" / \"hybrid_topology_atoms.csv\")\n        bonds = np.loadtxt(d / \"benzene_toluene_hybrid_top\" / \"hybrid_topology_bonds.txt\")\n        return mdtraj.Topology.from_dataframe(atoms=atoms, bonds=bonds)\n\n\n@pytest.fixture(scope=\"session\")\ndef benzene_modifications():\n    files = {}\n    with resources.as_file(resources.files(\"openfe.tests.data\")) as d:\n        fn = str(d / \"benzene_modifications.sdf\")\n        supp = Chem.SDMolSupplier(str(fn), removeHs=False)\n        for rdmol in supp:\n            files[rdmol.GetProp(\"_Name\")] = SmallMoleculeComponent(rdmol)\n    return files\n\n\n@pytest.fixture(scope=\"session\")\ndef charged_benzene_modifications():\n    files = {}\n    with resources.as_file(resources.files(\"openfe.tests.data.openmm_rfe\")) as d:\n        fn = str(d / \"charged_benzenes.sdf\")\n        supp = Chem.SDMolSupplier(str(fn), removeHs=False)\n        for rdmol in supp:\n            files[rdmol.GetProp(\"_Name\")] = SmallMoleculeComponent(rdmol)\n    return files\n\n\n@pytest.fixture(scope=\"session\")\ndef T4L_septop_reference_xml():\n    with resources.as_file(resources.files(\"openfe.tests.data.openmm_septop\")) as d:\n        f = str(d / \"system.xml.bz2\")\n    return deserialize(pathlib.Path(f))\n\n\n@pytest.fixture\ndef serialization_template():\n    def inner(filename):\n        loc = \"openfe.tests.data.serialization\"\n        tmpl = resources.read_text(loc, filename)\n        return tmpl.replace(\"{OFE_VERSION}\", openfe.__version__)\n\n    return inner\n\n\n@pytest.fixture(scope=\"session\")\ndef benzene_transforms():\n    # a dict of Molecules for benzene transformations\n    mols = {}\n    with resources.as_file(resources.files(\"openfe.tests.data\")) as d:\n        fn = str(d / \"benzene_modifications.sdf\")\n        supplier = Chem.SDMolSupplier(fn, removeHs=False)\n        for mol in supplier:\n            mols[mol.GetProp(\"_Name\")] = SmallMoleculeComponent(mol)\n    return mols\n\n\n@pytest.fixture(scope=\"session\")\ndef T4_protein_component_pdb() -> str:\n    with resources.as_file(resources.files(\"openfe.tests.data\")) as d:\n        return str(d / \"181l_only.pdb\")\n\n\n@pytest.fixture(scope=\"session\")\ndef T4_protein_component(T4_protein_component_pdb) -> gufe.ProteinComponent:\n    return gufe.ProteinComponent.from_pdb_file(T4_protein_component_pdb, name=\"T4_protein\")\n\n\n@pytest.fixture(scope=\"session\")\ndef a2a_protein_membrane_pdb():\n    with resources.as_file(resources.files(\"openfe.tests.data.a2a\")) as d:\n        yield str(d / \"protein.pdb.gz\")\n\n\n@pytest.fixture(scope=\"session\")\ndef a2a_protein_membrane_component(a2a_protein_membrane_pdb) -> openfe.ProteinMembraneComponent:\n    yield openfe.ProteinMembraneComponent.from_pdb_file(a2a_protein_membrane_pdb, name=\"a2a\")\n\n\n@pytest.fixture(scope=\"session\")\ndef eg5_protein_pdb():\n    with resources.as_file(resources.files(\"openfe.tests.data.eg5\")) as d:\n        yield str(d / \"eg5_protein.pdb\")\n\n\n@pytest.fixture()\ndef eg5_ligands_sdf():\n    with resources.as_file(resources.files(\"openfe.tests.data.eg5\")) as d:\n        yield str(d / \"eg5_ligands.sdf\")\n\n\n@pytest.fixture()\ndef eg5_cofactor_sdf():\n    with resources.as_file(resources.files(\"openfe.tests.data.eg5\")) as d:\n        yield str(d / \"eg5_cofactor.sdf\")\n\n\n@pytest.fixture()\ndef eg5_protein(eg5_protein_pdb) -> openfe.ProteinComponent:\n    return openfe.ProteinComponent.from_pdb_file(eg5_protein_pdb)\n\n\n@pytest.fixture()\ndef eg5_ligands(eg5_ligands_sdf) -> list[SmallMoleculeComponent]:\n    return [SmallMoleculeComponent(m) for m in Chem.SDMolSupplier(eg5_ligands_sdf, removeHs=False)]\n\n\n@pytest.fixture()\ndef eg5_cofactor(eg5_cofactor_sdf) -> SmallMoleculeComponent:\n    return SmallMoleculeComponent.from_sdf_file(eg5_cofactor_sdf)\n\n\n@pytest.fixture(scope=\"session\")\ndef a2a_ligands_sdf():\n    with resources.as_file(resources.files(\"openfe.tests.data.a2a\")) as d:\n        yield str(d / \"ligands.sdf.gz\")\n\n\n@pytest.fixture(scope=\"session\")\ndef a2a_ligands(a2a_ligands_sdf):\n    with gzip.open(a2a_ligands_sdf, \"rb\") as gzf:\n        suppl = Chem.ForwardSDMolSupplier(gzf, removeHs=False)\n        yield [SmallMoleculeComponent(m) for m in suppl]\n\n\n@pytest.fixture()\ndef orion_network():\n    with resources.as_file(resources.files(\"openfe.tests.data.external_formats\")) as d:\n        yield str(d / \"somebenzenes_nes.dat\")\n\n\n@pytest.fixture()\ndef fepplus_network():\n    with resources.as_file(resources.files(\"openfe.tests.data.external_formats\")) as d:\n        yield str(d / \"somebenzenes_edges.edge\")\n\n\n@pytest.fixture()\ndef CN_molecule() -> list[SmallMoleculeComponent]:\n    \"\"\"\n    A basic CH3NH2 molecule for quick testing.\n    \"\"\"\n    with resources.as_file(resources.files(\"openfe.tests.data\")) as d:\n        fn = str(d / \"CN.sdf\")\n        supp = Chem.SDMolSupplier(str(fn), removeHs=False)\n\n        smc = [SmallMoleculeComponent(i) for i in supp][0]\n\n    return smc\n\n\n@pytest.fixture(scope=\"function\")\ndef am1bcc_ref_charges():\n    ref_chgs = {\n        \"ambertools\":[\n            0.146957, -0.918943, 0.025557, 0.025557,\n            0.025557, 0.347657, 0.347657\n        ] * offunit.elementary_charge,\n        \"openeye\": [\n            0.14713, -0.92016, 0.02595, 0.02595,\n            0.02595, 0.34759, 0.34759\n        ] * offunit.elementary_charge,\n        \"nagl\": [\n            0.170413, -0.930417, 0.021593, 0.021593,\n            0.021593, 0.347612, 0.347612\n        ] * offunit.elementary_charge,\n        \"espaloma\": [\n            0.017702, -0.966793, 0.063076, 0.063076,\n            0.063076, 0.379931, 0.379931\n        ] * offunit.elementary_charge,\n    }  # fmt: skip\n    return ref_chgs\n\n\ntry:\n    urllib.request.urlopen(\"https://www.google.com\")\nexcept urllib.error.URLError:  # -no-cov-\n    HAS_INTERNET = False\nelse:\n    HAS_INTERNET = True\n\ntry:\n    import espaloma\n\n    HAS_ESPALOMA = True\nexcept ModuleNotFoundError:\n    HAS_ESPALOMA = False\n\n\n@pytest.fixture(scope=\"module\")\ndef chlorobenzene():\n    \"\"\"Load chlorobenzene with partial charges from sdf file.\"\"\"\n    with resources.as_file(resources.files(\"openfe.tests.data.htf\")) as f:\n        yield SmallMoleculeComponent.from_sdf_file(f / \"t4_lysozyme_data\" / \"chlorobenzene.sdf\")\n\n\n@pytest.fixture(scope=\"module\")\ndef fluorobenzene():\n    \"\"\"Load fluorobenzene with partial charges from sdf file.\"\"\"\n    with resources.as_file(resources.files(\"openfe.tests.data.htf\")) as f:\n        yield SmallMoleculeComponent.from_sdf_file(f / \"t4_lysozyme_data\" / \"fluorobenzene.sdf\")\n\n\n@pytest.fixture(scope=\"module\")\ndef ethane():\n    \"\"\"Load ethane with partial charges from sdf file.\"\"\"\n    with resources.as_file(resources.files(\"openfe.tests.data.htf\")) as f:\n        yield SmallMoleculeComponent.from_sdf_file(f / \"ethane.sdf\")\n\n\n@pytest.fixture(scope=\"module\")\ndef chloroethane():\n    \"\"\"Load chloroethane with partial charges from sdf file.\"\"\"\n    with resources.as_file(resources.files(\"openfe.tests.data.htf\")) as f:\n        yield SmallMoleculeComponent.from_sdf_file(f / \"chloroethane.sdf\")\n\n\n@pytest.fixture(scope=\"module\")\ndef fluoroethane():\n    \"\"\"Load fluoroethane with partial charges from sdf file.\"\"\"\n    with resources.as_file(resources.files(\"openfe.tests.data.htf\")) as f:\n        yield SmallMoleculeComponent.from_sdf_file(f / \"fluoroethane.sdf\")\n\n\n@pytest.fixture(scope=\"module\")\ndef benzene():\n    \"\"\"Load fluoroethane with partial charges from sdf file.\"\"\"\n    with resources.as_file(resources.files(\"openfe.tests.data.htf\")) as f:\n        yield SmallMoleculeComponent.from_sdf_file(f / \"t4_lysozyme_data\" / \"benzene.sdf\")\n\n\n@pytest.fixture(scope=\"module\")\ndef chlorobenzene_to_fluorobenzene_mapping(chlorobenzene, fluorobenzene):\n    \"\"\"Return a mapping from chlorobenzene to fluorobenzene.\"\"\"\n    return LigandAtomMapping(\n        componentA=chlorobenzene,\n        componentB=fluorobenzene,\n        componentA_to_componentB={\n            # perfect one-to-one mapping\n            0: 0,\n            1: 1,\n            2: 2,\n            3: 3,\n            4: 4,\n            5: 5,\n            6: 6,\n            7: 7,\n            8: 8,\n            9: 9,\n            10: 10,\n            11: 11,\n        },\n    )\n\n\n@pytest.fixture(scope=\"module\")\ndef chloroethane_to_ethane_mapping(chloroethane, ethane):\n    \"\"\"Return a mapping from chloroethane to ethane.\"\"\"\n    return LigandAtomMapping(\n        componentA=chloroethane,\n        componentB=ethane,\n        componentA_to_componentB={\n            # Cl-H not mapped, all others one-to-one\n            1: 1,\n            2: 2,\n            3: 3,\n            4: 4,\n            5: 5,\n            6: 6,\n            7: 7,\n        },\n    )\n\n\n@pytest.fixture(scope=\"module\")\ndef chloroethane_to_fluoroethane_mapping(chloroethane, fluoroethane):\n    \"\"\"Return a mapping from chloroethane to fluoroethane.\"\"\"\n    return LigandAtomMapping(\n        componentA=chloroethane,\n        componentB=fluoroethane,\n        componentA_to_componentB={\n            # perfect one-to-one mapping\n            0: 0,\n            1: 1,\n            2: 2,\n            3: 3,\n            4: 4,\n            5: 5,\n            6: 6,\n            7: 7,\n        },\n    )\n\n\n@pytest.fixture(scope=\"module\")\ndef chlorobenzene_to_benzene_mapping(chlorobenzene, benzene):\n    \"\"\"Return a mapping from chlorobenzene to benzene.\"\"\"\n    return LigandAtomMapping(\n        componentA=chlorobenzene,\n        componentB=benzene,\n        componentA_to_componentB={\n            # Cl-H not mapped, all others one-to-one\n            1: 1,\n            2: 2,\n            3: 3,\n            4: 4,\n            5: 5,\n            6: 6,\n            7: 7,\n            8: 8,\n            9: 9,\n            10: 10,\n            11: 11,\n        },\n    )\n\n\n@pytest.fixture(scope=\"module\")\ndef t4_lysozyme_solvated():\n    \"\"\"Load the T4 lysozyme L99A structure and solvent from the pdb file.\"\"\"\n    with resources.as_file(resources.files(\"openfe.tests.data.htf\")) as f:\n        with gzip.open(f / \"t4_lysozyme_data\" / \"t4_lysozyme_solvated.pdb.gz\", \"rb\") as gzf:\n            yield ProteinComponent.from_pdb_file(gzf)\n\n\ndef apply_box_vectors_and_fix_nb_force(\n    hybrid_topology_factory: HybridTopologyFactory, force_field: ForceField\n):\n    \"\"\"\n    Edit the systems in the hybrid topology factory to have the correct box vectors and nonbonded force settings for the T4 lysozyme system.\n    \"\"\"\n    hybrid_system = hybrid_topology_factory.hybrid_system\n    # as we use a pre-solvated system, we need to correct the nonbonded methods and cutoffs and set the box vectors\n    box_vectors = [\n        openmm.vec3.Vec3(x=6.90789161545809, y=0.0, z=0.0) * ommunit.nanometer,\n        openmm.vec3.Vec3(x=0.0, y=6.90789161545809, z=0.0) * ommunit.nanometer,\n        openmm.vec3.Vec3(x=3.453945807729045, y=3.453945807729045, z=4.88461700499211)\n        * ommunit.nanometer,\n    ]\n    hybrid_system.setDefaultPeriodicBoxVectors(*box_vectors)\n    for force in hybrid_system.getForces():\n        if isinstance(force, openmm.NonbondedForce):\n            force.setNonbondedMethod(openmm.NonbondedForce.PME)\n            force.setCutoffDistance(\n                force_field.get_parameter_handler(\"Electrostatics\").cutoff.m_as(offunit.nanometer)\n                * ommunit.nanometer\n            )\n            force.setUseDispersionCorrection(False)\n            force.setUseSwitchingFunction(False)\n        elif isinstance(force, openmm.CustomNonbondedForce):\n            force.setCutoffDistance(\n                force_field.get_parameter_handler(\"Electrostatics\").cutoff.m_as(offunit.nanometer)\n                * ommunit.nanometer\n            )\n            force.setNonbondedMethod(force.CutoffPeriodic)\n            force.setUseLongRangeCorrection(False)\n            force.setUseSwitchingFunction(False)\n\n    # make sure both end state systems have the same cutoff method and distance\n    for end_state in [hybrid_topology_factory._old_system, hybrid_topology_factory._new_system]:\n        end_state.setDefaultPeriodicBoxVectors(*box_vectors)\n        for force in end_state.getForces():\n            if isinstance(force, openmm.NonbondedForce):\n                force.setNonbondedMethod(openmm.NonbondedForce.PME)\n                force.setCutoffDistance(\n                    force_field.get_parameter_handler(\"Electrostatics\").cutoff.m_as(\n                        offunit.nanometer\n                    )\n                    * ommunit.nanometer\n                )\n                force.setUseDispersionCorrection(False)\n                force.setUseSwitchingFunction(False)\n\n\n@pytest.fixture(scope=\"module\")\ndef htf_cmap_chlorobenzene_to_fluorobenzene(\n    chlorobenzene_to_fluorobenzene_mapping, t4_lysozyme_solvated\n):\n    \"\"\"Generate the htf for chlorobenzene to fluorobenzene with a CMAP term.\"\"\"\n    settings = RelativeHybridTopologyProtocol.default_settings()\n    small_ff = settings.forcefield_settings.small_molecule_forcefield\n    if \".offxml\" not in small_ff:\n        small_ff += \".offxml\"\n    ff = ForceField(small_ff)\n    # update the default force fields to include a force field with CMAP terms\n    settings.forcefield_settings.forcefields = [\n        \"amber/protein.ff19SB.xml\",  # cmap amber ff\n        \"amber/tip3p_standard.xml\",  # TIP3P and recommended monovalent ion parameters\n        \"amber/tip3p_HFE_multivalent.xml\",  # for divalent ions\n        \"amber/phosaa19SB.xml\",  # Handles THE TPO\n    ]\n    htf = make_htf(\n        mapping=chlorobenzene_to_fluorobenzene_mapping,\n        protein=t4_lysozyme_solvated,\n        settings=settings,\n    )\n    # apply box vectors and fix nonbonded force settings so we can use PME\n    apply_box_vectors_and_fix_nb_force(hybrid_topology_factory=htf, force_field=ff)\n    hybrid_system = htf.hybrid_system\n    forces = {force.getName(): force for force in hybrid_system.getForces()}\n\n    return {\n        \"htf\": htf,\n        \"hybrid_system\": hybrid_system,\n        \"forces\": forces,\n        \"mapping\": chlorobenzene_to_fluorobenzene_mapping,\n        \"chlorobenzene\": chlorobenzene_to_fluorobenzene_mapping.componentA,\n        \"fluorobenzene\": chlorobenzene_to_fluorobenzene_mapping.componentB,\n        \"electrostatic_scale\": ff.get_parameter_handler(\"Electrostatics\").scale14,\n        \"vdW_scale\": ff.get_parameter_handler(\"vdW\").scale14,\n        \"force_field\": ff,\n    }\n\n\n@pytest.fixture(scope=\"module\")\ndef htf_chloro_fluoroethane(chloroethane, fluoroethane, chloroethane_to_fluoroethane_mapping):\n    \"\"\"Generate the htf for chloroethane to fluoroethane in vacuum.\"\"\"\n    settings = RelativeHybridTopologyProtocol.default_settings()\n    small_ff = settings.forcefield_settings.small_molecule_forcefield\n    if \".offxml\" not in small_ff:\n        small_ff += \".offxml\"\n    ff = ForceField(small_ff)\n    chloro_openff = chloroethane.to_openff()\n    chloro_charges = chloro_openff.partial_charges.m_as(offunit.elementary_charge)\n    chloro_labels = ff.label_molecules(chloro_openff.to_topology())[0]\n    fluoro_openff = fluoroethane.to_openff()\n    fluoro_charges = fluoro_openff.partial_charges.m_as(offunit.elementary_charge)\n    fluoro_labels = ff.label_molecules(fluoro_openff.to_topology())[0]\n    htf = make_htf(mapping=chloroethane_to_fluoroethane_mapping, settings=settings)\n    hybrid_system = htf.hybrid_system\n    forces = {force.getName(): force for force in hybrid_system.getForces()}\n\n    return {\n        \"htf\": htf,\n        \"hybrid_system\": hybrid_system,\n        \"forces\": forces,\n        \"chloro_labels\": chloro_labels,\n        \"fluoro_labels\": fluoro_labels,\n        \"mapping\": chloroethane_to_fluoroethane_mapping,\n        \"chloroethane\": chloroethane,\n        \"fluoroethane\": fluoroethane,\n        \"chloro_charges\": chloro_charges,\n        \"fluoro_charges\": fluoro_charges,\n        \"electrostatic_scale\": ff.get_parameter_handler(\"Electrostatics\").scale14,\n        \"vdW_scale\": ff.get_parameter_handler(\"vdW\").scale14,\n        \"force_field\": ff,\n    }\n\n\n@pytest.fixture(scope=\"module\")\ndef htf_chloro_ethane(chloroethane, ethane, chloroethane_to_ethane_mapping):\n    \"\"\"Generate the htf for chloroethane to ethane in vacuum.\"\"\"\n    settings = RelativeHybridTopologyProtocol.default_settings()\n    small_ff = settings.forcefield_settings.small_molecule_forcefield\n    if \".offxml\" not in small_ff:\n        small_ff += \".offxml\"\n    ff = ForceField(small_ff)\n\n    chloro_openff = chloroethane.to_openff()\n    chloro_charges = chloro_openff.partial_charges.m_as(offunit.elementary_charge)\n    chloro_labels = ff.label_molecules(chloro_openff.to_topology())[0]\n    ethane_openff = ethane.to_openff()\n    ethane_charges = ethane_openff.partial_charges.m_as(offunit.elementary_charge)\n    ethane_labels = ff.label_molecules(ethane_openff.to_topology())[0]\n    htf = make_htf(mapping=chloroethane_to_ethane_mapping, settings=settings)\n    hybrid_system = htf.hybrid_system\n    forces = {force.getName(): force for force in hybrid_system.getForces()}\n\n    return {\n        \"htf\": htf,\n        \"hybrid_system\": hybrid_system,\n        \"forces\": forces,\n        \"chloro_labels\": chloro_labels,\n        \"ethane_labels\": ethane_labels,\n        \"mapping\": chloroethane_to_ethane_mapping,\n        \"chloroethane\": chloroethane,\n        \"ethane\": ethane,\n        \"chloro_charges\": chloro_charges,\n        \"ethane_charges\": ethane_charges,\n        \"electrostatic_scale\": ff.get_parameter_handler(\"Electrostatics\").scale14,\n        \"vdW_scale\": ff.get_parameter_handler(\"vdW\").scale14,\n        \"force_field\": ff,\n    }\n\n\n@pytest.fixture(scope=\"module\")\ndef htf_chlorobenzene_fluorobenzene(\n    chlorobenzene, fluorobenzene, chlorobenzene_to_fluorobenzene_mapping, t4_lysozyme_solvated\n):\n    \"\"\"Generate the htf for chlorobenzene to fluorobenzene in complex with t4-lysozyme solvated.\"\"\"\n    settings = RelativeHybridTopologyProtocol.default_settings()\n    small_ff = settings.forcefield_settings.small_molecule_forcefield\n    if \".offxml\" not in small_ff:\n        small_ff += \".offxml\"\n    ff = ForceField(small_ff)\n    chloro_openff = chlorobenzene.to_openff()\n    chloro_charges = chloro_openff.partial_charges.m_as(offunit.elementary_charge)\n    chloro_labels = ff.label_molecules(chloro_openff.to_topology())[0]\n    fluoro_openff = fluorobenzene.to_openff()\n    fluoro_charges = fluoro_openff.partial_charges.m_as(offunit.elementary_charge)\n    fluoro_labels = ff.label_molecules(fluoro_openff.to_topology())[0]\n    htf = make_htf(\n        mapping=chlorobenzene_to_fluorobenzene_mapping,\n        settings=settings,\n        protein=t4_lysozyme_solvated,\n    )\n    hybrid_system = htf.hybrid_system\n\n    apply_box_vectors_and_fix_nb_force(hybrid_topology_factory=htf, force_field=ff)\n\n    forces = {force.getName(): force for force in hybrid_system.getForces()}\n\n    return {\n        \"htf\": htf,\n        \"hybrid_system\": hybrid_system,\n        \"forces\": forces,\n        \"chloro_labels\": chloro_labels,\n        \"fluoro_labels\": fluoro_labels,\n        \"mapping\": chlorobenzene_to_fluorobenzene_mapping,\n        \"chlorobenzene\": chlorobenzene,\n        \"fluorobenzene\": fluorobenzene,\n        \"chloro_charges\": chloro_charges,\n        \"fluoro_charges\": fluoro_charges,\n        \"electrostatic_scale\": ff.get_parameter_handler(\"Electrostatics\").scale14,\n        \"vdW_scale\": ff.get_parameter_handler(\"vdW\").scale14,\n        \"force_field\": ff,\n    }\n\n\n@pytest.fixture(scope=\"module\")\ndef htf_chlorobenzene_benzene(\n    chlorobenzene, benzene, chlorobenzene_to_benzene_mapping, t4_lysozyme_solvated\n):\n    \"\"\"Generate the htf for chlorobenzene to benzene with interpolate 1-4s on in complex with t4-lysozyme solvated.\"\"\"\n    settings = RelativeHybridTopologyProtocol.default_settings()\n    small_ff = settings.forcefield_settings.small_molecule_forcefield\n    if \".offxml\" not in small_ff:\n        small_ff += \".offxml\"\n    ff = ForceField(small_ff)\n\n    chloro_openff = chlorobenzene.to_openff()\n    chloro_charges = chloro_openff.partial_charges.m_as(offunit.elementary_charge)\n    chloro_labels = ff.label_molecules(chloro_openff.to_topology())[0]\n    benzene_openff = benzene.to_openff()\n    benzene_charges = benzene_openff.partial_charges.m_as(offunit.elementary_charge)\n    benzene_labels = ff.label_molecules(benzene_openff.to_topology())[0]\n    htf = make_htf(\n        mapping=chlorobenzene_to_benzene_mapping, settings=settings, protein=t4_lysozyme_solvated\n    )\n    hybrid_system = htf.hybrid_system\n\n    apply_box_vectors_and_fix_nb_force(hybrid_topology_factory=htf, force_field=ff)\n\n    forces = {force.getName(): force for force in hybrid_system.getForces()}\n\n    return {\n        \"htf\": htf,\n        \"hybrid_system\": hybrid_system,\n        \"forces\": forces,\n        \"chloro_labels\": chloro_labels,\n        \"benzene_labels\": benzene_labels,\n        \"mapping\": chlorobenzene_to_benzene_mapping,\n        \"chlorobenzene\": chlorobenzene,\n        \"benzene\": benzene,\n        \"chloro_charges\": chloro_charges,\n        \"benzene_charges\": benzene_charges,\n        \"electrostatic_scale\": ff.get_parameter_handler(\"Electrostatics\").scale14,\n        \"vdW_scale\": ff.get_parameter_handler(\"vdW\").scale14,\n        \"force_field\": ff,\n    }\n"
  },
  {
    "path": "src/openfe/tests/data/181l_only.pdb",
    "content": "ATOM      1  C   ACE A   0      44.004  -3.922  10.269  1.00  0.00           C  \nATOM      2  O   ACE A   0      43.553  -3.405  11.300  1.00  0.00           O  \nATOM      3  CH3 ACE A   0      44.579  -5.322  10.286  1.00  0.00           C  \nATOM      4 1HH3 ACE A   0      43.825  -6.028  10.604  1.00  0.00           H  \nATOM      5 2HH3 ACE A   0      44.917  -5.595   9.297  1.00  0.00           H  \nATOM      6 3HH3 ACE A   0      45.415  -5.370  10.968  1.00  0.00           H  \nATOM      7  N   MET A   1      43.982  -3.258   9.163  1.00  0.00           N  \nATOM      8  CA  MET A   1      43.434  -1.917   9.134  1.00  0.00           C  \nATOM      9  C   MET A   1      42.006  -1.966   9.640  1.00  0.00           C  \nATOM     10  O   MET A   1      41.334  -2.969   9.468  1.00  0.00           O  \nATOM     11  CB  MET A   1      43.582  -1.397   7.675  1.00  0.00           C  \nATOM     12  CG  MET A   1      42.903  -0.084   7.444  1.00  0.00           C  \nATOM     13  SD  MET A   1      44.006   1.250   7.952  1.00  0.00           S  \nATOM     14  CE  MET A   1      45.481   0.757   7.112  1.00  0.00           C  \nATOM     15  H   MET A   1      44.347  -3.673   8.318  1.00  0.00           H  \nATOM     16  HA  MET A   1      43.973  -1.334   9.742  1.00  0.00           H  \nATOM     17  HB2 MET A   1      43.185  -2.073   7.055  1.00  0.00           H  \nATOM     18  HB3 MET A   1      44.556  -1.291   7.473  1.00  0.00           H  \nATOM     19  HG2 MET A   1      42.060  -0.044   7.981  1.00  0.00           H  \nATOM     20  HG3 MET A   1      42.685   0.014   6.473  1.00  0.00           H  \nATOM     21  HE1 MET A   1      46.208   1.417   7.300  1.00  0.00           H  \nATOM     22  HE2 MET A   1      45.761  -0.148   7.433  1.00  0.00           H  \nATOM     23  HE3 MET A   1      45.308   0.723   6.128  1.00  0.00           H  \nATOM     24  N   ASN A   2      41.577  -0.917  10.331  1.00  0.00           N  \nATOM     25  CA  ASN A   2      40.227  -0.852  10.835  1.00  0.00           C  \nATOM     26  C   ASN A   2      39.857   0.627  10.904  1.00  0.00           C  \nATOM     27  O   ASN A   2      40.756   1.443  10.662  1.00  0.00           O  \nATOM     28  CB  ASN A   2      40.133  -1.529  12.224  1.00  0.00           C  \nATOM     29  CG  ASN A   2      41.084  -0.909  13.215  1.00  0.00           C  \nATOM     30  ND2 ASN A   2      42.001  -1.711  13.752  1.00  0.00           N  \nATOM     31  OD1 ASN A   2      41.041   0.309  13.479  1.00  0.00           O  \nATOM     32  H   ASN A   2      42.202  -0.156  10.506  1.00  0.00           H  \nATOM     33  HA  ASN A   2      39.613  -1.317  10.198  1.00  0.00           H  \nATOM     34  HB2 ASN A   2      40.354  -2.499  12.127  1.00  0.00           H  \nATOM     35  HB3 ASN A   2      39.199  -1.433  12.568  1.00  0.00           H  \nATOM     36 HD21 ASN A   2      42.011  -2.684  13.522  1.00  0.00           H  \nATOM     37 HD22 ASN A   2      42.680  -1.340  14.386  1.00  0.00           H  \nATOM     38  N   ILE A   3      38.598   0.950  11.230  1.00  0.00           N  \nATOM     39  CA  ILE A   3      38.095   2.316  11.285  1.00  0.00           C  \nATOM     40  C   ILE A   3      38.983   3.288  12.114  1.00  0.00           C  \nATOM     41  O   ILE A   3      39.269   4.440  11.729  1.00  0.00           O  \nATOM     42  CB  ILE A   3      36.596   2.331  11.634  1.00  0.00           C  \nATOM     43  CG1 ILE A   3      36.015   3.749  11.576  1.00  0.00           C  \nATOM     44  CG2 ILE A   3      36.352   1.659  12.987  1.00  0.00           C  \nATOM     45  CD1 ILE A   3      36.262   4.484  10.218  1.00  0.00           C  \nATOM     46  H   ILE A   3      37.965   0.208  11.449  1.00  0.00           H  \nATOM     47  HA  ILE A   3      38.148   2.652  10.345  1.00  0.00           H  \nATOM     48  HB  ILE A   3      36.123   1.787  10.941  1.00  0.00           H  \nATOM     49 HG12 ILE A   3      36.432   4.290  12.306  1.00  0.00           H  \nATOM     50 HG13 ILE A   3      35.028   3.691  11.727  1.00  0.00           H  \nATOM     51 HG21 ILE A   3      35.375   1.678  13.197  1.00  0.00           H  \nATOM     52 HG22 ILE A   3      36.667   0.711  12.950  1.00  0.00           H  \nATOM     53 HG23 ILE A   3      36.855   2.149  13.698  1.00  0.00           H  \nATOM     54 HD11 ILE A   3      35.857   5.398  10.255  1.00  0.00           H  \nATOM     55 HD12 ILE A   3      37.246   4.562  10.055  1.00  0.00           H  \nATOM     56 HD13 ILE A   3      35.841   3.963   9.475  1.00  0.00           H  \nATOM     57  N   PHE A   4      39.471   2.813  13.251  1.00  0.00           N  \nATOM     58  CA  PHE A   4      40.288   3.621  14.120  1.00  0.00           C  \nATOM     59  C   PHE A   4      41.595   4.009  13.514  1.00  0.00           C  \nATOM     60  O   PHE A   4      42.017   5.171  13.544  1.00  0.00           O  \nATOM     61  CB  PHE A   4      40.534   2.948  15.448  1.00  0.00           C  \nATOM     62  CG  PHE A   4      39.261   2.896  16.253  1.00  0.00           C  \nATOM     63  CD1 PHE A   4      38.915   3.949  17.091  1.00  0.00           C  \nATOM     64  CD2 PHE A   4      38.438   1.771  16.220  1.00  0.00           C  \nATOM     65  CE1 PHE A   4      37.756   3.891  17.868  1.00  0.00           C  \nATOM     66  CE2 PHE A   4      37.266   1.706  16.970  1.00  0.00           C  \nATOM     67  CZ  PHE A   4      36.931   2.766  17.809  1.00  0.00           C  \nATOM     68  H   PHE A   4      39.267   1.870  13.512  1.00  0.00           H  \nATOM     69  HA  PHE A   4      39.783   4.465  14.303  1.00  0.00           H  \nATOM     70  HB2 PHE A   4      41.224   3.463  15.956  1.00  0.00           H  \nATOM     71  HB3 PHE A   4      40.862   2.017  15.290  1.00  0.00           H  \nATOM     72  HD1 PHE A   4      39.502   4.757  17.138  1.00  0.00           H  \nATOM     73  HD2 PHE A   4      38.695   0.994  15.645  1.00  0.00           H  \nATOM     74  HE1 PHE A   4      37.517   4.655  18.467  1.00  0.00           H  \nATOM     75  HE2 PHE A   4      36.670   0.905  16.907  1.00  0.00           H  \nATOM     76  HZ  PHE A   4      36.102   2.722  18.367  1.00  0.00           H  \nATOM     77  N   GLU A   5      42.284   3.029  12.984  1.00  0.00           N  \nATOM     78  CA  GLU A   5      43.538   3.324  12.350  1.00  0.00           C  \nATOM     79  C   GLU A   5      43.301   4.168  11.123  1.00  0.00           C  \nATOM     80  O   GLU A   5      44.143   4.951  10.782  1.00  0.00           O  \nATOM     81  CB  GLU A   5      44.301   2.059  11.905  1.00  0.00           C  \nATOM     82  CG  GLU A   5      44.570   1.071  13.057  1.00  0.00           C  \nATOM     83  CD  GLU A   5      45.307  -0.199  12.662  1.00  0.00           C  \nATOM     84  OE1 GLU A   5      45.539  -0.541  11.509  1.00  0.00           O  \nATOM     85  OE2 GLU A   5      45.835  -0.819  13.703  1.00  0.00           O1-\nATOM     86  H   GLU A   5      41.942   2.090  13.020  1.00  0.00           H  \nATOM     87  HA  GLU A   5      44.110   3.838  12.989  1.00  0.00           H  \nATOM     88  HB2 GLU A   5      45.179   2.338  11.515  1.00  0.00           H  \nATOM     89  HB3 GLU A   5      43.760   1.592  11.206  1.00  0.00           H  \nATOM     90  HG2 GLU A   5      43.689   0.808  13.451  1.00  0.00           H  \nATOM     91  HG3 GLU A   5      45.116   1.543  13.748  1.00  0.00           H  \nATOM     92  N   MET A   6      42.196   3.948  10.448  1.00  0.00           N  \nATOM     93  CA  MET A   6      41.906   4.713   9.248  1.00  0.00           C  \nATOM     94  C   MET A   6      41.733   6.191   9.577  1.00  0.00           C  \nATOM     95  O   MET A   6      42.305   7.096   8.943  1.00  0.00           O  \nATOM     96  CB  MET A   6      40.583   4.198   8.656  1.00  0.00           C  \nATOM     97  CG  MET A   6      40.268   4.791   7.289  1.00  0.00           C  \nATOM     98  SD  MET A   6      38.516   4.549   6.882  1.00  0.00           S  \nATOM     99  CE  MET A   6      38.491   4.603   5.061  1.00  0.00           C  \nATOM    100  H   MET A   6      41.552   3.251  10.762  1.00  0.00           H  \nATOM    101  HA  MET A   6      42.644   4.596   8.584  1.00  0.00           H  \nATOM    102  HB2 MET A   6      39.841   4.433   9.283  1.00  0.00           H  \nATOM    103  HB3 MET A   6      40.641   3.204   8.566  1.00  0.00           H  \nATOM    104  HG2 MET A   6      40.832   4.341   6.597  1.00  0.00           H  \nATOM    105  HG3 MET A   6      40.471   5.770   7.300  1.00  0.00           H  \nATOM    106  HE1 MET A   6      37.554   4.477   4.737  1.00  0.00           H  \nATOM    107  HE2 MET A   6      38.835   5.488   4.749  1.00  0.00           H  \nATOM    108  HE3 MET A   6      39.070   3.873   4.698  1.00  0.00           H  \nATOM    109  N   LEU A   7      40.898   6.458  10.569  1.00  0.00           N  \nATOM    110  CA  LEU A   7      40.633   7.840  10.929  1.00  0.00           C  \nATOM    111  C   LEU A   7      41.868   8.518  11.566  1.00  0.00           C  \nATOM    112  O   LEU A   7      42.104   9.741  11.449  1.00  0.00           O  \nATOM    113  CB  LEU A   7      39.392   7.942  11.817  1.00  0.00           C  \nATOM    114  CG  LEU A   7      38.095   7.927  11.038  1.00  0.00           C  \nATOM    115  CD1 LEU A   7      36.964   7.641  12.005  1.00  0.00           C  \nATOM    116  CD2 LEU A   7      37.911   9.284  10.346  1.00  0.00           C  \nATOM    117  H   LEU A   7      40.453   5.714  11.067  1.00  0.00           H  \nATOM    118  HA  LEU A   7      40.431   8.332  10.082  1.00  0.00           H  \nATOM    119  HB2 LEU A   7      39.441   8.796  12.334  1.00  0.00           H  \nATOM    120  HB3 LEU A   7      39.391   7.168  12.450  1.00  0.00           H  \nATOM    121  HG  LEU A   7      38.131   7.205  10.347  1.00  0.00           H  \nATOM    122 HD11 LEU A   7      36.096   7.627  11.508  1.00  0.00           H  \nATOM    123 HD12 LEU A   7      37.114   6.753  12.440  1.00  0.00           H  \nATOM    124 HD13 LEU A   7      36.936   8.354  12.705  1.00  0.00           H  \nATOM    125 HD21 LEU A   7      37.055   9.281   9.829  1.00  0.00           H  \nATOM    126 HD22 LEU A   7      37.882  10.008  11.035  1.00  0.00           H  \nATOM    127 HD23 LEU A   7      38.676   9.447   9.723  1.00  0.00           H  \nATOM    128  N   ARG A   8      42.674   7.714  12.256  1.00  0.00           N  \nATOM    129  CA  ARG A   8      43.879   8.232  12.881  1.00  0.00           C  \nATOM    130  C   ARG A   8      44.822   8.756  11.814  1.00  0.00           C  \nATOM    131  O   ARG A   8      45.490   9.750  12.027  1.00  0.00           O  \nATOM    132  CB  ARG A   8      44.530   7.358  13.934  1.00  0.00           C  \nATOM    133  CG  ARG A   8      45.959   7.753  14.297  1.00  0.00           C  \nATOM    134  CD  ARG A   8      46.112   8.681  15.527  1.00  0.00           C  \nATOM    135  NE  ARG A   8      47.474   9.235  15.686  1.00  0.00           N  \nATOM    136  CZ  ARG A   8      48.157   9.911  14.739  1.00  0.00           C  \nATOM    137  NH1 ARG A   8      47.674  10.152  13.525  1.00  0.00           N1+\nATOM    138  NH2 ARG A   8      49.384  10.348  15.035  1.00  0.00           N  \nATOM    139  H   ARG A   8      42.448   6.744  12.345  1.00  0.00           H  \nATOM    140  HA  ARG A   8      43.578   9.047  13.377  1.00  0.00           H  \nATOM    141  HB2 ARG A   8      44.544   6.418  13.593  1.00  0.00           H  \nATOM    142  HB3 ARG A   8      43.974   7.404  14.764  1.00  0.00           H  \nATOM    143  HG2 ARG A   8      46.357   8.221  13.508  1.00  0.00           H  \nATOM    144  HG3 ARG A   8      46.472   6.914  14.480  1.00  0.00           H  \nATOM    145  HD2 ARG A   8      45.886   8.157  16.348  1.00  0.00           H  \nATOM    146  HD3 ARG A   8      45.471   9.442  15.430  1.00  0.00           H  \nATOM    147  HE  ARG A   8      47.926   9.097  16.568  1.00  0.00           H  \nATOM    148 HH11 ARG A   8      48.223  10.659  12.860  1.00  0.00           H  \nATOM    149 HH12 ARG A   8      46.762   9.827  13.276  1.00  0.00           H  \nATOM    150 HH21 ARG A   8      49.913  10.852  14.353  1.00  0.00           H  \nATOM    151 HH22 ARG A   8      49.773  10.171  15.939  1.00  0.00           H  \nATOM    152  N   ILE A   9      44.811   8.131  10.651  1.00  0.00           N  \nATOM    153  CA  ILE A   9      45.596   8.555   9.524  1.00  0.00           C  \nATOM    154  C   ILE A   9      44.969   9.770   8.851  1.00  0.00           C  \nATOM    155  O   ILE A   9      45.647  10.700   8.457  1.00  0.00           O  \nATOM    156  CB  ILE A   9      45.769   7.426   8.495  1.00  0.00           C  \nATOM    157  CG1 ILE A   9      46.849   6.457   8.921  1.00  0.00           C  \nATOM    158  CG2 ILE A   9      46.155   7.969   7.105  1.00  0.00           C  \nATOM    159  CD1 ILE A   9      46.552   5.045   8.403  1.00  0.00           C  \nATOM    160  H   ILE A   9      44.229   7.324  10.549  1.00  0.00           H  \nATOM    161  HA  ILE A   9      46.503   8.816   9.856  1.00  0.00           H  \nATOM    162  HB  ILE A   9      44.905   6.929   8.416  1.00  0.00           H  \nATOM    163 HG12 ILE A   9      46.895   6.436   9.920  1.00  0.00           H  \nATOM    164 HG13 ILE A   9      47.727   6.763   8.553  1.00  0.00           H  \nATOM    165 HG21 ILE A   9      46.258   7.207   6.466  1.00  0.00           H  \nATOM    166 HG22 ILE A   9      45.438   8.585   6.777  1.00  0.00           H  \nATOM    167 HG23 ILE A   9      47.019   8.468   7.170  1.00  0.00           H  \nATOM    168 HD11 ILE A   9      47.278   4.423   8.696  1.00  0.00           H  \nATOM    169 HD12 ILE A   9      45.676   4.732   8.771  1.00  0.00           H  \nATOM    170 HD13 ILE A   9      46.508   5.059   7.404  1.00  0.00           H  \nATOM    171  N   ASP A  10      43.683   9.808   8.711  1.00  0.00           N  \nATOM    172  CA  ASP A  10      43.099  10.964   8.067  1.00  0.00           C  \nATOM    173  C   ASP A  10      43.051  12.245   8.910  1.00  0.00           C  \nATOM    174  O   ASP A  10      43.086  13.347   8.392  1.00  0.00           O  \nATOM    175  CB  ASP A  10      41.680  10.604   7.626  1.00  0.00           C  \nATOM    176  CG  ASP A  10      41.719   9.818   6.391  1.00  0.00           C  \nATOM    177  OD1 ASP A  10      42.628   9.900   5.589  1.00  0.00           O  \nATOM    178  OD2 ASP A  10      40.724   9.014   6.273  1.00  0.00           O1-\nATOM    179  H   ASP A  10      43.108   9.058   9.039  1.00  0.00           H  \nATOM    180  HA  ASP A  10      43.634  11.159   7.245  1.00  0.00           H  \nATOM    181  HB2 ASP A  10      41.160  11.443   7.467  1.00  0.00           H  \nATOM    182  HB3 ASP A  10      41.237  10.068   8.345  1.00  0.00           H  \nATOM    183  N   GLU A  11      42.927  12.117  10.224  1.00  0.00           N  \nATOM    184  CA  GLU A  11      42.763  13.267  11.074  1.00  0.00           C  \nATOM    185  C   GLU A  11      44.017  13.713  11.821  1.00  0.00           C  \nATOM    186  O   GLU A  11      44.090  14.848  12.255  1.00  0.00           O  \nATOM    187  CB  GLU A  11      41.669  12.995  12.129  1.00  0.00           C  \nATOM    188  CG  GLU A  11      40.343  12.685  11.476  1.00  0.00           C  \nATOM    189  CD  GLU A  11      39.674  13.930  10.943  1.00  0.00           C  \nATOM    190  OE1 GLU A  11      40.305  15.027  11.265  1.00  0.00           O  \nATOM    191  OE2 GLU A  11      38.674  13.918  10.294  1.00  0.00           O1-\nATOM    192  H   GLU A  11      42.948  11.204  10.632  1.00  0.00           H  \nATOM    193  HA  GLU A  11      42.457  14.030  10.504  1.00  0.00           H  \nATOM    194  HB2 GLU A  11      41.566  13.804  12.708  1.00  0.00           H  \nATOM    195  HB3 GLU A  11      41.945  12.216  12.692  1.00  0.00           H  \nATOM    196  HG2 GLU A  11      39.742  12.259  12.152  1.00  0.00           H  \nATOM    197  HG3 GLU A  11      40.496  12.050  10.718  1.00  0.00           H  \nATOM    198  N   GLY A  12      44.990  12.816  12.013  1.00  0.00           N  \nATOM    199  CA  GLY A  12      46.160  13.121  12.812  1.00  0.00           C  \nATOM    200  C   GLY A  12      45.801  13.144  14.307  1.00  0.00           C  \nATOM    201  O   GLY A  12      44.708  12.830  14.714  1.00  0.00           O  \nATOM    202  H   GLY A  12      44.908  11.911  11.594  1.00  0.00           H  \nATOM    203  HA2 GLY A  12      46.516  14.017  12.545  1.00  0.00           H  \nATOM    204  HA3 GLY A  12      46.859  12.423  12.652  1.00  0.00           H  \nATOM    205  N   LEU A  13      46.748  13.506  15.150  1.00  0.00           N  \nATOM    206  CA  LEU A  13      46.517  13.633  16.582  1.00  0.00           C  \nATOM    207  C   LEU A  13      47.177  14.923  17.047  1.00  0.00           C  \nATOM    208  O   LEU A  13      48.351  15.138  16.799  1.00  0.00           O  \nATOM    209  CB  LEU A  13      47.090  12.436  17.363  1.00  0.00           C  \nATOM    210  CG  LEU A  13      47.425  12.766  18.822  1.00  0.00           C  \nATOM    211  CD1 LEU A  13      46.161  12.825  19.675  1.00  0.00           C  \nATOM    212  CD2 LEU A  13      48.364  11.714  19.390  1.00  0.00           C  \nATOM    213  H   LEU A  13      47.661  13.701  14.792  1.00  0.00           H  \nATOM    214  HA  LEU A  13      45.533  13.691  16.750  1.00  0.00           H  \nATOM    215  HB2 LEU A  13      47.926  12.131  16.907  1.00  0.00           H  \nATOM    216  HB3 LEU A  13      46.415  11.698  17.352  1.00  0.00           H  \nATOM    217  HG  LEU A  13      47.879  13.656  18.856  1.00  0.00           H  \nATOM    218 HD11 LEU A  13      46.406  13.041  20.620  1.00  0.00           H  \nATOM    219 HD12 LEU A  13      45.551  13.533  19.319  1.00  0.00           H  \nATOM    220 HD13 LEU A  13      45.697  11.940  19.645  1.00  0.00           H  \nATOM    221 HD21 LEU A  13      48.577  11.936  20.341  1.00  0.00           H  \nATOM    222 HD22 LEU A  13      47.924  10.817  19.348  1.00  0.00           H  \nATOM    223 HD23 LEU A  13      49.208  11.697  18.854  1.00  0.00           H  \nATOM    224  N   ARG A  14      46.440  15.813  17.680  1.00  0.00           N  \nATOM    225  CA  ARG A  14      46.999  17.069  18.151  1.00  0.00           C  \nATOM    226  C   ARG A  14      46.550  17.274  19.536  1.00  0.00           C  \nATOM    227  O   ARG A  14      45.379  17.130  19.832  1.00  0.00           O  \nATOM    228  CB  ARG A  14      46.695  18.247  17.258  1.00  0.00           C  \nATOM    229  CG  ARG A  14      47.547  18.072  16.002  1.00  0.00           C  \nATOM    230  CD  ARG A  14      47.386  19.150  14.974  1.00  0.00           C  \nATOM    231  NE  ARG A  14      48.088  20.362  15.360  1.00  0.00           N  \nATOM    232  CZ  ARG A  14      47.987  21.518  14.710  1.00  0.00           C  \nATOM    233  NH1 ARG A  14      47.226  21.645  13.621  1.00  0.00           N1+\nATOM    234  NH2 ARG A  14      48.682  22.561  15.145  1.00  0.00           N  \nATOM    235  H   ARG A  14      45.472  15.619  17.840  1.00  0.00           H  \nATOM    236  HA  ARG A  14      47.993  16.962  18.174  1.00  0.00           H  \nATOM    237  HB2 ARG A  14      46.933  19.101  17.720  1.00  0.00           H  \nATOM    238  HB3 ARG A  14      45.724  18.257  17.018  1.00  0.00           H  \nATOM    239  HG2 ARG A  14      47.301  17.200  15.579  1.00  0.00           H  \nATOM    240  HG3 ARG A  14      48.508  18.048  16.279  1.00  0.00           H  \nATOM    241  HD2 ARG A  14      46.413  19.357  14.870  1.00  0.00           H  \nATOM    242  HD3 ARG A  14      47.753  18.825  14.102  1.00  0.00           H  \nATOM    243  HE  ARG A  14      48.683  20.325  16.163  1.00  0.00           H  \nATOM    244 HH11 ARG A  14      47.168  22.526  13.151  1.00  0.00           H  \nATOM    245 HH12 ARG A  14      46.714  20.859  13.275  1.00  0.00           H  \nATOM    246 HH21 ARG A  14      48.618  23.438  14.669  1.00  0.00           H  \nATOM    247 HH22 ARG A  14      49.269  22.470  15.949  1.00  0.00           H  \nATOM    248  N   LEU A  15      47.514  17.523  20.390  1.00  0.00           N  \nATOM    249  CA  LEU A  15      47.218  17.658  21.785  1.00  0.00           C  \nATOM    250  C   LEU A  15      46.959  19.076  22.264  1.00  0.00           C  \nATOM    251  O   LEU A  15      46.706  19.257  23.444  1.00  0.00           O  \nATOM    252  CB  LEU A  15      48.249  16.968  22.683  1.00  0.00           C  \nATOM    253  CG  LEU A  15      48.403  15.456  22.445  1.00  0.00           C  \nATOM    254  CD1 LEU A  15      49.492  14.938  23.379  1.00  0.00           C  \nATOM    255  CD2 LEU A  15      47.109  14.692  22.732  1.00  0.00           C  \nATOM    256  H   LEU A  15      48.456  17.619  20.067  1.00  0.00           H  \nATOM    257  HA  LEU A  15      46.361  17.164  21.928  1.00  0.00           H  \nATOM    258  HB2 LEU A  15      47.975  17.107  23.635  1.00  0.00           H  \nATOM    259  HB3 LEU A  15      49.137  17.400  22.525  1.00  0.00           H  \nATOM    260  HG  LEU A  15      48.678  15.297  21.497  1.00  0.00           H  \nATOM    261 HD11 LEU A  15      49.609  13.955  23.241  1.00  0.00           H  \nATOM    262 HD12 LEU A  15      50.352  15.407  23.181  1.00  0.00           H  \nATOM    263 HD13 LEU A  15      49.228  15.112  24.328  1.00  0.00           H  \nATOM    264 HD21 LEU A  15      47.254  13.717  22.565  1.00  0.00           H  \nATOM    265 HD22 LEU A  15      46.844  14.831  23.686  1.00  0.00           H  \nATOM    266 HD23 LEU A  15      46.383  15.029  22.132  1.00  0.00           H  \nATOM    267  N   LYS A  16      47.015  20.051  21.389  1.00  0.00           N  \nATOM    268  CA  LYS A  16      46.708  21.436  21.780  1.00  0.00           C  \nATOM    269  C   LYS A  16      45.647  21.964  20.836  1.00  0.00           C  \nATOM    270  O   LYS A  16      45.673  21.516  19.697  1.00  0.00           O  \nATOM    271  CB  LYS A  16      48.009  22.241  21.801  1.00  0.00           C  \nATOM    272  CG  LYS A  16      47.832  23.733  21.621  1.00  0.00           C  \nATOM    273  CD  LYS A  16      48.147  24.536  22.878  1.00  0.00           C  \nATOM    274  CE  LYS A  16      46.887  25.089  23.559  1.00  0.00           C  \nATOM    275  NZ  LYS A  16      47.181  26.099  24.609  1.00  0.00           N1+\nATOM    276  H   LYS A  16      47.270  19.851  20.443  1.00  0.00           H  \nATOM    277  HA  LYS A  16      46.329  21.425  22.705  1.00  0.00           H  \nATOM    278  HB2 LYS A  16      48.595  21.906  21.063  1.00  0.00           H  \nATOM    279  HB3 LYS A  16      48.458  22.084  22.681  1.00  0.00           H  \nATOM    280  HG2 LYS A  16      46.883  23.911  21.361  1.00  0.00           H  \nATOM    281  HG3 LYS A  16      48.441  24.038  20.889  1.00  0.00           H  \nATOM    282  HD2 LYS A  16      48.738  25.303  22.628  1.00  0.00           H  \nATOM    283  HD3 LYS A  16      48.626  23.943  23.525  1.00  0.00           H  \nATOM    284  HE2 LYS A  16      46.394  24.328  23.980  1.00  0.00           H  \nATOM    285  HE3 LYS A  16      46.310  25.515  22.862  1.00  0.00           H  \nATOM    286  HZ1 LYS A  16      46.744  26.966  24.369  1.00  0.00           H  \nATOM    287  HZ2 LYS A  16      46.827  25.779  25.488  1.00  0.00           H  \nATOM    288  HZ3 LYS A  16      48.170  26.232  24.676  1.00  0.00           H  \nATOM    289  N   ILE A  17      44.685  22.822  21.285  1.00  0.00           N  \nATOM    290  CA  ILE A  17      43.607  23.297  20.400  1.00  0.00           C  \nATOM    291  C   ILE A  17      44.163  23.749  19.075  1.00  0.00           C  \nATOM    292  O   ILE A  17      45.220  24.375  19.087  1.00  0.00           O  \nATOM    293  CB  ILE A  17      42.789  24.435  21.027  1.00  0.00           C  \nATOM    294  CG1 ILE A  17      42.046  23.902  22.247  1.00  0.00           C  \nATOM    295  CG2 ILE A  17      41.792  25.056  20.026  1.00  0.00           C  \nATOM    296  CD1 ILE A  17      41.103  24.937  22.842  1.00  0.00           C  \nATOM    297  H   ILE A  17      44.712  23.135  22.234  1.00  0.00           H  \nATOM    298  HA  ILE A  17      42.988  22.530  20.229  1.00  0.00           H  \nATOM    299  HB  ILE A  17      43.421  25.149  21.329  1.00  0.00           H  \nATOM    300 HG12 ILE A  17      42.715  23.638  22.942  1.00  0.00           H  \nATOM    301 HG13 ILE A  17      41.514  23.100  21.975  1.00  0.00           H  \nATOM    302 HG21 ILE A  17      41.283  25.790  20.475  1.00  0.00           H  \nATOM    303 HG22 ILE A  17      42.293  25.427  19.244  1.00  0.00           H  \nATOM    304 HG23 ILE A  17      41.155  24.353  19.710  1.00  0.00           H  \nATOM    305 HD11 ILE A  17      40.638  24.547  23.637  1.00  0.00           H  \nATOM    306 HD12 ILE A  17      41.626  25.742  23.123  1.00  0.00           H  \nATOM    307 HD13 ILE A  17      40.425  25.203  22.157  1.00  0.00           H  \nATOM    308  N   TYR A  18      43.535  23.422  17.955  1.00  0.00           N  \nATOM    309  CA  TYR A  18      44.045  23.872  16.666  1.00  0.00           C  \nATOM    310  C   TYR A  18      42.889  24.158  15.776  1.00  0.00           C  \nATOM    311  O   TYR A  18      41.730  23.848  16.121  1.00  0.00           O  \nATOM    312  CB  TYR A  18      45.041  22.891  15.991  1.00  0.00           C  \nATOM    313  CG  TYR A  18      44.361  21.618  15.572  1.00  0.00           C  \nATOM    314  CD1 TYR A  18      44.131  20.630  16.525  1.00  0.00           C  \nATOM    315  CD2 TYR A  18      43.928  21.420  14.259  1.00  0.00           C  \nATOM    316  CE1 TYR A  18      43.477  19.449  16.165  1.00  0.00           C  \nATOM    317  CE2 TYR A  18      43.295  20.241  13.873  1.00  0.00           C  \nATOM    318  CZ  TYR A  18      43.064  19.266  14.846  1.00  0.00           C  \nATOM    319  OH  TYR A  18      42.481  18.075  14.502  1.00  0.00           O  \nATOM    320  H   TYR A  18      42.707  22.863  17.994  1.00  0.00           H  \nATOM    321  HA  TYR A  18      44.528  24.734  16.818  1.00  0.00           H  \nATOM    322  HB2 TYR A  18      45.771  22.672  16.639  1.00  0.00           H  \nATOM    323  HB3 TYR A  18      45.433  23.331  15.183  1.00  0.00           H  \nATOM    324  HD1 TYR A  18      44.434  20.766  17.468  1.00  0.00           H  \nATOM    325  HD2 TYR A  18      44.076  22.140  13.581  1.00  0.00           H  \nATOM    326  HE1 TYR A  18      43.306  18.740  16.849  1.00  0.00           H  \nATOM    327  HE2 TYR A  18      43.013  20.096  12.924  1.00  0.00           H  \nATOM    328  HH  TYR A  18      42.177  17.920  13.562  1.00  0.00           H  \nATOM    329  N   LYS A  19      43.181  24.761  14.644  1.00  0.00           N  \nATOM    330  CA  LYS A  19      42.100  25.017  13.730  1.00  0.00           C  \nATOM    331  C   LYS A  19      42.106  23.969  12.668  1.00  0.00           C  \nATOM    332  O   LYS A  19      43.183  23.620  12.162  1.00  0.00           O  \nATOM    333  CB  LYS A  19      42.189  26.386  13.078  1.00  0.00           C  \nATOM    334  CG  LYS A  19      41.893  27.487  14.044  1.00  0.00           C  \nATOM    335  CD  LYS A  19      41.374  28.731  13.368  1.00  0.00           C  \nATOM    336  CE  LYS A  19      41.737  29.991  14.136  1.00  0.00           C  \nATOM    337  NZ  LYS A  19      41.380  31.273  13.461  1.00  0.00           N1+\nATOM    338  H   LYS A  19      44.119  25.031  14.427  1.00  0.00           H  \nATOM    339  HA  LYS A  19      41.237  24.958  14.232  1.00  0.00           H  \nATOM    340  HB2 LYS A  19      41.530  26.429  12.327  1.00  0.00           H  \nATOM    341  HB3 LYS A  19      43.113  26.512  12.718  1.00  0.00           H  \nATOM    342  HG2 LYS A  19      42.734  27.717  14.535  1.00  0.00           H  \nATOM    343  HG3 LYS A  19      41.205  27.166  14.694  1.00  0.00           H  \nATOM    344  HD2 LYS A  19      40.378  28.670  13.300  1.00  0.00           H  \nATOM    345  HD3 LYS A  19      41.768  28.788  12.450  1.00  0.00           H  \nATOM    346  HE2 LYS A  19      42.725  29.986  14.288  1.00  0.00           H  \nATOM    347  HE3 LYS A  19      41.264  29.963  15.017  1.00  0.00           H  \nATOM    348  HZ1 LYS A  19      40.747  31.789  14.039  1.00  0.00           H  \nATOM    349  HZ2 LYS A  19      42.209  31.812  13.310  1.00  0.00           H  \nATOM    350  HZ3 LYS A  19      40.945  31.077  12.582  1.00  0.00           H  \nATOM    351  N   ASP A  20      40.913  23.515  12.339  1.00  0.00           N  \nATOM    352  CA  ASP A  20      40.772  22.504  11.330  1.00  0.00           C  \nATOM    353  C   ASP A  20      40.852  23.066   9.911  1.00  0.00           C  \nATOM    354  O   ASP A  20      41.129  24.248   9.713  1.00  0.00           O  \nATOM    355  CB  ASP A  20      39.586  21.575  11.611  1.00  0.00           C  \nATOM    356  CG  ASP A  20      38.238  22.054  11.192  1.00  0.00           C  \nATOM    357  OD1 ASP A  20      38.244  23.261  10.763  1.00  0.00           O  \nATOM    358  OD2 ASP A  20      37.238  21.365  11.231  1.00  0.00           O1-\nATOM    359  H   ASP A  20      40.101  23.878  12.796  1.00  0.00           H  \nATOM    360  HA  ASP A  20      41.583  21.926  11.426  1.00  0.00           H  \nATOM    361  HB2 ASP A  20      39.556  21.414  12.597  1.00  0.00           H  \nATOM    362  HB3 ASP A  20      39.760  20.712  11.137  1.00  0.00           H  \nATOM    363  N   THR A  21      40.591  22.249   8.909  1.00  0.00           N  \nATOM    364  CA  THR A  21      40.721  22.757   7.555  1.00  0.00           C  \nATOM    365  C   THR A  21      39.731  23.806   7.224  1.00  0.00           C  \nATOM    366  O   THR A  21      39.948  24.545   6.255  1.00  0.00           O  \nATOM    367  CB  THR A  21      40.641  21.676   6.486  1.00  0.00           C  \nATOM    368  CG2 THR A  21      41.479  20.479   6.931  1.00  0.00           C  \nATOM    369  OG1 THR A  21      39.297  21.284   6.382  1.00  0.00           O  \nATOM    370  H   THR A  21      40.311  21.304   9.077  1.00  0.00           H  \nATOM    371  HA  THR A  21      41.627  23.175   7.483  1.00  0.00           H  \nATOM    372  HB  THR A  21      40.971  22.027   5.610  1.00  0.00           H  \nATOM    373  HG1 THR A  21      38.706  22.057   6.611  1.00  0.00           H  \nATOM    374 HG21 THR A  21      41.433  19.763   6.235  1.00  0.00           H  \nATOM    375 HG22 THR A  21      42.430  20.765   7.053  1.00  0.00           H  \nATOM    376 HG23 THR A  21      41.123  20.126   7.796  1.00  0.00           H  \nATOM    377  N   GLU A  22      38.658  23.848   8.002  1.00  0.00           N  \nATOM    378  CA  GLU A  22      37.607  24.826   7.752  1.00  0.00           C  \nATOM    379  C   GLU A  22      37.802  26.042   8.608  1.00  0.00           C  \nATOM    380  O   GLU A  22      37.086  27.000   8.472  1.00  0.00           O  \nATOM    381  CB  GLU A  22      36.229  24.245   8.029  1.00  0.00           C  \nATOM    382  CG  GLU A  22      35.803  23.119   7.062  1.00  0.00           C  \nATOM    383  CD  GLU A  22      35.537  23.554   5.641  1.00  0.00           C  \nATOM    384  OE1 GLU A  22      34.990  24.737   5.534  1.00  0.00           O  \nATOM    385  OE2 GLU A  22      35.788  22.854   4.684  1.00  0.00           O1-\nATOM    386  H   GLU A  22      38.570  23.206   8.763  1.00  0.00           H  \nATOM    387  HA  GLU A  22      37.650  25.102   6.792  1.00  0.00           H  \nATOM    388  HB2 GLU A  22      35.559  24.984   7.962  1.00  0.00           H  \nATOM    389  HB3 GLU A  22      36.227  23.876   8.958  1.00  0.00           H  \nATOM    390  HG2 GLU A  22      34.966  22.705   7.420  1.00  0.00           H  \nATOM    391  HG3 GLU A  22      36.532  22.435   7.044  1.00  0.00           H  \nATOM    392  N   GLY A  23      38.802  25.975   9.498  1.00  0.00           N  \nATOM    393  CA  GLY A  23      39.125  27.029  10.418  1.00  0.00           C  \nATOM    394  C   GLY A  23      38.453  26.867  11.772  1.00  0.00           C  \nATOM    395  O   GLY A  23      38.416  27.826  12.506  1.00  0.00           O  \nATOM    396  H   GLY A  23      39.355  25.142   9.523  1.00  0.00           H  \nATOM    397  HA2 GLY A  23      38.833  27.899  10.020  1.00  0.00           H  \nATOM    398  HA3 GLY A  23      40.116  27.040  10.554  1.00  0.00           H  \nATOM    399  N   TYR A  24      37.953  25.681  12.130  1.00  0.00           N  \nATOM    400  CA  TYR A  24      37.311  25.534  13.435  1.00  0.00           C  \nATOM    401  C   TYR A  24      38.194  24.930  14.469  1.00  0.00           C  \nATOM    402  O   TYR A  24      39.019  24.051  14.196  1.00  0.00           O  \nATOM    403  CB  TYR A  24      36.048  24.689  13.435  1.00  0.00           C  \nATOM    404  CG  TYR A  24      35.055  25.172  12.447  1.00  0.00           C  \nATOM    405  CD1 TYR A  24      34.659  26.507  12.443  1.00  0.00           C  \nATOM    406  CD2 TYR A  24      34.486  24.293  11.532  1.00  0.00           C  \nATOM    407  CE1 TYR A  24      33.697  26.962  11.544  1.00  0.00           C  \nATOM    408  CE2 TYR A  24      33.549  24.738  10.605  1.00  0.00           C  \nATOM    409  CZ  TYR A  24      33.155  26.077  10.613  1.00  0.00           C  \nATOM    410  OH  TYR A  24      32.235  26.533   9.711  1.00  0.00           O  \nATOM    411  H   TYR A  24      38.017  24.899  11.510  1.00  0.00           H  \nATOM    412  HA  TYR A  24      37.060  26.449  13.751  1.00  0.00           H  \nATOM    413  HB2 TYR A  24      35.638  24.722  14.347  1.00  0.00           H  \nATOM    414  HB3 TYR A  24      36.292  23.745  13.212  1.00  0.00           H  \nATOM    415  HD1 TYR A  24      35.070  27.146  13.093  1.00  0.00           H  \nATOM    416  HD2 TYR A  24      34.754  23.329  11.540  1.00  0.00           H  \nATOM    417  HE1 TYR A  24      33.398  27.916  11.566  1.00  0.00           H  \nATOM    418  HE2 TYR A  24      33.160  24.103   9.937  1.00  0.00           H  \nATOM    419  HH  TYR A  24      31.840  25.906   9.039  1.00  0.00           H  \nATOM    420  N   TYR A  25      37.986  25.431  15.671  1.00  0.00           N  \nATOM    421  CA  TYR A  25      38.655  24.959  16.849  1.00  0.00           C  \nATOM    422  C   TYR A  25      38.376  23.476  17.054  1.00  0.00           C  \nATOM    423  O   TYR A  25      37.220  23.074  17.179  1.00  0.00           O  \nATOM    424  CB  TYR A  25      38.266  25.826  18.083  1.00  0.00           C  \nATOM    425  CG  TYR A  25      38.866  27.223  17.996  1.00  0.00           C  \nATOM    426  CD1 TYR A  25      40.242  27.370  17.843  1.00  0.00           C  \nATOM    427  CD2 TYR A  25      38.084  28.379  18.072  1.00  0.00           C  \nATOM    428  CE1 TYR A  25      40.823  28.632  17.735  1.00  0.00           C  \nATOM    429  CE2 TYR A  25      38.646  29.655  17.965  1.00  0.00           C  \nATOM    430  CZ  TYR A  25      40.021  29.774  17.828  1.00  0.00           C  \nATOM    431  OH  TYR A  25      40.604  31.010  17.739  1.00  0.00           O  \nATOM    432  H   TYR A  25      37.328  26.178  15.766  1.00  0.00           H  \nATOM    433  HA  TYR A  25      39.638  25.065  16.702  1.00  0.00           H  \nATOM    434  HB2 TYR A  25      38.602  25.379  18.912  1.00  0.00           H  \nATOM    435  HB3 TYR A  25      37.270  25.902  18.125  1.00  0.00           H  \nATOM    436  HD1 TYR A  25      40.823  26.557  17.810  1.00  0.00           H  \nATOM    437  HD2 TYR A  25      37.097  28.291  18.206  1.00  0.00           H  \nATOM    438  HE1 TYR A  25      41.809  28.721  17.592  1.00  0.00           H  \nATOM    439  HE2 TYR A  25      38.066  30.469  17.987  1.00  0.00           H  \nATOM    440  HH  TYR A  25      41.592  31.088  17.609  1.00  0.00           H  \nATOM    441  N   THR A  26      39.483  22.696  17.027  1.00  0.00           N  \nATOM    442  CA  THR A  26      39.472  21.238  17.137  1.00  0.00           C  \nATOM    443  C   THR A  26      40.582  20.830  18.109  1.00  0.00           C  \nATOM    444  O   THR A  26      41.452  21.633  18.378  1.00  0.00           O  \nATOM    445  CB  THR A  26      39.771  20.705  15.687  1.00  0.00           C  \nATOM    446  CG2 THR A  26      39.882  19.191  15.535  1.00  0.00           C  \nATOM    447  OG1 THR A  26      38.818  21.190  14.795  1.00  0.00           O  \nATOM    448  H   THR A  26      40.369  23.148  16.925  1.00  0.00           H  \nATOM    449  HA  THR A  26      38.582  20.913  17.458  1.00  0.00           H  \nATOM    450  HB  THR A  26      40.651  21.091  15.411  1.00  0.00           H  \nATOM    451  HG1 THR A  26      38.164  21.766  15.286  1.00  0.00           H  \nATOM    452 HG21 THR A  26      40.072  18.965  14.580  1.00  0.00           H  \nATOM    453 HG22 THR A  26      40.625  18.852  16.112  1.00  0.00           H  \nATOM    454 HG23 THR A  26      39.022  18.764  15.814  1.00  0.00           H  \nATOM    455  N   ILE A  27      40.590  19.602  18.636  1.00  0.00           N  \nATOM    456  CA  ILE A  27      41.647  19.066  19.488  1.00  0.00           C  \nATOM    457  C   ILE A  27      41.678  17.543  19.260  1.00  0.00           C  \nATOM    458  O   ILE A  27      40.697  16.964  18.751  1.00  0.00           O  \nATOM    459  CB  ILE A  27      41.436  19.422  20.971  1.00  0.00           C  \nATOM    460  CG1 ILE A  27      42.691  19.176  21.819  1.00  0.00           C  \nATOM    461  CG2 ILE A  27      40.252  18.616  21.503  1.00  0.00           C  \nATOM    462  CD1 ILE A  27      43.034  20.298  22.758  1.00  0.00           C  \nATOM    463  H   ILE A  27      39.814  19.006  18.431  1.00  0.00           H  \nATOM    464  HA  ILE A  27      42.521  19.450  19.190  1.00  0.00           H  \nATOM    465  HB  ILE A  27      41.205  20.393  21.030  1.00  0.00           H  \nATOM    466 HG12 ILE A  27      43.465  19.038  21.200  1.00  0.00           H  \nATOM    467 HG13 ILE A  27      42.545  18.348  22.361  1.00  0.00           H  \nATOM    468 HG21 ILE A  27      40.104  18.838  22.467  1.00  0.00           H  \nATOM    469 HG22 ILE A  27      39.431  18.843  20.979  1.00  0.00           H  \nATOM    470 HG23 ILE A  27      40.446  17.639  21.412  1.00  0.00           H  \nATOM    471 HD11 ILE A  27      43.859  20.062  23.272  1.00  0.00           H  \nATOM    472 HD12 ILE A  27      43.195  21.134  22.234  1.00  0.00           H  \nATOM    473 HD13 ILE A  27      42.276  20.444  23.394  1.00  0.00           H  \nATOM    474  N   GLY A  28      42.767  16.884  19.618  1.00  0.00           N  \nATOM    475  CA  GLY A  28      42.837  15.417  19.536  1.00  0.00           C  \nATOM    476  C   GLY A  28      42.808  14.845  18.133  1.00  0.00           C  \nATOM    477  O   GLY A  28      43.586  15.262  17.289  1.00  0.00           O  \nATOM    478  H   GLY A  28      43.560  17.394  19.952  1.00  0.00           H  \nATOM    479  HA2 GLY A  28      42.058  15.042  20.039  1.00  0.00           H  \nATOM    480  HA3 GLY A  28      43.688  15.123  19.972  1.00  0.00           H  \nATOM    481  N   ILE A  29      41.957  13.840  17.922  1.00  0.00           N  \nATOM    482  CA  ILE A  29      41.831  13.198  16.635  1.00  0.00           C  \nATOM    483  C   ILE A  29      40.600  13.652  15.897  1.00  0.00           C  \nATOM    484  O   ILE A  29      39.627  12.922  15.734  1.00  0.00           O  \nATOM    485  CB  ILE A  29      41.887  11.675  16.745  1.00  0.00           C  \nATOM    486  CG1 ILE A  29      43.189  11.241  17.409  1.00  0.00           C  \nATOM    487  CG2 ILE A  29      41.884  11.099  15.340  1.00  0.00           C  \nATOM    488  CD1 ILE A  29      43.079   9.984  18.253  1.00  0.00           C  \nATOM    489  H   ILE A  29      41.388  13.521  18.680  1.00  0.00           H  \nATOM    490  HA  ILE A  29      42.620  13.481  16.089  1.00  0.00           H  \nATOM    491  HB  ILE A  29      41.102  11.334  17.262  1.00  0.00           H  \nATOM    492 HG12 ILE A  29      43.502  11.986  17.998  1.00  0.00           H  \nATOM    493 HG13 ILE A  29      43.866  11.077  16.691  1.00  0.00           H  \nATOM    494 HG21 ILE A  29      41.920  10.101  15.389  1.00  0.00           H  \nATOM    495 HG22 ILE A  29      41.049  11.379  14.867  1.00  0.00           H  \nATOM    496 HG23 ILE A  29      42.681  11.437  14.839  1.00  0.00           H  \nATOM    497 HD11 ILE A  29      43.971   9.770  18.650  1.00  0.00           H  \nATOM    498 HD12 ILE A  29      42.415  10.132  18.986  1.00  0.00           H  \nATOM    499 HD13 ILE A  29      42.778   9.222  17.679  1.00  0.00           H  \nATOM    500  N   GLY A  30      40.643  14.898  15.455  1.00  0.00           N  \nATOM    501  CA  GLY A  30      39.510  15.413  14.721  1.00  0.00           C  \nATOM    502  C   GLY A  30      38.278  15.720  15.570  1.00  0.00           C  \nATOM    503  O   GLY A  30      37.159  15.738  15.072  1.00  0.00           O  \nATOM    504  H   GLY A  30      41.444  15.472  15.625  1.00  0.00           H  \nATOM    505  HA2 GLY A  30      39.252  14.735  14.033  1.00  0.00           H  \nATOM    506  HA3 GLY A  30      39.792  16.258  14.267  1.00  0.00           H  \nATOM    507  N   HIS A  31      38.456  16.020  16.845  1.00  0.00           N  \nATOM    508  CA  HIS A  31      37.278  16.327  17.647  1.00  0.00           C  \nATOM    509  C   HIS A  31      36.906  17.797  17.524  1.00  0.00           C  \nATOM    510  O   HIS A  31      37.581  18.662  18.150  1.00  0.00           O  \nATOM    511  CB  HIS A  31      37.519  15.962  19.138  1.00  0.00           C  \nATOM    512  CG  HIS A  31      36.299  16.200  19.977  1.00  0.00           C  \nATOM    513  CD2 HIS A  31      35.982  17.242  20.831  1.00  0.00           C  \nATOM    514  ND1 HIS A  31      35.223  15.326  19.973  1.00  0.00           N  \nATOM    515  CE1 HIS A  31      34.288  15.829  20.776  1.00  0.00           C  \nATOM    516  NE2 HIS A  31      34.720  16.984  21.307  1.00  0.00           N  \nATOM    517  H   HIS A  31      39.371  16.036  17.247  1.00  0.00           H  \nATOM    518  HA  HIS A  31      36.514  15.779  17.308  1.00  0.00           H  \nATOM    519  HB2 HIS A  31      38.268  16.522  19.491  1.00  0.00           H  \nATOM    520  HB3 HIS A  31      37.769  14.996  19.198  1.00  0.00           H  \nATOM    521  HD1 HIS A  31      35.160  14.471  19.459  1.00  0.00           H  \nATOM    522  HD2 HIS A  31      36.558  18.028  21.057  1.00  0.00           H  \nATOM    523  HE1 HIS A  31      33.398  15.410  20.956  1.00  0.00           H  \nATOM    524  HE2 HIS A  31      34.208  17.561  21.943  1.00  0.00           H  \nATOM    525  N   LEU A  32      35.868  18.122  16.745  1.00  0.00           N  \nATOM    526  CA  LEU A  32      35.424  19.499  16.602  1.00  0.00           C  \nATOM    527  C   LEU A  32      34.976  20.045  17.964  1.00  0.00           C  \nATOM    528  O   LEU A  32      34.216  19.449  18.719  1.00  0.00           O  \nATOM    529  CB  LEU A  32      34.287  19.581  15.577  1.00  0.00           C  \nATOM    530  CG  LEU A  32      33.682  20.976  15.459  1.00  0.00           C  \nATOM    531  CD1 LEU A  32      34.747  21.958  15.002  1.00  0.00           C  \nATOM    532  CD2 LEU A  32      32.569  20.989  14.439  1.00  0.00           C  \nATOM    533  H   LEU A  32      35.386  17.400  16.249  1.00  0.00           H  \nATOM    534  HA  LEU A  32      36.191  20.050  16.273  1.00  0.00           H  \nATOM    535  HB2 LEU A  32      33.566  18.944  15.851  1.00  0.00           H  \nATOM    536  HB3 LEU A  32      34.646  19.314  14.683  1.00  0.00           H  \nATOM    537  HG  LEU A  32      33.324  21.261  16.348  1.00  0.00           H  \nATOM    538 HD11 LEU A  32      34.347  22.871  14.926  1.00  0.00           H  \nATOM    539 HD12 LEU A  32      35.493  21.975  15.668  1.00  0.00           H  \nATOM    540 HD13 LEU A  32      35.102  21.674  14.111  1.00  0.00           H  \nATOM    541 HD21 LEU A  32      32.185  21.910  14.376  1.00  0.00           H  \nATOM    542 HD22 LEU A  32      32.931  20.717  13.547  1.00  0.00           H  \nATOM    543 HD23 LEU A  32      31.854  20.349  14.718  1.00  0.00           H  \nATOM    544  N   LEU A  33      35.461  21.180  18.344  1.00  0.00           N  \nATOM    545  CA  LEU A  33      35.025  21.681  19.619  1.00  0.00           C  \nATOM    546  C   LEU A  33      33.848  22.660  19.482  1.00  0.00           C  \nATOM    547  O   LEU A  33      32.879  22.609  20.244  1.00  0.00           O  \nATOM    548  CB  LEU A  33      36.199  22.393  20.317  1.00  0.00           C  \nATOM    549  CG  LEU A  33      37.242  21.463  20.913  1.00  0.00           C  \nATOM    550  CD1 LEU A  33      38.384  22.324  21.390  1.00  0.00           C  \nATOM    551  CD2 LEU A  33      36.667  20.723  22.113  1.00  0.00           C  \nATOM    552  H   LEU A  33      36.110  21.687  17.777  1.00  0.00           H  \nATOM    553  HA  LEU A  33      34.736  20.909  20.185  1.00  0.00           H  \nATOM    554  HB2 LEU A  33      35.827  22.957  21.054  1.00  0.00           H  \nATOM    555  HB3 LEU A  33      36.652  22.979  19.645  1.00  0.00           H  \nATOM    556  HG  LEU A  33      37.562  20.812  20.224  1.00  0.00           H  \nATOM    557 HD11 LEU A  33      39.094  21.744  21.791  1.00  0.00           H  \nATOM    558 HD12 LEU A  33      38.765  22.831  20.617  1.00  0.00           H  \nATOM    559 HD13 LEU A  33      38.051  22.968  22.079  1.00  0.00           H  \nATOM    560 HD21 LEU A  33      37.363  20.115  22.495  1.00  0.00           H  \nATOM    561 HD22 LEU A  33      36.384  21.384  22.808  1.00  0.00           H  \nATOM    562 HD23 LEU A  33      35.876  20.184  21.824  1.00  0.00           H  \nATOM    563  N   THR A  34      33.987  23.592  18.521  1.00  0.00           N  \nATOM    564  CA  THR A  34      32.986  24.642  18.256  1.00  0.00           C  \nATOM    565  C   THR A  34      33.221  25.336  16.932  1.00  0.00           C  \nATOM    566  O   THR A  34      34.380  25.468  16.510  1.00  0.00           O  \nATOM    567  CB  THR A  34      33.033  25.769  19.344  1.00  0.00           C  \nATOM    568  CG2 THR A  34      34.398  26.431  19.470  1.00  0.00           C  \nATOM    569  OG1 THR A  34      32.100  26.789  19.087  1.00  0.00           O  \nATOM    570  H   THR A  34      34.813  23.571  17.957  1.00  0.00           H  \nATOM    571  HA  THR A  34      32.075  24.230  18.252  1.00  0.00           H  \nATOM    572  HB  THR A  34      32.806  25.357  20.226  1.00  0.00           H  \nATOM    573  HG1 THR A  34      31.801  27.193  19.952  1.00  0.00           H  \nATOM    574 HG21 THR A  34      34.362  27.137  20.177  1.00  0.00           H  \nATOM    575 HG22 THR A  34      35.080  25.744  19.720  1.00  0.00           H  \nATOM    576 HG23 THR A  34      34.649  26.847  18.596  1.00  0.00           H  \nATOM    577  N   LYS A  35      32.148  25.842  16.314  1.00  0.00           N  \nATOM    578  CA  LYS A  35      32.293  26.619  15.096  1.00  0.00           C  \nATOM    579  C   LYS A  35      32.444  28.121  15.358  1.00  0.00           C  \nATOM    580  O   LYS A  35      32.611  28.885  14.434  1.00  0.00           O  \nATOM    581  CB  LYS A  35      31.229  26.378  14.104  1.00  0.00           C  \nATOM    582  CG  LYS A  35      31.191  24.899  13.772  1.00  0.00           C  \nATOM    583  CD  LYS A  35      30.131  24.557  12.782  1.00  0.00           C  \nATOM    584  CE  LYS A  35      30.071  23.077  12.513  1.00  0.00           C  \nATOM    585  NZ  LYS A  35      29.787  22.724  11.102  1.00  0.00           N1+\nATOM    586  H   LYS A  35      31.237  25.684  16.695  1.00  0.00           H  \nATOM    587  HA  LYS A  35      33.147  26.320  14.671  1.00  0.00           H  \nATOM    588  HB2 LYS A  35      31.419  26.903  13.274  1.00  0.00           H  \nATOM    589  HB3 LYS A  35      30.347  26.660  14.483  1.00  0.00           H  \nATOM    590  HG2 LYS A  35      31.020  24.387  14.614  1.00  0.00           H  \nATOM    591  HG3 LYS A  35      32.078  24.633  13.395  1.00  0.00           H  \nATOM    592  HD2 LYS A  35      30.323  25.034  11.924  1.00  0.00           H  \nATOM    593  HD3 LYS A  35      29.246  24.857  13.139  1.00  0.00           H  \nATOM    594  HE2 LYS A  35      29.351  22.684  13.085  1.00  0.00           H  \nATOM    595  HE3 LYS A  35      30.952  22.677  12.764  1.00  0.00           H  \nATOM    596  HZ1 LYS A  35      29.764  21.729  11.006  1.00  0.00           H  \nATOM    597  HZ2 LYS A  35      28.902  23.106  10.834  1.00  0.00           H  \nATOM    598  HZ3 LYS A  35      30.503  23.099  10.514  1.00  0.00           H  \nATOM    599  N   SER A  36      32.383  28.507  16.622  1.00  0.00           N  \nATOM    600  CA  SER A  36      32.532  29.893  17.028  1.00  0.00           C  \nATOM    601  C   SER A  36      33.987  30.315  16.900  1.00  0.00           C  \nATOM    602  O   SER A  36      34.918  29.529  17.107  1.00  0.00           O  \nATOM    603  CB  SER A  36      32.048  30.129  18.454  1.00  0.00           C  \nATOM    604  OG  SER A  36      33.007  30.894  19.157  1.00  0.00           O  \nATOM    605  H   SER A  36      32.228  27.815  17.327  1.00  0.00           H  \nATOM    606  HA  SER A  36      31.985  30.461  16.413  1.00  0.00           H  \nATOM    607  HB2 SER A  36      31.922  29.250  18.913  1.00  0.00           H  \nATOM    608  HB3 SER A  36      31.178  30.622  18.433  1.00  0.00           H  \nATOM    609  HG  SER A  36      32.589  31.748  19.468  1.00  0.00           H  \nATOM    610  N   PRO A  37      34.200  31.589  16.582  1.00  0.00           N  \nATOM    611  CA  PRO A  37      35.528  32.147  16.378  1.00  0.00           C  \nATOM    612  C   PRO A  37      36.327  32.364  17.654  1.00  0.00           C  \nATOM    613  O   PRO A  37      37.517  32.682  17.626  1.00  0.00           O  \nATOM    614  CB  PRO A  37      35.285  33.473  15.664  1.00  0.00           C  \nATOM    615  CG  PRO A  37      33.907  33.383  15.040  1.00  0.00           C  \nATOM    616  CD  PRO A  37      33.162  32.324  15.811  1.00  0.00           C  \nATOM    617  HA  PRO A  37      36.044  31.542  15.771  1.00  0.00           H  \nATOM    618  HB2 PRO A  37      35.319  34.228  16.318  1.00  0.00           H  \nATOM    619  HB3 PRO A  37      35.976  33.615  14.955  1.00  0.00           H  \nATOM    620  HG2 PRO A  37      33.435  34.262  15.114  1.00  0.00           H  \nATOM    621  HG3 PRO A  37      33.979  33.124  14.077  1.00  0.00           H  \nATOM    622  HD2 PRO A  37      32.499  32.744  16.430  1.00  0.00           H  \nATOM    623  HD3 PRO A  37      32.688  31.705  15.185  1.00  0.00           H  \nATOM    624  N   SER A  38      35.658  32.152  18.774  1.00  0.00           N  \nATOM    625  CA  SER A  38      36.266  32.383  20.065  1.00  0.00           C  \nATOM    626  C   SER A  38      37.049  31.257  20.656  1.00  0.00           C  \nATOM    627  O   SER A  38      36.532  30.169  20.948  1.00  0.00           O  \nATOM    628  CB  SER A  38      35.236  32.920  21.057  1.00  0.00           C  \nATOM    629  OG  SER A  38      35.898  33.065  22.327  1.00  0.00           O  \nATOM    630  H   SER A  38      34.714  31.826  18.727  1.00  0.00           H  \nATOM    631  HA  SER A  38      36.922  33.125  19.927  1.00  0.00           H  \nATOM    632  HB2 SER A  38      34.474  32.278  21.140  1.00  0.00           H  \nATOM    633  HB3 SER A  38      34.893  33.807  20.747  1.00  0.00           H  \nATOM    634  HG  SER A  38      35.860  34.022  22.615  1.00  0.00           H  \nATOM    635  N   LEU A  39      38.306  31.581  20.913  1.00  0.00           N  \nATOM    636  CA  LEU A  39      39.160  30.610  21.507  1.00  0.00           C  \nATOM    637  C   LEU A  39      38.685  30.309  22.910  1.00  0.00           C  \nATOM    638  O   LEU A  39      38.960  29.279  23.522  1.00  0.00           O  \nATOM    639  CB  LEU A  39      40.647  30.982  21.418  1.00  0.00           C  \nATOM    640  CG  LEU A  39      41.487  29.947  22.142  1.00  0.00           C  \nATOM    641  CD1 LEU A  39      41.447  28.628  21.386  1.00  0.00           C  \nATOM    642  CD2 LEU A  39      42.907  30.451  22.271  1.00  0.00           C  \nATOM    643  H   LEU A  39      38.650  32.494  20.693  1.00  0.00           H  \nATOM    644  HA  LEU A  39      39.045  29.768  20.980  1.00  0.00           H  \nATOM    645  HB2 LEU A  39      40.790  31.878  21.839  1.00  0.00           H  \nATOM    646  HB3 LEU A  39      40.922  31.018  20.457  1.00  0.00           H  \nATOM    647  HG  LEU A  39      41.109  29.807  23.057  1.00  0.00           H  \nATOM    648 HD11 LEU A  39      42.002  27.950  21.868  1.00  0.00           H  \nATOM    649 HD12 LEU A  39      40.502  28.305  21.329  1.00  0.00           H  \nATOM    650 HD13 LEU A  39      41.810  28.761  20.464  1.00  0.00           H  \nATOM    651 HD21 LEU A  39      43.461  29.769  22.748  1.00  0.00           H  \nATOM    652 HD22 LEU A  39      43.288  30.612  21.360  1.00  0.00           H  \nATOM    653 HD23 LEU A  39      42.911  31.306  22.790  1.00  0.00           H  \nATOM    654  N   ASN A  40      37.941  31.227  23.459  1.00  0.00           N  \nATOM    655  CA  ASN A  40      37.459  30.952  24.792  1.00  0.00           C  \nATOM    656  C   ASN A  40      36.267  30.047  24.772  1.00  0.00           C  \nATOM    657  O   ASN A  40      36.145  29.189  25.623  1.00  0.00           O  \nATOM    658  CB  ASN A  40      37.213  32.214  25.617  1.00  0.00           C  \nATOM    659  CG  ASN A  40      38.424  33.116  25.635  1.00  0.00           C  \nATOM    660  ND2 ASN A  40      38.397  34.140  24.783  1.00  0.00           N  \nATOM    661  OD1 ASN A  40      39.371  32.893  26.415  1.00  0.00           O  \nATOM    662  H   ASN A  40      37.716  32.077  22.982  1.00  0.00           H  \nATOM    663  HA  ASN A  40      38.187  30.449  25.257  1.00  0.00           H  \nATOM    664  HB2 ASN A  40      36.992  31.949  26.556  1.00  0.00           H  \nATOM    665  HB3 ASN A  40      36.442  32.714  25.222  1.00  0.00           H  \nATOM    666 HD21 ASN A  40      37.609  34.269  24.181  1.00  0.00           H  \nATOM    667 HD22 ASN A  40      39.164  34.780  24.746  1.00  0.00           H  \nATOM    668  N   ALA A  41      35.381  30.254  23.789  1.00  0.00           N  \nATOM    669  CA  ALA A  41      34.251  29.364  23.692  1.00  0.00           C  \nATOM    670  C   ALA A  41      34.809  27.944  23.486  1.00  0.00           C  \nATOM    671  O   ALA A  41      34.354  26.993  24.106  1.00  0.00           O  \nATOM    672  CB  ALA A  41      33.267  29.799  22.625  1.00  0.00           C  \nATOM    673  H   ALA A  41      35.500  31.005  23.140  1.00  0.00           H  \nATOM    674  HA  ALA A  41      33.774  29.380  24.571  1.00  0.00           H  \nATOM    675  HB1 ALA A  41      32.503  29.155  22.594  1.00  0.00           H  \nATOM    676  HB2 ALA A  41      32.924  30.713  22.841  1.00  0.00           H  \nATOM    677  HB3 ALA A  41      33.725  29.816  21.736  1.00  0.00           H  \nATOM    678  N   ALA A  42      35.885  27.843  22.679  1.00  0.00           N  \nATOM    679  CA  ALA A  42      36.550  26.572  22.425  1.00  0.00           C  \nATOM    680  C   ALA A  42      37.162  26.051  23.687  1.00  0.00           C  \nATOM    681  O   ALA A  42      37.089  24.846  23.988  1.00  0.00           O  \nATOM    682  CB  ALA A  42      37.676  26.701  21.398  1.00  0.00           C  \nATOM    683  H   ALA A  42      36.238  28.669  22.240  1.00  0.00           H  \nATOM    684  HA  ALA A  42      35.877  25.912  22.091  1.00  0.00           H  \nATOM    685  HB1 ALA A  42      38.102  25.807  21.256  1.00  0.00           H  \nATOM    686  HB2 ALA A  42      37.301  27.033  20.532  1.00  0.00           H  \nATOM    687  HB3 ALA A  42      38.361  27.347  21.734  1.00  0.00           H  \nATOM    688  N   LYS A  43      37.782  26.924  24.440  1.00  0.00           N  \nATOM    689  CA  LYS A  43      38.361  26.453  25.685  1.00  0.00           C  \nATOM    690  C   LYS A  43      37.291  25.931  26.656  1.00  0.00           C  \nATOM    691  O   LYS A  43      37.471  24.939  27.350  1.00  0.00           O  \nATOM    692  CB  LYS A  43      39.283  27.458  26.348  1.00  0.00           C  \nATOM    693  CG  LYS A  43      40.757  27.326  25.966  1.00  0.00           C  \nATOM    694  CD  LYS A  43      41.630  28.498  26.431  1.00  0.00           C  \nATOM    695  CE  LYS A  43      43.094  28.399  26.031  1.00  0.00           C  \nATOM    696  NZ  LYS A  43      44.026  28.825  27.093  1.00  0.00           N1+\nATOM    697  H   LYS A  43      37.854  27.883  24.167  1.00  0.00           H  \nATOM    698  HA  LYS A  43      38.930  25.666  25.448  1.00  0.00           H  \nATOM    699  HB2 LYS A  43      39.207  27.343  27.339  1.00  0.00           H  \nATOM    700  HB3 LYS A  43      38.977  28.376  26.094  1.00  0.00           H  \nATOM    701  HG2 LYS A  43      40.819  27.264  24.970  1.00  0.00           H  \nATOM    702  HG3 LYS A  43      41.114  26.486  26.376  1.00  0.00           H  \nATOM    703  HD2 LYS A  43      41.582  28.545  27.429  1.00  0.00           H  \nATOM    704  HD3 LYS A  43      41.256  29.339  26.039  1.00  0.00           H  \nATOM    705  HE2 LYS A  43      43.243  28.978  25.229  1.00  0.00           H  \nATOM    706  HE3 LYS A  43      43.294  27.448  25.797  1.00  0.00           H  \nATOM    707  HZ1 LYS A  43      44.967  28.736  26.766  1.00  0.00           H  \nATOM    708  HZ2 LYS A  43      43.845  29.779  27.332  1.00  0.00           H  \nATOM    709  HZ3 LYS A  43      43.897  28.249  27.900  1.00  0.00           H  \nATOM    710  N   SER A  44      36.163  26.603  26.693  1.00  0.00           N  \nATOM    711  CA  SER A  44      35.063  26.203  27.552  1.00  0.00           C  \nATOM    712  C   SER A  44      34.475  24.822  27.226  1.00  0.00           C  \nATOM    713  O   SER A  44      34.172  24.035  28.100  1.00  0.00           O  \nATOM    714  CB  SER A  44      33.998  27.276  27.444  1.00  0.00           C  \nATOM    715  OG  SER A  44      33.557  27.589  28.714  1.00  0.00           O  \nATOM    716  H   SER A  44      36.059  27.412  26.114  1.00  0.00           H  \nATOM    717  HA  SER A  44      35.394  26.186  28.495  1.00  0.00           H  \nATOM    718  HB2 SER A  44      33.233  26.937  26.896  1.00  0.00           H  \nATOM    719  HB3 SER A  44      34.384  28.091  27.011  1.00  0.00           H  \nATOM    720  HG  SER A  44      33.265  28.545  28.739  1.00  0.00           H  \nATOM    721  N   GLU A  45      34.278  24.584  25.943  1.00  0.00           N  \nATOM    722  CA  GLU A  45      33.755  23.327  25.434  1.00  0.00           C  \nATOM    723  C   GLU A  45      34.737  22.223  25.746  1.00  0.00           C  \nATOM    724  O   GLU A  45      34.355  21.116  26.142  1.00  0.00           O  \nATOM    725  CB  GLU A  45      33.604  23.393  23.907  1.00  0.00           C  \nATOM    726  CG  GLU A  45      32.424  24.272  23.476  1.00  0.00           C  \nATOM    727  CD  GLU A  45      31.092  23.657  23.840  1.00  0.00           C  \nATOM    728  OE1 GLU A  45      30.867  22.464  23.729  1.00  0.00           O  \nATOM    729  OE2 GLU A  45      30.224  24.520  24.274  1.00  0.00           O1-\nATOM    730  H   GLU A  45      34.500  25.306  25.287  1.00  0.00           H  \nATOM    731  HA  GLU A  45      32.871  23.128  25.857  1.00  0.00           H  \nATOM    732  HB2 GLU A  45      33.460  22.467  23.558  1.00  0.00           H  \nATOM    733  HB3 GLU A  45      34.444  23.769  23.517  1.00  0.00           H  \nATOM    734  HG2 GLU A  45      32.461  24.397  22.485  1.00  0.00           H  \nATOM    735  HG3 GLU A  45      32.503  25.161  23.927  1.00  0.00           H  \nATOM    736  N   LEU A  46      36.018  22.529  25.574  1.00  0.00           N  \nATOM    737  CA  LEU A  46      37.036  21.550  25.864  1.00  0.00           C  \nATOM    738  C   LEU A  46      36.981  21.055  27.318  1.00  0.00           C  \nATOM    739  O   LEU A  46      37.055  19.863  27.615  1.00  0.00           O  \nATOM    740  CB  LEU A  46      38.451  22.068  25.538  1.00  0.00           C  \nATOM    741  CG  LEU A  46      39.517  20.991  25.786  1.00  0.00           C  \nATOM    742  CD1 LEU A  46      39.161  19.712  25.014  1.00  0.00           C  \nATOM    743  CD2 LEU A  46      40.906  21.484  25.371  1.00  0.00           C  \nATOM    744  H   LEU A  46      36.276  23.437  25.244  1.00  0.00           H  \nATOM    745  HA  LEU A  46      36.865  20.760  25.275  1.00  0.00           H  \nATOM    746  HB2 LEU A  46      38.648  22.859  26.116  1.00  0.00           H  \nATOM    747  HB3 LEU A  46      38.483  22.341  24.577  1.00  0.00           H  \nATOM    748  HG  LEU A  46      39.534  20.779  26.763  1.00  0.00           H  \nATOM    749 HD11 LEU A  46      39.860  19.016  25.181  1.00  0.00           H  \nATOM    750 HD12 LEU A  46      38.272  19.373  25.323  1.00  0.00           H  \nATOM    751 HD13 LEU A  46      39.119  19.914  24.036  1.00  0.00           H  \nATOM    752 HD21 LEU A  46      41.580  20.765  25.543  1.00  0.00           H  \nATOM    753 HD22 LEU A  46      40.902  21.711  24.397  1.00  0.00           H  \nATOM    754 HD23 LEU A  46      41.144  22.297  25.902  1.00  0.00           H  \nATOM    755  N   ASP A  47      36.861  21.973  28.258  1.00  0.00           N  \nATOM    756  CA  ASP A  47      36.819  21.608  29.667  1.00  0.00           C  \nATOM    757  C   ASP A  47      35.600  20.821  30.014  1.00  0.00           C  \nATOM    758  O   ASP A  47      35.657  19.924  30.858  1.00  0.00           O  \nATOM    759  CB  ASP A  47      36.926  22.822  30.591  1.00  0.00           C  \nATOM    760  CG  ASP A  47      38.251  23.546  30.538  1.00  0.00           C  \nATOM    761  OD1 ASP A  47      39.359  23.052  30.230  1.00  0.00           O  \nATOM    762  OD2 ASP A  47      38.097  24.782  30.905  1.00  0.00           O1-\nATOM    763  H   ASP A  47      36.798  22.937  27.998  1.00  0.00           H  \nATOM    764  HA  ASP A  47      37.611  21.025  29.848  1.00  0.00           H  \nATOM    765  HB2 ASP A  47      36.779  22.512  31.530  1.00  0.00           H  \nATOM    766  HB3 ASP A  47      36.208  23.470  30.338  1.00  0.00           H  \nATOM    767  N   LYS A  48      34.517  21.222  29.376  1.00  0.00           N  \nATOM    768  CA  LYS A  48      33.249  20.552  29.520  1.00  0.00           C  \nATOM    769  C   LYS A  48      33.356  19.110  28.969  1.00  0.00           C  \nATOM    770  O   LYS A  48      32.906  18.166  29.573  1.00  0.00           O  \nATOM    771  CB  LYS A  48      32.220  21.367  28.758  1.00  0.00           C  \nATOM    772  CG  LYS A  48      30.913  20.647  28.555  1.00  0.00           C  \nATOM    773  CD  LYS A  48      29.749  21.599  28.365  1.00  0.00           C  \nATOM    774  CE  LYS A  48      29.717  22.317  27.017  1.00  0.00           C  \nATOM    775  NZ  LYS A  48      29.282  21.456  25.920  1.00  0.00           N1+\nATOM    776  H   LYS A  48      34.578  22.017  28.773  1.00  0.00           H  \nATOM    777  HA  LYS A  48      32.998  20.520  30.487  1.00  0.00           H  \nATOM    778  HB2 LYS A  48      32.598  21.595  27.861  1.00  0.00           H  \nATOM    779  HB3 LYS A  48      32.042  22.208  29.268  1.00  0.00           H  \nATOM    780  HG2 LYS A  48      30.733  20.077  29.357  1.00  0.00           H  \nATOM    781  HG3 LYS A  48      30.989  20.067  27.744  1.00  0.00           H  \nATOM    782  HD2 LYS A  48      29.794  22.292  29.085  1.00  0.00           H  \nATOM    783  HD3 LYS A  48      28.902  21.076  28.458  1.00  0.00           H  \nATOM    784  HE2 LYS A  48      30.637  22.652  26.813  1.00  0.00           H  \nATOM    785  HE3 LYS A  48      29.087  23.091  27.083  1.00  0.00           H  \nATOM    786  HZ1 LYS A  48      28.288  21.513  25.826  1.00  0.00           H  \nATOM    787  HZ2 LYS A  48      29.715  21.755  25.070  1.00  0.00           H  \nATOM    788  HZ3 LYS A  48      29.545  20.511  26.114  1.00  0.00           H  \nATOM    789  N   ALA A  49      34.021  18.934  27.842  1.00  0.00           N  \nATOM    790  CA  ALA A  49      34.185  17.611  27.280  1.00  0.00           C  \nATOM    791  C   ALA A  49      35.084  16.672  28.119  1.00  0.00           C  \nATOM    792  O   ALA A  49      34.792  15.495  28.269  1.00  0.00           O  \nATOM    793  CB  ALA A  49      34.617  17.695  25.816  1.00  0.00           C  \nATOM    794  H   ALA A  49      34.415  19.724  27.372  1.00  0.00           H  \nATOM    795  HA  ALA A  49      33.275  17.196  27.278  1.00  0.00           H  \nATOM    796  HB1 ALA A  49      34.725  16.772  25.447  1.00  0.00           H  \nATOM    797  HB2 ALA A  49      33.921  18.185  25.291  1.00  0.00           H  \nATOM    798  HB3 ALA A  49      35.488  18.183  25.753  1.00  0.00           H  \nATOM    799  N   ILE A  50      36.187  17.188  28.678  1.00  0.00           N  \nATOM    800  CA  ILE A  50      37.166  16.428  29.480  1.00  0.00           C  \nATOM    801  C   ILE A  50      36.823  16.297  30.961  1.00  0.00           C  \nATOM    802  O   ILE A  50      37.251  15.383  31.677  1.00  0.00           O  \nATOM    803  CB  ILE A  50      38.524  17.125  29.371  1.00  0.00           C  \nATOM    804  CG1 ILE A  50      38.894  17.231  27.907  1.00  0.00           C  \nATOM    805  CG2 ILE A  50      39.657  16.415  30.144  1.00  0.00           C  \nATOM    806  CD1 ILE A  50      38.734  15.901  27.193  1.00  0.00           C  \nATOM    807  H   ILE A  50      36.360  18.163  28.541  1.00  0.00           H  \nATOM    808  HA  ILE A  50      37.249  15.510  29.092  1.00  0.00           H  \nATOM    809  HB  ILE A  50      38.430  18.051  29.737  1.00  0.00           H  \nATOM    810 HG12 ILE A  50      39.847  17.526  27.833  1.00  0.00           H  \nATOM    811 HG13 ILE A  50      38.301  17.907  27.470  1.00  0.00           H  \nATOM    812 HG21 ILE A  50      40.510  16.924  30.028  1.00  0.00           H  \nATOM    813 HG22 ILE A  50      39.423  16.374  31.115  1.00  0.00           H  \nATOM    814 HG23 ILE A  50      39.772  15.487  29.789  1.00  0.00           H  \nATOM    815 HD11 ILE A  50      38.986  16.007  26.231  1.00  0.00           H  \nATOM    816 HD12 ILE A  50      39.328  15.220  27.620  1.00  0.00           H  \nATOM    817 HD13 ILE A  50      37.782  15.601  27.257  1.00  0.00           H  \nATOM    818  N   GLY A  51      36.112  17.276  31.452  1.00  0.00           N  \nATOM    819  CA  GLY A  51      35.726  17.183  32.843  1.00  0.00           C  \nATOM    820  C   GLY A  51      36.804  17.762  33.737  1.00  0.00           C  \nATOM    821  O   GLY A  51      36.950  17.412  34.897  1.00  0.00           O  \nATOM    822  H   GLY A  51      35.845  18.058  30.889  1.00  0.00           H  \nATOM    823  HA2 GLY A  51      35.583  16.222  33.081  1.00  0.00           H  \nATOM    824  HA3 GLY A  51      34.876  17.691  32.983  1.00  0.00           H  \nATOM    825  N   ARG A  52      37.572  18.696  33.205  1.00  0.00           N  \nATOM    826  CA  ARG A  52      38.575  19.327  34.025  1.00  0.00           C  \nATOM    827  C   ARG A  52      39.012  20.601  33.366  1.00  0.00           C  \nATOM    828  O   ARG A  52      38.645  20.860  32.224  1.00  0.00           O  \nATOM    829  CB  ARG A  52      39.757  18.413  34.330  1.00  0.00           C  \nATOM    830  CG  ARG A  52      40.768  18.362  33.222  1.00  0.00           C  \nATOM    831  CD  ARG A  52      41.697  17.184  33.392  1.00  0.00           C  \nATOM    832  NE  ARG A  52      42.597  17.029  32.286  1.00  0.00           N  \nATOM    833  CZ  ARG A  52      43.419  17.972  31.899  1.00  0.00           C  \nATOM    834  NH1 ARG A  52      43.470  19.140  32.518  1.00  0.00           N1+\nATOM    835  NH2 ARG A  52      44.233  17.726  30.875  1.00  0.00           N  \nATOM    836  H   ARG A  52      37.459  18.961  32.247  1.00  0.00           H  \nATOM    837  HA  ARG A  52      38.146  19.568  34.896  1.00  0.00           H  \nATOM    838  HB2 ARG A  52      39.411  17.488  34.487  1.00  0.00           H  \nATOM    839  HB3 ARG A  52      40.210  18.745  35.158  1.00  0.00           H  \nATOM    840  HG2 ARG A  52      41.305  19.206  33.230  1.00  0.00           H  \nATOM    841  HG3 ARG A  52      40.291  18.279  32.347  1.00  0.00           H  \nATOM    842  HD2 ARG A  52      41.148  16.353  33.477  1.00  0.00           H  \nATOM    843  HD3 ARG A  52      42.233  17.316  34.226  1.00  0.00           H  \nATOM    844  HE  ARG A  52      42.597  16.162  31.788  1.00  0.00           H  \nATOM    845 HH11 ARG A  52      44.106  19.845  32.204  1.00  0.00           H  \nATOM    846 HH12 ARG A  52      42.872  19.318  33.300  1.00  0.00           H  \nATOM    847 HH21 ARG A  52      44.869  18.431  30.562  1.00  0.00           H  \nATOM    848 HH22 ARG A  52      44.208  16.836  30.419  1.00  0.00           H  \nATOM    849  N   ASN A  53      39.775  21.390  34.113  1.00  0.00           N  \nATOM    850  CA  ASN A  53      40.307  22.645  33.635  1.00  0.00           C  \nATOM    851  C   ASN A  53      41.545  22.324  32.816  1.00  0.00           C  \nATOM    852  O   ASN A  53      42.573  21.935  33.353  1.00  0.00           O  \nATOM    853  CB  ASN A  53      40.599  23.577  34.821  1.00  0.00           C  \nATOM    854  CG  ASN A  53      39.794  24.842  34.684  1.00  0.00           C  \nATOM    855  ND2 ASN A  53      40.385  25.824  33.982  1.00  0.00           N  \nATOM    856  OD1 ASN A  53      38.635  24.910  35.129  1.00  0.00           O  \nATOM    857  H   ASN A  53      39.991  21.103  35.046  1.00  0.00           H  \nATOM    858  HA  ASN A  53      39.629  23.079  33.041  1.00  0.00           H  \nATOM    859  HB2 ASN A  53      41.573  23.803  34.834  1.00  0.00           H  \nATOM    860  HB3 ASN A  53      40.352  23.117  35.674  1.00  0.00           H  \nATOM    861 HD21 ASN A  53      41.321  25.708  33.651  1.00  0.00           H  \nATOM    862 HD22 ASN A  53      39.888  26.671  33.791  1.00  0.00           H  \nATOM    863  N   THR A  54      41.458  22.410  31.496  1.00  0.00           N  \nATOM    864  CA  THR A  54      42.603  21.947  30.723  1.00  0.00           C  \nATOM    865  C   THR A  54      43.513  23.006  30.188  1.00  0.00           C  \nATOM    866  O   THR A  54      44.547  22.670  29.631  1.00  0.00           O  \nATOM    867  CB  THR A  54      42.138  21.173  29.497  1.00  0.00           C  \nATOM    868  CG2 THR A  54      41.219  20.020  29.908  1.00  0.00           C  \nATOM    869  OG1 THR A  54      41.480  22.098  28.677  1.00  0.00           O  \nATOM    870  H   THR A  54      40.642  22.777  31.050  1.00  0.00           H  \nATOM    871  HA  THR A  54      43.142  21.331  31.298  1.00  0.00           H  \nATOM    872  HB  THR A  54      42.933  20.808  29.014  1.00  0.00           H  \nATOM    873  HG1 THR A  54      40.509  22.122  28.914  1.00  0.00           H  \nATOM    874 HG21 THR A  54      40.923  19.523  29.092  1.00  0.00           H  \nATOM    875 HG22 THR A  54      41.714  19.399  30.516  1.00  0.00           H  \nATOM    876 HG23 THR A  54      40.419  20.385  30.385  1.00  0.00           H  \nATOM    877  N   ASN A  55      43.121  24.268  30.259  1.00  0.00           N  \nATOM    878  CA  ASN A  55      43.967  25.280  29.665  1.00  0.00           C  \nATOM    879  C   ASN A  55      44.281  25.044  28.171  1.00  0.00           C  \nATOM    880  O   ASN A  55      45.285  25.528  27.671  1.00  0.00           O  \nATOM    881  CB  ASN A  55      45.231  25.605  30.501  1.00  0.00           C  \nATOM    882  CG  ASN A  55      45.745  27.027  30.277  1.00  0.00           C  \nATOM    883  ND2 ASN A  55      47.051  27.208  30.471  1.00  0.00           N  \nATOM    884  OD1 ASN A  55      44.994  27.949  29.910  1.00  0.00           O  \nATOM    885  H   ASN A  55      42.264  24.515  30.711  1.00  0.00           H  \nATOM    886  HA  ASN A  55      43.421  26.118  29.685  1.00  0.00           H  \nATOM    887  HB2 ASN A  55      45.954  24.961  30.249  1.00  0.00           H  \nATOM    888  HB3 ASN A  55      45.009  25.495  31.470  1.00  0.00           H  \nATOM    889 HD21 ASN A  55      47.623  26.443  30.766  1.00  0.00           H  \nATOM    890 HD22 ASN A  55      47.459  28.109  30.321  1.00  0.00           H  \nATOM    891  N   GLY A  56      43.422  24.320  27.445  1.00  0.00           N  \nATOM    892  CA  GLY A  56      43.640  24.118  26.006  1.00  0.00           C  \nATOM    893  C   GLY A  56      44.567  22.973  25.623  1.00  0.00           C  \nATOM    894  O   GLY A  56      44.943  22.790  24.462  1.00  0.00           O  \nATOM    895  H   GLY A  56      42.623  23.912  27.886  1.00  0.00           H  \nATOM    896  HA2 GLY A  56      44.027  24.962  25.634  1.00  0.00           H  \nATOM    897  HA3 GLY A  56      42.750  23.945  25.584  1.00  0.00           H  \nATOM    898  N   VAL A  57      44.913  22.179  26.604  1.00  0.00           N  \nATOM    899  CA  VAL A  57      45.782  21.053  26.337  1.00  0.00           C  \nATOM    900  C   VAL A  57      45.317  19.754  27.016  1.00  0.00           C  \nATOM    901  O   VAL A  57      44.950  19.795  28.179  1.00  0.00           O  \nATOM    902  CB  VAL A  57      47.107  21.435  26.889  1.00  0.00           C  \nATOM    903  CG1 VAL A  57      48.133  20.335  26.617  1.00  0.00           C  \nATOM    904  CG2 VAL A  57      47.516  22.756  26.247  1.00  0.00           C  \nATOM    905  H   VAL A  57      44.579  22.349  27.531  1.00  0.00           H  \nATOM    906  HA  VAL A  57      45.856  20.910  25.350  1.00  0.00           H  \nATOM    907  HB  VAL A  57      47.023  21.565  27.877  1.00  0.00           H  \nATOM    908 HG11 VAL A  57      49.019  20.605  26.994  1.00  0.00           H  \nATOM    909 HG12 VAL A  57      47.833  19.485  27.049  1.00  0.00           H  \nATOM    910 HG13 VAL A  57      48.219  20.196  25.630  1.00  0.00           H  \nATOM    911 HG21 VAL A  57      48.408  23.037  26.602  1.00  0.00           H  \nATOM    912 HG22 VAL A  57      47.573  22.641  25.255  1.00  0.00           H  \nATOM    913 HG23 VAL A  57      46.835  23.456  26.463  1.00  0.00           H  \nATOM    914  N   ILE A  58      45.378  18.623  26.314  1.00  0.00           N  \nATOM    915  CA  ILE A  58      44.929  17.345  26.879  1.00  0.00           C  \nATOM    916  C   ILE A  58      46.022  16.310  26.697  1.00  0.00           C  \nATOM    917  O   ILE A  58      47.003  16.531  25.975  1.00  0.00           O  \nATOM    918  CB  ILE A  58      43.665  16.858  26.159  1.00  0.00           C  \nATOM    919  CG1 ILE A  58      43.971  16.657  24.676  1.00  0.00           C  \nATOM    920  CG2 ILE A  58      42.521  17.874  26.309  1.00  0.00           C  \nATOM    921  CD1 ILE A  58      42.859  15.900  23.936  1.00  0.00           C  \nATOM    922  H   ILE A  58      45.738  18.646  25.381  1.00  0.00           H  \nATOM    923  HA  ILE A  58      44.736  17.460  27.853  1.00  0.00           H  \nATOM    924  HB  ILE A  58      43.380  15.985  26.555  1.00  0.00           H  \nATOM    925 HG12 ILE A  58      44.821  16.137  24.593  1.00  0.00           H  \nATOM    926 HG13 ILE A  58      44.086  17.554  24.249  1.00  0.00           H  \nATOM    927 HG21 ILE A  58      41.710  17.535  25.832  1.00  0.00           H  \nATOM    928 HG22 ILE A  58      42.310  17.998  27.279  1.00  0.00           H  \nATOM    929 HG23 ILE A  58      42.799  18.749  25.913  1.00  0.00           H  \nATOM    930 HD11 ILE A  58      43.110  15.797  22.973  1.00  0.00           H  \nATOM    931 HD12 ILE A  58      42.739  14.997  24.348  1.00  0.00           H  \nATOM    932 HD13 ILE A  58      42.004  16.414  24.004  1.00  0.00           H  \nATOM    933  N   THR A  59      45.879  15.176  27.340  1.00  0.00           N  \nATOM    934  CA  THR A  59      46.854  14.133  27.174  1.00  0.00           C  \nATOM    935  C   THR A  59      46.371  13.210  26.062  1.00  0.00           C  \nATOM    936  O   THR A  59      45.215  13.244  25.690  1.00  0.00           O  \nATOM    937  CB  THR A  59      46.889  13.283  28.452  1.00  0.00           C  \nATOM    938  CG2 THR A  59      47.054  14.138  29.685  1.00  0.00           C  \nATOM    939  OG1 THR A  59      45.657  12.617  28.518  1.00  0.00           O  \nATOM    940  H   THR A  59      45.094  15.037  27.944  1.00  0.00           H  \nATOM    941  HA  THR A  59      47.756  14.510  26.965  1.00  0.00           H  \nATOM    942  HB  THR A  59      47.633  12.617  28.398  1.00  0.00           H  \nATOM    943  HG1 THR A  59      45.001  13.179  29.022  1.00  0.00           H  \nATOM    944 HG21 THR A  59      47.073  13.553  30.496  1.00  0.00           H  \nATOM    945 HG22 THR A  59      47.911  14.650  29.623  1.00  0.00           H  \nATOM    946 HG23 THR A  59      46.288  14.777  29.752  1.00  0.00           H  \nATOM    947  N   LYS A  60      47.268  12.336  25.616  1.00  0.00           N  \nATOM    948  CA  LYS A  60      46.997  11.329  24.613  1.00  0.00           C  \nATOM    949  C   LYS A  60      45.808  10.442  24.982  1.00  0.00           C  \nATOM    950  O   LYS A  60      44.963  10.148  24.146  1.00  0.00           O  \nATOM    951  CB  LYS A  60      48.250  10.465  24.416  1.00  0.00           C  \nATOM    952  CG  LYS A  60      48.158   9.440  23.270  1.00  0.00           C  \nATOM    953  CD  LYS A  60      49.323   9.516  22.301  1.00  0.00           C  \nATOM    954  CE  LYS A  60      49.466   8.302  21.372  1.00  0.00           C  \nATOM    955  NZ  LYS A  60      50.318   8.537  20.191  1.00  0.00           N1+\nATOM    956  H   LYS A  60      48.191  12.377  25.999  1.00  0.00           H  \nATOM    957  HA  LYS A  60      46.792  11.790  23.750  1.00  0.00           H  \nATOM    958  HB2 LYS A  60      48.420   9.966  25.266  1.00  0.00           H  \nATOM    959  HB3 LYS A  60      49.020  11.074  24.227  1.00  0.00           H  \nATOM    960  HG2 LYS A  60      47.312   9.606  22.763  1.00  0.00           H  \nATOM    961  HG3 LYS A  60      48.134   8.522  23.666  1.00  0.00           H  \nATOM    962  HD2 LYS A  60      50.165   9.602  22.833  1.00  0.00           H  \nATOM    963  HD3 LYS A  60      49.203  10.330  21.733  1.00  0.00           H  \nATOM    964  HE2 LYS A  60      48.554   8.042  21.054  1.00  0.00           H  \nATOM    965  HE3 LYS A  60      49.862   7.550  21.899  1.00  0.00           H  \nATOM    966  HZ1 LYS A  60      50.360   7.704  19.640  1.00  0.00           H  \nATOM    967  HZ2 LYS A  60      49.932   9.280  19.644  1.00  0.00           H  \nATOM    968  HZ3 LYS A  60      51.239   8.787  20.489  1.00  0.00           H  \nATOM    969  N   ASP A  61      45.757   9.997  26.252  1.00  0.00           N  \nATOM    970  CA  ASP A  61      44.645   9.157  26.706  1.00  0.00           C  \nATOM    971  C   ASP A  61      43.295   9.857  26.540  1.00  0.00           C  \nATOM    972  O   ASP A  61      42.304   9.250  26.128  1.00  0.00           O  \nATOM    973  CB  ASP A  61      44.812   8.758  28.186  1.00  0.00           C  \nATOM    974  CG  ASP A  61      45.950   7.832  28.509  1.00  0.00           C  \nATOM    975  OD1 ASP A  61      46.514   7.293  27.457  1.00  0.00           O  \nATOM    976  OD2 ASP A  61      46.322   7.621  29.650  1.00  0.00           O1-\nATOM    977  H   ASP A  61      46.485  10.242  26.892  1.00  0.00           H  \nATOM    978  HA  ASP A  61      44.636   8.323  26.155  1.00  0.00           H  \nATOM    979  HB2 ASP A  61      43.966   8.312  28.477  1.00  0.00           H  \nATOM    980  HB3 ASP A  61      44.945   9.597  28.713  1.00  0.00           H  \nATOM    981  N   GLU A  62      43.290  11.151  26.933  1.00  0.00           N  \nATOM    982  CA  GLU A  62      42.108  12.003  26.835  1.00  0.00           C  \nATOM    983  C   GLU A  62      41.696  12.122  25.392  1.00  0.00           C  \nATOM    984  O   GLU A  62      40.546  12.045  25.046  1.00  0.00           O  \nATOM    985  CB  GLU A  62      42.424  13.367  27.387  1.00  0.00           C  \nATOM    986  CG  GLU A  62      42.394  13.311  28.914  1.00  0.00           C  \nATOM    987  CD  GLU A  62      42.842  14.606  29.568  1.00  0.00           C  \nATOM    988  OE1 GLU A  62      43.549  15.434  29.026  1.00  0.00           O  \nATOM    989  OE2 GLU A  62      42.429  14.715  30.798  1.00  0.00           O1-\nATOM    990  H   GLU A  62      44.132  11.541  27.307  1.00  0.00           H  \nATOM    991  HA  GLU A  62      41.361  11.597  27.361  1.00  0.00           H  \nATOM    992  HB2 GLU A  62      41.744  14.025  27.063  1.00  0.00           H  \nATOM    993  HB3 GLU A  62      43.333  13.649  27.081  1.00  0.00           H  \nATOM    994  HG2 GLU A  62      43.000  12.575  29.217  1.00  0.00           H  \nATOM    995  HG3 GLU A  62      41.458  13.114  29.207  1.00  0.00           H  \nATOM    996  N   ALA A  63      42.722  12.253  24.535  1.00  0.00           N  \nATOM    997  CA  ALA A  63      42.472  12.330  23.116  1.00  0.00           C  \nATOM    998  C   ALA A  63      41.800  11.058  22.596  1.00  0.00           C  \nATOM    999  O   ALA A  63      40.819  11.101  21.825  1.00  0.00           O  \nATOM   1000  CB  ALA A  63      43.777  12.593  22.398  1.00  0.00           C  \nATOM   1001  H   ALA A  63      43.659  12.297  24.881  1.00  0.00           H  \nATOM   1002  HA  ALA A  63      41.859  13.101  22.946  1.00  0.00           H  \nATOM   1003  HB1 ALA A  63      43.611  12.648  21.413  1.00  0.00           H  \nATOM   1004  HB2 ALA A  63      44.166  13.457  22.719  1.00  0.00           H  \nATOM   1005  HB3 ALA A  63      44.417  11.849  22.587  1.00  0.00           H  \nATOM   1006  N   GLU A  64      42.357   9.916  23.032  1.00  0.00           N  \nATOM   1007  CA  GLU A  64      41.816   8.649  22.623  1.00  0.00           C  \nATOM   1008  C   GLU A  64      40.449   8.412  23.123  1.00  0.00           C  \nATOM   1009  O   GLU A  64      39.634   7.772  22.449  1.00  0.00           O  \nATOM   1010  CB  GLU A  64      42.756   7.515  22.965  1.00  0.00           C  \nATOM   1011  CG  GLU A  64      43.843   7.541  21.887  1.00  0.00           C  \nATOM   1012  CD  GLU A  64      45.125   6.857  22.263  1.00  0.00           C  \nATOM   1013  OE1 GLU A  64      45.287   6.316  23.332  1.00  0.00           O  \nATOM   1014  OE2 GLU A  64      46.009   6.905  21.307  1.00  0.00           O1-\nATOM   1015  H   GLU A  64      43.149   9.948  23.642  1.00  0.00           H  \nATOM   1016  HA  GLU A  64      41.753   8.675  21.625  1.00  0.00           H  \nATOM   1017  HB2 GLU A  64      42.269   6.642  22.949  1.00  0.00           H  \nATOM   1018  HB3 GLU A  64      43.158   7.656  23.870  1.00  0.00           H  \nATOM   1019  HG2 GLU A  64      44.051   8.497  21.679  1.00  0.00           H  \nATOM   1020  HG3 GLU A  64      43.480   7.093  21.070  1.00  0.00           H  \nATOM   1021  N   LYS A  65      40.230   8.925  24.310  1.00  0.00           N  \nATOM   1022  CA  LYS A  65      38.906   8.767  24.863  1.00  0.00           C  \nATOM   1023  C   LYS A  65      37.874   9.503  24.035  1.00  0.00           C  \nATOM   1024  O   LYS A  65      36.835   8.941  23.666  1.00  0.00           O  \nATOM   1025  CB  LYS A  65      38.840   9.153  26.296  1.00  0.00           C  \nATOM   1026  CG  LYS A  65      37.478   8.774  26.841  1.00  0.00           C  \nATOM   1027  CD  LYS A  65      37.386   8.862  28.327  1.00  0.00           C  \nATOM   1028  CE  LYS A  65      35.950   8.577  28.767  1.00  0.00           C  \nATOM   1029  NZ  LYS A  65      35.883   8.324  30.208  1.00  0.00           N1+\nATOM   1030  H   LYS A  65      40.950   9.405  24.811  1.00  0.00           H  \nATOM   1031  HA  LYS A  65      38.682   7.794  24.812  1.00  0.00           H  \nATOM   1032  HB2 LYS A  65      38.975  10.140  26.385  1.00  0.00           H  \nATOM   1033  HB3 LYS A  65      39.552   8.672  26.807  1.00  0.00           H  \nATOM   1034  HG2 LYS A  65      37.278   7.833  26.567  1.00  0.00           H  \nATOM   1035  HG3 LYS A  65      36.796   9.389  26.445  1.00  0.00           H  \nATOM   1036  HD2 LYS A  65      37.649   9.780  28.623  1.00  0.00           H  \nATOM   1037  HD3 LYS A  65      38.001   8.189  28.739  1.00  0.00           H  \nATOM   1038  HE2 LYS A  65      35.612   7.773  28.278  1.00  0.00           H  \nATOM   1039  HE3 LYS A  65      35.378   9.367  28.547  1.00  0.00           H  \nATOM   1040  HZ1 LYS A  65      34.936   8.141  30.471  1.00  0.00           H  \nATOM   1041  HZ2 LYS A  65      36.451   7.532  30.434  1.00  0.00           H  \nATOM   1042  HZ3 LYS A  65      36.217   9.126  30.703  1.00  0.00           H  \nATOM   1043  N   LEU A  66      38.183  10.776  23.687  1.00  0.00           N  \nATOM   1044  CA  LEU A  66      37.285  11.549  22.842  1.00  0.00           C  \nATOM   1045  C   LEU A  66      37.046  10.806  21.525  1.00  0.00           C  \nATOM   1046  O   LEU A  66      35.921  10.670  21.057  1.00  0.00           O  \nATOM   1047  CB  LEU A  66      37.779  12.999  22.499  1.00  0.00           C  \nATOM   1048  CG  LEU A  66      37.863  13.950  23.689  1.00  0.00           C  \nATOM   1049  CD1 LEU A  66      38.517  15.274  23.269  1.00  0.00           C  \nATOM   1050  CD2 LEU A  66      36.479  14.213  24.266  1.00  0.00           C  \nATOM   1051  H   LEU A  66      39.034  11.187  24.013  1.00  0.00           H  \nATOM   1052  HA  LEU A  66      36.408  11.627  23.315  1.00  0.00           H  \nATOM   1053  HB2 LEU A  66      37.147  13.392  21.832  1.00  0.00           H  \nATOM   1054  HB3 LEU A  66      38.690  12.928  22.093  1.00  0.00           H  \nATOM   1055  HG  LEU A  66      38.428  13.526  24.397  1.00  0.00           H  \nATOM   1056 HD11 LEU A  66      38.565  15.887  24.058  1.00  0.00           H  \nATOM   1057 HD12 LEU A  66      39.440  15.096  22.928  1.00  0.00           H  \nATOM   1058 HD13 LEU A  66      37.972  15.701  22.548  1.00  0.00           H  \nATOM   1059 HD21 LEU A  66      36.555  14.837  25.043  1.00  0.00           H  \nATOM   1060 HD22 LEU A  66      35.898  14.624  23.564  1.00  0.00           H  \nATOM   1061 HD23 LEU A  66      36.075  13.350  24.570  1.00  0.00           H  \nATOM   1062  N   PHE A  67      38.148  10.304  20.974  1.00  0.00           N  \nATOM   1063  CA  PHE A  67      38.106   9.567  19.732  1.00  0.00           C  \nATOM   1064  C   PHE A  67      37.169   8.373  19.809  1.00  0.00           C  \nATOM   1065  O   PHE A  67      36.345   8.205  18.924  1.00  0.00           O  \nATOM   1066  CB  PHE A  67      39.516   9.144  19.348  1.00  0.00           C  \nATOM   1067  CG  PHE A  67      39.687   8.521  17.982  1.00  0.00           C  \nATOM   1068  CD1 PHE A  67      38.952   8.989  16.899  1.00  0.00           C  \nATOM   1069  CD2 PHE A  67      40.637   7.512  17.788  1.00  0.00           C  \nATOM   1070  CE1 PHE A  67      39.120   8.467  15.620  1.00  0.00           C  \nATOM   1071  CE2 PHE A  67      40.846   6.999  16.512  1.00  0.00           C  \nATOM   1072  CZ  PHE A  67      40.066   7.462  15.444  1.00  0.00           C  \nATOM   1073  H   PHE A  67      39.027  10.440  21.431  1.00  0.00           H  \nATOM   1074  HA  PHE A  67      37.764  10.181  19.021  1.00  0.00           H  \nATOM   1075  HB2 PHE A  67      39.828   8.479  20.026  1.00  0.00           H  \nATOM   1076  HB3 PHE A  67      40.097   9.957  19.386  1.00  0.00           H  \nATOM   1077  HD1 PHE A  67      38.285   9.720  17.043  1.00  0.00           H  \nATOM   1078  HD2 PHE A  67      41.163   7.161  18.563  1.00  0.00           H  \nATOM   1079  HE1 PHE A  67      38.577   8.804  14.851  1.00  0.00           H  \nATOM   1080  HE2 PHE A  67      41.548   6.304  16.358  1.00  0.00           H  \nATOM   1081  HZ  PHE A  67      40.192   7.062  14.536  1.00  0.00           H  \nATOM   1082  N   ASN A  68      37.296   7.555  20.876  1.00  0.00           N  \nATOM   1083  CA  ASN A  68      36.410   6.396  21.037  1.00  0.00           C  \nATOM   1084  C   ASN A  68      34.940   6.809  21.075  1.00  0.00           C  \nATOM   1085  O   ASN A  68      34.054   6.196  20.495  1.00  0.00           O  \nATOM   1086  CB  ASN A  68      36.756   5.640  22.329  1.00  0.00           C  \nATOM   1087  CG  ASN A  68      37.952   4.726  22.174  1.00  0.00           C  \nATOM   1088  ND2 ASN A  68      38.848   4.727  23.160  1.00  0.00           N  \nATOM   1089  OD1 ASN A  68      38.097   4.038  21.176  1.00  0.00           O  \nATOM   1090  H   ASN A  68      38.000   7.740  21.562  1.00  0.00           H  \nATOM   1091  HA  ASN A  68      36.548   5.780  20.261  1.00  0.00           H  \nATOM   1092  HB2 ASN A  68      35.966   5.089  22.598  1.00  0.00           H  \nATOM   1093  HB3 ASN A  68      36.956   6.308  23.046  1.00  0.00           H  \nATOM   1094 HD21 ASN A  68      38.704   5.301  23.966  1.00  0.00           H  \nATOM   1095 HD22 ASN A  68      39.665   4.154  23.094  1.00  0.00           H  \nATOM   1096  N   GLN A  69      34.691   7.876  21.798  1.00  0.00           N  \nATOM   1097  CA  GLN A  69      33.329   8.359  21.869  1.00  0.00           C  \nATOM   1098  C   GLN A  69      32.817   8.820  20.517  1.00  0.00           C  \nATOM   1099  O   GLN A  69      31.678   8.576  20.163  1.00  0.00           O  \nATOM   1100  CB  GLN A  69      33.245   9.544  22.832  1.00  0.00           C  \nATOM   1101  CG  GLN A  69      33.502   9.100  24.269  1.00  0.00           C  \nATOM   1102  CD  GLN A  69      33.592  10.287  25.226  1.00  0.00           C  \nATOM   1103  NE2 GLN A  69      33.476  11.520  24.721  1.00  0.00           N  \nATOM   1104  OE1 GLN A  69      33.800  10.099  26.422  1.00  0.00           O  \nATOM   1105  H   GLN A  69      35.426   8.344  22.289  1.00  0.00           H  \nATOM   1106  HA  GLN A  69      32.741   7.624  22.206  1.00  0.00           H  \nATOM   1107  HB2 GLN A  69      32.333   9.949  22.773  1.00  0.00           H  \nATOM   1108  HB3 GLN A  69      33.930  10.225  22.573  1.00  0.00           H  \nATOM   1109  HG2 GLN A  69      34.363   8.593  24.301  1.00  0.00           H  \nATOM   1110  HG3 GLN A  69      32.754   8.505  24.562  1.00  0.00           H  \nATOM   1111 HE21 GLN A  69      33.307  11.646  23.744  1.00  0.00           H  \nATOM   1112 HE22 GLN A  69      33.559  12.316  25.321  1.00  0.00           H  \nATOM   1113  N   ASP A  70      33.657   9.538  19.764  1.00  0.00           N  \nATOM   1114  CA  ASP A  70      33.229  10.056  18.473  1.00  0.00           C  \nATOM   1115  C   ASP A  70      32.962   9.001  17.424  1.00  0.00           C  \nATOM   1116  O   ASP A  70      32.086   9.172  16.590  1.00  0.00           O  \nATOM   1117  CB  ASP A  70      34.173  11.126  17.918  1.00  0.00           C  \nATOM   1118  CG  ASP A  70      34.193  12.370  18.775  1.00  0.00           C  \nATOM   1119  OD1 ASP A  70      33.326  12.709  19.561  1.00  0.00           O  \nATOM   1120  OD2 ASP A  70      35.280  13.049  18.595  1.00  0.00           O1-\nATOM   1121  H   ASP A  70      34.585   9.720  20.090  1.00  0.00           H  \nATOM   1122  HA  ASP A  70      32.355  10.514  18.634  1.00  0.00           H  \nATOM   1123  HB2 ASP A  70      33.872  11.374  16.997  1.00  0.00           H  \nATOM   1124  HB3 ASP A  70      35.098  10.749  17.876  1.00  0.00           H  \nATOM   1125  N   VAL A  71      33.736   7.915  17.452  1.00  0.00           N  \nATOM   1126  CA  VAL A  71      33.519   6.851  16.474  1.00  0.00           C  \nATOM   1127  C   VAL A  71      32.201   6.191  16.787  1.00  0.00           C  \nATOM   1128  O   VAL A  71      31.346   6.023  15.931  1.00  0.00           O  \nATOM   1129  CB  VAL A  71      34.656   5.835  16.407  1.00  0.00           C  \nATOM   1130  CG1 VAL A  71      34.233   4.621  15.555  1.00  0.00           C  \nATOM   1131  CG2 VAL A  71      35.915   6.446  15.808  1.00  0.00           C  \nATOM   1132  H   VAL A  71      34.459   7.830  18.137  1.00  0.00           H  \nATOM   1133  HA  VAL A  71      33.439   7.278  15.573  1.00  0.00           H  \nATOM   1134  HB  VAL A  71      34.861   5.521  17.334  1.00  0.00           H  \nATOM   1135 HG11 VAL A  71      34.984   3.962  15.518  1.00  0.00           H  \nATOM   1136 HG12 VAL A  71      33.431   4.189  15.966  1.00  0.00           H  \nATOM   1137 HG13 VAL A  71      34.010   4.925  14.629  1.00  0.00           H  \nATOM   1138 HG21 VAL A  71      36.639   5.756  15.778  1.00  0.00           H  \nATOM   1139 HG22 VAL A  71      35.721   6.766  14.881  1.00  0.00           H  \nATOM   1140 HG23 VAL A  71      36.212   7.217  16.372  1.00  0.00           H  \nATOM   1141  N   ASP A  72      32.023   5.893  18.066  1.00  0.00           N  \nATOM   1142  CA  ASP A  72      30.773   5.310  18.553  1.00  0.00           C  \nATOM   1143  C   ASP A  72      29.529   6.126  18.147  1.00  0.00           C  \nATOM   1144  O   ASP A  72      28.552   5.653  17.567  1.00  0.00           O  \nATOM   1145  CB  ASP A  72      30.887   5.194  20.076  1.00  0.00           C  \nATOM   1146  CG  ASP A  72      29.903   4.193  20.586  1.00  0.00           C  \nATOM   1147  OD1 ASP A  72      29.802   3.163  19.802  1.00  0.00           O  \nATOM   1148  OD2 ASP A  72      29.271   4.333  21.579  1.00  0.00           O1-\nATOM   1149  H   ASP A  72      32.763   6.071  18.715  1.00  0.00           H  \nATOM   1150  HA  ASP A  72      30.685   4.390  18.172  1.00  0.00           H  \nATOM   1151  HB2 ASP A  72      30.699   6.084  20.491  1.00  0.00           H  \nATOM   1152  HB3 ASP A  72      31.812   4.902  20.318  1.00  0.00           H  \nATOM   1153  N   ALA A  73      29.595   7.405  18.438  1.00  0.00           N  \nATOM   1154  CA  ALA A  73      28.513   8.306  18.102  1.00  0.00           C  \nATOM   1155  C   ALA A  73      28.276   8.293  16.615  1.00  0.00           C  \nATOM   1156  O   ALA A  73      27.140   8.356  16.147  1.00  0.00           O  \nATOM   1157  CB  ALA A  73      28.856   9.722  18.535  1.00  0.00           C  \nATOM   1158  H   ALA A  73      30.407   7.763  18.900  1.00  0.00           H  \nATOM   1159  HA  ALA A  73      27.681   8.011  18.571  1.00  0.00           H  \nATOM   1160  HB1 ALA A  73      28.102  10.335  18.298  1.00  0.00           H  \nATOM   1161  HB2 ALA A  73      29.003   9.742  19.524  1.00  0.00           H  \nATOM   1162  HB3 ALA A  73      29.688  10.021  18.068  1.00  0.00           H  \nATOM   1163  N   ALA A  74      29.350   8.251  15.844  1.00  0.00           N  \nATOM   1164  CA  ALA A  74      29.180   8.225  14.389  1.00  0.00           C  \nATOM   1165  C   ALA A  74      28.394   7.004  13.916  1.00  0.00           C  \nATOM   1166  O   ALA A  74      27.474   7.094  13.132  1.00  0.00           O  \nATOM   1167  CB  ALA A  74      30.509   8.324  13.658  1.00  0.00           C  \nATOM   1168  H   ALA A  74      30.265   8.237  16.248  1.00  0.00           H  \nATOM   1169  HA  ALA A  74      28.646   9.033  14.140  1.00  0.00           H  \nATOM   1170  HB1 ALA A  74      30.349   8.303  12.671  1.00  0.00           H  \nATOM   1171  HB2 ALA A  74      30.962   9.181  13.904  1.00  0.00           H  \nATOM   1172  HB3 ALA A  74      31.091   7.553  13.918  1.00  0.00           H  \nATOM   1173  N   VAL A  75      28.790   5.855  14.401  1.00  0.00           N  \nATOM   1174  CA  VAL A  75      28.100   4.652  14.015  1.00  0.00           C  \nATOM   1175  C   VAL A  75      26.611   4.734  14.383  1.00  0.00           C  \nATOM   1176  O   VAL A  75      25.715   4.486  13.565  1.00  0.00           O  \nATOM   1177  CB  VAL A  75      28.790   3.443  14.638  1.00  0.00           C  \nATOM   1178  CG1 VAL A  75      27.998   2.160  14.260  1.00  0.00           C  \nATOM   1179  CG2 VAL A  75      30.207   3.361  14.098  1.00  0.00           C  \nATOM   1180  H   VAL A  75      29.564   5.813  15.033  1.00  0.00           H  \nATOM   1181  HA  VAL A  75      28.166   4.565  13.021  1.00  0.00           H  \nATOM   1182  HB  VAL A  75      28.814   3.544  15.633  1.00  0.00           H  \nATOM   1183 HG11 VAL A  75      28.444   1.362  14.665  1.00  0.00           H  \nATOM   1184 HG12 VAL A  75      27.063   2.231  14.607  1.00  0.00           H  \nATOM   1185 HG13 VAL A  75      27.978   2.062  13.265  1.00  0.00           H  \nATOM   1186 HG21 VAL A  75      30.671   2.571  14.499  1.00  0.00           H  \nATOM   1187 HG22 VAL A  75      30.179   3.262  13.103  1.00  0.00           H  \nATOM   1188 HG23 VAL A  75      30.703   4.196  14.336  1.00  0.00           H  \nATOM   1189  N   ARG A  76      26.372   5.115  15.626  1.00  0.00           N  \nATOM   1190  CA  ARG A  76      25.018   5.225  16.120  1.00  0.00           C  \nATOM   1191  C   ARG A  76      24.201   6.235  15.310  1.00  0.00           C  \nATOM   1192  O   ARG A  76      23.037   6.031  14.956  1.00  0.00           O  \nATOM   1193  CB  ARG A  76      25.004   5.366  17.653  1.00  0.00           C  \nATOM   1194  CG  ARG A  76      25.300   4.049  18.373  1.00  0.00           C  \nATOM   1195  CD  ARG A  76      25.378   4.121  19.911  1.00  0.00           C  \nATOM   1196  NE  ARG A  76      26.567   4.844  20.334  1.00  0.00           N  \nATOM   1197  CZ  ARG A  76      26.544   6.092  20.811  1.00  0.00           C  \nATOM   1198  NH1 ARG A  76      25.407   6.768  20.917  1.00  0.00           N1+\nATOM   1199  NH2 ARG A  76      27.699   6.674  21.144  1.00  0.00           N  \nATOM   1200  H   ARG A  76      27.138   5.330  16.232  1.00  0.00           H  \nATOM   1201  HA  ARG A  76      24.597   4.337  15.934  1.00  0.00           H  \nATOM   1202  HB2 ARG A  76      24.101   5.689  17.936  1.00  0.00           H  \nATOM   1203  HB3 ARG A  76      25.696   6.038  17.918  1.00  0.00           H  \nATOM   1204  HG2 ARG A  76      26.178   3.708  18.038  1.00  0.00           H  \nATOM   1205  HG3 ARG A  76      24.577   3.401  18.134  1.00  0.00           H  \nATOM   1206  HD2 ARG A  76      25.409   3.193  20.282  1.00  0.00           H  \nATOM   1207  HD3 ARG A  76      24.567   4.591  20.259  1.00  0.00           H  \nATOM   1208  HE  ARG A  76      27.451   4.381  20.264  1.00  0.00           H  \nATOM   1209 HH11 ARG A  76      25.412   7.701  21.277  1.00  0.00           H  \nATOM   1210 HH12 ARG A  76      24.545   6.344  20.637  1.00  0.00           H  \nATOM   1211 HH21 ARG A  76      27.703   7.607  21.503  1.00  0.00           H  \nATOM   1212 HH22 ARG A  76      28.559   6.176  21.035  1.00  0.00           H  \nATOM   1213  N   GLY A  77      24.834   7.332  14.912  1.00  0.00           N  \nATOM   1214  CA  GLY A  77      24.148   8.292  14.079  1.00  0.00           C  \nATOM   1215  C   GLY A  77      23.733   7.639  12.756  1.00  0.00           C  \nATOM   1216  O   GLY A  77      22.661   7.830  12.260  1.00  0.00           O  \nATOM   1217  H   GLY A  77      25.782   7.493  15.188  1.00  0.00           H  \nATOM   1218  HA2 GLY A  77      24.758   9.062  13.891  1.00  0.00           H  \nATOM   1219  HA3 GLY A  77      23.333   8.621  14.556  1.00  0.00           H  \nATOM   1220  N   ILE A  78      24.619   6.871  12.173  1.00  0.00           N  \nATOM   1221  CA  ILE A  78      24.243   6.205  10.963  1.00  0.00           C  \nATOM   1222  C   ILE A  78      23.086   5.251  11.260  1.00  0.00           C  \nATOM   1223  O   ILE A  78      22.086   5.170  10.559  1.00  0.00           O  \nATOM   1224  CB  ILE A  78      25.422   5.396  10.409  1.00  0.00           C  \nATOM   1225  CG1 ILE A  78      26.403   6.295   9.670  1.00  0.00           C  \nATOM   1226  CG2 ILE A  78      24.911   4.330   9.448  1.00  0.00           C  \nATOM   1227  CD1 ILE A  78      27.766   5.597   9.537  1.00  0.00           C  \nATOM   1228  H   ILE A  78      25.533   6.753  12.562  1.00  0.00           H  \nATOM   1229  HA  ILE A  78      23.953   6.881  10.285  1.00  0.00           H  \nATOM   1230  HB  ILE A  78      25.897   4.950  11.168  1.00  0.00           H  \nATOM   1231 HG12 ILE A  78      26.517   7.148  10.179  1.00  0.00           H  \nATOM   1232 HG13 ILE A  78      26.045   6.496   8.758  1.00  0.00           H  \nATOM   1233 HG21 ILE A  78      25.684   3.806   9.090  1.00  0.00           H  \nATOM   1234 HG22 ILE A  78      24.287   3.716   9.932  1.00  0.00           H  \nATOM   1235 HG23 ILE A  78      24.426   4.768   8.691  1.00  0.00           H  \nATOM   1236 HD11 ILE A  78      28.401   6.197   9.050  1.00  0.00           H  \nATOM   1237 HD12 ILE A  78      28.128   5.396  10.447  1.00  0.00           H  \nATOM   1238 HD13 ILE A  78      27.655   4.744   9.027  1.00  0.00           H  \nATOM   1239  N   LEU A  79      23.222   4.474  12.316  1.00  0.00           N  \nATOM   1240  CA  LEU A  79      22.158   3.516  12.548  1.00  0.00           C  \nATOM   1241  C   LEU A  79      20.793   4.077  12.862  1.00  0.00           C  \nATOM   1242  O   LEU A  79      19.804   3.384  12.701  1.00  0.00           O  \nATOM   1243  CB  LEU A  79      22.526   2.412  13.523  1.00  0.00           C  \nATOM   1244  CG  LEU A  79      23.747   1.648  13.072  1.00  0.00           C  \nATOM   1245  CD1 LEU A  79      24.160   0.762  14.221  1.00  0.00           C  \nATOM   1246  CD2 LEU A  79      23.459   0.816  11.844  1.00  0.00           C  \nATOM   1247  H   LEU A  79      24.014   4.541  12.923  1.00  0.00           H  \nATOM   1248  HA  LEU A  79      22.043   3.050  11.671  1.00  0.00           H  \nATOM   1249  HB2 LEU A  79      21.757   1.777  13.598  1.00  0.00           H  \nATOM   1250  HB3 LEU A  79      22.711   2.819  14.417  1.00  0.00           H  \nATOM   1251  HG  LEU A  79      24.484   2.292  12.870  1.00  0.00           H  \nATOM   1252 HD11 LEU A  79      24.970   0.236  13.962  1.00  0.00           H  \nATOM   1253 HD12 LEU A  79      24.371   1.327  15.019  1.00  0.00           H  \nATOM   1254 HD13 LEU A  79      23.413   0.136  14.444  1.00  0.00           H  \nATOM   1255 HD21 LEU A  79      24.287   0.324  11.573  1.00  0.00           H  \nATOM   1256 HD22 LEU A  79      22.733   0.159  12.049  1.00  0.00           H  \nATOM   1257 HD23 LEU A  79      23.167   1.414  11.097  1.00  0.00           H  \nATOM   1258  N   ARG A  80      20.745   5.317  13.330  1.00  0.00           N  \nATOM   1259  CA  ARG A  80      19.497   5.981  13.675  1.00  0.00           C  \nATOM   1260  C   ARG A  80      18.899   6.743  12.524  1.00  0.00           C  \nATOM   1261  O   ARG A  80      17.784   7.251  12.628  1.00  0.00           O  \nATOM   1262  CB  ARG A  80      19.766   7.079  14.676  1.00  0.00           C  \nATOM   1263  CG  ARG A  80      20.030   6.596  16.069  1.00  0.00           C  \nATOM   1264  CD  ARG A  80      19.764   7.710  17.071  1.00  0.00           C  \nATOM   1265  NE  ARG A  80      20.990   8.148  17.721  1.00  0.00           N  \nATOM   1266  CZ  ARG A  80      21.697   9.227  17.382  1.00  0.00           C  \nATOM   1267  NH1 ARG A  80      21.356  10.062  16.387  1.00  0.00           N1+\nATOM   1268  NH2 ARG A  80      22.803   9.467  18.073  1.00  0.00           N  \nATOM   1269  H   ARG A  80      21.603   5.817  13.451  1.00  0.00           H  \nATOM   1270  HA  ARG A  80      18.839   5.324  14.042  1.00  0.00           H  \nATOM   1271  HB2 ARG A  80      18.969   7.682  14.700  1.00  0.00           H  \nATOM   1272  HB3 ARG A  80      20.565   7.595  14.367  1.00  0.00           H  \nATOM   1273  HG2 ARG A  80      20.984   6.306  16.143  1.00  0.00           H  \nATOM   1274  HG3 ARG A  80      19.430   5.821  16.269  1.00  0.00           H  \nATOM   1275  HD2 ARG A  80      19.129   7.376  17.767  1.00  0.00           H  \nATOM   1276  HD3 ARG A  80      19.355   8.487  16.592  1.00  0.00           H  \nATOM   1277  HE  ARG A  80      21.330   7.596  18.483  1.00  0.00           H  \nATOM   1278 HH11 ARG A  80      21.929  10.855  16.182  1.00  0.00           H  \nATOM   1279 HH12 ARG A  80      20.529   9.890  15.852  1.00  0.00           H  \nATOM   1280 HH21 ARG A  80      23.366  10.264  17.855  1.00  0.00           H  \nATOM   1281 HH22 ARG A  80      23.074   8.851  18.812  1.00  0.00           H  \nATOM   1282  N   ASN A  81      19.698   6.931  11.476  1.00  0.00           N  \nATOM   1283  CA  ASN A  81      19.260   7.702  10.333  1.00  0.00           C  \nATOM   1284  C   ASN A  81      18.530   6.886   9.268  1.00  0.00           C  \nATOM   1285  O   ASN A  81      19.080   5.955   8.676  1.00  0.00           O  \nATOM   1286  CB  ASN A  81      20.422   8.512   9.781  1.00  0.00           C  \nATOM   1287  CG  ASN A  81      19.957   9.514   8.759  1.00  0.00           C  \nATOM   1288  ND2 ASN A  81      20.267  10.784   8.999  1.00  0.00           N  \nATOM   1289  OD1 ASN A  81      19.309   9.151   7.780  1.00  0.00           O  \nATOM   1290  H   ASN A  81      20.615   6.533  11.479  1.00  0.00           H  \nATOM   1291  HA  ASN A  81      18.597   8.365  10.680  1.00  0.00           H  \nATOM   1292  HB2 ASN A  81      21.077   7.890   9.352  1.00  0.00           H  \nATOM   1293  HB3 ASN A  81      20.867   8.998  10.534  1.00  0.00           H  \nATOM   1294 HD21 ASN A  81      20.797  11.024   9.812  1.00  0.00           H  \nATOM   1295 HD22 ASN A  81      19.970  11.499   8.367  1.00  0.00           H  \nATOM   1296  N   ALA A  82      17.274   7.233   9.025  1.00  0.00           N  \nATOM   1297  CA  ALA A  82      16.458   6.498   8.070  1.00  0.00           C  \nATOM   1298  C   ALA A  82      17.021   6.456   6.670  1.00  0.00           C  \nATOM   1299  O   ALA A  82      16.827   5.518   5.938  1.00  0.00           O  \nATOM   1300  CB  ALA A  82      15.011   6.921   8.079  1.00  0.00           C  \nATOM   1301  H   ALA A  82      16.879   8.015   9.507  1.00  0.00           H  \nATOM   1302  HA  ALA A  82      16.462   5.550   8.389  1.00  0.00           H  \nATOM   1303  HB1 ALA A  82      14.503   6.384   7.406  1.00  0.00           H  \nATOM   1304  HB2 ALA A  82      14.625   6.768   8.988  1.00  0.00           H  \nATOM   1305  HB3 ALA A  82      14.946   7.892   7.849  1.00  0.00           H  \nATOM   1306  N   LYS A  83      17.738   7.489   6.290  1.00  0.00           N  \nATOM   1307  CA  LYS A  83      18.320   7.493   4.965  1.00  0.00           C  \nATOM   1308  C   LYS A  83      19.654   6.777   4.919  1.00  0.00           C  \nATOM   1309  O   LYS A  83      20.050   6.300   3.871  1.00  0.00           O  \nATOM   1310  CB  LYS A  83      18.564   8.897   4.458  1.00  0.00           C  \nATOM   1311  CG  LYS A  83      17.391   9.470   3.729  1.00  0.00           C  \nATOM   1312  CD  LYS A  83      16.458  10.210   4.666  1.00  0.00           C  \nATOM   1313  CE  LYS A  83      15.426  11.045   3.916  1.00  0.00           C  \nATOM   1314  NZ  LYS A  83      15.470  10.816   2.459  1.00  0.00           N1+\nATOM   1315  H   LYS A  83      17.880   8.262   6.908  1.00  0.00           H  \nATOM   1316  HA  LYS A  83      17.690   7.033   4.339  1.00  0.00           H  \nATOM   1317  HB2 LYS A  83      19.347   8.879   3.836  1.00  0.00           H  \nATOM   1318  HB3 LYS A  83      18.772   9.486   5.239  1.00  0.00           H  \nATOM   1319  HG2 LYS A  83      16.887   8.726   3.290  1.00  0.00           H  \nATOM   1320  HG3 LYS A  83      17.722  10.106   3.032  1.00  0.00           H  \nATOM   1321  HD2 LYS A  83      17.001  10.816   5.248  1.00  0.00           H  \nATOM   1322  HD3 LYS A  83      15.979   9.542   5.236  1.00  0.00           H  \nATOM   1323  HE2 LYS A  83      15.604  12.013   4.095  1.00  0.00           H  \nATOM   1324  HE3 LYS A  83      14.515  10.807   4.251  1.00  0.00           H  \nATOM   1325  HZ1 LYS A  83      14.558  10.952   2.073  1.00  0.00           H  \nATOM   1326  HZ2 LYS A  83      16.109  11.461   2.039  1.00  0.00           H  \nATOM   1327  HZ3 LYS A  83      15.773   9.880   2.278  1.00  0.00           H  \nATOM   1328  N   LEU A  84      20.374   6.760   6.031  1.00  0.00           N  \nATOM   1329  CA  LEU A  84      21.698   6.156   6.019  1.00  0.00           C  \nATOM   1330  C   LEU A  84      21.747   4.662   6.317  1.00  0.00           C  \nATOM   1331  O   LEU A  84      22.497   3.905   5.714  1.00  0.00           O  \nATOM   1332  CB  LEU A  84      22.683   6.918   6.954  1.00  0.00           C  \nATOM   1333  CG  LEU A  84      22.894   8.379   6.605  1.00  0.00           C  \nATOM   1334  CD1 LEU A  84      23.843   8.996   7.637  1.00  0.00           C  \nATOM   1335  CD2 LEU A  84      23.525   8.524   5.219  1.00  0.00           C  \nATOM   1336  H   LEU A  84      20.010   7.159   6.873  1.00  0.00           H  \nATOM   1337  HA  LEU A  84      22.049   6.269   5.090  1.00  0.00           H  \nATOM   1338  HB2 LEU A  84      23.570   6.458   6.912  1.00  0.00           H  \nATOM   1339  HB3 LEU A  84      22.326   6.870   7.887  1.00  0.00           H  \nATOM   1340  HG  LEU A  84      22.017   8.859   6.626  1.00  0.00           H  \nATOM   1341 HD11 LEU A  84      23.991   9.961   7.419  1.00  0.00           H  \nATOM   1342 HD12 LEU A  84      23.440   8.919   8.549  1.00  0.00           H  \nATOM   1343 HD13 LEU A  84      24.718   8.512   7.617  1.00  0.00           H  \nATOM   1344 HD21 LEU A  84      23.654   9.494   5.011  1.00  0.00           H  \nATOM   1345 HD22 LEU A  84      24.410   8.059   5.206  1.00  0.00           H  \nATOM   1346 HD23 LEU A  84      22.923   8.114   4.534  1.00  0.00           H  \nATOM   1347  N   LYS A  85      20.976   4.264   7.293  1.00  0.00           N  \nATOM   1348  CA  LYS A  85      20.954   2.909   7.729  1.00  0.00           C  \nATOM   1349  C   LYS A  85      20.865   1.834   6.661  1.00  0.00           C  \nATOM   1350  O   LYS A  85      21.599   0.838   6.663  1.00  0.00           O  \nATOM   1351  CB  LYS A  85      19.905   2.733   8.781  1.00  0.00           C  \nATOM   1352  CG  LYS A  85      19.974   1.318   9.304  1.00  0.00           C  \nATOM   1353  CD  LYS A  85      19.238   1.131  10.595  1.00  0.00           C  \nATOM   1354  CE  LYS A  85      19.144  -0.344  10.958  1.00  0.00           C  \nATOM   1355  NZ  LYS A  85      18.287  -1.083  10.047  1.00  0.00           N1+\nATOM   1356  H   LYS A  85      20.384   4.930   7.747  1.00  0.00           H  \nATOM   1357  HA  LYS A  85      21.828   2.759   8.191  1.00  0.00           H  \nATOM   1358  HB2 LYS A  85      19.002   2.902   8.387  1.00  0.00           H  \nATOM   1359  HB3 LYS A  85      20.068   3.376   9.529  1.00  0.00           H  \nATOM   1360  HG2 LYS A  85      20.934   1.079   9.448  1.00  0.00           H  \nATOM   1361  HG3 LYS A  85      19.577   0.706   8.620  1.00  0.00           H  \nATOM   1362  HD2 LYS A  85      18.315   1.505  10.503  1.00  0.00           H  \nATOM   1363  HD3 LYS A  85      19.723   1.617  11.322  1.00  0.00           H  \nATOM   1364  HE2 LYS A  85      18.774  -0.424  11.884  1.00  0.00           H  \nATOM   1365  HE3 LYS A  85      20.061  -0.741  10.930  1.00  0.00           H  \nATOM   1366  HZ1 LYS A  85      18.833  -1.435   9.287  1.00  0.00           H  \nATOM   1367  HZ2 LYS A  85      17.862  -1.846  10.534  1.00  0.00           H  \nATOM   1368  HZ3 LYS A  85      17.576  -0.476   9.693  1.00  0.00           H  \nATOM   1369  N   PRO A  86      19.923   1.989   5.784  1.00  0.00           N  \nATOM   1370  CA  PRO A  86      19.718   1.012   4.751  1.00  0.00           C  \nATOM   1371  C   PRO A  86      20.931   0.894   3.863  1.00  0.00           C  \nATOM   1372  O   PRO A  86      21.327  -0.193   3.490  1.00  0.00           O  \nATOM   1373  CB  PRO A  86      18.506   1.471   3.952  1.00  0.00           C  \nATOM   1374  CG  PRO A  86      17.901   2.641   4.721  1.00  0.00           C  \nATOM   1375  CD  PRO A  86      18.921   3.062   5.769  1.00  0.00           C  \nATOM   1376  HA  PRO A  86      19.524   0.124   5.168  1.00  0.00           H  \nATOM   1377  HB2 PRO A  86      18.786   1.765   3.038  1.00  0.00           H  \nATOM   1378  HB3 PRO A  86      17.841   0.728   3.874  1.00  0.00           H  \nATOM   1379  HG2 PRO A  86      17.715   3.401   4.099  1.00  0.00           H  \nATOM   1380  HG3 PRO A  86      17.051   2.357   5.164  1.00  0.00           H  \nATOM   1381  HD2 PRO A  86      19.343   3.933   5.517  1.00  0.00           H  \nATOM   1382  HD3 PRO A  86      18.487   3.149   6.666  1.00  0.00           H  \nATOM   1383  N   VAL A  87      21.556   2.019   3.540  1.00  0.00           N  \nATOM   1384  CA  VAL A  87      22.743   1.963   2.703  1.00  0.00           C  \nATOM   1385  C   VAL A  87      23.885   1.251   3.432  1.00  0.00           C  \nATOM   1386  O   VAL A  87      24.555   0.336   2.950  1.00  0.00           O  \nATOM   1387  CB  VAL A  87      23.208   3.358   2.277  1.00  0.00           C  \nATOM   1388  CG1 VAL A  87      24.315   3.235   1.225  1.00  0.00           C  \nATOM   1389  CG2 VAL A  87      22.026   4.173   1.750  1.00  0.00           C  \nATOM   1390  H   VAL A  87      21.213   2.899   3.870  1.00  0.00           H  \nATOM   1391  HA  VAL A  87      22.522   1.441   1.879  1.00  0.00           H  \nATOM   1392  HB  VAL A  87      23.583   3.825   3.078  1.00  0.00           H  \nATOM   1393 HG11 VAL A  87      24.616   4.148   0.949  1.00  0.00           H  \nATOM   1394 HG12 VAL A  87      25.088   2.732   1.612  1.00  0.00           H  \nATOM   1395 HG13 VAL A  87      23.964   2.745   0.427  1.00  0.00           H  \nATOM   1396 HG21 VAL A  87      22.343   5.081   1.476  1.00  0.00           H  \nATOM   1397 HG22 VAL A  87      21.625   3.707   0.961  1.00  0.00           H  \nATOM   1398 HG23 VAL A  87      21.337   4.264   2.469  1.00  0.00           H  \nATOM   1399  N   TYR A  88      24.101   1.688   4.642  1.00  0.00           N  \nATOM   1400  CA  TYR A  88      25.107   1.129   5.505  1.00  0.00           C  \nATOM   1401  C   TYR A  88      24.960  -0.392   5.686  1.00  0.00           C  \nATOM   1402  O   TYR A  88      25.964  -1.131   5.691  1.00  0.00           O  \nATOM   1403  CB  TYR A  88      25.006   1.855   6.871  1.00  0.00           C  \nATOM   1404  CG  TYR A  88      26.080   1.445   7.826  1.00  0.00           C  \nATOM   1405  CD1 TYR A  88      27.346   2.030   7.761  1.00  0.00           C  \nATOM   1406  CD2 TYR A  88      25.851   0.462   8.788  1.00  0.00           C  \nATOM   1407  CE1 TYR A  88      28.359   1.661   8.638  1.00  0.00           C  \nATOM   1408  CE2 TYR A  88      26.851   0.090   9.683  1.00  0.00           C  \nATOM   1409  CZ  TYR A  88      28.101   0.707   9.623  1.00  0.00           C  \nATOM   1410  OH  TYR A  88      29.091   0.303  10.491  1.00  0.00           O  \nATOM   1411  H   TYR A  88      23.543   2.444   4.984  1.00  0.00           H  \nATOM   1412  HA  TYR A  88      26.006   1.317   5.110  1.00  0.00           H  \nATOM   1413  HB2 TYR A  88      24.118   1.645   7.280  1.00  0.00           H  \nATOM   1414  HB3 TYR A  88      25.076   2.840   6.715  1.00  0.00           H  \nATOM   1415  HD1 TYR A  88      27.528   2.729   7.069  1.00  0.00           H  \nATOM   1416  HD2 TYR A  88      24.956   0.018   8.836  1.00  0.00           H  \nATOM   1417  HE1 TYR A  88      29.266   2.076   8.564  1.00  0.00           H  \nATOM   1418  HE2 TYR A  88      26.674  -0.618  10.367  1.00  0.00           H  \nATOM   1419  HH  TYR A  88      28.892  -0.382  11.192  1.00  0.00           H  \nATOM   1420  N   ASP A  89      23.709  -0.854   5.846  1.00  0.00           N  \nATOM   1421  CA  ASP A  89      23.437  -2.279   6.057  1.00  0.00           C  \nATOM   1422  C   ASP A  89      23.760  -3.036   4.832  1.00  0.00           C  \nATOM   1423  O   ASP A  89      24.152  -4.193   4.899  1.00  0.00           O  \nATOM   1424  CB  ASP A  89      21.977  -2.531   6.393  1.00  0.00           C  \nATOM   1425  CG  ASP A  89      21.731  -2.288   7.841  1.00  0.00           C  \nATOM   1426  OD1 ASP A  89      22.848  -2.091   8.515  1.00  0.00           O  \nATOM   1427  OD2 ASP A  89      20.642  -2.285   8.325  1.00  0.00           O1-\nATOM   1428  H   ASP A  89      22.944  -0.210   5.821  1.00  0.00           H  \nATOM   1429  HA  ASP A  89      24.007  -2.613   6.807  1.00  0.00           H  \nATOM   1430  HB2 ASP A  89      21.747  -3.479   6.174  1.00  0.00           H  \nATOM   1431  HB3 ASP A  89      21.403  -1.915   5.853  1.00  0.00           H  \nATOM   1432  N   SER A  90      23.593  -2.401   3.704  1.00  0.00           N  \nATOM   1433  CA  SER A  90      23.868  -3.125   2.490  1.00  0.00           C  \nATOM   1434  C   SER A  90      25.341  -3.313   2.229  1.00  0.00           C  \nATOM   1435  O   SER A  90      25.735  -4.064   1.316  1.00  0.00           O  \nATOM   1436  CB  SER A  90      23.269  -2.434   1.271  1.00  0.00           C  \nATOM   1437  OG  SER A  90      24.054  -1.304   0.884  1.00  0.00           O  \nATOM   1438  H   SER A  90      23.286  -1.449   3.684  1.00  0.00           H  \nATOM   1439  HA  SER A  90      23.450  -4.030   2.569  1.00  0.00           H  \nATOM   1440  HB2 SER A  90      22.343  -2.128   1.491  1.00  0.00           H  \nATOM   1441  HB3 SER A  90      23.234  -3.083   0.511  1.00  0.00           H  \nATOM   1442  HG  SER A  90      24.089  -0.649   1.638  1.00  0.00           H  \nATOM   1443  N   LEU A  91      26.200  -2.568   2.905  1.00  0.00           N  \nATOM   1444  CA  LEU A  91      27.633  -2.616   2.575  1.00  0.00           C  \nATOM   1445  C   LEU A  91      28.443  -3.694   3.251  1.00  0.00           C  \nATOM   1446  O   LEU A  91      28.092  -4.179   4.339  1.00  0.00           O  \nATOM   1447  CB  LEU A  91      28.328  -1.299   2.979  1.00  0.00           C  \nATOM   1448  CG  LEU A  91      27.746  -0.042   2.334  1.00  0.00           C  \nATOM   1449  CD1 LEU A  91      28.312   1.192   3.010  1.00  0.00           C  \nATOM   1450  CD2 LEU A  91      28.207  -0.025   0.874  1.00  0.00           C  \nATOM   1451  H   LEU A  91      25.876  -1.973   3.640  1.00  0.00           H  \nATOM   1452  HA  LEU A  91      27.724  -2.729   1.586  1.00  0.00           H  \nATOM   1453  HB2 LEU A  91      29.292  -1.364   2.720  1.00  0.00           H  \nATOM   1454  HB3 LEU A  91      28.256  -1.201   3.972  1.00  0.00           H  \nATOM   1455  HG  LEU A  91      26.748  -0.047   2.389  1.00  0.00           H  \nATOM   1456 HD11 LEU A  91      27.928   2.011   2.584  1.00  0.00           H  \nATOM   1457 HD12 LEU A  91      28.074   1.179   3.981  1.00  0.00           H  \nATOM   1458 HD13 LEU A  91      29.307   1.200   2.910  1.00  0.00           H  \nATOM   1459 HD21 LEU A  91      27.843   0.788   0.419  1.00  0.00           H  \nATOM   1460 HD22 LEU A  91      29.206  -0.007   0.840  1.00  0.00           H  \nATOM   1461 HD23 LEU A  91      27.873  -0.845   0.409  1.00  0.00           H  \nATOM   1462  N   ASP A  92      29.609  -3.991   2.651  1.00  0.00           N  \nATOM   1463  CA  ASP A  92      30.556  -4.919   3.274  1.00  0.00           C  \nATOM   1464  C   ASP A  92      31.351  -4.198   4.373  1.00  0.00           C  \nATOM   1465  O   ASP A  92      31.275  -2.970   4.520  1.00  0.00           O  \nATOM   1466  CB  ASP A  92      31.557  -5.480   2.295  1.00  0.00           C  \nATOM   1467  CG  ASP A  92      32.327  -4.396   1.620  1.00  0.00           C  \nATOM   1468  OD1 ASP A  92      31.679  -3.885   0.599  1.00  0.00           O  \nATOM   1469  OD2 ASP A  92      33.439  -4.033   1.978  1.00  0.00           O1-\nATOM   1470  H   ASP A  92      29.832  -3.574   1.770  1.00  0.00           H  \nATOM   1471  HA  ASP A  92      30.046  -5.675   3.685  1.00  0.00           H  \nATOM   1472  HB2 ASP A  92      31.071  -6.013   1.603  1.00  0.00           H  \nATOM   1473  HB3 ASP A  92      32.194  -6.074   2.786  1.00  0.00           H  \nATOM   1474  N   ALA A  93      32.146  -4.938   5.143  1.00  0.00           N  \nATOM   1475  CA  ALA A  93      32.892  -4.363   6.239  1.00  0.00           C  \nATOM   1476  C   ALA A  93      33.897  -3.256   5.913  1.00  0.00           C  \nATOM   1477  O   ALA A  93      34.018  -2.306   6.663  1.00  0.00           O  \nATOM   1478  CB  ALA A  93      33.335  -5.369   7.301  1.00  0.00           C  \nATOM   1479  H   ALA A  93      32.229  -5.917   4.958  1.00  0.00           H  \nATOM   1480  HA  ALA A  93      32.181  -3.855   6.725  1.00  0.00           H  \nATOM   1481  HB1 ALA A  93      33.842  -4.893   8.020  1.00  0.00           H  \nATOM   1482  HB2 ALA A  93      32.530  -5.811   7.697  1.00  0.00           H  \nATOM   1483  HB3 ALA A  93      33.922  -6.061   6.881  1.00  0.00           H  \nATOM   1484  N   VAL A  94      34.634  -3.342   4.810  1.00  0.00           N  \nATOM   1485  CA  VAL A  94      35.558  -2.281   4.462  1.00  0.00           C  \nATOM   1486  C   VAL A  94      34.796  -1.000   4.093  1.00  0.00           C  \nATOM   1487  O   VAL A  94      35.042   0.080   4.646  1.00  0.00           O  \nATOM   1488  CB  VAL A  94      36.480  -2.760   3.345  1.00  0.00           C  \nATOM   1489  CG1 VAL A  94      37.476  -1.685   2.896  1.00  0.00           C  \nATOM   1490  CG2 VAL A  94      37.314  -3.892   3.922  1.00  0.00           C  \nATOM   1491  H   VAL A  94      34.550  -4.143   4.217  1.00  0.00           H  \nATOM   1492  HA  VAL A  94      36.121  -2.085   5.265  1.00  0.00           H  \nATOM   1493  HB  VAL A  94      35.944  -3.085   2.566  1.00  0.00           H  \nATOM   1494 HG11 VAL A  94      38.053  -2.050   2.166  1.00  0.00           H  \nATOM   1495 HG12 VAL A  94      36.976  -0.887   2.559  1.00  0.00           H  \nATOM   1496 HG13 VAL A  94      38.048  -1.416   3.671  1.00  0.00           H  \nATOM   1497 HG21 VAL A  94      37.937  -4.239   3.220  1.00  0.00           H  \nATOM   1498 HG22 VAL A  94      37.844  -3.553   4.700  1.00  0.00           H  \nATOM   1499 HG23 VAL A  94      36.711  -4.629   4.226  1.00  0.00           H  \nATOM   1500  N   ARG A  95      33.870  -1.134   3.167  1.00  0.00           N  \nATOM   1501  CA  ARG A  95      33.057  -0.019   2.743  1.00  0.00           C  \nATOM   1502  C   ARG A  95      32.334   0.614   3.908  1.00  0.00           C  \nATOM   1503  O   ARG A  95      32.121   1.828   3.947  1.00  0.00           O  \nATOM   1504  CB  ARG A  95      32.101  -0.382   1.624  1.00  0.00           C  \nATOM   1505  CG  ARG A  95      32.874  -0.733   0.361  1.00  0.00           C  \nATOM   1506  CD  ARG A  95      31.890  -1.043  -0.753  1.00  0.00           C  \nATOM   1507  NE  ARG A  95      32.574  -1.154  -2.019  1.00  0.00           N  \nATOM   1508  CZ  ARG A  95      33.052  -2.302  -2.503  1.00  0.00           C  \nATOM   1509  NH1 ARG A  95      32.971  -3.466  -1.840  1.00  0.00           N1+\nATOM   1510  NH2 ARG A  95      33.661  -2.292  -3.685  1.00  0.00           N  \nATOM   1511  H   ARG A  95      33.726  -2.030   2.747  1.00  0.00           H  \nATOM   1512  HA  ARG A  95      33.681   0.673   2.379  1.00  0.00           H  \nATOM   1513  HB2 ARG A  95      31.501   0.396   1.438  1.00  0.00           H  \nATOM   1514  HB3 ARG A  95      31.550  -1.169   1.903  1.00  0.00           H  \nATOM   1515  HG2 ARG A  95      33.449  -1.533   0.532  1.00  0.00           H  \nATOM   1516  HG3 ARG A  95      33.449   0.040   0.094  1.00  0.00           H  \nATOM   1517  HD2 ARG A  95      31.214  -0.308  -0.808  1.00  0.00           H  \nATOM   1518  HD3 ARG A  95      31.428  -1.907  -0.552  1.00  0.00           H  \nATOM   1519  HE  ARG A  95      32.697  -0.324  -2.564  1.00  0.00           H  \nATOM   1520 HH11 ARG A  95      33.345  -4.300  -2.246  1.00  0.00           H  \nATOM   1521 HH12 ARG A  95      32.537  -3.500  -0.940  1.00  0.00           H  \nATOM   1522 HH21 ARG A  95      34.027  -3.141  -4.066  1.00  0.00           H  \nATOM   1523 HH22 ARG A  95      33.753  -1.435  -4.193  1.00  0.00           H  \nATOM   1524  N   ARG A  96      31.944  -0.189   4.883  1.00  0.00           N  \nATOM   1525  CA  ARG A  96      31.280   0.424   6.031  1.00  0.00           C  \nATOM   1526  C   ARG A  96      32.229   1.411   6.754  1.00  0.00           C  \nATOM   1527  O   ARG A  96      31.819   2.429   7.300  1.00  0.00           O  \nATOM   1528  CB  ARG A  96      30.768  -0.580   7.054  1.00  0.00           C  \nATOM   1529  CG  ARG A  96      29.588  -1.374   6.556  1.00  0.00           C  \nATOM   1530  CD  ARG A  96      29.031  -2.355   7.625  1.00  0.00           C  \nATOM   1531  NE  ARG A  96      27.903  -3.105   7.057  1.00  0.00           N  \nATOM   1532  CZ  ARG A  96      27.227  -4.079   7.656  1.00  0.00           C  \nATOM   1533  NH1 ARG A  96      27.505  -4.424   8.876  1.00  0.00           N1+\nATOM   1534  NH2 ARG A  96      26.228  -4.672   6.973  1.00  0.00           N  \nATOM   1535  H   ARG A  96      32.097  -1.176   4.837  1.00  0.00           H  \nATOM   1536  HA  ARG A  96      30.496   0.944   5.691  1.00  0.00           H  \nATOM   1537  HB2 ARG A  96      30.494  -0.084   7.878  1.00  0.00           H  \nATOM   1538  HB3 ARG A  96      31.508  -1.214   7.277  1.00  0.00           H  \nATOM   1539  HG2 ARG A  96      29.872  -1.901   5.755  1.00  0.00           H  \nATOM   1540  HG3 ARG A  96      28.861  -0.738   6.296  1.00  0.00           H  \nATOM   1541  HD2 ARG A  96      28.720  -1.838   8.423  1.00  0.00           H  \nATOM   1542  HD3 ARG A  96      29.751  -2.992   7.900  1.00  0.00           H  \nATOM   1543  HE  ARG A  96      27.617  -2.859   6.131  1.00  0.00           H  \nATOM   1544 HH11 ARG A  96      26.990  -5.159   9.318  1.00  0.00           H  \nATOM   1545 HH12 ARG A  96      28.234  -3.955   9.374  1.00  0.00           H  \nATOM   1546 HH21 ARG A  96      25.701  -5.408   7.397  1.00  0.00           H  \nATOM   1547 HH22 ARG A  96      26.014  -4.376   6.042  1.00  0.00           H  \nATOM   1548  N   ALA A  97      33.511   1.070   6.773  1.00  0.00           N  \nATOM   1549  CA  ALA A  97      34.462   1.942   7.411  1.00  0.00           C  \nATOM   1550  C   ALA A  97      34.522   3.252   6.622  1.00  0.00           C  \nATOM   1551  O   ALA A  97      34.629   4.324   7.202  1.00  0.00           O  \nATOM   1552  CB  ALA A  97      35.849   1.293   7.483  1.00  0.00           C  \nATOM   1553  H   ALA A  97      33.813   0.216   6.349  1.00  0.00           H  \nATOM   1554  HA  ALA A  97      34.148   2.138   8.340  1.00  0.00           H  \nATOM   1555  HB1 ALA A  97      36.487   1.920   7.930  1.00  0.00           H  \nATOM   1556  HB2 ALA A  97      35.793   0.444   8.008  1.00  0.00           H  \nATOM   1557  HB3 ALA A  97      36.171   1.092   6.558  1.00  0.00           H  \nATOM   1558  N   ALA A  98      34.439   3.173   5.283  1.00  0.00           N  \nATOM   1559  CA  ALA A  98      34.443   4.405   4.506  1.00  0.00           C  \nATOM   1560  C   ALA A  98      33.222   5.261   4.844  1.00  0.00           C  \nATOM   1561  O   ALA A  98      33.282   6.486   4.843  1.00  0.00           O  \nATOM   1562  CB  ALA A  98      34.534   4.178   2.999  1.00  0.00           C  \nATOM   1563  H   ALA A  98      34.376   2.285   4.828  1.00  0.00           H  \nATOM   1564  HA  ALA A  98      35.253   4.924   4.777  1.00  0.00           H  \nATOM   1565  HB1 ALA A  98      34.532   5.060   2.528  1.00  0.00           H  \nATOM   1566  HB2 ALA A  98      35.380   3.688   2.786  1.00  0.00           H  \nATOM   1567  HB3 ALA A  98      33.750   3.637   2.696  1.00  0.00           H  \nATOM   1568  N   ALA A  99      32.101   4.608   5.100  1.00  0.00           N  \nATOM   1569  CA  ALA A  99      30.898   5.353   5.415  1.00  0.00           C  \nATOM   1570  C   ALA A  99      31.052   6.053   6.740  1.00  0.00           C  \nATOM   1571  O   ALA A  99      30.592   7.176   6.901  1.00  0.00           O  \nATOM   1572  CB  ALA A  99      29.640   4.458   5.457  1.00  0.00           C  \nATOM   1573  H   ALA A  99      32.083   3.608   5.076  1.00  0.00           H  \nATOM   1574  HA  ALA A  99      30.765   6.047   4.708  1.00  0.00           H  \nATOM   1575  HB1 ALA A  99      28.841   5.017   5.677  1.00  0.00           H  \nATOM   1576  HB2 ALA A  99      29.509   4.025   4.565  1.00  0.00           H  \nATOM   1577  HB3 ALA A  99      29.756   3.752   6.156  1.00  0.00           H  \nATOM   1578  N   ILE A 100      31.672   5.376   7.707  1.00  0.00           N  \nATOM   1579  CA  ILE A 100      31.840   5.934   9.034  1.00  0.00           C  \nATOM   1580  C   ILE A 100      32.738   7.167   8.951  1.00  0.00           C  \nATOM   1581  O   ILE A 100      32.552   8.234   9.585  1.00  0.00           O  \nATOM   1582  CB  ILE A 100      32.367   4.895  10.034  1.00  0.00           C  \nATOM   1583  CG1 ILE A 100      31.313   3.805  10.296  1.00  0.00           C  \nATOM   1584  CG2 ILE A 100      32.741   5.583  11.328  1.00  0.00           C  \nATOM   1585  CD1 ILE A 100      31.874   2.553  11.013  1.00  0.00           C  \nATOM   1586  H   ILE A 100      32.029   4.463   7.512  1.00  0.00           H  \nATOM   1587  HA  ILE A 100      30.941   6.234   9.353  1.00  0.00           H  \nATOM   1588  HB  ILE A 100      33.185   4.466   9.650  1.00  0.00           H  \nATOM   1589 HG12 ILE A 100      30.929   3.520   9.418  1.00  0.00           H  \nATOM   1590 HG13 ILE A 100      30.589   4.196  10.865  1.00  0.00           H  \nATOM   1591 HG21 ILE A 100      33.084   4.906  11.979  1.00  0.00           H  \nATOM   1592 HG22 ILE A 100      33.451   6.264  11.150  1.00  0.00           H  \nATOM   1593 HG23 ILE A 100      31.935   6.034  11.711  1.00  0.00           H  \nATOM   1594 HD11 ILE A 100      31.138   1.890  11.150  1.00  0.00           H  \nATOM   1595 HD12 ILE A 100      32.593   2.142  10.452  1.00  0.00           H  \nATOM   1596 HD13 ILE A 100      32.253   2.818  11.899  1.00  0.00           H  \nATOM   1597  N   ASN A 101      33.743   7.045   8.112  1.00  0.00           N  \nATOM   1598  CA  ASN A 101      34.706   8.119   7.921  1.00  0.00           C  \nATOM   1599  C   ASN A 101      34.010   9.384   7.430  1.00  0.00           C  \nATOM   1600  O   ASN A 101      34.209  10.460   7.965  1.00  0.00           O  \nATOM   1601  CB  ASN A 101      35.764   7.638   6.932  1.00  0.00           C  \nATOM   1602  CG  ASN A 101      36.971   8.530   6.884  1.00  0.00           C  \nATOM   1603  ND2 ASN A 101      38.165   7.941   6.872  1.00  0.00           N  \nATOM   1604  OD1 ASN A 101      36.847   9.751   6.798  1.00  0.00           O  \nATOM   1605  H   ASN A 101      33.848   6.196   7.594  1.00  0.00           H  \nATOM   1606  HA  ASN A 101      35.149   8.314   8.796  1.00  0.00           H  \nATOM   1607  HB2 ASN A 101      35.356   7.605   6.020  1.00  0.00           H  \nATOM   1608  HB3 ASN A 101      36.057   6.720   7.200  1.00  0.00           H  \nATOM   1609 HD21 ASN A 101      38.232   6.946   6.944  1.00  0.00           H  \nATOM   1610 HD22 ASN A 101      38.994   8.494   6.791  1.00  0.00           H  \nATOM   1611  N   MET A 102      33.190   9.257   6.420  1.00  0.00           N  \nATOM   1612  CA  MET A 102      32.474  10.415   5.916  1.00  0.00           C  \nATOM   1613  C   MET A 102      31.633  11.070   7.011  1.00  0.00           C  \nATOM   1614  O   MET A 102      31.610  12.293   7.155  1.00  0.00           O  \nATOM   1615  CB  MET A 102      31.501  10.039   4.768  1.00  0.00           C  \nATOM   1616  CG  MET A 102      32.183   9.785   3.444  1.00  0.00           C  \nATOM   1617  SD  MET A 102      30.998   9.529   2.120  1.00  0.00           S  \nATOM   1618  CE  MET A 102      30.629  11.259   1.758  1.00  0.00           C  \nATOM   1619  H   MET A 102      33.056   8.362   5.994  1.00  0.00           H  \nATOM   1620  HA  MET A 102      33.136  11.082   5.574  1.00  0.00           H  \nATOM   1621  HB2 MET A 102      30.851  10.789   4.648  1.00  0.00           H  \nATOM   1622  HB3 MET A 102      31.008   9.210   5.032  1.00  0.00           H  \nATOM   1623  HG2 MET A 102      32.757   8.970   3.527  1.00  0.00           H  \nATOM   1624  HG3 MET A 102      32.755  10.574   3.218  1.00  0.00           H  \nATOM   1625  HE1 MET A 102      29.960  11.309   1.016  1.00  0.00           H  \nATOM   1626  HE2 MET A 102      30.254  11.698   2.575  1.00  0.00           H  \nATOM   1627  HE3 MET A 102      31.468  11.728   1.483  1.00  0.00           H  \nATOM   1628  N   VAL A 103      30.900  10.255   7.762  1.00  0.00           N  \nATOM   1629  CA  VAL A 103      30.038  10.804   8.794  1.00  0.00           C  \nATOM   1630  C   VAL A 103      30.869  11.459   9.874  1.00  0.00           C  \nATOM   1631  O   VAL A 103      30.513  12.510  10.349  1.00  0.00           O  \nATOM   1632  CB  VAL A 103      29.055   9.794   9.385  1.00  0.00           C  \nATOM   1633  CG1 VAL A 103      28.318  10.422  10.550  1.00  0.00           C  \nATOM   1634  CG2 VAL A 103      28.030   9.391   8.338  1.00  0.00           C  \nATOM   1635  H   VAL A 103      30.942   9.266   7.617  1.00  0.00           H  \nATOM   1636  HA  VAL A 103      29.494  11.526   8.366  1.00  0.00           H  \nATOM   1637  HB  VAL A 103      29.552   8.985   9.698  1.00  0.00           H  \nATOM   1638 HG11 VAL A 103      27.676   9.759  10.935  1.00  0.00           H  \nATOM   1639 HG12 VAL A 103      28.976  10.695  11.252  1.00  0.00           H  \nATOM   1640 HG13 VAL A 103      27.816  11.227  10.232  1.00  0.00           H  \nATOM   1641 HG21 VAL A 103      27.392   8.731   8.733  1.00  0.00           H  \nATOM   1642 HG22 VAL A 103      27.527  10.200   8.035  1.00  0.00           H  \nATOM   1643 HG23 VAL A 103      28.497   8.977   7.557  1.00  0.00           H  \nATOM   1644  N   PHE A 104      31.986  10.848  10.262  1.00  0.00           N  \nATOM   1645  CA  PHE A 104      32.827  11.414  11.298  1.00  0.00           C  \nATOM   1646  C   PHE A 104      33.308  12.812  10.903  1.00  0.00           C  \nATOM   1647  O   PHE A 104      33.453  13.709  11.707  1.00  0.00           O  \nATOM   1648  CB  PHE A 104      34.059  10.524  11.469  1.00  0.00           C  \nATOM   1649  CG  PHE A 104      34.990  10.953  12.576  1.00  0.00           C  \nATOM   1650  CD1 PHE A 104      35.940  11.947  12.361  1.00  0.00           C  \nATOM   1651  CD2 PHE A 104      34.971  10.306  13.811  1.00  0.00           C  \nATOM   1652  CE1 PHE A 104      36.815  12.302  13.390  1.00  0.00           C  \nATOM   1653  CE2 PHE A 104      35.857  10.623  14.838  1.00  0.00           C  \nATOM   1654  CZ  PHE A 104      36.786  11.639  14.619  1.00  0.00           C  \nATOM   1655  H   PHE A 104      32.249   9.985   9.832  1.00  0.00           H  \nATOM   1656  HA  PHE A 104      32.320  11.460  12.159  1.00  0.00           H  \nATOM   1657  HB2 PHE A 104      34.571  10.530  10.610  1.00  0.00           H  \nATOM   1658  HB3 PHE A 104      33.748   9.594  11.665  1.00  0.00           H  \nATOM   1659  HD1 PHE A 104      35.996  12.405  11.474  1.00  0.00           H  \nATOM   1660  HD2 PHE A 104      34.295   9.586  13.966  1.00  0.00           H  \nATOM   1661  HE1 PHE A 104      37.472  13.042  13.245  1.00  0.00           H  \nATOM   1662  HE2 PHE A 104      35.827  10.134  15.710  1.00  0.00           H  \nATOM   1663  HZ  PHE A 104      37.430  11.893  15.340  1.00  0.00           H  \nATOM   1664  N   GLN A 105      33.591  12.977   9.619  1.00  0.00           N  \nATOM   1665  CA  GLN A 105      34.097  14.217   9.046  1.00  0.00           C  \nATOM   1666  C   GLN A 105      33.034  15.250   8.790  1.00  0.00           C  \nATOM   1667  O   GLN A 105      33.246  16.420   9.049  1.00  0.00           O  \nATOM   1668  CB  GLN A 105      34.902  14.018   7.685  1.00  0.00           C  \nATOM   1669  CG  GLN A 105      35.545  15.311   7.084  1.00  0.00           C  \nATOM   1670  CD  GLN A 105      36.150  15.199   5.669  1.00  0.00           C  \nATOM   1671  NE2 GLN A 105      36.785  16.268   5.142  1.00  0.00           N  \nATOM   1672  OE1 GLN A 105      36.100  14.154   5.055  1.00  0.00           O  \nATOM   1673  H   GLN A 105      33.448  12.201   9.004  1.00  0.00           H  \nATOM   1674  HA  GLN A 105      34.734  14.609   9.710  1.00  0.00           H  \nATOM   1675  HB2 GLN A 105      34.270  13.644   7.006  1.00  0.00           H  \nATOM   1676  HB3 GLN A 105      35.636  13.360   7.855  1.00  0.00           H  \nATOM   1677  HG2 GLN A 105      36.276  15.600   7.703  1.00  0.00           H  \nATOM   1678  HG3 GLN A 105      34.835  16.015   7.054  1.00  0.00           H  \nATOM   1679 HE21 GLN A 105      36.824  17.128   5.651  1.00  0.00           H  \nATOM   1680 HE22 GLN A 105      37.216  16.200   4.242  1.00  0.00           H  \nATOM   1681  N   MET A 106      31.938  14.835   8.201  1.00  0.00           N  \nATOM   1682  CA  MET A 106      30.974  15.806   7.799  1.00  0.00           C  \nATOM   1683  C   MET A 106      29.629  15.797   8.444  1.00  0.00           C  \nATOM   1684  O   MET A 106      28.803  16.625   8.138  1.00  0.00           O  \nATOM   1685  CB  MET A 106      30.965  15.956   6.253  1.00  0.00           C  \nATOM   1686  CG  MET A 106      30.249  14.948   5.414  1.00  0.00           C  \nATOM   1687  SD  MET A 106      30.720  15.242   3.680  1.00  0.00           S  \nATOM   1688  CE  MET A 106      32.208  14.282   3.569  1.00  0.00           C  \nATOM   1689  H   MET A 106      31.782  13.861   8.038  1.00  0.00           H  \nATOM   1690  HA  MET A 106      31.373  16.668   8.111  1.00  0.00           H  \nATOM   1691  HB2 MET A 106      31.920  15.954   5.956  1.00  0.00           H  \nATOM   1692  HB3 MET A 106      30.555  16.845   6.051  1.00  0.00           H  \nATOM   1693  HG2 MET A 106      29.261  15.055   5.522  1.00  0.00           H  \nATOM   1694  HG3 MET A 106      30.516  14.024   5.688  1.00  0.00           H  \nATOM   1695  HE1 MET A 106      32.584  14.355   2.645  1.00  0.00           H  \nATOM   1696  HE2 MET A 106      32.876  14.626   4.229  1.00  0.00           H  \nATOM   1697  HE3 MET A 106      32.003  13.324   3.771  1.00  0.00           H  \nATOM   1698  N   GLY A 107      29.426  14.898   9.360  1.00  0.00           N  \nATOM   1699  CA  GLY A 107      28.171  14.908  10.002  1.00  0.00           C  \nATOM   1700  C   GLY A 107      27.167  14.191   9.173  1.00  0.00           C  \nATOM   1701  O   GLY A 107      27.213  14.077   7.947  1.00  0.00           O  \nATOM   1702  H   GLY A 107      30.129  14.228   9.599  1.00  0.00           H  \nATOM   1703  HA2 GLY A 107      27.875  15.854  10.135  1.00  0.00           H  \nATOM   1704  HA3 GLY A 107      28.250  14.455  10.890  1.00  0.00           H  \nATOM   1705  N   GLU A 108      26.229  13.752   9.922  1.00  0.00           N  \nATOM   1706  CA  GLU A 108      25.194  12.972   9.395  1.00  0.00           C  \nATOM   1707  C   GLU A 108      24.294  13.728   8.464  1.00  0.00           C  \nATOM   1708  O   GLU A 108      23.773  13.176   7.517  1.00  0.00           O  \nATOM   1709  CB  GLU A 108      24.504  12.291  10.559  1.00  0.00           C  \nATOM   1710  CG  GLU A 108      23.014  12.550  10.613  1.00  0.00           C  \nATOM   1711  CD  GLU A 108      22.389  11.387  11.297  1.00  0.00           C  \nATOM   1712  OE1 GLU A 108      23.273  10.455  11.551  1.00  0.00           O  \nATOM   1713  OE2 GLU A 108      21.211  11.320  11.559  1.00  0.00           O1-\nATOM   1714  H   GLU A 108      26.235  13.969  10.898  1.00  0.00           H  \nATOM   1715  HA  GLU A 108      25.625  12.250   8.854  1.00  0.00           H  \nATOM   1716  HB2 GLU A 108      24.914  12.623  11.408  1.00  0.00           H  \nATOM   1717  HB3 GLU A 108      24.651  11.305  10.481  1.00  0.00           H  \nATOM   1718  HG2 GLU A 108      22.648  12.640   9.687  1.00  0.00           H  \nATOM   1719  HG3 GLU A 108      22.831  13.388  11.126  1.00  0.00           H  \nATOM   1720  N   THR A 109      24.136  15.006   8.712  1.00  0.00           N  \nATOM   1721  CA  THR A 109      23.311  15.770   7.809  1.00  0.00           C  \nATOM   1722  C   THR A 109      24.041  15.885   6.502  1.00  0.00           C  \nATOM   1723  O   THR A 109      23.473  15.600   5.441  1.00  0.00           O  \nATOM   1724  CB  THR A 109      22.983  17.158   8.357  1.00  0.00           C  \nATOM   1725  CG2 THR A 109      22.191  17.949   7.329  1.00  0.00           C  \nATOM   1726  OG1 THR A 109      22.213  17.003   9.511  1.00  0.00           O  \nATOM   1727  H   THR A 109      24.573  15.437   9.501  1.00  0.00           H  \nATOM   1728  HA  THR A 109      22.456  15.274   7.657  1.00  0.00           H  \nATOM   1729  HB  THR A 109      23.829  17.643   8.578  1.00  0.00           H  \nATOM   1730  HG1 THR A 109      21.988  17.903   9.885  1.00  0.00           H  \nATOM   1731 HG21 THR A 109      21.981  18.855   7.696  1.00  0.00           H  \nATOM   1732 HG22 THR A 109      22.732  18.045   6.493  1.00  0.00           H  \nATOM   1733 HG23 THR A 109      21.339  17.467   7.122  1.00  0.00           H  \nATOM   1734  N   GLY A 110      25.303  16.316   6.628  1.00  0.00           N  \nATOM   1735  CA  GLY A 110      26.186  16.471   5.507  1.00  0.00           C  \nATOM   1736  C   GLY A 110      26.097  15.287   4.577  1.00  0.00           C  \nATOM   1737  O   GLY A 110      25.734  15.440   3.423  1.00  0.00           O  \nATOM   1738  H   GLY A 110      25.644  16.539   7.541  1.00  0.00           H  \nATOM   1739  HA2 GLY A 110      27.125  16.555   5.840  1.00  0.00           H  \nATOM   1740  HA3 GLY A 110      25.935  17.299   5.006  1.00  0.00           H  \nATOM   1741  N   VAL A 111      26.357  14.096   5.097  1.00  0.00           N  \nATOM   1742  CA  VAL A 111      26.308  12.899   4.265  1.00  0.00           C  \nATOM   1743  C   VAL A 111      24.964  12.621   3.636  1.00  0.00           C  \nATOM   1744  O   VAL A 111      24.859  12.272   2.446  1.00  0.00           O  \nATOM   1745  CB  VAL A 111      26.728  11.717   5.092  1.00  0.00           C  \nATOM   1746  CG1 VAL A 111      26.831  10.501   4.171  1.00  0.00           C  \nATOM   1747  CG2 VAL A 111      28.094  12.024   5.661  1.00  0.00           C  \nATOM   1748  H   VAL A 111      26.588  14.017   6.067  1.00  0.00           H  \nATOM   1749  HA  VAL A 111      26.975  13.010   3.528  1.00  0.00           H  \nATOM   1750  HB  VAL A 111      26.070  11.549   5.826  1.00  0.00           H  \nATOM   1751 HG11 VAL A 111      27.110   9.702   4.704  1.00  0.00           H  \nATOM   1752 HG12 VAL A 111      25.941  10.326   3.749  1.00  0.00           H  \nATOM   1753 HG13 VAL A 111      27.509  10.679   3.458  1.00  0.00           H  \nATOM   1754 HG21 VAL A 111      28.403  11.254   6.219  1.00  0.00           H  \nATOM   1755 HG22 VAL A 111      28.740  12.175   4.913  1.00  0.00           H  \nATOM   1756 HG23 VAL A 111      28.042  12.846   6.228  1.00  0.00           H  \nATOM   1757  N   ALA A 112      23.963  12.764   4.509  1.00  0.00           N  \nATOM   1758  CA  ALA A 112      22.585  12.549   4.177  1.00  0.00           C  \nATOM   1759  C   ALA A 112      22.174  13.272   2.886  1.00  0.00           C  \nATOM   1760  O   ALA A 112      21.330  12.788   2.133  1.00  0.00           O  \nATOM   1761  CB  ALA A 112      21.684  12.704   5.383  1.00  0.00           C  \nATOM   1762  H   ALA A 112      24.187  13.036   5.445  1.00  0.00           H  \nATOM   1763  HA  ALA A 112      22.531  11.577   3.948  1.00  0.00           H  \nATOM   1764  HB1 ALA A 112      20.734  12.547   5.112  1.00  0.00           H  \nATOM   1765  HB2 ALA A 112      21.945  12.039   6.082  1.00  0.00           H  \nATOM   1766  HB3 ALA A 112      21.777  13.629   5.752  1.00  0.00           H  \nATOM   1767  N   GLY A 113      22.817  14.414   2.584  1.00  0.00           N  \nATOM   1768  CA  GLY A 113      22.562  15.168   1.337  1.00  0.00           C  \nATOM   1769  C   GLY A 113      23.180  14.581   0.055  1.00  0.00           C  \nATOM   1770  O   GLY A 113      23.081  15.143  -1.047  1.00  0.00           O  \nATOM   1771  H   GLY A 113      23.495  14.768   3.228  1.00  0.00           H  \nATOM   1772  HA2 GLY A 113      22.927  16.091   1.458  1.00  0.00           H  \nATOM   1773  HA3 GLY A 113      21.572  15.216   1.205  1.00  0.00           H  \nATOM   1774  N   PHE A 114      23.995  13.532   0.164  1.00  0.00           N  \nATOM   1775  CA  PHE A 114      24.597  12.897  -0.987  1.00  0.00           C  \nATOM   1776  C   PHE A 114      23.680  11.810  -1.523  1.00  0.00           C  \nATOM   1777  O   PHE A 114      24.096  10.705  -1.810  1.00  0.00           O  \nATOM   1778  CB  PHE A 114      25.859  12.201  -0.532  1.00  0.00           C  \nATOM   1779  CG  PHE A 114      27.048  13.118  -0.410  1.00  0.00           C  \nATOM   1780  CD1 PHE A 114      27.038  14.220   0.450  1.00  0.00           C  \nATOM   1781  CD2 PHE A 114      28.190  12.875  -1.169  1.00  0.00           C  \nATOM   1782  CE1 PHE A 114      28.143  15.066   0.554  1.00  0.00           C  \nATOM   1783  CE2 PHE A 114      29.297  13.718  -1.090  1.00  0.00           C  \nATOM   1784  CZ  PHE A 114      29.279  14.807  -0.210  1.00  0.00           C  \nATOM   1785  H   PHE A 114      24.197  13.171   1.074  1.00  0.00           H  \nATOM   1786  HA  PHE A 114      24.801  13.571  -1.697  1.00  0.00           H  \nATOM   1787  HB2 PHE A 114      26.080  11.484  -1.193  1.00  0.00           H  \nATOM   1788  HB3 PHE A 114      25.686  11.788   0.362  1.00  0.00           H  \nATOM   1789  HD1 PHE A 114      26.224  14.406   1.001  1.00  0.00           H  \nATOM   1790  HD2 PHE A 114      28.216  12.084  -1.780  1.00  0.00           H  \nATOM   1791  HE1 PHE A 114      28.120  15.852   1.172  1.00  0.00           H  \nATOM   1792  HE2 PHE A 114      30.101  13.546  -1.659  1.00  0.00           H  \nATOM   1793  HZ  PHE A 114      30.081  15.399  -0.130  1.00  0.00           H  \nATOM   1794  N   THR A 115      22.425  12.135  -1.608  1.00  0.00           N  \nATOM   1795  CA  THR A 115      21.377  11.253  -2.029  1.00  0.00           C  \nATOM   1796  C   THR A 115      21.708  10.398  -3.199  1.00  0.00           C  \nATOM   1797  O   THR A 115      21.553   9.198  -3.138  1.00  0.00           O  \nATOM   1798  CB  THR A 115      20.161  12.081  -2.431  1.00  0.00           C  \nATOM   1799  CG2 THR A 115      19.008  11.149  -2.788  1.00  0.00           C  \nATOM   1800  OG1 THR A 115      19.804  12.910  -1.382  1.00  0.00           O  \nATOM   1801  H   THR A 115      22.171  13.070  -1.361  1.00  0.00           H  \nATOM   1802  HA  THR A 115      21.125  10.664  -1.261  1.00  0.00           H  \nATOM   1803  HB  THR A 115      20.392  12.639  -3.228  1.00  0.00           H  \nATOM   1804  HG1 THR A 115      19.581  12.356  -0.580  1.00  0.00           H  \nATOM   1805 HG21 THR A 115      18.210  11.691  -3.052  1.00  0.00           H  \nATOM   1806 HG22 THR A 115      19.278  10.561  -3.551  1.00  0.00           H  \nATOM   1807 HG23 THR A 115      18.779  10.583  -1.996  1.00  0.00           H  \nATOM   1808  N   ASN A 116      22.097  11.033  -4.290  1.00  0.00           N  \nATOM   1809  CA  ASN A 116      22.437  10.262  -5.487  1.00  0.00           C  \nATOM   1810  C   ASN A 116      23.567   9.243  -5.317  1.00  0.00           C  \nATOM   1811  O   ASN A 116      23.509   8.116  -5.796  1.00  0.00           O  \nATOM   1812  CB  ASN A 116      22.662  11.135  -6.745  1.00  0.00           C  \nATOM   1813  CG  ASN A 116      21.484  12.062  -6.992  1.00  0.00           C  \nATOM   1814  ND2 ASN A 116      21.771  13.310  -7.345  1.00  0.00           N  \nATOM   1815  OD1 ASN A 116      20.321  11.676  -6.853  1.00  0.00           O  \nATOM   1816  H   ASN A 116      22.159  12.031  -4.298  1.00  0.00           H  \nATOM   1817  HA  ASN A 116      21.622   9.718  -5.688  1.00  0.00           H  \nATOM   1818  HB2 ASN A 116      22.779  10.538  -7.539  1.00  0.00           H  \nATOM   1819  HB3 ASN A 116      23.488  11.685  -6.617  1.00  0.00           H  \nATOM   1820 HD21 ASN A 116      22.724  13.593  -7.450  1.00  0.00           H  \nATOM   1821 HD22 ASN A 116      21.034  13.966  -7.506  1.00  0.00           H  \nATOM   1822  N   SER A 117      24.651   9.648  -4.641  1.00  0.00           N  \nATOM   1823  CA  SER A 117      25.762   8.725  -4.415  1.00  0.00           C  \nATOM   1824  C   SER A 117      25.289   7.572  -3.536  1.00  0.00           C  \nATOM   1825  O   SER A 117      25.709   6.442  -3.723  1.00  0.00           O  \nATOM   1826  CB  SER A 117      26.918   9.386  -3.675  1.00  0.00           C  \nATOM   1827  OG  SER A 117      27.319  10.605  -4.289  1.00  0.00           O  \nATOM   1828  H   SER A 117      24.700  10.583  -4.291  1.00  0.00           H  \nATOM   1829  HA  SER A 117      26.085   8.368  -5.291  1.00  0.00           H  \nATOM   1830  HB2 SER A 117      27.696   8.758  -3.666  1.00  0.00           H  \nATOM   1831  HB3 SER A 117      26.633   9.577  -2.736  1.00  0.00           H  \nATOM   1832  HG  SER A 117      26.749  10.777  -5.092  1.00  0.00           H  \nATOM   1833  N   LEU A 118      24.455   7.904  -2.537  1.00  0.00           N  \nATOM   1834  CA  LEU A 118      23.915   6.932  -1.603  1.00  0.00           C  \nATOM   1835  C   LEU A 118      23.157   5.816  -2.353  1.00  0.00           C  \nATOM   1836  O   LEU A 118      23.346   4.623  -2.123  1.00  0.00           O  \nATOM   1837  CB  LEU A 118      23.055   7.570  -0.462  1.00  0.00           C  \nATOM   1838  CG  LEU A 118      23.805   8.477   0.545  1.00  0.00           C  \nATOM   1839  CD1 LEU A 118      22.820   9.096   1.552  1.00  0.00           C  \nATOM   1840  CD2 LEU A 118      24.871   7.716   1.305  1.00  0.00           C  \nATOM   1841  H   LEU A 118      24.194   8.864  -2.432  1.00  0.00           H  \nATOM   1842  HA  LEU A 118      24.699   6.496  -1.160  1.00  0.00           H  \nATOM   1843  HB2 LEU A 118      22.635   6.824   0.055  1.00  0.00           H  \nATOM   1844  HB3 LEU A 118      22.340   8.121  -0.892  1.00  0.00           H  \nATOM   1845  HG  LEU A 118      24.246   9.217   0.037  1.00  0.00           H  \nATOM   1846 HD11 LEU A 118      23.320   9.677   2.193  1.00  0.00           H  \nATOM   1847 HD12 LEU A 118      22.144   9.646   1.062  1.00  0.00           H  \nATOM   1848 HD13 LEU A 118      22.356   8.367   2.055  1.00  0.00           H  \nATOM   1849 HD21 LEU A 118      25.331   8.334   1.943  1.00  0.00           H  \nATOM   1850 HD22 LEU A 118      24.447   6.967   1.814  1.00  0.00           H  \nATOM   1851 HD23 LEU A 118      25.539   7.345   0.660  1.00  0.00           H  \nATOM   1852  N   ARG A 119      22.328   6.218  -3.268  1.00  0.00           N  \nATOM   1853  CA  ARG A 119      21.559   5.277  -4.064  1.00  0.00           C  \nATOM   1854  C   ARG A 119      22.499   4.404  -4.862  1.00  0.00           C  \nATOM   1855  O   ARG A 119      22.321   3.185  -4.994  1.00  0.00           O  \nATOM   1856  CB  ARG A 119      20.652   6.054  -5.001  1.00  0.00           C  \nATOM   1857  CG  ARG A 119      19.692   5.215  -5.805  1.00  0.00           C  \nATOM   1858  CD  ARG A 119      18.812   6.103  -6.691  1.00  0.00           C  \nATOM   1859  NE  ARG A 119      19.436   6.395  -7.989  1.00  0.00           N  \nATOM   1860  CZ  ARG A 119      20.063   7.534  -8.323  1.00  0.00           C  \nATOM   1861  NH1 ARG A 119      20.176   8.571  -7.491  1.00  0.00           N1+\nATOM   1862  NH2 ARG A 119      20.590   7.621  -9.552  1.00  0.00           N  \nATOM   1863  H   ARG A 119      22.216   7.199  -3.429  1.00  0.00           H  \nATOM   1864  HA  ARG A 119      21.004   4.705  -3.460  1.00  0.00           H  \nATOM   1865  HB2 ARG A 119      21.229   6.562  -5.640  1.00  0.00           H  \nATOM   1866  HB3 ARG A 119      20.117   6.696  -4.452  1.00  0.00           H  \nATOM   1867  HG2 ARG A 119      19.110   4.693  -5.182  1.00  0.00           H  \nATOM   1868  HG3 ARG A 119      20.211   4.585  -6.383  1.00  0.00           H  \nATOM   1869  HD2 ARG A 119      18.644   6.966  -6.214  1.00  0.00           H  \nATOM   1870  HD3 ARG A 119      17.942   5.636  -6.851  1.00  0.00           H  \nATOM   1871  HE  ARG A 119      19.389   5.680  -8.687  1.00  0.00           H  \nATOM   1872 HH11 ARG A 119      20.653   9.399  -7.786  1.00  0.00           H  \nATOM   1873 HH12 ARG A 119      19.784   8.520  -6.573  1.00  0.00           H  \nATOM   1874 HH21 ARG A 119      21.064   8.455  -9.835  1.00  0.00           H  \nATOM   1875 HH22 ARG A 119      20.509   6.852 -10.186  1.00  0.00           H  \nATOM   1876  N   MET A 120      23.540   5.042  -5.402  1.00  0.00           N  \nATOM   1877  CA  MET A 120      24.487   4.278  -6.166  1.00  0.00           C  \nATOM   1878  C   MET A 120      25.257   3.292  -5.298  1.00  0.00           C  \nATOM   1879  O   MET A 120      25.527   2.163  -5.684  1.00  0.00           O  \nATOM   1880  CB  MET A 120      25.459   5.106  -7.024  1.00  0.00           C  \nATOM   1881  CG  MET A 120      24.814   5.829  -8.186  1.00  0.00           C  \nATOM   1882  SD  MET A 120      25.972   7.091  -8.810  1.00  0.00           S  \nATOM   1883  CE  MET A 120      24.874   8.392  -9.376  1.00  0.00           C  \nATOM   1884  H   MET A 120      23.658   6.027  -5.278  1.00  0.00           H  \nATOM   1885  HA  MET A 120      23.950   3.727  -6.805  1.00  0.00           H  \nATOM   1886  HB2 MET A 120      26.156   4.489  -7.389  1.00  0.00           H  \nATOM   1887  HB3 MET A 120      25.893   5.788  -6.434  1.00  0.00           H  \nATOM   1888  HG2 MET A 120      23.970   6.269  -7.881  1.00  0.00           H  \nATOM   1889  HG3 MET A 120      24.605   5.176  -8.914  1.00  0.00           H  \nATOM   1890  HE1 MET A 120      25.415   9.148  -9.745  1.00  0.00           H  \nATOM   1891  HE2 MET A 120      24.272   8.033 -10.090  1.00  0.00           H  \nATOM   1892  HE3 MET A 120      24.322   8.720  -8.609  1.00  0.00           H  \nATOM   1893  N   LEU A 121      25.609   3.678  -4.115  1.00  0.00           N  \nATOM   1894  CA  LEU A 121      26.303   2.724  -3.301  1.00  0.00           C  \nATOM   1895  C   LEU A 121      25.384   1.542  -2.982  1.00  0.00           C  \nATOM   1896  O   LEU A 121      25.783   0.380  -3.045  1.00  0.00           O  \nATOM   1897  CB  LEU A 121      26.813   3.389  -2.014  1.00  0.00           C  \nATOM   1898  CG  LEU A 121      27.977   4.377  -2.250  1.00  0.00           C  \nATOM   1899  CD1 LEU A 121      28.199   5.235  -0.997  1.00  0.00           C  \nATOM   1900  CD2 LEU A 121      29.275   3.619  -2.520  1.00  0.00           C  \nATOM   1901  H   LEU A 121      25.406   4.599  -3.783  1.00  0.00           H  \nATOM   1902  HA  LEU A 121      27.090   2.383  -3.815  1.00  0.00           H  \nATOM   1903  HB2 LEU A 121      27.127   2.673  -1.391  1.00  0.00           H  \nATOM   1904  HB3 LEU A 121      26.055   3.888  -1.594  1.00  0.00           H  \nATOM   1905  HG  LEU A 121      27.764   4.967  -3.029  1.00  0.00           H  \nATOM   1906 HD11 LEU A 121      28.953   5.871  -1.158  1.00  0.00           H  \nATOM   1907 HD12 LEU A 121      27.366   5.750  -0.794  1.00  0.00           H  \nATOM   1908 HD13 LEU A 121      28.422   4.643  -0.223  1.00  0.00           H  \nATOM   1909 HD21 LEU A 121      30.017   4.272  -2.670  1.00  0.00           H  \nATOM   1910 HD22 LEU A 121      29.493   3.041  -1.733  1.00  0.00           H  \nATOM   1911 HD23 LEU A 121      29.164   3.047  -3.333  1.00  0.00           H  \nATOM   1912  N   GLN A 122      24.141   1.872  -2.662  1.00  0.00           N  \nATOM   1913  CA  GLN A 122      23.218   0.843  -2.309  1.00  0.00           C  \nATOM   1914  C   GLN A 122      23.031  -0.161  -3.436  1.00  0.00           C  \nATOM   1915  O   GLN A 122      22.839  -1.359  -3.222  1.00  0.00           O  \nATOM   1916  CB  GLN A 122      21.906   1.412  -1.823  1.00  0.00           C  \nATOM   1917  CG  GLN A 122      20.878   0.291  -1.655  1.00  0.00           C  \nATOM   1918  CD  GLN A 122      19.752   0.635  -0.715  1.00  0.00           C  \nATOM   1919  NE2 GLN A 122      19.106  -0.400  -0.165  1.00  0.00           N  \nATOM   1920  OE1 GLN A 122      19.462   1.817  -0.494  1.00  0.00           O  \nATOM   1921  H   GLN A 122      23.854   2.830  -2.668  1.00  0.00           H  \nATOM   1922  HA  GLN A 122      23.620   0.345  -1.541  1.00  0.00           H  \nATOM   1923  HB2 GLN A 122      21.566   2.076  -2.489  1.00  0.00           H  \nATOM   1924  HB3 GLN A 122      22.048   1.866  -0.943  1.00  0.00           H  \nATOM   1925  HG2 GLN A 122      21.348  -0.518  -1.301  1.00  0.00           H  \nATOM   1926  HG3 GLN A 122      20.488   0.084  -2.552  1.00  0.00           H  \nATOM   1927 HE21 GLN A 122      19.385  -1.336  -0.381  1.00  0.00           H  \nATOM   1928 HE22 GLN A 122      18.344  -0.238   0.462  1.00  0.00           H  \nATOM   1929  N   GLN A 123      23.122   0.323  -4.655  1.00  0.00           N  \nATOM   1930  CA  GLN A 123      22.950  -0.563  -5.767  1.00  0.00           C  \nATOM   1931  C   GLN A 123      24.230  -1.222  -6.136  1.00  0.00           C  \nATOM   1932  O   GLN A 123      24.231  -1.960  -7.102  1.00  0.00           O  \nATOM   1933  CB  GLN A 123      22.496   0.186  -7.011  1.00  0.00           C  \nATOM   1934  CG  GLN A 123      21.113   0.864  -6.802  1.00  0.00           C  \nATOM   1935  CD  GLN A 123      20.695   1.603  -8.065  1.00  0.00           C  \nATOM   1936  NE2 GLN A 123      20.435   0.846  -9.129  1.00  0.00           N  \nATOM   1937  OE1 GLN A 123      20.631   2.827  -8.105  1.00  0.00           O  \nATOM   1938  H   GLN A 123      23.308   1.294  -4.803  1.00  0.00           H  \nATOM   1939  HA  GLN A 123      22.273  -1.261  -5.534  1.00  0.00           H  \nATOM   1940  HB2 GLN A 123      22.429  -0.460  -7.771  1.00  0.00           H  \nATOM   1941  HB3 GLN A 123      23.172   0.890  -7.230  1.00  0.00           H  \nATOM   1942  HG2 GLN A 123      21.174   1.513  -6.044  1.00  0.00           H  \nATOM   1943  HG3 GLN A 123      20.431   0.165  -6.587  1.00  0.00           H  \nATOM   1944 HE21 GLN A 123      20.497  -0.150  -9.062  1.00  0.00           H  \nATOM   1945 HE22 GLN A 123      20.179   1.273  -9.996  1.00  0.00           H  \nATOM   1946  N   LYS A 124      25.333  -0.904  -5.432  1.00  0.00           N  \nATOM   1947  CA  LYS A 124      26.642  -1.497  -5.741  1.00  0.00           C  \nATOM   1948  C   LYS A 124      27.236  -1.136  -7.086  1.00  0.00           C  \nATOM   1949  O   LYS A 124      28.038  -1.891  -7.662  1.00  0.00           O  \nATOM   1950  CB  LYS A 124      26.785  -3.007  -5.499  1.00  0.00           C  \nATOM   1951  CG  LYS A 124      26.150  -3.432  -4.194  1.00  0.00           C  \nATOM   1952  CD  LYS A 124      26.628  -4.764  -3.630  1.00  0.00           C  \nATOM   1953  CE  LYS A 124      26.056  -5.005  -2.249  1.00  0.00           C  \nATOM   1954  NZ  LYS A 124      26.723  -4.240  -1.184  1.00  0.00           N1+\nATOM   1955  H   LYS A 124      25.260  -0.248  -4.681  1.00  0.00           H  \nATOM   1956  HA  LYS A 124      27.264  -1.081  -5.077  1.00  0.00           H  \nATOM   1957  HB2 LYS A 124      27.757  -3.240  -5.476  1.00  0.00           H  \nATOM   1958  HB3 LYS A 124      26.342  -3.498  -6.249  1.00  0.00           H  \nATOM   1959  HG2 LYS A 124      25.163  -3.496  -4.339  1.00  0.00           H  \nATOM   1960  HG3 LYS A 124      26.341  -2.724  -3.514  1.00  0.00           H  \nATOM   1961  HD2 LYS A 124      27.626  -4.756  -3.574  1.00  0.00           H  \nATOM   1962  HD3 LYS A 124      26.335  -5.501  -4.239  1.00  0.00           H  \nATOM   1963  HE2 LYS A 124      26.142  -5.979  -2.038  1.00  0.00           H  \nATOM   1964  HE3 LYS A 124      25.089  -4.751  -2.260  1.00  0.00           H  \nATOM   1965  HZ1 LYS A 124      26.294  -4.449  -0.305  1.00  0.00           H  \nATOM   1966  HZ2 LYS A 124      27.691  -4.489  -1.150  1.00  0.00           H  \nATOM   1967  HZ3 LYS A 124      26.637  -3.262  -1.373  1.00  0.00           H  \nATOM   1968  N   ARG A 125      26.931   0.051  -7.551  1.00  0.00           N  \nATOM   1969  CA  ARG A 125      27.493   0.559  -8.783  1.00  0.00           C  \nATOM   1970  C   ARG A 125      28.727   1.370  -8.364  1.00  0.00           C  \nATOM   1971  O   ARG A 125      28.698   2.603  -8.244  1.00  0.00           O  \nATOM   1972  CB  ARG A 125      26.447   1.436  -9.447  1.00  0.00           C  \nATOM   1973  CG  ARG A 125      25.331   0.591 -10.060  1.00  0.00           C  \nATOM   1974  CD  ARG A 125      24.077   1.407 -10.257  1.00  0.00           C  \nATOM   1975  NE  ARG A 125      23.389   1.151 -11.525  1.00  0.00           N  \nATOM   1976  CZ  ARG A 125      22.437   0.236 -11.710  1.00  0.00           C  \nATOM   1977  NH1 ARG A 125      22.050  -0.621 -10.737  1.00  0.00           N1+\nATOM   1978  NH2 ARG A 125      21.903   0.089 -12.914  1.00  0.00           N  \nATOM   1979  H   ARG A 125      26.290   0.623  -7.038  1.00  0.00           H  \nATOM   1980  HA  ARG A 125      27.755  -0.194  -9.387  1.00  0.00           H  \nATOM   1981  HB2 ARG A 125      26.882   1.975 -10.168  1.00  0.00           H  \nATOM   1982  HB3 ARG A 125      26.054   2.050  -8.763  1.00  0.00           H  \nATOM   1983  HG2 ARG A 125      25.129  -0.176  -9.450  1.00  0.00           H  \nATOM   1984  HG3 ARG A 125      25.635   0.241 -10.946  1.00  0.00           H  \nATOM   1985  HD2 ARG A 125      24.324   2.375 -10.224  1.00  0.00           H  \nATOM   1986  HD3 ARG A 125      23.446   1.198  -9.510  1.00  0.00           H  \nATOM   1987  HE  ARG A 125      23.654   1.706 -12.313  1.00  0.00           H  \nATOM   1988 HH11 ARG A 125      21.331  -1.292 -10.919  1.00  0.00           H  \nATOM   1989 HH12 ARG A 125      22.483  -0.583  -9.836  1.00  0.00           H  \nATOM   1990 HH21 ARG A 125      21.188  -0.594 -13.064  1.00  0.00           H  \nATOM   1991 HH22 ARG A 125      22.215   0.661 -13.672  1.00  0.00           H  \nATOM   1992  N   TRP A 126      29.811   0.656  -8.115  1.00  0.00           N  \nATOM   1993  CA  TRP A 126      31.006   1.287  -7.578  1.00  0.00           C  \nATOM   1994  C   TRP A 126      31.698   2.391  -8.338  1.00  0.00           C  \nATOM   1995  O   TRP A 126      31.997   3.452  -7.791  1.00  0.00           O  \nATOM   1996  CB  TRP A 126      31.972   0.365  -6.884  1.00  0.00           C  \nATOM   1997  CG  TRP A 126      31.312  -0.804  -6.170  1.00  0.00           C  \nATOM   1998  CD1 TRP A 126      31.459  -2.091  -6.537  1.00  0.00           C  \nATOM   1999  CD2 TRP A 126      30.547  -0.799  -4.953  1.00  0.00           C  \nATOM   2000  CE2 TRP A 126      30.272  -2.151  -4.640  1.00  0.00           C  \nATOM   2001  CE3 TRP A 126      30.093   0.186  -4.059  1.00  0.00           C  \nATOM   2002  NE1 TRP A 126      30.849  -2.899  -5.641  1.00  0.00           N  \nATOM   2003  CZ2 TRP A 126      29.592  -2.521  -3.488  1.00  0.00           C  \nATOM   2004  CZ3 TRP A 126      29.371  -0.185  -2.949  1.00  0.00           C  \nATOM   2005  CH2 TRP A 126      29.121  -1.538  -2.661  1.00  0.00           C  \nATOM   2006  H   TRP A 126      29.809  -0.327  -8.298  1.00  0.00           H  \nATOM   2007  HA  TRP A 126      30.628   1.792  -6.802  1.00  0.00           H  \nATOM   2008  HB2 TRP A 126      32.484   0.897  -6.209  1.00  0.00           H  \nATOM   2009  HB3 TRP A 126      32.603  -0.001  -7.568  1.00  0.00           H  \nATOM   2010  HD1 TRP A 126      31.947  -2.403  -7.352  1.00  0.00           H  \nATOM   2011  HE1 TRP A 126      30.821  -3.897  -5.697  1.00  0.00           H  \nATOM   2012  HE3 TRP A 126      30.294   1.151  -4.229  1.00  0.00           H  \nATOM   2013  HZ2 TRP A 126      29.449  -3.486  -3.267  1.00  0.00           H  \nATOM   2014  HZ3 TRP A 126      29.017   0.521  -2.335  1.00  0.00           H  \nATOM   2015  HH2 TRP A 126      28.596  -1.784  -1.846  1.00  0.00           H  \nATOM   2016  N   ASP A 127      32.033   2.125  -9.566  1.00  0.00           N  \nATOM   2017  CA  ASP A 127      32.673   3.158 -10.326  1.00  0.00           C  \nATOM   2018  C   ASP A 127      31.775   4.365 -10.441  1.00  0.00           C  \nATOM   2019  O   ASP A 127      32.223   5.481 -10.293  1.00  0.00           O  \nATOM   2020  CB  ASP A 127      33.022   2.647 -11.709  1.00  0.00           C  \nATOM   2021  CG  ASP A 127      34.252   1.767 -11.655  1.00  0.00           C  \nATOM   2022  OD1 ASP A 127      34.591   1.122 -10.684  1.00  0.00           O  \nATOM   2023  OD2 ASP A 127      34.975   1.827 -12.747  1.00  0.00           O1-\nATOM   2024  H   ASP A 127      31.850   1.228  -9.968  1.00  0.00           H  \nATOM   2025  HA  ASP A 127      33.516   3.426  -9.859  1.00  0.00           H  \nATOM   2026  HB2 ASP A 127      33.200   3.425 -12.312  1.00  0.00           H  \nATOM   2027  HB3 ASP A 127      32.254   2.117 -12.067  1.00  0.00           H  \nATOM   2028  N   GLU A 128      30.485   4.147 -10.667  1.00  0.00           N  \nATOM   2029  CA  GLU A 128      29.597   5.285 -10.773  1.00  0.00           C  \nATOM   2030  C   GLU A 128      29.506   6.124  -9.527  1.00  0.00           C  \nATOM   2031  O   GLU A 128      29.475   7.348  -9.579  1.00  0.00           O  \nATOM   2032  CB  GLU A 128      28.218   4.853 -11.254  1.00  0.00           C  \nATOM   2033  CG  GLU A 128      28.393   4.177 -12.624  1.00  0.00           C  \nATOM   2034  CD  GLU A 128      27.200   3.402 -13.093  1.00  0.00           C  \nATOM   2035  OE1 GLU A 128      26.112   4.134 -13.170  1.00  0.00           O  \nATOM   2036  OE2 GLU A 128      27.257   2.230 -13.425  1.00  0.00           O1-\nATOM   2037  H   GLU A 128      30.134   3.215 -10.762  1.00  0.00           H  \nATOM   2038  HA  GLU A 128      29.975   5.875 -11.486  1.00  0.00           H  \nATOM   2039  HB2 GLU A 128      27.622   5.651 -11.341  1.00  0.00           H  \nATOM   2040  HB3 GLU A 128      27.817   4.207 -10.604  1.00  0.00           H  \nATOM   2041  HG2 GLU A 128      29.169   3.550 -12.565  1.00  0.00           H  \nATOM   2042  HG3 GLU A 128      28.589   4.888 -13.300  1.00  0.00           H  \nATOM   2043  N   ALA A 129      29.447   5.458  -8.406  1.00  0.00           N  \nATOM   2044  CA  ALA A 129      29.333   6.189  -7.175  1.00  0.00           C  \nATOM   2045  C   ALA A 129      30.585   7.018  -6.962  1.00  0.00           C  \nATOM   2046  O   ALA A 129      30.532   8.158  -6.530  1.00  0.00           O  \nATOM   2047  CB  ALA A 129      29.154   5.214  -6.016  1.00  0.00           C  \nATOM   2048  H   ALA A 129      29.481   4.459  -8.404  1.00  0.00           H  \nATOM   2049  HA  ALA A 129      28.539   6.795  -7.223  1.00  0.00           H  \nATOM   2050  HB1 ALA A 129      29.075   5.725  -5.160  1.00  0.00           H  \nATOM   2051  HB2 ALA A 129      28.325   4.674  -6.160  1.00  0.00           H  \nATOM   2052  HB3 ALA A 129      29.945   4.604  -5.968  1.00  0.00           H  \nATOM   2053  N   ALA A 130      31.719   6.422  -7.307  1.00  0.00           N  \nATOM   2054  CA  ALA A 130      33.001   7.077  -7.118  1.00  0.00           C  \nATOM   2055  C   ALA A 130      33.049   8.379  -7.884  1.00  0.00           C  \nATOM   2056  O   ALA A 130      33.534   9.400  -7.396  1.00  0.00           O  \nATOM   2057  CB  ALA A 130      34.177   6.172  -7.526  1.00  0.00           C  \nATOM   2058  H   ALA A 130      31.690   5.505  -7.704  1.00  0.00           H  \nATOM   2059  HA  ALA A 130      33.098   7.288  -6.145  1.00  0.00           H  \nATOM   2060  HB1 ALA A 130      35.038   6.659  -7.381  1.00  0.00           H  \nATOM   2061  HB2 ALA A 130      34.166   5.341  -6.970  1.00  0.00           H  \nATOM   2062  HB3 ALA A 130      34.091   5.928  -8.492  1.00  0.00           H  \nATOM   2063  N   VAL A 131      32.547   8.324  -9.108  1.00  0.00           N  \nATOM   2064  CA  VAL A 131      32.512   9.491  -9.950  1.00  0.00           C  \nATOM   2065  C   VAL A 131      31.571  10.535  -9.338  1.00  0.00           C  \nATOM   2066  O   VAL A 131      31.939  11.694  -9.199  1.00  0.00           O  \nATOM   2067  CB  VAL A 131      32.140   9.126 -11.415  1.00  0.00           C  \nATOM   2068  CG1 VAL A 131      31.731  10.329 -12.214  1.00  0.00           C  \nATOM   2069  CG2 VAL A 131      33.328   8.465 -12.117  1.00  0.00           C  \nATOM   2070  H   VAL A 131      32.186   7.458  -9.453  1.00  0.00           H  \nATOM   2071  HA  VAL A 131      33.432   9.883  -9.961  1.00  0.00           H  \nATOM   2072  HB  VAL A 131      31.378   8.479 -11.399  1.00  0.00           H  \nATOM   2073 HG11 VAL A 131      31.502  10.048 -13.146  1.00  0.00           H  \nATOM   2074 HG12 VAL A 131      30.933  10.756 -11.789  1.00  0.00           H  \nATOM   2075 HG13 VAL A 131      32.486  10.984 -12.240  1.00  0.00           H  \nATOM   2076 HG21 VAL A 131      33.075   8.236 -13.057  1.00  0.00           H  \nATOM   2077 HG22 VAL A 131      34.104   9.096 -12.125  1.00  0.00           H  \nATOM   2078 HG23 VAL A 131      33.582   7.631 -11.628  1.00  0.00           H  \nATOM   2079  N   ASN A 132      30.381  10.120  -8.922  1.00  0.00           N  \nATOM   2080  CA  ASN A 132      29.429  11.043  -8.347  1.00  0.00           C  \nATOM   2081  C   ASN A 132      29.941  11.631  -7.031  1.00  0.00           C  \nATOM   2082  O   ASN A 132      29.747  12.793  -6.695  1.00  0.00           O  \nATOM   2083  CB  ASN A 132      28.077  10.372  -8.139  1.00  0.00           C  \nATOM   2084  CG  ASN A 132      26.999  11.333  -7.676  1.00  0.00           C  \nATOM   2085  ND2 ASN A 132      26.390  11.964  -8.650  1.00  0.00           N  \nATOM   2086  OD1 ASN A 132      26.783  11.565  -6.470  1.00  0.00           O  \nATOM   2087  H   ASN A 132      30.139   9.153  -9.008  1.00  0.00           H  \nATOM   2088  HA  ASN A 132      29.303  11.796  -8.992  1.00  0.00           H  \nATOM   2089  HB2 ASN A 132      28.181   9.655  -7.450  1.00  0.00           H  \nATOM   2090  HB3 ASN A 132      27.788   9.963  -9.005  1.00  0.00           H  \nATOM   2091 HD21 ASN A 132      26.601  11.738  -9.601  1.00  0.00           H  \nATOM   2092 HD22 ASN A 132      25.714  12.671  -8.442  1.00  0.00           H  \nATOM   2093  N   LEU A 133      30.619  10.839  -6.241  1.00  0.00           N  \nATOM   2094  CA  LEU A 133      31.072  11.360  -4.966  1.00  0.00           C  \nATOM   2095  C   LEU A 133      32.052  12.534  -5.152  1.00  0.00           C  \nATOM   2096  O   LEU A 133      32.141  13.426  -4.319  1.00  0.00           O  \nATOM   2097  CB  LEU A 133      31.765  10.268  -4.071  1.00  0.00           C  \nATOM   2098  CG  LEU A 133      30.822   9.280  -3.348  1.00  0.00           C  \nATOM   2099  CD1 LEU A 133      31.637   8.091  -2.819  1.00  0.00           C  \nATOM   2100  CD2 LEU A 133      30.133   9.963  -2.183  1.00  0.00           C  \nATOM   2101  H   LEU A 133      30.820   9.897  -6.510  1.00  0.00           H  \nATOM   2102  HA  LEU A 133      30.273  11.702  -4.471  1.00  0.00           H  \nATOM   2103  HB2 LEU A 133      32.303  10.741  -3.374  1.00  0.00           H  \nATOM   2104  HB3 LEU A 133      32.374   9.734  -4.658  1.00  0.00           H  \nATOM   2105  HG  LEU A 133      30.133   8.949  -3.992  1.00  0.00           H  \nATOM   2106 HD11 LEU A 133      31.028   7.451  -2.351  1.00  0.00           H  \nATOM   2107 HD12 LEU A 133      32.084   7.627  -3.584  1.00  0.00           H  \nATOM   2108 HD13 LEU A 133      32.330   8.421  -2.178  1.00  0.00           H  \nATOM   2109 HD21 LEU A 133      29.527   9.312  -1.726  1.00  0.00           H  \nATOM   2110 HD22 LEU A 133      30.820  10.291  -1.535  1.00  0.00           H  \nATOM   2111 HD23 LEU A 133      29.597  10.737  -2.520  1.00  0.00           H  \nATOM   2112  N   ALA A 134      32.835  12.481  -6.229  1.00  0.00           N  \nATOM   2113  CA  ALA A 134      33.864  13.477  -6.512  1.00  0.00           C  \nATOM   2114  C   ALA A 134      33.310  14.861  -6.863  1.00  0.00           C  \nATOM   2115  O   ALA A 134      33.984  15.895  -6.728  1.00  0.00           O  \nATOM   2116  CB  ALA A 134      34.896  12.944  -7.534  1.00  0.00           C  \nATOM   2117  H   ALA A 134      32.712  11.725  -6.872  1.00  0.00           H  \nATOM   2118  HA  ALA A 134      34.368  13.596  -5.656  1.00  0.00           H  \nATOM   2119  HB1 ALA A 134      35.586  13.646  -7.708  1.00  0.00           H  \nATOM   2120  HB2 ALA A 134      35.338  12.126  -7.166  1.00  0.00           H  \nATOM   2121  HB3 ALA A 134      34.431  12.715  -8.389  1.00  0.00           H  \nATOM   2122  N   LYS A 135      32.059  14.900  -7.291  1.00  0.00           N  \nATOM   2123  CA  LYS A 135      31.394  16.158  -7.631  1.00  0.00           C  \nATOM   2124  C   LYS A 135      30.821  16.786  -6.414  1.00  0.00           C  \nATOM   2125  O   LYS A 135      29.636  16.840  -6.241  1.00  0.00           O  \nATOM   2126  CB  LYS A 135      30.232  15.925  -8.550  1.00  0.00           C  \nATOM   2127  CG  LYS A 135      30.729  15.180  -9.767  1.00  0.00           C  \nATOM   2128  CD  LYS A 135      29.707  15.250 -10.878  1.00  0.00           C  \nATOM   2129  CE  LYS A 135      30.268  14.629 -12.133  1.00  0.00           C  \nATOM   2130  NZ  LYS A 135      29.221  13.906 -12.876  1.00  0.00           N1+\nATOM   2131  H   LYS A 135      31.552  14.043  -7.385  1.00  0.00           H  \nATOM   2132  HA  LYS A 135      32.047  16.782  -8.060  1.00  0.00           H  \nATOM   2133  HB2 LYS A 135      29.840  16.802  -8.828  1.00  0.00           H  \nATOM   2134  HB3 LYS A 135      29.535  15.381  -8.082  1.00  0.00           H  \nATOM   2135  HG2 LYS A 135      30.889  14.223  -9.525  1.00  0.00           H  \nATOM   2136  HG3 LYS A 135      31.585  15.592 -10.079  1.00  0.00           H  \nATOM   2137  HD2 LYS A 135      29.476  16.207 -11.056  1.00  0.00           H  \nATOM   2138  HD3 LYS A 135      28.883  14.754 -10.602  1.00  0.00           H  \nATOM   2139  HE2 LYS A 135      30.995  13.988 -11.885  1.00  0.00           H  \nATOM   2140  HE3 LYS A 135      30.644  15.350 -12.715  1.00  0.00           H  \nATOM   2141  HZ1 LYS A 135      29.616  13.504 -13.702  1.00  0.00           H  \nATOM   2142  HZ2 LYS A 135      28.844  13.181 -12.300  1.00  0.00           H  \nATOM   2143  HZ3 LYS A 135      28.493  14.543 -13.130  1.00  0.00           H  \nATOM   2144  N   SER A 136      31.706  17.232  -5.565  1.00  0.00           N  \nATOM   2145  CA  SER A 136      31.249  17.745  -4.320  1.00  0.00           C  \nATOM   2146  C   SER A 136      32.250  18.739  -3.748  1.00  0.00           C  \nATOM   2147  O   SER A 136      33.467  18.734  -4.007  1.00  0.00           O  \nATOM   2148  CB  SER A 136      31.089  16.565  -3.359  1.00  0.00           C  \nATOM   2149  OG  SER A 136      32.387  15.944  -3.189  1.00  0.00           O  \nATOM   2150  H   SER A 136      32.681  17.213  -5.785  1.00  0.00           H  \nATOM   2151  HA  SER A 136      30.365  18.195  -4.447  1.00  0.00           H  \nATOM   2152  HB2 SER A 136      30.444  15.903  -3.740  1.00  0.00           H  \nATOM   2153  HB3 SER A 136      30.751  16.890  -2.476  1.00  0.00           H  \nATOM   2154  HG  SER A 136      32.342  14.991  -3.488  1.00  0.00           H  \nATOM   2155  N   ARG A 137      31.716  19.611  -2.929  1.00  0.00           N  \nATOM   2156  CA  ARG A 137      32.553  20.556  -2.228  1.00  0.00           C  \nATOM   2157  C   ARG A 137      33.602  19.794  -1.424  1.00  0.00           C  \nATOM   2158  O   ARG A 137      34.759  20.185  -1.380  1.00  0.00           O  \nATOM   2159  CB  ARG A 137      31.707  21.412  -1.270  1.00  0.00           C  \nATOM   2160  CG  ARG A 137      32.595  22.160  -0.276  1.00  0.00           C  \nATOM   2161  CD  ARG A 137      31.900  23.308   0.450  1.00  0.00           C  \nATOM   2162  NE  ARG A 137      32.838  24.218   1.141  1.00  0.00           N  \nATOM   2163  CZ  ARG A 137      33.555  23.938   2.247  1.00  0.00           C  \nATOM   2164  NH1 ARG A 137      33.510  22.756   2.860  1.00  0.00           N1+\nATOM   2165  NH2 ARG A 137      34.361  24.872   2.747  1.00  0.00           N  \nATOM   2166  H   ARG A 137      30.726  19.622  -2.789  1.00  0.00           H  \nATOM   2167  HA  ARG A 137      33.009  21.151  -2.890  1.00  0.00           H  \nATOM   2168  HB2 ARG A 137      31.081  20.817  -0.766  1.00  0.00           H  \nATOM   2169  HB3 ARG A 137      31.181  22.075  -1.802  1.00  0.00           H  \nATOM   2170  HG2 ARG A 137      33.377  22.533  -0.775  1.00  0.00           H  \nATOM   2171  HG3 ARG A 137      32.917  21.506   0.409  1.00  0.00           H  \nATOM   2172  HD2 ARG A 137      31.275  22.922   1.128  1.00  0.00           H  \nATOM   2173  HD3 ARG A 137      31.379  23.838  -0.220  1.00  0.00           H  \nATOM   2174  HE  ARG A 137      32.952  25.131   0.749  1.00  0.00           H  \nATOM   2175 HH11 ARG A 137      34.061  22.596   3.679  1.00  0.00           H  \nATOM   2176 HH12 ARG A 137      32.925  22.029   2.501  1.00  0.00           H  \nATOM   2177 HH21 ARG A 137      34.900  24.680   3.567  1.00  0.00           H  \nATOM   2178 HH22 ARG A 137      34.427  25.765   2.302  1.00  0.00           H  \nATOM   2179  N   TRP A 138      33.156  18.686  -0.754  1.00  0.00           N  \nATOM   2180  CA  TRP A 138      33.983  17.803   0.061  1.00  0.00           C  \nATOM   2181  C   TRP A 138      35.270  17.410  -0.666  1.00  0.00           C  \nATOM   2182  O   TRP A 138      36.380  17.568  -0.169  1.00  0.00           O  \nATOM   2183  CB  TRP A 138      33.179  16.513   0.353  1.00  0.00           C  \nATOM   2184  CG  TRP A 138      33.953  15.389   0.968  1.00  0.00           C  \nATOM   2185  CD1 TRP A 138      34.652  15.431   2.133  1.00  0.00           C  \nATOM   2186  CD2 TRP A 138      33.952  14.006   0.530  1.00  0.00           C  \nATOM   2187  CE2 TRP A 138      34.739  13.288   1.457  1.00  0.00           C  \nATOM   2188  CE3 TRP A 138      33.421  13.362  -0.556  1.00  0.00           C  \nATOM   2189  NE1 TRP A 138      35.172  14.178   2.412  1.00  0.00           N  \nATOM   2190  CZ2 TRP A 138      34.936  11.905   1.333  1.00  0.00           C  \nATOM   2191  CZ3 TRP A 138      33.622  11.998  -0.696  1.00  0.00           C  \nATOM   2192  CH2 TRP A 138      34.375  11.286   0.238  1.00  0.00           C  \nATOM   2193  H   TRP A 138      32.184  18.464  -0.830  1.00  0.00           H  \nATOM   2194  HA  TRP A 138      34.210  18.258   0.922  1.00  0.00           H  \nATOM   2195  HB2 TRP A 138      32.798  16.186  -0.512  1.00  0.00           H  \nATOM   2196  HB3 TRP A 138      32.434  16.750   0.977  1.00  0.00           H  \nATOM   2197  HD1 TRP A 138      34.773  16.244   2.703  1.00  0.00           H  \nATOM   2198  HE1 TRP A 138      35.767  13.956   3.184  1.00  0.00           H  \nATOM   2199  HE3 TRP A 138      32.895  13.869  -1.239  1.00  0.00           H  \nATOM   2200  HZ2 TRP A 138      35.461  11.390   2.011  1.00  0.00           H  \nATOM   2201  HZ3 TRP A 138      33.222  11.518  -1.477  1.00  0.00           H  \nATOM   2202  HH2 TRP A 138      34.511  10.304   0.109  1.00  0.00           H  \nATOM   2203  N   TYR A 139      35.099  16.946  -1.898  1.00  0.00           N  \nATOM   2204  CA  TYR A 139      36.191  16.538  -2.715  1.00  0.00           C  \nATOM   2205  C   TYR A 139      37.040  17.700  -3.080  1.00  0.00           C  \nATOM   2206  O   TYR A 139      38.249  17.600  -3.104  1.00  0.00           O  \nATOM   2207  CB  TYR A 139      35.680  15.974  -4.024  1.00  0.00           C  \nATOM   2208  CG  TYR A 139      36.783  15.454  -4.903  1.00  0.00           C  \nATOM   2209  CD1 TYR A 139      37.310  14.184  -4.675  1.00  0.00           C  \nATOM   2210  CD2 TYR A 139      37.220  16.182  -6.006  1.00  0.00           C  \nATOM   2211  CE1 TYR A 139      38.266  13.637  -5.521  1.00  0.00           C  \nATOM   2212  CE2 TYR A 139      38.183  15.655  -6.868  1.00  0.00           C  \nATOM   2213  CZ  TYR A 139      38.692  14.382  -6.619  1.00  0.00           C  \nATOM   2214  OH  TYR A 139      39.652  13.867  -7.440  1.00  0.00           O  \nATOM   2215  H   TYR A 139      34.171  16.881  -2.265  1.00  0.00           H  \nATOM   2216  HA  TYR A 139      36.738  15.851  -2.237  1.00  0.00           H  \nATOM   2217  HB2 TYR A 139      35.193  16.697  -4.515  1.00  0.00           H  \nATOM   2218  HB3 TYR A 139      35.050  15.224  -3.824  1.00  0.00           H  \nATOM   2219  HD1 TYR A 139      36.994  13.656  -3.887  1.00  0.00           H  \nATOM   2220  HD2 TYR A 139      36.841  17.090  -6.182  1.00  0.00           H  \nATOM   2221  HE1 TYR A 139      38.641  12.727  -5.346  1.00  0.00           H  \nATOM   2222  HE2 TYR A 139      38.503  16.184  -7.654  1.00  0.00           H  \nATOM   2223  HH  TYR A 139      39.967  14.391  -8.231  1.00  0.00           H  \nATOM   2224  N   ASN A 140      36.417  18.806  -3.437  1.00  0.00           N  \nATOM   2225  CA  ASN A 140      37.201  19.967  -3.824  1.00  0.00           C  \nATOM   2226  C   ASN A 140      38.025  20.578  -2.692  1.00  0.00           C  \nATOM   2227  O   ASN A 140      39.125  21.021  -2.934  1.00  0.00           O  \nATOM   2228  CB  ASN A 140      36.354  21.017  -4.559  1.00  0.00           C  \nATOM   2229  CG  ASN A 140      36.042  20.485  -5.925  1.00  0.00           C  \nATOM   2230  ND2 ASN A 140      34.839  19.934  -6.036  1.00  0.00           N  \nATOM   2231  OD1 ASN A 140      36.885  20.446  -6.835  1.00  0.00           O  \nATOM   2232  H   ASN A 140      35.418  18.845  -3.441  1.00  0.00           H  \nATOM   2233  HA  ASN A 140      37.865  19.635  -4.495  1.00  0.00           H  \nATOM   2234  HB2 ASN A 140      36.866  21.873  -4.637  1.00  0.00           H  \nATOM   2235  HB3 ASN A 140      35.505  21.181  -4.056  1.00  0.00           H  \nATOM   2236 HD21 ASN A 140      34.192  19.990  -5.276  1.00  0.00           H  \nATOM   2237 HD22 ASN A 140      34.581  19.463  -6.879  1.00  0.00           H  \nATOM   2238  N   GLN A 141      37.516  20.570  -1.452  1.00  0.00           N  \nATOM   2239  CA  GLN A 141      38.203  21.102  -0.286  1.00  0.00           C  \nATOM   2240  C   GLN A 141      39.253  20.216   0.305  1.00  0.00           C  \nATOM   2241  O   GLN A 141      40.294  20.718   0.733  1.00  0.00           O  \nATOM   2242  CB  GLN A 141      37.273  21.534   0.843  1.00  0.00           C  \nATOM   2243  CG  GLN A 141      36.270  22.605   0.363  1.00  0.00           C  \nATOM   2244  CD  GLN A 141      36.919  23.835  -0.246  1.00  0.00           C  \nATOM   2245  NE2 GLN A 141      36.422  24.233  -1.416  1.00  0.00           N  \nATOM   2246  OE1 GLN A 141      37.821  24.493   0.328  1.00  0.00           O  \nATOM   2247  H   GLN A 141      36.607  20.174  -1.321  1.00  0.00           H  \nATOM   2248  HA  GLN A 141      38.675  21.929  -0.592  1.00  0.00           H  \nATOM   2249  HB2 GLN A 141      37.820  21.912   1.590  1.00  0.00           H  \nATOM   2250  HB3 GLN A 141      36.766  20.737   1.171  1.00  0.00           H  \nATOM   2251  HG2 GLN A 141      35.722  22.895   1.147  1.00  0.00           H  \nATOM   2252  HG3 GLN A 141      35.674  22.191  -0.325  1.00  0.00           H  \nATOM   2253 HE21 GLN A 141      35.703  23.699  -1.861  1.00  0.00           H  \nATOM   2254 HE22 GLN A 141      36.767  25.066  -1.849  1.00  0.00           H  \nATOM   2255  N   THR A 142      38.962  18.920   0.414  1.00  0.00           N  \nATOM   2256  CA  THR A 142      39.915  17.982   0.970  1.00  0.00           C  \nATOM   2257  C   THR A 142      40.082  16.866  -0.006  1.00  0.00           C  \nATOM   2258  O   THR A 142      39.735  15.731   0.268  1.00  0.00           O  \nATOM   2259  CB  THR A 142      39.450  17.417   2.314  1.00  0.00           C  \nATOM   2260  CG2 THR A 142      39.581  18.539   3.361  1.00  0.00           C  \nATOM   2261  OG1 THR A 142      38.108  16.952   2.212  1.00  0.00           O  \nATOM   2262  H   THR A 142      38.070  18.589   0.106  1.00  0.00           H  \nATOM   2263  HA  THR A 142      40.794  18.443   1.095  1.00  0.00           H  \nATOM   2264  HB  THR A 142      40.043  16.655   2.573  1.00  0.00           H  \nATOM   2265  HG1 THR A 142      38.056  16.233   1.519  1.00  0.00           H  \nATOM   2266 HG21 THR A 142      39.283  18.199   4.253  1.00  0.00           H  \nATOM   2267 HG22 THR A 142      40.535  18.832   3.418  1.00  0.00           H  \nATOM   2268 HG23 THR A 142      39.009  19.314   3.092  1.00  0.00           H  \nATOM   2269  N   PRO A 143      40.673  17.176  -1.132  1.00  0.00           N  \nATOM   2270  CA  PRO A 143      40.849  16.180  -2.176  1.00  0.00           C  \nATOM   2271  C   PRO A 143      41.654  14.900  -1.835  1.00  0.00           C  \nATOM   2272  O   PRO A 143      41.303  13.811  -2.251  1.00  0.00           O  \nATOM   2273  CB  PRO A 143      41.511  16.906  -3.343  1.00  0.00           C  \nATOM   2274  CG  PRO A 143      42.209  18.111  -2.727  1.00  0.00           C  \nATOM   2275  CD  PRO A 143      41.437  18.425  -1.462  1.00  0.00           C  \nATOM   2276  HA  PRO A 143      39.939  15.893  -2.476  1.00  0.00           H  \nATOM   2277  HB2 PRO A 143      42.175  16.310  -3.794  1.00  0.00           H  \nATOM   2278  HB3 PRO A 143      40.824  17.201  -4.006  1.00  0.00           H  \nATOM   2279  HG2 PRO A 143      43.160  17.891  -2.510  1.00  0.00           H  \nATOM   2280  HG3 PRO A 143      42.182  18.889  -3.355  1.00  0.00           H  \nATOM   2281  HD2 PRO A 143      42.065  18.656  -0.719  1.00  0.00           H  \nATOM   2282  HD3 PRO A 143      40.809  19.187  -1.617  1.00  0.00           H  \nATOM   2283  N   ASN A 144      42.799  15.005  -1.150  1.00  0.00           N  \nATOM   2284  CA  ASN A 144      43.556  13.795  -0.855  1.00  0.00           C  \nATOM   2285  C   ASN A 144      42.808  12.837   0.071  1.00  0.00           C  \nATOM   2286  O   ASN A 144      42.831  11.641  -0.107  1.00  0.00           O  \nATOM   2287  CB  ASN A 144      44.967  14.078  -0.267  1.00  0.00           C  \nATOM   2288  CG  ASN A 144      45.926  14.771  -1.247  1.00  0.00           C  \nATOM   2289  ND2 ASN A 144      46.778  15.613  -0.724  1.00  0.00           N  \nATOM   2290  OD1 ASN A 144      45.945  14.546  -2.466  1.00  0.00           O  \nATOM   2291  H   ASN A 144      43.129  15.898  -0.846  1.00  0.00           H  \nATOM   2292  HA  ASN A 144      43.692  13.316  -1.723  1.00  0.00           H  \nATOM   2293  HB2 ASN A 144      45.374  13.207   0.007  1.00  0.00           H  \nATOM   2294  HB3 ASN A 144      44.861  14.664   0.536  1.00  0.00           H  \nATOM   2295 HD21 ASN A 144      46.762  15.794   0.259  1.00  0.00           H  \nATOM   2296 HD22 ASN A 144      47.445  16.076  -1.307  1.00  0.00           H  \nATOM   2297  N   ARG A 145      42.186  13.392   1.093  1.00  0.00           N  \nATOM   2298  CA  ARG A 145      41.428  12.546   1.974  1.00  0.00           C  \nATOM   2299  C   ARG A 145      40.192  11.985   1.244  1.00  0.00           C  \nATOM   2300  O   ARG A 145      39.849  10.821   1.353  1.00  0.00           O  \nATOM   2301  CB  ARG A 145      40.979  13.333   3.175  1.00  0.00           C  \nATOM   2302  CG  ARG A 145      39.990  12.467   3.950  1.00  0.00           C  \nATOM   2303  CD  ARG A 145      39.503  13.164   5.172  1.00  0.00           C  \nATOM   2304  NE  ARG A 145      38.826  12.261   6.058  1.00  0.00           N  \nATOM   2305  CZ  ARG A 145      38.629  12.673   7.282  1.00  0.00           C  \nATOM   2306  NH1 ARG A 145      39.095  13.860   7.620  1.00  0.00           N1+\nATOM   2307  NH2 ARG A 145      38.012  11.926   8.174  1.00  0.00           N  \nATOM   2308  H   ARG A 145      42.240  14.378   1.251  1.00  0.00           H  \nATOM   2309  HA  ARG A 145      42.004  11.786   2.276  1.00  0.00           H  \nATOM   2310  HB2 ARG A 145      40.534  14.179   2.881  1.00  0.00           H  \nATOM   2311  HB3 ARG A 145      41.765  13.553   3.752  1.00  0.00           H  \nATOM   2312  HG2 ARG A 145      40.442  11.617   4.218  1.00  0.00           H  \nATOM   2313  HG3 ARG A 145      39.209  12.258   3.361  1.00  0.00           H  \nATOM   2314  HD2 ARG A 145      38.870  13.890   4.902  1.00  0.00           H  \nATOM   2315  HD3 ARG A 145      40.284  13.564   5.651  1.00  0.00           H  \nATOM   2316  HE  ARG A 145      38.520  11.359   5.753  1.00  0.00           H  \nATOM   2317 HH11 ARG A 145      38.960  14.204   8.549  1.00  0.00           H  \nATOM   2318 HH12 ARG A 145      39.583  14.416   6.947  1.00  0.00           H  \nATOM   2319 HH21 ARG A 145      37.875  12.268   9.104  1.00  0.00           H  \nATOM   2320 HH22 ARG A 145      37.680  11.017   7.922  1.00  0.00           H  \nATOM   2321  N   ALA A 146      39.499  12.858   0.516  1.00  0.00           N  \nATOM   2322  CA  ALA A 146      38.337  12.409  -0.243  1.00  0.00           C  \nATOM   2323  C   ALA A 146      38.711  11.249  -1.164  1.00  0.00           C  \nATOM   2324  O   ALA A 146      38.004  10.253  -1.233  1.00  0.00           O  \nATOM   2325  CB  ALA A 146      37.757  13.567  -1.063  1.00  0.00           C  \nATOM   2326  H   ALA A 146      39.774  13.819   0.490  1.00  0.00           H  \nATOM   2327  HA  ALA A 146      37.639  12.093   0.400  1.00  0.00           H  \nATOM   2328  HB1 ALA A 146      36.962  13.246  -1.578  1.00  0.00           H  \nATOM   2329  HB2 ALA A 146      37.480  14.305  -0.448  1.00  0.00           H  \nATOM   2330  HB3 ALA A 146      38.451  13.906  -1.698  1.00  0.00           H  \nATOM   2331  N   LYS A 147      39.833  11.397  -1.895  1.00  0.00           N  \nATOM   2332  CA  LYS A 147      40.311  10.381  -2.802  1.00  0.00           C  \nATOM   2333  C   LYS A 147      40.505   9.058  -2.106  1.00  0.00           C  \nATOM   2334  O   LYS A 147      40.250   7.993  -2.676  1.00  0.00           O  \nATOM   2335  CB  LYS A 147      41.649  10.731  -3.384  1.00  0.00           C  \nATOM   2336  CG  LYS A 147      41.498  11.406  -4.714  1.00  0.00           C  \nATOM   2337  CD  LYS A 147      42.645  12.334  -5.052  1.00  0.00           C  \nATOM   2338  CE  LYS A 147      42.130  13.565  -5.758  1.00  0.00           C  \nATOM   2339  NZ  LYS A 147      43.173  14.548  -6.053  1.00  0.00           N1+\nATOM   2340  H   LYS A 147      40.356  12.245  -1.806  1.00  0.00           H  \nATOM   2341  HA  LYS A 147      39.650  10.267  -3.544  1.00  0.00           H  \nATOM   2342  HB2 LYS A 147      42.183   9.894  -3.501  1.00  0.00           H  \nATOM   2343  HB3 LYS A 147      42.127  11.347  -2.757  1.00  0.00           H  \nATOM   2344  HG2 LYS A 147      40.652  11.939  -4.705  1.00  0.00           H  \nATOM   2345  HG3 LYS A 147      41.441  10.702  -5.422  1.00  0.00           H  \nATOM   2346  HD2 LYS A 147      43.291  11.857  -5.648  1.00  0.00           H  \nATOM   2347  HD3 LYS A 147      43.109  12.607  -4.209  1.00  0.00           H  \nATOM   2348  HE2 LYS A 147      41.442  13.999  -5.177  1.00  0.00           H  \nATOM   2349  HE3 LYS A 147      41.708  13.283  -6.620  1.00  0.00           H  \nATOM   2350  HZ1 LYS A 147      42.768  15.335  -6.518  1.00  0.00           H  \nATOM   2351  HZ2 LYS A 147      43.599  14.849  -5.200  1.00  0.00           H  \nATOM   2352  HZ3 LYS A 147      43.865  14.132  -6.643  1.00  0.00           H  \nATOM   2353  N   ARG A 148      41.020   9.142  -0.888  1.00  0.00           N  \nATOM   2354  CA  ARG A 148      41.256   7.910  -0.098  1.00  0.00           C  \nATOM   2355  C   ARG A 148      39.972   7.156   0.231  1.00  0.00           C  \nATOM   2356  O   ARG A 148      39.879   5.947   0.022  1.00  0.00           O  \nATOM   2357  CB  ARG A 148      42.067   8.179   1.172  1.00  0.00           C  \nATOM   2358  CG  ARG A 148      43.579   8.274   0.901  1.00  0.00           C  \nATOM   2359  CD  ARG A 148      44.356   8.219   2.187  1.00  0.00           C  \nATOM   2360  NE  ARG A 148      43.993   9.279   3.111  1.00  0.00           N  \nATOM   2361  CZ  ARG A 148      44.576  10.492   3.105  1.00  0.00           C  \nATOM   2362  NH1 ARG A 148      45.526  10.790   2.217  1.00  0.00           N1+\nATOM   2363  NH2 ARG A 148      44.267  11.453   3.956  1.00  0.00           N  \nATOM   2364  H   ARG A 148      41.249  10.036  -0.502  1.00  0.00           H  \nATOM   2365  HA  ARG A 148      41.808   7.303  -0.669  1.00  0.00           H  \nATOM   2366  HB2 ARG A 148      41.904   7.435   1.820  1.00  0.00           H  \nATOM   2367  HB3 ARG A 148      41.759   9.042   1.572  1.00  0.00           H  \nATOM   2368  HG2 ARG A 148      43.775   9.137   0.436  1.00  0.00           H  \nATOM   2369  HG3 ARG A 148      43.856   7.511   0.318  1.00  0.00           H  \nATOM   2370  HD2 ARG A 148      45.330   8.300   1.975  1.00  0.00           H  \nATOM   2371  HD3 ARG A 148      44.182   7.338   2.627  1.00  0.00           H  \nATOM   2372  HE  ARG A 148      43.276   9.099   3.784  1.00  0.00           H  \nATOM   2373 HH11 ARG A 148      45.951  11.695   2.224  1.00  0.00           H  \nATOM   2374 HH12 ARG A 148      45.813  10.108   1.544  1.00  0.00           H  \nATOM   2375 HH21 ARG A 148      44.734  12.336   3.904  1.00  0.00           H  \nATOM   2376 HH22 ARG A 148      43.566  11.298   4.652  1.00  0.00           H  \nATOM   2377  N   VAL A 149      39.006   7.916   0.726  1.00  0.00           N  \nATOM   2378  CA  VAL A 149      37.687   7.382   1.085  1.00  0.00           C  \nATOM   2379  C   VAL A 149      36.948   6.824  -0.118  1.00  0.00           C  \nATOM   2380  O   VAL A 149      36.341   5.749  -0.033  1.00  0.00           O  \nATOM   2381  CB  VAL A 149      36.847   8.463   1.753  1.00  0.00           C  \nATOM   2382  CG1 VAL A 149      35.424   7.960   1.980  1.00  0.00           C  \nATOM   2383  CG2 VAL A 149      37.504   8.786   3.098  1.00  0.00           C  \nATOM   2384  H   VAL A 149      39.183   8.891   0.860  1.00  0.00           H  \nATOM   2385  HA  VAL A 149      37.819   6.640   1.742  1.00  0.00           H  \nATOM   2386  HB  VAL A 149      36.830   9.282   1.179  1.00  0.00           H  \nATOM   2387 HG11 VAL A 149      34.883   8.678   2.419  1.00  0.00           H  \nATOM   2388 HG12 VAL A 149      35.011   7.721   1.101  1.00  0.00           H  \nATOM   2389 HG13 VAL A 149      35.446   7.152   2.569  1.00  0.00           H  \nATOM   2390 HG21 VAL A 149      36.976   9.495   3.565  1.00  0.00           H  \nATOM   2391 HG22 VAL A 149      37.528   7.962   3.664  1.00  0.00           H  \nATOM   2392 HG23 VAL A 149      38.437   9.112   2.944  1.00  0.00           H  \nATOM   2393  N   ILE A 150      36.998   7.593  -1.217  1.00  0.00           N  \nATOM   2394  CA  ILE A 150      36.363   7.232  -2.481  1.00  0.00           C  \nATOM   2395  C   ILE A 150      36.956   5.957  -3.081  1.00  0.00           C  \nATOM   2396  O   ILE A 150      36.265   5.136  -3.657  1.00  0.00           O  \nATOM   2397  CB  ILE A 150      36.376   8.373  -3.523  1.00  0.00           C  \nATOM   2398  CG1 ILE A 150      35.440   9.507  -3.098  1.00  0.00           C  \nATOM   2399  CG2 ILE A 150      35.955   7.838  -4.912  1.00  0.00           C  \nATOM   2400  CD1 ILE A 150      35.583  10.748  -3.955  1.00  0.00           C  \nATOM   2401  H   ILE A 150      37.496   8.459  -1.167  1.00  0.00           H  \nATOM   2402  HA  ILE A 150      35.404   7.037  -2.277  1.00  0.00           H  \nATOM   2403  HB  ILE A 150      37.306   8.735  -3.589  1.00  0.00           H  \nATOM   2404 HG12 ILE A 150      35.644   9.750  -2.150  1.00  0.00           H  \nATOM   2405 HG13 ILE A 150      34.496   9.182  -3.163  1.00  0.00           H  \nATOM   2406 HG21 ILE A 150      35.968   8.586  -5.575  1.00  0.00           H  \nATOM   2407 HG22 ILE A 150      36.593   7.125  -5.202  1.00  0.00           H  \nATOM   2408 HG23 ILE A 150      35.032   7.457  -4.857  1.00  0.00           H  \nATOM   2409 HD11 ILE A 150      34.950  11.451  -3.632  1.00  0.00           H  \nATOM   2410 HD12 ILE A 150      36.521  11.090  -3.893  1.00  0.00           H  \nATOM   2411 HD13 ILE A 150      35.373  10.522  -4.906  1.00  0.00           H  \nATOM   2412  N   THR A 151      38.285   5.807  -2.947  1.00  0.00           N  \nATOM   2413  CA  THR A 151      38.929   4.612  -3.475  1.00  0.00           C  \nATOM   2414  C   THR A 151      38.485   3.410  -2.696  1.00  0.00           C  \nATOM   2415  O   THR A 151      38.340   2.316  -3.234  1.00  0.00           O  \nATOM   2416  CB  THR A 151      40.462   4.709  -3.403  1.00  0.00           C  \nATOM   2417  CG2 THR A 151      41.101   3.322  -3.569  1.00  0.00           C  \nATOM   2418  OG1 THR A 151      40.912   5.546  -4.438  1.00  0.00           O  \nATOM   2419  H   THR A 151      38.828   6.511  -2.488  1.00  0.00           H  \nATOM   2420  HA  THR A 151      38.658   4.495  -4.430  1.00  0.00           H  \nATOM   2421  HB  THR A 151      40.730   5.096  -2.521  1.00  0.00           H  \nATOM   2422  HG1 THR A 151      41.909   5.616  -4.400  1.00  0.00           H  \nATOM   2423 HG21 THR A 151      42.096   3.405  -3.519  1.00  0.00           H  \nATOM   2424 HG22 THR A 151      40.780   2.718  -2.839  1.00  0.00           H  \nATOM   2425 HG23 THR A 151      40.842   2.940  -4.456  1.00  0.00           H  \nATOM   2426  N   THR A 152      38.288   3.651  -1.405  1.00  0.00           N  \nATOM   2427  CA  THR A 152      37.808   2.598  -0.543  1.00  0.00           C  \nATOM   2428  C   THR A 152      36.403   2.148  -0.958  1.00  0.00           C  \nATOM   2429  O   THR A 152      36.084   0.971  -0.905  1.00  0.00           O  \nATOM   2430  CB  THR A 152      37.837   3.101   0.909  1.00  0.00           C  \nATOM   2431  CG2 THR A 152      37.421   1.998   1.833  1.00  0.00           C  \nATOM   2432  OG1 THR A 152      39.170   3.468   1.218  1.00  0.00           O  \nATOM   2433  H   THR A 152      38.472   4.560  -1.031  1.00  0.00           H  \nATOM   2434  HA  THR A 152      38.427   1.817  -0.621  1.00  0.00           H  \nATOM   2435  HB  THR A 152      37.229   3.888   1.014  1.00  0.00           H  \nATOM   2436  HG1 THR A 152      39.312   4.431   0.990  1.00  0.00           H  \nATOM   2437 HG21 THR A 152      37.441   2.328   2.777  1.00  0.00           H  \nATOM   2438 HG22 THR A 152      36.494   1.702   1.603  1.00  0.00           H  \nATOM   2439 HG23 THR A 152      38.050   1.227   1.736  1.00  0.00           H  \nATOM   2440  N   PHE A 153      35.561   3.099  -1.354  1.00  0.00           N  \nATOM   2441  CA  PHE A 153      34.211   2.735  -1.737  1.00  0.00           C  \nATOM   2442  C   PHE A 153      34.265   2.021  -3.080  1.00  0.00           C  \nATOM   2443  O   PHE A 153      33.509   1.088  -3.357  1.00  0.00           O  \nATOM   2444  CB  PHE A 153      33.301   3.984  -1.834  1.00  0.00           C  \nATOM   2445  CG  PHE A 153      32.587   4.438  -0.575  1.00  0.00           C  \nATOM   2446  CD1 PHE A 153      31.723   3.604   0.135  1.00  0.00           C  \nATOM   2447  CD2 PHE A 153      32.726   5.755  -0.118  1.00  0.00           C  \nATOM   2448  CE1 PHE A 153      31.067   4.048   1.289  1.00  0.00           C  \nATOM   2449  CE2 PHE A 153      32.056   6.221   1.014  1.00  0.00           C  \nATOM   2450  CZ  PHE A 153      31.230   5.357   1.739  1.00  0.00           C  \nATOM   2451  H   PHE A 153      35.856   4.054  -1.387  1.00  0.00           H  \nATOM   2452  HA  PHE A 153      33.835   2.111  -1.052  1.00  0.00           H  \nATOM   2453  HB2 PHE A 153      32.600   3.790  -2.521  1.00  0.00           H  \nATOM   2454  HB3 PHE A 153      33.871   4.745  -2.145  1.00  0.00           H  \nATOM   2455  HD1 PHE A 153      31.569   2.670  -0.187  1.00  0.00           H  \nATOM   2456  HD2 PHE A 153      33.324   6.381  -0.619  1.00  0.00           H  \nATOM   2457  HE1 PHE A 153      30.476   3.420   1.795  1.00  0.00           H  \nATOM   2458  HE2 PHE A 153      32.167   7.171   1.306  1.00  0.00           H  \nATOM   2459  HZ  PHE A 153      30.764   5.673   2.566  1.00  0.00           H  \nATOM   2460  N   ARG A 154      35.175   2.493  -3.923  1.00  0.00           N  \nATOM   2461  CA  ARG A 154      35.316   1.938  -5.264  1.00  0.00           C  \nATOM   2462  C   ARG A 154      35.841   0.525  -5.288  1.00  0.00           C  \nATOM   2463  O   ARG A 154      35.346  -0.291  -6.046  1.00  0.00           O  \nATOM   2464  CB  ARG A 154      36.171   2.777  -6.208  1.00  0.00           C  \nATOM   2465  CG  ARG A 154      35.875   2.497  -7.685  1.00  0.00           C  \nATOM   2466  CD  ARG A 154      36.773   3.294  -8.644  1.00  0.00           C  \nATOM   2467  NE  ARG A 154      38.150   3.369  -8.173  1.00  0.00           N  \nATOM   2468  CZ  ARG A 154      39.087   2.432  -8.340  1.00  0.00           C  \nATOM   2469  NH1 ARG A 154      38.849   1.282  -8.972  1.00  0.00           N1+\nATOM   2470  NH2 ARG A 154      40.308   2.659  -7.859  1.00  0.00           N  \nATOM   2471  H   ARG A 154      35.773   3.241  -3.634  1.00  0.00           H  \nATOM   2472  HA  ARG A 154      34.398   1.909  -5.659  1.00  0.00           H  \nATOM   2473  HB2 ARG A 154      37.134   2.575  -6.031  1.00  0.00           H  \nATOM   2474  HB3 ARG A 154      35.994   3.744  -6.025  1.00  0.00           H  \nATOM   2475  HG2 ARG A 154      34.922   2.737  -7.869  1.00  0.00           H  \nATOM   2476  HG3 ARG A 154      36.013   1.522  -7.857  1.00  0.00           H  \nATOM   2477  HD2 ARG A 154      36.410   4.222  -8.728  1.00  0.00           H  \nATOM   2478  HD3 ARG A 154      36.763   2.849  -9.540  1.00  0.00           H  \nATOM   2479  HE  ARG A 154      38.418   4.197  -7.680  1.00  0.00           H  \nATOM   2480 HH11 ARG A 154      39.580   0.607  -9.075  1.00  0.00           H  \nATOM   2481 HH12 ARG A 154      37.940   1.094  -9.343  1.00  0.00           H  \nATOM   2482 HH21 ARG A 154      41.026   1.972  -7.972  1.00  0.00           H  \nATOM   2483 HH22 ARG A 154      40.507   3.517  -7.385  1.00  0.00           H  \nATOM   2484  N   THR A 155      36.868   0.249  -4.474  1.00  0.00           N  \nATOM   2485  CA  THR A 155      37.514  -1.057  -4.507  1.00  0.00           C  \nATOM   2486  C   THR A 155      37.109  -1.998  -3.451  1.00  0.00           C  \nATOM   2487  O   THR A 155      37.295  -3.180  -3.598  1.00  0.00           O  \nATOM   2488  CB  THR A 155      39.032  -0.961  -4.347  1.00  0.00           C  \nATOM   2489  CG2 THR A 155      39.573  -0.071  -5.439  1.00  0.00           C  \nATOM   2490  OG1 THR A 155      39.358  -0.446  -3.069  1.00  0.00           O  \nATOM   2491  H   THR A 155      37.195   0.947  -3.837  1.00  0.00           H  \nATOM   2492  HA  THR A 155      37.320  -1.479  -5.392  1.00  0.00           H  \nATOM   2493  HB  THR A 155      39.429  -1.874  -4.443  1.00  0.00           H  \nATOM   2494  HG1 THR A 155      38.960   0.465  -2.965  1.00  0.00           H  \nATOM   2495 HG21 THR A 155      40.566   0.002  -5.348  1.00  0.00           H  \nATOM   2496 HG22 THR A 155      39.348  -0.463  -6.331  1.00  0.00           H  \nATOM   2497 HG23 THR A 155      39.163   0.838  -5.362  1.00  0.00           H  \nATOM   2498  N   GLY A 156      36.709  -1.480  -2.340  1.00  0.00           N  \nATOM   2499  CA  GLY A 156      36.367  -2.395  -1.287  1.00  0.00           C  \nATOM   2500  C   GLY A 156      37.593  -2.959  -0.568  1.00  0.00           C  \nATOM   2501  O   GLY A 156      37.469  -3.915   0.180  1.00  0.00           O  \nATOM   2502  H   GLY A 156      36.640  -0.490  -2.218  1.00  0.00           H  \nATOM   2503  HA2 GLY A 156      35.850  -3.155  -1.680  1.00  0.00           H  \nATOM   2504  HA3 GLY A 156      35.798  -1.915  -0.619  1.00  0.00           H  \nATOM   2505  N   THR A 157      38.775  -2.357  -0.740  1.00  0.00           N  \nATOM   2506  CA  THR A 157      40.024  -2.765  -0.073  1.00  0.00           C  \nATOM   2507  C   THR A 157      40.621  -1.575   0.664  1.00  0.00           C  \nATOM   2508  O   THR A 157      40.224  -0.442   0.457  1.00  0.00           O  \nATOM   2509  CB  THR A 157      41.070  -3.045  -1.157  1.00  0.00           C  \nATOM   2510  CG2 THR A 157      40.476  -3.995  -2.198  1.00  0.00           C  \nATOM   2511  OG1 THR A 157      41.373  -1.781  -1.765  1.00  0.00           O  \nATOM   2512  H   THR A 157      38.814  -1.577  -1.364  1.00  0.00           H  \nATOM   2513  HA  THR A 157      39.888  -3.551   0.530  1.00  0.00           H  \nATOM   2514  HB  THR A 157      41.893  -3.443  -0.752  1.00  0.00           H  \nATOM   2515  HG1 THR A 157      40.541  -1.394  -2.162  1.00  0.00           H  \nATOM   2516 HG21 THR A 157      41.156  -4.180  -2.907  1.00  0.00           H  \nATOM   2517 HG22 THR A 157      40.214  -4.853  -1.756  1.00  0.00           H  \nATOM   2518 HG23 THR A 157      39.669  -3.574  -2.612  1.00  0.00           H  \nATOM   2519  N   TRP A 158      41.661  -1.801   1.418  1.00  0.00           N  \nATOM   2520  CA  TRP A 158      42.283  -0.731   2.135  1.00  0.00           C  \nATOM   2521  C   TRP A 158      43.479  -0.236   1.389  1.00  0.00           C  \nATOM   2522  O   TRP A 158      44.382   0.363   1.962  1.00  0.00           O  \nATOM   2523  CB  TRP A 158      42.833  -1.262   3.462  1.00  0.00           C  \nATOM   2524  CG  TRP A 158      41.789  -1.694   4.431  1.00  0.00           C  \nATOM   2525  CD1 TRP A 158      41.561  -2.966   4.825  1.00  0.00           C  \nATOM   2526  CD2 TRP A 158      40.905  -0.874   5.208  1.00  0.00           C  \nATOM   2527  CE2 TRP A 158      40.166  -1.732   6.038  1.00  0.00           C  \nATOM   2528  CE3 TRP A 158      40.703   0.493   5.285  1.00  0.00           C  \nATOM   2529  NE1 TRP A 158      40.584  -3.000   5.776  1.00  0.00           N  \nATOM   2530  CZ2 TRP A 158      39.195  -1.264   6.923  1.00  0.00           C  \nATOM   2531  CZ3 TRP A 158      39.771   0.948   6.186  1.00  0.00           C  \nATOM   2532  CH2 TRP A 158      38.999   0.082   6.984  1.00  0.00           C  \nATOM   2533  H   TRP A 158      42.026  -2.729   1.495  1.00  0.00           H  \nATOM   2534  HA  TRP A 158      41.633   0.012   2.294  1.00  0.00           H  \nATOM   2535  HB2 TRP A 158      43.375  -0.538   3.888  1.00  0.00           H  \nATOM   2536  HB3 TRP A 158      43.421  -2.047   3.265  1.00  0.00           H  \nATOM   2537  HD1 TRP A 158      42.040  -3.769   4.470  1.00  0.00           H  \nATOM   2538  HE1 TRP A 158      40.230  -3.827   6.212  1.00  0.00           H  \nATOM   2539  HE3 TRP A 158      41.217   1.126   4.706  1.00  0.00           H  \nATOM   2540  HZ2 TRP A 158      38.663  -1.893   7.491  1.00  0.00           H  \nATOM   2541  HZ3 TRP A 158      39.635   1.934   6.279  1.00  0.00           H  \nATOM   2542  HH2 TRP A 158      38.304   0.457   7.598  1.00  0.00           H  \nATOM   2543  N   ASP A 159      43.506  -0.457   0.122  1.00  0.00           N  \nATOM   2544  CA  ASP A 159      44.676  -0.042  -0.592  1.00  0.00           C  \nATOM   2545  C   ASP A 159      45.090   1.421  -0.490  1.00  0.00           C  \nATOM   2546  O   ASP A 159      46.279   1.716  -0.581  1.00  0.00           O  \nATOM   2547  CB  ASP A 159      44.603  -0.446  -2.041  1.00  0.00           C  \nATOM   2548  CG  ASP A 159      44.547  -1.928  -2.276  1.00  0.00           C  \nATOM   2549  OD1 ASP A 159      45.074  -2.648  -1.312  1.00  0.00           O  \nATOM   2550  OD2 ASP A 159      44.111  -2.414  -3.292  1.00  0.00           O1-\nATOM   2551  H   ASP A 159      42.741  -0.901  -0.345  1.00  0.00           H  \nATOM   2552  HA  ASP A 159      45.433  -0.566  -0.202  1.00  0.00           H  \nATOM   2553  HB2 ASP A 159      45.412  -0.087  -2.506  1.00  0.00           H  \nATOM   2554  HB3 ASP A 159      43.782  -0.036  -2.438  1.00  0.00           H  \nATOM   2555  N   ALA A 160      44.156   2.338  -0.362  1.00  0.00           N  \nATOM   2556  CA  ALA A 160      44.485   3.754  -0.334  1.00  0.00           C  \nATOM   2557  C   ALA A 160      45.196   4.114   0.933  1.00  0.00           C  \nATOM   2558  O   ALA A 160      45.815   5.163   1.079  1.00  0.00           O  \nATOM   2559  CB  ALA A 160      43.212   4.602  -0.431  1.00  0.00           C  \nATOM   2560  H   ALA A 160      43.200   2.056  -0.282  1.00  0.00           H  \nATOM   2561  HA  ALA A 160      45.077   3.966  -1.111  1.00  0.00           H  \nATOM   2562  HB1 ALA A 160      43.455   5.572  -0.410  1.00  0.00           H  \nATOM   2563  HB2 ALA A 160      42.738   4.395  -1.287  1.00  0.00           H  \nATOM   2564  HB3 ALA A 160      42.612   4.392   0.341  1.00  0.00           H  \nATOM   2565  N   TYR A 161      45.061   3.229   1.885  1.00  0.00           N  \nATOM   2566  CA  TYR A 161      45.621   3.490   3.172  1.00  0.00           C  \nATOM   2567  C   TYR A 161      46.856   2.700   3.386  1.00  0.00           C  \nATOM   2568  O   TYR A 161      47.417   2.722   4.476  1.00  0.00           O  \nATOM   2569  CB  TYR A 161      44.647   3.185   4.314  1.00  0.00           C  \nATOM   2570  CG  TYR A 161      43.587   4.231   4.362  1.00  0.00           C  \nATOM   2571  CD1 TYR A 161      42.506   4.142   3.488  1.00  0.00           C  \nATOM   2572  CD2 TYR A 161      43.718   5.329   5.208  1.00  0.00           C  \nATOM   2573  CE1 TYR A 161      41.511   5.113   3.486  1.00  0.00           C  \nATOM   2574  CE2 TYR A 161      42.733   6.318   5.208  1.00  0.00           C  \nATOM   2575  CZ  TYR A 161      41.642   6.198   4.343  1.00  0.00           C  \nATOM   2576  OH  TYR A 161      40.686   7.175   4.344  1.00  0.00           O  \nATOM   2577  H   TYR A 161      44.569   2.375   1.713  1.00  0.00           H  \nATOM   2578  HA  TYR A 161      45.860   4.460   3.217  1.00  0.00           H  \nATOM   2579  HB2 TYR A 161      45.144   3.175   5.182  1.00  0.00           H  \nATOM   2580  HB3 TYR A 161      44.225   2.291   4.162  1.00  0.00           H  \nATOM   2581  HD1 TYR A 161      42.445   3.371   2.855  1.00  0.00           H  \nATOM   2582  HD2 TYR A 161      44.512   5.408   5.811  1.00  0.00           H  \nATOM   2583  HE1 TYR A 161      40.719   5.032   2.881  1.00  0.00           H  \nATOM   2584  HE2 TYR A 161      42.807   7.105   5.821  1.00  0.00           H  \nATOM   2585  HH  TYR A 161      40.773   7.959   4.958  1.00  0.00           H  \nATOM   2586  N   LYS A 162      47.298   1.997   2.362  1.00  0.00           N  \nATOM   2587  CA  LYS A 162      48.508   1.230   2.531  1.00  0.00           C  \nATOM   2588  C   LYS A 162      49.647   1.863   1.769  1.00  0.00           C  \nATOM   2589  O   LYS A 162      50.757   2.016   2.340  1.00  0.00           O  \nATOM   2590  CB  LYS A 162      48.368  -0.254   2.273  1.00  0.00           C  \nATOM   2591  CG  LYS A 162      47.496  -0.917   3.341  1.00  0.00           C  \nATOM   2592  CD  LYS A 162      46.720  -2.138   2.861  1.00  0.00           C  \nATOM   2593  CE  LYS A 162      46.717  -2.350   1.344  1.00  0.00           C  \nATOM   2594  NZ  LYS A 162      45.641  -3.237   0.865  1.00  0.00           N1+\nATOM   2595  H   LYS A 162      46.807   1.996   1.491  1.00  0.00           H  \nATOM   2596  HA  LYS A 162      48.749   1.315   3.498  1.00  0.00           H  \nATOM   2597  HB2 LYS A 162      49.275  -0.675   2.284  1.00  0.00           H  \nATOM   2598  HB3 LYS A 162      47.948  -0.392   1.376  1.00  0.00           H  \nATOM   2599  HG2 LYS A 162      46.838  -0.240   3.671  1.00  0.00           H  \nATOM   2600  HG3 LYS A 162      48.089  -1.201   4.095  1.00  0.00           H  \nATOM   2601  HD2 LYS A 162      45.771  -2.040   3.162  1.00  0.00           H  \nATOM   2602  HD3 LYS A 162      47.123  -2.948   3.286  1.00  0.00           H  \nATOM   2603  HE2 LYS A 162      47.595  -2.750   1.081  1.00  0.00           H  \nATOM   2604  HE3 LYS A 162      46.610  -1.459   0.902  1.00  0.00           H  \nATOM   2605  HZ1 LYS A 162      45.377  -2.970  -0.062  1.00  0.00           H  \nATOM   2606  HZ2 LYS A 162      45.966  -4.183   0.860  1.00  0.00           H  \nATOM   2607  HZ3 LYS A 162      44.850  -3.160   1.472  1.00  0.00           H  \nATOM   2608  N   NME A 163      49.484   2.242   0.547  1.00  0.00           N  \nATOM   2609  CH3 NME A 163      50.586   2.850  -0.178  1.00  0.00           C  \nATOM   2610  H   NME A 163      48.590   2.116   0.094  1.00  0.00           H  \nATOM   2611 1HH3 NME A 163      50.650   3.901   0.060  1.00  0.00           H  \nATOM   2612 2HH3 NME A 163      51.517   2.373   0.095  1.00  0.00           H  \nATOM   2613 3HH3 NME A 163      50.434   2.740  -1.242  1.00  0.00           H  \nEND\n"
  },
  {
    "path": "src/openfe/tests/data/CN.sdf",
    "content": "\n     RDKit          3D\n\n  7  6  0  0  0  0  0  0  0  0999 V2000\n   -0.5449    0.0217   -0.1813 C   0  0  0  0  0  0  0  0  0  0  0  0\n    0.8594   -0.2905    0.0155 N   0  0  0  0  0  0  0  0  0  0  0  0\n   -0.7263    0.3463   -1.2100 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -1.1601   -0.8593    0.0223 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -0.8528    0.8211    0.4984 H   0  0  0  0  0  0  0  0  0  0  0  0\n    0.9508   -1.2559    0.3287 H   0  0  0  0  0  0  0  0  0  0  0  0\n    1.2332    0.2879    0.7669 H   0  0  0  0  0  0  0  0  0  0  0  0\n  1  2  1  0\n  1  3  1  0\n  1  4  1  0\n  1  5  1  0\n  2  6  1  0\n  2  7  1  0\nM  END\n$$$$\n"
  },
  {
    "path": "src/openfe/tests/data/__init__.py",
    "content": ""
  },
  {
    "path": "src/openfe/tests/data/a2a/__init__.py",
    "content": ""
  },
  {
    "path": "src/openfe/tests/data/benzene_modifications.sdf",
    "content": "benzene\n  PyMOL2.5          3D                             0\n\n 12 12  0  0  0  0  0  0  0  0999 V2000\n   25.9780    5.3270    4.7790 C   0  0  0  0  0  0  0  0  0  0  0  0\n   26.3950    5.0740    3.4990 C   0  0  0  0  0  0  0  0  0  0  0  0\n   27.3400    5.8600    2.9020 C   0  0  0  0  0  0  0  0  0  0  0  0\n   27.8370    6.9210    3.5690 C   0  0  0  0  0  0  0  0  0  0  0  0\n   27.4200    7.1960    4.8560 C   0  0  0  0  0  0  0  0  0  0  0  0\n   26.4980    6.3790    5.4690 C   0  0  0  0  0  0  0  0  0  0  0  0\n   25.2298    4.6859    5.2451 H   0  0  0  0  0  0  0  0  0  0  0  0\n   25.9676    4.2351    2.9497 H   0  0  0  0  0  0  0  0  0  0  0  0\n   27.6890    5.6311    1.8951 H   0  0  0  0  0  0  0  0  0  0  0  0\n   28.5730    7.5660    3.0889 H   0  0  0  0  0  0  0  0  0  0  0  0\n   27.8209    8.0598    5.3863 H   0  0  0  0  0  0  0  0  0  0  0  0\n   26.1874    6.5720    6.4958 H   0  0  0  0  0  0  0  0  0  0  0  0\n  1  2  4  0  0  0  0\n  1  6  4  0  0  0  0\n  1  7  1  0  0  0  0\n  2  3  4  0  0  0  0\n  2  8  1  0  0  0  0\n  3  4  4  0  0  0  0\n  3  9  1  0  0  0  0\n  4  5  4  0  0  0  0\n  4 10  1  0  0  0  0\n  5  6  4  0  0  0  0\n  5 11  1  0  0  0  0\n  6 12  1  0  0  0  0\nM  END\n$$$$\ntoluene\n  PyMOL2.5          3D                             0\n\n 15 15  0  0  0  0  0  0  0  0999 V2000\n   28.9072    8.7434    5.1220 H   0  0  0  0  0  0  0  0  0  0  0  0\n   28.1966    8.1433    6.6393 H   0  0  0  0  0  0  0  0  0  0  0  0\n   27.9864    8.4164    5.6052 C   0  0  0  0  0  0  0  0  0  0  0  0\n   27.2579    9.2269    5.5838 H   0  0  0  0  0  0  0  0  0  0  0  0\n   25.9780    5.3270    4.7790 C   0  0  0  0  0  0  0  0  0  0  0  0\n   26.3950    5.0740    3.4990 C   0  0  0  0  0  0  0  0  0  0  0  0\n   27.3400    5.8600    2.9020 C   0  0  0  0  0  0  0  0  0  0  0  0\n   27.8370    6.9210    3.5690 C   0  0  0  0  0  0  0  0  0  0  0  0\n   27.4200    7.1960    4.8560 C   0  0  0  0  0  0  0  0  0  0  0  0\n   26.4980    6.3790    5.4690 C   0  0  0  0  0  0  0  0  0  0  0  0\n   25.2298    4.6859    5.2451 H   0  0  0  0  0  0  0  0  0  0  0  0\n   25.9676    4.2351    2.9497 H   0  0  0  0  0  0  0  0  0  0  0  0\n   27.6890    5.6311    1.8951 H   0  0  0  0  0  0  0  0  0  0  0  0\n   28.5730    7.5660    3.0889 H   0  0  0  0  0  0  0  0  0  0  0  0\n   26.1874    6.5720    6.4958 H   0  0  0  0  0  0  0  0  0  0  0  0\n  1  3  1  0  0  0  0\n  2  3  1  0  0  0  0\n  3  4  1  0  0  0  0\n  5  6  4  0  0  0  0\n  5 10  4  0  0  0  0\n  5 11  1  0  0  0  0\n  6  7  4  0  0  0  0\n  6 12  1  0  0  0  0\n  7  8  4  0  0  0  0\n  7 13  1  0  0  0  0\n  8  9  4  0  0  0  0\n  8 14  1  0  0  0  0\n  3  9  1  0  0  0  0\n  9 10  4  0  0  0  0\n 10 15  1  0  0  0  0\nM  END\n$$$$\nphenol\n  PyMOL2.5          3D                             0\n\n 13 13  0  0  0  0  0  0  0  0999 V2000\n   25.9780    5.3270    4.7790 C   0  0  0  0  0  0  0  0  0  0  0  0\n   26.3950    5.0740    3.4990 C   0  0  0  0  0  0  0  0  0  0  0  0\n   27.3400    5.8600    2.9020 C   0  0  0  0  0  0  0  0  0  0  0  0\n   27.8370    6.9210    3.5690 C   0  0  0  0  0  0  0  0  0  0  0  0\n   27.4200    7.1960    4.8560 C   0  0  0  0  0  0  0  0  0  0  0  0\n   26.4980    6.3790    5.4690 C   0  0  0  0  0  0  0  0  0  0  0  0\n   25.2298    4.6859    5.2451 H   0  0  0  0  0  0  0  0  0  0  0  0\n   25.9676    4.2351    2.9497 H   0  0  0  0  0  0  0  0  0  0  0  0\n   27.6890    5.6311    1.8951 H   0  0  0  0  0  0  0  0  0  0  0  0\n   28.5730    7.5660    3.0889 H   0  0  0  0  0  0  0  0  0  0  0  0\n   28.1311    8.0887    6.4624 H   0  0  0  0  0  0  0  0  0  0  0  0\n   26.1874    6.5720    6.4958 H   0  0  0  0  0  0  0  0  0  0  0  0\n   27.9460    8.3293    5.5517 O   0  0  0  0  0  0  0  0  0  0  0  0\n  1  2  4  0  0  0  0\n  1  6  4  0  0  0  0\n  1  7  1  0  0  0  0\n  2  3  4  0  0  0  0\n  2  8  1  0  0  0  0\n  3  4  4  0  0  0  0\n  3  9  1  0  0  0  0\n  4  5  4  0  0  0  0\n  4 10  1  0  0  0  0\n  5  6  4  0  0  0  0\n  5 13  1  0  0  0  0\n  6 12  1  0  0  0  0\n 11 13  1  0  0  0  0\nM  END\n$$$$\nbenzonitrile\n  PyMOL2.5          3D                             0\n\n 13 13  0  0  0  0  0  0  0  0999 V2000\n   28.5559    9.5700    6.2831 N   0  0  0  0  0  0  0  0  0  0  0  0\n   27.9981    8.4043    5.5824 C   0  0  0  0  0  0  0  0  0  0  0  0\n   25.9780    5.3270    4.7790 C   0  0  0  0  0  0  0  0  0  0  0  0\n   26.3950    5.0740    3.4990 C   0  0  0  0  0  0  0  0  0  0  0  0\n   27.3400    5.8600    2.9020 C   0  0  0  0  0  0  0  0  0  0  0  0\n   27.8370    6.9210    3.5690 C   0  0  0  0  0  0  0  0  0  0  0  0\n   27.4200    7.1960    4.8560 C   0  0  0  0  0  0  0  0  0  0  0  0\n   26.4980    6.3790    5.4690 C   0  0  0  0  0  0  0  0  0  0  0  0\n   25.2298    4.6859    5.2451 H   0  0  0  0  0  0  0  0  0  0  0  0\n   25.9676    4.2351    2.9497 H   0  0  0  0  0  0  0  0  0  0  0  0\n   27.6890    5.6311    1.8951 H   0  0  0  0  0  0  0  0  0  0  0  0\n   28.5730    7.5660    3.0889 H   0  0  0  0  0  0  0  0  0  0  0  0\n   26.1874    6.5720    6.4958 H   0  0  0  0  0  0  0  0  0  0  0  0\n  1  2  3  0  0  0  0\n  3  4  4  0  0  0  0\n  3  8  4  0  0  0  0\n  3  9  1  0  0  0  0\n  4  5  4  0  0  0  0\n  4 10  1  0  0  0  0\n  5  6  4  0  0  0  0\n  5 11  1  0  0  0  0\n  6  7  4  0  0  0  0\n  6 12  1  0  0  0  0\n  2  7  1  0  0  0  0\n  7  8  4  0  0  0  0\n  8 13  1  0  0  0  0\nM  END\n$$$$\nanisole\n  PyMOL2.5          3D                             0\n\n 16 16  0  0  0  0  0  0  0  0999 V2000\n   29.2873    8.8784    4.9226 C   0  0  0  0  0  0  0  0  0  0  0  0\n   29.5502    9.7990    5.4437 H   0  0  0  0  0  0  0  0  0  0  0  0\n   28.0548    8.3459    5.4720 O   0  0  0  0  0  0  0  0  0  0  0  0\n   30.0866    8.1484    5.0502 H   0  0  0  0  0  0  0  0  0  0  0  0\n   29.1525    9.0868    3.8612 H   0  0  0  0  0  0  0  0  0  0  0  0\n   25.9780    5.3270    4.7790 C   0  0  0  0  0  0  0  0  0  0  0  0\n   26.3950    5.0740    3.4990 C   0  0  0  0  0  0  0  0  0  0  0  0\n   27.3400    5.8600    2.9020 C   0  0  0  0  0  0  0  0  0  0  0  0\n   27.8370    6.9210    3.5690 C   0  0  0  0  0  0  0  0  0  0  0  0\n   27.4200    7.1960    4.8560 C   0  0  0  0  0  0  0  0  0  0  0  0\n   26.4980    6.3790    5.4690 C   0  0  0  0  0  0  0  0  0  0  0  0\n   25.2298    4.6859    5.2451 H   0  0  0  0  0  0  0  0  0  0  0  0\n   25.9676    4.2351    2.9497 H   0  0  0  0  0  0  0  0  0  0  0  0\n   27.6890    5.6311    1.8951 H   0  0  0  0  0  0  0  0  0  0  0  0\n   28.5730    7.5660    3.0889 H   0  0  0  0  0  0  0  0  0  0  0  0\n   26.1874    6.5720    6.4958 H   0  0  0  0  0  0  0  0  0  0  0  0\n  1  2  1  0  0  0  0\n  1  4  1  0  0  0  0\n  1  5  1  0  0  0  0\n  1  3  1  0  0  0  0\n  6  7  4  0  0  0  0\n  6 11  4  0  0  0  0\n  6 12  1  0  0  0  0\n  7  8  4  0  0  0  0\n  7 13  1  0  0  0  0\n  8  9  4  0  0  0  0\n  8 14  1  0  0  0  0\n  9 10  4  0  0  0  0\n  9 15  1  0  0  0  0\n  3 10  1  0  0  0  0\n 10 11  4  0  0  0  0\n 11 16  1  0  0  0  0\nM  END\n$$$$\nbenzaldehyde\n  PyMOL2.5          3D                             0\n\n 14 14  0  0  0  0  0  0  0  0999 V2000\n   29.2079    8.8492    4.9632 O   0  0  0  0  0  0  0  0  0  0  0  0\n   27.5482    8.8691    6.4597 H   0  0  0  0  0  0  0  0  0  0  0  0\n   27.9981    8.4043    5.5824 C   0  0  0  0  0  0  0  0  0  0  0  0\n   25.9780    5.3270    4.7790 C   0  0  0  0  0  0  0  0  0  0  0  0\n   26.3950    5.0740    3.4990 C   0  0  0  0  0  0  0  0  0  0  0  0\n   27.3400    5.8600    2.9020 C   0  0  0  0  0  0  0  0  0  0  0  0\n   27.8370    6.9210    3.5690 C   0  0  0  0  0  0  0  0  0  0  0  0\n   27.4200    7.1960    4.8560 C   0  0  0  0  0  0  0  0  0  0  0  0\n   26.4980    6.3790    5.4690 C   0  0  0  0  0  0  0  0  0  0  0  0\n   25.2298    4.6859    5.2451 H   0  0  0  0  0  0  0  0  0  0  0  0\n   25.9676    4.2351    2.9497 H   0  0  0  0  0  0  0  0  0  0  0  0\n   27.6890    5.6311    1.8951 H   0  0  0  0  0  0  0  0  0  0  0  0\n   28.5730    7.5660    3.0889 H   0  0  0  0  0  0  0  0  0  0  0  0\n   26.1874    6.5720    6.4958 H   0  0  0  0  0  0  0  0  0  0  0  0\n  1  3  2  0  0  0  0\n  2  3  1  0  0  0  0\n  4  5  4  0  0  0  0\n  4  9  4  0  0  0  0\n  4 10  1  0  0  0  0\n  5  6  4  0  0  0  0\n  5 11  1  0  0  0  0\n  6  7  4  0  0  0  0\n  6 12  1  0  0  0  0\n  7  8  4  0  0  0  0\n  7 13  1  0  0  0  0\n  3  8  1  0  0  0  0\n  8  9  4  0  0  0  0\n  9 14  1  0  0  0  0\nM  END\n$$$$\nstyrene\n  PyMOL2.5          3D                             0\n\n 16 16  0  0  0  0  0  0  0  0999 V2000\n   29.2873    8.8784    4.9226 C   0  0  0  0  0  0  0  0  0  0  0  0\n   29.6609    8.3486    4.0463 H   0  0  0  0  0  0  0  0  0  0  0  0\n   29.8344    9.7353    5.3157 H   0  0  0  0  0  0  0  0  0  0  0  0\n   27.5365    8.8812    6.4825 H   0  0  0  0  0  0  0  0  0  0  0  0\n   27.9864    8.4164    5.6052 C   0  0  0  0  0  0  0  0  0  0  0  0\n   25.9780    5.3270    4.7790 C   0  0  0  0  0  0  0  0  0  0  0  0\n   26.3950    5.0740    3.4990 C   0  0  0  0  0  0  0  0  0  0  0  0\n   27.3400    5.8600    2.9020 C   0  0  0  0  0  0  0  0  0  0  0  0\n   27.8370    6.9210    3.5690 C   0  0  0  0  0  0  0  0  0  0  0  0\n   27.4200    7.1960    4.8560 C   0  0  0  0  0  0  0  0  0  0  0  0\n   26.4980    6.3790    5.4690 C   0  0  0  0  0  0  0  0  0  0  0  0\n   25.2298    4.6859    5.2451 H   0  0  0  0  0  0  0  0  0  0  0  0\n   25.9676    4.2351    2.9497 H   0  0  0  0  0  0  0  0  0  0  0  0\n   27.6890    5.6311    1.8951 H   0  0  0  0  0  0  0  0  0  0  0  0\n   28.5730    7.5660    3.0889 H   0  0  0  0  0  0  0  0  0  0  0  0\n   26.1874    6.5720    6.4958 H   0  0  0  0  0  0  0  0  0  0  0  0\n  1  2  1  0  0  0  0\n  1  3  1  0  0  0  0\n  1  5  2  0  0  0  0\n  4  5  1  0  0  0  0\n  6  7  4  0  0  0  0\n  6 11  4  0  0  0  0\n  6 12  1  0  0  0  0\n  7  8  4  0  0  0  0\n  7 13  1  0  0  0  0\n  8  9  4  0  0  0  0\n  8 14  1  0  0  0  0\n  9 10  4  0  0  0  0\n  9 15  1  0  0  0  0\n  5 10  1  0  0  0  0\n 10 11  4  0  0  0  0\n 11 16  1  0  0  0  0\nM  END\n$$$$"
  },
  {
    "path": "src/openfe/tests/data/cdk8/__init__.py",
    "content": ""
  },
  {
    "path": "src/openfe/tests/data/cdk8/cdk8_ligands.sdf",
    "content": "lig_40\n     RDKit          3D\n\n 55 59  0  0  0  0  0  0  0  0999 V2000\n   -2.1629   14.4632   -7.7736 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -1.6358   13.6804   -7.2468 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -0.4242   13.9183   -6.7602 N   0  0  0  0  0  0  0  0  0  0  0  0\n   -0.0745   12.7682   -6.1303 N   0  0  0  0  0  0  0  0  0  0  0  0\n    1.1739   12.6893   -5.4058 C   0  0  0  0  0  0  0  0  0  0  0  0\n    1.3405   11.6624   -5.0598 H   0  0  0  0  0  0  0  0  0  0  0  0\n    2.0071   12.9749   -6.0470 H   0  0  0  0  0  0  0  0  0  0  0  0\n    1.1432   13.3640   -4.5458 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -1.0394   11.7936   -6.2530 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -0.9271   10.8145   -5.8143 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -2.0646   12.3553   -6.9521 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -3.3612   11.7367   -7.2677 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -3.4353   10.4402   -7.8240 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -2.5291    9.8930   -8.0497 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -4.6843    9.8342   -8.0582 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -4.7212    8.8327   -8.4668 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -5.8788   10.5137   -7.7409 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.2257    9.8514   -7.9841 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.0088   10.4290   -7.4862 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.2161    8.8796   -7.4854 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.5621    9.6839   -9.4431 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.2465    8.6457   -9.8601 N   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.4159    8.8045  -11.1975 N   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.9502    8.1258  -11.7289 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.8273    9.9474  -11.6947 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.2413   10.5449  -10.5484 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -6.5294   11.7467  -10.7406 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -6.0852   12.2336   -9.8863 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -6.3563   12.3077  -12.0259 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -5.5362   13.5572  -12.1825 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -5.9634   14.4904  -12.8591 O   0  0  0  0  0  0  0  0  0  0  0  0\n   -4.3771   13.6269  -11.4873 N   0  0  0  0  0  0  0  0  0  0  0  0\n   -3.5313   12.4788  -11.1187 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -3.9497   11.5214  -11.4400 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -3.4548   12.4356  -10.0313 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -2.1266   12.6153  -11.7432 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -1.4575   11.8547  -11.3364 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -2.1916   12.4202  -12.8140 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -1.5271   13.9516  -11.4995 N   0  0  0  0  0  4  0  0  0  0  0  0\n   -1.2173   13.9804  -10.5399 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -2.4434   15.0961  -11.7287 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -1.9564   16.0116  -11.3987 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -2.6466   15.2159  -12.7917 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -3.7957   14.8958  -11.0443 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -3.6689   14.8810   -9.9610 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -4.4493   15.7424  -11.2583 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.0022   11.7149  -13.1320 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -6.9139   12.1537  -14.1143 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.7332   10.5264  -12.9709 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.2191   10.0653  -13.8172 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -5.8120   11.8110   -7.1954 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -6.7168   12.3529   -6.9524 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -4.5610   12.4178   -6.9739 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -4.5187   13.4065   -6.5450 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -0.7052   14.0647  -12.0846 H   0  0  0  0  0  0  0  0  0  0  0  0\n  1  2  1  0\n  2 11  1  0\n  2  3  2  0\n  3  4  1  0\n  4  5  1  0\n  4  9  1  0\n  5  6  1  0\n  5  7  1  0\n  5  8  1  0\n  9 10  1  0\n  9 11  2  0\n 11 12  1  0\n 12 53  1  0\n 12 13  2  0\n 13 14  1  0\n 13 15  1  0\n 15 16  1  0\n 15 17  2  0\n 17 18  1  0\n 17 51  1  0\n 18 19  1  0\n 18 20  1  0\n 18 21  1  0\n 21 26  1  0\n 21 22  2  0\n 22 23  1  0\n 23 24  1  0\n 23 25  1  0\n 25 49  1  0\n 25 26  2  0\n 26 27  1  0\n 27 28  1  0\n 27 29  2  0\n 29 30  1  0\n 29 47  1  0\n 30 31  2  0\n 30 32  1  0\n 32 44  1  0\n 32 33  1  0\n 33 34  1  0\n 33 35  1  0\n 33 36  1  0\n 36 37  1  0\n 36 38  1  0\n 36 39  1  0\n 39 40  1  0\n 39 41  1  0\n 39 55  1  0\n 41 42  1  0\n 41 43  1  0\n 41 44  1  0\n 44 45  1  0\n 44 46  1  0\n 47 48  1  0\n 47 49  2  0\n 49 50  1  0\n 51 52  1  0\n 51 53  2  0\n 53 54  1  0\nM  CHG  1  39   1\nM  END\n\n>  <s_m_source_file>\nligprep_cdk8.smi\n\n>  <i_m_source_file_index>\n28\n\n>  <i_lp_mmshare_version>\n53161\n\n>  <i_f3d_flags>\n0\n\n>  <s_epik_input>\nW0NIM11uMW5bY0hdYyhbY0hdMSktYzJbY0hdW2NIXWMoW2NIXVtjSF0yKVtDSDJdYyhuW25IXTMpYyhjMzQpW2NIXWMoW2NIXVtjSF00KUMoPU8pTjVbQ0gyXVtDSDJdW05IXVtDSDJdW0NIMl01\n\n>  <s_epik_cmdline>\nJ2VwaWtfcHl0aG9uJywgJy1waHQnLCAnMC4wJywgJy1waCcsICc3LjQnLCAnLXRuJywgJzgnLCAnLW1hJywgJzUwMCcsICctaW1hZScsICc8aW5maWxlLm1hZT4nLCAnLW9tYWUnLCAnPG91dGZpbGUubWFlPic=\n\n>  <r_lp_tautomer_probability>\n0.98039200000000004\n\n>  <r_epik_Ionization_Penalty>\n  0.1225\n\n>  <r_epik_Ionization_Penalty_Charging>\n  0.1225\n\n>  <r_epik_Ionization_Penalty_Neutral>\n  0.0001\n\n>  <r_epik_State_Penalty>\n  0.1120\n\n>  <r_epik_Charging_Adjusted_Penalty>\n0.234459\n\n>  <i_epik_Tot_Q>\n1\n\n>  <i_epik_Tot_abs_Q>\n1\n\n>  <s_lp_Force_Field>\nS-OPLS\n\n>  <r_lp_Energy>\n47.434600000000003\n\n>  <b_lp_Chiralities_Consistent>\n1\n\n>  <s_lp_Variant>\nlig_40-1\n\n>  <s_i_glide_gridfile>\nglide-grid_CDK8-5HNB\n\n>  <i_i_glide_lignum>\n28\n\n>  <i_i_glide_rotatable_bonds>\n5\n\n>  <r_i_docking_score>\n-10.680521562383699\n\n>  <r_i_glide_ligand_efficiency>\n-0.35601738541278899\n\n>  <r_i_glide_ligand_efficiency_sa>\n-1.1062287913851501\n\n>  <r_i_glide_ligand_efficiency_ln>\n-2.42673087257679\n\n>  <r_i_glide_gscore>\n-10.792521562383699\n\n>  <r_i_glide_lipo>\n-4.2718306350450801\n\n>  <r_i_glide_hbond>\n-0.59065016807439996\n\n>  <r_i_glide_metal>\n0\n\n>  <r_i_glide_rewards>\n-2.2052956385914499\n\n>  <r_i_glide_evdw>\n-48.461879730224602\n\n>  <r_i_glide_ecoul>\n-11.060666084289601\n\n>  <r_i_glide_erotb>\n0.42590076043445002\n\n>  <r_i_glide_esite>\n-0.068451981952531202\n\n>  <r_i_glide_emodel>\n-99.420097957526707\n\n>  <r_i_glide_energy>\n-59.522545814514203\n\n>  <r_i_glide_einternal>\n4.2033767700195304\n\n>  <i_i_glide_confnum>\n28\n\n>  <i_i_glide_posenum>\n19\n\n>  <r_i_glide_eff_state_penalty>\n0.112\n\n>  <r_i_glide_rmsd>\n0.097333152874369194\n\n>  <s_glide_core_constrain_type>\nsnapped_core_restrain\n\n>  <ofe-name>\nlig_40\n\n>  <atom.dprop.PartialCharge>\n0.036118163636363637 0.23521816363636364 -0.5287818363636364 0.10041816363636363 0.028618163636363637 0.072385163636363631 0.072385163636363631 0.072385163636363631 -0.12028183636363637\n0.19601816363636365 -0.20128183636363636 -0.025981836363636362 -0.12848183636363636 0.13651816363636365 -0.11948183636363637 0.14851816363636364 -0.070281836363636371 -0.051381836363636364\n0.083218163636363626 0.083218163636363626 0.35791816363636364 -0.48808183636363633 -0.0060818363636363643 0.34071816363636365 -0.020181836363636362 -0.22488183636363634\n-0.021981836363636362 0.15101816363636364 -0.20058183636363636 0.69771816363636363 -0.55508183636363639 -0.50978183636363639 0.073018163636363626 0.099718163636363627 0.099718163636363627\n0.078818163636363625 0.11046816363636364 0.11046816363636364 -0.76198183636363637 0.45881816363636363 0.078818163636363625 0.11046816363636364 0.11046816363636364 0.073018163636363626\n0.099718163636363627 0.099718163636363627 -0.053981836363636362 0.15801816363636365 -0.13898183636363637 0.15801816363636365 -0.11948183636363637 0.14851816363636364 -0.12848183636363636\n0.13651816363636365 0.45881816363636363\n\n$$$$\nlig_41\n     RDKit          3D\n\n 55 59  0  0  0  0  0  0  0  0999 V2000\n   -2.0940   14.3956   -7.8003 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -1.6017   13.6239   -7.2266 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -0.3906   13.8491   -6.7320 N   0  0  0  0  0  0  0  0  0  0  0  0\n   -0.0688   12.7144   -6.0644 N   0  0  0  0  0  0  0  0  0  0  0  0\n    1.1957   12.6229   -5.3651 C   0  0  0  0  0  0  0  0  0  0  0  0\n    1.3268   11.6198   -4.9582 H   0  0  0  0  0  0  0  0  0  0  0  0\n    2.0199   12.8371   -6.0449 H   0  0  0  0  0  0  0  0  0  0  0  0\n    1.2148   13.3414   -4.5452 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -1.0674   11.7696   -6.1429 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -0.9864   10.8164   -5.6488 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -2.0672   12.3248   -6.8862 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -3.3663   11.7213   -7.2183 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -3.4422   10.4235   -7.7718 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -2.5346    9.8737   -7.9804 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -4.6900    9.8316   -8.0456 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -4.7266    8.8351   -8.4599 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -5.8851   10.5169   -7.7457 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.2334    9.8517   -7.9879 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.0159   10.4377   -7.5059 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.2295    8.8924   -7.4690 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.5740    9.6595   -9.4434 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.2466    8.6100   -9.8517 N   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.4161    8.7528  -11.1901 N   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.9325    8.0540  -11.7148 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.8492    9.9034  -11.6988 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.2733   10.5152  -10.5542 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -6.5852   11.7254  -10.7494 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -6.1416   12.2127   -9.8955 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -6.4115   12.2761  -12.0371 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -5.5980   13.5247  -12.1904 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -6.0453   14.4651  -12.8445 O   0  0  0  0  0  0  0  0  0  0  0  0\n   -4.4365   13.5849  -11.4988 N   0  0  0  0  0  0  0  0  0  0  0  0\n   -3.9078   14.8617  -11.0123 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -3.8358   14.8270   -9.9235 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -4.5618   15.7015  -11.2462 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -2.5318   15.0946  -11.6256 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -2.0928   16.0158  -11.2571 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -2.6508   15.2154  -12.6977 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -1.5867   13.9366  -11.2919 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -0.6468   14.1050  -11.8040 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -1.3643   13.9425  -10.2248 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -2.1867   12.5771  -11.6800 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -2.2113   12.4743  -12.7658 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -1.5503   11.7721  -11.3123 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -3.6081   12.4272  -11.1131 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -3.5739   12.3558  -10.0267 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -4.0136   11.4827  -11.4745 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.0394   11.6742  -13.1502 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -6.9504   12.1148  -14.1328 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.7689   10.4812  -12.9779 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.2463   10.0157  -13.8273 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -5.8146   11.8190   -7.2061 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -6.7182   12.3646   -6.9754 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -4.5653   12.4185   -6.9578 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -4.5306   13.4109   -6.5337 H   0  0  0  0  0  0  0  0  0  0  0  0\n  1  2  1  0\n  2 11  1  0\n  2  3  2  0\n  3  4  1  0\n  4  5  1  0\n  4  9  1  0\n  5  6  1  0\n  5  7  1  0\n  5  8  1  0\n  9 10  1  0\n  9 11  2  0\n 11 12  1  0\n 12 54  1  0\n 12 13  2  0\n 13 14  1  0\n 13 15  1  0\n 15 16  1  0\n 15 17  2  0\n 17 18  1  0\n 17 52  1  0\n 18 19  1  0\n 18 20  1  0\n 18 21  1  0\n 21 26  1  0\n 21 22  2  0\n 22 23  1  0\n 23 24  1  0\n 23 25  1  0\n 25 50  1  0\n 25 26  2  0\n 26 27  1  0\n 27 28  1  0\n 27 29  2  0\n 29 30  1  0\n 29 48  1  0\n 30 31  2  0\n 30 32  1  0\n 32 45  1  0\n 32 33  1  0\n 33 34  1  0\n 33 35  1  0\n 33 36  1  0\n 36 37  1  0\n 36 38  1  0\n 36 39  1  0\n 39 40  1  0\n 39 41  1  0\n 39 42  1  0\n 42 43  1  0\n 42 44  1  0\n 42 45  1  0\n 45 46  1  0\n 45 47  1  0\n 48 49  1  0\n 48 50  2  0\n 50 51  1  0\n 52 53  1  0\n 52 54  2  0\n 54 55  1  0\nM  END\n\n>  <s_m_source_file>\nligprep_cdk8.smi\n\n>  <i_m_source_file_index>\n29\n\n>  <i_lp_mmshare_version>\n53161\n\n>  <i_f3d_flags>\n0\n\n>  <s_epik_input>\nW0NIM11uMW5bY0hdYyhbY0hdMSktYzJbY0hdW2NIXWMoW2NIXVtjSF0yKVtDSDJdYyhuW25IXTMpYyhjMzQpW2NIXWMoW2NIXVtjSF00KUMoPU8pTjVbQ0gyXVtDSDJdW0NIMl1bQ0gyXVtDSDJdNQ==\n\n>  <s_epik_cmdline>\nJ2VwaWtfcHl0aG9uJywgJy1waHQnLCAnMC4wJywgJy1waCcsICc3LjQnLCAnLXRuJywgJzgnLCAnLW1hJywgJzUwMCcsICctaW1hZScsICc8aW5maWxlLm1hZT4nLCAnLW9tYWUnLCAnPG91dGZpbGUubWFlPic=\n\n>  <r_lp_tautomer_probability>\n1\n\n>  <r_epik_Ionization_Penalty>\n  0.0001\n\n>  <r_epik_Ionization_Penalty_Charging>\n  0.0000\n\n>  <ofe-name>\nlig_41\n\n>  <atom.dprop.PartialCharge>\n0.04415452727272727 0.31125452727272723 -0.50974547272727277 0.086454527272727275 0.040654527272727267 0.058421527272727272 0.058421527272727272 0.058421527272727272 -0.12924547272727271\n0.17605452727272727 -0.2122454727272727 0.01605452727272727 -0.12894547272727272 0.13005452727272729 -0.11594547272727274 0.13555452727272729 -0.087245472727272733 -0.04234547272727273\n0.066254527272727265 0.066254527272727265 0.36395452727272726 -0.51304547272727274 -0.01604547272727273 0.32075452727272724 -0.037145472727272727 -0.21884547272727273 -0.025945472727272729\n0.14905452727272728 -0.16554547272727271 0.66475452727272721 -0.59604547272727271 -0.45074547272727272 0.076554527272727269 0.060504527272727267 0.060504527272727267 -0.10334547272727274\n0.050254527272727272 0.050254527272727272 -0.078345472727272727 0.042254527272727271 0.042254527272727271 -0.10334547272727274 0.050254527272727272 0.050254527272727272\n0.076554527272727269 0.060504527272727267 0.060504527272727267 -0.059945472727272728 0.15105452727272728 -0.14894547272727271 0.14405452727272727 -0.11594547272727274 0.13555452727272729\n-0.12894547272727272 0.13005452727272729\n\n$$$$\nlig_30\n     RDKit          3D\n\n 53 57  0  0  0  0  0  0  0  0999 V2000\n   -0.7872   12.8089  -12.2992 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -1.6810   12.4903  -12.2318 O   0  0  0  0  0  0  0  0  0  0  0  0\n   -2.2207   12.9887  -11.0250 C   0  0  2  0  0  0  0  0  0  0  0  0\n   -1.6495   12.5822  -10.1897 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -3.6815   12.5709  -10.9758 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -3.8462   11.6095  -11.4691 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -3.9905   12.4692   -9.9390 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -4.4241   13.6755  -11.5866 N   0  0  0  0  0  0  0  0  0  0  0  0\n   -5.6265   13.5854  -12.1973 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -6.0768   14.4908  -12.8958 O   0  0  0  0  0  0  0  0  0  0  0  0\n   -6.4289   12.3272  -12.0050 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -6.6168   11.7969  -10.7099 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -6.2085   12.3107   -9.8540 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.2892   10.5758  -10.5034 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.8466    9.9372  -11.6429 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.7616   10.4948  -12.9294 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.2338   10.0090  -13.7712 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.0367   11.6895  -13.1113 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -6.9384   12.1042  -14.1037 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.4087    8.7895  -11.1253 N   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.9146    8.0807  -11.6463 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.2463    8.6650   -9.7838 N   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.5899    9.7283   -9.3851 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.2591    9.9313   -7.9327 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.0228   10.5596   -7.4737 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.3026    8.9850   -7.3918 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -5.8857   10.5450   -7.6982 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -4.7155    9.8390   -8.0465 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -4.7899    8.8534   -8.4813 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -3.4457   10.3996   -7.7905 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -2.5579    9.8333   -8.0362 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -3.3257   11.6858   -7.2212 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -2.0109   12.2862   -6.9485 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -0.9802   11.7445   -6.2408 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -0.8730   10.8064   -5.7341 H   0  0  0  0  0  0  0  0  0  0  0  0\n    0.0037   12.7029   -6.1759 N   0  0  0  0  0  0  0  0  0  0  0  0\n    1.2605   12.6437   -5.4522 C   0  0  0  0  0  0  0  0  0  0  0  0\n    1.2787   11.7660   -4.8062 H   0  0  0  0  0  0  0  0  0  0  0  0\n    2.1045   12.5820   -6.1327 H   0  0  0  0  0  0  0  0  0  0  0  0\n    1.3738   13.5350   -4.8370 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -0.3416   13.8252   -6.8501 N   0  0  0  0  0  0  0  0  0  0  0  0\n   -1.5621   13.5856   -7.3107 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -2.0765   14.3558   -7.8632 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -4.5022   12.3907   -6.8902 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -4.4324   13.3680   -6.4362 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -5.7707   11.8235   -7.1167 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -6.6533   12.3780   -6.8411 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -3.5752   14.8613  -11.7075 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -4.0336   15.7303  -11.2344 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -3.4217   15.0942  -12.7628 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -2.2458   14.5110  -11.0388 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -2.2410   14.8972  -10.0218 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -1.3883   14.9475  -11.5541 H   0  0  0  0  0  0  0  0  0  0  0  0\n  1  2  1  0\n  2  3  1  0\n  3 51  1  0\n  3  4  1  1\n  3  5  1  0\n  5  6  1  0\n  5  7  1  0\n  5  8  1  0\n  8  9  1  0\n  8 48  1  0\n  9 10  2  0\n  9 11  1  0\n 11 18  1  0\n 11 12  2  0\n 12 13  1  0\n 12 14  1  0\n 14 23  1  0\n 14 15  2  0\n 15 16  1  0\n 15 20  1  0\n 16 17  1  0\n 16 18  2  0\n 18 19  1  0\n 20 21  1  0\n 20 22  1  0\n 22 23  2  0\n 23 24  1  0\n 24 25  1  0\n 24 26  1  0\n 24 27  1  0\n 27 46  1  0\n 27 28  2  0\n 28 29  1  0\n 28 30  1  0\n 30 31  1  0\n 30 32  2  0\n 32 33  1  0\n 32 44  1  0\n 33 42  1  0\n 33 34  2  0\n 34 35  1  0\n 34 36  1  0\n 36 37  1  0\n 36 41  1  0\n 37 38  1  0\n 37 39  1  0\n 37 40  1  0\n 41 42  2  0\n 42 43  1  0\n 44 45  1  0\n 44 46  2  0\n 46 47  1  0\n 48 49  1  0\n 48 50  1  0\n 48 51  1  0\n 51 52  1  0\n 51 53  1  0\nM  END\n\n>  <s_m_source_file>\nligprep_cdk8.smi\n\n>  <i_m_source_file_index>\n18\n\n>  <i_lp_mmshare_version>\n53161\n\n>  <i_f3d_flags>\n0\n\n>  <s_epik_input>\nW09IXVtDQEBIXTFbQ0gyXU4oW0NIMl1bQ0gyXTEpQyg9TyljKFtjSF0yKVtjSF1bY0hdYyhjMjMpW25IXW5jM1tDSDJdYzRbY0hdW2NIXWMoW2NIXVtjSF00KS1jNVtjSF1uKFtDSDNdKW5bY0hdNQ==\n\n>  <s_epik_cmdline>\nJ2VwaWtfcHl0aG9uJywgJy1waHQnLCAnMC4wJywgJy1waCcsICc3LjQnLCAnLXRuJywgJzgnLCAnLW1hJywgJzUwMCcsICctaW1hZScsICc8aW5maWxlLm1hZT4nLCAnLW9tYWUnLCAnPG91dGZpbGUubWFlPic=\n\n>  <r_lp_tautomer_probability>\n1\n\n>  <r_epik_Ionization_Penalty>\n  0.0001\n\n>  <r_epik_Ionization_Penalty_Charging>\n  0.0000\n\n>  <r_epik_Ionization_Penalty_Neutral>\n  0.0001\n\n>  <r_epik_State_Penalty>\n -0.0000\n\n>  <r_epik_Charging_Adjusted_Penalty>\n0\n\n>  <i_epik_Tot_Q>\n0\n\n>  <i_epik_Tot_abs_Q>\n0\n\n>  <s_lp_Force_Field>\nS-OPLS\n\n>  <r_lp_Energy>\n35.030500000000004\n\n>  <b_lp_Chiralities_Consistent>\n1\n\n>  <s_lp_Variant>\nlig_30-1\n\n>  <s_i_glide_gridfile>\nglide-grid_CDK8-5HNB\n\n>  <i_i_glide_lignum>\n18\n\n>  <i_i_glide_rotatable_bonds>\n6\n\n>  <r_i_docking_score>\n-10.579279438061199\n\n>  <r_i_glide_ligand_efficiency>\n-0.35264264793537298\n\n>  <r_i_glide_ligand_efficiency_sa>\n-1.0957426974081499\n\n>  <r_i_glide_ligand_efficiency_ln>\n-2.40372755880942\n\n>  <r_i_glide_gscore>\n-10.579279438061199\n\n>  <r_i_glide_lipo>\n-4.1426126450426102\n\n>  <r_i_glide_hbond>\n-0.84002522740766805\n\n>  <r_i_glide_metal>\n0\n\n>  <r_i_glide_rewards>\n-2.4153608052563298\n\n>  <r_i_glide_evdw>\n-49.6699028015137\n\n>  <r_i_glide_ecoul>\n-8.0594644546508807\n\n>  <r_i_glide_erotb>\n0.51113404791874395\n\n>  <r_i_glide_esite>\n0\n\n>  <r_i_glide_emodel>\n-93.737816678333004\n\n>  <r_i_glide_energy>\n-57.729367256164601\n\n>  <r_i_glide_einternal>\n3.3176975250244101\n\n>  <i_i_glide_confnum>\n2\n\n>  <i_i_glide_posenum>\n10\n\n>  <r_i_glide_eff_state_penalty>\n0\n\n>  <r_i_glide_rmsd>\n0.057393311469585498\n\n>  <s_glide_core_constrain_type>\nsnapped_core_restrain\n\n>  <ofe-name>\nlig_30\n\n>  <atom.dprop.PartialCharge>\n0.40396224528301888 -0.59383775471698108 0.12506224528301885 0.047662245283018864 0.07596224528301887 0.067162245283018868 0.067162245283018868 -0.44783775471698112 0.66666224528301887\n-0.59313775471698105 -0.16863775471698114 -0.022037754716981134 0.14796224528301885 -0.22093775471698116 -0.032237754716981135 -0.15103775471698114 0.14396224528301885\n-0.055037754716981135 0.15396224528301886 -0.018137754716981137 0.32366224528301885 -0.51213775471698109 0.36286224528301886 -0.041437754716981134 0.065162245283018866 0.065162245283018866\n-0.08633775471698113 -0.11603775471698113 0.13496224528301887 -0.12853775471698115 0.12946224528301886 0.015962245283018865 -0.21133775471698113 -0.12933775471698114 0.17696224528301885\n0.086362245283018876 0.040562245283018862 0.058329245283018867 0.058329245283018867 0.058329245283018867 -0.50983775471698112 0.31116224528301883 0.044062245283018865 -0.12853775471698115\n0.12946224528301886 -0.11603775471698113 0.13496224528301887 0.074962245283018869 0.064162245283018865 0.064162245283018865 -0.13343775471698113 0.058662245283018867 0.058662245283018867\n\n$$$$\n"
  },
  {
    "path": "src/openfe/tests/data/cdk8/cdk8_protein.pdb",
    "content": "HEADER    TRANSFERASE                             18-JAN-16   5HNB\nTITLE     CDK8-CYCC IN COMPLEX WITH\nTITLE    2 [6-HYDROXY-3-(3-METHYL-BENZYL)-1H-INDAZOL-5-\nTITLE    3 YL]-((S)-3-HYDROXY-PYRROLIDIN-1-YL)-METHANONE\nEXPDTA    X-RAY DIFFRACTION\nREMARK   2 RESOLUTION.    2.35 ANGSTROMS\nREMARK   3  R VALUE : 0.217000\nREMARK   3  FREE R VALUE : 0.252000\nREMARK   4 5HNB COMPLIES WITH FORMAT V. 3.30,\nREMARK 200  TEMPERATURE           (KELVIN) : 100.00\nREMARK 200  PH                             : 6.90\nREMARK 350 BIOMOLECULE: 1\nREMARK 350 APPLY THE FOLLOWING TO CHAINS: A, B\nREMARK 350   BIOMT1  1   1.000000 0.000000 0.000000   0.000000\nREMARK 350   BIOMT2  1   0.000000 1.000000 0.000000   0.000000\nREMARK 350   BIOMT3  1   0.000000 0.000000 1.000000   0.000000\nREMARK 888\nREMARK 888 WRITTEN BY MAESTRO (A PRODUCT OF SCHRODINGER, LLC)\nSEQRES   1 A  364  ACE ASP ASP LYS MET ASP TYR ASP PHE LYS VAL LYS LEU\nSEQRES   2 A  364  SER SER GLU ARG GLU ARG VAL GLU ASP LEU PHE GLU TYR\nSEQRES   3 A  364  GLU GLY CYS LYS VAL GLY ARG GLY THR TYR GLY HIS VAL\nSEQRES   4 A  364  TYR LYS ALA LYS ARG LYS ASP GLY LYS ASP ASP LYS ASP\nSEQRES   5 A  364  TYR ALA LEU LYS GLN ILE GLU GLY THR GLY ILE SER MET\nSEQRES   6 A  364  SER ALA CYS ARG GLU ILE ALA LEU LEU ARG GLU LEU LYS\nSEQRES   7 A  364  HIS PRO ASN VAL ILE SER LEU GLN LYS VAL PHE LEU SER\nSEQRES   8 A  364  HIS ALA ASP ARG LYS VAL TRP LEU LEU PHE ASP TYR ALA\nSEQRES   9 A  364  GLU HIS ASP LEU TRP HIS ILE ILE LYS PHE HIS ARG ALA\nSEQRES  10 A  364  SER LYS ALA ASN LYS LYS PRO VAL GLN LEU PRO ARG GLY\nSEQRES  11 A  364  MET VAL LYS SER LEU LEU TYR GLN ILE LEU ASP GLY ILE\nSEQRES  12 A  364  HIS TYR LEU HIS ALA ASN TRP VAL LEU HIS ARG ASP LEU\nSEQRES  13 A  364  LYS PRO ALA ASN ILE LEU VAL MET GLY GLU GLY PRO GLU\nSEQRES  14 A  364  ARG GLY ARG VAL LYS ILE ALA ASP MET GLY PHE ALA ARG\nSEQRES  15 A  364  LEU PHE ASN SER PRO LEU LYS PRO LEU ALA ASP LEU ASP\nSEQRES  16 A  364  PRO VAL VAL VAL THR PHE TRP TYR ARG ALA PRO GLU LEU\nSEQRES  17 A  364  LEU LEU GLY ALA ARG HIS TYR THR LYS ALA ILE ASP ILE\nSEQRES  18 A  364  TRP ALA ILE GLY CYS ILE PHE ALA GLU LEU LEU THR SER\nSEQRES  19 A  364  GLU PRO ILE PHE HIS CYS ARG GLN GLU ASP ILE LYS THR\nSEQRES  20 A  364  SER ASN PRO TYR HIS HIS ASP GLN LEU ASP ARG ILE PHE\nSEQRES  21 A  364  ASN VAL MET GLY PHE PRO ALA ASP LYS ASP TRP GLU ASP\nSEQRES  22 A  364  ILE LYS LYS MET PRO GLU HIS SER THR LEU MET LYS ASP\nSEQRES  23 A  364  PHE ARG ARG ASN THR TYR THR ASN CYS SER LEU ILE LYS\nSEQRES  24 A  364  TYR MET GLU LYS HIS LYS VAL LYS PRO ASP SER LYS ALA\nSEQRES  25 A  364  PHE HIS LEU LEU GLN LYS LEU LEU THR MET ASP PRO ILE\nSEQRES  26 A  364  LYS ARG ILE THR SER GLU GLN ALA MET GLN ASP PRO TYR\nSEQRES  27 A  364  PHE LEU GLU ASP PRO LEU PRO THR SER ASP VAL PHE ALA\nSEQRES  28 A  364  GLY CYS GLN ILE PRO TYR PRO LYS ARG GLU PHE LEU NME\nSEQRES   1 B  268  ACE LYS ALA MET ALA GLY ASN PHE TRP GLN SER SER HIS\nSEQRES   2 B  268  TYR LEU GLN TRP ILE LEU ASP LYS GLN ASP LEU LEU LYS\nSEQRES   3 B  268  GLU ARG GLN LYS ASP LEU LYS PHE LEU SER GLU GLU GLU\nSEQRES   4 B  268  TYR TRP LYS LEU GLN ILE PHE PHE THR ASN VAL ILE GLN\nSEQRES   5 B  268  ALA LEU GLY GLU HIS LEU LYS LEU ARG GLN GLN VAL ILE\nSEQRES   6 B  268  ALA THR ALA THR VAL TYR PHE LYS ARG PHE TYR ALA ARG\nSEQRES   7 B  268  TYR SER LEU LYS SER ILE ASP PRO VAL LEU MET ALA PRO\nSEQRES   8 B  268  THR CYS VAL PHE LEU ALA SER LYS VAL GLU GLU PHE GLY\nSEQRES   9 B  268  VAL VAL SER ASN THR ARG LEU ILE ALA ALA ALA THR SER\nSEQRES  10 B  268  VAL LEU LYS THR ARG PHE SER TYR ALA PHE PRO LYS GLU\nSEQRES  11 B  268  PHE PRO TYR ARG MET ASN HIS ILE LEU GLU CYS GLU PHE\nSEQRES  12 B  268  TYR LEU LEU GLU LEU MET ASP CYS CYS LEU ILE VAL TYR\nSEQRES  13 B  268  HIS PRO TYR ARG PRO LEU LEU GLN TYR VAL GLN ASP MET\nSEQRES  14 B  268  GLY GLN GLU ASP MET LEU LEU PRO LEU ALA TRP ARG ILE\nSEQRES  15 B  268  VAL ASN ASP THR TYR ARG THR ASP LEU CYS LEU LEU TYR\nSEQRES  16 B  268  PRO PRO PHE MET ILE ALA LEU ALA CYS LEU HIS VAL ALA\nSEQRES  17 B  268  CYS VAL VAL GLN GLN LYS ASP ALA ARG GLN TRP PHE ALA\nSEQRES  18 B  268  GLU LEU SER VAL ASP MET GLU LYS ILE LEU GLU ILE ILE\nSEQRES  19 B  268  ARG VAL ILE LEU LYS LEU TYR GLU GLN TRP LYS ASN PHE\nSEQRES  20 B  268  ASP GLU ARG LYS GLU MET ALA THR ILE LEU SER LYS MET\nSEQRES  21 B  268  PRO LYS PRO LYS PRO PRO PRO NME\nHELIX    1   1 TYR A    3  TYR A    3  1\nHELIX    2   2 ASP A    4  ASP A    4  1\nHELIX    3   3 PHE A    5  PHE A    5  1\nHELIX    4   4 LYS A    6  LYS A    6  1\nHELIX    5   5 VAL A    7  VAL A    7  1\nHELIX    6   6 LYS A    8  LYS A    8  1\nHELIX    7   7 LEU A    9  LEU A    9  1\nHELIX    8   8 SER A   10  SER A   10  1\nHELIX    9   9 SER A   11  SER A   11  1\nHELIX   10  10 GLU A   12  GLU A   12  1\nHELIX   11  11 VAL A   16  VAL A   16  1\nHELIX   12  12 GLU A   17  GLU A   17  1\nHELIX   13  13 ASP A   18  ASP A   18  1\nHELIX   14  14 LEU A   19  LEU A   19  1\nHELIX   15  15 MET A   61  MET A   61  1\nHELIX   16  16 SER A   62  SER A   62  1\nHELIX   17  17 ALA A   63  ALA A   63  1\nHELIX   18  18 CYS A   64  CYS A   64  1\nHELIX   19  19 ARG A   65  ARG A   65  1\nHELIX   20  20 GLU A   66  GLU A   66  1\nHELIX   21  21 ILE A   67  ILE A   67  1\nHELIX   22  22 ALA A   68  ALA A   68  1\nHELIX   23  23 LEU A   69  LEU A   69  1\nHELIX   24  24 LEU A   70  LEU A   70  1\nHELIX   25  25 ARG A   71  ARG A   71  1\nHELIX   26  26 GLU A   72  GLU A   72  1\nHELIX   27  27 LEU A  104  LEU A  104  1\nHELIX   28  28 TRP A  105  TRP A  105  1\nHELIX   29  29 HIS A  106  HIS A  106  1\nHELIX   30  30 ILE A  107  ILE A  107  1\nHELIX   31  31 ILE A  108  ILE A  108  1\nHELIX   32  32 LYS A  109  LYS A  109  1\nHELIX   33  33 PHE A  110  PHE A  110  1\nHELIX   34  34 HIS A  111  HIS A  111  1\nHELIX   35  35 ARG A  112  ARG A  112  1\nHELIX   36  36 ALA A  113  ALA A  113  1\nHELIX   37  37 GLY A  126  GLY A  126  1\nHELIX   38  38 MET A  127  MET A  127  1\nHELIX   39  39 VAL A  128  VAL A  128  1\nHELIX   40  40 LYS A  129  LYS A  129  1\nHELIX   41  41 SER A  130  SER A  130  1\nHELIX   42  42 LEU A  131  LEU A  131  1\nHELIX   43  43 LEU A  132  LEU A  132  1\nHELIX   44  44 TYR A  133  TYR A  133  1\nHELIX   45  45 GLN A  134  GLN A  134  1\nHELIX   46  46 ILE A  135  ILE A  135  1\nHELIX   47  47 LEU A  136  LEU A  136  1\nHELIX   48  48 ASP A  137  ASP A  137  1\nHELIX   49  49 GLY A  138  GLY A  138  1\nHELIX   50  50 ILE A  139  ILE A  139  1\nHELIX   51  51 HIS A  140  HIS A  140  1\nHELIX   52  52 TYR A  141  TYR A  141  1\nHELIX   53  53 LEU A  142  LEU A  142  1\nHELIX   54  54 HIS A  143  HIS A  143  1\nHELIX   55  55 ALA A  144  ALA A  144  1\nHELIX   56  56 LYS A  213  LYS A  213  1\nHELIX   57  57 ALA A  214  ALA A  214  1\nHELIX   58  58 ILE A  215  ILE A  215  1\nHELIX   59  59 ASP A  216  ASP A  216  1\nHELIX   60  60 ILE A  217  ILE A  217  1\nHELIX   61  61 TRP A  218  TRP A  218  1\nHELIX   62  62 ALA A  219  ALA A  219  1\nHELIX   63  63 ILE A  220  ILE A  220  1\nHELIX   64  64 GLY A  221  GLY A  221  1\nHELIX   65  65 CYS A  222  CYS A  222  1\nHELIX   66  66 ILE A  223  ILE A  223  1\nHELIX   67  67 PHE A  224  PHE A  224  1\nHELIX   68  68 ALA A  225  ALA A  225  1\nHELIX   69  69 GLU A  226  GLU A  226  1\nHELIX   70  70 LEU A  227  LEU A  227  1\nHELIX   71  71 LEU A  228  LEU A  228  1\nHELIX   72  72 THR A  229  THR A  229  1\nHELIX   73  73 HIS A  249  HIS A  249  1\nHELIX   74  74 ASP A  250  ASP A  250  1\nHELIX   75  75 GLN A  251  GLN A  251  1\nHELIX   76  76 LEU A  252  LEU A  252  1\nHELIX   77  77 ASP A  253  ASP A  253  1\nHELIX   78  78 ARG A  254  ARG A  254  1\nHELIX   79  79 ILE A  255  ILE A  255  1\nHELIX   80  80 PHE A  256  PHE A  256  1\nHELIX   81  81 ASN A  257  ASN A  257  1\nHELIX   82  82 VAL A  258  VAL A  258  1\nHELIX   83  83 MET A  259  MET A  259  1\nHELIX   84  84 HIS A  276  HIS A  276  1\nHELIX   85  85 SER A  277  SER A  277  1\nHELIX   86  86 THR A  278  THR A  278  1\nHELIX   87  87 LEU A  279  LEU A  279  1\nHELIX   88  88 MET A  280  MET A  280  1\nHELIX   89  89 LYS A  281  LYS A  281  1\nHELIX   90  90 ASP A  282  ASP A  282  1\nHELIX   91  91 LEU A  293  LEU A  293  1\nHELIX   92  92 ILE A  294  ILE A  294  1\nHELIX   93  93 LYS A  295  LYS A  295  1\nHELIX   94  94 TYR A  296  TYR A  296  1\nHELIX   95  95 MET A  297  MET A  297  1\nHELIX   96  96 GLU A  298  GLU A  298  1\nHELIX   97  97 LYS A  299  LYS A  299  1\nHELIX   98  98 LYS A  307  LYS A  307  1\nHELIX   99  99 ALA A  308  ALA A  308  1\nHELIX  100 100 PHE A  309  PHE A  309  1\nHELIX  101 101 HIS A  310  HIS A  310  1\nHELIX  102 102 LEU A  311  LEU A  311  1\nHELIX  103 103 LEU A  312  LEU A  312  1\nHELIX  104 104 GLN A  313  GLN A  313  1\nHELIX  105 105 LYS A  314  LYS A  314  1\nHELIX  106 106 LEU A  315  LEU A  315  1\nHELIX  107 107 SER A  326  SER A  326  1\nHELIX  108 108 GLU A  327  GLU A  327  1\nHELIX  109 109 GLN A  328  GLN A  328  1\nHELIX  110 110 ALA A  329  ALA A  329  1\nHELIX  111 111 MET A  330  MET A  330  1\nHELIX  112 112 SER B    9  SER B    9  1\nHELIX  113 113 HIS B   10  HIS B   10  1\nHELIX  114 114 TYR B   11  TYR B   11  1\nHELIX  115 115 LEU B   12  LEU B   12  1\nHELIX  116 116 GLN B   13  GLN B   13  1\nHELIX  117 117 TRP B   14  TRP B   14  1\nHELIX  118 118 LYS B   18  LYS B   18  1\nHELIX  119 119 GLN B   19  GLN B   19  1\nHELIX  120 120 ASP B   20  ASP B   20  1\nHELIX  121 121 LEU B   21  LEU B   21  1\nHELIX  122 122 LEU B   22  LEU B   22  1\nHELIX  123 123 LYS B   23  LYS B   23  1\nHELIX  124 124 GLU B   24  GLU B   24  1\nHELIX  125 125 ARG B   25  ARG B   25  1\nHELIX  126 126 GLN B   26  GLN B   26  1\nHELIX  127 127 LYS B   27  LYS B   27  1\nHELIX  128 128 ASP B   28  ASP B   28  1\nHELIX  129 129 LEU B   29  LEU B   29  1\nHELIX  130 130 GLU B   34  GLU B   34  1\nHELIX  131 131 GLU B   35  GLU B   35  1\nHELIX  132 132 GLU B   36  GLU B   36  1\nHELIX  133 133 TYR B   37  TYR B   37  1\nHELIX  134 134 TRP B   38  TRP B   38  1\nHELIX  135 135 LYS B   39  LYS B   39  1\nHELIX  136 136 LEU B   40  LEU B   40  1\nHELIX  137 137 GLN B   41  GLN B   41  1\nHELIX  138 138 ILE B   42  ILE B   42  1\nHELIX  139 139 PHE B   43  PHE B   43  1\nHELIX  140 140 PHE B   44  PHE B   44  1\nHELIX  141 141 THR B   45  THR B   45  1\nHELIX  142 142 ASN B   46  ASN B   46  1\nHELIX  143 143 VAL B   47  VAL B   47  1\nHELIX  144 144 ILE B   48  ILE B   48  1\nHELIX  145 145 GLN B   49  GLN B   49  1\nHELIX  146 146 ALA B   50  ALA B   50  1\nHELIX  147 147 LEU B   51  LEU B   51  1\nHELIX  148 148 GLY B   52  GLY B   52  1\nHELIX  149 149 GLU B   53  GLU B   53  1\nHELIX  150 150 HIS B   54  HIS B   54  1\nHELIX  151 151 GLN B   59  GLN B   59  1\nHELIX  152 152 GLN B   60  GLN B   60  1\nHELIX  153 153 VAL B   61  VAL B   61  1\nHELIX  154 154 ILE B   62  ILE B   62  1\nHELIX  155 155 ALA B   63  ALA B   63  1\nHELIX  156 156 THR B   64  THR B   64  1\nHELIX  157 157 ALA B   65  ALA B   65  1\nHELIX  158 158 THR B   66  THR B   66  1\nHELIX  159 159 VAL B   67  VAL B   67  1\nHELIX  160 160 TYR B   68  TYR B   68  1\nHELIX  161 161 PHE B   69  PHE B   69  1\nHELIX  162 162 LYS B   70  LYS B   70  1\nHELIX  163 163 ARG B   71  ARG B   71  1\nHELIX  164 164 PHE B   72  PHE B   72  1\nHELIX  165 165 TYR B   73  TYR B   73  1\nHELIX  166 166 ALA B   74  ALA B   74  1\nHELIX  167 167 ARG B   75  ARG B   75  1\nHELIX  168 168 ALA B   87  ALA B   87  1\nHELIX  169 169 PRO B   88  PRO B   88  1\nHELIX  170 170 THR B   89  THR B   89  1\nHELIX  171 171 CYS B   90  CYS B   90  1\nHELIX  172 172 VAL B   91  VAL B   91  1\nHELIX  173 173 PHE B   92  PHE B   92  1\nHELIX  174 174 LEU B   93  LEU B   93  1\nHELIX  175 175 ALA B   94  ALA B   94  1\nHELIX  176 176 SER B   95  SER B   95  1\nHELIX  177 177 LYS B   96  LYS B   96  1\nHELIX  178 178 VAL B   97  VAL B   97  1\nHELIX  179 179 ASN B  105  ASN B  105  1\nHELIX  180 180 THR B  106  THR B  106  1\nHELIX  181 181 ARG B  107  ARG B  107  1\nHELIX  182 182 LEU B  108  LEU B  108  1\nHELIX  183 183 ILE B  109  ILE B  109  1\nHELIX  184 184 ALA B  110  ALA B  110  1\nHELIX  185 185 ALA B  111  ALA B  111  1\nHELIX  186 186 ALA B  112  ALA B  112  1\nHELIX  187 187 THR B  113  THR B  113  1\nHELIX  188 188 SER B  114  SER B  114  1\nHELIX  189 189 VAL B  115  VAL B  115  1\nHELIX  190 190 LEU B  116  LEU B  116  1\nHELIX  191 191 LYS B  117  LYS B  117  1\nHELIX  192 192 THR B  118  THR B  118  1\nHELIX  193 193 ARG B  119  ARG B  119  1\nHELIX  194 194 MET B  132  MET B  132  1\nHELIX  195 195 ASN B  133  ASN B  133  1\nHELIX  196 196 HIS B  134  HIS B  134  1\nHELIX  197 197 ILE B  135  ILE B  135  1\nHELIX  198 198 LEU B  136  LEU B  136  1\nHELIX  199 199 GLU B  137  GLU B  137  1\nHELIX  200 200 CYS B  138  CYS B  138  1\nHELIX  201 201 GLU B  139  GLU B  139  1\nHELIX  202 202 PHE B  140  PHE B  140  1\nHELIX  203 203 TYR B  141  TYR B  141  1\nHELIX  204 204 LEU B  142  LEU B  142  1\nHELIX  205 205 LEU B  143  LEU B  143  1\nHELIX  206 206 GLU B  144  GLU B  144  1\nHELIX  207 207 LEU B  145  LEU B  145  1\nHELIX  208 208 ARG B  157  ARG B  157  1\nHELIX  209 209 PRO B  158  PRO B  158  1\nHELIX  210 210 LEU B  159  LEU B  159  1\nHELIX  211 211 LEU B  160  LEU B  160  1\nHELIX  212 212 GLN B  161  GLN B  161  1\nHELIX  213 213 TYR B  162  TYR B  162  1\nHELIX  214 214 VAL B  163  VAL B  163  1\nHELIX  215 215 GLN B  164  GLN B  164  1\nHELIX  216 216 ASP B  165  ASP B  165  1\nHELIX  217 217 MET B  166  MET B  166  1\nHELIX  218 218 GLU B  169  GLU B  169  1\nHELIX  219 219 ASP B  170  ASP B  170  1\nHELIX  220 220 MET B  171  MET B  171  1\nHELIX  221 221 LEU B  172  LEU B  172  1\nHELIX  222 222 LEU B  173  LEU B  173  1\nHELIX  223 223 PRO B  174  PRO B  174  1\nHELIX  224 224 LEU B  175  LEU B  175  1\nHELIX  225 225 ALA B  176  ALA B  176  1\nHELIX  226 226 TRP B  177  TRP B  177  1\nHELIX  227 227 ARG B  178  ARG B  178  1\nHELIX  228 228 ILE B  179  ILE B  179  1\nHELIX  229 229 VAL B  180  VAL B  180  1\nHELIX  230 230 ASN B  181  ASN B  181  1\nHELIX  231 231 ASP B  182  ASP B  182  1\nHELIX  232 232 THR B  183  THR B  183  1\nHELIX  233 233 MET B  196  MET B  196  1\nHELIX  234 234 ILE B  197  ILE B  197  1\nHELIX  235 235 ALA B  198  ALA B  198  1\nHELIX  236 236 LEU B  199  LEU B  199  1\nHELIX  237 237 ALA B  200  ALA B  200  1\nHELIX  238 238 CYS B  201  CYS B  201  1\nHELIX  239 239 LEU B  202  LEU B  202  1\nHELIX  240 240 HIS B  203  HIS B  203  1\nHELIX  241 241 VAL B  204  VAL B  204  1\nHELIX  242 242 ALA B  205  ALA B  205  1\nHELIX  243 243 CYS B  206  CYS B  206  1\nHELIX  244 244 VAL B  207  VAL B  207  1\nHELIX  245 245 VAL B  208  VAL B  208  1\nHELIX  246 246 ARG B  214  ARG B  214  1\nHELIX  247 247 GLN B  215  GLN B  215  1\nHELIX  248 248 TRP B  216  TRP B  216  1\nHELIX  249 249 PHE B  217  PHE B  217  1\nHELIX  250 250 ALA B  218  ALA B  218  1\nHELIX  251 251 GLU B  219  GLU B  219  1\nHELIX  252 252 MET B  224  MET B  224  1\nHELIX  253 253 GLU B  225  GLU B  225  1\nHELIX  254 254 LYS B  226  LYS B  226  1\nHELIX  255 255 ILE B  227  ILE B  227  1\nHELIX  256 256 LEU B  228  LEU B  228  1\nHELIX  257 257 GLU B  229  GLU B  229  1\nHELIX  258 258 ILE B  230  ILE B  230  1\nHELIX  259 259 ILE B  231  ILE B  231  1\nHELIX  260 260 ARG B  232  ARG B  232  1\nHELIX  261 261 VAL B  233  VAL B  233  1\nHELIX  262 262 ILE B  234  ILE B  234  1\nHELIX  263 263 LEU B  235  LEU B  235  1\nHELIX  264 264 LYS B  236  LYS B  236  1\nHELIX  265 265 LEU B  237  LEU B  237  1\nHELIX  266 266 TYR B  238  TYR B  238  1\nHELIX  267 267 GLU B  239  GLU B  239  1\nHELIX  268 268 GLN B  240  GLN B  240  1\nHELIX  269 269 TRP B  241  TRP B  241  1\nHELIX  270 270 LYS B  242  LYS B  242  1\nHELIX  271 271 ASN B  243  ASN B  243  1\nHELIX  272 272 GLU B  246  GLU B  246  1\nHELIX  273 273 ARG B  247  ARG B  247  1\nHELIX  274 274 LYS B  248  LYS B  248  1\nHELIX  275 275 GLU B  249  GLU B  249  1\nHELIX  276 276 MET B  250  MET B  250  1\nHELIX  277 277 ALA B  251  ALA B  251  1\nHELIX  278 278 THR B  252  THR B  252  1\nHELIX  279 279 ILE B  253  ILE B  253  1\nHELIX  280 280 LEU B  254  LEU B  254  1\nHELIX  281 281 SER B  255  SER B  255  1\nHELIX  282 282 LYS B  256  LYS B  256  1\nTURN     1   1 ASP A  -2  ASP A  -2\nTURN     2   2 ASP A  -1  ASP A  -1\nTURN     3   3 LYS A   0  LYS A   0\nTURN     4   4 MET A   1  MET A   1\nTURN     5   5 ASP A   2  ASP A   2\nTURN     6   6 ARG A  13  ARG A  13\nTURN     7   7 GLU A  14  GLU A  14\nTURN     8   8 ARG A  15  ARG A  15\nTURN     9   9 TYR A  22  TYR A  22\nTURN    10  10 GLU A  23  GLU A  23\nTURN    11  11 GLY A  24  GLY A  24\nTURN    12  12 CYS A  25  CYS A  25\nTURN    13  13 GLY A  30  GLY A  30\nTURN    14  14 THR A  31  THR A  31\nTURN    15  15 TYR A  32  TYR A  32\nTURN    16  16 LYS A  41  LYS A  41\nTURN    17  17 ASP A  42  ASP A  42\nTURN    18  18 GLY A  43  GLY A  43\nTURN    19  19 LYS A  44  LYS A  44\nTURN    20  20 ASP A  45  ASP A  45\nTURN    21  21 ASP A  46  ASP A  46\nTURN    22  22 LYS A  47  LYS A  47\nTURN    23  23 GLU A  55  GLU A  55\nTURN    24  24 GLY A  56  GLY A  56\nTURN    25  25 THR A  57  THR A  57\nTURN    26  26 GLY A  58  GLY A  58\nTURN    27  27 ILE A  59  ILE A  59\nTURN    28  28 SER A  60  SER A  60\nTURN    29  29 LEU A  73  LEU A  73\nTURN    30  30 LYS A  74  LYS A  74\nTURN    31  31 HIS A  75  HIS A  75\nTURN    32  32 PRO A  76  PRO A  76\nTURN    33  33 ASN A  77  ASN A  77\nTURN    34  34 VAL A  78  VAL A  78\nTURN    35  35 ILE A  79  ILE A  79\nTURN    36  36 SER A  80  SER A  80\nTURN    37  37 HIS A  88  HIS A  88\nTURN    38  38 ALA A  89  ALA A  89\nTURN    39  39 ASP A  90  ASP A  90\nTURN    40  40 ARG A  91  ARG A  91\nTURN    41  41 TYR A  99  TYR A  99\nTURN    42  42 ALA A 100  ALA A 100\nTURN    43  43 GLU A 101  GLU A 101\nTURN    44  44 HIS A 102  HIS A 102\nTURN    45  45 ASP A 103  ASP A 103\nTURN    46  46 SER A 114  SER A 114\nTURN    47  47 LYS A 115  LYS A 115\nTURN    48  48 ALA A 116  ALA A 116\nTURN    49  49 ASN A 117  ASN A 117\nTURN    50  50 LYS A 118  LYS A 118\nTURN    51  51 LYS A 119  LYS A 119\nTURN    52  52 PRO A 120  PRO A 120\nTURN    53  53 VAL A 121  VAL A 121\nTURN    54  54 GLN A 122  GLN A 122\nTURN    55  55 LEU A 123  LEU A 123\nTURN    56  56 PRO A 124  PRO A 124\nTURN    57  57 ARG A 125  ARG A 125\nTURN    58  58 ASN A 145  ASN A 145\nTURN    59  59 TRP A 146  TRP A 146\nTURN    60  60 VAL A 147  VAL A 147\nTURN    61  61 LEU A 148  LEU A 148\nTURN    62  62 HIS A 149  HIS A 149\nTURN    63  63 ARG A 150  ARG A 150\nTURN    64  64 ASP A 151  ASP A 151\nTURN    65  65 LEU A 152  LEU A 152\nTURN    66  66 LYS A 153  LYS A 153\nTURN    67  67 PRO A 154  PRO A 154\nTURN    68  68 ALA A 155  ALA A 155\nTURN    69  69 ASN A 156  ASN A 156\nTURN    70  70 MET A 160  MET A 160\nTURN    71  71 GLY A 161  GLY A 161\nTURN    72  72 GLU A 162  GLU A 162\nTURN    73  73 GLY A 163  GLY A 163\nTURN    74  74 PRO A 164  PRO A 164\nTURN    75  75 GLU A 165  GLU A 165\nTURN    76  76 ARG A 166  ARG A 166\nTURN    77  77 GLY A 167  GLY A 167\nTURN    78  78 ARG A 168  ARG A 168\nTURN    79  79 ALA A 172  ALA A 172\nTURN    80  80 ASP A 173  ASP A 173\nTURN    81  81 MET A 174  MET A 174\nTURN    82  82 GLY A 175  GLY A 175\nTURN    83  83 PHE A 176  PHE A 176\nTURN    84  84 ALA A 177  ALA A 177\nTURN    85  85 ARG A 178  ARG A 178\nTURN    86  86 LEU A 179  LEU A 179\nTURN    87  87 PHE A 180  PHE A 180\nTURN    88  88 ASN A 181  ASN A 181\nTURN    89  89 SER A 182  SER A 182\nTURN    90  90 PRO A 183  PRO A 183\nTURN    91  91 LEU A 184  LEU A 184\nTURN    92  92 LYS A 185  LYS A 185\nTURN    93  93 LYS A 185  PRO A 186\nTURN    94  94 LEU A 187  LEU A 187\nTURN    95  95 ALA A 188  ALA A 188\nTURN    96  96 ASP A 189  ASP A 189\nTURN    97  97 LEU A 190  LEU A 190\nTURN    98  98 ASP A 191  ASP A 191\nTURN    99  99 PRO A 192  PRO A 192\nTURN   100 100 VAL A 193  VAL A 193\nTURN   101 101 VAL A 194  VAL A 194\nTURN   102 102 VAL A 195  VAL A 195\nTURN   103 103 THR A 196  THR A 196\nTURN   104 104 THR A 196  THR A 196\nTURN   105 105 PHE A 197  PHE A 197\nTURN   106 106 TRP A 198  TRP A 198\nTURN   107 107 TYR A 199  TYR A 199\nTURN   108 108 ARG A 200  ARG A 200\nTURN   109 109 ALA A 201  ALA A 201\nTURN   110 110 PRO A 202  PRO A 202\nTURN   111 111 GLU A 203  GLU A 203\nTURN   112 112 LEU A 204  LEU A 204\nTURN   113 113 LEU A 205  LEU A 205\nTURN   114 114 LEU A 206  LEU A 206\nTURN   115 115 GLY A 207  GLY A 207\nTURN   116 116 ALA A 208  ALA A 208\nTURN   117 117 ARG A 209  ARG A 209\nTURN   118 118 HIS A 210  HIS A 210\nTURN   119 119 TYR A 211  TYR A 211\nTURN   120 120 THR A 212  THR A 212\nTURN   121 121 SER A 230  SER A 230\nTURN   122 122 GLU A 231  GLU A 231\nTURN   123 123 PRO A 232  PRO A 232\nTURN   124 124 ILE A 233  ILE A 233\nTURN   125 125 PHE A 234  PHE A 234\nTURN   126 126 HIS A 235  HIS A 235\nTURN   127 127 CYS A 236  CYS A 236\nTURN   128 128 ARG A 237  ARG A 237\nTURN   129 129 GLN A 238  GLN A 238\nTURN   130 130 GLU A 239  GLU A 239\nTURN   131 131 GLU A 239  ASP A 240\nTURN   132 132 ILE A 241  ILE A 241\nTURN   133 133 LYS A 242  LYS A 242\nTURN   134 134 THR A 243  THR A 243\nTURN   135 135 SER A 244  SER A 244\nTURN   136 136 SER A 244  SER A 244\nTURN   137 137 ASN A 245  ASN A 245\nTURN   138 138 PRO A 246  PRO A 246\nTURN   139 139 TYR A 247  TYR A 247\nTURN   140 140 HIS A 248  HIS A 248\nTURN   141 141 GLY A 260  GLY A 260\nTURN   142 142 PHE A 261  PHE A 261\nTURN   143 143 PRO A 262  PRO A 262\nTURN   144 144 ALA A 263  ALA A 263\nTURN   145 145 ASP A 264  ASP A 264\nTURN   146 146 LYS A 265  LYS A 265\nTURN   147 147 ASP A 266  ASP A 266\nTURN   148 148 TRP A 267  TRP A 267\nTURN   149 149 GLU A 268  GLU A 268\nTURN   150 150 ASP A 269  ASP A 269\nTURN   151 151 ILE A 270  ILE A 270\nTURN   152 152 LYS A 271  LYS A 271\nTURN   153 153 LYS A 272  LYS A 272\nTURN   154 154 MET A 273  MET A 273\nTURN   155 155 PRO A 274  PRO A 274\nTURN   156 156 GLU A 275  GLU A 275\nTURN   157 157 PHE A 283  PHE A 283\nTURN   158 158 ARG A 284  ARG A 284\nTURN   159 159 ARG A 285  ARG A 285\nTURN   160 160 ASN A 286  ASN A 286\nTURN   161 161 THR A 287  THR A 287\nTURN   162 162 TYR A 288  TYR A 288\nTURN   163 163 THR A 289  THR A 289\nTURN   164 164 ASN A 290  ASN A 290\nTURN   165 165 CYS A 291  CYS A 291\nTURN   166 166 SER A 292  SER A 292\nTURN   167 167 HIS A 300  HIS A 300\nTURN   168 168 LYS A 301  LYS A 301\nTURN   169 169 VAL A 302  VAL A 302\nTURN   170 170 LYS A 303  LYS A 303\nTURN   171 171 PRO A 304  PRO A 304\nTURN   172 172 ASP A 305  ASP A 305\nTURN   173 173 SER A 306  SER A 306\nTURN   174 174 LEU A 316  LEU A 316\nTURN   175 175 THR A 317  THR A 317\nTURN   176 176 MET A 318  MET A 318\nTURN   177 177 ASP A 319  ASP A 319\nTURN   178 178 PRO A 320  PRO A 320\nTURN   179 179 ILE A 321  ILE A 321\nTURN   180 180 LYS A 322  LYS A 322\nTURN   181 181 ARG A 323  ARG A 323\nTURN   182 182 ILE A 324  ILE A 324\nTURN   183 183 THR A 325  THR A 325\nTURN   184 184 GLN A 331  GLN A 331\nTURN   185 185 ASP A 332  ASP A 332\nTURN   186 186 PRO A 333  PRO A 333\nTURN   187 187 TYR A 334  TYR A 334\nTURN   188 188 PHE A 335  PHE A 335\nTURN   189 189 LEU A 336  LEU A 336\nTURN   190 190 GLU A 337  GLU A 337\nTURN   191 191 ASP A 338  ASP A 338\nTURN   192 192 PRO A 339  PRO A 339\nTURN   193 193 LEU A 340  LEU A 340\nTURN   194 194 PRO A 341  PRO A 341\nTURN   195 195 THR A 342  THR A 342\nTURN   196 196 SER A 343  SER A 343\nTURN   197 197 ASP A 344  ASP A 344\nTURN   198 198 VAL A 345  VAL A 345\nTURN   199 199 PHE A 346  PHE A 346\nTURN   200 200 ALA A 347  ALA A 347\nTURN   201 201 GLY A 348  GLY A 348\nTURN   202 202 CYS A 349  CYS A 349\nTURN   203 203 GLN A 350  GLN A 350\nTURN   204 204 ILE A 351  ILE A 351\nTURN   205 205 PRO A 352  PRO A 352\nTURN   206 206 TYR A 353  TYR A 353\nTURN   207 207 PRO A 354  PRO A 354\nTURN   208 208 LYS A 355  LYS A 355\nTURN   209 209 ARG A 356  ARG A 356\nTURN   210 210 GLU A 357  GLU A 357\nTURN   211 211 PHE A 358  PHE A 358\nTURN   212 212 LEU A 359  LEU A 359\nTURN   213 213 LYS B  -1  LYS B  -1\nTURN   214 214 ALA B   0  ALA B   0\nTURN   215 215 MET B   1  MET B   1\nTURN   216 216 ALA B   2  ALA B   2\nTURN   217 217 GLY B   3  GLY B   3\nTURN   218 218 ASN B   4  ASN B   4\nTURN   219 219 PHE B   5  PHE B   5\nTURN   220 220 TRP B   6  TRP B   6\nTURN   221 221 GLN B   7  GLN B   7\nTURN   222 222 SER B   8  SER B   8\nTURN   223 223 ILE B  15  ILE B  15\nTURN   224 224 LEU B  16  LEU B  16\nTURN   225 225 ASP B  17  ASP B  17\nTURN   226 226 LYS B  30  LYS B  30\nTURN   227 227 PHE B  31  PHE B  31\nTURN   228 228 LEU B  32  LEU B  32\nTURN   229 229 SER B  33  SER B  33\nTURN   230 230 LEU B  55  LEU B  55\nTURN   231 231 LYS B  56  LYS B  56\nTURN   232 232 LEU B  57  LEU B  57\nTURN   233 233 ARG B  58  ARG B  58\nTURN   234 234 TYR B  76  TYR B  76\nTURN   235 235 SER B  77  SER B  77\nTURN   236 236 LEU B  78  LEU B  78\nTURN   237 237 LYS B  79  LYS B  79\nTURN   238 238 SER B  80  SER B  80\nTURN   239 239 ILE B  81  ILE B  81\nTURN   240 240 ASP B  82  ASP B  82\nTURN   241 241 PRO B  83  PRO B  83\nTURN   242 242 VAL B  84  VAL B  84\nTURN   243 243 LEU B  85  LEU B  85\nTURN   244 244 MET B  86  MET B  86\nTURN   245 245 GLU B  98  GLU B  98\nTURN   246 246 GLU B  99  GLU B  99\nTURN   247 247 PHE B 100  PHE B 100\nTURN   248 248 GLY B 101  GLY B 101\nTURN   249 249 VAL B 102  VAL B 102\nTURN   250 250 VAL B 103  VAL B 103\nTURN   251 251 SER B 104  SER B 104\nTURN   252 252 PHE B 120  PHE B 120\nTURN   253 253 SER B 121  SER B 121\nTURN   254 254 TYR B 122  TYR B 122\nTURN   255 255 ALA B 123  ALA B 123\nTURN   256 256 PHE B 124  PHE B 124\nTURN   257 257 PRO B 125  PRO B 125\nTURN   258 258 LYS B 126  LYS B 126\nTURN   259 259 GLU B 127  GLU B 127\nTURN   260 260 PHE B 128  PHE B 128\nTURN   261 261 PRO B 129  PRO B 129\nTURN   262 262 TYR B 130  TYR B 130\nTURN   263 263 ARG B 131  ARG B 131\nTURN   264 264 MET B 146  MET B 146\nTURN   265 265 ASP B 147  ASP B 147\nTURN   266 266 CYS B 148  CYS B 148\nTURN   267 267 CYS B 149  CYS B 149\nTURN   268 268 LEU B 150  LEU B 150\nTURN   269 269 ILE B 151  ILE B 151\nTURN   270 270 VAL B 152  VAL B 152\nTURN   271 271 TYR B 153  TYR B 153\nTURN   272 272 HIS B 154  HIS B 154\nTURN   273 273 PRO B 155  PRO B 155\nTURN   274 274 TYR B 156  TYR B 156\nTURN   275 275 GLY B 167  GLY B 167\nTURN   276 276 GLN B 168  GLN B 168\nTURN   277 277 TYR B 184  TYR B 184\nTURN   278 278 ARG B 185  ARG B 185\nTURN   279 279 THR B 186  THR B 186\nTURN   280 280 ASP B 187  ASP B 187\nTURN   281 281 LEU B 188  LEU B 188\nTURN   282 282 CYS B 189  CYS B 189\nTURN   283 283 LEU B 190  LEU B 190\nTURN   284 284 LEU B 191  LEU B 191\nTURN   285 285 TYR B 192  TYR B 192\nTURN   286 286 PRO B 193  PRO B 193\nTURN   287 287 PRO B 194  PRO B 194\nTURN   288 288 PHE B 195  PHE B 195\nTURN   289 289 GLN B 209  GLN B 209\nTURN   290 290 GLN B 210  GLN B 210\nTURN   291 291 LYS B 211  LYS B 211\nTURN   292 292 ASP B 212  ASP B 212\nTURN   293 293 ALA B 213  ALA B 213\nTURN   294 294 LEU B 220  LEU B 220\nTURN   295 295 SER B 221  SER B 221\nTURN   296 296 VAL B 222  VAL B 222\nTURN   297 297 ASP B 223  ASP B 223\nTURN   298 298 PHE B 244  PHE B 244\nTURN   299 299 ASP B 245  ASP B 245\nTURN   300 300 MET B 257  MET B 257\nTURN   301 301 PRO B 258  PRO B 258\nTURN   302 302 LYS B 259  LYS B 259\nTURN   303 303 PRO B 260  PRO B 260\nTURN   304 304 LYS B 261  LYS B 261\nTURN   305 305 PRO B 262  PRO B 262\nTURN   306 306 PRO B 263  PRO B 263\nTURN   307 307 PRO B 264  PRO B 264\nSHEET    1   1 1 PHE A  20  PHE A  20  0\nSHEET    1   2 1 GLU A  21  GLU A  21  0\nSHEET    1   3 1 LYS A  26  LYS A  26  0\nSHEET    1   4 1 VAL A  27  VAL A  27  0\nSHEET    1   5 1 GLY A  28  GLY A  28  0\nSHEET    1   6 1 ARG A  29  ARG A  29  0\nSHEET    1   7 1 GLY A  33  GLY A  33  0\nSHEET    1   8 1 HIS A  34  HIS A  34  0\nSHEET    1   9 1 VAL A  35  VAL A  35  0\nSHEET    1  10 1 TYR A  36  TYR A  36  0\nSHEET    1  11 1 LYS A  37  LYS A  37  0\nSHEET    1  12 1 ALA A  38  ALA A  38  0\nSHEET    1  13 1 LYS A  39  LYS A  39  0\nSHEET    1  14 1 ARG A  40  ARG A  40  0\nSHEET    1  15 1 ASP A  48  ASP A  48  0\nSHEET    1  16 1 TYR A  49  TYR A  49  0\nSHEET    1  17 1 ALA A  50  ALA A  50  0\nSHEET    1  18 1 LEU A  51  LEU A  51  0\nSHEET    1  19 1 LYS A  52  LYS A  52  0\nSHEET    1  20 1 GLN A  53  GLN A  53  0\nSHEET    1  21 1 ILE A  54  ILE A  54  0\nSHEET    1  22 1 LEU A  81  LEU A  81  0\nSHEET    1  23 1 GLN A  82  GLN A  82  0\nSHEET    1  24 1 LYS A  83  LYS A  83  0\nSHEET    1  25 1 VAL A  84  VAL A  84  0\nSHEET    1  26 1 PHE A  85  PHE A  85  0\nSHEET    1  27 1 LEU A  86  LEU A  86  0\nSHEET    1  28 1 SER A  87  SER A  87  0\nSHEET    1  29 1 LYS A  92  LYS A  92  0\nSHEET    1  30 1 VAL A  93  VAL A  93  0\nSHEET    1  31 1 TRP A  94  TRP A  94  0\nSHEET    1  32 1 LEU A  95  LEU A  95  0\nSHEET    1  33 1 LEU A  96  LEU A  96  0\nSHEET    1  34 1 PHE A  97  PHE A  97  0\nSHEET    1  35 1 ASP A  98  ASP A  98  0\nSHEET    1  36 1 ILE A 157  ILE A 157  0\nSHEET    1  37 1 LEU A 158  LEU A 158  0\nSHEET    1  38 1 VAL A 159  VAL A 159  0\nSHEET    1  39 1 VAL A 169  VAL A 169  0\nSHEET    1  40 1 LYS A 170  LYS A 170  0\nSHEET    1  41 1 ILE A 171  ILE A 171  0\nCRYST1   71.232   71.439  171.000  90.00  90.00  90.00 P 21 21 21    4\nHETATM    1  CH3 ACE A  -3     -27.867  31.795 -24.072  1.00  0.00           C\nHETATM    2  C   ACE A  -3     -28.241  32.500 -25.369  1.00  0.00           C\nHETATM    3  O   ACE A  -3     -28.700  31.841 -26.297  1.00  0.00           O\nHETATM    4  H1  ACE A  -3     -28.476  30.903 -23.930  1.00  0.00           H\nHETATM    5  H2  ACE A  -3     -26.825  31.481 -24.113  1.00  0.00           H\nHETATM    6  H3  ACE A  -3     -27.995  32.448 -23.208  1.00  0.00           H\nATOM      7  N   ASP A  -2     -28.027  33.829 -25.409  1.00 99.89           N\nATOM      8  CA  ASP A  -2     -28.144  34.736 -26.563  1.00 99.82           C\nATOM      9  C   ASP A  -2     -29.605  34.995 -27.004  1.00 98.93           C\nATOM     10  O   ASP A  -2     -30.429  34.080 -27.035  1.00 99.12           O\nATOM     11  CB  ASP A  -2     -27.239  34.282 -27.748  1.00 99.99           C\nATOM     12  CG  ASP A  -2     -27.014  35.262 -28.917  1.00102.11           C\nATOM     13  OD1 ASP A  -2     -27.119  36.491 -28.705  1.00104.87           O\nATOM     14  OD2 ASP A  -2     -26.612  34.772 -29.996  1.00102.65           O1-\nATOM     15  H   ASP A  -2     -27.658  34.267 -24.578  1.00 99.89           H\nATOM     16  HA  ASP A  -2     -27.752  35.683 -26.189  1.00 99.82           H\nATOM     17  HB3 ASP A  -2     -27.640  33.353 -28.146  1.00 99.99           H\nATOM     18  HB2 ASP A  -2     -26.257  34.013 -27.357  1.00 99.99           H\nATOM     19  N   ASP A  -1     -29.878  36.256 -27.377  1.00 97.25           N\nATOM     20  CA  ASP A  -1     -31.137  36.723 -27.972  1.00 95.10           C\nATOM     21  C   ASP A  -1     -31.308  36.258 -29.431  1.00 93.24           C\nATOM     22  O   ASP A  -1     -32.442  36.038 -29.856  1.00 93.78           O\nATOM     23  CB  ASP A  -1     -31.281  38.269 -27.923  0.00 94.86           C\nATOM     24  CG  ASP A  -1     -31.102  38.935 -26.546  0.00 94.83           C\nATOM     25  OD1 ASP A  -1     -31.397  38.281 -25.520  0.00 94.84           O\nATOM     26  OD2 ASP A  -1     -30.818  40.153 -26.552  0.00 94.81           O1-\nATOM     27  H   ASP A  -1     -29.139  36.944 -27.333  1.00 97.25           H\nATOM     28  HA  ASP A  -1     -31.959  36.287 -27.400  1.00 95.10           H\nATOM     29  HB3 ASP A  -1     -32.268  38.554 -28.290  1.00 94.86           H\nATOM     30  HB2 ASP A  -1     -30.550  38.715 -28.601  1.00 94.86           H\nATOM     31  N   LYS A   0     -30.187  36.129 -30.165  1.00 90.20           N\nATOM     32  CA  LYS A   0     -30.148  35.757 -31.582  1.00 87.63           C\nATOM     33  C   LYS A   0     -30.109  34.225 -31.794  1.00 84.61           C\nATOM     34  O   LYS A   0     -30.193  33.781 -32.937  1.00 85.29           O\nATOM     35  CB  LYS A   0     -28.955  36.483 -32.256  1.00 87.75           C\nATOM     36  CG  LYS A   0     -29.274  37.150 -33.612  1.00 87.49           C\nATOM     37  CD  LYS A   0     -29.652  36.172 -34.734  1.00 85.50           C\nATOM     38  CE  LYS A   0     -29.725  36.824 -36.122  1.00 83.19           C\nATOM     39  NZ  LYS A   0     -30.039  35.830 -37.165  1.00 76.42           N1+\nATOM     40  H   LYS A   0     -29.292  36.323 -29.734  1.00 90.20           H\nATOM     41  HA  LYS A   0     -31.069  36.107 -32.051  1.00 87.63           H\nATOM     42  HB3 LYS A   0     -28.094  35.820 -32.346  1.00 87.75           H\nATOM     43  HB2 LYS A   0     -28.612  37.288 -31.603  1.00 87.75           H\nATOM     44  HG3 LYS A   0     -28.408  37.735 -33.921  1.00 87.49           H\nATOM     45  HG2 LYS A   0     -30.080  37.873 -33.476  1.00 87.49           H\nATOM     46  HD3 LYS A   0     -30.629  35.754 -34.505  1.00 85.50           H\nATOM     47  HD2 LYS A   0     -28.946  35.341 -34.743  1.00 85.50           H\nATOM     48  HE3 LYS A   0     -28.775  37.298 -36.368  1.00 83.19           H\nATOM     49  HE2 LYS A   0     -30.488  37.602 -36.133  1.00 83.19           H\nATOM     50  HZ1 LYS A   0     -29.300  35.139 -37.196  1.00 76.42           H\nATOM     51  HZ2 LYS A   0     -30.915  35.374 -36.954  1.00 76.42           H\nATOM     52  HZ3 LYS A   0     -30.097  36.286 -38.063  1.00 76.42           H\nATOM     53  N   MET A   1     -30.018  33.429 -30.715  1.00 79.72           N\nATOM     54  CA  MET A   1     -30.297  31.991 -30.752  1.00 76.49           C\nATOM     55  C   MET A   1     -31.801  31.754 -30.546  1.00 72.23           C\nATOM     56  O   MET A   1     -32.468  32.544 -29.874  1.00 73.31           O\nATOM     57  CB  MET A   1     -29.479  31.257 -29.673  1.00 76.38           C\nATOM     58  CG  MET A   1     -27.972  31.232 -29.965  1.00 77.28           C\nATOM     59  SD  MET A   1     -26.999  30.325 -28.731  1.00 79.10           S\nATOM     60  CE  MET A   1     -25.332  30.902 -29.141  1.00 72.83           C\nATOM     61  H   MET A   1     -29.944  33.844 -29.797  1.00 79.72           H\nATOM     62  HA  MET A   1     -30.018  31.578 -31.725  1.00 76.49           H\nATOM     63  HB3 MET A   1     -29.826  30.225 -29.586  1.00 76.38           H\nATOM     64  HB2 MET A   1     -29.660  31.717 -28.702  1.00 76.38           H\nATOM     65  HG3 MET A   1     -27.589  32.246 -30.038  1.00 77.28           H\nATOM     66  HG2 MET A   1     -27.795  30.789 -30.943  1.00 77.28           H\nATOM     67  HE1 MET A   1     -24.604  30.462 -28.459  1.00 72.83           H\nATOM     68  HE2 MET A   1     -25.067  30.618 -30.158  1.00 72.83           H\nATOM     69  HE3 MET A   1     -25.272  31.987 -29.054  1.00 72.83           H\nATOM     70  N   ASP A   2     -32.296  30.650 -31.125  1.00 67.65           N\nATOM     71  CA  ASP A   2     -33.675  30.179 -31.001  1.00 64.97           C\nATOM     72  C   ASP A   2     -33.990  29.789 -29.543  1.00 62.71           C\nATOM     73  O   ASP A   2     -33.237  29.015 -28.949  1.00 60.30           O\nATOM     74  CB  ASP A   2     -33.905  29.000 -31.971  1.00 65.65           C\nATOM     75  CG  ASP A   2     -35.297  28.358 -31.952  1.00 64.38           C\nATOM     76  OD1 ASP A   2     -36.288  29.105 -32.095  1.00 62.65           O\nATOM     77  OD2 ASP A   2     -35.349  27.112 -31.878  1.00 62.24           O1-\nATOM     78  H   ASP A   2     -31.672  30.050 -31.648  1.00 67.65           H\nATOM     79  HA  ASP A   2     -34.330  31.002 -31.294  1.00 64.97           H\nATOM     80  HB3 ASP A   2     -33.145  28.246 -31.780  1.00 65.65           H\nATOM     81  HB2 ASP A   2     -33.719  29.338 -32.989  1.00 65.65           H\nATOM     82  N   TYR A   3     -35.095  30.332 -29.006  1.00 60.24           N\nATOM     83  CA  TYR A   3     -35.533  30.112 -27.628  1.00 58.15           C\nATOM     84  C   TYR A   3     -35.921  28.652 -27.322  1.00 55.62           C\nATOM     85  O   TYR A   3     -35.580  28.172 -26.242  1.00 56.13           O\nATOM     86  CB  TYR A   3     -36.661  31.104 -27.271  1.00 58.58           C\nATOM     87  CG  TYR A   3     -37.216  30.943 -25.865  1.00 62.63           C\nATOM     88  CD1 TYR A   3     -36.448  31.351 -24.755  1.00 63.37           C\nATOM     89  CD2 TYR A   3     -38.477  30.342 -25.662  1.00 63.35           C\nATOM     90  CE1 TYR A   3     -36.936  31.159 -23.448  1.00 66.20           C\nATOM     91  CE2 TYR A   3     -38.962  30.146 -24.355  1.00 67.24           C\nATOM     92  CZ  TYR A   3     -38.195  30.557 -23.248  1.00 66.55           C\nATOM     93  OH  TYR A   3     -38.674  30.376 -21.983  1.00 66.99           O\nATOM     94  H   TYR A   3     -35.654  30.972 -29.556  1.00 60.24           H\nATOM     95  HA  TYR A   3     -34.681  30.355 -26.991  1.00 58.15           H\nATOM     96  HB3 TYR A   3     -37.480  31.005 -27.985  1.00 58.58           H\nATOM     97  HB2 TYR A   3     -36.296  32.127 -27.376  1.00 58.58           H\nATOM     98  HD1 TYR A   3     -35.478  31.803 -24.904  1.00 63.37           H\nATOM     99  HD2 TYR A   3     -39.066  30.014 -26.506  1.00 63.35           H\nATOM    100  HE1 TYR A   3     -36.341  31.473 -22.603  1.00 66.20           H\nATOM    101  HE2 TYR A   3     -39.925  29.681 -24.204  1.00 67.24           H\nATOM    102  HH  TYR A   3     -38.073  30.686 -21.302  1.00 66.99           H\nATOM    103  N   ASP A   4     -36.595  27.976 -28.270  1.00 54.29           N\nATOM    104  CA  ASP A   4     -37.021  26.573 -28.152  1.00 53.80           C\nATOM    105  C   ASP A   4     -35.828  25.607 -28.044  1.00 53.46           C\nATOM    106  O   ASP A   4     -35.845  24.727 -27.185  1.00 55.20           O\nATOM    107  CB  ASP A   4     -37.966  26.111 -29.289  1.00 54.35           C\nATOM    108  CG  ASP A   4     -39.219  26.970 -29.535  1.00 54.65           C\nATOM    109  OD1 ASP A   4     -39.695  27.636 -28.588  1.00 56.05           O\nATOM    110  OD2 ASP A   4     -39.773  26.839 -30.649  1.00 57.31           O1-\nATOM    111  H   ASP A   4     -36.838  28.441 -29.134  1.00 54.29           H\nATOM    112  HA  ASP A   4     -37.577  26.492 -27.216  1.00 53.80           H\nATOM    113  HB3 ASP A   4     -38.312  25.098 -29.080  1.00 54.35           H\nATOM    114  HB2 ASP A   4     -37.408  26.067 -30.225  1.00 54.35           H\nATOM    115  N   PHE A   5     -34.806  25.830 -28.887  1.00 52.64           N\nATOM    116  CA  PHE A   5     -33.505  25.159 -28.869  1.00 51.91           C\nATOM    117  C   PHE A   5     -32.741  25.322 -27.543  1.00 52.55           C\nATOM    118  O   PHE A   5     -32.234  24.335 -27.011  1.00 52.94           O\nATOM    119  CB  PHE A   5     -32.703  25.638 -30.100  1.00 52.34           C\nATOM    120  CG  PHE A   5     -31.204  25.393 -30.127  1.00 51.68           C\nATOM    121  CD1 PHE A   5     -30.698  24.124 -30.475  1.00 51.84           C\nATOM    122  CD2 PHE A   5     -30.307  26.401 -29.711  1.00 54.36           C\nATOM    123  CE1 PHE A   5     -29.326  23.912 -30.509  1.00 53.61           C\nATOM    124  CE2 PHE A   5     -28.940  26.160 -29.725  1.00 54.99           C\nATOM    125  CZ  PHE A   5     -28.451  24.927 -30.139  1.00 53.22           C\nATOM    126  H   PHE A   5     -34.906  26.562 -29.577  1.00 52.64           H\nATOM    127  HA  PHE A   5     -33.688  24.090 -28.990  1.00 51.91           H\nATOM    128  HB3 PHE A   5     -32.850  26.709 -30.222  1.00 52.34           H\nATOM    129  HB2 PHE A   5     -33.129  25.182 -30.995  1.00 52.34           H\nATOM    130  HD1 PHE A   5     -31.377  23.332 -30.749  1.00 51.84           H\nATOM    131  HD2 PHE A   5     -30.677  27.366 -29.397  1.00 54.36           H\nATOM    132  HE1 PHE A   5     -28.936  22.951 -30.810  1.00 53.61           H\nATOM    133  HE2 PHE A   5     -28.254  26.937 -29.420  1.00 54.99           H\nATOM    134  HZ  PHE A   5     -27.386  24.749 -30.154  1.00 53.22           H\nATOM    135  N   LYS A   6     -32.702  26.567 -27.039  1.00 53.54           N\nATOM    136  CA  LYS A   6     -32.055  26.965 -25.791  1.00 54.38           C\nATOM    137  C   LYS A   6     -32.636  26.253 -24.556  1.00 53.27           C\nATOM    138  O   LYS A   6     -31.869  25.637 -23.816  1.00 52.13           O\nATOM    139  CB  LYS A   6     -32.092  28.507 -25.690  1.00 55.42           C\nATOM    140  CG  LYS A   6     -31.620  29.116 -24.357  1.00 58.50           C\nATOM    141  CD  LYS A   6     -31.690  30.649 -24.380  1.00 59.76           C\nATOM    142  CE  LYS A   6     -31.361  31.279 -23.017  0.00 59.59           C\nATOM    143  NZ  LYS A   6     -31.340  32.751 -23.094  0.00 59.67           N1+\nATOM    144  H   LYS A   6     -33.146  27.315 -27.556  1.00 53.54           H\nATOM    145  HA  LYS A   6     -31.006  26.669 -25.873  1.00 54.38           H\nATOM    146  HB3 LYS A   6     -33.111  28.848 -25.864  1.00 55.42           H\nATOM    147  HB2 LYS A   6     -31.500  28.926 -26.506  1.00 55.42           H\nATOM    148  HG3 LYS A   6     -30.601  28.794 -24.145  1.00 58.50           H\nATOM    149  HG2 LYS A   6     -32.239  28.754 -23.535  1.00 58.50           H\nATOM    150  HD3 LYS A   6     -32.688  30.959 -24.693  1.00 59.76           H\nATOM    151  HD2 LYS A   6     -31.005  31.022 -25.142  1.00 59.76           H\nATOM    152  HE3 LYS A   6     -30.392  30.933 -22.658  1.00 59.59           H\nATOM    153  HE2 LYS A   6     -32.099  30.976 -22.274  1.00 59.59           H\nATOM    154  HZ1 LYS A   6     -30.647  33.044 -23.768  1.00 59.67           H\nATOM    155  HZ2 LYS A   6     -32.246  33.088 -23.384  1.00 59.67           H\nATOM    156  HZ3 LYS A   6     -31.112  33.136 -22.188  1.00 59.67           H\nATOM    157  N   VAL A   7     -33.964  26.338 -24.359  1.00 52.10           N\nATOM    158  CA  VAL A   7     -34.642  25.750 -23.198  1.00 52.12           C\nATOM    159  C   VAL A   7     -34.741  24.213 -23.245  1.00 50.95           C\nATOM    160  O   VAL A   7     -34.753  23.600 -22.178  1.00 50.48           O\nATOM    161  CB  VAL A   7     -36.062  26.330 -22.962  1.00 52.99           C\nATOM    162  CG1 VAL A   7     -36.008  27.839 -22.687  1.00 52.15           C\nATOM    163  CG2 VAL A   7     -37.106  25.987 -24.044  1.00 48.96           C\nATOM    164  H   VAL A   7     -34.543  26.854 -25.011  1.00 52.10           H\nATOM    165  HA  VAL A   7     -34.046  26.000 -22.319  1.00 52.12           H\nATOM    166  HB  VAL A   7     -36.435  25.887 -22.037  1.00 52.99           H\nATOM    167 HG11 VAL A   7     -36.988  28.205 -22.386  1.00 52.15           H\nATOM    168 HG12 VAL A   7     -35.314  28.070 -21.879  1.00 52.15           H\nATOM    169 HG13 VAL A   7     -35.695  28.401 -23.566  1.00 52.15           H\nATOM    170 HG21 VAL A   7     -38.047  26.505 -23.860  1.00 48.96           H\nATOM    171 HG22 VAL A   7     -36.762  26.275 -25.034  1.00 48.96           H\nATOM    172 HG23 VAL A   7     -37.330  24.921 -24.073  1.00 48.96           H\nATOM    173  N   LYS A   8     -34.764  23.620 -24.453  1.00 50.75           N\nATOM    174  CA  LYS A   8     -34.715  22.170 -24.657  1.00 52.34           C\nATOM    175  C   LYS A   8     -33.376  21.578 -24.193  1.00 52.73           C\nATOM    176  O   LYS A   8     -33.388  20.624 -23.417  1.00 52.43           O\nATOM    177  CB  LYS A   8     -35.043  21.831 -26.130  1.00 54.10           C\nATOM    178  CG  LYS A   8     -34.922  20.346 -26.535  1.00 59.46           C\nATOM    179  CD  LYS A   8     -35.822  19.392 -25.729  1.00 64.15           C\nATOM    180  CE  LYS A   8     -35.756  17.950 -26.258  1.00 66.64           C\nATOM    181  NZ  LYS A   8     -36.623  17.039 -25.489  1.00 63.69           N1+\nATOM    182  H   LYS A   8     -34.773  24.188 -25.290  1.00 50.75           H\nATOM    183  HA  LYS A   8     -35.502  21.738 -24.035  1.00 52.34           H\nATOM    184  HB3 LYS A   8     -34.384  22.407 -26.781  1.00 54.10           H\nATOM    185  HB2 LYS A   8     -36.055  22.172 -26.352  1.00 54.10           H\nATOM    186  HG3 LYS A   8     -33.884  20.020 -26.462  1.00 59.46           H\nATOM    187  HG2 LYS A   8     -35.178  20.263 -27.592  1.00 59.46           H\nATOM    188  HD3 LYS A   8     -36.850  19.757 -25.759  1.00 64.15           H\nATOM    189  HD2 LYS A   8     -35.523  19.405 -24.680  1.00 64.15           H\nATOM    190  HE3 LYS A   8     -34.733  17.576 -26.215  1.00 66.64           H\nATOM    191  HE2 LYS A   8     -36.066  17.921 -27.303  1.00 66.64           H\nATOM    192  HZ1 LYS A   8     -36.305  16.994 -24.527  1.00 63.69           H\nATOM    193  HZ2 LYS A   8     -37.577  17.368 -25.513  1.00 63.69           H\nATOM    194  HZ3 LYS A   8     -36.576  16.112 -25.887  1.00 63.69           H\nATOM    195  N   LEU A   9     -32.257  22.179 -24.632  1.00 51.57           N\nATOM    196  CA  LEU A   9     -30.912  21.778 -24.218  1.00 51.43           C\nATOM    197  C   LEU A   9     -30.633  22.053 -22.733  1.00 52.14           C\nATOM    198  O   LEU A   9     -29.954  21.240 -22.117  1.00 53.27           O\nATOM    199  CB  LEU A   9     -29.847  22.459 -25.099  1.00 49.75           C\nATOM    200  CG  LEU A   9     -29.815  21.972 -26.562  1.00 50.30           C\nATOM    201  CD1 LEU A   9     -28.841  22.841 -27.367  1.00 48.12           C\nATOM    202  CD2 LEU A   9     -29.457  20.477 -26.686  1.00 47.78           C\nATOM    203  H   LEU A   9     -32.319  22.960 -25.272  1.00 51.57           H\nATOM    204  HA  LEU A   9     -30.839  20.697 -24.351  1.00 51.43           H\nATOM    205  HB3 LEU A   9     -28.858  22.298 -24.666  1.00 49.75           H\nATOM    206  HB2 LEU A   9     -30.007  23.539 -25.079  1.00 49.75           H\nATOM    207  HG  LEU A   9     -30.803  22.107 -27.003  1.00 50.30           H\nATOM    208 HD11 LEU A   9     -28.530  22.362 -28.295  1.00 48.12           H\nATOM    209 HD12 LEU A   9     -29.302  23.795 -27.622  1.00 48.12           H\nATOM    210 HD13 LEU A   9     -27.942  23.051 -26.790  1.00 48.12           H\nATOM    211 HD21 LEU A   9     -28.685  20.291 -27.433  1.00 47.78           H\nATOM    212 HD22 LEU A   9     -29.081  20.069 -25.749  1.00 47.78           H\nATOM    213 HD23 LEU A   9     -30.331  19.891 -26.971  1.00 47.78           H\nATOM    214  N   SER A  10     -31.179  23.148 -22.173  1.00 51.36           N\nATOM    215  CA  SER A  10     -31.047  23.494 -20.754  1.00 53.69           C\nATOM    216  C   SER A  10     -31.792  22.518 -19.820  1.00 53.97           C\nATOM    217  O   SER A  10     -31.301  22.253 -18.723  1.00 53.82           O\nATOM    218  CB  SER A  10     -31.503  24.953 -20.541  1.00 53.61           C\nATOM    219  OG  SER A  10     -31.273  25.394 -19.218  1.00 55.89           O\nATOM    220  H   SER A  10     -31.723  23.781 -22.743  1.00 51.36           H\nATOM    221  HA  SER A  10     -29.987  23.434 -20.503  1.00 53.69           H\nATOM    222  HB3 SER A  10     -32.564  25.059 -20.766  1.00 53.61           H\nATOM    223  HB2 SER A  10     -30.967  25.623 -21.213  1.00 53.61           H\nATOM    224  HG  SER A  10     -31.850  24.904 -18.627  1.00 55.89           H\nATOM    225  N   SER A  11     -32.942  21.996 -20.280  1.00 56.06           N\nATOM    226  CA  SER A  11     -33.747  20.997 -19.577  1.00 57.18           C\nATOM    227  C   SER A  11     -33.105  19.596 -19.608  1.00 57.73           C\nATOM    228  O   SER A  11     -33.184  18.883 -18.609  1.00 57.72           O\nATOM    229  CB  SER A  11     -35.169  20.993 -20.181  1.00 58.61           C\nATOM    230  OG  SER A  11     -36.036  20.097 -19.513  1.00 58.27           O\nATOM    231  H   SER A  11     -33.289  22.281 -21.187  1.00 56.06           H\nATOM    232  HA  SER A  11     -33.827  21.303 -18.532  1.00 57.18           H\nATOM    233  HB3 SER A  11     -35.140  20.727 -21.239  1.00 58.61           H\nATOM    234  HB2 SER A  11     -35.606  21.990 -20.118  1.00 58.61           H\nATOM    235  HG  SER A  11     -35.737  19.199 -19.675  1.00 58.27           H\nATOM    236  N   GLU A  12     -32.490  19.234 -20.747  1.00 57.88           N\nATOM    237  CA  GLU A  12     -31.898  17.917 -20.991  1.00 58.93           C\nATOM    238  C   GLU A  12     -30.444  17.779 -20.509  1.00 59.09           C\nATOM    239  O   GLU A  12     -30.025  16.650 -20.254  1.00 59.58           O\nATOM    240  CB  GLU A  12     -32.001  17.589 -22.498  1.00 59.09           C\nATOM    241  CG  GLU A  12     -33.448  17.397 -23.013  1.00 64.18           C\nATOM    242  CD  GLU A  12     -34.177  16.127 -22.540  1.00 67.27           C\nATOM    243  OE1 GLU A  12     -33.512  15.177 -22.070  1.00 67.20           O\nATOM    244  OE2 GLU A  12     -35.421  16.124 -22.679  1.00 71.01           O1-\nATOM    245  H   GLU A  12     -32.481  19.873 -21.530  1.00 57.88           H\nATOM    246  HA  GLU A  12     -32.472  17.172 -20.438  1.00 58.93           H\nATOM    247  HB3 GLU A  12     -31.398  16.713 -22.744  1.00 59.09           H\nATOM    248  HB2 GLU A  12     -31.549  18.405 -23.064  1.00 59.09           H\nATOM    249  HG3 GLU A  12     -33.426  17.374 -24.102  1.00 64.18           H\nATOM    250  HG2 GLU A  12     -34.056  18.260 -22.743  1.00 64.18           H\nATOM    251  N   ARG A  13     -29.701  18.897 -20.395  1.00 59.87           N\nATOM    252  CA  ARG A  13     -28.285  18.904 -20.023  1.00 60.88           C\nATOM    253  C   ARG A  13     -28.074  18.451 -18.574  1.00 60.76           C\nATOM    254  O   ARG A  13     -28.563  19.096 -17.645  1.00 60.82           O\nATOM    255  CB  ARG A  13     -27.645  20.280 -20.312  1.00 60.86           C\nATOM    256  CG  ARG A  13     -26.174  20.426 -19.859  1.00 59.97           C\nATOM    257  CD  ARG A  13     -25.435  21.651 -20.431  1.00 61.09           C\nATOM    258  NE  ARG A  13     -26.130  22.924 -20.169  1.00 62.81           N\nATOM    259  CZ  ARG A  13     -26.837  23.665 -21.044  1.00 60.04           C\nATOM    260  NH1 ARG A  13     -26.990  23.323 -22.332  1.00 56.89           N\nATOM    261  NH2 ARG A  13     -27.415  24.793 -20.615  1.00 60.13           N1+\nATOM    262  H   ARG A  13     -30.109  19.794 -20.619  1.00 59.87           H\nATOM    263  HA  ARG A  13     -27.784  18.188 -20.677  1.00 60.88           H\nATOM    264  HB3 ARG A  13     -28.242  21.058 -19.834  1.00 60.86           H\nATOM    265  HB2 ARG A  13     -27.688  20.469 -21.384  1.00 60.86           H\nATOM    266  HG3 ARG A  13     -25.666  19.552 -20.269  1.00 59.97           H\nATOM    267  HG2 ARG A  13     -26.040  20.359 -18.778  1.00 59.97           H\nATOM    268  HD3 ARG A  13     -25.107  21.509 -21.460  1.00 61.09           H\nATOM    269  HD2 ARG A  13     -24.516  21.757 -19.856  1.00 61.09           H\nATOM    270  HE  ARG A  13     -26.086  23.243 -19.212  1.00 62.81           H\nATOM    271 HH12 ARG A  13     -27.520  23.915 -22.956  1.00 56.89           H\nATOM    272 HH11 ARG A  13     -26.527  22.503 -22.708  1.00 56.89           H\nATOM    273 HH22 ARG A  13     -27.953  25.355 -21.263  1.00 60.13           H\nATOM    274 HH21 ARG A  13     -27.330  25.088 -19.654  1.00 60.13           H\nATOM    275  N   GLU A  14     -27.309  17.360 -18.439  1.00 61.29           N\nATOM    276  CA  GLU A  14     -26.853  16.798 -17.177  1.00 62.84           C\nATOM    277  C   GLU A  14     -25.811  17.720 -16.533  1.00 62.60           C\nATOM    278  O   GLU A  14     -24.840  18.096 -17.191  1.00 62.58           O\nATOM    279  CB  GLU A  14     -26.255  15.407 -17.442  1.00 63.52           C\nATOM    280  CG  GLU A  14     -27.282  14.377 -17.958  1.00 67.40           C\nATOM    281  CD  GLU A  14     -26.601  13.143 -18.554  1.00 72.60           C\nATOM    282  OE1 GLU A  14     -26.283  13.199 -19.763  1.00 76.30           O\nATOM    283  OE2 GLU A  14     -26.393  12.168 -17.799  1.00 71.94           O1-\nATOM    284  H   GLU A  14     -26.953  16.905 -19.270  1.00 61.29           H\nATOM    285  HA  GLU A  14     -27.711  16.693 -16.509  1.00 62.84           H\nATOM    286  HB3 GLU A  14     -25.816  15.038 -16.518  1.00 63.52           H\nATOM    287  HB2 GLU A  14     -25.427  15.496 -18.149  1.00 63.52           H\nATOM    288  HG3 GLU A  14     -27.925  14.817 -18.722  1.00 67.40           H\nATOM    289  HG2 GLU A  14     -27.947  14.081 -17.146  1.00 67.40           H\nATOM    290  N   ARG A  15     -26.044  18.054 -15.258  1.00 63.56           N\nATOM    291  CA  ARG A  15     -25.146  18.871 -14.450  1.00 63.82           C\nATOM    292  C   ARG A  15     -24.335  17.957 -13.524  1.00 63.39           C\nATOM    293  O   ARG A  15     -24.859  16.946 -13.049  1.00 61.87           O\nATOM    294  CB  ARG A  15     -25.957  19.899 -13.641  1.00 64.93           C\nATOM    295  CG  ARG A  15     -26.977  20.707 -14.463  1.00 69.61           C\nATOM    296  CD  ARG A  15     -27.690  21.771 -13.615  1.00 73.57           C\nATOM    297  NE  ARG A  15     -28.835  22.366 -14.328  1.00 78.55           N\nATOM    298  CZ  ARG A  15     -29.770  23.185 -13.810  1.00 80.27           C\nATOM    299  NH1 ARG A  15     -29.750  23.568 -12.524  1.00 79.10           N\nATOM    300  NH2 ARG A  15     -30.753  23.627 -14.606  1.00 78.39           N1+\nATOM    301  H   ARG A  15     -26.864  17.700 -14.787  1.00 63.56           H\nATOM    302  HA  ARG A  15     -24.459  19.422 -15.096  1.00 63.82           H\nATOM    303  HB3 ARG A  15     -25.262  20.586 -13.163  1.00 64.93           H\nATOM    304  HB2 ARG A  15     -26.483  19.392 -12.834  1.00 64.93           H\nATOM    305  HG3 ARG A  15     -27.697  20.076 -14.987  1.00 69.61           H\nATOM    306  HG2 ARG A  15     -26.400  21.218 -15.235  1.00 69.61           H\nATOM    307  HD3 ARG A  15     -27.001  22.606 -13.480  1.00 73.57           H\nATOM    308  HD2 ARG A  15     -27.936  21.406 -12.618  1.00 73.57           H\nATOM    309  HE  ARG A  15     -28.924  22.094 -15.296  1.00 78.55           H\nATOM    310 HH12 ARG A  15     -30.463  24.175 -12.148  1.00 79.10           H\nATOM    311 HH11 ARG A  15     -29.018  23.224 -11.916  1.00 79.10           H\nATOM    312 HH22 ARG A  15     -31.472  24.235 -14.242  1.00 78.39           H\nATOM    313 HH21 ARG A  15     -30.796  23.334 -15.572  1.00 78.39           H\nATOM    314  N   VAL A  16     -23.073  18.337 -13.277  1.00 62.64           N\nATOM    315  CA  VAL A  16     -22.134  17.577 -12.450  1.00 63.26           C\nATOM    316  C   VAL A  16     -22.564  17.466 -10.968  1.00 63.85           C\nATOM    317  O   VAL A  16     -22.371  16.406 -10.375  1.00 63.25           O\nATOM    318  CB  VAL A  16     -20.695  18.157 -12.563  1.00 63.21           C\nATOM    319  CG1 VAL A  16     -20.545  19.592 -12.024  1.00 61.96           C\nATOM    320  CG2 VAL A  16     -19.630  17.241 -11.935  1.00 62.01           C\nATOM    321  H   VAL A  16     -22.718  19.192 -13.681  1.00 62.64           H\nATOM    322  HA  VAL A  16     -22.114  16.563 -12.854  1.00 63.26           H\nATOM    323  HB  VAL A  16     -20.464  18.201 -13.629  1.00 63.21           H\nATOM    324 HG11 VAL A  16     -19.543  19.969 -12.212  1.00 61.96           H\nATOM    325 HG12 VAL A  16     -21.240  20.277 -12.509  1.00 61.96           H\nATOM    326 HG13 VAL A  16     -20.711  19.649 -10.950  1.00 61.96           H\nATOM    327 HG21 VAL A  16     -18.624  17.587 -12.174  1.00 62.01           H\nATOM    328 HG22 VAL A  16     -19.712  17.203 -10.849  1.00 62.01           H\nATOM    329 HG23 VAL A  16     -19.723  16.224 -12.314  1.00 62.01           H\nATOM    330  N   GLU A  17     -23.182  18.528 -10.420  1.00 65.16           N\nATOM    331  CA  GLU A  17     -23.707  18.577  -9.055  1.00 65.78           C\nATOM    332  C   GLU A  17     -25.001  17.763  -8.863  1.00 66.79           C\nATOM    333  O   GLU A  17     -25.263  17.346  -7.736  1.00 67.36           O\nATOM    334  CB  GLU A  17     -23.850  20.047  -8.582  1.00 66.16           C\nATOM    335  CG  GLU A  17     -24.963  20.923  -9.226  1.00 67.62           C\nATOM    336  CD  GLU A  17     -24.640  21.633 -10.554  1.00 67.41           C\nATOM    337  OE1 GLU A  17     -23.537  21.431 -11.110  1.00 68.61           O\nATOM    338  OE2 GLU A  17     -25.529  22.388 -11.005  1.00 68.07           O1-\nATOM    339  H   GLU A  17     -23.302  19.376 -10.962  1.00 65.16           H\nATOM    340  HA  GLU A  17     -22.962  18.114  -8.406  1.00 65.78           H\nATOM    341  HB3 GLU A  17     -22.884  20.548  -8.664  1.00 66.16           H\nATOM    342  HB2 GLU A  17     -24.041  20.024  -7.509  1.00 66.16           H\nATOM    343  HG3 GLU A  17     -25.214  21.708  -8.511  1.00 67.62           H\nATOM    344  HG2 GLU A  17     -25.881  20.350  -9.351  1.00 67.62           H\nATOM    345  N   ASP A  18     -25.772  17.532  -9.942  1.00 67.45           N\nATOM    346  CA  ASP A  18     -26.998  16.726  -9.919  1.00 66.73           C\nATOM    347  C   ASP A  18     -26.702  15.217  -9.940  1.00 66.29           C\nATOM    348  O   ASP A  18     -27.382  14.477  -9.229  1.00 66.96           O\nATOM    349  CB  ASP A  18     -28.003  17.082 -11.046  1.00 67.64           C\nATOM    350  CG  ASP A  18     -28.532  18.529 -11.081  1.00 69.26           C\nATOM    351  OD1 ASP A  18     -28.402  19.255 -10.069  1.00 69.30           O\nATOM    352  OD2 ASP A  18     -29.158  18.863 -12.111  1.00 71.50           O1-\nATOM    353  H   ASP A  18     -25.499  17.908 -10.839  1.00 67.45           H\nATOM    354  HA  ASP A  18     -27.504  16.920  -8.970  1.00 66.73           H\nATOM    355  HB3 ASP A  18     -28.871  16.424 -10.980  1.00 67.64           H\nATOM    356  HB2 ASP A  18     -27.534  16.885 -12.012  1.00 67.64           H\nATOM    357  N   LEU A  19     -25.707  14.786 -10.738  1.00 65.51           N\nATOM    358  CA  LEU A  19     -25.339  13.372 -10.861  1.00 64.24           C\nATOM    359  C   LEU A  19     -24.384  12.883  -9.762  1.00 62.53           C\nATOM    360  O   LEU A  19     -24.440  11.695  -9.448  1.00 64.30           O\nATOM    361  CB  LEU A  19     -24.694  13.085 -12.236  1.00 64.01           C\nATOM    362  CG  LEU A  19     -25.601  13.214 -13.477  1.00 66.18           C\nATOM    363  CD1 LEU A  19     -24.856  12.665 -14.712  1.00 65.27           C\nATOM    364  CD2 LEU A  19     -26.973  12.532 -13.314  1.00 66.78           C\nATOM    365  H   LEU A  19     -25.193  15.444 -11.307  1.00 65.51           H\nATOM    366  HA  LEU A  19     -26.241  12.766 -10.765  1.00 64.24           H\nATOM    367  HB3 LEU A  19     -24.312  12.062 -12.221  1.00 64.01           H\nATOM    368  HB2 LEU A  19     -23.821  13.726 -12.369  1.00 64.01           H\nATOM    369  HG  LEU A  19     -25.783  14.277 -13.646  1.00 66.18           H\nATOM    370 HD11 LEU A  19     -24.877  13.370 -15.536  1.00 65.27           H\nATOM    371 HD12 LEU A  19     -23.807  12.457 -14.503  1.00 65.27           H\nATOM    372 HD13 LEU A  19     -25.291  11.734 -15.076  1.00 65.27           H\nATOM    373 HD21 LEU A  19     -27.377  12.193 -14.269  1.00 66.78           H\nATOM    374 HD22 LEU A  19     -26.921  11.661 -12.659  1.00 66.78           H\nATOM    375 HD23 LEU A  19     -27.701  13.225 -12.890  1.00 66.78           H\nATOM    376  N   PHE A  20     -23.512  13.761  -9.236  1.00 61.62           N\nATOM    377  CA  PHE A  20     -22.426  13.372  -8.334  1.00 60.39           C\nATOM    378  C   PHE A  20     -22.406  14.192  -7.043  1.00 59.92           C\nATOM    379  O   PHE A  20     -22.637  15.402  -7.066  1.00 59.43           O\nATOM    380  CB  PHE A  20     -21.063  13.469  -9.053  1.00 60.22           C\nATOM    381  CG  PHE A  20     -20.831  12.396 -10.099  1.00 57.29           C\nATOM    382  CD1 PHE A  20     -20.420  11.108  -9.699  1.00 56.65           C\nATOM    383  CD2 PHE A  20     -21.192  12.615 -11.445  1.00 54.22           C\nATOM    384  CE1 PHE A  20     -20.346  10.082 -10.629  1.00 57.16           C\nATOM    385  CE2 PHE A  20     -21.108  11.575 -12.361  1.00 56.74           C\nATOM    386  CZ  PHE A  20     -20.691  10.314 -11.954  1.00 58.67           C\nATOM    387  H   PHE A  20     -23.520  14.727  -9.533  1.00 61.62           H\nATOM    388  HA  PHE A  20     -22.558  12.332  -8.031  1.00 60.39           H\nATOM    389  HB3 PHE A  20     -20.261  13.388  -8.318  1.00 60.22           H\nATOM    390  HB2 PHE A  20     -20.940  14.448  -9.515  1.00 60.22           H\nATOM    391  HD1 PHE A  20     -20.171  10.913  -8.667  1.00 56.65           H\nATOM    392  HD2 PHE A  20     -21.543  13.587 -11.761  1.00 54.22           H\nATOM    393  HE1 PHE A  20     -20.036   9.097 -10.318  1.00 57.16           H\nATOM    394  HE2 PHE A  20     -21.385  11.739 -13.391  1.00 56.74           H\nATOM    395  HZ  PHE A  20     -20.639   9.506 -12.668  1.00 58.67           H\nATOM    396  N   GLU A  21     -22.062  13.488  -5.956  1.00 60.93           N\nATOM    397  CA  GLU A  21     -21.753  14.016  -4.635  1.00 61.67           C\nATOM    398  C   GLU A  21     -20.227  14.048  -4.487  1.00 61.09           C\nATOM    399  O   GLU A  21     -19.594  13.005  -4.652  1.00 60.45           O\nATOM    400  CB  GLU A  21     -22.428  13.101  -3.583  1.00 62.72           C\nATOM    401  CG  GLU A  21     -22.093  13.397  -2.102  1.00 65.04           C\nATOM    402  CD  GLU A  21     -22.474  14.797  -1.591  1.00 68.18           C\nATOM    403  OE1 GLU A  21     -23.393  15.424  -2.166  1.00 71.74           O\nATOM    404  OE2 GLU A  21     -21.831  15.216  -0.605  1.00 71.03           O1-\nATOM    405  H   GLU A  21     -21.892  12.495  -6.062  1.00 60.93           H\nATOM    406  HA  GLU A  21     -22.138  15.032  -4.543  1.00 61.67           H\nATOM    407  HB3 GLU A  21     -22.158  12.063  -3.787  1.00 62.72           H\nATOM    408  HB2 GLU A  21     -23.510  13.136  -3.716  1.00 62.72           H\nATOM    409  HG3 GLU A  21     -21.030  13.224  -1.924  1.00 65.04           H\nATOM    410  HG2 GLU A  21     -22.614  12.672  -1.476  1.00 65.04           H\nATOM    411  N   TYR A  22     -19.671  15.236  -4.201  1.00 61.31           N\nATOM    412  CA  TYR A  22     -18.223  15.466  -4.187  1.00 61.20           C\nATOM    413  C   TYR A  22     -17.782  16.621  -3.267  1.00 62.22           C\nATOM    414  O   TYR A  22     -16.576  16.863  -3.196  1.00 62.55           O\nATOM    415  CB  TYR A  22     -17.712  15.655  -5.640  1.00 59.97           C\nATOM    416  CG  TYR A  22     -18.268  16.861  -6.384  1.00 57.24           C\nATOM    417  CD1 TYR A  22     -19.362  16.704  -7.261  1.00 57.46           C\nATOM    418  CD2 TYR A  22     -17.709  18.143  -6.193  1.00 56.82           C\nATOM    419  CE1 TYR A  22     -19.902  17.820  -7.927  1.00 58.11           C\nATOM    420  CE2 TYR A  22     -18.267  19.262  -6.839  1.00 58.71           C\nATOM    421  CZ  TYR A  22     -19.361  19.102  -7.711  1.00 59.93           C\nATOM    422  OH  TYR A  22     -19.892  20.189  -8.342  1.00 66.63           O\nATOM    423  H   TYR A  22     -20.259  16.048  -4.084  1.00 61.31           H\nATOM    424  HA  TYR A  22     -17.742  14.577  -3.776  1.00 61.20           H\nATOM    425  HB3 TYR A  22     -17.929  14.759  -6.222  1.00 59.97           H\nATOM    426  HB2 TYR A  22     -16.626  15.733  -5.641  1.00 59.97           H\nATOM    427  HD1 TYR A  22     -19.794  15.728  -7.421  1.00 57.46           H\nATOM    428  HD2 TYR A  22     -16.864  18.278  -5.534  1.00 56.82           H\nATOM    429  HE1 TYR A  22     -20.736  17.686  -8.598  1.00 58.11           H\nATOM    430  HE2 TYR A  22     -17.851  20.244  -6.668  1.00 58.71           H\nATOM    431  HH  TYR A  22     -20.638  19.976  -8.907  1.00 66.63           H\nATOM    432  N   GLU A  23     -18.715  17.330  -2.600  1.00 65.59           N\nATOM    433  CA  GLU A  23     -18.384  18.480  -1.750  1.00 67.84           C\nATOM    434  C   GLU A  23     -17.624  18.047  -0.481  1.00 67.48           C\nATOM    435  O   GLU A  23     -18.028  17.095   0.188  1.00 66.26           O\nATOM    436  CB  GLU A  23     -19.640  19.332  -1.456  1.00 69.78           C\nATOM    437  CG  GLU A  23     -20.752  18.664  -0.612  1.00 73.46           C\nATOM    438  CD  GLU A  23     -21.922  19.592  -0.233  1.00 79.06           C\nATOM    439  OE1 GLU A  23     -22.118  20.628  -0.908  1.00 85.31           O\nATOM    440  OE2 GLU A  23     -22.615  19.245   0.749  1.00 81.81           O1-\nATOM    441  H   GLU A  23     -19.691  17.079  -2.653  1.00 65.59           H\nATOM    442  HA  GLU A  23     -17.717  19.118  -2.335  1.00 67.84           H\nATOM    443  HB3 GLU A  23     -20.058  19.660  -2.409  1.00 69.78           H\nATOM    444  HB2 GLU A  23     -19.318  20.245  -0.953  1.00 69.78           H\nATOM    445  HG3 GLU A  23     -20.336  18.258   0.310  1.00 73.46           H\nATOM    446  HG2 GLU A  23     -21.164  17.820  -1.164  1.00 73.46           H\nATOM    447  N   GLY A  24     -16.498  18.731  -0.217  1.00 68.51           N\nATOM    448  CA  GLY A  24     -15.558  18.417   0.863  1.00 68.88           C\nATOM    449  C   GLY A  24     -14.715  17.152   0.598  1.00 69.41           C\nATOM    450  O   GLY A  24     -13.874  16.817   1.432  1.00 69.89           O\nATOM    451  H   GLY A  24     -16.243  19.497  -0.824  1.00 68.51           H\nATOM    452  HA3 GLY A  24     -16.100  18.296   1.803  1.00 68.88           H\nATOM    453  HA2 GLY A  24     -14.885  19.264   0.994  1.00 68.88           H\nATOM    454  N   CYS A  25     -14.923  16.461  -0.539  1.00 69.41           N\nATOM    455  CA  CYS A  25     -14.283  15.192  -0.892  1.00 68.23           C\nATOM    456  C   CYS A  25     -13.113  15.403  -1.875  1.00 66.95           C\nATOM    457  O   CYS A  25     -12.804  14.500  -2.654  1.00 66.16           O\nATOM    458  CB  CYS A  25     -15.304  14.174  -1.446  1.00 68.53           C\nATOM    459  SG  CYS A  25     -16.594  13.811  -0.224  1.00 69.60           S\nATOM    460  H   CYS A  25     -15.619  16.794  -1.192  1.00 69.41           H\nATOM    461  HA  CYS A  25     -13.852  14.750   0.005  1.00 68.23           H\nATOM    462  HB3 CYS A  25     -14.818  13.229  -1.690  1.00 68.53           H\nATOM    463  HB2 CYS A  25     -15.769  14.540  -2.359  1.00 68.53           H\nATOM    464  HG  CYS A  25     -17.146  15.029  -0.226  1.00 69.60           H\nATOM    465  N   LYS A  26     -12.460  16.579  -1.813  1.00 66.52           N\nATOM    466  CA  LYS A  26     -11.255  16.911  -2.575  1.00 66.95           C\nATOM    467  C   LYS A  26     -10.088  16.009  -2.149  1.00 67.78           C\nATOM    468  O   LYS A  26      -9.892  15.822  -0.953  1.00 68.65           O\nATOM    469  CB  LYS A  26     -10.932  18.404  -2.370  1.00 66.52           C\nATOM    470  CG  LYS A  26      -9.781  18.932  -3.253  1.00 66.75           C\nATOM    471  CD  LYS A  26      -9.475  20.423  -3.036  1.00 68.22           C\nATOM    472  CE  LYS A  26     -10.596  21.364  -3.514  1.00 70.26           C\nATOM    473  NZ  LYS A  26     -10.292  22.773  -3.212  1.00 71.37           N1+\nATOM    474  H   LYS A  26     -12.758  17.264  -1.133  1.00 66.52           H\nATOM    475  HA  LYS A  26     -11.465  16.757  -3.631  1.00 66.95           H\nATOM    476  HB3 LYS A  26     -10.705  18.593  -1.320  1.00 66.52           H\nATOM    477  HB2 LYS A  26     -11.834  18.973  -2.586  1.00 66.52           H\nATOM    478  HG3 LYS A  26     -10.014  18.757  -4.305  1.00 66.75           H\nATOM    479  HG2 LYS A  26      -8.870  18.368  -3.050  1.00 66.75           H\nATOM    480  HD3 LYS A  26      -8.549  20.664  -3.558  1.00 68.22           H\nATOM    481  HD2 LYS A  26      -9.274  20.587  -1.976  1.00 68.22           H\nATOM    482  HE3 LYS A  26     -11.543  21.125  -3.031  1.00 70.26           H\nATOM    483  HE2 LYS A  26     -10.746  21.254  -4.588  1.00 70.26           H\nATOM    484  HZ1 LYS A  26      -9.430  23.041  -3.662  1.00 71.37           H\nATOM    485  HZ2 LYS A  26     -11.047  23.356  -3.544  1.00 71.37           H\nATOM    486  HZ3 LYS A  26     -10.199  22.888  -2.213  1.00 71.37           H\nATOM    487  N   VAL A  27      -9.348  15.472  -3.127  1.00 67.04           N\nATOM    488  CA  VAL A  27      -8.188  14.607  -2.898  1.00 66.90           C\nATOM    489  C   VAL A  27      -6.918  15.132  -3.598  1.00 68.56           C\nATOM    490  O   VAL A  27      -5.833  14.644  -3.280  1.00 69.13           O\nATOM    491  CB  VAL A  27      -8.457  13.148  -3.362  1.00 66.04           C\nATOM    492  CG1 VAL A  27      -9.505  12.452  -2.475  1.00 64.16           C\nATOM    493  CG2 VAL A  27      -8.817  13.015  -4.853  1.00 63.03           C\nATOM    494  H   VAL A  27      -9.581  15.662  -4.093  1.00 67.04           H\nATOM    495  HA  VAL A  27      -7.946  14.569  -1.836  1.00 66.90           H\nATOM    496  HB  VAL A  27      -7.534  12.587  -3.214  1.00 66.04           H\nATOM    497 HG11 VAL A  27      -9.607  11.399  -2.741  1.00 64.16           H\nATOM    498 HG12 VAL A  27      -9.222  12.495  -1.423  1.00 64.16           H\nATOM    499 HG13 VAL A  27     -10.487  12.915  -2.574  1.00 64.16           H\nATOM    500 HG21 VAL A  27      -8.945  11.970  -5.136  1.00 63.03           H\nATOM    501 HG22 VAL A  27      -9.748  13.532  -5.084  1.00 63.03           H\nATOM    502 HG23 VAL A  27      -8.040  13.431  -5.491  1.00 63.03           H\nATOM    503  N   GLY A  28      -7.057  16.109  -4.513  1.00 70.38           N\nATOM    504  CA  GLY A  28      -5.943  16.693  -5.249  1.00 71.32           C\nATOM    505  C   GLY A  28      -6.189  18.185  -5.479  1.00 72.67           C\nATOM    506  O   GLY A  28      -7.328  18.635  -5.610  1.00 72.73           O\nATOM    507  H   GLY A  28      -7.976  16.472  -4.723  1.00 70.38           H\nATOM    508  HA3 GLY A  28      -5.863  16.204  -6.219  1.00 71.32           H\nATOM    509  HA2 GLY A  28      -4.993  16.552  -4.729  1.00 71.32           H\nATOM    510  N   ARG A  29      -5.079  18.927  -5.594  1.00 75.67           N\nATOM    511  CA  ARG A  29      -5.027  20.343  -5.935  1.00 78.01           C\nATOM    512  C   ARG A  29      -3.645  20.630  -6.537  1.00 78.78           C\nATOM    513  O   ARG A  29      -2.637  20.325  -5.898  1.00 79.24           O\nATOM    514  CB  ARG A  29      -5.311  21.199  -4.677  1.00 78.92           C\nATOM    515  CG  ARG A  29      -5.276  22.723  -4.903  1.00 81.70           C\nATOM    516  CD  ARG A  29      -6.498  23.252  -5.671  1.00 85.36           C\nATOM    517  NE  ARG A  29      -6.350  24.667  -6.059  1.00 90.22           N\nATOM    518  CZ  ARG A  29      -6.223  25.167  -7.305  1.00 92.66           C\nATOM    519  NH1 ARG A  29      -6.187  24.384  -8.391  1.00 92.72           N\nATOM    520  NH2 ARG A  29      -6.132  26.491  -7.477  1.00 94.07           N1+\nATOM    521  H   ARG A  29      -4.175  18.488  -5.481  1.00 75.67           H\nATOM    522  HA  ARG A  29      -5.786  20.541  -6.692  1.00 78.01           H\nATOM    523  HB3 ARG A  29      -4.583  20.948  -3.904  1.00 78.92           H\nATOM    524  HB2 ARG A  29      -6.282  20.928  -4.262  1.00 78.92           H\nATOM    525  HG3 ARG A  29      -4.333  23.078  -5.323  1.00 81.70           H\nATOM    526  HG2 ARG A  29      -5.320  23.151  -3.900  1.00 81.70           H\nATOM    527  HD3 ARG A  29      -7.327  23.281  -4.964  1.00 85.36           H\nATOM    528  HD2 ARG A  29      -6.828  22.587  -6.469  1.00 85.36           H\nATOM    529  HE  ARG A  29      -6.322  25.323  -5.292  1.00 90.22           H\nATOM    530 HH12 ARG A  29      -6.138  24.795  -9.317  1.00 92.72           H\nATOM    531 HH11 ARG A  29      -6.220  23.378  -8.304  1.00 92.72           H\nATOM    532 HH22 ARG A  29      -6.041  26.873  -8.411  1.00 94.07           H\nATOM    533 HH21 ARG A  29      -6.135  27.121  -6.688  1.00 94.07           H\nATOM    534  N   GLY A  30      -3.620  21.216  -7.741  1.00 80.07           N\nATOM    535  CA  GLY A  30      -2.377  21.554  -8.425  1.00 81.48           C\nATOM    536  C   GLY A  30      -2.687  22.413  -9.653  1.00 82.10           C\nATOM    537  O   GLY A  30      -3.798  22.917  -9.819  1.00 82.17           O\nATOM    538  H   GLY A  30      -4.481  21.424  -8.229  1.00 80.07           H\nATOM    539  HA3 GLY A  30      -1.862  20.642  -8.728  1.00 81.48           H\nATOM    540  HA2 GLY A  30      -1.714  22.111  -7.760  1.00 81.48           H\nATOM    541  N   THR A  31      -1.678  22.577 -10.521  1.00 83.19           N\nATOM    542  CA  THR A  31      -1.750  23.347 -11.771  1.00 84.23           C\nATOM    543  C   THR A  31      -2.658  22.704 -12.847  1.00 84.16           C\nATOM    544  O   THR A  31      -3.118  23.412 -13.743  1.00 84.86           O\nATOM    545  CB  THR A  31      -0.330  23.576 -12.355  1.00 84.75           C\nATOM    546  OG1 THR A  31       0.237  22.408 -12.924  1.00 85.92           O\nATOM    547  CG2 THR A  31       0.648  24.165 -11.323  1.00 85.67           C\nATOM    548  H   THR A  31      -0.785  22.141 -10.337  1.00 83.19           H\nATOM    549  HA  THR A  31      -2.178  24.323 -11.532  1.00 84.23           H\nATOM    550  HB  THR A  31      -0.413  24.299 -13.169  1.00 84.75           H\nATOM    551  HG1 THR A  31       1.105  22.636 -13.275  1.00 85.92           H\nATOM    552 HG21 THR A  31       1.609  24.405 -11.771  1.00 85.67           H\nATOM    553 HG22 THR A  31       0.252  25.085 -10.894  1.00 85.67           H\nATOM    554 HG23 THR A  31       0.844  23.472 -10.505  1.00 85.67           H\nATOM    555  N   TYR A  32      -2.953  21.401 -12.693  1.00 83.26           N\nATOM    556  CA  TYR A  32      -3.955  20.647 -13.446  1.00 82.19           C\nATOM    557  C   TYR A  32      -5.414  21.029 -13.102  1.00 81.02           C\nATOM    558  O   TYR A  32      -6.302  20.739 -13.903  1.00 81.39           O\nATOM    559  CB  TYR A  32      -3.689  19.140 -13.225  1.00 82.47           C\nATOM    560  CG  TYR A  32      -3.687  18.652 -11.780  1.00 82.34           C\nATOM    561  CD1 TYR A  32      -4.896  18.453 -11.075  1.00 82.15           C\nATOM    562  CD2 TYR A  32      -2.460  18.386 -11.136  1.00 82.32           C\nATOM    563  CE1 TYR A  32      -4.874  18.014  -9.737  1.00 80.97           C\nATOM    564  CE2 TYR A  32      -2.440  17.924  -9.806  1.00 82.15           C\nATOM    565  CZ  TYR A  32      -3.647  17.733  -9.109  1.00 82.28           C\nATOM    566  OH  TYR A  32      -3.626  17.264  -7.829  1.00 82.09           O\nATOM    567  H   TYR A  32      -2.513  20.897 -11.938  1.00 83.26           H\nATOM    568  HA  TYR A  32      -3.807  20.862 -14.506  1.00 82.19           H\nATOM    569  HB3 TYR A  32      -2.723  18.890 -13.667  1.00 82.47           H\nATOM    570  HB2 TYR A  32      -4.407  18.549 -13.785  1.00 82.47           H\nATOM    571  HD1 TYR A  32      -5.845  18.647 -11.552  1.00 82.15           H\nATOM    572  HD2 TYR A  32      -1.528  18.523 -11.665  1.00 82.32           H\nATOM    573  HE1 TYR A  32      -5.798  17.885  -9.195  1.00 80.97           H\nATOM    574  HE2 TYR A  32      -1.496  17.710  -9.327  1.00 82.15           H\nATOM    575  HH  TYR A  32      -4.506  17.139  -7.471  1.00 82.09           H\nATOM    576  N   GLY A  33      -5.632  21.655 -11.931  1.00 78.94           N\nATOM    577  CA  GLY A  33      -6.948  22.018 -11.415  1.00 77.16           C\nATOM    578  C   GLY A  33      -7.197  21.289 -10.091  1.00 75.93           C\nATOM    579  O   GLY A  33      -6.281  21.109  -9.286  1.00 76.12           O\nATOM    580  H   GLY A  33      -4.844  21.869 -11.335  1.00 78.94           H\nATOM    581  HA3 GLY A  33      -7.739  21.809 -12.133  1.00 77.16           H\nATOM    582  HA2 GLY A  33      -6.971  23.090 -11.225  1.00 77.16           H\nATOM    583  N   HIS A  34      -8.470  20.947  -9.846  1.00 73.24           N\nATOM    584  CA  HIS A  34      -8.981  20.366  -8.604  1.00 70.97           C\nATOM    585  C   HIS A  34      -9.527  18.967  -8.916  1.00 67.64           C\nATOM    586  O   HIS A  34     -10.403  18.856  -9.772  1.00 67.60           O\nATOM    587  CB  HIS A  34     -10.117  21.253  -8.030  1.00 71.68           C\nATOM    588  CG  HIS A  34      -9.926  22.751  -8.083  1.00 74.93           C\nATOM    589  ND1 HIS A  34     -10.042  23.486  -9.270  1.00 78.88           N\nATOM    590  CD2 HIS A  34      -9.674  23.626  -7.048  1.00 77.21           C\nATOM    591  CE1 HIS A  34      -9.827  24.746  -8.918  1.00 78.73           C\nATOM    592  NE2 HIS A  34      -9.612  24.888  -7.610  1.00 78.39           N\nATOM    593  H   HIS A  34      -9.165  21.118 -10.561  1.00 73.24           H\nATOM    594  HA  HIS A  34      -8.183  20.297  -7.861  1.00 70.97           H\nATOM    595  HB3 HIS A  34     -10.306  20.967  -6.995  1.00 71.68           H\nATOM    596  HB2 HIS A  34     -11.050  21.062  -8.558  1.00 71.68           H\nATOM    597  HD2 HIS A  34      -9.538  23.457  -5.992  1.00 77.21           H\nATOM    598  HE1 HIS A  34      -9.829  25.569  -9.617  1.00 78.73           H\nATOM    599  HE2 HIS A  34      -9.432  25.758  -7.128  1.00 78.39           H\nATOM    600  N   VAL A  35      -9.036  17.938  -8.207  1.00 63.64           N\nATOM    601  CA  VAL A  35      -9.527  16.563  -8.334  1.00 60.60           C\nATOM    602  C   VAL A  35     -10.259  16.171  -7.041  1.00 60.62           C\nATOM    603  O   VAL A  35      -9.733  16.383  -5.948  1.00 60.14           O\nATOM    604  CB  VAL A  35      -8.379  15.551  -8.620  1.00 59.76           C\nATOM    605  CG1 VAL A  35      -8.795  14.065  -8.545  1.00 55.29           C\nATOM    606  CG2 VAL A  35      -7.765  15.808 -10.008  1.00 59.83           C\nATOM    607  H   VAL A  35      -8.342  18.102  -7.490  1.00 63.64           H\nATOM    608  HA  VAL A  35     -10.233  16.485  -9.160  1.00 60.60           H\nATOM    609  HB  VAL A  35      -7.594  15.714  -7.880  1.00 59.76           H\nATOM    610 HG11 VAL A  35      -7.961  13.414  -8.804  1.00 55.29           H\nATOM    611 HG12 VAL A  35      -9.123  13.767  -7.552  1.00 55.29           H\nATOM    612 HG13 VAL A  35      -9.609  13.847  -9.239  1.00 55.29           H\nATOM    613 HG21 VAL A  35      -6.852  15.228 -10.142  1.00 59.83           H\nATOM    614 HG22 VAL A  35      -8.455  15.527 -10.804  1.00 59.83           H\nATOM    615 HG23 VAL A  35      -7.513  16.855 -10.162  1.00 59.83           H\nATOM    616  N   TYR A  36     -11.460  15.601  -7.212  1.00 60.15           N\nATOM    617  CA  TYR A  36     -12.343  15.151  -6.142  1.00 60.44           C\nATOM    618  C   TYR A  36     -12.631  13.659  -6.306  1.00 61.31           C\nATOM    619  O   TYR A  36     -12.871  13.206  -7.424  1.00 61.39           O\nATOM    620  CB  TYR A  36     -13.683  15.919  -6.204  1.00 60.94           C\nATOM    621  CG  TYR A  36     -13.598  17.429  -6.072  1.00 59.07           C\nATOM    622  CD1 TYR A  36     -13.352  18.229  -7.207  1.00 56.26           C\nATOM    623  CD2 TYR A  36     -13.796  18.044  -4.819  1.00 59.81           C\nATOM    624  CE1 TYR A  36     -13.290  19.630  -7.090  1.00 59.00           C\nATOM    625  CE2 TYR A  36     -13.725  19.445  -4.698  1.00 59.97           C\nATOM    626  CZ  TYR A  36     -13.466  20.239  -5.832  1.00 60.17           C\nATOM    627  OH  TYR A  36     -13.391  21.596  -5.714  1.00 63.33           O\nATOM    628  H   TYR A  36     -11.819  15.477  -8.151  1.00 60.15           H\nATOM    629  HA  TYR A  36     -11.880  15.301  -5.168  1.00 60.44           H\nATOM    630  HB3 TYR A  36     -14.336  15.551  -5.411  1.00 60.94           H\nATOM    631  HB2 TYR A  36     -14.200  15.698  -7.139  1.00 60.94           H\nATOM    632  HD1 TYR A  36     -13.213  17.773  -8.176  1.00 56.26           H\nATOM    633  HD2 TYR A  36     -14.006  17.443  -3.947  1.00 59.81           H\nATOM    634  HE1 TYR A  36     -13.110  20.230  -7.969  1.00 59.00           H\nATOM    635  HE2 TYR A  36     -13.875  19.908  -3.734  1.00 59.97           H\nATOM    636  HH  TYR A  36     -13.311  22.039  -6.562  1.00 63.33           H\nATOM    637  N   LYS A  37     -12.696  12.950  -5.170  1.00 61.26           N\nATOM    638  CA  LYS A  37     -13.341  11.645  -5.066  1.00 62.97           C\nATOM    639  C   LYS A  37     -14.862  11.867  -5.019  1.00 64.22           C\nATOM    640  O   LYS A  37     -15.319  12.750  -4.291  1.00 64.72           O\nATOM    641  CB  LYS A  37     -12.819  10.934  -3.806  1.00 63.74           C\nATOM    642  CG  LYS A  37     -13.340   9.497  -3.627  1.00 67.56           C\nATOM    643  CD  LYS A  37     -12.718   8.796  -2.410  1.00 68.71           C\nATOM    644  CE  LYS A  37     -12.983   7.285  -2.418  1.00 68.68           C\nATOM    645  NZ  LYS A  37     -12.258   6.576  -1.348  1.00 69.07           N1+\nATOM    646  H   LYS A  37     -12.507  13.412  -4.290  1.00 61.26           H\nATOM    647  HA  LYS A  37     -13.080  11.043  -5.939  1.00 62.97           H\nATOM    648  HB3 LYS A  37     -13.065  11.529  -2.928  1.00 63.74           H\nATOM    649  HB2 LYS A  37     -11.731  10.901  -3.854  1.00 63.74           H\nATOM    650  HG3 LYS A  37     -13.121   8.927  -4.532  1.00 67.56           H\nATOM    651  HG2 LYS A  37     -14.425   9.494  -3.523  1.00 67.56           H\nATOM    652  HD3 LYS A  37     -13.138   9.229  -1.503  1.00 68.71           H\nATOM    653  HD2 LYS A  37     -11.648   9.001  -2.374  1.00 68.71           H\nATOM    654  HE3 LYS A  37     -12.665   6.864  -3.370  1.00 68.68           H\nATOM    655  HE2 LYS A  37     -14.051   7.089  -2.316  1.00 68.68           H\nATOM    656  HZ1 LYS A  37     -11.263   6.715  -1.461  1.00 69.07           H\nATOM    657  HZ2 LYS A  37     -12.550   6.921  -0.446  1.00 69.07           H\nATOM    658  HZ3 LYS A  37     -12.459   5.588  -1.418  1.00 69.07           H\nATOM    659  N   ALA A  38     -15.607  11.087  -5.811  1.00 64.94           N\nATOM    660  CA  ALA A  38     -17.036  11.283  -6.015  1.00 65.98           C\nATOM    661  C   ALA A  38     -17.788   9.952  -6.041  1.00 67.60           C\nATOM    662  O   ALA A  38     -17.251   8.944  -6.499  1.00 66.77           O\nATOM    663  CB  ALA A  38     -17.244  12.052  -7.329  1.00 66.59           C\nATOM    664  H   ALA A  38     -15.166  10.389  -6.397  1.00 64.94           H\nATOM    665  HA  ALA A  38     -17.441  11.873  -5.195  1.00 65.98           H\nATOM    666  HB1 ALA A  38     -18.299  12.279  -7.483  1.00 66.59           H\nATOM    667  HB2 ALA A  38     -16.703  12.998  -7.322  1.00 66.59           H\nATOM    668  HB3 ALA A  38     -16.894  11.481  -8.190  1.00 66.59           H\nATOM    669  N   LYS A  39     -19.044  10.010  -5.577  1.00 69.44           N\nATOM    670  CA  LYS A  39     -20.024   8.932  -5.667  1.00 71.48           C\nATOM    671  C   LYS A  39     -21.240   9.443  -6.444  1.00 73.06           C\nATOM    672  O   LYS A  39     -21.609  10.611  -6.320  1.00 72.05           O\nATOM    673  CB  LYS A  39     -20.453   8.488  -4.256  1.00 71.64           C\nATOM    674  CG  LYS A  39     -19.329   7.812  -3.452  0.00 71.03           C\nATOM    675  CD  LYS A  39     -19.821   7.146  -2.155  0.00 71.06           C\nATOM    676  CE  LYS A  39     -20.441   8.127  -1.143  0.00 71.06           C\nATOM    677  NZ  LYS A  39     -20.877   7.436   0.083  0.00 71.02           N1+\nATOM    678  H   LYS A  39     -19.398  10.890  -5.226  1.00 69.44           H\nATOM    679  HA  LYS A  39     -19.607   8.075  -6.200  1.00 71.48           H\nATOM    680  HB3 LYS A  39     -21.274   7.775  -4.352  1.00 71.64           H\nATOM    681  HB2 LYS A  39     -20.852   9.342  -3.707  1.00 71.64           H\nATOM    682  HG3 LYS A  39     -18.554   8.541  -3.214  1.00 71.03           H\nATOM    683  HG2 LYS A  39     -18.848   7.054  -4.072  1.00 71.03           H\nATOM    684  HD3 LYS A  39     -18.979   6.626  -1.696  1.00 71.06           H\nATOM    685  HD2 LYS A  39     -20.545   6.370  -2.411  1.00 71.06           H\nATOM    686  HE3 LYS A  39     -21.309   8.629  -1.570  1.00 71.06           H\nATOM    687  HE2 LYS A  39     -19.720   8.900  -0.875  1.00 71.06           H\nATOM    688  HZ1 LYS A  39     -20.083   6.989   0.519  1.00 71.02           H\nATOM    689  HZ2 LYS A  39     -21.283   8.104   0.722  1.00 71.02           H\nATOM    690  HZ3 LYS A  39     -21.565   6.736  -0.155  1.00 71.02           H\nATOM    691  N   ARG A  40     -21.848   8.534  -7.215  1.00 76.97           N\nATOM    692  CA  ARG A  40     -23.063   8.753  -7.991  1.00 80.49           C\nATOM    693  C   ARG A  40     -24.281   8.860  -7.057  1.00 83.00           C\nATOM    694  O   ARG A  40     -24.455   7.995  -6.197  1.00 83.54           O\nATOM    695  CB  ARG A  40     -23.168   7.587  -8.990  1.00 81.56           C\nATOM    696  CG  ARG A  40     -24.260   7.724 -10.057  1.00 85.86           C\nATOM    697  CD  ARG A  40     -24.206   6.535 -11.027  1.00 88.88           C\nATOM    698  NE  ARG A  40     -25.054   6.730 -12.210  1.00 94.07           N\nATOM    699  CZ  ARG A  40     -25.070   5.974 -13.323  1.00 97.27           C\nATOM    700  NH1 ARG A  40     -24.273   4.903 -13.470  1.00 97.37           N\nATOM    701  NH2 ARG A  40     -25.910   6.305 -14.311  1.00 98.75           N1+\nATOM    702  H   ARG A  40     -21.504   7.581  -7.213  1.00 76.97           H\nATOM    703  HA  ARG A  40     -22.944   9.683  -8.550  1.00 80.49           H\nATOM    704  HB3 ARG A  40     -23.313   6.649  -8.452  1.00 81.56           H\nATOM    705  HB2 ARG A  40     -22.210   7.491  -9.504  1.00 81.56           H\nATOM    706  HG3 ARG A  40     -24.225   8.684 -10.576  1.00 85.86           H\nATOM    707  HG2 ARG A  40     -25.214   7.691  -9.530  1.00 85.86           H\nATOM    708  HD3 ARG A  40     -24.654   5.679 -10.521  1.00 88.88           H\nATOM    709  HD2 ARG A  40     -23.181   6.256 -11.275  1.00 88.88           H\nATOM    710  HE  ARG A  40     -25.757   7.452 -12.112  1.00 94.07           H\nATOM    711 HH12 ARG A  40     -24.278   4.359 -14.320  1.00 97.37           H\nATOM    712 HH11 ARG A  40     -23.665   4.625 -12.708  1.00 97.37           H\nATOM    713 HH22 ARG A  40     -25.938   5.772 -15.167  1.00 98.75           H\nATOM    714 HH21 ARG A  40     -26.530   7.096 -14.199  1.00 98.75           H\nATOM    715  N   LYS A  41     -25.079   9.929  -7.223  1.00 85.33           N\nATOM    716  CA  LYS A  41     -26.220  10.251  -6.360  1.00 87.15           C\nATOM    717  C   LYS A  41     -27.400   9.269  -6.454  1.00 90.90           C\nATOM    718  O   LYS A  41     -28.054   9.046  -5.435  1.00 92.23           O\nATOM    719  CB  LYS A  41     -26.657  11.716  -6.575  1.00 85.71           C\nATOM    720  CG  LYS A  41     -25.743  12.704  -5.832  1.00 81.53           C\nATOM    721  CD  LYS A  41     -26.204  14.167  -5.925  1.00 75.37           C\nATOM    722  CE  LYS A  41     -25.514  15.051  -4.873  1.00 71.89           C\nATOM    723  NZ  LYS A  41     -25.974  16.447  -4.919  1.00 68.86           N1+\nATOM    724  H   LYS A  41     -24.872  10.594  -7.958  1.00 85.33           H\nATOM    725  HA  LYS A  41     -25.855  10.166  -5.334  1.00 87.15           H\nATOM    726  HB3 LYS A  41     -27.665  11.851  -6.179  1.00 85.71           H\nATOM    727  HB2 LYS A  41     -26.716  11.954  -7.638  1.00 85.71           H\nATOM    728  HG3 LYS A  41     -24.728  12.614  -6.214  1.00 81.53           H\nATOM    729  HG2 LYS A  41     -25.697  12.415  -4.781  1.00 81.53           H\nATOM    730  HD3 LYS A  41     -27.288  14.224  -5.816  1.00 75.37           H\nATOM    731  HD2 LYS A  41     -25.972  14.544  -6.922  1.00 75.37           H\nATOM    732  HE3 LYS A  41     -24.437  15.044  -5.022  1.00 71.89           H\nATOM    733  HE2 LYS A  41     -25.701  14.663  -3.871  1.00 71.89           H\nATOM    734  HZ1 LYS A  41     -25.768  16.836  -5.832  1.00 68.86           H\nATOM    735  HZ2 LYS A  41     -26.968  16.488  -4.750  1.00 68.86           H\nATOM    736  HZ3 LYS A  41     -25.487  16.980  -4.211  1.00 68.86           H\nATOM    737  N   ASP A  42     -27.624   8.669  -7.636  1.00 93.71           N\nATOM    738  CA  ASP A  42     -28.547   7.544  -7.810  1.00 95.91           C\nATOM    739  C   ASP A  42     -27.822   6.229  -7.454  1.00 97.60           C\nATOM    740  O   ASP A  42     -26.616   6.103  -7.674  1.00 98.72           O\nATOM    741  CB  ASP A  42     -29.204   7.498  -9.214  1.00 96.49           C\nATOM    742  CG  ASP A  42     -28.251   7.435 -10.417  1.00 98.46           C\nATOM    743  OD1 ASP A  42     -28.031   6.304 -10.902  1.00 99.43           O\nATOM    744  OD2 ASP A  42     -27.667   8.487 -10.764  1.00101.14           O1-\nATOM    745  H   ASP A  42     -27.057   8.904  -8.439  1.00 93.71           H\nATOM    746  HA  ASP A  42     -29.368   7.665  -7.100  1.00 95.91           H\nATOM    747  HB3 ASP A  42     -29.809   8.399  -9.334  1.00 96.49           H\nATOM    748  HB2 ASP A  42     -29.918   6.674  -9.263  1.00 96.49           H\nATOM    749  N   GLY A  43     -28.586   5.277  -6.896  1.00 98.98           N\nATOM    750  CA  GLY A  43     -28.083   4.035  -6.303  1.00 99.78           C\nATOM    751  C   GLY A  43     -27.805   2.916  -7.322  1.00100.29           C\nATOM    752  O   GLY A  43     -27.829   1.750  -6.928  1.00101.59           O\nATOM    753  H   GLY A  43     -29.573   5.456  -6.780  1.00 98.98           H\nATOM    754  HA3 GLY A  43     -28.820   3.680  -5.583  1.00 99.78           H\nATOM    755  HA2 GLY A  43     -27.169   4.232  -5.740  1.00 99.78           H\nATOM    756  N   LYS A  44     -27.566   3.239  -8.607  1.00 99.97           N\nATOM    757  CA  LYS A  44     -27.300   2.270  -9.677  1.00 99.84           C\nATOM    758  C   LYS A  44     -25.971   1.502  -9.513  1.00 99.39           C\nATOM    759  O   LYS A  44     -25.916   0.327  -9.876  1.00 99.72           O\nATOM    760  CB  LYS A  44     -27.403   2.988 -11.037  1.00100.08           C\nATOM    761  CG  LYS A  44     -27.295   2.059 -12.258  0.00 99.81           C\nATOM    762  CD  LYS A  44     -27.681   2.768 -13.567  0.00 99.87           C\nATOM    763  CE  LYS A  44     -27.588   1.876 -14.818  0.00 99.88           C\nATOM    764  NZ  LYS A  44     -28.599   0.802 -14.824  0.00 99.88           N1+\nATOM    765  H   LYS A  44     -27.553   4.213  -8.876  1.00 99.97           H\nATOM    766  HA  LYS A  44     -28.101   1.530  -9.637  1.00 99.84           H\nATOM    767  HB3 LYS A  44     -26.649   3.775 -11.107  1.00100.08           H\nATOM    768  HB2 LYS A  44     -28.371   3.489 -11.079  1.00100.08           H\nATOM    769  HG3 LYS A  44     -27.933   1.189 -12.099  1.00 99.81           H\nATOM    770  HG2 LYS A  44     -26.275   1.682 -12.346  1.00 99.81           H\nATOM    771  HD3 LYS A  44     -27.028   3.628 -13.703  1.00 99.87           H\nATOM    772  HD2 LYS A  44     -28.688   3.179 -13.479  1.00 99.87           H\nATOM    773  HE3 LYS A  44     -26.593   1.435 -14.897  1.00 99.88           H\nATOM    774  HE2 LYS A  44     -27.737   2.483 -15.711  1.00 99.88           H\nATOM    775  HZ1 LYS A  44     -29.524   1.208 -14.786  1.00 99.88           H\nATOM    776  HZ2 LYS A  44     -28.507   0.253 -15.667  1.00 99.88           H\nATOM    777  HZ3 LYS A  44     -28.462   0.206 -14.019  1.00 99.88           H\nATOM    778  N   ASP A  45     -24.951   2.160  -8.940  1.00 98.19           N\nATOM    779  CA  ASP A  45     -23.674   1.555  -8.559  1.00 96.77           C\nATOM    780  C   ASP A  45     -23.020   2.405  -7.458  1.00 94.79           C\nATOM    781  O   ASP A  45     -23.235   3.617  -7.407  1.00 95.24           O\nATOM    782  CB  ASP A  45     -22.696   1.269  -9.739  1.00 97.09           C\nATOM    783  CG  ASP A  45     -22.200   2.435 -10.621  1.00 98.36           C\nATOM    784  OD1 ASP A  45     -22.817   3.523 -10.636  1.00102.21           O\nATOM    785  OD2 ASP A  45     -21.238   2.175 -11.376  1.00 98.50           O1-\nATOM    786  H   ASP A  45     -25.066   3.129  -8.675  1.00 98.19           H\nATOM    787  HA  ASP A  45     -23.911   0.594  -8.097  1.00 96.77           H\nATOM    788  HB3 ASP A  45     -23.194   0.578 -10.419  1.00 97.09           H\nATOM    789  HB2 ASP A  45     -21.834   0.716  -9.360  1.00 97.09           H\nATOM    790  N   ASP A  46     -22.222   1.740  -6.605  1.00 92.15           N\nATOM    791  CA  ASP A  46     -21.519   2.341  -5.465  1.00 89.96           C\nATOM    792  C   ASP A  46     -20.001   2.453  -5.754  1.00 87.43           C\nATOM    793  O   ASP A  46     -19.198   2.451  -4.821  1.00 87.03           O\nATOM    794  CB  ASP A  46     -21.829   1.550  -4.161  1.00 90.43           C\nATOM    795  CG  ASP A  46     -21.569   2.264  -2.817  1.00 91.04           C\nATOM    796  OD1 ASP A  46     -21.591   3.515  -2.777  1.00 93.68           O\nATOM    797  OD2 ASP A  46     -21.500   1.528  -1.808  1.00 88.75           O1-\nATOM    798  H   ASP A  46     -22.096   0.745  -6.719  1.00 92.15           H\nATOM    799  HA  ASP A  46     -21.872   3.365  -5.340  1.00 89.96           H\nATOM    800  HB3 ASP A  46     -21.287   0.603  -4.178  1.00 90.43           H\nATOM    801  HB2 ASP A  46     -22.882   1.265  -4.169  1.00 90.43           H\nATOM    802  N   LYS A  47     -19.623   2.557  -7.042  1.00 84.60           N\nATOM    803  CA  LYS A  47     -18.241   2.758  -7.481  1.00 82.36           C\nATOM    804  C   LYS A  47     -17.736   4.173  -7.162  1.00 78.80           C\nATOM    805  O   LYS A  47     -18.493   5.136  -7.281  1.00 77.80           O\nATOM    806  CB  LYS A  47     -18.129   2.504  -8.997  1.00 83.02           C\nATOM    807  CG  LYS A  47     -18.307   1.033  -9.400  0.00 82.35           C\nATOM    808  CD  LYS A  47     -17.930   0.799 -10.870  0.00 82.43           C\nATOM    809  CE  LYS A  47     -18.156  -0.651 -11.322  0.00 82.44           C\nATOM    810  NZ  LYS A  47     -17.765  -0.843 -12.730  0.00 82.42           N1+\nATOM    811  H   LYS A  47     -20.326   2.552  -7.767  1.00 84.60           H\nATOM    812  HA  LYS A  47     -17.609   2.037  -6.957  1.00 82.36           H\nATOM    813  HB3 LYS A  47     -17.137   2.818  -9.329  1.00 83.02           H\nATOM    814  HB2 LYS A  47     -18.838   3.129  -9.542  1.00 83.02           H\nATOM    815  HG3 LYS A  47     -19.342   0.731  -9.232  1.00 82.35           H\nATOM    816  HG2 LYS A  47     -17.692   0.397  -8.762  1.00 82.35           H\nATOM    817  HD3 LYS A  47     -16.881   1.067 -11.011  1.00 82.43           H\nATOM    818  HD2 LYS A  47     -18.502   1.481 -11.502  1.00 82.43           H\nATOM    819  HE3 LYS A  47     -19.207  -0.921 -11.209  1.00 82.44           H\nATOM    820  HE2 LYS A  47     -17.576  -1.335 -10.702  1.00 82.44           H\nATOM    821  HZ1 LYS A  47     -16.785  -0.622 -12.843  1.00 82.42           H\nATOM    822  HZ2 LYS A  47     -17.927  -1.803 -13.000  1.00 82.42           H\nATOM    823  HZ3 LYS A  47     -18.315  -0.231 -13.317  1.00 82.42           H\nATOM    824  N   ASP A  48     -16.442   4.264  -6.827  1.00 74.59           N\nATOM    825  CA  ASP A  48     -15.713   5.525  -6.694  1.00 71.55           C\nATOM    826  C   ASP A  48     -15.334   6.060  -8.086  1.00 68.21           C\nATOM    827  O   ASP A  48     -14.876   5.295  -8.936  1.00 68.36           O\nATOM    828  CB  ASP A  48     -14.450   5.383  -5.807  1.00 71.02           C\nATOM    829  CG  ASP A  48     -14.693   4.878  -4.373  1.00 72.78           C\nATOM    830  OD1 ASP A  48     -15.759   5.198  -3.800  1.00 77.74           O\nATOM    831  OD2 ASP A  48     -13.723   4.330  -3.803  1.00 67.24           O1-\nATOM    832  H   ASP A  48     -15.887   3.425  -6.746  1.00 74.59           H\nATOM    833  HA  ASP A  48     -16.375   6.256  -6.223  1.00 71.55           H\nATOM    834  HB3 ASP A  48     -13.939   6.345  -5.734  1.00 71.02           H\nATOM    835  HB2 ASP A  48     -13.757   4.689  -6.287  1.00 71.02           H\nATOM    836  N   TYR A  49     -15.514   7.374  -8.266  1.00 65.06           N\nATOM    837  CA  TYR A  49     -15.182   8.125  -9.475  1.00 62.46           C\nATOM    838  C   TYR A  49     -14.264   9.301  -9.116  1.00 60.48           C\nATOM    839  O   TYR A  49     -14.287   9.773  -7.980  1.00 58.86           O\nATOM    840  CB  TYR A  49     -16.483   8.635 -10.123  1.00 62.72           C\nATOM    841  CG  TYR A  49     -17.339   7.552 -10.755  1.00 67.33           C\nATOM    842  CD1 TYR A  49     -18.376   6.939 -10.019  1.00 67.25           C\nATOM    843  CD2 TYR A  49     -17.095   7.150 -12.084  1.00 69.29           C\nATOM    844  CE1 TYR A  49     -19.164   5.931 -10.608  1.00 68.70           C\nATOM    845  CE2 TYR A  49     -17.883   6.145 -12.674  1.00 71.71           C\nATOM    846  CZ  TYR A  49     -18.917   5.533 -11.938  1.00 71.69           C\nATOM    847  OH  TYR A  49     -19.671   4.555 -12.519  1.00 72.95           O\nATOM    848  H   TYR A  49     -15.912   7.923  -7.514  1.00 65.06           H\nATOM    849  HA  TYR A  49     -14.651   7.489 -10.188  1.00 62.46           H\nATOM    850  HB3 TYR A  49     -16.232   9.343 -10.912  1.00 62.72           H\nATOM    851  HB2 TYR A  49     -17.080   9.195  -9.401  1.00 62.72           H\nATOM    852  HD1 TYR A  49     -18.568   7.240  -8.999  1.00 67.25           H\nATOM    853  HD2 TYR A  49     -16.300   7.608 -12.655  1.00 69.29           H\nATOM    854  HE1 TYR A  49     -19.955   5.465 -10.037  1.00 68.70           H\nATOM    855  HE2 TYR A  49     -17.687   5.839 -13.692  1.00 71.71           H\nATOM    856  HH  TYR A  49     -20.280   4.110 -11.919  1.00 72.95           H\nATOM    857  N   ALA A  50     -13.473   9.748 -10.100  1.00 57.89           N\nATOM    858  CA  ALA A  50     -12.576  10.891  -9.986  1.00 57.22           C\nATOM    859  C   ALA A  50     -13.065  12.011 -10.910  1.00 57.62           C\nATOM    860  O   ALA A  50     -13.017  11.857 -12.129  1.00 59.75           O\nATOM    861  CB  ALA A  50     -11.149  10.450 -10.332  1.00 56.31           C\nATOM    862  H   ALA A  50     -13.517   9.311 -11.013  1.00 57.89           H\nATOM    863  HA  ALA A  50     -12.552  11.263  -8.963  1.00 57.22           H\nATOM    864  HB1 ALA A  50     -10.475  11.303 -10.422  1.00 56.31           H\nATOM    865  HB2 ALA A  50     -10.752   9.803  -9.552  1.00 56.31           H\nATOM    866  HB3 ALA A  50     -11.115   9.890 -11.265  1.00 56.31           H\nATOM    867  N   LEU A  51     -13.527  13.112 -10.301  1.00 56.70           N\nATOM    868  CA  LEU A  51     -14.004  14.313 -10.981  1.00 56.58           C\nATOM    869  C   LEU A  51     -12.902  15.376 -10.959  1.00 57.30           C\nATOM    870  O   LEU A  51     -12.632  15.946  -9.903  1.00 56.16           O\nATOM    871  CB  LEU A  51     -15.283  14.820 -10.275  1.00 57.05           C\nATOM    872  CG  LEU A  51     -16.572  14.188 -10.836  1.00 60.95           C\nATOM    873  CD1 LEU A  51     -17.771  14.461  -9.909  1.00 60.03           C\nATOM    874  CD2 LEU A  51     -16.849  14.648 -12.285  1.00 60.08           C\nATOM    875  H   LEU A  51     -13.510  13.157  -9.290  1.00 56.70           H\nATOM    876  HA  LEU A  51     -14.236  14.089 -12.023  1.00 56.58           H\nATOM    877  HB3 LEU A  51     -15.372  15.904 -10.361  1.00 57.05           H\nATOM    878  HB2 LEU A  51     -15.201  14.625  -9.204  1.00 57.05           H\nATOM    879  HG  LEU A  51     -16.430  13.107 -10.852  1.00 60.95           H\nATOM    880 HD11 LEU A  51     -18.224  13.521  -9.600  1.00 60.03           H\nATOM    881 HD12 LEU A  51     -17.484  14.995  -9.002  1.00 60.03           H\nATOM    882 HD13 LEU A  51     -18.551  15.051 -10.388  1.00 60.03           H\nATOM    883 HD21 LEU A  51     -17.914  14.702 -12.508  1.00 60.08           H\nATOM    884 HD22 LEU A  51     -16.420  15.629 -12.490  1.00 60.08           H\nATOM    885 HD23 LEU A  51     -16.415  13.954 -13.003  1.00 60.08           H\nATOM    886  N   LYS A  52     -12.307  15.624 -12.134  1.00 57.59           N\nATOM    887  CA  LYS A  52     -11.305  16.658 -12.359  1.00 58.34           C\nATOM    888  C   LYS A  52     -11.985  17.911 -12.925  1.00 58.71           C\nATOM    889  O   LYS A  52     -12.323  17.927 -14.107  1.00 56.90           O\nATOM    890  CB  LYS A  52     -10.229  16.113 -13.323  1.00 59.12           C\nATOM    891  CG  LYS A  52      -9.110  17.117 -13.661  1.00 60.47           C\nATOM    892  CD  LYS A  52      -8.101  16.562 -14.674  1.00 62.30           C\nATOM    893  CE  LYS A  52      -6.903  17.507 -14.855  1.00 65.70           C\nATOM    894  NZ  LYS A  52      -5.830  16.900 -15.660  1.00 65.73           N1+\nATOM    895  H   LYS A  52     -12.599  15.108 -12.955  1.00 57.59           H\nATOM    896  HA  LYS A  52     -10.808  16.908 -11.422  1.00 58.34           H\nATOM    897  HB3 LYS A  52     -10.709  15.796 -14.247  1.00 59.12           H\nATOM    898  HB2 LYS A  52      -9.784  15.214 -12.894  1.00 59.12           H\nATOM    899  HG3 LYS A  52      -8.594  17.393 -12.739  1.00 60.47           H\nATOM    900  HG2 LYS A  52      -9.522  18.042 -14.065  1.00 60.47           H\nATOM    901  HD3 LYS A  52      -8.599  16.419 -15.634  1.00 62.30           H\nATOM    902  HD2 LYS A  52      -7.774  15.573 -14.356  1.00 62.30           H\nATOM    903  HE3 LYS A  52      -6.494  17.762 -13.878  1.00 65.70           H\nATOM    904  HE2 LYS A  52      -7.221  18.439 -15.325  1.00 65.70           H\nATOM    905  HZ1 LYS A  52      -6.186  16.684 -16.585  1.00 65.73           H\nATOM    906  HZ2 LYS A  52      -5.055  17.542 -15.749  1.00 65.73           H\nATOM    907  HZ3 LYS A  52      -5.506  16.052 -15.217  1.00 65.73           H\nATOM    908  N   GLN A  53     -12.110  18.956 -12.094  1.00 58.77           N\nATOM    909  CA  GLN A  53     -12.391  20.317 -12.544  1.00 60.35           C\nATOM    910  C   GLN A  53     -11.093  20.917 -13.108  1.00 61.07           C\nATOM    911  O   GLN A  53     -10.129  21.052 -12.356  1.00 60.36           O\nATOM    912  CB  GLN A  53     -12.935  21.142 -11.359  1.00 60.87           C\nATOM    913  CG  GLN A  53     -13.272  22.602 -11.721  1.00 64.55           C\nATOM    914  CD  GLN A  53     -13.921  23.362 -10.564  1.00 67.97           C\nATOM    915  OE1 GLN A  53     -15.058  23.810 -10.676  1.00 71.42           O\nATOM    916  NE2 GLN A  53     -13.192  23.548  -9.463  1.00 68.26           N\nATOM    917  H   GLN A  53     -11.786  18.866 -11.140  1.00 58.77           H\nATOM    918  HA  GLN A  53     -13.156  20.293 -13.321  1.00 60.35           H\nATOM    919  HB3 GLN A  53     -12.214  21.125 -10.542  1.00 60.87           H\nATOM    920  HB2 GLN A  53     -13.830  20.656 -10.975  1.00 60.87           H\nATOM    921  HG3 GLN A  53     -13.949  22.620 -12.576  1.00 64.55           H\nATOM    922  HG2 GLN A  53     -12.375  23.145 -12.021  1.00 64.55           H\nATOM    923 HE22 GLN A  53     -13.582  24.061  -8.685  1.00 68.26           H\nATOM    924 HE21 GLN A  53     -12.240  23.210  -9.414  1.00 68.26           H\nATOM    925  N   ILE A  54     -11.092  21.256 -14.407  1.00 63.18           N\nATOM    926  CA  ILE A  54      -9.946  21.850 -15.103  1.00 65.00           C\nATOM    927  C   ILE A  54      -9.695  23.297 -14.619  1.00 67.34           C\nATOM    928  O   ILE A  54     -10.655  24.022 -14.346  1.00 66.89           O\nATOM    929  CB  ILE A  54     -10.156  21.831 -16.652  1.00 65.02           C\nATOM    930  CG1 ILE A  54     -10.270  20.379 -17.180  1.00 64.91           C\nATOM    931  CG2 ILE A  54      -9.065  22.589 -17.445  1.00 68.02           C\nATOM    932  CD1 ILE A  54     -10.625  20.277 -18.674  1.00 61.37           C\nATOM    933  H   ILE A  54     -11.930  21.124 -14.958  1.00 63.18           H\nATOM    934  HA  ILE A  54      -9.064  21.250 -14.868  1.00 65.00           H\nATOM    935  HB  ILE A  54     -11.108  22.320 -16.864  1.00 65.02           H\nATOM    936 HG13 ILE A  54     -11.022  19.827 -16.615  1.00 64.91           H\nATOM    937 HG12 ILE A  54      -9.327  19.858 -17.004  1.00 64.91           H\nATOM    938 HG21 ILE A  54      -9.190  22.480 -18.520  1.00 68.02           H\nATOM    939 HG22 ILE A  54      -9.092  23.660 -17.255  1.00 68.02           H\nATOM    940 HG23 ILE A  54      -8.068  22.223 -17.195  1.00 68.02           H\nATOM    941 HD11 ILE A  54     -11.292  19.438 -18.864  1.00 61.37           H\nATOM    942 HD12 ILE A  54     -11.124  21.174 -19.038  1.00 61.37           H\nATOM    943 HD13 ILE A  54      -9.730  20.124 -19.280  1.00 61.37           H\nATOM    944  N   GLU A  55      -8.410  23.681 -14.515  1.00 70.15           N\nATOM    945  CA  GLU A  55      -7.963  25.011 -14.092  1.00 71.83           C\nATOM    946  C   GLU A  55      -8.351  26.111 -15.104  1.00 71.47           C\nATOM    947  O   GLU A  55      -8.218  25.904 -16.310  1.00 70.79           O\nATOM    948  CB  GLU A  55      -6.435  24.962 -13.841  1.00 73.16           C\nATOM    949  CG  GLU A  55      -5.786  26.255 -13.286  1.00 76.56           C\nATOM    950  CD  GLU A  55      -6.241  26.704 -11.883  1.00 79.12           C\nATOM    951  OE1 GLU A  55      -6.843  25.893 -11.143  1.00 81.59           O\nATOM    952  OE2 GLU A  55      -5.967  27.879 -11.555  1.00 81.76           O1-\nATOM    953  H   GLU A  55      -7.677  23.027 -14.753  1.00 70.15           H\nATOM    954  HA  GLU A  55      -8.473  25.222 -13.151  1.00 71.83           H\nATOM    955  HB3 GLU A  55      -5.935  24.710 -14.777  1.00 73.16           H\nATOM    956  HB2 GLU A  55      -6.198  24.134 -13.175  1.00 73.16           H\nATOM    957  HG3 GLU A  55      -5.931  27.076 -13.990  1.00 76.56           H\nATOM    958  HG2 GLU A  55      -4.707  26.101 -13.237  1.00 76.56           H\nATOM    959  N   GLY A  56      -8.813  27.262 -14.586  1.00 72.71           N\nATOM    960  CA  GLY A  56      -9.273  28.401 -15.387  1.00 73.44           C\nATOM    961  C   GLY A  56     -10.720  28.204 -15.875  1.00 73.84           C\nATOM    962  O   GLY A  56     -11.352  27.184 -15.600  1.00 74.36           O\nATOM    963  H   GLY A  56      -8.853  27.365 -13.583  1.00 72.71           H\nATOM    964  HA3 GLY A  56      -8.613  28.562 -16.241  1.00 73.44           H\nATOM    965  HA2 GLY A  56      -9.224  29.300 -14.772  1.00 73.44           H\nATOM    966  N   THR A  57     -11.245  29.211 -16.590  1.00 74.35           N\nATOM    967  CA  THR A  57     -12.614  29.245 -17.119  1.00 74.06           C\nATOM    968  C   THR A  57     -12.607  29.195 -18.660  1.00 73.22           C\nATOM    969  O   THR A  57     -11.610  29.543 -19.296  1.00 72.49           O\nATOM    970  CB  THR A  57     -13.342  30.548 -16.685  1.00 74.45           C\nATOM    971  OG1 THR A  57     -12.751  31.714 -17.234  1.00 76.35           O\nATOM    972  CG2 THR A  57     -13.439  30.710 -15.161  1.00 75.14           C\nATOM    973  H   THR A  57     -10.684  30.025 -16.796  1.00 74.35           H\nATOM    974  HA  THR A  57     -13.191  28.391 -16.757  1.00 74.06           H\nATOM    975  HB  THR A  57     -14.365  30.512 -17.064  1.00 74.45           H\nATOM    976  HG1 THR A  57     -12.791  31.661 -18.192  1.00 76.35           H\nATOM    977 HG21 THR A  57     -14.009  31.602 -14.898  1.00 75.14           H\nATOM    978 HG22 THR A  57     -13.947  29.856 -14.712  1.00 75.14           H\nATOM    979 HG23 THR A  57     -12.457  30.797 -14.697  1.00 75.14           H\nATOM    980  N   GLY A  58     -13.748  28.763 -19.219  1.00 71.96           N\nATOM    981  CA  GLY A  58     -13.952  28.524 -20.644  1.00 71.53           C\nATOM    982  C   GLY A  58     -13.241  27.233 -21.064  1.00 71.34           C\nATOM    983  O   GLY A  58     -13.040  26.328 -20.252  1.00 72.15           O\nATOM    984  H   GLY A  58     -14.501  28.460 -18.613  1.00 71.96           H\nATOM    985  HA3 GLY A  58     -13.597  29.374 -21.229  1.00 71.53           H\nATOM    986  HA2 GLY A  58     -15.019  28.411 -20.833  1.00 71.53           H\nATOM    987  N   ILE A  59     -12.869  27.164 -22.349  1.00 70.55           N\nATOM    988  CA  ILE A  59     -12.007  26.119 -22.891  1.00 70.70           C\nATOM    989  C   ILE A  59     -10.695  26.825 -23.278  1.00 69.49           C\nATOM    990  O   ILE A  59     -10.708  27.683 -24.157  1.00 68.49           O\nATOM    991  CB  ILE A  59     -12.596  25.443 -24.172  1.00 71.23           C\nATOM    992  CG1 ILE A  59     -14.102  25.120 -24.045  1.00 73.27           C\nATOM    993  CG2 ILE A  59     -11.801  24.169 -24.530  1.00 74.23           C\nATOM    994  CD1 ILE A  59     -14.711  24.494 -25.305  1.00 77.18           C\nATOM    995  H   ILE A  59     -13.074  27.929 -22.975  1.00 70.55           H\nATOM    996  HA  ILE A  59     -11.794  25.346 -22.149  1.00 70.70           H\nATOM    997  HB  ILE A  59     -12.503  26.127 -25.018  1.00 71.23           H\nATOM    998 HG13 ILE A  59     -14.653  26.038 -23.851  1.00 73.27           H\nATOM    999 HG12 ILE A  59     -14.273  24.465 -23.190  1.00 73.27           H\nATOM   1000 HG21 ILE A  59     -12.103  23.756 -25.492  1.00 74.23           H\nATOM   1001 HG22 ILE A  59     -10.736  24.368 -24.598  1.00 74.23           H\nATOM   1002 HG23 ILE A  59     -11.938  23.392 -23.777  1.00 74.23           H\nATOM   1003 HD11 ILE A  59     -15.798  24.589 -25.306  1.00 77.18           H\nATOM   1004 HD12 ILE A  59     -14.330  24.970 -26.208  1.00 77.18           H\nATOM   1005 HD13 ILE A  59     -14.469  23.435 -25.372  1.00 77.18           H\nATOM   1006  N   SER A  60      -9.588  26.473 -22.610  1.00 68.87           N\nATOM   1007  CA  SER A  60      -8.235  26.904 -22.979  1.00 67.43           C\nATOM   1008  C   SER A  60      -7.661  26.010 -24.099  1.00 68.18           C\nATOM   1009  O   SER A  60      -8.281  25.012 -24.462  1.00 68.28           O\nATOM   1010  CB  SER A  60      -7.367  26.912 -21.703  1.00 66.40           C\nATOM   1011  OG  SER A  60      -7.133  25.606 -21.218  1.00 64.01           O\nATOM   1012  H   SER A  60      -9.640  25.785 -21.873  1.00 68.87           H\nATOM   1013  HA  SER A  60      -8.276  27.927 -23.357  1.00 67.43           H\nATOM   1014  HB3 SER A  60      -7.842  27.502 -20.918  1.00 66.40           H\nATOM   1015  HB2 SER A  60      -6.402  27.379 -21.902  1.00 66.40           H\nATOM   1016  HG  SER A  60      -6.502  25.648 -20.494  1.00 64.01           H\nATOM   1017  N   MET A  61      -6.472  26.361 -24.619  1.00 67.44           N\nATOM   1018  CA  MET A  61      -5.741  25.531 -25.588  1.00 68.17           C\nATOM   1019  C   MET A  61      -5.304  24.174 -24.989  1.00 66.44           C\nATOM   1020  O   MET A  61      -5.338  23.167 -25.697  1.00 67.20           O\nATOM   1021  CB  MET A  61      -4.572  26.356 -26.177  1.00 68.84           C\nATOM   1022  CG  MET A  61      -3.884  25.742 -27.413  1.00 71.36           C\nATOM   1023  SD  MET A  61      -2.557  24.544 -27.107  1.00 78.92           S\nATOM   1024  CE  MET A  61      -1.195  25.666 -26.701  1.00 67.97           C\nATOM   1025  H   MET A  61      -6.004  27.196 -24.298  1.00 67.44           H\nATOM   1026  HA  MET A  61      -6.432  25.315 -26.406  1.00 68.17           H\nATOM   1027  HB3 MET A  61      -3.829  26.538 -25.399  1.00 68.84           H\nATOM   1028  HB2 MET A  61      -4.943  27.342 -26.460  1.00 68.84           H\nATOM   1029  HG3 MET A  61      -3.462  26.541 -28.023  1.00 71.36           H\nATOM   1030  HG2 MET A  61      -4.629  25.263 -28.045  1.00 71.36           H\nATOM   1031  HE1 MET A  61      -0.281  25.098 -26.523  1.00 67.97           H\nATOM   1032  HE2 MET A  61      -1.014  26.356 -27.525  1.00 67.97           H\nATOM   1033  HE3 MET A  61      -1.424  26.242 -25.805  1.00 67.97           H\nATOM   1034  N   SER A  62      -4.966  24.169 -23.686  1.00 64.87           N\nATOM   1035  CA  SER A  62      -4.649  22.975 -22.900  1.00 64.65           C\nATOM   1036  C   SER A  62      -5.873  22.105 -22.569  1.00 62.96           C\nATOM   1037  O   SER A  62      -5.749  20.883 -22.624  1.00 63.59           O\nATOM   1038  CB  SER A  62      -3.820  23.374 -21.659  1.00 65.72           C\nATOM   1039  OG  SER A  62      -4.573  24.076 -20.690  1.00 70.00           O\nATOM   1040  H   SER A  62      -4.984  25.035 -23.166  1.00 64.87           H\nATOM   1041  HA  SER A  62      -4.016  22.347 -23.522  1.00 64.65           H\nATOM   1042  HB3 SER A  62      -2.968  23.989 -21.949  1.00 65.72           H\nATOM   1043  HB2 SER A  62      -3.412  22.480 -21.186  1.00 65.72           H\nATOM   1044  HG  SER A  62      -3.997  24.283 -19.949  1.00 70.00           H\nATOM   1045  N   ALA A  63      -7.029  22.732 -22.283  1.00 61.15           N\nATOM   1046  CA  ALA A  63      -8.304  22.046 -22.065  1.00 59.25           C\nATOM   1047  C   ALA A  63      -8.856  21.418 -23.354  1.00 57.20           C\nATOM   1048  O   ALA A  63      -9.366  20.302 -23.299  1.00 55.09           O\nATOM   1049  CB  ALA A  63      -9.328  23.025 -21.473  1.00 58.63           C\nATOM   1050  H   ALA A  63      -7.047  23.742 -22.224  1.00 61.15           H\nATOM   1051  HA  ALA A  63      -8.138  21.249 -21.337  1.00 59.25           H\nATOM   1052  HB1 ALA A  63     -10.241  22.508 -21.177  1.00 58.63           H\nATOM   1053  HB2 ALA A  63      -8.932  23.525 -20.589  1.00 58.63           H\nATOM   1054  HB3 ALA A  63      -9.604  23.794 -22.192  1.00 58.63           H\nATOM   1055  N   CYS A  64      -8.712  22.133 -24.485  0.50 56.46           N\nATOM   1056  CA  CYS A  64      -9.133  21.708 -25.819  0.50 55.68           C\nATOM   1057  C   CYS A  64      -8.373  20.453 -26.286  0.50 55.63           C\nATOM   1058  O   CYS A  64      -9.021  19.481 -26.666  0.50 55.82           O\nATOM   1059  CB  CYS A  64      -9.039  22.861 -26.842  0.50 55.01           C\nATOM   1060  SG  CYS A  64      -9.742  22.406 -28.453  0.50 52.99           S\nATOM   1061  H   CYS A  64      -8.289  23.051 -24.431  0.50 56.46           H\nATOM   1062  HA  CYS A  64     -10.188  21.436 -25.737  0.50 55.68           H\nATOM   1063  HB3 CYS A  64      -8.004  23.176 -26.975  0.50 55.01           H\nATOM   1064  HB2 CYS A  64      -9.585  23.734 -26.487  0.50 55.01           H\nATOM   1065  HG  CYS A  64      -9.493  23.571 -29.058  0.50 52.99           H\nATOM   1066  N   ARG A  65      -7.030  20.480 -26.200  1.00 56.08           N\nATOM   1067  CA  ARG A  65      -6.163  19.346 -26.533  1.00 57.07           C\nATOM   1068  C   ARG A  65      -6.274  18.164 -25.555  1.00 55.68           C\nATOM   1069  O   ARG A  65      -6.112  17.030 -26.007  1.00 53.46           O\nATOM   1070  CB  ARG A  65      -4.700  19.809 -26.657  1.00 57.66           C\nATOM   1071  CG  ARG A  65      -4.429  20.530 -27.990  1.00 60.28           C\nATOM   1072  CD  ARG A  65      -2.964  20.943 -28.214  1.00 61.86           C\nATOM   1073  NE  ARG A  65      -2.051  19.788 -28.306  1.00 64.64           N\nATOM   1074  CZ  ARG A  65      -1.596  19.126 -29.385  1.00 68.11           C\nATOM   1075  NH1 ARG A  65      -1.931  19.467 -30.636  1.00 69.99           N\nATOM   1076  NH2 ARG A  65      -0.781  18.081 -29.197  1.00 69.14           N1+\nATOM   1077  H   ARG A  65      -6.565  21.318 -25.877  1.00 56.08           H\nATOM   1078  HA  ARG A  65      -6.477  18.962 -27.506  1.00 57.07           H\nATOM   1079  HB3 ARG A  65      -4.049  18.935 -26.611  1.00 57.66           H\nATOM   1080  HB2 ARG A  65      -4.421  20.434 -25.808  1.00 57.66           H\nATOM   1081  HG3 ARG A  65      -5.092  21.381 -28.147  1.00 60.28           H\nATOM   1082  HG2 ARG A  65      -4.691  19.811 -28.767  1.00 60.28           H\nATOM   1083  HD3 ARG A  65      -2.627  21.471 -27.322  1.00 61.86           H\nATOM   1084  HD2 ARG A  65      -2.860  21.654 -29.033  1.00 61.86           H\nATOM   1085  HE  ARG A  65      -1.753  19.441 -27.402  1.00 64.64           H\nATOM   1086 HH12 ARG A  65      -1.563  18.961 -31.428  1.00 69.99           H\nATOM   1087 HH11 ARG A  65      -2.622  20.191 -30.788  1.00 69.99           H\nATOM   1088 HH22 ARG A  65      -0.406  17.573 -29.985  1.00 69.14           H\nATOM   1089 HH21 ARG A  65      -0.508  17.813 -28.262  1.00 69.14           H\nATOM   1090  N   GLU A  66      -6.568  18.423 -24.267  1.00 56.21           N\nATOM   1091  CA  GLU A  66      -6.831  17.374 -23.280  1.00 55.67           C\nATOM   1092  C   GLU A  66      -8.106  16.583 -23.598  1.00 54.39           C\nATOM   1093  O   GLU A  66      -8.042  15.359 -23.690  1.00 54.06           O\nATOM   1094  CB  GLU A  66      -6.800  17.934 -21.839  1.00 56.14           C\nATOM   1095  CG  GLU A  66      -7.223  16.899 -20.768  1.00 60.24           C\nATOM   1096  CD  GLU A  66      -6.937  17.261 -19.306  1.00 65.32           C\nATOM   1097  OE1 GLU A  66      -6.610  18.432 -19.011  1.00 69.39           O\nATOM   1098  OE2 GLU A  66      -7.059  16.328 -18.481  1.00 65.01           O1-\nATOM   1099  H   GLU A  66      -6.667  19.377 -23.949  1.00 56.21           H\nATOM   1100  HA  GLU A  66      -6.013  16.659 -23.358  1.00 55.67           H\nATOM   1101  HB3 GLU A  66      -7.439  18.815 -21.769  1.00 56.14           H\nATOM   1102  HB2 GLU A  66      -5.786  18.277 -21.630  1.00 56.14           H\nATOM   1103  HG3 GLU A  66      -6.731  15.952 -20.982  1.00 60.24           H\nATOM   1104  HG2 GLU A  66      -8.294  16.712 -20.845  1.00 60.24           H\nATOM   1105  N   ILE A  67      -9.217  17.311 -23.797  1.00 53.50           N\nATOM   1106  CA  ILE A  67     -10.517  16.768 -24.187  1.00 53.29           C\nATOM   1107  C   ILE A  67     -10.463  16.042 -25.547  1.00 52.39           C\nATOM   1108  O   ILE A  67     -11.041  14.964 -25.657  1.00 51.69           O\nATOM   1109  CB  ILE A  67     -11.607  17.884 -24.220  1.00 53.74           C\nATOM   1110  CG1 ILE A  67     -11.891  18.426 -22.799  1.00 53.27           C\nATOM   1111  CG2 ILE A  67     -12.946  17.470 -24.866  1.00 53.91           C\nATOM   1112  CD1 ILE A  67     -12.586  19.799 -22.791  1.00 47.24           C\nATOM   1113  H   ILE A  67      -9.173  18.318 -23.698  1.00 53.50           H\nATOM   1114  HA  ILE A  67     -10.802  16.032 -23.433  1.00 53.29           H\nATOM   1115  HB  ILE A  67     -11.205  18.706 -24.814  1.00 53.74           H\nATOM   1116 HG13 ILE A  67     -10.969  18.508 -22.225  1.00 53.27           H\nATOM   1117 HG12 ILE A  67     -12.502  17.707 -22.253  1.00 53.27           H\nATOM   1118 HG21 ILE A  67     -13.684  18.271 -24.814  1.00 53.91           H\nATOM   1119 HG22 ILE A  67     -12.849  17.213 -25.920  1.00 53.91           H\nATOM   1120 HG23 ILE A  67     -13.360  16.608 -24.344  1.00 53.91           H\nATOM   1121 HD11 ILE A  67     -12.080  20.482 -22.107  1.00 47.24           H\nATOM   1122 HD12 ILE A  67     -12.583  20.271 -23.773  1.00 47.24           H\nATOM   1123 HD13 ILE A  67     -13.624  19.710 -22.470  1.00 47.24           H\nATOM   1124  N   ALA A  68      -9.734  16.614 -26.524  1.00 51.35           N\nATOM   1125  CA  ALA A  68      -9.535  16.054 -27.861  1.00 50.62           C\nATOM   1126  C   ALA A  68      -8.848  14.681 -27.852  1.00 50.08           C\nATOM   1127  O   ALA A  68      -9.385  13.748 -28.442  1.00 48.53           O\nATOM   1128  CB  ALA A  68      -8.740  17.037 -28.735  1.00 50.29           C\nATOM   1129  H   ALA A  68      -9.294  17.509 -26.352  1.00 51.35           H\nATOM   1130  HA  ALA A  68     -10.525  15.934 -28.303  1.00 50.62           H\nATOM   1131  HB1 ALA A  68      -8.635  16.665 -29.753  1.00 50.29           H\nATOM   1132  HB2 ALA A  68      -9.234  18.003 -28.803  1.00 50.29           H\nATOM   1133  HB3 ALA A  68      -7.738  17.205 -28.342  1.00 50.29           H\nATOM   1134  N   LEU A  69      -7.685  14.579 -27.188  1.00 49.60           N\nATOM   1135  CA  LEU A  69      -6.869  13.364 -27.184  1.00 51.20           C\nATOM   1136  C   LEU A  69      -7.416  12.264 -26.260  1.00 51.55           C\nATOM   1137  O   LEU A  69      -7.372  11.101 -26.660  1.00 50.96           O\nATOM   1138  CB  LEU A  69      -5.402  13.722 -26.871  1.00 51.65           C\nATOM   1139  CG  LEU A  69      -4.687  14.444 -28.035  1.00 54.33           C\nATOM   1140  CD1 LEU A  69      -3.355  15.063 -27.581  1.00 52.59           C\nATOM   1141  CD2 LEU A  69      -4.478  13.508 -29.244  1.00 54.25           C\nATOM   1142  H   LEU A  69      -7.301  15.384 -26.711  1.00 49.60           H\nATOM   1143  HA  LEU A  69      -6.907  12.944 -28.191  1.00 51.20           H\nATOM   1144  HB3 LEU A  69      -4.836  12.823 -26.624  1.00 51.65           H\nATOM   1145  HB2 LEU A  69      -5.376  14.345 -25.976  1.00 51.65           H\nATOM   1146  HG  LEU A  69      -5.317  15.271 -28.365  1.00 54.33           H\nATOM   1147 HD11 LEU A  69      -2.692  15.268 -28.422  1.00 52.59           H\nATOM   1148 HD12 LEU A  69      -3.524  16.011 -27.069  1.00 52.59           H\nATOM   1149 HD13 LEU A  69      -2.823  14.399 -26.900  1.00 52.59           H\nATOM   1150 HD21 LEU A  69      -3.425  13.396 -29.493  1.00 54.25           H\nATOM   1151 HD22 LEU A  69      -4.853  12.500 -29.062  1.00 54.25           H\nATOM   1152 HD23 LEU A  69      -4.988  13.889 -30.129  1.00 54.25           H\nATOM   1153  N   LEU A  70      -7.975  12.624 -25.089  1.00 53.45           N\nATOM   1154  CA  LEU A  70      -8.640  11.676 -24.182  1.00 53.84           C\nATOM   1155  C   LEU A  70      -9.914  11.043 -24.772  1.00 54.62           C\nATOM   1156  O   LEU A  70     -10.269   9.942 -24.358  1.00 54.54           O\nATOM   1157  CB  LEU A  70      -8.990  12.361 -22.845  1.00 53.36           C\nATOM   1158  CG  LEU A  70      -7.805  12.578 -21.886  1.00 55.09           C\nATOM   1159  CD1 LEU A  70      -8.243  13.455 -20.704  1.00 51.81           C\nATOM   1160  CD2 LEU A  70      -7.196  11.250 -21.387  1.00 54.34           C\nATOM   1161  H   LEU A  70      -7.989  13.597 -24.811  1.00 53.45           H\nATOM   1162  HA  LEU A  70      -7.945  10.856 -23.993  1.00 53.84           H\nATOM   1163  HB3 LEU A  70      -9.721  11.758 -22.311  1.00 53.36           H\nATOM   1164  HB2 LEU A  70      -9.497  13.305 -23.051  1.00 53.36           H\nATOM   1165  HG  LEU A  70      -7.034  13.128 -22.425  1.00 55.09           H\nATOM   1166 HD11 LEU A  70      -7.385  13.801 -20.129  1.00 51.81           H\nATOM   1167 HD12 LEU A  70      -8.794  14.334 -21.039  1.00 51.81           H\nATOM   1168 HD13 LEU A  70      -8.897  12.903 -20.030  1.00 51.81           H\nATOM   1169 HD21 LEU A  70      -7.053  11.245 -20.306  1.00 54.34           H\nATOM   1170 HD22 LEU A  70      -7.826  10.393 -21.626  1.00 54.34           H\nATOM   1171 HD23 LEU A  70      -6.222  11.070 -21.841  1.00 54.34           H\nATOM   1172  N   ARG A  71     -10.568  11.724 -25.728  1.00 54.95           N\nATOM   1173  CA  ARG A  71     -11.746  11.219 -26.432  1.00 53.79           C\nATOM   1174  C   ARG A  71     -11.428  10.091 -27.438  1.00 52.54           C\nATOM   1175  O   ARG A  71     -12.347   9.363 -27.815  1.00 54.07           O\nATOM   1176  CB  ARG A  71     -12.461  12.419 -27.093  1.00 54.33           C\nATOM   1177  CG  ARG A  71     -13.856  12.155 -27.677  1.00 55.95           C\nATOM   1178  CD  ARG A  71     -14.890  11.840 -26.583  1.00 57.44           C\nATOM   1179  NE  ARG A  71     -16.195  11.451 -27.124  1.00 54.94           N\nATOM   1180  CZ  ARG A  71     -16.550  10.264 -27.641  1.00 57.54           C\nATOM   1181  NH1 ARG A  71     -15.686   9.249 -27.796  1.00 61.21           N\nATOM   1182  NH2 ARG A  71     -17.821  10.099 -28.012  1.00 59.42           N1+\nATOM   1183  H   ARG A  71     -10.233  12.635 -26.011  1.00 54.95           H\nATOM   1184  HA  ARG A  71     -12.401  10.791 -25.673  1.00 53.79           H\nATOM   1185  HB3 ARG A  71     -11.821  12.838 -27.868  1.00 54.33           H\nATOM   1186  HB2 ARG A  71     -12.586  13.201 -26.347  1.00 54.33           H\nATOM   1187  HG3 ARG A  71     -13.858  11.433 -28.494  1.00 55.95           H\nATOM   1188  HG2 ARG A  71     -14.150  13.098 -28.138  1.00 55.95           H\nATOM   1189  HD3 ARG A  71     -15.108  12.774 -26.064  1.00 57.44           H\nATOM   1190  HD2 ARG A  71     -14.538  11.153 -25.815  1.00 57.44           H\nATOM   1191  HE  ARG A  71     -16.891  12.189 -27.126  1.00 54.94           H\nATOM   1192 HH12 ARG A  71     -15.994   8.368 -28.179  1.00 61.21           H\nATOM   1193 HH11 ARG A  71     -14.713   9.367 -27.542  1.00 61.21           H\nATOM   1194 HH22 ARG A  71     -18.128   9.239 -28.450  1.00 59.42           H\nATOM   1195 HH21 ARG A  71     -18.504  10.830 -27.856  1.00 59.42           H\nATOM   1196  N   GLU A  72     -10.148   9.961 -27.835  1.00 51.56           N\nATOM   1197  CA  GLU A  72      -9.667   9.001 -28.829  1.00 50.86           C\nATOM   1198  C   GLU A  72      -8.844   7.854 -28.223  1.00 50.64           C\nATOM   1199  O   GLU A  72      -8.932   6.737 -28.732  1.00 49.56           O\nATOM   1200  CB  GLU A  72      -8.804   9.743 -29.872  1.00 49.03           C\nATOM   1201  CG  GLU A  72      -9.481  10.931 -30.585  1.00 51.13           C\nATOM   1202  CD  GLU A  72     -10.824  10.624 -31.257  1.00 51.32           C\nATOM   1203  OE1 GLU A  72     -10.965   9.534 -31.851  1.00 51.13           O\nATOM   1204  OE2 GLU A  72     -11.700  11.511 -31.204  1.00 54.43           O1-\nATOM   1205  H   GLU A  72      -9.454  10.595 -27.464  1.00 51.56           H\nATOM   1206  HA  GLU A  72     -10.515   8.537 -29.337  1.00 50.86           H\nATOM   1207  HB3 GLU A  72      -8.465   9.031 -30.619  1.00 49.03           H\nATOM   1208  HB2 GLU A  72      -7.895  10.111 -29.394  1.00 49.03           H\nATOM   1209  HG3 GLU A  72      -8.808  11.308 -31.353  1.00 51.13           H\nATOM   1210  HG2 GLU A  72      -9.612  11.743 -29.874  1.00 51.13           H\nATOM   1211  N   LEU A  73      -8.046   8.143 -27.179  1.00 49.58           N\nATOM   1212  CA  LEU A  73      -7.163   7.175 -26.524  1.00 50.99           C\nATOM   1213  C   LEU A  73      -7.970   6.137 -25.725  1.00 50.99           C\nATOM   1214  O   LEU A  73      -8.836   6.515 -24.935  1.00 50.29           O\nATOM   1215  CB  LEU A  73      -6.165   7.917 -25.605  1.00 48.65           C\nATOM   1216  CG  LEU A  73      -5.099   8.776 -26.331  1.00 49.93           C\nATOM   1217  CD1 LEU A  73      -4.430   9.766 -25.358  1.00 46.84           C\nATOM   1218  CD2 LEU A  73      -4.040   7.929 -27.059  1.00 45.64           C\nATOM   1219  H   LEU A  73      -8.013   9.089 -26.822  1.00 49.58           H\nATOM   1220  HA  LEU A  73      -6.609   6.648 -27.302  1.00 50.99           H\nATOM   1221  HB3 LEU A  73      -5.650   7.205 -24.958  1.00 48.65           H\nATOM   1222  HB2 LEU A  73      -6.739   8.558 -24.933  1.00 48.65           H\nATOM   1223  HG  LEU A  73      -5.595   9.364 -27.102  1.00 49.93           H\nATOM   1224 HD11 LEU A  73      -3.348   9.795 -25.483  1.00 46.84           H\nATOM   1225 HD12 LEU A  73      -4.794  10.779 -25.521  1.00 46.84           H\nATOM   1226 HD13 LEU A  73      -4.628   9.516 -24.315  1.00 46.84           H\nATOM   1227 HD21 LEU A  73      -3.386   8.556 -27.664  1.00 45.64           H\nATOM   1228 HD22 LEU A  73      -3.413   7.385 -26.355  1.00 45.64           H\nATOM   1229 HD23 LEU A  73      -4.489   7.199 -27.729  1.00 45.64           H\nATOM   1230  N   LYS A  74      -7.654   4.851 -25.941  1.00 52.18           N\nATOM   1231  CA  LYS A  74      -8.288   3.715 -25.279  1.00 53.28           C\nATOM   1232  C   LYS A  74      -7.272   2.570 -25.180  1.00 52.15           C\nATOM   1233  O   LYS A  74      -6.980   1.925 -26.188  1.00 53.17           O\nATOM   1234  CB  LYS A  74      -9.586   3.323 -26.023  1.00 53.76           C\nATOM   1235  CG  LYS A  74     -10.345   2.148 -25.377  0.00 53.29           C\nATOM   1236  CD  LYS A  74     -11.669   1.835 -26.088  0.00 53.33           C\nATOM   1237  CE  LYS A  74     -12.413   0.659 -25.435  0.00 53.36           C\nATOM   1238  NZ  LYS A  74     -13.677   0.357 -26.130  0.00 53.36           N1+\nATOM   1239  H   LYS A  74      -6.940   4.620 -26.621  1.00 52.18           H\nATOM   1240  HA  LYS A  74      -8.563   4.008 -24.264  1.00 53.28           H\nATOM   1241  HB3 LYS A  74      -9.357   3.080 -27.062  1.00 53.76           H\nATOM   1242  HB2 LYS A  74     -10.249   4.189 -26.056  1.00 53.76           H\nATOM   1243  HG3 LYS A  74     -10.541   2.379 -24.329  1.00 53.29           H\nATOM   1244  HG2 LYS A  74      -9.723   1.253 -25.383  1.00 53.29           H\nATOM   1245  HD3 LYS A  74     -11.466   1.612 -27.137  1.00 53.33           H\nATOM   1246  HD2 LYS A  74     -12.300   2.725 -26.079  1.00 53.33           H\nATOM   1247  HE3 LYS A  74     -12.634   0.884 -24.391  1.00 53.36           H\nATOM   1248  HE2 LYS A  74     -11.789  -0.236 -25.445  1.00 53.36           H\nATOM   1249  HZ1 LYS A  74     -13.484   0.117 -27.092  1.00 53.36           H\nATOM   1250  HZ2 LYS A  74     -14.136  -0.419 -25.676  1.00 53.36           H\nATOM   1251  HZ3 LYS A  74     -14.280   1.167 -26.101  1.00 53.36           H\nATOM   1252  N   HIS A  75      -6.763   2.343 -23.960  1.00 50.74           N\nATOM   1253  CA  HIS A  75      -5.792   1.299 -23.631  1.00 49.66           C\nATOM   1254  C   HIS A  75      -5.870   1.026 -22.115  1.00 50.96           C\nATOM   1255  O   HIS A  75      -5.995   1.996 -21.367  1.00 50.45           O\nATOM   1256  CB  HIS A  75      -4.387   1.780 -24.047  1.00 49.60           C\nATOM   1257  CG  HIS A  75      -3.275   0.783 -23.841  1.00 50.03           C\nATOM   1258  ND1 HIS A  75      -2.534   0.717 -22.656  1.00 44.97           N\nATOM   1259  CD2 HIS A  75      -2.817  -0.189 -24.707  1.00 48.58           C\nATOM   1260  CE1 HIS A  75      -1.681  -0.280 -22.844  1.00 47.72           C\nATOM   1261  NE2 HIS A  75      -1.799  -0.849 -24.043  1.00 45.39           N\nATOM   1262  H   HIS A  75      -7.046   2.932 -23.188  1.00 50.74           H\nATOM   1263  HA  HIS A  75      -6.048   0.420 -24.218  1.00 49.66           H\nATOM   1264  HB3 HIS A  75      -4.128   2.706 -23.531  1.00 49.60           H\nATOM   1265  HB2 HIS A  75      -4.405   2.014 -25.109  1.00 49.60           H\nATOM   1266  HD2 HIS A  75      -3.122  -0.453 -25.708  1.00 48.58           H\nATOM   1267  HE1 HIS A  75      -0.959  -0.596 -22.107  1.00 47.72           H\nATOM   1268  HE2 HIS A  75      -1.237  -1.615 -24.392  1.00 45.39           H\nATOM   1269  N   PRO A  76      -5.774  -0.256 -21.673  1.00 52.16           N\nATOM   1270  CA  PRO A  76      -5.793  -0.627 -20.239  1.00 52.31           C\nATOM   1271  C   PRO A  76      -4.823   0.099 -19.286  1.00 50.81           C\nATOM   1272  O   PRO A  76      -5.149   0.201 -18.105  1.00 51.24           O\nATOM   1273  CB  PRO A  76      -5.507  -2.137 -20.238  1.00 52.41           C\nATOM   1274  CG  PRO A  76      -6.030  -2.618 -21.575  1.00 54.45           C\nATOM   1275  CD  PRO A  76      -5.706  -1.460 -22.509  1.00 54.15           C\nATOM   1276  HA  PRO A  76      -6.813  -0.457 -19.888  1.00 52.31           H\nATOM   1277  HB3 PRO A  76      -5.975  -2.656 -19.401  1.00 52.41           H\nATOM   1278  HB2 PRO A  76      -4.433  -2.326 -20.185  1.00 52.41           H\nATOM   1279  HG3 PRO A  76      -7.112  -2.745 -21.514  1.00 54.45           H\nATOM   1280  HG2 PRO A  76      -5.598  -3.567 -21.895  1.00 54.45           H\nATOM   1281  HD2 PRO A  76      -4.696  -1.562 -22.905  1.00 54.15           H\nATOM   1282  HD3 PRO A  76      -6.411  -1.463 -23.340  1.00 54.15           H\nATOM   1283  N   ASN A  77      -3.673   0.579 -19.791  1.00 50.01           N\nATOM   1284  CA  ASN A  77      -2.641   1.249 -18.989  1.00 49.63           C\nATOM   1285  C   ASN A  77      -2.542   2.758 -19.261  1.00 48.16           C\nATOM   1286  O   ASN A  77      -1.540   3.367 -18.889  1.00 49.79           O\nATOM   1287  CB  ASN A  77      -1.279   0.527 -19.103  1.00 47.52           C\nATOM   1288  CG  ASN A  77      -1.329  -0.957 -18.723  1.00 49.37           C\nATOM   1289  OD1 ASN A  77      -0.892  -1.814 -19.487  1.00 54.26           O\nATOM   1290  ND2 ASN A  77      -1.849  -1.267 -17.532  1.00 45.70           N\nATOM   1291  H   ASN A  77      -3.465   0.469 -20.775  1.00 50.01           H\nATOM   1292  HA  ASN A  77      -2.924   1.229 -17.944  1.00 49.63           H\nATOM   1293  HB3 ASN A  77      -0.555   0.998 -18.437  1.00 47.52           H\nATOM   1294  HB2 ASN A  77      -0.879   0.627 -20.112  1.00 47.52           H\nATOM   1295 HD22 ASN A  77      -1.876  -2.227 -17.223  1.00 45.70           H\nATOM   1296 HD21 ASN A  77      -2.203  -0.541 -16.923  1.00 45.70           H\nATOM   1297  N   VAL A  78      -3.607   3.350 -19.819  1.00 47.32           N\nATOM   1298  CA  VAL A  78      -3.831   4.793 -19.876  1.00 47.64           C\nATOM   1299  C   VAL A  78      -5.220   5.053 -19.262  1.00 48.18           C\nATOM   1300  O   VAL A  78      -6.144   4.278 -19.513  1.00 48.75           O\nATOM   1301  CB  VAL A  78      -3.795   5.319 -21.342  1.00 47.71           C\nATOM   1302  CG1 VAL A  78      -4.160   6.813 -21.487  1.00 45.11           C\nATOM   1303  CG2 VAL A  78      -2.418   5.070 -21.990  1.00 45.55           C\nATOM   1304  H   VAL A  78      -4.393   2.782 -20.104  1.00 47.32           H\nATOM   1305  HA  VAL A  78      -3.085   5.326 -19.283  1.00 47.64           H\nATOM   1306  HB  VAL A  78      -4.524   4.755 -21.926  1.00 47.71           H\nATOM   1307 HG11 VAL A  78      -4.032   7.150 -22.516  1.00 45.11           H\nATOM   1308 HG12 VAL A  78      -5.199   7.011 -21.223  1.00 45.11           H\nATOM   1309 HG13 VAL A  78      -3.528   7.438 -20.855  1.00 45.11           H\nATOM   1310 HG21 VAL A  78      -2.384   5.459 -23.008  1.00 45.55           H\nATOM   1311 HG22 VAL A  78      -1.620   5.552 -21.425  1.00 45.55           H\nATOM   1312 HG23 VAL A  78      -2.187   4.006 -22.051  1.00 45.55           H\nATOM   1313  N   ILE A  79      -5.348   6.120 -18.453  1.00 48.52           N\nATOM   1314  CA  ILE A  79      -6.588   6.475 -17.754  1.00 49.37           C\nATOM   1315  C   ILE A  79      -7.727   6.850 -18.735  1.00 50.31           C\nATOM   1316  O   ILE A  79      -7.484   7.571 -19.705  1.00 51.56           O\nATOM   1317  CB  ILE A  79      -6.340   7.623 -16.731  1.00 49.17           C\nATOM   1318  CG1 ILE A  79      -7.477   7.792 -15.700  1.00 54.38           C\nATOM   1319  CG2 ILE A  79      -6.038   8.992 -17.380  1.00 48.64           C\nATOM   1320  CD1 ILE A  79      -7.726   6.583 -14.787  1.00 56.54           C\nATOM   1321  H   ILE A  79      -4.552   6.724 -18.289  1.00 48.52           H\nATOM   1322  HA  ILE A  79      -6.892   5.581 -17.208  1.00 49.37           H\nATOM   1323  HB  ILE A  79      -5.447   7.349 -16.167  1.00 49.17           H\nATOM   1324 HG13 ILE A  79      -8.406   8.068 -16.197  1.00 54.38           H\nATOM   1325 HG12 ILE A  79      -7.219   8.631 -15.059  1.00 54.38           H\nATOM   1326 HG21 ILE A  79      -5.722   9.718 -16.631  1.00 48.64           H\nATOM   1327 HG22 ILE A  79      -5.240   8.916 -18.119  1.00 48.64           H\nATOM   1328 HG23 ILE A  79      -6.912   9.416 -17.875  1.00 48.64           H\nATOM   1329 HD11 ILE A  79      -8.418   6.850 -13.989  1.00 56.54           H\nATOM   1330 HD12 ILE A  79      -8.165   5.745 -15.327  1.00 56.54           H\nATOM   1331 HD13 ILE A  79      -6.805   6.246 -14.313  1.00 56.54           H\nATOM   1332  N   SER A  80      -8.930   6.307 -18.485  1.00 52.47           N\nATOM   1333  CA  SER A  80     -10.078   6.398 -19.388  1.00 53.87           C\nATOM   1334  C   SER A  80     -11.025   7.534 -18.979  1.00 53.97           C\nATOM   1335  O   SER A  80     -11.570   7.499 -17.874  1.00 56.65           O\nATOM   1336  CB  SER A  80     -10.795   5.033 -19.422  1.00 54.32           C\nATOM   1337  OG  SER A  80     -11.904   5.033 -20.300  1.00 61.62           O\nATOM   1338  H   SER A  80      -9.062   5.739 -17.661  1.00 52.47           H\nATOM   1339  HA  SER A  80      -9.722   6.585 -20.401  1.00 53.87           H\nATOM   1340  HB3 SER A  80     -11.138   4.747 -18.426  1.00 54.32           H\nATOM   1341  HB2 SER A  80     -10.106   4.260 -19.756  1.00 54.32           H\nATOM   1342  HG  SER A  80     -12.665   5.389 -19.829  1.00 61.62           H\nATOM   1343  N   LEU A  81     -11.233   8.489 -19.902  1.00 53.54           N\nATOM   1344  CA  LEU A  81     -12.242   9.545 -19.802  1.00 53.18           C\nATOM   1345  C   LEU A  81     -13.642   8.947 -20.023  1.00 54.31           C\nATOM   1346  O   LEU A  81     -13.923   8.445 -21.112  1.00 55.19           O\nATOM   1347  CB  LEU A  81     -11.907  10.661 -20.821  1.00 52.21           C\nATOM   1348  CG  LEU A  81     -12.896  11.854 -20.875  1.00 50.68           C\nATOM   1349  CD1 LEU A  81     -12.958  12.623 -19.541  1.00 45.57           C\nATOM   1350  CD2 LEU A  81     -12.592  12.788 -22.065  1.00 49.06           C\nATOM   1351  H   LEU A  81     -10.738   8.432 -20.783  1.00 53.54           H\nATOM   1352  HA  LEU A  81     -12.189   9.968 -18.798  1.00 53.18           H\nATOM   1353  HB3 LEU A  81     -11.835  10.214 -21.814  1.00 52.21           H\nATOM   1354  HB2 LEU A  81     -10.913  11.042 -20.590  1.00 52.21           H\nATOM   1355  HG  LEU A  81     -13.894  11.458 -21.067  1.00 50.68           H\nATOM   1356 HD11 LEU A  81     -12.951  13.703 -19.685  1.00 45.57           H\nATOM   1357 HD12 LEU A  81     -13.873  12.381 -19.004  1.00 45.57           H\nATOM   1358 HD13 LEU A  81     -12.124  12.377 -18.884  1.00 45.57           H\nATOM   1359 HD21 LEU A  81     -13.513  13.107 -22.552  1.00 49.06           H\nATOM   1360 HD22 LEU A  81     -12.054  13.687 -21.761  1.00 49.06           H\nATOM   1361 HD23 LEU A  81     -11.989  12.298 -22.828  1.00 49.06           H\nATOM   1362  N   GLN A  82     -14.477   9.009 -18.977  1.00 55.12           N\nATOM   1363  CA  GLN A  82     -15.826   8.447 -18.959  1.00 55.85           C\nATOM   1364  C   GLN A  82     -16.883   9.420 -19.505  1.00 55.64           C\nATOM   1365  O   GLN A  82     -17.801   8.968 -20.189  1.00 56.53           O\nATOM   1366  CB  GLN A  82     -16.183   8.025 -17.514  1.00 57.01           C\nATOM   1367  CG  GLN A  82     -15.287   6.934 -16.890  1.00 59.93           C\nATOM   1368  CD  GLN A  82     -15.192   5.660 -17.732  1.00 67.99           C\nATOM   1369  OE1 GLN A  82     -14.196   5.437 -18.417  1.00 76.71           O\nATOM   1370  NE2 GLN A  82     -16.234   4.829 -17.697  1.00 73.45           N\nATOM   1371  H   GLN A  82     -14.168   9.454 -18.122  1.00 55.12           H\nATOM   1372  HA  GLN A  82     -15.852   7.565 -19.600  1.00 55.85           H\nATOM   1373  HB3 GLN A  82     -17.218   7.678 -17.488  1.00 57.01           H\nATOM   1374  HB2 GLN A  82     -16.154   8.900 -16.865  1.00 57.01           H\nATOM   1375  HG3 GLN A  82     -15.655   6.682 -15.895  1.00 59.93           H\nATOM   1376  HG2 GLN A  82     -14.279   7.321 -16.745  1.00 59.93           H\nATOM   1377 HE22 GLN A  82     -16.213   3.972 -18.231  1.00 73.45           H\nATOM   1378 HE21 GLN A  82     -17.033   5.032 -17.114  1.00 73.45           H\nATOM   1379  N   LYS A  83     -16.751  10.721 -19.190  1.00 55.61           N\nATOM   1380  CA  LYS A  83     -17.731  11.755 -19.528  1.00 54.43           C\nATOM   1381  C   LYS A  83     -17.122  13.149 -19.319  1.00 53.52           C\nATOM   1382  O   LYS A  83     -16.254  13.311 -18.463  1.00 52.42           O\nATOM   1383  CB  LYS A  83     -19.008  11.564 -18.667  1.00 56.11           C\nATOM   1384  CG  LYS A  83     -20.190  12.472 -19.044  1.00 58.01           C\nATOM   1385  CD  LYS A  83     -21.484  12.061 -18.323  0.00 57.39           C\nATOM   1386  CE  LYS A  83     -22.714  12.894 -18.719  0.00 57.51           C\nATOM   1387  NZ  LYS A  83     -23.158  12.617 -20.098  0.00 57.47           N1+\nATOM   1388  H   LYS A  83     -15.958  11.027 -18.643  1.00 55.61           H\nATOM   1389  HA  LYS A  83     -17.985  11.652 -20.585  1.00 54.43           H\nATOM   1390  HB3 LYS A  83     -18.770  11.707 -17.613  1.00 56.11           H\nATOM   1391  HB2 LYS A  83     -19.351  10.533 -18.758  1.00 56.11           H\nATOM   1392  HG3 LYS A  83     -20.331  12.444 -20.124  1.00 58.01           H\nATOM   1393  HG2 LYS A  83     -19.963  13.507 -18.786  1.00 58.01           H\nATOM   1394  HD3 LYS A  83     -21.331  12.153 -17.247  1.00 57.39           H\nATOM   1395  HD2 LYS A  83     -21.684  11.002 -18.496  1.00 57.39           H\nATOM   1396  HE3 LYS A  83     -22.513  13.960 -18.612  1.00 57.51           H\nATOM   1397  HE2 LYS A  83     -23.539  12.659 -18.047  1.00 57.51           H\nATOM   1398  HZ1 LYS A  83     -24.015  13.126 -20.277  1.00 57.47           H\nATOM   1399  HZ2 LYS A  83     -22.447  12.902 -20.757  1.00 57.47           H\nATOM   1400  HZ3 LYS A  83     -23.343  11.630 -20.200  1.00 57.47           H\nATOM   1401  N   VAL A  84     -17.627  14.135 -20.075  1.00 52.25           N\nATOM   1402  CA  VAL A  84     -17.304  15.551 -19.905  1.00 52.06           C\nATOM   1403  C   VAL A  84     -18.609  16.311 -19.596  1.00 53.83           C\nATOM   1404  O   VAL A  84     -19.617  16.074 -20.266  1.00 55.20           O\nATOM   1405  CB  VAL A  84     -16.688  16.159 -21.200  1.00 52.77           C\nATOM   1406  CG1 VAL A  84     -16.287  17.644 -21.050  1.00 46.20           C\nATOM   1407  CG2 VAL A  84     -15.488  15.339 -21.715  1.00 54.27           C\nATOM   1408  H   VAL A  84     -18.346  13.931 -20.753  1.00 52.25           H\nATOM   1409  HA  VAL A  84     -16.604  15.693 -19.082  1.00 52.06           H\nATOM   1410  HB  VAL A  84     -17.442  16.118 -21.988  1.00 52.77           H\nATOM   1411 HG11 VAL A  84     -15.774  18.009 -21.940  1.00 46.20           H\nATOM   1412 HG12 VAL A  84     -17.151  18.291 -20.901  1.00 46.20           H\nATOM   1413 HG13 VAL A  84     -15.615  17.788 -20.204  1.00 46.20           H\nATOM   1414 HG21 VAL A  84     -14.998  15.831 -22.556  1.00 54.27           H\nATOM   1415 HG22 VAL A  84     -14.741  15.184 -20.940  1.00 54.27           H\nATOM   1416 HG23 VAL A  84     -15.801  14.355 -22.064  1.00 54.27           H\nATOM   1417  N   PHE A  85     -18.556  17.224 -18.613  1.00 55.25           N\nATOM   1418  CA  PHE A  85     -19.634  18.167 -18.305  1.00 55.43           C\nATOM   1419  C   PHE A  85     -19.157  19.582 -18.661  1.00 55.18           C\nATOM   1420  O   PHE A  85     -18.027  19.947 -18.328  1.00 54.69           O\nATOM   1421  CB  PHE A  85     -19.997  18.126 -16.806  1.00 56.33           C\nATOM   1422  CG  PHE A  85     -20.454  16.789 -16.254  1.00 57.01           C\nATOM   1423  CD1 PHE A  85     -21.796  16.386 -16.408  1.00 61.77           C\nATOM   1424  CD2 PHE A  85     -19.525  15.888 -15.692  1.00 58.81           C\nATOM   1425  CE1 PHE A  85     -22.206  15.149 -15.934  1.00 62.44           C\nATOM   1426  CE2 PHE A  85     -19.954  14.651 -15.228  1.00 61.02           C\nATOM   1427  CZ  PHE A  85     -21.291  14.290 -15.340  1.00 60.11           C\nATOM   1428  H   PHE A  85     -17.687  17.365 -18.112  1.00 55.25           H\nATOM   1429  HA  PHE A  85     -20.531  17.936 -18.882  1.00 55.43           H\nATOM   1430  HB3 PHE A  85     -20.801  18.840 -16.621  1.00 56.33           H\nATOM   1431  HB2 PHE A  85     -19.164  18.482 -16.208  1.00 56.33           H\nATOM   1432  HD1 PHE A  85     -22.510  17.045 -16.879  1.00 61.77           H\nATOM   1433  HD2 PHE A  85     -18.482  16.160 -15.608  1.00 58.81           H\nATOM   1434  HE1 PHE A  85     -23.240  14.857 -16.036  1.00 62.44           H\nATOM   1435  HE2 PHE A  85     -19.247  13.968 -14.780  1.00 61.02           H\nATOM   1436  HZ  PHE A  85     -21.619  13.328 -14.980  1.00 60.11           H\nATOM   1437  N   LEU A  86     -20.055  20.357 -19.286  1.00 55.79           N\nATOM   1438  CA  LEU A  86     -19.860  21.766 -19.614  1.00 56.25           C\nATOM   1439  C   LEU A  86     -20.880  22.571 -18.801  1.00 57.42           C\nATOM   1440  O   LEU A  86     -22.038  22.675 -19.207  1.00 56.78           O\nATOM   1441  CB  LEU A  86     -20.055  21.973 -21.137  1.00 56.23           C\nATOM   1442  CG  LEU A  86     -18.961  21.340 -22.025  1.00 56.77           C\nATOM   1443  CD1 LEU A  86     -19.304  21.515 -23.519  1.00 57.90           C\nATOM   1444  CD2 LEU A  86     -17.553  21.874 -21.694  1.00 53.18           C\nATOM   1445  H   LEU A  86     -20.962  19.978 -19.516  1.00 55.79           H\nATOM   1446  HA  LEU A  86     -18.864  22.107 -19.327  1.00 56.25           H\nATOM   1447  HB3 LEU A  86     -20.095  23.041 -21.352  1.00 56.23           H\nATOM   1448  HB2 LEU A  86     -21.029  21.576 -21.432  1.00 56.23           H\nATOM   1449  HG  LEU A  86     -18.958  20.267 -21.831  1.00 56.77           H\nATOM   1450 HD11 LEU A  86     -19.176  20.579 -24.065  1.00 57.90           H\nATOM   1451 HD12 LEU A  86     -20.336  21.834 -23.665  1.00 57.90           H\nATOM   1452 HD13 LEU A  86     -18.678  22.267 -23.998  1.00 57.90           H\nATOM   1453 HD21 LEU A  86     -16.946  22.043 -22.582  1.00 53.18           H\nATOM   1454 HD22 LEU A  86     -17.598  22.822 -21.157  1.00 53.18           H\nATOM   1455 HD23 LEU A  86     -17.011  21.164 -21.068  1.00 53.18           H\nATOM   1456  N   SER A  87     -20.437  23.106 -17.652  1.00 58.97           N\nATOM   1457  CA  SER A  87     -21.254  23.936 -16.769  1.00 59.88           C\nATOM   1458  C   SER A  87     -21.276  25.378 -17.306  1.00 60.74           C\nATOM   1459  O   SER A  87     -20.294  26.100 -17.143  1.00 59.19           O\nATOM   1460  CB  SER A  87     -20.715  23.814 -15.329  1.00 60.17           C\nATOM   1461  OG  SER A  87     -21.502  24.554 -14.420  1.00 60.24           O\nATOM   1462  H   SER A  87     -19.470  22.988 -17.379  1.00 58.97           H\nATOM   1463  HA  SER A  87     -22.276  23.549 -16.763  1.00 59.88           H\nATOM   1464  HB3 SER A  87     -19.686  24.166 -15.262  1.00 60.17           H\nATOM   1465  HB2 SER A  87     -20.713  22.771 -15.011  1.00 60.17           H\nATOM   1466  HG  SER A  87     -20.997  25.334 -14.159  1.00 60.24           H\nATOM   1467  N   HIS A  88     -22.377  25.737 -17.987  1.00 62.75           N\nATOM   1468  CA  HIS A  88     -22.552  26.998 -18.719  1.00 64.90           C\nATOM   1469  C   HIS A  88     -22.596  28.262 -17.836  1.00 66.86           C\nATOM   1470  O   HIS A  88     -22.253  29.335 -18.332  1.00 67.75           O\nATOM   1471  CB  HIS A  88     -23.833  26.918 -19.584  1.00 65.18           C\nATOM   1472  CG  HIS A  88     -23.773  26.057 -20.828  1.00 67.11           C\nATOM   1473  ND1 HIS A  88     -23.292  24.757 -20.855  1.00 66.40           N\nATOM   1474  CD2 HIS A  88     -24.154  26.326 -22.126  1.00 66.66           C\nATOM   1475  CE1 HIS A  88     -23.400  24.316 -22.112  1.00 67.15           C\nATOM   1476  NE2 HIS A  88     -23.919  25.215 -22.937  1.00 66.41           N\nATOM   1477  H   HIS A  88     -23.136  25.076 -18.067  1.00 62.75           H\nATOM   1478  HA  HIS A  88     -21.698  27.120 -19.388  1.00 64.90           H\nATOM   1479  HB3 HIS A  88     -24.111  27.918 -19.924  1.00 65.18           H\nATOM   1480  HB2 HIS A  88     -24.672  26.572 -18.978  1.00 65.18           H\nATOM   1481  HD1 HIS A  88     -22.915  24.225 -20.080  1.00 66.40           H\nATOM   1482  HD2 HIS A  88     -24.586  27.226 -22.536  1.00 66.66           H\nATOM   1483  HE1 HIS A  88     -23.099  23.327 -22.426  1.00 67.15           H\nATOM   1484  N   ALA A  89     -23.029  28.128 -16.569  1.00 68.30           N\nATOM   1485  CA  ALA A  89     -23.243  29.240 -15.636  1.00 70.12           C\nATOM   1486  C   ALA A  89     -21.955  29.953 -15.186  1.00 70.01           C\nATOM   1487  O   ALA A  89     -21.963  31.178 -15.065  1.00 70.49           O\nATOM   1488  CB  ALA A  89     -24.023  28.723 -14.418  1.00 69.50           C\nATOM   1489  H   ALA A  89     -23.278  27.211 -16.228  1.00 68.30           H\nATOM   1490  HA  ALA A  89     -23.866  29.979 -16.142  1.00 70.12           H\nATOM   1491  HB1 ALA A  89     -24.222  29.524 -13.705  1.00 69.50           H\nATOM   1492  HB2 ALA A  89     -24.986  28.308 -14.717  1.00 69.50           H\nATOM   1493  HB3 ALA A  89     -23.473  27.940 -13.893  1.00 69.50           H\nATOM   1494  N   ASP A  90     -20.887  29.174 -14.957  1.00 69.77           N\nATOM   1495  CA  ASP A  90     -19.571  29.629 -14.488  1.00 69.09           C\nATOM   1496  C   ASP A  90     -18.468  29.401 -15.544  1.00 68.82           C\nATOM   1497  O   ASP A  90     -17.351  29.882 -15.354  1.00 70.98           O\nATOM   1498  CB  ASP A  90     -19.174  28.987 -13.125  1.00 69.43           C\nATOM   1499  CG  ASP A  90     -19.340  27.461 -12.948  1.00 69.09           C\nATOM   1500  OD1 ASP A  90     -19.523  26.738 -13.953  1.00 64.68           O\nATOM   1501  OD2 ASP A  90     -19.179  27.019 -11.790  1.00 70.90           O1-\nATOM   1502  H   ASP A  90     -20.978  28.172 -15.061  1.00 69.77           H\nATOM   1503  HA  ASP A  90     -19.602  30.708 -14.331  1.00 69.09           H\nATOM   1504  HB3 ASP A  90     -19.772  29.467 -12.348  1.00 69.43           H\nATOM   1505  HB2 ASP A  90     -18.140  29.240 -12.884  1.00 69.43           H\nATOM   1506  N   ARG A  91     -18.798  28.668 -16.623  1.00 68.01           N\nATOM   1507  CA  ARG A  91     -17.912  28.239 -17.708  1.00 66.61           C\nATOM   1508  C   ARG A  91     -16.800  27.267 -17.261  1.00 63.84           C\nATOM   1509  O   ARG A  91     -15.729  27.259 -17.866  1.00 62.48           O\nATOM   1510  CB  ARG A  91     -17.377  29.436 -18.528  1.00 67.29           C\nATOM   1511  CG  ARG A  91     -18.488  30.326 -19.122  1.00 70.07           C\nATOM   1512  CD  ARG A  91     -17.991  31.442 -20.067  1.00 75.80           C\nATOM   1513  NE  ARG A  91     -17.120  30.946 -21.154  1.00 77.23           N\nATOM   1514  CZ  ARG A  91     -17.446  30.124 -22.170  1.00 80.86           C\nATOM   1515  NH1 ARG A  91     -18.698  29.689 -22.376  1.00 80.80           N\nATOM   1516  NH2 ARG A  91     -16.482  29.718 -23.006  1.00 82.08           N1+\nATOM   1517  H   ARG A  91     -19.740  28.309 -16.681  1.00 68.01           H\nATOM   1518  HA  ARG A  91     -18.543  27.658 -18.379  1.00 66.61           H\nATOM   1519  HB3 ARG A  91     -16.786  29.030 -19.347  1.00 67.29           H\nATOM   1520  HB2 ARG A  91     -16.693  30.042 -17.933  1.00 67.29           H\nATOM   1521  HG3 ARG A  91     -18.958  30.828 -18.276  1.00 70.07           H\nATOM   1522  HG2 ARG A  91     -19.286  29.742 -19.579  1.00 70.07           H\nATOM   1523  HD3 ARG A  91     -17.534  32.264 -19.515  1.00 75.80           H\nATOM   1524  HD2 ARG A  91     -18.858  31.869 -20.571  1.00 75.80           H\nATOM   1525  HE  ARG A  91     -16.153  31.224 -21.073  1.00 77.23           H\nATOM   1526 HH12 ARG A  91     -18.908  29.090 -23.161  1.00 80.80           H\nATOM   1527 HH11 ARG A  91     -19.454  29.971 -21.763  1.00 80.80           H\nATOM   1528 HH22 ARG A  91     -16.711  29.123 -23.791  1.00 82.08           H\nATOM   1529 HH21 ARG A  91     -15.532  30.039 -22.894  1.00 82.08           H\nATOM   1530  N   LYS A  92     -17.066  26.445 -16.234  1.00 61.84           N\nATOM   1531  CA  LYS A  92     -16.129  25.430 -15.750  1.00 60.31           C\nATOM   1532  C   LYS A  92     -16.365  24.094 -16.470  1.00 57.74           C\nATOM   1533  O   LYS A  92     -17.512  23.681 -16.649  1.00 57.63           O\nATOM   1534  CB  LYS A  92     -16.265  25.285 -14.221  1.00 61.04           C\nATOM   1535  CG  LYS A  92     -15.916  26.568 -13.432  1.00 64.60           C\nATOM   1536  CD  LYS A  92     -14.446  27.027 -13.491  1.00 66.68           C\nATOM   1537  CE  LYS A  92     -13.489  26.061 -12.775  0.00 66.00           C\nATOM   1538  NZ  LYS A  92     -12.108  26.566 -12.726  0.00 66.02           N1+\nATOM   1539  H   LYS A  92     -17.965  26.487 -15.770  1.00 61.84           H\nATOM   1540  HA  LYS A  92     -15.108  25.747 -15.965  1.00 60.31           H\nATOM   1541  HB3 LYS A  92     -15.639  24.464 -13.869  1.00 61.04           H\nATOM   1542  HB2 LYS A  92     -17.287  24.992 -13.978  1.00 61.04           H\nATOM   1543  HG3 LYS A  92     -16.200  26.423 -12.388  1.00 64.60           H\nATOM   1544  HG2 LYS A  92     -16.540  27.389 -13.785  1.00 64.60           H\nATOM   1545  HD3 LYS A  92     -14.380  28.014 -13.031  1.00 66.68           H\nATOM   1546  HD2 LYS A  92     -14.136  27.166 -14.527  1.00 66.68           H\nATOM   1547  HE3 LYS A  92     -13.485  25.089 -13.266  1.00 66.00           H\nATOM   1548  HE2 LYS A  92     -13.823  25.919 -11.749  1.00 66.00           H\nATOM   1549  HZ1 LYS A  92     -11.770  26.695 -13.672  1.00 66.02           H\nATOM   1550  HZ2 LYS A  92     -12.084  27.448 -12.235  1.00 66.02           H\nATOM   1551  HZ3 LYS A  92     -11.521  25.894 -12.253  1.00 66.02           H\nATOM   1552  N   VAL A  93     -15.257  23.446 -16.854  1.00 56.27           N\nATOM   1553  CA  VAL A  93     -15.233  22.139 -17.503  1.00 54.34           C\nATOM   1554  C   VAL A  93     -14.814  21.089 -16.460  1.00 53.11           C\nATOM   1555  O   VAL A  93     -13.810  21.282 -15.771  1.00 51.93           O\nATOM   1556  CB  VAL A  93     -14.199  22.099 -18.666  1.00 54.22           C\nATOM   1557  CG1 VAL A  93     -14.108  20.721 -19.355  1.00 50.82           C\nATOM   1558  CG2 VAL A  93     -14.485  23.185 -19.720  1.00 53.39           C\nATOM   1559  H   VAL A  93     -14.349  23.858 -16.672  1.00 56.27           H\nATOM   1560  HA  VAL A  93     -16.218  21.891 -17.902  1.00 54.34           H\nATOM   1561  HB  VAL A  93     -13.211  22.319 -18.258  1.00 54.22           H\nATOM   1562 HG11 VAL A  93     -13.421  20.755 -20.199  1.00 50.82           H\nATOM   1563 HG12 VAL A  93     -13.738  19.945 -18.685  1.00 50.82           H\nATOM   1564 HG13 VAL A  93     -15.079  20.399 -19.731  1.00 50.82           H\nATOM   1565 HG21 VAL A  93     -13.768  23.141 -20.541  1.00 53.39           H\nATOM   1566 HG22 VAL A  93     -15.482  23.075 -20.142  1.00 53.39           H\nATOM   1567 HG23 VAL A  93     -14.419  24.185 -19.292  1.00 53.39           H\nATOM   1568  N   TRP A  94     -15.585  19.994 -16.390  1.00 51.85           N\nATOM   1569  CA  TRP A  94     -15.324  18.848 -15.522  1.00 51.87           C\nATOM   1570  C   TRP A  94     -15.141  17.591 -16.379  1.00 51.82           C\nATOM   1571  O   TRP A  94     -15.856  17.419 -17.365  1.00 53.38           O\nATOM   1572  CB  TRP A  94     -16.488  18.648 -14.534  1.00 51.58           C\nATOM   1573  CG  TRP A  94     -16.758  19.753 -13.557  1.00 51.06           C\nATOM   1574  CD1 TRP A  94     -17.290  20.965 -13.844  1.00 50.00           C\nATOM   1575  CD2 TRP A  94     -16.511  19.755 -12.120  1.00 49.72           C\nATOM   1576  NE1 TRP A  94     -17.391  21.711 -12.688  1.00 49.59           N\nATOM   1577  CE2 TRP A  94     -16.937  21.010 -11.589  1.00 51.61           C\nATOM   1578  CE3 TRP A  94     -15.981  18.815 -11.205  1.00 51.03           C\nATOM   1579  CZ2 TRP A  94     -16.847  21.313 -10.220  1.00 51.66           C\nATOM   1580  CZ3 TRP A  94     -15.878  19.111  -9.831  1.00 53.63           C\nATOM   1581  CH2 TRP A  94     -16.299  20.362  -9.341  1.00 52.18           C\nATOM   1582  H   TRP A  94     -16.384  19.907 -17.006  1.00 51.85           H\nATOM   1583  HA  TRP A  94     -14.417  19.011 -14.943  1.00 51.87           H\nATOM   1584  HB3 TRP A  94     -16.306  17.744 -13.951  1.00 51.58           H\nATOM   1585  HB2 TRP A  94     -17.406  18.456 -15.077  1.00 51.58           H\nATOM   1586  HD1 TRP A  94     -17.589  21.286 -14.832  1.00 50.00           H\nATOM   1587  HE1 TRP A  94     -17.768  22.649 -12.671  1.00 49.59           H\nATOM   1588  HE3 TRP A  94     -15.648  17.856 -11.569  1.00 51.03           H\nATOM   1589  HZ2 TRP A  94     -17.182  22.270  -9.848  1.00 51.66           H\nATOM   1590  HZ3 TRP A  94     -15.471  18.375  -9.153  1.00 53.63           H\nATOM   1591  HH2 TRP A  94     -16.205  20.589  -8.290  1.00 52.18           H\nATOM   1592  N   LEU A  95     -14.201  16.731 -15.960  1.00 51.47           N\nATOM   1593  CA  LEU A  95     -13.858  15.472 -16.613  1.00 51.39           C\nATOM   1594  C   LEU A  95     -14.028  14.332 -15.600  1.00 51.96           C\nATOM   1595  O   LEU A  95     -13.388  14.354 -14.548  1.00 51.96           O\nATOM   1596  CB  LEU A  95     -12.394  15.522 -17.113  1.00 51.01           C\nATOM   1597  CG  LEU A  95     -12.003  16.682 -18.059  1.00 50.86           C\nATOM   1598  CD1 LEU A  95     -10.493  16.649 -18.368  1.00 44.82           C\nATOM   1599  CD2 LEU A  95     -12.844  16.742 -19.349  1.00 48.92           C\nATOM   1600  H   LEU A  95     -13.648  16.964 -15.145  1.00 51.47           H\nATOM   1601  HA  LEU A  95     -14.527  15.274 -17.451  1.00 51.39           H\nATOM   1602  HB3 LEU A  95     -12.153  14.575 -17.595  1.00 51.01           H\nATOM   1603  HB2 LEU A  95     -11.735  15.583 -16.248  1.00 51.01           H\nATOM   1604  HG  LEU A  95     -12.192  17.610 -17.518  1.00 50.86           H\nATOM   1605 HD11 LEU A  95     -10.282  16.754 -19.432  1.00 44.82           H\nATOM   1606 HD12 LEU A  95      -9.974  17.462 -17.860  1.00 44.82           H\nATOM   1607 HD13 LEU A  95     -10.025  15.721 -18.039  1.00 44.82           H\nATOM   1608 HD21 LEU A  95     -13.031  17.775 -19.641  1.00 48.92           H\nATOM   1609 HD22 LEU A  95     -12.349  16.249 -20.186  1.00 48.92           H\nATOM   1610 HD23 LEU A  95     -13.815  16.271 -19.232  1.00 48.92           H\nATOM   1611  N   LEU A  96     -14.873  13.351 -15.950  1.00 51.79           N\nATOM   1612  CA  LEU A  96     -15.100  12.133 -15.177  1.00 52.69           C\nATOM   1613  C   LEU A  96     -14.095  11.053 -15.608  1.00 53.42           C\nATOM   1614  O   LEU A  96     -13.919  10.824 -16.803  1.00 53.73           O\nATOM   1615  CB  LEU A  96     -16.556  11.662 -15.404  1.00 53.36           C\nATOM   1616  CG  LEU A  96     -17.025  10.519 -14.471  1.00 54.54           C\nATOM   1617  CD1 LEU A  96     -17.176  10.989 -13.016  1.00 55.76           C\nATOM   1618  CD2 LEU A  96     -18.325   9.868 -14.978  1.00 54.29           C\nATOM   1619  H   LEU A  96     -15.354  13.402 -16.840  1.00 51.79           H\nATOM   1620  HA  LEU A  96     -14.963  12.355 -14.117  1.00 52.69           H\nATOM   1621  HB3 LEU A  96     -16.652  11.344 -16.442  1.00 53.36           H\nATOM   1622  HB2 LEU A  96     -17.238  12.506 -15.296  1.00 53.36           H\nATOM   1623  HG  LEU A  96     -16.274   9.729 -14.484  1.00 54.54           H\nATOM   1624 HD11 LEU A  96     -17.795  10.302 -12.439  1.00 55.76           H\nATOM   1625 HD12 LEU A  96     -16.207  11.051 -12.520  1.00 55.76           H\nATOM   1626 HD13 LEU A  96     -17.648  11.969 -12.958  1.00 55.76           H\nATOM   1627 HD21 LEU A  96     -18.304   8.790 -14.818  1.00 54.29           H\nATOM   1628 HD22 LEU A  96     -19.202  10.261 -14.463  1.00 54.29           H\nATOM   1629 HD23 LEU A  96     -18.481  10.028 -16.044  1.00 54.29           H\nATOM   1630  N   PHE A  97     -13.495  10.391 -14.613  1.00 53.90           N\nATOM   1631  CA  PHE A  97     -12.618   9.231 -14.760  1.00 53.21           C\nATOM   1632  C   PHE A  97     -13.041   8.176 -13.725  1.00 55.01           C\nATOM   1633  O   PHE A  97     -13.694   8.516 -12.736  1.00 57.54           O\nATOM   1634  CB  PHE A  97     -11.153   9.649 -14.493  1.00 52.68           C\nATOM   1635  CG  PHE A  97     -10.569  10.725 -15.392  1.00 47.78           C\nATOM   1636  CD1 PHE A  97     -10.095  10.399 -16.679  1.00 43.93           C\nATOM   1637  CD2 PHE A  97     -10.594  12.079 -14.995  1.00 46.72           C\nATOM   1638  CE1 PHE A  97      -9.598  11.390 -17.512  1.00 45.72           C\nATOM   1639  CE2 PHE A  97     -10.083  13.055 -15.839  1.00 45.47           C\nATOM   1640  CZ  PHE A  97      -9.583  12.713 -17.089  1.00 46.69           C\nATOM   1641  H   PHE A  97     -13.676  10.669 -13.657  1.00 53.90           H\nATOM   1642  HA  PHE A  97     -12.706   8.802 -15.759  1.00 53.21           H\nATOM   1643  HB3 PHE A  97     -10.509   8.772 -14.584  1.00 52.68           H\nATOM   1644  HB2 PHE A  97     -11.044   9.985 -13.464  1.00 52.68           H\nATOM   1645  HD1 PHE A  97     -10.098   9.376 -17.014  1.00 43.93           H\nATOM   1646  HD2 PHE A  97     -10.990  12.358 -14.030  1.00 46.72           H\nATOM   1647  HE1 PHE A  97      -9.219  11.128 -18.489  1.00 45.72           H\nATOM   1648  HE2 PHE A  97     -10.070  14.086 -15.526  1.00 45.47           H\nATOM   1649  HZ  PHE A  97      -9.188  13.482 -17.735  1.00 46.69           H\nATOM   1650  N   ASP A  98     -12.595   6.924 -13.925  1.00 54.45           N\nATOM   1651  CA  ASP A  98     -12.591   5.902 -12.869  1.00 54.41           C\nATOM   1652  C   ASP A  98     -11.486   6.210 -11.844  1.00 53.15           C\nATOM   1653  O   ASP A  98     -10.397   6.648 -12.221  1.00 53.04           O\nATOM   1654  CB  ASP A  98     -12.441   4.454 -13.403  1.00 55.47           C\nATOM   1655  CG  ASP A  98     -13.574   3.941 -14.311  1.00 60.32           C\nATOM   1656  OD1 ASP A  98     -14.686   4.517 -14.288  1.00 66.03           O\nATOM   1657  OD2 ASP A  98     -13.346   2.879 -14.931  1.00 62.12           O1-\nATOM   1658  H   ASP A  98     -12.081   6.698 -14.764  1.00 54.45           H\nATOM   1659  HA  ASP A  98     -13.545   5.961 -12.340  1.00 54.41           H\nATOM   1660  HB3 ASP A  98     -12.356   3.761 -12.564  1.00 55.47           H\nATOM   1661  HB2 ASP A  98     -11.508   4.378 -13.965  1.00 55.47           H\nATOM   1662  N   TYR A  99     -11.810   5.997 -10.562  1.00 51.82           N\nATOM   1663  CA  TYR A  99     -10.953   6.339  -9.432  1.00 51.53           C\nATOM   1664  C   TYR A  99      -9.855   5.288  -9.200  1.00 49.66           C\nATOM   1665  O   TYR A  99     -10.167   4.102  -9.095  1.00 49.47           O\nATOM   1666  CB  TYR A  99     -11.853   6.500  -8.200  1.00 51.24           C\nATOM   1667  CG  TYR A  99     -11.165   6.928  -6.922  1.00 51.57           C\nATOM   1668  CD1 TYR A  99     -10.895   8.291  -6.679  1.00 53.85           C\nATOM   1669  CD2 TYR A  99     -10.818   5.957  -5.964  1.00 54.64           C\nATOM   1670  CE1 TYR A  99     -10.281   8.681  -5.474  1.00 51.68           C\nATOM   1671  CE2 TYR A  99     -10.211   6.349  -4.762  1.00 56.06           C\nATOM   1672  CZ  TYR A  99      -9.948   7.707  -4.513  1.00 56.35           C\nATOM   1673  OH  TYR A  99      -9.386   8.073  -3.329  1.00 60.78           O\nATOM   1674  H   TYR A  99     -12.718   5.616 -10.333  1.00 51.82           H\nATOM   1675  HA  TYR A  99     -10.493   7.306  -9.633  1.00 51.53           H\nATOM   1676  HB3 TYR A  99     -12.377   5.563  -8.011  1.00 51.24           H\nATOM   1677  HB2 TYR A  99     -12.621   7.237  -8.412  1.00 51.24           H\nATOM   1678  HD1 TYR A  99     -11.168   9.040  -7.407  1.00 53.85           H\nATOM   1679  HD2 TYR A  99     -11.026   4.912  -6.141  1.00 54.64           H\nATOM   1680  HE1 TYR A  99     -10.081   9.725  -5.282  1.00 51.68           H\nATOM   1681  HE2 TYR A  99      -9.968   5.597  -4.031  1.00 56.06           H\nATOM   1682  HH  TYR A  99      -9.082   7.320  -2.808  1.00 60.78           H\nATOM   1683  N   ALA A 100      -8.607   5.764  -9.070  1.00 50.38           N\nATOM   1684  CA  ALA A 100      -7.438   4.981  -8.681  1.00 50.49           C\nATOM   1685  C   ALA A 100      -7.057   5.358  -7.244  1.00 51.17           C\nATOM   1686  O   ALA A 100      -6.744   6.520  -6.983  1.00 50.13           O\nATOM   1687  CB  ALA A 100      -6.287   5.286  -9.651  1.00 48.46           C\nATOM   1688  H   ALA A 100      -8.449   6.758  -9.164  1.00 50.38           H\nATOM   1689  HA  ALA A 100      -7.655   3.914  -8.730  1.00 50.49           H\nATOM   1690  HB1 ALA A 100      -5.391   4.725  -9.385  1.00 48.46           H\nATOM   1691  HB2 ALA A 100      -6.551   5.015 -10.673  1.00 48.46           H\nATOM   1692  HB3 ALA A 100      -6.031   6.346  -9.647  1.00 48.46           H\nATOM   1693  N   GLU A 101      -7.106   4.370  -6.337  1.00 53.48           N\nATOM   1694  CA  GLU A 101      -6.871   4.553  -4.901  1.00 53.48           C\nATOM   1695  C   GLU A 101      -5.391   4.795  -4.534  1.00 54.29           C\nATOM   1696  O   GLU A 101      -5.132   5.387  -3.486  1.00 54.41           O\nATOM   1697  CB  GLU A 101      -7.474   3.335  -4.159  1.00 54.73           C\nATOM   1698  CG  GLU A 101      -7.487   3.390  -2.612  1.00 56.18           C\nATOM   1699  CD  GLU A 101      -8.483   4.418  -2.056  1.00 55.60           C\nATOM   1700  OE1 GLU A 101      -9.638   4.017  -1.793  1.00 58.73           O\nATOM   1701  OE2 GLU A 101      -8.084   5.593  -1.895  1.00 55.67           O1-\nATOM   1702  H   GLU A 101      -7.390   3.444  -6.624  1.00 53.48           H\nATOM   1703  HA  GLU A 101      -7.421   5.444  -4.599  1.00 53.48           H\nATOM   1704  HB3 GLU A 101      -6.930   2.441  -4.463  1.00 54.73           H\nATOM   1705  HB2 GLU A 101      -8.496   3.176  -4.506  1.00 54.73           H\nATOM   1706  HG3 GLU A 101      -6.492   3.581  -2.211  1.00 56.18           H\nATOM   1707  HG2 GLU A 101      -7.757   2.403  -2.233  1.00 56.18           H\nATOM   1708  N   HIS A 102      -4.453   4.359  -5.396  1.00 54.22           N\nATOM   1709  CA  HIS A 102      -3.004   4.417  -5.168  1.00 53.29           C\nATOM   1710  C   HIS A 102      -2.264   5.027  -6.372  1.00 52.79           C\nATOM   1711  O   HIS A 102      -2.871   5.304  -7.408  1.00 49.37           O\nATOM   1712  CB  HIS A 102      -2.477   2.999  -4.836  1.00 54.11           C\nATOM   1713  CG  HIS A 102      -3.280   2.256  -3.797  1.00 55.21           C\nATOM   1714  ND1 HIS A 102      -4.236   1.291  -4.136  1.00 55.20           N\nATOM   1715  CD2 HIS A 102      -3.269   2.413  -2.427  1.00 51.98           C\nATOM   1716  CE1 HIS A 102      -4.770   0.927  -2.980  1.00 57.79           C\nATOM   1717  NE2 HIS A 102      -4.232   1.554  -1.932  1.00 59.58           N\nATOM   1718  H   HIS A 102      -4.738   3.901  -6.252  1.00 54.22           H\nATOM   1719  HA  HIS A 102      -2.797   5.064  -4.314  1.00 53.29           H\nATOM   1720  HB3 HIS A 102      -1.446   3.054  -4.485  1.00 54.11           H\nATOM   1721  HB2 HIS A 102      -2.461   2.384  -5.736  1.00 54.11           H\nATOM   1722  HD2 HIS A 102      -2.690   3.062  -1.785  1.00 51.98           H\nATOM   1723  HE1 HIS A 102      -5.562   0.197  -2.897  1.00 57.79           H\nATOM   1724  HE2 HIS A 102      -4.478   1.427  -0.959  1.00 59.58           H\nATOM   1725  N   ASP A 103      -0.952   5.232  -6.191  1.00 53.66           N\nATOM   1726  CA  ASP A 103      -0.008   5.712  -7.204  1.00 53.55           C\nATOM   1727  C   ASP A 103       1.418   5.381  -6.736  1.00 53.17           C\nATOM   1728  O   ASP A 103       1.624   5.111  -5.551  1.00 54.49           O\nATOM   1729  CB  ASP A 103      -0.166   7.219  -7.563  1.00 54.64           C\nATOM   1730  CG  ASP A 103      -0.081   8.206  -6.391  1.00 54.94           C\nATOM   1731  OD1 ASP A 103      -1.146   8.539  -5.834  1.00 61.11           O\nATOM   1732  OD2 ASP A 103       1.054   8.497  -5.963  1.00 54.55           O1-\nATOM   1733  H   ASP A 103      -0.531   4.990  -5.305  1.00 53.66           H\nATOM   1734  HA  ASP A 103      -0.178   5.121  -8.104  1.00 53.55           H\nATOM   1735  HB3 ASP A 103      -1.139   7.366  -8.030  1.00 54.64           H\nATOM   1736  HB2 ASP A 103       0.560   7.509  -8.324  1.00 54.64           H\nATOM   1737  N   LEU A 104       2.384   5.425  -7.671  1.00 52.35           N\nATOM   1738  CA  LEU A 104       3.787   5.106  -7.398  1.00 52.18           C\nATOM   1739  C   LEU A 104       4.500   6.056  -6.421  1.00 52.65           C\nATOM   1740  O   LEU A 104       5.422   5.589  -5.757  1.00 53.08           O\nATOM   1741  CB  LEU A 104       4.597   4.950  -8.706  1.00 50.66           C\nATOM   1742  CG  LEU A 104       4.390   3.618  -9.450  1.00 53.51           C\nATOM   1743  CD1 LEU A 104       5.310   3.551 -10.680  1.00 46.19           C\nATOM   1744  CD2 LEU A 104       4.622   2.386  -8.558  1.00 57.11           C\nATOM   1745  H   LEU A 104       2.151   5.671  -8.625  1.00 52.35           H\nATOM   1746  HA  LEU A 104       3.777   4.146  -6.890  1.00 52.18           H\nATOM   1747  HB3 LEU A 104       5.661   5.024  -8.484  1.00 50.66           H\nATOM   1748  HB2 LEU A 104       4.384   5.779  -9.376  1.00 50.66           H\nATOM   1749  HG  LEU A 104       3.358   3.591  -9.806  1.00 53.51           H\nATOM   1750 HD11 LEU A 104       4.921   2.840 -11.406  1.00 46.19           H\nATOM   1751 HD12 LEU A 104       5.409   4.519 -11.171  1.00 46.19           H\nATOM   1752 HD13 LEU A 104       6.313   3.220 -10.410  1.00 46.19           H\nATOM   1753 HD21 LEU A 104       5.094   1.581  -9.118  1.00 57.11           H\nATOM   1754 HD22 LEU A 104       5.267   2.608  -7.708  1.00 57.11           H\nATOM   1755 HD23 LEU A 104       3.679   2.004  -8.169  1.00 57.11           H\nATOM   1756  N   TRP A 105       4.078   7.331  -6.309  1.00 53.42           N\nATOM   1757  CA  TRP A 105       4.657   8.270  -5.340  1.00 55.35           C\nATOM   1758  C   TRP A 105       4.341   7.856  -3.892  1.00 54.65           C\nATOM   1759  O   TRP A 105       5.267   7.790  -3.089  1.00 55.02           O\nATOM   1760  CB  TRP A 105       4.245   9.725  -5.650  1.00 56.39           C\nATOM   1761  CG  TRP A 105       4.895  10.801  -4.829  1.00 61.99           C\nATOM   1762  CD1 TRP A 105       6.037  11.446  -5.159  1.00 64.35           C\nATOM   1763  CD2 TRP A 105       4.506  11.322  -3.520  1.00 65.21           C\nATOM   1764  NE1 TRP A 105       6.366  12.345  -4.165  1.00 65.75           N\nATOM   1765  CE2 TRP A 105       5.461  12.309  -3.125  1.00 67.33           C\nATOM   1766  CE3 TRP A 105       3.445  11.063  -2.621  1.00 67.32           C\nATOM   1767  CZ2 TRP A 105       5.365  13.002  -1.905  1.00 70.14           C\nATOM   1768  CZ3 TRP A 105       3.340  11.747  -1.393  1.00 69.35           C\nATOM   1769  CH2 TRP A 105       4.296  12.717  -1.034  1.00 69.78           C\nATOM   1770  H   TRP A 105       3.296   7.661  -6.860  1.00 53.42           H\nATOM   1771  HA  TRP A 105       5.741   8.221  -5.462  1.00 55.35           H\nATOM   1772  HB3 TRP A 105       3.172   9.855  -5.542  1.00 56.39           H\nATOM   1773  HB2 TRP A 105       4.466   9.945  -6.692  1.00 56.39           H\nATOM   1774  HD1 TRP A 105       6.595  11.273  -6.068  1.00 64.35           H\nATOM   1775  HE1 TRP A 105       7.185  12.934  -4.215  1.00 65.75           H\nATOM   1776  HE3 TRP A 105       2.705  10.323  -2.880  1.00 67.32           H\nATOM   1777  HZ2 TRP A 105       6.104  13.742  -1.637  1.00 70.14           H\nATOM   1778  HZ3 TRP A 105       2.519  11.527  -0.726  1.00 69.35           H\nATOM   1779  HH2 TRP A 105       4.209  13.240  -0.094  1.00 69.78           H\nATOM   1780  N   HIS A 106       3.068   7.527  -3.605  1.00 54.77           N\nATOM   1781  CA  HIS A 106       2.618   7.030  -2.300  1.00 55.69           C\nATOM   1782  C   HIS A 106       3.126   5.615  -1.963  1.00 55.10           C\nATOM   1783  O   HIS A 106       3.450   5.367  -0.802  1.00 56.41           O\nATOM   1784  CB  HIS A 106       1.081   7.099  -2.195  1.00 54.40           C\nATOM   1785  CG  HIS A 106       0.532   8.495  -2.023  1.00 58.57           C\nATOM   1786  ND1 HIS A 106       0.160   9.298  -3.086  1.00 60.54           N\nATOM   1787  CD2 HIS A 106       0.263   9.236  -0.893  1.00 58.96           C\nATOM   1788  CE1 HIS A 106      -0.290  10.448  -2.579  1.00 59.62           C\nATOM   1789  NE2 HIS A 106      -0.254  10.483  -1.252  1.00 61.10           N\nATOM   1790  H   HIS A 106       2.362   7.604  -4.327  1.00 54.77           H\nATOM   1791  HA  HIS A 106       3.028   7.691  -1.534  1.00 55.69           H\nATOM   1792  HB3 HIS A 106       0.734   6.515  -1.342  1.00 54.40           H\nATOM   1793  HB2 HIS A 106       0.621   6.646  -3.075  1.00 54.40           H\nATOM   1794  HD1 HIS A 106       0.212   9.058  -4.072  1.00 60.54           H\nATOM   1795  HD2 HIS A 106       0.401   8.970   0.145  1.00 58.96           H\nATOM   1796  HE1 HIS A 106      -0.645  11.267  -3.187  1.00 59.62           H\nATOM   1797  N   ILE A 107       3.207   4.727  -2.971  1.00 55.39           N\nATOM   1798  CA  ILE A 107       3.716   3.356  -2.841  1.00 53.97           C\nATOM   1799  C   ILE A 107       5.220   3.307  -2.499  1.00 55.14           C\nATOM   1800  O   ILE A 107       5.599   2.558  -1.599  1.00 55.18           O\nATOM   1801  CB  ILE A 107       3.410   2.510  -4.119  1.00 52.78           C\nATOM   1802  CG1 ILE A 107       1.907   2.142  -4.176  1.00 52.36           C\nATOM   1803  CG2 ILE A 107       4.274   1.244  -4.333  1.00 48.93           C\nATOM   1804  CD1 ILE A 107       1.421   1.682  -5.561  1.00 49.09           C\nATOM   1805  H   ILE A 107       2.907   5.002  -3.897  1.00 55.39           H\nATOM   1806  HA  ILE A 107       3.188   2.896  -2.003  1.00 53.97           H\nATOM   1807  HB  ILE A 107       3.612   3.158  -4.968  1.00 52.78           H\nATOM   1808 HG13 ILE A 107       1.299   2.992  -3.867  1.00 52.36           H\nATOM   1809 HG12 ILE A 107       1.701   1.357  -3.448  1.00 52.36           H\nATOM   1810 HG21 ILE A 107       3.969   0.709  -5.231  1.00 48.93           H\nATOM   1811 HG22 ILE A 107       5.329   1.480  -4.473  1.00 48.93           H\nATOM   1812 HG23 ILE A 107       4.190   0.556  -3.493  1.00 48.93           H\nATOM   1813 HD11 ILE A 107       0.358   1.886  -5.688  1.00 49.09           H\nATOM   1814 HD12 ILE A 107       1.948   2.195  -6.365  1.00 49.09           H\nATOM   1815 HD13 ILE A 107       1.566   0.610  -5.694  1.00 49.09           H\nATOM   1816  N   ILE A 108       6.037   4.121  -3.191  1.00 56.25           N\nATOM   1817  CA  ILE A 108       7.475   4.248  -2.934  1.00 57.08           C\nATOM   1818  C   ILE A 108       7.771   4.963  -1.601  1.00 59.72           C\nATOM   1819  O   ILE A 108       8.699   4.552  -0.907  1.00 60.07           O\nATOM   1820  CB  ILE A 108       8.221   4.969  -4.099  1.00 56.08           C\nATOM   1821  CG1 ILE A 108       8.236   4.079  -5.365  1.00 54.61           C\nATOM   1822  CG2 ILE A 108       9.662   5.419  -3.762  1.00 50.39           C\nATOM   1823  CD1 ILE A 108       8.475   4.843  -6.679  1.00 43.55           C\nATOM   1824  H   ILE A 108       5.662   4.707  -3.927  1.00 56.25           H\nATOM   1825  HA  ILE A 108       7.885   3.238  -2.853  1.00 57.08           H\nATOM   1826  HB  ILE A 108       7.656   5.872  -4.337  1.00 56.08           H\nATOM   1827 HG13 ILE A 108       7.286   3.551  -5.461  1.00 54.61           H\nATOM   1828 HG12 ILE A 108       8.988   3.297  -5.255  1.00 54.61           H\nATOM   1829 HG21 ILE A 108      10.170   5.812  -4.635  1.00 50.39           H\nATOM   1830 HG22 ILE A 108       9.691   6.213  -3.016  1.00 50.39           H\nATOM   1831 HG23 ILE A 108      10.255   4.585  -3.389  1.00 50.39           H\nATOM   1832 HD11 ILE A 108       9.306   4.410  -7.235  1.00 43.55           H\nATOM   1833 HD12 ILE A 108       7.600   4.787  -7.324  1.00 43.55           H\nATOM   1834 HD13 ILE A 108       8.688   5.899  -6.517  1.00 43.55           H\nATOM   1835  N   LYS A 109       6.964   5.983  -1.252  1.00 62.16           N\nATOM   1836  CA  LYS A 109       7.068   6.730   0.005  1.00 65.22           C\nATOM   1837  C   LYS A 109       6.781   5.859   1.245  1.00 66.00           C\nATOM   1838  O   LYS A 109       7.384   6.101   2.288  1.00 65.57           O\nATOM   1839  CB  LYS A 109       6.145   7.968  -0.064  1.00 65.72           C\nATOM   1840  CG  LYS A 109       6.300   9.005   1.063  1.00 68.81           C\nATOM   1841  CD  LYS A 109       7.650   9.741   1.022  1.00 71.81           C\nATOM   1842  CE  LYS A 109       7.691  10.938   1.984  0.00 71.58           C\nATOM   1843  NZ  LYS A 109       8.955  11.687   1.870  0.00 71.74           N1+\nATOM   1844  H   LYS A 109       6.228   6.273  -1.882  1.00 62.16           H\nATOM   1845  HA  LYS A 109       8.098   7.079   0.075  1.00 65.22           H\nATOM   1846  HB3 LYS A 109       5.106   7.642  -0.115  1.00 65.72           H\nATOM   1847  HB2 LYS A 109       6.341   8.499  -0.994  1.00 65.72           H\nATOM   1848  HG3 LYS A 109       6.156   8.540   2.039  1.00 68.81           H\nATOM   1849  HG2 LYS A 109       5.495   9.734   0.962  1.00 68.81           H\nATOM   1850  HD3 LYS A 109       7.849  10.075   0.002  1.00 71.81           H\nATOM   1851  HD2 LYS A 109       8.449   9.043   1.279  1.00 71.81           H\nATOM   1852  HE3 LYS A 109       7.569  10.600   3.014  1.00 71.58           H\nATOM   1853  HE2 LYS A 109       6.869  11.622   1.769  1.00 71.58           H\nATOM   1854  HZ1 LYS A 109       9.062  12.025   0.925  1.00 71.74           H\nATOM   1855  HZ2 LYS A 109       8.940  12.471   2.507  1.00 71.74           H\nATOM   1856  HZ3 LYS A 109       9.728  11.080   2.103  1.00 71.74           H\nATOM   1857  N   PHE A 110       5.911   4.843   1.093  1.00 66.84           N\nATOM   1858  CA  PHE A 110       5.591   3.837   2.107  1.00 67.92           C\nATOM   1859  C   PHE A 110       6.776   2.898   2.415  1.00 70.50           C\nATOM   1860  O   PHE A 110       7.033   2.628   3.588  1.00 71.23           O\nATOM   1861  CB  PHE A 110       4.312   3.085   1.668  1.00 67.15           C\nATOM   1862  CG  PHE A 110       3.787   2.005   2.598  1.00 67.39           C\nATOM   1863  CD1 PHE A 110       2.964   2.353   3.690  1.00 68.50           C\nATOM   1864  CD2 PHE A 110       4.213   0.666   2.460  1.00 70.58           C\nATOM   1865  CE1 PHE A 110       2.522   1.370   4.567  1.00 69.89           C\nATOM   1866  CE2 PHE A 110       3.758  -0.301   3.346  1.00 70.67           C\nATOM   1867  CZ  PHE A 110       2.910   0.048   4.390  1.00 69.07           C\nATOM   1868  H   PHE A 110       5.451   4.728   0.200  1.00 66.84           H\nATOM   1869  HA  PHE A 110       5.356   4.370   3.030  1.00 67.92           H\nATOM   1870  HB3 PHE A 110       4.462   2.639   0.685  1.00 67.15           H\nATOM   1871  HB2 PHE A 110       3.509   3.812   1.537  1.00 67.15           H\nATOM   1872  HD1 PHE A 110       2.661   3.379   3.839  1.00 68.50           H\nATOM   1873  HD2 PHE A 110       4.882   0.387   1.659  1.00 70.58           H\nATOM   1874  HE1 PHE A 110       1.873   1.635   5.388  1.00 69.89           H\nATOM   1875  HE2 PHE A 110       4.068  -1.329   3.225  1.00 70.67           H\nATOM   1876  HZ  PHE A 110       2.558  -0.710   5.073  1.00 69.07           H\nATOM   1877  N   HIS A 111       7.496   2.454   1.366  1.00 73.02           N\nATOM   1878  CA  HIS A 111       8.714   1.641   1.482  1.00 74.91           C\nATOM   1879  C   HIS A 111       9.927   2.439   1.989  1.00 77.07           C\nATOM   1880  O   HIS A 111      10.713   1.901   2.768  1.00 76.67           O\nATOM   1881  CB  HIS A 111       9.041   0.973   0.133  1.00 75.20           C\nATOM   1882  CG  HIS A 111       8.041  -0.058  -0.321  1.00 75.01           C\nATOM   1883  ND1 HIS A 111       7.712  -1.176   0.455  1.00 73.93           N\nATOM   1884  CD2 HIS A 111       7.325  -0.105  -1.498  1.00 74.68           C\nATOM   1885  CE1 HIS A 111       6.819  -1.839  -0.267  1.00 74.70           C\nATOM   1886  NE2 HIS A 111       6.555  -1.251  -1.433  1.00 76.22           N\nATOM   1887  H   HIS A 111       7.226   2.722   0.430  1.00 73.02           H\nATOM   1888  HA  HIS A 111       8.528   0.853   2.215  1.00 74.91           H\nATOM   1889  HB3 HIS A 111      10.010   0.475   0.189  1.00 75.20           H\nATOM   1890  HB2 HIS A 111       9.135   1.731  -0.646  1.00 75.20           H\nATOM   1891  HD2 HIS A 111       7.299   0.564  -2.346  1.00 74.68           H\nATOM   1892  HE1 HIS A 111       6.351  -2.757   0.058  1.00 74.70           H\nATOM   1893  HE2 HIS A 111       5.883  -1.569  -2.119  1.00 76.22           H\nATOM   1894  N   ARG A 112      10.039   3.709   1.564  1.00 79.68           N\nATOM   1895  CA  ARG A 112      11.060   4.664   2.000  1.00 82.70           C\nATOM   1896  C   ARG A 112      10.917   5.054   3.487  1.00 84.60           C\nATOM   1897  O   ARG A 112      11.932   5.266   4.150  1.00 84.13           O\nATOM   1898  CB  ARG A 112      11.017   5.883   1.051  1.00 83.17           C\nATOM   1899  CG  ARG A 112      12.015   7.014   1.358  1.00 86.08           C\nATOM   1900  CD  ARG A 112      12.042   8.083   0.249  1.00 90.98           C\nATOM   1901  NE  ARG A 112      12.791   9.294   0.639  1.00 94.74           N\nATOM   1902  CZ  ARG A 112      14.126   9.465   0.724  1.00 98.39           C\nATOM   1903  NH1 ARG A 112      15.000   8.482   0.463  1.00 98.39           N\nATOM   1904  NH2 ARG A 112      14.601  10.665   1.083  1.00100.49           N1+\nATOM   1905  H   ARG A 112       9.370   4.058   0.890  1.00 79.68           H\nATOM   1906  HA  ARG A 112      12.033   4.183   1.884  1.00 82.70           H\nATOM   1907  HB3 ARG A 112      10.014   6.307   1.072  1.00 83.17           H\nATOM   1908  HB2 ARG A 112      11.172   5.537   0.028  1.00 83.17           H\nATOM   1909  HG3 ARG A 112      12.996   6.538   1.394  1.00 86.08           H\nATOM   1910  HG2 ARG A 112      11.859   7.463   2.340  1.00 86.08           H\nATOM   1911  HD3 ARG A 112      11.042   8.318  -0.117  1.00 90.98           H\nATOM   1912  HD2 ARG A 112      12.581   7.683  -0.609  1.00 90.98           H\nATOM   1913  HE  ARG A 112      12.213  10.084   0.882  1.00 94.74           H\nATOM   1914 HH12 ARG A 112      15.997   8.633   0.535  1.00 98.39           H\nATOM   1915 HH11 ARG A 112      14.664   7.569   0.190  1.00 98.39           H\nATOM   1916 HH22 ARG A 112      15.598  10.818   1.146  1.00100.49           H\nATOM   1917 HH21 ARG A 112      13.975  11.433   1.273  1.00100.49           H\nATOM   1918  N   ALA A 113       9.668   5.105   3.984  1.00 87.53           N\nATOM   1919  CA  ALA A 113       9.328   5.358   5.385  1.00 89.82           C\nATOM   1920  C   ALA A 113       9.533   4.140   6.306  1.00 92.41           C\nATOM   1921  O   ALA A 113       9.644   4.335   7.516  1.00 92.74           O\nATOM   1922  CB  ALA A 113       7.874   5.848   5.462  1.00 89.32           C\nATOM   1923  H   ALA A 113       8.885   4.940   3.365  1.00 87.53           H\nATOM   1924  HA  ALA A 113       9.972   6.158   5.755  1.00 89.82           H\nATOM   1925  HB1 ALA A 113       7.573   6.042   6.493  1.00 89.32           H\nATOM   1926  HB2 ALA A 113       7.746   6.778   4.909  1.00 89.32           H\nATOM   1927  HB3 ALA A 113       7.181   5.115   5.046  1.00 89.32           H\nATOM   1928  N   SER A 114       9.592   2.921   5.736  1.00 94.99           N\nATOM   1929  CA  SER A 114       9.810   1.660   6.450  1.00 97.12           C\nATOM   1930  C   SER A 114      11.313   1.433   6.729  1.00 98.86           C\nATOM   1931  O   SER A 114      11.925   0.530   6.157  1.00 98.78           O\nATOM   1932  CB  SER A 114       9.134   0.522   5.652  1.00 97.19           C\nATOM   1933  OG  SER A 114       9.255  -0.726   6.308  1.00 98.48           O\nATOM   1934  H   SER A 114       9.500   2.845   4.733  1.00 94.99           H\nATOM   1935  HA  SER A 114       9.308   1.717   7.418  1.00 97.12           H\nATOM   1936  HB3 SER A 114       9.565   0.431   4.656  1.00 97.19           H\nATOM   1937  HB2 SER A 114       8.072   0.734   5.516  1.00 97.19           H\nATOM   1938  HG  SER A 114      10.168  -1.014   6.225  1.00 98.48           H\nATOM   1939  N   LYS A 115      11.872   2.283   7.603  1.00100.93           N\nATOM   1940  CA  LYS A 115      13.286   2.318   7.982  1.00102.13           C\nATOM   1941  C   LYS A 115      13.597   1.462   9.230  1.00103.12           C\nATOM   1942  O   LYS A 115      14.764   1.142   9.453  1.00103.52           O\nATOM   1943  CB  LYS A 115      13.654   3.808   8.187  1.00102.09           C\nATOM   1944  CG  LYS A 115      15.127   4.103   8.528  0.00101.72           C\nATOM   1945  CD  LYS A 115      15.423   5.608   8.605  0.00101.73           C\nATOM   1946  CE  LYS A 115      16.893   5.895   8.952  0.00101.72           C\nATOM   1947  NZ  LYS A 115      17.159   7.341   9.053  0.00101.71           N1+\nATOM   1948  H   LYS A 115      11.295   3.013   7.999  1.00100.93           H\nATOM   1949  HA  LYS A 115      13.889   1.930   7.158  1.00102.13           H\nATOM   1950  HB3 LYS A 115      13.020   4.233   8.967  1.00102.09           H\nATOM   1951  HB2 LYS A 115      13.404   4.350   7.272  1.00102.09           H\nATOM   1952  HG3 LYS A 115      15.774   3.638   7.783  1.00101.72           H\nATOM   1953  HG2 LYS A 115      15.387   3.656   9.487  1.00101.72           H\nATOM   1954  HD3 LYS A 115      14.769   6.062   9.352  1.00101.73           H\nATOM   1955  HD2 LYS A 115      15.168   6.074   7.651  1.00101.73           H\nATOM   1956  HE3 LYS A 115      17.550   5.470   8.192  1.00101.72           H\nATOM   1957  HE2 LYS A 115      17.154   5.428   9.902  1.00101.72           H\nATOM   1958  HZ1 LYS A 115      16.582   7.741   9.779  1.00101.71           H\nATOM   1959  HZ2 LYS A 115      18.133   7.490   9.279  1.00101.71           H\nATOM   1960  HZ3 LYS A 115      16.948   7.786   8.171  1.00101.71           H\nATOM   1961  N   ALA A 116      12.565   1.135  10.030  1.00103.48           N\nATOM   1962  CA  ALA A 116      12.671   0.577  11.380  1.00103.97           C\nATOM   1963  C   ALA A 116      12.998  -0.930  11.446  1.00103.83           C\nATOM   1964  O   ALA A 116      12.156  -1.715  11.882  1.00103.44           O\nATOM   1965  CB  ALA A 116      11.382   0.931  12.143  1.00104.24           C\nATOM   1966  H   ALA A 116      11.635   1.405   9.746  1.00103.48           H\nATOM   1967  HA  ALA A 116      13.489   1.093  11.888  1.00103.97           H\nATOM   1968  HB1 ALA A 116      11.417   0.571  13.172  1.00104.24           H\nATOM   1969  HB2 ALA A 116      11.238   2.011  12.186  1.00104.24           H\nATOM   1970  HB3 ALA A 116      10.501   0.498  11.667  1.00104.24           H\nATOM   1971  N   ASN A 117      14.247  -1.275  11.078  1.00 48.99           N\nATOM   1972  CA  ASN A 117      14.990  -2.506  11.410  1.00 53.05           C\nATOM   1973  C   ASN A 117      14.217  -3.812  11.123  1.00 55.96           C\nATOM   1974  O   ASN A 117      14.046  -4.631  12.028  1.00 57.20           O\nATOM   1975  CB  ASN A 117      15.474  -2.447  12.890  1.00  0.00           C\nATOM   1976  CG  ASN A 117      16.408  -1.283  13.247  1.00  0.00           C\nATOM   1977  OD1 ASN A 117      16.741  -0.439  12.418  1.00  0.00           O\nATOM   1978  ND2 ASN A 117      16.843  -1.240  14.508  1.00  0.00           N\nATOM   1979  HB2 ASN A 117      14.615  -2.414  13.562  1.00  0.00           H\nATOM   1980  HB3 ASN A 117      16.018  -3.362  13.131  1.00  0.00           H\nATOM   1981 HD22 ASN A 117      17.464  -0.500  14.802  1.00  0.00           H\nATOM   1982 HD21 ASN A 117      16.559  -1.945  15.173  1.00  0.00           H\nATOM   1983  H   ASN A 117      14.827  -0.541  10.692  1.00 48.99           H\nATOM   1984  HA  ASN A 117      15.867  -2.508  10.762  1.00 53.05           H\nATOM   1985  N   LYS A 118      13.738  -3.977   9.879  1.00 58.97           N\nATOM   1986  CA  LYS A 118      12.866  -5.094   9.507  1.00 61.75           C\nATOM   1987  C   LYS A 118      12.899  -5.368   7.998  1.00 62.91           C\nATOM   1988  O   LYS A 118      13.216  -4.481   7.205  1.00 63.12           O\nATOM   1989  CB  LYS A 118      11.428  -4.818  10.012  1.00  0.00           C\nATOM   1990  CG  LYS A 118      10.724  -3.618   9.348  1.00  0.00           C\nATOM   1991  CD  LYS A 118       9.435  -3.221  10.078  1.00  0.00           C\nATOM   1992  CE  LYS A 118       8.750  -2.012   9.425  1.00  0.00           C\nATOM   1993  NZ  LYS A 118       7.552  -1.593  10.173  1.00  0.00           N1+\nATOM   1994  HB2 LYS A 118      10.813  -5.707   9.859  1.00  0.00           H\nATOM   1995  HB3 LYS A 118      11.453  -4.670  11.092  1.00  0.00           H\nATOM   1996  HG2 LYS A 118      11.395  -2.759   9.320  1.00  0.00           H\nATOM   1997  HG3 LYS A 118      10.490  -3.855   8.309  1.00  0.00           H\nATOM   1998  HD2 LYS A 118       8.754  -4.074  10.092  1.00  0.00           H\nATOM   1999  HD3 LYS A 118       9.671  -2.998  11.120  1.00  0.00           H\nATOM   2000  HE2 LYS A 118       9.439  -1.168   9.374  1.00  0.00           H\nATOM   2001  HE3 LYS A 118       8.457  -2.256   8.404  1.00  0.00           H\nATOM   2002  HZ1 LYS A 118       7.813  -1.338  11.115  1.00  0.00           H\nATOM   2003  HZ2 LYS A 118       7.130  -0.799   9.713  1.00  0.00           H\nATOM   2004  HZ3 LYS A 118       6.889  -2.355  10.202  1.00  0.00           H\nATOM   2005  H   LYS A 118      13.908  -3.283   9.166  1.00 58.97           H\nATOM   2006  HA  LYS A 118      13.238  -5.997   9.996  1.00 61.75           H\nATOM   2007  N   LYS A 119      12.508  -6.603   7.651  1.00 63.82           N\nATOM   2008  CA  LYS A 119      12.257  -7.055   6.286  1.00 64.00           C\nATOM   2009  C   LYS A 119      10.771  -6.807   5.947  1.00 62.95           C\nATOM   2010  O   LYS A 119       9.918  -7.226   6.733  1.00 63.27           O\nATOM   2011  CB  LYS A 119      12.515  -8.577   6.221  1.00  0.00           C\nATOM   2012  CG  LYS A 119      13.970  -9.003   6.474  1.00  0.00           C\nATOM   2013  CD  LYS A 119      14.128 -10.530   6.389  1.00  0.00           C\nATOM   2014  CE  LYS A 119      15.555 -11.004   6.706  1.00  0.00           C\nATOM   2015  NZ  LYS A 119      15.664 -12.473   6.643  1.00  0.00           N1+\nATOM   2016  HB2 LYS A 119      11.865  -9.094   6.930  1.00  0.00           H\nATOM   2017  HB3 LYS A 119      12.225  -8.938   5.233  1.00  0.00           H\nATOM   2018  HG2 LYS A 119      14.625  -8.522   5.747  1.00  0.00           H\nATOM   2019  HG3 LYS A 119      14.293  -8.660   7.458  1.00  0.00           H\nATOM   2020  HD2 LYS A 119      13.422 -11.000   7.076  1.00  0.00           H\nATOM   2021  HD3 LYS A 119      13.845 -10.860   5.389  1.00  0.00           H\nATOM   2022  HE2 LYS A 119      16.264 -10.567   6.003  1.00  0.00           H\nATOM   2023  HE3 LYS A 119      15.848 -10.677   7.705  1.00  0.00           H\nATOM   2024  HZ1 LYS A 119      15.425 -12.790   5.714  1.00  0.00           H\nATOM   2025  HZ2 LYS A 119      16.611 -12.752   6.858  1.00  0.00           H\nATOM   2026  HZ3 LYS A 119      15.032 -12.889   7.312  1.00  0.00           H\nATOM   2027  H   LYS A 119      12.255  -7.259   8.376  1.00 63.82           H\nATOM   2028  HA  LYS A 119      12.945  -6.548   5.612  1.00 64.00           H\nATOM   2029  N   PRO A 120      10.465  -6.195   4.780  1.00 60.74           N\nATOM   2030  CA  PRO A 120       9.103  -6.257   4.217  1.00 57.38           C\nATOM   2031  C   PRO A 120       8.792  -7.647   3.615  1.00 56.09           C\nATOM   2032  O   PRO A 120       9.677  -8.503   3.539  1.00 56.07           O\nATOM   2033  CD  PRO A 120      11.391  -5.518   3.867  1.00  0.00           C\nATOM   2034  CB  PRO A 120       9.138  -5.155   3.145  1.00  0.00           C\nATOM   2035  CG  PRO A 120      10.567  -5.178   2.626  1.00  0.00           C\nATOM   2036  HD3 PRO A 120      11.757  -4.610   4.349  1.00  0.00           H\nATOM   2037  HD2 PRO A 120      12.246  -6.135   3.589  1.00  0.00           H\nATOM   2038  HB2 PRO A 120       8.406  -5.287   2.347  1.00  0.00           H\nATOM   2039  HB3 PRO A 120       8.935  -4.190   3.614  1.00  0.00           H\nATOM   2040  HG3 PRO A 120      10.870  -4.247   2.146  1.00  0.00           H\nATOM   2041  HG2 PRO A 120      10.667  -5.980   1.892  1.00  0.00           H\nATOM   2042  HA  PRO A 120       8.348  -6.021   4.969  1.00 57.38           H\nATOM   2043  N   VAL A 121       7.544  -7.827   3.150  1.00 53.78           N\nATOM   2044  CA  VAL A 121       7.123  -8.961   2.315  1.00 51.38           C\nATOM   2045  C   VAL A 121       7.932  -9.027   0.995  1.00 48.13           C\nATOM   2046  O   VAL A 121       8.367  -7.984   0.509  1.00 47.73           O\nATOM   2047  CB  VAL A 121       5.597  -8.863   2.007  1.00  0.00           C\nATOM   2048  CG1 VAL A 121       5.191  -7.606   1.209  1.00  0.00           C\nATOM   2049  CG2 VAL A 121       5.024 -10.123   1.330  1.00  0.00           C\nATOM   2050  HB  VAL A 121       5.097  -8.791   2.974  1.00  0.00           H\nATOM   2051 HG11 VAL A 121       4.109  -7.560   1.080  1.00  0.00           H\nATOM   2052 HG12 VAL A 121       5.493  -6.692   1.719  1.00  0.00           H\nATOM   2053 HG13 VAL A 121       5.634  -7.591   0.215  1.00  0.00           H\nATOM   2054 HG21 VAL A 121       3.935 -10.076   1.282  1.00  0.00           H\nATOM   2055 HG22 VAL A 121       5.382 -10.242   0.308  1.00  0.00           H\nATOM   2056 HG23 VAL A 121       5.286 -11.024   1.885  1.00  0.00           H\nATOM   2057  H   VAL A 121       6.867  -7.086   3.254  1.00 53.78           H\nATOM   2058  HA  VAL A 121       7.312  -9.875   2.882  1.00 51.38           H\nATOM   2059  N   GLN A 122       8.141 -10.243   0.458  1.00 44.81           N\nATOM   2060  CA  GLN A 122       8.956 -10.498  -0.740  1.00 42.04           C\nATOM   2061  C   GLN A 122       8.236 -10.278  -2.092  1.00 39.32           C\nATOM   2062  O   GLN A 122       8.815 -10.587  -3.134  1.00 36.79           O\nATOM   2063  CB  GLN A 122       9.623 -11.888  -0.629  1.00  0.00           C\nATOM   2064  CG  GLN A 122      10.710 -11.933   0.468  1.00  0.00           C\nATOM   2065  CD  GLN A 122      11.475 -13.258   0.585  1.00  0.00           C\nATOM   2066  OE1 GLN A 122      12.207 -13.453   1.552  1.00  0.00           O\nATOM   2067  NE2 GLN A 122      11.336 -14.172  -0.379  1.00  0.00           N\nATOM   2068  HB2 GLN A 122       8.863 -12.647  -0.434  1.00  0.00           H\nATOM   2069  HB3 GLN A 122      10.080 -12.150  -1.584  1.00  0.00           H\nATOM   2070  HG2 GLN A 122      11.445 -11.148   0.287  1.00  0.00           H\nATOM   2071  HG3 GLN A 122      10.265 -11.717   1.440  1.00  0.00           H\nATOM   2072 HE22 GLN A 122      11.833 -15.049  -0.318  1.00  0.00           H\nATOM   2073 HE21 GLN A 122      10.737 -13.995  -1.172  1.00  0.00           H\nATOM   2074  H   GLN A 122       7.758 -11.058   0.915  1.00 44.81           H\nATOM   2075  HA  GLN A 122       9.767  -9.767  -0.747  1.00 42.04           H\nATOM   2076  N   LEU A 123       7.025  -9.695  -2.064  1.00 88.08           N\nATOM   2077  CA  LEU A 123       6.254  -9.252  -3.231  1.00 87.90           C\nATOM   2078  C   LEU A 123       6.937  -8.227  -4.183  1.00 87.49           C\nATOM   2079  O   LEU A 123       6.728  -8.380  -5.387  1.00 87.89           O\nATOM   2080  CB  LEU A 123       4.860  -8.768  -2.745  1.00 88.28           C\nATOM   2081  CG  LEU A 123       3.907  -8.152  -3.802  1.00 87.95           C\nATOM   2082  CD1 LEU A 123       3.557  -9.146  -4.932  1.00 89.97           C\nATOM   2083  CD2 LEU A 123       2.659  -7.541  -3.128  1.00 87.51           C\nATOM   2084  HA  LEU A 123       6.093 -10.152  -3.828  1.00 87.90           H\nATOM   2085  HB3 LEU A 123       5.012  -8.020  -1.968  1.00 88.28           H\nATOM   2086  HB2 LEU A 123       4.350  -9.598  -2.253  1.00 88.28           H\nATOM   2087  HG  LEU A 123       4.415  -7.306  -4.264  1.00 87.95           H\nATOM   2088 HD11 LEU A 123       2.486  -9.250  -5.086  1.00 89.97           H\nATOM   2089 HD12 LEU A 123       3.979  -8.818  -5.882  1.00 89.97           H\nATOM   2090 HD13 LEU A 123       3.941 -10.146  -4.735  1.00 89.97           H\nATOM   2091 HD21 LEU A 123       2.570  -6.481  -3.368  1.00 87.51           H\nATOM   2092 HD22 LEU A 123       1.734  -8.015  -3.442  1.00 87.51           H\nATOM   2093 HD23 LEU A 123       2.696  -7.621  -2.041  1.00 87.51           H\nATOM   2094  H   LEU A 123       6.626  -9.462  -1.166  1.00 88.08           H\nATOM   2095  N   PRO A 124       7.720  -7.229  -3.688  1.00 86.20           N\nATOM   2096  CA  PRO A 124       8.282  -6.144  -4.519  1.00 84.78           C\nATOM   2097  C   PRO A 124       9.047  -6.506  -5.801  1.00 82.20           C\nATOM   2098  O   PRO A 124       8.938  -5.746  -6.753  1.00 81.39           O\nATOM   2099  CB  PRO A 124       9.145  -5.322  -3.554  1.00 84.32           C\nATOM   2100  CG  PRO A 124       8.406  -5.454  -2.240  1.00 86.25           C\nATOM   2101  CD  PRO A 124       7.948  -6.904  -2.280  1.00 86.44           C\nATOM   2102  HA  PRO A 124       7.439  -5.514  -4.798  1.00 84.78           H\nATOM   2103  HB3 PRO A 124       9.255  -4.282  -3.865  1.00 84.32           H\nATOM   2104  HB2 PRO A 124      10.143  -5.753  -3.464  1.00 84.32           H\nATOM   2105  HG3 PRO A 124       7.539  -4.792  -2.235  1.00 86.25           H\nATOM   2106  HG2 PRO A 124       9.018  -5.218  -1.368  1.00 86.25           H\nATOM   2107  HD2 PRO A 124       8.760  -7.535  -1.924  1.00 86.44           H\nATOM   2108  HD3 PRO A 124       7.072  -7.046  -1.648  1.00 86.44           H\nATOM   2109  N   ARG A 125       9.778  -7.632  -5.851  1.00 79.64           N\nATOM   2110  CA  ARG A 125      10.539  -8.019  -7.049  1.00 77.52           C\nATOM   2111  C   ARG A 125       9.675  -8.545  -8.211  1.00 73.96           C\nATOM   2112  O   ARG A 125      10.087  -8.385  -9.361  1.00 73.42           O\nATOM   2113  CB  ARG A 125      11.666  -8.997  -6.664  1.00 78.43           C\nATOM   2114  CG  ARG A 125      12.755  -8.317  -5.814  1.00 81.81           C\nATOM   2115  CD  ARG A 125      13.671  -7.398  -6.650  1.00 85.36           C\nATOM   2116  NE  ARG A 125      14.476  -6.490  -5.819  1.00 87.58           N\nATOM   2117  CZ  ARG A 125      14.162  -5.229  -5.459  1.00 86.50           C\nATOM   2118  NH1 ARG A 125      13.009  -4.639  -5.819  1.00 88.64           N\nATOM   2119  NH2 ARG A 125      15.036  -4.540  -4.717  1.00 85.39           N1+\nATOM   2120  H   ARG A 125       9.828  -8.248  -5.052  1.00 79.64           H\nATOM   2121  HA  ARG A 125      11.003  -7.116  -7.446  1.00 77.52           H\nATOM   2122  HB3 ARG A 125      12.133  -9.404  -7.562  1.00 78.43           H\nATOM   2123  HB2 ARG A 125      11.247  -9.851  -6.129  1.00 78.43           H\nATOM   2124  HG3 ARG A 125      13.373  -9.132  -5.434  1.00 81.81           H\nATOM   2125  HG2 ARG A 125      12.354  -7.818  -4.931  1.00 81.81           H\nATOM   2126  HD3 ARG A 125      13.177  -6.901  -7.484  1.00 85.36           H\nATOM   2127  HD2 ARG A 125      14.426  -8.036  -7.112  1.00 85.36           H\nATOM   2128  HE  ARG A 125      15.345  -6.876  -5.477  1.00 87.58           H\nATOM   2129 HH12 ARG A 125      12.805  -3.692  -5.535  1.00 88.64           H\nATOM   2130 HH11 ARG A 125      12.337  -5.144  -6.379  1.00 88.64           H\nATOM   2131 HH22 ARG A 125      14.861  -3.571  -4.482  1.00 85.39           H\nATOM   2132 HH21 ARG A 125      15.909  -4.958  -4.429  1.00 85.39           H\nATOM   2133  N   GLY A 126       8.485  -9.094  -7.915  1.00 68.96           N\nATOM   2134  CA  GLY A 126       7.486  -9.423  -8.932  1.00 64.52           C\nATOM   2135  C   GLY A 126       6.666  -8.174  -9.282  1.00 60.87           C\nATOM   2136  O   GLY A 126       6.365  -7.951 -10.455  1.00 59.23           O\nATOM   2137  H   GLY A 126       8.205  -9.184  -6.948  1.00 68.96           H\nATOM   2138  HA3 GLY A 126       6.818 -10.191  -8.542  1.00 64.52           H\nATOM   2139  HA2 GLY A 126       7.950  -9.826  -9.832  1.00 64.52           H\nATOM   2140  N   MET A 127       6.327  -7.359  -8.267  1.00 55.35           N\nATOM   2141  CA  MET A 127       5.510  -6.152  -8.372  1.00 52.74           C\nATOM   2142  C   MET A 127       6.165  -5.017  -9.186  1.00 50.36           C\nATOM   2143  O   MET A 127       5.475  -4.407  -9.998  1.00 50.22           O\nATOM   2144  CB  MET A 127       5.061  -5.737  -6.950  1.00 52.06           C\nATOM   2145  CG  MET A 127       4.494  -4.318  -6.817  1.00 52.58           C\nATOM   2146  SD  MET A 127       3.661  -3.938  -5.258  1.00 57.02           S\nATOM   2147  CE  MET A 127       3.291  -2.196  -5.596  1.00 52.47           C\nATOM   2148  H   MET A 127       6.607  -7.613  -7.329  1.00 55.35           H\nATOM   2149  HA  MET A 127       4.607  -6.426  -8.921  1.00 52.74           H\nATOM   2150  HB3 MET A 127       5.915  -5.810  -6.284  1.00 52.06           H\nATOM   2151  HB2 MET A 127       4.341  -6.459  -6.569  1.00 52.06           H\nATOM   2152  HG3 MET A 127       3.792  -4.119  -7.627  1.00 52.58           H\nATOM   2153  HG2 MET A 127       5.316  -3.609  -6.906  1.00 52.58           H\nATOM   2154  HE1 MET A 127       2.789  -1.734  -4.749  1.00 52.47           H\nATOM   2155  HE2 MET A 127       4.213  -1.646  -5.788  1.00 52.47           H\nATOM   2156  HE3 MET A 127       2.646  -2.104  -6.470  1.00 52.47           H\nATOM   2157  N   VAL A 128       7.469  -4.767  -8.976  1.00 48.87           N\nATOM   2158  CA  VAL A 128       8.261  -3.751  -9.683  1.00 49.35           C\nATOM   2159  C   VAL A 128       8.423  -4.050 -11.187  1.00 48.69           C\nATOM   2160  O   VAL A 128       8.391  -3.115 -11.987  1.00 46.69           O\nATOM   2161  CB  VAL A 128       9.657  -3.561  -9.013  1.00 49.83           C\nATOM   2162  CG1 VAL A 128      10.754  -2.896  -9.876  1.00 51.17           C\nATOM   2163  CG2 VAL A 128       9.503  -2.804  -7.679  1.00 50.76           C\nATOM   2164  H   VAL A 128       7.966  -5.297  -8.270  1.00 48.87           H\nATOM   2165  HA  VAL A 128       7.716  -2.808  -9.605  1.00 49.35           H\nATOM   2166  HB  VAL A 128      10.045  -4.550  -8.767  1.00 49.83           H\nATOM   2167 HG11 VAL A 128      11.627  -2.635  -9.278  1.00 51.17           H\nATOM   2168 HG12 VAL A 128      11.102  -3.562 -10.667  1.00 51.17           H\nATOM   2169 HG13 VAL A 128      10.396  -1.981 -10.349  1.00 51.17           H\nATOM   2170 HG21 VAL A 128      10.460  -2.700  -7.169  1.00 50.76           H\nATOM   2171 HG22 VAL A 128       9.085  -1.811  -7.830  1.00 50.76           H\nATOM   2172 HG23 VAL A 128       8.823  -3.304  -6.994  1.00 50.76           H\nATOM   2173  N   LYS A 129       8.542  -5.341 -11.541  1.00 48.34           N\nATOM   2174  CA  LYS A 129       8.550  -5.817 -12.923  1.00 48.30           C\nATOM   2175  C   LYS A 129       7.172  -5.654 -13.590  1.00 48.23           C\nATOM   2176  O   LYS A 129       7.107  -5.203 -14.731  1.00 45.86           O\nATOM   2177  CB  LYS A 129       9.037  -7.278 -12.941  1.00 48.73           C\nATOM   2178  CG  LYS A 129       9.207  -7.869 -14.353  1.00 51.59           C\nATOM   2179  CD  LYS A 129       9.624  -9.344 -14.367  1.00 53.41           C\nATOM   2180  CE  LYS A 129      10.930  -9.624 -13.603  1.00 55.96           C\nATOM   2181  NZ  LYS A 129      11.434 -10.985 -13.831  1.00 59.17           N1+\nATOM   2182  H   LYS A 129       8.555  -6.053 -10.825  1.00 48.34           H\nATOM   2183  HA  LYS A 129       9.269  -5.214 -13.483  1.00 48.30           H\nATOM   2184  HB3 LYS A 129       8.353  -7.904 -12.366  1.00 48.73           H\nATOM   2185  HB2 LYS A 129       9.994  -7.321 -12.421  1.00 48.73           H\nATOM   2186  HG3 LYS A 129       9.940  -7.284 -14.905  1.00 51.59           H\nATOM   2187  HG2 LYS A 129       8.274  -7.785 -14.908  1.00 51.59           H\nATOM   2188  HD3 LYS A 129       9.718  -9.670 -15.403  1.00 53.41           H\nATOM   2189  HD2 LYS A 129       8.803  -9.919 -13.945  1.00 53.41           H\nATOM   2190  HE3 LYS A 129      10.790  -9.484 -12.531  1.00 55.96           H\nATOM   2191  HE2 LYS A 129      11.700  -8.933 -13.929  1.00 55.96           H\nATOM   2192  HZ1 LYS A 129      12.264 -11.143 -13.274  1.00 59.17           H\nATOM   2193  HZ2 LYS A 129      10.720 -11.655 -13.575  1.00 59.17           H\nATOM   2194  HZ3 LYS A 129      11.657 -11.099 -14.811  1.00 59.17           H\nATOM   2195  N   SER A 130       6.098  -5.990 -12.854  1.00 47.46           N\nATOM   2196  CA  SER A 130       4.710  -5.864 -13.303  1.00 46.31           C\nATOM   2197  C   SER A 130       4.299  -4.398 -13.549  1.00 47.15           C\nATOM   2198  O   SER A 130       3.624  -4.127 -14.541  1.00 47.13           O\nATOM   2199  CB  SER A 130       3.776  -6.533 -12.279  1.00 46.14           C\nATOM   2200  OG  SER A 130       4.014  -7.921 -12.207  1.00 47.47           O\nATOM   2201  H   SER A 130       6.233  -6.357 -11.921  1.00 47.46           H\nATOM   2202  HA  SER A 130       4.614  -6.394 -14.253  1.00 46.31           H\nATOM   2203  HB3 SER A 130       2.737  -6.402 -12.577  1.00 46.14           H\nATOM   2204  HB2 SER A 130       3.884  -6.095 -11.287  1.00 46.14           H\nATOM   2205  HG  SER A 130       4.786  -8.070 -11.650  1.00 47.47           H\nATOM   2206  N   LEU A 131       4.759  -3.486 -12.673  1.00 45.69           N\nATOM   2207  CA  LEU A 131       4.622  -2.033 -12.795  1.00 46.04           C\nATOM   2208  C   LEU A 131       5.350  -1.488 -14.031  1.00 46.59           C\nATOM   2209  O   LEU A 131       4.723  -0.770 -14.807  1.00 47.75           O\nATOM   2210  CB  LEU A 131       5.154  -1.347 -11.516  1.00 45.55           C\nATOM   2211  CG  LEU A 131       4.169  -1.380 -10.329  1.00 44.29           C\nATOM   2212  CD1 LEU A 131       4.916  -1.210  -8.993  1.00 39.87           C\nATOM   2213  CD2 LEU A 131       3.034  -0.346 -10.502  1.00 35.61           C\nATOM   2214  H   LEU A 131       5.284  -3.806 -11.869  1.00 45.69           H\nATOM   2215  HA  LEU A 131       3.560  -1.804 -12.909  1.00 46.04           H\nATOM   2216  HB3 LEU A 131       5.422  -0.307 -11.713  1.00 45.55           H\nATOM   2217  HB2 LEU A 131       6.088  -1.832 -11.235  1.00 45.55           H\nATOM   2218  HG  LEU A 131       3.708  -2.367 -10.299  1.00 44.29           H\nATOM   2219 HD11 LEU A 131       4.417  -0.536  -8.298  1.00 39.87           H\nATOM   2220 HD12 LEU A 131       4.998  -2.167  -8.491  1.00 39.87           H\nATOM   2221 HD13 LEU A 131       5.932  -0.847  -9.138  1.00 39.87           H\nATOM   2222 HD21 LEU A 131       2.956   0.345  -9.665  1.00 35.61           H\nATOM   2223 HD22 LEU A 131       3.170   0.263 -11.397  1.00 35.61           H\nATOM   2224 HD23 LEU A 131       2.065  -0.831 -10.588  1.00 35.61           H\nATOM   2225  N   LEU A 132       6.636  -1.852 -14.201  1.00 46.97           N\nATOM   2226  CA  LEU A 132       7.478  -1.422 -15.322  1.00 48.43           C\nATOM   2227  C   LEU A 132       6.930  -1.856 -16.693  1.00 47.96           C\nATOM   2228  O   LEU A 132       6.948  -1.041 -17.613  1.00 49.40           O\nATOM   2229  CB  LEU A 132       8.935  -1.898 -15.108  1.00 49.60           C\nATOM   2230  CG  LEU A 132       9.934  -1.487 -16.221  1.00 51.40           C\nATOM   2231  CD1 LEU A 132      10.083   0.044 -16.340  1.00 51.34           C\nATOM   2232  CD2 LEU A 132      11.284  -2.207 -16.054  1.00 47.15           C\nATOM   2233  H   LEU A 132       7.081  -2.445 -13.514  1.00 46.97           H\nATOM   2234  HA  LEU A 132       7.475  -0.331 -15.307  1.00 48.43           H\nATOM   2235  HB3 LEU A 132       8.932  -2.987 -15.025  1.00 49.60           H\nATOM   2236  HB2 LEU A 132       9.300  -1.529 -14.149  1.00 49.60           H\nATOM   2237  HG  LEU A 132       9.551  -1.828 -17.181  1.00 51.40           H\nATOM   2238 HD11 LEU A 132      11.113   0.362 -16.498  1.00 51.34           H\nATOM   2239 HD12 LEU A 132       9.509   0.416 -17.189  1.00 51.34           H\nATOM   2240 HD13 LEU A 132       9.717   0.561 -15.453  1.00 51.34           H\nATOM   2241 HD21 LEU A 132      12.126  -1.520 -16.061  1.00 47.15           H\nATOM   2242 HD22 LEU A 132      11.332  -2.772 -15.124  1.00 47.15           H\nATOM   2243 HD23 LEU A 132      11.457  -2.912 -16.865  1.00 47.15           H\nATOM   2244  N   TYR A 133       6.441  -3.106 -16.799  1.00 48.25           N\nATOM   2245  CA  TYR A 133       5.857  -3.646 -18.028  1.00 48.33           C\nATOM   2246  C   TYR A 133       4.589  -2.890 -18.463  1.00 48.21           C\nATOM   2247  O   TYR A 133       4.450  -2.588 -19.646  1.00 47.90           O\nATOM   2248  CB  TYR A 133       5.573  -5.155 -17.878  1.00 48.12           C\nATOM   2249  CG  TYR A 133       5.155  -5.813 -19.181  1.00 50.39           C\nATOM   2250  CD1 TYR A 133       6.129  -6.099 -20.162  1.00 51.12           C\nATOM   2251  CD2 TYR A 133       3.795  -6.077 -19.448  1.00 52.98           C\nATOM   2252  CE1 TYR A 133       5.746  -6.631 -21.407  1.00 55.60           C\nATOM   2253  CE2 TYR A 133       3.412  -6.603 -20.697  1.00 54.12           C\nATOM   2254  CZ  TYR A 133       4.386  -6.877 -21.678  1.00 57.97           C\nATOM   2255  OH  TYR A 133       4.011  -7.375 -22.891  1.00 60.96           O\nATOM   2256  H   TYR A 133       6.470  -3.727 -16.001  1.00 48.25           H\nATOM   2257  HA  TYR A 133       6.602  -3.521 -18.817  1.00 48.33           H\nATOM   2258  HB3 TYR A 133       4.809  -5.326 -17.117  1.00 48.12           H\nATOM   2259  HB2 TYR A 133       6.461  -5.670 -17.518  1.00 48.12           H\nATOM   2260  HD1 TYR A 133       7.170  -5.888 -19.969  1.00 51.12           H\nATOM   2261  HD2 TYR A 133       3.040  -5.849 -18.710  1.00 52.98           H\nATOM   2262  HE1 TYR A 133       6.499  -6.836 -22.154  1.00 55.60           H\nATOM   2263  HE2 TYR A 133       2.367  -6.787 -20.904  1.00 54.12           H\nATOM   2264  HH  TYR A 133       4.752  -7.538 -23.478  1.00 60.96           H\nATOM   2265  N   GLN A 134       3.711  -2.587 -17.494  1.00 46.87           N\nATOM   2266  CA  GLN A 134       2.471  -1.845 -17.707  1.00 46.59           C\nATOM   2267  C   GLN A 134       2.690  -0.353 -18.018  1.00 45.45           C\nATOM   2268  O   GLN A 134       1.943   0.196 -18.827  1.00 48.97           O\nATOM   2269  CB  GLN A 134       1.544  -2.048 -16.498  1.00 45.39           C\nATOM   2270  CG  GLN A 134       0.964  -3.472 -16.413  1.00 45.89           C\nATOM   2271  CD  GLN A 134       0.035  -3.664 -15.214  1.00 48.73           C\nATOM   2272  OE1 GLN A 134      -0.856  -2.854 -14.973  1.00 46.45           O\nATOM   2273  NE2 GLN A 134       0.208  -4.765 -14.482  1.00 46.33           N\nATOM   2274  H   GLN A 134       3.900  -2.872 -16.542  1.00 46.87           H\nATOM   2275  HA  GLN A 134       1.974  -2.275 -18.580  1.00 46.59           H\nATOM   2276  HB3 GLN A 134       0.722  -1.343 -16.577  1.00 45.39           H\nATOM   2277  HB2 GLN A 134       2.076  -1.805 -15.576  1.00 45.39           H\nATOM   2278  HG3 GLN A 134       1.764  -4.212 -16.387  1.00 45.89           H\nATOM   2279  HG2 GLN A 134       0.384  -3.679 -17.309  1.00 45.89           H\nATOM   2280 HE22 GLN A 134      -0.413  -4.957 -13.708  1.00 46.33           H\nATOM   2281 HE21 GLN A 134       0.939  -5.426 -14.704  1.00 46.33           H\nATOM   2282  N   ILE A 135       3.733   0.260 -17.427  1.00 44.30           N\nATOM   2283  CA  ILE A 135       4.197   1.612 -17.755  1.00 44.52           C\nATOM   2284  C   ILE A 135       4.720   1.699 -19.203  1.00 45.40           C\nATOM   2285  O   ILE A 135       4.323   2.610 -19.926  1.00 43.80           O\nATOM   2286  CB  ILE A 135       5.294   2.112 -16.763  1.00 44.44           C\nATOM   2287  CG1 ILE A 135       4.694   2.397 -15.369  1.00 45.08           C\nATOM   2288  CG2 ILE A 135       6.102   3.347 -17.227  1.00 42.22           C\nATOM   2289  CD1 ILE A 135       5.736   2.394 -14.237  1.00 43.54           C\nATOM   2290  H   ILE A 135       4.288  -0.249 -16.751  1.00 44.30           H\nATOM   2291  HA  ILE A 135       3.339   2.281 -17.670  1.00 44.52           H\nATOM   2292  HB  ILE A 135       6.008   1.295 -16.646  1.00 44.44           H\nATOM   2293 HG13 ILE A 135       3.927   1.662 -15.128  1.00 45.08           H\nATOM   2294 HG12 ILE A 135       4.174   3.355 -15.387  1.00 45.08           H\nATOM   2295 HG21 ILE A 135       6.794   3.684 -16.456  1.00 42.22           H\nATOM   2296 HG22 ILE A 135       6.709   3.132 -18.107  1.00 42.22           H\nATOM   2297 HG23 ILE A 135       5.444   4.184 -17.466  1.00 42.22           H\nATOM   2298 HD11 ILE A 135       5.417   1.747 -13.421  1.00 43.54           H\nATOM   2299 HD12 ILE A 135       6.711   2.034 -14.569  1.00 43.54           H\nATOM   2300 HD13 ILE A 135       5.877   3.396 -13.833  1.00 43.54           H\nATOM   2301  N   LEU A 136       5.559   0.728 -19.606  1.00 45.39           N\nATOM   2302  CA  LEU A 136       6.096   0.597 -20.962  1.00 47.80           C\nATOM   2303  C   LEU A 136       5.011   0.344 -22.022  1.00 47.10           C\nATOM   2304  O   LEU A 136       5.125   0.897 -23.112  1.00 43.62           O\nATOM   2305  CB  LEU A 136       7.151  -0.529 -20.997  1.00 48.24           C\nATOM   2306  CG  LEU A 136       8.516  -0.138 -20.394  1.00 46.29           C\nATOM   2307  CD1 LEU A 136       9.366  -1.392 -20.128  1.00 45.06           C\nATOM   2308  CD2 LEU A 136       9.268   0.869 -21.285  1.00 45.18           C\nATOM   2309  H   LEU A 136       5.843   0.014 -18.948  1.00 45.39           H\nATOM   2310  HA  LEU A 136       6.576   1.542 -21.221  1.00 47.80           H\nATOM   2311  HB3 LEU A 136       7.321  -0.843 -22.026  1.00 48.24           H\nATOM   2312  HB2 LEU A 136       6.751  -1.406 -20.488  1.00 48.24           H\nATOM   2313  HG  LEU A 136       8.342   0.335 -19.427  1.00 46.29           H\nATOM   2314 HD11 LEU A 136      10.246  -1.152 -19.530  1.00 45.06           H\nATOM   2315 HD12 LEU A 136       8.800  -2.150 -19.586  1.00 45.06           H\nATOM   2316 HD13 LEU A 136       9.705  -1.846 -21.059  1.00 45.06           H\nATOM   2317 HD21 LEU A 136      10.326   0.625 -21.380  1.00 45.18           H\nATOM   2318 HD22 LEU A 136       8.849   0.906 -22.289  1.00 45.18           H\nATOM   2319 HD23 LEU A 136       9.205   1.877 -20.881  1.00 45.18           H\nATOM   2320  N   ASP A 137       3.982  -0.454 -21.686  1.00 48.40           N\nATOM   2321  CA  ASP A 137       2.852  -0.784 -22.559  1.00 48.99           C\nATOM   2322  C   ASP A 137       1.917   0.428 -22.769  1.00 50.85           C\nATOM   2323  O   ASP A 137       1.474   0.659 -23.895  1.00 52.32           O\nATOM   2324  CB  ASP A 137       2.096  -2.032 -22.027  1.00 50.08           C\nATOM   2325  CG  ASP A 137       1.053  -2.691 -22.951  1.00 51.33           C\nATOM   2326  OD1 ASP A 137       1.067  -2.440 -24.176  1.00 50.04           O\nATOM   2327  OD2 ASP A 137       0.299  -3.537 -22.424  1.00 49.97           O1-\nATOM   2328  H   ASP A 137       3.979  -0.896 -20.776  1.00 48.40           H\nATOM   2329  HA  ASP A 137       3.273  -1.034 -23.533  1.00 48.99           H\nATOM   2330  HB3 ASP A 137       1.625  -1.787 -21.074  1.00 50.08           H\nATOM   2331  HB2 ASP A 137       2.830  -2.800 -21.783  1.00 50.08           H\nATOM   2332  N   GLY A 138       1.667   1.202 -21.697  1.00 51.07           N\nATOM   2333  CA  GLY A 138       0.834   2.404 -21.734  1.00 49.89           C\nATOM   2334  C   GLY A 138       1.515   3.541 -22.510  1.00 49.02           C\nATOM   2335  O   GLY A 138       0.847   4.205 -23.300  1.00 47.55           O\nATOM   2336  H   GLY A 138       2.062   0.946 -20.802  1.00 51.07           H\nATOM   2337  HA3 GLY A 138       0.631   2.729 -20.715  1.00 49.89           H\nATOM   2338  HA2 GLY A 138      -0.132   2.175 -22.186  1.00 49.89           H\nATOM   2339  N   ILE A 139       2.836   3.736 -22.328  1.00 49.08           N\nATOM   2340  CA  ILE A 139       3.634   4.712 -23.080  1.00 49.75           C\nATOM   2341  C   ILE A 139       3.870   4.294 -24.546  1.00 49.21           C\nATOM   2342  O   ILE A 139       3.904   5.175 -25.403  1.00 48.82           O\nATOM   2343  CB  ILE A 139       4.995   5.035 -22.380  1.00 50.72           C\nATOM   2344  CG1 ILE A 139       4.792   5.760 -21.028  1.00 55.85           C\nATOM   2345  CG2 ILE A 139       6.010   5.824 -23.236  1.00 49.32           C\nATOM   2346  CD1 ILE A 139       3.984   7.067 -21.082  1.00 59.87           C\nATOM   2347  H   ILE A 139       3.338   3.169 -21.656  1.00 49.08           H\nATOM   2348  HA  ILE A 139       3.054   5.635 -23.130  1.00 49.75           H\nATOM   2349  HB  ILE A 139       5.471   4.081 -22.144  1.00 50.72           H\nATOM   2350 HG13 ILE A 139       5.757   5.954 -20.562  1.00 55.85           H\nATOM   2351 HG12 ILE A 139       4.288   5.084 -20.347  1.00 55.85           H\nATOM   2352 HG21 ILE A 139       6.886   6.113 -22.659  1.00 49.32           H\nATOM   2353 HG22 ILE A 139       6.378   5.237 -24.078  1.00 49.32           H\nATOM   2354 HG23 ILE A 139       5.564   6.737 -23.629  1.00 49.32           H\nATOM   2355 HD11 ILE A 139       4.150   7.664 -20.187  1.00 59.87           H\nATOM   2356 HD12 ILE A 139       4.250   7.682 -21.942  1.00 59.87           H\nATOM   2357 HD13 ILE A 139       2.916   6.861 -21.131  1.00 59.87           H\nATOM   2358  N   HIS A 140       3.968   2.980 -24.825  1.00 50.17           N\nATOM   2359  CA  HIS A 140       4.035   2.433 -26.184  1.00 51.07           C\nATOM   2360  C   HIS A 140       2.762   2.719 -26.997  1.00 48.66           C\nATOM   2361  O   HIS A 140       2.883   3.063 -28.171  1.00 46.44           O\nATOM   2362  CB  HIS A 140       4.358   0.922 -26.155  1.00 51.01           C\nATOM   2363  CG  HIS A 140       4.385   0.250 -27.509  1.00 56.82           C\nATOM   2364  ND1 HIS A 140       3.780  -0.971 -27.751  1.00 60.29           N\nATOM   2365  CD2 HIS A 140       4.911   0.646 -28.720  1.00 61.32           C\nATOM   2366  CE1 HIS A 140       3.934  -1.238 -29.050  1.00 65.42           C\nATOM   2367  NE2 HIS A 140       4.607  -0.299 -29.703  1.00 64.08           N\nATOM   2368  H   HIS A 140       3.964   2.304 -24.072  1.00 50.17           H\nATOM   2369  HA  HIS A 140       4.851   2.941 -26.698  1.00 51.07           H\nATOM   2370  HB3 HIS A 140       3.639   0.399 -25.524  1.00 51.01           H\nATOM   2371  HB2 HIS A 140       5.335   0.760 -25.701  1.00 51.01           H\nATOM   2372  HD1 HIS A 140       3.271  -1.531 -27.082  1.00 60.29           H\nATOM   2373  HD2 HIS A 140       5.457   1.546 -28.964  1.00 61.32           H\nATOM   2374  HE1 HIS A 140       3.543  -2.126 -29.525  1.00 65.42           H\nATOM   2375  N   TYR A 141       1.582   2.616 -26.359  1.00 46.92           N\nATOM   2376  CA  TYR A 141       0.302   2.966 -26.976  1.00 47.51           C\nATOM   2377  C   TYR A 141       0.214   4.456 -27.352  1.00 48.69           C\nATOM   2378  O   TYR A 141      -0.227   4.766 -28.458  1.00 48.29           O\nATOM   2379  CB  TYR A 141      -0.869   2.532 -26.072  1.00 47.25           C\nATOM   2380  CG  TYR A 141      -2.232   2.933 -26.610  1.00 45.22           C\nATOM   2381  CD1 TYR A 141      -2.803   2.211 -27.678  1.00 47.44           C\nATOM   2382  CD2 TYR A 141      -2.902   4.059 -26.087  1.00 44.33           C\nATOM   2383  CE1 TYR A 141      -4.027   2.626 -28.237  1.00 45.28           C\nATOM   2384  CE2 TYR A 141      -4.132   4.464 -26.637  1.00 45.69           C\nATOM   2385  CZ  TYR A 141      -4.685   3.761 -27.725  1.00 44.76           C\nATOM   2386  OH  TYR A 141      -5.854   4.183 -28.287  1.00 44.71           O\nATOM   2387  H   TYR A 141       1.556   2.332 -25.389  1.00 46.92           H\nATOM   2388  HA  TYR A 141       0.229   2.393 -27.903  1.00 47.51           H\nATOM   2389  HB3 TYR A 141      -0.751   2.955 -25.073  1.00 47.25           H\nATOM   2390  HB2 TYR A 141      -0.850   1.451 -25.939  1.00 47.25           H\nATOM   2391  HD1 TYR A 141      -2.292   1.351 -28.086  1.00 47.44           H\nATOM   2392  HD2 TYR A 141      -2.470   4.621 -25.271  1.00 44.33           H\nATOM   2393  HE1 TYR A 141      -4.450   2.078 -29.066  1.00 45.28           H\nATOM   2394  HE2 TYR A 141      -4.645   5.319 -26.228  1.00 45.69           H\nATOM   2395  HH  TYR A 141      -6.143   3.629 -29.016  1.00 44.71           H\nATOM   2396  N   LEU A 142       0.663   5.337 -26.441  1.00 48.21           N\nATOM   2397  CA  LEU A 142       0.733   6.781 -26.661  1.00 49.39           C\nATOM   2398  C   LEU A 142       1.693   7.130 -27.815  1.00 48.97           C\nATOM   2399  O   LEU A 142       1.280   7.843 -28.726  1.00 48.48           O\nATOM   2400  CB  LEU A 142       1.124   7.502 -25.347  1.00 48.79           C\nATOM   2401  CG  LEU A 142       0.082   7.415 -24.205  1.00 48.84           C\nATOM   2402  CD1 LEU A 142       0.695   7.831 -22.849  1.00 52.40           C\nATOM   2403  CD2 LEU A 142      -1.214   8.190 -24.523  1.00 45.02           C\nATOM   2404  H   LEU A 142       1.009   5.003 -25.552  1.00 48.21           H\nATOM   2405  HA  LEU A 142      -0.262   7.114 -26.962  1.00 49.39           H\nATOM   2406  HB3 LEU A 142       1.314   8.557 -25.544  1.00 48.79           H\nATOM   2407  HB2 LEU A 142       2.073   7.093 -25.000  1.00 48.79           H\nATOM   2408  HG  LEU A 142      -0.205   6.370 -24.105  1.00 48.84           H\nATOM   2409 HD11 LEU A 142       0.693   6.990 -22.155  1.00 52.40           H\nATOM   2410 HD12 LEU A 142       1.729   8.162 -22.952  1.00 52.40           H\nATOM   2411 HD13 LEU A 142       0.155   8.643 -22.363  1.00 52.40           H\nATOM   2412 HD21 LEU A 142      -1.403   9.009 -23.830  1.00 45.02           H\nATOM   2413 HD22 LEU A 142      -1.198   8.627 -25.520  1.00 45.02           H\nATOM   2414 HD23 LEU A 142      -2.077   7.526 -24.471  1.00 45.02           H\nATOM   2415  N   HIS A 143       2.922   6.581 -27.786  1.00 48.79           N\nATOM   2416  CA  HIS A 143       3.965   6.777 -28.801  1.00 48.85           C\nATOM   2417  C   HIS A 143       3.594   6.260 -30.202  1.00 48.04           C\nATOM   2418  O   HIS A 143       3.924   6.929 -31.180  1.00 48.29           O\nATOM   2419  CB  HIS A 143       5.289   6.136 -28.337  1.00 47.82           C\nATOM   2420  CG  HIS A 143       6.020   6.854 -27.229  1.00 46.89           C\nATOM   2421  ND1 HIS A 143       7.260   6.408 -26.760  1.00 43.40           N\nATOM   2422  CD2 HIS A 143       5.670   7.996 -26.537  1.00 43.88           C\nATOM   2423  CE1 HIS A 143       7.603   7.277 -25.821  1.00 43.96           C\nATOM   2424  NE2 HIS A 143       6.702   8.244 -25.653  1.00 37.69           N\nATOM   2425  H   HIS A 143       3.177   5.992 -27.003  1.00 48.79           H\nATOM   2426  HA  HIS A 143       4.122   7.853 -28.909  1.00 48.85           H\nATOM   2427  HB3 HIS A 143       5.984   6.065 -29.174  1.00 47.82           H\nATOM   2428  HB2 HIS A 143       5.110   5.109 -28.014  1.00 47.82           H\nATOM   2429  HD2 HIS A 143       4.803   8.634 -26.599  1.00 43.88           H\nATOM   2430  HE1 HIS A 143       8.514   7.202 -25.245  1.00 43.96           H\nATOM   2431  HE2 HIS A 143       6.750   9.009 -24.988  1.00 37.69           H\nATOM   2432  N   ALA A 144       2.895   5.115 -30.282  1.00 46.74           N\nATOM   2433  CA  ALA A 144       2.382   4.539 -31.531  1.00 47.66           C\nATOM   2434  C   ALA A 144       1.350   5.437 -32.243  1.00 48.93           C\nATOM   2435  O   ALA A 144       1.275   5.406 -33.471  1.00 48.44           O\nATOM   2436  CB  ALA A 144       1.789   3.152 -31.241  1.00 42.79           C\nATOM   2437  H   ALA A 144       2.684   4.599 -29.437  1.00 46.74           H\nATOM   2438  HA  ALA A 144       3.227   4.410 -32.209  1.00 47.66           H\nATOM   2439  HB1 ALA A 144       1.384   2.696 -32.145  1.00 42.79           H\nATOM   2440  HB2 ALA A 144       2.550   2.475 -30.851  1.00 42.79           H\nATOM   2441  HB3 ALA A 144       0.985   3.206 -30.506  1.00 42.79           H\nATOM   2442  N   ASN A 145       0.617   6.241 -31.456  1.00 50.22           N\nATOM   2443  CA  ASN A 145      -0.338   7.254 -31.908  1.00 50.60           C\nATOM   2444  C   ASN A 145       0.279   8.669 -31.955  1.00 51.73           C\nATOM   2445  O   ASN A 145      -0.465   9.612 -32.211  1.00 52.80           O\nATOM   2446  CB  ASN A 145      -1.564   7.201 -30.965  1.00 51.28           C\nATOM   2447  CG  ASN A 145      -2.440   5.969 -31.207  1.00 46.89           C\nATOM   2448  OD1 ASN A 145      -3.004   5.818 -32.286  1.00 49.17           O\nATOM   2449  ND2 ASN A 145      -2.577   5.096 -30.209  1.00 48.77           N\nATOM   2450  H   ASN A 145       0.753   6.191 -30.456  1.00 50.22           H\nATOM   2451  HA  ASN A 145      -0.656   6.990 -32.919  1.00 50.60           H\nATOM   2452  HB3 ASN A 145      -2.209   8.059 -31.144  1.00 51.28           H\nATOM   2453  HB2 ASN A 145      -1.260   7.267 -29.919  1.00 51.28           H\nATOM   2454 HD22 ASN A 145      -3.159   4.280 -30.330  1.00 48.77           H\nATOM   2455 HD21 ASN A 145      -2.068   5.218 -29.343  1.00 48.77           H\nATOM   2456  N   TRP A 146       1.597   8.815 -31.719  1.00 53.29           N\nATOM   2457  CA  TRP A 146       2.343  10.085 -31.706  1.00 53.19           C\nATOM   2458  C   TRP A 146       1.854  11.115 -30.663  1.00 52.03           C\nATOM   2459  O   TRP A 146       1.926  12.322 -30.898  1.00 52.58           O\nATOM   2460  CB  TRP A 146       2.487  10.668 -33.130  1.00 55.91           C\nATOM   2461  CG  TRP A 146       3.494   9.987 -34.001  1.00 59.21           C\nATOM   2462  CD1 TRP A 146       3.268   8.946 -34.833  1.00 63.22           C\nATOM   2463  CD2 TRP A 146       4.925  10.259 -34.073  1.00 66.54           C\nATOM   2464  NE1 TRP A 146       4.455   8.575 -35.435  1.00 67.93           N\nATOM   2465  CE2 TRP A 146       5.513   9.351 -35.004  1.00 68.26           C\nATOM   2466  CE3 TRP A 146       5.788  11.187 -33.444  1.00 70.24           C\nATOM   2467  CZ2 TRP A 146       6.888   9.367 -35.299  1.00 70.79           C\nATOM   2468  CZ3 TRP A 146       7.168  11.213 -33.731  1.00 72.99           C\nATOM   2469  CH2 TRP A 146       7.718  10.304 -34.657  1.00 73.10           C\nATOM   2470  H   TRP A 146       2.148   7.990 -31.524  1.00 53.29           H\nATOM   2471  HA  TRP A 146       3.348   9.842 -31.358  1.00 53.19           H\nATOM   2472  HB3 TRP A 146       2.820  11.704 -33.091  1.00 55.91           H\nATOM   2473  HB2 TRP A 146       1.527  10.689 -33.639  1.00 55.91           H\nATOM   2474  HD1 TRP A 146       2.302   8.487 -34.989  1.00 63.22           H\nATOM   2475  HE1 TRP A 146       4.509   7.817 -36.101  1.00 67.93           H\nATOM   2476  HE3 TRP A 146       5.380  11.891 -32.733  1.00 70.24           H\nATOM   2477  HZ2 TRP A 146       7.303   8.666 -36.008  1.00 70.79           H\nATOM   2478  HZ3 TRP A 146       7.806  11.932 -33.239  1.00 72.99           H\nATOM   2479  HH2 TRP A 146       8.776  10.328 -34.873  1.00 73.10           H\nATOM   2480  N   VAL A 147       1.411  10.610 -29.504  1.00 51.17           N\nATOM   2481  CA  VAL A 147       1.131  11.389 -28.304  1.00 49.42           C\nATOM   2482  C   VAL A 147       2.317  11.190 -27.345  1.00 49.43           C\nATOM   2483  O   VAL A 147       2.700  10.051 -27.079  1.00 49.50           O\nATOM   2484  CB  VAL A 147      -0.176  10.903 -27.609  1.00 50.28           C\nATOM   2485  CG1 VAL A 147      -0.459  11.583 -26.252  1.00 46.10           C\nATOM   2486  CG2 VAL A 147      -1.394  11.073 -28.537  1.00 46.30           C\nATOM   2487  H   VAL A 147       1.379   9.605 -29.383  1.00 51.17           H\nATOM   2488  HA  VAL A 147       1.029  12.450 -28.542  1.00 49.42           H\nATOM   2489  HB  VAL A 147      -0.085   9.834 -27.411  1.00 50.28           H\nATOM   2490 HG11 VAL A 147      -1.427  11.280 -25.854  1.00 46.10           H\nATOM   2491 HG12 VAL A 147       0.283  11.322 -25.496  1.00 46.10           H\nATOM   2492 HG13 VAL A 147      -0.470  12.669 -26.348  1.00 46.10           H\nATOM   2493 HG21 VAL A 147      -2.317  10.771 -28.043  1.00 46.30           H\nATOM   2494 HG22 VAL A 147      -1.508  12.111 -28.848  1.00 46.30           H\nATOM   2495 HG23 VAL A 147      -1.300  10.466 -29.438  1.00 46.30           H\nATOM   2496  N   LEU A 148       2.877  12.299 -26.844  1.00 48.99           N\nATOM   2497  CA  LEU A 148       3.936  12.290 -25.834  1.00 47.89           C\nATOM   2498  C   LEU A 148       3.324  12.684 -24.484  1.00 47.68           C\nATOM   2499  O   LEU A 148       2.445  13.549 -24.445  1.00 47.55           O\nATOM   2500  CB  LEU A 148       5.050  13.283 -26.235  1.00 48.34           C\nATOM   2501  CG  LEU A 148       5.724  13.006 -27.596  1.00 46.82           C\nATOM   2502  CD1 LEU A 148       6.758  14.103 -27.910  1.00 47.75           C\nATOM   2503  CD2 LEU A 148       6.346  11.597 -27.672  1.00 41.93           C\nATOM   2504  H   LEU A 148       2.513  13.206 -27.097  1.00 48.99           H\nATOM   2505  HA  LEU A 148       4.372  11.295 -25.732  1.00 47.89           H\nATOM   2506  HB3 LEU A 148       5.816  13.284 -25.457  1.00 48.34           H\nATOM   2507  HB2 LEU A 148       4.638  14.293 -26.257  1.00 48.34           H\nATOM   2508  HG  LEU A 148       4.966  13.062 -28.379  1.00 46.82           H\nATOM   2509 HD11 LEU A 148       7.490  13.783 -28.651  1.00 47.75           H\nATOM   2510 HD12 LEU A 148       6.270  14.994 -28.306  1.00 47.75           H\nATOM   2511 HD13 LEU A 148       7.305  14.401 -27.015  1.00 47.75           H\nATOM   2512 HD21 LEU A 148       7.296  11.593 -28.203  1.00 41.93           H\nATOM   2513 HD22 LEU A 148       6.534  11.179 -26.682  1.00 41.93           H\nATOM   2514 HD23 LEU A 148       5.684  10.909 -28.198  1.00 41.93           H\nATOM   2515  N   HIS A 149       3.821  12.065 -23.401  1.00 47.67           N\nATOM   2516  CA  HIS A 149       3.416  12.385 -22.032  1.00 48.82           C\nATOM   2517  C   HIS A 149       4.008  13.726 -21.573  1.00 48.79           C\nATOM   2518  O   HIS A 149       3.258  14.580 -21.110  1.00 49.25           O\nATOM   2519  CB  HIS A 149       3.799  11.235 -21.083  1.00 48.84           C\nATOM   2520  CG  HIS A 149       3.074  11.285 -19.761  1.00 50.60           C\nATOM   2521  ND1 HIS A 149       3.362  12.225 -18.767  1.00 49.94           N\nATOM   2522  CD2 HIS A 149       2.039  10.490 -19.324  1.00 48.91           C\nATOM   2523  CE1 HIS A 149       2.495  11.976 -17.796  1.00 49.67           C\nATOM   2524  NE2 HIS A 149       1.681  10.959 -18.073  1.00 49.87           N\nATOM   2525  H   HIS A 149       4.568  11.389 -23.504  1.00 47.67           H\nATOM   2526  HA  HIS A 149       2.328  12.473 -22.029  1.00 48.82           H\nATOM   2527  HB3 HIS A 149       4.875  11.220 -20.904  1.00 48.84           H\nATOM   2528  HB2 HIS A 149       3.560  10.279 -21.550  1.00 48.84           H\nATOM   2529  HD2 HIS A 149       1.530   9.675 -19.814  1.00 48.91           H\nATOM   2530  HE1 HIS A 149       2.443  12.546 -16.883  1.00 49.67           H\nATOM   2531  HE2 HIS A 149       0.932  10.618 -17.484  1.00 49.87           H\nATOM   2532  N   ARG A 150       5.332  13.886 -21.742  1.00 50.74           N\nATOM   2533  CA  ARG A 150       6.102  15.114 -21.506  1.00 51.82           C\nATOM   2534  C   ARG A 150       6.258  15.527 -20.024  1.00 52.77           C\nATOM   2535  O   ARG A 150       6.892  16.551 -19.775  1.00 52.32           O\nATOM   2536  CB  ARG A 150       5.595  16.276 -22.408  1.00 51.87           C\nATOM   2537  CG  ARG A 150       5.568  15.894 -23.903  1.00 54.15           C\nATOM   2538  CD  ARG A 150       5.222  17.023 -24.886  1.00 54.58           C\nATOM   2539  NE  ARG A 150       3.791  17.361 -24.928  1.00 56.89           N\nATOM   2540  CZ  ARG A 150       3.173  18.087 -25.878  1.00 61.38           C\nATOM   2541  NH1 ARG A 150       3.816  18.603 -26.931  1.00 63.49           N\nATOM   2542  NH2 ARG A 150       1.863  18.312 -25.782  1.00 60.00           N1+\nATOM   2543  H   ARG A 150       5.869  13.108 -22.105  1.00 50.74           H\nATOM   2544  HA  ARG A 150       7.114  14.874 -21.833  1.00 51.82           H\nATOM   2545  HB3 ARG A 150       6.251  17.138 -22.286  1.00 51.87           H\nATOM   2546  HB2 ARG A 150       4.608  16.612 -22.090  1.00 51.87           H\nATOM   2547  HG3 ARG A 150       4.796  15.134 -24.005  1.00 54.15           H\nATOM   2548  HG2 ARG A 150       6.491  15.410 -24.212  1.00 54.15           H\nATOM   2549  HD3 ARG A 150       5.649  16.832 -25.870  1.00 54.58           H\nATOM   2550  HD2 ARG A 150       5.675  17.940 -24.517  1.00 54.58           H\nATOM   2551  HE  ARG A 150       3.232  17.021 -24.155  1.00 56.89           H\nATOM   2552 HH12 ARG A 150       3.310  19.136 -27.631  1.00 63.49           H\nATOM   2553 HH11 ARG A 150       4.804  18.430 -27.072  1.00 63.49           H\nATOM   2554 HH22 ARG A 150       1.400  18.903 -26.464  1.00 60.00           H\nATOM   2555 HH21 ARG A 150       1.346  17.956 -24.988  1.00 60.00           H\nATOM   2556  N   ASP A 151       5.732  14.735 -19.070  1.00 52.99           N\nATOM   2557  CA  ASP A 151       5.790  15.020 -17.633  1.00 54.08           C\nATOM   2558  C   ASP A 151       5.644  13.709 -16.827  1.00 53.44           C\nATOM   2559  O   ASP A 151       4.814  13.632 -15.920  1.00 51.89           O\nATOM   2560  CB  ASP A 151       4.774  16.136 -17.234  1.00 54.42           C\nATOM   2561  CG  ASP A 151       4.874  16.727 -15.813  1.00 61.37           C\nATOM   2562  OD1 ASP A 151       5.930  16.575 -15.159  1.00 65.15           O\nATOM   2563  OD2 ASP A 151       3.913  17.432 -15.437  1.00 69.39           O1-\nATOM   2564  H   ASP A 151       5.227  13.900 -19.336  1.00 52.99           H\nATOM   2565  HA  ASP A 151       6.798  15.380 -17.419  1.00 54.08           H\nATOM   2566  HB3 ASP A 151       3.760  15.765 -17.396  1.00 54.42           H\nATOM   2567  HB2 ASP A 151       4.871  16.971 -17.929  1.00 54.42           H\nATOM   2568  N   LEU A 152       6.437  12.680 -17.180  1.00 52.73           N\nATOM   2569  CA  LEU A 152       6.454  11.393 -16.475  1.00 52.36           C\nATOM   2570  C   LEU A 152       7.199  11.491 -15.134  1.00 50.92           C\nATOM   2571  O   LEU A 152       8.299  12.040 -15.073  1.00 49.63           O\nATOM   2572  CB  LEU A 152       7.072  10.299 -17.373  1.00 53.22           C\nATOM   2573  CG  LEU A 152       6.045   9.594 -18.281  1.00 57.16           C\nATOM   2574  CD1 LEU A 152       6.737   8.770 -19.380  1.00 55.28           C\nATOM   2575  CD2 LEU A 152       5.027   8.756 -17.476  1.00 56.87           C\nATOM   2576  H   LEU A 152       7.101  12.790 -17.936  1.00 52.73           H\nATOM   2577  HA  LEU A 152       5.419  11.122 -16.259  1.00 52.36           H\nATOM   2578  HB3 LEU A 152       7.567   9.533 -16.772  1.00 53.22           H\nATOM   2579  HB2 LEU A 152       7.858  10.750 -17.978  1.00 53.22           H\nATOM   2580  HG  LEU A 152       5.498  10.384 -18.790  1.00 57.16           H\nATOM   2581 HD11 LEU A 152       6.263   8.953 -20.344  1.00 55.28           H\nATOM   2582 HD12 LEU A 152       7.788   9.034 -19.482  1.00 55.28           H\nATOM   2583 HD13 LEU A 152       6.698   7.698 -19.191  1.00 55.28           H\nATOM   2584 HD21 LEU A 152       4.951   7.728 -17.830  1.00 56.87           H\nATOM   2585 HD22 LEU A 152       5.286   8.710 -16.418  1.00 56.87           H\nATOM   2586 HD23 LEU A 152       4.030   9.190 -17.544  1.00 56.87           H\nATOM   2587  N   LYS A 153       6.559  10.930 -14.098  1.00 50.01           N\nATOM   2588  CA  LYS A 153       6.977  10.929 -12.695  1.00 50.11           C\nATOM   2589  C   LYS A 153       6.032   9.986 -11.910  1.00 48.70           C\nATOM   2590  O   LYS A 153       4.913   9.762 -12.378  1.00 49.43           O\nATOM   2591  CB  LYS A 153       6.981  12.379 -12.136  1.00 49.08           C\nATOM   2592  CG  LYS A 153       5.621  13.106 -12.197  1.00 51.78           C\nATOM   2593  CD  LYS A 153       5.741  14.616 -11.943  1.00 57.35           C\nATOM   2594  CE  LYS A 153       4.403  15.341 -12.155  1.00 60.44           C\nATOM   2595  NZ  LYS A 153       4.535  16.805 -12.055  1.00 62.82           N1+\nATOM   2596  H   LYS A 153       5.665  10.487 -14.263  1.00 50.01           H\nATOM   2597  HA  LYS A 153       7.992  10.534 -12.688  1.00 50.11           H\nATOM   2598  HB3 LYS A 153       7.719  12.963 -12.686  1.00 49.08           H\nATOM   2599  HB2 LYS A 153       7.337  12.382 -11.106  1.00 49.08           H\nATOM   2600  HG3 LYS A 153       4.934  12.668 -11.472  1.00 51.78           H\nATOM   2601  HG2 LYS A 153       5.162  12.957 -13.174  1.00 51.78           H\nATOM   2602  HD3 LYS A 153       6.500  15.033 -12.607  1.00 57.35           H\nATOM   2603  HD2 LYS A 153       6.097  14.780 -10.924  1.00 57.35           H\nATOM   2604  HE3 LYS A 153       3.660  14.994 -11.436  1.00 60.44           H\nATOM   2605  HE2 LYS A 153       4.021  15.121 -13.150  1.00 60.44           H\nATOM   2606  HZ1 LYS A 153       5.160  17.124 -12.784  1.00 62.82           H\nATOM   2607  HZ2 LYS A 153       3.630  17.230 -12.201  1.00 62.82           H\nATOM   2608  HZ3 LYS A 153       4.894  17.065 -11.149  1.00 62.82           H\nATOM   2609  N   PRO A 154       6.465   9.458 -10.736  1.00 47.39           N\nATOM   2610  CA  PRO A 154       5.668   8.515  -9.915  1.00 47.77           C\nATOM   2611  C   PRO A 154       4.240   8.947  -9.525  1.00 48.22           C\nATOM   2612  O   PRO A 154       3.367   8.087  -9.427  1.00 49.05           O\nATOM   2613  CB  PRO A 154       6.535   8.288  -8.665  1.00 47.71           C\nATOM   2614  CG  PRO A 154       7.954   8.531  -9.129  1.00 45.56           C\nATOM   2615  CD  PRO A 154       7.792   9.649 -10.151  1.00 46.45           C\nATOM   2616  HA  PRO A 154       5.610   7.585 -10.482  1.00 47.77           H\nATOM   2617  HB3 PRO A 154       6.417   7.293  -8.239  1.00 47.71           H\nATOM   2618  HB2 PRO A 154       6.292   9.011  -7.886  1.00 47.71           H\nATOM   2619  HG3 PRO A 154       8.333   7.632  -9.615  1.00 45.56           H\nATOM   2620  HG2 PRO A 154       8.636   8.783  -8.316  1.00 45.56           H\nATOM   2621  HD2 PRO A 154       7.828  10.621  -9.658  1.00 46.45           H\nATOM   2622  HD3 PRO A 154       8.597   9.594 -10.879  1.00 46.45           H\nATOM   2623  N   ALA A 155       4.018  10.258  -9.329  1.00 49.07           N\nATOM   2624  CA  ALA A 155       2.710  10.833  -8.993  1.00 50.04           C\nATOM   2625  C   ALA A 155       1.673  10.735 -10.128  1.00 50.73           C\nATOM   2626  O   ALA A 155       0.477  10.706  -9.842  1.00 51.58           O\nATOM   2627  CB  ALA A 155       2.910  12.295  -8.569  1.00 48.64           C\nATOM   2628  H   ALA A 155       4.782  10.912  -9.419  1.00 49.07           H\nATOM   2629  HA  ALA A 155       2.311  10.283  -8.138  1.00 50.04           H\nATOM   2630  HB1 ALA A 155       1.963  12.756  -8.284  1.00 48.64           H\nATOM   2631  HB2 ALA A 155       3.577  12.364  -7.709  1.00 48.64           H\nATOM   2632  HB3 ALA A 155       3.340  12.891  -9.375  1.00 48.64           H\nATOM   2633  N   ASN A 156       2.157  10.670 -11.381  1.00 51.16           N\nATOM   2634  CA  ASN A 156       1.363  10.555 -12.607  1.00 52.02           C\nATOM   2635  C   ASN A 156       1.195   9.095 -13.071  1.00 51.35           C\nATOM   2636  O   ASN A 156       0.417   8.868 -13.998  1.00 51.38           O\nATOM   2637  CB  ASN A 156       2.017  11.451 -13.691  1.00 53.90           C\nATOM   2638  CG  ASN A 156       1.765  12.955 -13.493  1.00 55.57           C\nATOM   2639  OD1 ASN A 156       1.222  13.391 -12.479  1.00 60.84           O\nATOM   2640  ND2 ASN A 156       2.146  13.767 -14.478  1.00 58.02           N\nATOM   2641  H   ASN A 156       3.159  10.673 -11.515  1.00 51.16           H\nATOM   2642  HA  ASN A 156       0.368  10.941 -12.385  1.00 52.02           H\nATOM   2643  HB3 ASN A 156       1.619  11.197 -14.672  1.00 53.90           H\nATOM   2644  HB2 ASN A 156       3.090  11.265 -13.755  1.00 53.90           H\nATOM   2645 HD22 ASN A 156       1.951  14.757 -14.421  1.00 58.02           H\nATOM   2646 HD21 ASN A 156       2.621  13.410 -15.295  1.00 58.02           H\nATOM   2647  N   ILE A 157       1.859   8.131 -12.407  1.00 51.38           N\nATOM   2648  CA  ILE A 157       1.630   6.702 -12.611  1.00 51.11           C\nATOM   2649  C   ILE A 157       0.691   6.217 -11.489  1.00 49.75           C\nATOM   2650  O   ILE A 157       1.156   5.865 -10.403  1.00 49.94           O\nATOM   2651  CB  ILE A 157       2.947   5.864 -12.567  1.00 50.95           C\nATOM   2652  CG1 ILE A 157       4.063   6.411 -13.486  1.00 55.14           C\nATOM   2653  CG2 ILE A 157       2.680   4.372 -12.869  1.00 50.61           C\nATOM   2654  CD1 ILE A 157       3.690   6.547 -14.966  1.00 53.55           C\nATOM   2655  H   ILE A 157       2.471   8.380 -11.642  1.00 51.38           H\nATOM   2656  HA  ILE A 157       1.144   6.518 -13.572  1.00 51.11           H\nATOM   2657  HB  ILE A 157       3.365   5.917 -11.561  1.00 50.95           H\nATOM   2658 HG13 ILE A 157       4.950   5.783 -13.396  1.00 55.14           H\nATOM   2659 HG12 ILE A 157       4.375   7.387 -13.121  1.00 55.14           H\nATOM   2660 HG21 ILE A 157       3.608   3.812 -12.942  1.00 50.61           H\nATOM   2661 HG22 ILE A 157       2.078   3.892 -12.098  1.00 50.61           H\nATOM   2662 HG23 ILE A 157       2.159   4.248 -13.816  1.00 50.61           H\nATOM   2663 HD11 ILE A 157       4.579   6.487 -15.593  1.00 53.55           H\nATOM   2664 HD12 ILE A 157       3.021   5.753 -15.284  1.00 53.55           H\nATOM   2665 HD13 ILE A 157       3.200   7.501 -15.166  1.00 53.55           H\nATOM   2666  N   LEU A 158      -0.624   6.229 -11.765  1.00 48.83           N\nATOM   2667  CA  LEU A 158      -1.647   5.747 -10.835  1.00 48.42           C\nATOM   2668  C   LEU A 158      -1.703   4.209 -10.834  1.00 49.02           C\nATOM   2669  O   LEU A 158      -1.287   3.583 -11.809  1.00 46.67           O\nATOM   2670  CB  LEU A 158      -3.044   6.335 -11.156  1.00 48.20           C\nATOM   2671  CG  LEU A 158      -3.126   7.797 -11.656  1.00 50.84           C\nATOM   2672  CD1 LEU A 158      -4.601   8.237 -11.770  1.00 46.64           C\nATOM   2673  CD2 LEU A 158      -2.283   8.794 -10.837  1.00 45.73           C\nATOM   2674  H   LEU A 158      -0.950   6.520 -12.677  1.00 48.83           H\nATOM   2675  HA  LEU A 158      -1.377   6.073  -9.834  1.00 48.42           H\nATOM   2676  HB3 LEU A 158      -3.643   6.247 -10.250  1.00 48.20           H\nATOM   2677  HB2 LEU A 158      -3.541   5.707 -11.892  1.00 48.20           H\nATOM   2678  HG  LEU A 158      -2.721   7.805 -12.668  1.00 50.84           H\nATOM   2679 HD11 LEU A 158      -4.795   8.754 -12.708  1.00 46.64           H\nATOM   2680 HD12 LEU A 158      -5.287   7.391 -11.733  1.00 46.64           H\nATOM   2681 HD13 LEU A 158      -4.893   8.915 -10.969  1.00 46.64           H\nATOM   2682 HD21 LEU A 158      -2.830   9.703 -10.598  1.00 45.73           H\nATOM   2683 HD22 LEU A 158      -1.938   8.366  -9.899  1.00 45.73           H\nATOM   2684 HD23 LEU A 158      -1.400   9.102 -11.397  1.00 45.73           H\nATOM   2685  N   VAL A 159      -2.238   3.635  -9.747  1.00 49.95           N\nATOM   2686  CA  VAL A 159      -2.484   2.201  -9.605  1.00 50.60           C\nATOM   2687  C   VAL A 159      -3.868   2.021  -8.959  1.00 51.58           C\nATOM   2688  O   VAL A 159      -4.139   2.606  -7.910  1.00 52.35           O\nATOM   2689  CB  VAL A 159      -1.405   1.495  -8.727  1.00 50.63           C\nATOM   2690  CG1 VAL A 159      -1.684  -0.007  -8.500  1.00 50.60           C\nATOM   2691  CG2 VAL A 159       0.015   1.660  -9.303  1.00 48.69           C\nATOM   2692  H   VAL A 159      -2.557   4.212  -8.979  1.00 49.95           H\nATOM   2693  HA  VAL A 159      -2.503   1.726 -10.588  1.00 50.60           H\nATOM   2694  HB  VAL A 159      -1.394   1.972  -7.747  1.00 50.63           H\nATOM   2695 HG11 VAL A 159      -0.864  -0.482  -7.961  1.00 50.60           H\nATOM   2696 HG12 VAL A 159      -2.584  -0.174  -7.910  1.00 50.60           H\nATOM   2697 HG13 VAL A 159      -1.801  -0.533  -9.448  1.00 50.60           H\nATOM   2698 HG21 VAL A 159       0.750   1.131  -8.697  1.00 48.69           H\nATOM   2699 HG22 VAL A 159       0.076   1.268 -10.318  1.00 48.69           H\nATOM   2700 HG23 VAL A 159       0.322   2.705  -9.328  1.00 48.69           H\nATOM   2701  N   MET A 160      -4.722   1.214  -9.605  1.00 52.73           N\nATOM   2702  CA  MET A 160      -6.071   0.885  -9.146  1.00 52.71           C\nATOM   2703  C   MET A 160      -6.046   0.008  -7.881  1.00 53.51           C\nATOM   2704  O   MET A 160      -5.240  -0.919  -7.795  1.00 49.86           O\nATOM   2705  CB  MET A 160      -6.813   0.152 -10.279  1.00 53.40           C\nATOM   2706  CG  MET A 160      -7.057   0.975 -11.557  1.00 49.52           C\nATOM   2707  SD  MET A 160      -8.166   2.404 -11.416  1.00 53.85           S\nATOM   2708  CE  MET A 160      -9.754   1.569 -11.170  1.00 49.55           C\nATOM   2709  H   MET A 160      -4.428   0.768 -10.465  1.00 52.73           H\nATOM   2710  HA  MET A 160      -6.597   1.813  -8.916  1.00 52.71           H\nATOM   2711  HB3 MET A 160      -7.765  -0.238  -9.918  1.00 53.40           H\nATOM   2712  HB2 MET A 160      -6.216  -0.716 -10.551  1.00 53.40           H\nATOM   2713  HG3 MET A 160      -7.453   0.321 -12.334  1.00 49.52           H\nATOM   2714  HG2 MET A 160      -6.108   1.346 -11.937  1.00 49.52           H\nATOM   2715  HE1 MET A 160     -10.566   2.296 -11.185  1.00 49.55           H\nATOM   2716  HE2 MET A 160      -9.932   0.841 -11.961  1.00 49.55           H\nATOM   2717  HE3 MET A 160      -9.771   1.056 -10.210  1.00 49.55           H\nATOM   2718  N   GLY A 161      -6.969   0.295  -6.951  1.00 55.30           N\nATOM   2719  CA  GLY A 161      -7.195  -0.487  -5.736  1.00 56.11           C\nATOM   2720  C   GLY A 161      -8.213  -1.603  -6.014  1.00 56.83           C\nATOM   2721  O   GLY A 161      -8.392  -2.028  -7.157  1.00 55.73           O\nATOM   2722  H   GLY A 161      -7.621   1.051  -7.120  1.00 55.30           H\nATOM   2723  HA3 GLY A 161      -7.580   0.176  -4.961  1.00 56.11           H\nATOM   2724  HA2 GLY A 161      -6.265  -0.917  -5.360  1.00 56.11           H\nATOM   2725  N   GLU A 162      -8.874  -2.077  -4.944  1.00 58.68           N\nATOM   2726  CA  GLU A 162      -9.911  -3.118  -4.951  1.00 58.64           C\nATOM   2727  C   GLU A 162     -11.058  -2.825  -5.941  1.00 58.37           C\nATOM   2728  O   GLU A 162     -11.523  -1.686  -6.009  1.00 57.26           O\nATOM   2729  CB  GLU A 162     -10.479  -3.272  -3.519  1.00 60.15           C\nATOM   2730  CG  GLU A 162      -9.449  -3.647  -2.422  1.00 60.39           C\nATOM   2731  CD  GLU A 162      -8.889  -5.079  -2.463  1.00 64.75           C\nATOM   2732  OE1 GLU A 162      -9.440  -5.932  -3.195  1.00 63.47           O\nATOM   2733  OE2 GLU A 162      -7.899  -5.312  -1.736  1.00 67.53           O1-\nATOM   2734  H   GLU A 162      -8.674  -1.683  -4.037  1.00 58.68           H\nATOM   2735  HA  GLU A 162      -9.428  -4.050  -5.253  1.00 58.64           H\nATOM   2736  HB3 GLU A 162     -11.297  -3.995  -3.519  1.00 60.15           H\nATOM   2737  HB2 GLU A 162     -10.943  -2.329  -3.227  1.00 60.15           H\nATOM   2738  HG3 GLU A 162      -9.929  -3.525  -1.450  1.00 60.39           H\nATOM   2739  HG2 GLU A 162      -8.619  -2.940  -2.429  1.00 60.39           H\nATOM   2740  N   GLY A 163     -11.488  -3.864  -6.674  1.00 59.50           N\nATOM   2741  CA  GLY A 163     -12.515  -3.769  -7.709  1.00 59.67           C\nATOM   2742  C   GLY A 163     -12.108  -4.610  -8.935  1.00 60.23           C\nATOM   2743  O   GLY A 163     -11.194  -5.432  -8.839  1.00 60.88           O\nATOM   2744  H   GLY A 163     -11.068  -4.776  -6.542  1.00 59.50           H\nATOM   2745  HA3 GLY A 163     -12.668  -2.732  -8.015  1.00 59.67           H\nATOM   2746  HA2 GLY A 163     -13.457  -4.141  -7.308  1.00 59.67           H\nATOM   2747  N   PRO A 164     -12.799  -4.436 -10.087  1.00 60.62           N\nATOM   2748  CA  PRO A 164     -12.577  -5.230 -11.317  1.00 60.66           C\nATOM   2749  C   PRO A 164     -11.181  -5.143 -11.963  1.00 61.03           C\nATOM   2750  O   PRO A 164     -10.795  -6.084 -12.656  1.00 61.00           O\nATOM   2751  CB  PRO A 164     -13.656  -4.720 -12.290  1.00 60.92           C\nATOM   2752  CG  PRO A 164     -14.737  -4.128 -11.404  1.00 61.20           C\nATOM   2753  CD  PRO A 164     -13.943  -3.536 -10.249  1.00 61.23           C\nATOM   2754  HA  PRO A 164     -12.785  -6.272 -11.066  1.00 60.66           H\nATOM   2755  HB3 PRO A 164     -14.040  -5.507 -12.940  1.00 60.92           H\nATOM   2756  HB2 PRO A 164     -13.256  -3.932 -12.933  1.00 60.92           H\nATOM   2757  HG3 PRO A 164     -15.377  -4.929 -11.031  1.00 61.20           H\nATOM   2758  HG2 PRO A 164     -15.368  -3.401 -11.914  1.00 61.20           H\nATOM   2759  HD2 PRO A 164     -13.571  -2.542 -10.504  1.00 61.23           H\nATOM   2760  HD3 PRO A 164     -14.570  -3.450  -9.361  1.00 61.23           H\nATOM   2761  N   GLU A 165     -10.467  -4.028 -11.741  1.00 60.38           N\nATOM   2762  CA  GLU A 165      -9.161  -3.736 -12.331  1.00 59.00           C\nATOM   2763  C   GLU A 165      -8.070  -3.685 -11.251  1.00 57.92           C\nATOM   2764  O   GLU A 165      -7.219  -2.800 -11.301  1.00 56.84           O\nATOM   2765  CB  GLU A 165      -9.247  -2.417 -13.131  1.00 57.81           C\nATOM   2766  CG  GLU A 165     -10.260  -2.458 -14.291  1.00 57.79           C\nATOM   2767  CD  GLU A 165     -10.151  -1.227 -15.195  1.00 58.53           C\nATOM   2768  OE1 GLU A 165      -9.875  -1.422 -16.400  1.00 55.07           O\nATOM   2769  OE2 GLU A 165     -10.317  -0.102 -14.674  1.00 60.38           O1-\nATOM   2770  H   GLU A 165     -10.841  -3.307 -11.139  1.00 60.38           H\nATOM   2771  HA  GLU A 165      -8.863  -4.526 -13.024  1.00 59.00           H\nATOM   2772  HB3 GLU A 165      -8.266  -2.170 -13.536  1.00 57.81           H\nATOM   2773  HB2 GLU A 165      -9.504  -1.601 -12.452  1.00 57.81           H\nATOM   2774  HG3 GLU A 165     -11.278  -2.513 -13.903  1.00 57.79           H\nATOM   2775  HG2 GLU A 165     -10.107  -3.366 -14.877  1.00 57.79           H\nATOM   2776  N   ARG A 166      -8.111  -4.624 -10.290  1.00 57.10           N\nATOM   2777  CA  ARG A 166      -7.209  -4.696  -9.138  1.00 55.45           C\nATOM   2778  C   ARG A 166      -5.720  -4.698  -9.528  1.00 54.24           C\nATOM   2779  O   ARG A 166      -5.304  -5.555 -10.304  1.00 56.13           O\nATOM   2780  CB  ARG A 166      -7.588  -5.927  -8.293  1.00 56.05           C\nATOM   2781  CG  ARG A 166      -6.920  -5.981  -6.910  1.00 57.75           C\nATOM   2782  CD  ARG A 166      -7.302  -7.259  -6.151  1.00 60.60           C\nATOM   2783  NE  ARG A 166      -6.913  -7.195  -4.735  1.00 61.72           N\nATOM   2784  CZ  ARG A 166      -5.724  -7.463  -4.169  1.00 63.12           C\nATOM   2785  NH1 ARG A 166      -4.652  -7.857  -4.870  1.00 62.01           N\nATOM   2786  NH2 ARG A 166      -5.608  -7.324  -2.846  1.00 64.03           N1+\nATOM   2787  H   ARG A 166      -8.844  -5.318 -10.318  1.00 57.10           H\nATOM   2788  HA  ARG A 166      -7.403  -3.807  -8.543  1.00 55.45           H\nATOM   2789  HB3 ARG A 166      -7.362  -6.840  -8.846  1.00 56.05           H\nATOM   2790  HB2 ARG A 166      -8.668  -5.929  -8.139  1.00 56.05           H\nATOM   2791  HG3 ARG A 166      -7.120  -5.082  -6.324  1.00 57.75           H\nATOM   2792  HG2 ARG A 166      -5.841  -6.003  -7.070  1.00 57.75           H\nATOM   2793  HD3 ARG A 166      -6.759  -8.099  -6.583  1.00 60.60           H\nATOM   2794  HD2 ARG A 166      -8.357  -7.504  -6.269  1.00 60.60           H\nATOM   2795  HE  ARG A 166      -7.647  -6.855  -4.121  1.00 61.72           H\nATOM   2796 HH12 ARG A 166      -3.779  -8.044  -4.397  1.00 62.01           H\nATOM   2797 HH11 ARG A 166      -4.707  -7.967  -5.877  1.00 62.01           H\nATOM   2798 HH22 ARG A 166      -4.728  -7.531  -2.393  1.00 64.03           H\nATOM   2799 HH21 ARG A 166      -6.385  -6.964  -2.304  1.00 64.03           H\nATOM   2800  N   GLY A 167      -4.970  -3.719  -8.992  1.00 51.78           N\nATOM   2801  CA  GLY A 167      -3.533  -3.537  -9.199  1.00 51.04           C\nATOM   2802  C   GLY A 167      -3.134  -3.144 -10.628  1.00 51.38           C\nATOM   2803  O   GLY A 167      -1.946  -3.193 -10.936  1.00 51.98           O\nATOM   2804  H   GLY A 167      -5.416  -3.039  -8.391  1.00 51.78           H\nATOM   2805  HA3 GLY A 167      -2.990  -4.434  -8.911  1.00 51.04           H\nATOM   2806  HA2 GLY A 167      -3.193  -2.743  -8.536  1.00 51.04           H\nATOM   2807  N   ARG A 168      -4.080  -2.760 -11.500  1.00 50.97           N\nATOM   2808  CA  ARG A 168      -3.790  -2.292 -12.854  1.00 50.91           C\nATOM   2809  C   ARG A 168      -3.262  -0.850 -12.818  1.00 47.73           C\nATOM   2810  O   ARG A 168      -3.905   0.013 -12.222  1.00 46.35           O\nATOM   2811  CB  ARG A 168      -5.063  -2.437 -13.712  1.00 50.65           C\nATOM   2812  CG  ARG A 168      -4.915  -2.008 -15.187  1.00 53.92           C\nATOM   2813  CD  ARG A 168      -6.098  -2.447 -16.070  1.00 57.64           C\nATOM   2814  NE  ARG A 168      -6.091  -3.896 -16.340  1.00 58.41           N\nATOM   2815  CZ  ARG A 168      -7.053  -4.621 -16.941  1.00 59.92           C\nATOM   2816  NH1 ARG A 168      -8.207  -4.080 -17.361  1.00 60.17           N\nATOM   2817  NH2 ARG A 168      -6.850  -5.931 -17.125  1.00 63.84           N1+\nATOM   2818  H   ARG A 168      -5.050  -2.746 -11.216  1.00 50.97           H\nATOM   2819  HA  ARG A 168      -3.026  -2.941 -13.287  1.00 50.91           H\nATOM   2820  HB3 ARG A 168      -5.862  -1.840 -13.273  1.00 50.65           H\nATOM   2821  HB2 ARG A 168      -5.396  -3.474 -13.658  1.00 50.65           H\nATOM   2822  HG3 ARG A 168      -4.007  -2.486 -15.560  1.00 53.92           H\nATOM   2823  HG2 ARG A 168      -4.746  -0.937 -15.295  1.00 53.92           H\nATOM   2824  HD3 ARG A 168      -6.182  -1.853 -16.978  1.00 57.64           H\nATOM   2825  HD2 ARG A 168      -7.014  -2.271 -15.508  1.00 57.64           H\nATOM   2826  HE  ARG A 168      -5.257  -4.380 -16.040  1.00 58.41           H\nATOM   2827 HH12 ARG A 168      -8.911  -4.648 -17.810  1.00 60.17           H\nATOM   2828 HH11 ARG A 168      -8.411  -3.104 -17.181  1.00 60.17           H\nATOM   2829 HH22 ARG A 168      -7.557  -6.501 -17.567  1.00 63.84           H\nATOM   2830 HH21 ARG A 168      -5.990  -6.362 -16.820  1.00 63.84           H\nATOM   2831  N   VAL A 169      -2.117  -0.616 -13.478  1.00 47.38           N\nATOM   2832  CA  VAL A 169      -1.542   0.715 -13.685  1.00 46.92           C\nATOM   2833  C   VAL A 169      -2.437   1.546 -14.624  1.00 47.80           C\nATOM   2834  O   VAL A 169      -2.970   0.993 -15.584  1.00 49.00           O\nATOM   2835  CB  VAL A 169      -0.121   0.613 -14.312  1.00 47.94           C\nATOM   2836  CG1 VAL A 169       0.484   1.942 -14.814  1.00 45.01           C\nATOM   2837  CG2 VAL A 169       0.866  -0.063 -13.345  1.00 45.44           C\nATOM   2838  H   VAL A 169      -1.641  -1.382 -13.938  1.00 47.38           H\nATOM   2839  HA  VAL A 169      -1.472   1.206 -12.715  1.00 46.92           H\nATOM   2840  HB  VAL A 169      -0.205  -0.031 -15.183  1.00 47.94           H\nATOM   2841 HG11 VAL A 169       1.524   1.815 -15.116  1.00 45.01           H\nATOM   2842 HG12 VAL A 169      -0.042   2.333 -15.685  1.00 45.01           H\nATOM   2843 HG13 VAL A 169       0.453   2.702 -14.033  1.00 45.01           H\nATOM   2844 HG21 VAL A 169       1.859  -0.149 -13.785  1.00 45.44           H\nATOM   2845 HG22 VAL A 169       0.961   0.514 -12.426  1.00 45.44           H\nATOM   2846 HG23 VAL A 169       0.545  -1.070 -13.075  1.00 45.44           H\nATOM   2847  N   LYS A 170      -2.565   2.848 -14.334  1.00 49.01           N\nATOM   2848  CA  LYS A 170      -3.249   3.828 -15.171  1.00 48.15           C\nATOM   2849  C   LYS A 170      -2.341   5.055 -15.274  1.00 48.50           C\nATOM   2850  O   LYS A 170      -2.164   5.762 -14.283  1.00 47.27           O\nATOM   2851  CB  LYS A 170      -4.608   4.226 -14.551  1.00 48.65           C\nATOM   2852  CG  LYS A 170      -5.635   3.098 -14.391  1.00 48.06           C\nATOM   2853  CD  LYS A 170      -6.182   2.560 -15.716  1.00 47.65           C\nATOM   2854  CE  LYS A 170      -7.273   1.507 -15.486  1.00 44.49           C\nATOM   2855  NZ  LYS A 170      -7.820   1.012 -16.758  1.00 45.56           N1+\nATOM   2856  H   LYS A 170      -2.101   3.220 -13.514  1.00 49.01           H\nATOM   2857  HA  LYS A 170      -3.412   3.437 -16.178  1.00 48.15           H\nATOM   2858  HB3 LYS A 170      -5.052   5.017 -15.156  1.00 48.65           H\nATOM   2859  HB2 LYS A 170      -4.448   4.659 -13.566  1.00 48.65           H\nATOM   2860  HG3 LYS A 170      -6.465   3.474 -13.792  1.00 48.06           H\nATOM   2861  HG2 LYS A 170      -5.200   2.281 -13.817  1.00 48.06           H\nATOM   2862  HD3 LYS A 170      -5.368   2.131 -16.299  1.00 47.65           H\nATOM   2863  HD2 LYS A 170      -6.579   3.387 -16.307  1.00 47.65           H\nATOM   2864  HE3 LYS A 170      -8.090   1.928 -14.899  1.00 44.49           H\nATOM   2865  HE2 LYS A 170      -6.876   0.661 -14.924  1.00 44.49           H\nATOM   2866  HZ1 LYS A 170      -7.081   0.579 -17.295  1.00 45.56           H\nATOM   2867  HZ2 LYS A 170      -8.549   0.333 -16.570  1.00 45.56           H\nATOM   2868  HZ3 LYS A 170      -8.212   1.775 -17.293  1.00 45.56           H\nATOM   2869  N   ILE A 171      -1.784   5.296 -16.468  1.00 45.94           N\nATOM   2870  CA  ILE A 171      -0.975   6.481 -16.747  1.00 44.87           C\nATOM   2871  C   ILE A 171      -1.907   7.685 -16.987  1.00 45.90           C\nATOM   2872  O   ILE A 171      -2.787   7.609 -17.845  1.00 45.78           O\nATOM   2873  CB  ILE A 171      -0.047   6.257 -17.973  1.00 46.09           C\nATOM   2874  CG1 ILE A 171       0.930   5.093 -17.689  1.00 45.88           C\nATOM   2875  CG2 ILE A 171       0.737   7.523 -18.375  1.00 37.44           C\nATOM   2876  CD1 ILE A 171       1.796   4.683 -18.883  1.00 50.99           C\nATOM   2877  H   ILE A 171      -1.940   4.667 -17.245  1.00 45.94           H\nATOM   2878  HA  ILE A 171      -0.340   6.689 -15.882  1.00 44.87           H\nATOM   2879  HB  ILE A 171      -0.667   5.972 -18.825  1.00 46.09           H\nATOM   2880 HG13 ILE A 171       0.396   4.209 -17.343  1.00 45.88           H\nATOM   2881 HG12 ILE A 171       1.579   5.374 -16.864  1.00 45.88           H\nATOM   2882 HG21 ILE A 171       1.402   7.337 -19.217  1.00 37.44           H\nATOM   2883 HG22 ILE A 171       0.072   8.328 -18.684  1.00 37.44           H\nATOM   2884 HG23 ILE A 171       1.346   7.889 -17.548  1.00 37.44           H\nATOM   2885 HD11 ILE A 171       1.881   3.599 -18.947  1.00 50.99           H\nATOM   2886 HD12 ILE A 171       1.392   5.038 -19.830  1.00 50.99           H\nATOM   2887 HD13 ILE A 171       2.800   5.087 -18.764  1.00 50.99           H\nATOM   2888  N   ALA A 172      -1.705   8.747 -16.194  1.00 46.66           N\nATOM   2889  CA  ALA A 172      -2.579   9.916 -16.136  1.00 47.96           C\nATOM   2890  C   ALA A 172      -1.778  11.220 -16.136  1.00 48.52           C\nATOM   2891  O   ALA A 172      -0.570  11.210 -15.903  1.00 48.10           O\nATOM   2892  CB  ALA A 172      -3.434   9.813 -14.865  1.00 48.16           C\nATOM   2893  H   ALA A 172      -0.945   8.739 -15.524  1.00 46.66           H\nATOM   2894  HA  ALA A 172      -3.235   9.940 -17.008  1.00 47.96           H\nATOM   2895  HB1 ALA A 172      -4.162  10.623 -14.801  1.00 48.16           H\nATOM   2896  HB2 ALA A 172      -3.987   8.875 -14.851  1.00 48.16           H\nATOM   2897  HB3 ALA A 172      -2.817   9.853 -13.966  1.00 48.16           H\nATOM   2898  N   ASP A 173      -2.502  12.320 -16.401  1.00 50.86           N\nATOM   2899  CA  ASP A 173      -2.030  13.707 -16.424  1.00 53.92           C\nATOM   2900  C   ASP A 173      -0.868  13.902 -17.420  1.00 55.30           C\nATOM   2901  O   ASP A 173       0.207  14.378 -17.052  1.00 55.90           O\nATOM   2902  CB  ASP A 173      -1.729  14.250 -15.001  1.00 55.29           C\nATOM   2903  CG  ASP A 173      -1.587  15.779 -14.852  1.00 60.75           C\nATOM   2904  OD1 ASP A 173      -2.260  16.517 -15.608  1.00 71.98           O\nATOM   2905  OD2 ASP A 173      -0.941  16.184 -13.861  1.00 67.50           O1-\nATOM   2906  H   ASP A 173      -3.490  12.208 -16.578  1.00 50.86           H\nATOM   2907  HA  ASP A 173      -2.871  14.268 -16.833  1.00 53.92           H\nATOM   2908  HB3 ASP A 173      -0.840  13.758 -14.606  1.00 55.29           H\nATOM   2909  HB2 ASP A 173      -2.540  13.936 -14.346  1.00 55.29           H\nATOM   2910  N   MET A 174      -1.128  13.519 -18.681  1.00 55.71           N\nATOM   2911  CA  MET A 174      -0.297  13.850 -19.836  1.00 57.26           C\nATOM   2912  C   MET A 174      -0.285  15.378 -20.016  1.00 58.77           C\nATOM   2913  O   MET A 174      -1.342  16.006 -19.918  1.00 59.05           O\nATOM   2914  CB  MET A 174      -0.867  13.178 -21.108  1.00 57.61           C\nATOM   2915  CG  MET A 174      -0.689  11.651 -21.235  1.00 57.30           C\nATOM   2916  SD  MET A 174      -1.486  10.571 -20.007  1.00 60.56           S\nATOM   2917  CE  MET A 174      -3.234  10.793 -20.425  1.00 57.19           C\nATOM   2918  H   MET A 174      -2.021  13.098 -18.891  1.00 55.71           H\nATOM   2919  HA  MET A 174       0.722  13.499 -19.663  1.00 57.26           H\nATOM   2920  HB3 MET A 174      -0.402  13.629 -21.987  1.00 57.61           H\nATOM   2921  HB2 MET A 174      -1.923  13.416 -21.190  1.00 57.61           H\nATOM   2922  HG3 MET A 174       0.374  11.422 -21.238  1.00 57.30           H\nATOM   2923  HG2 MET A 174      -1.050  11.340 -22.216  1.00 57.30           H\nATOM   2924  HE1 MET A 174      -3.850  10.141 -19.807  1.00 57.19           H\nATOM   2925  HE2 MET A 174      -3.542  11.823 -20.250  1.00 57.19           H\nATOM   2926  HE3 MET A 174      -3.411  10.543 -21.472  1.00 57.19           H\nATOM   2927  N   GLY A 175       0.901  15.944 -20.286  1.00 60.83           N\nATOM   2928  CA  GLY A 175       1.085  17.361 -20.581  1.00 61.58           C\nATOM   2929  C   GLY A 175       0.599  17.596 -22.010  1.00 62.35           C\nATOM   2930  O   GLY A 175       1.387  17.490 -22.945  1.00 62.54           O\nATOM   2931  H   GLY A 175       1.723  15.358 -20.361  1.00 60.83           H\nATOM   2932  HA3 GLY A 175       2.146  17.602 -20.509  1.00 61.58           H\nATOM   2933  HA2 GLY A 175       0.550  17.992 -19.869  1.00 61.58           H\nATOM   2934  N   PHE A 176      -0.711  17.851 -22.162  1.00 63.42           N\nATOM   2935  CA  PHE A 176      -1.426  17.855 -23.437  1.00 64.95           C\nATOM   2936  C   PHE A 176      -1.189  19.072 -24.340  1.00 65.43           C\nATOM   2937  O   PHE A 176      -1.467  18.958 -25.531  1.00 67.66           O\nATOM   2938  CB  PHE A 176      -2.932  17.619 -23.195  1.00 64.87           C\nATOM   2939  CG  PHE A 176      -3.325  16.169 -22.968  1.00 66.11           C\nATOM   2940  CD1 PHE A 176      -3.100  15.213 -23.980  1.00 65.81           C\nATOM   2941  CD2 PHE A 176      -3.961  15.766 -21.775  1.00 66.14           C\nATOM   2942  CE1 PHE A 176      -3.527  13.903 -23.811  1.00 68.02           C\nATOM   2943  CE2 PHE A 176      -4.397  14.455 -21.632  1.00 66.97           C\nATOM   2944  CZ  PHE A 176      -4.188  13.531 -22.650  1.00 66.46           C\nATOM   2945  H   PHE A 176      -1.294  17.882 -21.336  1.00 63.42           H\nATOM   2946  HA  PHE A 176      -1.043  17.013 -24.015  1.00 64.95           H\nATOM   2947  HB3 PHE A 176      -3.520  17.968 -24.045  1.00 64.87           H\nATOM   2948  HB2 PHE A 176      -3.267  18.220 -22.347  1.00 64.87           H\nATOM   2949  HD1 PHE A 176      -2.607  15.503 -24.894  1.00 65.81           H\nATOM   2950  HD2 PHE A 176      -4.139  16.477 -20.982  1.00 66.14           H\nATOM   2951  HE1 PHE A 176      -3.357  13.175 -24.591  1.00 68.02           H\nATOM   2952  HE2 PHE A 176      -4.901  14.153 -20.726  1.00 66.97           H\nATOM   2953  HZ  PHE A 176      -4.528  12.514 -22.533  1.00 66.46           H\nATOM   2954  N   ALA A 177      -0.656  20.178 -23.798  1.00 65.43           N\nATOM   2955  CA  ALA A 177      -0.338  21.380 -24.564  1.00 66.24           C\nATOM   2956  C   ALA A 177       0.979  21.987 -24.088  1.00 66.19           C\nATOM   2957  O   ALA A 177       1.084  22.395 -22.932  1.00 66.90           O\nATOM   2958  CB  ALA A 177      -1.474  22.395 -24.431  1.00 65.29           C\nATOM   2959  H   ALA A 177      -0.434  20.202 -22.813  1.00 65.43           H\nATOM   2960  HA  ALA A 177      -0.234  21.139 -25.623  1.00 66.24           H\nATOM   2961  HB1 ALA A 177      -1.190  23.363 -24.844  1.00 65.29           H\nATOM   2962  HB2 ALA A 177      -2.359  22.055 -24.967  1.00 65.29           H\nATOM   2963  HB3 ALA A 177      -1.733  22.552 -23.386  1.00 65.29           H\nATOM   2964  N   ARG A 178       1.939  22.067 -25.016  1.00 66.17           N\nATOM   2965  CA  ARG A 178       3.201  22.780 -24.864  1.00 66.46           C\nATOM   2966  C   ARG A 178       3.387  23.588 -26.152  1.00 66.92           C\nATOM   2967  O   ARG A 178       3.355  22.995 -27.230  1.00 66.75           O\nATOM   2968  CB  ARG A 178       4.355  21.771 -24.653  1.00 66.09           C\nATOM   2969  CG  ARG A 178       4.252  20.890 -23.388  1.00 66.20           C\nATOM   2970  CD  ARG A 178       4.449  21.662 -22.069  1.00 66.31           C\nATOM   2971  NE  ARG A 178       4.323  20.800 -20.879  1.00 67.71           N\nATOM   2972  CZ  ARG A 178       3.244  20.586 -20.099  1.00 69.20           C\nATOM   2973  NH1 ARG A 178       2.048  21.135 -20.352  1.00 66.70           N\nATOM   2974  NH2 ARG A 178       3.373  19.802 -19.021  1.00 65.42           N1+\nATOM   2975  H   ARG A 178       1.761  21.705 -25.945  1.00 66.17           H\nATOM   2976  HA  ARG A 178       3.155  23.475 -24.024  1.00 66.46           H\nATOM   2977  HB3 ARG A 178       5.302  22.313 -24.627  1.00 66.09           H\nATOM   2978  HB2 ARG A 178       4.421  21.113 -25.520  1.00 66.09           H\nATOM   2979  HG3 ARG A 178       5.064  20.169 -23.469  1.00 66.20           H\nATOM   2980  HG2 ARG A 178       3.346  20.283 -23.368  1.00 66.20           H\nATOM   2981  HD3 ARG A 178       3.844  22.566 -22.010  1.00 66.31           H\nATOM   2982  HD2 ARG A 178       5.485  22.000 -22.037  1.00 66.31           H\nATOM   2983  HE  ARG A 178       5.177  20.327 -20.609  1.00 67.71           H\nATOM   2984 HH12 ARG A 178       1.271  20.990 -19.724  1.00 66.70           H\nATOM   2985 HH11 ARG A 178       1.922  21.725 -21.165  1.00 66.70           H\nATOM   2986 HH22 ARG A 178       2.594  19.639 -18.399  1.00 65.42           H\nATOM   2987 HH21 ARG A 178       4.273  19.404 -18.793  1.00 65.42           H\nATOM   2988  N   LEU A 179       3.556  24.918 -26.026  1.00 67.10           N\nATOM   2989  CA  LEU A 179       3.674  25.862 -27.146  1.00 67.55           C\nATOM   2990  C   LEU A 179       4.802  25.470 -28.111  1.00 66.64           C\nATOM   2991  O   LEU A 179       5.960  25.445 -27.698  1.00 65.02           O\nATOM   2992  CB  LEU A 179       3.947  27.285 -26.613  1.00 68.92           C\nATOM   2993  CG  LEU A 179       2.791  27.959 -25.852  1.00 71.31           C\nATOM   2994  CD1 LEU A 179       3.308  29.220 -25.130  1.00 72.57           C\nATOM   2995  CD2 LEU A 179       1.580  28.255 -26.767  1.00 73.82           C\nATOM   2996  H   LEU A 179       3.577  25.328 -25.104  1.00 67.10           H\nATOM   2997  HA  LEU A 179       2.728  25.849 -27.688  1.00 67.55           H\nATOM   2998  HB3 LEU A 179       4.233  27.941 -27.437  1.00 68.92           H\nATOM   2999  HB2 LEU A 179       4.818  27.236 -25.960  1.00 68.92           H\nATOM   3000  HG  LEU A 179       2.451  27.270 -25.078  1.00 71.31           H\nATOM   3001 HD11 LEU A 179       2.690  30.099 -25.311  1.00 72.57           H\nATOM   3002 HD12 LEU A 179       3.333  29.058 -24.053  1.00 72.57           H\nATOM   3003 HD13 LEU A 179       4.321  29.486 -25.433  1.00 72.57           H\nATOM   3004 HD21 LEU A 179       0.695  27.733 -26.407  1.00 73.82           H\nATOM   3005 HD22 LEU A 179       1.326  29.314 -26.811  1.00 73.82           H\nATOM   3006 HD23 LEU A 179       1.748  27.936 -27.796  1.00 73.82           H\nATOM   3007  N   PHE A 180       4.430  25.160 -29.364  1.00 66.60           N\nATOM   3008  CA  PHE A 180       5.318  24.735 -30.455  1.00 66.57           C\nATOM   3009  C   PHE A 180       6.076  23.418 -30.158  1.00 66.48           C\nATOM   3010  O   PHE A 180       7.158  23.217 -30.709  1.00 65.55           O\nATOM   3011  CB  PHE A 180       6.300  25.874 -30.848  1.00 66.54           C\nATOM   3012  CG  PHE A 180       5.664  27.219 -31.157  1.00 65.90           C\nATOM   3013  CD1 PHE A 180       5.057  27.451 -32.407  1.00 64.53           C\nATOM   3014  CD2 PHE A 180       5.545  28.198 -30.146  1.00 66.09           C\nATOM   3015  CE1 PHE A 180       4.400  28.651 -32.649  1.00 65.67           C\nATOM   3016  CE2 PHE A 180       4.877  29.387 -30.404  1.00 66.52           C\nATOM   3017  CZ  PHE A 180       4.311  29.614 -31.652  1.00 65.97           C\nATOM   3018  H   PHE A 180       3.449  25.214 -29.605  1.00 66.60           H\nATOM   3019  HA  PHE A 180       4.669  24.534 -31.307  1.00 66.57           H\nATOM   3020  HB3 PHE A 180       6.866  25.575 -31.732  1.00 66.54           H\nATOM   3021  HB2 PHE A 180       7.044  26.021 -30.063  1.00 66.54           H\nATOM   3022  HD1 PHE A 180       5.102  26.701 -33.181  1.00 64.53           H\nATOM   3023  HD2 PHE A 180       5.972  28.025 -29.169  1.00 66.09           H\nATOM   3024  HE1 PHE A 180       3.943  28.829 -33.612  1.00 65.67           H\nATOM   3025  HE2 PHE A 180       4.791  30.135 -29.629  1.00 66.52           H\nATOM   3026  HZ  PHE A 180       3.790  30.540 -31.846  1.00 65.97           H\nATOM   3027  N   ASN A 181       5.524  22.559 -29.275  1.00 66.62           N\nATOM   3028  CA  ASN A 181       6.143  21.331 -28.747  1.00 67.29           C\nATOM   3029  C   ASN A 181       7.439  21.618 -27.942  1.00 67.84           C\nATOM   3030  O   ASN A 181       8.310  20.754 -27.890  1.00 66.56           O\nATOM   3031  CB  ASN A 181       6.340  20.299 -29.904  1.00 67.23           C\nATOM   3032  CG  ASN A 181       6.682  18.856 -29.494  1.00 68.07           C\nATOM   3033  OD1 ASN A 181       6.408  18.425 -28.377  1.00 70.81           O\nATOM   3034  ND2 ASN A 181       7.303  18.102 -30.402  1.00 65.22           N\nATOM   3035  H   ASN A 181       4.628  22.794 -28.867  1.00 66.62           H\nATOM   3036  HA  ASN A 181       5.446  20.913 -28.021  1.00 67.29           H\nATOM   3037  HB3 ASN A 181       7.102  20.648 -30.601  1.00 67.23           H\nATOM   3038  HB2 ASN A 181       5.414  20.235 -30.476  1.00 67.23           H\nATOM   3039 HD22 ASN A 181       7.572  17.156 -30.173  1.00 65.22           H\nATOM   3040 HD21 ASN A 181       7.522  18.472 -31.316  1.00 65.22           H\nATOM   3041  N   SER A 182       7.578  22.822 -27.355  1.00 69.54           N\nATOM   3042  CA  SER A 182       8.846  23.311 -26.808  1.00 71.29           C\nATOM   3043  C   SER A 182       8.855  23.283 -25.262  1.00 72.37           C\nATOM   3044  O   SER A 182       7.976  23.902 -24.659  1.00 73.45           O\nATOM   3045  CB  SER A 182       9.064  24.745 -27.328  1.00 71.95           C\nATOM   3046  OG  SER A 182      10.365  25.199 -27.016  1.00 72.00           O\nATOM   3047  H   SER A 182       6.827  23.498 -27.411  1.00 69.54           H\nATOM   3048  HA  SER A 182       9.654  22.723 -27.230  1.00 71.29           H\nATOM   3049  HB3 SER A 182       8.345  25.438 -26.894  1.00 71.95           H\nATOM   3050  HB2 SER A 182       8.938  24.785 -28.411  1.00 71.95           H\nATOM   3051  HG  SER A 182      10.990  24.709 -27.559  1.00 72.00           H\nATOM   3052  N   PRO A 183       9.871  22.628 -24.642  1.00 73.79           N\nATOM   3053  CA  PRO A 183      10.170  22.776 -23.200  1.00 74.17           C\nATOM   3054  C   PRO A 183      10.591  24.191 -22.753  1.00 74.92           C\nATOM   3055  O   PRO A 183      10.493  24.489 -21.563  1.00 73.52           O\nATOM   3056  CB  PRO A 183      11.316  21.777 -22.939  1.00 73.83           C\nATOM   3057  CG  PRO A 183      11.359  20.856 -24.145  1.00 74.30           C\nATOM   3058  CD  PRO A 183      10.824  21.718 -25.272  1.00 74.07           C\nATOM   3059  HA  PRO A 183       9.284  22.480 -22.640  1.00 74.17           H\nATOM   3060  HB3 PRO A 183      11.185  21.223 -22.009  1.00 73.83           H\nATOM   3061  HB2 PRO A 183      12.272  22.298 -22.869  1.00 73.83           H\nATOM   3062  HG3 PRO A 183      10.692  20.012 -23.982  1.00 74.30           H\nATOM   3063  HG2 PRO A 183      12.351  20.457 -24.355  1.00 74.30           H\nATOM   3064  HD2 PRO A 183      11.625  22.303 -25.724  1.00 74.07           H\nATOM   3065  HD3 PRO A 183      10.369  21.081 -26.027  1.00 74.07           H\nATOM   3066  N   LEU A 184      11.060  25.021 -23.701  1.00 76.31           N\nATOM   3067  CA  LEU A 184      11.576  26.375 -23.477  1.00 77.55           C\nATOM   3068  C   LEU A 184      10.480  27.426 -23.199  1.00 78.68           C\nATOM   3069  O   LEU A 184      10.827  28.582 -22.957  1.00 78.54           O\nATOM   3070  CB  LEU A 184      12.415  26.818 -24.704  1.00 77.00           C\nATOM   3071  CG  LEU A 184      13.475  25.813 -25.211  1.00 77.09           C\nATOM   3072  CD1 LEU A 184      14.211  26.376 -26.446  1.00 79.15           C\nATOM   3073  CD2 LEU A 184      14.452  25.388 -24.099  1.00 76.62           C\nATOM   3074  H   LEU A 184      11.097  24.700 -24.658  1.00 76.31           H\nATOM   3075  HA  LEU A 184      12.224  26.349 -22.599  1.00 77.55           H\nATOM   3076  HB3 LEU A 184      12.913  27.759 -24.465  1.00 77.00           H\nATOM   3077  HB2 LEU A 184      11.740  27.046 -25.531  1.00 77.00           H\nATOM   3078  HG  LEU A 184      12.965  24.909 -25.546  1.00 77.09           H\nATOM   3079 HD11 LEU A 184      15.295  26.295 -26.367  1.00 79.15           H\nATOM   3080 HD12 LEU A 184      13.911  25.847 -27.349  1.00 79.15           H\nATOM   3081 HD13 LEU A 184      13.984  27.430 -26.610  1.00 79.15           H\nATOM   3082 HD21 LEU A 184      15.443  25.140 -24.479  1.00 76.62           H\nATOM   3083 HD22 LEU A 184      14.571  26.168 -23.348  1.00 76.62           H\nATOM   3084 HD23 LEU A 184      14.076  24.501 -23.591  1.00 76.62           H\nATOM   3085  N   LYS A 185       9.197  27.030 -23.270  1.00 80.41           N\nATOM   3086  CA  LYS A 185       8.036  27.914 -23.204  1.00 81.09           C\nATOM   3087  C   LYS A 185       7.184  27.636 -21.948  1.00 82.06           C\nATOM   3088  O   LYS A 185       6.225  26.868 -22.033  1.00 82.62           O\nATOM   3089  CB  LYS A 185       7.195  27.718 -24.488  1.00 80.83           C\nATOM   3090  CG  LYS A 185       7.877  28.134 -25.804  1.00 79.87           C\nATOM   3091  CD  LYS A 185       8.161  29.640 -25.919  0.00 79.84           C\nATOM   3092  CE  LYS A 185       8.681  30.017 -27.315  0.00 79.77           C\nATOM   3093  NZ  LYS A 185       8.961  31.459 -27.424  0.00 79.79           N1+\nATOM   3094  H   LYS A 185       8.996  26.057 -23.455  1.00 80.41           H\nATOM   3095  HA  LYS A 185       8.340  28.959 -23.179  1.00 81.09           H\nATOM   3096  HB3 LYS A 185       6.268  28.286 -24.397  1.00 80.83           H\nATOM   3097  HB2 LYS A 185       6.898  26.671 -24.575  1.00 80.83           H\nATOM   3098  HG3 LYS A 185       7.238  27.828 -26.633  1.00 79.87           H\nATOM   3099  HG2 LYS A 185       8.808  27.580 -25.929  1.00 79.87           H\nATOM   3100  HD3 LYS A 185       8.899  29.928 -25.169  1.00 79.84           H\nATOM   3101  HD2 LYS A 185       7.252  30.198 -25.691  1.00 79.84           H\nATOM   3102  HE3 LYS A 185       7.948  29.746 -28.076  1.00 79.77           H\nATOM   3103  HE2 LYS A 185       9.595  29.466 -27.538  1.00 79.77           H\nATOM   3104  HZ1 LYS A 185       9.662  31.720 -26.745  1.00 79.79           H\nATOM   3105  HZ2 LYS A 185       9.300  31.667 -28.353  1.00 79.79           H\nATOM   3106  HZ3 LYS A 185       8.114  31.983 -27.252  1.00 79.79           H\nATOM   3107  N   PRO A 186       7.473  28.335 -20.825  1.00 11.82           N\nATOM   3108  CA  PRO A 186       6.468  28.571 -19.771  1.00 12.72           C\nATOM   3109  C   PRO A 186       5.500  29.738 -20.097  1.00 14.25           C\nATOM   3110  O   PRO A 186       4.704  30.105 -19.236  1.00 13.87           O\nATOM   3111  CD  PRO A 186       8.753  28.970 -20.489  1.00  0.00           C\nATOM   3112  CB  PRO A 186       7.349  28.888 -18.552  1.00  0.00           C\nATOM   3113  CG  PRO A 186       8.531  29.649 -19.139  1.00  0.00           C\nATOM   3114  HD3 PRO A 186       9.512  28.191 -20.397  1.00  0.00           H\nATOM   3115  HD2 PRO A 186       9.091  29.693 -21.230  1.00  0.00           H\nATOM   3116  HB2 PRO A 186       6.839  29.449 -17.767  1.00  0.00           H\nATOM   3117  HB3 PRO A 186       7.695  27.955 -18.105  1.00  0.00           H\nATOM   3118  HG3 PRO A 186       9.414  29.638 -18.500  1.00  0.00           H\nATOM   3119  HG2 PRO A 186       8.246  30.690 -19.298  1.00  0.00           H\nATOM   3120  HA  PRO A 186       5.873  27.679 -19.570  1.00 12.72           H\nATOM   3121  N   LEU A 187       5.613  30.320 -21.307  1.00 15.64           N\nATOM   3122  CA  LEU A 187       5.024  31.591 -21.739  1.00 17.67           C\nATOM   3123  C   LEU A 187       3.557  31.465 -22.206  1.00 17.39           C\nATOM   3124  O   LEU A 187       3.217  31.904 -23.305  1.00 18.55           O\nATOM   3125  CB  LEU A 187       5.942  32.202 -22.830  1.00  0.00           C\nATOM   3126  CG  LEU A 187       7.396  32.486 -22.382  1.00  0.00           C\nATOM   3127  CD1 LEU A 187       8.281  32.879 -23.585  1.00  0.00           C\nATOM   3128  CD2 LEU A 187       7.469  33.517 -21.234  1.00  0.00           C\nATOM   3129  HB2 LEU A 187       5.959  31.523 -23.684  1.00  0.00           H\nATOM   3130  HB3 LEU A 187       5.510  33.135 -23.197  1.00  0.00           H\nATOM   3131  HG  LEU A 187       7.816  31.556 -22.001  1.00  0.00           H\nATOM   3132 HD11 LEU A 187       8.651  33.902 -23.521  1.00  0.00           H\nATOM   3133 HD12 LEU A 187       9.149  32.223 -23.654  1.00  0.00           H\nATOM   3134 HD13 LEU A 187       7.743  32.800 -24.530  1.00  0.00           H\nATOM   3135 HD21 LEU A 187       8.240  34.271 -21.390  1.00  0.00           H\nATOM   3136 HD22 LEU A 187       6.527  34.049 -21.101  1.00  0.00           H\nATOM   3137 HD23 LEU A 187       7.698  33.022 -20.289  1.00  0.00           H\nATOM   3138  H   LEU A 187       6.269  29.921 -21.961  1.00 15.64           H\nATOM   3139  HA  LEU A 187       5.009  32.266 -20.882  1.00 17.67           H\nATOM   3140  N   ALA A 188       2.711  30.896 -21.338  1.00 16.48           N\nATOM   3141  CA  ALA A 188       1.259  30.803 -21.486  1.00 16.65           C\nATOM   3142  C   ALA A 188       0.635  30.552 -20.112  1.00 17.19           C\nATOM   3143  O   ALA A 188      -0.278  31.277 -19.718  1.00 16.97           O\nATOM   3144  CB  ALA A 188       0.862  29.710 -22.495  1.00  0.00           C\nATOM   3145  HB1 ALA A 188       1.114  30.006 -23.512  1.00  0.00           H\nATOM   3146  HB2 ALA A 188       1.363  28.765 -22.283  1.00  0.00           H\nATOM   3147  HB3 ALA A 188      -0.213  29.526 -22.476  1.00  0.00           H\nATOM   3148  H   ALA A 188       3.077  30.580 -20.449  1.00 16.48           H\nATOM   3149  HA  ALA A 188       0.882  31.763 -21.845  1.00 16.65           H\nATOM   3150  N   ASP A 189       1.187  29.556 -19.401  1.00 17.55           N\nATOM   3151  CA  ASP A 189       0.892  29.227 -18.005  1.00 19.53           C\nATOM   3152  C   ASP A 189       1.782  30.057 -17.053  1.00 18.26           C\nATOM   3153  O   ASP A 189       2.397  31.034 -17.485  1.00 18.30           O\nATOM   3154  CB  ASP A 189       0.966  27.700 -17.729  1.00  0.00           C\nATOM   3155  CG  ASP A 189       0.232  26.844 -18.778  1.00  0.00           C\nATOM   3156  OD1 ASP A 189      -1.018  26.816 -18.724  1.00  0.00           O\nATOM   3157  OD2 ASP A 189       0.916  26.355 -19.706  1.00  0.00           O1-\nATOM   3158  HB2 ASP A 189       2.007  27.376 -17.681  1.00  0.00           H\nATOM   3159  HB3 ASP A 189       0.522  27.472 -16.758  1.00  0.00           H\nATOM   3160  H   ASP A 189       1.914  28.997 -19.825  1.00 17.55           H\nATOM   3161  HA  ASP A 189      -0.135  29.534 -17.795  1.00 19.53           H\nATOM   3162  N   LEU A 190       1.798  29.690 -15.761  1.00 18.16           N\nATOM   3163  CA  LEU A 190       2.465  30.449 -14.695  1.00 16.86           C\nATOM   3164  C   LEU A 190       3.578  29.655 -13.984  1.00 17.11           C\nATOM   3165  O   LEU A 190       4.347  30.266 -13.242  1.00 18.09           O\nATOM   3166  CB  LEU A 190       1.388  30.918 -13.678  1.00  0.00           C\nATOM   3167  CG  LEU A 190       1.312  32.451 -13.510  1.00  0.00           C\nATOM   3168  CD1 LEU A 190       0.886  33.159 -14.816  1.00  0.00           C\nATOM   3169  CD2 LEU A 190       0.422  32.839 -12.309  1.00  0.00           C\nATOM   3170  HB2 LEU A 190       0.400  30.549 -13.960  1.00  0.00           H\nATOM   3171  HB3 LEU A 190       1.576  30.470 -12.700  1.00  0.00           H\nATOM   3172  HG  LEU A 190       2.320  32.793 -13.270  1.00  0.00           H\nATOM   3173 HD11 LEU A 190       0.062  33.859 -14.674  1.00  0.00           H\nATOM   3174 HD12 LEU A 190       1.717  33.728 -15.233  1.00  0.00           H\nATOM   3175 HD13 LEU A 190       0.567  32.450 -15.580  1.00  0.00           H\nATOM   3176 HD21 LEU A 190      -0.442  33.439 -12.594  1.00  0.00           H\nATOM   3177 HD22 LEU A 190       0.034  31.964 -11.785  1.00  0.00           H\nATOM   3178 HD23 LEU A 190       0.990  33.420 -11.582  1.00  0.00           H\nATOM   3179  H   LEU A 190       1.270  28.879 -15.471  1.00 18.16           H\nATOM   3180  HA  LEU A 190       2.965  31.324 -15.113  1.00 16.86           H\nATOM   3181  N   ASP A 191       3.631  28.328 -14.185  1.00 16.91           N\nATOM   3182  CA  ASP A 191       4.470  27.392 -13.430  1.00 15.94           C\nATOM   3183  C   ASP A 191       5.780  27.044 -14.177  1.00 17.65           C\nATOM   3184  O   ASP A 191       5.818  27.129 -15.406  1.00 18.83           O\nATOM   3185  CB  ASP A 191       3.713  26.074 -13.077  1.00  0.00           C\nATOM   3186  CG  ASP A 191       3.155  25.208 -14.233  1.00  0.00           C\nATOM   3187  OD1 ASP A 191       3.027  23.986 -13.997  1.00  0.00           O\nATOM   3188  OD2 ASP A 191       2.741  25.761 -15.275  1.00  0.00           O1-\nATOM   3189  HB2 ASP A 191       4.328  25.453 -12.424  1.00  0.00           H\nATOM   3190  HB3 ASP A 191       2.848  26.349 -12.471  1.00  0.00           H\nATOM   3191  H   ASP A 191       3.002  27.893 -14.847  1.00 16.91           H\nATOM   3192  HA  ASP A 191       4.723  27.878 -12.488  1.00 15.94           H\nATOM   3193  N   PRO A 192       6.792  26.526 -13.436  1.00 16.20           N\nATOM   3194  CA  PRO A 192       7.782  25.599 -14.009  1.00 17.24           C\nATOM   3195  C   PRO A 192       7.097  24.255 -14.336  1.00 16.91           C\nATOM   3196  O   PRO A 192       6.631  23.577 -13.423  1.00 18.66           O\nATOM   3197  CD  PRO A 192       6.992  26.700 -11.991  1.00  0.00           C\nATOM   3198  CB  PRO A 192       8.851  25.493 -12.907  1.00  0.00           C\nATOM   3199  CG  PRO A 192       8.098  25.722 -11.604  1.00  0.00           C\nATOM   3200  HD3 PRO A 192       7.312  27.727 -11.812  1.00  0.00           H\nATOM   3201  HD2 PRO A 192       6.102  26.515 -11.391  1.00  0.00           H\nATOM   3202  HB2 PRO A 192       9.392  24.546 -12.913  1.00  0.00           H\nATOM   3203  HB3 PRO A 192       9.585  26.288 -13.045  1.00  0.00           H\nATOM   3204  HG3 PRO A 192       8.732  26.086 -10.795  1.00  0.00           H\nATOM   3205  HG2 PRO A 192       7.651  24.783 -11.274  1.00  0.00           H\nATOM   3206  HA  PRO A 192       8.230  26.014 -14.914  1.00 17.24           H\nATOM   3207  N   VAL A 193       6.978  23.953 -15.639  1.00 15.49           N\nATOM   3208  CA  VAL A 193       6.059  22.963 -16.226  1.00 15.21           C\nATOM   3209  C   VAL A 193       6.347  21.460 -15.944  1.00 14.65           C\nATOM   3210  O   VAL A 193       5.732  20.601 -16.577  1.00 15.18           O\nATOM   3211  CB  VAL A 193       5.929  23.197 -17.761  1.00  0.00           C\nATOM   3212  CG1 VAL A 193       5.349  24.589 -18.078  1.00  0.00           C\nATOM   3213  CG2 VAL A 193       7.230  22.953 -18.552  1.00  0.00           C\nATOM   3214  HB  VAL A 193       5.191  22.493 -18.150  1.00  0.00           H\nATOM   3215 HG11 VAL A 193       5.165  24.703 -19.147  1.00  0.00           H\nATOM   3216 HG12 VAL A 193       4.398  24.745 -17.567  1.00  0.00           H\nATOM   3217 HG13 VAL A 193       6.023  25.390 -17.775  1.00  0.00           H\nATOM   3218 HG21 VAL A 193       7.077  23.130 -19.616  1.00  0.00           H\nATOM   3219 HG22 VAL A 193       8.029  23.616 -18.221  1.00  0.00           H\nATOM   3220 HG23 VAL A 193       7.584  21.928 -18.449  1.00  0.00           H\nATOM   3221  H   VAL A 193       7.396  24.580 -16.311  1.00 15.49           H\nATOM   3222  HA  VAL A 193       5.079  23.152 -15.786  1.00 15.21           H\nATOM   3223  N   VAL A 194       7.249  21.156 -14.997  1.00 13.85           N\nATOM   3224  CA  VAL A 194       7.564  19.816 -14.487  1.00 13.89           C\nATOM   3225  C   VAL A 194       7.839  19.932 -12.966  1.00 13.31           C\nATOM   3226  O   VAL A 194       7.980  21.044 -12.454  1.00 13.54           O\nATOM   3227  CB  VAL A 194       8.815  19.220 -15.226  1.00  0.00           C\nATOM   3228  CG1 VAL A 194       9.354  17.875 -14.703  1.00  0.00           C\nATOM   3229  CG2 VAL A 194       8.588  19.064 -16.739  1.00  0.00           C\nATOM   3230  HB  VAL A 194       9.628  19.931 -15.094  1.00  0.00           H\nATOM   3231 HG11 VAL A 194      10.086  17.445 -15.388  1.00  0.00           H\nATOM   3232 HG12 VAL A 194       9.870  17.999 -13.755  1.00  0.00           H\nATOM   3233 HG13 VAL A 194       8.559  17.142 -14.575  1.00  0.00           H\nATOM   3234 HG21 VAL A 194       9.452  18.626 -17.239  1.00  0.00           H\nATOM   3235 HG22 VAL A 194       7.735  18.412 -16.930  1.00  0.00           H\nATOM   3236 HG23 VAL A 194       8.408  20.021 -17.224  1.00  0.00           H\nATOM   3237  H   VAL A 194       7.663  21.915 -14.472  1.00 13.85           H\nATOM   3238  HA  VAL A 194       6.703  19.161 -14.617  1.00 13.89           H\nATOM   3239  N   VAL A 195       7.952  18.791 -12.264  1.00 11.96           N\nATOM   3240  CA  VAL A 195       8.503  18.675 -10.902  1.00 11.91           C\nATOM   3241  C   VAL A 195      10.020  19.052 -10.829  1.00 11.63           C\nATOM   3242  O   VAL A 195      10.543  19.662 -11.762  1.00 12.13           O\nATOM   3243  CB  VAL A 195       8.201  17.246 -10.344  1.00  0.00           C\nATOM   3244  CG1 VAL A 195       9.049  16.125 -10.970  1.00  0.00           C\nATOM   3245  CG2 VAL A 195       8.207  17.136  -8.805  1.00  0.00           C\nATOM   3246  HB  VAL A 195       7.171  17.035 -10.630  1.00  0.00           H\nATOM   3247 HG11 VAL A 195       8.708  15.149 -10.625  1.00  0.00           H\nATOM   3248 HG12 VAL A 195       8.967  16.127 -12.057  1.00  0.00           H\nATOM   3249 HG13 VAL A 195      10.104  16.208 -10.710  1.00  0.00           H\nATOM   3250 HG21 VAL A 195       7.735  16.205  -8.488  1.00  0.00           H\nATOM   3251 HG22 VAL A 195       9.208  17.132  -8.379  1.00  0.00           H\nATOM   3252 HG23 VAL A 195       7.647  17.951  -8.346  1.00  0.00           H\nATOM   3253  H   VAL A 195       7.806  17.916 -12.747  1.00 11.96           H\nATOM   3254  HA  VAL A 195       7.976  19.400 -10.280  1.00 11.91           H\nATOM   3255  N   THR A 196      10.694  18.733  -9.710  1.00 75.08           N\nATOM   3256  CA  THR A 196      12.041  19.162  -9.283  1.00 75.02           C\nATOM   3257  C   THR A 196      13.254  18.706 -10.149  1.00 72.81           C\nATOM   3258  O   THR A 196      14.376  18.616  -9.656  1.00 75.73           O\nATOM   3259  CB  THR A 196      12.267  18.790  -7.783  1.00 75.02           C\nATOM   3260  OG1 THR A 196      11.089  19.051  -7.041  1.00 76.05           O\nATOM   3261  CG2 THR A 196      13.411  19.531  -7.057  1.00 75.19           C\nATOM   3262  HA  THR A 196      12.038  20.252  -9.351  1.00 75.02           H\nATOM   3263  HB  THR A 196      12.442  17.717  -7.705  1.00 75.02           H\nATOM   3264  HG1 THR A 196      11.285  18.938  -6.108  1.00 76.05           H\nATOM   3265 HG21 THR A 196      13.307  19.462  -5.974  1.00 75.19           H\nATOM   3266 HG22 THR A 196      14.394  19.125  -7.285  1.00 75.19           H\nATOM   3267 HG23 THR A 196      13.426  20.585  -7.329  1.00 75.19           H\nATOM   3268  H   THR A 196      10.186  18.249  -8.983  1.00 75.08           H\nATOM   3269  N   PHE A 197      13.030  18.470 -11.453  1.00 68.56           N\nATOM   3270  CA  PHE A 197      14.013  18.207 -12.517  1.00 64.96           C\nATOM   3271  C   PHE A 197      14.659  16.804 -12.459  1.00 60.77           C\nATOM   3272  O   PHE A 197      15.440  16.484 -13.355  1.00 58.08           O\nATOM   3273  CB  PHE A 197      15.093  19.323 -12.586  1.00 65.54           C\nATOM   3274  CG  PHE A 197      14.582  20.753 -12.466  1.00 67.44           C\nATOM   3275  CD1 PHE A 197      13.560  21.229 -13.313  1.00 68.07           C\nATOM   3276  CD2 PHE A 197      15.131  21.623 -11.500  1.00 71.77           C\nATOM   3277  CE1 PHE A 197      13.083  22.525 -13.168  1.00 70.69           C\nATOM   3278  CE2 PHE A 197      14.637  22.914 -11.366  1.00 73.18           C\nATOM   3279  CZ  PHE A 197      13.615  23.361 -12.195  1.00 71.74           C\nATOM   3280  H   PHE A 197      12.086  18.619 -11.784  1.00 68.56           H\nATOM   3281  HA  PHE A 197      13.442  18.241 -13.444  1.00 64.96           H\nATOM   3282  HB3 PHE A 197      15.638  19.245 -13.527  1.00 65.54           H\nATOM   3283  HB2 PHE A 197      15.836  19.164 -11.805  1.00 65.54           H\nATOM   3284  HD1 PHE A 197      13.127  20.580 -14.056  1.00 68.07           H\nATOM   3285  HD2 PHE A 197      15.922  21.285 -10.846  1.00 71.77           H\nATOM   3286  HE1 PHE A 197      12.291  22.883 -13.809  1.00 70.69           H\nATOM   3287  HE2 PHE A 197      15.051  23.573 -10.618  1.00 73.18           H\nATOM   3288  HZ  PHE A 197      13.237  24.367 -12.085  1.00 71.74           H\nATOM   3289  N   TRP A 198      14.314  15.987 -11.445  1.00 56.85           N\nATOM   3290  CA  TRP A 198      14.856  14.646 -11.185  1.00 54.81           C\nATOM   3291  C   TRP A 198      14.609  13.629 -12.317  1.00 52.52           C\nATOM   3292  O   TRP A 198      15.407  12.707 -12.474  1.00 50.72           O\nATOM   3293  CB  TRP A 198      14.270  14.085  -9.868  1.00 54.00           C\nATOM   3294  CG  TRP A 198      14.362  14.899  -8.608  1.00 57.24           C\nATOM   3295  CD1 TRP A 198      15.225  15.909  -8.359  1.00 60.19           C\nATOM   3296  CD2 TRP A 198      13.594  14.724  -7.377  1.00 59.77           C\nATOM   3297  NE1 TRP A 198      15.000  16.409  -7.094  1.00 62.18           N\nATOM   3298  CE2 TRP A 198      14.014  15.711  -6.436  1.00 61.67           C\nATOM   3299  CE3 TRP A 198      12.578  13.833  -6.958  1.00 61.41           C\nATOM   3300  CZ2 TRP A 198      13.447  15.823  -5.155  1.00 64.63           C\nATOM   3301  CZ3 TRP A 198      12.004  13.929  -5.674  1.00 65.63           C\nATOM   3302  CH2 TRP A 198      12.434  14.925  -4.774  1.00 64.39           C\nATOM   3303  H   TRP A 198      13.670  16.336 -10.749  1.00 56.85           H\nATOM   3304  HA  TRP A 198      15.934  14.752 -11.063  1.00 54.81           H\nATOM   3305  HB3 TRP A 198      14.739  13.129  -9.643  1.00 54.00           H\nATOM   3306  HB2 TRP A 198      13.211  13.869 -10.013  1.00 54.00           H\nATOM   3307  HD1 TRP A 198      15.957  16.280  -9.060  1.00 60.19           H\nATOM   3308  HE1 TRP A 198      15.507  17.203  -6.718  1.00 62.18           H\nATOM   3309  HE3 TRP A 198      12.235  13.064  -7.635  1.00 61.41           H\nATOM   3310  HZ2 TRP A 198      13.791  16.584  -4.470  1.00 64.63           H\nATOM   3311  HZ3 TRP A 198      11.232  13.234  -5.380  1.00 65.63           H\nATOM   3312  HH2 TRP A 198      11.992  14.993  -3.791  1.00 64.39           H\nATOM   3313  N   TYR A 199      13.513  13.807 -13.070  1.00 51.61           N\nATOM   3314  CA  TYR A 199      13.062  12.901 -14.129  1.00 51.83           C\nATOM   3315  C   TYR A 199      13.328  13.468 -15.535  1.00 51.74           C\nATOM   3316  O   TYR A 199      13.073  12.747 -16.498  1.00 50.69           O\nATOM   3317  CB  TYR A 199      11.562  12.575 -13.926  1.00 51.66           C\nATOM   3318  CG  TYR A 199      11.213  12.125 -12.515  1.00 54.19           C\nATOM   3319  CD1 TYR A 199      11.368  10.778 -12.133  1.00 55.31           C\nATOM   3320  CD2 TYR A 199      10.784  13.071 -11.562  1.00 54.97           C\nATOM   3321  CE1 TYR A 199      11.144  10.394 -10.797  1.00 58.25           C\nATOM   3322  CE2 TYR A 199      10.554  12.689 -10.229  1.00 57.04           C\nATOM   3323  CZ  TYR A 199      10.750  11.352  -9.840  1.00 56.94           C\nATOM   3324  OH  TYR A 199      10.547  10.997  -8.539  1.00 51.49           O\nATOM   3325  H   TYR A 199      12.914  14.603 -12.891  1.00 51.61           H\nATOM   3326  HA  TYR A 199      13.607  11.959 -14.069  1.00 51.83           H\nATOM   3327  HB3 TYR A 199      11.249  11.799 -14.627  1.00 51.66           H\nATOM   3328  HB2 TYR A 199      10.952  13.447 -14.163  1.00 51.66           H\nATOM   3329  HD1 TYR A 199      11.672  10.040 -12.858  1.00 55.31           H\nATOM   3330  HD2 TYR A 199      10.661  14.103 -11.847  1.00 54.97           H\nATOM   3331  HE1 TYR A 199      11.268   9.359 -10.515  1.00 58.25           H\nATOM   3332  HE2 TYR A 199      10.245  13.425  -9.502  1.00 57.04           H\nATOM   3333  HH  TYR A 199      10.776  10.077  -8.349  1.00 51.49           H\nATOM   3334  N   ARG A 200      13.838  14.713 -15.646  1.00 50.18           N\nATOM   3335  CA  ARG A 200      14.233  15.338 -16.914  1.00 51.35           C\nATOM   3336  C   ARG A 200      15.525  14.722 -17.472  1.00 49.33           C\nATOM   3337  O   ARG A 200      16.511  14.601 -16.746  1.00 48.59           O\nATOM   3338  CB  ARG A 200      14.432  16.860 -16.751  1.00 52.16           C\nATOM   3339  CG  ARG A 200      13.134  17.663 -16.566  1.00 56.78           C\nATOM   3340  CD  ARG A 200      13.392  19.168 -16.747  1.00 62.40           C\nATOM   3341  NE  ARG A 200      12.181  19.986 -16.552  1.00 67.29           N\nATOM   3342  CZ  ARG A 200      12.082  21.322 -16.718  1.00 69.76           C\nATOM   3343  NH1 ARG A 200      13.129  22.072 -17.096  1.00 69.42           N\nATOM   3344  NH2 ARG A 200      10.909  21.930 -16.505  1.00 69.74           N1+\nATOM   3345  H   ARG A 200      14.042  15.241 -14.809  1.00 50.18           H\nATOM   3346  HA  ARG A 200      13.435  15.183 -17.640  1.00 51.35           H\nATOM   3347  HB3 ARG A 200      14.920  17.240 -17.651  1.00 52.16           H\nATOM   3348  HB2 ARG A 200      15.125  17.070 -15.936  1.00 52.16           H\nATOM   3349  HG3 ARG A 200      12.655  17.447 -15.610  1.00 56.78           H\nATOM   3350  HG2 ARG A 200      12.434  17.339 -17.338  1.00 56.78           H\nATOM   3351  HD3 ARG A 200      13.708  19.339 -17.777  1.00 62.40           H\nATOM   3352  HD2 ARG A 200      14.208  19.506 -16.108  1.00 62.40           H\nATOM   3353  HE  ARG A 200      11.354  19.480 -16.268  1.00 67.29           H\nATOM   3354 HH12 ARG A 200      13.031  23.070 -17.217  1.00 69.42           H\nATOM   3355 HH11 ARG A 200      14.025  21.639 -17.263  1.00 69.42           H\nATOM   3356 HH22 ARG A 200      10.822  22.929 -16.628  1.00 69.74           H\nATOM   3357 HH21 ARG A 200      10.099  21.398 -16.220  1.00 69.74           H\nATOM   3358  N   ALA A 201      15.492  14.406 -18.775  1.00 46.83           N\nATOM   3359  CA  ALA A 201      16.617  13.910 -19.568  1.00 46.21           C\nATOM   3360  C   ALA A 201      17.749  14.953 -19.705  1.00 44.47           C\nATOM   3361  O   ALA A 201      17.461  16.150 -19.659  1.00 43.36           O\nATOM   3362  CB  ALA A 201      16.052  13.502 -20.935  1.00 44.83           C\nATOM   3363  H   ALA A 201      14.631  14.543 -19.285  1.00 46.83           H\nATOM   3364  HA  ALA A 201      17.006  13.030 -19.065  1.00 46.21           H\nATOM   3365  HB1 ALA A 201      16.771  12.911 -21.497  1.00 44.83           H\nATOM   3366  HB2 ALA A 201      15.156  12.889 -20.828  1.00 44.83           H\nATOM   3367  HB3 ALA A 201      15.786  14.374 -21.534  1.00 44.83           H\nATOM   3368  N   PRO A 202      19.018  14.503 -19.860  1.00 43.80           N\nATOM   3369  CA  PRO A 202      20.181  15.411 -19.885  1.00 45.49           C\nATOM   3370  C   PRO A 202      20.224  16.404 -21.062  1.00 46.40           C\nATOM   3371  O   PRO A 202      20.834  17.459 -20.908  1.00 47.91           O\nATOM   3372  CB  PRO A 202      21.394  14.467 -19.865  1.00 44.71           C\nATOM   3373  CG  PRO A 202      20.881  13.173 -20.476  1.00 46.15           C\nATOM   3374  CD  PRO A 202      19.448  13.108 -19.960  1.00 44.26           C\nATOM   3375  HA  PRO A 202      20.188  16.004 -18.969  1.00 45.49           H\nATOM   3376  HB3 PRO A 202      21.695  14.288 -18.832  1.00 44.71           H\nATOM   3377  HB2 PRO A 202      22.266  14.860 -20.390  1.00 44.71           H\nATOM   3378  HG3 PRO A 202      21.476  12.299 -20.211  1.00 46.15           H\nATOM   3379  HG2 PRO A 202      20.876  13.260 -21.563  1.00 46.15           H\nATOM   3380  HD2 PRO A 202      18.822  12.500 -20.612  1.00 44.26           H\nATOM   3381  HD3 PRO A 202      19.429  12.676 -18.962  1.00 44.26           H\nATOM   3382  N   GLU A 203      19.556  16.086 -22.186  1.00 46.77           N\nATOM   3383  CA  GLU A 203      19.406  16.987 -23.328  1.00 46.56           C\nATOM   3384  C   GLU A 203      18.420  18.141 -23.058  1.00 48.23           C\nATOM   3385  O   GLU A 203      18.663  19.232 -23.565  1.00 47.21           O\nATOM   3386  CB  GLU A 203      19.088  16.212 -24.628  1.00 47.06           C\nATOM   3387  CG  GLU A 203      17.717  15.504 -24.728  1.00 47.04           C\nATOM   3388  CD  GLU A 203      17.619  14.096 -24.121  1.00 45.10           C\nATOM   3389  OE1 GLU A 203      18.600  13.595 -23.529  1.00 39.52           O\nATOM   3390  OE2 GLU A 203      16.528  13.512 -24.279  1.00 40.85           O1-\nATOM   3391  H   GLU A 203      19.111  15.181 -22.276  1.00 46.77           H\nATOM   3392  HA  GLU A 203      20.383  17.443 -23.493  1.00 46.56           H\nATOM   3393  HB3 GLU A 203      19.892  15.504 -24.832  1.00 47.06           H\nATOM   3394  HB2 GLU A 203      19.147  16.918 -25.456  1.00 47.06           H\nATOM   3395  HG3 GLU A 203      17.479  15.406 -25.787  1.00 47.04           H\nATOM   3396  HG2 GLU A 203      16.923  16.125 -24.313  1.00 47.04           H\nATOM   3397  N   LEU A 204      17.377  17.929 -22.228  1.00 48.44           N\nATOM   3398  CA  LEU A 204      16.496  19.001 -21.733  1.00 48.97           C\nATOM   3399  C   LEU A 204      17.266  20.001 -20.858  1.00 50.59           C\nATOM   3400  O   LEU A 204      17.050  21.206 -20.979  1.00 52.39           O\nATOM   3401  CB  LEU A 204      15.310  18.429 -20.924  1.00 49.55           C\nATOM   3402  CG  LEU A 204      14.320  17.566 -21.730  1.00 49.37           C\nATOM   3403  CD1 LEU A 204      13.387  16.794 -20.774  1.00 45.06           C\nATOM   3404  CD2 LEU A 204      13.542  18.416 -22.758  1.00 44.58           C\nATOM   3405  H   LEU A 204      17.240  17.014 -21.821  1.00 48.44           H\nATOM   3406  HA  LEU A 204      16.109  19.550 -22.591  1.00 48.97           H\nATOM   3407  HB3 LEU A 204      14.754  19.247 -20.462  1.00 49.55           H\nATOM   3408  HB2 LEU A 204      15.698  17.847 -20.089  1.00 49.55           H\nATOM   3409  HG  LEU A 204      14.887  16.817 -22.285  1.00 49.37           H\nATOM   3410 HD11 LEU A 204      12.339  16.834 -21.071  1.00 45.06           H\nATOM   3411 HD12 LEU A 204      13.673  15.743 -20.736  1.00 45.06           H\nATOM   3412 HD13 LEU A 204      13.440  17.172 -19.754  1.00 45.06           H\nATOM   3413 HD21 LEU A 204      12.466  18.244 -22.731  1.00 44.58           H\nATOM   3414 HD22 LEU A 204      13.693  19.484 -22.598  1.00 44.58           H\nATOM   3415 HD23 LEU A 204      13.875  18.198 -23.773  1.00 44.58           H\nATOM   3416  N   LEU A 205      18.187  19.469 -20.040  1.00 51.51           N\nATOM   3417  CA  LEU A 205      19.113  20.220 -19.198  1.00 51.88           C\nATOM   3418  C   LEU A 205      20.266  20.881 -19.985  1.00 52.85           C\nATOM   3419  O   LEU A 205      21.034  21.628 -19.382  1.00 54.12           O\nATOM   3420  CB  LEU A 205      19.644  19.288 -18.091  1.00 51.51           C\nATOM   3421  CG  LEU A 205      18.551  18.677 -17.182  1.00 51.16           C\nATOM   3422  CD1 LEU A 205      19.150  17.602 -16.270  1.00 47.26           C\nATOM   3423  CD2 LEU A 205      17.782  19.738 -16.372  1.00 54.08           C\nATOM   3424  H   LEU A 205      18.298  18.465 -20.020  1.00 51.51           H\nATOM   3425  HA  LEU A 205      18.556  21.023 -18.726  1.00 51.88           H\nATOM   3426  HB3 LEU A 205      20.353  19.831 -17.465  1.00 51.51           H\nATOM   3427  HB2 LEU A 205      20.213  18.483 -18.555  1.00 51.51           H\nATOM   3428  HG  LEU A 205      17.827  18.160 -17.812  1.00 51.16           H\nATOM   3429 HD11 LEU A 205      18.366  17.062 -15.739  1.00 47.26           H\nATOM   3430 HD12 LEU A 205      19.714  16.868 -16.844  1.00 47.26           H\nATOM   3431 HD13 LEU A 205      19.829  18.040 -15.537  1.00 47.26           H\nATOM   3432 HD21 LEU A 205      16.738  19.783 -16.682  1.00 54.08           H\nATOM   3433 HD22 LEU A 205      17.793  19.525 -15.302  1.00 54.08           H\nATOM   3434 HD23 LEU A 205      18.204  20.733 -16.503  1.00 54.08           H\nATOM   3435  N   LEU A 206      20.359  20.613 -21.301  1.00 52.79           N\nATOM   3436  CA  LEU A 206      21.333  21.194 -22.225  1.00 52.84           C\nATOM   3437  C   LEU A 206      20.667  21.996 -23.367  1.00 53.83           C\nATOM   3438  O   LEU A 206      21.366  22.373 -24.309  1.00 53.68           O\nATOM   3439  CB  LEU A 206      22.281  20.089 -22.750  1.00 51.98           C\nATOM   3440  CG  LEU A 206      23.284  19.561 -21.703  1.00 50.14           C\nATOM   3441  CD1 LEU A 206      24.014  18.303 -22.222  1.00 43.85           C\nATOM   3442  CD2 LEU A 206      24.271  20.658 -21.259  1.00 43.55           C\nATOM   3443  H   LEU A 206      19.697  19.971 -21.715  1.00 52.79           H\nATOM   3444  HA  LEU A 206      21.927  21.923 -21.681  1.00 52.84           H\nATOM   3445  HB3 LEU A 206      22.866  20.454 -23.592  1.00 51.98           H\nATOM   3446  HB2 LEU A 206      21.681  19.268 -23.138  1.00 51.98           H\nATOM   3447  HG  LEU A 206      22.727  19.255 -20.818  1.00 50.14           H\nATOM   3448 HD11 LEU A 206      23.886  17.468 -21.532  1.00 43.85           H\nATOM   3449 HD12 LEU A 206      23.631  17.978 -23.190  1.00 43.85           H\nATOM   3450 HD13 LEU A 206      25.084  18.460 -22.350  1.00 43.85           H\nATOM   3451 HD21 LEU A 206      25.252  20.251 -21.021  1.00 43.55           H\nATOM   3452 HD22 LEU A 206      24.411  21.417 -22.028  1.00 43.55           H\nATOM   3453 HD23 LEU A 206      23.911  21.167 -20.366  1.00 43.55           H\nATOM   3454  N   GLY A 207      19.363  22.306 -23.250  1.00 54.10           N\nATOM   3455  CA  GLY A 207      18.691  23.262 -24.131  1.00 54.41           C\nATOM   3456  C   GLY A 207      17.961  22.620 -25.318  1.00 54.99           C\nATOM   3457  O   GLY A 207      17.808  23.297 -26.334  1.00 55.02           O\nATOM   3458  H   GLY A 207      18.844  21.969 -22.451  1.00 54.10           H\nATOM   3459  HA3 GLY A 207      19.388  24.019 -24.496  1.00 54.41           H\nATOM   3460  HA2 GLY A 207      17.947  23.800 -23.549  1.00 54.41           H\nATOM   3461  N   ALA A 208      17.500  21.356 -25.214  1.00 55.00           N\nATOM   3462  CA  ALA A 208      16.669  20.686 -26.228  1.00 55.12           C\nATOM   3463  C   ALA A 208      15.376  21.464 -26.522  1.00 56.87           C\nATOM   3464  O   ALA A 208      14.585  21.703 -25.609  1.00 54.73           O\nATOM   3465  CB  ALA A 208      16.329  19.251 -25.795  1.00 54.12           C\nATOM   3466  H   ALA A 208      17.704  20.819 -24.381  1.00 55.00           H\nATOM   3467  HA  ALA A 208      17.261  20.627 -27.144  1.00 55.12           H\nATOM   3468  HB1 ALA A 208      15.665  18.768 -26.513  1.00 54.12           H\nATOM   3469  HB2 ALA A 208      17.221  18.631 -25.726  1.00 54.12           H\nATOM   3470  HB3 ALA A 208      15.830  19.230 -24.828  1.00 54.12           H\nATOM   3471  N   ARG A 209      15.219  21.863 -27.793  1.00 58.98           N\nATOM   3472  CA  ARG A 209      14.157  22.755 -28.257  1.00 61.27           C\nATOM   3473  C   ARG A 209      12.779  22.091 -28.395  1.00 61.16           C\nATOM   3474  O   ARG A 209      11.800  22.830 -28.494  1.00 61.76           O\nATOM   3475  CB  ARG A 209      14.570  23.399 -29.595  1.00 62.64           C\nATOM   3476  CG  ARG A 209      15.882  24.198 -29.528  1.00 69.36           C\nATOM   3477  CD  ARG A 209      16.190  24.903 -30.857  1.00 77.96           C\nATOM   3478  NE  ARG A 209      17.512  25.552 -30.841  1.00 83.85           N\nATOM   3479  CZ  ARG A 209      18.138  26.142 -31.877  1.00 91.42           C\nATOM   3480  NH1 ARG A 209      17.598  26.190 -33.106  1.00 94.42           N\nATOM   3481  NH2 ARG A 209      19.337  26.701 -31.675  1.00 93.45           N1+\nATOM   3482  H   ARG A 209      15.920  21.617 -28.477  1.00 58.98           H\nATOM   3483  HA  ARG A 209      14.047  23.548 -27.516  1.00 61.27           H\nATOM   3484  HB3 ARG A 209      13.777  24.068 -29.934  1.00 62.64           H\nATOM   3485  HB2 ARG A 209      14.657  22.625 -30.360  1.00 62.64           H\nATOM   3486  HG3 ARG A 209      16.728  23.597 -29.191  1.00 69.36           H\nATOM   3487  HG2 ARG A 209      15.734  24.962 -28.764  1.00 69.36           H\nATOM   3488  HD3 ARG A 209      15.482  25.724 -30.976  1.00 77.96           H\nATOM   3489  HD2 ARG A 209      16.048  24.240 -31.711  1.00 77.96           H\nATOM   3490  HE  ARG A 209      17.977  25.555 -29.944  1.00 83.85           H\nATOM   3491 HH12 ARG A 209      18.086  26.638 -33.868  1.00 94.42           H\nATOM   3492 HH11 ARG A 209      16.694  25.773 -33.274  1.00 94.42           H\nATOM   3493 HH22 ARG A 209      19.829  27.149 -32.435  1.00 93.45           H\nATOM   3494 HH21 ARG A 209      19.764  26.681 -30.759  1.00 93.45           H\nATOM   3495  N   HIS A 210      12.719  20.747 -28.404  1.00 60.81           N\nATOM   3496  CA  HIS A 210      11.483  19.979 -28.549  1.00 59.61           C\nATOM   3497  C   HIS A 210      11.472  18.743 -27.643  1.00 57.96           C\nATOM   3498  O   HIS A 210      12.525  18.158 -27.386  1.00 56.52           O\nATOM   3499  CB  HIS A 210      11.263  19.573 -30.022  1.00 60.55           C\nATOM   3500  CG  HIS A 210      11.070  20.725 -30.976  1.00 66.76           C\nATOM   3501  ND1 HIS A 210      10.004  21.606 -30.888  1.00 67.70           N\nATOM   3502  CD2 HIS A 210      11.827  21.164 -32.040  1.00 68.84           C\nATOM   3503  CE1 HIS A 210      10.163  22.512 -31.856  1.00 72.15           C\nATOM   3504  NE2 HIS A 210      11.247  22.307 -32.594  1.00 71.20           N\nATOM   3505  H   HIS A 210      13.564  20.205 -28.292  1.00 60.81           H\nATOM   3506  HA  HIS A 210      10.657  20.610 -28.239  1.00 59.61           H\nATOM   3507  HB3 HIS A 210      10.382  18.934 -30.105  1.00 60.55           H\nATOM   3508  HB2 HIS A 210      12.105  18.974 -30.372  1.00 60.55           H\nATOM   3509  HD1 HIS A 210       9.258  21.587 -30.207  1.00 67.70           H\nATOM   3510  HD2 HIS A 210      12.745  20.758 -32.438  1.00 68.84           H\nATOM   3511  HE1 HIS A 210       9.481  23.333 -32.022  1.00 72.15           H\nATOM   3512  N   TYR A 211      10.256  18.341 -27.234  1.00 56.62           N\nATOM   3513  CA  TYR A 211       9.981  17.052 -26.597  1.00 56.51           C\nATOM   3514  C   TYR A 211       9.988  15.918 -27.638  1.00 55.45           C\nATOM   3515  O   TYR A 211       9.591  16.132 -28.785  1.00 53.07           O\nATOM   3516  CB  TYR A 211       8.620  17.099 -25.885  1.00 56.64           C\nATOM   3517  CG  TYR A 211       8.526  18.027 -24.688  1.00 58.41           C\nATOM   3518  CD1 TYR A 211       8.963  17.598 -23.417  1.00 57.86           C\nATOM   3519  CD2 TYR A 211       7.944  19.303 -24.830  1.00 59.85           C\nATOM   3520  CE1 TYR A 211       8.803  18.434 -22.293  1.00 58.74           C\nATOM   3521  CE2 TYR A 211       7.789  20.139 -23.711  1.00 59.90           C\nATOM   3522  CZ  TYR A 211       8.209  19.704 -22.441  1.00 63.33           C\nATOM   3523  OH  TYR A 211       8.032  20.517 -21.361  1.00 69.09           O\nATOM   3524  H   TYR A 211       9.444  18.890 -27.483  1.00 56.62           H\nATOM   3525  HA  TYR A 211      10.753  16.863 -25.851  1.00 56.51           H\nATOM   3526  HB3 TYR A 211       8.363  16.102 -25.532  1.00 56.64           H\nATOM   3527  HB2 TYR A 211       7.841  17.358 -26.599  1.00 56.64           H\nATOM   3528  HD1 TYR A 211       9.399  16.618 -23.297  1.00 57.86           H\nATOM   3529  HD2 TYR A 211       7.583  19.629 -25.791  1.00 59.85           H\nATOM   3530  HE1 TYR A 211       9.124  18.091 -21.320  1.00 58.74           H\nATOM   3531  HE2 TYR A 211       7.333  21.111 -23.825  1.00 59.90           H\nATOM   3532  HH  TYR A 211       8.184  20.074 -20.521  1.00 69.09           H\nATOM   3533  N   THR A 212      10.432  14.731 -27.200  1.00 54.81           N\nATOM   3534  CA  THR A 212      10.621  13.539 -28.029  1.00 53.31           C\nATOM   3535  C   THR A 212      10.116  12.285 -27.287  1.00 53.49           C\nATOM   3536  O   THR A 212       9.797  12.353 -26.099  1.00 53.04           O\nATOM   3537  CB  THR A 212      12.129  13.341 -28.374  1.00 54.65           C\nATOM   3538  OG1 THR A 212      12.892  12.876 -27.273  1.00 54.66           O\nATOM   3539  CG2 THR A 212      12.813  14.571 -28.992  1.00 47.76           C\nATOM   3540  H   THR A 212      10.715  14.631 -26.236  1.00 54.81           H\nATOM   3541  HA  THR A 212      10.047  13.625 -28.954  1.00 53.31           H\nATOM   3542  HB  THR A 212      12.190  12.553 -29.125  1.00 54.65           H\nATOM   3543  HG1 THR A 212      13.815  13.123 -27.410  1.00 54.66           H\nATOM   3544 HG21 THR A 212      13.819  14.330 -29.335  1.00 47.76           H\nATOM   3545 HG22 THR A 212      12.253  14.937 -29.853  1.00 47.76           H\nATOM   3546 HG23 THR A 212      12.899  15.390 -28.278  1.00 47.76           H\nATOM   3547  N   LYS A 213      10.077  11.146 -28.000  1.00 52.29           N\nATOM   3548  CA  LYS A 213       9.788   9.831 -27.420  1.00 48.92           C\nATOM   3549  C   LYS A 213      10.858   9.389 -26.408  1.00 47.29           C\nATOM   3550  O   LYS A 213      10.493   8.888 -25.347  1.00 45.98           O\nATOM   3551  CB  LYS A 213       9.644   8.775 -28.532  1.00 48.25           C\nATOM   3552  CG  LYS A 213       8.412   8.985 -29.423  1.00 51.20           C\nATOM   3553  CD  LYS A 213       8.256   7.866 -30.461  1.00 49.81           C\nATOM   3554  CE  LYS A 213       7.043   8.091 -31.373  1.00 54.53           C\nATOM   3555  NZ  LYS A 213       6.866   6.986 -32.332  1.00 54.50           N1+\nATOM   3556  H   LYS A 213      10.333  11.156 -28.977  1.00 52.29           H\nATOM   3557  HA  LYS A 213       8.838   9.903 -26.887  1.00 48.92           H\nATOM   3558  HB3 LYS A 213       9.564   7.787 -28.076  1.00 48.25           H\nATOM   3559  HB2 LYS A 213      10.546   8.750 -29.146  1.00 48.25           H\nATOM   3560  HG3 LYS A 213       8.481   9.946 -29.933  1.00 51.20           H\nATOM   3561  HG2 LYS A 213       7.517   9.029 -28.802  1.00 51.20           H\nATOM   3562  HD3 LYS A 213       8.164   6.910 -29.943  1.00 49.81           H\nATOM   3563  HD2 LYS A 213       9.165   7.803 -31.062  1.00 49.81           H\nATOM   3564  HE3 LYS A 213       7.158   9.021 -31.927  1.00 54.53           H\nATOM   3565  HE2 LYS A 213       6.140   8.191 -30.771  1.00 54.53           H\nATOM   3566  HZ1 LYS A 213       6.733   6.120 -31.829  1.00 54.50           H\nATOM   3567  HZ2 LYS A 213       6.049   7.167 -32.899  1.00 54.50           H\nATOM   3568  HZ3 LYS A 213       7.681   6.912 -32.924  1.00 54.50           H\nATOM   3569  N   ALA A 214      12.142   9.619 -26.742  1.00 45.00           N\nATOM   3570  CA  ALA A 214      13.308   9.288 -25.920  1.00 45.50           C\nATOM   3571  C   ALA A 214      13.303   9.960 -24.537  1.00 44.64           C\nATOM   3572  O   ALA A 214      13.713   9.318 -23.570  1.00 44.33           O\nATOM   3573  CB  ALA A 214      14.589   9.651 -26.689  1.00 41.66           C\nATOM   3574  H   ALA A 214      12.344  10.063 -27.626  1.00 45.00           H\nATOM   3575  HA  ALA A 214      13.300   8.207 -25.767  1.00 45.50           H\nATOM   3576  HB1 ALA A 214      15.480   9.315 -26.157  1.00 41.66           H\nATOM   3577  HB2 ALA A 214      14.604   9.180 -27.671  1.00 41.66           H\nATOM   3578  HB3 ALA A 214      14.680  10.727 -26.839  1.00 41.66           H\nATOM   3579  N   ILE A 215      12.815  11.211 -24.461  1.00 45.01           N\nATOM   3580  CA  ILE A 215      12.642  11.981 -23.224  1.00 45.62           C\nATOM   3581  C   ILE A 215      11.721  11.285 -22.199  1.00 46.13           C\nATOM   3582  O   ILE A 215      12.058  11.259 -21.015  1.00 46.60           O\nATOM   3583  CB  ILE A 215      12.168  13.440 -23.536  1.00 44.20           C\nATOM   3584  CG1 ILE A 215      13.371  14.255 -24.060  1.00 44.63           C\nATOM   3585  CG2 ILE A 215      11.472  14.191 -22.378  1.00 46.06           C\nATOM   3586  CD1 ILE A 215      13.037  15.547 -24.813  1.00 40.98           C\nATOM   3587  H   ILE A 215      12.513  11.670 -25.310  1.00 45.01           H\nATOM   3588  HA  ILE A 215      13.627  12.041 -22.757  1.00 45.62           H\nATOM   3589  HB  ILE A 215      11.444  13.383 -24.348  1.00 44.20           H\nATOM   3590 HG13 ILE A 215      13.937  13.634 -24.751  1.00 44.63           H\nATOM   3591 HG12 ILE A 215      14.047  14.484 -23.236  1.00 44.63           H\nATOM   3592 HG21 ILE A 215      11.183  15.200 -22.665  1.00 46.06           H\nATOM   3593 HG22 ILE A 215      10.556  13.700 -22.049  1.00 46.06           H\nATOM   3594 HG23 ILE A 215      12.136  14.273 -21.523  1.00 46.06           H\nATOM   3595 HD11 ILE A 215      13.944  16.123 -24.994  1.00 40.98           H\nATOM   3596 HD12 ILE A 215      12.605  15.327 -25.786  1.00 40.98           H\nATOM   3597 HD13 ILE A 215      12.346  16.185 -24.266  1.00 40.98           H\nATOM   3598  N   ASP A 216      10.623  10.677 -22.680  1.00 46.68           N\nATOM   3599  CA  ASP A 216       9.724   9.837 -21.882  1.00 46.86           C\nATOM   3600  C   ASP A 216      10.381   8.529 -21.405  1.00 46.12           C\nATOM   3601  O   ASP A 216      10.090   8.111 -20.287  1.00 45.25           O\nATOM   3602  CB  ASP A 216       8.383   9.538 -22.602  1.00 47.63           C\nATOM   3603  CG  ASP A 216       7.486  10.754 -22.901  1.00 47.35           C\nATOM   3604  OD1 ASP A 216       7.630  11.797 -22.226  1.00 41.99           O\nATOM   3605  OD2 ASP A 216       6.569  10.586 -23.734  1.00 42.26           O1-\nATOM   3606  H   ASP A 216      10.422  10.725 -23.669  1.00 46.68           H\nATOM   3607  HA  ASP A 216       9.496  10.394 -20.971  1.00 46.86           H\nATOM   3608  HB3 ASP A 216       7.799   8.818 -22.031  1.00 47.63           H\nATOM   3609  HB2 ASP A 216       8.601   9.053 -23.553  1.00 47.63           H\nATOM   3610  N   ILE A 217      11.269   7.921 -22.213  1.00 44.38           N\nATOM   3611  CA  ILE A 217      11.960   6.679 -21.844  1.00 43.53           C\nATOM   3612  C   ILE A 217      13.009   6.878 -20.727  1.00 43.93           C\nATOM   3613  O   ILE A 217      13.152   5.984 -19.892  1.00 45.89           O\nATOM   3614  CB  ILE A 217      12.655   5.971 -23.045  1.00 43.54           C\nATOM   3615  CG1 ILE A 217      11.731   5.786 -24.269  1.00 45.78           C\nATOM   3616  CG2 ILE A 217      13.260   4.614 -22.636  1.00 37.88           C\nATOM   3617  CD1 ILE A 217      10.405   5.063 -24.003  1.00 41.92           C\nATOM   3618  H   ILE A 217      11.480   8.311 -23.122  1.00 44.38           H\nATOM   3619  HA  ILE A 217      11.207   5.996 -21.446  1.00 43.53           H\nATOM   3620  HB  ILE A 217      13.481   6.598 -23.385  1.00 43.54           H\nATOM   3621 HG13 ILE A 217      12.269   5.261 -25.059  1.00 45.78           H\nATOM   3622 HG12 ILE A 217      11.510   6.760 -24.692  1.00 45.78           H\nATOM   3623 HG21 ILE A 217      13.579   4.030 -23.491  1.00 37.88           H\nATOM   3624 HG22 ILE A 217      14.138   4.730 -22.001  1.00 37.88           H\nATOM   3625 HG23 ILE A 217      12.528   4.012 -22.098  1.00 37.88           H\nATOM   3626 HD11 ILE A 217       9.862   4.943 -24.939  1.00 41.92           H\nATOM   3627 HD12 ILE A 217      10.563   4.072 -23.578  1.00 41.92           H\nATOM   3628 HD13 ILE A 217       9.762   5.627 -23.328  1.00 41.92           H\nATOM   3629  N   TRP A 218      13.682   8.046 -20.689  1.00 42.79           N\nATOM   3630  CA  TRP A 218      14.576   8.427 -19.589  1.00 44.11           C\nATOM   3631  C   TRP A 218      13.831   8.538 -18.248  1.00 45.47           C\nATOM   3632  O   TRP A 218      14.343   8.047 -17.245  1.00 45.83           O\nATOM   3633  CB  TRP A 218      15.339   9.727 -19.923  1.00 43.37           C\nATOM   3634  CG  TRP A 218      16.256  10.258 -18.852  1.00 44.81           C\nATOM   3635  CD1 TRP A 218      15.866  11.017 -17.802  1.00 46.12           C\nATOM   3636  CD2 TRP A 218      17.686  10.021 -18.653  1.00 43.55           C\nATOM   3637  NE1 TRP A 218      16.945  11.287 -16.989  1.00 47.40           N\nATOM   3638  CE2 TRP A 218      18.095  10.698 -17.462  1.00 46.86           C\nATOM   3639  CE3 TRP A 218      18.687   9.306 -19.352  1.00 45.96           C\nATOM   3640  CZ2 TRP A 218      19.421  10.678 -16.998  1.00 43.08           C\nATOM   3641  CZ3 TRP A 218      20.021   9.274 -18.893  1.00 42.10           C\nATOM   3642  CH2 TRP A 218      20.388   9.957 -17.718  1.00 45.51           C\nATOM   3643  H   TRP A 218      13.521   8.739 -21.407  1.00 42.79           H\nATOM   3644  HA  TRP A 218      15.318   7.634 -19.477  1.00 44.11           H\nATOM   3645  HB3 TRP A 218      14.631  10.516 -20.178  1.00 43.37           H\nATOM   3646  HB2 TRP A 218      15.941   9.564 -20.814  1.00 43.37           H\nATOM   3647  HD1 TRP A 218      14.853  11.352 -17.641  1.00 46.12           H\nATOM   3648  HE1 TRP A 218      16.879  11.846 -16.147  1.00 47.40           H\nATOM   3649  HE3 TRP A 218      18.424   8.768 -20.250  1.00 45.96           H\nATOM   3650  HZ2 TRP A 218      19.693  11.209 -16.097  1.00 43.08           H\nATOM   3651  HZ3 TRP A 218      20.767   8.720 -19.441  1.00 42.10           H\nATOM   3652  HH2 TRP A 218      21.409   9.926 -17.368  1.00 45.51           H\nATOM   3653  N   ALA A 219      12.634   9.150 -18.265  1.00 47.64           N\nATOM   3654  CA  ALA A 219      11.765   9.288 -17.097  1.00 48.26           C\nATOM   3655  C   ALA A 219      11.232   7.944 -16.563  1.00 48.93           C\nATOM   3656  O   ALA A 219      11.066   7.819 -15.352  1.00 51.01           O\nATOM   3657  CB  ALA A 219      10.616  10.245 -17.431  1.00 48.07           C\nATOM   3658  H   ALA A 219      12.277   9.523 -19.133  1.00 47.64           H\nATOM   3659  HA  ALA A 219      12.356   9.746 -16.301  1.00 48.26           H\nATOM   3660  HB1 ALA A 219       9.965  10.391 -16.569  1.00 48.07           H\nATOM   3661  HB2 ALA A 219      10.992  11.226 -17.722  1.00 48.07           H\nATOM   3662  HB3 ALA A 219      10.008   9.868 -18.253  1.00 48.07           H\nATOM   3663  N   ILE A 220      11.029   6.953 -17.452  1.00 48.21           N\nATOM   3664  CA  ILE A 220      10.688   5.572 -17.090  1.00 47.14           C\nATOM   3665  C   ILE A 220      11.887   4.821 -16.470  1.00 46.04           C\nATOM   3666  O   ILE A 220      11.678   4.016 -15.564  1.00 46.86           O\nATOM   3667  CB  ILE A 220      10.147   4.763 -18.308  1.00 45.48           C\nATOM   3668  CG1 ILE A 220       8.830   5.373 -18.839  1.00 45.62           C\nATOM   3669  CG2 ILE A 220       9.939   3.255 -18.034  1.00 44.63           C\nATOM   3670  CD1 ILE A 220       8.485   4.947 -20.275  1.00 44.28           C\nATOM   3671  H   ILE A 220      11.169   7.134 -18.437  1.00 48.21           H\nATOM   3672  HA  ILE A 220       9.897   5.610 -16.338  1.00 47.14           H\nATOM   3673  HB  ILE A 220      10.885   4.846 -19.106  1.00 45.48           H\nATOM   3674 HG13 ILE A 220       8.873   6.460 -18.812  1.00 45.62           H\nATOM   3675 HG12 ILE A 220       8.012   5.118 -18.168  1.00 45.62           H\nATOM   3676 HG21 ILE A 220       9.425   2.764 -18.856  1.00 44.63           H\nATOM   3677 HG22 ILE A 220      10.882   2.724 -17.900  1.00 44.63           H\nATOM   3678 HG23 ILE A 220       9.333   3.097 -17.141  1.00 44.63           H\nATOM   3679 HD11 ILE A 220       8.281   5.822 -20.890  1.00 44.28           H\nATOM   3680 HD12 ILE A 220       9.297   4.401 -20.755  1.00 44.28           H\nATOM   3681 HD13 ILE A 220       7.601   4.308 -20.295  1.00 44.28           H\nATOM   3682  N   GLY A 221      13.114   5.124 -16.933  1.00 45.39           N\nATOM   3683  CA  GLY A 221      14.362   4.600 -16.375  1.00 45.79           C\nATOM   3684  C   GLY A 221      14.638   5.178 -14.980  1.00 45.88           C\nATOM   3685  O   GLY A 221      15.114   4.451 -14.110  1.00 45.82           O\nATOM   3686  H   GLY A 221      13.201   5.788 -17.691  1.00 45.39           H\nATOM   3687  HA3 GLY A 221      15.185   4.862 -17.039  1.00 45.79           H\nATOM   3688  HA2 GLY A 221      14.325   3.513 -16.318  1.00 45.79           H\nATOM   3689  N   CYS A 222      14.287   6.457 -14.753  1.00 44.93           N\nATOM   3690  CA  CYS A 222      14.337   7.124 -13.452  1.00 44.49           C\nATOM   3691  C   CYS A 222      13.362   6.480 -12.453  1.00 43.96           C\nATOM   3692  O   CYS A 222      13.770   6.169 -11.334  1.00 43.52           O\nATOM   3693  CB  CYS A 222      14.050   8.633 -13.554  1.00 44.14           C\nATOM   3694  SG  CYS A 222      15.373   9.485 -14.442  1.00 43.76           S\nATOM   3695  H   CYS A 222      13.937   7.013 -15.523  1.00 44.93           H\nATOM   3696  HA  CYS A 222      15.345   6.992 -13.060  1.00 44.49           H\nATOM   3697  HB3 CYS A 222      13.969   9.086 -12.565  1.00 44.14           H\nATOM   3698  HB2 CYS A 222      13.112   8.818 -14.073  1.00 44.14           H\nATOM   3699  HG  CYS A 222      14.869  10.714 -14.307  1.00 43.76           H\nATOM   3700  N   ILE A 223      12.110   6.264 -12.894  1.00 45.47           N\nATOM   3701  CA  ILE A 223      11.049   5.597 -12.138  1.00 45.97           C\nATOM   3702  C   ILE A 223      11.394   4.134 -11.780  1.00 47.17           C\nATOM   3703  O   ILE A 223      11.127   3.733 -10.650  1.00 46.83           O\nATOM   3704  CB  ILE A 223       9.682   5.686 -12.892  1.00 47.87           C\nATOM   3705  CG1 ILE A 223       9.134   7.133 -12.858  1.00 47.72           C\nATOM   3706  CG2 ILE A 223       8.582   4.708 -12.419  1.00 41.43           C\nATOM   3707  CD1 ILE A 223       8.074   7.434 -13.932  1.00 46.34           C\nATOM   3708  H   ILE A 223      11.860   6.562 -13.828  1.00 45.47           H\nATOM   3709  HA  ILE A 223      10.946   6.138 -11.194  1.00 45.97           H\nATOM   3710  HB  ILE A 223       9.884   5.444 -13.936  1.00 47.87           H\nATOM   3711 HG13 ILE A 223       9.944   7.853 -12.966  1.00 47.72           H\nATOM   3712 HG12 ILE A 223       8.709   7.329 -11.875  1.00 47.72           H\nATOM   3713 HG21 ILE A 223       7.637   4.896 -12.929  1.00 41.43           H\nATOM   3714 HG22 ILE A 223       8.842   3.672 -12.634  1.00 41.43           H\nATOM   3715 HG23 ILE A 223       8.400   4.801 -11.348  1.00 41.43           H\nATOM   3716 HD11 ILE A 223       8.219   8.430 -14.349  1.00 46.34           H\nATOM   3717 HD12 ILE A 223       8.115   6.727 -14.760  1.00 46.34           H\nATOM   3718 HD13 ILE A 223       7.069   7.396 -13.511  1.00 46.34           H\nATOM   3719  N   PHE A 224      12.018   3.388 -12.711  1.00 48.38           N\nATOM   3720  CA  PHE A 224      12.469   2.008 -12.504  1.00 46.86           C\nATOM   3721  C   PHE A 224      13.617   1.881 -11.485  1.00 47.80           C\nATOM   3722  O   PHE A 224      13.577   0.971 -10.659  1.00 49.21           O\nATOM   3723  CB  PHE A 224      12.807   1.349 -13.860  1.00 46.94           C\nATOM   3724  CG  PHE A 224      13.341  -0.081 -13.833  1.00 43.57           C\nATOM   3725  CD1 PHE A 224      12.778  -1.060 -12.982  1.00 45.37           C\nATOM   3726  CD2 PHE A 224      14.293  -0.489 -14.792  1.00 44.16           C\nATOM   3727  CE1 PHE A 224      13.225  -2.374 -13.036  1.00 44.50           C\nATOM   3728  CE2 PHE A 224      14.709  -1.813 -14.847  1.00 41.62           C\nATOM   3729  CZ  PHE A 224      14.189  -2.749 -13.962  1.00 42.16           C\nATOM   3730  H   PHE A 224      12.191   3.781 -13.627  1.00 48.38           H\nATOM   3731  HA  PHE A 224      11.616   1.468 -12.088  1.00 46.86           H\nATOM   3732  HB3 PHE A 224      13.529   1.978 -14.384  1.00 46.94           H\nATOM   3733  HB2 PHE A 224      11.913   1.345 -14.482  1.00 46.94           H\nATOM   3734  HD1 PHE A 224      12.005  -0.797 -12.275  1.00 45.37           H\nATOM   3735  HD2 PHE A 224      14.694   0.221 -15.498  1.00 44.16           H\nATOM   3736  HE1 PHE A 224      12.808  -3.112 -12.367  1.00 44.50           H\nATOM   3737  HE2 PHE A 224      15.433  -2.118 -15.588  1.00 41.62           H\nATOM   3738  HZ  PHE A 224      14.520  -3.776 -14.010  1.00 42.16           H\nATOM   3739  N   ALA A 225      14.587   2.810 -11.523  1.00 48.17           N\nATOM   3740  CA  ALA A 225      15.678   2.888 -10.547  1.00 48.25           C\nATOM   3741  C   ALA A 225      15.183   3.207  -9.127  1.00 50.15           C\nATOM   3742  O   ALA A 225      15.704   2.641  -8.168  1.00 51.27           O\nATOM   3743  CB  ALA A 225      16.705   3.931 -11.003  1.00 46.48           C\nATOM   3744  H   ALA A 225      14.569   3.528 -12.235  1.00 48.17           H\nATOM   3745  HA  ALA A 225      16.172   1.915 -10.517  1.00 48.25           H\nATOM   3746  HB1 ALA A 225      17.528   4.001 -10.291  1.00 46.48           H\nATOM   3747  HB2 ALA A 225      17.136   3.672 -11.969  1.00 46.48           H\nATOM   3748  HB3 ALA A 225      16.256   4.920 -11.098  1.00 46.48           H\nATOM   3749  N   GLU A 226      14.158   4.068  -9.027  1.00 51.12           N\nATOM   3750  CA  GLU A 226      13.488   4.423  -7.780  1.00 51.87           C\nATOM   3751  C   GLU A 226      12.567   3.319  -7.229  1.00 51.94           C\nATOM   3752  O   GLU A 226      12.400   3.243  -6.015  1.00 52.17           O\nATOM   3753  CB  GLU A 226      12.794   5.785  -7.971  1.00 51.19           C\nATOM   3754  CG  GLU A 226      11.967   6.283  -6.764  1.00 52.36           C\nATOM   3755  CD  GLU A 226      11.372   7.692  -6.900  1.00 50.62           C\nATOM   3756  OE1 GLU A 226      11.483   8.294  -7.990  1.00 50.48           O\nATOM   3757  OE2 GLU A 226      10.798   8.159  -5.893  1.00 57.17           O1-\nATOM   3758  H   GLU A 226      13.788   4.494  -9.866  1.00 51.12           H\nATOM   3759  HA  GLU A 226      14.261   4.554  -7.024  1.00 51.87           H\nATOM   3760  HB3 GLU A 226      12.160   5.747  -8.859  1.00 51.19           H\nATOM   3761  HB2 GLU A 226      13.573   6.515  -8.186  1.00 51.19           H\nATOM   3762  HG3 GLU A 226      12.573   6.243  -5.859  1.00 52.36           H\nATOM   3763  HG2 GLU A 226      11.139   5.600  -6.605  1.00 52.36           H\nATOM   3764  N   LEU A 227      12.024   2.458  -8.104  1.00 52.39           N\nATOM   3765  CA  LEU A 227      11.273   1.262  -7.716  1.00 51.11           C\nATOM   3766  C   LEU A 227      12.180   0.160  -7.131  1.00 51.05           C\nATOM   3767  O   LEU A 227      11.743  -0.552  -6.228  1.00 51.03           O\nATOM   3768  CB  LEU A 227      10.489   0.732  -8.937  1.00 51.06           C\nATOM   3769  CG  LEU A 227       9.152   1.445  -9.227  1.00 50.37           C\nATOM   3770  CD1 LEU A 227       8.579   0.997 -10.591  1.00 45.57           C\nATOM   3771  CD2 LEU A 227       8.138   1.267  -8.076  1.00 49.67           C\nATOM   3772  H   LEU A 227      12.168   2.596  -9.095  1.00 52.39           H\nATOM   3773  HA  LEU A 227      10.573   1.543  -6.928  1.00 51.11           H\nATOM   3774  HB3 LEU A 227      10.277  -0.323  -8.802  1.00 51.06           H\nATOM   3775  HB2 LEU A 227      11.126   0.777  -9.819  1.00 51.06           H\nATOM   3776  HG  LEU A 227       9.352   2.514  -9.300  1.00 50.37           H\nATOM   3777 HD11 LEU A 227       7.536   0.687 -10.540  1.00 45.57           H\nATOM   3778 HD12 LEU A 227       8.631   1.810 -11.313  1.00 45.57           H\nATOM   3779 HD13 LEU A 227       9.136   0.160 -11.015  1.00 45.57           H\nATOM   3780 HD21 LEU A 227       7.190   0.853  -8.404  1.00 49.67           H\nATOM   3781 HD22 LEU A 227       8.508   0.603  -7.294  1.00 49.67           H\nATOM   3782 HD23 LEU A 227       7.914   2.224  -7.609  1.00 49.67           H\nATOM   3783  N   LEU A 228      13.419   0.048  -7.640  1.00 49.44           N\nATOM   3784  CA  LEU A 228      14.416  -0.930  -7.199  1.00 50.60           C\nATOM   3785  C   LEU A 228      15.089  -0.570  -5.859  1.00 50.39           C\nATOM   3786  O   LEU A 228      15.512  -1.488  -5.159  1.00 51.19           O\nATOM   3787  CB  LEU A 228      15.488  -1.087  -8.302  1.00 50.20           C\nATOM   3788  CG  LEU A 228      15.016  -1.838  -9.568  1.00 51.02           C\nATOM   3789  CD1 LEU A 228      16.002  -1.623 -10.738  1.00 48.93           C\nATOM   3790  CD2 LEU A 228      14.778  -3.336  -9.296  1.00 51.45           C\nATOM   3791  H   LEU A 228      13.698   0.658  -8.396  1.00 49.44           H\nATOM   3792  HA  LEU A 228      13.918  -1.890  -7.056  1.00 50.60           H\nATOM   3793  HB3 LEU A 228      16.359  -1.605  -7.903  1.00 50.20           H\nATOM   3794  HB2 LEU A 228      15.843  -0.093  -8.579  1.00 50.20           H\nATOM   3795  HG  LEU A 228      14.060  -1.421  -9.883  1.00 51.02           H\nATOM   3796 HD11 LEU A 228      16.368  -2.560 -11.156  1.00 48.93           H\nATOM   3797 HD12 LEU A 228      15.526  -1.072 -11.550  1.00 48.93           H\nATOM   3798 HD13 LEU A 228      16.879  -1.049 -10.438  1.00 48.93           H\nATOM   3799 HD21 LEU A 228      14.820  -3.927 -10.211  1.00 51.45           H\nATOM   3800 HD22 LEU A 228      15.517  -3.742  -8.605  1.00 51.45           H\nATOM   3801 HD23 LEU A 228      13.794  -3.502  -8.859  1.00 51.45           H\nATOM   3802  N   THR A 229      15.206   0.731  -5.539  1.00 50.98           N\nATOM   3803  CA  THR A 229      16.041   1.233  -4.438  1.00 51.07           C\nATOM   3804  C   THR A 229      15.267   2.067  -3.390  1.00 52.96           C\nATOM   3805  O   THR A 229      15.828   2.328  -2.326  1.00 55.55           O\nATOM   3806  CB  THR A 229      17.179   2.131  -4.997  1.00 50.77           C\nATOM   3807  OG1 THR A 229      16.673   3.347  -5.510  1.00 47.78           O\nATOM   3808  CG2 THR A 229      18.032   1.446  -6.080  1.00 48.43           C\nATOM   3809  H   THR A 229      14.827   1.427  -6.166  1.00 50.98           H\nATOM   3810  HA  THR A 229      16.503   0.406  -3.895  1.00 51.07           H\nATOM   3811  HB  THR A 229      17.846   2.396  -4.176  1.00 50.77           H\nATOM   3812  HG1 THR A 229      16.238   3.163  -6.350  1.00 47.78           H\nATOM   3813 HG21 THR A 229      18.875   2.073  -6.373  1.00 48.43           H\nATOM   3814 HG22 THR A 229      18.431   0.495  -5.726  1.00 48.43           H\nATOM   3815 HG23 THR A 229      17.459   1.230  -6.979  1.00 48.43           H\nATOM   3816  N   SER A 230      14.024   2.477  -3.702  1.00 53.51           N\nATOM   3817  CA  SER A 230      13.136   3.340  -2.905  1.00 55.16           C\nATOM   3818  C   SER A 230      13.567   4.824  -2.802  1.00 55.47           C\nATOM   3819  O   SER A 230      12.921   5.568  -2.065  1.00 54.50           O\nATOM   3820  CB  SER A 230      12.803   2.711  -1.527  1.00 55.54           C\nATOM   3821  OG  SER A 230      11.994   1.566  -1.700  1.00 56.13           O\nATOM   3822  H   SER A 230      13.646   2.220  -4.603  1.00 53.51           H\nATOM   3823  HA  SER A 230      12.200   3.377  -3.461  1.00 55.16           H\nATOM   3824  HB3 SER A 230      12.230   3.402  -0.908  1.00 55.54           H\nATOM   3825  HB2 SER A 230      13.693   2.454  -0.953  1.00 55.54           H\nATOM   3826  HG  SER A 230      12.522   0.884  -2.122  1.00 56.13           H\nATOM   3827  N   GLU A 231      14.609   5.244  -3.545  1.00 56.61           N\nATOM   3828  CA  GLU A 231      15.128   6.618  -3.571  1.00 57.16           C\nATOM   3829  C   GLU A 231      15.149   7.139  -5.022  1.00 55.89           C\nATOM   3830  O   GLU A 231      15.536   6.369  -5.902  1.00 54.68           O\nATOM   3831  CB  GLU A 231      16.572   6.636  -3.024  1.00 58.59           C\nATOM   3832  CG  GLU A 231      16.732   6.000  -1.624  1.00 67.11           C\nATOM   3833  CD  GLU A 231      18.007   6.386  -0.853  1.00 76.39           C\nATOM   3834  OE1 GLU A 231      18.874   7.096  -1.411  1.00 79.23           O\nATOM   3835  OE2 GLU A 231      18.082   5.972   0.324  1.00 83.58           O1-\nATOM   3836  H   GLU A 231      15.091   4.584  -4.140  1.00 56.61           H\nATOM   3837  HA  GLU A 231      14.521   7.250  -2.927  1.00 57.16           H\nATOM   3838  HB3 GLU A 231      16.890   7.680  -2.995  1.00 58.59           H\nATOM   3839  HB2 GLU A 231      17.251   6.136  -3.718  1.00 58.59           H\nATOM   3840  HG3 GLU A 231      16.715   4.913  -1.723  1.00 67.11           H\nATOM   3841  HG2 GLU A 231      15.869   6.255  -1.011  1.00 67.11           H\nATOM   3842  N   PRO A 232      14.794   8.428  -5.270  1.00 54.06           N\nATOM   3843  CA  PRO A 232      15.004   9.057  -6.591  1.00 53.11           C\nATOM   3844  C   PRO A 232      16.486   9.050  -7.012  1.00 53.33           C\nATOM   3845  O   PRO A 232      17.324   9.584  -6.282  1.00 53.27           O\nATOM   3846  CB  PRO A 232      14.444  10.487  -6.448  1.00 52.82           C\nATOM   3847  CG  PRO A 232      13.614  10.478  -5.176  1.00 54.31           C\nATOM   3848  CD  PRO A 232      14.251   9.395  -4.316  1.00 54.73           C\nATOM   3849  HA  PRO A 232      14.401   8.506  -7.311  1.00 53.11           H\nATOM   3850  HB3 PRO A 232      13.847  10.780  -7.313  1.00 52.82           H\nATOM   3851  HB2 PRO A 232      15.239  11.226  -6.358  1.00 52.82           H\nATOM   3852  HG3 PRO A 232      12.594  10.186  -5.425  1.00 54.31           H\nATOM   3853  HG2 PRO A 232      13.564  11.449  -4.685  1.00 54.31           H\nATOM   3854  HD2 PRO A 232      15.070   9.800  -3.720  1.00 54.73           H\nATOM   3855  HD3 PRO A 232      13.502   8.976  -3.645  1.00 54.73           H\nATOM   3856  N   ILE A 233      16.778   8.403  -8.153  1.00 52.76           N\nATOM   3857  CA  ILE A 233      18.135   8.196  -8.671  1.00 51.32           C\nATOM   3858  C   ILE A 233      18.938   9.488  -8.929  1.00 51.49           C\nATOM   3859  O   ILE A 233      20.146   9.486  -8.700  1.00 51.33           O\nATOM   3860  CB  ILE A 233      18.158   7.274  -9.930  1.00 50.94           C\nATOM   3861  CG1 ILE A 233      19.580   7.036 -10.492  1.00 50.15           C\nATOM   3862  CG2 ILE A 233      17.204   7.741 -11.044  1.00 47.69           C\nATOM   3863  CD1 ILE A 233      19.754   5.740 -11.293  1.00 44.89           C\nATOM   3864  H   ILE A 233      16.030   7.996  -8.697  1.00 52.76           H\nATOM   3865  HA  ILE A 233      18.674   7.674  -7.882  1.00 51.32           H\nATOM   3866  HB  ILE A 233      17.799   6.301  -9.599  1.00 50.94           H\nATOM   3867 HG13 ILE A 233      20.287   6.996  -9.665  1.00 50.15           H\nATOM   3868 HG12 ILE A 233      19.883   7.882 -11.107  1.00 50.15           H\nATOM   3869 HG21 ILE A 233      17.293   7.117 -11.932  1.00 47.69           H\nATOM   3870 HG22 ILE A 233      16.166   7.695 -10.721  1.00 47.69           H\nATOM   3871 HG23 ILE A 233      17.408   8.764 -11.345  1.00 47.69           H\nATOM   3872 HD11 ILE A 233      20.652   5.796 -11.907  1.00 44.89           H\nATOM   3873 HD12 ILE A 233      19.858   4.879 -10.632  1.00 44.89           H\nATOM   3874 HD13 ILE A 233      18.915   5.550 -11.960  1.00 44.89           H\nATOM   3875  N   PHE A 234      18.257  10.572  -9.330  1.00 51.77           N\nATOM   3876  CA  PHE A 234      18.863  11.878  -9.567  1.00 52.49           C\nATOM   3877  C   PHE A 234      18.223  12.940  -8.653  1.00 52.51           C\nATOM   3878  O   PHE A 234      17.870  14.019  -9.130  1.00 49.36           O\nATOM   3879  CB  PHE A 234      18.785  12.234 -11.069  1.00 52.36           C\nATOM   3880  CG  PHE A 234      19.340  11.191 -12.025  1.00 51.46           C\nATOM   3881  CD1 PHE A 234      20.698  10.817 -11.975  1.00 49.42           C\nATOM   3882  CD2 PHE A 234      18.490  10.557 -12.953  1.00 47.57           C\nATOM   3883  CE1 PHE A 234      21.180   9.854 -12.853  1.00 51.46           C\nATOM   3884  CE2 PHE A 234      18.989   9.585 -13.809  1.00 46.99           C\nATOM   3885  CZ  PHE A 234      20.332   9.240 -13.763  1.00 45.02           C\nATOM   3886  H   PHE A 234      17.259  10.508  -9.498  1.00 51.77           H\nATOM   3887  HA  PHE A 234      19.915  11.847  -9.297  1.00 52.49           H\nATOM   3888  HB3 PHE A 234      19.355  13.146 -11.244  1.00 52.36           H\nATOM   3889  HB2 PHE A 234      17.756  12.458 -11.348  1.00 52.36           H\nATOM   3890  HD1 PHE A 234      21.366  11.277 -11.261  1.00 49.42           H\nATOM   3891  HD2 PHE A 234      17.445  10.821 -12.993  1.00 47.57           H\nATOM   3892  HE1 PHE A 234      22.219   9.577 -12.825  1.00 51.46           H\nATOM   3893  HE2 PHE A 234      18.336   9.101 -14.519  1.00 46.99           H\nATOM   3894  HZ  PHE A 234      20.716   8.489 -14.438  1.00 45.02           H\nATOM   3895  N   HIS A 235      18.111  12.624  -7.347  1.00 55.61           N\nATOM   3896  CA  HIS A 235      17.644  13.533  -6.293  1.00 57.77           C\nATOM   3897  C   HIS A 235      18.562  14.761  -6.143  1.00 57.75           C\nATOM   3898  O   HIS A 235      19.773  14.595  -6.001  1.00 58.16           O\nATOM   3899  CB  HIS A 235      17.536  12.766  -4.957  1.00 58.39           C\nATOM   3900  CG  HIS A 235      16.974  13.579  -3.815  1.00 62.31           C\nATOM   3901  ND1 HIS A 235      17.766  14.335  -2.967  1.00 65.52           N\nATOM   3902  CD2 HIS A 235      15.682  13.761  -3.372  1.00 67.89           C\nATOM   3903  CE1 HIS A 235      16.952  14.938  -2.097  1.00 69.21           C\nATOM   3904  NE2 HIS A 235      15.672  14.636  -2.283  1.00 71.59           N\nATOM   3905  H   HIS A 235      18.391  11.704  -7.038  1.00 55.61           H\nATOM   3906  HA  HIS A 235      16.643  13.868  -6.574  1.00 57.77           H\nATOM   3907  HB3 HIS A 235      18.514  12.382  -4.664  1.00 58.39           H\nATOM   3908  HB2 HIS A 235      16.900  11.892  -5.073  1.00 58.39           H\nATOM   3909  HD1 HIS A 235      18.771  14.430  -3.010  1.00 65.52           H\nATOM   3910  HD2 HIS A 235      14.765  13.345  -3.760  1.00 67.89           H\nATOM   3911  HE1 HIS A 235      17.297  15.605  -1.321  1.00 69.21           H\nATOM   3912  N   CYS A 236      17.957  15.957  -6.149  1.00 58.63           N\nATOM   3913  CA  CYS A 236      18.660  17.238  -6.159  1.00 60.81           C\nATOM   3914  C   CYS A 236      17.815  18.316  -5.450  1.00 61.73           C\nATOM   3915  O   CYS A 236      16.586  18.234  -5.448  1.00 59.65           O\nATOM   3916  CB  CYS A 236      19.018  17.626  -7.613  1.00 59.64           C\nATOM   3917  SG  CYS A 236      20.050  19.114  -7.719  1.00 64.11           S\nATOM   3918  H   CYS A 236      16.951  16.004  -6.234  1.00 58.63           H\nATOM   3919  HA  CYS A 236      19.585  17.132  -5.590  1.00 60.81           H\nATOM   3920  HB3 CYS A 236      18.106  17.797  -8.185  1.00 59.64           H\nATOM   3921  HB2 CYS A 236      19.554  16.815  -8.106  1.00 59.64           H\nATOM   3922  HG  CYS A 236      20.235  19.067  -9.041  1.00 64.11           H\nATOM   3923  N   ARG A 237      18.502  19.325  -4.888  1.00 65.47           N\nATOM   3924  CA  ARG A 237      17.926  20.534  -4.292  1.00 69.21           C\nATOM   3925  C   ARG A 237      17.269  21.457  -5.350  1.00 72.27           C\nATOM   3926  O   ARG A 237      17.545  21.333  -6.543  1.00 72.09           O\nATOM   3927  CB  ARG A 237      19.048  21.228  -3.478  1.00 69.67           C\nATOM   3928  CG  ARG A 237      18.618  22.451  -2.639  0.00 69.17           C\nATOM   3929  CD  ARG A 237      19.775  23.082  -1.848  0.00 69.14           C\nATOM   3930  NE  ARG A 237      19.355  24.297  -1.123  0.00 69.09           N\nATOM   3931  CZ  ARG A 237      19.244  25.554  -1.599  0.00 69.04           C\nATOM   3932  NH1 ARG A 237      19.529  25.878  -2.868  0.00 69.01           N\nATOM   3933  NH2 ARG A 237      18.830  26.523  -0.773  0.00 68.99           N1+\nATOM   3934  H   ARG A 237      19.509  19.325  -4.965  1.00 65.47           H\nATOM   3935  HA  ARG A 237      17.146  20.217  -3.597  1.00 69.21           H\nATOM   3936  HB3 ARG A 237      19.851  21.514  -4.156  1.00 69.67           H\nATOM   3937  HB2 ARG A 237      19.491  20.497  -2.800  1.00 69.67           H\nATOM   3938  HG3 ARG A 237      17.875  22.086  -1.929  1.00 69.17           H\nATOM   3939  HG2 ARG A 237      18.121  23.220  -3.228  1.00 69.17           H\nATOM   3940  HD3 ARG A 237      20.666  23.235  -2.458  1.00 69.14           H\nATOM   3941  HD2 ARG A 237      20.066  22.384  -1.063  1.00 69.14           H\nATOM   3942  HE  ARG A 237      19.088  24.140  -0.163  1.00 69.09           H\nATOM   3943 HH12 ARG A 237      19.425  26.825  -3.200  1.00 69.01           H\nATOM   3944 HH11 ARG A 237      19.805  25.155  -3.528  1.00 69.01           H\nATOM   3945 HH22 ARG A 237      18.732  27.471  -1.108  1.00 68.99           H\nATOM   3946 HH21 ARG A 237      18.607  26.316   0.190  1.00 68.99           H\nATOM   3947  N   GLN A 238      16.386  22.350  -4.878  1.00 76.47           N\nATOM   3948  CA  GLN A 238      15.621  23.310  -5.676  1.00 79.58           C\nATOM   3949  C   GLN A 238      16.385  24.635  -5.903  1.00 81.52           C\nATOM   3950  O   GLN A 238      17.104  25.083  -5.011  1.00 82.48           O\nATOM   3951  CB  GLN A 238      14.304  23.597  -4.918  1.00 79.51           C\nATOM   3952  CG  GLN A 238      13.383  22.370  -4.751  0.00 79.33           C\nATOM   3953  CD  GLN A 238      12.188  22.631  -3.828  0.00 79.36           C\nATOM   3954  OE1 GLN A 238      11.690  23.750  -3.736  0.00 79.35           O\nATOM   3955  NE2 GLN A 238      11.703  21.585  -3.157  0.00 79.37           N\nATOM   3956  H   GLN A 238      16.223  22.394  -3.883  1.00 76.47           H\nATOM   3957  HA  GLN A 238      15.383  22.867  -6.645  1.00 79.58           H\nATOM   3958  HB3 GLN A 238      13.745  24.372  -5.443  1.00 79.51           H\nATOM   3959  HB2 GLN A 238      14.540  24.011  -3.936  1.00 79.51           H\nATOM   3960  HG3 GLN A 238      13.942  21.520  -4.359  1.00 79.33           H\nATOM   3961  HG2 GLN A 238      12.995  22.075  -5.724  1.00 79.33           H\nATOM   3962 HE22 GLN A 238      10.910  21.707  -2.544  1.00 79.37           H\nATOM   3963 HE21 GLN A 238      12.123  20.672  -3.251  1.00 79.37           H\nATOM   3964  N   GLU A 239      16.123  25.273  -7.061  1.00 83.62           N\nATOM   3965  CA  GLU A 239      16.404  26.679  -7.424  1.00 84.73           C\nATOM   3966  C   GLU A 239      17.869  27.131  -7.619  1.00 85.52           C\nATOM   3967  O   GLU A 239      18.057  28.256  -8.083  1.00 86.64           O\nATOM   3968  CB  GLU A 239      15.721  27.668  -6.450  1.00 85.11           C\nATOM   3969  CG  GLU A 239      14.188  27.543  -6.347  0.00 84.81           C\nATOM   3970  CD  GLU A 239      13.522  28.606  -5.454  0.00 84.90           C\nATOM   3971  OE1 GLU A 239      14.152  29.650  -5.168  0.00 84.88           O\nATOM   3972  OE2 GLU A 239      12.360  28.355  -5.068  0.00 84.90           O1-\nATOM   3973  H   GLU A 239      15.535  24.792  -7.725  1.00 83.62           H\nATOM   3974  HA  GLU A 239      15.936  26.811  -8.401  1.00 84.73           H\nATOM   3975  HB3 GLU A 239      15.960  28.687  -6.760  1.00 85.11           H\nATOM   3976  HB2 GLU A 239      16.154  27.559  -5.454  1.00 85.11           H\nATOM   3977  HG3 GLU A 239      13.923  26.557  -5.969  1.00 84.81           H\nATOM   3978  HG2 GLU A 239      13.751  27.620  -7.343  1.00 84.81           H\nATOM   3979  N   ASP A 240      18.863  26.294  -7.282  1.00 39.20           N\nATOM   3980  CA  ASP A 240      20.321  26.557  -7.232  1.00 38.03           C\nATOM   3981  C   ASP A 240      20.981  27.227  -8.463  1.00 38.61           C\nATOM   3982  O   ASP A 240      22.146  27.619  -8.383  1.00 38.19           O\nATOM   3983  CB  ASP A 240      21.162  25.283  -6.897  1.00  0.00           C\nATOM   3984  CG  ASP A 240      20.384  24.048  -6.424  1.00  0.00           C\nATOM   3985  OD1 ASP A 240      19.827  23.348  -7.299  1.00  0.00           O\nATOM   3986  OD2 ASP A 240      20.217  23.920  -5.194  1.00  0.00           O1-\nATOM   3987  HB2 ASP A 240      21.751  24.962  -7.757  1.00  0.00           H\nATOM   3988  HB3 ASP A 240      21.901  25.535  -6.134  1.00  0.00           H\nATOM   3989  H   ASP A 240      18.600  25.382  -6.932  1.00 39.20           H\nATOM   3990  HA  ASP A 240      20.447  27.254  -6.402  1.00 38.03           H\nATOM   3991  N   ILE A 241      20.264  27.253  -9.592  1.00 39.83           N\nATOM   3992  CA  ILE A 241      20.813  27.210 -10.939  1.00 39.77           C\nATOM   3993  C   ILE A 241      20.335  28.353 -11.867  1.00 40.23           C\nATOM   3994  O   ILE A 241      20.592  28.285 -13.069  1.00 39.92           O\nATOM   3995  CB  ILE A 241      20.399  25.853 -11.566  1.00  0.00           C\nATOM   3996  CG1 ILE A 241      18.866  25.669 -11.753  1.00  0.00           C\nATOM   3997  CG2 ILE A 241      21.060  24.650 -10.865  1.00  0.00           C\nATOM   3998  CD1 ILE A 241      18.080  25.052 -10.581  1.00  0.00           C\nATOM   3999  HB  ILE A 241      20.830  25.847 -12.566  1.00  0.00           H\nATOM   4000 HG12 ILE A 241      18.377  26.589 -12.066  1.00  0.00           H\nATOM   4001 HG13 ILE A 241      18.739  25.008 -12.599  1.00  0.00           H\nATOM   4002 HG21 ILE A 241      20.813  23.717 -11.369  1.00  0.00           H\nATOM   4003 HG22 ILE A 241      22.143  24.753 -10.851  1.00  0.00           H\nATOM   4004 HG23 ILE A 241      20.746  24.540  -9.830  1.00  0.00           H\nATOM   4005 HD11 ILE A 241      17.131  25.567 -10.435  1.00  0.00           H\nATOM   4006 HD12 ILE A 241      17.853  24.004 -10.777  1.00  0.00           H\nATOM   4007 HD13 ILE A 241      18.616  25.089  -9.638  1.00  0.00           H\nATOM   4008  H   ILE A 241      19.294  26.979  -9.530  1.00 39.83           H\nATOM   4009  HA  ILE A 241      21.903  27.265 -10.910  1.00 39.77           H\nATOM   4010  N   LYS A 242      19.671  29.380 -11.305  1.00 40.52           N\nATOM   4011  CA  LYS A 242      19.146  30.571 -11.999  1.00 40.12           C\nATOM   4012  C   LYS A 242      17.971  30.227 -12.949  1.00 40.07           C\nATOM   4013  O   LYS A 242      17.932  30.727 -14.074  1.00 39.51           O\nATOM   4014  CB  LYS A 242      20.268  31.380 -12.720  1.00  0.00           C\nATOM   4015  CG  LYS A 242      21.562  31.613 -11.903  1.00  0.00           C\nATOM   4016  CD  LYS A 242      22.773  30.795 -12.408  1.00  0.00           C\nATOM   4017  CE  LYS A 242      23.590  30.149 -11.277  1.00  0.00           C\nATOM   4018  NZ  LYS A 242      24.652  29.270 -11.803  1.00  0.00           N1+\nATOM   4019  HB2 LYS A 242      20.523  30.908 -13.669  1.00  0.00           H\nATOM   4020  HB3 LYS A 242      19.857  32.350 -13.001  1.00  0.00           H\nATOM   4021  HG2 LYS A 242      21.819  32.673 -11.939  1.00  0.00           H\nATOM   4022  HG3 LYS A 242      21.376  31.407 -10.848  1.00  0.00           H\nATOM   4023  HD2 LYS A 242      22.462  30.030 -13.118  1.00  0.00           H\nATOM   4024  HD3 LYS A 242      23.422  31.461 -12.978  1.00  0.00           H\nATOM   4025  HE2 LYS A 242      24.039  30.916 -10.645  1.00  0.00           H\nATOM   4026  HE3 LYS A 242      22.941  29.549 -10.639  1.00  0.00           H\nATOM   4027  HZ1 LYS A 242      25.292  29.810 -12.367  1.00  0.00           H\nATOM   4028  HZ2 LYS A 242      25.155  28.851 -11.034  1.00  0.00           H\nATOM   4029  HZ3 LYS A 242      24.240  28.542 -12.369  1.00  0.00           H\nATOM   4030  H   LYS A 242      19.505  29.351 -10.309  1.00 40.52           H\nATOM   4031  HA  LYS A 242      18.728  31.212 -11.222  1.00 40.12           H\nATOM   4032  N   THR A 243      17.056  29.359 -12.476  1.00 39.24           N\nATOM   4033  CA  THR A 243      15.968  28.715 -13.226  1.00 39.28           C\nATOM   4034  C   THR A 243      14.996  29.675 -13.969  1.00 39.02           C\nATOM   4035  O   THR A 243      14.875  30.841 -13.593  1.00 37.21           O\nATOM   4036  CB  THR A 243      15.176  27.758 -12.286  1.00  0.00           C\nATOM   4037  OG1 THR A 243      14.250  26.953 -12.994  1.00  0.00           O\nATOM   4038  CG2 THR A 243      14.397  28.463 -11.160  1.00  0.00           C\nATOM   4039  HB  THR A 243      15.886  27.071 -11.825  1.00  0.00           H\nATOM   4040  HG1 THR A 243      14.736  26.320 -13.531  1.00  0.00           H\nATOM   4041 HG21 THR A 243      15.059  29.063 -10.535  1.00  0.00           H\nATOM   4042 HG22 THR A 243      13.618  29.120 -11.547  1.00  0.00           H\nATOM   4043 HG23 THR A 243      13.914  27.735 -10.507  1.00  0.00           H\nATOM   4044  H   THR A 243      17.166  29.031 -11.528  1.00 39.24           H\nATOM   4045  HA  THR A 243      16.455  28.100 -13.984  1.00 39.28           H\nATOM   4046  N   SER A 244      14.355  29.123 -15.016  1.00 86.11           N\nATOM   4047  CA  SER A 244      13.507  29.695 -16.079  1.00 86.07           C\nATOM   4048  C   SER A 244      14.135  29.397 -17.451  1.00 85.26           C\nATOM   4049  O   SER A 244      13.407  29.094 -18.397  1.00 85.69           O\nATOM   4050  CB  SER A 244      13.097  31.180 -15.900  1.00 86.52           C\nATOM   4051  OG  SER A 244      14.154  32.084 -16.161  1.00 86.47           O\nATOM   4052  HA  SER A 244      12.586  29.112 -16.031  1.00 86.07           H\nATOM   4053  HB3 SER A 244      12.687  31.360 -14.905  1.00 86.52           H\nATOM   4054  HB2 SER A 244      12.293  31.414 -16.599  1.00 86.52           H\nATOM   4055  HG  SER A 244      14.777  32.028 -15.429  1.00 86.47           H\nATOM   4056  H   SER A 244      14.543  28.142 -15.167  1.00 86.11           H\nATOM   4057  N   ASN A 245      15.479  29.404 -17.495  1.00 83.09           N\nATOM   4058  CA  ASN A 245      16.315  28.826 -18.549  1.00 80.73           C\nATOM   4059  C   ASN A 245      16.253  27.277 -18.522  1.00 77.41           C\nATOM   4060  O   ASN A 245      15.941  26.708 -17.472  1.00 76.67           O\nATOM   4061  CB  ASN A 245      17.769  29.363 -18.394  1.00 81.67           C\nATOM   4062  CG  ASN A 245      18.526  28.972 -17.111  1.00 83.09           C\nATOM   4063  OD1 ASN A 245      17.940  28.554 -16.116  1.00 84.51           O\nATOM   4064  ND2 ASN A 245      19.852  29.116 -17.128  1.00 83.47           N\nATOM   4065  H   ASN A 245      15.980  29.663 -16.656  1.00 83.09           H\nATOM   4066  HA  ASN A 245      15.915  29.182 -19.499  1.00 80.73           H\nATOM   4067  HB3 ASN A 245      17.756  30.452 -18.453  1.00 81.67           H\nATOM   4068  HB2 ASN A 245      18.376  29.032 -19.235  1.00 81.67           H\nATOM   4069 HD22 ASN A 245      20.388  28.872 -16.307  1.00 83.47           H\nATOM   4070 HD21 ASN A 245      20.326  29.467 -17.948  1.00 83.47           H\nATOM   4071  N   PRO A 246      16.585  26.608 -19.650  1.00 73.51           N\nATOM   4072  CA  PRO A 246      16.658  25.138 -19.683  1.00 70.45           C\nATOM   4073  C   PRO A 246      17.875  24.527 -18.960  1.00 67.03           C\nATOM   4074  O   PRO A 246      17.811  23.345 -18.631  1.00 66.23           O\nATOM   4075  CB  PRO A 246      16.680  24.816 -21.182  1.00 70.32           C\nATOM   4076  CG  PRO A 246      17.355  26.023 -21.814  1.00 72.63           C\nATOM   4077  CD  PRO A 246      16.830  27.183 -20.976  1.00 73.71           C\nATOM   4078  HA  PRO A 246      15.759  24.704 -19.241  1.00 70.45           H\nATOM   4079  HB3 PRO A 246      15.656  24.730 -21.545  1.00 70.32           H\nATOM   4080  HB2 PRO A 246      17.188  23.881 -21.417  1.00 70.32           H\nATOM   4081  HG3 PRO A 246      17.150  26.134 -22.879  1.00 72.63           H\nATOM   4082  HG2 PRO A 246      18.436  25.942 -21.690  1.00 72.63           H\nATOM   4083  HD2 PRO A 246      17.536  28.011 -20.979  1.00 73.71           H\nATOM   4084  HD3 PRO A 246      15.882  27.542 -21.378  1.00 73.71           H\nATOM   4085  N   TYR A 247      18.942  25.311 -18.724  1.00 62.92           N\nATOM   4086  CA  TYR A 247      20.161  24.847 -18.062  1.00 61.50           C\nATOM   4087  C   TYR A 247      19.989  24.797 -16.537  1.00 61.34           C\nATOM   4088  O   TYR A 247      19.649  25.816 -15.935  1.00 62.85           O\nATOM   4089  CB  TYR A 247      21.342  25.746 -18.471  1.00 61.66           C\nATOM   4090  CG  TYR A 247      22.705  25.253 -18.014  1.00 60.68           C\nATOM   4091  CD1 TYR A 247      23.331  24.189 -18.696  1.00 58.55           C\nATOM   4092  CD2 TYR A 247      23.353  25.856 -16.915  1.00 57.85           C\nATOM   4093  CE1 TYR A 247      24.606  23.744 -18.301  1.00 56.07           C\nATOM   4094  CE2 TYR A 247      24.627  25.409 -16.517  1.00 58.42           C\nATOM   4095  CZ  TYR A 247      25.259  24.360 -17.216  1.00 59.00           C\nATOM   4096  OH  TYR A 247      26.513  23.961 -16.864  1.00 58.13           O\nATOM   4097  H   TYR A 247      18.931  26.278 -19.014  1.00 62.92           H\nATOM   4098  HA  TYR A 247      20.377  23.842 -18.420  1.00 61.50           H\nATOM   4099  HB3 TYR A 247      21.185  26.766 -18.118  1.00 61.66           H\nATOM   4100  HB2 TYR A 247      21.375  25.817 -19.557  1.00 61.66           H\nATOM   4101  HD1 TYR A 247      22.837  23.717 -19.534  1.00 58.55           H\nATOM   4102  HD2 TYR A 247      22.879  26.667 -16.382  1.00 57.85           H\nATOM   4103  HE1 TYR A 247      25.088  22.941 -18.839  1.00 56.07           H\nATOM   4104  HE2 TYR A 247      25.127  25.886 -15.687  1.00 58.42           H\nATOM   4105  HH  TYR A 247      26.951  24.586 -16.274  1.00 58.13           H\nATOM   4106  N   HIS A 248      20.251  23.616 -15.950  1.00 60.78           N\nATOM   4107  CA  HIS A 248      20.195  23.389 -14.508  1.00 61.08           C\nATOM   4108  C   HIS A 248      21.473  22.654 -14.078  1.00 58.91           C\nATOM   4109  O   HIS A 248      21.551  21.435 -14.229  1.00 58.81           O\nATOM   4110  CB  HIS A 248      18.889  22.655 -14.094  1.00 63.68           C\nATOM   4111  CG  HIS A 248      17.586  23.313 -14.515  1.00 68.18           C\nATOM   4112  ND1 HIS A 248      17.093  23.249 -15.806  1.00 72.43           N\nATOM   4113  CD2 HIS A 248      16.647  24.047 -13.820  1.00 71.25           C\nATOM   4114  CE1 HIS A 248      15.962  23.957 -15.844  1.00 75.22           C\nATOM   4115  NE2 HIS A 248      15.630  24.477 -14.673  1.00 73.61           N\nATOM   4116  H   HIS A 248      20.542  22.829 -16.512  1.00 60.78           H\nATOM   4117  HA  HIS A 248      20.208  24.352 -14.010  1.00 61.08           H\nATOM   4118  HB3 HIS A 248      18.868  22.545 -13.009  1.00 63.68           H\nATOM   4119  HB2 HIS A 248      18.893  21.640 -14.487  1.00 63.68           H\nATOM   4120  HD1 HIS A 248      17.539  22.812 -16.602  1.00 72.43           H\nATOM   4121  HD2 HIS A 248      16.619  24.315 -12.777  1.00 71.25           H\nATOM   4122  HE1 HIS A 248      15.388  24.106 -16.746  1.00 75.22           H\nATOM   4123  N   HIS A 249      22.456  23.429 -13.578  1.00 56.95           N\nATOM   4124  CA  HIS A 249      23.795  22.985 -13.175  1.00 56.40           C\nATOM   4125  C   HIS A 249      23.811  21.839 -12.148  1.00 55.36           C\nATOM   4126  O   HIS A 249      24.416  20.810 -12.431  1.00 54.76           O\nATOM   4127  CB  HIS A 249      24.639  24.193 -12.705  1.00 56.04           C\nATOM   4128  CG  HIS A 249      26.028  23.857 -12.207  1.00 55.49           C\nATOM   4129  ND1 HIS A 249      26.307  23.573 -10.880  1.00 54.60           N\nATOM   4130  CD2 HIS A 249      27.232  23.752 -12.865  1.00 59.89           C\nATOM   4131  CE1 HIS A 249      27.610  23.294 -10.799  1.00 57.38           C\nATOM   4132  NE2 HIS A 249      28.237  23.385 -11.965  1.00 62.10           N\nATOM   4133  H   HIS A 249      22.293  24.423 -13.505  1.00 56.95           H\nATOM   4134  HA  HIS A 249      24.271  22.598 -14.079  1.00 56.40           H\nATOM   4135  HB3 HIS A 249      24.123  24.732 -11.912  1.00 56.04           H\nATOM   4136  HB2 HIS A 249      24.745  24.902 -13.526  1.00 56.04           H\nATOM   4137  HD1 HIS A 249      25.643  23.557 -10.110  1.00 54.60           H\nATOM   4138  HD2 HIS A 249      27.445  23.888 -13.914  1.00 59.89           H\nATOM   4139  HE1 HIS A 249      28.105  23.023  -9.877  1.00 57.38           H\nATOM   4140  N   ASP A 250      23.179  22.021 -10.976  1.00 54.49           N\nATOM   4141  CA  ASP A 250      23.240  21.037  -9.884  1.00 55.10           C\nATOM   4142  C   ASP A 250      22.517  19.715 -10.211  1.00 52.74           C\nATOM   4143  O   ASP A 250      22.892  18.680  -9.658  1.00 53.90           O\nATOM   4144  CB  ASP A 250      22.817  21.570  -8.491  1.00 57.58           C\nATOM   4145  CG  ASP A 250      23.663  22.714  -7.892  1.00 61.50           C\nATOM   4146  OD1 ASP A 250      24.253  23.513  -8.653  1.00 65.61           O\nATOM   4147  OD2 ASP A 250      23.614  22.844  -6.650  1.00 68.93           O1-\nATOM   4148  H   ASP A 250      22.711  22.893 -10.772  1.00 54.49           H\nATOM   4149  HA  ASP A 250      24.295  20.784  -9.779  1.00 55.10           H\nATOM   4150  HB3 ASP A 250      22.796  20.747  -7.773  1.00 57.58           H\nATOM   4151  HB2 ASP A 250      21.795  21.941  -8.561  1.00 57.58           H\nATOM   4152  N   GLN A 251      21.535  19.753 -11.130  1.00 50.89           N\nATOM   4153  CA  GLN A 251      20.871  18.563 -11.660  1.00 49.76           C\nATOM   4154  C   GLN A 251      21.788  17.764 -12.609  1.00 49.30           C\nATOM   4155  O   GLN A 251      21.787  16.536 -12.536  1.00 49.13           O\nATOM   4156  CB  GLN A 251      19.546  18.970 -12.343  1.00 50.04           C\nATOM   4157  CG  GLN A 251      18.656  17.784 -12.768  1.00 48.79           C\nATOM   4158  CD  GLN A 251      18.199  16.939 -11.581  1.00 49.99           C\nATOM   4159  OE1 GLN A 251      17.557  17.447 -10.667  1.00 46.75           O\nATOM   4160  NE2 GLN A 251      18.517  15.646 -11.594  1.00 45.81           N\nATOM   4161  H   GLN A 251      21.268  20.638 -11.537  1.00 50.89           H\nATOM   4162  HA  GLN A 251      20.642  17.922 -10.806  1.00 49.76           H\nATOM   4163  HB3 GLN A 251      19.758  19.584 -13.218  1.00 50.04           H\nATOM   4164  HB2 GLN A 251      18.974  19.610 -11.669  1.00 50.04           H\nATOM   4165  HG3 GLN A 251      19.178  17.149 -13.482  1.00 48.79           H\nATOM   4166  HG2 GLN A 251      17.771  18.156 -13.283  1.00 48.79           H\nATOM   4167 HE22 GLN A 251      18.241  15.054 -10.822  1.00 45.81           H\nATOM   4168 HE21 GLN A 251      19.041  15.254 -12.363  1.00 45.81           H\nATOM   4169  N   LEU A 252      22.572  18.470 -13.446  1.00 48.66           N\nATOM   4170  CA  LEU A 252      23.610  17.892 -14.308  1.00 48.52           C\nATOM   4171  C   LEU A 252      24.767  17.288 -13.496  1.00 47.49           C\nATOM   4172  O   LEU A 252      25.191  16.183 -13.823  1.00 47.64           O\nATOM   4173  CB  LEU A 252      24.133  18.953 -15.303  1.00 47.73           C\nATOM   4174  CG  LEU A 252      23.146  19.284 -16.441  1.00 48.27           C\nATOM   4175  CD1 LEU A 252      23.535  20.600 -17.147  1.00 46.23           C\nATOM   4176  CD2 LEU A 252      22.997  18.106 -17.430  1.00 44.68           C\nATOM   4177  H   LEU A 252      22.510  19.479 -13.449  1.00 48.66           H\nATOM   4178  HA  LEU A 252      23.157  17.076 -14.873  1.00 48.52           H\nATOM   4179  HB3 LEU A 252      25.075  18.628 -15.746  1.00 47.73           H\nATOM   4180  HB2 LEU A 252      24.374  19.862 -14.754  1.00 47.73           H\nATOM   4181  HG  LEU A 252      22.169  19.456 -15.990  1.00 48.27           H\nATOM   4182 HD11 LEU A 252      22.704  21.306 -17.136  1.00 46.23           H\nATOM   4183 HD12 LEU A 252      24.378  21.096 -16.664  1.00 46.23           H\nATOM   4184 HD13 LEU A 252      23.819  20.449 -18.186  1.00 46.23           H\nATOM   4185 HD21 LEU A 252      22.983  18.428 -18.472  1.00 44.68           H\nATOM   4186 HD22 LEU A 252      23.806  17.382 -17.328  1.00 44.68           H\nATOM   4187 HD23 LEU A 252      22.066  17.570 -17.252  1.00 44.68           H\nATOM   4188  N   ASP A 253      25.205  17.986 -12.429  1.00 48.94           N\nATOM   4189  CA  ASP A 253      26.183  17.529 -11.434  1.00 48.67           C\nATOM   4190  C   ASP A 253      25.795  16.167 -10.830  1.00 48.74           C\nATOM   4191  O   ASP A 253      26.611  15.247 -10.860  1.00 48.77           O\nATOM   4192  CB  ASP A 253      26.420  18.606 -10.341  1.00 49.82           C\nATOM   4193  CG  ASP A 253      27.276  18.185  -9.132  1.00 51.19           C\nATOM   4194  OD1 ASP A 253      28.464  17.858  -9.345  1.00 47.92           O\nATOM   4195  OD2 ASP A 253      26.711  18.132  -8.017  1.00 59.52           O1-\nATOM   4196  H   ASP A 253      24.806  18.900 -12.255  1.00 48.94           H\nATOM   4197  HA  ASP A 253      27.123  17.385 -11.970  1.00 48.67           H\nATOM   4198  HB3 ASP A 253      25.455  18.951  -9.980  1.00 49.82           H\nATOM   4199  HB2 ASP A 253      26.873  19.490 -10.790  1.00 49.82           H\nATOM   4200  N   ARG A 254      24.546  16.065 -10.344  1.00 49.84           N\nATOM   4201  CA  ARG A 254      23.966  14.849  -9.778  1.00 50.40           C\nATOM   4202  C   ARG A 254      23.890  13.677 -10.776  1.00 48.77           C\nATOM   4203  O   ARG A 254      24.154  12.544 -10.375  1.00 49.71           O\nATOM   4204  CB  ARG A 254      22.590  15.179  -9.159  1.00 50.67           C\nATOM   4205  CG  ARG A 254      21.816  13.964  -8.615  1.00 53.88           C\nATOM   4206  CD  ARG A 254      22.504  13.249  -7.434  1.00 53.19           C\nATOM   4207  NE  ARG A 254      21.847  11.975  -7.091  1.00 56.32           N\nATOM   4208  CZ  ARG A 254      22.124  11.170  -6.047  1.00 59.10           C\nATOM   4209  NH1 ARG A 254      23.088  11.458  -5.158  1.00 63.74           N\nATOM   4210  NH2 ARG A 254      21.417  10.045  -5.891  1.00 59.15           N1+\nATOM   4211  H   ARG A 254      23.948  16.882 -10.352  1.00 49.84           H\nATOM   4212  HA  ARG A 254      24.634  14.540  -8.973  1.00 50.40           H\nATOM   4213  HB3 ARG A 254      21.965  15.660  -9.913  1.00 50.67           H\nATOM   4214  HB2 ARG A 254      22.715  15.918  -8.366  1.00 50.67           H\nATOM   4215  HG3 ARG A 254      21.547  13.270  -9.410  1.00 53.88           H\nATOM   4216  HG2 ARG A 254      20.870  14.373  -8.264  1.00 53.88           H\nATOM   4217  HD3 ARG A 254      22.369  13.875  -6.552  1.00 53.19           H\nATOM   4218  HD2 ARG A 254      23.578  13.133  -7.569  1.00 53.19           H\nATOM   4219  HE  ARG A 254      21.128  11.670  -7.733  1.00 56.32           H\nATOM   4220 HH12 ARG A 254      23.276  10.840  -4.383  1.00 63.74           H\nATOM   4221 HH11 ARG A 254      23.629  12.304  -5.262  1.00 63.74           H\nATOM   4222 HH22 ARG A 254      21.583   9.430  -5.108  1.00 59.15           H\nATOM   4223 HH21 ARG A 254      20.727   9.777  -6.582  1.00 59.15           H\nATOM   4224  N   ILE A 255      23.562  13.967 -12.048  1.00 47.57           N\nATOM   4225  CA  ILE A 255      23.559  12.983 -13.132  1.00 47.72           C\nATOM   4226  C   ILE A 255      24.969  12.435 -13.433  1.00 47.63           C\nATOM   4227  O   ILE A 255      25.096  11.231 -13.637  1.00 46.85           O\nATOM   4228  CB  ILE A 255      22.873  13.528 -14.425  1.00 47.44           C\nATOM   4229  CG1 ILE A 255      21.348  13.676 -14.205  1.00 48.60           C\nATOM   4230  CG2 ILE A 255      23.130  12.708 -15.711  1.00 47.13           C\nATOM   4231  CD1 ILE A 255      20.658  14.606 -15.212  1.00 43.46           C\nATOM   4232  H   ILE A 255      23.347  14.921 -12.305  1.00 47.57           H\nATOM   4233  HA  ILE A 255      22.972  12.132 -12.788  1.00 47.72           H\nATOM   4234  HB  ILE A 255      23.273  14.527 -14.602  1.00 47.44           H\nATOM   4235 HG13 ILE A 255      21.140  14.047 -13.202  1.00 48.60           H\nATOM   4236 HG12 ILE A 255      20.879  12.692 -14.250  1.00 48.60           H\nATOM   4237 HG21 ILE A 255      22.582  13.117 -16.560  1.00 47.13           H\nATOM   4238 HG22 ILE A 255      24.181  12.708 -15.997  1.00 47.13           H\nATOM   4239 HG23 ILE A 255      22.814  11.671 -15.588  1.00 47.13           H\nATOM   4240 HD11 ILE A 255      19.752  15.033 -14.781  1.00 43.46           H\nATOM   4241 HD12 ILE A 255      21.302  15.435 -15.506  1.00 43.46           H\nATOM   4242 HD13 ILE A 255      20.367  14.069 -16.116  1.00 43.46           H\nATOM   4243  N   PHE A 256      26.000  13.297 -13.397  1.00 49.59           N\nATOM   4244  CA  PHE A 256      27.397  12.906 -13.605  1.00 49.58           C\nATOM   4245  C   PHE A 256      28.016  12.184 -12.391  1.00 50.62           C\nATOM   4246  O   PHE A 256      28.909  11.365 -12.593  1.00 51.58           O\nATOM   4247  CB  PHE A 256      28.239  14.136 -13.991  1.00 50.12           C\nATOM   4248  CG  PHE A 256      27.768  14.933 -15.197  1.00 49.75           C\nATOM   4249  CD1 PHE A 256      27.306  14.296 -16.371  1.00 49.09           C\nATOM   4250  CD2 PHE A 256      27.916  16.336 -15.195  1.00 45.31           C\nATOM   4251  CE1 PHE A 256      26.920  15.058 -17.466  1.00 49.82           C\nATOM   4252  CE2 PHE A 256      27.516  17.078 -16.296  1.00 49.11           C\nATOM   4253  CZ  PHE A 256      27.014  16.443 -17.424  1.00 51.09           C\nATOM   4254  H   PHE A 256      25.828  14.281 -13.233  1.00 49.59           H\nATOM   4255  HA  PHE A 256      27.429  12.197 -14.433  1.00 49.58           H\nATOM   4256  HB3 PHE A 256      29.269  13.834 -14.183  1.00 50.12           H\nATOM   4257  HB2 PHE A 256      28.270  14.815 -13.138  1.00 50.12           H\nATOM   4258  HD1 PHE A 256      27.232  13.221 -16.426  1.00 49.09           H\nATOM   4259  HD2 PHE A 256      28.311  16.842 -14.326  1.00 45.31           H\nATOM   4260  HE1 PHE A 256      26.548  14.572 -18.356  1.00 49.82           H\nATOM   4261  HE2 PHE A 256      27.600  18.153 -16.266  1.00 49.11           H\nATOM   4262  HZ  PHE A 256      26.707  17.025 -18.279  1.00 51.09           H\nATOM   4263  N   ASN A 257      27.528  12.457 -11.166  1.00 50.98           N\nATOM   4264  CA  ASN A 257      27.908  11.734  -9.942  1.00 54.02           C\nATOM   4265  C   ASN A 257      27.367  10.292  -9.907  1.00 53.02           C\nATOM   4266  O   ASN A 257      27.930   9.472  -9.181  1.00 53.25           O\nATOM   4267  CB  ASN A 257      27.425  12.514  -8.694  1.00 56.17           C\nATOM   4268  CG  ASN A 257      28.286  13.731  -8.339  1.00 61.96           C\nATOM   4269  OD1 ASN A 257      29.512  13.657  -8.354  1.00 70.85           O\nATOM   4270  ND2 ASN A 257      27.649  14.845  -7.977  1.00 68.35           N\nATOM   4271  H   ASN A 257      26.826  13.178 -11.061  1.00 50.98           H\nATOM   4272  HA  ASN A 257      28.998  11.707  -9.950  1.00 54.02           H\nATOM   4273  HB3 ASN A 257      27.477  11.868  -7.816  1.00 56.17           H\nATOM   4274  HB2 ASN A 257      26.376  12.794  -8.797  1.00 56.17           H\nATOM   4275 HD22 ASN A 257      28.172  15.684  -7.762  1.00 68.35           H\nATOM   4276 HD21 ASN A 257      26.642  14.890  -7.975  1.00 68.35           H\nATOM   4277  N   VAL A 258      26.306  10.008 -10.679  1.00 54.28           N\nATOM   4278  CA  VAL A 258      25.640   8.709 -10.725  1.00 53.18           C\nATOM   4279  C   VAL A 258      26.000   7.914 -11.995  1.00 53.88           C\nATOM   4280  O   VAL A 258      26.175   6.706 -11.882  1.00 51.09           O\nATOM   4281  CB  VAL A 258      24.100   8.894 -10.635  1.00 53.78           C\nATOM   4282  CG1 VAL A 258      23.258   7.653 -10.998  1.00 52.05           C\nATOM   4283  CG2 VAL A 258      23.694   9.392  -9.236  1.00 49.71           C\nATOM   4284  H   VAL A 258      25.893  10.741 -11.239  1.00 54.28           H\nATOM   4285  HA  VAL A 258      25.947   8.102  -9.871  1.00 53.18           H\nATOM   4286  HB  VAL A 258      23.828   9.688 -11.331  1.00 53.78           H\nATOM   4287 HG11 VAL A 258      22.207   7.830 -10.783  1.00 52.05           H\nATOM   4288 HG12 VAL A 258      23.319   7.404 -12.058  1.00 52.05           H\nATOM   4289 HG13 VAL A 258      23.569   6.778 -10.428  1.00 52.05           H\nATOM   4290 HG21 VAL A 258      22.634   9.635  -9.203  1.00 49.71           H\nATOM   4291 HG22 VAL A 258      23.888   8.637  -8.475  1.00 49.71           H\nATOM   4292 HG23 VAL A 258      24.235  10.292  -8.949  1.00 49.71           H\nATOM   4293  N   MET A 259      26.097   8.579 -13.160  1.00 55.02           N\nATOM   4294  CA  MET A 259      26.346   7.944 -14.461  1.00 55.07           C\nATOM   4295  C   MET A 259      27.811   8.036 -14.919  1.00 55.84           C\nATOM   4296  O   MET A 259      28.208   7.246 -15.775  1.00 56.48           O\nATOM   4297  CB  MET A 259      25.461   8.607 -15.544  1.00 55.08           C\nATOM   4298  CG  MET A 259      23.945   8.545 -15.295  1.00 54.61           C\nATOM   4299  SD  MET A 259      23.214   6.893 -15.121  1.00 56.14           S\nATOM   4300  CE  MET A 259      23.738   6.139 -16.681  1.00 46.39           C\nATOM   4301  H   MET A 259      25.915   9.574 -13.184  1.00 55.02           H\nATOM   4302  HA  MET A 259      26.092   6.883 -14.413  1.00 55.07           H\nATOM   4303  HB3 MET A 259      25.672   8.164 -16.518  1.00 55.08           H\nATOM   4304  HB2 MET A 259      25.747   9.655 -15.653  1.00 55.08           H\nATOM   4305  HG3 MET A 259      23.429   9.048 -16.114  1.00 54.61           H\nATOM   4306  HG2 MET A 259      23.699   9.110 -14.400  1.00 54.61           H\nATOM   4307  HE1 MET A 259      23.218   5.194 -16.834  1.00 46.39           H\nATOM   4308  HE2 MET A 259      23.515   6.803 -17.516  1.00 46.39           H\nATOM   4309  HE3 MET A 259      24.810   5.941 -16.670  1.00 46.39           H\nATOM   4310  N   GLY A 260      28.569   9.013 -14.395  1.00 55.65           N\nATOM   4311  CA  GLY A 260      29.857   9.432 -14.948  1.00 53.37           C\nATOM   4312  C   GLY A 260      29.636  10.540 -15.991  1.00 52.10           C\nATOM   4313  O   GLY A 260      28.523  10.746 -16.481  1.00 52.15           O\nATOM   4314  H   GLY A 260      28.176   9.610 -13.681  1.00 55.65           H\nATOM   4315  HA3 GLY A 260      30.391   8.598 -15.406  1.00 53.37           H\nATOM   4316  HA2 GLY A 260      30.488   9.810 -14.146  1.00 53.37           H\nATOM   4317  N   PHE A 261      30.721  11.251 -16.340  1.00 52.55           N\nATOM   4318  CA  PHE A 261      30.716  12.292 -17.371  1.00 52.27           C\nATOM   4319  C   PHE A 261      30.874  11.604 -18.748  1.00 52.09           C\nATOM   4320  O   PHE A 261      31.824  10.834 -18.907  1.00 51.92           O\nATOM   4321  CB  PHE A 261      31.887  13.256 -17.085  1.00 50.98           C\nATOM   4322  CG  PHE A 261      31.762  14.599 -17.781  1.00 50.25           C\nATOM   4323  CD1 PHE A 261      30.958  15.607 -17.208  1.00 52.65           C\nATOM   4324  CD2 PHE A 261      32.286  14.797 -19.075  1.00 51.21           C\nATOM   4325  CE1 PHE A 261      30.739  16.795 -17.890  1.00 50.25           C\nATOM   4326  CE2 PHE A 261      32.060  15.995 -19.741  1.00 51.07           C\nATOM   4327  CZ  PHE A 261      31.293  16.991 -19.147  1.00 50.33           C\nATOM   4328  H   PHE A 261      31.615  11.036 -15.924  1.00 52.55           H\nATOM   4329  HA  PHE A 261      29.786  12.850 -17.271  1.00 52.27           H\nATOM   4330  HB3 PHE A 261      32.846  12.803 -17.339  1.00 50.98           H\nATOM   4331  HB2 PHE A 261      31.927  13.456 -16.017  1.00 50.98           H\nATOM   4332  HD1 PHE A 261      30.505  15.455 -16.239  1.00 52.65           H\nATOM   4333  HD2 PHE A 261      32.859  14.019 -19.554  1.00 51.21           H\nATOM   4334  HE1 PHE A 261      30.125  17.564 -17.447  1.00 50.25           H\nATOM   4335  HE2 PHE A 261      32.470  16.148 -20.728  1.00 51.07           H\nATOM   4336  HZ  PHE A 261      31.111  17.919 -19.667  1.00 50.33           H\nATOM   4337  N   PRO A 262      29.938  11.843 -19.698  1.00 50.93           N\nATOM   4338  CA  PRO A 262      29.904  11.117 -20.983  1.00 52.14           C\nATOM   4339  C   PRO A 262      31.094  11.457 -21.898  1.00 53.51           C\nATOM   4340  O   PRO A 262      31.434  12.632 -22.049  1.00 53.76           O\nATOM   4341  CB  PRO A 262      28.559  11.542 -21.600  1.00 50.24           C\nATOM   4342  CG  PRO A 262      28.285  12.921 -21.025  1.00 51.25           C\nATOM   4343  CD  PRO A 262      28.855  12.824 -19.614  1.00 51.81           C\nATOM   4344  HA  PRO A 262      29.892  10.041 -20.800  1.00 52.14           H\nATOM   4345  HB3 PRO A 262      27.781  10.850 -21.275  1.00 50.24           H\nATOM   4346  HB2 PRO A 262      28.556  11.539 -22.692  1.00 50.24           H\nATOM   4347  HG3 PRO A 262      27.231  13.202 -21.048  1.00 51.25           H\nATOM   4348  HG2 PRO A 262      28.842  13.668 -21.592  1.00 51.25           H\nATOM   4349  HD2 PRO A 262      29.193  13.802 -19.266  1.00 51.81           H\nATOM   4350  HD3 PRO A 262      28.104  12.450 -18.918  1.00 51.81           H\nATOM   4351  N   ALA A 263      31.707  10.414 -22.484  1.00 54.21           N\nATOM   4352  CA  ALA A 263      32.752  10.538 -23.503  1.00 54.41           C\nATOM   4353  C   ALA A 263      32.196  11.087 -24.825  1.00 54.10           C\nATOM   4354  O   ALA A 263      30.993  10.992 -25.076  1.00 53.77           O\nATOM   4355  CB  ALA A 263      33.425   9.174 -23.716  1.00 54.56           C\nATOM   4356  H   ALA A 263      31.366   9.475 -22.314  1.00 54.21           H\nATOM   4357  HA  ALA A 263      33.509  11.231 -23.145  1.00 54.41           H\nATOM   4358  HB1 ALA A 263      34.328   9.274 -24.319  1.00 54.56           H\nATOM   4359  HB2 ALA A 263      33.717   8.723 -22.767  1.00 54.56           H\nATOM   4360  HB3 ALA A 263      32.770   8.473 -24.232  1.00 54.56           H\nATOM   4361  N   ASP A 264      33.100  11.625 -25.662  1.00 56.50           N\nATOM   4362  CA  ASP A 264      32.781  12.138 -27.001  1.00 57.94           C\nATOM   4363  C   ASP A 264      32.206  11.049 -27.925  1.00 57.82           C\nATOM   4364  O   ASP A 264      31.324  11.359 -28.720  1.00 58.57           O\nATOM   4365  CB  ASP A 264      33.966  12.847 -27.709  1.00 60.42           C\nATOM   4366  CG  ASP A 264      34.671  13.995 -26.958  1.00 65.51           C\nATOM   4367  OD1 ASP A 264      34.172  14.445 -25.902  1.00 65.68           O\nATOM   4368  OD2 ASP A 264      35.692  14.463 -27.509  1.00 73.31           O1-\nATOM   4369  H   ASP A 264      34.067  11.696 -25.381  1.00 56.50           H\nATOM   4370  HA  ASP A 264      31.990  12.880 -26.868  1.00 57.94           H\nATOM   4371  HB3 ASP A 264      33.619  13.254 -28.660  1.00 60.42           H\nATOM   4372  HB2 ASP A 264      34.731  12.105 -27.946  1.00 60.42           H\nATOM   4373  N   LYS A 265      32.676   9.798 -27.770  1.00 56.77           N\nATOM   4374  CA  LYS A 265      32.152   8.626 -28.471  1.00 57.09           C\nATOM   4375  C   LYS A 265      30.758   8.198 -27.972  1.00 56.58           C\nATOM   4376  O   LYS A 265      29.970   7.732 -28.790  1.00 56.88           O\nATOM   4377  CB  LYS A 265      33.183   7.480 -28.380  1.00 57.39           C\nATOM   4378  CG  LYS A 265      32.795   6.211 -29.163  0.00 57.21           C\nATOM   4379  CD  LYS A 265      33.912   5.159 -29.188  0.00 57.26           C\nATOM   4380  CE  LYS A 265      33.509   3.906 -29.982  0.00 57.25           C\nATOM   4381  NZ  LYS A 265      34.584   2.899 -30.000  0.00 57.25           N1+\nATOM   4382  H   LYS A 265      33.403   9.626 -27.092  1.00 56.77           H\nATOM   4383  HA  LYS A 265      32.049   8.894 -29.525  1.00 57.09           H\nATOM   4384  HB3 LYS A 265      33.358   7.221 -27.334  1.00 57.39           H\nATOM   4385  HB2 LYS A 265      34.136   7.844 -28.766  1.00 57.39           H\nATOM   4386  HG3 LYS A 265      32.531   6.485 -30.186  1.00 57.21           H\nATOM   4387  HG2 LYS A 265      31.904   5.760 -28.726  1.00 57.21           H\nATOM   4388  HD3 LYS A 265      34.167   4.886 -28.163  1.00 57.26           H\nATOM   4389  HD2 LYS A 265      34.811   5.601 -29.622  1.00 57.26           H\nATOM   4390  HE3 LYS A 265      33.266   4.174 -31.011  1.00 57.25           H\nATOM   4391  HE2 LYS A 265      32.616   3.456 -29.548  1.00 57.25           H\nATOM   4392  HZ1 LYS A 265      34.798   2.617 -29.054  1.00 57.25           H\nATOM   4393  HZ2 LYS A 265      34.282   2.093 -30.530  1.00 57.25           H\nATOM   4394  HZ3 LYS A 265      35.409   3.293 -30.429  1.00 57.25           H\nATOM   4395  N   ASP A 266      30.471   8.368 -26.666  1.00 56.78           N\nATOM   4396  CA  ASP A 266      29.185   8.022 -26.039  1.00 56.79           C\nATOM   4397  C   ASP A 266      28.021   8.897 -26.529  1.00 55.81           C\nATOM   4398  O   ASP A 266      26.917   8.375 -26.683  1.00 54.84           O\nATOM   4399  CB  ASP A 266      29.207   8.055 -24.486  1.00 56.80           C\nATOM   4400  CG  ASP A 266      30.281   7.209 -23.781  1.00 62.01           C\nATOM   4401  OD1 ASP A 266      30.805   6.253 -24.397  1.00 62.15           O\nATOM   4402  OD2 ASP A 266      30.483   7.470 -22.575  1.00 68.07           O1-\nATOM   4403  H   ASP A 266      31.166   8.770 -26.054  1.00 56.78           H\nATOM   4404  HA  ASP A 266      28.953   6.998 -26.341  1.00 56.79           H\nATOM   4405  HB3 ASP A 266      28.243   7.714 -24.105  1.00 56.80           H\nATOM   4406  HB2 ASP A 266      29.327   9.086 -24.149  1.00 56.80           H\nATOM   4407  N   TRP A 267      28.292  10.190 -26.763  1.00 54.11           N\nATOM   4408  CA  TRP A 267      27.313  11.179 -27.197  1.00 54.40           C\nATOM   4409  C   TRP A 267      28.044  12.192 -28.087  1.00 55.06           C\nATOM   4410  O   TRP A 267      28.550  13.193 -27.585  1.00 52.99           O\nATOM   4411  CB  TRP A 267      26.634  11.797 -25.948  1.00 53.95           C\nATOM   4412  CG  TRP A 267      25.477  12.741 -26.141  1.00 52.76           C\nATOM   4413  CD1 TRP A 267      24.905  13.101 -27.314  1.00 52.86           C\nATOM   4414  CD2 TRP A 267      24.726  13.447 -25.106  1.00 49.92           C\nATOM   4415  NE1 TRP A 267      23.873  13.985 -27.080  1.00 51.60           N\nATOM   4416  CE2 TRP A 267      23.719  14.242 -25.736  1.00 48.77           C\nATOM   4417  CE3 TRP A 267      24.795  13.502 -23.695  1.00 47.30           C\nATOM   4418  CZ2 TRP A 267      22.838  15.058 -25.006  1.00 47.55           C\nATOM   4419  CZ3 TRP A 267      23.914  14.312 -22.951  1.00 45.53           C\nATOM   4420  CH2 TRP A 267      22.938  15.091 -23.604  1.00 46.27           C\nATOM   4421  H   TRP A 267      29.231  10.534 -26.614  1.00 54.11           H\nATOM   4422  HA  TRP A 267      26.552  10.686 -27.804  1.00 54.40           H\nATOM   4423  HB3 TRP A 267      27.379  12.314 -25.343  1.00 53.95           H\nATOM   4424  HB2 TRP A 267      26.261  10.994 -25.310  1.00 53.95           H\nATOM   4425  HD1 TRP A 267      25.208  12.744 -28.287  1.00 52.86           H\nATOM   4426  HE1 TRP A 267      23.310  14.371 -27.825  1.00 51.60           H\nATOM   4427  HE3 TRP A 267      25.540  12.915 -23.178  1.00 47.30           H\nATOM   4428  HZ2 TRP A 267      22.099  15.656 -25.518  1.00 47.55           H\nATOM   4429  HZ3 TRP A 267      23.993  14.339 -21.875  1.00 45.53           H\nATOM   4430  HH2 TRP A 267      22.272  15.715 -23.029  1.00 46.27           H\nATOM   4431  N   GLU A 268      28.110  11.886 -29.394  1.00 57.53           N\nATOM   4432  CA  GLU A 268      28.791  12.694 -30.412  1.00 60.21           C\nATOM   4433  C   GLU A 268      28.090  14.034 -30.699  1.00 60.56           C\nATOM   4434  O   GLU A 268      28.774  15.042 -30.883  1.00 61.86           O\nATOM   4435  CB  GLU A 268      28.960  11.863 -31.703  1.00 61.39           C\nATOM   4436  CG  GLU A 268      29.848  10.608 -31.510  1.00 64.36           C\nATOM   4437  CD  GLU A 268      30.020   9.702 -32.740  1.00 67.25           C\nATOM   4438  OE1 GLU A 268      29.532  10.058 -33.836  1.00 69.28           O\nATOM   4439  OE2 GLU A 268      30.655   8.639 -32.555  1.00 69.24           O1-\nATOM   4440  H   GLU A 268      27.685  11.031 -29.723  1.00 57.53           H\nATOM   4441  HA  GLU A 268      29.786  12.940 -30.040  1.00 60.21           H\nATOM   4442  HB3 GLU A 268      29.387  12.493 -32.485  1.00 61.39           H\nATOM   4443  HB2 GLU A 268      27.976  11.559 -32.063  1.00 61.39           H\nATOM   4444  HG3 GLU A 268      29.459   9.996 -30.695  1.00 64.36           H\nATOM   4445  HG2 GLU A 268      30.845  10.927 -31.207  1.00 64.36           H\nATOM   4446  N   ASP A 269      26.746  14.024 -30.686  1.00 60.46           N\nATOM   4447  CA  ASP A 269      25.885  15.190 -30.918  1.00 61.20           C\nATOM   4448  C   ASP A 269      25.630  16.034 -29.651  1.00 59.71           C\nATOM   4449  O   ASP A 269      24.765  16.910 -29.691  1.00 59.22           O\nATOM   4450  CB  ASP A 269      24.559  14.816 -31.638  1.00 62.43           C\nATOM   4451  CG  ASP A 269      24.694  14.158 -33.026  1.00 64.68           C\nATOM   4452  OD1 ASP A 269      25.759  14.301 -33.667  1.00 65.17           O\nATOM   4453  OD2 ASP A 269      23.654  13.651 -33.501  1.00 72.35           O1-\nATOM   4454  H   ASP A 269      26.267  13.150 -30.522  1.00 60.46           H\nATOM   4455  HA  ASP A 269      26.421  15.871 -31.583  1.00 61.20           H\nATOM   4456  HB3 ASP A 269      23.940  15.703 -31.772  1.00 62.43           H\nATOM   4457  HB2 ASP A 269      23.993  14.134 -31.001  1.00 62.43           H\nATOM   4458  N   ILE A 270      26.411  15.824 -28.572  1.00 57.99           N\nATOM   4459  CA  ILE A 270      26.406  16.681 -27.379  1.00 57.85           C\nATOM   4460  C   ILE A 270      26.899  18.116 -27.684  1.00 58.50           C\nATOM   4461  O   ILE A 270      26.470  19.051 -27.013  1.00 57.20           O\nATOM   4462  CB  ILE A 270      27.266  16.077 -26.227  1.00 57.51           C\nATOM   4463  CG1 ILE A 270      26.900  16.681 -24.849  1.00 57.84           C\nATOM   4464  CG2 ILE A 270      28.791  16.135 -26.470  1.00 50.59           C\nATOM   4465  CD1 ILE A 270      27.464  15.899 -23.654  1.00 57.06           C\nATOM   4466  H   ILE A 270      27.098  15.084 -28.589  1.00 57.99           H\nATOM   4467  HA  ILE A 270      25.372  16.742 -27.036  1.00 57.85           H\nATOM   4468  HB  ILE A 270      27.005  15.021 -26.183  1.00 57.51           H\nATOM   4469 HG13 ILE A 270      25.815  16.727 -24.745  1.00 57.84           H\nATOM   4470 HG12 ILE A 270      27.248  17.712 -24.787  1.00 57.84           H\nATOM   4471 HG21 ILE A 270      29.328  15.516 -25.750  1.00 50.59           H\nATOM   4472 HG22 ILE A 270      29.051  15.771 -27.464  1.00 50.59           H\nATOM   4473 HG23 ILE A 270      29.182  17.147 -26.382  1.00 50.59           H\nATOM   4474 HD11 ILE A 270      26.833  16.026 -22.774  1.00 57.06           H\nATOM   4475 HD12 ILE A 270      27.525  14.830 -23.862  1.00 57.06           H\nATOM   4476 HD13 ILE A 270      28.465  16.245 -23.394  1.00 57.06           H\nATOM   4477  N   LYS A 271      27.751  18.256 -28.717  1.00 60.72           N\nATOM   4478  CA  LYS A 271      28.285  19.516 -29.233  1.00 62.14           C\nATOM   4479  C   LYS A 271      27.233  20.404 -29.923  1.00 62.68           C\nATOM   4480  O   LYS A 271      27.409  21.622 -29.942  1.00 64.12           O\nATOM   4481  CB  LYS A 271      29.458  19.209 -30.187  1.00 63.27           C\nATOM   4482  CG  LYS A 271      30.657  18.555 -29.478  0.00 62.61           C\nATOM   4483  CD  LYS A 271      31.837  18.271 -30.419  0.00 62.71           C\nATOM   4484  CE  LYS A 271      33.025  17.641 -29.673  0.00 62.68           C\nATOM   4485  NZ  LYS A 271      34.156  17.355 -30.573  0.00 62.67           N1+\nATOM   4486  H   LYS A 271      28.044  17.425 -29.212  1.00 60.72           H\nATOM   4487  HA  LYS A 271      28.673  20.079 -28.388  1.00 62.14           H\nATOM   4488  HB3 LYS A 271      29.799  20.136 -30.651  1.00 63.27           H\nATOM   4489  HB2 LYS A 271      29.115  18.568 -31.001  1.00 63.27           H\nATOM   4490  HG3 LYS A 271      30.347  17.621 -29.008  1.00 62.61           H\nATOM   4491  HG2 LYS A 271      30.993  19.206 -28.672  1.00 62.61           H\nATOM   4492  HD3 LYS A 271      32.147  19.202 -30.898  1.00 62.71           H\nATOM   4493  HD2 LYS A 271      31.503  17.608 -31.219  1.00 62.71           H\nATOM   4494  HE3 LYS A 271      32.719  16.708 -29.196  1.00 62.68           H\nATOM   4495  HE2 LYS A 271      33.370  18.307 -28.881  1.00 62.68           H\nATOM   4496  HZ1 LYS A 271      34.479  18.212 -30.997  1.00 62.67           H\nATOM   4497  HZ2 LYS A 271      34.908  16.937 -30.042  1.00 62.67           H\nATOM   4498  HZ3 LYS A 271      33.860  16.712 -31.293  1.00 62.67           H\nATOM   4499  N   LYS A 272      26.166  19.789 -30.463  1.00 63.90           N\nATOM   4500  CA  LYS A 272      25.062  20.468 -31.148  1.00 63.81           C\nATOM   4501  C   LYS A 272      24.028  21.084 -30.183  1.00 63.68           C\nATOM   4502  O   LYS A 272      23.218  21.896 -30.629  1.00 64.55           O\nATOM   4503  CB  LYS A 272      24.379  19.479 -32.115  1.00 63.95           C\nATOM   4504  CG  LYS A 272      25.306  18.965 -33.230  1.00 65.86           C\nATOM   4505  CD  LYS A 272      24.593  17.998 -34.184  1.00 69.22           C\nATOM   4506  CE  LYS A 272      25.525  17.457 -35.280  0.00 68.38           C\nATOM   4507  NZ  LYS A 272      24.864  16.424 -36.096  0.00 68.55           N1+\nATOM   4508  H   LYS A 272      26.084  18.785 -30.385  1.00 63.90           H\nATOM   4509  HA  LYS A 272      25.475  21.288 -31.739  1.00 63.81           H\nATOM   4510  HB3 LYS A 272      23.521  19.965 -32.582  1.00 63.95           H\nATOM   4511  HB2 LYS A 272      23.976  18.633 -31.556  1.00 63.95           H\nATOM   4512  HG3 LYS A 272      26.166  18.457 -32.790  1.00 65.86           H\nATOM   4513  HG2 LYS A 272      25.703  19.811 -33.793  1.00 65.86           H\nATOM   4514  HD3 LYS A 272      23.743  18.507 -34.642  1.00 69.22           H\nATOM   4515  HD2 LYS A 272      24.177  17.172 -33.607  1.00 69.22           H\nATOM   4516  HE3 LYS A 272      26.417  17.016 -34.833  1.00 68.38           H\nATOM   4517  HE2 LYS A 272      25.857  18.268 -35.929  1.00 68.38           H\nATOM   4518  HZ1 LYS A 272      24.622  15.642 -35.499  1.00 68.55           H\nATOM   4519  HZ2 LYS A 272      24.028  16.798 -36.520  1.00 68.55           H\nATOM   4520  HZ3 LYS A 272      25.497  16.101 -36.814  1.00 68.55           H\nATOM   4521  N   MET A 273      24.071  20.700 -28.895  1.00 62.06           N\nATOM   4522  CA  MET A 273      23.207  21.223 -27.836  1.00 61.45           C\nATOM   4523  C   MET A 273      23.559  22.696 -27.518  1.00 59.91           C\nATOM   4524  O   MET A 273      24.746  22.970 -27.328  1.00 58.79           O\nATOM   4525  CB  MET A 273      23.389  20.354 -26.576  1.00 61.31           C\nATOM   4526  CG  MET A 273      23.077  18.856 -26.757  1.00 62.46           C\nATOM   4527  SD  MET A 273      21.451  18.432 -27.446  1.00 61.02           S\nATOM   4528  CE  MET A 273      20.368  19.376 -26.344  1.00 56.92           C\nATOM   4529  H   MET A 273      24.775  20.037 -28.603  1.00 62.06           H\nATOM   4530  HA  MET A 273      22.184  21.107 -28.180  1.00 61.45           H\nATOM   4531  HB3 MET A 273      22.751  20.747 -25.789  1.00 61.31           H\nATOM   4532  HB2 MET A 273      24.405  20.457 -26.194  1.00 61.31           H\nATOM   4533  HG3 MET A 273      23.176  18.351 -25.795  1.00 62.46           H\nATOM   4534  HG2 MET A 273      23.821  18.404 -27.410  1.00 62.46           H\nATOM   4535  HE1 MET A 273      19.329  19.117 -26.535  1.00 56.92           H\nATOM   4536  HE2 MET A 273      20.604  19.151 -25.306  1.00 56.92           H\nATOM   4537  HE3 MET A 273      20.482  20.447 -26.502  1.00 56.92           H\nATOM   4538  N   PRO A 274      22.559  23.615 -27.473  1.00 59.61           N\nATOM   4539  CA  PRO A 274      22.781  25.054 -27.190  1.00 58.80           C\nATOM   4540  C   PRO A 274      23.630  25.430 -25.959  1.00 58.18           C\nATOM   4541  O   PRO A 274      24.353  26.423 -26.028  1.00 57.67           O\nATOM   4542  CB  PRO A 274      21.361  25.628 -27.068  1.00 58.27           C\nATOM   4543  CG  PRO A 274      20.530  24.751 -27.982  1.00 60.99           C\nATOM   4544  CD  PRO A 274      21.145  23.371 -27.784  1.00 59.86           C\nATOM   4545  HA  PRO A 274      23.258  25.472 -28.078  1.00 58.80           H\nATOM   4546  HB3 PRO A 274      21.307  26.682 -27.344  1.00 58.27           H\nATOM   4547  HB2 PRO A 274      20.992  25.534 -26.045  1.00 58.27           H\nATOM   4548  HG3 PRO A 274      20.678  25.067 -29.015  1.00 60.99           H\nATOM   4549  HG2 PRO A 274      19.462  24.789 -27.770  1.00 60.99           H\nATOM   4550  HD2 PRO A 274      20.681  22.858 -26.941  1.00 59.86           H\nATOM   4551  HD3 PRO A 274      20.990  22.779 -28.685  1.00 59.86           H\nATOM   4552  N   GLU A 275      23.540  24.638 -24.878  1.00 58.19           N\nATOM   4553  CA  GLU A 275      24.239  24.878 -23.612  1.00 58.24           C\nATOM   4554  C   GLU A 275      25.531  24.048 -23.470  1.00 57.53           C\nATOM   4555  O   GLU A 275      26.015  23.904 -22.348  1.00 58.18           O\nATOM   4556  CB  GLU A 275      23.274  24.601 -22.439  1.00 58.72           C\nATOM   4557  CG  GLU A 275      21.939  25.386 -22.465  1.00 61.62           C\nATOM   4558  CD  GLU A 275      22.035  26.893 -22.165  1.00 63.21           C\nATOM   4559  OE1 GLU A 275      23.072  27.346 -21.629  1.00 62.90           O\nATOM   4560  OE2 GLU A 275      21.029  27.577 -22.455  1.00 65.48           O1-\nATOM   4561  H   GLU A 275      22.917  23.842 -24.893  1.00 58.19           H\nATOM   4562  HA  GLU A 275      24.545  25.924 -23.553  1.00 58.24           H\nATOM   4563  HB3 GLU A 275      23.776  24.782 -21.488  1.00 58.72           H\nATOM   4564  HB2 GLU A 275      23.055  23.539 -22.438  1.00 58.72           H\nATOM   4565  HG3 GLU A 275      21.270  24.948 -21.723  1.00 61.62           H\nATOM   4566  HG2 GLU A 275      21.435  25.241 -23.421  1.00 61.62           H\nATOM   4567  N   HIS A 276      26.089  23.520 -24.578  1.00 57.14           N\nATOM   4568  CA  HIS A 276      27.347  22.764 -24.566  1.00 55.95           C\nATOM   4569  C   HIS A 276      28.560  23.604 -24.125  1.00 55.41           C\nATOM   4570  O   HIS A 276      29.385  23.095 -23.371  1.00 53.68           O\nATOM   4571  CB  HIS A 276      27.611  22.105 -25.932  1.00 54.51           C\nATOM   4572  CG  HIS A 276      28.864  21.260 -25.958  1.00 56.12           C\nATOM   4573  ND1 HIS A 276      28.970  20.052 -25.289  1.00 51.38           N\nATOM   4574  CD2 HIS A 276      30.097  21.471 -26.536  1.00 54.28           C\nATOM   4575  CE1 HIS A 276      30.211  19.601 -25.483  1.00 56.68           C\nATOM   4576  NE2 HIS A 276      30.953  20.411 -26.228  1.00 54.20           N\nATOM   4577  H   HIS A 276      25.644  23.650 -25.477  1.00 57.14           H\nATOM   4578  HA  HIS A 276      27.225  21.961 -23.836  1.00 55.95           H\nATOM   4579  HB3 HIS A 276      27.687  22.864 -26.713  1.00 54.51           H\nATOM   4580  HB2 HIS A 276      26.765  21.476 -26.205  1.00 54.51           H\nATOM   4581  HD1 HIS A 276      28.241  19.596 -24.759  1.00 51.38           H\nATOM   4582  HD2 HIS A 276      30.435  22.304 -27.134  1.00 54.28           H\nATOM   4583  HE1 HIS A 276      30.579  18.674 -25.069  1.00 56.68           H\nATOM   4584  N   SER A 277      28.640  24.870 -24.566  1.00 55.37           N\nATOM   4585  CA  SER A 277      29.697  25.801 -24.158  1.00 56.55           C\nATOM   4586  C   SER A 277      29.645  26.150 -22.658  1.00 55.77           C\nATOM   4587  O   SER A 277      30.701  26.310 -22.046  1.00 54.58           O\nATOM   4588  CB  SER A 277      29.634  27.070 -25.028  1.00 57.06           C\nATOM   4589  OG  SER A 277      30.181  26.809 -26.304  1.00 60.09           O\nATOM   4590  H   SER A 277      27.937  25.232 -25.193  1.00 55.37           H\nATOM   4591  HA  SER A 277      30.661  25.316 -24.328  1.00 56.55           H\nATOM   4592  HB3 SER A 277      30.217  27.876 -24.582  1.00 57.06           H\nATOM   4593  HB2 SER A 277      28.610  27.435 -25.127  1.00 57.06           H\nATOM   4594  HG  SER A 277      30.132  27.612 -26.829  1.00 60.09           H\nATOM   4595  N   THR A 278      28.426  26.200 -22.092  1.00 55.93           N\nATOM   4596  CA  THR A 278      28.168  26.373 -20.662  1.00 56.22           C\nATOM   4597  C   THR A 278      28.552  25.124 -19.838  1.00 56.61           C\nATOM   4598  O   THR A 278      29.072  25.267 -18.733  1.00 56.70           O\nATOM   4599  CB  THR A 278      26.671  26.688 -20.385  1.00 57.58           C\nATOM   4600  OG1 THR A 278      26.199  27.653 -21.307  1.00 60.32           O\nATOM   4601  CG2 THR A 278      26.402  27.237 -18.974  1.00 57.11           C\nATOM   4602  H   THR A 278      27.605  26.070 -22.665  1.00 55.93           H\nATOM   4603  HA  THR A 278      28.772  27.212 -20.309  1.00 56.22           H\nATOM   4604  HB  THR A 278      26.066  25.792 -20.524  1.00 57.58           H\nATOM   4605  HG1 THR A 278      25.242  27.729 -21.212  1.00 60.32           H\nATOM   4606 HG21 THR A 278      25.338  27.425 -18.824  1.00 57.11           H\nATOM   4607 HG22 THR A 278      26.722  26.543 -18.200  1.00 57.11           H\nATOM   4608 HG23 THR A 278      26.932  28.175 -18.807  1.00 57.11           H\nATOM   4609  N   LEU A 279      28.337  23.927 -20.418  1.00 54.99           N\nATOM   4610  CA  LEU A 279      28.715  22.629 -19.857  1.00 53.47           C\nATOM   4611  C   LEU A 279      30.243  22.470 -19.750  1.00 53.29           C\nATOM   4612  O   LEU A 279      30.724  22.089 -18.688  1.00 52.31           O\nATOM   4613  CB  LEU A 279      28.072  21.501 -20.702  1.00 53.62           C\nATOM   4614  CG  LEU A 279      28.162  20.071 -20.117  1.00 54.14           C\nATOM   4615  CD1 LEU A 279      27.241  19.897 -18.893  1.00 54.31           C\nATOM   4616  CD2 LEU A 279      27.906  18.997 -21.199  1.00 51.83           C\nATOM   4617  H   LEU A 279      27.889  23.899 -21.324  1.00 54.99           H\nATOM   4618  HA  LEU A 279      28.299  22.593 -18.849  1.00 53.47           H\nATOM   4619  HB3 LEU A 279      28.546  21.492 -21.681  1.00 53.62           H\nATOM   4620  HB2 LEU A 279      27.026  21.741 -20.889  1.00 53.62           H\nATOM   4621  HG  LEU A 279      29.184  19.911 -19.772  1.00 54.14           H\nATOM   4622 HD11 LEU A 279      27.799  19.469 -18.065  1.00 54.31           H\nATOM   4623 HD12 LEU A 279      26.820  20.843 -18.549  1.00 54.31           H\nATOM   4624 HD13 LEU A 279      26.395  19.238 -19.087  1.00 54.31           H\nATOM   4625 HD21 LEU A 279      28.818  18.439 -21.411  1.00 51.83           H\nATOM   4626 HD22 LEU A 279      27.156  18.265 -20.900  1.00 51.83           H\nATOM   4627 HD23 LEU A 279      27.569  19.432 -22.140  1.00 51.83           H\nATOM   4628  N   MET A 280      30.978  22.798 -20.828  1.00 53.62           N\nATOM   4629  CA  MET A 280      32.446  22.765 -20.866  1.00 53.24           C\nATOM   4630  C   MET A 280      33.112  23.817 -19.959  1.00 54.37           C\nATOM   4631  O   MET A 280      34.216  23.567 -19.477  1.00 55.47           O\nATOM   4632  CB  MET A 280      32.946  22.919 -22.319  1.00 52.70           C\nATOM   4633  CG  MET A 280      32.529  21.804 -23.296  1.00 52.61           C\nATOM   4634  SD  MET A 280      33.112  20.127 -22.920  1.00 61.27           S\nATOM   4635  CE  MET A 280      31.669  19.453 -22.054  1.00 48.28           C\nATOM   4636  H   MET A 280      30.513  23.099 -21.675  1.00 53.62           H\nATOM   4637  HA  MET A 280      32.771  21.794 -20.490  1.00 53.24           H\nATOM   4638  HB3 MET A 280      34.036  22.975 -22.322  1.00 52.70           H\nATOM   4639  HB2 MET A 280      32.603  23.875 -22.717  1.00 52.70           H\nATOM   4640  HG3 MET A 280      32.912  22.056 -24.285  1.00 52.61           H\nATOM   4641  HG2 MET A 280      31.449  21.767 -23.407  1.00 52.61           H\nATOM   4642  HE1 MET A 280      31.799  18.382 -21.903  1.00 48.28           H\nATOM   4643  HE2 MET A 280      31.537  19.924 -21.081  1.00 48.28           H\nATOM   4644  HE3 MET A 280      30.761  19.607 -22.637  1.00 48.28           H\nATOM   4645  N   LYS A 281      32.431  24.953 -19.731  1.00 56.25           N\nATOM   4646  CA  LYS A 281      32.872  26.022 -18.836  1.00 58.10           C\nATOM   4647  C   LYS A 281      32.796  25.617 -17.352  1.00 58.60           C\nATOM   4648  O   LYS A 281      33.743  25.889 -16.613  1.00 59.66           O\nATOM   4649  CB  LYS A 281      32.051  27.295 -19.143  1.00 59.46           C\nATOM   4650  CG  LYS A 281      32.378  28.522 -18.272  1.00 62.55           C\nATOM   4651  CD  LYS A 281      31.522  29.740 -18.645  1.00 64.71           C\nATOM   4652  CE  LYS A 281      31.827  30.960 -17.762  0.00 64.38           C\nATOM   4653  NZ  LYS A 281      30.984  32.115 -18.117  0.00 64.50           N1+\nATOM   4654  H   LYS A 281      31.536  25.091 -20.178  1.00 56.25           H\nATOM   4655  HA  LYS A 281      33.917  26.239 -19.066  1.00 58.10           H\nATOM   4656  HB3 LYS A 281      30.989  27.072 -19.040  1.00 59.46           H\nATOM   4657  HB2 LYS A 281      32.202  27.564 -20.189  1.00 59.46           H\nATOM   4658  HG3 LYS A 281      33.436  28.768 -18.373  1.00 62.55           H\nATOM   4659  HG2 LYS A 281      32.213  28.294 -17.218  1.00 62.55           H\nATOM   4660  HD3 LYS A 281      30.467  29.472 -18.555  1.00 64.71           H\nATOM   4661  HD2 LYS A 281      31.688  29.987 -19.694  1.00 64.71           H\nATOM   4662  HE3 LYS A 281      32.875  31.246 -17.862  1.00 64.38           H\nATOM   4663  HE2 LYS A 281      31.658  30.716 -16.712  1.00 64.38           H\nATOM   4664  HZ1 LYS A 281      30.011  31.870 -17.995  1.00 64.50           H\nATOM   4665  HZ2 LYS A 281      31.212  32.896 -17.518  1.00 64.50           H\nATOM   4666  HZ3 LYS A 281      31.148  32.370 -19.080  1.00 64.50           H\nATOM   4667  N   ASP A 282      31.672  25.000 -16.951  1.00 58.86           N\nATOM   4668  CA  ASP A 282      31.355  24.700 -15.550  1.00 58.90           C\nATOM   4669  C   ASP A 282      31.842  23.314 -15.088  1.00 59.21           C\nATOM   4670  O   ASP A 282      32.087  23.162 -13.891  1.00 58.76           O\nATOM   4671  CB  ASP A 282      29.845  24.850 -15.226  1.00 59.93           C\nATOM   4672  CG  ASP A 282      29.181  26.205 -15.547  1.00 60.39           C\nATOM   4673  OD1 ASP A 282      29.896  27.219 -15.714  1.00 59.12           O\nATOM   4674  OD2 ASP A 282      27.931  26.230 -15.494  1.00 64.74           O1-\nATOM   4675  H   ASP A 282      30.934  24.824 -17.620  1.00 58.86           H\nATOM   4676  HA  ASP A 282      31.880  25.423 -14.921  1.00 58.90           H\nATOM   4677  HB3 ASP A 282      29.696  24.673 -14.161  1.00 59.93           H\nATOM   4678  HB2 ASP A 282      29.289  24.076 -15.759  1.00 59.93           H\nATOM   4679  N   PHE A 283      31.963  22.336 -16.006  1.00 58.88           N\nATOM   4680  CA  PHE A 283      32.287  20.944 -15.675  1.00 58.24           C\nATOM   4681  C   PHE A 283      33.622  20.483 -16.267  1.00 57.75           C\nATOM   4682  O   PHE A 283      34.023  20.936 -17.340  1.00 58.31           O\nATOM   4683  CB  PHE A 283      31.167  20.002 -16.157  1.00 57.66           C\nATOM   4684  CG  PHE A 283      29.849  20.170 -15.433  1.00 55.13           C\nATOM   4685  CD1 PHE A 283      29.711  19.662 -14.128  1.00 54.02           C\nATOM   4686  CD2 PHE A 283      28.809  20.949 -15.980  1.00 54.98           C\nATOM   4687  CE1 PHE A 283      28.530  19.856 -13.430  1.00 53.40           C\nATOM   4688  CE2 PHE A 283      27.626  21.116 -15.274  1.00 50.39           C\nATOM   4689  CZ  PHE A 283      27.489  20.565 -14.008  1.00 53.32           C\nATOM   4690  H   PHE A 283      31.757  22.527 -16.978  1.00 58.88           H\nATOM   4691  HA  PHE A 283      32.364  20.828 -14.593  1.00 58.24           H\nATOM   4692  HB3 PHE A 283      31.480  18.969 -16.000  1.00 57.66           H\nATOM   4693  HB2 PHE A 283      31.006  20.092 -17.230  1.00 57.66           H\nATOM   4694  HD1 PHE A 283      30.528  19.126 -13.673  1.00 54.02           H\nATOM   4695  HD2 PHE A 283      28.918  21.399 -16.954  1.00 54.98           H\nATOM   4696  HE1 PHE A 283      28.425  19.460 -12.432  1.00 53.40           H\nATOM   4697  HE2 PHE A 283      26.813  21.681 -15.702  1.00 50.39           H\nATOM   4698  HZ  PHE A 283      26.578  20.712 -13.457  1.00 53.32           H\nATOM   4699  N   ARG A 284      34.244  19.535 -15.550  1.00 58.60           N\nATOM   4700  CA  ARG A 284      35.442  18.800 -15.941  1.00 59.79           C\nATOM   4701  C   ARG A 284      35.183  17.294 -15.783  1.00 59.75           C\nATOM   4702  O   ARG A 284      34.486  16.876 -14.857  1.00 58.94           O\nATOM   4703  CB  ARG A 284      36.629  19.226 -15.052  1.00 61.36           C\nATOM   4704  CG  ARG A 284      37.097  20.677 -15.288  1.00 65.00           C\nATOM   4705  CD  ARG A 284      38.211  21.164 -14.339  1.00 70.59           C\nATOM   4706  NE  ARG A 284      39.397  20.284 -14.316  1.00 76.65           N\nATOM   4707  CZ  ARG A 284      40.336  20.116 -15.268  1.00 78.07           C\nATOM   4708  NH1 ARG A 284      40.320  20.792 -16.428  1.00 78.71           N\nATOM   4709  NH2 ARG A 284      41.322  19.237 -15.049  1.00 81.82           N1+\nATOM   4710  H   ARG A 284      33.835  19.245 -14.670  1.00 58.60           H\nATOM   4711  HA  ARG A 284      35.685  18.998 -16.988  1.00 59.79           H\nATOM   4712  HB3 ARG A 284      37.466  18.555 -15.250  1.00 61.36           H\nATOM   4713  HB2 ARG A 284      36.374  19.088 -13.999  1.00 61.36           H\nATOM   4714  HG3 ARG A 284      36.236  21.315 -15.088  1.00 65.00           H\nATOM   4715  HG2 ARG A 284      37.350  20.865 -16.332  1.00 65.00           H\nATOM   4716  HD3 ARG A 284      37.825  21.355 -13.337  1.00 70.59           H\nATOM   4717  HD2 ARG A 284      38.568  22.129 -14.701  1.00 70.59           H\nATOM   4718  HE  ARG A 284      39.478  19.721 -13.482  1.00 76.65           H\nATOM   4719 HH12 ARG A 284      41.039  20.647 -17.122  1.00 78.71           H\nATOM   4720 HH11 ARG A 284      39.586  21.462 -16.608  1.00 78.71           H\nATOM   4721 HH22 ARG A 284      42.041  19.091 -15.743  1.00 81.82           H\nATOM   4722 HH21 ARG A 284      41.369  18.723 -14.181  1.00 81.82           H\nATOM   4723  N   ARG A 285      35.800  16.510 -16.681  1.00 60.71           N\nATOM   4724  CA  ARG A 285      35.751  15.046 -16.727  1.00 62.35           C\nATOM   4725  C   ARG A 285      36.380  14.359 -15.498  1.00 63.59           C\nATOM   4726  O   ARG A 285      35.873  13.322 -15.068  1.00 63.38           O\nATOM   4727  CB  ARG A 285      36.418  14.606 -18.049  1.00 62.63           C\nATOM   4728  CG  ARG A 285      36.511  13.082 -18.282  1.00 64.18           C\nATOM   4729  CD  ARG A 285      37.114  12.679 -19.645  1.00 66.27           C\nATOM   4730  NE  ARG A 285      36.379  13.247 -20.792  1.00 68.41           N\nATOM   4731  CZ  ARG A 285      35.136  12.936 -21.205  1.00 67.82           C\nATOM   4732  NH1 ARG A 285      34.417  11.960 -20.628  1.00 68.20           N\nATOM   4733  NH2 ARG A 285      34.595  13.630 -22.215  1.00 67.35           N1+\nATOM   4734  H   ARG A 285      36.351  16.946 -17.406  1.00 60.71           H\nATOM   4735  HA  ARG A 285      34.700  14.751 -16.761  1.00 62.35           H\nATOM   4736  HB3 ARG A 285      37.428  15.017 -18.098  1.00 62.63           H\nATOM   4737  HB2 ARG A 285      35.865  15.072 -18.865  1.00 62.63           H\nATOM   4738  HG3 ARG A 285      35.553  12.591 -18.111  1.00 64.18           H\nATOM   4739  HG2 ARG A 285      37.178  12.672 -17.523  1.00 64.18           H\nATOM   4740  HD3 ARG A 285      37.061  11.594 -19.746  1.00 66.27           H\nATOM   4741  HD2 ARG A 285      38.174  12.928 -19.694  1.00 66.27           H\nATOM   4742  HE  ARG A 285      36.854  13.998 -21.273  1.00 68.41           H\nATOM   4743 HH12 ARG A 285      33.476  11.760 -20.939  1.00 68.20           H\nATOM   4744 HH11 ARG A 285      34.809  11.421 -19.870  1.00 68.20           H\nATOM   4745 HH22 ARG A 285      33.650  13.436 -22.519  1.00 67.35           H\nATOM   4746 HH21 ARG A 285      35.119  14.351 -22.692  1.00 67.35           H\nATOM   4747  N   ASN A 286      37.460  14.959 -14.965  1.00 64.60           N\nATOM   4748  CA  ASN A 286      38.253  14.482 -13.827  1.00 65.46           C\nATOM   4749  C   ASN A 286      37.441  14.307 -12.527  1.00 64.39           C\nATOM   4750  O   ASN A 286      37.730  13.390 -11.761  1.00 65.66           O\nATOM   4751  CB  ASN A 286      39.428  15.469 -13.621  1.00 66.88           C\nATOM   4752  CG  ASN A 286      40.468  14.995 -12.599  1.00 71.63           C\nATOM   4753  OD1 ASN A 286      41.096  13.956 -12.783  1.00 77.56           O\nATOM   4754  ND2 ASN A 286      40.658  15.759 -11.520  1.00 73.05           N\nATOM   4755  H   ASN A 286      37.787  15.814 -15.390  1.00 64.60           H\nATOM   4756  HA  ASN A 286      38.655  13.501 -14.092  1.00 65.46           H\nATOM   4757  HB3 ASN A 286      39.050  16.454 -13.342  1.00 66.88           H\nATOM   4758  HB2 ASN A 286      39.957  15.605 -14.565  1.00 66.88           H\nATOM   4759 HD22 ASN A 286      41.333  15.478 -10.823  1.00 73.05           H\nATOM   4760 HD21 ASN A 286      40.122  16.602 -11.379  1.00 73.05           H\nATOM   4761  N   THR A 287      36.442  15.179 -12.313  1.00 62.28           N\nATOM   4762  CA  THR A 287      35.570  15.203 -11.136  1.00 60.97           C\nATOM   4763  C   THR A 287      34.687  13.943 -10.978  1.00 61.01           C\nATOM   4764  O   THR A 287      34.300  13.624  -9.854  1.00 60.63           O\nATOM   4765  CB  THR A 287      34.649  16.455 -11.199  1.00 60.73           C\nATOM   4766  OG1 THR A 287      35.459  17.613 -11.288  1.00 61.77           O\nATOM   4767  CG2 THR A 287      33.687  16.657 -10.013  1.00 60.86           C\nATOM   4768  H   THR A 287      36.261  15.900 -12.997  1.00 62.28           H\nATOM   4769  HA  THR A 287      36.205  15.274 -10.251  1.00 60.97           H\nATOM   4770  HB  THR A 287      34.059  16.416 -12.115  1.00 60.73           H\nATOM   4771  HG1 THR A 287      35.904  17.737 -10.445  1.00 61.77           H\nATOM   4772 HG21 THR A 287      33.163  17.610 -10.093  1.00 60.86           H\nATOM   4773 HG22 THR A 287      32.921  15.884  -9.972  1.00 60.86           H\nATOM   4774 HG23 THR A 287      34.221  16.649  -9.063  1.00 60.86           H\nATOM   4775  N   TYR A 288      34.409  13.247 -12.094  1.00 61.42           N\nATOM   4776  CA  TYR A 288      33.488  12.109 -12.172  1.00 61.54           C\nATOM   4777  C   TYR A 288      34.186  10.840 -12.696  1.00 63.50           C\nATOM   4778  O   TYR A 288      33.510   9.961 -13.232  1.00 65.43           O\nATOM   4779  CB  TYR A 288      32.292  12.505 -13.064  1.00 60.07           C\nATOM   4780  CG  TYR A 288      31.673  13.848 -12.723  1.00 53.76           C\nATOM   4781  CD1 TYR A 288      30.878  13.987 -11.567  1.00 49.66           C\nATOM   4782  CD2 TYR A 288      31.931  14.973 -13.535  1.00 51.14           C\nATOM   4783  CE1 TYR A 288      30.344  15.243 -11.226  1.00 50.75           C\nATOM   4784  CE2 TYR A 288      31.399  16.228 -13.193  1.00 46.10           C\nATOM   4785  CZ  TYR A 288      30.614  16.364 -12.032  1.00 49.56           C\nATOM   4786  OH  TYR A 288      30.132  17.586 -11.680  1.00 53.87           O\nATOM   4787  H   TYR A 288      34.796  13.558 -12.974  1.00 61.42           H\nATOM   4788  HA  TYR A 288      33.104  11.860 -11.182  1.00 61.54           H\nATOM   4789  HB3 TYR A 288      31.515  11.743 -13.017  1.00 60.07           H\nATOM   4790  HB2 TYR A 288      32.619  12.535 -14.103  1.00 60.07           H\nATOM   4791  HD1 TYR A 288      30.686  13.133 -10.934  1.00 49.66           H\nATOM   4792  HD2 TYR A 288      32.560  14.888 -14.408  1.00 51.14           H\nATOM   4793  HE1 TYR A 288      29.738  15.352 -10.340  1.00 50.75           H\nATOM   4794  HE2 TYR A 288      31.615  17.087 -13.811  1.00 46.10           H\nATOM   4795  HH  TYR A 288      29.612  17.580 -10.865  1.00 53.87           H\nATOM   4796  N   THR A 289      35.520  10.762 -12.545  1.00 66.18           N\nATOM   4797  CA  THR A 289      36.370   9.694 -13.083  1.00 68.06           C\nATOM   4798  C   THR A 289      36.145   8.293 -12.455  1.00 68.75           C\nATOM   4799  O   THR A 289      36.485   7.296 -13.093  1.00 69.69           O\nATOM   4800  CB  THR A 289      37.872  10.091 -12.975  1.00 68.50           C\nATOM   4801  OG1 THR A 289      38.699   9.173 -13.666  1.00 70.74           O\nATOM   4802  CG2 THR A 289      38.414  10.179 -11.536  1.00 69.90           C\nATOM   4803  H   THR A 289      36.006  11.524 -12.091  1.00 66.18           H\nATOM   4804  HA  THR A 289      36.127   9.606 -14.144  1.00 68.06           H\nATOM   4805  HB  THR A 289      38.004  11.062 -13.454  1.00 68.50           H\nATOM   4806  HG1 THR A 289      38.605   8.308 -13.259  1.00 70.74           H\nATOM   4807 HG21 THR A 289      39.423  10.591 -11.528  1.00 69.90           H\nATOM   4808 HG22 THR A 289      37.795  10.825 -10.913  1.00 69.90           H\nATOM   4809 HG23 THR A 289      38.459   9.203 -11.055  1.00 69.90           H\nATOM   4810  N   ASN A 290      35.562   8.238 -11.244  1.00 68.46           N\nATOM   4811  CA  ASN A 290      35.223   6.997 -10.532  1.00 68.77           C\nATOM   4812  C   ASN A 290      33.698   6.824 -10.364  1.00 67.13           C\nATOM   4813  O   ASN A 290      33.285   5.964  -9.587  1.00 66.77           O\nATOM   4814  CB  ASN A 290      35.943   6.946  -9.158  1.00 69.75           C\nATOM   4815  CG  ASN A 290      37.472   7.041  -9.231  1.00 74.52           C\nATOM   4816  OD1 ASN A 290      38.072   7.882  -8.568  1.00 77.51           O\nATOM   4817  ND2 ASN A 290      38.113   6.179 -10.024  1.00 76.76           N\nATOM   4818  H   ASN A 290      35.309   9.099 -10.780  1.00 68.46           H\nATOM   4819  HA  ASN A 290      35.534   6.125 -11.109  1.00 68.77           H\nATOM   4820  HB3 ASN A 290      35.711   6.013  -8.642  1.00 69.75           H\nATOM   4821  HB2 ASN A 290      35.574   7.747  -8.516  1.00 69.75           H\nATOM   4822 HD22 ASN A 290      39.120   6.214 -10.088  1.00 76.76           H\nATOM   4823 HD21 ASN A 290      37.606   5.505 -10.578  1.00 76.76           H\nATOM   4824  N   CYS A 291      32.892   7.614 -11.094  1.00 64.71           N\nATOM   4825  CA  CYS A 291      31.429   7.570 -11.064  1.00 61.63           C\nATOM   4826  C   CYS A 291      30.918   6.718 -12.237  1.00 60.56           C\nATOM   4827  O   CYS A 291      31.351   6.927 -13.370  1.00 61.12           O\nATOM   4828  CB  CYS A 291      30.835   8.988 -11.149  1.00 61.95           C\nATOM   4829  SG  CYS A 291      31.288   9.943  -9.674  1.00 53.50           S\nATOM   4830  H   CYS A 291      33.297   8.280 -11.738  1.00 64.71           H\nATOM   4831  HA  CYS A 291      31.086   7.119 -10.130  1.00 61.63           H\nATOM   4832  HB3 CYS A 291      29.747   8.950 -11.223  1.00 61.95           H\nATOM   4833  HB2 CYS A 291      31.196   9.516 -12.029  1.00 61.95           H\nATOM   4834  HG  CYS A 291      30.471   9.298  -8.835  1.00 53.50           H\nATOM   4835  N   SER A 292      29.994   5.790 -11.941  1.00 59.10           N\nATOM   4836  CA  SER A 292      29.340   4.912 -12.914  1.00 58.41           C\nATOM   4837  C   SER A 292      28.048   4.335 -12.319  1.00 57.05           C\nATOM   4838  O   SER A 292      27.932   4.223 -11.095  1.00 56.68           O\nATOM   4839  CB  SER A 292      30.312   3.811 -13.410  1.00 57.46           C\nATOM   4840  OG  SER A 292      30.541   2.798 -12.448  1.00 57.35           O\nATOM   4841  H   SER A 292      29.680   5.678 -10.987  1.00 59.10           H\nATOM   4842  HA  SER A 292      29.058   5.529 -13.769  1.00 58.41           H\nATOM   4843  HB3 SER A 292      31.268   4.232 -13.720  1.00 57.46           H\nATOM   4844  HB2 SER A 292      29.891   3.333 -14.295  1.00 57.46           H\nATOM   4845  HG  SER A 292      31.139   2.150 -12.828  1.00 57.35           H\nATOM   4846  N   LEU A 293      27.100   3.974 -13.203  1.00 55.59           N\nATOM   4847  CA  LEU A 293      25.794   3.409 -12.842  1.00 54.05           C\nATOM   4848  C   LEU A 293      25.909   2.049 -12.127  1.00 53.95           C\nATOM   4849  O   LEU A 293      25.116   1.789 -11.224  1.00 54.55           O\nATOM   4850  CB  LEU A 293      24.900   3.338 -14.104  1.00 52.73           C\nATOM   4851  CG  LEU A 293      23.417   2.958 -13.864  1.00 48.76           C\nATOM   4852  CD1 LEU A 293      22.675   3.984 -12.980  1.00 46.61           C\nATOM   4853  CD2 LEU A 293      22.683   2.693 -15.196  1.00 46.33           C\nATOM   4854  H   LEU A 293      27.264   4.103 -14.194  1.00 55.59           H\nATOM   4855  HA  LEU A 293      25.341   4.105 -12.135  1.00 54.05           H\nATOM   4856  HB3 LEU A 293      25.345   2.623 -14.799  1.00 52.73           H\nATOM   4857  HB2 LEU A 293      24.929   4.301 -14.614  1.00 52.73           H\nATOM   4858  HG  LEU A 293      23.399   2.010 -13.330  1.00 48.76           H\nATOM   4859 HD11 LEU A 293      21.738   4.319 -13.424  1.00 46.61           H\nATOM   4860 HD12 LEU A 293      22.429   3.555 -12.009  1.00 46.61           H\nATOM   4861 HD13 LEU A 293      23.272   4.876 -12.793  1.00 46.61           H\nATOM   4862 HD21 LEU A 293      22.186   1.722 -15.174  1.00 46.33           H\nATOM   4863 HD22 LEU A 293      21.920   3.439 -15.419  1.00 46.33           H\nATOM   4864 HD23 LEU A 293      23.367   2.682 -16.046  1.00 46.33           H\nATOM   4865  N   ILE A 294      26.927   1.247 -12.496  1.00 54.71           N\nATOM   4866  CA  ILE A 294      27.310  -0.006 -11.837  1.00 55.76           C\nATOM   4867  C   ILE A 294      27.604   0.196 -10.339  1.00 55.52           C\nATOM   4868  O   ILE A 294      26.988  -0.476  -9.515  1.00 55.36           O\nATOM   4869  CB  ILE A 294      28.541  -0.667 -12.539  1.00 55.42           C\nATOM   4870  CG1 ILE A 294      28.142  -1.195 -13.937  1.00 58.15           C\nATOM   4871  CG2 ILE A 294      29.249  -1.781 -11.726  1.00 54.88           C\nATOM   4872  CD1 ILE A 294      29.328  -1.594 -14.828  1.00 55.47           C\nATOM   4873  H   ILE A 294      27.532   1.549 -13.245  1.00 54.71           H\nATOM   4874  HA  ILE A 294      26.463  -0.689 -11.912  1.00 55.76           H\nATOM   4875  HB  ILE A 294      29.281   0.120 -12.698  1.00 55.42           H\nATOM   4876 HG13 ILE A 294      27.567  -0.441 -14.473  1.00 58.15           H\nATOM   4877 HG12 ILE A 294      27.477  -2.053 -13.822  1.00 58.15           H\nATOM   4878 HG21 ILE A 294      30.048  -2.252 -12.297  1.00 54.88           H\nATOM   4879 HG22 ILE A 294      29.718  -1.399 -10.819  1.00 54.88           H\nATOM   4880 HG23 ILE A 294      28.553  -2.564 -11.431  1.00 54.88           H\nATOM   4881 HD11 ILE A 294      29.073  -1.485 -15.882  1.00 55.47           H\nATOM   4882 HD12 ILE A 294      30.204  -0.976 -14.635  1.00 55.47           H\nATOM   4883 HD13 ILE A 294      29.608  -2.635 -14.665  1.00 55.47           H\nATOM   4884  N   LYS A 295      28.491   1.157 -10.029  1.00 56.35           N\nATOM   4885  CA  LYS A 295      28.893   1.517  -8.669  1.00 56.38           C\nATOM   4886  C   LYS A 295      27.761   2.125  -7.825  1.00 56.12           C\nATOM   4887  O   LYS A 295      27.739   1.891  -6.618  1.00 55.82           O\nATOM   4888  CB  LYS A 295      30.101   2.470  -8.732  1.00 57.78           C\nATOM   4889  CG  LYS A 295      31.381   1.786  -9.236  0.00 56.56           C\nATOM   4890  CD  LYS A 295      32.538   2.777  -9.398  0.00 56.72           C\nATOM   4891  CE  LYS A 295      33.831   2.096  -9.867  0.00 56.69           C\nATOM   4892  NZ  LYS A 295      34.935   3.062 -10.000  0.00 56.73           N1+\nATOM   4893  H   LYS A 295      28.928   1.685 -10.771  1.00 56.35           H\nATOM   4894  HA  LYS A 295      29.208   0.600  -8.168  1.00 56.38           H\nATOM   4895  HB3 LYS A 295      30.304   2.871  -7.737  1.00 57.78           H\nATOM   4896  HB2 LYS A 295      29.862   3.328  -9.362  1.00 57.78           H\nATOM   4897  HG3 LYS A 295      31.193   1.292 -10.190  1.00 56.56           H\nATOM   4898  HG2 LYS A 295      31.667   0.998  -8.538  1.00 56.56           H\nATOM   4899  HD3 LYS A 295      32.707   3.292  -8.451  1.00 56.72           H\nATOM   4900  HD2 LYS A 295      32.244   3.543 -10.118  1.00 56.72           H\nATOM   4901  HE3 LYS A 295      33.673   1.609 -10.830  1.00 56.69           H\nATOM   4902  HE2 LYS A 295      34.129   1.321  -9.159  1.00 56.69           H\nATOM   4903  HZ1 LYS A 295      35.110   3.494  -9.104  1.00 56.73           H\nATOM   4904  HZ2 LYS A 295      35.768   2.583 -10.315  1.00 56.73           H\nATOM   4905  HZ3 LYS A 295      34.677   3.772 -10.670  1.00 56.73           H\nATOM   4906  N   TYR A 296      26.840   2.869  -8.463  1.00 55.86           N\nATOM   4907  CA  TYR A 296      25.666   3.442  -7.807  1.00 55.95           C\nATOM   4908  C   TYR A 296      24.648   2.369  -7.378  1.00 56.54           C\nATOM   4909  O   TYR A 296      24.216   2.382  -6.226  1.00 55.58           O\nATOM   4910  CB  TYR A 296      25.029   4.531  -8.699  1.00 55.85           C\nATOM   4911  CG  TYR A 296      23.778   5.148  -8.097  1.00 54.78           C\nATOM   4912  CD1 TYR A 296      23.892   6.116  -7.078  1.00 51.21           C\nATOM   4913  CD2 TYR A 296      22.502   4.701  -8.497  1.00 49.91           C\nATOM   4914  CE1 TYR A 296      22.738   6.615  -6.448  1.00 50.43           C\nATOM   4915  CE2 TYR A 296      21.350   5.185  -7.852  1.00 52.44           C\nATOM   4916  CZ  TYR A 296      21.467   6.141  -6.823  1.00 51.84           C\nATOM   4917  OH  TYR A 296      20.356   6.600  -6.179  1.00 57.47           O\nATOM   4918  H   TYR A 296      26.928   3.030  -9.458  1.00 55.86           H\nATOM   4919  HA  TYR A 296      26.015   3.937  -6.898  1.00 55.95           H\nATOM   4920  HB3 TYR A 296      24.778   4.114  -9.676  1.00 55.85           H\nATOM   4921  HB2 TYR A 296      25.752   5.325  -8.892  1.00 55.85           H\nATOM   4922  HD1 TYR A 296      24.867   6.461  -6.764  1.00 51.21           H\nATOM   4923  HD2 TYR A 296      22.408   3.958  -9.275  1.00 49.91           H\nATOM   4924  HE1 TYR A 296      22.832   7.344  -5.657  1.00 50.43           H\nATOM   4925  HE2 TYR A 296      20.380   4.814  -8.148  1.00 52.44           H\nATOM   4926  HH  TYR A 296      19.548   6.168  -6.478  1.00 57.47           H\nATOM   4927  N   MET A 297      24.284   1.469  -8.307  1.00 57.42           N\nATOM   4928  CA  MET A 297      23.298   0.412  -8.073  1.00 59.47           C\nATOM   4929  C   MET A 297      23.808  -0.706  -7.143  1.00 61.47           C\nATOM   4930  O   MET A 297      22.992  -1.258  -6.407  1.00 61.15           O\nATOM   4931  CB  MET A 297      22.780  -0.136  -9.418  1.00 59.09           C\nATOM   4932  CG  MET A 297      22.008   0.891 -10.274  1.00 60.09           C\nATOM   4933  SD  MET A 297      20.545   1.682  -9.541  1.00 60.20           S\nATOM   4934  CE  MET A 297      19.496   0.240  -9.239  1.00 52.16           C\nATOM   4935  H   MET A 297      24.680   1.515  -9.237  1.00 57.42           H\nATOM   4936  HA  MET A 297      22.452   0.864  -7.553  1.00 59.47           H\nATOM   4937  HB3 MET A 297      22.138  -0.999  -9.252  1.00 59.09           H\nATOM   4938  HB2 MET A 297      23.624  -0.516  -9.996  1.00 59.09           H\nATOM   4939  HG3 MET A 297      21.688   0.415 -11.201  1.00 60.09           H\nATOM   4940  HG2 MET A 297      22.678   1.695 -10.571  1.00 60.09           H\nATOM   4941  HE1 MET A 297      18.475   0.555  -9.027  1.00 52.16           H\nATOM   4942  HE2 MET A 297      19.480  -0.418 -10.107  1.00 52.16           H\nATOM   4943  HE3 MET A 297      19.872  -0.313  -8.381  1.00 52.16           H\nATOM   4944  N   GLU A 298      25.130  -0.967  -7.125  1.00 65.13           N\nATOM   4945  CA  GLU A 298      25.804  -1.848  -6.160  1.00 67.74           C\nATOM   4946  C   GLU A 298      25.631  -1.407  -4.695  1.00 69.42           C\nATOM   4947  O   GLU A 298      25.390  -2.260  -3.841  1.00 70.36           O\nATOM   4948  CB  GLU A 298      27.306  -1.964  -6.499  1.00 68.58           C\nATOM   4949  CG  GLU A 298      27.620  -3.018  -7.582  1.00 71.32           C\nATOM   4950  CD  GLU A 298      29.107  -3.114  -7.974  1.00 72.83           C\nATOM   4951  OE1 GLU A 298      29.851  -2.124  -7.792  1.00 71.21           O\nATOM   4952  OE2 GLU A 298      29.486  -4.200  -8.464  1.00 73.73           O1-\nATOM   4953  H   GLU A 298      25.736  -0.494  -7.783  1.00 65.13           H\nATOM   4954  HA  GLU A 298      25.350  -2.838  -6.245  1.00 67.74           H\nATOM   4955  HB3 GLU A 298      27.886  -2.201  -5.605  1.00 68.58           H\nATOM   4956  HB2 GLU A 298      27.661  -0.985  -6.825  1.00 68.58           H\nATOM   4957  HG3 GLU A 298      27.041  -2.819  -8.483  1.00 71.32           H\nATOM   4958  HG2 GLU A 298      27.289  -3.994  -7.224  1.00 71.32           H\nATOM   4959  N   LYS A 299      25.722  -0.088  -4.441  1.00 70.40           N\nATOM   4960  CA  LYS A 299      25.502   0.529  -3.127  1.00 71.56           C\nATOM   4961  C   LYS A 299      24.046   0.427  -2.633  1.00 71.21           C\nATOM   4962  O   LYS A 299      23.831   0.466  -1.422  1.00 71.35           O\nATOM   4963  CB  LYS A 299      25.949   2.004  -3.167  1.00 72.29           C\nATOM   4964  CG  LYS A 299      27.470   2.186  -3.299  1.00 75.60           C\nATOM   4965  CD  LYS A 299      27.853   3.647  -3.577  1.00 78.97           C\nATOM   4966  CE  LYS A 299      29.367   3.834  -3.757  1.00 80.69           C\nATOM   4967  NZ  LYS A 299      29.715   5.244  -4.006  1.00 80.50           N1+\nATOM   4968  H   LYS A 299      25.924   0.547  -5.201  1.00 70.40           H\nATOM   4969  HA  LYS A 299      26.127   0.000  -2.404  1.00 71.56           H\nATOM   4970  HB3 LYS A 299      25.632   2.513  -2.256  1.00 72.29           H\nATOM   4971  HB2 LYS A 299      25.441   2.517  -3.983  1.00 72.29           H\nATOM   4972  HG3 LYS A 299      27.861   1.547  -4.089  1.00 75.60           H\nATOM   4973  HG2 LYS A 299      27.951   1.851  -2.380  1.00 75.60           H\nATOM   4974  HD3 LYS A 299      27.495   4.270  -2.756  1.00 78.97           H\nATOM   4975  HD2 LYS A 299      27.330   3.987  -4.473  1.00 78.97           H\nATOM   4976  HE3 LYS A 299      29.724   3.232  -4.594  1.00 80.69           H\nATOM   4977  HE2 LYS A 299      29.898   3.495  -2.866  1.00 80.69           H\nATOM   4978  HZ1 LYS A 299      29.414   5.809  -3.225  1.00 80.50           H\nATOM   4979  HZ2 LYS A 299      30.715   5.331  -4.117  1.00 80.50           H\nATOM   4980  HZ3 LYS A 299      29.255   5.562  -4.847  1.00 80.50           H\nATOM   4981  N   HIS A 300      23.092   0.277  -3.568  1.00 70.74           N\nATOM   4982  CA  HIS A 300      21.662   0.110  -3.298  1.00 70.09           C\nATOM   4983  C   HIS A 300      21.189  -1.345  -3.504  1.00 70.25           C\nATOM   4984  O   HIS A 300      19.990  -1.572  -3.670  1.00 70.51           O\nATOM   4985  CB  HIS A 300      20.855   1.130  -4.124  1.00 69.84           C\nATOM   4986  CG  HIS A 300      21.135   2.573  -3.779  1.00 69.97           C\nATOM   4987  ND1 HIS A 300      22.229   3.270  -4.265  1.00 72.04           N\nATOM   4988  CD2 HIS A 300      20.451   3.469  -2.986  1.00 70.91           C\nATOM   4989  CE1 HIS A 300      22.180   4.497  -3.742  1.00 72.90           C\nATOM   4990  NE2 HIS A 300      21.126   4.691  -2.959  1.00 72.34           N\nATOM   4991  H   HIS A 300      23.362   0.240  -4.541  1.00 70.74           H\nATOM   4992  HA  HIS A 300      21.459   0.327  -2.248  1.00 70.09           H\nATOM   4993  HB3 HIS A 300      19.792   0.974  -3.949  1.00 69.84           H\nATOM   4994  HB2 HIS A 300      21.026   0.980  -5.191  1.00 69.84           H\nATOM   4995  HD1 HIS A 300      22.939   2.917  -4.897  1.00 72.04           H\nATOM   4996  HD2 HIS A 300      19.539   3.329  -2.425  1.00 70.91           H\nATOM   4997  HE1 HIS A 300      22.920   5.257  -3.940  1.00 72.90           H\nATOM   4998  N   LYS A 301      22.131  -2.305  -3.431  1.00 70.79           N\nATOM   4999  CA  LYS A 301      21.916  -3.755  -3.340  1.00 70.62           C\nATOM   5000  C   LYS A 301      21.310  -4.393  -4.614  1.00 69.50           C\nATOM   5001  O   LYS A 301      20.630  -5.415  -4.521  1.00 70.99           O\nATOM   5002  CB  LYS A 301      21.142  -4.076  -2.032  1.00 71.38           C\nATOM   5003  CG  LYS A 301      21.304  -5.509  -1.492  0.00 70.99           C\nATOM   5004  CD  LYS A 301      20.609  -5.688  -0.134  0.00 71.08           C\nATOM   5005  CE  LYS A 301      20.772  -7.108   0.431  0.00 71.06           C\nATOM   5006  NZ  LYS A 301      20.103  -7.254   1.736  0.00 71.05           N1+\nATOM   5007  H   LYS A 301      23.094  -2.014  -3.322  1.00 70.79           H\nATOM   5008  HA  LYS A 301      22.914  -4.185  -3.248  1.00 70.62           H\nATOM   5009  HB3 LYS A 301      20.085  -3.832  -2.147  1.00 71.38           H\nATOM   5010  HB2 LYS A 301      21.514  -3.411  -1.251  1.00 71.38           H\nATOM   5011  HG3 LYS A 301      22.365  -5.739  -1.391  1.00 70.99           H\nATOM   5012  HG2 LYS A 301      20.898  -6.238  -2.192  1.00 70.99           H\nATOM   5013  HD3 LYS A 301      19.550  -5.451  -0.243  1.00 71.08           H\nATOM   5014  HD2 LYS A 301      21.014  -4.962   0.573  1.00 71.08           H\nATOM   5015  HE3 LYS A 301      21.829  -7.347   0.552  1.00 71.06           H\nATOM   5016  HE2 LYS A 301      20.353  -7.840  -0.260  1.00 71.06           H\nATOM   5017  HZ1 LYS A 301      19.116  -7.064   1.633  1.00 71.05           H\nATOM   5018  HZ2 LYS A 301      20.231  -8.195   2.079  1.00 71.05           H\nATOM   5019  HZ3 LYS A 301      20.503  -6.600   2.395  1.00 71.05           H\nATOM   5020  N   VAL A 302      21.588  -3.799  -5.786  1.00 66.92           N\nATOM   5021  CA  VAL A 302      21.215  -4.326  -7.099  1.00 64.34           C\nATOM   5022  C   VAL A 302      22.500  -4.746  -7.832  1.00 64.59           C\nATOM   5023  O   VAL A 302      23.401  -3.927  -8.019  1.00 65.55           O\nATOM   5024  CB  VAL A 302      20.444  -3.269  -7.941  1.00 64.20           C\nATOM   5025  CG1 VAL A 302      20.269  -3.624  -9.436  1.00 59.88           C\nATOM   5026  CG2 VAL A 302      19.070  -2.972  -7.316  1.00 59.08           C\nATOM   5027  H   VAL A 302      22.147  -2.955  -5.797  1.00 66.92           H\nATOM   5028  HA  VAL A 302      20.573  -5.203  -6.995  1.00 64.34           H\nATOM   5029  HB  VAL A 302      21.006  -2.339  -7.897  1.00 64.20           H\nATOM   5030 HG11 VAL A 302      19.630  -2.898  -9.940  1.00 59.88           H\nATOM   5031 HG12 VAL A 302      21.218  -3.626  -9.973  1.00 59.88           H\nATOM   5032 HG13 VAL A 302      19.810  -4.605  -9.559  1.00 59.88           H\nATOM   5033 HG21 VAL A 302      18.530  -2.228  -7.898  1.00 59.08           H\nATOM   5034 HG22 VAL A 302      18.451  -3.868  -7.270  1.00 59.08           H\nATOM   5035 HG23 VAL A 302      19.166  -2.581  -6.302  1.00 59.08           H\nATOM   5036  N   LYS A 303      22.551  -6.030  -8.216  1.00 65.08           N\nATOM   5037  CA  LYS A 303      23.697  -6.663  -8.867  1.00 65.93           C\nATOM   5038  C   LYS A 303      23.832  -6.193 -10.333  1.00 66.57           C\nATOM   5039  O   LYS A 303      22.818  -6.153 -11.031  1.00 65.70           O\nATOM   5040  CB  LYS A 303      23.480  -8.186  -8.837  1.00 66.75           C\nATOM   5041  CG  LYS A 303      23.407  -8.798  -7.429  1.00 66.75           C\nATOM   5042  CD  LYS A 303      23.278 -10.327  -7.483  0.00 66.79           C\nATOM   5043  CE  LYS A 303      23.208 -10.966  -6.088  0.00 66.80           C\nATOM   5044  NZ  LYS A 303      23.092 -12.433  -6.168  0.00 66.81           N1+\nATOM   5045  H   LYS A 303      21.762  -6.632  -8.033  1.00 65.08           H\nATOM   5046  HA  LYS A 303      24.579  -6.418  -8.275  1.00 65.93           H\nATOM   5047  HB3 LYS A 303      24.317  -8.650  -9.354  1.00 66.75           H\nATOM   5048  HB2 LYS A 303      22.583  -8.454  -9.397  1.00 66.75           H\nATOM   5049  HG3 LYS A 303      22.559  -8.384  -6.882  1.00 66.75           H\nATOM   5050  HG2 LYS A 303      24.301  -8.525  -6.867  1.00 66.75           H\nATOM   5051  HD3 LYS A 303      24.127 -10.736  -8.035  1.00 66.79           H\nATOM   5052  HD2 LYS A 303      22.387 -10.589  -8.056  1.00 66.79           H\nATOM   5053  HE3 LYS A 303      22.352 -10.576  -5.536  1.00 66.80           H\nATOM   5054  HE2 LYS A 303      24.101 -10.717  -5.513  1.00 66.80           H\nATOM   5055  HZ1 LYS A 303      23.895 -12.807  -6.655  1.00 66.81           H\nATOM   5056  HZ2 LYS A 303      23.052 -12.822  -5.237  1.00 66.81           H\nATOM   5057  HZ3 LYS A 303      22.252 -12.678  -6.672  1.00 66.81           H\nATOM   5058  N   PRO A 304      25.060  -5.853 -10.789  1.00 67.20           N\nATOM   5059  CA  PRO A 304      25.275  -5.373 -12.165  1.00 67.36           C\nATOM   5060  C   PRO A 304      25.138  -6.446 -13.264  1.00 67.13           C\nATOM   5061  O   PRO A 304      24.882  -6.078 -14.408  1.00 65.88           O\nATOM   5062  CB  PRO A 304      26.684  -4.774 -12.118  1.00 68.01           C\nATOM   5063  CG  PRO A 304      27.404  -5.615 -11.078  1.00 69.61           C\nATOM   5064  CD  PRO A 304      26.317  -5.880 -10.039  1.00 67.27           C\nATOM   5065  HA  PRO A 304      24.566  -4.578 -12.384  1.00 67.36           H\nATOM   5066  HB3 PRO A 304      26.615  -3.740 -11.776  1.00 68.01           H\nATOM   5067  HB2 PRO A 304      27.197  -4.766 -13.081  1.00 68.01           H\nATOM   5068  HG3 PRO A 304      28.291  -5.131 -10.674  1.00 69.61           H\nATOM   5069  HG2 PRO A 304      27.717  -6.559 -11.528  1.00 69.61           H\nATOM   5070  HD2 PRO A 304      26.487  -6.827  -9.526  1.00 67.27           H\nATOM   5071  HD3 PRO A 304      26.298  -5.080  -9.298  1.00 67.27           H\nATOM   5072  N   ASP A 305      25.288  -7.737 -12.911  1.00 66.00           N\nATOM   5073  CA  ASP A 305      25.131  -8.873 -13.830  1.00 65.99           C\nATOM   5074  C   ASP A 305      23.656  -9.249 -14.098  1.00 62.54           C\nATOM   5075  O   ASP A 305      23.408 -10.033 -15.014  1.00 63.00           O\nATOM   5076  CB  ASP A 305      25.979 -10.116 -13.436  1.00 67.73           C\nATOM   5077  CG  ASP A 305      25.841 -10.703 -12.016  1.00 75.19           C\nATOM   5078  OD1 ASP A 305      24.936 -10.287 -11.260  1.00 82.66           O\nATOM   5079  OD2 ASP A 305      26.630 -11.628 -11.726  1.00 80.95           O1-\nATOM   5080  H   ASP A 305      25.492  -7.978 -11.951  1.00 66.00           H\nATOM   5081  HA  ASP A 305      25.531  -8.555 -14.792  1.00 65.99           H\nATOM   5082  HB3 ASP A 305      27.029  -9.848 -13.562  1.00 67.73           H\nATOM   5083  HB2 ASP A 305      25.806 -10.920 -14.154  1.00 67.73           H\nATOM   5084  N   SER A 306      22.710  -8.695 -13.316  1.00 58.93           N\nATOM   5085  CA  SER A 306      21.274  -8.957 -13.439  1.00 54.66           C\nATOM   5086  C   SER A 306      20.660  -8.367 -14.722  1.00 54.68           C\nATOM   5087  O   SER A 306      21.143  -7.354 -15.234  1.00 51.52           O\nATOM   5088  CB  SER A 306      20.548  -8.469 -12.164  1.00 53.28           C\nATOM   5089  OG  SER A 306      20.367  -7.066 -12.120  1.00 55.13           O\nATOM   5090  H   SER A 306      22.988  -8.054 -12.587  1.00 58.93           H\nATOM   5091  HA  SER A 306      21.167 -10.041 -13.481  1.00 54.66           H\nATOM   5092  HB3 SER A 306      21.083  -8.790 -11.270  1.00 53.28           H\nATOM   5093  HB2 SER A 306      19.561  -8.927 -12.109  1.00 53.28           H\nATOM   5094  HG  SER A 306      21.199  -6.662 -11.846  1.00 55.13           H\nATOM   5095  N   LYS A 307      19.570  -9.002 -15.185  1.00 53.23           N\nATOM   5096  CA  LYS A 307      18.763  -8.541 -16.318  1.00 52.28           C\nATOM   5097  C   LYS A 307      18.011  -7.227 -16.037  1.00 52.07           C\nATOM   5098  O   LYS A 307      17.781  -6.468 -16.979  1.00 49.42           O\nATOM   5099  CB  LYS A 307      17.784  -9.648 -16.753  1.00 52.90           C\nATOM   5100  CG  LYS A 307      18.480 -10.893 -17.322  1.00 52.19           C\nATOM   5101  CD  LYS A 307      17.482 -11.874 -17.950  1.00 53.91           C\nATOM   5102  CE  LYS A 307      18.118 -13.231 -18.284  1.00 52.81           C\nATOM   5103  NZ  LYS A 307      17.109 -14.209 -18.725  1.00 55.56           N1+\nATOM   5104  H   LYS A 307      19.240  -9.834 -14.713  1.00 53.23           H\nATOM   5105  HA  LYS A 307      19.450  -8.348 -17.144  1.00 52.28           H\nATOM   5106  HB3 LYS A 307      17.120  -9.256 -17.523  1.00 52.90           H\nATOM   5107  HB2 LYS A 307      17.141  -9.931 -15.919  1.00 52.90           H\nATOM   5108  HG3 LYS A 307      19.032 -11.393 -16.525  1.00 52.19           H\nATOM   5109  HG2 LYS A 307      19.218 -10.599 -18.070  1.00 52.19           H\nATOM   5110  HD3 LYS A 307      17.087 -11.429 -18.864  1.00 53.91           H\nATOM   5111  HD2 LYS A 307      16.627 -12.000 -17.286  1.00 53.91           H\nATOM   5112  HE3 LYS A 307      18.621 -13.639 -17.406  1.00 52.81           H\nATOM   5113  HE2 LYS A 307      18.873 -13.116 -19.062  1.00 52.81           H\nATOM   5114  HZ1 LYS A 307      16.442 -14.353 -17.979  1.00 55.56           H\nATOM   5115  HZ2 LYS A 307      16.629 -13.859 -19.542  1.00 55.56           H\nATOM   5116  HZ3 LYS A 307      17.559 -15.086 -18.944  1.00 55.56           H\nATOM   5117  N   ALA A 308      17.684  -6.971 -14.755  1.00 50.57           N\nATOM   5118  CA  ALA A 308      17.122  -5.715 -14.259  1.00 49.65           C\nATOM   5119  C   ALA A 308      18.063  -4.524 -14.481  1.00 48.84           C\nATOM   5120  O   ALA A 308      17.605  -3.484 -14.951  1.00 48.46           O\nATOM   5121  CB  ALA A 308      16.803  -5.849 -12.760  1.00 48.80           C\nATOM   5122  H   ALA A 308      17.883  -7.669 -14.052  1.00 50.57           H\nATOM   5123  HA  ALA A 308      16.192  -5.528 -14.799  1.00 49.65           H\nATOM   5124  HB1 ALA A 308      16.274  -4.970 -12.391  1.00 48.80           H\nATOM   5125  HB2 ALA A 308      16.176  -6.715 -12.558  1.00 48.80           H\nATOM   5126  HB3 ALA A 308      17.708  -5.966 -12.164  1.00 48.80           H\nATOM   5127  N   PHE A 309      19.359  -4.711 -14.166  1.00 48.38           N\nATOM   5128  CA  PHE A 309      20.398  -3.700 -14.346  1.00 49.42           C\nATOM   5129  C   PHE A 309      20.689  -3.390 -15.824  1.00 49.49           C\nATOM   5130  O   PHE A 309      20.826  -2.217 -16.168  1.00 49.11           O\nATOM   5131  CB  PHE A 309      21.679  -4.096 -13.579  1.00 48.95           C\nATOM   5132  CG  PHE A 309      22.798  -3.075 -13.696  1.00 48.20           C\nATOM   5133  CD1 PHE A 309      22.796  -1.945 -12.854  1.00 46.29           C\nATOM   5134  CD2 PHE A 309      23.711  -3.125 -14.773  1.00 43.56           C\nATOM   5135  CE1 PHE A 309      23.702  -0.919 -13.073  1.00 45.18           C\nATOM   5136  CE2 PHE A 309      24.605  -2.085 -14.978  1.00 44.55           C\nATOM   5137  CZ  PHE A 309      24.593  -0.982 -14.136  1.00 45.82           C\nATOM   5138  H   PHE A 309      19.657  -5.600 -13.787  1.00 48.38           H\nATOM   5139  HA  PHE A 309      20.028  -2.779 -13.892  1.00 49.42           H\nATOM   5140  HB3 PHE A 309      22.043  -5.068 -13.916  1.00 48.95           H\nATOM   5141  HB2 PHE A 309      21.440  -4.213 -12.521  1.00 48.95           H\nATOM   5142  HD1 PHE A 309      22.078  -1.866 -12.051  1.00 46.29           H\nATOM   5143  HD2 PHE A 309      23.695  -3.957 -15.462  1.00 43.56           H\nATOM   5144  HE1 PHE A 309      23.701  -0.058 -12.425  1.00 45.18           H\nATOM   5145  HE2 PHE A 309      25.295  -2.121 -15.808  1.00 44.55           H\nATOM   5146  HZ  PHE A 309      25.272  -0.163 -14.315  1.00 45.82           H\nATOM   5147  N   HIS A 310      20.785  -4.437 -16.663  1.00 50.30           N\nATOM   5148  CA  HIS A 310      21.067  -4.300 -18.093  1.00 49.83           C\nATOM   5149  C   HIS A 310      19.955  -3.582 -18.874  1.00 50.15           C\nATOM   5150  O   HIS A 310      20.278  -2.817 -19.782  1.00 52.53           O\nATOM   5151  CB  HIS A 310      21.407  -5.666 -18.716  1.00 49.67           C\nATOM   5152  CG  HIS A 310      22.825  -6.110 -18.466  1.00 52.02           C\nATOM   5153  ND1 HIS A 310      23.230  -6.764 -17.315  1.00 54.58           N\nATOM   5154  CD2 HIS A 310      23.956  -6.000 -19.246  1.00 53.31           C\nATOM   5155  CE1 HIS A 310      24.536  -7.010 -17.445  1.00 53.15           C\nATOM   5156  NE2 HIS A 310      25.046  -6.570 -18.588  1.00 49.74           N\nATOM   5157  H   HIS A 310      20.674  -5.377 -16.308  1.00 50.30           H\nATOM   5158  HA  HIS A 310      21.952  -3.667 -18.191  1.00 49.83           H\nATOM   5159  HB3 HIS A 310      21.284  -5.629 -19.798  1.00 49.67           H\nATOM   5160  HB2 HIS A 310      20.720  -6.435 -18.359  1.00 49.67           H\nATOM   5161  HD1 HIS A 310      22.648  -7.013 -16.524  1.00 54.58           H\nATOM   5162  HD2 HIS A 310      24.068  -5.553 -20.223  1.00 53.31           H\nATOM   5163  HE1 HIS A 310      25.125  -7.515 -16.696  1.00 53.15           H\nATOM   5164  N   LEU A 311      18.687  -3.792 -18.478  1.00 48.63           N\nATOM   5165  CA  LEU A 311      17.541  -3.046 -18.996  1.00 48.91           C\nATOM   5166  C   LEU A 311      17.535  -1.588 -18.504  1.00 48.90           C\nATOM   5167  O   LEU A 311      17.306  -0.696 -19.316  1.00 50.09           O\nATOM   5168  CB  LEU A 311      16.234  -3.799 -18.656  1.00 47.24           C\nATOM   5169  CG  LEU A 311      14.910  -3.114 -19.079  1.00 47.64           C\nATOM   5170  CD1 LEU A 311      14.827  -2.784 -20.586  1.00 44.16           C\nATOM   5171  CD2 LEU A 311      13.703  -3.951 -18.632  1.00 40.53           C\nATOM   5172  H   LEU A 311      18.495  -4.446 -17.731  1.00 48.63           H\nATOM   5173  HA  LEU A 311      17.644  -3.021 -20.082  1.00 48.91           H\nATOM   5174  HB3 LEU A 311      16.200  -3.972 -17.578  1.00 47.24           H\nATOM   5175  HB2 LEU A 311      16.284  -4.790 -19.105  1.00 47.24           H\nATOM   5176  HG  LEU A 311      14.830  -2.171 -18.540  1.00 47.64           H\nATOM   5177 HD11 LEU A 311      14.766  -1.707 -20.745  1.00 44.16           H\nATOM   5178 HD12 LEU A 311      15.690  -3.144 -21.144  1.00 44.16           H\nATOM   5179 HD13 LEU A 311      13.949  -3.229 -21.055  1.00 44.16           H\nATOM   5180 HD21 LEU A 311      12.774  -3.584 -19.068  1.00 40.53           H\nATOM   5181 HD22 LEU A 311      13.816  -4.995 -18.922  1.00 40.53           H\nATOM   5182 HD23 LEU A 311      13.592  -3.913 -17.548  1.00 40.53           H\nATOM   5183  N   LEU A 312      17.825  -1.367 -17.208  1.00 48.45           N\nATOM   5184  CA  LEU A 312      17.892  -0.047 -16.571  1.00 47.94           C\nATOM   5185  C   LEU A 312      18.945   0.887 -17.197  1.00 48.54           C\nATOM   5186  O   LEU A 312      18.665   2.072 -17.374  1.00 50.14           O\nATOM   5187  CB  LEU A 312      18.115  -0.241 -15.051  1.00 47.46           C\nATOM   5188  CG  LEU A 312      18.263   1.029 -14.182  1.00 45.70           C\nATOM   5189  CD1 LEU A 312      17.020   1.936 -14.246  1.00 43.84           C\nATOM   5190  CD2 LEU A 312      18.648   0.667 -12.733  1.00 41.54           C\nATOM   5191  H   LEU A 312      18.003  -2.156 -16.601  1.00 48.45           H\nATOM   5192  HA  LEU A 312      16.917   0.412 -16.734  1.00 47.94           H\nATOM   5193  HB3 LEU A 312      19.013  -0.842 -14.912  1.00 47.46           H\nATOM   5194  HB2 LEU A 312      17.300  -0.837 -14.644  1.00 47.46           H\nATOM   5195  HG  LEU A 312      19.099   1.608 -14.577  1.00 45.70           H\nATOM   5196 HD11 LEU A 312      17.322   2.976 -14.343  1.00 43.84           H\nATOM   5197 HD12 LEU A 312      16.372   1.724 -15.093  1.00 43.84           H\nATOM   5198 HD13 LEU A 312      16.398   1.849 -13.358  1.00 43.84           H\nATOM   5199 HD21 LEU A 312      17.956   1.071 -11.995  1.00 41.54           H\nATOM   5200 HD22 LEU A 312      18.688  -0.411 -12.576  1.00 41.54           H\nATOM   5201 HD23 LEU A 312      19.635   1.063 -12.493  1.00 41.54           H\nATOM   5202  N   GLN A 313      20.114   0.327 -17.544  1.00 49.36           N\nATOM   5203  CA  GLN A 313      21.218   1.014 -18.210  1.00 50.51           C\nATOM   5204  C   GLN A 313      20.905   1.408 -19.670  1.00 49.65           C\nATOM   5205  O   GLN A 313      21.414   2.430 -20.130  1.00 50.15           O\nATOM   5206  CB  GLN A 313      22.481   0.140 -18.055  1.00 50.76           C\nATOM   5207  CG  GLN A 313      23.756   0.691 -18.722  1.00 54.81           C\nATOM   5208  CD  GLN A 313      25.004  -0.058 -18.256  1.00 58.06           C\nATOM   5209  OE1 GLN A 313      25.759   0.442 -17.425  1.00 58.09           O\nATOM   5210  NE2 GLN A 313      25.220  -1.266 -18.781  1.00 57.02           N\nATOM   5211  H   GLN A 313      20.267  -0.651 -17.332  1.00 49.36           H\nATOM   5212  HA  GLN A 313      21.393   1.946 -17.670  1.00 50.51           H\nATOM   5213  HB3 GLN A 313      22.281  -0.863 -18.437  1.00 50.76           H\nATOM   5214  HB2 GLN A 313      22.672   0.014 -16.988  1.00 50.76           H\nATOM   5215  HG3 GLN A 313      23.876   1.746 -18.472  1.00 54.81           H\nATOM   5216  HG2 GLN A 313      23.684   0.633 -19.809  1.00 54.81           H\nATOM   5217 HE22 GLN A 313      26.030  -1.801 -18.504  1.00 57.02           H\nATOM   5218 HE21 GLN A 313      24.570  -1.663 -19.449  1.00 57.02           H\nATOM   5219  N   LYS A 314      20.043   0.630 -20.349  1.00 50.04           N\nATOM   5220  CA  LYS A 314      19.529   0.937 -21.687  1.00 49.87           C\nATOM   5221  C   LYS A 314      18.456   2.045 -21.678  1.00 50.35           C\nATOM   5222  O   LYS A 314      18.429   2.850 -22.611  1.00 52.49           O\nATOM   5223  CB  LYS A 314      19.005  -0.351 -22.352  1.00 48.70           C\nATOM   5224  CG  LYS A 314      20.123  -1.322 -22.765  1.00 45.45           C\nATOM   5225  CD  LYS A 314      19.573  -2.655 -23.292  1.00 46.12           C\nATOM   5226  CE  LYS A 314      20.685  -3.635 -23.697  1.00 44.48           C\nATOM   5227  NZ  LYS A 314      20.132  -4.895 -24.224  1.00 42.62           N1+\nATOM   5228  H   LYS A 314      19.657  -0.190 -19.903  1.00 50.04           H\nATOM   5229  HA  LYS A 314      20.364   1.303 -22.286  1.00 49.87           H\nATOM   5230  HB3 LYS A 314      18.452  -0.093 -23.253  1.00 48.70           H\nATOM   5231  HB2 LYS A 314      18.293  -0.851 -21.698  1.00 48.70           H\nATOM   5232  HG3 LYS A 314      20.789  -1.505 -21.924  1.00 45.45           H\nATOM   5233  HG2 LYS A 314      20.736  -0.854 -23.536  1.00 45.45           H\nATOM   5234  HD3 LYS A 314      18.930  -2.458 -24.150  1.00 46.12           H\nATOM   5235  HD2 LYS A 314      18.938  -3.108 -22.528  1.00 46.12           H\nATOM   5236  HE3 LYS A 314      21.320  -3.863 -22.840  1.00 44.48           H\nATOM   5237  HE2 LYS A 314      21.320  -3.186 -24.462  1.00 44.48           H\nATOM   5238  HZ1 LYS A 314      19.594  -5.345 -23.494  1.00 42.62           H\nATOM   5239  HZ2 LYS A 314      19.533  -4.704 -25.015  1.00 42.62           H\nATOM   5240  HZ3 LYS A 314      20.885  -5.506 -24.507  1.00 42.62           H\nATOM   5241  N   LEU A 315      17.623   2.096 -20.620  1.00 48.29           N\nATOM   5242  CA  LEU A 315      16.641   3.162 -20.385  1.00 47.39           C\nATOM   5243  C   LEU A 315      17.319   4.494 -19.997  1.00 46.64           C\nATOM   5244  O   LEU A 315      16.853   5.546 -20.434  1.00 44.68           O\nATOM   5245  CB  LEU A 315      15.625   2.734 -19.295  1.00 45.51           C\nATOM   5246  CG  LEU A 315      14.764   1.479 -19.596  1.00 49.20           C\nATOM   5247  CD1 LEU A 315      14.103   0.921 -18.321  1.00 44.11           C\nATOM   5248  CD2 LEU A 315      13.719   1.709 -20.696  1.00 42.67           C\nATOM   5249  H   LEU A 315      17.690   1.386 -19.903  1.00 48.29           H\nATOM   5250  HA  LEU A 315      16.104   3.342 -21.315  1.00 47.39           H\nATOM   5251  HB3 LEU A 315      14.950   3.565 -19.086  1.00 45.51           H\nATOM   5252  HB2 LEU A 315      16.176   2.561 -18.370  1.00 45.51           H\nATOM   5253  HG  LEU A 315      15.422   0.705 -19.979  1.00 49.20           H\nATOM   5254 HD11 LEU A 315      13.057   0.654 -18.476  1.00 44.11           H\nATOM   5255 HD12 LEU A 315      14.617   0.023 -17.983  1.00 44.11           H\nATOM   5256 HD13 LEU A 315      14.132   1.632 -17.498  1.00 44.11           H\nATOM   5257 HD21 LEU A 315      13.477   0.773 -21.201  1.00 42.67           H\nATOM   5258 HD22 LEU A 315      12.790   2.121 -20.299  1.00 42.67           H\nATOM   5259 HD23 LEU A 315      14.085   2.390 -21.456  1.00 42.67           H\nATOM   5260  N   LEU A 316      18.416   4.417 -19.221  1.00 46.35           N\nATOM   5261  CA  LEU A 316      19.231   5.551 -18.778  1.00 46.61           C\nATOM   5262  C   LEU A 316      20.531   5.661 -19.601  1.00 48.67           C\nATOM   5263  O   LEU A 316      21.610   5.797 -19.028  1.00 53.10           O\nATOM   5264  CB  LEU A 316      19.515   5.440 -17.256  1.00 46.32           C\nATOM   5265  CG  LEU A 316      18.278   5.577 -16.343  1.00 44.15           C\nATOM   5266  CD1 LEU A 316      18.685   5.445 -14.866  1.00 45.10           C\nATOM   5267  CD2 LEU A 316      17.513   6.892 -16.572  1.00 43.94           C\nATOM   5268  H   LEU A 316      18.721   3.510 -18.893  1.00 46.35           H\nATOM   5269  HA  LEU A 316      18.694   6.482 -18.960  1.00 46.61           H\nATOM   5270  HB3 LEU A 316      20.216   6.223 -16.960  1.00 46.32           H\nATOM   5271  HB2 LEU A 316      20.020   4.495 -17.051  1.00 46.32           H\nATOM   5272  HG  LEU A 316      17.604   4.748 -16.563  1.00 44.15           H\nATOM   5273 HD11 LEU A 316      17.827   5.193 -14.244  1.00 45.10           H\nATOM   5274 HD12 LEU A 316      19.439   4.670 -14.721  1.00 45.10           H\nATOM   5275 HD13 LEU A 316      19.097   6.379 -14.484  1.00 45.10           H\nATOM   5276 HD21 LEU A 316      17.058   7.261 -15.653  1.00 43.94           H\nATOM   5277 HD22 LEU A 316      18.169   7.679 -16.942  1.00 43.94           H\nATOM   5278 HD23 LEU A 316      16.714   6.756 -17.300  1.00 43.94           H\nATOM   5279  N   THR A 317      20.411   5.642 -20.939  1.00 47.73           N\nATOM   5280  CA  THR A 317      21.512   5.977 -21.850  1.00 47.25           C\nATOM   5281  C   THR A 317      21.575   7.508 -22.019  1.00 46.98           C\nATOM   5282  O   THR A 317      20.525   8.121 -22.202  1.00 45.81           O\nATOM   5283  CB  THR A 317      21.286   5.345 -23.246  1.00 48.27           C\nATOM   5284  OG1 THR A 317      21.210   3.939 -23.111  1.00 50.27           O\nATOM   5285  CG2 THR A 317      22.382   5.637 -24.284  1.00 46.88           C\nATOM   5286  H   THR A 317      19.499   5.522 -21.355  1.00 47.73           H\nATOM   5287  HA  THR A 317      22.459   5.612 -21.446  1.00 47.25           H\nATOM   5288  HB  THR A 317      20.332   5.690 -23.642  1.00 48.27           H\nATOM   5289  HG1 THR A 317      20.497   3.732 -22.501  1.00 50.27           H\nATOM   5290 HG21 THR A 317      22.207   5.077 -25.201  1.00 46.88           H\nATOM   5291 HG22 THR A 317      22.421   6.691 -24.556  1.00 46.88           H\nATOM   5292 HG23 THR A 317      23.365   5.352 -23.909  1.00 46.88           H\nATOM   5293  N   MET A 318      22.777   8.104 -21.932  1.00 47.85           N\nATOM   5294  CA  MET A 318      22.982   9.561 -21.966  1.00 48.95           C\nATOM   5295  C   MET A 318      22.601  10.224 -23.303  1.00 47.42           C\nATOM   5296  O   MET A 318      21.975  11.284 -23.283  1.00 46.76           O\nATOM   5297  CB  MET A 318      24.439   9.900 -21.581  1.00 51.20           C\nATOM   5298  CG  MET A 318      24.801   9.575 -20.119  1.00 56.41           C\nATOM   5299  SD  MET A 318      23.947  10.571 -18.861  1.00 63.20           S\nATOM   5300  CE  MET A 318      24.803  12.156 -19.060  1.00 56.26           C\nATOM   5301  H   MET A 318      23.605   7.542 -21.792  1.00 47.85           H\nATOM   5302  HA  MET A 318      22.323   9.996 -21.212  1.00 48.95           H\nATOM   5303  HB3 MET A 318      24.628  10.958 -21.763  1.00 51.20           H\nATOM   5304  HB2 MET A 318      25.126   9.370 -22.242  1.00 51.20           H\nATOM   5305  HG3 MET A 318      25.874   9.703 -19.974  1.00 56.41           H\nATOM   5306  HG2 MET A 318      24.594   8.526 -19.909  1.00 56.41           H\nATOM   5307  HE1 MET A 318      24.368  12.906 -18.400  1.00 56.26           H\nATOM   5308  HE2 MET A 318      25.856  12.045 -18.807  1.00 56.26           H\nATOM   5309  HE3 MET A 318      24.724  12.521 -20.083  1.00 56.26           H\nATOM   5310  N   ASP A 319      22.957   9.580 -24.426  1.00 48.08           N\nATOM   5311  CA  ASP A 319      22.637  10.018 -25.785  1.00 48.37           C\nATOM   5312  C   ASP A 319      21.212   9.526 -26.141  1.00 46.80           C\nATOM   5313  O   ASP A 319      21.000   8.312 -26.127  1.00 47.05           O\nATOM   5314  CB  ASP A 319      23.695   9.441 -26.764  1.00 49.38           C\nATOM   5315  CG  ASP A 319      23.628   9.884 -28.237  1.00 48.19           C\nATOM   5316  OD1 ASP A 319      22.883  10.836 -28.557  1.00 45.89           O\nATOM   5317  OD2 ASP A 319      24.412   9.312 -29.024  1.00 47.50           O1-\nATOM   5318  H   ASP A 319      23.480   8.717 -24.354  1.00 48.08           H\nATOM   5319  HA  ASP A 319      22.726  11.102 -25.802  1.00 48.37           H\nATOM   5320  HB3 ASP A 319      23.687   8.352 -26.718  1.00 49.38           H\nATOM   5321  HB2 ASP A 319      24.678   9.721 -26.392  1.00 49.38           H\nATOM   5322  N   PRO A 320      20.258  10.442 -26.441  1.00 47.89           N\nATOM   5323  CA  PRO A 320      18.862  10.055 -26.728  1.00 48.04           C\nATOM   5324  C   PRO A 320      18.621   9.189 -27.979  1.00 48.64           C\nATOM   5325  O   PRO A 320      17.633   8.455 -27.980  1.00 48.94           O\nATOM   5326  CB  PRO A 320      18.109  11.390 -26.812  1.00 47.83           C\nATOM   5327  CG  PRO A 320      19.168  12.413 -27.179  1.00 47.06           C\nATOM   5328  CD  PRO A 320      20.402  11.902 -26.449  1.00 48.19           C\nATOM   5329  HA  PRO A 320      18.475   9.494 -25.875  1.00 48.04           H\nATOM   5330  HB3 PRO A 320      17.700  11.622 -25.832  1.00 47.83           H\nATOM   5331  HB2 PRO A 320      17.274  11.386 -27.515  1.00 47.83           H\nATOM   5332  HG3 PRO A 320      18.900  13.435 -26.909  1.00 47.06           H\nATOM   5333  HG2 PRO A 320      19.344  12.383 -28.255  1.00 47.06           H\nATOM   5334  HD2 PRO A 320      21.302  12.263 -26.945  1.00 48.19           H\nATOM   5335  HD3 PRO A 320      20.416  12.259 -25.418  1.00 48.19           H\nATOM   5336  N   ILE A 321      19.498   9.253 -29.000  1.00 49.64           N\nATOM   5337  CA  ILE A 321      19.373   8.414 -30.203  1.00 49.92           C\nATOM   5338  C   ILE A 321      19.879   6.967 -30.004  1.00 49.62           C\nATOM   5339  O   ILE A 321      19.450   6.086 -30.748  1.00 51.30           O\nATOM   5340  CB  ILE A 321      20.058   9.028 -31.458  1.00 51.44           C\nATOM   5341  CG1 ILE A 321      21.593   9.196 -31.370  1.00 52.78           C\nATOM   5342  CG2 ILE A 321      19.381  10.349 -31.867  1.00 51.99           C\nATOM   5343  CD1 ILE A 321      22.287   9.329 -32.733  1.00 56.13           C\nATOM   5344  H   ILE A 321      20.295   9.874 -28.957  1.00 49.64           H\nATOM   5345  HA  ILE A 321      18.311   8.329 -30.441  1.00 49.92           H\nATOM   5346  HB  ILE A 321      19.870   8.332 -32.278  1.00 51.44           H\nATOM   5347 HG13 ILE A 321      22.057   8.366 -30.840  1.00 52.78           H\nATOM   5348 HG12 ILE A 321      21.813  10.085 -30.785  1.00 52.78           H\nATOM   5349 HG21 ILE A 321      19.767  10.718 -32.818  1.00 51.99           H\nATOM   5350 HG22 ILE A 321      18.305  10.220 -31.983  1.00 51.99           H\nATOM   5351 HG23 ILE A 321      19.543  11.128 -31.121  1.00 51.99           H\nATOM   5352 HD11 ILE A 321      23.355   9.128 -32.641  1.00 56.13           H\nATOM   5353 HD12 ILE A 321      21.881   8.629 -33.464  1.00 56.13           H\nATOM   5354 HD13 ILE A 321      22.178  10.337 -33.134  1.00 56.13           H\nATOM   5355  N   LYS A 322      20.738   6.741 -28.994  1.00 47.58           N\nATOM   5356  CA  LYS A 322      21.223   5.416 -28.592  1.00 47.09           C\nATOM   5357  C   LYS A 322      20.356   4.767 -27.501  1.00 45.74           C\nATOM   5358  O   LYS A 322      20.522   3.575 -27.246  1.00 45.16           O\nATOM   5359  CB  LYS A 322      22.686   5.531 -28.127  1.00 47.98           C\nATOM   5360  CG  LYS A 322      23.639   5.848 -29.284  1.00 49.12           C\nATOM   5361  CD  LYS A 322      25.102   5.929 -28.844  1.00 52.89           C\nATOM   5362  CE  LYS A 322      26.016   6.298 -30.020  1.00 53.21           C\nATOM   5363  NZ  LYS A 322      27.418   6.402 -29.599  1.00 57.96           N1+\nATOM   5364  H   LYS A 322      21.045   7.517 -28.423  1.00 47.58           H\nATOM   5365  HA  LYS A 322      21.196   4.744 -29.452  1.00 47.09           H\nATOM   5366  HB3 LYS A 322      23.006   4.589 -27.679  1.00 47.98           H\nATOM   5367  HB2 LYS A 322      22.773   6.285 -27.344  1.00 47.98           H\nATOM   5368  HG3 LYS A 322      23.354   6.792 -29.746  1.00 49.12           H\nATOM   5369  HG2 LYS A 322      23.536   5.087 -30.059  1.00 49.12           H\nATOM   5370  HD3 LYS A 322      25.405   4.971 -28.418  1.00 52.89           H\nATOM   5371  HD2 LYS A 322      25.197   6.666 -28.045  1.00 52.89           H\nATOM   5372  HE3 LYS A 322      25.714   7.252 -30.453  1.00 53.21           H\nATOM   5373  HE2 LYS A 322      25.941   5.549 -30.809  1.00 53.21           H\nATOM   5374  HZ1 LYS A 322      27.732   5.519 -29.225  1.00 57.96           H\nATOM   5375  HZ2 LYS A 322      27.996   6.659 -30.387  1.00 57.96           H\nATOM   5376  HZ3 LYS A 322      27.503   7.115 -28.887  1.00 57.96           H\nATOM   5377  N   ARG A 323      19.453   5.548 -26.885  1.00 46.29           N\nATOM   5378  CA  ARG A 323      18.494   5.103 -25.878  1.00 44.44           C\nATOM   5379  C   ARG A 323      17.449   4.160 -26.494  1.00 45.15           C\nATOM   5380  O   ARG A 323      16.982   4.414 -27.606  1.00 43.77           O\nATOM   5381  CB  ARG A 323      17.862   6.364 -25.256  1.00 45.36           C\nATOM   5382  CG  ARG A 323      17.117   6.157 -23.921  1.00 44.17           C\nATOM   5383  CD  ARG A 323      16.545   7.473 -23.350  1.00 47.80           C\nATOM   5384  NE  ARG A 323      17.611   8.438 -23.004  1.00 46.04           N\nATOM   5385  CZ  ARG A 323      17.601   9.782 -23.098  1.00 44.53           C\nATOM   5386  NH1 ARG A 323      16.512  10.473 -23.449  1.00 41.82           N\nATOM   5387  NH2 ARG A 323      18.721  10.464 -22.843  1.00 47.51           N1+\nATOM   5388  H   ARG A 323      19.384   6.518 -27.158  1.00 46.29           H\nATOM   5389  HA  ARG A 323      19.048   4.562 -25.111  1.00 44.44           H\nATOM   5390  HB3 ARG A 323      17.188   6.832 -25.974  1.00 45.36           H\nATOM   5391  HB2 ARG A 323      18.663   7.086 -25.090  1.00 45.36           H\nATOM   5392  HG3 ARG A 323      17.817   5.729 -23.201  1.00 44.17           H\nATOM   5393  HG2 ARG A 323      16.316   5.425 -24.021  1.00 44.17           H\nATOM   5394  HD3 ARG A 323      15.902   7.281 -22.492  1.00 47.80           H\nATOM   5395  HD2 ARG A 323      15.913   7.916 -24.118  1.00 47.80           H\nATOM   5396  HE  ARG A 323      18.480   8.018 -22.700  1.00 46.04           H\nATOM   5397 HH12 ARG A 323      16.555  11.480 -23.565  1.00 41.82           H\nATOM   5398 HH11 ARG A 323      15.636   9.992 -23.604  1.00 41.82           H\nATOM   5399 HH22 ARG A 323      18.746  11.472 -22.955  1.00 47.51           H\nATOM   5400 HH21 ARG A 323      19.569   9.974 -22.587  1.00 47.51           H\nATOM   5401  N   ILE A 324      17.111   3.091 -25.757  1.00 45.91           N\nATOM   5402  CA  ILE A 324      16.128   2.074 -26.146  1.00 46.05           C\nATOM   5403  C   ILE A 324      14.714   2.677 -26.323  1.00 45.46           C\nATOM   5404  O   ILE A 324      14.409   3.699 -25.709  1.00 42.55           O\nATOM   5405  CB  ILE A 324      16.101   0.952 -25.062  1.00 47.35           C\nATOM   5406  CG1 ILE A 324      15.479  -0.368 -25.563  1.00 51.84           C\nATOM   5407  CG2 ILE A 324      15.458   1.380 -23.725  1.00 53.59           C\nATOM   5408  CD1 ILE A 324      15.742  -1.571 -24.647  1.00 56.10           C\nATOM   5409  H   ILE A 324      17.547   2.955 -24.856  1.00 45.91           H\nATOM   5410  HA  ILE A 324      16.449   1.651 -27.100  1.00 46.05           H\nATOM   5411  HB  ILE A 324      17.147   0.735 -24.850  1.00 47.35           H\nATOM   5412 HG13 ILE A 324      15.858  -0.599 -26.559  1.00 51.84           H\nATOM   5413 HG12 ILE A 324      14.404  -0.251 -25.666  1.00 51.84           H\nATOM   5414 HG21 ILE A 324      15.684   0.670 -22.929  1.00 53.59           H\nATOM   5415 HG22 ILE A 324      15.829   2.353 -23.404  1.00 53.59           H\nATOM   5416 HG23 ILE A 324      14.373   1.451 -23.801  1.00 53.59           H\nATOM   5417 HD11 ILE A 324      15.553  -2.505 -25.176  1.00 56.10           H\nATOM   5418 HD12 ILE A 324      16.772  -1.591 -24.295  1.00 56.10           H\nATOM   5419 HD13 ILE A 324      15.092  -1.553 -23.773  1.00 56.10           H\nATOM   5420  N   THR A 325      13.882   2.046 -27.163  1.00 44.32           N\nATOM   5421  CA  THR A 325      12.473   2.412 -27.331  1.00 44.97           C\nATOM   5422  C   THR A 325      11.586   1.613 -26.350  1.00 45.37           C\nATOM   5423  O   THR A 325      12.034   0.613 -25.785  1.00 43.60           O\nATOM   5424  CB  THR A 325      12.002   2.131 -28.782  1.00 45.35           C\nATOM   5425  OG1 THR A 325      11.887   0.753 -29.071  1.00 47.75           O\nATOM   5426  CG2 THR A 325      12.865   2.805 -29.859  1.00 46.52           C\nATOM   5427  H   THR A 325      14.191   1.226 -27.668  1.00 44.32           H\nATOM   5428  HA  THR A 325      12.331   3.475 -27.129  1.00 44.97           H\nATOM   5429  HB  THR A 325      10.998   2.541 -28.889  1.00 45.35           H\nATOM   5430  HG1 THR A 325      11.549   0.669 -29.968  1.00 47.75           H\nATOM   5431 HG21 THR A 325      12.441   2.652 -30.852  1.00 46.52           H\nATOM   5432 HG22 THR A 325      12.930   3.880 -29.690  1.00 46.52           H\nATOM   5433 HG23 THR A 325      13.881   2.408 -29.871  1.00 46.52           H\nATOM   5434  N   SER A 326      10.334   2.066 -26.167  1.00 46.21           N\nATOM   5435  CA  SER A 326       9.341   1.408 -25.309  1.00 48.15           C\nATOM   5436  C   SER A 326       8.998  -0.032 -25.740  1.00 47.95           C\nATOM   5437  O   SER A 326       8.883  -0.894 -24.870  1.00 49.58           O\nATOM   5438  CB  SER A 326       8.087   2.296 -25.165  1.00 46.61           C\nATOM   5439  OG  SER A 326       7.376   2.418 -26.379  1.00 51.24           O\nATOM   5440  H   SER A 326      10.022   2.891 -26.664  1.00 46.21           H\nATOM   5441  HA  SER A 326       9.800   1.341 -24.322  1.00 48.15           H\nATOM   5442  HB3 SER A 326       8.342   3.289 -24.802  1.00 46.61           H\nATOM   5443  HB2 SER A 326       7.412   1.867 -24.423  1.00 46.61           H\nATOM   5444  HG  SER A 326       7.918   2.904 -27.008  1.00 51.24           H\nATOM   5445  N   GLU A 327       8.889  -0.273 -27.059  1.00 48.30           N\nATOM   5446  CA  GLU A 327       8.622  -1.586 -27.639  1.00 49.29           C\nATOM   5447  C   GLU A 327       9.814  -2.554 -27.518  1.00 47.25           C\nATOM   5448  O   GLU A 327       9.584  -3.717 -27.197  1.00 47.66           O\nATOM   5449  CB  GLU A 327       8.080  -1.466 -29.085  1.00 50.19           C\nATOM   5450  CG  GLU A 327       8.978  -0.808 -30.166  1.00 57.27           C\nATOM   5451  CD  GLU A 327       8.929   0.727 -30.309  1.00 63.43           C\nATOM   5452  OE1 GLU A 327       8.286   1.415 -29.484  1.00 59.89           O\nATOM   5453  OE2 GLU A 327       9.588   1.208 -31.257  1.00 67.48           O1-\nATOM   5454  H   GLU A 327       8.960   0.493 -27.718  1.00 48.30           H\nATOM   5455  HA  GLU A 327       7.812  -2.025 -27.051  1.00 49.29           H\nATOM   5456  HB3 GLU A 327       7.112  -0.974 -29.055  1.00 50.19           H\nATOM   5457  HB2 GLU A 327       7.849  -2.475 -29.430  1.00 50.19           H\nATOM   5458  HG3 GLU A 327       8.673  -1.214 -31.131  1.00 57.27           H\nATOM   5459  HG2 GLU A 327      10.015  -1.119 -30.043  1.00 57.27           H\nATOM   5460  N   GLN A 328      11.053  -2.064 -27.712  1.00 47.51           N\nATOM   5461  CA  GLN A 328      12.291  -2.831 -27.510  1.00 48.87           C\nATOM   5462  C   GLN A 328      12.513  -3.261 -26.050  1.00 49.46           C\nATOM   5463  O   GLN A 328      13.017  -4.360 -25.816  1.00 50.93           O\nATOM   5464  CB  GLN A 328      13.502  -2.018 -28.003  1.00 50.16           C\nATOM   5465  CG  GLN A 328      13.651  -1.969 -29.534  1.00 52.69           C\nATOM   5466  CD  GLN A 328      14.810  -1.066 -29.973  1.00 58.57           C\nATOM   5467  OE1 GLN A 328      15.134  -0.079 -29.315  1.00 58.33           O\nATOM   5468  NE2 GLN A 328      15.429  -1.391 -31.109  1.00 63.85           N\nATOM   5469  H   GLN A 328      11.169  -1.092 -27.966  1.00 47.51           H\nATOM   5470  HA  GLN A 328      12.219  -3.743 -28.106  1.00 48.87           H\nATOM   5471  HB3 GLN A 328      14.423  -2.435 -27.590  1.00 50.16           H\nATOM   5472  HB2 GLN A 328      13.425  -1.007 -27.604  1.00 50.16           H\nATOM   5473  HG3 GLN A 328      12.735  -1.602 -29.997  1.00 52.69           H\nATOM   5474  HG2 GLN A 328      13.809  -2.978 -29.917  1.00 52.69           H\nATOM   5475 HE22 GLN A 328      16.191  -0.821 -31.447  1.00 63.85           H\nATOM   5476 HE21 GLN A 328      15.140  -2.201 -31.639  1.00 63.85           H\nATOM   5477  N   ALA A 329      12.112  -2.394 -25.105  1.00 47.62           N\nATOM   5478  CA  ALA A 329      12.153  -2.654 -23.671  1.00 47.39           C\nATOM   5479  C   ALA A 329      11.151  -3.734 -23.227  1.00 47.39           C\nATOM   5480  O   ALA A 329      11.486  -4.500 -22.330  1.00 46.84           O\nATOM   5481  CB  ALA A 329      11.942  -1.337 -22.914  1.00 43.92           C\nATOM   5482  H   ALA A 329      11.731  -1.499 -25.385  1.00 47.62           H\nATOM   5483  HA  ALA A 329      13.153  -3.018 -23.430  1.00 47.39           H\nATOM   5484  HB1 ALA A 329      12.018  -1.482 -21.836  1.00 43.92           H\nATOM   5485  HB2 ALA A 329      12.694  -0.599 -23.196  1.00 43.92           H\nATOM   5486  HB3 ALA A 329      10.963  -0.907 -23.129  1.00 43.92           H\nATOM   5487  N   MET A 330       9.978  -3.824 -23.882  1.00 46.45           N\nATOM   5488  CA  MET A 330       8.986  -4.884 -23.656  1.00 48.43           C\nATOM   5489  C   MET A 330       9.438  -6.268 -24.161  1.00 49.64           C\nATOM   5490  O   MET A 330       9.015  -7.266 -23.578  1.00 50.50           O\nATOM   5491  CB  MET A 330       7.639  -4.497 -24.298  1.00 48.63           C\nATOM   5492  CG  MET A 330       6.937  -3.330 -23.592  1.00 51.22           C\nATOM   5493  SD  MET A 330       5.570  -2.597 -24.529  1.00 55.41           S\nATOM   5494  CE  MET A 330       4.367  -3.950 -24.451  1.00 56.02           C\nATOM   5495  H   MET A 330       9.763  -3.157 -24.612  1.00 46.45           H\nATOM   5496  HA  MET A 330       8.830  -4.976 -22.579  1.00 48.43           H\nATOM   5497  HB3 MET A 330       6.970  -5.358 -24.273  1.00 48.63           H\nATOM   5498  HB2 MET A 330       7.778  -4.259 -25.352  1.00 48.63           H\nATOM   5499  HG3 MET A 330       7.657  -2.541 -23.395  1.00 51.22           H\nATOM   5500  HG2 MET A 330       6.564  -3.648 -22.617  1.00 51.22           H\nATOM   5501  HE1 MET A 330       3.451  -3.662 -24.964  1.00 56.02           H\nATOM   5502  HE2 MET A 330       4.757  -4.846 -24.934  1.00 56.02           H\nATOM   5503  HE3 MET A 330       4.124  -4.189 -23.415  1.00 56.02           H\nATOM   5504  N   GLN A 331      10.290  -6.308 -25.202  1.00 49.38           N\nATOM   5505  CA  GLN A 331      10.880  -7.537 -25.753  1.00 48.68           C\nATOM   5506  C   GLN A 331      12.125  -8.027 -24.983  1.00 46.61           C\nATOM   5507  O   GLN A 331      12.644  -9.091 -25.320  1.00 44.51           O\nATOM   5508  CB  GLN A 331      11.225  -7.330 -27.250  1.00 49.53           C\nATOM   5509  CG  GLN A 331      10.043  -7.011 -28.192  1.00 53.82           C\nATOM   5510  CD  GLN A 331       8.836  -7.937 -28.034  1.00 57.74           C\nATOM   5511  OE1 GLN A 331       8.959  -9.152 -28.162  1.00 63.98           O\nATOM   5512  NE2 GLN A 331       7.660  -7.362 -27.770  1.00 65.89           N\nATOM   5513  H   GLN A 331      10.586  -5.443 -25.632  1.00 49.38           H\nATOM   5514  HA  GLN A 331      10.151  -8.344 -25.669  1.00 48.68           H\nATOM   5515  HB3 GLN A 331      11.711  -8.229 -27.631  1.00 49.53           H\nATOM   5516  HB2 GLN A 331      11.967  -6.536 -27.347  1.00 49.53           H\nATOM   5517  HG3 GLN A 331      10.381  -7.059 -29.228  1.00 53.82           H\nATOM   5518  HG2 GLN A 331       9.719  -5.987 -28.037  1.00 53.82           H\nATOM   5519 HE22 GLN A 331       6.833  -7.932 -27.663  1.00 65.89           H\nATOM   5520 HE21 GLN A 331       7.590  -6.359 -27.676  1.00 65.89           H\nATOM   5521  N   ASP A 332      12.582  -7.262 -23.975  1.00 45.92           N\nATOM   5522  CA  ASP A 332      13.758  -7.546 -23.149  1.00 45.71           C\nATOM   5523  C   ASP A 332      13.563  -8.858 -22.341  1.00 46.65           C\nATOM   5524  O   ASP A 332      12.483  -9.040 -21.773  1.00 46.85           O\nATOM   5525  CB  ASP A 332      14.010  -6.342 -22.207  1.00 45.86           C\nATOM   5526  CG  ASP A 332      15.413  -6.296 -21.596  1.00 45.05           C\nATOM   5527  OD1 ASP A 332      16.298  -5.698 -22.247  1.00 43.71           O\nATOM   5528  OD2 ASP A 332      15.628  -6.989 -20.580  1.00 46.92           O1-\nATOM   5529  H   ASP A 332      12.092  -6.407 -23.754  1.00 45.92           H\nATOM   5530  HA  ASP A 332      14.588  -7.628 -23.850  1.00 45.71           H\nATOM   5531  HB3 ASP A 332      13.265  -6.321 -21.409  1.00 45.86           H\nATOM   5532  HB2 ASP A 332      13.853  -5.414 -22.759  1.00 45.86           H\nATOM   5533  N   PRO A 333      14.589  -9.747 -22.295  1.00 45.62           N\nATOM   5534  CA  PRO A 333      14.503 -11.042 -21.581  1.00 46.71           C\nATOM   5535  C   PRO A 333      14.367 -10.981 -20.043  1.00 47.99           C\nATOM   5536  O   PRO A 333      14.182 -12.036 -19.436  1.00 49.03           O\nATOM   5537  CB  PRO A 333      15.773 -11.789 -22.020  1.00 47.14           C\nATOM   5538  CG  PRO A 333      16.768 -10.687 -22.332  1.00 46.47           C\nATOM   5539  CD  PRO A 333      15.889  -9.614 -22.960  1.00 46.04           C\nATOM   5540  HA  PRO A 333      13.632 -11.588 -21.947  1.00 46.71           H\nATOM   5541  HB3 PRO A 333      15.561 -12.359 -22.926  1.00 47.14           H\nATOM   5542  HB2 PRO A 333      16.156 -12.493 -21.280  1.00 47.14           H\nATOM   5543  HG3 PRO A 333      17.587 -11.008 -22.977  1.00 46.47           H\nATOM   5544  HG2 PRO A 333      17.198 -10.310 -21.403  1.00 46.47           H\nATOM   5545  HD2 PRO A 333      16.350  -8.635 -22.843  1.00 46.04           H\nATOM   5546  HD3 PRO A 333      15.756  -9.803 -24.026  1.00 46.04           H\nATOM   5547  N   TYR A 334      14.404  -9.776 -19.445  1.00 47.35           N\nATOM   5548  CA  TYR A 334      13.994  -9.498 -18.064  1.00 47.78           C\nATOM   5549  C   TYR A 334      12.524  -9.879 -17.792  1.00 48.93           C\nATOM   5550  O   TYR A 334      12.230 -10.396 -16.717  1.00 50.44           O\nATOM   5551  CB  TYR A 334      14.250  -8.002 -17.769  1.00 48.29           C\nATOM   5552  CG  TYR A 334      13.765  -7.468 -16.430  1.00 49.53           C\nATOM   5553  CD1 TYR A 334      14.322  -7.951 -15.229  1.00 55.46           C\nATOM   5554  CD2 TYR A 334      12.764  -6.474 -16.383  1.00 54.76           C\nATOM   5555  CE1 TYR A 334      13.888  -7.437 -13.992  1.00 53.39           C\nATOM   5556  CE2 TYR A 334      12.342  -5.948 -15.147  1.00 56.10           C\nATOM   5557  CZ  TYR A 334      12.904  -6.429 -13.950  1.00 56.50           C\nATOM   5558  OH  TYR A 334      12.484  -5.930 -12.752  1.00 53.45           O\nATOM   5559  H   TYR A 334      14.611  -8.958 -20.004  1.00 47.35           H\nATOM   5560  HA  TYR A 334      14.625 -10.097 -17.405  1.00 47.78           H\nATOM   5561  HB3 TYR A 334      13.773  -7.409 -18.550  1.00 48.29           H\nATOM   5562  HB2 TYR A 334      15.315  -7.787 -17.846  1.00 48.29           H\nATOM   5563  HD1 TYR A 334      15.083  -8.718 -15.252  1.00 55.46           H\nATOM   5564  HD2 TYR A 334      12.317  -6.106 -17.295  1.00 54.76           H\nATOM   5565  HE1 TYR A 334      14.307  -7.829 -13.077  1.00 53.39           H\nATOM   5566  HE2 TYR A 334      11.579  -5.185 -15.121  1.00 56.10           H\nATOM   5567  HH  TYR A 334      12.934  -6.324 -12.001  1.00 53.45           H\nATOM   5568  N   PHE A 335      11.643  -9.643 -18.779  1.00 48.67           N\nATOM   5569  CA  PHE A 335      10.218  -9.972 -18.710  1.00 48.60           C\nATOM   5570  C   PHE A 335       9.898 -11.445 -19.015  1.00 49.78           C\nATOM   5571  O   PHE A 335       8.808 -11.890 -18.662  1.00 50.13           O\nATOM   5572  CB  PHE A 335       9.424  -9.005 -19.609  1.00 49.20           C\nATOM   5573  CG  PHE A 335       9.496  -7.559 -19.150  1.00 47.56           C\nATOM   5574  CD1 PHE A 335       9.015  -7.206 -17.872  1.00 45.51           C\nATOM   5575  CD2 PHE A 335      10.077  -6.564 -19.966  1.00 48.18           C\nATOM   5576  CE1 PHE A 335       9.125  -5.897 -17.428  1.00 46.52           C\nATOM   5577  CE2 PHE A 335      10.144  -5.254 -19.507  1.00 48.95           C\nATOM   5578  CZ  PHE A 335       9.668  -4.924 -18.249  1.00 47.14           C\nATOM   5579  H   PHE A 335      11.960  -9.222 -19.642  1.00 48.67           H\nATOM   5580  HA  PHE A 335       9.884  -9.818 -17.684  1.00 48.60           H\nATOM   5581  HB3 PHE A 335       8.373  -9.294 -19.639  1.00 49.20           H\nATOM   5582  HB2 PHE A 335       9.785  -9.069 -20.636  1.00 49.20           H\nATOM   5583  HD1 PHE A 335       8.572  -7.953 -17.232  1.00 45.51           H\nATOM   5584  HD2 PHE A 335      10.462  -6.810 -20.945  1.00 48.18           H\nATOM   5585  HE1 PHE A 335       8.779  -5.629 -16.445  1.00 46.52           H\nATOM   5586  HE2 PHE A 335      10.570  -4.474 -20.116  1.00 48.95           H\nATOM   5587  HZ  PHE A 335       9.722  -3.905 -17.907  1.00 47.14           H\nATOM   5588  N   LEU A 336      10.849 -12.180 -19.617  1.00 50.12           N\nATOM   5589  CA  LEU A 336      10.766 -13.627 -19.840  1.00 52.19           C\nATOM   5590  C   LEU A 336      11.305 -14.431 -18.641  1.00 53.17           C\nATOM   5591  O   LEU A 336      10.947 -15.599 -18.499  1.00 54.12           O\nATOM   5592  CB  LEU A 336      11.549 -13.998 -21.119  1.00 51.38           C\nATOM   5593  CG  LEU A 336      11.021 -13.338 -22.412  1.00 53.03           C\nATOM   5594  CD1 LEU A 336      11.946 -13.637 -23.610  1.00 51.66           C\nATOM   5595  CD2 LEU A 336       9.548 -13.698 -22.705  1.00 48.01           C\nATOM   5596  H   LEU A 336      11.720 -11.740 -19.880  1.00 50.12           H\nATOM   5597  HA  LEU A 336       9.721 -13.914 -19.967  1.00 52.19           H\nATOM   5598  HB3 LEU A 336      11.536 -15.082 -21.253  1.00 51.38           H\nATOM   5599  HB2 LEU A 336      12.597 -13.729 -20.982  1.00 51.38           H\nATOM   5600  HG  LEU A 336      11.066 -12.259 -22.265  1.00 53.03           H\nATOM   5601 HD11 LEU A 336      12.243 -12.713 -24.107  1.00 51.66           H\nATOM   5602 HD12 LEU A 336      12.862 -14.144 -23.303  1.00 51.66           H\nATOM   5603 HD13 LEU A 336      11.472 -14.272 -24.359  1.00 51.66           H\nATOM   5604 HD21 LEU A 336       9.366 -13.894 -23.761  1.00 48.01           H\nATOM   5605 HD22 LEU A 336       9.226 -14.582 -22.155  1.00 48.01           H\nATOM   5606 HD23 LEU A 336       8.891 -12.877 -22.418  1.00 48.01           H\nATOM   5607  N   GLU A 337      12.144 -13.796 -17.805  1.00 52.87           N\nATOM   5608  CA  GLU A 337      12.712 -14.360 -16.584  1.00 53.06           C\nATOM   5609  C   GLU A 337      11.656 -14.452 -15.464  1.00 53.51           C\nATOM   5610  O   GLU A 337      10.759 -13.611 -15.399  1.00 52.97           O\nATOM   5611  CB  GLU A 337      13.927 -13.490 -16.193  1.00 53.27           C\nATOM   5612  CG  GLU A 337      14.718 -13.967 -14.958  1.00 52.66           C\nATOM   5613  CD  GLU A 337      15.955 -13.102 -14.700  1.00 57.38           C\nATOM   5614  OE1 GLU A 337      15.770 -11.914 -14.356  1.00 54.69           O\nATOM   5615  OE2 GLU A 337      17.075 -13.636 -14.855  1.00 56.94           O1-\nATOM   5616  H   GLU A 337      12.385 -12.834 -17.996  1.00 52.87           H\nATOM   5617  HA  GLU A 337      13.069 -15.367 -16.809  1.00 53.06           H\nATOM   5618  HB3 GLU A 337      13.592 -12.468 -16.024  1.00 53.27           H\nATOM   5619  HB2 GLU A 337      14.606 -13.438 -17.045  1.00 53.27           H\nATOM   5620  HG3 GLU A 337      15.007 -15.012 -15.084  1.00 52.66           H\nATOM   5621  HG2 GLU A 337      14.094 -13.928 -14.066  1.00 52.66           H\nATOM   5622  N   ASP A 338      11.803 -15.468 -14.600  1.00 54.61           N\nATOM   5623  CA  ASP A 338      10.971 -15.717 -13.419  1.00 56.90           C\nATOM   5624  C   ASP A 338      11.267 -14.661 -12.320  1.00 55.92           C\nATOM   5625  O   ASP A 338      12.447 -14.427 -12.048  1.00 54.87           O\nATOM   5626  CB  ASP A 338      11.252 -17.156 -12.912  1.00 58.48           C\nATOM   5627  CG  ASP A 338      10.430 -17.592 -11.688  1.00 61.77           C\nATOM   5628  OD1 ASP A 338       9.232 -17.892 -11.884  1.00 64.05           O\nATOM   5629  OD2 ASP A 338      10.967 -17.487 -10.563  1.00 69.82           O1-\nATOM   5630  H   ASP A 338      12.572 -16.110 -14.727  1.00 54.61           H\nATOM   5631  HA  ASP A 338       9.936 -15.668 -13.754  1.00 56.90           H\nATOM   5632  HB3 ASP A 338      12.316 -17.275 -12.700  1.00 58.48           H\nATOM   5633  HB2 ASP A 338      11.054 -17.860 -13.722  1.00 58.48           H\nATOM   5634  N   PRO A 339      10.236 -14.061 -11.677  1.00 55.96           N\nATOM   5635  CA  PRO A 339       8.788 -14.225 -11.927  1.00 56.43           C\nATOM   5636  C   PRO A 339       8.304 -13.407 -13.136  1.00 57.44           C\nATOM   5637  O   PRO A 339       8.778 -12.292 -13.332  1.00 58.57           O\nATOM   5638  CB  PRO A 339       8.161 -13.702 -10.624  1.00 56.47           C\nATOM   5639  CG  PRO A 339       9.116 -12.620 -10.145  1.00 55.76           C\nATOM   5640  CD  PRO A 339      10.479 -13.175 -10.534  1.00 55.64           C\nATOM   5641  HA  PRO A 339       8.512 -15.270 -12.059  1.00 56.43           H\nATOM   5642  HB3 PRO A 339       8.127 -14.511  -9.892  1.00 56.47           H\nATOM   5643  HB2 PRO A 339       7.142 -13.332 -10.744  1.00 56.47           H\nATOM   5644  HG3 PRO A 339       9.025 -12.393  -9.082  1.00 55.76           H\nATOM   5645  HG2 PRO A 339       8.932 -11.700 -10.700  1.00 55.76           H\nATOM   5646  HD2 PRO A 339      11.185 -12.375 -10.763  1.00 55.64           H\nATOM   5647  HD3 PRO A 339      10.892 -13.769  -9.716  1.00 55.64           H\nATOM   5648  N   LEU A 340       7.357 -13.957 -13.911  1.00 57.54           N\nATOM   5649  CA  LEU A 340       6.715 -13.271 -15.041  1.00 58.24           C\nATOM   5650  C   LEU A 340       5.823 -12.094 -14.568  1.00 57.55           C\nATOM   5651  O   LEU A 340       5.222 -12.205 -13.498  1.00 57.48           O\nATOM   5652  CB  LEU A 340       5.853 -14.300 -15.810  1.00 58.67           C\nATOM   5653  CG  LEU A 340       6.654 -15.425 -16.504  1.00 63.50           C\nATOM   5654  CD1 LEU A 340       5.709 -16.493 -17.095  1.00 62.94           C\nATOM   5655  CD2 LEU A 340       7.631 -14.876 -17.562  1.00 64.69           C\nATOM   5656  H   LEU A 340       7.005 -14.878 -13.692  1.00 57.54           H\nATOM   5657  HA  LEU A 340       7.517 -12.904 -15.681  1.00 58.24           H\nATOM   5658  HB3 LEU A 340       5.256 -13.785 -16.565  1.00 58.67           H\nATOM   5659  HB2 LEU A 340       5.133 -14.742 -15.118  1.00 58.67           H\nATOM   5660  HG  LEU A 340       7.252 -15.931 -15.745  1.00 63.50           H\nATOM   5661 HD11 LEU A 340       5.971 -17.486 -16.729  1.00 62.94           H\nATOM   5662 HD12 LEU A 340       4.668 -16.315 -16.823  1.00 62.94           H\nATOM   5663 HD13 LEU A 340       5.748 -16.527 -18.184  1.00 62.94           H\nATOM   5664 HD21 LEU A 340       7.766 -15.558 -18.402  1.00 64.69           H\nATOM   5665 HD22 LEU A 340       7.287 -13.926 -17.969  1.00 64.69           H\nATOM   5666 HD23 LEU A 340       8.616 -14.711 -17.125  1.00 64.69           H\nATOM   5667  N   PRO A 341       5.733 -10.997 -15.363  1.00 56.24           N\nATOM   5668  CA  PRO A 341       4.854  -9.853 -15.046  1.00 55.12           C\nATOM   5669  C   PRO A 341       3.354 -10.213 -15.117  1.00 55.14           C\nATOM   5670  O   PRO A 341       2.925 -10.859 -16.073  1.00 55.58           O\nATOM   5671  CB  PRO A 341       5.251  -8.789 -16.083  1.00 55.15           C\nATOM   5672  CG  PRO A 341       5.761  -9.580 -17.275  1.00 55.95           C\nATOM   5673  CD  PRO A 341       6.441 -10.783 -16.628  1.00 55.97           C\nATOM   5674  HA  PRO A 341       5.090  -9.486 -14.047  1.00 55.12           H\nATOM   5675  HB3 PRO A 341       6.057  -8.175 -15.679  1.00 55.15           H\nATOM   5676  HB2 PRO A 341       4.439  -8.112 -16.353  1.00 55.15           H\nATOM   5677  HG3 PRO A 341       6.420  -9.008 -17.928  1.00 55.95           H\nATOM   5678  HG2 PRO A 341       4.914  -9.919 -17.873  1.00 55.95           H\nATOM   5679  HD2 PRO A 341       6.403 -11.648 -17.291  1.00 55.97           H\nATOM   5680  HD3 PRO A 341       7.487 -10.558 -16.412  1.00 55.97           H\nATOM   5681  N   THR A 342       2.606  -9.802 -14.083  1.00 53.18           N\nATOM   5682  CA  THR A 342       1.188 -10.108 -13.880  1.00 53.37           C\nATOM   5683  C   THR A 342       0.331  -8.827 -13.987  1.00 53.75           C\nATOM   5684  O   THR A 342       0.801  -7.739 -13.653  1.00 53.55           O\nATOM   5685  CB  THR A 342       0.981 -10.724 -12.466  1.00 53.50           C\nATOM   5686  OG1 THR A 342       1.416  -9.859 -11.433  1.00 50.04           O\nATOM   5687  CG2 THR A 342       1.705 -12.065 -12.281  1.00 53.86           C\nATOM   5688  H   THR A 342       3.037  -9.259 -13.345  1.00 53.18           H\nATOM   5689  HA  THR A 342       0.839 -10.823 -14.629  1.00 53.37           H\nATOM   5690  HB  THR A 342      -0.085 -10.897 -12.309  1.00 53.50           H\nATOM   5691  HG1 THR A 342       0.796  -9.126 -11.360  1.00 50.04           H\nATOM   5692 HG21 THR A 342       1.478 -12.500 -11.307  1.00 53.86           H\nATOM   5693 HG22 THR A 342       1.401 -12.784 -13.042  1.00 53.86           H\nATOM   5694 HG23 THR A 342       2.787 -11.951 -12.344  1.00 53.86           H\nATOM   5695  N   SER A 343      -0.922  -8.997 -14.452  1.00 53.63           N\nATOM   5696  CA  SER A 343      -1.912  -7.932 -14.684  1.00 54.96           C\nATOM   5697  C   SER A 343      -2.300  -7.145 -13.416  1.00 53.85           C\nATOM   5698  O   SER A 343      -2.466  -5.927 -13.483  1.00 53.85           O\nATOM   5699  CB  SER A 343      -3.171  -8.548 -15.326  1.00 53.80           C\nATOM   5700  OG  SER A 343      -2.914  -8.915 -16.666  1.00 60.51           O\nATOM   5701  H   SER A 343      -1.219  -9.922 -14.724  1.00 53.63           H\nATOM   5702  HA  SER A 343      -1.476  -7.215 -15.383  1.00 54.96           H\nATOM   5703  HB3 SER A 343      -3.992  -7.829 -15.335  1.00 53.80           H\nATOM   5704  HB2 SER A 343      -3.517  -9.419 -14.767  1.00 53.80           H\nATOM   5705  HG  SER A 343      -3.696  -9.340 -17.027  1.00 60.51           H\nATOM   5706  N   ASP A 344      -2.394  -7.865 -12.288  1.00 54.11           N\nATOM   5707  CA  ASP A 344      -2.515  -7.331 -10.937  1.00 53.72           C\nATOM   5708  C   ASP A 344      -1.088  -7.268 -10.380  1.00 53.55           C\nATOM   5709  O   ASP A 344      -0.514  -8.324 -10.122  1.00 52.96           O\nATOM   5710  CB  ASP A 344      -3.462  -8.245 -10.105  1.00 53.82           C\nATOM   5711  CG  ASP A 344      -3.674  -7.947  -8.607  1.00 53.52           C\nATOM   5712  OD1 ASP A 344      -3.215  -6.900  -8.105  1.00 53.87           O\nATOM   5713  OD2 ASP A 344      -4.363  -8.776  -7.975  1.00 59.82           O1-\nATOM   5714  H   ASP A 344      -2.247  -8.863 -12.340  1.00 54.11           H\nATOM   5715  HA  ASP A 344      -2.929  -6.322 -10.968  1.00 53.72           H\nATOM   5716  HB3 ASP A 344      -3.132  -9.281 -10.199  1.00 53.82           H\nATOM   5717  HB2 ASP A 344      -4.445  -8.227 -10.578  1.00 53.82           H\nATOM   5718  N   VAL A 345      -0.534  -6.053 -10.214  1.00 53.09           N\nATOM   5719  CA  VAL A 345       0.832  -5.849  -9.709  1.00 53.87           C\nATOM   5720  C   VAL A 345       1.023  -6.307  -8.245  1.00 55.86           C\nATOM   5721  O   VAL A 345       2.138  -6.678  -7.887  1.00 55.43           O\nATOM   5722  CB  VAL A 345       1.301  -4.370  -9.832  1.00 54.02           C\nATOM   5723  CG1 VAL A 345       1.249  -3.875 -11.289  1.00 50.95           C\nATOM   5724  CG2 VAL A 345       0.630  -3.380  -8.855  1.00 51.31           C\nATOM   5725  H   VAL A 345      -1.055  -5.220 -10.455  1.00 53.09           H\nATOM   5726  HA  VAL A 345       1.495  -6.462 -10.322  1.00 53.87           H\nATOM   5727  HB  VAL A 345       2.362  -4.354  -9.577  1.00 54.02           H\nATOM   5728 HG11 VAL A 345       1.563  -2.838 -11.380  1.00 50.95           H\nATOM   5729 HG12 VAL A 345       1.907  -4.458 -11.924  1.00 50.95           H\nATOM   5730 HG13 VAL A 345       0.254  -3.950 -11.720  1.00 50.95           H\nATOM   5731 HG21 VAL A 345       0.880  -2.348  -9.100  1.00 51.31           H\nATOM   5732 HG22 VAL A 345      -0.455  -3.469  -8.867  1.00 51.31           H\nATOM   5733 HG23 VAL A 345       0.956  -3.545  -7.829  1.00 51.31           H\nATOM   5734  N   PHE A 346      -0.066  -6.335  -7.455  1.00 58.67           N\nATOM   5735  CA  PHE A 346      -0.093  -6.861  -6.088  1.00 60.61           C\nATOM   5736  C   PHE A 346      -0.221  -8.403  -6.054  1.00 63.75           C\nATOM   5737  O   PHE A 346      -0.080  -8.976  -4.977  1.00 64.82           O\nATOM   5738  CB  PHE A 346      -1.259  -6.212  -5.309  1.00 60.39           C\nATOM   5739  CG  PHE A 346      -1.369  -4.696  -5.393  1.00 59.24           C\nATOM   5740  CD1 PHE A 346      -0.282  -3.866  -5.044  1.00 59.29           C\nATOM   5741  CD2 PHE A 346      -2.592  -4.098  -5.770  1.00 59.65           C\nATOM   5742  CE1 PHE A 346      -0.419  -2.484  -5.098  1.00 56.31           C\nATOM   5743  CE2 PHE A 346      -2.710  -2.715  -5.801  1.00 57.82           C\nATOM   5744  CZ  PHE A 346      -1.629  -1.912  -5.467  1.00 55.73           C\nATOM   5745  H   PHE A 346      -0.959  -6.041  -7.829  1.00 58.67           H\nATOM   5746  HA  PHE A 346       0.843  -6.596  -5.592  1.00 60.61           H\nATOM   5747  HB3 PHE A 346      -1.189  -6.480  -4.254  1.00 60.39           H\nATOM   5748  HB2 PHE A 346      -2.198  -6.639  -5.653  1.00 60.39           H\nATOM   5749  HD1 PHE A 346       0.659  -4.301  -4.740  1.00 59.29           H\nATOM   5750  HD2 PHE A 346      -3.444  -4.710  -6.029  1.00 59.65           H\nATOM   5751  HE1 PHE A 346       0.413  -1.846  -4.846  1.00 56.31           H\nATOM   5752  HE2 PHE A 346      -3.650  -2.262  -6.082  1.00 57.82           H\nATOM   5753  HZ  PHE A 346      -1.731  -0.836  -5.493  1.00 55.73           H\nATOM   5754  N   ALA A 347      -0.476  -9.047  -7.210  1.00 67.14           N\nATOM   5755  CA  ALA A 347      -0.483 -10.497  -7.452  1.00 69.64           C\nATOM   5756  C   ALA A 347      -1.408 -11.313  -6.525  1.00 71.99           C\nATOM   5757  O   ALA A 347      -1.027 -12.394  -6.074  1.00 73.10           O\nATOM   5758  CB  ALA A 347       0.963 -11.030  -7.454  1.00 69.85           C\nATOM   5759  H   ALA A 347      -0.599  -8.487  -8.044  1.00 67.14           H\nATOM   5760  HA  ALA A 347      -0.881 -10.627  -8.459  1.00 69.64           H\nATOM   5761  HB1 ALA A 347       1.002 -12.076  -7.759  1.00 69.85           H\nATOM   5762  HB2 ALA A 347       1.577 -10.471  -8.157  1.00 69.85           H\nATOM   5763  HB3 ALA A 347       1.426 -10.952  -6.470  1.00 69.85           H\nATOM   5764  N   GLY A 348      -2.605 -10.773  -6.244  1.00 74.39           N\nATOM   5765  CA  GLY A 348      -3.617 -11.390  -5.384  1.00 75.29           C\nATOM   5766  C   GLY A 348      -3.330 -11.229  -3.878  1.00 76.25           C\nATOM   5767  O   GLY A 348      -4.192 -11.584  -3.076  1.00 76.54           O\nATOM   5768  H   GLY A 348      -2.859  -9.894  -6.678  1.00 74.39           H\nATOM   5769  HA3 GLY A 348      -3.714 -12.451  -5.619  1.00 75.29           H\nATOM   5770  HA2 GLY A 348      -4.581 -10.932  -5.608  1.00 75.29           H\nATOM   5771  N   CYS A 349      -2.161 -10.689  -3.486  1.00 77.34           N\nATOM   5772  CA  CYS A 349      -1.788 -10.413  -2.095  1.00 78.52           C\nATOM   5773  C   CYS A 349      -2.486  -9.131  -1.616  1.00 79.39           C\nATOM   5774  O   CYS A 349      -2.650  -8.203  -2.410  1.00 80.21           O\nATOM   5775  CB  CYS A 349      -0.265 -10.244  -1.925  1.00 78.11           C\nATOM   5776  SG  CYS A 349       0.622 -11.737  -2.451  1.00 78.54           S\nATOM   5777  H   CYS A 349      -1.492 -10.399  -4.186  1.00 77.34           H\nATOM   5778  HA  CYS A 349      -2.114 -11.249  -1.472  1.00 78.52           H\nATOM   5779  HB3 CYS A 349      -0.017 -10.055  -0.880  1.00 78.11           H\nATOM   5780  HB2 CYS A 349       0.106  -9.389  -2.488  1.00 78.11           H\nATOM   5781  HG  CYS A 349       0.315 -11.637  -3.747  1.00 78.54           H\nATOM   5782  N   GLN A 350      -2.857  -9.096  -0.323  1.00 79.36           N\nATOM   5783  CA  GLN A 350      -3.506  -7.956   0.333  1.00 78.81           C\nATOM   5784  C   GLN A 350      -2.664  -6.670   0.246  1.00 78.03           C\nATOM   5785  O   GLN A 350      -1.452  -6.726   0.449  1.00 78.09           O\nATOM   5786  CB  GLN A 350      -3.842  -8.329   1.793  1.00 79.05           C\nATOM   5787  CG  GLN A 350      -4.593  -7.224   2.570  0.00 78.83           C\nATOM   5788  CD  GLN A 350      -5.057  -7.677   3.955  0.00 78.88           C\nATOM   5789  OE1 GLN A 350      -4.374  -8.443   4.632  0.00 78.85           O\nATOM   5790  NE2 GLN A 350      -6.210  -7.175   4.401  0.00 78.86           N\nATOM   5791  H   GLN A 350      -2.676  -9.897   0.265  1.00 79.36           H\nATOM   5792  HA  GLN A 350      -4.449  -7.786  -0.188  1.00 78.81           H\nATOM   5793  HB3 GLN A 350      -2.925  -8.592   2.323  1.00 79.05           H\nATOM   5794  HB2 GLN A 350      -4.456  -9.231   1.786  1.00 79.05           H\nATOM   5795  HG3 GLN A 350      -5.460  -6.898   1.992  1.00 78.83           H\nATOM   5796  HG2 GLN A 350      -3.959  -6.347   2.706  1.00 78.83           H\nATOM   5797 HE22 GLN A 350      -6.551  -7.435   5.315  1.00 78.86           H\nATOM   5798 HE21 GLN A 350      -6.748  -6.538   3.832  1.00 78.86           H\nATOM   5799  N   ILE A 351      -3.340  -5.554  -0.063  1.00 77.08           N\nATOM   5800  CA  ILE A 351      -2.765  -4.222  -0.248  1.00 76.17           C\nATOM   5801  C   ILE A 351      -2.433  -3.581   1.125  1.00 75.90           C\nATOM   5802  O   ILE A 351      -3.368  -3.302   1.878  1.00 75.52           O\nATOM   5803  CB  ILE A 351      -3.804  -3.336  -1.007  1.00 75.65           C\nATOM   5804  CG1 ILE A 351      -3.964  -3.824  -2.467  1.00 75.09           C\nATOM   5805  CG2 ILE A 351      -3.510  -1.820  -1.000  1.00 75.18           C\nATOM   5806  CD1 ILE A 351      -5.191  -3.258  -3.201  1.00 72.34           C\nATOM   5807  H   ILE A 351      -4.340  -5.609  -0.193  1.00 77.08           H\nATOM   5808  HA  ILE A 351      -1.883  -4.318  -0.879  1.00 76.17           H\nATOM   5809  HB  ILE A 351      -4.769  -3.469  -0.514  1.00 75.65           H\nATOM   5810 HG13 ILE A 351      -4.024  -4.911  -2.505  1.00 75.09           H\nATOM   5811 HG12 ILE A 351      -3.063  -3.568  -3.023  1.00 75.09           H\nATOM   5812 HG21 ILE A 351      -4.287  -1.284  -1.538  1.00 75.18           H\nATOM   5813 HG22 ILE A 351      -3.490  -1.387  -0.001  1.00 75.18           H\nATOM   5814 HG23 ILE A 351      -2.563  -1.598  -1.483  1.00 75.18           H\nATOM   5815 HD11 ILE A 351      -5.550  -3.958  -3.956  1.00 72.34           H\nATOM   5816 HD12 ILE A 351      -6.018  -3.063  -2.517  1.00 72.34           H\nATOM   5817 HD13 ILE A 351      -4.949  -2.324  -3.708  1.00 72.34           H\nATOM   5818  N   PRO A 352      -1.132  -3.364   1.445  1.00 75.36           N\nATOM   5819  CA  PRO A 352      -0.738  -2.698   2.702  1.00 75.16           C\nATOM   5820  C   PRO A 352      -0.820  -1.157   2.655  1.00 74.65           C\nATOM   5821  O   PRO A 352      -0.827  -0.530   3.714  1.00 73.77           O\nATOM   5822  CB  PRO A 352       0.715  -3.163   2.885  1.00 75.54           C\nATOM   5823  CG  PRO A 352       1.255  -3.250   1.465  1.00 75.89           C\nATOM   5824  CD  PRO A 352       0.052  -3.748   0.666  1.00 75.20           C\nATOM   5825  HA  PRO A 352      -1.341  -3.049   3.542  1.00 75.16           H\nATOM   5826  HB3 PRO A 352       0.723  -4.153   3.343  1.00 75.54           H\nATOM   5827  HB2 PRO A 352       1.312  -2.506   3.517  1.00 75.54           H\nATOM   5828  HG3 PRO A 352       2.131  -3.892   1.371  1.00 75.89           H\nATOM   5829  HG2 PRO A 352       1.538  -2.254   1.121  1.00 75.89           H\nATOM   5830  HD2 PRO A 352       0.048  -3.330  -0.340  1.00 75.20           H\nATOM   5831  HD3 PRO A 352       0.104  -4.830   0.585  1.00 75.20           H\nATOM   5832  N   TYR A 353      -0.839  -0.588   1.437  1.00 74.47           N\nATOM   5833  CA  TYR A 353      -0.744   0.842   1.146  1.00 73.26           C\nATOM   5834  C   TYR A 353      -2.030   1.583   1.575  1.00 73.64           C\nATOM   5835  O   TYR A 353      -3.097   1.226   1.071  1.00 73.38           O\nATOM   5836  CB  TYR A 353      -0.507   1.003  -0.373  1.00 71.92           C\nATOM   5837  CG  TYR A 353       0.674   0.206  -0.901  1.00 67.75           C\nATOM   5838  CD1 TYR A 353       1.990   0.525  -0.501  1.00 63.15           C\nATOM   5839  CD2 TYR A 353       0.455  -0.892  -1.759  1.00 63.04           C\nATOM   5840  CE1 TYR A 353       3.072  -0.267  -0.934  1.00 59.49           C\nATOM   5841  CE2 TYR A 353       1.533  -1.691  -2.176  1.00 63.24           C\nATOM   5842  CZ  TYR A 353       2.840  -1.383  -1.762  1.00 59.29           C\nATOM   5843  OH  TYR A 353       3.875  -2.171  -2.172  1.00 60.84           O\nATOM   5844  H   TYR A 353      -0.830  -1.190   0.627  1.00 74.47           H\nATOM   5845  HA  TYR A 353       0.147   1.215   1.647  1.00 73.26           H\nATOM   5846  HB3 TYR A 353      -0.350   2.055  -0.615  1.00 71.92           H\nATOM   5847  HB2 TYR A 353      -1.397   0.697  -0.925  1.00 71.92           H\nATOM   5848  HD1 TYR A 353       2.170   1.367   0.150  1.00 63.15           H\nATOM   5849  HD2 TYR A 353      -0.540  -1.144  -2.088  1.00 63.04           H\nATOM   5850  HE1 TYR A 353       4.076  -0.020  -0.620  1.00 59.49           H\nATOM   5851  HE2 TYR A 353       1.353  -2.548  -2.807  1.00 63.24           H\nATOM   5852  HH  TYR A 353       3.593  -2.898  -2.733  1.00 60.84           H\nATOM   5853  N   PRO A 354      -1.922   2.584   2.485  1.00 75.17           N\nATOM   5854  CA  PRO A 354      -3.056   3.441   2.893  1.00 75.97           C\nATOM   5855  C   PRO A 354      -3.828   4.109   1.742  1.00 76.89           C\nATOM   5856  O   PRO A 354      -3.224   4.542   0.759  1.00 77.79           O\nATOM   5857  CB  PRO A 354      -2.407   4.506   3.794  1.00 76.37           C\nATOM   5858  CG  PRO A 354      -1.184   3.824   4.372  1.00 76.88           C\nATOM   5859  CD  PRO A 354      -0.707   2.955   3.218  1.00 76.15           C\nATOM   5860  HA  PRO A 354      -3.729   2.819   3.487  1.00 75.97           H\nATOM   5861  HB3 PRO A 354      -3.083   4.867   4.570  1.00 76.37           H\nATOM   5862  HB2 PRO A 354      -2.089   5.372   3.209  1.00 76.37           H\nATOM   5863  HG3 PRO A 354      -1.485   3.188   5.205  1.00 76.88           H\nATOM   5864  HG2 PRO A 354      -0.426   4.519   4.734  1.00 76.88           H\nATOM   5865  HD2 PRO A 354      -0.051   3.519   2.553  1.00 76.15           H\nATOM   5866  HD3 PRO A 354      -0.159   2.098   3.607  1.00 76.15           H\nATOM   5867  N   LYS A 355      -5.155   4.194   1.921  1.00 77.26           N\nATOM   5868  CA  LYS A 355      -6.072   4.971   1.086  1.00 78.20           C\nATOM   5869  C   LYS A 355      -5.792   6.477   1.240  1.00 78.69           C\nATOM   5870  O   LYS A 355      -5.499   6.918   2.354  1.00 78.80           O\nATOM   5871  CB  LYS A 355      -7.519   4.648   1.516  1.00 78.63           C\nATOM   5872  CG  LYS A 355      -7.896   3.166   1.341  1.00 80.41           C\nATOM   5873  CD  LYS A 355      -9.367   2.886   1.680  1.00 83.09           C\nATOM   5874  CE  LYS A 355      -9.739   1.410   1.466  1.00 84.24           C\nATOM   5875  NZ  LYS A 355     -11.149   1.148   1.802  1.00 85.81           N1+\nATOM   5876  H   LYS A 355      -5.559   3.808   2.762  1.00 77.26           H\nATOM   5877  HA  LYS A 355      -5.928   4.683   0.043  1.00 78.20           H\nATOM   5878  HB3 LYS A 355      -8.210   5.259   0.933  1.00 78.63           H\nATOM   5879  HB2 LYS A 355      -7.670   4.937   2.557  1.00 78.63           H\nATOM   5880  HG3 LYS A 355      -7.264   2.545   1.977  1.00 80.41           H\nATOM   5881  HG2 LYS A 355      -7.690   2.854   0.318  1.00 80.41           H\nATOM   5882  HD3 LYS A 355     -10.004   3.523   1.065  1.00 83.09           H\nATOM   5883  HD2 LYS A 355      -9.554   3.171   2.716  1.00 83.09           H\nATOM   5884  HE3 LYS A 355      -9.108   0.768   2.083  1.00 84.24           H\nATOM   5885  HE2 LYS A 355      -9.569   1.126   0.427  1.00 84.24           H\nATOM   5886  HZ1 LYS A 355     -11.744   1.709   1.209  1.00 85.81           H\nATOM   5887  HZ2 LYS A 355     -11.355   0.170   1.654  1.00 85.81           H\nATOM   5888  HZ3 LYS A 355     -11.317   1.385   2.769  1.00 85.81           H\nATOM   5889  N   ARG A 356      -5.887   7.237   0.135  1.00 79.46           N\nATOM   5890  CA  ARG A 356      -5.625   8.682   0.132  1.00 79.85           C\nATOM   5891  C   ARG A 356      -6.674   9.460   0.948  1.00 80.84           C\nATOM   5892  O   ARG A 356      -7.870   9.179   0.843  1.00 80.93           O\nATOM   5893  CB  ARG A 356      -5.479   9.204  -1.317  1.00 79.49           C\nATOM   5894  CG  ARG A 356      -6.781   9.266  -2.140  1.00 75.25           C\nATOM   5895  CD  ARG A 356      -6.630   9.807  -3.573  1.00 73.06           C\nATOM   5896  NE  ARG A 356      -5.933   8.866  -4.467  1.00 66.63           N\nATOM   5897  CZ  ARG A 356      -4.623   8.816  -4.769  1.00 61.33           C\nATOM   5898  NH1 ARG A 356      -3.719   9.677  -4.278  1.00 59.08           N\nATOM   5899  NH2 ARG A 356      -4.201   7.862  -5.599  1.00 58.22           N1+\nATOM   5900  H   ARG A 356      -6.160   6.820  -0.745  1.00 79.46           H\nATOM   5901  HA  ARG A 356      -4.653   8.818   0.612  1.00 79.85           H\nATOM   5902  HB3 ARG A 356      -4.743   8.585  -1.832  1.00 79.49           H\nATOM   5903  HB2 ARG A 356      -5.051  10.206  -1.279  1.00 79.49           H\nATOM   5904  HG3 ARG A 356      -7.572   9.827  -1.644  1.00 75.25           H\nATOM   5905  HG2 ARG A 356      -7.136   8.238  -2.191  1.00 75.25           H\nATOM   5906  HD3 ARG A 356      -6.041  10.723  -3.541  1.00 73.06           H\nATOM   5907  HD2 ARG A 356      -7.594  10.104  -3.986  1.00 73.06           H\nATOM   5908  HE  ARG A 356      -6.523   8.148  -4.865  1.00 66.63           H\nATOM   5909 HH12 ARG A 356      -2.747   9.590  -4.552  1.00 59.08           H\nATOM   5910 HH11 ARG A 356      -4.000  10.412  -3.646  1.00 59.08           H\nATOM   5911 HH22 ARG A 356      -3.220   7.814  -5.849  1.00 58.22           H\nATOM   5912 HH21 ARG A 356      -4.854   7.206  -6.008  1.00 58.22           H\nATOM   5913  N   GLU A 357      -6.187  10.418   1.748  1.00 82.63           N\nATOM   5914  CA  GLU A 357      -7.003  11.262   2.618  1.00 84.35           C\nATOM   5915  C   GLU A 357      -7.596  12.469   1.879  1.00 84.23           C\nATOM   5916  O   GLU A 357      -7.083  12.885   0.838  1.00 83.84           O\nATOM   5917  CB  GLU A 357      -6.152  11.720   3.825  1.00 85.36           C\nATOM   5918  CG  GLU A 357      -5.809  10.594   4.830  1.00 88.43           C\nATOM   5919  CD  GLU A 357      -6.966  10.098   5.722  1.00 92.13           C\nATOM   5920  OE1 GLU A 357      -8.093  10.638   5.629  1.00 92.58           O\nATOM   5921  OE2 GLU A 357      -6.691   9.169   6.512  1.00 94.76           O1-\nATOM   5922  H   GLU A 357      -5.192  10.585   1.779  1.00 82.63           H\nATOM   5923  HA  GLU A 357      -7.844  10.668   2.978  1.00 84.35           H\nATOM   5924  HB3 GLU A 357      -6.634  12.547   4.350  1.00 85.36           H\nATOM   5925  HB2 GLU A 357      -5.214  12.136   3.454  1.00 85.36           H\nATOM   5926  HG3 GLU A 357      -5.021  10.954   5.493  1.00 88.43           H\nATOM   5927  HG2 GLU A 357      -5.386   9.740   4.300  1.00 88.43           H\nATOM   5928  N   PHE A 358      -8.675  13.008   2.466  1.00 84.88           N\nATOM   5929  CA  PHE A 358      -9.390  14.178   1.967  1.00 85.38           C\nATOM   5930  C   PHE A 358      -8.719  15.490   2.408  1.00 86.26           C\nATOM   5931  O   PHE A 358      -8.087  15.545   3.464  1.00 86.46           O\nATOM   5932  CB  PHE A 358     -10.849  14.135   2.457  1.00 85.52           C\nATOM   5933  CG  PHE A 358     -11.630  12.912   2.011  1.00 85.14           C\nATOM   5934  CD1 PHE A 358     -12.024  12.776   0.665  1.00 81.18           C\nATOM   5935  CD2 PHE A 358     -11.861  11.846   2.906  1.00 85.13           C\nATOM   5936  CE1 PHE A 358     -12.708  11.640   0.257  1.00 81.94           C\nATOM   5937  CE2 PHE A 358     -12.537  10.712   2.474  1.00 85.75           C\nATOM   5938  CZ  PHE A 358     -12.969  10.615   1.157  1.00 84.23           C\nATOM   5939  H   PHE A 358      -9.020  12.608   3.327  1.00 84.88           H\nATOM   5940  HA  PHE A 358      -9.391  14.134   0.877  1.00 85.38           H\nATOM   5941  HB3 PHE A 358     -11.380  15.014   2.084  1.00 85.52           H\nATOM   5942  HB2 PHE A 358     -10.886  14.204   3.546  1.00 85.52           H\nATOM   5943  HD1 PHE A 358     -11.802  13.557  -0.046  1.00 81.18           H\nATOM   5944  HD2 PHE A 358     -11.523  11.909   3.930  1.00 85.13           H\nATOM   5945  HE1 PHE A 358     -13.037  11.552  -0.765  1.00 81.94           H\nATOM   5946  HE2 PHE A 358     -12.727   9.904   3.165  1.00 85.75           H\nATOM   5947  HZ  PHE A 358     -13.501   9.734   0.833  1.00 84.23           H\nATOM   5948  N   LEU A 359      -8.909  16.524   1.579  1.00 86.95           N\nATOM   5949  CA  LEU A 359      -8.442  17.893   1.773  1.00 87.03           C\nATOM   5950  C   LEU A 359      -9.655  18.763   2.138  1.00 87.73           C\nATOM   5951  O   LEU A 359     -10.701  18.651   1.495  1.00 87.80           O\nATOM   5952  CB  LEU A 359      -7.794  18.407   0.461  1.00 86.85           C\nATOM   5953  CG  LEU A 359      -6.341  17.943   0.197  1.00 86.01           C\nATOM   5954  CD1 LEU A 359      -6.186  16.415   0.048  1.00 84.28           C\nATOM   5955  CD2 LEU A 359      -5.746  18.687  -1.019  1.00 84.51           C\nATOM   5956  H   LEU A 359      -9.439  16.370   0.730  1.00 86.95           H\nATOM   5957  HA  LEU A 359      -7.708  17.942   2.580  1.00 87.03           H\nATOM   5958  HB3 LEU A 359      -7.777  19.498   0.500  1.00 86.85           H\nATOM   5959  HB2 LEU A 359      -8.424  18.159  -0.395  1.00 86.85           H\nATOM   5960  HG  LEU A 359      -5.749  18.240   1.065  1.00 86.01           H\nATOM   5961 HD11 LEU A 359      -5.429  16.139  -0.687  1.00 84.28           H\nATOM   5962 HD12 LEU A 359      -5.889  15.961   0.993  1.00 84.28           H\nATOM   5963 HD13 LEU A 359      -7.116  15.944  -0.264  1.00 84.28           H\nATOM   5964 HD21 LEU A 359      -4.797  19.157  -0.760  1.00 84.51           H\nATOM   5965 HD22 LEU A 359      -5.561  18.025  -1.866  1.00 84.51           H\nATOM   5966 HD23 LEU A 359      -6.405  19.476  -1.384  1.00 84.51           H\nHETATM 5967  N   NME A 360      -9.469  19.632   3.144  1.00  0.00           N\nHETATM 5968  C   NME A 360     -10.490  20.548   3.639  1.00  0.00           C\nHETATM 5969  H   NME A 360      -8.573  19.659   3.609  1.00  0.00           H\nHETATM 5970  H1  NME A 360     -11.453  20.433   3.138  1.00  0.00           H\nHETATM 5971  H2  NME A 360     -10.647  20.380   4.705  1.00  0.00           H\nHETATM 5972  H3  NME A 360     -10.160  21.578   3.505  1.00  0.00           H\nTER    5973      NME A 360\nHETATM 5974  CH3 ACE B  -2       2.190  16.434 -34.527  1.00  0.00           C\nHETATM 5975  C   ACE B  -2       1.940  14.947 -34.755  1.00  0.00           C\nHETATM 5976  O   ACE B  -2       2.432  14.119 -33.992  1.00  0.00           O\nHETATM 5977  H1  ACE B  -2       2.919  16.585 -33.730  1.00  0.00           H\nHETATM 5978  H2  ACE B  -2       2.574  16.902 -35.433  1.00  0.00           H\nHETATM 5979  H3  ACE B  -2       1.264  16.935 -34.243  1.00  0.00           H\nATOM   5980  N   LYS B  -1       1.165  14.632 -35.809  1.00 63.18           N\nATOM   5981  CA  LYS B  -1       0.772  13.282 -36.254  1.00 62.35           C\nATOM   5982  C   LYS B  -1      -0.143  12.525 -35.263  1.00 59.65           C\nATOM   5983  O   LYS B  -1      -0.249  11.302 -35.357  1.00 57.65           O\nATOM   5984  CB  LYS B  -1       2.006  12.439 -36.670  1.00 63.51           C\nATOM   5985  CG  LYS B  -1       2.849  13.071 -37.790  1.00 67.85           C\nATOM   5986  CD  LYS B  -1       4.042  12.189 -38.187  0.00 67.10           C\nATOM   5987  CE  LYS B  -1       4.921  12.847 -39.263  0.00 67.32           C\nATOM   5988  NZ  LYS B  -1       6.060  11.990 -39.638  0.00 67.29           N1+\nATOM   5989  H   LYS B  -1       0.805  15.387 -36.372  1.00 63.18           H\nATOM   5990  HA  LYS B  -1       0.165  13.433 -37.147  1.00 62.35           H\nATOM   5991  HB3 LYS B  -1       1.680  11.456 -37.013  1.00 63.51           H\nATOM   5992  HB2 LYS B  -1       2.642  12.251 -35.805  1.00 63.51           H\nATOM   5993  HG3 LYS B  -1       3.220  14.045 -37.469  1.00 67.85           H\nATOM   5994  HG2 LYS B  -1       2.221  13.252 -38.662  1.00 67.85           H\nATOM   5995  HD3 LYS B  -1       3.671  11.228 -38.546  1.00 67.10           H\nATOM   5996  HD2 LYS B  -1       4.639  11.974 -37.299  1.00 67.10           H\nATOM   5997  HE3 LYS B  -1       5.307  13.801 -38.903  1.00 67.32           H\nATOM   5998  HE2 LYS B  -1       4.332  13.055 -40.157  1.00 67.32           H\nATOM   5999  HZ1 LYS B  -1       5.719  11.113 -40.006  1.00 67.29           H\nATOM   6000  HZ2 LYS B  -1       6.616  12.455 -40.341  1.00 67.29           H\nATOM   6001  HZ3 LYS B  -1       6.631  11.812 -38.824  1.00 67.29           H\nATOM   6002  N   ALA B   0      -0.790  13.259 -34.339  1.00 59.92           N\nATOM   6003  CA  ALA B   0      -1.637  12.739 -33.267  1.00 58.54           C\nATOM   6004  C   ALA B   0      -2.833  11.915 -33.776  1.00 58.46           C\nATOM   6005  O   ALA B   0      -3.662  12.437 -34.521  1.00 59.56           O\nATOM   6006  CB  ALA B   0      -2.107  13.914 -32.400  1.00 57.77           C\nATOM   6007  H   ALA B   0      -0.650  14.258 -34.335  1.00 59.92           H\nATOM   6008  HA  ALA B   0      -1.008  12.104 -32.641  1.00 58.54           H\nATOM   6009  HB1 ALA B   0      -2.797  13.576 -31.630  1.00 57.77           H\nATOM   6010  HB2 ALA B   0      -1.265  14.394 -31.900  1.00 57.77           H\nATOM   6011  HB3 ALA B   0      -2.621  14.672 -32.993  1.00 57.77           H\nATOM   6012  N   MET B   1      -2.877  10.640 -33.351  1.00 56.81           N\nATOM   6013  CA  MET B   1      -3.885   9.619 -33.663  1.00 54.96           C\nATOM   6014  C   MET B   1      -3.930   9.179 -35.145  1.00 56.12           C\nATOM   6015  O   MET B   1      -4.917   8.563 -35.541  1.00 55.49           O\nATOM   6016  CB  MET B   1      -5.292  10.023 -33.140  1.00 54.14           C\nATOM   6017  CG  MET B   1      -5.364  10.544 -31.691  1.00 51.89           C\nATOM   6018  SD  MET B   1      -4.582   9.532 -30.400  1.00 52.67           S\nATOM   6019  CE  MET B   1      -5.412   7.939 -30.645  1.00 49.92           C\nATOM   6020  H   MET B   1      -2.120  10.315 -32.761  1.00 56.81           H\nATOM   6021  HA  MET B   1      -3.570   8.732 -33.113  1.00 54.96           H\nATOM   6022  HB3 MET B   1      -5.972   9.177 -33.232  1.00 54.14           H\nATOM   6023  HB2 MET B   1      -5.710  10.791 -33.793  1.00 54.14           H\nATOM   6024  HG3 MET B   1      -6.411  10.675 -31.418  1.00 51.89           H\nATOM   6025  HG2 MET B   1      -4.923  11.539 -31.638  1.00 51.89           H\nATOM   6026  HE1 MET B   1      -5.026   7.198 -29.947  1.00 49.92           H\nATOM   6027  HE2 MET B   1      -6.483   8.029 -30.482  1.00 49.92           H\nATOM   6028  HE3 MET B   1      -5.242   7.566 -31.653  1.00 49.92           H\nATOM   6029  N   ALA B   2      -2.887   9.482 -35.941  1.00 57.98           N\nATOM   6030  CA  ALA B   2      -2.853   9.322 -37.403  1.00 59.63           C\nATOM   6031  C   ALA B   2      -3.144   7.915 -37.965  1.00 59.68           C\nATOM   6032  O   ALA B   2      -3.626   7.829 -39.094  1.00 63.45           O\nATOM   6033  CB  ALA B   2      -1.501   9.826 -37.931  1.00 60.03           C\nATOM   6034  H   ALA B   2      -2.097   9.969 -35.538  1.00 57.98           H\nATOM   6035  HA  ALA B   2      -3.628   9.979 -37.801  1.00 59.63           H\nATOM   6036  HB1 ALA B   2      -1.427   9.719 -39.014  1.00 60.03           H\nATOM   6037  HB2 ALA B   2      -1.364  10.882 -37.703  1.00 60.03           H\nATOM   6038  HB3 ALA B   2      -0.669   9.278 -37.485  1.00 60.03           H\nATOM   6039  N   GLY B   3      -2.858   6.856 -37.188  1.00 59.20           N\nATOM   6040  CA  GLY B   3      -3.056   5.459 -37.586  1.00 57.92           C\nATOM   6041  C   GLY B   3      -4.315   4.832 -36.960  1.00 57.15           C\nATOM   6042  O   GLY B   3      -4.507   3.626 -37.114  1.00 57.45           O\nATOM   6043  H   GLY B   3      -2.470   7.016 -36.269  1.00 59.20           H\nATOM   6044  HA3 GLY B   3      -2.187   4.890 -37.254  1.00 57.92           H\nATOM   6045  HA2 GLY B   3      -3.100   5.349 -38.670  1.00 57.92           H\nATOM   6046  N   ASN B   4      -5.145   5.609 -36.242  1.00 54.66           N\nATOM   6047  CA  ASN B   4      -6.218   5.111 -35.375  1.00 52.23           C\nATOM   6048  C   ASN B   4      -7.638   5.304 -35.952  1.00 51.44           C\nATOM   6049  O   ASN B   4      -8.587   5.207 -35.175  1.00 51.23           O\nATOM   6050  CB  ASN B   4      -6.084   5.801 -33.991  1.00 51.77           C\nATOM   6051  CG  ASN B   4      -6.596   4.966 -32.808  1.00 48.15           C\nATOM   6052  OD1 ASN B   4      -6.146   3.844 -32.586  1.00 53.79           O\nATOM   6053  ND2 ASN B   4      -7.533   5.520 -32.036  1.00 41.01           N\nATOM   6054  H   ASN B   4      -4.948   6.599 -36.169  1.00 54.66           H\nATOM   6055  HA  ASN B   4      -6.154   4.030 -35.236  1.00 52.23           H\nATOM   6056  HB3 ASN B   4      -6.524   6.797 -34.001  1.00 51.77           H\nATOM   6057  HB2 ASN B   4      -5.028   5.961 -33.783  1.00 51.77           H\nATOM   6058 HD22 ASN B   4      -7.907   5.021 -31.242  1.00 41.01           H\nATOM   6059 HD21 ASN B   4      -7.895   6.442 -32.256  1.00 41.01           H\nATOM   6060  N   PHE B   5      -7.791   5.562 -37.267  1.00 51.87           N\nATOM   6061  CA  PHE B   5      -9.085   5.864 -37.906  1.00 52.35           C\nATOM   6062  C   PHE B   5     -10.218   4.843 -37.666  1.00 52.81           C\nATOM   6063  O   PHE B   5     -11.350   5.262 -37.438  1.00 53.97           O\nATOM   6064  CB  PHE B   5      -8.906   6.186 -39.409  1.00 52.48           C\nATOM   6065  CG  PHE B   5     -10.193   6.452 -40.183  1.00 51.39           C\nATOM   6066  CD1 PHE B   5     -10.843   7.697 -40.053  1.00 51.01           C\nATOM   6067  CD2 PHE B   5     -10.851   5.408 -40.871  1.00 51.13           C\nATOM   6068  CE1 PHE B   5     -12.082   7.900 -40.642  1.00 52.53           C\nATOM   6069  CE2 PHE B   5     -12.097   5.629 -41.444  1.00 51.23           C\nATOM   6070  CZ  PHE B   5     -12.708   6.872 -41.335  1.00 52.64           C\nATOM   6071  H   PHE B   5      -6.977   5.608 -37.865  1.00 51.87           H\nATOM   6072  HA  PHE B   5      -9.423   6.792 -37.442  1.00 52.35           H\nATOM   6073  HB3 PHE B   5      -8.361   5.379 -39.901  1.00 52.48           H\nATOM   6074  HB2 PHE B   5      -8.285   7.077 -39.503  1.00 52.48           H\nATOM   6075  HD1 PHE B   5     -10.384   8.489 -39.485  1.00 51.01           H\nATOM   6076  HD2 PHE B   5     -10.398   4.430 -40.937  1.00 51.13           H\nATOM   6077  HE1 PHE B   5     -12.562   8.861 -40.552  1.00 52.53           H\nATOM   6078  HE2 PHE B   5     -12.597   4.827 -41.967  1.00 51.23           H\nATOM   6079  HZ  PHE B   5     -13.680   7.035 -41.777  1.00 52.64           H\nATOM   6080  N   TRP B   6      -9.906   3.538 -37.700  1.00 55.06           N\nATOM   6081  CA  TRP B   6     -10.893   2.462 -37.545  1.00 55.69           C\nATOM   6082  C   TRP B   6     -11.400   2.251 -36.103  1.00 55.27           C\nATOM   6083  O   TRP B   6     -12.368   1.512 -35.923  1.00 56.25           O\nATOM   6084  CB  TRP B   6     -10.340   1.166 -38.164  1.00 56.30           C\nATOM   6085  CG  TRP B   6      -9.959   1.283 -39.611  1.00 57.27           C\nATOM   6086  CD1 TRP B   6      -8.699   1.299 -40.103  1.00 57.36           C\nATOM   6087  CD2 TRP B   6     -10.838   1.473 -40.762  1.00 55.08           C\nATOM   6088  NE1 TRP B   6      -8.737   1.466 -41.472  1.00 59.38           N\nATOM   6089  CE2 TRP B   6     -10.031   1.578 -41.936  1.00 55.75           C\nATOM   6090  CE3 TRP B   6     -12.238   1.575 -40.934  1.00 57.15           C\nATOM   6091  CZ2 TRP B   6     -10.587   1.759 -43.215  1.00 55.99           C\nATOM   6092  CZ3 TRP B   6     -12.807   1.755 -42.211  1.00 57.16           C\nATOM   6093  CH2 TRP B   6     -11.985   1.841 -43.350  1.00 58.90           C\nATOM   6094  H   TRP B   6      -8.949   3.251 -37.857  1.00 55.06           H\nATOM   6095  HA  TRP B   6     -11.773   2.742 -38.128  1.00 55.69           H\nATOM   6096  HB3 TRP B   6     -11.083   0.370 -38.085  1.00 56.30           H\nATOM   6097  HB2 TRP B   6      -9.471   0.824 -37.600  1.00 56.30           H\nATOM   6098  HD1 TRP B   6      -7.806   1.196 -39.504  1.00 57.36           H\nATOM   6099  HE1 TRP B   6      -7.903   1.500 -42.040  1.00 59.38           H\nATOM   6100  HE3 TRP B   6     -12.882   1.506 -40.070  1.00 57.15           H\nATOM   6101  HZ2 TRP B   6      -9.949   1.829 -44.084  1.00 55.99           H\nATOM   6102  HZ3 TRP B   6     -13.879   1.821 -42.318  1.00 57.16           H\nATOM   6103  HH2 TRP B   6     -12.431   1.967 -44.326  1.00 58.90           H\nATOM   6104  N   GLN B   7     -10.773   2.921 -35.122  0.50 55.03           N\nATOM   6105  CA  GLN B   7     -11.189   2.968 -33.718  0.50 54.60           C\nATOM   6106  C   GLN B   7     -11.455   4.409 -33.239  0.50 53.87           C\nATOM   6107  O   GLN B   7     -11.626   4.615 -32.037  0.50 53.47           O\nATOM   6108  CB  GLN B   7     -10.125   2.252 -32.849  0.50 55.31           C\nATOM   6109  CG  GLN B   7     -10.006   0.730 -33.086  0.50 56.50           C\nATOM   6110  CD  GLN B   7     -11.296  -0.049 -32.796  0.50 57.92           C\nATOM   6111  OE1 GLN B   7     -12.041   0.281 -31.876  0.50 61.67           O\nATOM   6112  NE2 GLN B   7     -11.551  -1.106 -33.568  0.50 56.64           N\nATOM   6113  H   GLN B   7      -9.980   3.502 -35.358  0.50 55.03           H\nATOM   6114  HA  GLN B   7     -12.149   2.463 -33.598  0.50 54.60           H\nATOM   6115  HB3 GLN B   7     -10.333   2.414 -31.790  0.50 55.31           H\nATOM   6116  HB2 GLN B   7      -9.151   2.712 -33.025  0.50 55.31           H\nATOM   6117  HG3 GLN B   7      -9.220   0.327 -32.447  0.50 56.50           H\nATOM   6118  HG2 GLN B   7      -9.690   0.543 -34.113  0.50 56.50           H\nATOM   6119 HE22 GLN B   7     -12.387  -1.652 -33.413  0.50 56.64           H\nATOM   6120 HE21 GLN B   7     -10.925  -1.358 -34.319  0.50 56.64           H\nATOM   6121  N   SER B   8     -11.502   5.378 -34.171  1.00 52.30           N\nATOM   6122  CA  SER B   8     -11.746   6.790 -33.886  1.00 50.63           C\nATOM   6123  C   SER B   8     -13.242   7.114 -33.764  1.00 49.39           C\nATOM   6124  O   SER B   8     -14.071   6.425 -34.359  1.00 50.71           O\nATOM   6125  CB  SER B   8     -11.073   7.649 -34.977  1.00 50.19           C\nATOM   6126  OG  SER B   8     -11.805   7.720 -36.187  1.00 46.11           O\nATOM   6127  H   SER B   8     -11.370   5.137 -35.143  1.00 52.30           H\nATOM   6128  HA  SER B   8     -11.263   7.023 -32.935  1.00 50.63           H\nATOM   6129  HB3 SER B   8     -10.064   7.301 -35.187  1.00 50.19           H\nATOM   6130  HB2 SER B   8     -10.965   8.661 -34.598  1.00 50.19           H\nATOM   6131  HG  SER B   8     -11.712   6.878 -36.647  1.00 46.11           H\nATOM   6132  N   SER B   9     -13.546   8.214 -33.055  1.00 49.81           N\nATOM   6133  CA  SER B   9     -14.891   8.786 -32.965  1.00 49.52           C\nATOM   6134  C   SER B   9     -15.407   9.376 -34.297  1.00 50.41           C\nATOM   6135  O   SER B   9     -16.623   9.444 -34.472  1.00 51.71           O\nATOM   6136  CB  SER B   9     -14.952   9.798 -31.804  1.00 49.54           C\nATOM   6137  OG  SER B   9     -14.398  11.054 -32.143  1.00 50.02           O\nATOM   6138  H   SER B   9     -12.805   8.732 -32.598  1.00 49.81           H\nATOM   6139  HA  SER B   9     -15.561   7.965 -32.703  1.00 49.52           H\nATOM   6140  HB3 SER B   9     -14.445   9.409 -30.920  1.00 49.54           H\nATOM   6141  HB2 SER B   9     -15.992   9.956 -31.518  1.00 49.54           H\nATOM   6142  HG  SER B   9     -13.466  11.061 -31.888  1.00 50.02           H\nATOM   6143  N   HIS B  10     -14.496   9.748 -35.220  1.00 51.57           N\nATOM   6144  CA  HIS B  10     -14.815  10.159 -36.590  1.00 52.91           C\nATOM   6145  C   HIS B  10     -15.530   9.034 -37.350  1.00 52.07           C\nATOM   6146  O   HIS B  10     -16.599   9.279 -37.900  1.00 51.68           O\nATOM   6147  CB  HIS B  10     -13.536  10.619 -37.327  1.00 52.48           C\nATOM   6148  CG  HIS B  10     -13.730  11.253 -38.689  1.00 53.67           C\nATOM   6149  ND1 HIS B  10     -13.278  12.546 -38.978  1.00 59.35           N\nATOM   6150  CD2 HIS B  10     -14.299  10.724 -39.832  1.00 57.72           C\nATOM   6151  CE1 HIS B  10     -13.580  12.738 -40.256  1.00 59.33           C\nATOM   6152  NE2 HIS B  10     -14.182  11.690 -40.813  1.00 56.40           N\nATOM   6153  H   HIS B  10     -13.511   9.687 -34.996  1.00 51.57           H\nATOM   6154  HA  HIS B  10     -15.487  11.015 -36.519  1.00 52.91           H\nATOM   6155  HB3 HIS B  10     -12.843   9.787 -37.448  1.00 52.48           H\nATOM   6156  HB2 HIS B  10     -13.016  11.351 -36.711  1.00 52.48           H\nATOM   6157  HD2 HIS B  10     -14.749   9.763 -40.029  1.00 57.72           H\nATOM   6158  HE1 HIS B  10     -13.354  13.645 -40.796  1.00 59.33           H\nATOM   6159  HE2 HIS B  10     -14.470  11.610 -41.781  1.00 56.40           H\nATOM   6160  N   TYR B  11     -14.940   7.828 -37.339  1.00 53.08           N\nATOM   6161  CA  TYR B  11     -15.498   6.636 -37.972  1.00 55.10           C\nATOM   6162  C   TYR B  11     -16.748   6.101 -37.250  1.00 55.79           C\nATOM   6163  O   TYR B  11     -17.747   5.822 -37.912  1.00 56.34           O\nATOM   6164  CB  TYR B  11     -14.397   5.565 -38.101  1.00 55.29           C\nATOM   6165  CG  TYR B  11     -14.849   4.237 -38.685  1.00 58.95           C\nATOM   6166  CD1 TYR B  11     -15.340   4.176 -40.006  1.00 60.86           C\nATOM   6167  CD2 TYR B  11     -14.811   3.066 -37.899  1.00 63.64           C\nATOM   6168  CE1 TYR B  11     -15.813   2.957 -40.529  1.00 62.10           C\nATOM   6169  CE2 TYR B  11     -15.276   1.846 -38.424  1.00 65.76           C\nATOM   6170  CZ  TYR B  11     -15.782   1.792 -39.738  1.00 65.10           C\nATOM   6171  OH  TYR B  11     -16.236   0.609 -40.243  1.00 69.41           O\nATOM   6172  H   TYR B  11     -14.062   7.710 -36.851  1.00 53.08           H\nATOM   6173  HA  TYR B  11     -15.795   6.912 -38.983  1.00 55.10           H\nATOM   6174  HB3 TYR B  11     -13.964   5.380 -37.117  1.00 55.29           H\nATOM   6175  HB2 TYR B  11     -13.588   5.948 -38.721  1.00 55.29           H\nATOM   6176  HD1 TYR B  11     -15.372   5.067 -40.615  1.00 60.86           H\nATOM   6177  HD2 TYR B  11     -14.436   3.102 -36.887  1.00 63.64           H\nATOM   6178  HE1 TYR B  11     -16.197   2.923 -41.538  1.00 62.10           H\nATOM   6179  HE2 TYR B  11     -15.247   0.954 -37.815  1.00 65.76           H\nATOM   6180  HH  TYR B  11     -16.579   0.684 -41.137  1.00 69.41           H\nATOM   6181  N   LEU B  12     -16.655   5.953 -35.918  1.00 56.46           N\nATOM   6182  CA  LEU B  12     -17.655   5.273 -35.093  1.00 57.70           C\nATOM   6183  C   LEU B  12     -18.943   6.081 -34.838  1.00 57.77           C\nATOM   6184  O   LEU B  12     -19.944   5.454 -34.488  1.00 58.26           O\nATOM   6185  CB  LEU B  12     -17.008   4.843 -33.755  1.00 57.38           C\nATOM   6186  CG  LEU B  12     -15.914   3.754 -33.882  1.00 59.12           C\nATOM   6187  CD1 LEU B  12     -15.138   3.612 -32.560  1.00 57.86           C\nATOM   6188  CD2 LEU B  12     -16.486   2.399 -34.351  1.00 55.39           C\nATOM   6189  H   LEU B  12     -15.799   6.217 -35.447  1.00 56.46           H\nATOM   6190  HA  LEU B  12     -17.967   4.376 -35.630  1.00 57.70           H\nATOM   6191  HB3 LEU B  12     -17.775   4.479 -33.069  1.00 57.38           H\nATOM   6192  HB2 LEU B  12     -16.584   5.726 -33.276  1.00 57.38           H\nATOM   6193  HG  LEU B  12     -15.191   4.069 -34.634  1.00 59.12           H\nATOM   6194 HD11 LEU B  12     -14.641   2.645 -32.473  1.00 57.86           H\nATOM   6195 HD12 LEU B  12     -14.364   4.375 -32.486  1.00 57.86           H\nATOM   6196 HD13 LEU B  12     -15.791   3.729 -31.696  1.00 57.86           H\nATOM   6197 HD21 LEU B  12     -16.239   1.584 -33.671  1.00 55.39           H\nATOM   6198 HD22 LEU B  12     -17.573   2.417 -34.433  1.00 55.39           H\nATOM   6199 HD23 LEU B  12     -16.092   2.130 -35.331  1.00 55.39           H\nATOM   6200  N   GLN B  13     -18.915   7.419 -34.991  1.00 59.08           N\nATOM   6201  CA  GLN B  13     -20.058   8.293 -34.686  1.00 59.55           C\nATOM   6202  C   GLN B  13     -20.370   9.347 -35.759  1.00 59.45           C\nATOM   6203  O   GLN B  13     -21.526   9.764 -35.827  1.00 61.52           O\nATOM   6204  CB  GLN B  13     -19.869   8.969 -33.309  1.00 60.15           C\nATOM   6205  CG  GLN B  13     -20.007   7.992 -32.125  1.00 63.89           C\nATOM   6206  CD  GLN B  13     -19.800   8.653 -30.762  1.00 65.64           C\nATOM   6207  OE1 GLN B  13     -19.045   8.136 -29.942  1.00 69.17           O\nATOM   6208  NE2 GLN B  13     -20.476   9.775 -30.502  1.00 61.68           N\nATOM   6209  H   GLN B  13     -18.054   7.875 -35.258  1.00 59.08           H\nATOM   6210  HA  GLN B  13     -20.968   7.691 -34.631  1.00 59.55           H\nATOM   6211  HB3 GLN B  13     -20.609   9.763 -33.197  1.00 60.15           H\nATOM   6212  HB2 GLN B  13     -18.899   9.463 -33.265  1.00 60.15           H\nATOM   6213  HG3 GLN B  13     -19.280   7.186 -32.217  1.00 63.89           H\nATOM   6214  HG2 GLN B  13     -20.992   7.524 -32.137  1.00 63.89           H\nATOM   6215 HE22 GLN B  13     -20.408  10.222 -29.595  1.00 61.68           H\nATOM   6216 HE21 GLN B  13     -21.092  10.173 -31.196  1.00 61.68           H\nATOM   6217  N   TRP B  14     -19.371   9.783 -36.548  1.00 58.82           N\nATOM   6218  CA  TRP B  14     -19.507  10.921 -37.470  1.00 57.73           C\nATOM   6219  C   TRP B  14     -19.339  10.571 -38.959  1.00 56.80           C\nATOM   6220  O   TRP B  14     -19.312  11.487 -39.783  1.00 56.58           O\nATOM   6221  CB  TRP B  14     -18.626  12.092 -36.992  1.00 56.99           C\nATOM   6222  CG  TRP B  14     -19.048  12.665 -35.671  1.00 57.09           C\nATOM   6223  CD1 TRP B  14     -18.424  12.493 -34.483  1.00 56.21           C\nATOM   6224  CD2 TRP B  14     -20.251  13.441 -35.383  1.00 55.07           C\nATOM   6225  NE1 TRP B  14     -19.161  13.096 -33.484  1.00 58.38           N\nATOM   6226  CE2 TRP B  14     -20.306  13.687 -33.979  1.00 55.97           C\nATOM   6227  CE3 TRP B  14     -21.317  13.946 -36.166  1.00 56.94           C\nATOM   6228  CZ2 TRP B  14     -21.373  14.382 -33.382  1.00 57.05           C\nATOM   6229  CZ3 TRP B  14     -22.373  14.677 -35.583  1.00 58.83           C\nATOM   6230  CH2 TRP B  14     -22.403  14.894 -34.192  1.00 57.28           C\nATOM   6231  H   TRP B  14     -18.442   9.399 -36.452  1.00 58.82           H\nATOM   6232  HA  TRP B  14     -20.531  11.297 -37.440  1.00 57.73           H\nATOM   6233  HB3 TRP B  14     -18.663  12.908 -37.712  1.00 56.99           H\nATOM   6234  HB2 TRP B  14     -17.584  11.781 -36.933  1.00 56.99           H\nATOM   6235  HD1 TRP B  14     -17.500  11.951 -34.349  1.00 56.21           H\nATOM   6236  HE1 TRP B  14     -18.880  13.085 -32.512  1.00 58.38           H\nATOM   6237  HE3 TRP B  14     -21.319  13.773 -37.232  1.00 56.94           H\nATOM   6238  HZ2 TRP B  14     -21.403  14.520 -32.312  1.00 57.05           H\nATOM   6239  HZ3 TRP B  14     -23.167  15.063 -36.205  1.00 58.83           H\nATOM   6240  HH2 TRP B  14     -23.219  15.443 -33.746  1.00 57.28           H\nATOM   6241  N   ILE B  15     -19.330   9.268 -39.288  1.00 55.79           N\nATOM   6242  CA  ILE B  15     -19.670   8.765 -40.618  1.00 55.76           C\nATOM   6243  C   ILE B  15     -21.154   8.359 -40.547  1.00 54.97           C\nATOM   6244  O   ILE B  15     -21.491   7.284 -40.051  1.00 54.47           O\nATOM   6245  CB  ILE B  15     -18.765   7.580 -41.068  1.00 55.34           C\nATOM   6246  CG1 ILE B  15     -17.291   8.024 -41.240  1.00 55.61           C\nATOM   6247  CG2 ILE B  15     -19.255   6.858 -42.344  1.00 55.29           C\nATOM   6248  CD1 ILE B  15     -17.040   9.138 -42.273  1.00 56.11           C\nATOM   6249  H   ILE B  15     -19.334   8.577 -38.551  1.00 55.79           H\nATOM   6250  HA  ILE B  15     -19.572   9.556 -41.363  1.00 55.76           H\nATOM   6251  HB  ILE B  15     -18.768   6.836 -40.270  1.00 55.34           H\nATOM   6252 HG13 ILE B  15     -16.671   7.160 -41.484  1.00 55.61           H\nATOM   6253 HG12 ILE B  15     -16.921   8.381 -40.283  1.00 55.61           H\nATOM   6254 HG21 ILE B  15     -18.530   6.116 -42.680  1.00 55.29           H\nATOM   6255 HG22 ILE B  15     -20.192   6.326 -42.183  1.00 55.29           H\nATOM   6256 HG23 ILE B  15     -19.416   7.558 -43.163  1.00 55.29           H\nATOM   6257 HD11 ILE B  15     -16.002   9.127 -42.605  1.00 56.11           H\nATOM   6258 HD12 ILE B  15     -17.667   9.035 -43.158  1.00 56.11           H\nATOM   6259 HD13 ILE B  15     -17.233  10.121 -41.843  1.00 56.11           H\nATOM   6260  N   LEU B  16     -22.001   9.303 -40.976  1.00 54.47           N\nATOM   6261  CA  LEU B  16     -23.457   9.279 -40.895  1.00 54.36           C\nATOM   6262  C   LEU B  16     -24.066   8.485 -42.060  1.00 55.25           C\nATOM   6263  O   LEU B  16     -23.470   8.417 -43.137  1.00 50.95           O\nATOM   6264  CB  LEU B  16     -23.969  10.742 -40.953  1.00 54.12           C\nATOM   6265  CG  LEU B  16     -23.398  11.695 -39.875  1.00 54.54           C\nATOM   6266  CD1 LEU B  16     -23.863  13.149 -40.114  1.00 55.14           C\nATOM   6267  CD2 LEU B  16     -23.701  11.212 -38.442  1.00 55.25           C\nATOM   6268  H   LEU B  16     -21.616  10.135 -41.404  1.00 54.47           H\nATOM   6269  HA  LEU B  16     -23.756   8.816 -39.953  1.00 54.36           H\nATOM   6270  HB3 LEU B  16     -25.059  10.746 -40.883  1.00 54.12           H\nATOM   6271  HB2 LEU B  16     -23.737  11.156 -41.936  1.00 54.12           H\nATOM   6272  HG  LEU B  16     -22.312  11.713 -39.983  1.00 54.54           H\nATOM   6273 HD11 LEU B  16     -23.009  13.824 -40.176  1.00 55.14           H\nATOM   6274 HD12 LEU B  16     -24.419  13.252 -41.047  1.00 55.14           H\nATOM   6275 HD13 LEU B  16     -24.512  13.518 -39.320  1.00 55.14           H\nATOM   6276 HD21 LEU B  16     -23.927  12.033 -37.761  1.00 55.25           H\nATOM   6277 HD22 LEU B  16     -24.548  10.525 -38.415  1.00 55.25           H\nATOM   6278 HD23 LEU B  16     -22.842  10.685 -38.029  1.00 55.25           H\nATOM   6279  N   ASP B  17     -25.282   7.961 -41.835  1.00 57.02           N\nATOM   6280  CA  ASP B  17     -26.159   7.439 -42.883  1.00 59.12           C\nATOM   6281  C   ASP B  17     -26.776   8.634 -43.637  1.00 59.36           C\nATOM   6282  O   ASP B  17     -27.261   9.574 -43.003  1.00 58.54           O\nATOM   6283  CB  ASP B  17     -27.234   6.494 -42.280  1.00 61.54           C\nATOM   6284  CG  ASP B  17     -28.178   5.738 -43.241  1.00 63.02           C\nATOM   6285  OD1 ASP B  17     -27.981   5.785 -44.477  1.00 65.39           O\nATOM   6286  OD2 ASP B  17     -29.079   5.058 -42.705  1.00 72.29           O1-\nATOM   6287  H   ASP B  17     -25.703   8.058 -40.922  1.00 57.02           H\nATOM   6288  HA  ASP B  17     -25.548   6.857 -43.577  1.00 59.12           H\nATOM   6289  HB3 ASP B  17     -27.842   7.059 -41.573  1.00 61.54           H\nATOM   6290  HB2 ASP B  17     -26.727   5.747 -41.669  1.00 61.54           H\nATOM   6291  N   LYS B  18     -26.747   8.561 -44.977  1.00 61.00           N\nATOM   6292  CA  LYS B  18     -27.295   9.565 -45.889  1.00 63.03           C\nATOM   6293  C   LYS B  18     -28.814   9.765 -45.751  1.00 65.17           C\nATOM   6294  O   LYS B  18     -29.277  10.887 -45.940  1.00 66.24           O\nATOM   6295  CB  LYS B  18     -26.883   9.200 -47.331  1.00 63.24           C\nATOM   6296  CG  LYS B  18     -27.274  10.243 -48.393  1.00 65.55           C\nATOM   6297  CD  LYS B  18     -26.736   9.891 -49.785  1.00 67.36           C\nATOM   6298  CE  LYS B  18     -27.091  10.959 -50.831  1.00 70.08           C\nATOM   6299  NZ  LYS B  18     -26.565  10.611 -52.162  1.00 73.94           N1+\nATOM   6300  H   LYS B  18     -26.356   7.736 -45.410  1.00 61.00           H\nATOM   6301  HA  LYS B  18     -26.833  10.518 -45.632  1.00 63.03           H\nATOM   6302  HB3 LYS B  18     -27.306   8.230 -47.600  1.00 63.24           H\nATOM   6303  HB2 LYS B  18     -25.799   9.073 -47.360  1.00 63.24           H\nATOM   6304  HG3 LYS B  18     -26.903  11.223 -48.092  1.00 65.55           H\nATOM   6305  HG2 LYS B  18     -28.360  10.329 -48.453  1.00 65.55           H\nATOM   6306  HD3 LYS B  18     -27.143   8.925 -50.088  1.00 67.36           H\nATOM   6307  HD2 LYS B  18     -25.653   9.765 -49.733  1.00 67.36           H\nATOM   6308  HE3 LYS B  18     -26.683  11.926 -50.536  1.00 70.08           H\nATOM   6309  HE2 LYS B  18     -28.174  11.073 -50.900  1.00 70.08           H\nATOM   6310  HZ1 LYS B  18     -26.961   9.731 -52.461  1.00 73.94           H\nATOM   6311  HZ2 LYS B  18     -26.814  11.333 -52.823  1.00 73.94           H\nATOM   6312  HZ3 LYS B  18     -25.559  10.528 -52.116  1.00 73.94           H\nATOM   6313  N   GLN B  19     -29.554   8.701 -45.399  1.00 66.09           N\nATOM   6314  CA  GLN B  19     -31.002   8.756 -45.201  1.00 65.89           C\nATOM   6315  C   GLN B  19     -31.402   9.462 -43.894  1.00 64.50           C\nATOM   6316  O   GLN B  19     -32.410  10.165 -43.899  1.00 66.15           O\nATOM   6317  CB  GLN B  19     -31.598   7.335 -45.289  1.00 67.30           C\nATOM   6318  CG  GLN B  19     -31.352   6.593 -46.625  1.00 70.77           C\nATOM   6319  CD  GLN B  19     -31.646   7.424 -47.879  1.00 75.13           C\nATOM   6320  OE1 GLN B  19     -30.742   7.731 -48.653  1.00 78.47           O\nATOM   6321  NE2 GLN B  19     -32.910   7.804 -48.077  1.00 75.34           N\nATOM   6322  H   GLN B  19     -29.109   7.805 -45.244  1.00 66.09           H\nATOM   6323  HA  GLN B  19     -31.428   9.361 -46.003  1.00 65.89           H\nATOM   6324  HB3 GLN B  19     -32.674   7.393 -45.117  1.00 67.30           H\nATOM   6325  HB2 GLN B  19     -31.205   6.723 -44.476  1.00 67.30           H\nATOM   6326  HG3 GLN B  19     -31.943   5.677 -46.655  1.00 70.77           H\nATOM   6327  HG2 GLN B  19     -30.309   6.276 -46.668  1.00 70.77           H\nATOM   6328 HE22 GLN B  19     -33.149   8.356 -48.888  1.00 75.34           H\nATOM   6329 HE21 GLN B  19     -33.632   7.543 -47.422  1.00 75.34           H\nATOM   6330  N   ASP B  20     -30.589   9.316 -42.832  1.00 63.47           N\nATOM   6331  CA  ASP B  20     -30.745  10.039 -41.563  1.00 64.14           C\nATOM   6332  C   ASP B  20     -30.371  11.526 -41.692  1.00 62.60           C\nATOM   6333  O   ASP B  20     -31.058  12.366 -41.112  1.00 63.07           O\nATOM   6334  CB  ASP B  20     -29.962   9.399 -40.389  1.00 65.48           C\nATOM   6335  CG  ASP B  20     -30.306   7.937 -40.048  1.00 69.92           C\nATOM   6336  OD1 ASP B  20     -31.413   7.475 -40.408  1.00 73.82           O\nATOM   6337  OD2 ASP B  20     -29.502   7.345 -39.295  1.00 73.24           O1-\nATOM   6338  H   ASP B  20     -29.784   8.710 -42.902  1.00 63.47           H\nATOM   6339  HA  ASP B  20     -31.805  10.011 -41.301  1.00 64.14           H\nATOM   6340  HB3 ASP B  20     -30.120   9.987 -39.483  1.00 65.48           H\nATOM   6341  HB2 ASP B  20     -28.893   9.441 -40.610  1.00 65.48           H\nATOM   6342  N   LEU B  21     -29.322  11.823 -42.480  1.00 62.43           N\nATOM   6343  CA  LEU B  21     -28.880  13.176 -42.828  1.00 61.80           C\nATOM   6344  C   LEU B  21     -29.955  13.957 -43.609  1.00 62.07           C\nATOM   6345  O   LEU B  21     -30.207  15.118 -43.288  1.00 60.71           O\nATOM   6346  CB  LEU B  21     -27.538  13.070 -43.596  1.00 61.72           C\nATOM   6347  CG  LEU B  21     -26.910  14.394 -44.094  1.00 60.37           C\nATOM   6348  CD1 LEU B  21     -26.587  15.358 -42.932  1.00 59.56           C\nATOM   6349  CD2 LEU B  21     -25.684  14.114 -44.992  1.00 61.00           C\nATOM   6350  H   LEU B  21     -28.798  11.066 -42.900  1.00 62.43           H\nATOM   6351  HA  LEU B  21     -28.705  13.706 -41.890  1.00 61.80           H\nATOM   6352  HB3 LEU B  21     -27.693  12.426 -44.461  1.00 61.72           H\nATOM   6353  HB2 LEU B  21     -26.812  12.548 -42.970  1.00 61.72           H\nATOM   6354  HG  LEU B  21     -27.636  14.894 -44.735  1.00 60.37           H\nATOM   6355 HD11 LEU B  21     -25.578  15.768 -42.985  1.00 59.56           H\nATOM   6356 HD12 LEU B  21     -27.273  16.205 -42.934  1.00 59.56           H\nATOM   6357 HD13 LEU B  21     -26.679  14.871 -41.962  1.00 59.56           H\nATOM   6358 HD21 LEU B  21     -24.769  14.582 -44.631  1.00 61.00           H\nATOM   6359 HD22 LEU B  21     -25.476  13.048 -45.078  1.00 61.00           H\nATOM   6360 HD23 LEU B  21     -25.856  14.486 -46.003  1.00 61.00           H\nATOM   6361  N   LEU B  22     -30.585  13.289 -44.591  1.00 64.26           N\nATOM   6362  CA  LEU B  22     -31.667  13.823 -45.420  1.00 66.06           C\nATOM   6363  C   LEU B  22     -32.988  13.970 -44.642  1.00 65.90           C\nATOM   6364  O   LEU B  22     -33.728  14.907 -44.930  1.00 65.26           O\nATOM   6365  CB  LEU B  22     -31.854  12.920 -46.665  1.00 66.50           C\nATOM   6366  CG  LEU B  22     -31.072  13.348 -47.934  1.00 70.24           C\nATOM   6367  CD1 LEU B  22     -29.567  13.635 -47.725  1.00 72.76           C\nATOM   6368  CD2 LEU B  22     -31.316  12.342 -49.080  1.00 69.52           C\nATOM   6369  H   LEU B  22     -30.301  12.341 -44.797  1.00 64.26           H\nATOM   6370  HA  LEU B  22     -31.382  14.823 -45.753  1.00 66.06           H\nATOM   6371  HB3 LEU B  22     -32.909  12.904 -46.945  1.00 66.50           H\nATOM   6372  HB2 LEU B  22     -31.624  11.885 -46.409  1.00 66.50           H\nATOM   6373  HG  LEU B  22     -31.519  14.291 -48.252  1.00 70.24           H\nATOM   6374 HD11 LEU B  22     -29.366  14.703 -47.817  1.00 72.76           H\nATOM   6375 HD12 LEU B  22     -29.200  13.330 -46.749  1.00 72.76           H\nATOM   6376 HD13 LEU B  22     -28.937  13.134 -48.461  1.00 72.76           H\nATOM   6377 HD21 LEU B  22     -31.624  12.858 -49.990  1.00 69.52           H\nATOM   6378 HD22 LEU B  22     -30.429  11.755 -49.320  1.00 69.52           H\nATOM   6379 HD23 LEU B  22     -32.103  11.627 -48.836  1.00 69.52           H\nATOM   6380  N   LYS B  23     -33.255  13.070 -43.677  1.00 66.56           N\nATOM   6381  CA  LYS B  23     -34.443  13.088 -42.818  1.00 67.05           C\nATOM   6382  C   LYS B  23     -34.448  14.272 -41.835  1.00 67.17           C\nATOM   6383  O   LYS B  23     -35.489  14.913 -41.683  1.00 66.79           O\nATOM   6384  CB  LYS B  23     -34.584  11.725 -42.108  1.00 68.18           C\nATOM   6385  CG  LYS B  23     -35.783  11.603 -41.149  1.00 68.22           C\nATOM   6386  CD  LYS B  23     -35.931  10.183 -40.585  0.00 68.09           C\nATOM   6387  CE  LYS B  23     -37.114  10.061 -39.611  0.00 68.09           C\nATOM   6388  NZ  LYS B  23     -37.241   8.693 -39.078  0.00 68.07           N1+\nATOM   6389  H   LYS B  23     -32.606  12.311 -43.516  1.00 66.56           H\nATOM   6390  HA  LYS B  23     -35.310  13.204 -43.470  1.00 67.05           H\nATOM   6391  HB3 LYS B  23     -33.670  11.503 -41.557  1.00 68.18           H\nATOM   6392  HB2 LYS B  23     -34.678  10.950 -42.870  1.00 68.18           H\nATOM   6393  HG3 LYS B  23     -36.697  11.889 -41.670  1.00 68.22           H\nATOM   6394  HG2 LYS B  23     -35.669  12.299 -40.317  1.00 68.22           H\nATOM   6395  HD3 LYS B  23     -35.004   9.900 -40.083  1.00 68.09           H\nATOM   6396  HD2 LYS B  23     -36.057   9.482 -41.412  1.00 68.09           H\nATOM   6397  HE3 LYS B  23     -38.045  10.329 -40.112  1.00 68.09           H\nATOM   6398  HE2 LYS B  23     -36.987  10.751 -38.776  1.00 68.09           H\nATOM   6399  HZ1 LYS B  23     -36.394   8.444 -38.587  1.00 68.07           H\nATOM   6400  HZ2 LYS B  23     -38.023   8.650 -38.441  1.00 68.07           H\nATOM   6401  HZ3 LYS B  23     -37.390   8.046 -39.839  1.00 68.07           H\nATOM   6402  N   GLU B  24     -33.286  14.566 -41.224  1.00 66.82           N\nATOM   6403  CA  GLU B  24     -33.078  15.743 -40.375  1.00 67.34           C\nATOM   6404  C   GLU B  24     -33.160  17.068 -41.154  1.00 66.09           C\nATOM   6405  O   GLU B  24     -33.592  18.066 -40.584  1.00 64.69           O\nATOM   6406  CB  GLU B  24     -31.723  15.637 -39.637  1.00 67.89           C\nATOM   6407  CG  GLU B  24     -31.631  14.531 -38.559  1.00 72.28           C\nATOM   6408  CD  GLU B  24     -32.315  14.820 -37.208  1.00 76.11           C\nATOM   6409  OE1 GLU B  24     -32.063  14.022 -36.279  1.00 81.42           O\nATOM   6410  OE2 GLU B  24     -33.070  15.812 -37.098  1.00 72.23           O1-\nATOM   6411  H   GLU B  24     -32.478  13.975 -41.374  1.00 66.82           H\nATOM   6412  HA  GLU B  24     -33.885  15.762 -39.642  1.00 67.34           H\nATOM   6413  HB3 GLU B  24     -31.449  16.598 -39.196  1.00 67.89           H\nATOM   6414  HB2 GLU B  24     -30.945  15.440 -40.375  1.00 67.89           H\nATOM   6415  HG3 GLU B  24     -30.574  14.344 -38.358  1.00 72.28           H\nATOM   6416  HG2 GLU B  24     -32.030  13.594 -38.948  1.00 72.28           H\nATOM   6417  N   ARG B  25     -32.771  17.055 -42.440  1.00 65.55           N\nATOM   6418  CA  ARG B  25     -32.750  18.231 -43.311  1.00 65.54           C\nATOM   6419  C   ARG B  25     -34.144  18.783 -43.657  1.00 65.37           C\nATOM   6420  O   ARG B  25     -34.247  19.978 -43.933  1.00 64.13           O\nATOM   6421  CB  ARG B  25     -31.938  17.880 -44.571  1.00 65.18           C\nATOM   6422  CG  ARG B  25     -31.544  19.081 -45.453  1.00 67.09           C\nATOM   6423  CD  ARG B  25     -30.500  18.715 -46.522  1.00 67.22           C\nATOM   6424  NE  ARG B  25     -29.192  18.409 -45.915  1.00 69.83           N\nATOM   6425  CZ  ARG B  25     -28.063  18.028 -46.534  1.00 70.36           C\nATOM   6426  NH1 ARG B  25     -27.992  17.871 -47.863  1.00 72.35           N\nATOM   6427  NH2 ARG B  25     -26.975  17.795 -45.791  1.00 68.54           N1+\nATOM   6428  H   ARG B  25     -32.439  16.191 -42.846  1.00 65.55           H\nATOM   6429  HA  ARG B  25     -32.211  19.012 -42.771  1.00 65.54           H\nATOM   6430  HB3 ARG B  25     -32.485  17.161 -45.180  1.00 65.18           H\nATOM   6431  HB2 ARG B  25     -31.033  17.367 -44.252  1.00 65.18           H\nATOM   6432  HG3 ARG B  25     -31.108  19.829 -44.789  1.00 67.09           H\nATOM   6433  HG2 ARG B  25     -32.400  19.571 -45.915  1.00 67.09           H\nATOM   6434  HD3 ARG B  25     -30.443  19.469 -47.307  1.00 67.22           H\nATOM   6435  HD2 ARG B  25     -30.813  17.787 -47.003  1.00 67.22           H\nATOM   6436  HE  ARG B  25     -29.157  18.520 -44.911  1.00 69.83           H\nATOM   6437 HH12 ARG B  25     -27.129  17.548 -48.287  1.00 72.35           H\nATOM   6438 HH11 ARG B  25     -28.797  18.054 -48.443  1.00 72.35           H\nATOM   6439 HH22 ARG B  25     -26.116  17.497 -46.239  1.00 68.54           H\nATOM   6440 HH21 ARG B  25     -27.000  17.906 -44.788  1.00 68.54           H\nATOM   6441  N   GLN B  26     -35.180  17.922 -43.609  1.00 65.60           N\nATOM   6442  CA  GLN B  26     -36.569  18.218 -43.976  1.00 65.80           C\nATOM   6443  C   GLN B  26     -37.217  19.410 -43.248  1.00 65.15           C\nATOM   6444  O   GLN B  26     -38.115  20.022 -43.825  1.00 63.97           O\nATOM   6445  CB  GLN B  26     -37.448  16.957 -43.794  1.00 67.24           C\nATOM   6446  CG  GLN B  26     -37.078  15.742 -44.669  1.00 67.93           C\nATOM   6447  CD  GLN B  26     -37.040  16.036 -46.171  1.00 71.75           C\nATOM   6448  OE1 GLN B  26     -37.960  16.642 -46.714  1.00 71.67           O\nATOM   6449  NE2 GLN B  26     -35.983  15.591 -46.853  1.00 76.03           N\nATOM   6450  H   GLN B  26     -34.997  16.964 -43.343  1.00 65.60           H\nATOM   6451  HA  GLN B  26     -36.551  18.483 -45.032  1.00 65.80           H\nATOM   6452  HB3 GLN B  26     -38.491  17.212 -43.993  1.00 67.24           H\nATOM   6453  HB2 GLN B  26     -37.420  16.649 -42.747  1.00 67.24           H\nATOM   6454  HG3 GLN B  26     -37.796  14.940 -44.498  1.00 67.93           H\nATOM   6455  HG2 GLN B  26     -36.116  15.352 -44.347  1.00 67.93           H\nATOM   6456 HE22 GLN B  26     -35.919  15.751 -47.849  1.00 76.03           H\nATOM   6457 HE21 GLN B  26     -35.231  15.114 -46.374  1.00 76.03           H\nATOM   6458  N   LYS B  27     -36.753  19.733 -42.026  1.00 64.86           N\nATOM   6459  CA  LYS B  27     -37.244  20.864 -41.234  1.00 65.69           C\nATOM   6460  C   LYS B  27     -36.907  22.239 -41.852  1.00 65.61           C\nATOM   6461  O   LYS B  27     -37.724  23.152 -41.731  1.00 66.24           O\nATOM   6462  CB  LYS B  27     -36.782  20.720 -39.762  1.00 66.44           C\nATOM   6463  CG  LYS B  27     -35.289  20.993 -39.471  1.00 68.61           C\nATOM   6464  CD  LYS B  27     -34.921  20.859 -37.978  0.00 67.53           C\nATOM   6465  CE  LYS B  27     -34.763  19.418 -37.455  0.00 67.61           C\nATOM   6466  NZ  LYS B  27     -33.415  18.880 -37.711  0.00 67.57           N1+\nATOM   6467  H   LYS B  27     -36.005  19.188 -41.620  1.00 64.86           H\nATOM   6468  HA  LYS B  27     -38.333  20.790 -41.228  1.00 65.69           H\nATOM   6469  HB3 LYS B  27     -37.061  19.731 -39.397  1.00 66.44           H\nATOM   6470  HB2 LYS B  27     -37.363  21.424 -39.165  1.00 66.44           H\nATOM   6471  HG3 LYS B  27     -35.050  22.011 -39.770  1.00 68.61           H\nATOM   6472  HG2 LYS B  27     -34.657  20.351 -40.081  1.00 68.61           H\nATOM   6473  HD3 LYS B  27     -35.685  21.361 -37.383  1.00 67.53           H\nATOM   6474  HD2 LYS B  27     -34.003  21.416 -37.792  1.00 67.53           H\nATOM   6475  HE3 LYS B  27     -35.514  18.754 -37.882  1.00 67.61           H\nATOM   6476  HE2 LYS B  27     -34.909  19.407 -36.375  1.00 67.61           H\nATOM   6477  HZ1 LYS B  27     -33.347  17.937 -37.345  1.00 67.57           H\nATOM   6478  HZ2 LYS B  27     -33.244  18.850 -38.708  1.00 67.57           H\nATOM   6479  HZ3 LYS B  27     -32.713  19.454 -37.269  1.00 67.57           H\nATOM   6480  N   ASP B  28     -35.752  22.345 -42.536  1.00 64.96           N\nATOM   6481  CA  ASP B  28     -35.319  23.542 -43.272  1.00 64.65           C\nATOM   6482  C   ASP B  28     -35.760  23.525 -44.740  1.00 64.56           C\nATOM   6483  O   ASP B  28     -35.805  24.596 -45.344  1.00 63.06           O\nATOM   6484  CB  ASP B  28     -33.793  23.792 -43.204  1.00 64.47           C\nATOM   6485  CG  ASP B  28     -33.217  24.059 -41.807  1.00 63.67           C\nATOM   6486  OD1 ASP B  28     -33.993  24.265 -40.849  1.00 57.33           O\nATOM   6487  OD2 ASP B  28     -31.976  24.149 -41.731  1.00 62.91           O1-\nATOM   6488  H   ASP B  28     -35.139  21.544 -42.601  1.00 64.96           H\nATOM   6489  HA  ASP B  28     -35.806  24.415 -42.834  1.00 64.65           H\nATOM   6490  HB3 ASP B  28     -33.525  24.644 -43.832  1.00 64.47           H\nATOM   6491  HB2 ASP B  28     -33.271  22.925 -43.613  1.00 64.47           H\nATOM   6492  N   LEU B  29     -36.117  22.347 -45.284  1.00 65.01           N\nATOM   6493  CA  LEU B  29     -36.673  22.212 -46.635  1.00 65.90           C\nATOM   6494  C   LEU B  29     -38.141  22.685 -46.746  1.00 67.65           C\nATOM   6495  O   LEU B  29     -38.668  22.737 -47.856  1.00 67.83           O\nATOM   6496  CB  LEU B  29     -36.482  20.775 -47.164  1.00 65.17           C\nATOM   6497  CG  LEU B  29     -35.003  20.347 -47.308  1.00 63.31           C\nATOM   6498  CD1 LEU B  29     -34.889  18.842 -47.628  1.00 60.73           C\nATOM   6499  CD2 LEU B  29     -34.227  21.224 -48.313  1.00 60.45           C\nATOM   6500  H   LEU B  29     -36.050  21.501 -44.736  1.00 65.01           H\nATOM   6501  HA  LEU B  29     -36.092  22.871 -47.274  1.00 65.90           H\nATOM   6502  HB3 LEU B  29     -36.964  20.672 -48.137  1.00 65.17           H\nATOM   6503  HB2 LEU B  29     -37.008  20.088 -46.503  1.00 65.17           H\nATOM   6504  HG  LEU B  29     -34.519  20.492 -46.346  1.00 63.31           H\nATOM   6505 HD11 LEU B  29     -34.283  18.635 -48.509  1.00 60.73           H\nATOM   6506 HD12 LEU B  29     -34.439  18.301 -46.796  1.00 60.73           H\nATOM   6507 HD13 LEU B  29     -35.866  18.395 -47.810  1.00 60.73           H\nATOM   6508 HD21 LEU B  29     -33.503  20.654 -48.892  1.00 60.45           H\nATOM   6509 HD22 LEU B  29     -34.894  21.718 -49.022  1.00 60.45           H\nATOM   6510 HD23 LEU B  29     -33.669  22.004 -47.795  1.00 60.45           H\nATOM   6511  N   LYS B  30     -38.754  23.073 -45.614  1.00 69.52           N\nATOM   6512  CA  LYS B  30     -40.013  23.819 -45.549  1.00 70.23           C\nATOM   6513  C   LYS B  30     -39.841  25.312 -45.901  1.00 70.18           C\nATOM   6514  O   LYS B  30     -40.827  25.950 -46.268  1.00 70.75           O\nATOM   6515  CB  LYS B  30     -40.603  23.679 -44.130  1.00 70.39           C\nATOM   6516  CG  LYS B  30     -41.006  22.240 -43.770  0.00 70.14           C\nATOM   6517  CD  LYS B  30     -41.572  22.122 -42.349  0.00 70.19           C\nATOM   6518  CE  LYS B  30     -41.930  20.672 -41.988  0.00 70.22           C\nATOM   6519  NZ  LYS B  30     -42.508  20.573 -40.636  0.00 70.26           N1+\nATOM   6520  H   LYS B  30     -38.265  22.965 -44.737  1.00 69.52           H\nATOM   6521  HA  LYS B  30     -40.716  23.387 -46.264  1.00 70.23           H\nATOM   6522  HB3 LYS B  30     -41.487  24.313 -44.040  1.00 70.39           H\nATOM   6523  HB2 LYS B  30     -39.887  24.052 -43.396  1.00 70.39           H\nATOM   6524  HG3 LYS B  30     -40.144  21.583 -43.863  1.00 70.14           H\nATOM   6525  HG2 LYS B  30     -41.743  21.881 -44.490  1.00 70.14           H\nATOM   6526  HD3 LYS B  30     -42.455  22.758 -42.263  1.00 70.19           H\nATOM   6527  HD2 LYS B  30     -40.840  22.512 -41.640  1.00 70.19           H\nATOM   6528  HE3 LYS B  30     -41.041  20.042 -42.037  1.00 70.22           H\nATOM   6529  HE2 LYS B  30     -42.649  20.271 -42.703  1.00 70.22           H\nATOM   6530  HZ1 LYS B  30     -43.351  21.126 -40.588  1.00 70.26           H\nATOM   6531  HZ2 LYS B  30     -42.728  19.608 -40.433  1.00 70.26           H\nATOM   6532  HZ3 LYS B  30     -41.843  20.915 -39.958  1.00 70.26           H\nATOM   6533  N   PHE B  31     -38.610  25.838 -45.765  1.00 69.51           N\nATOM   6534  CA  PHE B  31     -38.254  27.248 -45.947  1.00 68.56           C\nATOM   6535  C   PHE B  31     -37.407  27.481 -47.211  1.00 66.43           C\nATOM   6536  O   PHE B  31     -37.479  28.565 -47.789  1.00 66.02           O\nATOM   6537  CB  PHE B  31     -37.460  27.718 -44.710  1.00 69.85           C\nATOM   6538  CG  PHE B  31     -38.239  27.729 -43.408  1.00 72.09           C\nATOM   6539  CD1 PHE B  31     -38.350  26.553 -42.635  1.00 73.48           C\nATOM   6540  CD2 PHE B  31     -38.987  28.866 -43.038  1.00 74.44           C\nATOM   6541  CE1 PHE B  31     -39.136  26.545 -41.491  1.00 74.70           C\nATOM   6542  CE2 PHE B  31     -39.764  28.840 -41.887  1.00 76.68           C\nATOM   6543  CZ  PHE B  31     -39.834  27.686 -41.115  1.00 75.04           C\nATOM   6544  H   PHE B  31     -37.854  25.235 -45.470  1.00 69.51           H\nATOM   6545  HA  PHE B  31     -39.152  27.862 -46.036  1.00 68.56           H\nATOM   6546  HB3 PHE B  31     -37.080  28.725 -44.873  1.00 69.85           H\nATOM   6547  HB2 PHE B  31     -36.578  27.091 -44.573  1.00 69.85           H\nATOM   6548  HD1 PHE B  31     -37.823  25.658 -42.930  1.00 73.48           H\nATOM   6549  HD2 PHE B  31     -38.951  29.761 -43.642  1.00 74.44           H\nATOM   6550  HE1 PHE B  31     -39.208  25.645 -40.897  1.00 74.70           H\nATOM   6551  HE2 PHE B  31     -40.323  29.717 -41.596  1.00 76.68           H\nATOM   6552  HZ  PHE B  31     -40.444  27.672 -40.225  1.00 75.04           H\nATOM   6553  N   LEU B  32     -36.611  26.470 -47.592  1.00 64.79           N\nATOM   6554  CA  LEU B  32     -35.643  26.495 -48.687  1.00 61.90           C\nATOM   6555  C   LEU B  32     -35.922  25.312 -49.626  1.00 61.77           C\nATOM   6556  O   LEU B  32     -36.475  24.305 -49.190  1.00 62.38           O\nATOM   6557  CB  LEU B  32     -34.223  26.336 -48.083  1.00 60.66           C\nATOM   6558  CG  LEU B  32     -33.764  27.486 -47.156  1.00 57.94           C\nATOM   6559  CD1 LEU B  32     -32.619  27.034 -46.235  1.00 50.16           C\nATOM   6560  CD2 LEU B  32     -33.396  28.753 -47.952  1.00 52.59           C\nATOM   6561  H   LEU B  32     -36.627  25.611 -47.060  1.00 64.79           H\nATOM   6562  HA  LEU B  32     -35.713  27.423 -49.256  1.00 61.90           H\nATOM   6563  HB3 LEU B  32     -33.485  26.211 -48.878  1.00 60.66           H\nATOM   6564  HB2 LEU B  32     -34.198  25.402 -47.518  1.00 60.66           H\nATOM   6565  HG  LEU B  32     -34.587  27.754 -46.493  1.00 57.94           H\nATOM   6566 HD11 LEU B  32     -32.001  27.871 -45.915  1.00 50.16           H\nATOM   6567 HD12 LEU B  32     -33.014  26.572 -45.329  1.00 50.16           H\nATOM   6568 HD13 LEU B  32     -31.971  26.305 -46.722  1.00 50.16           H\nATOM   6569 HD21 LEU B  32     -33.926  29.615 -47.555  1.00 52.59           H\nATOM   6570 HD22 LEU B  32     -32.332  28.983 -47.903  1.00 52.59           H\nATOM   6571 HD23 LEU B  32     -33.654  28.671 -49.008  1.00 52.59           H\nATOM   6572  N   SER B  33     -35.465  25.411 -50.882  1.00 61.17           N\nATOM   6573  CA  SER B  33     -35.331  24.249 -51.768  1.00 61.23           C\nATOM   6574  C   SER B  33     -34.035  23.468 -51.454  1.00 60.93           C\nATOM   6575  O   SER B  33     -33.161  23.984 -50.754  1.00 61.06           O\nATOM   6576  CB  SER B  33     -35.421  24.716 -53.237  1.00 61.22           C\nATOM   6577  OG  SER B  33     -34.256  25.381 -53.678  1.00 61.39           O\nATOM   6578  H   SER B  33     -35.041  26.275 -51.196  1.00 61.17           H\nATOM   6579  HA  SER B  33     -36.173  23.576 -51.596  1.00 61.23           H\nATOM   6580  HB3 SER B  33     -36.281  25.371 -53.380  1.00 61.22           H\nATOM   6581  HB2 SER B  33     -35.577  23.856 -53.890  1.00 61.22           H\nATOM   6582  HG  SER B  33     -34.287  26.288 -53.358  1.00 61.39           H\nATOM   6583  N   GLU B  34     -33.920  22.243 -51.998  1.00 60.74           N\nATOM   6584  CA  GLU B  34     -32.706  21.418 -51.917  1.00 61.98           C\nATOM   6585  C   GLU B  34     -31.480  22.074 -52.577  1.00 61.74           C\nATOM   6586  O   GLU B  34     -30.372  21.946 -52.054  1.00 61.77           O\nATOM   6587  CB  GLU B  34     -32.959  20.032 -52.543  1.00 62.37           C\nATOM   6588  CG  GLU B  34     -34.013  19.191 -51.790  1.00 69.00           C\nATOM   6589  CD  GLU B  34     -34.235  17.769 -52.337  1.00 76.85           C\nATOM   6590  OE1 GLU B  34     -33.667  17.425 -53.399  1.00 78.91           O\nATOM   6591  OE2 GLU B  34     -34.986  17.031 -51.663  1.00 80.14           O1-\nATOM   6592  H   GLU B  34     -34.680  21.863 -52.543  1.00 60.74           H\nATOM   6593  HA  GLU B  34     -32.463  21.281 -50.863  1.00 61.98           H\nATOM   6594  HB3 GLU B  34     -32.018  19.479 -52.581  1.00 62.37           H\nATOM   6595  HB2 GLU B  34     -33.276  20.161 -53.580  1.00 62.37           H\nATOM   6596  HG3 GLU B  34     -34.973  19.708 -51.792  1.00 69.00           H\nATOM   6597  HG2 GLU B  34     -33.711  19.105 -50.747  1.00 69.00           H\nATOM   6598  N   GLU B  35     -31.719  22.792 -53.687  1.00 61.01           N\nATOM   6599  CA  GLU B  35     -30.721  23.569 -54.413  1.00 61.23           C\nATOM   6600  C   GLU B  35     -30.229  24.785 -53.605  1.00 59.42           C\nATOM   6601  O   GLU B  35     -29.020  24.986 -53.519  1.00 58.49           O\nATOM   6602  CB  GLU B  35     -31.296  23.941 -55.796  1.00 63.70           C\nATOM   6603  CG  GLU B  35     -30.327  24.747 -56.685  1.00 69.43           C\nATOM   6604  CD  GLU B  35     -30.806  24.992 -58.125  1.00 75.50           C\nATOM   6605  OE1 GLU B  35     -32.035  24.998 -58.360  1.00 77.70           O\nATOM   6606  OE2 GLU B  35     -29.914  25.210 -58.976  1.00 80.55           O1-\nATOM   6607  H   GLU B  35     -32.664  22.851 -54.040  1.00 61.01           H\nATOM   6608  HA  GLU B  35     -29.859  22.919 -54.579  1.00 61.23           H\nATOM   6609  HB3 GLU B  35     -32.224  24.500 -55.661  1.00 63.70           H\nATOM   6610  HB2 GLU B  35     -31.571  23.023 -56.317  1.00 63.70           H\nATOM   6611  HG3 GLU B  35     -29.361  24.240 -56.711  1.00 69.43           H\nATOM   6612  HG2 GLU B  35     -30.157  25.721 -56.230  1.00 69.43           H\nATOM   6613  N   GLU B  36     -31.165  25.529 -52.988  1.00 56.76           N\nATOM   6614  CA  GLU B  36     -30.887  26.664 -52.100  1.00 56.07           C\nATOM   6615  C   GLU B  36     -30.138  26.287 -50.812  1.00 55.18           C\nATOM   6616  O   GLU B  36     -29.319  27.082 -50.353  1.00 54.34           O\nATOM   6617  CB  GLU B  36     -32.197  27.403 -51.769  1.00 55.79           C\nATOM   6618  CG  GLU B  36     -32.735  28.226 -52.959  1.00 55.62           C\nATOM   6619  CD  GLU B  36     -34.086  28.917 -52.718  1.00 56.77           C\nATOM   6620  OE1 GLU B  36     -34.843  28.481 -51.822  1.00 60.03           O\nATOM   6621  OE2 GLU B  36     -34.358  29.881 -53.467  1.00 55.79           O1-\nATOM   6622  H   GLU B  36     -32.140  25.290 -53.108  1.00 56.76           H\nATOM   6623  HA  GLU B  36     -30.243  27.355 -52.645  1.00 56.07           H\nATOM   6624  HB3 GLU B  36     -32.055  28.064 -50.912  1.00 55.79           H\nATOM   6625  HB2 GLU B  36     -32.938  26.668 -51.454  1.00 55.79           H\nATOM   6626  HG3 GLU B  36     -32.833  27.594 -53.842  1.00 55.62           H\nATOM   6627  HG2 GLU B  36     -31.994  28.980 -53.225  1.00 55.62           H\nATOM   6628  N   TYR B  37     -30.401  25.083 -50.272  1.00 54.69           N\nATOM   6629  CA  TYR B  37     -29.695  24.544 -49.111  1.00 54.61           C\nATOM   6630  C   TYR B  37     -28.232  24.183 -49.439  1.00 53.70           C\nATOM   6631  O   TYR B  37     -27.359  24.459 -48.620  1.00 52.62           O\nATOM   6632  CB  TYR B  37     -30.477  23.354 -48.510  1.00 55.00           C\nATOM   6633  CG  TYR B  37     -29.946  22.871 -47.168  1.00 55.30           C\nATOM   6634  CD1 TYR B  37     -28.854  21.979 -47.112  1.00 52.52           C\nATOM   6635  CD2 TYR B  37     -30.518  23.344 -45.967  1.00 56.34           C\nATOM   6636  CE1 TYR B  37     -28.318  21.593 -45.870  1.00 53.21           C\nATOM   6637  CE2 TYR B  37     -29.993  22.939 -44.723  1.00 57.38           C\nATOM   6638  CZ  TYR B  37     -28.888  22.066 -44.674  1.00 54.67           C\nATOM   6639  OH  TYR B  37     -28.366  21.669 -43.478  1.00 56.97           O\nATOM   6640  H   TYR B  37     -31.109  24.491 -50.687  1.00 54.69           H\nATOM   6641  HA  TYR B  37     -29.672  25.329 -48.352  1.00 54.61           H\nATOM   6642  HB3 TYR B  37     -30.498  22.518 -49.211  1.00 55.00           H\nATOM   6643  HB2 TYR B  37     -31.520  23.646 -48.370  1.00 55.00           H\nATOM   6644  HD1 TYR B  37     -28.405  21.607 -48.021  1.00 52.52           H\nATOM   6645  HD2 TYR B  37     -31.354  24.027 -45.993  1.00 56.34           H\nATOM   6646  HE1 TYR B  37     -27.472  20.923 -45.836  1.00 53.21           H\nATOM   6647  HE2 TYR B  37     -30.435  23.308 -43.811  1.00 57.38           H\nATOM   6648  HH  TYR B  37     -28.800  22.064 -42.711  1.00 56.97           H\nATOM   6649  N   TRP B  38     -27.975  23.612 -50.632  1.00 53.30           N\nATOM   6650  CA  TRP B  38     -26.618  23.314 -51.103  1.00 54.16           C\nATOM   6651  C   TRP B  38     -25.823  24.589 -51.460  1.00 53.10           C\nATOM   6652  O   TRP B  38     -24.610  24.613 -51.266  1.00 53.08           O\nATOM   6653  CB  TRP B  38     -26.672  22.293 -52.263  1.00 54.36           C\nATOM   6654  CG  TRP B  38     -25.365  21.740 -52.774  1.00 61.32           C\nATOM   6655  CD1 TRP B  38     -24.212  21.636 -52.069  1.00 62.16           C\nATOM   6656  CD2 TRP B  38     -25.086  21.111 -54.065  1.00 65.21           C\nATOM   6657  NE1 TRP B  38     -23.231  21.068 -52.850  1.00 66.48           N\nATOM   6658  CE2 TRP B  38     -23.713  20.713 -54.091  1.00 65.69           C\nATOM   6659  CE3 TRP B  38     -25.852  20.834 -55.223  1.00 66.04           C\nATOM   6660  CZ2 TRP B  38     -23.127  20.095 -55.210  1.00 64.44           C\nATOM   6661  CZ3 TRP B  38     -25.279  20.202 -56.346  1.00 64.35           C\nATOM   6662  CH2 TRP B  38     -23.918  19.839 -56.343  1.00 63.68           C\nATOM   6663  H   TRP B  38     -28.734  23.400 -51.266  1.00 53.30           H\nATOM   6664  HA  TRP B  38     -26.100  22.833 -50.273  1.00 54.16           H\nATOM   6665  HB3 TRP B  38     -27.210  22.727 -53.107  1.00 54.36           H\nATOM   6666  HB2 TRP B  38     -27.262  21.434 -51.943  1.00 54.36           H\nATOM   6667  HD1 TRP B  38     -24.077  21.970 -51.052  1.00 62.16           H\nATOM   6668  HE1 TRP B  38     -22.288  20.934 -52.512  1.00 66.48           H\nATOM   6669  HE3 TRP B  38     -26.893  21.120 -55.250  1.00 66.04           H\nATOM   6670  HZ2 TRP B  38     -22.085  19.812 -55.197  1.00 64.44           H\nATOM   6671  HZ3 TRP B  38     -25.884  20.010 -57.220  1.00 64.35           H\nATOM   6672  HH2 TRP B  38     -23.479  19.368 -57.209  1.00 63.68           H\nATOM   6673  N   LYS B  39     -26.520  25.645 -51.911  1.00 52.27           N\nATOM   6674  CA  LYS B  39     -25.957  26.975 -52.152  1.00 52.65           C\nATOM   6675  C   LYS B  39     -25.530  27.709 -50.865  1.00 52.30           C\nATOM   6676  O   LYS B  39     -24.546  28.447 -50.913  1.00 51.45           O\nATOM   6677  CB  LYS B  39     -26.938  27.785 -53.021  1.00 52.88           C\nATOM   6678  CG  LYS B  39     -26.949  27.295 -54.482  1.00 52.60           C\nATOM   6679  CD  LYS B  39     -28.040  27.946 -55.341  1.00 55.82           C\nATOM   6680  CE  LYS B  39     -27.951  27.496 -56.809  1.00 56.58           C\nATOM   6681  NZ  LYS B  39     -29.014  28.089 -57.637  1.00 50.61           N1+\nATOM   6682  H   LYS B  39     -27.514  25.548 -52.070  1.00 52.27           H\nATOM   6683  HA  LYS B  39     -25.046  26.842 -52.734  1.00 52.65           H\nATOM   6684  HB3 LYS B  39     -26.663  28.840 -53.015  1.00 52.88           H\nATOM   6685  HB2 LYS B  39     -27.938  27.738 -52.592  1.00 52.88           H\nATOM   6686  HG3 LYS B  39     -27.062  26.213 -54.520  1.00 52.60           H\nATOM   6687  HG2 LYS B  39     -25.975  27.489 -54.928  1.00 52.60           H\nATOM   6688  HD3 LYS B  39     -27.958  29.032 -55.273  1.00 55.82           H\nATOM   6689  HD2 LYS B  39     -29.018  27.688 -54.930  1.00 55.82           H\nATOM   6690  HE3 LYS B  39     -28.016  26.411 -56.875  1.00 56.58           H\nATOM   6691  HE2 LYS B  39     -26.990  27.775 -57.237  1.00 56.58           H\nATOM   6692  HZ1 LYS B  39     -28.933  29.101 -57.617  1.00 50.61           H\nATOM   6693  HZ2 LYS B  39     -28.929  27.761 -58.589  1.00 50.61           H\nATOM   6694  HZ3 LYS B  39     -29.918  27.819 -57.276  1.00 50.61           H\nATOM   6695  N   LEU B  40     -26.209  27.436 -49.735  1.00 52.49           N\nATOM   6696  CA  LEU B  40     -25.792  27.862 -48.393  1.00 53.91           C\nATOM   6697  C   LEU B  40     -24.548  27.105 -47.902  1.00 53.75           C\nATOM   6698  O   LEU B  40     -23.663  27.739 -47.330  1.00 53.70           O\nATOM   6699  CB  LEU B  40     -26.951  27.682 -47.387  1.00 55.07           C\nATOM   6700  CG  LEU B  40     -28.063  28.738 -47.512  1.00 57.46           C\nATOM   6701  CD1 LEU B  40     -29.414  28.217 -46.990  1.00 61.08           C\nATOM   6702  CD2 LEU B  40     -27.659  30.062 -46.833  1.00 55.15           C\nATOM   6703  H   LEU B  40     -27.017  26.832 -49.777  1.00 52.49           H\nATOM   6704  HA  LEU B  40     -25.526  28.919 -48.437  1.00 53.91           H\nATOM   6705  HB3 LEU B  40     -26.580  27.693 -46.361  1.00 55.07           H\nATOM   6706  HB2 LEU B  40     -27.375  26.690 -47.525  1.00 55.07           H\nATOM   6707  HG  LEU B  40     -28.193  28.934 -48.575  1.00 57.46           H\nATOM   6708 HD11 LEU B  40     -29.883  28.918 -46.302  1.00 61.08           H\nATOM   6709 HD12 LEU B  40     -30.109  28.066 -47.816  1.00 61.08           H\nATOM   6710 HD13 LEU B  40     -29.321  27.264 -46.470  1.00 61.08           H\nATOM   6711 HD21 LEU B  40     -28.078  30.922 -47.355  1.00 55.15           H\nATOM   6712 HD22 LEU B  40     -28.008  30.107 -45.804  1.00 55.15           H\nATOM   6713 HD23 LEU B  40     -26.578  30.195 -46.802  1.00 55.15           H\nATOM   6714  N   GLN B  41     -24.486  25.783 -48.152  1.00 54.49           N\nATOM   6715  CA  GLN B  41     -23.338  24.933 -47.817  1.00 55.20           C\nATOM   6716  C   GLN B  41     -22.048  25.330 -48.550  1.00 53.99           C\nATOM   6717  O   GLN B  41     -20.993  25.352 -47.920  1.00 53.98           O\nATOM   6718  CB  GLN B  41     -23.670  23.451 -48.066  1.00 57.22           C\nATOM   6719  CG  GLN B  41     -24.663  22.866 -47.049  1.00 58.29           C\nATOM   6720  CD  GLN B  41     -24.928  21.389 -47.335  1.00 64.66           C\nATOM   6721  OE1 GLN B  41     -25.432  21.034 -48.397  1.00 67.66           O\nATOM   6722  NE2 GLN B  41     -24.586  20.524 -46.381  1.00 65.28           N\nATOM   6723  H   GLN B  41     -25.261  25.328 -48.614  1.00 54.49           H\nATOM   6724  HA  GLN B  41     -23.145  25.059 -46.749  1.00 55.20           H\nATOM   6725  HB3 GLN B  41     -22.751  22.863 -48.028  1.00 57.22           H\nATOM   6726  HB2 GLN B  41     -24.057  23.327 -49.076  1.00 57.22           H\nATOM   6727  HG3 GLN B  41     -25.611  23.400 -47.078  1.00 58.29           H\nATOM   6728  HG2 GLN B  41     -24.273  22.986 -46.037  1.00 58.29           H\nATOM   6729 HE22 GLN B  41     -24.671  19.529 -46.554  1.00 65.28           H\nATOM   6730 HE21 GLN B  41     -24.205  20.844 -45.504  1.00 65.28           H\nATOM   6731  N   ILE B  42     -22.167  25.682 -49.843  1.00 51.83           N\nATOM   6732  CA  ILE B  42     -21.093  26.255 -50.655  1.00 51.42           C\nATOM   6733  C   ILE B  42     -20.613  27.609 -50.093  1.00 50.43           C\nATOM   6734  O   ILE B  42     -19.410  27.786 -49.909  1.00 50.82           O\nATOM   6735  CB  ILE B  42     -21.534  26.440 -52.142  1.00 51.27           C\nATOM   6736  CG1 ILE B  42     -21.718  25.075 -52.847  1.00 49.08           C\nATOM   6737  CG2 ILE B  42     -20.597  27.336 -52.984  1.00 52.00           C\nATOM   6738  CD1 ILE B  42     -22.652  25.114 -54.066  1.00 44.79           C\nATOM   6739  H   ILE B  42     -23.069  25.603 -50.293  1.00 51.83           H\nATOM   6740  HA  ILE B  42     -20.249  25.562 -50.627  1.00 51.42           H\nATOM   6741  HB  ILE B  42     -22.511  26.925 -52.127  1.00 51.27           H\nATOM   6742 HG13 ILE B  42     -22.096  24.326 -52.151  1.00 49.08           H\nATOM   6743 HG12 ILE B  42     -20.746  24.711 -53.171  1.00 49.08           H\nATOM   6744 HG21 ILE B  42     -20.888  27.340 -54.033  1.00 52.00           H\nATOM   6745 HG22 ILE B  42     -20.612  28.379 -52.664  1.00 52.00           H\nATOM   6746 HG23 ILE B  42     -19.568  26.984 -52.925  1.00 52.00           H\nATOM   6747 HD11 ILE B  42     -23.008  24.113 -54.311  1.00 44.79           H\nATOM   6748 HD12 ILE B  42     -23.528  25.733 -53.890  1.00 44.79           H\nATOM   6749 HD13 ILE B  42     -22.143  25.510 -54.944  1.00 44.79           H\nATOM   6750  N   PHE B  43     -21.567  28.516 -49.820  1.00 49.87           N\nATOM   6751  CA  PHE B  43     -21.325  29.872 -49.330  1.00 50.10           C\nATOM   6752  C   PHE B  43     -20.604  29.938 -47.972  1.00 48.73           C\nATOM   6753  O   PHE B  43     -19.609  30.652 -47.867  1.00 49.68           O\nATOM   6754  CB  PHE B  43     -22.643  30.673 -49.373  1.00 50.38           C\nATOM   6755  CG  PHE B  43     -22.616  32.058 -48.748  1.00 51.11           C\nATOM   6756  CD1 PHE B  43     -22.040  33.139 -49.446  1.00 48.85           C\nATOM   6757  CD2 PHE B  43     -23.040  32.246 -47.415  1.00 50.79           C\nATOM   6758  CE1 PHE B  43     -21.969  34.389 -48.848  1.00 51.72           C\nATOM   6759  CE2 PHE B  43     -22.949  33.501 -46.831  1.00 51.85           C\nATOM   6760  CZ  PHE B  43     -22.423  34.568 -47.548  1.00 50.39           C\nATOM   6761  H   PHE B  43     -22.534  28.282 -49.998  1.00 49.87           H\nATOM   6762  HA  PHE B  43     -20.652  30.343 -50.050  1.00 50.10           H\nATOM   6763  HB3 PHE B  43     -23.442  30.099 -48.904  1.00 50.38           H\nATOM   6764  HB2 PHE B  43     -22.939  30.794 -50.416  1.00 50.38           H\nATOM   6765  HD1 PHE B  43     -21.670  33.003 -50.452  1.00 48.85           H\nATOM   6766  HD2 PHE B  43     -23.441  31.419 -46.849  1.00 50.79           H\nATOM   6767  HE1 PHE B  43     -21.560  35.225 -49.392  1.00 51.72           H\nATOM   6768  HE2 PHE B  43     -23.290  33.645 -45.817  1.00 51.85           H\nATOM   6769  HZ  PHE B  43     -22.361  35.544 -47.095  1.00 50.39           H\nATOM   6770  N   PHE B  44     -21.091  29.180 -46.972  1.00 47.55           N\nATOM   6771  CA  PHE B  44     -20.489  29.131 -45.637  1.00 46.58           C\nATOM   6772  C   PHE B  44     -19.153  28.369 -45.553  1.00 45.00           C\nATOM   6773  O   PHE B  44     -18.365  28.672 -44.658  1.00 44.03           O\nATOM   6774  CB  PHE B  44     -21.505  28.669 -44.573  1.00 48.77           C\nATOM   6775  CG  PHE B  44     -22.499  29.744 -44.161  1.00 46.53           C\nATOM   6776  CD1 PHE B  44     -22.051  30.882 -43.454  1.00 51.25           C\nATOM   6777  CD2 PHE B  44     -23.854  29.671 -44.550  1.00 49.91           C\nATOM   6778  CE1 PHE B  44     -22.939  31.904 -43.143  1.00 52.45           C\nATOM   6779  CE2 PHE B  44     -24.727  30.699 -44.221  1.00 48.40           C\nATOM   6780  CZ  PHE B  44     -24.270  31.813 -43.528  1.00 51.36           C\nATOM   6781  H   PHE B  44     -21.919  28.617 -47.120  1.00 47.55           H\nATOM   6782  HA  PHE B  44     -20.229  30.158 -45.383  1.00 46.58           H\nATOM   6783  HB3 PHE B  44     -20.973  28.366 -43.670  1.00 48.77           H\nATOM   6784  HB2 PHE B  44     -22.041  27.783 -44.916  1.00 48.77           H\nATOM   6785  HD1 PHE B  44     -21.015  30.966 -43.157  1.00 51.25           H\nATOM   6786  HD2 PHE B  44     -24.222  28.816 -45.096  1.00 49.91           H\nATOM   6787  HE1 PHE B  44     -22.593  32.771 -42.600  1.00 52.45           H\nATOM   6788  HE2 PHE B  44     -25.766  30.634 -44.507  1.00 48.40           H\nATOM   6789  HZ  PHE B  44     -24.955  32.610 -43.278  1.00 51.36           H\nATOM   6790  N   THR B  45     -18.883  27.454 -46.503  1.00 45.06           N\nATOM   6791  CA  THR B  45     -17.562  26.840 -46.689  1.00 44.49           C\nATOM   6792  C   THR B  45     -16.531  27.863 -47.213  1.00 45.16           C\nATOM   6793  O   THR B  45     -15.389  27.832 -46.755  1.00 43.34           O\nATOM   6794  CB  THR B  45     -17.630  25.632 -47.667  1.00 46.45           C\nATOM   6795  OG1 THR B  45     -18.287  24.575 -46.999  1.00 49.08           O\nATOM   6796  CG2 THR B  45     -16.298  25.082 -48.217  1.00 45.05           C\nATOM   6797  H   THR B  45     -19.579  27.231 -47.200  1.00 45.06           H\nATOM   6798  HA  THR B  45     -17.212  26.482 -45.718  1.00 44.49           H\nATOM   6799  HB  THR B  45     -18.252  25.898 -48.521  1.00 46.45           H\nATOM   6800  HG1 THR B  45     -18.108  23.755 -47.471  1.00 49.08           H\nATOM   6801 HG21 THR B  45     -16.470  24.223 -48.863  1.00 45.05           H\nATOM   6802 HG22 THR B  45     -15.765  25.815 -48.824  1.00 45.05           H\nATOM   6803 HG23 THR B  45     -15.637  24.763 -47.412  1.00 45.05           H\nATOM   6804  N   ASN B  46     -16.955  28.767 -48.116  1.00 45.99           N\nATOM   6805  CA  ASN B  46     -16.129  29.856 -48.653  1.00 46.05           C\nATOM   6806  C   ASN B  46     -15.855  30.957 -47.609  1.00 46.51           C\nATOM   6807  O   ASN B  46     -14.767  31.531 -47.634  1.00 49.89           O\nATOM   6808  CB  ASN B  46     -16.777  30.458 -49.924  1.00 46.08           C\nATOM   6809  CG  ASN B  46     -16.931  29.475 -51.093  1.00 48.15           C\nATOM   6810  OD1 ASN B  46     -16.237  28.463 -51.179  1.00 53.21           O\nATOM   6811  ND2 ASN B  46     -17.846  29.778 -52.014  1.00 46.07           N\nATOM   6812  H   ASN B  46     -17.908  28.725 -48.453  1.00 45.99           H\nATOM   6813  HA  ASN B  46     -15.167  29.423 -48.934  1.00 46.05           H\nATOM   6814  HB3 ASN B  46     -16.166  31.286 -50.286  1.00 46.08           H\nATOM   6815  HB2 ASN B  46     -17.752  30.883 -49.686  1.00 46.08           H\nATOM   6816 HD22 ASN B  46     -17.991  29.170 -52.805  1.00 46.07           H\nATOM   6817 HD21 ASN B  46     -18.396  30.627 -51.949  1.00 46.07           H\nATOM   6818  N   VAL B  47     -16.812  31.206 -46.695  1.00 46.49           N\nATOM   6819  CA  VAL B  47     -16.661  32.116 -45.555  1.00 46.50           C\nATOM   6820  C   VAL B  47     -15.642  31.588 -44.522  1.00 45.79           C\nATOM   6821  O   VAL B  47     -14.791  32.361 -44.088  1.00 45.09           O\nATOM   6822  CB  VAL B  47     -18.032  32.416 -44.873  1.00 46.62           C\nATOM   6823  CG1 VAL B  47     -17.966  33.040 -43.463  1.00 46.01           C\nATOM   6824  CG2 VAL B  47     -18.915  33.304 -45.769  1.00 45.80           C\nATOM   6825  H   VAL B  47     -17.695  30.717 -46.761  1.00 46.49           H\nATOM   6826  HA  VAL B  47     -16.265  33.059 -45.938  1.00 46.50           H\nATOM   6827  HB  VAL B  47     -18.551  31.466 -44.759  1.00 46.62           H\nATOM   6828 HG11 VAL B  47     -18.957  33.337 -43.118  1.00 46.01           H\nATOM   6829 HG12 VAL B  47     -17.583  32.334 -42.728  1.00 46.01           H\nATOM   6830 HG13 VAL B  47     -17.332  33.928 -43.448  1.00 46.01           H\nATOM   6831 HG21 VAL B  47     -19.922  33.400 -45.362  1.00 45.80           H\nATOM   6832 HG22 VAL B  47     -18.498  34.308 -45.858  1.00 45.80           H\nATOM   6833 HG23 VAL B  47     -19.011  32.903 -46.776  1.00 45.80           H\nATOM   6834  N   ILE B  48     -15.710  30.284 -44.193  1.00 45.61           N\nATOM   6835  CA  ILE B  48     -14.760  29.597 -43.306  1.00 45.30           C\nATOM   6836  C   ILE B  48     -13.339  29.498 -43.905  1.00 45.56           C\nATOM   6837  O   ILE B  48     -12.370  29.627 -43.155  1.00 45.36           O\nATOM   6838  CB  ILE B  48     -15.283  28.184 -42.893  1.00 44.67           C\nATOM   6839  CG1 ILE B  48     -16.487  28.324 -41.933  1.00 46.20           C\nATOM   6840  CG2 ILE B  48     -14.233  27.234 -42.267  1.00 40.45           C\nATOM   6841  CD1 ILE B  48     -17.316  27.041 -41.773  1.00 41.37           C\nATOM   6842  H   ILE B  48     -16.445  29.710 -44.584  1.00 45.61           H\nATOM   6843  HA  ILE B  48     -14.678  30.198 -42.398  1.00 45.30           H\nATOM   6844  HB  ILE B  48     -15.647  27.699 -43.801  1.00 44.67           H\nATOM   6845 HG13 ILE B  48     -17.155  29.114 -42.276  1.00 46.20           H\nATOM   6846 HG12 ILE B  48     -16.133  28.649 -40.953  1.00 46.20           H\nATOM   6847 HG21 ILE B  48     -14.689  26.308 -41.920  1.00 40.45           H\nATOM   6848 HG22 ILE B  48     -13.458  26.946 -42.978  1.00 40.45           H\nATOM   6849 HG23 ILE B  48     -13.747  27.694 -41.409  1.00 40.45           H\nATOM   6850 HD11 ILE B  48     -18.369  27.282 -41.637  1.00 41.37           H\nATOM   6851 HD12 ILE B  48     -17.240  26.393 -42.646  1.00 41.37           H\nATOM   6852 HD13 ILE B  48     -16.991  26.469 -40.902  1.00 41.37           H\nATOM   6853  N   GLN B  49     -13.243  29.326 -45.237  1.00 45.65           N\nATOM   6854  CA  GLN B  49     -11.989  29.351 -45.995  1.00 46.89           C\nATOM   6855  C   GLN B  49     -11.301  30.725 -45.920  1.00 46.50           C\nATOM   6856  O   GLN B  49     -10.107  30.780 -45.635  1.00 49.11           O\nATOM   6857  CB  GLN B  49     -12.253  28.908 -47.456  1.00 47.23           C\nATOM   6858  CG  GLN B  49     -11.011  28.798 -48.372  1.00 47.81           C\nATOM   6859  CD  GLN B  49     -10.036  27.688 -47.965  1.00 53.71           C\nATOM   6860  OE1 GLN B  49     -10.449  26.594 -47.588  1.00 56.18           O\nATOM   6861  NE2 GLN B  49      -8.732  27.947 -48.078  1.00 50.19           N\nATOM   6862  H   GLN B  49     -14.086  29.207 -45.782  1.00 45.65           H\nATOM   6863  HA  GLN B  49     -11.322  28.628 -45.533  1.00 46.89           H\nATOM   6864  HB3 GLN B  49     -12.953  29.602 -47.917  1.00 47.23           H\nATOM   6865  HB2 GLN B  49     -12.767  27.947 -47.452  1.00 47.23           H\nATOM   6866  HG3 GLN B  49     -10.490  29.755 -48.426  1.00 47.81           H\nATOM   6867  HG2 GLN B  49     -11.341  28.581 -49.388  1.00 47.81           H\nATOM   6868 HE22 GLN B  49      -8.049  27.238 -47.847  1.00 50.19           H\nATOM   6869 HE21 GLN B  49      -8.414  28.845 -48.428  1.00 50.19           H\nATOM   6870  N   ALA B  50     -12.082  31.797 -46.132  1.00 46.34           N\nATOM   6871  CA  ALA B  50     -11.632  33.186 -46.083  1.00 46.23           C\nATOM   6872  C   ALA B  50     -11.208  33.665 -44.683  1.00 46.98           C\nATOM   6873  O   ALA B  50     -10.254  34.437 -44.594  1.00 48.71           O\nATOM   6874  CB  ALA B  50     -12.737  34.080 -46.655  1.00 45.40           C\nATOM   6875  H   ALA B  50     -13.057  31.657 -46.362  1.00 46.34           H\nATOM   6876  HA  ALA B  50     -10.761  33.268 -46.736  1.00 46.23           H\nATOM   6877  HB1 ALA B  50     -12.438  35.127 -46.647  1.00 45.40           H\nATOM   6878  HB2 ALA B  50     -12.964  33.814 -47.688  1.00 45.40           H\nATOM   6879  HB3 ALA B  50     -13.656  33.985 -46.077  1.00 45.40           H\nATOM   6880  N   LEU B  51     -11.885  33.178 -43.626  1.00 49.57           N\nATOM   6881  CA  LEU B  51     -11.526  33.401 -42.218  1.00 49.76           C\nATOM   6882  C   LEU B  51     -10.183  32.756 -41.846  1.00 50.29           C\nATOM   6883  O   LEU B  51      -9.396  33.377 -41.131  1.00 51.88           O\nATOM   6884  CB  LEU B  51     -12.637  32.848 -41.295  1.00 50.15           C\nATOM   6885  CG  LEU B  51     -13.895  33.733 -41.188  1.00 50.96           C\nATOM   6886  CD1 LEU B  51     -15.068  32.945 -40.565  1.00 52.23           C\nATOM   6887  CD2 LEU B  51     -13.604  35.049 -40.436  1.00 50.82           C\nATOM   6888  H   LEU B  51     -12.679  32.572 -43.788  1.00 49.57           H\nATOM   6889  HA  LEU B  51     -11.420  34.474 -42.057  1.00 49.76           H\nATOM   6890  HB3 LEU B  51     -12.251  32.695 -40.285  1.00 50.15           H\nATOM   6891  HB2 LEU B  51     -12.919  31.856 -41.650  1.00 50.15           H\nATOM   6892  HG  LEU B  51     -14.199  34.011 -42.198  1.00 50.96           H\nATOM   6893 HD11 LEU B  51     -15.618  33.517 -39.819  1.00 52.23           H\nATOM   6894 HD12 LEU B  51     -15.785  32.660 -41.332  1.00 52.23           H\nATOM   6895 HD13 LEU B  51     -14.735  32.025 -40.083  1.00 52.23           H\nATOM   6896 HD21 LEU B  51     -13.807  35.909 -41.074  1.00 50.82           H\nATOM   6897 HD22 LEU B  51     -14.207  35.162 -39.535  1.00 50.82           H\nATOM   6898 HD23 LEU B  51     -12.563  35.126 -40.119  1.00 50.82           H\nATOM   6899  N   GLY B  52      -9.946  31.534 -42.350  1.00 50.76           N\nATOM   6900  CA  GLY B  52      -8.729  30.768 -42.106  1.00 50.32           C\nATOM   6901  C   GLY B  52      -7.526  31.349 -42.858  1.00 51.91           C\nATOM   6902  O   GLY B  52      -6.426  31.355 -42.312  1.00 49.81           O\nATOM   6903  H   GLY B  52     -10.652  31.095 -42.925  1.00 50.76           H\nATOM   6904  HA3 GLY B  52      -8.908  29.760 -42.464  1.00 50.32           H\nATOM   6905  HA2 GLY B  52      -8.522  30.708 -41.037  1.00 50.32           H\nATOM   6906  N   GLU B  53      -7.740  31.871 -44.079  1.00 53.83           N\nATOM   6907  CA  GLU B  53      -6.741  32.583 -44.881  1.00 55.35           C\nATOM   6908  C   GLU B  53      -6.317  33.931 -44.267  1.00 55.80           C\nATOM   6909  O   GLU B  53      -5.138  34.273 -44.352  1.00 55.87           O\nATOM   6910  CB  GLU B  53      -7.270  32.770 -46.318  1.00 56.13           C\nATOM   6911  CG  GLU B  53      -7.246  31.467 -47.151  1.00 59.16           C\nATOM   6912  CD  GLU B  53      -7.903  31.552 -48.541  1.00 64.15           C\nATOM   6913  OE1 GLU B  53      -8.573  32.565 -48.845  1.00 67.74           O\nATOM   6914  OE2 GLU B  53      -7.731  30.571 -49.296  1.00 65.30           O1-\nATOM   6915  H   GLU B  53      -8.663  31.801 -44.488  1.00 53.83           H\nATOM   6916  HA  GLU B  53      -5.844  31.962 -44.926  1.00 55.35           H\nATOM   6917  HB3 GLU B  53      -6.691  33.537 -46.838  1.00 56.13           H\nATOM   6918  HB2 GLU B  53      -8.290  33.153 -46.262  1.00 56.13           H\nATOM   6919  HG3 GLU B  53      -7.730  30.660 -46.601  1.00 59.16           H\nATOM   6920  HG2 GLU B  53      -6.209  31.154 -47.281  1.00 59.16           H\nATOM   6921  N   HIS B  54      -7.266  34.645 -43.634  1.00 56.68           N\nATOM   6922  CA  HIS B  54      -7.028  35.902 -42.916  1.00 56.82           C\nATOM   6923  C   HIS B  54      -6.173  35.701 -41.652  1.00 56.76           C\nATOM   6924  O   HIS B  54      -5.247  36.477 -41.419  1.00 55.72           O\nATOM   6925  CB  HIS B  54      -8.384  36.553 -42.571  1.00 57.83           C\nATOM   6926  CG  HIS B  54      -8.322  38.035 -42.298  1.00 61.53           C\nATOM   6927  ND1 HIS B  54      -7.942  38.562 -41.060  1.00 67.20           N\nATOM   6928  CD2 HIS B  54      -8.624  39.078 -43.150  1.00 63.06           C\nATOM   6929  CE1 HIS B  54      -8.030  39.877 -41.207  1.00 68.67           C\nATOM   6930  NE2 HIS B  54      -8.435  40.240 -42.424  1.00 66.65           N\nATOM   6931  H   HIS B  54      -8.214  34.294 -43.610  1.00 56.68           H\nATOM   6932  HA  HIS B  54      -6.492  36.562 -43.601  1.00 56.82           H\nATOM   6933  HB3 HIS B  54      -8.850  36.059 -41.717  1.00 57.83           H\nATOM   6934  HB2 HIS B  54      -9.078  36.419 -43.397  1.00 57.83           H\nATOM   6935  HD2 HIS B  54      -8.961  39.086 -44.176  1.00 63.06           H\nATOM   6936  HE1 HIS B  54      -7.812  40.581 -40.417  1.00 68.67           H\nATOM   6937  HE2 HIS B  54      -8.598  41.185 -42.747  1.00 66.65           H\nATOM   6938  N   LEU B  55      -6.491  34.645 -40.885  1.00 56.18           N\nATOM   6939  CA  LEU B  55      -5.797  34.247 -39.658  1.00 54.72           C\nATOM   6940  C   LEU B  55      -4.487  33.469 -39.912  1.00 56.69           C\nATOM   6941  O   LEU B  55      -3.768  33.207 -38.947  1.00 56.42           O\nATOM   6942  CB  LEU B  55      -6.783  33.438 -38.782  1.00 52.33           C\nATOM   6943  CG  LEU B  55      -7.929  34.291 -38.184  1.00 50.51           C\nATOM   6944  CD1 LEU B  55      -9.062  33.400 -37.634  1.00 46.19           C\nATOM   6945  CD2 LEU B  55      -7.419  35.297 -37.130  1.00 46.49           C\nATOM   6946  H   LEU B  55      -7.279  34.068 -41.150  1.00 56.18           H\nATOM   6947  HA  LEU B  55      -5.513  35.150 -39.117  1.00 54.72           H\nATOM   6948  HB3 LEU B  55      -6.256  32.941 -37.965  1.00 52.33           H\nATOM   6949  HB2 LEU B  55      -7.201  32.636 -39.393  1.00 52.33           H\nATOM   6950  HG  LEU B  55      -8.373  34.872 -38.993  1.00 50.51           H\nATOM   6951 HD11 LEU B  55     -10.014  33.650 -38.104  1.00 46.19           H\nATOM   6952 HD12 LEU B  55      -8.878  32.344 -37.826  1.00 46.19           H\nATOM   6953 HD13 LEU B  55      -9.195  33.502 -36.558  1.00 46.19           H\nATOM   6954 HD21 LEU B  55      -8.083  35.380 -36.269  1.00 46.49           H\nATOM   6955 HD22 LEU B  55      -6.436  35.023 -36.749  1.00 46.49           H\nATOM   6956 HD23 LEU B  55      -7.336  36.296 -37.559  1.00 46.49           H\nATOM   6957  N   LYS B  56      -4.190  33.145 -41.186  1.00 58.84           N\nATOM   6958  CA  LYS B  56      -2.986  32.461 -41.681  1.00 58.97           C\nATOM   6959  C   LYS B  56      -2.848  31.014 -41.161  1.00 58.80           C\nATOM   6960  O   LYS B  56      -1.742  30.569 -40.851  1.00 60.94           O\nATOM   6961  CB  LYS B  56      -1.716  33.318 -41.446  1.00 59.62           C\nATOM   6962  CG  LYS B  56      -1.770  34.700 -42.121  0.00 58.99           C\nATOM   6963  CD  LYS B  56      -0.471  35.494 -41.925  0.00 59.02           C\nATOM   6964  CE  LYS B  56      -0.528  36.882 -42.582  0.00 58.98           C\nATOM   6965  NZ  LYS B  56       0.731  37.626 -42.394  0.00 58.97           N1+\nATOM   6966  H   LYS B  56      -4.851  33.406 -41.904  1.00 58.84           H\nATOM   6967  HA  LYS B  56      -3.125  32.369 -42.759  1.00 58.97           H\nATOM   6968  HB3 LYS B  56      -0.847  32.787 -41.835  1.00 59.62           H\nATOM   6969  HB2 LYS B  56      -1.536  33.443 -40.378  1.00 59.62           H\nATOM   6970  HG3 LYS B  56      -2.605  35.276 -41.719  1.00 58.99           H\nATOM   6971  HG2 LYS B  56      -1.969  34.577 -43.186  1.00 58.99           H\nATOM   6972  HD3 LYS B  56       0.362  34.922 -42.336  1.00 59.02           H\nATOM   6973  HD2 LYS B  56      -0.275  35.598 -40.856  1.00 59.02           H\nATOM   6974  HE3 LYS B  56      -1.347  37.466 -42.161  1.00 58.98           H\nATOM   6975  HE2 LYS B  56      -0.719  36.785 -43.652  1.00 58.98           H\nATOM   6976  HZ1 LYS B  56       1.494  37.110 -42.807  1.00 58.97           H\nATOM   6977  HZ2 LYS B  56       0.658  38.531 -42.838  1.00 58.97           H\nATOM   6978  HZ3 LYS B  56       0.906  37.751 -41.407  1.00 58.97           H\nATOM   6979  N   LEU B  57      -3.986  30.308 -41.083  1.00 58.64           N\nATOM   6980  CA  LEU B  57      -4.088  28.915 -40.653  1.00 57.12           C\nATOM   6981  C   LEU B  57      -3.784  27.966 -41.822  1.00 55.76           C\nATOM   6982  O   LEU B  57      -4.125  28.275 -42.965  1.00 56.49           O\nATOM   6983  CB  LEU B  57      -5.518  28.658 -40.125  1.00 57.00           C\nATOM   6984  CG  LEU B  57      -5.934  29.536 -38.922  1.00 56.02           C\nATOM   6985  CD1 LEU B  57      -7.422  29.328 -38.580  1.00 56.16           C\nATOM   6986  CD2 LEU B  57      -5.021  29.342 -37.694  1.00 50.52           C\nATOM   6987  H   LEU B  57      -4.851  30.738 -41.384  1.00 58.64           H\nATOM   6988  HA  LEU B  57      -3.366  28.730 -39.856  1.00 57.12           H\nATOM   6989  HB3 LEU B  57      -5.620  27.608 -39.845  1.00 57.00           H\nATOM   6990  HB2 LEU B  57      -6.227  28.817 -40.940  1.00 57.00           H\nATOM   6991  HG  LEU B  57      -5.841  30.579 -39.227  1.00 56.02           H\nATOM   6992 HD11 LEU B  57      -7.942  30.285 -38.551  1.00 56.16           H\nATOM   6993 HD12 LEU B  57      -7.931  28.710 -39.320  1.00 56.16           H\nATOM   6994 HD13 LEU B  57      -7.572  28.847 -37.614  1.00 56.16           H\nATOM   6995 HD21 LEU B  57      -5.578  29.325 -36.757  1.00 50.52           H\nATOM   6996 HD22 LEU B  57      -4.455  28.412 -37.748  1.00 50.52           H\nATOM   6997 HD23 LEU B  57      -4.304  30.160 -37.618  1.00 50.52           H\nATOM   6998  N   ARG B  58      -3.193  26.802 -41.500  1.00 54.86           N\nATOM   6999  CA  ARG B  58      -2.967  25.703 -42.446  1.00 54.87           C\nATOM   7000  C   ARG B  58      -4.297  25.042 -42.858  1.00 53.75           C\nATOM   7001  O   ARG B  58      -5.253  25.065 -42.084  1.00 53.65           O\nATOM   7002  CB  ARG B  58      -1.955  24.708 -41.833  1.00 55.85           C\nATOM   7003  CG  ARG B  58      -2.482  23.819 -40.689  1.00 61.49           C\nATOM   7004  CD  ARG B  58      -1.347  23.081 -39.958  1.00 66.31           C\nATOM   7005  NE  ARG B  58      -1.850  22.038 -39.045  1.00 68.64           N\nATOM   7006  CZ  ARG B  58      -1.870  20.708 -39.258  1.00 72.07           C\nATOM   7007  NH1 ARG B  58      -1.385  20.152 -40.378  1.00 75.05           N\nATOM   7008  NH2 ARG B  58      -2.393  19.909 -38.320  1.00 73.73           N1+\nATOM   7009  H   ARG B  58      -2.947  26.620 -40.539  1.00 54.86           H\nATOM   7010  HA  ARG B  58      -2.509  26.135 -43.338  1.00 54.87           H\nATOM   7011  HB3 ARG B  58      -1.077  25.259 -41.495  1.00 55.85           H\nATOM   7012  HB2 ARG B  58      -1.597  24.049 -42.626  1.00 55.85           H\nATOM   7013  HG3 ARG B  58      -3.271  23.136 -41.008  1.00 61.49           H\nATOM   7014  HG2 ARG B  58      -2.941  24.499 -39.971  1.00 61.49           H\nATOM   7015  HD3 ARG B  58      -0.879  23.795 -39.279  1.00 66.31           H\nATOM   7016  HD2 ARG B  58      -0.550  22.754 -40.628  1.00 66.31           H\nATOM   7017  HE  ARG B  58      -2.230  22.373 -38.170  1.00 68.64           H\nATOM   7018 HH12 ARG B  58      -1.407  19.152 -40.511  1.00 75.05           H\nATOM   7019 HH11 ARG B  58      -1.009  20.742 -41.107  1.00 75.05           H\nATOM   7020 HH22 ARG B  58      -2.430  18.910 -38.449  1.00 73.73           H\nATOM   7021 HH21 ARG B  58      -2.758  20.304 -37.459  1.00 73.73           H\nATOM   7022  N   GLN B  59      -4.330  24.475 -44.075  1.00 52.21           N\nATOM   7023  CA  GLN B  59      -5.542  23.971 -44.734  1.00 51.93           C\nATOM   7024  C   GLN B  59      -6.284  22.851 -43.971  1.00 51.78           C\nATOM   7025  O   GLN B  59      -7.500  22.737 -44.117  1.00 52.05           O\nATOM   7026  CB  GLN B  59      -5.170  23.541 -46.173  1.00 50.44           C\nATOM   7027  CG  GLN B  59      -6.359  23.227 -47.107  1.00 51.82           C\nATOM   7028  CD  GLN B  59      -7.288  24.428 -47.324  1.00 53.86           C\nATOM   7029  OE1 GLN B  59      -6.828  25.528 -47.622  1.00 56.00           O\nATOM   7030  NE2 GLN B  59      -8.599  24.225 -47.192  1.00 55.07           N\nATOM   7031  H   GLN B  59      -3.495  24.481 -44.643  1.00 52.21           H\nATOM   7032  HA  GLN B  59      -6.224  24.821 -44.787  1.00 51.93           H\nATOM   7033  HB3 GLN B  59      -4.514  22.670 -46.131  1.00 50.44           H\nATOM   7034  HB2 GLN B  59      -4.575  24.329 -46.637  1.00 50.44           H\nATOM   7035  HG3 GLN B  59      -6.927  22.380 -46.725  1.00 51.82           H\nATOM   7036  HG2 GLN B  59      -5.976  22.919 -48.079  1.00 51.82           H\nATOM   7037 HE22 GLN B  59      -9.245  24.992 -47.334  1.00 55.07           H\nATOM   7038 HE21 GLN B  59      -8.967  23.317 -46.943  1.00 55.07           H\nATOM   7039  N   GLN B  60      -5.556  22.076 -43.150  1.00 51.28           N\nATOM   7040  CA  GLN B  60      -6.094  21.030 -42.280  1.00 52.53           C\nATOM   7041  C   GLN B  60      -6.936  21.582 -41.114  1.00 51.36           C\nATOM   7042  O   GLN B  60      -7.935  20.958 -40.768  1.00 51.03           O\nATOM   7043  CB  GLN B  60      -4.952  20.136 -41.747  1.00 54.71           C\nATOM   7044  CG  GLN B  60      -4.228  19.290 -42.820  1.00 61.20           C\nATOM   7045  CD  GLN B  60      -3.072  19.991 -43.548  1.00 67.85           C\nATOM   7046  OE1 GLN B  60      -2.782  21.166 -43.328  1.00 65.90           O\nATOM   7047  NE2 GLN B  60      -2.387  19.250 -44.419  1.00 72.04           N\nATOM   7048  H   GLN B  60      -4.555  22.216 -43.103  1.00 51.28           H\nATOM   7049  HA  GLN B  60      -6.754  20.406 -42.886  1.00 52.53           H\nATOM   7050  HB3 GLN B  60      -5.382  19.439 -41.025  1.00 54.71           H\nATOM   7051  HB2 GLN B  60      -4.239  20.730 -41.174  1.00 54.71           H\nATOM   7052  HG3 GLN B  60      -4.943  18.912 -43.551  1.00 61.20           H\nATOM   7053  HG2 GLN B  60      -3.803  18.412 -42.332  1.00 61.20           H\nATOM   7054 HE22 GLN B  60      -1.610  19.654 -44.920  1.00 72.04           H\nATOM   7055 HE21 GLN B  60      -2.640  18.287 -44.586  1.00 72.04           H\nATOM   7056  N   VAL B  61      -6.543  22.741 -40.553  1.00 49.58           N\nATOM   7057  CA  VAL B  61      -7.281  23.459 -39.503  1.00 48.52           C\nATOM   7058  C   VAL B  61      -8.574  24.098 -40.046  1.00 47.87           C\nATOM   7059  O   VAL B  61      -9.591  24.089 -39.352  1.00 46.71           O\nATOM   7060  CB  VAL B  61      -6.400  24.567 -38.851  1.00 49.52           C\nATOM   7061  CG1 VAL B  61      -7.139  25.548 -37.913  1.00 48.85           C\nATOM   7062  CG2 VAL B  61      -5.223  23.939 -38.092  1.00 49.32           C\nATOM   7063  H   VAL B  61      -5.722  23.209 -40.909  1.00 49.58           H\nATOM   7064  HA  VAL B  61      -7.562  22.739 -38.731  1.00 48.52           H\nATOM   7065  HB  VAL B  61      -5.969  25.172 -39.648  1.00 49.52           H\nATOM   7066 HG11 VAL B  61      -6.438  26.213 -37.406  1.00 48.85           H\nATOM   7067 HG12 VAL B  61      -7.838  26.189 -38.451  1.00 48.85           H\nATOM   7068 HG13 VAL B  61      -7.697  25.011 -37.147  1.00 48.85           H\nATOM   7069 HG21 VAL B  61      -4.545  24.706 -37.719  1.00 49.32           H\nATOM   7070 HG22 VAL B  61      -5.583  23.362 -37.241  1.00 49.32           H\nATOM   7071 HG23 VAL B  61      -4.642  23.268 -38.723  1.00 49.32           H\nATOM   7072  N   ILE B  62      -8.512  24.602 -41.289  1.00 46.22           N\nATOM   7073  CA  ILE B  62      -9.646  25.158 -42.027  1.00 46.48           C\nATOM   7074  C   ILE B  62     -10.680  24.068 -42.382  1.00 45.11           C\nATOM   7075  O   ILE B  62     -11.881  24.313 -42.267  1.00 44.55           O\nATOM   7076  CB  ILE B  62      -9.176  25.862 -43.334  1.00 47.43           C\nATOM   7077  CG1 ILE B  62      -8.147  26.972 -43.013  1.00 48.74           C\nATOM   7078  CG2 ILE B  62     -10.344  26.430 -44.168  1.00 45.19           C\nATOM   7079  CD1 ILE B  62      -7.599  27.725 -44.237  1.00 53.58           C\nATOM   7080  H   ILE B  62      -7.632  24.575 -41.786  1.00 46.22           H\nATOM   7081  HA  ILE B  62     -10.138  25.895 -41.388  1.00 46.48           H\nATOM   7082  HB  ILE B  62      -8.668  25.126 -43.958  1.00 47.43           H\nATOM   7083 HG13 ILE B  62      -7.297  26.559 -42.475  1.00 48.74           H\nATOM   7084 HG12 ILE B  62      -8.603  27.672 -42.318  1.00 48.74           H\nATOM   7085 HG21 ILE B  62      -9.972  26.921 -45.062  1.00 45.19           H\nATOM   7086 HG22 ILE B  62     -11.027  25.658 -44.520  1.00 45.19           H\nATOM   7087 HG23 ILE B  62     -10.920  27.159 -43.598  1.00 45.19           H\nATOM   7088 HD11 ILE B  62      -6.644  28.195 -44.006  1.00 53.58           H\nATOM   7089 HD12 ILE B  62      -7.441  27.054 -45.081  1.00 53.58           H\nATOM   7090 HD13 ILE B  62      -8.280  28.514 -44.557  1.00 53.58           H\nATOM   7091  N   ALA B  63     -10.186  22.877 -42.760  1.00 44.34           N\nATOM   7092  CA  ALA B  63     -10.984  21.686 -43.030  1.00 44.73           C\nATOM   7093  C   ALA B  63     -11.670  21.121 -41.776  1.00 44.98           C\nATOM   7094  O   ALA B  63     -12.825  20.713 -41.875  1.00 46.64           O\nATOM   7095  CB  ALA B  63     -10.092  20.633 -43.697  1.00 43.65           C\nATOM   7096  H   ALA B  63      -9.185  22.768 -42.856  1.00 44.34           H\nATOM   7097  HA  ALA B  63     -11.766  21.962 -43.741  1.00 44.73           H\nATOM   7098  HB1 ALA B  63     -10.652  19.725 -43.910  1.00 43.65           H\nATOM   7099  HB2 ALA B  63      -9.695  21.003 -44.642  1.00 43.65           H\nATOM   7100  HB3 ALA B  63      -9.247  20.358 -43.067  1.00 43.65           H\nATOM   7101  N   THR B  64     -10.972  21.137 -40.623  1.00 43.39           N\nATOM   7102  CA  THR B  64     -11.502  20.736 -39.312  1.00 43.67           C\nATOM   7103  C   THR B  64     -12.656  21.652 -38.855  1.00 43.95           C\nATOM   7104  O   THR B  64     -13.658  21.143 -38.357  1.00 43.88           O\nATOM   7105  CB  THR B  64     -10.389  20.744 -38.223  1.00 43.65           C\nATOM   7106  OG1 THR B  64      -9.448  19.729 -38.502  1.00 43.44           O\nATOM   7107  CG2 THR B  64     -10.841  20.532 -36.770  1.00 39.80           C\nATOM   7108  H   THR B  64     -10.012  21.455 -40.629  1.00 43.39           H\nATOM   7109  HA  THR B  64     -11.896  19.721 -39.403  1.00 43.67           H\nATOM   7110  HB  THR B  64      -9.848  21.688 -38.273  1.00 43.65           H\nATOM   7111  HG1 THR B  64      -8.798  19.715 -37.794  1.00 43.44           H\nATOM   7112 HG21 THR B  64      -9.987  20.452 -36.096  1.00 39.80           H\nATOM   7113 HG22 THR B  64     -11.440  21.368 -36.414  1.00 39.80           H\nATOM   7114 HG23 THR B  64     -11.432  19.622 -36.668  1.00 39.80           H\nATOM   7115  N   ALA B  65     -12.516  22.969 -39.091  1.00 42.97           N\nATOM   7116  CA  ALA B  65     -13.545  23.978 -38.846  1.00 43.89           C\nATOM   7117  C   ALA B  65     -14.785  23.816 -39.743  1.00 42.84           C\nATOM   7118  O   ALA B  65     -15.904  24.003 -39.268  1.00 42.84           O\nATOM   7119  CB  ALA B  65     -12.928  25.368 -39.041  1.00 43.27           C\nATOM   7120  H   ALA B  65     -11.654  23.308 -39.497  1.00 42.97           H\nATOM   7121  HA  ALA B  65     -13.861  23.885 -37.805  1.00 43.89           H\nATOM   7122  HB1 ALA B  65     -13.642  26.155 -38.800  1.00 43.27           H\nATOM   7123  HB2 ALA B  65     -12.057  25.492 -38.399  1.00 43.27           H\nATOM   7124  HB3 ALA B  65     -12.600  25.530 -40.067  1.00 43.27           H\nATOM   7125  N   THR B  66     -14.576  23.438 -41.015  1.00 44.04           N\nATOM   7126  CA  THR B  66     -15.661  23.183 -41.964  1.00 42.98           C\nATOM   7127  C   THR B  66     -16.450  21.898 -41.632  1.00 43.71           C\nATOM   7128  O   THR B  66     -17.664  21.876 -41.832  1.00 45.23           O\nATOM   7129  CB  THR B  66     -15.153  23.100 -43.425  1.00 43.23           C\nATOM   7130  OG1 THR B  66     -14.417  24.266 -43.733  1.00 40.93           O\nATOM   7131  CG2 THR B  66     -16.271  22.979 -44.475  1.00 37.39           C\nATOM   7132  H   THR B  66     -13.633  23.296 -41.349  1.00 44.04           H\nATOM   7133  HA  THR B  66     -16.360  24.021 -41.900  1.00 42.98           H\nATOM   7134  HB  THR B  66     -14.470  22.256 -43.537  1.00 43.23           H\nATOM   7135  HG1 THR B  66     -13.641  24.301 -43.163  1.00 40.93           H\nATOM   7136 HG21 THR B  66     -15.901  23.202 -45.473  1.00 37.39           H\nATOM   7137 HG22 THR B  66     -16.692  21.974 -44.495  1.00 37.39           H\nATOM   7138 HG23 THR B  66     -17.081  23.681 -44.275  1.00 37.39           H\nATOM   7139  N   VAL B  67     -15.765  20.884 -41.074  1.00 44.80           N\nATOM   7140  CA  VAL B  67     -16.377  19.659 -40.560  1.00 44.29           C\nATOM   7141  C   VAL B  67     -17.213  19.902 -39.285  1.00 45.44           C\nATOM   7142  O   VAL B  67     -18.305  19.346 -39.201  1.00 46.38           O\nATOM   7143  CB  VAL B  67     -15.322  18.536 -40.328  1.00 45.49           C\nATOM   7144  CG1 VAL B  67     -15.797  17.355 -39.455  1.00 44.52           C\nATOM   7145  CG2 VAL B  67     -14.819  17.989 -41.676  1.00 40.81           C\nATOM   7146  H   VAL B  67     -14.765  20.968 -40.949  1.00 44.80           H\nATOM   7147  HA  VAL B  67     -17.069  19.302 -41.326  1.00 44.29           H\nATOM   7148  HB  VAL B  67     -14.460  18.979 -39.827  1.00 45.49           H\nATOM   7149 HG11 VAL B  67     -15.088  16.530 -39.474  1.00 44.52           H\nATOM   7150 HG12 VAL B  67     -15.907  17.647 -38.411  1.00 44.52           H\nATOM   7151 HG13 VAL B  67     -16.752  16.963 -39.806  1.00 44.52           H\nATOM   7152 HG21 VAL B  67     -13.989  17.296 -41.549  1.00 40.81           H\nATOM   7153 HG22 VAL B  67     -15.612  17.452 -42.193  1.00 40.81           H\nATOM   7154 HG23 VAL B  67     -14.481  18.785 -42.337  1.00 40.81           H\nATOM   7155  N   TYR B  68     -16.739  20.753 -38.352  1.00 44.37           N\nATOM   7156  CA  TYR B  68     -17.484  21.152 -37.145  1.00 44.42           C\nATOM   7157  C   TYR B  68     -18.820  21.845 -37.466  1.00 45.45           C\nATOM   7158  O   TYR B  68     -19.824  21.556 -36.814  1.00 44.68           O\nATOM   7159  CB  TYR B  68     -16.648  22.110 -36.270  1.00 44.86           C\nATOM   7160  CG  TYR B  68     -15.382  21.611 -35.597  1.00 46.15           C\nATOM   7161  CD1 TYR B  68     -14.991  20.252 -35.602  1.00 45.09           C\nATOM   7162  CD2 TYR B  68     -14.594  22.558 -34.912  1.00 44.88           C\nATOM   7163  CE1 TYR B  68     -13.825  19.851 -34.921  1.00 46.97           C\nATOM   7164  CE2 TYR B  68     -13.431  22.158 -34.236  1.00 45.26           C\nATOM   7165  CZ  TYR B  68     -13.043  20.808 -34.245  1.00 47.75           C\nATOM   7166  OH  TYR B  68     -11.893  20.442 -33.614  1.00 42.37           O\nATOM   7167  H   TYR B  68     -15.824  21.168 -38.471  1.00 44.37           H\nATOM   7168  HA  TYR B  68     -17.713  20.249 -36.577  1.00 44.42           H\nATOM   7169  HB3 TYR B  68     -17.275  22.481 -35.458  1.00 44.86           H\nATOM   7170  HB2 TYR B  68     -16.377  22.986 -36.858  1.00 44.86           H\nATOM   7171  HD1 TYR B  68     -15.577  19.504 -36.114  1.00 45.09           H\nATOM   7172  HD2 TYR B  68     -14.886  23.597 -34.896  1.00 44.88           H\nATOM   7173  HE1 TYR B  68     -13.533  18.812 -34.923  1.00 46.97           H\nATOM   7174  HE2 TYR B  68     -12.834  22.889 -33.715  1.00 45.26           H\nATOM   7175  HH  TYR B  68     -11.673  19.511 -33.724  1.00 42.37           H\nATOM   7176  N   PHE B  69     -18.792  22.725 -38.481  1.00 44.39           N\nATOM   7177  CA  PHE B  69     -19.944  23.449 -39.015  1.00 42.67           C\nATOM   7178  C   PHE B  69     -20.982  22.489 -39.628  1.00 43.34           C\nATOM   7179  O   PHE B  69     -22.168  22.612 -39.327  1.00 45.20           O\nATOM   7180  CB  PHE B  69     -19.419  24.498 -40.023  1.00 44.14           C\nATOM   7181  CG  PHE B  69     -20.442  25.450 -40.618  1.00 42.48           C\nATOM   7182  CD1 PHE B  69     -21.235  25.059 -41.718  1.00 39.81           C\nATOM   7183  CD2 PHE B  69     -20.694  26.691 -39.996  1.00 43.31           C\nATOM   7184  CE1 PHE B  69     -22.217  25.912 -42.203  1.00 39.50           C\nATOM   7185  CE2 PHE B  69     -21.670  27.536 -40.506  1.00 39.73           C\nATOM   7186  CZ  PHE B  69     -22.431  27.145 -41.600  1.00 42.22           C\nATOM   7187  H   PHE B  69     -17.911  22.907 -38.942  1.00 44.39           H\nATOM   7188  HA  PHE B  69     -20.418  23.978 -38.185  1.00 42.67           H\nATOM   7189  HB3 PHE B  69     -18.910  23.996 -40.846  1.00 44.14           H\nATOM   7190  HB2 PHE B  69     -18.652  25.102 -39.537  1.00 44.14           H\nATOM   7191  HD1 PHE B  69     -21.083  24.096 -42.184  1.00 39.81           H\nATOM   7192  HD2 PHE B  69     -20.118  26.997 -39.135  1.00 43.31           H\nATOM   7193  HE1 PHE B  69     -22.822  25.615 -43.047  1.00 39.50           H\nATOM   7194  HE2 PHE B  69     -21.849  28.493 -40.039  1.00 39.73           H\nATOM   7195  HZ  PHE B  69     -23.198  27.800 -41.985  1.00 42.22           H\nATOM   7196  N   LYS B  70     -20.504  21.526 -40.437  1.00 44.32           N\nATOM   7197  CA  LYS B  70     -21.319  20.492 -41.078  1.00 44.07           C\nATOM   7198  C   LYS B  70     -21.982  19.507 -40.108  1.00 46.22           C\nATOM   7199  O   LYS B  70     -23.131  19.150 -40.350  1.00 44.55           O\nATOM   7200  CB  LYS B  70     -20.484  19.739 -42.125  1.00 43.60           C\nATOM   7201  CG  LYS B  70     -20.308  20.536 -43.420  1.00 43.38           C\nATOM   7202  CD  LYS B  70     -19.502  19.751 -44.463  1.00 45.20           C\nATOM   7203  CE  LYS B  70     -19.248  20.532 -45.756  1.00 46.40           C\nATOM   7204  NZ  LYS B  70     -20.482  20.831 -46.507  1.00 46.32           N1+\nATOM   7205  H   LYS B  70     -19.513  21.489 -40.630  1.00 44.32           H\nATOM   7206  HA  LYS B  70     -22.129  21.011 -41.597  1.00 44.07           H\nATOM   7207  HB3 LYS B  70     -20.986  18.809 -42.389  1.00 43.60           H\nATOM   7208  HB2 LYS B  70     -19.519  19.449 -41.710  1.00 43.60           H\nATOM   7209  HG3 LYS B  70     -19.818  21.487 -43.213  1.00 43.38           H\nATOM   7210  HG2 LYS B  70     -21.292  20.784 -43.819  1.00 43.38           H\nATOM   7211  HD3 LYS B  70     -20.003  18.808 -44.689  1.00 45.20           H\nATOM   7212  HD2 LYS B  70     -18.539  19.480 -44.028  1.00 45.20           H\nATOM   7213  HE3 LYS B  70     -18.584  19.951 -46.397  1.00 46.40           H\nATOM   7214  HE2 LYS B  70     -18.742  21.470 -45.530  1.00 46.40           H\nATOM   7215  HZ1 LYS B  70     -20.240  21.319 -47.358  1.00 46.32           H\nATOM   7216  HZ2 LYS B  70     -20.958  19.969 -46.738  1.00 46.32           H\nATOM   7217  HZ3 LYS B  70     -21.082  21.418 -45.946  1.00 46.32           H\nATOM   7218  N   ARG B  71     -21.281  19.110 -39.030  1.00 48.54           N\nATOM   7219  CA  ARG B  71     -21.827  18.270 -37.957  1.00 49.35           C\nATOM   7220  C   ARG B  71     -22.964  18.965 -37.189  1.00 49.77           C\nATOM   7221  O   ARG B  71     -23.918  18.286 -36.808  1.00 48.71           O\nATOM   7222  CB  ARG B  71     -20.713  17.871 -36.970  1.00 50.46           C\nATOM   7223  CG  ARG B  71     -19.697  16.871 -37.540  1.00 52.96           C\nATOM   7224  CD  ARG B  71     -18.522  16.658 -36.577  1.00 53.27           C\nATOM   7225  NE  ARG B  71     -17.583  15.645 -37.082  1.00 57.28           N\nATOM   7226  CZ  ARG B  71     -16.509  15.147 -36.444  1.00 57.40           C\nATOM   7227  NH1 ARG B  71     -16.164  15.537 -35.207  1.00 56.51           N\nATOM   7228  NH2 ARG B  71     -15.761  14.231 -37.069  1.00 51.02           N1+\nATOM   7229  H   ARG B  71     -20.328  19.427 -38.912  1.00 48.54           H\nATOM   7230  HA  ARG B  71     -22.239  17.363 -38.403  1.00 49.35           H\nATOM   7231  HB3 ARG B  71     -21.157  17.413 -36.084  1.00 50.46           H\nATOM   7232  HB2 ARG B  71     -20.198  18.765 -36.615  1.00 50.46           H\nATOM   7233  HG3 ARG B  71     -19.320  17.244 -38.489  1.00 52.96           H\nATOM   7234  HG2 ARG B  71     -20.180  15.925 -37.784  1.00 52.96           H\nATOM   7235  HD3 ARG B  71     -18.880  16.400 -35.579  1.00 53.27           H\nATOM   7236  HD2 ARG B  71     -17.962  17.590 -36.485  1.00 53.27           H\nATOM   7237  HE  ARG B  71     -17.774  15.301 -38.013  1.00 57.28           H\nATOM   7238 HH12 ARG B  71     -15.374  15.107 -34.743  1.00 56.51           H\nATOM   7239 HH11 ARG B  71     -16.709  16.233 -34.718  1.00 56.51           H\nATOM   7240 HH22 ARG B  71     -14.980  13.802 -36.589  1.00 51.02           H\nATOM   7241 HH21 ARG B  71     -15.991  13.932 -38.008  1.00 51.02           H\nATOM   7242  N   PHE B  72     -22.847  20.291 -36.990  1.00 48.90           N\nATOM   7243  CA  PHE B  72     -23.828  21.098 -36.270  1.00 48.69           C\nATOM   7244  C   PHE B  72     -25.172  21.194 -37.012  1.00 48.44           C\nATOM   7245  O   PHE B  72     -26.211  20.898 -36.420  1.00 49.44           O\nATOM   7246  CB  PHE B  72     -23.221  22.469 -35.890  1.00 48.73           C\nATOM   7247  CG  PHE B  72     -24.079  23.303 -34.953  1.00 51.46           C\nATOM   7248  CD1 PHE B  72     -25.135  24.086 -35.463  1.00 51.34           C\nATOM   7249  CD2 PHE B  72     -23.952  23.158 -33.554  1.00 52.77           C\nATOM   7250  CE1 PHE B  72     -26.014  24.722 -34.599  1.00 50.49           C\nATOM   7251  CE2 PHE B  72     -24.847  23.795 -32.703  1.00 52.32           C\nATOM   7252  CZ  PHE B  72     -25.877  24.568 -33.226  1.00 50.04           C\nATOM   7253  H   PHE B  72     -22.030  20.778 -37.333  1.00 48.90           H\nATOM   7254  HA  PHE B  72     -24.037  20.576 -35.345  1.00 48.69           H\nATOM   7255  HB3 PHE B  72     -23.009  23.050 -36.789  1.00 48.73           H\nATOM   7256  HB2 PHE B  72     -22.257  22.313 -35.403  1.00 48.73           H\nATOM   7257  HD1 PHE B  72     -25.270  24.174 -36.529  1.00 51.34           H\nATOM   7258  HD2 PHE B  72     -23.176  22.533 -33.138  1.00 52.77           H\nATOM   7259  HE1 PHE B  72     -26.814  25.325 -34.999  1.00 50.49           H\nATOM   7260  HE2 PHE B  72     -24.750  23.677 -31.634  1.00 52.32           H\nATOM   7261  HZ  PHE B  72     -26.578  25.049 -32.561  1.00 50.04           H\nATOM   7262  N   TYR B  73     -25.114  21.570 -38.300  1.00 48.33           N\nATOM   7263  CA  TYR B  73     -26.287  21.731 -39.162  1.00 47.44           C\nATOM   7264  C   TYR B  73     -26.770  20.422 -39.821  1.00 48.04           C\nATOM   7265  O   TYR B  73     -27.841  20.431 -40.424  1.00 50.10           O\nATOM   7266  CB  TYR B  73     -26.026  22.874 -40.167  1.00 47.02           C\nATOM   7267  CG  TYR B  73     -25.845  24.222 -39.484  1.00 47.23           C\nATOM   7268  CD1 TYR B  73     -26.923  24.817 -38.792  1.00 45.60           C\nATOM   7269  CD2 TYR B  73     -24.587  24.858 -39.486  1.00 48.64           C\nATOM   7270  CE1 TYR B  73     -26.731  26.014 -38.073  1.00 47.70           C\nATOM   7271  CE2 TYR B  73     -24.395  26.048 -38.761  1.00 46.47           C\nATOM   7272  CZ  TYR B  73     -25.461  26.620 -38.045  1.00 47.22           C\nATOM   7273  OH  TYR B  73     -25.253  27.750 -37.314  1.00 52.24           O\nATOM   7274  H   TYR B  73     -24.219  21.792 -38.716  1.00 48.33           H\nATOM   7275  HA  TYR B  73     -27.116  22.051 -38.530  1.00 47.44           H\nATOM   7276  HB3 TYR B  73     -26.856  22.968 -40.866  1.00 47.02           H\nATOM   7277  HB2 TYR B  73     -25.149  22.644 -40.773  1.00 47.02           H\nATOM   7278  HD1 TYR B  73     -27.893  24.342 -38.788  1.00 45.60           H\nATOM   7279  HD2 TYR B  73     -23.758  24.427 -40.024  1.00 48.64           H\nATOM   7280  HE1 TYR B  73     -27.553  26.449 -37.523  1.00 47.70           H\nATOM   7281  HE2 TYR B  73     -23.423  26.514 -38.739  1.00 46.47           H\nATOM   7282  HH  TYR B  73     -26.059  28.103 -36.920  1.00 52.24           H\nATOM   7283  N   ALA B  74     -26.041  19.307 -39.634  1.00 49.24           N\nATOM   7284  CA  ALA B  74     -26.512  17.956 -39.959  1.00 49.92           C\nATOM   7285  C   ALA B  74     -27.589  17.437 -38.986  1.00 52.31           C\nATOM   7286  O   ALA B  74     -28.342  16.542 -39.370  1.00 54.24           O\nATOM   7287  CB  ALA B  74     -25.324  16.980 -39.997  1.00 48.88           C\nATOM   7288  H   ALA B  74     -25.153  19.365 -39.156  1.00 49.24           H\nATOM   7289  HA  ALA B  74     -26.954  17.976 -40.957  1.00 49.92           H\nATOM   7290  HB1 ALA B  74     -25.654  15.943 -40.071  1.00 48.88           H\nATOM   7291  HB2 ALA B  74     -24.692  17.170 -40.863  1.00 48.88           H\nATOM   7292  HB3 ALA B  74     -24.707  17.060 -39.103  1.00 48.88           H\nATOM   7293  N   ARG B  75     -27.636  18.000 -37.766  1.00 52.90           N\nATOM   7294  CA  ARG B  75     -28.506  17.563 -36.675  1.00 55.00           C\nATOM   7295  C   ARG B  75     -29.581  18.609 -36.316  1.00 55.33           C\nATOM   7296  O   ARG B  75     -30.675  18.205 -35.922  1.00 56.45           O\nATOM   7297  CB  ARG B  75     -27.599  17.203 -35.477  1.00 56.22           C\nATOM   7298  CG  ARG B  75     -28.322  16.613 -34.253  0.00 55.32           C\nATOM   7299  CD  ARG B  75     -27.337  16.204 -33.145  0.00 55.47           C\nATOM   7300  NE  ARG B  75     -28.020  15.537 -32.023  0.00 55.42           N\nATOM   7301  CZ  ARG B  75     -27.465  15.103 -30.875  0.00 55.43           C\nATOM   7302  NH1 ARG B  75     -26.155  15.246 -30.612  0.00 55.43           N\nATOM   7303  NH2 ARG B  75     -28.246  14.509 -29.964  0.00 55.38           N1+\nATOM   7304  H   ARG B  75     -26.981  18.735 -37.541  1.00 52.90           H\nATOM   7305  HA  ARG B  75     -29.038  16.655 -36.966  1.00 55.00           H\nATOM   7306  HB3 ARG B  75     -27.036  18.085 -35.170  1.00 56.22           H\nATOM   7307  HB2 ARG B  75     -26.854  16.480 -35.814  1.00 56.22           H\nATOM   7308  HG3 ARG B  75     -28.969  15.781 -34.534  1.00 55.32           H\nATOM   7309  HG2 ARG B  75     -28.980  17.384 -33.853  1.00 55.32           H\nATOM   7310  HD3 ARG B  75     -26.888  17.106 -32.730  1.00 55.47           H\nATOM   7311  HD2 ARG B  75     -26.518  15.600 -33.538  1.00 55.47           H\nATOM   7312  HE  ARG B  75     -29.012  15.395 -32.150  1.00 55.42           H\nATOM   7313 HH12 ARG B  75     -25.763  14.915 -29.742  1.00 55.43           H\nATOM   7314 HH11 ARG B  75     -25.547  15.692 -31.284  1.00 55.43           H\nATOM   7315 HH22 ARG B  75     -27.854  14.177 -29.094  1.00 55.38           H\nATOM   7316 HH21 ARG B  75     -29.233  14.389 -30.136  1.00 55.38           H\nATOM   7317  N   TYR B  76     -29.274  19.913 -36.456  1.00 55.88           N\nATOM   7318  CA  TYR B  76     -30.174  21.021 -36.107  1.00 56.45           C\nATOM   7319  C   TYR B  76     -30.411  21.963 -37.293  1.00 57.31           C\nATOM   7320  O   TYR B  76     -29.675  21.943 -38.279  1.00 58.05           O\nATOM   7321  CB  TYR B  76     -29.600  21.813 -34.911  1.00 57.60           C\nATOM   7322  CG  TYR B  76     -29.698  21.100 -33.577  1.00 62.26           C\nATOM   7323  CD1 TYR B  76     -30.794  21.320 -32.717  1.00 68.40           C\nATOM   7324  CD2 TYR B  76     -28.683  20.210 -33.193  1.00 62.47           C\nATOM   7325  CE1 TYR B  76     -30.857  20.660 -31.472  1.00 70.82           C\nATOM   7326  CE2 TYR B  76     -28.738  19.557 -31.947  1.00 67.28           C\nATOM   7327  CZ  TYR B  76     -29.825  19.784 -31.084  1.00 70.92           C\nATOM   7328  OH  TYR B  76     -29.874  19.152 -29.876  1.00 78.75           O\nATOM   7329  H   TYR B  76     -28.359  20.179 -36.794  1.00 55.88           H\nATOM   7330  HA  TYR B  76     -31.152  20.634 -35.818  1.00 56.45           H\nATOM   7331  HB3 TYR B  76     -30.137  22.755 -34.791  1.00 57.60           H\nATOM   7332  HB2 TYR B  76     -28.562  22.096 -35.101  1.00 57.60           H\nATOM   7333  HD1 TYR B  76     -31.583  21.999 -33.004  1.00 68.40           H\nATOM   7334  HD2 TYR B  76     -27.870  20.036 -33.877  1.00 62.47           H\nATOM   7335  HE1 TYR B  76     -31.697  20.837 -30.816  1.00 70.82           H\nATOM   7336  HE2 TYR B  76     -27.949  18.882 -31.653  1.00 67.28           H\nATOM   7337  HH  TYR B  76     -30.645  19.389 -29.357  1.00 78.75           H\nATOM   7338  N   SER B  77     -31.455  22.792 -37.134  1.00 56.31           N\nATOM   7339  CA  SER B  77     -31.867  23.869 -38.031  1.00 56.74           C\nATOM   7340  C   SER B  77     -30.823  25.001 -38.132  1.00 55.38           C\nATOM   7341  O   SER B  77     -30.071  25.229 -37.185  1.00 52.67           O\nATOM   7342  CB  SER B  77     -33.213  24.406 -37.491  1.00 56.94           C\nATOM   7343  OG  SER B  77     -33.733  25.476 -38.252  1.00 57.92           O\nATOM   7344  H   SER B  77     -31.992  22.722 -36.282  1.00 56.31           H\nATOM   7345  HA  SER B  77     -32.016  23.437 -39.020  1.00 56.74           H\nATOM   7346  HB3 SER B  77     -33.098  24.742 -36.459  1.00 56.94           H\nATOM   7347  HB2 SER B  77     -33.966  23.621 -37.477  1.00 56.94           H\nATOM   7348  HG  SER B  77     -33.948  25.141 -39.133  1.00 57.92           H\nATOM   7349  N   LEU B  78     -30.867  25.746 -39.250  1.00 55.15           N\nATOM   7350  CA  LEU B  78     -30.175  27.027 -39.438  1.00 55.65           C\nATOM   7351  C   LEU B  78     -30.664  28.142 -38.484  1.00 55.05           C\nATOM   7352  O   LEU B  78     -29.919  29.098 -38.273  1.00 54.34           O\nATOM   7353  CB  LEU B  78     -30.316  27.477 -40.912  1.00 56.37           C\nATOM   7354  CG  LEU B  78     -29.462  26.669 -41.919  1.00 54.85           C\nATOM   7355  CD1 LEU B  78     -29.924  26.917 -43.372  1.00 51.65           C\nATOM   7356  CD2 LEU B  78     -27.946  26.910 -41.728  1.00 53.19           C\nATOM   7357  H   LEU B  78     -31.491  25.470 -39.999  1.00 55.15           H\nATOM   7358  HA  LEU B  78     -29.121  26.872 -39.215  1.00 55.65           H\nATOM   7359  HB3 LEU B  78     -30.051  28.531 -41.015  1.00 56.37           H\nATOM   7360  HB2 LEU B  78     -31.370  27.413 -41.188  1.00 56.37           H\nATOM   7361  HG  LEU B  78     -29.638  25.613 -41.718  1.00 54.85           H\nATOM   7362 HD11 LEU B  78     -29.139  27.330 -44.004  1.00 51.65           H\nATOM   7363 HD12 LEU B  78     -30.253  25.987 -43.836  1.00 51.65           H\nATOM   7364 HD13 LEU B  78     -30.763  27.611 -43.423  1.00 51.65           H\nATOM   7365 HD21 LEU B  78     -27.437  25.976 -41.489  1.00 53.19           H\nATOM   7366 HD22 LEU B  78     -27.463  27.316 -42.616  1.00 53.19           H\nATOM   7367 HD23 LEU B  78     -27.737  27.606 -40.916  1.00 53.19           H\nATOM   7368  N   LYS B  79     -31.877  27.999 -37.915  1.00 54.58           N\nATOM   7369  CA  LYS B  79     -32.463  28.939 -36.956  1.00 54.95           C\nATOM   7370  C   LYS B  79     -31.892  28.790 -35.536  1.00 53.20           C\nATOM   7371  O   LYS B  79     -31.932  29.767 -34.792  1.00 52.89           O\nATOM   7372  CB  LYS B  79     -34.005  28.796 -36.972  1.00 56.05           C\nATOM   7373  CG  LYS B  79     -34.653  27.727 -36.068  1.00 60.83           C\nATOM   7374  CD  LYS B  79     -36.071  27.367 -36.549  1.00 67.05           C\nATOM   7375  CE  LYS B  79     -36.773  26.270 -35.729  1.00 70.16           C\nATOM   7376  NZ  LYS B  79     -37.290  26.761 -34.439  1.00 71.76           N1+\nATOM   7377  H   LYS B  79     -32.438  27.188 -38.141  1.00 54.58           H\nATOM   7378  HA  LYS B  79     -32.227  29.952 -37.291  1.00 54.95           H\nATOM   7379  HB3 LYS B  79     -34.320  28.640 -38.001  1.00 56.05           H\nATOM   7380  HB2 LYS B  79     -34.436  29.751 -36.680  1.00 56.05           H\nATOM   7381  HG3 LYS B  79     -34.694  28.095 -35.042  1.00 60.83           H\nATOM   7382  HG2 LYS B  79     -34.037  26.830 -36.040  1.00 60.83           H\nATOM   7383  HD3 LYS B  79     -36.010  27.019 -37.580  1.00 67.05           H\nATOM   7384  HD2 LYS B  79     -36.685  28.269 -36.581  1.00 67.05           H\nATOM   7385  HE3 LYS B  79     -36.104  25.425 -35.563  1.00 70.16           H\nATOM   7386  HE2 LYS B  79     -37.625  25.892 -36.295  1.00 70.16           H\nATOM   7387  HZ1 LYS B  79     -36.526  27.073 -33.852  1.00 71.76           H\nATOM   7388  HZ2 LYS B  79     -37.921  27.535 -34.592  1.00 71.76           H\nATOM   7389  HZ3 LYS B  79     -37.780  26.020 -33.961  1.00 71.76           H\nATOM   7390  N   SER B  80     -31.402  27.584 -35.186  1.00 53.35           N\nATOM   7391  CA  SER B  80     -30.955  27.201 -33.842  1.00 53.00           C\nATOM   7392  C   SER B  80     -29.859  28.118 -33.268  1.00 51.51           C\nATOM   7393  O   SER B  80     -30.033  28.670 -32.181  1.00 50.58           O\nATOM   7394  CB  SER B  80     -30.594  25.700 -33.822  1.00 52.63           C\nATOM   7395  OG  SER B  80     -29.379  25.394 -34.472  1.00 61.43           O\nATOM   7396  H   SER B  80     -31.379  26.852 -35.881  1.00 53.35           H\nATOM   7397  HA  SER B  80     -31.829  27.306 -33.203  1.00 53.00           H\nATOM   7398  HB3 SER B  80     -31.395  25.104 -34.261  1.00 52.63           H\nATOM   7399  HB2 SER B  80     -30.493  25.370 -32.794  1.00 52.63           H\nATOM   7400  HG  SER B  80     -29.525  25.407 -35.425  1.00 61.43           H\nATOM   7401  N   ILE B  81     -28.796  28.306 -34.060  1.00 49.49           N\nATOM   7402  CA  ILE B  81     -27.749  29.305 -33.889  1.00 48.52           C\nATOM   7403  C   ILE B  81     -27.453  29.838 -35.302  1.00 48.70           C\nATOM   7404  O   ILE B  81     -27.480  29.061 -36.259  1.00 48.99           O\nATOM   7405  CB  ILE B  81     -26.440  28.708 -33.275  1.00 48.80           C\nATOM   7406  CG1 ILE B  81     -26.721  28.005 -31.922  1.00 47.83           C\nATOM   7407  CG2 ILE B  81     -25.334  29.778 -33.118  1.00 42.80           C\nATOM   7408  CD1 ILE B  81     -25.495  27.422 -31.204  1.00 45.51           C\nATOM   7409  H   ILE B  81     -28.755  27.802 -34.935  1.00 49.49           H\nATOM   7410  HA  ILE B  81     -28.115  30.127 -33.271  1.00 48.52           H\nATOM   7411  HB  ILE B  81     -26.056  27.946 -33.957  1.00 48.80           H\nATOM   7412 HG13 ILE B  81     -27.428  27.191 -32.073  1.00 47.83           H\nATOM   7413 HG12 ILE B  81     -27.218  28.694 -31.246  1.00 47.83           H\nATOM   7414 HG21 ILE B  81     -24.441  29.369 -32.653  1.00 42.80           H\nATOM   7415 HG22 ILE B  81     -25.009  30.186 -34.074  1.00 42.80           H\nATOM   7416 HG23 ILE B  81     -25.674  30.608 -32.499  1.00 42.80           H\nATOM   7417 HD11 ILE B  81     -25.798  26.647 -30.501  1.00 45.51           H\nATOM   7418 HD12 ILE B  81     -24.796  26.974 -31.906  1.00 45.51           H\nATOM   7419 HD13 ILE B  81     -24.963  28.185 -30.635  1.00 45.51           H\nATOM   7420  N   ASP B  82     -27.190  31.151 -35.413  1.00 48.90           N\nATOM   7421  CA  ASP B  82     -26.909  31.846 -36.673  1.00 48.88           C\nATOM   7422  C   ASP B  82     -25.584  31.322 -37.283  1.00 48.09           C\nATOM   7423  O   ASP B  82     -24.571  31.374 -36.584  1.00 48.02           O\nATOM   7424  CB  ASP B  82     -26.840  33.374 -36.404  1.00 48.52           C\nATOM   7425  CG  ASP B  82     -26.733  34.322 -37.618  1.00 47.78           C\nATOM   7426  OD1 ASP B  82     -26.874  33.874 -38.775  1.00 47.65           O\nATOM   7427  OD2 ASP B  82     -26.587  35.536 -37.361  1.00 44.77           O1-\nATOM   7428  H   ASP B  82     -27.175  31.726 -34.581  1.00 48.90           H\nATOM   7429  HA  ASP B  82     -27.769  31.650 -37.311  1.00 48.88           H\nATOM   7430  HB3 ASP B  82     -26.014  33.584 -35.720  1.00 48.52           H\nATOM   7431  HB2 ASP B  82     -27.733  33.660 -35.848  1.00 48.52           H\nATOM   7432  N   PRO B  83     -25.586  30.827 -38.547  1.00 48.52           N\nATOM   7433  CA  PRO B  83     -24.347  30.380 -39.219  1.00 48.99           C\nATOM   7434  C   PRO B  83     -23.248  31.449 -39.419  1.00 49.56           C\nATOM   7435  O   PRO B  83     -22.092  31.071 -39.607  1.00 50.32           O\nATOM   7436  CB  PRO B  83     -24.834  29.765 -40.539  1.00 49.14           C\nATOM   7437  CG  PRO B  83     -26.170  30.434 -40.806  1.00 48.94           C\nATOM   7438  CD  PRO B  83     -26.750  30.592 -39.409  1.00 49.05           C\nATOM   7439  HA  PRO B  83     -23.898  29.587 -38.626  1.00 48.99           H\nATOM   7440  HB3 PRO B  83     -24.988  28.694 -40.402  1.00 49.14           H\nATOM   7441  HB2 PRO B  83     -24.135  29.886 -41.365  1.00 49.14           H\nATOM   7442  HG3 PRO B  83     -26.813  29.873 -41.484  1.00 48.94           H\nATOM   7443  HG2 PRO B  83     -26.005  31.421 -41.239  1.00 48.94           H\nATOM   7444  HD2 PRO B  83     -27.494  31.386 -39.408  1.00 49.05           H\nATOM   7445  HD3 PRO B  83     -27.238  29.670 -39.089  1.00 49.05           H\nATOM   7446  N   VAL B  84     -23.601  32.744 -39.317  1.00 49.87           N\nATOM   7447  CA  VAL B  84     -22.656  33.867 -39.280  1.00 49.46           C\nATOM   7448  C   VAL B  84     -21.816  33.891 -37.983  1.00 49.27           C\nATOM   7449  O   VAL B  84     -20.641  34.247 -38.050  1.00 50.58           O\nATOM   7450  CB  VAL B  84     -23.396  35.229 -39.431  1.00 50.11           C\nATOM   7451  CG1 VAL B  84     -22.522  36.488 -39.236  1.00 47.68           C\nATOM   7452  CG2 VAL B  84     -24.115  35.310 -40.788  1.00 47.76           C\nATOM   7453  H   VAL B  84     -24.574  32.985 -39.182  1.00 49.87           H\nATOM   7454  HA  VAL B  84     -21.967  33.753 -40.119  1.00 49.46           H\nATOM   7455  HB  VAL B  84     -24.167  35.276 -38.663  1.00 50.11           H\nATOM   7456 HG11 VAL B  84     -23.076  37.395 -39.480  1.00 47.68           H\nATOM   7457 HG12 VAL B  84     -22.187  36.601 -38.204  1.00 47.68           H\nATOM   7458 HG13 VAL B  84     -21.640  36.458 -39.876  1.00 47.68           H\nATOM   7459 HG21 VAL B  84     -24.640  36.258 -40.902  1.00 47.76           H\nATOM   7460 HG22 VAL B  84     -23.403  35.217 -41.607  1.00 47.76           H\nATOM   7461 HG23 VAL B  84     -24.856  34.518 -40.902  1.00 47.76           H\nATOM   7462  N   LEU B  85     -22.417  33.487 -36.849  1.00 48.51           N\nATOM   7463  CA  LEU B  85     -21.753  33.333 -35.552  1.00 47.85           C\nATOM   7464  C   LEU B  85     -20.983  32.003 -35.449  1.00 47.47           C\nATOM   7465  O   LEU B  85     -19.894  31.992 -34.874  1.00 47.86           O\nATOM   7466  CB  LEU B  85     -22.812  33.482 -34.429  1.00 47.05           C\nATOM   7467  CG  LEU B  85     -22.332  33.289 -32.969  1.00 48.68           C\nATOM   7468  CD1 LEU B  85     -21.233  34.296 -32.566  1.00 45.57           C\nATOM   7469  CD2 LEU B  85     -23.530  33.308 -31.996  1.00 47.57           C\nATOM   7470  H   LEU B  85     -23.384  33.196 -36.882  1.00 48.51           H\nATOM   7471  HA  LEU B  85     -21.026  34.140 -35.453  1.00 47.85           H\nATOM   7472  HB3 LEU B  85     -23.614  32.766 -34.608  1.00 47.05           H\nATOM   7473  HB2 LEU B  85     -23.276  34.462 -34.515  1.00 47.05           H\nATOM   7474  HG  LEU B  85     -21.895  32.295 -32.881  1.00 48.68           H\nATOM   7475 HD11 LEU B  85     -20.332  33.770 -32.254  1.00 45.57           H\nATOM   7476 HD12 LEU B  85     -20.955  34.965 -33.379  1.00 45.57           H\nATOM   7477 HD13 LEU B  85     -21.533  34.935 -31.739  1.00 45.57           H\nATOM   7478 HD21 LEU B  85     -23.319  33.838 -31.068  1.00 47.57           H\nATOM   7479 HD22 LEU B  85     -24.408  33.777 -32.440  1.00 47.57           H\nATOM   7480 HD23 LEU B  85     -23.814  32.293 -31.718  1.00 47.57           H\nATOM   7481  N   MET B  86     -21.552  30.917 -36.004  1.00 49.58           N\nATOM   7482  CA  MET B  86     -20.991  29.565 -35.940  1.00 49.46           C\nATOM   7483  C   MET B  86     -19.696  29.388 -36.755  1.00 48.27           C\nATOM   7484  O   MET B  86     -18.816  28.660 -36.301  1.00 49.33           O\nATOM   7485  CB  MET B  86     -22.076  28.539 -36.341  1.00 48.66           C\nATOM   7486  CG  MET B  86     -21.680  27.054 -36.211  1.00 51.68           C\nATOM   7487  SD  MET B  86     -21.135  26.510 -34.569  1.00 53.67           S\nATOM   7488  CE  MET B  86     -22.708  26.585 -33.685  1.00 51.02           C\nATOM   7489  H   MET B  86     -22.456  31.007 -36.448  1.00 49.58           H\nATOM   7490  HA  MET B  86     -20.739  29.386 -34.894  1.00 49.46           H\nATOM   7491  HB3 MET B  86     -22.350  28.714 -37.379  1.00 48.66           H\nATOM   7492  HB2 MET B  86     -22.982  28.721 -35.762  1.00 48.66           H\nATOM   7493  HG3 MET B  86     -20.889  26.814 -36.919  1.00 51.68           H\nATOM   7494  HG2 MET B  86     -22.527  26.430 -36.497  1.00 51.68           H\nATOM   7495  HE1 MET B  86     -22.581  26.239 -32.659  1.00 51.02           H\nATOM   7496  HE2 MET B  86     -23.094  27.602 -33.669  1.00 51.02           H\nATOM   7497  HE3 MET B  86     -23.444  25.959 -34.180  1.00 51.02           H\nATOM   7498  N   ALA B  87     -19.591  30.054 -37.919  1.00 46.49           N\nATOM   7499  CA  ALA B  87     -18.426  30.010 -38.810  1.00 46.22           C\nATOM   7500  C   ALA B  87     -17.081  30.420 -38.156  1.00 44.95           C\nATOM   7501  O   ALA B  87     -16.175  29.584 -38.161  1.00 46.05           O\nATOM   7502  CB  ALA B  87     -18.732  30.797 -40.097  1.00 44.03           C\nATOM   7503  H   ALA B  87     -20.364  30.627 -38.231  1.00 46.49           H\nATOM   7504  HA  ALA B  87     -18.311  28.966 -39.109  1.00 46.22           H\nATOM   7505  HB1 ALA B  87     -17.834  30.948 -40.696  1.00 44.03           H\nATOM   7506  HB2 ALA B  87     -19.447  30.253 -40.717  1.00 44.03           H\nATOM   7507  HB3 ALA B  87     -19.168  31.775 -39.892  1.00 44.03           H\nATOM   7508  N   PRO B  88     -16.959  31.633 -37.557  1.00 44.25           N\nATOM   7509  CA  PRO B  88     -15.746  32.017 -36.807  1.00 43.75           C\nATOM   7510  C   PRO B  88     -15.530  31.252 -35.486  1.00 44.35           C\nATOM   7511  O   PRO B  88     -14.377  31.112 -35.082  1.00 43.33           O\nATOM   7512  CB  PRO B  88     -15.905  33.530 -36.578  1.00 44.33           C\nATOM   7513  CG  PRO B  88     -17.406  33.756 -36.581  1.00 44.57           C\nATOM   7514  CD  PRO B  88     -17.900  32.751 -37.616  1.00 43.23           C\nATOM   7515  HA  PRO B  88     -14.866  31.851 -37.430  1.00 43.75           H\nATOM   7516  HB3 PRO B  88     -15.451  34.071 -37.409  1.00 44.33           H\nATOM   7517  HB2 PRO B  88     -15.434  33.892 -35.663  1.00 44.33           H\nATOM   7518  HG3 PRO B  88     -17.691  34.783 -36.809  1.00 44.57           H\nATOM   7519  HG2 PRO B  88     -17.811  33.505 -35.601  1.00 44.57           H\nATOM   7520  HD2 PRO B  88     -18.927  32.463 -37.413  1.00 43.23           H\nATOM   7521  HD3 PRO B  88     -17.858  33.194 -38.611  1.00 43.23           H\nATOM   7522  N   THR B  89     -16.605  30.741 -34.856  1.00 46.04           N\nATOM   7523  CA  THR B  89     -16.514  29.907 -33.650  1.00 45.97           C\nATOM   7524  C   THR B  89     -15.882  28.527 -33.927  1.00 45.36           C\nATOM   7525  O   THR B  89     -15.092  28.056 -33.109  1.00 46.09           O\nATOM   7526  CB  THR B  89     -17.896  29.679 -32.983  1.00 46.62           C\nATOM   7527  OG1 THR B  89     -18.462  30.923 -32.624  1.00 45.09           O\nATOM   7528  CG2 THR B  89     -17.866  28.819 -31.710  1.00 43.16           C\nATOM   7529  H   THR B  89     -17.530  30.889 -35.234  1.00 46.04           H\nATOM   7530  HA  THR B  89     -15.872  30.425 -32.935  1.00 45.97           H\nATOM   7531  HB  THR B  89     -18.578  29.214 -33.695  1.00 46.62           H\nATOM   7532  HG1 THR B  89     -18.758  31.372 -33.422  1.00 45.09           H\nATOM   7533 HG21 THR B  89     -18.840  28.809 -31.232  1.00 43.16           H\nATOM   7534 HG22 THR B  89     -17.607  27.781 -31.914  1.00 43.16           H\nATOM   7535 HG23 THR B  89     -17.146  29.213 -30.993  1.00 43.16           H\nATOM   7536  N   CYS B  90     -16.204  27.930 -35.089  1.00 46.30           N\nATOM   7537  CA  CYS B  90     -15.624  26.676 -35.570  1.00 46.54           C\nATOM   7538  C   CYS B  90     -14.127  26.818 -35.893  1.00 45.75           C\nATOM   7539  O   CYS B  90     -13.361  25.916 -35.558  1.00 47.73           O\nATOM   7540  CB  CYS B  90     -16.345  26.138 -36.816  1.00 47.29           C\nATOM   7541  SG  CYS B  90     -18.022  25.576 -36.431  1.00 44.40           S\nATOM   7542  H   CYS B  90     -16.879  28.371 -35.701  1.00 46.30           H\nATOM   7543  HA  CYS B  90     -15.716  25.938 -34.772  1.00 46.54           H\nATOM   7544  HB3 CYS B  90     -15.798  25.281 -37.196  1.00 47.29           H\nATOM   7545  HB2 CYS B  90     -16.385  26.880 -37.614  1.00 47.29           H\nATOM   7546  HG  CYS B  90     -18.523  26.795 -36.194  1.00 44.40           H\nATOM   7547  N   VAL B  91     -13.745  27.946 -36.520  1.00 45.85           N\nATOM   7548  CA  VAL B  91     -12.362  28.307 -36.849  1.00 45.08           C\nATOM   7549  C   VAL B  91     -11.496  28.529 -35.592  1.00 45.41           C\nATOM   7550  O   VAL B  91     -10.342  28.100 -35.573  1.00 48.20           O\nATOM   7551  CB  VAL B  91     -12.322  29.563 -37.772  1.00 45.33           C\nATOM   7552  CG1 VAL B  91     -10.942  30.230 -37.935  1.00 42.78           C\nATOM   7553  CG2 VAL B  91     -12.876  29.229 -39.169  1.00 47.66           C\nATOM   7554  H   VAL B  91     -14.448  28.628 -36.771  1.00 45.85           H\nATOM   7555  HA  VAL B  91     -11.916  27.474 -37.391  1.00 45.08           H\nATOM   7556  HB  VAL B  91     -12.984  30.315 -37.342  1.00 45.33           H\nATOM   7557 HG11 VAL B  91     -10.976  31.031 -38.674  1.00 42.78           H\nATOM   7558 HG12 VAL B  91     -10.585  30.676 -37.006  1.00 42.78           H\nATOM   7559 HG13 VAL B  91     -10.203  29.503 -38.271  1.00 42.78           H\nATOM   7560 HG21 VAL B  91     -12.938  30.118 -39.796  1.00 47.66           H\nATOM   7561 HG22 VAL B  91     -12.237  28.508 -39.680  1.00 47.66           H\nATOM   7562 HG23 VAL B  91     -13.876  28.800 -39.119  1.00 47.66           H\nATOM   7563  N   PHE B  92     -12.088  29.152 -34.560  1.00 44.00           N\nATOM   7564  CA  PHE B  92     -11.472  29.397 -33.258  1.00 44.13           C\nATOM   7565  C   PHE B  92     -11.204  28.101 -32.475  1.00 45.03           C\nATOM   7566  O   PHE B  92     -10.074  27.902 -32.034  1.00 46.36           O\nATOM   7567  CB  PHE B  92     -12.354  30.392 -32.481  1.00 44.69           C\nATOM   7568  CG  PHE B  92     -11.859  30.841 -31.118  1.00 44.62           C\nATOM   7569  CD1 PHE B  92     -10.612  31.489 -30.986  1.00 50.74           C\nATOM   7570  CD2 PHE B  92     -12.673  30.673 -29.979  1.00 48.90           C\nATOM   7571  CE1 PHE B  92     -10.203  31.955 -29.743  1.00 51.02           C\nATOM   7572  CE2 PHE B  92     -12.241  31.140 -28.746  1.00 52.77           C\nATOM   7573  CZ  PHE B  92     -11.013  31.778 -28.628  1.00 52.58           C\nATOM   7574  H   PHE B  92     -13.038  29.483 -34.666  1.00 44.00           H\nATOM   7575  HA  PHE B  92     -10.509  29.876 -33.444  1.00 44.13           H\nATOM   7576  HB3 PHE B  92     -13.361  29.986 -32.378  1.00 44.69           H\nATOM   7577  HB2 PHE B  92     -12.463  31.291 -33.080  1.00 44.69           H\nATOM   7578  HD1 PHE B  92      -9.980  31.643 -31.849  1.00 50.74           H\nATOM   7579  HD2 PHE B  92     -13.636  30.189 -30.059  1.00 48.90           H\nATOM   7580  HE1 PHE B  92      -9.254  32.459 -29.644  1.00 51.02           H\nATOM   7581  HE2 PHE B  92     -12.869  31.007 -27.878  1.00 52.77           H\nATOM   7582  HZ  PHE B  92     -10.688  32.144 -27.666  1.00 52.58           H\nATOM   7583  N   LEU B  93     -12.223  27.229 -32.372  1.00 45.16           N\nATOM   7584  CA  LEU B  93     -12.148  25.920 -31.714  1.00 46.28           C\nATOM   7585  C   LEU B  93     -11.147  24.961 -32.391  1.00 47.61           C\nATOM   7586  O   LEU B  93     -10.422  24.264 -31.682  1.00 47.26           O\nATOM   7587  CB  LEU B  93     -13.577  25.325 -31.623  1.00 44.44           C\nATOM   7588  CG  LEU B  93     -13.726  23.982 -30.864  1.00 44.31           C\nATOM   7589  CD1 LEU B  93     -13.314  24.067 -29.381  1.00 39.14           C\nATOM   7590  CD2 LEU B  93     -15.155  23.431 -31.005  1.00 44.30           C\nATOM   7591  H   LEU B  93     -13.123  27.472 -32.765  1.00 45.16           H\nATOM   7592  HA  LEU B  93     -11.785  26.104 -30.701  1.00 46.28           H\nATOM   7593  HB3 LEU B  93     -13.961  25.201 -32.638  1.00 44.44           H\nATOM   7594  HB2 LEU B  93     -14.234  26.058 -31.152  1.00 44.44           H\nATOM   7595  HG  LEU B  93     -13.075  23.249 -31.341  1.00 44.31           H\nATOM   7596 HD11 LEU B  93     -14.114  23.747 -28.712  1.00 39.14           H\nATOM   7597 HD12 LEU B  93     -12.456  23.426 -29.184  1.00 39.14           H\nATOM   7598 HD13 LEU B  93     -13.038  25.077 -29.082  1.00 39.14           H\nATOM   7599 HD21 LEU B  93     -15.206  22.386 -30.701  1.00 44.30           H\nATOM   7600 HD22 LEU B  93     -15.863  23.989 -30.390  1.00 44.30           H\nATOM   7601 HD23 LEU B  93     -15.499  23.481 -32.038  1.00 44.30           H\nATOM   7602  N   ALA B  94     -11.102  24.973 -33.737  1.00 48.50           N\nATOM   7603  CA  ALA B  94     -10.198  24.158 -34.554  1.00 50.01           C\nATOM   7604  C   ALA B  94      -8.719  24.564 -34.436  1.00 49.45           C\nATOM   7605  O   ALA B  94      -7.860  23.684 -34.474  1.00 49.77           O\nATOM   7606  CB  ALA B  94     -10.648  24.215 -36.021  1.00 49.34           C\nATOM   7607  H   ALA B  94     -11.740  25.569 -34.247  1.00 48.50           H\nATOM   7608  HA  ALA B  94     -10.285  23.123 -34.216  1.00 50.01           H\nATOM   7609  HB1 ALA B  94     -10.002  23.607 -36.655  1.00 49.34           H\nATOM   7610  HB2 ALA B  94     -11.664  23.836 -36.137  1.00 49.34           H\nATOM   7611  HB3 ALA B  94     -10.626  25.235 -36.407  1.00 49.34           H\nATOM   7612  N   SER B  95      -8.445  25.872 -34.276  1.00 50.59           N\nATOM   7613  CA  SER B  95      -7.097  26.409 -34.060  1.00 52.31           C\nATOM   7614  C   SER B  95      -6.538  26.113 -32.652  1.00 52.65           C\nATOM   7615  O   SER B  95      -5.320  26.115 -32.484  1.00 52.64           O\nATOM   7616  CB  SER B  95      -7.080  27.915 -34.407  1.00 52.62           C\nATOM   7617  OG  SER B  95      -7.623  28.738 -33.392  1.00 55.81           O\nATOM   7618  H   SER B  95      -9.202  26.542 -34.277  1.00 50.59           H\nATOM   7619  HA  SER B  95      -6.437  25.912 -34.774  1.00 52.31           H\nATOM   7620  HB3 SER B  95      -7.604  28.103 -35.344  1.00 52.62           H\nATOM   7621  HB2 SER B  95      -6.050  28.237 -34.564  1.00 52.62           H\nATOM   7622  HG  SER B  95      -8.541  28.490 -33.245  1.00 55.81           H\nATOM   7623  N   LYS B  96      -7.431  25.847 -31.683  1.00 55.91           N\nATOM   7624  CA  LYS B  96      -7.104  25.508 -30.297  1.00 57.86           C\nATOM   7625  C   LYS B  96      -6.867  24.003 -30.080  1.00 59.50           C\nATOM   7626  O   LYS B  96      -6.348  23.637 -29.025  1.00 61.21           O\nATOM   7627  CB  LYS B  96      -8.212  26.064 -29.384  1.00 58.41           C\nATOM   7628  CG  LYS B  96      -8.180  27.603 -29.318  1.00 57.42           C\nATOM   7629  CD  LYS B  96      -9.479  28.234 -28.804  1.00 60.43           C\nATOM   7630  CE  LYS B  96      -9.809  27.887 -27.350  1.00 59.21           C\nATOM   7631  NZ  LYS B  96     -11.024  28.589 -26.915  1.00 59.28           N1+\nATOM   7632  H   LYS B  96      -8.416  25.873 -31.906  1.00 55.91           H\nATOM   7633  HA  LYS B  96      -6.170  26.007 -30.027  1.00 57.86           H\nATOM   7634  HB3 LYS B  96      -8.104  25.672 -28.371  1.00 58.41           H\nATOM   7635  HB2 LYS B  96      -9.184  25.719 -29.740  1.00 58.41           H\nATOM   7636  HG3 LYS B  96      -7.972  28.021 -30.303  1.00 57.42           H\nATOM   7637  HG2 LYS B  96      -7.348  27.918 -28.687  1.00 57.42           H\nATOM   7638  HD3 LYS B  96     -10.308  27.926 -29.443  1.00 60.43           H\nATOM   7639  HD2 LYS B  96      -9.398  29.315 -28.920  1.00 60.43           H\nATOM   7640  HE3 LYS B  96      -8.986  28.173 -26.694  1.00 59.21           H\nATOM   7641  HE2 LYS B  96      -9.964  26.814 -27.227  1.00 59.21           H\nATOM   7642  HZ1 LYS B  96     -11.204  28.369 -25.943  1.00 59.28           H\nATOM   7643  HZ2 LYS B  96     -10.902  29.586 -27.018  1.00 59.28           H\nATOM   7644  HZ3 LYS B  96     -11.817  28.291 -27.473  1.00 59.28           H\nATOM   7645  N   VAL B  97      -7.186  23.163 -31.083  1.00 62.13           N\nATOM   7646  CA  VAL B  97      -6.736  21.769 -31.157  1.00 63.26           C\nATOM   7647  C   VAL B  97      -5.235  21.678 -31.523  1.00 66.12           C\nATOM   7648  O   VAL B  97      -4.606  20.675 -31.196  1.00 66.66           O\nATOM   7649  CB  VAL B  97      -7.587  20.945 -32.173  1.00 63.64           C\nATOM   7650  CG1 VAL B  97      -7.075  19.520 -32.484  1.00 64.19           C\nATOM   7651  CG2 VAL B  97      -9.046  20.845 -31.702  1.00 58.06           C\nATOM   7652  H   VAL B  97      -7.638  23.528 -31.910  1.00 62.13           H\nATOM   7653  HA  VAL B  97      -6.858  21.316 -30.170  1.00 63.26           H\nATOM   7654  HB  VAL B  97      -7.595  21.481 -33.121  1.00 63.64           H\nATOM   7655 HG11 VAL B  97      -7.788  18.972 -33.101  1.00 64.19           H\nATOM   7656 HG12 VAL B  97      -6.137  19.533 -33.040  1.00 64.19           H\nATOM   7657 HG13 VAL B  97      -6.923  18.945 -31.570  1.00 64.19           H\nATOM   7658 HG21 VAL B  97      -9.637  20.254 -32.399  1.00 58.06           H\nATOM   7659 HG22 VAL B  97      -9.115  20.366 -30.725  1.00 58.06           H\nATOM   7660 HG23 VAL B  97      -9.517  21.824 -31.630  1.00 58.06           H\nATOM   7661  N   GLU B  98      -4.674  22.738 -32.133  1.00 68.72           N\nATOM   7662  CA  GLU B  98      -3.243  22.901 -32.394  1.00 70.85           C\nATOM   7663  C   GLU B  98      -2.550  23.610 -31.217  1.00 72.15           C\nATOM   7664  O   GLU B  98      -3.201  24.347 -30.475  1.00 72.45           O\nATOM   7665  CB  GLU B  98      -3.049  23.730 -33.685  1.00 71.68           C\nATOM   7666  CG  GLU B  98      -3.824  23.222 -34.920  1.00 75.56           C\nATOM   7667  CD  GLU B  98      -3.478  21.798 -35.386  1.00 78.94           C\nATOM   7668  OE1 GLU B  98      -2.298  21.399 -35.263  1.00 82.55           O\nATOM   7669  OE2 GLU B  98      -4.396  21.133 -35.913  1.00 80.55           O1-\nATOM   7670  H   GLU B  98      -5.249  23.539 -32.351  1.00 68.72           H\nATOM   7671  HA  GLU B  98      -2.782  21.921 -32.528  1.00 70.85           H\nATOM   7672  HB3 GLU B  98      -1.986  23.778 -33.927  1.00 71.68           H\nATOM   7673  HB2 GLU B  98      -3.337  24.766 -33.503  1.00 71.68           H\nATOM   7674  HG3 GLU B  98      -3.608  23.894 -35.749  1.00 75.56           H\nATOM   7675  HG2 GLU B  98      -4.898  23.305 -34.744  1.00 75.56           H\nATOM   7676  N   GLU B  99      -1.230  23.389 -31.101  1.00 72.69           N\nATOM   7677  CA  GLU B  99      -0.349  24.035 -30.120  1.00 74.09           C\nATOM   7678  C   GLU B  99       0.740  24.900 -30.784  1.00 75.11           C\nATOM   7679  O   GLU B  99       1.446  25.613 -30.070  1.00 75.00           O\nATOM   7680  CB  GLU B  99       0.259  22.953 -29.201  1.00 73.60           C\nATOM   7681  CG  GLU B  99       1.216  21.957 -29.906  1.00 71.39           C\nATOM   7682  CD  GLU B  99       1.719  20.796 -29.036  1.00 71.59           C\nATOM   7683  OE1 GLU B  99       1.288  20.672 -27.866  1.00 69.42           O\nATOM   7684  OE2 GLU B  99       2.547  20.024 -29.564  1.00 66.59           O1-\nATOM   7685  H   GLU B  99      -0.781  22.751 -31.741  1.00 72.69           H\nATOM   7686  HA  GLU B  99      -0.926  24.718 -29.499  1.00 74.09           H\nATOM   7687  HB3 GLU B  99      -0.559  22.413 -28.727  1.00 73.60           H\nATOM   7688  HB2 GLU B  99       0.791  23.443 -28.384  1.00 73.60           H\nATOM   7689  HG3 GLU B  99       2.091  22.492 -30.278  1.00 71.39           H\nATOM   7690  HG2 GLU B  99       0.723  21.525 -30.777  1.00 71.39           H\nATOM   7691  N   PHE B 100       0.855  24.834 -32.121  1.00 76.73           N\nATOM   7692  CA  PHE B 100       1.767  25.633 -32.935  1.00 79.17           C\nATOM   7693  C   PHE B 100       1.107  26.974 -33.297  1.00 80.29           C\nATOM   7694  O   PHE B 100       0.571  27.123 -34.395  1.00 81.82           O\nATOM   7695  CB  PHE B 100       2.202  24.813 -34.172  1.00 79.51           C\nATOM   7696  CG  PHE B 100       3.261  23.759 -33.888  1.00 81.50           C\nATOM   7697  CD1 PHE B 100       2.924  22.563 -33.218  1.00 82.72           C\nATOM   7698  CD2 PHE B 100       4.619  24.023 -34.172  1.00 81.25           C\nATOM   7699  CE1 PHE B 100       3.915  21.648 -32.886  1.00 82.98           C\nATOM   7700  CE2 PHE B 100       5.594  23.091 -33.840  1.00 83.02           C\nATOM   7701  CZ  PHE B 100       5.242  21.907 -33.205  1.00 83.50           C\nATOM   7702  H   PHE B 100       0.225  24.236 -32.634  1.00 76.73           H\nATOM   7703  HA  PHE B 100       2.666  25.862 -32.361  1.00 79.17           H\nATOM   7704  HB3 PHE B 100       2.588  25.473 -34.950  1.00 79.51           H\nATOM   7705  HB2 PHE B 100       1.334  24.317 -34.610  1.00 79.51           H\nATOM   7706  HD1 PHE B 100       1.898  22.354 -32.957  1.00 82.72           H\nATOM   7707  HD2 PHE B 100       4.905  24.945 -34.655  1.00 81.25           H\nATOM   7708  HE1 PHE B 100       3.652  20.734 -32.374  1.00 82.98           H\nATOM   7709  HE2 PHE B 100       6.630  23.293 -34.066  1.00 83.02           H\nATOM   7710  HZ  PHE B 100       6.007  21.192 -32.942  1.00 83.50           H\nATOM   7711  N   GLY B 101       1.140  27.911 -32.335  1.00 80.69           N\nATOM   7712  CA  GLY B 101       0.515  29.228 -32.433  1.00 80.90           C\nATOM   7713  C   GLY B 101      -0.889  29.207 -31.811  1.00 79.80           C\nATOM   7714  O   GLY B 101      -1.480  28.148 -31.590  1.00 80.28           O\nATOM   7715  H   GLY B 101       1.579  27.684 -31.454  1.00 80.69           H\nATOM   7716  HA3 GLY B 101       0.455  29.567 -33.469  1.00 80.90           H\nATOM   7717  HA2 GLY B 101       1.139  29.944 -31.898  1.00 80.90           H\nATOM   7718  N   VAL B 102      -1.409  30.412 -31.527  1.00 78.27           N\nATOM   7719  CA  VAL B 102      -2.715  30.650 -30.908  1.00 77.16           C\nATOM   7720  C   VAL B 102      -3.372  31.865 -31.590  1.00 74.86           C\nATOM   7721  O   VAL B 102      -2.700  32.875 -31.811  1.00 75.68           O\nATOM   7722  CB  VAL B 102      -2.572  30.941 -29.378  1.00 78.02           C\nATOM   7723  CG1 VAL B 102      -3.860  31.443 -28.688  1.00 78.73           C\nATOM   7724  CG2 VAL B 102      -2.035  29.718 -28.608  1.00 78.66           C\nATOM   7725  H   VAL B 102      -0.879  31.243 -31.743  1.00 78.27           H\nATOM   7726  HA  VAL B 102      -3.363  29.783 -31.053  1.00 77.16           H\nATOM   7727  HB  VAL B 102      -1.829  31.731 -29.255  1.00 78.02           H\nATOM   7728 HG11 VAL B 102      -3.726  31.517 -27.608  1.00 78.73           H\nATOM   7729 HG12 VAL B 102      -4.151  32.437 -29.028  1.00 78.73           H\nATOM   7730 HG13 VAL B 102      -4.696  30.766 -28.869  1.00 78.73           H\nATOM   7731 HG21 VAL B 102      -1.969  29.918 -27.538  1.00 78.66           H\nATOM   7732 HG22 VAL B 102      -2.682  28.851 -28.743  1.00 78.66           H\nATOM   7733 HG23 VAL B 102      -1.034  29.441 -28.936  1.00 78.66           H\nATOM   7734  N   VAL B 103      -4.682  31.757 -31.870  1.00 71.36           N\nATOM   7735  CA  VAL B 103      -5.524  32.863 -32.331  1.00 68.15           C\nATOM   7736  C   VAL B 103      -6.098  33.592 -31.102  1.00 67.61           C\nATOM   7737  O   VAL B 103      -6.797  32.967 -30.304  1.00 66.65           O\nATOM   7738  CB  VAL B 103      -6.695  32.353 -33.225  1.00 67.18           C\nATOM   7739  CG1 VAL B 103      -7.768  33.414 -33.555  1.00 63.32           C\nATOM   7740  CG2 VAL B 103      -6.167  31.741 -34.537  1.00 64.12           C\nATOM   7741  H   VAL B 103      -5.167  30.897 -31.659  1.00 71.36           H\nATOM   7742  HA  VAL B 103      -4.930  33.567 -32.914  1.00 68.15           H\nATOM   7743  HB  VAL B 103      -7.204  31.548 -32.690  1.00 67.18           H\nATOM   7744 HG11 VAL B 103      -8.499  33.025 -34.265  1.00 63.32           H\nATOM   7745 HG12 VAL B 103      -8.330  33.717 -32.673  1.00 63.32           H\nATOM   7746 HG13 VAL B 103      -7.323  34.308 -33.995  1.00 63.32           H\nATOM   7747 HG21 VAL B 103      -6.981  31.343 -35.143  1.00 64.12           H\nATOM   7748 HG22 VAL B 103      -5.642  32.484 -35.138  1.00 64.12           H\nATOM   7749 HG23 VAL B 103      -5.477  30.918 -34.348  1.00 64.12           H\nATOM   7750  N   SER B 104      -5.791  34.894 -30.975  1.00 67.57           N\nATOM   7751  CA  SER B 104      -6.315  35.753 -29.913  1.00 66.89           C\nATOM   7752  C   SER B 104      -7.770  36.179 -30.179  1.00 67.73           C\nATOM   7753  O   SER B 104      -8.252  36.101 -31.311  1.00 68.42           O\nATOM   7754  CB  SER B 104      -5.371  36.959 -29.704  1.00 67.01           C\nATOM   7755  OG  SER B 104      -5.512  37.959 -30.695  1.00 67.14           O\nATOM   7756  H   SER B 104      -5.196  35.345 -31.655  1.00 67.57           H\nATOM   7757  HA  SER B 104      -6.303  35.174 -28.987  1.00 66.89           H\nATOM   7758  HB3 SER B 104      -4.331  36.635 -29.658  1.00 67.01           H\nATOM   7759  HB2 SER B 104      -5.584  37.424 -28.741  1.00 67.01           H\nATOM   7760  HG  SER B 104      -4.889  38.664 -30.503  1.00 67.14           H\nATOM   7761  N   ASN B 105      -8.427  36.645 -29.107  1.00 66.90           N\nATOM   7762  CA  ASN B 105      -9.807  37.137 -29.098  1.00 66.19           C\nATOM   7763  C   ASN B 105     -10.000  38.359 -30.014  1.00 64.91           C\nATOM   7764  O   ASN B 105     -10.997  38.414 -30.734  1.00 65.36           O\nATOM   7765  CB  ASN B 105     -10.205  37.484 -27.642  1.00 66.73           C\nATOM   7766  CG  ASN B 105     -10.358  36.304 -26.666  1.00 67.15           C\nATOM   7767  OD1 ASN B 105     -10.819  36.505 -25.546  1.00 67.48           O\nATOM   7768  ND2 ASN B 105      -9.989  35.079 -27.051  1.00 63.86           N\nATOM   7769  H   ASN B 105      -7.949  36.678 -28.218  1.00 66.90           H\nATOM   7770  HA  ASN B 105     -10.429  36.316 -29.463  1.00 66.19           H\nATOM   7771  HB3 ASN B 105     -11.159  38.012 -27.652  1.00 66.73           H\nATOM   7772  HB2 ASN B 105      -9.488  38.187 -27.216  1.00 66.73           H\nATOM   7773 HD22 ASN B 105     -10.081  34.304 -26.411  1.00 63.86           H\nATOM   7774 HD21 ASN B 105      -9.618  34.920 -27.977  1.00 63.86           H\nATOM   7775  N   THR B 106      -9.029  39.289 -29.994  1.00 65.13           N\nATOM   7776  CA  THR B 106      -9.026  40.495 -30.820  1.00 64.12           C\nATOM   7777  C   THR B 106      -8.777  40.200 -32.313  1.00 61.32           C\nATOM   7778  O   THR B 106      -9.453  40.814 -33.137  1.00 62.16           O\nATOM   7779  CB  THR B 106      -7.976  41.527 -30.329  1.00 64.82           C\nATOM   7780  OG1 THR B 106      -8.238  41.837 -28.974  1.00 67.50           O\nATOM   7781  CG2 THR B 106      -7.929  42.853 -31.113  1.00 68.37           C\nATOM   7782  H   THR B 106      -8.244  39.180 -29.369  1.00 65.13           H\nATOM   7783  HA  THR B 106     -10.014  40.954 -30.736  1.00 64.12           H\nATOM   7784  HB  THR B 106      -6.985  41.071 -30.364  1.00 64.82           H\nATOM   7785  HG1 THR B 106      -7.684  42.578 -28.716  1.00 67.50           H\nATOM   7786 HG21 THR B 106      -7.241  43.560 -30.647  1.00 68.37           H\nATOM   7787 HG22 THR B 106      -7.588  42.711 -32.138  1.00 68.37           H\nATOM   7788 HG23 THR B 106      -8.912  43.324 -31.151  1.00 68.37           H\nATOM   7789  N   ARG B 107      -7.876  39.247 -32.642  1.00 59.65           N\nATOM   7790  CA  ARG B 107      -7.649  38.807 -34.026  1.00 58.42           C\nATOM   7791  C   ARG B 107      -8.857  38.084 -34.638  1.00 56.69           C\nATOM   7792  O   ARG B 107      -9.071  38.246 -35.837  1.00 56.91           O\nATOM   7793  CB  ARG B 107      -6.400  37.905 -34.172  1.00 59.79           C\nATOM   7794  CG  ARG B 107      -5.053  38.647 -34.085  1.00 63.23           C\nATOM   7795  CD  ARG B 107      -3.915  38.020 -34.920  1.00 68.84           C\nATOM   7796  NE  ARG B 107      -3.657  36.595 -34.627  1.00 70.66           N\nATOM   7797  CZ  ARG B 107      -3.468  35.584 -35.501  1.00 72.09           C\nATOM   7798  NH1 ARG B 107      -3.554  35.747 -36.830  1.00 70.34           N\nATOM   7799  NH2 ARG B 107      -3.172  34.366 -35.029  1.00 75.05           N1+\nATOM   7800  H   ARG B 107      -7.362  38.761 -31.920  1.00 59.65           H\nATOM   7801  HA  ARG B 107      -7.495  39.700 -34.635  1.00 58.42           H\nATOM   7802  HB3 ARG B 107      -6.435  37.425 -35.152  1.00 59.79           H\nATOM   7803  HB2 ARG B 107      -6.433  37.089 -33.447  1.00 59.79           H\nATOM   7804  HG3 ARG B 107      -4.744  38.883 -33.067  1.00 63.23           H\nATOM   7805  HG2 ARG B 107      -5.234  39.616 -34.551  1.00 63.23           H\nATOM   7806  HD3 ARG B 107      -2.990  38.495 -34.590  1.00 68.84           H\nATOM   7807  HD2 ARG B 107      -4.002  38.269 -35.979  1.00 68.84           H\nATOM   7808  HE  ARG B 107      -3.545  36.381 -33.643  1.00 70.66           H\nATOM   7809 HH12 ARG B 107      -3.410  34.965 -37.456  1.00 70.34           H\nATOM   7810 HH11 ARG B 107      -3.776  36.653 -37.216  1.00 70.34           H\nATOM   7811 HH22 ARG B 107      -3.022  33.595 -35.664  1.00 75.05           H\nATOM   7812 HH21 ARG B 107      -3.071  34.212 -34.035  1.00 75.05           H\nATOM   7813  N   LEU B 108      -9.619  37.321 -33.836  1.00 54.69           N\nATOM   7814  CA  LEU B 108     -10.807  36.611 -34.307  1.00 53.68           C\nATOM   7815  C   LEU B 108     -11.944  37.565 -34.706  1.00 52.36           C\nATOM   7816  O   LEU B 108     -12.487  37.414 -35.798  1.00 51.33           O\nATOM   7817  CB  LEU B 108     -11.271  35.587 -33.251  1.00 54.43           C\nATOM   7818  CG  LEU B 108     -12.500  34.753 -33.682  1.00 55.78           C\nATOM   7819  CD1 LEU B 108     -12.182  33.829 -34.877  1.00 59.58           C\nATOM   7820  CD2 LEU B 108     -13.081  34.001 -32.484  1.00 59.45           C\nATOM   7821  H   LEU B 108      -9.378  37.210 -32.860  1.00 54.69           H\nATOM   7822  HA  LEU B 108     -10.513  36.062 -35.203  1.00 53.68           H\nATOM   7823  HB3 LEU B 108     -11.508  36.117 -32.327  1.00 54.43           H\nATOM   7824  HB2 LEU B 108     -10.448  34.916 -33.001  1.00 54.43           H\nATOM   7825  HG  LEU B 108     -13.304  35.414 -34.002  1.00 55.78           H\nATOM   7826 HD11 LEU B 108     -12.464  32.796 -34.696  1.00 59.58           H\nATOM   7827 HD12 LEU B 108     -12.717  34.154 -35.770  1.00 59.58           H\nATOM   7828 HD13 LEU B 108     -11.120  33.820 -35.119  1.00 59.58           H\nATOM   7829 HD21 LEU B 108     -13.709  33.166 -32.793  1.00 59.45           H\nATOM   7830 HD22 LEU B 108     -12.301  33.625 -31.823  1.00 59.45           H\nATOM   7831 HD23 LEU B 108     -13.705  34.676 -31.899  1.00 59.45           H\nATOM   7832  N   ILE B 109     -12.279  38.516 -33.817  1.00 51.92           N\nATOM   7833  CA  ILE B 109     -13.341  39.499 -34.038  1.00 53.22           C\nATOM   7834  C   ILE B 109     -12.976  40.517 -35.139  1.00 53.11           C\nATOM   7835  O   ILE B 109     -13.856  40.886 -35.917  1.00 55.15           O\nATOM   7836  CB  ILE B 109     -13.727  40.233 -32.716  1.00 53.32           C\nATOM   7837  CG1 ILE B 109     -14.269  39.251 -31.645  1.00 53.96           C\nATOM   7838  CG2 ILE B 109     -14.695  41.426 -32.886  1.00 52.98           C\nATOM   7839  CD1 ILE B 109     -15.595  38.556 -31.995  1.00 48.72           C\nATOM   7840  H   ILE B 109     -11.792  38.570 -32.932  1.00 51.92           H\nATOM   7841  HA  ILE B 109     -14.218  38.962 -34.400  1.00 53.22           H\nATOM   7842  HB  ILE B 109     -12.804  40.644 -32.300  1.00 53.32           H\nATOM   7843 HG13 ILE B 109     -14.391  39.781 -30.700  1.00 53.96           H\nATOM   7844 HG12 ILE B 109     -13.529  38.478 -31.441  1.00 53.96           H\nATOM   7845 HG21 ILE B 109     -14.991  41.830 -31.917  1.00 52.98           H\nATOM   7846 HG22 ILE B 109     -14.241  42.249 -33.439  1.00 52.98           H\nATOM   7847 HG23 ILE B 109     -15.603  41.134 -33.413  1.00 52.98           H\nATOM   7848 HD11 ILE B 109     -15.919  37.923 -31.171  1.00 48.72           H\nATOM   7849 HD12 ILE B 109     -16.394  39.272 -32.184  1.00 48.72           H\nATOM   7850 HD13 ILE B 109     -15.499  37.910 -32.867  1.00 48.72           H\nATOM   7851  N   ALA B 110     -11.685  40.887 -35.234  1.00 53.28           N\nATOM   7852  CA  ALA B 110     -11.138  41.705 -36.318  1.00 53.78           C\nATOM   7853  C   ALA B 110     -11.173  40.997 -37.681  1.00 51.09           C\nATOM   7854  O   ALA B 110     -11.529  41.643 -38.663  1.00 49.76           O\nATOM   7855  CB  ALA B 110      -9.708  42.145 -35.976  1.00 53.53           C\nATOM   7856  H   ALA B 110     -11.017  40.551 -34.553  1.00 53.28           H\nATOM   7857  HA  ALA B 110     -11.753  42.604 -36.395  1.00 53.78           H\nATOM   7858  HB1 ALA B 110      -9.286  42.766 -36.767  1.00 53.53           H\nATOM   7859  HB2 ALA B 110      -9.688  42.734 -35.058  1.00 53.53           H\nATOM   7860  HB3 ALA B 110      -9.046  41.289 -35.840  1.00 53.53           H\nATOM   7861  N   ALA B 111     -10.851  39.690 -37.715  1.00 51.56           N\nATOM   7862  CA  ALA B 111     -10.924  38.851 -38.914  1.00 52.95           C\nATOM   7863  C   ALA B 111     -12.363  38.621 -39.393  1.00 53.86           C\nATOM   7864  O   ALA B 111     -12.603  38.712 -40.593  1.00 55.35           O\nATOM   7865  CB  ALA B 111     -10.207  37.512 -38.678  1.00 52.44           C\nATOM   7866  H   ALA B 111     -10.549  39.226 -36.868  1.00 51.56           H\nATOM   7867  HA  ALA B 111     -10.396  39.373 -39.713  1.00 52.95           H\nATOM   7868  HB1 ALA B 111     -10.272  36.867 -39.556  1.00 52.44           H\nATOM   7869  HB2 ALA B 111      -9.148  37.670 -38.475  1.00 52.44           H\nATOM   7870  HB3 ALA B 111     -10.632  36.966 -37.835  1.00 52.44           H\nATOM   7871  N   ALA B 112     -13.294  38.372 -38.456  1.00 55.08           N\nATOM   7872  CA  ALA B 112     -14.722  38.204 -38.726  1.00 54.50           C\nATOM   7873  C   ALA B 112     -15.403  39.478 -39.255  1.00 55.42           C\nATOM   7874  O   ALA B 112     -16.269  39.370 -40.120  1.00 54.06           O\nATOM   7875  CB  ALA B 112     -15.420  37.686 -37.462  1.00 54.43           C\nATOM   7876  H   ALA B 112     -13.011  38.289 -37.488  1.00 55.08           H\nATOM   7877  HA  ALA B 112     -14.829  37.444 -39.500  1.00 54.50           H\nATOM   7878  HB1 ALA B 112     -16.481  37.511 -37.644  1.00 54.43           H\nATOM   7879  HB2 ALA B 112     -14.988  36.741 -37.132  1.00 54.43           H\nATOM   7880  HB3 ALA B 112     -15.334  38.396 -36.637  1.00 54.43           H\nATOM   7881  N   THR B 113     -14.976  40.655 -38.768  1.00 55.39           N\nATOM   7882  CA  THR B 113     -15.443  41.952 -39.259  1.00 54.09           C\nATOM   7883  C   THR B 113     -14.840  42.299 -40.635  1.00 54.05           C\nATOM   7884  O   THR B 113     -15.590  42.711 -41.520  1.00 55.32           O\nATOM   7885  CB  THR B 113     -15.113  43.098 -38.264  1.00 55.24           C\nATOM   7886  OG1 THR B 113     -15.738  42.827 -37.025  1.00 54.41           O\nATOM   7887  CG2 THR B 113     -15.558  44.506 -38.707  1.00 52.80           C\nATOM   7888  H   THR B 113     -14.270  40.671 -38.045  1.00 55.39           H\nATOM   7889  HA  THR B 113     -16.527  41.907 -39.378  1.00 54.09           H\nATOM   7890  HB  THR B 113     -14.038  43.117 -38.077  1.00 55.24           H\nATOM   7891  HG1 THR B 113     -15.307  42.064 -36.626  1.00 54.41           H\nATOM   7892 HG21 THR B 113     -15.387  45.236 -37.915  1.00 52.80           H\nATOM   7893 HG22 THR B 113     -15.007  44.854 -39.581  1.00 52.80           H\nATOM   7894 HG23 THR B 113     -16.621  44.527 -38.951  1.00 52.80           H\nATOM   7895  N   SER B 114     -13.516  42.108 -40.787  1.00 55.10           N\nATOM   7896  CA  SER B 114     -12.747  42.431 -41.990  1.00 56.32           C\nATOM   7897  C   SER B 114     -13.129  41.569 -43.205  1.00 56.46           C\nATOM   7898  O   SER B 114     -13.389  42.132 -44.265  1.00 55.68           O\nATOM   7899  CB  SER B 114     -11.237  42.359 -41.678  1.00 55.29           C\nATOM   7900  OG  SER B 114     -10.436  42.703 -42.794  1.00 62.25           O\nATOM   7901  H   SER B 114     -12.976  41.758 -40.006  1.00 55.10           H\nATOM   7902  HA  SER B 114     -12.976  43.469 -42.242  1.00 56.32           H\nATOM   7903  HB3 SER B 114     -10.961  41.356 -41.349  1.00 55.29           H\nATOM   7904  HB2 SER B 114     -10.988  43.041 -40.865  1.00 55.29           H\nATOM   7905  HG  SER B 114     -10.535  43.642 -42.965  1.00 62.25           H\nATOM   7906  N   VAL B 115     -13.179  40.237 -43.036  1.00 55.93           N\nATOM   7907  CA  VAL B 115     -13.512  39.286 -44.101  1.00 55.81           C\nATOM   7908  C   VAL B 115     -14.933  39.485 -44.661  1.00 56.50           C\nATOM   7909  O   VAL B 115     -15.092  39.476 -45.879  1.00 58.52           O\nATOM   7910  CB  VAL B 115     -13.322  37.811 -43.634  1.00 56.62           C\nATOM   7911  CG1 VAL B 115     -13.970  36.727 -44.519  1.00 53.91           C\nATOM   7912  CG2 VAL B 115     -11.827  37.493 -43.469  1.00 52.12           C\nATOM   7913  H   VAL B 115     -12.964  39.834 -42.132  1.00 55.93           H\nATOM   7914  HA  VAL B 115     -12.816  39.470 -44.923  1.00 55.81           H\nATOM   7915  HB  VAL B 115     -13.786  37.714 -42.652  1.00 56.62           H\nATOM   7916 HG11 VAL B 115     -13.679  35.728 -44.193  1.00 53.91           H\nATOM   7917 HG12 VAL B 115     -15.059  36.759 -44.480  1.00 53.91           H\nATOM   7918 HG13 VAL B 115     -13.664  36.841 -45.559  1.00 53.91           H\nATOM   7919 HG21 VAL B 115     -11.679  36.501 -43.046  1.00 52.12           H\nATOM   7920 HG22 VAL B 115     -11.309  37.526 -44.428  1.00 52.12           H\nATOM   7921 HG23 VAL B 115     -11.333  38.202 -42.806  1.00 52.12           H\nATOM   7922  N   LEU B 116     -15.924  39.698 -43.778  1.00 57.85           N\nATOM   7923  CA  LEU B 116     -17.322  39.853 -44.178  1.00 59.09           C\nATOM   7924  C   LEU B 116     -17.638  41.186 -44.884  1.00 60.50           C\nATOM   7925  O   LEU B 116     -18.574  41.200 -45.681  1.00 61.05           O\nATOM   7926  CB  LEU B 116     -18.260  39.607 -42.976  1.00 59.02           C\nATOM   7927  CG  LEU B 116     -18.222  38.165 -42.412  1.00 62.53           C\nATOM   7928  CD1 LEU B 116     -19.104  38.049 -41.151  1.00 62.03           C\nATOM   7929  CD2 LEU B 116     -18.573  37.087 -43.460  1.00 60.80           C\nATOM   7930  H   LEU B 116     -15.729  39.716 -42.787  1.00 57.85           H\nATOM   7931  HA  LEU B 116     -17.519  39.080 -44.917  1.00 59.09           H\nATOM   7932  HB3 LEU B 116     -19.288  39.833 -43.266  1.00 59.02           H\nATOM   7933  HB2 LEU B 116     -18.011  40.317 -42.185  1.00 59.02           H\nATOM   7934  HG  LEU B 116     -17.199  37.963 -42.094  1.00 62.53           H\nATOM   7935 HD11 LEU B 116     -18.544  37.606 -40.327  1.00 62.03           H\nATOM   7936 HD12 LEU B 116     -19.460  39.021 -40.811  1.00 62.03           H\nATOM   7937 HD13 LEU B 116     -19.988  37.433 -41.315  1.00 62.03           H\nATOM   7938 HD21 LEU B 116     -19.216  36.302 -43.060  1.00 60.80           H\nATOM   7939 HD22 LEU B 116     -19.085  37.508 -44.323  1.00 60.80           H\nATOM   7940 HD23 LEU B 116     -17.670  36.597 -43.826  1.00 60.80           H\nATOM   7941  N   LYS B 117     -16.862  42.257 -44.626  1.00 61.11           N\nATOM   7942  CA  LYS B 117     -17.059  43.562 -45.272  1.00 63.25           C\nATOM   7943  C   LYS B 117     -16.211  43.748 -46.547  1.00 62.98           C\nATOM   7944  O   LYS B 117     -16.595  44.573 -47.374  1.00 63.87           O\nATOM   7945  CB  LYS B 117     -16.847  44.703 -44.248  1.00 64.27           C\nATOM   7946  CG  LYS B 117     -15.386  45.027 -43.877  1.00 68.99           C\nATOM   7947  CD  LYS B 117     -15.249  46.092 -42.775  1.00 71.89           C\nATOM   7948  CE  LYS B 117     -15.631  47.507 -43.249  0.00 70.96           C\nATOM   7949  NZ  LYS B 117     -15.447  48.513 -42.189  0.00 71.10           N1+\nATOM   7950  H   LYS B 117     -16.111  42.189 -43.953  1.00 61.11           H\nATOM   7951  HA  LYS B 117     -18.101  43.642 -45.591  1.00 63.25           H\nATOM   7952  HB3 LYS B 117     -17.422  44.487 -43.347  1.00 64.27           H\nATOM   7953  HB2 LYS B 117     -17.292  45.606 -44.668  1.00 64.27           H\nATOM   7954  HG3 LYS B 117     -14.839  45.366 -44.756  1.00 68.99           H\nATOM   7955  HG2 LYS B 117     -14.890  44.117 -43.552  1.00 68.99           H\nATOM   7956  HD3 LYS B 117     -14.221  46.085 -42.410  1.00 71.89           H\nATOM   7957  HD2 LYS B 117     -15.871  45.806 -41.924  1.00 71.89           H\nATOM   7958  HE3 LYS B 117     -16.671  47.542 -43.572  1.00 70.96           H\nATOM   7959  HE2 LYS B 117     -15.018  47.791 -44.105  1.00 70.96           H\nATOM   7960  HZ1 LYS B 117     -16.081  48.320 -41.423  1.00 71.10           H\nATOM   7961  HZ2 LYS B 117     -14.494  48.497 -41.855  1.00 71.10           H\nATOM   7962  HZ3 LYS B 117     -15.661  49.430 -42.556  1.00 71.10           H\nATOM   7963  N   THR B 118     -15.093  43.013 -46.695  1.00 64.34           N\nATOM   7964  CA  THR B 118     -14.193  43.133 -47.850  1.00 65.13           C\nATOM   7965  C   THR B 118     -14.413  42.028 -48.906  1.00 64.93           C\nATOM   7966  O   THR B 118     -14.085  42.278 -50.066  1.00 66.98           O\nATOM   7967  CB  THR B 118     -12.693  43.107 -47.440  1.00 65.08           C\nATOM   7968  OG1 THR B 118     -12.304  41.872 -46.866  1.00 68.36           O\nATOM   7969  CG2 THR B 118     -12.299  44.255 -46.498  1.00 63.01           C\nATOM   7970  H   THR B 118     -14.815  42.367 -45.969  1.00 64.34           H\nATOM   7971  HA  THR B 118     -14.365  44.086 -48.354  1.00 65.13           H\nATOM   7972  HB  THR B 118     -12.089  43.219 -48.342  1.00 65.08           H\nATOM   7973  HG1 THR B 118     -12.613  41.854 -45.953  1.00 68.36           H\nATOM   7974 HG21 THR B 118     -11.242  44.202 -46.235  1.00 63.01           H\nATOM   7975 HG22 THR B 118     -12.469  45.221 -46.975  1.00 63.01           H\nATOM   7976 HG23 THR B 118     -12.869  44.248 -45.571  1.00 63.01           H\nATOM   7977  N   ARG B 119     -14.965  40.861 -48.525  1.00 62.66           N\nATOM   7978  CA  ARG B 119     -15.148  39.714 -49.427  1.00 60.70           C\nATOM   7979  C   ARG B 119     -16.605  39.240 -49.549  1.00 58.18           C\nATOM   7980  O   ARG B 119     -16.883  38.541 -50.522  1.00 57.05           O\nATOM   7981  CB  ARG B 119     -14.245  38.537 -48.990  1.00 61.51           C\nATOM   7982  CG  ARG B 119     -12.736  38.848 -49.033  1.00 64.77           C\nATOM   7983  CD  ARG B 119     -11.839  37.679 -48.587  1.00 68.11           C\nATOM   7984  NE  ARG B 119     -11.877  36.541 -49.527  1.00 72.07           N\nATOM   7985  CZ  ARG B 119     -11.047  35.481 -49.559  1.00 74.20           C\nATOM   7986  NH1 ARG B 119     -10.014  35.356 -48.715  1.00 75.72           N\nATOM   7987  NH2 ARG B 119     -11.255  34.510 -50.456  1.00 77.44           N1+\nATOM   7988  H   ARG B 119     -15.193  40.705 -47.553  1.00 62.66           H\nATOM   7989  HA  ARG B 119     -14.851  39.983 -50.442  1.00 60.70           H\nATOM   7990  HB3 ARG B 119     -14.443  37.683 -49.639  1.00 61.51           H\nATOM   7991  HB2 ARG B 119     -14.518  38.208 -47.989  1.00 61.51           H\nATOM   7992  HG3 ARG B 119     -12.477  39.738 -48.462  1.00 64.77           H\nATOM   7993  HG2 ARG B 119     -12.499  39.092 -50.070  1.00 64.77           H\nATOM   7994  HD3 ARG B 119     -12.232  37.286 -47.650  1.00 68.11           H\nATOM   7995  HD2 ARG B 119     -10.827  38.024 -48.372  1.00 68.11           H\nATOM   7996  HE  ARG B 119     -12.631  36.565 -50.198  1.00 72.07           H\nATOM   7997 HH12 ARG B 119      -9.423  34.531 -48.752  1.00 75.72           H\nATOM   7998 HH11 ARG B 119      -9.828  36.065 -48.017  1.00 75.72           H\nATOM   7999 HH22 ARG B 119     -10.642  33.706 -50.476  1.00 77.44           H\nATOM   8000 HH21 ARG B 119     -12.024  34.561 -51.108  1.00 77.44           H\nATOM   8001  N   PHE B 120     -17.498  39.593 -48.604  1.00 55.81           N\nATOM   8002  CA  PHE B 120     -18.881  39.090 -48.568  1.00 55.43           C\nATOM   8003  C   PHE B 120     -19.921  40.210 -48.388  1.00 55.10           C\nATOM   8004  O   PHE B 120     -21.005  39.942 -47.869  1.00 52.53           O\nATOM   8005  CB  PHE B 120     -19.028  37.973 -47.506  1.00 55.05           C\nATOM   8006  CG  PHE B 120     -18.148  36.756 -47.724  1.00 51.61           C\nATOM   8007  CD1 PHE B 120     -18.502  35.796 -48.693  1.00 47.64           C\nATOM   8008  CD2 PHE B 120     -16.890  36.659 -47.096  1.00 50.31           C\nATOM   8009  CE1 PHE B 120     -17.641  34.748 -48.987  1.00 50.84           C\nATOM   8010  CE2 PHE B 120     -16.039  35.610 -47.409  1.00 51.41           C\nATOM   8011  CZ  PHE B 120     -16.412  34.658 -48.348  1.00 51.42           C\nATOM   8012  H   PHE B 120     -17.213  40.175 -47.829  1.00 55.81           H\nATOM   8013  HA  PHE B 120     -19.139  38.647 -49.530  1.00 55.43           H\nATOM   8014  HB3 PHE B 120     -20.059  37.616 -47.481  1.00 55.05           H\nATOM   8015  HB2 PHE B 120     -18.832  38.378 -46.516  1.00 55.05           H\nATOM   8016  HD1 PHE B 120     -19.441  35.884 -49.216  1.00 47.64           H\nATOM   8017  HD2 PHE B 120     -16.581  37.406 -46.381  1.00 50.31           H\nATOM   8018  HE1 PHE B 120     -17.922  34.011 -49.725  1.00 50.84           H\nATOM   8019  HE2 PHE B 120     -15.076  35.544 -46.929  1.00 51.41           H\nATOM   8020  HZ  PHE B 120     -15.738  33.849 -48.590  1.00 51.42           H\nATOM   8021  N   SER B 121     -19.602  41.439 -48.836  1.00 56.28           N\nATOM   8022  CA  SER B 121     -20.500  42.601 -48.763  1.00 58.60           C\nATOM   8023  C   SER B 121     -21.783  42.480 -49.615  1.00 59.09           C\nATOM   8024  O   SER B 121     -22.769  43.145 -49.298  1.00 60.92           O\nATOM   8025  CB  SER B 121     -19.711  43.889 -49.072  1.00 59.90           C\nATOM   8026  OG  SER B 121     -19.371  44.006 -50.440  1.00 64.94           O\nATOM   8027  H   SER B 121     -18.698  41.596 -49.258  1.00 56.28           H\nATOM   8028  HA  SER B 121     -20.819  42.672 -47.723  1.00 58.60           H\nATOM   8029  HB3 SER B 121     -18.804  43.929 -48.472  1.00 59.90           H\nATOM   8030  HB2 SER B 121     -20.303  44.762 -48.795  1.00 59.90           H\nATOM   8031  HG  SER B 121     -18.631  43.419 -50.623  1.00 64.94           H\nATOM   8032  N   TYR B 122     -21.760  41.607 -50.640  1.00 59.21           N\nATOM   8033  CA  TYR B 122     -22.910  41.233 -51.469  1.00 60.83           C\nATOM   8034  C   TYR B 122     -24.016  40.486 -50.699  1.00 62.87           C\nATOM   8035  O   TYR B 122     -25.170  40.543 -51.119  1.00 64.66           O\nATOM   8036  CB  TYR B 122     -22.420  40.395 -52.671  1.00 59.48           C\nATOM   8037  CG  TYR B 122     -21.726  39.073 -52.356  1.00 60.74           C\nATOM   8038  CD1 TYR B 122     -22.475  37.901 -52.105  1.00 59.27           C\nATOM   8039  CD2 TYR B 122     -20.318  39.004 -52.358  1.00 53.96           C\nATOM   8040  CE1 TYR B 122     -21.825  36.668 -51.898  1.00 61.47           C\nATOM   8041  CE2 TYR B 122     -19.669  37.771 -52.155  1.00 57.19           C\nATOM   8042  CZ  TYR B 122     -20.419  36.601 -51.938  1.00 59.07           C\nATOM   8043  OH  TYR B 122     -19.773  35.410 -51.783  1.00 60.78           O\nATOM   8044  H   TYR B 122     -20.904  41.107 -50.830  1.00 59.21           H\nATOM   8045  HA  TYR B 122     -23.349  42.155 -51.855  1.00 60.83           H\nATOM   8046  HB3 TYR B 122     -21.746  41.002 -53.276  1.00 59.48           H\nATOM   8047  HB2 TYR B 122     -23.266  40.176 -53.325  1.00 59.48           H\nATOM   8048  HD1 TYR B 122     -23.555  37.934 -52.105  1.00 59.27           H\nATOM   8049  HD2 TYR B 122     -19.730  39.891 -52.540  1.00 53.96           H\nATOM   8050  HE1 TYR B 122     -22.409  35.774 -51.734  1.00 61.47           H\nATOM   8051  HE2 TYR B 122     -18.592  37.716 -52.192  1.00 57.19           H\nATOM   8052  HH  TYR B 122     -20.349  34.641 -51.743  1.00 60.78           H\nATOM   8053  N   ALA B 123     -23.632  39.792 -49.615  1.00 64.38           N\nATOM   8054  CA  ALA B 123     -24.508  39.001 -48.758  1.00 64.25           C\nATOM   8055  C   ALA B 123     -24.810  39.707 -47.428  1.00 65.76           C\nATOM   8056  O   ALA B 123     -25.880  39.472 -46.868  1.00 66.78           O\nATOM   8057  CB  ALA B 123     -23.821  37.653 -48.496  1.00 63.26           C\nATOM   8058  H   ALA B 123     -22.657  39.801 -49.351  1.00 64.38           H\nATOM   8059  HA  ALA B 123     -25.459  38.805 -49.256  1.00 64.25           H\nATOM   8060  HB1 ALA B 123     -24.353  37.073 -47.744  1.00 63.26           H\nATOM   8061  HB2 ALA B 123     -23.776  37.051 -49.404  1.00 63.26           H\nATOM   8062  HB3 ALA B 123     -22.799  37.787 -48.136  1.00 63.26           H\nATOM   8063  N   PHE B 124     -23.867  40.536 -46.945  1.00 66.46           N\nATOM   8064  CA  PHE B 124     -23.907  41.173 -45.630  1.00 67.47           C\nATOM   8065  C   PHE B 124     -23.691  42.691 -45.793  1.00 68.87           C\nATOM   8066  O   PHE B 124     -22.539  43.128 -45.790  1.00 68.63           O\nATOM   8067  CB  PHE B 124     -22.823  40.539 -44.725  1.00 67.38           C\nATOM   8068  CG  PHE B 124     -22.950  39.038 -44.525  1.00 67.31           C\nATOM   8069  CD1 PHE B 124     -24.127  38.477 -43.985  1.00 63.58           C\nATOM   8070  CD2 PHE B 124     -21.888  38.185 -44.892  1.00 64.31           C\nATOM   8071  CE1 PHE B 124     -24.236  37.100 -43.843  1.00 62.57           C\nATOM   8072  CE2 PHE B 124     -22.010  36.813 -44.723  1.00 61.56           C\nATOM   8073  CZ  PHE B 124     -23.182  36.273 -44.209  1.00 59.77           C\nATOM   8074  H   PHE B 124     -23.014  40.672 -47.468  1.00 66.46           H\nATOM   8075  HA  PHE B 124     -24.860  40.990 -45.138  1.00 67.47           H\nATOM   8076  HB3 PHE B 124     -22.854  41.007 -43.739  1.00 67.38           H\nATOM   8077  HB2 PHE B 124     -21.829  40.750 -45.123  1.00 67.38           H\nATOM   8078  HD1 PHE B 124     -24.952  39.111 -43.695  1.00 63.58           H\nATOM   8079  HD2 PHE B 124     -20.980  38.596 -45.306  1.00 64.31           H\nATOM   8080  HE1 PHE B 124     -25.142  36.670 -43.442  1.00 62.57           H\nATOM   8081  HE2 PHE B 124     -21.194  36.162 -45.002  1.00 61.56           H\nATOM   8082  HZ  PHE B 124     -23.272  35.204 -44.087  1.00 59.77           H\nATOM   8083  N   PRO B 125     -24.783  43.483 -45.932  1.00 70.08           N\nATOM   8084  CA  PRO B 125     -24.672  44.953 -46.024  1.00 70.97           C\nATOM   8085  C   PRO B 125     -24.290  45.650 -44.700  1.00 71.48           C\nATOM   8086  O   PRO B 125     -23.786  46.771 -44.746  1.00 72.38           O\nATOM   8087  CB  PRO B 125     -26.056  45.384 -46.530  1.00 71.38           C\nATOM   8088  CG  PRO B 125     -27.005  44.330 -45.983  1.00 70.84           C\nATOM   8089  CD  PRO B 125     -26.180  43.048 -46.043  1.00 70.45           C\nATOM   8090  HA  PRO B 125     -23.921  45.224 -46.769  1.00 70.97           H\nATOM   8091  HB3 PRO B 125     -26.066  45.354 -47.620  1.00 71.38           H\nATOM   8092  HB2 PRO B 125     -26.340  46.395 -46.232  1.00 71.38           H\nATOM   8093  HG3 PRO B 125     -27.946  44.265 -46.531  1.00 70.84           H\nATOM   8094  HG2 PRO B 125     -27.240  44.563 -44.943  1.00 70.84           H\nATOM   8095  HD2 PRO B 125     -26.493  42.368 -45.252  1.00 70.45           H\nATOM   8096  HD3 PRO B 125     -26.314  42.548 -47.003  1.00 70.45           H\nATOM   8097  N   LYS B 126     -24.516  44.972 -43.561  1.00 70.62           N\nATOM   8098  CA  LYS B 126     -24.118  45.407 -42.224  1.00 69.33           C\nATOM   8099  C   LYS B 126     -22.823  44.697 -41.798  1.00 66.97           C\nATOM   8100  O   LYS B 126     -22.552  43.583 -42.252  1.00 66.25           O\nATOM   8101  CB  LYS B 126     -25.252  45.072 -41.230  1.00 69.86           C\nATOM   8102  CG  LYS B 126     -26.558  45.841 -41.496  1.00 70.23           C\nATOM   8103  CD  LYS B 126     -27.642  45.538 -40.450  0.00 70.50           C\nATOM   8104  CE  LYS B 126     -28.954  46.290 -40.728  0.00 70.53           C\nATOM   8105  NZ  LYS B 126     -29.980  45.997 -39.711  0.00 70.48           N1+\nATOM   8106  H   LYS B 126     -24.922  44.049 -43.615  1.00 70.62           H\nATOM   8107  HA  LYS B 126     -23.945  46.485 -42.211  1.00 69.33           H\nATOM   8108  HB3 LYS B 126     -24.919  45.308 -40.217  1.00 69.86           H\nATOM   8109  HB2 LYS B 126     -25.449  43.999 -41.239  1.00 69.86           H\nATOM   8110  HG3 LYS B 126     -26.938  45.592 -42.487  1.00 70.23           H\nATOM   8111  HG2 LYS B 126     -26.353  46.912 -41.507  1.00 70.23           H\nATOM   8112  HD3 LYS B 126     -27.266  45.803 -39.460  1.00 70.50           H\nATOM   8113  HD2 LYS B 126     -27.828  44.463 -40.430  1.00 70.50           H\nATOM   8114  HE3 LYS B 126     -29.346  46.016 -41.708  1.00 70.53           H\nATOM   8115  HE2 LYS B 126     -28.776  47.366 -40.742  1.00 70.53           H\nATOM   8116  HZ1 LYS B 126     -29.643  46.277 -38.801  1.00 70.48           H\nATOM   8117  HZ2 LYS B 126     -30.825  46.507 -39.927  1.00 70.48           H\nATOM   8118  HZ3 LYS B 126     -30.178  45.007 -39.705  1.00 70.48           H\nATOM   8119  N   GLU B 127     -22.074  45.343 -40.888  1.00 65.01           N\nATOM   8120  CA  GLU B 127     -20.904  44.775 -40.210  1.00 63.98           C\nATOM   8121  C   GLU B 127     -21.283  43.632 -39.250  1.00 62.09           C\nATOM   8122  O   GLU B 127     -22.425  43.575 -38.790  1.00 62.03           O\nATOM   8123  CB  GLU B 127     -20.166  45.891 -39.440  1.00 64.65           C\nATOM   8124  CG  GLU B 127     -19.563  46.980 -40.356  0.00 64.02           C\nATOM   8125  CD  GLU B 127     -18.752  48.071 -39.634  0.00 64.07           C\nATOM   8126  OE1 GLU B 127     -18.796  48.144 -38.385  0.00 63.99           O\nATOM   8127  OE2 GLU B 127     -18.079  48.831 -40.364  0.00 63.99           O1-\nATOM   8128  H   GLU B 127     -22.366  46.253 -40.563  1.00 65.01           H\nATOM   8129  HA  GLU B 127     -20.233  44.369 -40.969  1.00 63.98           H\nATOM   8130  HB3 GLU B 127     -19.369  45.451 -38.838  1.00 64.65           H\nATOM   8131  HB2 GLU B 127     -20.857  46.352 -38.732  1.00 64.65           H\nATOM   8132  HG3 GLU B 127     -20.357  47.473 -40.918  1.00 64.02           H\nATOM   8133  HG2 GLU B 127     -18.916  46.503 -41.094  1.00 64.02           H\nATOM   8134  N   PHE B 128     -20.296  42.764 -38.961  1.00 60.31           N\nATOM   8135  CA  PHE B 128     -20.379  41.611 -38.057  1.00 58.03           C\nATOM   8136  C   PHE B 128     -20.841  42.023 -36.635  1.00 58.92           C\nATOM   8137  O   PHE B 128     -20.068  42.687 -35.942  1.00 58.01           O\nATOM   8138  CB  PHE B 128     -18.991  40.934 -38.047  1.00 57.72           C\nATOM   8139  CG  PHE B 128     -18.860  39.693 -37.181  1.00 52.55           C\nATOM   8140  CD1 PHE B 128     -19.528  38.504 -37.542  1.00 48.08           C\nATOM   8141  CD2 PHE B 128     -18.139  39.735 -35.968  1.00 49.95           C\nATOM   8142  CE1 PHE B 128     -19.424  37.379 -36.737  1.00 48.07           C\nATOM   8143  CE2 PHE B 128     -18.045  38.596 -35.180  1.00 51.74           C\nATOM   8144  CZ  PHE B 128     -18.675  37.420 -35.569  1.00 46.44           C\nATOM   8145  H   PHE B 128     -19.391  42.911 -39.383  1.00 60.31           H\nATOM   8146  HA  PHE B 128     -21.069  40.904 -38.513  1.00 58.03           H\nATOM   8147  HB3 PHE B 128     -18.228  41.653 -37.748  1.00 57.72           H\nATOM   8148  HB2 PHE B 128     -18.736  40.638 -39.065  1.00 57.72           H\nATOM   8149  HD1 PHE B 128     -20.117  38.463 -38.446  1.00 48.08           H\nATOM   8150  HD2 PHE B 128     -17.650  40.646 -35.653  1.00 49.95           H\nATOM   8151  HE1 PHE B 128     -19.927  36.467 -37.018  1.00 48.07           H\nATOM   8152  HE2 PHE B 128     -17.484  38.625 -34.259  1.00 51.74           H\nATOM   8153  HZ  PHE B 128     -18.601  36.539 -34.951  1.00 46.44           H\nATOM   8154  N   PRO B 129     -22.102  41.703 -36.254  1.00 59.67           N\nATOM   8155  CA  PRO B 129     -22.732  42.300 -35.062  1.00 60.56           C\nATOM   8156  C   PRO B 129     -22.311  41.676 -33.718  1.00 61.23           C\nATOM   8157  O   PRO B 129     -22.576  42.279 -32.678  1.00 60.67           O\nATOM   8158  CB  PRO B 129     -24.231  42.098 -35.331  1.00 61.07           C\nATOM   8159  CG  PRO B 129     -24.296  40.788 -36.101  1.00 62.20           C\nATOM   8160  CD  PRO B 129     -23.046  40.841 -36.974  1.00 60.27           C\nATOM   8161  HA  PRO B 129     -22.518  43.370 -35.012  1.00 60.56           H\nATOM   8162  HB3 PRO B 129     -24.599  42.911 -35.959  1.00 61.07           H\nATOM   8163  HB2 PRO B 129     -24.845  42.080 -34.429  1.00 61.07           H\nATOM   8164  HG3 PRO B 129     -25.217  40.661 -36.671  1.00 62.20           H\nATOM   8165  HG2 PRO B 129     -24.220  39.955 -35.401  1.00 62.20           H\nATOM   8166  HD2 PRO B 129     -22.644  39.842 -37.151  1.00 60.27           H\nATOM   8167  HD3 PRO B 129     -23.292  41.287 -37.938  1.00 60.27           H\nATOM   8168  N   TYR B 130     -21.692  40.486 -33.759  1.00 61.66           N\nATOM   8169  CA  TYR B 130     -21.309  39.714 -32.581  1.00 61.54           C\nATOM   8170  C   TYR B 130     -19.964  40.170 -32.006  1.00 61.81           C\nATOM   8171  O   TYR B 130     -19.078  40.606 -32.742  1.00 63.65           O\nATOM   8172  CB  TYR B 130     -21.261  38.222 -32.950  1.00 60.97           C\nATOM   8173  CG  TYR B 130     -22.599  37.665 -33.392  1.00 57.84           C\nATOM   8174  CD1 TYR B 130     -23.595  37.397 -32.431  1.00 55.55           C\nATOM   8175  CD2 TYR B 130     -22.862  37.438 -34.759  1.00 53.59           C\nATOM   8176  CE1 TYR B 130     -24.849  36.902 -32.831  1.00 56.08           C\nATOM   8177  CE2 TYR B 130     -24.119  36.950 -35.161  1.00 55.44           C\nATOM   8178  CZ  TYR B 130     -25.108  36.677 -34.195  1.00 58.10           C\nATOM   8179  OH  TYR B 130     -26.318  36.185 -34.574  1.00 56.36           O\nATOM   8180  H   TYR B 130     -21.496  40.058 -34.652  1.00 61.66           H\nATOM   8181  HA  TYR B 130     -22.074  39.849 -31.813  1.00 61.54           H\nATOM   8182  HB3 TYR B 130     -20.921  37.634 -32.096  1.00 60.97           H\nATOM   8183  HB2 TYR B 130     -20.528  38.053 -33.736  1.00 60.97           H\nATOM   8184  HD1 TYR B 130     -23.404  37.577 -31.385  1.00 55.55           H\nATOM   8185  HD2 TYR B 130     -22.107  37.646 -35.503  1.00 53.59           H\nATOM   8186  HE1 TYR B 130     -25.607  36.693 -32.089  1.00 56.08           H\nATOM   8187  HE2 TYR B 130     -24.316  36.778 -36.209  1.00 55.44           H\nATOM   8188  HH  TYR B 130     -26.375  36.024 -35.524  1.00 56.36           H\nATOM   8189  N   ARG B 131     -19.852  40.007 -30.683  1.00 61.96           N\nATOM   8190  CA  ARG B 131     -18.654  40.248 -29.887  1.00 62.18           C\nATOM   8191  C   ARG B 131     -18.192  38.909 -29.279  1.00 61.96           C\nATOM   8192  O   ARG B 131     -18.857  37.887 -29.463  1.00 63.63           O\nATOM   8193  CB  ARG B 131     -19.012  41.337 -28.851  1.00 62.30           C\nATOM   8194  CG  ARG B 131     -17.812  42.050 -28.204  0.00 62.03           C\nATOM   8195  CD  ARG B 131     -18.255  43.218 -27.307  0.00 62.05           C\nATOM   8196  NE  ARG B 131     -17.126  44.086 -26.926  0.00 62.03           N\nATOM   8197  CZ  ARG B 131     -17.172  45.174 -26.133  0.00 62.01           C\nATOM   8198  NH1 ARG B 131     -18.306  45.580 -25.541  0.00 61.95           N\nATOM   8199  NH2 ARG B 131     -16.050  45.876 -25.931  0.00 61.94           N1+\nATOM   8200  H   ARG B 131     -20.634  39.618 -30.171  1.00 61.96           H\nATOM   8201  HA  ARG B 131     -17.853  40.620 -30.529  1.00 62.18           H\nATOM   8202  HB3 ARG B 131     -19.681  40.935 -28.091  1.00 62.30           H\nATOM   8203  HB2 ARG B 131     -19.590  42.108 -29.365  1.00 62.30           H\nATOM   8204  HG3 ARG B 131     -17.071  42.361 -28.942  1.00 62.03           H\nATOM   8205  HG2 ARG B 131     -17.321  41.319 -27.563  1.00 62.03           H\nATOM   8206  HD3 ARG B 131     -18.603  42.794 -26.365  1.00 62.05           H\nATOM   8207  HD2 ARG B 131     -19.094  43.774 -27.728  1.00 62.05           H\nATOM   8208  HE  ARG B 131     -16.236  43.836 -27.333  1.00 62.03           H\nATOM   8209 HH12 ARG B 131     -18.317  46.399 -24.951  1.00 61.95           H\nATOM   8210 HH11 ARG B 131     -19.160  45.061 -25.683  1.00 61.95           H\nATOM   8211 HH22 ARG B 131     -16.059  46.696 -25.341  1.00 61.94           H\nATOM   8212 HH21 ARG B 131     -15.184  45.596 -26.368  1.00 61.94           H\nATOM   8213  N   MET B 132     -17.027  38.913 -28.612  1.00 62.07           N\nATOM   8214  CA  MET B 132     -16.346  37.706 -28.133  1.00 62.36           C\nATOM   8215  C   MET B 132     -17.137  36.847 -27.124  1.00 62.88           C\nATOM   8216  O   MET B 132     -16.957  35.632 -27.124  1.00 64.22           O\nATOM   8217  CB  MET B 132     -14.951  38.087 -27.599  1.00 61.77           C\nATOM   8218  CG  MET B 132     -14.000  36.891 -27.448  1.00 63.83           C\nATOM   8219  SD  MET B 132     -13.499  36.153 -29.029  1.00 62.17           S\nATOM   8220  CE  MET B 132     -13.320  34.426 -28.526  1.00 62.75           C\nATOM   8221  H   MET B 132     -16.520  39.779 -28.503  1.00 62.07           H\nATOM   8222  HA  MET B 132     -16.209  37.081 -29.016  1.00 62.36           H\nATOM   8223  HB3 MET B 132     -15.045  38.603 -26.642  1.00 61.77           H\nATOM   8224  HB2 MET B 132     -14.485  38.804 -28.277  1.00 61.77           H\nATOM   8225  HG3 MET B 132     -14.442  36.120 -26.820  1.00 63.83           H\nATOM   8226  HG2 MET B 132     -13.109  37.211 -26.915  1.00 63.83           H\nATOM   8227  HE1 MET B 132     -12.946  33.840 -29.363  1.00 62.75           H\nATOM   8228  HE2 MET B 132     -12.625  34.334 -27.693  1.00 62.75           H\nATOM   8229  HE3 MET B 132     -14.283  34.016 -28.220  1.00 62.75           H\nATOM   8230  N   ASN B 133     -18.024  37.461 -26.323  1.00 63.01           N\nATOM   8231  CA  ASN B 133     -18.921  36.755 -25.397  1.00 62.10           C\nATOM   8232  C   ASN B 133     -19.923  35.815 -26.103  1.00 59.83           C\nATOM   8233  O   ASN B 133     -20.258  34.774 -25.538  1.00 57.80           O\nATOM   8234  CB  ASN B 133     -19.631  37.759 -24.454  1.00 62.92           C\nATOM   8235  CG  ASN B 133     -20.533  38.784 -25.155  1.00 65.91           C\nATOM   8236  OD1 ASN B 133     -20.047  39.657 -25.870  1.00 69.62           O\nATOM   8237  ND2 ASN B 133     -21.848  38.686 -24.946  1.00 71.02           N\nATOM   8238  H   ASN B 133     -18.148  38.462 -26.385  1.00 63.01           H\nATOM   8239  HA  ASN B 133     -18.283  36.128 -24.771  1.00 62.10           H\nATOM   8240  HB3 ASN B 133     -18.881  38.313 -23.888  1.00 62.92           H\nATOM   8241  HB2 ASN B 133     -20.214  37.212 -23.711  1.00 62.92           H\nATOM   8242 HD22 ASN B 133     -22.479  39.338 -25.389  1.00 71.02           H\nATOM   8243 HD21 ASN B 133     -22.222  37.957 -24.356  1.00 71.02           H\nATOM   8244  N   HIS B 134     -20.349  36.181 -27.325  1.00 59.03           N\nATOM   8245  CA  HIS B 134     -21.230  35.379 -28.174  1.00 58.12           C\nATOM   8246  C   HIS B 134     -20.500  34.197 -28.835  1.00 56.47           C\nATOM   8247  O   HIS B 134     -21.116  33.144 -28.986  1.00 56.87           O\nATOM   8248  CB  HIS B 134     -21.902  36.265 -29.238  1.00 58.68           C\nATOM   8249  CG  HIS B 134     -22.617  37.483 -28.712  1.00 61.43           C\nATOM   8250  ND1 HIS B 134     -22.121  38.780 -28.883  1.00 64.15           N\nATOM   8251  CD2 HIS B 134     -23.817  37.550 -28.038  1.00 64.17           C\nATOM   8252  CE1 HIS B 134     -23.032  39.567 -28.326  1.00 63.80           C\nATOM   8253  NE2 HIS B 134     -24.060  38.892 -27.810  1.00 63.82           N\nATOM   8254  H   HIS B 134     -20.012  37.044 -27.731  1.00 59.03           H\nATOM   8255  HA  HIS B 134     -22.020  34.969 -27.541  1.00 58.12           H\nATOM   8256  HB3 HIS B 134     -22.637  35.679 -29.790  1.00 58.68           H\nATOM   8257  HB2 HIS B 134     -21.165  36.596 -29.970  1.00 58.68           H\nATOM   8258  HD2 HIS B 134     -24.504  36.775 -27.730  1.00 64.17           H\nATOM   8259  HE1 HIS B 134     -22.948  40.644 -28.295  1.00 63.80           H\nATOM   8260  HE2 HIS B 134     -24.873  39.286 -27.358  1.00 63.82           H\nATOM   8261  N   ILE B 135     -19.209  34.374 -29.179  1.00 55.35           N\nATOM   8262  CA  ILE B 135     -18.327  33.310 -29.678  1.00 54.83           C\nATOM   8263  C   ILE B 135     -18.085  32.233 -28.602  1.00 54.63           C\nATOM   8264  O   ILE B 135     -18.181  31.046 -28.909  1.00 52.29           O\nATOM   8265  CB  ILE B 135     -16.931  33.848 -30.131  1.00 54.23           C\nATOM   8266  CG1 ILE B 135     -17.017  34.904 -31.259  1.00 53.17           C\nATOM   8267  CG2 ILE B 135     -15.899  32.749 -30.482  1.00 52.78           C\nATOM   8268  CD1 ILE B 135     -17.298  34.346 -32.662  1.00 54.97           C\nATOM   8269  H   ILE B 135     -18.778  35.275 -29.030  1.00 55.35           H\nATOM   8270  HA  ILE B 135     -18.819  32.833 -30.527  1.00 54.83           H\nATOM   8271  HB  ILE B 135     -16.507  34.381 -29.282  1.00 54.23           H\nATOM   8272 HG13 ILE B 135     -16.069  35.442 -31.296  1.00 53.17           H\nATOM   8273 HG12 ILE B 135     -17.762  35.663 -31.017  1.00 53.17           H\nATOM   8274 HG21 ILE B 135     -14.960  33.191 -30.795  1.00 52.78           H\nATOM   8275 HG22 ILE B 135     -15.649  32.109 -29.636  1.00 52.78           H\nATOM   8276 HG23 ILE B 135     -16.253  32.108 -31.289  1.00 52.78           H\nATOM   8277 HD11 ILE B 135     -17.670  35.129 -33.320  1.00 54.97           H\nATOM   8278 HD12 ILE B 135     -16.394  33.939 -33.114  1.00 54.97           H\nATOM   8279 HD13 ILE B 135     -18.044  33.555 -32.643  1.00 54.97           H\nATOM   8280  N   LEU B 136     -17.784  32.679 -27.370  1.00 55.47           N\nATOM   8281  CA  LEU B 136     -17.518  31.835 -26.205  1.00 56.56           C\nATOM   8282  C   LEU B 136     -18.737  30.993 -25.788  1.00 56.50           C\nATOM   8283  O   LEU B 136     -18.567  29.809 -25.498  1.00 57.79           O\nATOM   8284  CB  LEU B 136     -17.029  32.726 -25.039  1.00 56.65           C\nATOM   8285  CG  LEU B 136     -15.592  33.276 -25.201  1.00 56.80           C\nATOM   8286  CD1 LEU B 136     -15.293  34.359 -24.141  1.00 55.50           C\nATOM   8287  CD2 LEU B 136     -14.519  32.166 -25.235  1.00 52.70           C\nATOM   8288  H   LEU B 136     -17.715  33.676 -27.215  1.00 55.47           H\nATOM   8289  HA  LEU B 136     -16.731  31.133 -26.483  1.00 56.56           H\nATOM   8290  HB3 LEU B 136     -17.085  32.183 -24.097  1.00 56.65           H\nATOM   8291  HB2 LEU B 136     -17.726  33.558 -24.928  1.00 56.65           H\nATOM   8292  HG  LEU B 136     -15.544  33.772 -26.168  1.00 56.80           H\nATOM   8293 HD11 LEU B 136     -15.012  35.298 -24.618  1.00 55.50           H\nATOM   8294 HD12 LEU B 136     -16.161  34.570 -23.515  1.00 55.50           H\nATOM   8295 HD13 LEU B 136     -14.482  34.084 -23.467  1.00 55.50           H\nATOM   8296 HD21 LEU B 136     -13.719  32.322 -24.511  1.00 52.70           H\nATOM   8297 HD22 LEU B 136     -14.935  31.179 -25.038  1.00 52.70           H\nATOM   8298 HD23 LEU B 136     -14.051  32.124 -26.217  1.00 52.70           H\nATOM   8299  N   GLU B 137     -19.939  31.598 -25.803  0.50 56.18           N\nATOM   8300  CA  GLU B 137     -21.208  30.914 -25.543  0.50 55.82           C\nATOM   8301  C   GLU B 137     -21.527  29.856 -26.617  0.50 55.23           C\nATOM   8302  O   GLU B 137     -21.834  28.715 -26.273  0.50 55.30           O\nATOM   8303  CB  GLU B 137     -22.331  31.968 -25.385  0.50 56.27           C\nATOM   8304  CG  GLU B 137     -23.755  31.425 -25.116  0.50 58.34           C\nATOM   8305  CD  GLU B 137     -23.896  30.753 -23.742  0.50 60.55           C\nATOM   8306  OE1 GLU B 137     -24.296  31.461 -22.793  0.50 60.58           O\nATOM   8307  OE2 GLU B 137     -23.605  29.540 -23.651  0.50 61.77           O1-\nATOM   8308  H   GLU B 137     -20.001  32.579 -26.039  0.50 56.18           H\nATOM   8309  HA  GLU B 137     -21.097  30.392 -24.591  0.50 55.82           H\nATOM   8310  HB3 GLU B 137     -22.364  32.590 -26.281  0.50 56.27           H\nATOM   8311  HB2 GLU B 137     -22.062  32.650 -24.577  0.50 56.27           H\nATOM   8312  HG3 GLU B 137     -24.058  30.731 -25.900  0.50 58.34           H\nATOM   8313  HG2 GLU B 137     -24.465  32.250 -25.179  0.50 58.34           H\nATOM   8314  N   CYS B 138     -21.385  30.251 -27.894  1.00 54.20           N\nATOM   8315  CA  CYS B 138     -21.547  29.417 -29.087  1.00 53.19           C\nATOM   8316  C   CYS B 138     -20.605  28.191 -29.114  1.00 52.72           C\nATOM   8317  O   CYS B 138     -21.007  27.139 -29.609  1.00 51.92           O\nATOM   8318  CB  CYS B 138     -21.421  30.296 -30.353  1.00 52.63           C\nATOM   8319  SG  CYS B 138     -21.657  29.402 -31.912  1.00 51.28           S\nATOM   8320  H   CYS B 138     -21.126  31.212 -28.075  1.00 54.20           H\nATOM   8321  HA  CYS B 138     -22.567  29.027 -29.061  1.00 53.19           H\nATOM   8322  HB3 CYS B 138     -20.447  30.784 -30.387  1.00 52.63           H\nATOM   8323  HB2 CYS B 138     -22.167  31.090 -30.322  1.00 52.63           H\nATOM   8324  HG  CYS B 138     -20.552  28.657 -31.816  1.00 51.28           H\nATOM   8325  N   GLU B 139     -19.388  28.342 -28.560  1.00 52.20           N\nATOM   8326  CA  GLU B 139     -18.364  27.300 -28.459  1.00 52.90           C\nATOM   8327  C   GLU B 139     -18.753  26.152 -27.507  1.00 53.14           C\nATOM   8328  O   GLU B 139     -18.437  25.001 -27.805  1.00 51.92           O\nATOM   8329  CB  GLU B 139     -17.020  27.956 -28.073  1.00 52.01           C\nATOM   8330  CG  GLU B 139     -15.820  26.992 -27.998  1.00 55.20           C\nATOM   8331  CD  GLU B 139     -14.513  27.716 -27.657  1.00 54.63           C\nATOM   8332  OE1 GLU B 139     -14.421  28.259 -26.532  1.00 56.66           O\nATOM   8333  OE2 GLU B 139     -13.611  27.707 -28.523  1.00 59.93           O1-\nATOM   8334  H   GLU B 139     -19.127  29.248 -28.195  1.00 52.20           H\nATOM   8335  HA  GLU B 139     -18.244  26.868 -29.454  1.00 52.90           H\nATOM   8336  HB3 GLU B 139     -17.132  28.459 -27.114  1.00 52.01           H\nATOM   8337  HB2 GLU B 139     -16.786  28.744 -28.788  1.00 52.01           H\nATOM   8338  HG3 GLU B 139     -15.719  26.457 -28.944  1.00 55.20           H\nATOM   8339  HG2 GLU B 139     -15.992  26.233 -27.237  1.00 55.20           H\nATOM   8340  N   PHE B 140     -19.453  26.478 -26.404  1.00 53.68           N\nATOM   8341  CA  PHE B 140     -20.013  25.502 -25.463  1.00 53.29           C\nATOM   8342  C   PHE B 140     -21.149  24.653 -26.064  1.00 52.33           C\nATOM   8343  O   PHE B 140     -21.173  23.450 -25.812  1.00 52.57           O\nATOM   8344  CB  PHE B 140     -20.424  26.192 -24.139  1.00 53.34           C\nATOM   8345  CG  PHE B 140     -19.417  26.097 -23.000  1.00 55.54           C\nATOM   8346  CD1 PHE B 140     -18.039  26.331 -23.207  1.00 57.90           C\nATOM   8347  CD2 PHE B 140     -19.877  25.897 -21.680  1.00 57.33           C\nATOM   8348  CE1 PHE B 140     -17.160  26.291 -22.131  1.00 60.15           C\nATOM   8349  CE2 PHE B 140     -18.980  25.846 -20.623  1.00 59.42           C\nATOM   8350  CZ  PHE B 140     -17.625  26.037 -20.849  1.00 63.02           C\nATOM   8351  H   PHE B 140     -19.683  27.447 -26.232  1.00 53.68           H\nATOM   8352  HA  PHE B 140     -19.219  24.788 -25.230  1.00 53.29           H\nATOM   8353  HB3 PHE B 140     -21.350  25.745 -23.777  1.00 53.34           H\nATOM   8354  HB2 PHE B 140     -20.663  27.244 -24.303  1.00 53.34           H\nATOM   8355  HD1 PHE B 140     -17.660  26.536 -24.198  1.00 57.90           H\nATOM   8356  HD2 PHE B 140     -20.929  25.766 -21.487  1.00 57.33           H\nATOM   8357  HE1 PHE B 140     -16.107  26.463 -22.283  1.00 60.15           H\nATOM   8358  HE2 PHE B 140     -19.338  25.662 -19.621  1.00 59.42           H\nATOM   8359  HZ  PHE B 140     -16.929  25.999 -20.023  1.00 63.02           H\nATOM   8360  N   TYR B 141     -22.023  25.269 -26.884  1.00 51.27           N\nATOM   8361  CA  TYR B 141     -23.056  24.570 -27.660  1.00 51.52           C\nATOM   8362  C   TYR B 141     -22.475  23.668 -28.764  1.00 51.76           C\nATOM   8363  O   TYR B 141     -23.009  22.581 -28.987  1.00 53.94           O\nATOM   8364  CB  TYR B 141     -24.037  25.587 -28.282  1.00 49.89           C\nATOM   8365  CG  TYR B 141     -25.031  26.205 -27.317  1.00 54.27           C\nATOM   8366  CD1 TYR B 141     -26.107  25.433 -26.837  1.00 56.52           C\nATOM   8367  CD2 TYR B 141     -24.912  27.553 -26.924  1.00 57.24           C\nATOM   8368  CE1 TYR B 141     -27.065  26.004 -25.977  1.00 56.71           C\nATOM   8369  CE2 TYR B 141     -25.862  28.123 -26.055  1.00 58.07           C\nATOM   8370  CZ  TYR B 141     -26.943  27.352 -25.586  1.00 60.27           C\nATOM   8371  OH  TYR B 141     -27.872  27.918 -24.762  1.00 58.80           O\nATOM   8372  H   TYR B 141     -21.949  26.266 -27.032  1.00 51.27           H\nATOM   8373  HA  TYR B 141     -23.611  23.930 -26.971  1.00 51.52           H\nATOM   8374  HB3 TYR B 141     -24.639  25.088 -29.044  1.00 49.89           H\nATOM   8375  HB2 TYR B 141     -23.494  26.372 -28.810  1.00 49.89           H\nATOM   8376  HD1 TYR B 141     -26.200  24.401 -27.139  1.00 56.52           H\nATOM   8377  HD2 TYR B 141     -24.102  28.160 -27.298  1.00 57.24           H\nATOM   8378  HE1 TYR B 141     -27.893  25.405 -25.628  1.00 56.71           H\nATOM   8379  HE2 TYR B 141     -25.769  29.158 -25.763  1.00 58.07           H\nATOM   8380  HH  TYR B 141     -27.689  28.847 -24.597  1.00 58.80           H\nATOM   8381  N   LEU B 142     -21.398  24.129 -29.424  1.00 51.75           N\nATOM   8382  CA  LEU B 142     -20.693  23.410 -30.486  1.00 51.38           C\nATOM   8383  C   LEU B 142     -19.988  22.143 -29.967  1.00 51.58           C\nATOM   8384  O   LEU B 142     -20.138  21.089 -30.583  1.00 48.47           O\nATOM   8385  CB  LEU B 142     -19.735  24.391 -31.205  1.00 51.10           C\nATOM   8386  CG  LEU B 142     -18.891  23.809 -32.363  1.00 49.32           C\nATOM   8387  CD1 LEU B 142     -19.747  23.221 -33.505  1.00 47.82           C\nATOM   8388  CD2 LEU B 142     -17.903  24.862 -32.889  1.00 48.75           C\nATOM   8389  H   LEU B 142     -21.037  25.046 -29.197  1.00 51.75           H\nATOM   8390  HA  LEU B 142     -21.449  23.088 -31.204  1.00 51.38           H\nATOM   8391  HB3 LEU B 142     -19.056  24.814 -30.465  1.00 51.10           H\nATOM   8392  HB2 LEU B 142     -20.314  25.233 -31.586  1.00 51.10           H\nATOM   8393  HG  LEU B 142     -18.276  23.005 -31.963  1.00 49.32           H\nATOM   8394 HD11 LEU B 142     -19.430  23.585 -34.483  1.00 47.82           H\nATOM   8395 HD12 LEU B 142     -19.671  22.133 -33.527  1.00 47.82           H\nATOM   8396 HD13 LEU B 142     -20.801  23.474 -33.402  1.00 47.82           H\nATOM   8397 HD21 LEU B 142     -17.171  24.407 -33.556  1.00 48.75           H\nATOM   8398 HD22 LEU B 142     -18.415  25.650 -33.440  1.00 48.75           H\nATOM   8399 HD23 LEU B 142     -17.353  25.336 -32.076  1.00 48.75           H\nATOM   8400  N   LEU B 143     -19.267  22.257 -28.835  1.00 52.79           N\nATOM   8401  CA  LEU B 143     -18.573  21.140 -28.187  1.00 54.35           C\nATOM   8402  C   LEU B 143     -19.546  20.089 -27.613  1.00 54.70           C\nATOM   8403  O   LEU B 143     -19.278  18.895 -27.754  1.00 56.02           O\nATOM   8404  CB  LEU B 143     -17.612  21.680 -27.102  1.00 54.08           C\nATOM   8405  CG  LEU B 143     -16.625  20.625 -26.543  1.00 59.65           C\nATOM   8406  CD1 LEU B 143     -15.554  20.252 -27.583  1.00 58.51           C\nATOM   8407  CD2 LEU B 143     -15.986  21.071 -25.213  1.00 60.09           C\nATOM   8408  H   LEU B 143     -19.182  23.159 -28.385  1.00 52.79           H\nATOM   8409  HA  LEU B 143     -17.977  20.651 -28.960  1.00 54.35           H\nATOM   8410  HB3 LEU B 143     -18.214  22.092 -26.291  1.00 54.08           H\nATOM   8411  HB2 LEU B 143     -17.043  22.524 -27.495  1.00 54.08           H\nATOM   8412  HG  LEU B 143     -17.176  19.716 -26.307  1.00 59.65           H\nATOM   8413 HD11 LEU B 143     -14.685  19.785 -27.121  1.00 58.51           H\nATOM   8414 HD12 LEU B 143     -15.947  19.545 -28.313  1.00 58.51           H\nATOM   8415 HD13 LEU B 143     -15.209  21.129 -28.131  1.00 58.51           H\nATOM   8416 HD21 LEU B 143     -16.235  20.374 -24.412  1.00 60.09           H\nATOM   8417 HD22 LEU B 143     -14.899  21.118 -25.268  1.00 60.09           H\nATOM   8418 HD23 LEU B 143     -16.338  22.054 -24.904  1.00 60.09           H\nATOM   8419  N   GLU B 144     -20.659  20.554 -27.010  1.00 54.61           N\nATOM   8420  CA  GLU B 144     -21.746  19.727 -26.474  1.00 54.67           C\nATOM   8421  C   GLU B 144     -22.402  18.841 -27.547  1.00 54.65           C\nATOM   8422  O   GLU B 144     -22.562  17.642 -27.319  1.00 55.11           O\nATOM   8423  CB  GLU B 144     -22.778  20.631 -25.759  1.00 55.50           C\nATOM   8424  CG  GLU B 144     -24.029  19.905 -25.198  1.00 58.28           C\nATOM   8425  CD  GLU B 144     -25.066  20.810 -24.510  1.00 63.56           C\nATOM   8426  OE1 GLU B 144     -24.992  22.050 -24.661  1.00 64.83           O\nATOM   8427  OE2 GLU B 144     -25.948  20.236 -23.832  1.00 64.92           O1-\nATOM   8428  H   GLU B 144     -20.792  21.553 -26.928  1.00 54.61           H\nATOM   8429  HA  GLU B 144     -21.307  19.065 -25.726  1.00 54.67           H\nATOM   8430  HB3 GLU B 144     -23.089  21.419 -26.447  1.00 55.50           H\nATOM   8431  HB2 GLU B 144     -22.279  21.137 -24.932  1.00 55.50           H\nATOM   8432  HG3 GLU B 144     -23.708  19.136 -24.494  1.00 58.28           H\nATOM   8433  HG2 GLU B 144     -24.558  19.388 -25.999  1.00 58.28           H\nATOM   8434  N   LEU B 145     -22.739  19.454 -28.696  1.00 52.81           N\nATOM   8435  CA  LEU B 145     -23.330  18.793 -29.859  1.00 53.70           C\nATOM   8436  C   LEU B 145     -22.440  17.689 -30.442  1.00 51.72           C\nATOM   8437  O   LEU B 145     -22.940  16.594 -30.709  1.00 53.17           O\nATOM   8438  CB  LEU B 145     -23.698  19.850 -30.923  1.00 54.14           C\nATOM   8439  CG  LEU B 145     -24.168  19.264 -32.279  1.00 58.14           C\nATOM   8440  CD1 LEU B 145     -25.385  19.995 -32.842  1.00 60.92           C\nATOM   8441  CD2 LEU B 145     -23.044  19.169 -33.327  1.00 60.76           C\nATOM   8442  H   LEU B 145     -22.582  20.448 -28.787  1.00 52.81           H\nATOM   8443  HA  LEU B 145     -24.256  18.320 -29.525  1.00 53.70           H\nATOM   8444  HB3 LEU B 145     -22.859  20.526 -31.096  1.00 54.14           H\nATOM   8445  HB2 LEU B 145     -24.478  20.479 -30.491  1.00 54.14           H\nATOM   8446  HG  LEU B 145     -24.533  18.252 -32.098  1.00 58.14           H\nATOM   8447 HD11 LEU B 145     -25.972  19.287 -33.421  1.00 60.92           H\nATOM   8448 HD12 LEU B 145     -26.021  20.410 -32.062  1.00 60.92           H\nATOM   8449 HD13 LEU B 145     -25.119  20.811 -33.505  1.00 60.92           H\nATOM   8450 HD21 LEU B 145     -23.427  18.741 -34.250  1.00 60.76           H\nATOM   8451 HD22 LEU B 145     -22.613  20.145 -33.548  1.00 60.76           H\nATOM   8452 HD23 LEU B 145     -22.231  18.518 -33.020  1.00 60.76           H\nATOM   8453  N   MET B 146     -21.150  18.007 -30.643  1.00 49.21           N\nATOM   8454  CA  MET B 146     -20.171  17.090 -31.226  1.00 47.74           C\nATOM   8455  C   MET B 146     -19.795  15.918 -30.305  1.00 46.40           C\nATOM   8456  O   MET B 146     -19.106  15.015 -30.770  1.00 44.43           O\nATOM   8457  CB  MET B 146     -18.926  17.864 -31.693  1.00 45.39           C\nATOM   8458  CG  MET B 146     -19.208  18.782 -32.894  1.00 43.49           C\nATOM   8459  SD  MET B 146     -17.738  19.456 -33.704  1.00 50.27           S\nATOM   8460  CE  MET B 146     -16.876  20.208 -32.299  1.00 46.10           C\nATOM   8461  H   MET B 146     -20.817  18.931 -30.402  1.00 49.21           H\nATOM   8462  HA  MET B 146     -20.624  16.651 -32.113  1.00 47.74           H\nATOM   8463  HB3 MET B 146     -18.131  17.171 -31.972  1.00 45.39           H\nATOM   8464  HB2 MET B 146     -18.536  18.451 -30.860  1.00 45.39           H\nATOM   8465  HG3 MET B 146     -19.852  19.610 -32.605  1.00 43.49           H\nATOM   8466  HG2 MET B 146     -19.758  18.228 -33.657  1.00 43.49           H\nATOM   8467  HE1 MET B 146     -16.033  20.804 -32.648  1.00 46.10           H\nATOM   8468  HE2 MET B 146     -17.548  20.849 -31.732  1.00 46.10           H\nATOM   8469  HE3 MET B 146     -16.493  19.435 -31.634  1.00 46.10           H\nATOM   8470  N   ASP B 147     -20.262  15.938 -29.042  1.00 49.52           N\nATOM   8471  CA  ASP B 147     -20.008  14.937 -28.003  1.00 51.41           C\nATOM   8472  C   ASP B 147     -18.514  14.941 -27.610  1.00 51.39           C\nATOM   8473  O   ASP B 147     -17.933  13.886 -27.366  1.00 52.39           O\nATOM   8474  CB  ASP B 147     -20.567  13.537 -28.401  1.00 52.20           C\nATOM   8475  CG  ASP B 147     -20.700  12.478 -27.291  1.00 57.92           C\nATOM   8476  OD1 ASP B 147     -20.740  12.845 -26.095  1.00 61.74           O\nATOM   8477  OD2 ASP B 147     -20.862  11.299 -27.677  1.00 59.76           O1-\nATOM   8478  H   ASP B 147     -20.843  16.714 -28.755  1.00 49.52           H\nATOM   8479  HA  ASP B 147     -20.555  15.297 -27.131  1.00 51.41           H\nATOM   8480  HB3 ASP B 147     -19.962  13.118 -29.207  1.00 52.20           H\nATOM   8481  HB2 ASP B 147     -21.557  13.671 -28.838  1.00 52.20           H\nATOM   8482  N   CYS B 148     -17.910  16.146 -27.598  1.00 51.62           N\nATOM   8483  CA  CYS B 148     -16.499  16.419 -27.312  1.00 51.66           C\nATOM   8484  C   CYS B 148     -15.511  15.868 -28.370  1.00 50.65           C\nATOM   8485  O   CYS B 148     -14.311  15.805 -28.098  1.00 51.99           O\nATOM   8486  CB  CYS B 148     -16.113  16.029 -25.869  1.00 52.61           C\nATOM   8487  SG  CYS B 148     -16.953  17.148 -24.714  1.00 56.00           S\nATOM   8488  H   CYS B 148     -18.470  16.963 -27.807  1.00 51.62           H\nATOM   8489  HA  CYS B 148     -16.396  17.500 -27.392  1.00 51.66           H\nATOM   8490  HB3 CYS B 148     -15.044  16.113 -25.706  1.00 52.61           H\nATOM   8491  HB2 CYS B 148     -16.377  14.999 -25.632  1.00 52.61           H\nATOM   8492  HG  CYS B 148     -18.188  16.707 -24.969  1.00 56.00           H\nATOM   8493  N   CYS B 149     -16.019  15.506 -29.562  1.00 49.06           N\nATOM   8494  CA  CYS B 149     -15.249  14.971 -30.684  1.00 48.60           C\nATOM   8495  C   CYS B 149     -14.605  16.133 -31.463  1.00 48.46           C\nATOM   8496  O   CYS B 149     -15.315  16.861 -32.159  1.00 48.30           O\nATOM   8497  CB  CYS B 149     -16.136  14.119 -31.611  1.00 49.02           C\nATOM   8498  SG  CYS B 149     -16.834  12.706 -30.707  1.00 50.85           S\nATOM   8499  H   CYS B 149     -17.016  15.579 -29.712  1.00 49.06           H\nATOM   8500  HA  CYS B 149     -14.458  14.325 -30.296  1.00 48.60           H\nATOM   8501  HB3 CYS B 149     -15.550  13.730 -32.440  1.00 49.02           H\nATOM   8502  HB2 CYS B 149     -16.942  14.708 -32.048  1.00 49.02           H\nATOM   8503  HG  CYS B 149     -15.696  12.005 -30.657  1.00 50.85           H\nATOM   8504  N   LEU B 150     -13.282  16.291 -31.302  1.00 47.91           N\nATOM   8505  CA  LEU B 150     -12.490  17.405 -31.831  1.00 47.81           C\nATOM   8506  C   LEU B 150     -11.430  16.954 -32.852  1.00 48.07           C\nATOM   8507  O   LEU B 150     -11.100  17.747 -33.733  1.00 47.49           O\nATOM   8508  CB  LEU B 150     -11.794  18.133 -30.658  1.00 47.48           C\nATOM   8509  CG  LEU B 150     -12.735  18.851 -29.665  1.00 48.91           C\nATOM   8510  CD1 LEU B 150     -11.956  19.314 -28.419  1.00 49.54           C\nATOM   8511  CD2 LEU B 150     -13.496  20.019 -30.326  1.00 42.98           C\nATOM   8512  H   LEU B 150     -12.778  15.635 -30.716  1.00 47.91           H\nATOM   8513  HA  LEU B 150     -13.140  18.111 -32.350  1.00 47.81           H\nATOM   8514  HB3 LEU B 150     -11.084  18.863 -31.046  1.00 47.48           H\nATOM   8515  HB2 LEU B 150     -11.198  17.403 -30.111  1.00 47.48           H\nATOM   8516  HG  LEU B 150     -13.481  18.137 -29.316  1.00 48.91           H\nATOM   8517 HD11 LEU B 150     -12.384  20.205 -27.959  1.00 49.54           H\nATOM   8518 HD12 LEU B 150     -11.946  18.535 -27.658  1.00 49.54           H\nATOM   8519 HD13 LEU B 150     -10.921  19.548 -28.662  1.00 49.54           H\nATOM   8520 HD21 LEU B 150     -13.349  20.964 -29.803  1.00 42.98           H\nATOM   8521 HD22 LEU B 150     -13.186  20.189 -31.354  1.00 42.98           H\nATOM   8522 HD23 LEU B 150     -14.566  19.820 -30.342  1.00 42.98           H\nATOM   8523  N   ILE B 151     -10.909  15.719 -32.737  1.00 47.64           N\nATOM   8524  CA  ILE B 151      -9.943  15.147 -33.682  1.00 47.15           C\nATOM   8525  C   ILE B 151     -10.675  14.704 -34.963  1.00 46.47           C\nATOM   8526  O   ILE B 151     -11.621  13.924 -34.872  1.00 48.40           O\nATOM   8527  CB  ILE B 151      -9.182  13.933 -33.063  1.00 48.21           C\nATOM   8528  CG1 ILE B 151      -8.357  14.338 -31.816  1.00 48.60           C\nATOM   8529  CG2 ILE B 151      -8.302  13.139 -34.058  1.00 44.78           C\nATOM   8530  CD1 ILE B 151      -7.271  15.400 -32.054  1.00 47.97           C\nATOM   8531  H   ILE B 151     -11.210  15.116 -31.982  1.00 47.64           H\nATOM   8532  HA  ILE B 151      -9.216  15.916 -33.951  1.00 47.15           H\nATOM   8533  HB  ILE B 151      -9.936  13.232 -32.704  1.00 48.21           H\nATOM   8534 HG13 ILE B 151      -7.893  13.456 -31.375  1.00 48.60           H\nATOM   8535 HG12 ILE B 151      -9.034  14.711 -31.049  1.00 48.60           H\nATOM   8536 HG21 ILE B 151      -7.743  12.356 -33.544  1.00 44.78           H\nATOM   8537 HG22 ILE B 151      -8.894  12.641 -34.826  1.00 44.78           H\nATOM   8538 HG23 ILE B 151      -7.582  13.783 -34.562  1.00 44.78           H\nATOM   8539 HD11 ILE B 151      -6.621  15.482 -31.182  1.00 47.97           H\nATOM   8540 HD12 ILE B 151      -6.642  15.158 -32.909  1.00 47.97           H\nATOM   8541 HD13 ILE B 151      -7.708  16.385 -32.222  1.00 47.97           H\nATOM   8542  N   VAL B 152     -10.237  15.230 -36.119  1.00 45.97           N\nATOM   8543  CA  VAL B 152     -10.871  15.004 -37.418  1.00 45.32           C\nATOM   8544  C   VAL B 152      -9.796  14.604 -38.446  1.00 45.19           C\nATOM   8545  O   VAL B 152      -8.736  15.230 -38.500  1.00 44.76           O\nATOM   8546  CB  VAL B 152     -11.591  16.289 -37.930  1.00 45.33           C\nATOM   8547  CG1 VAL B 152     -12.284  16.106 -39.290  1.00 46.26           C\nATOM   8548  CG2 VAL B 152     -12.639  16.810 -36.931  1.00 42.41           C\nATOM   8549  H   VAL B 152      -9.443  15.855 -36.119  1.00 45.97           H\nATOM   8550  HA  VAL B 152     -11.600  14.194 -37.353  1.00 45.32           H\nATOM   8551  HB  VAL B 152     -10.845  17.077 -38.053  1.00 45.33           H\nATOM   8552 HG11 VAL B 152     -12.741  17.041 -39.607  1.00 46.26           H\nATOM   8553 HG12 VAL B 152     -11.603  15.799 -40.081  1.00 46.26           H\nATOM   8554 HG13 VAL B 152     -13.073  15.359 -39.223  1.00 46.26           H\nATOM   8555 HG21 VAL B 152     -13.169  17.679 -37.325  1.00 42.41           H\nATOM   8556 HG22 VAL B 152     -13.380  16.046 -36.699  1.00 42.41           H\nATOM   8557 HG23 VAL B 152     -12.178  17.121 -35.996  1.00 42.41           H\nATOM   8558  N   TYR B 153     -10.113  13.579 -39.252  1.00 44.96           N\nATOM   8559  CA  TYR B 153      -9.267  13.047 -40.322  1.00 45.05           C\nATOM   8560  C   TYR B 153      -9.705  13.639 -41.669  1.00 44.68           C\nATOM   8561  O   TYR B 153     -10.904  13.808 -41.892  1.00 46.37           O\nATOM   8562  CB  TYR B 153      -9.389  11.511 -40.349  1.00 45.50           C\nATOM   8563  CG  TYR B 153      -8.905  10.808 -39.095  1.00 46.61           C\nATOM   8564  CD1 TYR B 153      -9.740  10.751 -37.961  1.00 49.30           C\nATOM   8565  CD2 TYR B 153      -7.632  10.200 -39.059  1.00 45.22           C\nATOM   8566  CE1 TYR B 153      -9.301  10.104 -36.796  1.00 50.76           C\nATOM   8567  CE2 TYR B 153      -7.199   9.538 -37.893  1.00 49.27           C\nATOM   8568  CZ  TYR B 153      -8.037   9.492 -36.762  1.00 49.86           C\nATOM   8569  OH  TYR B 153      -7.634   8.859 -35.628  1.00 45.96           O\nATOM   8570  H   TYR B 153     -11.020  13.142 -39.156  1.00 44.96           H\nATOM   8571  HA  TYR B 153      -8.223  13.310 -40.139  1.00 45.05           H\nATOM   8572  HB3 TYR B 153      -8.824  11.114 -41.194  1.00 45.50           H\nATOM   8573  HB2 TYR B 153     -10.429  11.221 -40.514  1.00 45.50           H\nATOM   8574  HD1 TYR B 153     -10.718  11.209 -37.976  1.00 49.30           H\nATOM   8575  HD2 TYR B 153      -6.986  10.233 -39.924  1.00 45.22           H\nATOM   8576  HE1 TYR B 153      -9.938  10.082 -35.928  1.00 50.76           H\nATOM   8577  HE2 TYR B 153      -6.227   9.067 -37.874  1.00 49.27           H\nATOM   8578  HH  TYR B 153      -6.706   8.597 -35.661  1.00 45.96           H\nATOM   8579  N   HIS B 154      -8.722  13.933 -42.538  1.00 45.16           N\nATOM   8580  CA  HIS B 154      -8.929  14.599 -43.829  1.00 43.57           C\nATOM   8581  C   HIS B 154      -8.206  13.857 -44.970  1.00 43.96           C\nATOM   8582  O   HIS B 154      -7.236  13.151 -44.688  1.00 43.35           O\nATOM   8583  CB  HIS B 154      -8.423  16.050 -43.738  1.00 44.14           C\nATOM   8584  CG  HIS B 154      -9.094  16.880 -42.677  1.00 43.00           C\nATOM   8585  ND1 HIS B 154     -10.472  17.116 -42.676  1.00 43.54           N\nATOM   8586  CD2 HIS B 154      -8.529  17.502 -41.584  1.00 43.41           C\nATOM   8587  CE1 HIS B 154     -10.683  17.859 -41.603  1.00 45.24           C\nATOM   8588  NE2 HIS B 154      -9.571  18.115 -40.916  1.00 46.09           N\nATOM   8589  H   HIS B 154      -7.763  13.727 -42.299  1.00 45.16           H\nATOM   8590  HA  HIS B 154      -9.997  14.607 -44.029  1.00 43.57           H\nATOM   8591  HB3 HIS B 154      -8.572  16.558 -44.690  1.00 44.14           H\nATOM   8592  HB2 HIS B 154      -7.349  16.057 -43.546  1.00 44.14           H\nATOM   8593  HD2 HIS B 154      -7.508  17.555 -41.236  1.00 43.41           H\nATOM   8594  HE1 HIS B 154     -11.659  18.221 -41.316  1.00 45.24           H\nATOM   8595  HE2 HIS B 154      -9.501  18.670 -40.069  1.00 46.09           H\nATOM   8596  N   PRO B 155      -8.665  14.029 -46.238  1.00 43.55           N\nATOM   8597  CA  PRO B 155      -8.076  13.331 -47.398  1.00 43.38           C\nATOM   8598  C   PRO B 155      -6.642  13.740 -47.782  1.00 44.66           C\nATOM   8599  O   PRO B 155      -6.035  13.020 -48.568  1.00 45.11           O\nATOM   8600  CB  PRO B 155      -9.052  13.611 -48.559  1.00 42.44           C\nATOM   8601  CG  PRO B 155     -10.332  14.084 -47.901  1.00 43.02           C\nATOM   8602  CD  PRO B 155      -9.827  14.811 -46.669  1.00 41.70           C\nATOM   8603  HA  PRO B 155      -8.088  12.263 -47.176  1.00 43.38           H\nATOM   8604  HB3 PRO B 155      -9.223  12.740 -49.189  1.00 42.44           H\nATOM   8605  HB2 PRO B 155      -8.669  14.398 -49.207  1.00 42.44           H\nATOM   8606  HG3 PRO B 155     -10.923  13.222 -47.590  1.00 43.02           H\nATOM   8607  HG2 PRO B 155     -10.952  14.705 -48.548  1.00 43.02           H\nATOM   8608  HD2 PRO B 155      -9.491  15.816 -46.929  1.00 41.70           H\nATOM   8609  HD3 PRO B 155     -10.642  14.895 -45.954  1.00 41.70           H\nATOM   8610  N   TYR B 156      -6.123  14.858 -47.243  1.00 45.15           N\nATOM   8611  CA  TYR B 156      -4.801  15.415 -47.556  1.00 47.19           C\nATOM   8612  C   TYR B 156      -3.625  14.459 -47.283  1.00 51.05           C\nATOM   8613  O   TYR B 156      -2.716  14.386 -48.109  1.00 51.03           O\nATOM   8614  CB  TYR B 156      -4.594  16.730 -46.775  1.00 45.96           C\nATOM   8615  CG  TYR B 156      -5.661  17.783 -47.010  1.00 44.99           C\nATOM   8616  CD1 TYR B 156      -5.774  18.410 -48.267  1.00 43.26           C\nATOM   8617  CD2 TYR B 156      -6.556  18.126 -45.977  1.00 43.30           C\nATOM   8618  CE1 TYR B 156      -6.787  19.359 -48.493  1.00 45.46           C\nATOM   8619  CE2 TYR B 156      -7.581  19.062 -46.207  1.00 41.11           C\nATOM   8620  CZ  TYR B 156      -7.704  19.675 -47.469  1.00 40.20           C\nATOM   8621  OH  TYR B 156      -8.717  20.562 -47.699  1.00 44.84           O\nATOM   8622  H   TYR B 156      -6.688  15.404 -46.610  1.00 45.15           H\nATOM   8623  HA  TYR B 156      -4.794  15.644 -48.623  1.00 47.19           H\nATOM   8624  HB3 TYR B 156      -3.629  17.166 -47.033  1.00 45.96           H\nATOM   8625  HB2 TYR B 156      -4.545  16.519 -45.706  1.00 45.96           H\nATOM   8626  HD1 TYR B 156      -5.095  18.153 -49.066  1.00 43.26           H\nATOM   8627  HD2 TYR B 156      -6.470  17.662 -45.008  1.00 43.30           H\nATOM   8628  HE1 TYR B 156      -6.874  19.812 -49.469  1.00 45.46           H\nATOM   8629  HE2 TYR B 156      -8.275  19.295 -45.415  1.00 41.11           H\nATOM   8630  HH  TYR B 156      -9.304  20.675 -46.946  1.00 44.84           H\nATOM   8631  N   ARG B 157      -3.669  13.749 -46.142  1.00 52.25           N\nATOM   8632  CA  ARG B 157      -2.636  12.806 -45.710  1.00 53.72           C\nATOM   8633  C   ARG B 157      -2.573  11.502 -46.542  1.00 51.27           C\nATOM   8634  O   ARG B 157      -1.479  11.195 -47.015  1.00 51.73           O\nATOM   8635  CB  ARG B 157      -2.743  12.589 -44.185  1.00 54.92           C\nATOM   8636  CG  ARG B 157      -1.711  11.602 -43.594  1.00 62.30           C\nATOM   8637  CD  ARG B 157      -1.588  11.680 -42.059  1.00 70.67           C\nATOM   8638  NE  ARG B 157      -0.881  12.901 -41.615  1.00 79.37           N\nATOM   8639  CZ  ARG B 157      -1.008  13.562 -40.448  1.00 84.70           C\nATOM   8640  NH1 ARG B 157      -1.854  13.168 -39.484  1.00 87.27           N\nATOM   8641  NH2 ARG B 157      -0.263  14.656 -40.244  1.00 84.51           N1+\nATOM   8642  H   ARG B 157      -4.465  13.850 -45.530  1.00 52.25           H\nATOM   8643  HA  ARG B 157      -1.679  13.307 -45.872  1.00 53.72           H\nATOM   8644  HB3 ARG B 157      -3.741  12.234 -43.928  1.00 54.92           H\nATOM   8645  HB2 ARG B 157      -2.648  13.560 -43.698  1.00 54.92           H\nATOM   8646  HG3 ARG B 157      -0.745  11.870 -44.027  1.00 62.30           H\nATOM   8647  HG2 ARG B 157      -1.890  10.573 -43.908  1.00 62.30           H\nATOM   8648  HD3 ARG B 157      -1.163  10.770 -41.635  1.00 70.67           H\nATOM   8649  HD2 ARG B 157      -2.601  11.757 -41.665  1.00 70.67           H\nATOM   8650  HE  ARG B 157      -0.214  13.261 -42.282  1.00 79.37           H\nATOM   8651 HH12 ARG B 157      -1.944  13.689 -38.624  1.00 87.27           H\nATOM   8652 HH11 ARG B 157      -2.423  12.345 -39.622  1.00 87.27           H\nATOM   8653 HH22 ARG B 157      -0.342  15.175 -39.382  1.00 84.51           H\nATOM   8654 HH21 ARG B 157       0.381  14.975 -40.954  1.00 84.51           H\nATOM   8655  N   PRO B 158      -3.702  10.782 -46.769  1.00 49.68           N\nATOM   8656  CA  PRO B 158      -3.701   9.633 -47.693  1.00 50.20           C\nATOM   8657  C   PRO B 158      -3.450  10.003 -49.169  1.00 51.86           C\nATOM   8658  O   PRO B 158      -2.787   9.222 -49.846  1.00 50.79           O\nATOM   8659  CB  PRO B 158      -5.055   8.941 -47.461  1.00 49.68           C\nATOM   8660  CG  PRO B 158      -5.951  10.021 -46.882  1.00 49.40           C\nATOM   8661  CD  PRO B 158      -4.986  10.880 -46.071  1.00 49.00           C\nATOM   8662  HA  PRO B 158      -2.910   8.940 -47.397  1.00 50.20           H\nATOM   8663  HB3 PRO B 158      -4.928   8.143 -46.729  1.00 49.68           H\nATOM   8664  HB2 PRO B 158      -5.481   8.490 -48.358  1.00 49.68           H\nATOM   8665  HG3 PRO B 158      -6.782   9.629 -46.295  1.00 49.40           H\nATOM   8666  HG2 PRO B 158      -6.371  10.603 -47.700  1.00 49.40           H\nATOM   8667  HD2 PRO B 158      -5.367  11.891 -45.972  1.00 49.00           H\nATOM   8668  HD3 PRO B 158      -4.868  10.464 -45.070  1.00 49.00           H\nATOM   8669  N   LEU B 159      -3.904  11.188 -49.625  1.00 52.22           N\nATOM   8670  CA  LEU B 159      -3.633  11.720 -50.969  1.00 52.32           C\nATOM   8671  C   LEU B 159      -2.134  11.929 -51.237  1.00 53.33           C\nATOM   8672  O   LEU B 159      -1.671  11.563 -52.317  1.00 53.23           O\nATOM   8673  CB  LEU B 159      -4.429  13.029 -51.194  1.00 51.27           C\nATOM   8674  CG  LEU B 159      -4.285  13.698 -52.582  1.00 50.29           C\nATOM   8675  CD1 LEU B 159      -4.838  12.810 -53.717  1.00 50.72           C\nATOM   8676  CD2 LEU B 159      -4.902  15.111 -52.581  1.00 46.17           C\nATOM   8677  H   LEU B 159      -4.454  11.781 -49.018  1.00 52.22           H\nATOM   8678  HA  LEU B 159      -3.985  10.969 -51.675  1.00 52.32           H\nATOM   8679  HB3 LEU B 159      -4.125  13.744 -50.428  1.00 51.27           H\nATOM   8680  HB2 LEU B 159      -5.489  12.842 -51.027  1.00 51.27           H\nATOM   8681  HG  LEU B 159      -3.224  13.848 -52.779  1.00 50.29           H\nATOM   8682 HD11 LEU B 159      -4.079  12.643 -54.482  1.00 50.72           H\nATOM   8683 HD12 LEU B 159      -5.156  11.831 -53.361  1.00 50.72           H\nATOM   8684 HD13 LEU B 159      -5.708  13.244 -54.208  1.00 50.72           H\nATOM   8685 HD21 LEU B 159      -4.198  15.839 -52.984  1.00 46.17           H\nATOM   8686 HD22 LEU B 159      -5.808  15.171 -53.181  1.00 46.17           H\nATOM   8687 HD23 LEU B 159      -5.165  15.447 -51.578  1.00 46.17           H\nATOM   8688  N   LEU B 160      -1.416  12.481 -50.242  1.00 54.67           N\nATOM   8689  CA  LEU B 160       0.033  12.686 -50.258  1.00 56.19           C\nATOM   8690  C   LEU B 160       0.807  11.363 -50.420  1.00 55.72           C\nATOM   8691  O   LEU B 160       1.758  11.317 -51.195  1.00 55.81           O\nATOM   8692  CB  LEU B 160       0.448  13.446 -48.977  1.00 57.20           C\nATOM   8693  CG  LEU B 160       1.917  13.924 -48.936  1.00 64.39           C\nATOM   8694  CD1 LEU B 160       2.207  14.963 -50.037  1.00 68.85           C\nATOM   8695  CD2 LEU B 160       2.294  14.443 -47.533  1.00 68.31           C\nATOM   8696  H   LEU B 160      -1.889  12.767 -49.396  1.00 54.67           H\nATOM   8697  HA  LEU B 160       0.253  13.315 -51.122  1.00 56.19           H\nATOM   8698  HB3 LEU B 160       0.259  12.805 -48.116  1.00 57.20           H\nATOM   8699  HB2 LEU B 160      -0.196  14.316 -48.847  1.00 57.20           H\nATOM   8700  HG  LEU B 160       2.563  13.066 -49.119  1.00 64.39           H\nATOM   8701 HD11 LEU B 160       2.682  14.484 -50.893  1.00 68.85           H\nATOM   8702 HD12 LEU B 160       1.294  15.440 -50.395  1.00 68.85           H\nATOM   8703 HD13 LEU B 160       2.876  15.757 -49.705  1.00 68.85           H\nATOM   8704 HD21 LEU B 160       2.504  15.512 -47.523  1.00 68.31           H\nATOM   8705 HD22 LEU B 160       1.500  14.271 -46.805  1.00 68.31           H\nATOM   8706 HD23 LEU B 160       3.185  13.934 -47.161  1.00 68.31           H\nATOM   8707  N   GLN B 161       0.348  10.309 -49.725  1.00 55.30           N\nATOM   8708  CA  GLN B 161       0.893   8.955 -49.813  1.00 56.27           C\nATOM   8709  C   GLN B 161       0.637   8.282 -51.174  1.00 56.76           C\nATOM   8710  O   GLN B 161       1.526   7.584 -51.657  1.00 58.25           O\nATOM   8711  CB  GLN B 161       0.339   8.102 -48.653  1.00 56.16           C\nATOM   8712  CG  GLN B 161       0.838   8.562 -47.267  1.00 59.20           C\nATOM   8713  CD  GLN B 161       0.141   7.859 -46.098  1.00 66.93           C\nATOM   8714  OE1 GLN B 161      -0.630   6.919 -46.279  1.00 72.21           O\nATOM   8715  NE2 GLN B 161       0.419   8.317 -44.877  1.00 65.97           N\nATOM   8716  H   GLN B 161      -0.449  10.428 -49.115  1.00 55.30           H\nATOM   8717  HA  GLN B 161       1.976   9.027 -49.690  1.00 56.27           H\nATOM   8718  HB3 GLN B 161       0.619   7.057 -48.798  1.00 56.16           H\nATOM   8719  HB2 GLN B 161      -0.750   8.126 -48.678  1.00 56.16           H\nATOM   8720  HG3 GLN B 161       0.683   9.634 -47.149  1.00 59.20           H\nATOM   8721  HG2 GLN B 161       1.913   8.395 -47.189  1.00 59.20           H\nATOM   8722 HE22 GLN B 161      -0.005   7.884 -44.069  1.00 65.97           H\nATOM   8723 HE21 GLN B 161       1.063   9.085 -44.753  1.00 65.97           H\nATOM   8724  N   TYR B 162      -0.546   8.513 -51.775  1.00 57.57           N\nATOM   8725  CA  TYR B 162      -0.945   7.933 -53.061  1.00 57.37           C\nATOM   8726  C   TYR B 162      -0.201   8.524 -54.271  1.00 58.20           C\nATOM   8727  O   TYR B 162       0.188   7.749 -55.143  1.00 56.81           O\nATOM   8728  CB  TYR B 162      -2.474   8.042 -53.258  1.00 57.04           C\nATOM   8729  CG  TYR B 162      -3.358   7.242 -52.309  1.00 57.39           C\nATOM   8730  CD1 TYR B 162      -3.024   5.921 -51.937  1.00 57.46           C\nATOM   8731  CD2 TYR B 162      -4.555   7.812 -51.821  1.00 56.94           C\nATOM   8732  CE1 TYR B 162      -3.863   5.188 -51.076  1.00 57.85           C\nATOM   8733  CE2 TYR B 162      -5.383   7.088 -50.943  1.00 56.41           C\nATOM   8734  CZ  TYR B 162      -5.042   5.772 -50.576  1.00 58.37           C\nATOM   8735  OH  TYR B 162      -5.857   5.060 -49.747  1.00 59.27           O\nATOM   8736  H   TYR B 162      -1.237   9.086 -51.309  1.00 57.57           H\nATOM   8737  HA  TYR B 162      -0.673   6.877 -53.036  1.00 57.37           H\nATOM   8738  HB3 TYR B 162      -2.723   7.700 -54.261  1.00 57.04           H\nATOM   8739  HB2 TYR B 162      -2.769   9.091 -53.221  1.00 57.04           H\nATOM   8740  HD1 TYR B 162      -2.132   5.446 -52.315  1.00 57.46           H\nATOM   8741  HD2 TYR B 162      -4.838   8.814 -52.109  1.00 56.94           H\nATOM   8742  HE1 TYR B 162      -3.598   4.177 -50.805  1.00 57.85           H\nATOM   8743  HE2 TYR B 162      -6.290   7.536 -50.566  1.00 56.41           H\nATOM   8744  HH  TYR B 162      -5.526   4.178 -49.565  1.00 59.27           H\nATOM   8745  N   VAL B 163       0.010   9.853 -54.309  1.00 60.05           N\nATOM   8746  CA  VAL B 163       0.771  10.512 -55.381  1.00 61.51           C\nATOM   8747  C   VAL B 163       2.286  10.223 -55.314  1.00 63.23           C\nATOM   8748  O   VAL B 163       2.930  10.188 -56.361  1.00 63.20           O\nATOM   8749  CB  VAL B 163       0.574  12.053 -55.408  1.00 60.93           C\nATOM   8750  CG1 VAL B 163      -0.878  12.442 -55.731  1.00 60.34           C\nATOM   8751  CG2 VAL B 163       1.092  12.791 -54.158  1.00 61.50           C\nATOM   8752  H   VAL B 163      -0.344  10.446 -53.569  1.00 60.05           H\nATOM   8753  HA  VAL B 163       0.410  10.117 -56.334  1.00 61.51           H\nATOM   8754  HB  VAL B 163       1.155  12.429 -56.250  1.00 60.93           H\nATOM   8755 HG11 VAL B 163      -0.987  13.522 -55.819  1.00 60.34           H\nATOM   8756 HG12 VAL B 163      -1.186  12.014 -56.683  1.00 60.34           H\nATOM   8757 HG13 VAL B 163      -1.573  12.096 -54.966  1.00 60.34           H\nATOM   8758 HG21 VAL B 163       0.890  13.856 -54.214  1.00 61.50           H\nATOM   8759 HG22 VAL B 163       0.606  12.421 -53.260  1.00 61.50           H\nATOM   8760 HG23 VAL B 163       2.168  12.687 -54.028  1.00 61.50           H\nATOM   8761  N   GLN B 164       2.810   9.979 -54.099  1.00 64.60           N\nATOM   8762  CA  GLN B 164       4.180   9.524 -53.856  1.00 65.62           C\nATOM   8763  C   GLN B 164       4.398   8.053 -54.252  1.00 65.74           C\nATOM   8764  O   GLN B 164       5.484   7.723 -54.726  1.00 66.85           O\nATOM   8765  CB  GLN B 164       4.551   9.780 -52.382  1.00 66.50           C\nATOM   8766  CG  GLN B 164       4.818  11.272 -52.095  1.00 68.50           C\nATOM   8767  CD  GLN B 164       4.981  11.609 -50.609  1.00 71.72           C\nATOM   8768  OE1 GLN B 164       4.772  10.775 -49.730  1.00 72.36           O\nATOM   8769  NE2 GLN B 164       5.341  12.862 -50.326  1.00 66.76           N\nATOM   8770  H   GLN B 164       2.219  10.053 -53.282  1.00 64.60           H\nATOM   8771  HA  GLN B 164       4.849  10.120 -54.480  1.00 65.62           H\nATOM   8772  HB3 GLN B 164       5.443   9.211 -52.114  1.00 66.50           H\nATOM   8773  HB2 GLN B 164       3.751   9.404 -51.742  1.00 66.50           H\nATOM   8774  HG3 GLN B 164       4.006  11.885 -52.486  1.00 68.50           H\nATOM   8775  HG2 GLN B 164       5.718  11.582 -52.625  1.00 68.50           H\nATOM   8776 HE22 GLN B 164       5.460  13.154 -49.367  1.00 66.76           H\nATOM   8777 HE21 GLN B 164       5.483  13.535 -51.071  1.00 66.76           H\nATOM   8778  N   ASP B 165       3.355   7.216 -54.093  1.00 67.16           N\nATOM   8779  CA  ASP B 165       3.333   5.807 -54.495  1.00 68.89           C\nATOM   8780  C   ASP B 165       3.289   5.655 -56.033  1.00 69.33           C\nATOM   8781  O   ASP B 165       3.981   4.788 -56.566  1.00 69.61           O\nATOM   8782  CB  ASP B 165       2.183   5.047 -53.788  1.00 68.99           C\nATOM   8783  CG  ASP B 165       2.244   3.519 -53.916  1.00 71.53           C\nATOM   8784  OD1 ASP B 165       3.063   2.920 -53.185  1.00 78.98           O\nATOM   8785  OD2 ASP B 165       1.585   2.991 -54.837  1.00 75.86           O1-\nATOM   8786  H   ASP B 165       2.505   7.564 -53.672  1.00 67.16           H\nATOM   8787  HA  ASP B 165       4.274   5.367 -54.158  1.00 68.89           H\nATOM   8788  HB3 ASP B 165       1.218   5.413 -54.143  1.00 68.99           H\nATOM   8789  HB2 ASP B 165       2.194   5.293 -52.726  1.00 68.99           H\nATOM   8790  N   MET B 166       2.535   6.539 -56.715  1.00 69.97           N\nATOM   8791  CA  MET B 166       2.539   6.687 -58.175  1.00 70.28           C\nATOM   8792  C   MET B 166       3.880   7.199 -58.737  1.00 71.13           C\nATOM   8793  O   MET B 166       4.208   6.864 -59.875  1.00 71.03           O\nATOM   8794  CB  MET B 166       1.431   7.669 -58.611  1.00 69.50           C\nATOM   8795  CG  MET B 166       0.000   7.128 -58.541  1.00 70.60           C\nATOM   8796  SD  MET B 166      -1.194   8.347 -59.152  1.00 72.24           S\nATOM   8797  CE  MET B 166      -2.682   7.331 -59.251  1.00 65.96           C\nATOM   8798  H   MET B 166       1.968   7.200 -56.201  1.00 69.97           H\nATOM   8799  HA  MET B 166       2.344   5.711 -58.622  1.00 70.28           H\nATOM   8800  HB3 MET B 166       1.601   7.973 -59.645  1.00 69.50           H\nATOM   8801  HB2 MET B 166       1.498   8.586 -58.025  1.00 69.50           H\nATOM   8802  HG3 MET B 166      -0.266   6.847 -57.524  1.00 70.60           H\nATOM   8803  HG2 MET B 166      -0.082   6.228 -59.150  1.00 70.60           H\nATOM   8804  HE1 MET B 166      -3.507   7.902 -59.676  1.00 65.96           H\nATOM   8805  HE2 MET B 166      -2.506   6.451 -59.869  1.00 65.96           H\nATOM   8806  HE3 MET B 166      -2.962   7.007 -58.253  1.00 65.96           H\nATOM   8807  N   GLY B 167       4.601   8.027 -57.959  1.00 71.44           N\nATOM   8808  CA  GLY B 167       5.787   8.756 -58.414  1.00 72.27           C\nATOM   8809  C   GLY B 167       5.398   9.957 -59.296  1.00 72.47           C\nATOM   8810  O   GLY B 167       6.168  10.333 -60.179  1.00 73.38           O\nATOM   8811  H   GLY B 167       4.270   8.234 -57.027  1.00 71.44           H\nATOM   8812  HA3 GLY B 167       6.461   8.091 -58.957  1.00 72.27           H\nATOM   8813  HA2 GLY B 167       6.329   9.120 -57.541  1.00 72.27           H\nATOM   8814  N   GLN B 168       4.196  10.521 -59.084  1.00 72.99           N\nATOM   8815  CA  GLN B 168       3.576  11.566 -59.900  1.00 73.68           C\nATOM   8816  C   GLN B 168       3.176  12.784 -59.047  1.00 73.61           C\nATOM   8817  O   GLN B 168       2.166  13.423 -59.340  1.00 73.28           O\nATOM   8818  CB  GLN B 168       2.361  10.957 -60.643  1.00 74.07           C\nATOM   8819  CG  GLN B 168       2.694   9.861 -61.676  1.00 76.42           C\nATOM   8820  CD  GLN B 168       3.518  10.321 -62.885  1.00 80.60           C\nATOM   8821  OE1 GLN B 168       4.218   9.514 -63.490  1.00 83.46           O\nATOM   8822  NE2 GLN B 168       3.424  11.595 -63.275  1.00 81.38           N\nATOM   8823  H   GLN B 168       3.630  10.174 -58.320  1.00 72.99           H\nATOM   8824  HA  GLN B 168       4.288  11.949 -60.631  1.00 73.68           H\nATOM   8825  HB3 GLN B 168       1.793  11.738 -61.149  1.00 74.07           H\nATOM   8826  HB2 GLN B 168       1.677  10.535 -59.905  1.00 74.07           H\nATOM   8827  HG3 GLN B 168       1.762   9.434 -62.044  1.00 76.42           H\nATOM   8828  HG2 GLN B 168       3.223   9.040 -61.193  1.00 76.42           H\nATOM   8829 HE22 GLN B 168       3.962  11.922 -64.065  1.00 81.38           H\nATOM   8830 HE21 GLN B 168       2.835  12.242 -62.774  1.00 81.38           H\nATOM   8831  N   GLU B 169       3.971  13.087 -58.005  1.00 73.60           N\nATOM   8832  CA  GLU B 169       3.712  14.161 -57.046  1.00 73.42           C\nATOM   8833  C   GLU B 169       3.686  15.563 -57.685  1.00 73.42           C\nATOM   8834  O   GLU B 169       2.701  16.274 -57.503  1.00 73.82           O\nATOM   8835  CB  GLU B 169       4.692  14.040 -55.861  1.00 73.10           C\nATOM   8836  CG  GLU B 169       4.420  15.041 -54.714  0.00 72.92           C\nATOM   8837  CD  GLU B 169       5.288  14.855 -53.458  0.00 72.84           C\nATOM   8838  OE1 GLU B 169       6.329  14.164 -53.532  0.00 72.84           O\nATOM   8839  OE2 GLU B 169       4.886  15.414 -52.415  0.00 72.85           O1-\nATOM   8840  H   GLU B 169       4.785  12.517 -57.823  1.00 73.60           H\nATOM   8841  HA  GLU B 169       2.713  13.987 -56.647  1.00 73.42           H\nATOM   8842  HB3 GLU B 169       5.714  14.164 -56.224  1.00 73.10           H\nATOM   8843  HB2 GLU B 169       4.632  13.025 -55.465  1.00 73.10           H\nATOM   8844  HG3 GLU B 169       3.372  14.957 -54.424  1.00 72.92           H\nATOM   8845  HG2 GLU B 169       4.564  16.064 -55.064  1.00 72.92           H\nATOM   8846  N   ASP B 170       4.723  15.913 -58.465  1.00 72.69           N\nATOM   8847  CA  ASP B 170       4.835  17.210 -59.155  1.00 72.04           C\nATOM   8848  C   ASP B 170       3.731  17.446 -60.206  1.00 71.43           C\nATOM   8849  O   ASP B 170       3.343  18.595 -60.417  1.00 72.20           O\nATOM   8850  CB  ASP B 170       6.220  17.449 -59.817  1.00 72.65           C\nATOM   8851  CG  ASP B 170       7.477  17.298 -58.937  0.00 72.05           C\nATOM   8852  OD1 ASP B 170       7.355  17.177 -57.698  0.00 72.07           O\nATOM   8853  OD2 ASP B 170       8.574  17.375 -59.533  0.00 72.14           O1-\nATOM   8854  H   ASP B 170       5.510  15.289 -58.560  1.00 72.69           H\nATOM   8855  HA  ASP B 170       4.704  17.980 -58.391  1.00 72.04           H\nATOM   8856  HB3 ASP B 170       6.246  18.458 -60.232  1.00 72.65           H\nATOM   8857  HB2 ASP B 170       6.335  16.761 -60.656  1.00 72.65           H\nATOM   8858  N   MET B 171       3.253  16.360 -60.835  0.50 70.63           N\nATOM   8859  CA  MET B 171       2.234  16.383 -61.879  0.50 70.18           C\nATOM   8860  C   MET B 171       0.811  16.512 -61.305  0.50 68.41           C\nATOM   8861  O   MET B 171       0.107  17.460 -61.651  0.50 68.45           O\nATOM   8862  CB  MET B 171       2.410  15.125 -62.763  0.50 70.98           C\nATOM   8863  CG  MET B 171       1.475  15.030 -63.984  0.50 72.88           C\nATOM   8864  SD  MET B 171       1.588  16.389 -65.185  0.50 78.03           S\nATOM   8865  CE  MET B 171       3.291  16.179 -65.775  0.50 76.51           C\nATOM   8866  H   MET B 171       3.615  15.452 -60.584  0.50 70.63           H\nATOM   8867  HA  MET B 171       2.418  17.258 -62.506  0.50 70.18           H\nATOM   8868  HB3 MET B 171       2.266  14.232 -62.152  0.50 70.98           H\nATOM   8869  HB2 MET B 171       3.443  15.067 -63.105  0.50 70.98           H\nATOM   8870  HG3 MET B 171       0.439  14.961 -63.654  0.50 72.88           H\nATOM   8871  HG2 MET B 171       1.676  14.100 -64.516  0.50 72.88           H\nATOM   8872  HE1 MET B 171       3.489  16.871 -66.594  0.50 76.51           H\nATOM   8873  HE2 MET B 171       4.004  16.384 -64.977  0.50 76.51           H\nATOM   8874  HE3 MET B 171       3.448  15.163 -66.135  0.50 76.51           H\nATOM   8875  N   LEU B 172       0.414  15.538 -60.468  1.00 66.25           N\nATOM   8876  CA  LEU B 172      -0.974  15.324 -60.055  1.00 63.92           C\nATOM   8877  C   LEU B 172      -1.369  16.066 -58.770  1.00 61.00           C\nATOM   8878  O   LEU B 172      -2.533  16.453 -58.674  1.00 60.48           O\nATOM   8879  CB  LEU B 172      -1.226  13.810 -59.860  1.00 63.63           C\nATOM   8880  CG  LEU B 172      -1.101  12.943 -61.134  1.00 64.63           C\nATOM   8881  CD1 LEU B 172      -1.081  11.450 -60.769  1.00 67.31           C\nATOM   8882  CD2 LEU B 172      -2.183  13.246 -62.190  1.00 63.56           C\nATOM   8883  H   LEU B 172       1.071  14.818 -60.194  1.00 66.25           H\nATOM   8884  HA  LEU B 172      -1.636  15.683 -60.844  1.00 63.92           H\nATOM   8885  HB3 LEU B 172      -2.222  13.651 -59.440  1.00 63.63           H\nATOM   8886  HB2 LEU B 172      -0.531  13.445 -59.102  1.00 63.63           H\nATOM   8887  HG  LEU B 172      -0.133  13.162 -61.585  1.00 64.63           H\nATOM   8888 HD11 LEU B 172      -0.496  10.877 -61.489  1.00 67.31           H\nATOM   8889 HD12 LEU B 172      -0.645  11.280 -59.785  1.00 67.31           H\nATOM   8890 HD13 LEU B 172      -2.082  11.024 -60.745  1.00 67.31           H\nATOM   8891 HD21 LEU B 172      -2.758  12.360 -62.459  1.00 63.56           H\nATOM   8892 HD22 LEU B 172      -2.898  13.996 -61.853  1.00 63.56           H\nATOM   8893 HD23 LEU B 172      -1.729  13.608 -63.112  1.00 63.56           H\nATOM   8894  N   LEU B 173      -0.445  16.225 -57.801  1.00 58.77           N\nATOM   8895  CA  LEU B 173      -0.762  16.735 -56.457  1.00 57.03           C\nATOM   8896  C   LEU B 173      -1.356  18.158 -56.376  1.00 57.39           C\nATOM   8897  O   LEU B 173      -2.281  18.317 -55.584  1.00 57.79           O\nATOM   8898  CB  LEU B 173       0.433  16.568 -55.487  1.00 56.15           C\nATOM   8899  CG  LEU B 173       0.148  16.820 -53.983  1.00 55.04           C\nATOM   8900  CD1 LEU B 173      -0.934  15.894 -53.389  1.00 47.81           C\nATOM   8901  CD2 LEU B 173       1.452  16.769 -53.167  1.00 48.95           C\nATOM   8902  H   LEU B 173       0.506  15.914 -57.951  1.00 58.77           H\nATOM   8903  HA  LEU B 173      -1.546  16.067 -56.100  1.00 57.03           H\nATOM   8904  HB3 LEU B 173       1.218  17.260 -55.786  1.00 56.15           H\nATOM   8905  HB2 LEU B 173       0.853  15.571 -55.610  1.00 56.15           H\nATOM   8906  HG  LEU B 173      -0.214  17.843 -53.881  1.00 55.04           H\nATOM   8907 HD11 LEU B 173      -0.619  15.437 -52.451  1.00 47.81           H\nATOM   8908 HD12 LEU B 173      -1.845  16.454 -53.180  1.00 47.81           H\nATOM   8909 HD13 LEU B 173      -1.203  15.081 -54.062  1.00 47.81           H\nATOM   8910 HD21 LEU B 173       1.412  17.459 -52.323  1.00 48.95           H\nATOM   8911 HD22 LEU B 173       1.643  15.771 -52.773  1.00 48.95           H\nATOM   8912 HD23 LEU B 173       2.320  17.046 -53.765  1.00 48.95           H\nATOM   8913  N   PRO B 174      -0.900  19.147 -57.187  1.00 56.80           N\nATOM   8914  CA  PRO B 174      -1.504  20.497 -57.181  1.00 56.56           C\nATOM   8915  C   PRO B 174      -2.997  20.531 -57.553  1.00 55.76           C\nATOM   8916  O   PRO B 174      -3.760  21.252 -56.911  1.00 56.00           O\nATOM   8917  CB  PRO B 174      -0.642  21.302 -58.170  1.00 57.05           C\nATOM   8918  CG  PRO B 174       0.691  20.573 -58.198  1.00 57.05           C\nATOM   8919  CD  PRO B 174       0.281  19.116 -58.054  1.00 55.82           C\nATOM   8920  HA  PRO B 174      -1.374  20.907 -56.177  1.00 56.56           H\nATOM   8921  HB3 PRO B 174      -0.533  22.347 -57.877  1.00 57.05           H\nATOM   8922  HB2 PRO B 174      -1.077  21.286 -59.170  1.00 57.05           H\nATOM   8923  HG3 PRO B 174       1.287  20.870 -57.334  1.00 57.05           H\nATOM   8924  HG2 PRO B 174       1.277  20.769 -59.096  1.00 57.05           H\nATOM   8925  HD2 PRO B 174      -0.004  18.710 -59.025  1.00 55.82           H\nATOM   8926  HD3 PRO B 174       1.104  18.520 -57.662  1.00 55.82           H\nATOM   8927  N   LEU B 175      -3.381  19.719 -58.554  1.00 53.54           N\nATOM   8928  CA  LEU B 175      -4.759  19.560 -59.007  1.00 53.09           C\nATOM   8929  C   LEU B 175      -5.592  18.691 -58.050  1.00 51.07           C\nATOM   8930  O   LEU B 175      -6.722  19.066 -57.751  1.00 51.48           O\nATOM   8931  CB  LEU B 175      -4.756  19.007 -60.449  1.00 53.42           C\nATOM   8932  CG  LEU B 175      -6.149  18.809 -61.090  1.00 52.40           C\nATOM   8933  CD1 LEU B 175      -6.987  20.103 -61.150  1.00 53.56           C\nATOM   8934  CD2 LEU B 175      -6.014  18.167 -62.474  1.00 52.68           C\nATOM   8935  H   LEU B 175      -2.691  19.147 -59.021  1.00 53.54           H\nATOM   8936  HA  LEU B 175      -5.212  20.553 -59.025  1.00 53.09           H\nATOM   8937  HB3 LEU B 175      -4.225  18.053 -60.457  1.00 53.42           H\nATOM   8938  HB2 LEU B 175      -4.170  19.675 -61.083  1.00 53.42           H\nATOM   8939  HG  LEU B 175      -6.697  18.087 -60.486  1.00 52.40           H\nATOM   8940 HD11 LEU B 175      -7.458  20.238 -62.125  1.00 53.56           H\nATOM   8941 HD12 LEU B 175      -7.786  20.079 -60.408  1.00 53.56           H\nATOM   8942 HD13 LEU B 175      -6.388  20.993 -60.960  1.00 53.56           H\nATOM   8943 HD21 LEU B 175      -6.951  17.700 -62.769  1.00 52.68           H\nATOM   8944 HD22 LEU B 175      -5.753  18.902 -63.235  1.00 52.68           H\nATOM   8945 HD23 LEU B 175      -5.248  17.391 -62.478  1.00 52.68           H\nATOM   8946  N   ALA B 176      -5.029  17.563 -57.585  1.00 49.77           N\nATOM   8947  CA  ALA B 176      -5.691  16.622 -56.679  1.00 49.78           C\nATOM   8948  C   ALA B 176      -6.004  17.229 -55.300  1.00 48.29           C\nATOM   8949  O   ALA B 176      -7.097  16.996 -54.789  1.00 48.24           O\nATOM   8950  CB  ALA B 176      -4.843  15.349 -56.552  1.00 48.67           C\nATOM   8951  H   ALA B 176      -4.096  17.310 -57.885  1.00 49.77           H\nATOM   8952  HA  ALA B 176      -6.641  16.340 -57.136  1.00 49.78           H\nATOM   8953  HB1 ALA B 176      -5.383  14.580 -56.003  1.00 48.67           H\nATOM   8954  HB2 ALA B 176      -4.607  14.933 -57.531  1.00 48.67           H\nATOM   8955  HB3 ALA B 176      -3.903  15.538 -56.033  1.00 48.67           H\nATOM   8956  N   TRP B 177      -5.072  18.036 -54.762  1.00 48.09           N\nATOM   8957  CA  TRP B 177      -5.228  18.815 -53.529  1.00 48.99           C\nATOM   8958  C   TRP B 177      -6.326  19.883 -53.658  1.00 49.94           C\nATOM   8959  O   TRP B 177      -7.114  20.042 -52.728  1.00 50.64           O\nATOM   8960  CB  TRP B 177      -3.871  19.450 -53.164  1.00 49.24           C\nATOM   8961  CG  TRP B 177      -3.759  20.153 -51.841  1.00 48.17           C\nATOM   8962  CD1 TRP B 177      -4.250  21.378 -51.539  1.00 46.93           C\nATOM   8963  CD2 TRP B 177      -3.118  19.670 -50.622  1.00 47.69           C\nATOM   8964  NE1 TRP B 177      -3.954  21.687 -50.228  1.00 46.14           N\nATOM   8965  CE2 TRP B 177      -3.249  20.673 -49.613  1.00 49.96           C\nATOM   8966  CE3 TRP B 177      -2.426  18.487 -50.268  1.00 48.13           C\nATOM   8967  CZ2 TRP B 177      -2.714  20.514 -48.322  1.00 49.22           C\nATOM   8968  CZ3 TRP B 177      -1.878  18.319 -48.980  1.00 49.73           C\nATOM   8969  CH2 TRP B 177      -2.017  19.332 -48.011  1.00 50.16           C\nATOM   8970  H   TRP B 177      -4.195  18.166 -55.250  1.00 48.09           H\nATOM   8971  HA  TRP B 177      -5.512  18.123 -52.734  1.00 48.99           H\nATOM   8972  HB3 TRP B 177      -3.560  20.148 -53.943  1.00 49.24           H\nATOM   8973  HB2 TRP B 177      -3.114  18.666 -53.151  1.00 49.24           H\nATOM   8974  HD1 TRP B 177      -4.790  22.009 -52.231  1.00 46.93           H\nATOM   8975  HE1 TRP B 177      -4.216  22.566 -49.805  1.00 46.14           H\nATOM   8976  HE3 TRP B 177      -2.306  17.702 -51.000  1.00 48.13           H\nATOM   8977  HZ2 TRP B 177      -2.829  21.292 -47.582  1.00 49.22           H\nATOM   8978  HZ3 TRP B 177      -1.349  17.409 -48.738  1.00 49.73           H\nATOM   8979  HH2 TRP B 177      -1.588  19.197 -47.031  1.00 50.16           H\nATOM   8980  N   ARG B 178      -6.368  20.561 -54.820  1.00 49.21           N\nATOM   8981  CA  ARG B 178      -7.397  21.532 -55.188  1.00 48.43           C\nATOM   8982  C   ARG B 178      -8.804  20.908 -55.258  1.00 48.56           C\nATOM   8983  O   ARG B 178      -9.743  21.524 -54.758  1.00 47.98           O\nATOM   8984  CB  ARG B 178      -6.970  22.282 -56.475  1.00 48.57           C\nATOM   8985  CG  ARG B 178      -8.055  23.187 -57.093  1.00 49.77           C\nATOM   8986  CD  ARG B 178      -8.846  22.504 -58.226  1.00 48.06           C\nATOM   8987  NE  ARG B 178     -10.110  23.204 -58.504  1.00 48.04           N\nATOM   8988  CZ  ARG B 178     -10.390  24.178 -59.389  1.00 50.91           C\nATOM   8989  NH1 ARG B 178      -9.474  24.674 -60.235  1.00 48.48           N\nATOM   8990  NH2 ARG B 178     -11.636  24.666 -59.414  1.00 50.79           N1+\nATOM   8991  H   ARG B 178      -5.671  20.370 -55.527  1.00 49.21           H\nATOM   8992  HA  ARG B 178      -7.436  22.277 -54.394  1.00 48.43           H\nATOM   8993  HB3 ARG B 178      -6.637  21.575 -57.233  1.00 48.57           H\nATOM   8994  HB2 ARG B 178      -6.091  22.884 -56.241  1.00 48.57           H\nATOM   8995  HG3 ARG B 178      -7.511  24.015 -57.552  1.00 49.77           H\nATOM   8996  HG2 ARG B 178      -8.695  23.652 -56.340  1.00 49.77           H\nATOM   8997  HD3 ARG B 178      -9.006  21.442 -58.049  1.00 48.06           H\nATOM   8998  HD2 ARG B 178      -8.252  22.553 -59.138  1.00 48.06           H\nATOM   8999  HE  ARG B 178     -10.864  22.931 -57.880  1.00 48.04           H\nATOM   9000 HH12 ARG B 178      -9.716  25.406 -60.887  1.00 48.48           H\nATOM   9001 HH11 ARG B 178      -8.532  24.313 -60.221  1.00 48.48           H\nATOM   9002 HH22 ARG B 178     -11.894  25.396 -60.061  1.00 50.79           H\nATOM   9003 HH21 ARG B 178     -12.329  24.310 -58.768  1.00 50.79           H\nATOM   9004  N   ILE B 179      -8.924  19.696 -55.832  1.00 47.30           N\nATOM   9005  CA  ILE B 179     -10.188  18.956 -55.909  1.00 46.98           C\nATOM   9006  C   ILE B 179     -10.665  18.489 -54.514  1.00 45.14           C\nATOM   9007  O   ILE B 179     -11.867  18.561 -54.266  1.00 45.01           O\nATOM   9008  CB  ILE B 179     -10.127  17.746 -56.897  1.00 46.82           C\nATOM   9009  CG1 ILE B 179      -9.832  18.202 -58.348  1.00 47.30           C\nATOM   9010  CG2 ILE B 179     -11.404  16.872 -56.919  1.00 40.61           C\nATOM   9011  CD1 ILE B 179      -9.154  17.126 -59.207  1.00 48.41           C\nATOM   9012  H   ILE B 179      -8.111  19.248 -56.235  1.00 47.30           H\nATOM   9013  HA  ILE B 179     -10.941  19.649 -56.290  1.00 46.98           H\nATOM   9014  HB  ILE B 179      -9.298  17.112 -56.579  1.00 46.82           H\nATOM   9015 HG13 ILE B 179      -9.193  19.081 -58.355  1.00 47.30           H\nATOM   9016 HG12 ILE B 179     -10.752  18.524 -58.836  1.00 47.30           H\nATOM   9017 HG21 ILE B 179     -11.315  16.044 -57.620  1.00 40.61           H\nATOM   9018 HG22 ILE B 179     -11.633  16.431 -55.954  1.00 40.61           H\nATOM   9019 HG23 ILE B 179     -12.273  17.459 -57.216  1.00 40.61           H\nATOM   9020 HD11 ILE B 179      -9.130  17.423 -60.256  1.00 48.41           H\nATOM   9021 HD12 ILE B 179      -8.127  16.971 -58.884  1.00 48.41           H\nATOM   9022 HD13 ILE B 179      -9.664  16.166 -59.149  1.00 48.41           H\nATOM   9023  N   VAL B 180      -9.731  18.106 -53.615  1.00 45.03           N\nATOM   9024  CA  VAL B 180     -10.016  17.787 -52.208  1.00 46.08           C\nATOM   9025  C   VAL B 180     -10.591  18.984 -51.421  1.00 46.38           C\nATOM   9026  O   VAL B 180     -11.530  18.764 -50.658  1.00 46.52           O\nATOM   9027  CB  VAL B 180      -8.790  17.186 -51.444  1.00 46.53           C\nATOM   9028  CG1 VAL B 180      -8.919  17.148 -49.904  1.00 49.61           C\nATOM   9029  CG2 VAL B 180      -8.482  15.757 -51.919  1.00 43.18           C\nATOM   9030  H   VAL B 180      -8.760  18.071 -53.894  1.00 45.03           H\nATOM   9031  HA  VAL B 180     -10.792  17.021 -52.217  1.00 46.08           H\nATOM   9032  HB  VAL B 180      -7.916  17.795 -51.675  1.00 46.53           H\nATOM   9033 HG11 VAL B 180      -8.049  16.677 -49.446  1.00 49.61           H\nATOM   9034 HG12 VAL B 180      -8.997  18.142 -49.469  1.00 49.61           H\nATOM   9035 HG13 VAL B 180      -9.802  16.587 -49.597  1.00 49.61           H\nATOM   9036 HG21 VAL B 180      -7.590  15.363 -51.434  1.00 43.18           H\nATOM   9037 HG22 VAL B 180      -9.302  15.079 -51.683  1.00 43.18           H\nATOM   9038 HG23 VAL B 180      -8.317  15.716 -52.992  1.00 43.18           H\nATOM   9039  N   ASN B 181     -10.078  20.213 -51.648  1.00 46.94           N\nATOM   9040  CA  ASN B 181     -10.615  21.456 -51.061  1.00 46.91           C\nATOM   9041  C   ASN B 181     -12.089  21.700 -51.442  1.00 45.98           C\nATOM   9042  O   ASN B 181     -12.855  22.198 -50.617  1.00 47.46           O\nATOM   9043  CB  ASN B 181      -9.806  22.712 -51.485  1.00 47.16           C\nATOM   9044  CG  ASN B 181      -8.300  22.698 -51.204  1.00 48.56           C\nATOM   9045  OD1 ASN B 181      -7.517  23.199 -52.007  1.00 47.11           O\nATOM   9046  ND2 ASN B 181      -7.874  22.162 -50.063  1.00 47.84           N\nATOM   9047  H   ASN B 181      -9.301  20.318 -52.287  1.00 46.94           H\nATOM   9048  HA  ASN B 181     -10.581  21.366 -49.973  1.00 46.91           H\nATOM   9049  HB3 ASN B 181     -10.211  23.590 -50.980  1.00 47.16           H\nATOM   9050  HB2 ASN B 181      -9.941  22.898 -52.551  1.00 47.16           H\nATOM   9051 HD22 ASN B 181      -6.885  22.141 -49.864  1.00 47.84           H\nATOM   9052 HD21 ASN B 181      -8.519  21.751 -49.401  1.00 47.84           H\nATOM   9053  N   ASP B 182     -12.446  21.331 -52.682  1.00 45.59           N\nATOM   9054  CA  ASP B 182     -13.772  21.513 -53.270  1.00 45.23           C\nATOM   9055  C   ASP B 182     -14.809  20.490 -52.782  1.00 45.11           C\nATOM   9056  O   ASP B 182     -15.994  20.818 -52.819  1.00 43.91           O\nATOM   9057  CB  ASP B 182     -13.731  21.547 -54.816  1.00 44.73           C\nATOM   9058  CG  ASP B 182     -12.748  22.558 -55.433  1.00 48.41           C\nATOM   9059  OD1 ASP B 182     -12.472  23.604 -54.802  1.00 52.82           O\nATOM   9060  OD2 ASP B 182     -12.400  22.345 -56.612  1.00 45.67           O1-\nATOM   9061  H   ASP B 182     -11.746  20.936 -53.295  1.00 45.59           H\nATOM   9062  HA  ASP B 182     -14.140  22.486 -52.936  1.00 45.23           H\nATOM   9063  HB3 ASP B 182     -14.722  21.786 -55.202  1.00 44.73           H\nATOM   9064  HB2 ASP B 182     -13.477  20.554 -55.192  1.00 44.73           H\nATOM   9065  N   THR B 183     -14.388  19.304 -52.297  1.00 44.23           N\nATOM   9066  CA  THR B 183     -15.303  18.314 -51.706  1.00 44.83           C\nATOM   9067  C   THR B 183     -15.994  18.812 -50.418  1.00 45.81           C\nATOM   9068  O   THR B 183     -17.102  18.359 -50.141  1.00 46.76           O\nATOM   9069  CB  THR B 183     -14.633  16.947 -51.395  1.00 46.19           C\nATOM   9070  OG1 THR B 183     -13.766  16.975 -50.275  1.00 46.29           O\nATOM   9071  CG2 THR B 183     -13.917  16.327 -52.596  1.00 44.74           C\nATOM   9072  H   THR B 183     -13.403  19.077 -52.299  1.00 44.23           H\nATOM   9073  HA  THR B 183     -16.091  18.130 -52.440  1.00 44.83           H\nATOM   9074  HB  THR B 183     -15.431  16.254 -51.122  1.00 46.19           H\nATOM   9075  HG1 THR B 183     -13.007  17.531 -50.478  1.00 46.29           H\nATOM   9076 HG21 THR B 183     -13.602  15.307 -52.382  1.00 44.74           H\nATOM   9077 HG22 THR B 183     -14.572  16.291 -53.466  1.00 44.74           H\nATOM   9078 HG23 THR B 183     -13.030  16.891 -52.865  1.00 44.74           H\nATOM   9079  N   TYR B 184     -15.380  19.773 -49.704  1.00 46.23           N\nATOM   9080  CA  TYR B 184     -15.944  20.449 -48.530  1.00 45.67           C\nATOM   9081  C   TYR B 184     -17.109  21.412 -48.842  1.00 47.05           C\nATOM   9082  O   TYR B 184     -17.711  21.926 -47.905  1.00 46.94           O\nATOM   9083  CB  TYR B 184     -14.819  21.158 -47.754  1.00 45.16           C\nATOM   9084  CG  TYR B 184     -13.802  20.213 -47.143  1.00 45.03           C\nATOM   9085  CD1 TYR B 184     -14.012  19.668 -45.858  1.00 46.80           C\nATOM   9086  CD2 TYR B 184     -12.649  19.862 -47.870  1.00 45.60           C\nATOM   9087  CE1 TYR B 184     -13.072  18.773 -45.311  1.00 48.77           C\nATOM   9088  CE2 TYR B 184     -11.715  18.961 -47.330  1.00 46.55           C\nATOM   9089  CZ  TYR B 184     -11.925  18.420 -46.050  1.00 48.08           C\nATOM   9090  OH  TYR B 184     -11.006  17.563 -45.528  1.00 46.85           O\nATOM   9091  H   TYR B 184     -14.472  20.099 -50.003  1.00 46.23           H\nATOM   9092  HA  TYR B 184     -16.356  19.680 -47.877  1.00 45.67           H\nATOM   9093  HB3 TYR B 184     -15.242  21.738 -46.937  1.00 45.16           H\nATOM   9094  HB2 TYR B 184     -14.311  21.881 -48.393  1.00 45.16           H\nATOM   9095  HD1 TYR B 184     -14.893  19.931 -45.291  1.00 46.80           H\nATOM   9096  HD2 TYR B 184     -12.484  20.278 -48.851  1.00 45.60           H\nATOM   9097  HE1 TYR B 184     -13.231  18.358 -44.326  1.00 48.77           H\nATOM   9098  HE2 TYR B 184     -10.837  18.690 -47.898  1.00 46.55           H\nATOM   9099  HH  TYR B 184     -11.175  17.325 -44.611  1.00 46.85           H\nATOM   9100  N   ARG B 185     -17.450  21.617 -50.125  1.00 47.89           N\nATOM   9101  CA  ARG B 185     -18.698  22.254 -50.560  1.00 49.97           C\nATOM   9102  C   ARG B 185     -19.893  21.269 -50.541  1.00 49.78           C\nATOM   9103  O   ARG B 185     -21.030  21.718 -50.684  1.00 51.04           O\nATOM   9104  CB  ARG B 185     -18.492  22.806 -51.982  1.00 51.15           C\nATOM   9105  CG  ARG B 185     -17.435  23.926 -52.100  1.00 54.14           C\nATOM   9106  CD  ARG B 185     -16.926  24.157 -53.539  1.00 57.47           C\nATOM   9107  NE  ARG B 185     -17.964  24.672 -54.451  1.00 60.76           N\nATOM   9108  CZ  ARG B 185     -18.085  25.906 -54.975  1.00 59.44           C\nATOM   9109  NH1 ARG B 185     -17.247  26.909 -54.674  1.00 63.52           N\nATOM   9110  NH2 ARG B 185     -19.086  26.134 -55.833  1.00 55.27           N1+\nATOM   9111  H   ARG B 185     -16.891  21.200 -50.857  1.00 47.89           H\nATOM   9112  HA  ARG B 185     -18.942  23.087 -49.897  1.00 49.97           H\nATOM   9113  HB3 ARG B 185     -19.439  23.177 -52.367  1.00 51.15           H\nATOM   9114  HB2 ARG B 185     -18.227  21.977 -52.630  1.00 51.15           H\nATOM   9115  HG3 ARG B 185     -16.583  23.781 -51.436  1.00 54.14           H\nATOM   9116  HG2 ARG B 185     -17.920  24.839 -51.750  1.00 54.14           H\nATOM   9117  HD3 ARG B 185     -16.670  23.187 -53.966  1.00 57.47           H\nATOM   9118  HD2 ARG B 185     -15.994  24.723 -53.556  1.00 57.47           H\nATOM   9119  HE  ARG B 185     -18.666  23.995 -54.716  1.00 60.76           H\nATOM   9120 HH12 ARG B 185     -17.361  27.816 -55.105  1.00 63.52           H\nATOM   9121 HH11 ARG B 185     -16.489  26.759 -54.023  1.00 63.52           H\nATOM   9122 HH22 ARG B 185     -19.222  27.059 -56.226  1.00 55.27           H\nATOM   9123 HH21 ARG B 185     -19.728  25.390 -56.079  1.00 55.27           H\nATOM   9124  N   THR B 186     -19.619  19.961 -50.379  1.00 49.13           N\nATOM   9125  CA  THR B 186     -20.575  18.850 -50.412  1.00 46.63           C\nATOM   9126  C   THR B 186     -20.491  18.009 -49.111  1.00 47.70           C\nATOM   9127  O   THR B 186     -19.679  18.306 -48.235  1.00 46.16           O\nATOM   9128  CB  THR B 186     -20.306  17.932 -51.646  1.00 46.08           C\nATOM   9129  OG1 THR B 186     -19.249  17.016 -51.449  1.00 44.77           O\nATOM   9130  CG2 THR B 186     -20.070  18.679 -52.969  1.00 43.81           C\nATOM   9131  H   THR B 186     -18.655  19.684 -50.245  1.00 49.13           H\nATOM   9132  HA  THR B 186     -21.594  19.236 -50.477  1.00 46.63           H\nATOM   9133  HB  THR B 186     -21.198  17.322 -51.795  1.00 46.08           H\nATOM   9134  HG1 THR B 186     -18.442  17.510 -51.268  1.00 44.77           H\nATOM   9135 HG21 THR B 186     -20.024  17.983 -53.807  1.00 43.81           H\nATOM   9136 HG22 THR B 186     -20.875  19.385 -53.169  1.00 43.81           H\nATOM   9137 HG23 THR B 186     -19.132  19.236 -52.958  1.00 43.81           H\nATOM   9138  N   ASP B 187     -21.353  16.984 -49.008  1.00 47.98           N\nATOM   9139  CA  ASP B 187     -21.537  16.117 -47.833  1.00 49.25           C\nATOM   9140  C   ASP B 187     -20.546  14.938 -47.713  1.00 48.87           C\nATOM   9141  O   ASP B 187     -20.703  14.158 -46.774  1.00 50.76           O\nATOM   9142  CB  ASP B 187     -22.986  15.560 -47.776  1.00 49.87           C\nATOM   9143  CG  ASP B 187     -24.109  16.605 -47.771  1.00 50.65           C\nATOM   9144  OD1 ASP B 187     -23.914  17.684 -47.170  1.00 48.11           O\nATOM   9145  OD2 ASP B 187     -25.213  16.252 -48.240  1.00 52.50           O1-\nATOM   9146  H   ASP B 187     -21.989  16.807 -49.772  1.00 47.98           H\nATOM   9147  HA  ASP B 187     -21.374  16.723 -46.940  1.00 49.25           H\nATOM   9148  HB3 ASP B 187     -23.130  14.949 -46.883  1.00 49.87           H\nATOM   9149  HB2 ASP B 187     -23.140  14.909 -48.638  1.00 49.87           H\nATOM   9150  N   LEU B 188     -19.570  14.792 -48.630  1.00 46.67           N\nATOM   9151  CA  LEU B 188     -18.669  13.627 -48.728  1.00 46.58           C\nATOM   9152  C   LEU B 188     -17.898  13.262 -47.439  1.00 46.28           C\nATOM   9153  O   LEU B 188     -17.738  12.072 -47.167  1.00 46.29           O\nATOM   9154  CB  LEU B 188     -17.691  13.814 -49.912  1.00 46.62           C\nATOM   9155  CG  LEU B 188     -18.359  13.792 -51.306  1.00 47.71           C\nATOM   9156  CD1 LEU B 188     -17.373  14.256 -52.401  1.00 45.49           C\nATOM   9157  CD2 LEU B 188     -18.984  12.420 -51.631  1.00 45.57           C\nATOM   9158  H   LEU B 188     -19.484  15.478 -49.367  1.00 46.67           H\nATOM   9159  HA  LEU B 188     -19.308  12.769 -48.942  1.00 46.58           H\nATOM   9160  HB3 LEU B 188     -16.922  13.039 -49.888  1.00 46.62           H\nATOM   9161  HB2 LEU B 188     -17.161  14.759 -49.780  1.00 46.62           H\nATOM   9162  HG  LEU B 188     -19.183  14.502 -51.302  1.00 47.71           H\nATOM   9163 HD11 LEU B 188     -17.476  13.700 -53.333  1.00 45.49           H\nATOM   9164 HD12 LEU B 188     -17.532  15.305 -52.650  1.00 45.49           H\nATOM   9165 HD13 LEU B 188     -16.336  14.156 -52.080  1.00 45.49           H\nATOM   9166 HD21 LEU B 188     -18.840  12.125 -52.668  1.00 45.57           H\nATOM   9167 HD22 LEU B 188     -18.558  11.632 -51.013  1.00 45.57           H\nATOM   9168 HD23 LEU B 188     -20.060  12.432 -51.454  1.00 45.57           H\nATOM   9169  N   CYS B 189     -17.474  14.270 -46.655  1.00 46.65           N\nATOM   9170  CA  CYS B 189     -16.776  14.120 -45.370  1.00 45.11           C\nATOM   9171  C   CYS B 189     -17.643  13.536 -44.232  1.00 45.75           C\nATOM   9172  O   CYS B 189     -17.078  13.045 -43.255  1.00 45.57           O\nATOM   9173  CB  CYS B 189     -16.098  15.441 -44.935  1.00 44.40           C\nATOM   9174  SG  CYS B 189     -17.290  16.704 -44.376  1.00 46.22           S\nATOM   9175  H   CYS B 189     -17.620  15.223 -46.965  1.00 46.65           H\nATOM   9176  HA  CYS B 189     -15.974  13.401 -45.545  1.00 45.11           H\nATOM   9177  HB3 CYS B 189     -15.486  15.846 -45.741  1.00 44.40           H\nATOM   9178  HB2 CYS B 189     -15.416  15.249 -44.106  1.00 44.40           H\nATOM   9179  HG  CYS B 189     -17.666  16.061 -43.266  1.00 46.22           H\nATOM   9180  N   LEU B 190     -18.978  13.603 -44.369  1.00 47.27           N\nATOM   9181  CA  LEU B 190     -19.940  13.052 -43.415  1.00 47.43           C\nATOM   9182  C   LEU B 190     -20.400  11.636 -43.805  1.00 48.57           C\nATOM   9183  O   LEU B 190     -21.108  11.032 -43.006  1.00 49.20           O\nATOM   9184  CB  LEU B 190     -21.176  13.983 -43.322  1.00 46.50           C\nATOM   9185  CG  LEU B 190     -20.898  15.438 -42.879  1.00 46.96           C\nATOM   9186  CD1 LEU B 190     -22.183  16.289 -42.988  1.00 44.48           C\nATOM   9187  CD2 LEU B 190     -20.255  15.521 -41.476  1.00 46.18           C\nATOM   9188  H   LEU B 190     -19.373  14.018 -45.203  1.00 47.27           H\nATOM   9189  HA  LEU B 190     -19.484  12.975 -42.426  1.00 47.43           H\nATOM   9190  HB3 LEU B 190     -21.902  13.552 -42.631  1.00 46.50           H\nATOM   9191  HB2 LEU B 190     -21.674  14.001 -44.293  1.00 46.50           H\nATOM   9192  HG  LEU B 190     -20.188  15.871 -43.584  1.00 46.96           H\nATOM   9193 HD11 LEU B 190     -22.471  16.751 -42.044  1.00 44.48           H\nATOM   9194 HD12 LEU B 190     -22.054  17.091 -43.716  1.00 44.48           H\nATOM   9195 HD13 LEU B 190     -23.037  15.699 -43.319  1.00 44.48           H\nATOM   9196 HD21 LEU B 190     -20.700  16.292 -40.848  1.00 46.18           H\nATOM   9197 HD22 LEU B 190     -20.340  14.580 -40.931  1.00 46.18           H\nATOM   9198 HD23 LEU B 190     -19.192  15.755 -41.554  1.00 46.18           H\nATOM   9199  N   LEU B 191     -20.048  11.145 -45.008  1.00 49.37           N\nATOM   9200  CA  LEU B 191     -20.625   9.928 -45.592  1.00 49.76           C\nATOM   9201  C   LEU B 191     -19.587   8.840 -45.913  1.00 49.79           C\nATOM   9202  O   LEU B 191     -19.964   7.668 -45.918  1.00 48.64           O\nATOM   9203  CB  LEU B 191     -21.395  10.307 -46.879  1.00 51.09           C\nATOM   9204  CG  LEU B 191     -22.622  11.221 -46.664  1.00 51.97           C\nATOM   9205  CD1 LEU B 191     -23.255  11.612 -48.015  1.00 52.66           C\nATOM   9206  CD2 LEU B 191     -23.660  10.611 -45.706  1.00 51.05           C\nATOM   9207  H   LEU B 191     -19.455  11.695 -45.614  1.00 49.37           H\nATOM   9208  HA  LEU B 191     -21.324   9.465 -44.895  1.00 49.76           H\nATOM   9209  HB3 LEU B 191     -21.729   9.399 -47.386  1.00 51.09           H\nATOM   9210  HB2 LEU B 191     -20.706  10.799 -47.568  1.00 51.09           H\nATOM   9211  HG  LEU B 191     -22.275  12.147 -46.208  1.00 51.97           H\nATOM   9212 HD11 LEU B 191     -23.458  12.681 -48.050  1.00 52.66           H\nATOM   9213 HD12 LEU B 191     -22.603  11.379 -48.857  1.00 52.66           H\nATOM   9214 HD13 LEU B 191     -24.199  11.098 -48.192  1.00 52.66           H\nATOM   9215 HD21 LEU B 191     -24.673  10.887 -45.988  1.00 51.05           H\nATOM   9216 HD22 LEU B 191     -23.610   9.522 -45.687  1.00 51.05           H\nATOM   9217 HD23 LEU B 191     -23.508  10.969 -44.687  1.00 51.05           H\nATOM   9218  N   TYR B 192     -18.329   9.220 -46.194  1.00 50.18           N\nATOM   9219  CA  TYR B 192     -17.271   8.308 -46.641  1.00 49.68           C\nATOM   9220  C   TYR B 192     -15.992   8.550 -45.821  1.00 50.58           C\nATOM   9221  O   TYR B 192     -15.699   9.710 -45.527  1.00 49.63           O\nATOM   9222  CB  TYR B 192     -16.969   8.575 -48.132  1.00 49.66           C\nATOM   9223  CG  TYR B 192     -18.123   8.286 -49.074  1.00 49.84           C\nATOM   9224  CD1 TYR B 192     -18.330   6.984 -49.577  1.00 53.19           C\nATOM   9225  CD2 TYR B 192     -18.998   9.326 -49.447  1.00 51.20           C\nATOM   9226  CE1 TYR B 192     -19.404   6.728 -50.453  1.00 53.89           C\nATOM   9227  CE2 TYR B 192     -20.076   9.069 -50.313  1.00 53.44           C\nATOM   9228  CZ  TYR B 192     -20.280   7.770 -50.817  1.00 53.62           C\nATOM   9229  OH  TYR B 192     -21.330   7.530 -51.652  1.00 50.95           O\nATOM   9230  H   TYR B 192     -18.083  10.201 -46.174  1.00 50.18           H\nATOM   9231  HA  TYR B 192     -17.612   7.279 -46.547  1.00 49.68           H\nATOM   9232  HB3 TYR B 192     -16.125   7.960 -48.451  1.00 49.66           H\nATOM   9233  HB2 TYR B 192     -16.648   9.608 -48.276  1.00 49.66           H\nATOM   9234  HD1 TYR B 192     -17.663   6.181 -49.299  1.00 53.19           H\nATOM   9235  HD2 TYR B 192     -18.847  10.323 -49.060  1.00 51.20           H\nATOM   9236  HE1 TYR B 192     -19.554   5.730 -50.841  1.00 53.89           H\nATOM   9237  HE2 TYR B 192     -20.746   9.870 -50.590  1.00 53.44           H\nATOM   9238  HH  TYR B 192     -21.383   6.614 -51.952  1.00 50.95           H\nATOM   9239  N   PRO B 193     -15.215   7.479 -45.517  1.00 53.26           N\nATOM   9240  CA  PRO B 193     -13.825   7.604 -45.024  1.00 52.88           C\nATOM   9241  C   PRO B 193     -12.920   8.501 -45.908  1.00 53.26           C\nATOM   9242  O   PRO B 193     -13.071   8.456 -47.131  1.00 53.94           O\nATOM   9243  CB  PRO B 193     -13.317   6.153 -45.045  1.00 53.21           C\nATOM   9244  CG  PRO B 193     -14.557   5.308 -44.832  1.00 55.13           C\nATOM   9245  CD  PRO B 193     -15.613   6.073 -45.615  1.00 53.83           C\nATOM   9246  HA  PRO B 193     -13.920   7.943 -43.997  1.00 52.88           H\nATOM   9247  HB3 PRO B 193     -12.551   5.965 -44.294  1.00 53.21           H\nATOM   9248  HB2 PRO B 193     -12.890   5.910 -46.019  1.00 53.21           H\nATOM   9249  HG3 PRO B 193     -14.815   5.305 -43.772  1.00 55.13           H\nATOM   9250  HG2 PRO B 193     -14.440   4.273 -45.155  1.00 55.13           H\nATOM   9251  HD2 PRO B 193     -15.610   5.779 -46.665  1.00 53.83           H\nATOM   9252  HD3 PRO B 193     -16.603   5.879 -45.200  1.00 53.83           H\nATOM   9253  N   PRO B 194     -11.997   9.287 -45.299  1.00 52.31           N\nATOM   9254  CA  PRO B 194     -11.146  10.238 -46.047  1.00 51.86           C\nATOM   9255  C   PRO B 194     -10.232   9.664 -47.145  1.00 51.85           C\nATOM   9256  O   PRO B 194      -9.928  10.392 -48.087  1.00 50.57           O\nATOM   9257  CB  PRO B 194     -10.314  10.938 -44.965  1.00 51.73           C\nATOM   9258  CG  PRO B 194     -11.098  10.763 -43.684  1.00 52.69           C\nATOM   9259  CD  PRO B 194     -11.773   9.414 -43.857  1.00 52.84           C\nATOM   9260  HA  PRO B 194     -11.818  10.968 -46.502  1.00 51.86           H\nATOM   9261  HB3 PRO B 194     -10.170  11.989 -45.196  1.00 51.73           H\nATOM   9262  HB2 PRO B 194      -9.331  10.476 -44.857  1.00 51.73           H\nATOM   9263  HG3 PRO B 194     -11.853  11.547 -43.616  1.00 52.69           H\nATOM   9264  HG2 PRO B 194     -10.478  10.818 -42.794  1.00 52.69           H\nATOM   9265  HD2 PRO B 194     -11.119   8.604 -43.530  1.00 52.84           H\nATOM   9266  HD3 PRO B 194     -12.674   9.403 -43.247  1.00 52.84           H\nATOM   9267  N   PHE B 195      -9.813   8.391 -47.021  1.00 50.88           N\nATOM   9268  CA  PHE B 195      -8.960   7.724 -48.010  1.00 50.16           C\nATOM   9269  C   PHE B 195      -9.726   7.390 -49.307  1.00 50.19           C\nATOM   9270  O   PHE B 195      -9.112   7.424 -50.370  1.00 51.69           O\nATOM   9271  CB  PHE B 195      -8.284   6.489 -47.370  1.00 48.34           C\nATOM   9272  CG  PHE B 195      -9.114   5.218 -47.270  1.00 49.26           C\nATOM   9273  CD1 PHE B 195     -10.022   5.046 -46.205  1.00 50.81           C\nATOM   9274  CD2 PHE B 195      -9.108   4.277 -48.323  1.00 52.30           C\nATOM   9275  CE1 PHE B 195     -10.848   3.931 -46.174  1.00 53.86           C\nATOM   9276  CE2 PHE B 195      -9.945   3.171 -48.274  1.00 53.96           C\nATOM   9277  CZ  PHE B 195     -10.805   2.995 -47.199  1.00 52.08           C\nATOM   9278  H   PHE B 195     -10.091   7.843 -46.221  1.00 50.88           H\nATOM   9279  HA  PHE B 195      -8.163   8.422 -48.269  1.00 50.16           H\nATOM   9280  HB3 PHE B 195      -7.919   6.748 -46.375  1.00 48.34           H\nATOM   9281  HB2 PHE B 195      -7.389   6.252 -47.944  1.00 48.34           H\nATOM   9282  HD1 PHE B 195     -10.078   5.776 -45.411  1.00 50.81           H\nATOM   9283  HD2 PHE B 195      -8.456   4.417 -49.172  1.00 52.30           H\nATOM   9284  HE1 PHE B 195     -11.536   3.802 -45.354  1.00 53.86           H\nATOM   9285  HE2 PHE B 195      -9.933   2.451 -49.078  1.00 53.96           H\nATOM   9286  HZ  PHE B 195     -11.455   2.133 -47.167  1.00 52.08           H\nATOM   9287  N   MET B 196     -11.043   7.119 -49.216  1.00 50.08           N\nATOM   9288  CA  MET B 196     -11.923   6.939 -50.377  1.00 50.72           C\nATOM   9289  C   MET B 196     -12.136   8.249 -51.151  1.00 49.82           C\nATOM   9290  O   MET B 196     -12.199   8.217 -52.380  1.00 50.29           O\nATOM   9291  CB  MET B 196     -13.287   6.359 -49.953  1.00 49.87           C\nATOM   9292  CG  MET B 196     -13.214   4.977 -49.295  1.00 56.44           C\nATOM   9293  SD  MET B 196     -14.847   4.220 -49.078  1.00 64.17           S\nATOM   9294  CE  MET B 196     -14.363   2.675 -48.267  1.00 64.37           C\nATOM   9295  H   MET B 196     -11.492   7.119 -48.311  1.00 50.08           H\nATOM   9296  HA  MET B 196     -11.443   6.229 -51.053  1.00 50.72           H\nATOM   9297  HB3 MET B 196     -13.936   6.290 -50.825  1.00 49.87           H\nATOM   9298  HB2 MET B 196     -13.788   7.049 -49.272  1.00 49.87           H\nATOM   9299  HG3 MET B 196     -12.731   5.050 -48.321  1.00 56.44           H\nATOM   9300  HG2 MET B 196     -12.606   4.307 -49.903  1.00 56.44           H\nATOM   9301  HE1 MET B 196     -15.241   2.056 -48.085  1.00 64.37           H\nATOM   9302  HE2 MET B 196     -13.668   2.116 -48.895  1.00 64.37           H\nATOM   9303  HE3 MET B 196     -13.882   2.884 -47.312  1.00 64.37           H\nATOM   9304  N   ILE B 197     -12.211   9.373 -50.418  1.00 48.12           N\nATOM   9305  CA  ILE B 197     -12.318  10.718 -50.979  1.00 46.97           C\nATOM   9306  C   ILE B 197     -11.015  11.134 -51.693  1.00 46.32           C\nATOM   9307  O   ILE B 197     -11.095  11.697 -52.782  1.00 47.15           O\nATOM   9308  CB  ILE B 197     -12.706  11.776 -49.902  1.00 46.60           C\nATOM   9309  CG1 ILE B 197     -14.052  11.419 -49.224  1.00 44.19           C\nATOM   9310  CG2 ILE B 197     -12.763  13.222 -50.449  1.00 43.65           C\nATOM   9311  CD1 ILE B 197     -14.358  12.253 -47.970  1.00 38.83           C\nATOM   9312  H   ILE B 197     -12.154   9.312 -49.411  1.00 48.12           H\nATOM   9313  HA  ILE B 197     -13.104  10.698 -51.730  1.00 46.97           H\nATOM   9314  HB  ILE B 197     -11.940  11.750 -49.128  1.00 46.60           H\nATOM   9315 HG13 ILE B 197     -14.072  10.370 -48.932  1.00 44.19           H\nATOM   9316 HG12 ILE B 197     -14.864  11.537 -49.943  1.00 44.19           H\nATOM   9317 HG21 ILE B 197     -13.083  13.931 -49.686  1.00 43.65           H\nATOM   9318 HG22 ILE B 197     -11.795  13.575 -50.803  1.00 43.65           H\nATOM   9319 HG23 ILE B 197     -13.469  13.290 -51.276  1.00 43.65           H\nATOM   9320 HD11 ILE B 197     -14.964  11.684 -47.265  1.00 38.83           H\nATOM   9321 HD12 ILE B 197     -13.450  12.554 -47.448  1.00 38.83           H\nATOM   9322 HD13 ILE B 197     -14.911  13.157 -48.224  1.00 38.83           H\nATOM   9323  N   ALA B 198      -9.853  10.791 -51.107  1.00 45.89           N\nATOM   9324  CA  ALA B 198      -8.521  11.005 -51.679  1.00 46.38           C\nATOM   9325  C   ALA B 198      -8.297  10.271 -53.013  1.00 49.21           C\nATOM   9326  O   ALA B 198      -7.736  10.868 -53.930  1.00 49.00           O\nATOM   9327  CB  ALA B 198      -7.457  10.586 -50.655  1.00 44.73           C\nATOM   9328  H   ALA B 198      -9.876  10.335 -50.205  1.00 45.89           H\nATOM   9329  HA  ALA B 198      -8.410  12.076 -51.865  1.00 46.38           H\nATOM   9330  HB1 ALA B 198      -6.451  10.709 -51.054  1.00 44.73           H\nATOM   9331  HB2 ALA B 198      -7.529  11.183 -49.748  1.00 44.73           H\nATOM   9332  HB3 ALA B 198      -7.564   9.542 -50.366  1.00 44.73           H\nATOM   9333  N   LEU B 199      -8.769   9.015 -53.104  1.00 49.06           N\nATOM   9334  CA  LEU B 199      -8.713   8.183 -54.310  1.00 49.46           C\nATOM   9335  C   LEU B 199      -9.630   8.685 -55.435  1.00 48.33           C\nATOM   9336  O   LEU B 199      -9.229   8.614 -56.595  1.00 48.17           O\nATOM   9337  CB  LEU B 199      -9.055   6.721 -53.946  1.00 49.61           C\nATOM   9338  CG  LEU B 199      -7.954   5.995 -53.149  1.00 46.21           C\nATOM   9339  CD1 LEU B 199      -8.444   4.633 -52.621  1.00 46.25           C\nATOM   9340  CD2 LEU B 199      -6.649   5.850 -53.947  1.00 42.21           C\nATOM   9341  H   LEU B 199      -9.207   8.593 -52.296  1.00 49.06           H\nATOM   9342  HA  LEU B 199      -7.698   8.231 -54.703  1.00 49.46           H\nATOM   9343  HB3 LEU B 199      -9.267   6.144 -54.847  1.00 49.61           H\nATOM   9344  HB2 LEU B 199      -9.981   6.715 -53.370  1.00 49.61           H\nATOM   9345  HG  LEU B 199      -7.720   6.603 -52.280  1.00 46.21           H\nATOM   9346 HD11 LEU B 199      -7.843   3.805 -52.997  1.00 46.25           H\nATOM   9347 HD12 LEU B 199      -8.394   4.602 -51.533  1.00 46.25           H\nATOM   9348 HD13 LEU B 199      -9.477   4.430 -52.903  1.00 46.25           H\nATOM   9349 HD21 LEU B 199      -5.963   5.163 -53.452  1.00 42.21           H\nATOM   9350 HD22 LEU B 199      -6.837   5.480 -54.954  1.00 42.21           H\nATOM   9351 HD23 LEU B 199      -6.120   6.798 -54.031  1.00 42.21           H\nATOM   9352  N   ALA B 200     -10.818   9.203 -55.080  1.00 48.87           N\nATOM   9353  CA  ALA B 200     -11.769   9.798 -56.018  1.00 49.32           C\nATOM   9354  C   ALA B 200     -11.280  11.136 -56.603  1.00 50.00           C\nATOM   9355  O   ALA B 200     -11.467  11.367 -57.796  1.00 51.98           O\nATOM   9356  CB  ALA B 200     -13.117   9.968 -55.312  1.00 48.18           C\nATOM   9357  H   ALA B 200     -11.086   9.212 -54.105  1.00 48.87           H\nATOM   9358  HA  ALA B 200     -11.909   9.103 -56.848  1.00 49.32           H\nATOM   9359  HB1 ALA B 200     -13.852  10.443 -55.962  1.00 48.18           H\nATOM   9360  HB2 ALA B 200     -13.523   9.002 -55.009  1.00 48.18           H\nATOM   9361  HB3 ALA B 200     -13.020  10.583 -54.418  1.00 48.18           H\nATOM   9362  N   CYS B 201     -10.633  11.967 -55.766  1.00 49.92           N\nATOM   9363  CA  CYS B 201     -10.029  13.247 -56.151  1.00 50.20           C\nATOM   9364  C   CYS B 201      -8.793  13.059 -57.047  1.00 50.84           C\nATOM   9365  O   CYS B 201      -8.611  13.831 -57.987  1.00 50.16           O\nATOM   9366  CB  CYS B 201      -9.642  14.091 -54.923  1.00 49.08           C\nATOM   9367  SG  CYS B 201     -11.124  14.556 -53.988  1.00 47.75           S\nATOM   9368  H   CYS B 201     -10.538  11.708 -54.793  1.00 49.92           H\nATOM   9369  HA  CYS B 201     -10.769  13.804 -56.730  1.00 50.20           H\nATOM   9370  HB3 CYS B 201      -9.131  15.005 -55.226  1.00 49.08           H\nATOM   9371  HB2 CYS B 201      -8.965  13.543 -54.266  1.00 49.08           H\nATOM   9372  HG  CYS B 201     -11.362  13.334 -53.496  1.00 47.75           H\nATOM   9373  N   LEU B 202      -7.989  12.022 -56.752  1.00 49.72           N\nATOM   9374  CA  LEU B 202      -6.827  11.602 -57.535  1.00 51.67           C\nATOM   9375  C   LEU B 202      -7.218  11.004 -58.898  1.00 53.15           C\nATOM   9376  O   LEU B 202      -6.515  11.258 -59.874  1.00 55.24           O\nATOM   9377  CB  LEU B 202      -5.986  10.631 -56.675  1.00 50.57           C\nATOM   9378  CG  LEU B 202      -4.735  10.006 -57.334  1.00 47.49           C\nATOM   9379  CD1 LEU B 202      -3.767  11.067 -57.901  1.00 45.75           C\nATOM   9380  CD2 LEU B 202      -4.038   9.061 -56.333  1.00 42.85           C\nATOM   9381  H   LEU B 202      -8.199  11.453 -55.943  1.00 49.72           H\nATOM   9382  HA  LEU B 202      -6.227  12.493 -57.728  1.00 51.67           H\nATOM   9383  HB3 LEU B 202      -6.630   9.818 -56.337  1.00 50.57           H\nATOM   9384  HB2 LEU B 202      -5.678  11.157 -55.773  1.00 50.57           H\nATOM   9385  HG  LEU B 202      -5.055   9.385 -58.171  1.00 47.49           H\nATOM   9386 HD11 LEU B 202      -2.724  10.768 -57.811  1.00 45.75           H\nATOM   9387 HD12 LEU B 202      -3.948  11.228 -58.963  1.00 45.75           H\nATOM   9388 HD13 LEU B 202      -3.876  12.030 -57.400  1.00 45.75           H\nATOM   9389 HD21 LEU B 202      -2.964   9.234 -56.257  1.00 42.85           H\nATOM   9390 HD22 LEU B 202      -4.446   9.161 -55.327  1.00 42.85           H\nATOM   9391 HD23 LEU B 202      -4.179   8.021 -56.623  1.00 42.85           H\nATOM   9392  N   HIS B 203      -8.338  10.261 -58.955  1.00 54.01           N\nATOM   9393  CA  HIS B 203      -8.891   9.705 -60.193  1.00 55.79           C\nATOM   9394  C   HIS B 203      -9.390  10.803 -61.149  1.00 54.01           C\nATOM   9395  O   HIS B 203      -9.104  10.723 -62.342  1.00 54.91           O\nATOM   9396  CB  HIS B 203      -9.993   8.678 -59.863  1.00 56.38           C\nATOM   9397  CG  HIS B 203     -10.464   7.848 -61.035  1.00 61.46           C\nATOM   9398  ND1 HIS B 203     -11.304   8.335 -62.023  1.00 68.32           N\nATOM   9399  CD2 HIS B 203     -10.215   6.537 -61.378  1.00 64.86           C\nATOM   9400  CE1 HIS B 203     -11.509   7.344 -62.894  1.00 67.80           C\nATOM   9401  NE2 HIS B 203     -10.879   6.223 -62.566  1.00 66.09           N\nATOM   9402  H   HIS B 203      -8.858  10.073 -58.108  1.00 54.01           H\nATOM   9403  HA  HIS B 203      -8.080   9.170 -60.691  1.00 55.79           H\nATOM   9404  HB3 HIS B 203     -10.855   9.176 -59.418  1.00 56.38           H\nATOM   9405  HB2 HIS B 203      -9.629   7.980 -59.110  1.00 56.38           H\nATOM   9406  HD1 HIS B 203     -11.680   9.271 -62.085  1.00 68.32           H\nATOM   9407  HD2 HIS B 203      -9.609   5.803 -60.867  1.00 64.86           H\nATOM   9408  HE1 HIS B 203     -12.123   7.444 -63.776  1.00 67.80           H\nATOM   9409  N   VAL B 204     -10.087  11.820 -60.612  1.00 51.97           N\nATOM   9410  CA  VAL B 204     -10.540  12.990 -61.369  1.00 50.53           C\nATOM   9411  C   VAL B 204      -9.364  13.873 -61.847  1.00 50.83           C\nATOM   9412  O   VAL B 204      -9.429  14.378 -62.966  1.00 51.35           O\nATOM   9413  CB  VAL B 204     -11.579  13.827 -60.562  1.00 51.04           C\nATOM   9414  CG1 VAL B 204     -11.907  15.221 -61.143  1.00 47.81           C\nATOM   9415  CG2 VAL B 204     -12.892  13.036 -60.404  1.00 49.54           C\nATOM   9416  H   VAL B 204     -10.299  11.817 -59.623  1.00 51.97           H\nATOM   9417  HA  VAL B 204     -11.041  12.620 -62.266  1.00 50.53           H\nATOM   9418  HB  VAL B 204     -11.175  13.985 -59.560  1.00 51.04           H\nATOM   9419 HG11 VAL B 204     -12.689  15.712 -60.564  1.00 47.81           H\nATOM   9420 HG12 VAL B 204     -11.048  15.891 -61.131  1.00 47.81           H\nATOM   9421 HG13 VAL B 204     -12.257  15.146 -62.173  1.00 47.81           H\nATOM   9422 HG21 VAL B 204     -13.600  13.557 -59.761  1.00 49.54           H\nATOM   9423 HG22 VAL B 204     -13.377  12.880 -61.368  1.00 49.54           H\nATOM   9424 HG23 VAL B 204     -12.723  12.055 -59.965  1.00 49.54           H\nATOM   9425  N   ALA B 205      -8.290  13.981 -61.040  1.00 50.40           N\nATOM   9426  CA  ALA B 205      -7.039  14.648 -61.416  1.00 50.19           C\nATOM   9427  C   ALA B 205      -6.296  13.942 -62.566  1.00 52.18           C\nATOM   9428  O   ALA B 205      -5.766  14.630 -63.438  1.00 52.47           O\nATOM   9429  CB  ALA B 205      -6.124  14.788 -60.189  1.00 47.88           C\nATOM   9430  H   ALA B 205      -8.309  13.550 -60.125  1.00 50.40           H\nATOM   9431  HA  ALA B 205      -7.302  15.651 -61.752  1.00 50.19           H\nATOM   9432  HB1 ALA B 205      -5.236  15.375 -60.426  1.00 47.88           H\nATOM   9433  HB2 ALA B 205      -6.635  15.292 -59.371  1.00 47.88           H\nATOM   9434  HB3 ALA B 205      -5.789  13.820 -59.819  1.00 47.88           H\nATOM   9435  N   CYS B 206      -6.309  12.594 -62.564  1.00 54.40           N\nATOM   9436  CA  CYS B 206      -5.755  11.744 -63.622  1.00 55.92           C\nATOM   9437  C   CYS B 206      -6.518  11.900 -64.947  1.00 55.92           C\nATOM   9438  O   CYS B 206      -5.872  12.010 -65.985  1.00 55.85           O\nATOM   9439  CB  CYS B 206      -5.716  10.250 -63.233  1.00 55.02           C\nATOM   9440  SG  CYS B 206      -4.472   9.932 -61.957  1.00 55.06           S\nATOM   9441  H   CYS B 206      -6.750  12.110 -61.794  1.00 54.40           H\nATOM   9442  HA  CYS B 206      -4.731  12.076 -63.803  1.00 55.92           H\nATOM   9443  HB3 CYS B 206      -5.460   9.632 -64.094  1.00 55.02           H\nATOM   9444  HB2 CYS B 206      -6.686   9.905 -62.877  1.00 55.02           H\nATOM   9445  HG  CYS B 206      -5.123  10.564 -60.973  1.00 55.06           H\nATOM   9446  N   VAL B 207      -7.861  11.927 -64.891  1.00 55.93           N\nATOM   9447  CA  VAL B 207      -8.742  12.082 -66.053  1.00 57.94           C\nATOM   9448  C   VAL B 207      -8.603  13.460 -66.737  1.00 60.08           C\nATOM   9449  O   VAL B 207      -8.538  13.509 -67.966  1.00 60.13           O\nATOM   9450  CB  VAL B 207     -10.228  11.808 -65.665  1.00 57.77           C\nATOM   9451  CG1 VAL B 207     -11.296  12.315 -66.660  1.00 60.07           C\nATOM   9452  CG2 VAL B 207     -10.452  10.305 -65.414  1.00 57.04           C\nATOM   9453  H   VAL B 207      -8.321  11.820 -63.997  1.00 55.93           H\nATOM   9454  HA  VAL B 207      -8.439  11.332 -66.787  1.00 57.94           H\nATOM   9455  HB  VAL B 207     -10.420  12.316 -64.718  1.00 57.77           H\nATOM   9456 HG11 VAL B 207     -12.293  11.988 -66.363  1.00 60.07           H\nATOM   9457 HG12 VAL B 207     -11.330  13.403 -66.709  1.00 60.07           H\nATOM   9458 HG13 VAL B 207     -11.111  11.935 -67.666  1.00 60.07           H\nATOM   9459 HG21 VAL B 207     -11.451  10.114 -65.023  1.00 57.04           H\nATOM   9460 HG22 VAL B 207     -10.341   9.732 -66.335  1.00 57.04           H\nATOM   9461 HG23 VAL B 207      -9.741   9.900 -64.695  1.00 57.04           H\nATOM   9462  N   VAL B 208      -8.527  14.536 -65.934  1.00 61.48           N\nATOM   9463  CA  VAL B 208      -8.360  15.917 -66.398  1.00 61.01           C\nATOM   9464  C   VAL B 208      -6.995  16.170 -67.075  1.00 61.09           C\nATOM   9465  O   VAL B 208      -6.961  16.849 -68.102  1.00 58.93           O\nATOM   9466  CB  VAL B 208      -8.585  16.921 -65.226  1.00 60.75           C\nATOM   9467  CG1 VAL B 208      -8.051  18.355 -65.440  1.00 58.66           C\nATOM   9468  CG2 VAL B 208     -10.079  16.995 -64.857  1.00 58.58           C\nATOM   9469  H   VAL B 208      -8.595  14.411 -64.933  1.00 61.48           H\nATOM   9470  HA  VAL B 208      -9.129  16.099 -67.152  1.00 61.01           H\nATOM   9471  HB  VAL B 208      -8.069  16.517 -64.355  1.00 60.75           H\nATOM   9472 HG11 VAL B 208      -8.337  19.006 -64.613  1.00 58.66           H\nATOM   9473 HG12 VAL B 208      -6.962  18.386 -65.494  1.00 58.66           H\nATOM   9474 HG13 VAL B 208      -8.448  18.793 -66.356  1.00 58.66           H\nATOM   9475 HG21 VAL B 208     -10.234  17.588 -63.956  1.00 58.58           H\nATOM   9476 HG22 VAL B 208     -10.659  17.452 -65.659  1.00 58.58           H\nATOM   9477 HG23 VAL B 208     -10.503  16.009 -64.674  1.00 58.58           H\nATOM   9478  N   GLN B 209      -5.914  15.599 -66.515  1.00 62.64           N\nATOM   9479  CA  GLN B 209      -4.554  15.687 -67.062  1.00 64.60           C\nATOM   9480  C   GLN B 209      -4.219  14.602 -68.105  1.00 65.67           C\nATOM   9481  O   GLN B 209      -3.108  14.617 -68.633  1.00 65.34           O\nATOM   9482  CB  GLN B 209      -3.535  15.717 -65.904  1.00 65.15           C\nATOM   9483  CG  GLN B 209      -3.578  17.049 -65.128  1.00 69.41           C\nATOM   9484  CD  GLN B 209      -2.533  17.142 -64.014  1.00 71.87           C\nATOM   9485  OE1 GLN B 209      -2.011  16.135 -63.547  1.00 75.89           O\nATOM   9486  NE2 GLN B 209      -2.230  18.361 -63.565  1.00 74.36           N\nATOM   9487  H   GLN B 209      -6.018  15.058 -65.667  1.00 62.64           H\nATOM   9488  HA  GLN B 209      -4.457  16.633 -67.599  1.00 64.60           H\nATOM   9489  HB3 GLN B 209      -2.523  15.578 -66.290  1.00 65.15           H\nATOM   9490  HB2 GLN B 209      -3.717  14.878 -65.231  1.00 65.15           H\nATOM   9491  HG3 GLN B 209      -4.566  17.189 -64.693  1.00 69.41           H\nATOM   9492  HG2 GLN B 209      -3.422  17.879 -65.819  1.00 69.41           H\nATOM   9493 HE22 GLN B 209      -1.535  18.459 -62.837  1.00 74.36           H\nATOM   9494 HE21 GLN B 209      -2.668  19.182 -63.955  1.00 74.36           H\nATOM   9495  N   GLN B 210      -5.177  13.701 -68.399  1.00 67.79           N\nATOM   9496  CA  GLN B 210      -5.101  12.618 -69.390  1.00 70.87           C\nATOM   9497  C   GLN B 210      -4.021  11.555 -69.081  1.00 72.24           C\nATOM   9498  O   GLN B 210      -3.493  10.925 -69.999  1.00 72.91           O\nATOM   9499  CB  GLN B 210      -5.002  13.190 -70.827  1.00 71.56           C\nATOM   9500  CG  GLN B 210      -6.198  14.088 -71.208  1.00 73.53           C\nATOM   9501  CD  GLN B 210      -6.102  14.669 -72.622  1.00 76.89           C\nATOM   9502  OE1 GLN B 210      -5.209  14.333 -73.398  1.00 80.30           O\nATOM   9503  NE2 GLN B 210      -7.040  15.553 -72.967  1.00 78.37           N\nATOM   9504  H   GLN B 210      -6.059  13.769 -67.911  1.00 67.79           H\nATOM   9505  HA  GLN B 210      -6.051  12.088 -69.314  1.00 70.87           H\nATOM   9506  HB3 GLN B 210      -4.946  12.368 -71.543  1.00 71.56           H\nATOM   9507  HB2 GLN B 210      -4.072  13.749 -70.942  1.00 71.56           H\nATOM   9508  HG3 GLN B 210      -6.280  14.921 -70.509  1.00 73.53           H\nATOM   9509  HG2 GLN B 210      -7.125  13.520 -71.128  1.00 73.53           H\nATOM   9510 HE22 GLN B 210      -7.028  15.966 -73.888  1.00 78.37           H\nATOM   9511 HE21 GLN B 210      -7.762  15.815 -72.312  1.00 78.37           H\nATOM   9512  N   LYS B 211      -3.722  11.371 -67.785  1.00 73.56           N\nATOM   9513  CA  LYS B 211      -2.780  10.390 -67.261  1.00 73.62           C\nATOM   9514  C   LYS B 211      -3.461   9.019 -67.119  1.00 73.68           C\nATOM   9515  O   LYS B 211      -4.502   8.925 -66.468  1.00 73.08           O\nATOM   9516  CB  LYS B 211      -2.235  10.913 -65.910  1.00 73.74           C\nATOM   9517  CG  LYS B 211      -1.264   9.976 -65.164  1.00 74.44           C\nATOM   9518  CD  LYS B 211       0.007   9.641 -65.962  0.00 73.83           C\nATOM   9519  CE  LYS B 211       0.952   8.712 -65.188  0.00 73.84           C\nATOM   9520  NZ  LYS B 211       2.189   8.434 -65.939  0.00 73.83           N1+\nATOM   9521  H   LYS B 211      -4.237  11.899 -67.092  1.00 73.56           H\nATOM   9522  HA  LYS B 211      -1.949  10.311 -67.963  1.00 73.62           H\nATOM   9523  HB3 LYS B 211      -3.073  11.125 -65.244  1.00 73.74           H\nATOM   9524  HB2 LYS B 211      -1.741  11.872 -66.074  1.00 73.74           H\nATOM   9525  HG3 LYS B 211      -1.775   9.055 -64.878  1.00 74.44           H\nATOM   9526  HG2 LYS B 211      -0.979  10.452 -64.225  1.00 74.44           H\nATOM   9527  HD3 LYS B 211       0.521  10.569 -66.219  1.00 73.83           H\nATOM   9528  HD2 LYS B 211      -0.262   9.165 -66.905  1.00 73.83           H\nATOM   9529  HE3 LYS B 211       0.458   7.767 -64.962  1.00 73.84           H\nATOM   9530  HE2 LYS B 211       1.217   9.167 -64.237  1.00 73.84           H\nATOM   9531  HZ1 LYS B 211       2.672   9.301 -66.129  1.00 73.83           H\nATOM   9532  HZ2 LYS B 211       2.789   7.835 -65.389  1.00 73.83           H\nATOM   9533  HZ3 LYS B 211       1.962   7.975 -66.810  1.00 73.83           H\nATOM   9534  N   ASP B 212      -2.829   7.982 -67.693  1.00 74.12           N\nATOM   9535  CA  ASP B 212      -3.220   6.584 -67.521  1.00 74.97           C\nATOM   9536  C   ASP B 212      -2.734   6.097 -66.142  1.00 74.51           C\nATOM   9537  O   ASP B 212      -1.535   6.147 -65.865  1.00 75.13           O\nATOM   9538  CB  ASP B 212      -2.699   5.706 -68.692  1.00 75.54           C\nATOM   9539  CG  ASP B 212      -3.135   4.225 -68.733  1.00 76.85           C\nATOM   9540  OD1 ASP B 212      -3.998   3.809 -67.927  1.00 76.31           O\nATOM   9541  OD2 ASP B 212      -2.645   3.526 -69.646  1.00 78.66           O1-\nATOM   9542  H   ASP B 212      -1.984   8.143 -68.222  1.00 74.12           H\nATOM   9543  HA  ASP B 212      -4.312   6.542 -67.545  1.00 74.97           H\nATOM   9544  HB3 ASP B 212      -1.609   5.751 -68.720  1.00 75.54           H\nATOM   9545  HB2 ASP B 212      -3.019   6.165 -69.628  1.00 75.54           H\nATOM   9546  N   ALA B 213      -3.690   5.641 -65.320  1.00 74.10           N\nATOM   9547  CA  ALA B 213      -3.466   5.121 -63.973  1.00 74.72           C\nATOM   9548  C   ALA B 213      -4.354   3.901 -63.664  1.00 74.92           C\nATOM   9549  O   ALA B 213      -4.446   3.524 -62.497  1.00 74.63           O\nATOM   9550  CB  ALA B 213      -3.666   6.261 -62.957  1.00 74.67           C\nATOM   9551  H   ALA B 213      -4.650   5.652 -65.634  1.00 74.10           H\nATOM   9552  HA  ALA B 213      -2.437   4.765 -63.888  1.00 74.72           H\nATOM   9553  HB1 ALA B 213      -3.488   5.922 -61.936  1.00 74.67           H\nATOM   9554  HB2 ALA B 213      -2.976   7.084 -63.147  1.00 74.67           H\nATOM   9555  HB3 ALA B 213      -4.679   6.663 -63.000  1.00 74.67           H\nATOM   9556  N   ARG B 214      -4.980   3.293 -64.692  1.00 75.12           N\nATOM   9557  CA  ARG B 214      -5.905   2.155 -64.571  1.00 75.31           C\nATOM   9558  C   ARG B 214      -5.292   0.920 -63.887  1.00 73.67           C\nATOM   9559  O   ARG B 214      -5.984   0.278 -63.097  1.00 73.46           O\nATOM   9560  CB  ARG B 214      -6.448   1.760 -65.960  1.00 76.48           C\nATOM   9561  CG  ARG B 214      -7.256   2.862 -66.676  1.00 81.10           C\nATOM   9562  CD  ARG B 214      -7.708   2.465 -68.096  1.00 86.03           C\nATOM   9563  NE  ARG B 214      -6.576   2.405 -69.038  1.00 88.73           N\nATOM   9564  CZ  ARG B 214      -6.541   1.889 -70.279  1.00 90.27           C\nATOM   9565  NH1 ARG B 214      -7.619   1.336 -70.855  1.00 90.55           N\nATOM   9566  NH2 ARG B 214      -5.386   1.933 -70.955  1.00 90.16           N1+\nATOM   9567  H   ARG B 214      -4.815   3.627 -65.632  1.00 75.12           H\nATOM   9568  HA  ARG B 214      -6.744   2.485 -63.955  1.00 75.31           H\nATOM   9569  HB3 ARG B 214      -7.096   0.888 -65.854  1.00 76.48           H\nATOM   9570  HB2 ARG B 214      -5.616   1.438 -66.588  1.00 76.48           H\nATOM   9571  HG3 ARG B 214      -6.611   3.738 -66.760  1.00 81.10           H\nATOM   9572  HG2 ARG B 214      -8.109   3.193 -66.083  1.00 81.10           H\nATOM   9573  HD3 ARG B 214      -8.521   3.097 -68.455  1.00 86.03           H\nATOM   9574  HD2 ARG B 214      -8.102   1.449 -68.051  1.00 86.03           H\nATOM   9575  HE  ARG B 214      -5.716   2.819 -68.688  1.00 88.73           H\nATOM   9576 HH12 ARG B 214      -7.566   0.954 -71.788  1.00 90.55           H\nATOM   9577 HH11 ARG B 214      -8.493   1.300 -70.352  1.00 90.55           H\nATOM   9578 HH22 ARG B 214      -5.317   1.555 -71.888  1.00 90.16           H\nATOM   9579 HH21 ARG B 214      -4.565   2.353 -70.532  1.00 90.16           H\nATOM   9580  N   GLN B 215      -4.009   0.636 -64.176  1.00 72.87           N\nATOM   9581  CA  GLN B 215      -3.239  -0.442 -63.555  1.00 73.08           C\nATOM   9582  C   GLN B 215      -2.976  -0.193 -62.058  1.00 71.43           C\nATOM   9583  O   GLN B 215      -3.083  -1.135 -61.277  1.00 71.48           O\nATOM   9584  CB  GLN B 215      -1.931  -0.660 -64.353  1.00 73.43           C\nATOM   9585  CG  GLN B 215      -0.987  -1.771 -63.834  1.00 76.29           C\nATOM   9586  CD  GLN B 215      -1.636  -3.159 -63.773  1.00 78.56           C\nATOM   9587  OE1 GLN B 215      -2.402  -3.535 -64.658  1.00 81.97           O\nATOM   9588  NE2 GLN B 215      -1.310  -3.939 -62.742  1.00 78.61           N\nATOM   9589  H   GLN B 215      -3.513   1.215 -64.838  1.00 72.87           H\nATOM   9590  HA  GLN B 215      -3.843  -1.347 -63.633  1.00 73.08           H\nATOM   9591  HB3 GLN B 215      -1.372   0.276 -64.389  1.00 73.43           H\nATOM   9592  HB2 GLN B 215      -2.188  -0.882 -65.390  1.00 73.43           H\nATOM   9593  HG3 GLN B 215      -0.600  -1.504 -62.850  1.00 76.29           H\nATOM   9594  HG2 GLN B 215      -0.117  -1.839 -64.488  1.00 76.29           H\nATOM   9595 HE22 GLN B 215      -1.705  -4.864 -62.659  1.00 78.61           H\nATOM   9596 HE21 GLN B 215      -0.672  -3.605 -62.026  1.00 78.61           H\nATOM   9597  N   TRP B 216      -2.675   1.064 -61.685  1.00 69.58           N\nATOM   9598  CA  TRP B 216      -2.444   1.475 -60.299  1.00 68.69           C\nATOM   9599  C   TRP B 216      -3.712   1.363 -59.431  1.00 68.50           C\nATOM   9600  O   TRP B 216      -3.619   0.854 -58.316  1.00 68.31           O\nATOM   9601  CB  TRP B 216      -1.833   2.892 -60.265  1.00 68.12           C\nATOM   9602  CG  TRP B 216      -1.447   3.399 -58.907  1.00 63.36           C\nATOM   9603  CD1 TRP B 216      -0.227   3.259 -58.341  1.00 60.38           C\nATOM   9604  CD2 TRP B 216      -2.287   4.031 -57.891  1.00 60.16           C\nATOM   9605  NE1 TRP B 216      -0.251   3.770 -57.062  1.00 58.06           N\nATOM   9606  CE2 TRP B 216      -1.495   4.258 -56.726  1.00 61.74           C\nATOM   9607  CE3 TRP B 216      -3.645   4.422 -57.827  1.00 60.13           C\nATOM   9608  CZ2 TRP B 216      -2.018   4.842 -55.560  1.00 58.12           C\nATOM   9609  CZ3 TRP B 216      -4.181   5.014 -56.667  1.00 61.68           C\nATOM   9610  CH2 TRP B 216      -3.373   5.217 -55.534  1.00 56.94           C\nATOM   9611  H   TRP B 216      -2.631   1.794 -62.381  1.00 69.58           H\nATOM   9612  HA  TRP B 216      -1.703   0.790 -59.881  1.00 68.69           H\nATOM   9613  HB3 TRP B 216      -2.525   3.612 -60.702  1.00 68.12           H\nATOM   9614  HB2 TRP B 216      -0.941   2.916 -60.893  1.00 68.12           H\nATOM   9615  HD1 TRP B 216       0.621   2.790 -58.820  1.00 60.38           H\nATOM   9616  HE1 TRP B 216       0.545   3.707 -56.433  1.00 58.06           H\nATOM   9617  HE3 TRP B 216      -4.282   4.271 -58.685  1.00 60.13           H\nATOM   9618  HZ2 TRP B 216      -1.389   4.993 -54.695  1.00 58.12           H\nATOM   9619  HZ3 TRP B 216      -5.218   5.309 -56.648  1.00 61.68           H\nATOM   9620  HH2 TRP B 216      -3.799   5.658 -54.647  1.00 56.94           H\nATOM   9621  N   PHE B 217      -4.868   1.802 -59.964  1.00 69.27           N\nATOM   9622  CA  PHE B 217      -6.178   1.654 -59.319  1.00 70.48           C\nATOM   9623  C   PHE B 217      -6.659   0.194 -59.192  1.00 73.59           C\nATOM   9624  O   PHE B 217      -7.390  -0.106 -58.248  1.00 75.09           O\nATOM   9625  CB  PHE B 217      -7.237   2.554 -59.999  1.00 69.25           C\nATOM   9626  CG  PHE B 217      -7.245   4.005 -59.537  1.00 66.54           C\nATOM   9627  CD1 PHE B 217      -7.837   4.346 -58.301  1.00 62.13           C\nATOM   9628  CD2 PHE B 217      -6.558   5.005 -60.259  1.00 59.77           C\nATOM   9629  CE1 PHE B 217      -7.784   5.656 -57.842  1.00 57.94           C\nATOM   9630  CE2 PHE B 217      -6.506   6.307 -59.778  1.00 60.22           C\nATOM   9631  CZ  PHE B 217      -7.119   6.631 -58.575  1.00 58.42           C\nATOM   9632  H   PHE B 217      -4.864   2.224 -60.884  1.00 69.27           H\nATOM   9633  HA  PHE B 217      -6.068   2.004 -58.293  1.00 70.48           H\nATOM   9634  HB3 PHE B 217      -8.237   2.161 -59.805  1.00 69.25           H\nATOM   9635  HB2 PHE B 217      -7.117   2.523 -61.083  1.00 69.25           H\nATOM   9636  HD1 PHE B 217      -8.339   3.592 -57.712  1.00 62.13           H\nATOM   9637  HD2 PHE B 217      -6.080   4.770 -61.194  1.00 59.77           H\nATOM   9638  HE1 PHE B 217      -8.252   5.918 -56.906  1.00 57.94           H\nATOM   9639  HE2 PHE B 217      -5.987   7.069 -60.341  1.00 60.22           H\nATOM   9640  HZ  PHE B 217      -7.076   7.645 -58.205  1.00 58.42           H\nATOM   9641  N   ALA B 218      -6.221  -0.686 -60.112  1.00 76.09           N\nATOM   9642  CA  ALA B 218      -6.495  -2.125 -60.085  1.00 77.26           C\nATOM   9643  C   ALA B 218      -5.655  -2.894 -59.046  1.00 78.05           C\nATOM   9644  O   ALA B 218      -6.127  -3.914 -58.547  1.00 79.96           O\nATOM   9645  CB  ALA B 218      -6.283  -2.707 -61.491  1.00 77.37           C\nATOM   9646  H   ALA B 218      -5.634  -0.362 -60.868  1.00 76.09           H\nATOM   9647  HA  ALA B 218      -7.546  -2.265 -59.823  1.00 77.26           H\nATOM   9648  HB1 ALA B 218      -6.510  -3.774 -61.515  1.00 77.37           H\nATOM   9649  HB2 ALA B 218      -6.934  -2.221 -62.218  1.00 77.37           H\nATOM   9650  HB3 ALA B 218      -5.255  -2.581 -61.830  1.00 77.37           H\nATOM   9651  N   GLU B 219      -4.450  -2.388 -58.724  1.00 78.74           N\nATOM   9652  CA  GLU B 219      -3.563  -2.926 -57.685  1.00 79.35           C\nATOM   9653  C   GLU B 219      -4.049  -2.663 -56.245  1.00 79.57           C\nATOM   9654  O   GLU B 219      -3.584  -3.351 -55.336  1.00 78.70           O\nATOM   9655  CB  GLU B 219      -2.134  -2.382 -57.899  1.00 80.08           C\nATOM   9656  CG  GLU B 219      -1.410  -3.030 -59.103  1.00 82.75           C\nATOM   9657  CD  GLU B 219      -0.077  -2.379 -59.515  1.00 86.14           C\nATOM   9658  OE1 GLU B 219       0.335  -1.372 -58.895  1.00 89.33           O\nATOM   9659  OE2 GLU B 219       0.521  -2.911 -60.476  1.00 86.39           O1-\nATOM   9660  H   GLU B 219      -4.120  -1.558 -59.196  1.00 78.74           H\nATOM   9661  HA  GLU B 219      -3.528  -4.012 -57.800  1.00 79.35           H\nATOM   9662  HB3 GLU B 219      -1.531  -2.527 -57.001  1.00 80.08           H\nATOM   9663  HB2 GLU B 219      -2.191  -1.303 -58.044  1.00 80.08           H\nATOM   9664  HG3 GLU B 219      -2.066  -3.037 -59.971  1.00 82.75           H\nATOM   9665  HG2 GLU B 219      -1.218  -4.078 -58.871  1.00 82.75           H\nATOM   9666  N   LEU B 220      -4.971  -1.702 -56.058  1.00 79.93           N\nATOM   9667  CA  LEU B 220      -5.584  -1.387 -54.766  1.00 79.72           C\nATOM   9668  C   LEU B 220      -6.648  -2.425 -54.374  1.00 79.13           C\nATOM   9669  O   LEU B 220      -7.371  -2.924 -55.238  1.00 78.91           O\nATOM   9670  CB  LEU B 220      -6.242   0.008 -54.819  1.00 79.76           C\nATOM   9671  CG  LEU B 220      -5.300   1.181 -55.155  1.00 81.49           C\nATOM   9672  CD1 LEU B 220      -6.102   2.493 -55.242  1.00 81.17           C\nATOM   9673  CD2 LEU B 220      -4.100   1.292 -54.189  1.00 81.07           C\nATOM   9674  H   LEU B 220      -5.317  -1.186 -56.854  1.00 79.93           H\nATOM   9675  HA  LEU B 220      -4.803  -1.390 -54.003  1.00 79.72           H\nATOM   9676  HB3 LEU B 220      -6.716   0.214 -53.858  1.00 79.76           H\nATOM   9677  HB2 LEU B 220      -7.051  -0.010 -55.551  1.00 79.76           H\nATOM   9678  HG  LEU B 220      -4.896   1.003 -56.149  1.00 81.49           H\nATOM   9679 HD11 LEU B 220      -5.779   3.215 -54.498  1.00 81.17           H\nATOM   9680 HD12 LEU B 220      -5.986   2.957 -56.219  1.00 81.17           H\nATOM   9681 HD13 LEU B 220      -7.171   2.338 -55.089  1.00 81.17           H\nATOM   9682 HD21 LEU B 220      -3.846   2.325 -53.949  1.00 81.07           H\nATOM   9683 HD22 LEU B 220      -4.286   0.780 -53.245  1.00 81.07           H\nATOM   9684 HD23 LEU B 220      -3.210   0.847 -54.635  1.00 81.07           H\nATOM   9685  N   SER B 221      -6.754  -2.670 -53.060  1.00 79.13           N\nATOM   9686  CA  SER B 221      -7.764  -3.523 -52.435  1.00 79.74           C\nATOM   9687  C   SER B 221      -8.857  -2.651 -51.784  1.00 79.23           C\nATOM   9688  O   SER B 221      -9.011  -2.657 -50.562  1.00 80.81           O\nATOM   9689  CB  SER B 221      -7.048  -4.499 -51.471  1.00 79.58           C\nATOM   9690  OG  SER B 221      -6.414  -3.840 -50.390  0.00 79.36           O\nATOM   9691  H   SER B 221      -6.116  -2.221 -52.419  1.00 79.13           H\nATOM   9692  HA  SER B 221      -8.258  -4.132 -53.194  1.00 79.74           H\nATOM   9693  HB3 SER B 221      -6.301  -5.083 -52.011  1.00 79.58           H\nATOM   9694  HB2 SER B 221      -7.764  -5.214 -51.065  1.00 79.58           H\nATOM   9695  HG  SER B 221      -7.097  -3.431 -49.851  1.00 79.36           H\nATOM   9696  N   VAL B 222      -9.587  -1.903 -52.629  1.00 77.90           N\nATOM   9697  CA  VAL B 222     -10.667  -0.998 -52.226  1.00 75.92           C\nATOM   9698  C   VAL B 222     -11.939  -1.283 -53.044  1.00 74.65           C\nATOM   9699  O   VAL B 222     -11.852  -1.776 -54.171  1.00 73.70           O\nATOM   9700  CB  VAL B 222     -10.270   0.496 -52.431  1.00 76.31           C\nATOM   9701  CG1 VAL B 222      -9.073   0.885 -51.548  1.00 76.94           C\nATOM   9702  CG2 VAL B 222     -10.036   0.923 -53.896  1.00 74.98           C\nATOM   9703  H   VAL B 222      -9.413  -1.962 -53.622  1.00 77.90           H\nATOM   9704  HA  VAL B 222     -10.917  -1.152 -51.175  1.00 75.92           H\nATOM   9705  HB  VAL B 222     -11.103   1.100 -52.069  1.00 76.31           H\nATOM   9706 HG11 VAL B 222      -8.889   1.958 -51.582  1.00 76.94           H\nATOM   9707 HG12 VAL B 222      -9.250   0.616 -50.507  1.00 76.94           H\nATOM   9708 HG13 VAL B 222      -8.159   0.384 -51.867  1.00 76.94           H\nATOM   9709 HG21 VAL B 222      -9.687   1.955 -53.952  1.00 74.98           H\nATOM   9710 HG22 VAL B 222      -9.288   0.298 -54.383  1.00 74.98           H\nATOM   9711 HG23 VAL B 222     -10.951   0.870 -54.486  1.00 74.98           H\nATOM   9712  N   ASP B 223     -13.098  -0.943 -52.454  1.00 74.29           N\nATOM   9713  CA  ASP B 223     -14.416  -1.039 -53.081  1.00 73.95           C\nATOM   9714  C   ASP B 223     -14.589   0.127 -54.072  1.00 73.50           C\nATOM   9715  O   ASP B 223     -14.968   1.225 -53.663  1.00 72.58           O\nATOM   9716  CB  ASP B 223     -15.538  -1.095 -52.009  1.00 73.87           C\nATOM   9717  CG  ASP B 223     -16.985  -1.288 -52.507  1.00 77.18           C\nATOM   9718  OD1 ASP B 223     -17.181  -1.672 -53.682  1.00 80.34           O\nATOM   9719  OD2 ASP B 223     -17.886  -1.131 -51.655  1.00 79.81           O1-\nATOM   9720  H   ASP B 223     -13.084  -0.542 -51.528  1.00 74.29           H\nATOM   9721  HA  ASP B 223     -14.450  -1.977 -53.641  1.00 73.95           H\nATOM   9722  HB3 ASP B 223     -15.492  -0.199 -51.387  1.00 73.87           H\nATOM   9723  HB2 ASP B 223     -15.318  -1.917 -51.327  1.00 73.87           H\nATOM   9724  N   MET B 224     -14.294  -0.147 -55.354  1.00 72.43           N\nATOM   9725  CA  MET B 224     -14.353   0.815 -56.456  1.00 71.74           C\nATOM   9726  C   MET B 224     -15.762   1.331 -56.793  1.00 70.69           C\nATOM   9727  O   MET B 224     -15.847   2.379 -57.430  1.00 69.93           O\nATOM   9728  CB  MET B 224     -13.663   0.230 -57.707  1.00 72.62           C\nATOM   9729  CG  MET B 224     -12.127   0.151 -57.606  1.00 75.06           C\nATOM   9730  SD  MET B 224     -11.242   1.732 -57.418  1.00 78.60           S\nATOM   9731  CE  MET B 224     -11.705   2.587 -58.948  1.00 81.95           C\nATOM   9732  H   MET B 224     -13.977  -1.076 -55.595  1.00 72.43           H\nATOM   9733  HA  MET B 224     -13.791   1.693 -56.139  1.00 71.74           H\nATOM   9734  HB3 MET B 224     -13.919   0.817 -58.589  1.00 72.62           H\nATOM   9735  HB2 MET B 224     -14.058  -0.767 -57.906  1.00 72.62           H\nATOM   9736  HG3 MET B 224     -11.736  -0.340 -58.498  1.00 75.06           H\nATOM   9737  HG2 MET B 224     -11.847  -0.485 -56.767  1.00 75.06           H\nATOM   9738  HE1 MET B 224     -11.149   3.521 -59.034  1.00 81.95           H\nATOM   9739  HE2 MET B 224     -11.477   1.968 -59.817  1.00 81.95           H\nATOM   9740  HE3 MET B 224     -12.769   2.823 -58.951  1.00 81.95           H\nATOM   9741  N   GLU B 225     -16.833   0.647 -56.345  1.00 69.76           N\nATOM   9742  CA  GLU B 225     -18.210   1.132 -56.480  1.00 68.67           C\nATOM   9743  C   GLU B 225     -18.453   2.405 -55.649  1.00 66.94           C\nATOM   9744  O   GLU B 225     -19.040   3.349 -56.173  1.00 68.13           O\nATOM   9745  CB  GLU B 225     -19.210   0.005 -56.147  1.00 68.47           C\nATOM   9746  CG  GLU B 225     -20.691   0.385 -56.390  0.00 68.39           C\nATOM   9747  CD  GLU B 225     -21.701  -0.763 -56.214  0.00 68.36           C\nATOM   9748  OE1 GLU B 225     -21.374  -1.762 -55.534  0.00 68.33           O\nATOM   9749  OE2 GLU B 225     -22.811  -0.617 -56.773  0.00 68.35           O1-\nATOM   9750  H   GLU B 225     -16.706  -0.203 -55.812  1.00 69.76           H\nATOM   9751  HA  GLU B 225     -18.356   1.394 -57.530  1.00 68.67           H\nATOM   9752  HB3 GLU B 225     -19.082  -0.290 -55.105  1.00 68.47           H\nATOM   9753  HB2 GLU B 225     -18.961  -0.876 -56.743  1.00 68.47           H\nATOM   9754  HG3 GLU B 225     -20.792   0.788 -57.399  1.00 68.39           H\nATOM   9755  HG2 GLU B 225     -20.989   1.184 -55.710  1.00 68.39           H\nATOM   9756  N   LYS B 226     -17.934   2.433 -54.408  1.00 65.13           N\nATOM   9757  CA  LYS B 226     -17.974   3.601 -53.525  1.00 63.77           C\nATOM   9758  C   LYS B 226     -17.036   4.738 -53.957  1.00 62.57           C\nATOM   9759  O   LYS B 226     -17.356   5.893 -53.684  1.00 60.92           O\nATOM   9760  CB  LYS B 226     -17.705   3.173 -52.071  1.00 63.73           C\nATOM   9761  CG  LYS B 226     -18.857   2.338 -51.495  1.00 67.19           C\nATOM   9762  CD  LYS B 226     -18.668   1.999 -50.007  1.00 69.12           C\nATOM   9763  CE  LYS B 226     -19.763   1.077 -49.438  0.00 68.47           C\nATOM   9764  NZ  LYS B 226     -21.103   1.693 -49.476  0.00 68.58           N1+\nATOM   9765  H   LYS B 226     -17.451   1.620 -54.053  1.00 65.13           H\nATOM   9766  HA  LYS B 226     -18.986   4.005 -53.569  1.00 63.77           H\nATOM   9767  HB3 LYS B 226     -17.589   4.062 -51.448  1.00 63.73           H\nATOM   9768  HB2 LYS B 226     -16.764   2.626 -52.000  1.00 63.73           H\nATOM   9769  HG3 LYS B 226     -18.962   1.416 -52.068  1.00 67.19           H\nATOM   9770  HG2 LYS B 226     -19.789   2.886 -51.633  1.00 67.19           H\nATOM   9771  HD3 LYS B 226     -18.618   2.920 -49.425  1.00 69.12           H\nATOM   9772  HD2 LYS B 226     -17.699   1.514 -49.875  1.00 69.12           H\nATOM   9773  HE3 LYS B 226     -19.529   0.824 -48.403  1.00 68.47           H\nATOM   9774  HE2 LYS B 226     -19.794   0.139 -49.993  1.00 68.47           H\nATOM   9775  HZ1 LYS B 226     -21.345   1.906 -50.434  1.00 68.58           H\nATOM   9776  HZ2 LYS B 226     -21.782   1.051 -49.094  1.00 68.58           H\nATOM   9777  HZ3 LYS B 226     -21.101   2.546 -48.935  1.00 68.58           H\nATOM   9778  N   ILE B 227     -15.934   4.416 -54.658  1.00 60.77           N\nATOM   9779  CA  ILE B 227     -15.056   5.409 -55.286  1.00 59.99           C\nATOM   9780  C   ILE B 227     -15.760   6.101 -56.476  1.00 60.41           C\nATOM   9781  O   ILE B 227     -15.647   7.318 -56.604  1.00 58.89           O\nATOM   9782  CB  ILE B 227     -13.706   4.789 -55.767  1.00 59.68           C\nATOM   9783  CG1 ILE B 227     -12.945   4.066 -54.630  1.00 58.82           C\nATOM   9784  CG2 ILE B 227     -12.766   5.787 -56.477  1.00 59.30           C\nATOM   9785  CD1 ILE B 227     -12.621   4.932 -53.407  1.00 56.17           C\nATOM   9786  H   ILE B 227     -15.722   3.445 -54.840  1.00 60.77           H\nATOM   9787  HA  ILE B 227     -14.836   6.183 -54.548  1.00 59.99           H\nATOM   9788  HB  ILE B 227     -13.941   4.023 -56.506  1.00 59.68           H\nATOM   9789 HG13 ILE B 227     -12.023   3.633 -55.019  1.00 58.82           H\nATOM   9790 HG12 ILE B 227     -13.531   3.216 -54.289  1.00 58.82           H\nATOM   9791 HG21 ILE B 227     -11.806   5.327 -56.712  1.00 59.30           H\nATOM   9792 HG22 ILE B 227     -13.183   6.128 -57.422  1.00 59.30           H\nATOM   9793 HG23 ILE B 227     -12.571   6.666 -55.863  1.00 59.30           H\nATOM   9794 HD11 ILE B 227     -11.916   4.422 -52.751  1.00 56.17           H\nATOM   9795 HD12 ILE B 227     -12.179   5.884 -53.693  1.00 56.17           H\nATOM   9796 HD13 ILE B 227     -13.518   5.136 -52.824  1.00 56.17           H\nATOM   9797  N   LEU B 228     -16.517   5.327 -57.277  1.00 60.42           N\nATOM   9798  CA  LEU B 228     -17.335   5.810 -58.393  1.00 60.49           C\nATOM   9799  C   LEU B 228     -18.537   6.668 -57.955  1.00 58.68           C\nATOM   9800  O   LEU B 228     -18.878   7.601 -58.680  1.00 59.98           O\nATOM   9801  CB  LEU B 228     -17.794   4.618 -59.261  1.00 60.68           C\nATOM   9802  CG  LEU B 228     -16.684   4.013 -60.149  1.00 63.91           C\nATOM   9803  CD1 LEU B 228     -17.096   2.623 -60.680  1.00 68.89           C\nATOM   9804  CD2 LEU B 228     -16.250   4.980 -61.275  1.00 67.68           C\nATOM   9805  H   LEU B 228     -16.553   4.330 -57.106  1.00 60.42           H\nATOM   9806  HA  LEU B 228     -16.703   6.454 -59.002  1.00 60.49           H\nATOM   9807  HB3 LEU B 228     -18.618   4.918 -59.908  1.00 60.68           H\nATOM   9808  HB2 LEU B 228     -18.203   3.848 -58.607  1.00 60.68           H\nATOM   9809  HG  LEU B 228     -15.806   3.858 -59.523  1.00 63.91           H\nATOM   9810 HD11 LEU B 228     -17.021   2.538 -61.764  1.00 68.89           H\nATOM   9811 HD12 LEU B 228     -16.458   1.847 -60.255  1.00 68.89           H\nATOM   9812 HD13 LEU B 228     -18.123   2.370 -60.415  1.00 68.89           H\nATOM   9813 HD21 LEU B 228     -16.341   4.544 -62.269  1.00 67.68           H\nATOM   9814 HD22 LEU B 228     -16.842   5.896 -61.281  1.00 67.68           H\nATOM   9815 HD23 LEU B 228     -15.208   5.272 -61.148  1.00 67.68           H\nATOM   9816  N   GLU B 229     -19.129   6.379 -56.781  1.00 57.02           N\nATOM   9817  CA  GLU B 229     -20.163   7.210 -56.153  1.00 57.15           C\nATOM   9818  C   GLU B 229     -19.648   8.616 -55.800  1.00 55.57           C\nATOM   9819  O   GLU B 229     -20.330   9.594 -56.102  1.00 54.39           O\nATOM   9820  CB  GLU B 229     -20.729   6.519 -54.895  1.00 57.80           C\nATOM   9821  CG  GLU B 229     -21.611   5.284 -55.185  1.00 61.08           C\nATOM   9822  CD  GLU B 229     -21.985   4.431 -53.957  1.00 65.04           C\nATOM   9823  OE1 GLU B 229     -21.638   4.809 -52.814  1.00 66.93           O\nATOM   9824  OE2 GLU B 229     -22.634   3.388 -54.187  1.00 64.49           O1-\nATOM   9825  H   GLU B 229     -18.818   5.575 -56.251  1.00 57.02           H\nATOM   9826  HA  GLU B 229     -20.976   7.333 -56.872  1.00 57.15           H\nATOM   9827  HB3 GLU B 229     -21.316   7.237 -54.321  1.00 57.80           H\nATOM   9828  HB2 GLU B 229     -19.896   6.233 -54.253  1.00 57.80           H\nATOM   9829  HG3 GLU B 229     -21.130   4.640 -55.918  1.00 61.08           H\nATOM   9830  HG2 GLU B 229     -22.537   5.615 -55.653  1.00 61.08           H\nATOM   9831  N   ILE B 230     -18.442   8.684 -55.206  1.00 54.63           N\nATOM   9832  CA  ILE B 230     -17.775   9.930 -54.825  1.00 53.48           C\nATOM   9833  C   ILE B 230     -17.295  10.737 -56.054  1.00 53.82           C\nATOM   9834  O   ILE B 230     -17.397  11.963 -56.027  1.00 53.04           O\nATOM   9835  CB  ILE B 230     -16.568   9.673 -53.874  1.00 52.51           C\nATOM   9836  CG1 ILE B 230     -16.994   8.959 -52.569  1.00 51.84           C\nATOM   9837  CG2 ILE B 230     -15.777  10.942 -53.492  1.00 48.91           C\nATOM   9838  CD1 ILE B 230     -15.830   8.265 -51.843  1.00 46.96           C\nATOM   9839  H   ILE B 230     -17.946   7.830 -54.992  1.00 54.63           H\nATOM   9840  HA  ILE B 230     -18.505  10.542 -54.293  1.00 53.48           H\nATOM   9841  HB  ILE B 230     -15.887   9.006 -54.404  1.00 52.51           H\nATOM   9842 HG13 ILE B 230     -17.770   8.220 -52.757  1.00 51.84           H\nATOM   9843 HG12 ILE B 230     -17.456   9.682 -51.897  1.00 51.84           H\nATOM   9844 HG21 ILE B 230     -14.951  10.697 -52.831  1.00 48.91           H\nATOM   9845 HG22 ILE B 230     -15.347  11.454 -54.349  1.00 48.91           H\nATOM   9846 HG23 ILE B 230     -16.409  11.652 -52.963  1.00 48.91           H\nATOM   9847 HD11 ILE B 230     -16.160   7.336 -51.379  1.00 46.96           H\nATOM   9848 HD12 ILE B 230     -15.017   8.010 -52.524  1.00 46.96           H\nATOM   9849 HD13 ILE B 230     -15.420   8.900 -51.058  1.00 46.96           H\nATOM   9850  N   ILE B 231     -16.832  10.047 -57.115  1.00 54.74           N\nATOM   9851  CA  ILE B 231     -16.455  10.645 -58.403  1.00 55.32           C\nATOM   9852  C   ILE B 231     -17.631  11.368 -59.094  1.00 56.45           C\nATOM   9853  O   ILE B 231     -17.427  12.474 -59.589  1.00 57.89           O\nATOM   9854  CB  ILE B 231     -15.809   9.601 -59.373  1.00 56.42           C\nATOM   9855  CG1 ILE B 231     -14.371   9.259 -58.919  1.00 55.11           C\nATOM   9856  CG2 ILE B 231     -15.806   9.983 -60.875  1.00 54.70           C\nATOM   9857  CD1 ILE B 231     -13.814   7.952 -59.501  1.00 54.98           C\nATOM   9858  H   ILE B 231     -16.756   9.041 -57.054  1.00 54.74           H\nATOM   9859  HA  ILE B 231     -15.702  11.405 -58.186  1.00 55.32           H\nATOM   9860  HB  ILE B 231     -16.397   8.688 -59.290  1.00 56.42           H\nATOM   9861 HG13 ILE B 231     -14.336   9.176 -57.835  1.00 55.11           H\nATOM   9862 HG12 ILE B 231     -13.699  10.080 -59.167  1.00 55.11           H\nATOM   9863 HG21 ILE B 231     -15.301   9.236 -61.484  1.00 54.70           H\nATOM   9864 HG22 ILE B 231     -16.815  10.055 -61.280  1.00 54.70           H\nATOM   9865 HG23 ILE B 231     -15.303  10.937 -61.041  1.00 54.70           H\nATOM   9866 HD11 ILE B 231     -12.840   7.728 -59.068  1.00 54.98           H\nATOM   9867 HD12 ILE B 231     -14.471   7.109 -59.291  1.00 54.98           H\nATOM   9868 HD13 ILE B 231     -13.679   8.008 -60.580  1.00 54.98           H\nATOM   9869  N   ARG B 232     -18.834  10.765 -59.081  1.00 57.97           N\nATOM   9870  CA  ARG B 232     -20.051  11.373 -59.633  1.00 58.74           C\nATOM   9871  C   ARG B 232     -20.558  12.582 -58.825  1.00 57.33           C\nATOM   9872  O   ARG B 232     -21.144  13.478 -59.434  1.00 56.48           O\nATOM   9873  CB  ARG B 232     -21.155  10.310 -59.808  1.00 60.80           C\nATOM   9874  CG  ARG B 232     -20.868   9.334 -60.966  1.00 66.95           C\nATOM   9875  CD  ARG B 232     -22.006   8.332 -61.243  1.00 72.76           C\nATOM   9876  NE  ARG B 232     -22.109   7.270 -60.226  1.00 77.35           N\nATOM   9877  CZ  ARG B 232     -21.634   6.012 -60.305  1.00 81.94           C\nATOM   9878  NH1 ARG B 232     -20.978   5.559 -61.385  1.00 82.40           N\nATOM   9879  NH2 ARG B 232     -21.828   5.185 -59.270  1.00 82.17           N1+\nATOM   9880  H   ARG B 232     -18.934   9.852 -58.660  1.00 57.97           H\nATOM   9881  HA  ARG B 232     -19.806  11.759 -60.625  1.00 58.74           H\nATOM   9882  HB3 ARG B 232     -22.098  10.812 -60.031  1.00 60.80           H\nATOM   9883  HB2 ARG B 232     -21.313   9.771 -58.873  1.00 60.80           H\nATOM   9884  HG3 ARG B 232     -19.973   8.776 -60.691  1.00 66.95           H\nATOM   9885  HG2 ARG B 232     -20.604   9.858 -61.885  1.00 66.95           H\nATOM   9886  HD3 ARG B 232     -21.993   7.967 -62.271  1.00 72.76           H\nATOM   9887  HD2 ARG B 232     -22.951   8.865 -61.143  1.00 72.76           H\nATOM   9888  HE  ARG B 232     -22.582   7.533 -59.370  1.00 77.35           H\nATOM   9889 HH12 ARG B 232     -20.638   4.609 -61.421  1.00 82.40           H\nATOM   9890 HH11 ARG B 232     -20.821   6.172 -62.171  1.00 82.40           H\nATOM   9891 HH22 ARG B 232     -21.483   4.237 -59.291  1.00 82.17           H\nATOM   9892 HH21 ARG B 232     -22.327   5.509 -58.452  1.00 82.17           H\nATOM   9893  N   VAL B 233     -20.292  12.630 -57.506  1.00 55.61           N\nATOM   9894  CA  VAL B 233     -20.553  13.810 -56.672  1.00 53.83           C\nATOM   9895  C   VAL B 233     -19.575  14.963 -56.988  1.00 52.98           C\nATOM   9896  O   VAL B 233     -20.014  16.112 -57.014  1.00 51.27           O\nATOM   9897  CB  VAL B 233     -20.519  13.480 -55.148  1.00 54.84           C\nATOM   9898  CG1 VAL B 233     -20.534  14.709 -54.211  1.00 52.97           C\nATOM   9899  CG2 VAL B 233     -21.685  12.551 -54.764  1.00 50.04           C\nATOM   9900  H   VAL B 233     -19.815  11.858 -57.060  1.00 55.61           H\nATOM   9901  HA  VAL B 233     -21.558  14.167 -56.909  1.00 53.83           H\nATOM   9902  HB  VAL B 233     -19.600  12.933 -54.941  1.00 54.84           H\nATOM   9903 HG11 VAL B 233     -20.662  14.410 -53.172  1.00 52.97           H\nATOM   9904 HG12 VAL B 233     -19.604  15.276 -54.260  1.00 52.97           H\nATOM   9905 HG13 VAL B 233     -21.353  15.386 -54.456  1.00 52.97           H\nATOM   9906 HG21 VAL B 233     -21.613  12.239 -53.721  1.00 50.04           H\nATOM   9907 HG22 VAL B 233     -22.646  13.049 -54.897  1.00 50.04           H\nATOM   9908 HG23 VAL B 233     -21.700  11.647 -55.370  1.00 50.04           H\nATOM   9909  N   ILE B 234     -18.298  14.638 -57.267  1.00 52.08           N\nATOM   9910  CA  ILE B 234     -17.263  15.591 -57.687  1.00 52.23           C\nATOM   9911  C   ILE B 234     -17.511  16.174 -59.098  1.00 53.33           C\nATOM   9912  O   ILE B 234     -17.195  17.342 -59.319  1.00 53.19           O\nATOM   9913  CB  ILE B 234     -15.830  14.973 -57.591  1.00 51.08           C\nATOM   9914  CG1 ILE B 234     -15.438  14.740 -56.113  1.00 52.23           C\nATOM   9915  CG2 ILE B 234     -14.714  15.780 -58.296  1.00 49.69           C\nATOM   9916  CD1 ILE B 234     -14.265  13.767 -55.917  1.00 52.49           C\nATOM   9917  H   ILE B 234     -18.011  13.670 -57.210  1.00 52.08           H\nATOM   9918  HA  ILE B 234     -17.303  16.429 -56.989  1.00 52.23           H\nATOM   9919  HB  ILE B 234     -15.866  13.995 -58.071  1.00 51.08           H\nATOM   9920 HG13 ILE B 234     -16.287  14.356 -55.548  1.00 52.23           H\nATOM   9921 HG12 ILE B 234     -15.194  15.698 -55.653  1.00 52.23           H\nATOM   9922 HG21 ILE B 234     -13.734  15.331 -58.144  1.00 49.69           H\nATOM   9923 HG22 ILE B 234     -14.855  15.827 -59.376  1.00 49.69           H\nATOM   9924 HG23 ILE B 234     -14.667  16.801 -57.916  1.00 49.69           H\nATOM   9925 HD11 ILE B 234     -14.182  13.470 -54.872  1.00 52.49           H\nATOM   9926 HD12 ILE B 234     -14.392  12.861 -56.510  1.00 52.49           H\nATOM   9927 HD13 ILE B 234     -13.314  14.221 -56.197  1.00 52.49           H\nATOM   9928  N   LEU B 235     -18.102  15.387 -60.013  1.00 52.27           N\nATOM   9929  CA  LEU B 235     -18.489  15.846 -61.350  1.00 53.61           C\nATOM   9930  C   LEU B 235     -19.738  16.748 -61.317  1.00 53.19           C\nATOM   9931  O   LEU B 235     -19.741  17.776 -61.994  1.00 54.75           O\nATOM   9932  CB  LEU B 235     -18.696  14.635 -62.286  1.00 53.05           C\nATOM   9933  CG  LEU B 235     -17.392  13.900 -62.676  1.00 57.26           C\nATOM   9934  CD1 LEU B 235     -17.700  12.565 -63.385  1.00 55.03           C\nATOM   9935  CD2 LEU B 235     -16.430  14.789 -63.493  1.00 54.00           C\nATOM   9936  H   LEU B 235     -18.311  14.425 -59.785  1.00 52.27           H\nATOM   9937  HA  LEU B 235     -17.676  16.456 -61.748  1.00 53.61           H\nATOM   9938  HB3 LEU B 235     -19.194  14.956 -63.203  1.00 53.05           H\nATOM   9939  HB2 LEU B 235     -19.384  13.939 -61.804  1.00 53.05           H\nATOM   9940  HG  LEU B 235     -16.868  13.645 -61.756  1.00 57.26           H\nATOM   9941 HD11 LEU B 235     -17.145  11.748 -62.925  1.00 55.03           H\nATOM   9942 HD12 LEU B 235     -18.757  12.304 -63.328  1.00 55.03           H\nATOM   9943 HD13 LEU B 235     -17.437  12.580 -64.442  1.00 55.03           H\nATOM   9944 HD21 LEU B 235     -16.008  14.272 -64.355  1.00 54.00           H\nATOM   9945 HD22 LEU B 235     -16.921  15.686 -63.869  1.00 54.00           H\nATOM   9946 HD23 LEU B 235     -15.590  15.112 -62.877  1.00 54.00           H\nATOM   9947  N   LYS B 236     -20.750  16.376 -60.511  1.00 52.54           N\nATOM   9948  CA  LYS B 236     -21.982  17.149 -60.303  1.00 53.69           C\nATOM   9949  C   LYS B 236     -21.739  18.494 -59.586  1.00 53.97           C\nATOM   9950  O   LYS B 236     -22.434  19.466 -59.878  1.00 55.43           O\nATOM   9951  CB  LYS B 236     -23.007  16.266 -59.557  1.00 53.19           C\nATOM   9952  CG  LYS B 236     -24.383  16.924 -59.337  1.00 53.81           C\nATOM   9953  CD  LYS B 236     -25.397  15.990 -58.665  0.00 53.44           C\nATOM   9954  CE  LYS B 236     -26.743  16.691 -58.415  0.00 53.43           C\nATOM   9955  NZ  LYS B 236     -27.720  15.796 -57.771  0.00 53.40           N1+\nATOM   9956  H   LYS B 236     -20.677  15.511 -59.992  1.00 52.54           H\nATOM   9957  HA  LYS B 236     -22.392  17.377 -61.289  1.00 53.69           H\nATOM   9958  HB3 LYS B 236     -22.595  15.960 -58.593  1.00 53.19           H\nATOM   9959  HB2 LYS B 236     -23.154  15.347 -60.126  1.00 53.19           H\nATOM   9960  HG3 LYS B 236     -24.778  17.263 -60.296  1.00 53.81           H\nATOM   9961  HG2 LYS B 236     -24.279  17.815 -58.719  1.00 53.81           H\nATOM   9962  HD3 LYS B 236     -24.982  15.630 -57.721  1.00 53.44           H\nATOM   9963  HD2 LYS B 236     -25.545  15.110 -59.293  1.00 53.44           H\nATOM   9964  HE3 LYS B 236     -27.164  17.048 -59.356  1.00 53.43           H\nATOM   9965  HE2 LYS B 236     -26.600  17.564 -57.776  1.00 53.43           H\nATOM   9966  HZ1 LYS B 236     -27.359  15.484 -56.881  1.00 53.40           H\nATOM   9967  HZ2 LYS B 236     -28.587  16.294 -57.624  1.00 53.40           H\nATOM   9968  HZ3 LYS B 236     -27.890  14.996 -58.365  1.00 53.40           H\nATOM   9969  N   LEU B 237     -20.734  18.521 -58.696  1.00 53.67           N\nATOM   9970  CA  LEU B 237     -20.206  19.686 -57.985  1.00 53.26           C\nATOM   9971  C   LEU B 237     -19.783  20.829 -58.928  1.00 50.74           C\nATOM   9972  O   LEU B 237     -20.160  21.972 -58.674  1.00 47.52           O\nATOM   9973  CB  LEU B 237     -19.072  19.177 -57.059  1.00 53.94           C\nATOM   9974  CG  LEU B 237     -18.003  20.169 -56.556  1.00 60.22           C\nATOM   9975  CD1 LEU B 237     -18.585  21.126 -55.504  1.00 68.37           C\nATOM   9976  CD2 LEU B 237     -16.768  19.407 -56.037  1.00 64.18           C\nATOM   9977  H   LEU B 237     -20.246  17.655 -58.507  1.00 53.67           H\nATOM   9978  HA  LEU B 237     -21.007  20.076 -57.356  1.00 53.26           H\nATOM   9979  HB3 LEU B 237     -18.534  18.411 -57.605  1.00 53.94           H\nATOM   9980  HB2 LEU B 237     -19.511  18.655 -56.208  1.00 53.94           H\nATOM   9981  HG  LEU B 237     -17.636  20.774 -57.385  1.00 60.22           H\nATOM   9982 HD11 LEU B 237     -18.398  22.160 -55.787  1.00 68.37           H\nATOM   9983 HD12 LEU B 237     -19.663  21.007 -55.386  1.00 68.37           H\nATOM   9984 HD13 LEU B 237     -18.140  20.960 -54.528  1.00 68.37           H\nATOM   9985 HD21 LEU B 237     -16.278  19.922 -55.216  1.00 64.18           H\nATOM   9986 HD22 LEU B 237     -17.021  18.406 -55.687  1.00 64.18           H\nATOM   9987 HD23 LEU B 237     -16.024  19.299 -56.828  1.00 64.18           H\nATOM   9988  N   TYR B 238     -19.038  20.502 -59.998  1.00 49.23           N\nATOM   9989  CA  TYR B 238     -18.566  21.474 -60.989  1.00 49.52           C\nATOM   9990  C   TYR B 238     -19.654  21.948 -61.968  1.00 51.86           C\nATOM   9991  O   TYR B 238     -19.530  23.059 -62.484  1.00 51.29           O\nATOM   9992  CB  TYR B 238     -17.334  20.917 -61.731  1.00 49.75           C\nATOM   9993  CG  TYR B 238     -16.127  20.674 -60.840  1.00 46.61           C\nATOM   9994  CD1 TYR B 238     -15.624  21.716 -60.031  1.00 45.17           C\nATOM   9995  CD2 TYR B 238     -15.504  19.409 -60.808  1.00 42.28           C\nATOM   9996  CE1 TYR B 238     -14.540  21.482 -59.168  1.00 47.93           C\nATOM   9997  CE2 TYR B 238     -14.413  19.177 -59.948  1.00 47.09           C\nATOM   9998  CZ  TYR B 238     -13.939  20.210 -59.118  1.00 49.74           C\nATOM   9999  OH  TYR B 238     -12.901  19.979 -58.266  1.00 47.65           O\nATOM  10000  H   TYR B 238     -18.761  19.541 -60.143  1.00 49.23           H\nATOM  10001  HA  TYR B 238     -18.254  22.366 -60.445  1.00 49.52           H\nATOM  10002  HB3 TYR B 238     -17.022  21.616 -62.509  1.00 49.75           H\nATOM  10003  HB2 TYR B 238     -17.602  19.993 -62.246  1.00 49.75           H\nATOM  10004  HD1 TYR B 238     -16.074  22.697 -60.056  1.00 45.17           H\nATOM  10005  HD2 TYR B 238     -15.873  18.604 -61.429  1.00 42.28           H\nATOM  10006  HE1 TYR B 238     -14.181  22.287 -58.546  1.00 47.93           H\nATOM  10007  HE2 TYR B 238     -13.950  18.202 -59.918  1.00 47.09           H\nATOM  10008  HH  TYR B 238     -12.691  20.744 -57.717  1.00 47.65           H\nATOM  10009  N   GLU B 239     -20.713  21.146 -62.172  1.00 53.07           N\nATOM  10010  CA  GLU B 239     -21.895  21.549 -62.940  1.00 53.68           C\nATOM  10011  C   GLU B 239     -22.830  22.477 -62.145  1.00 53.49           C\nATOM  10012  O   GLU B 239     -23.450  23.346 -62.755  1.00 53.42           O\nATOM  10013  CB  GLU B 239     -22.641  20.308 -63.475  1.00 54.19           C\nATOM  10014  CG  GLU B 239     -21.816  19.446 -64.460  1.00 57.12           C\nATOM  10015  CD  GLU B 239     -21.371  20.159 -65.750  1.00 57.15           C\nATOM  10016  OE1 GLU B 239     -22.160  20.968 -66.290  1.00 59.30           O\nATOM  10017  OE2 GLU B 239     -20.235  19.873 -66.189  1.00 58.01           O1-\nATOM  10018  H   GLU B 239     -20.751  20.238 -61.730  1.00 53.07           H\nATOM  10019  HA  GLU B 239     -21.557  22.135 -63.796  1.00 53.68           H\nATOM  10020  HB3 GLU B 239     -23.578  20.610 -63.946  1.00 54.19           H\nATOM  10021  HB2 GLU B 239     -22.932  19.678 -62.634  1.00 54.19           H\nATOM  10022  HG3 GLU B 239     -22.408  18.578 -64.752  1.00 57.12           H\nATOM  10023  HG2 GLU B 239     -20.943  19.047 -63.944  1.00 57.12           H\nATOM  10024  N   GLN B 240     -22.879  22.327 -60.808  1.00 52.54           N\nATOM  10025  CA  GLN B 240     -23.560  23.270 -59.919  1.00 53.85           C\nATOM  10026  C   GLN B 240     -22.801  24.604 -59.813  1.00 52.68           C\nATOM  10027  O   GLN B 240     -23.457  25.642 -59.797  1.00 52.39           O\nATOM  10028  CB  GLN B 240     -23.808  22.631 -58.533  1.00 55.00           C\nATOM  10029  CG  GLN B 240     -24.526  23.532 -57.496  1.00 60.71           C\nATOM  10030  CD  GLN B 240     -25.986  23.827 -57.860  1.00 67.88           C\nATOM  10031  OE1 GLN B 240     -26.882  23.073 -57.490  1.00 70.89           O\nATOM  10032  NE2 GLN B 240     -26.236  24.917 -58.588  1.00 67.99           N\nATOM  10033  H   GLN B 240     -22.372  21.571 -60.367  1.00 52.54           H\nATOM  10034  HA  GLN B 240     -24.534  23.483 -60.363  1.00 53.85           H\nATOM  10035  HB3 GLN B 240     -22.856  22.309 -58.112  1.00 55.00           H\nATOM  10036  HB2 GLN B 240     -24.388  21.718 -58.669  1.00 55.00           H\nATOM  10037  HG3 GLN B 240     -23.989  24.467 -57.331  1.00 60.71           H\nATOM  10038  HG2 GLN B 240     -24.521  23.031 -56.528  1.00 60.71           H\nATOM  10039 HE22 GLN B 240     -27.186  25.131 -58.860  1.00 67.99           H\nATOM  10040 HE21 GLN B 240     -25.479  25.510 -58.901  1.00 67.99           H\nATOM  10041  N   TRP B 241     -21.456  24.553 -59.772  1.00 52.26           N\nATOM  10042  CA  TRP B 241     -20.547  25.707 -59.732  1.00 52.05           C\nATOM  10043  C   TRP B 241     -20.746  26.628 -60.949  1.00 52.39           C\nATOM  10044  O   TRP B 241     -20.897  27.835 -60.770  1.00 50.40           O\nATOM  10045  CB  TRP B 241     -19.099  25.173 -59.638  1.00 51.50           C\nATOM  10046  CG  TRP B 241     -17.964  26.103 -59.303  1.00 49.18           C\nATOM  10047  CD1 TRP B 241     -17.739  27.351 -59.781  1.00 48.01           C\nATOM  10048  CD2 TRP B 241     -16.809  25.795 -58.465  1.00 48.57           C\nATOM  10049  NE1 TRP B 241     -16.564  27.848 -59.256  1.00 45.22           N\nATOM  10050  CE2 TRP B 241     -15.944  26.931 -58.437  1.00 51.07           C\nATOM  10051  CE3 TRP B 241     -16.411  24.666 -57.715  1.00 45.39           C\nATOM  10052  CZ2 TRP B 241     -14.752  26.951 -57.691  1.00 49.06           C\nATOM  10053  CZ3 TRP B 241     -15.225  24.679 -56.957  1.00 47.49           C\nATOM  10054  CH2 TRP B 241     -14.394  25.815 -56.943  1.00 48.77           C\nATOM  10055  H   TRP B 241     -21.008  23.647 -59.783  1.00 52.26           H\nATOM  10056  HA  TRP B 241     -20.775  26.266 -58.823  1.00 52.05           H\nATOM  10057  HB3 TRP B 241     -18.830  24.666 -60.563  1.00 51.50           H\nATOM  10058  HB2 TRP B 241     -19.078  24.403 -58.867  1.00 51.50           H\nATOM  10059  HD1 TRP B 241     -18.374  27.884 -60.469  1.00 48.01           H\nATOM  10060  HE1 TRP B 241     -16.219  28.771 -59.476  1.00 45.22           H\nATOM  10061  HE3 TRP B 241     -17.034  23.784 -57.705  1.00 45.39           H\nATOM  10062  HZ2 TRP B 241     -14.121  27.827 -57.690  1.00 49.06           H\nATOM  10063  HZ3 TRP B 241     -14.967  23.809 -56.378  1.00 47.49           H\nATOM  10064  HH2 TRP B 241     -13.486  25.814 -56.358  1.00 48.77           H\nATOM  10065  N   LYS B 242     -20.793  26.015 -62.144  1.00 52.74           N\nATOM  10066  CA  LYS B 242     -21.097  26.624 -63.440  1.00 53.70           C\nATOM  10067  C   LYS B 242     -22.422  27.411 -63.455  1.00 53.91           C\nATOM  10068  O   LYS B 242     -22.446  28.540 -63.943  1.00 54.65           O\nATOM  10069  CB  LYS B 242     -21.076  25.480 -64.482  1.00 53.68           C\nATOM  10070  CG  LYS B 242     -21.617  25.784 -65.893  1.00 56.38           C\nATOM  10071  CD  LYS B 242     -21.841  24.488 -66.683  1.00 58.99           C\nATOM  10072  CE  LYS B 242     -22.518  24.719 -68.041  1.00 62.73           C\nATOM  10073  NZ  LYS B 242     -22.786  23.441 -68.724  1.00 63.40           N1+\nATOM  10074  H   LYS B 242     -20.644  25.016 -62.171  1.00 52.74           H\nATOM  10075  HA  LYS B 242     -20.289  27.320 -63.671  1.00 53.70           H\nATOM  10076  HB3 LYS B 242     -21.680  24.667 -64.081  1.00 53.68           H\nATOM  10077  HB2 LYS B 242     -20.066  25.075 -64.561  1.00 53.68           H\nATOM  10078  HG3 LYS B 242     -20.923  26.435 -66.424  1.00 56.38           H\nATOM  10079  HG2 LYS B 242     -22.567  26.316 -65.851  1.00 56.38           H\nATOM  10080  HD3 LYS B 242     -22.458  23.814 -66.085  1.00 58.99           H\nATOM  10081  HD2 LYS B 242     -20.884  23.982 -66.823  1.00 58.99           H\nATOM  10082  HE3 LYS B 242     -21.892  25.344 -68.678  1.00 62.73           H\nATOM  10083  HE2 LYS B 242     -23.466  25.241 -67.904  1.00 62.73           H\nATOM  10084  HZ1 LYS B 242     -23.372  22.864 -68.138  1.00 63.40           H\nATOM  10085  HZ2 LYS B 242     -23.248  23.613 -69.605  1.00 63.40           H\nATOM  10086  HZ3 LYS B 242     -21.914  22.957 -68.886  1.00 63.40           H\nATOM  10087  N   ASN B 243     -23.490  26.784 -62.935  1.00 54.58           N\nATOM  10088  CA  ASN B 243     -24.864  27.296 -62.972  1.00 55.47           C\nATOM  10089  C   ASN B 243     -25.227  28.181 -61.760  1.00 54.76           C\nATOM  10090  O   ASN B 243     -26.341  28.704 -61.738  1.00 57.81           O\nATOM  10091  CB  ASN B 243     -25.836  26.096 -63.092  1.00 56.35           C\nATOM  10092  CG  ASN B 243     -25.698  25.291 -64.394  1.00 56.66           C\nATOM  10093  OD1 ASN B 243     -25.283  25.810 -65.428  1.00 58.82           O\nATOM  10094  ND2 ASN B 243     -26.073  24.011 -64.352  1.00 56.14           N\nATOM  10095  H   ASN B 243     -23.374  25.858 -62.547  1.00 54.58           H\nATOM  10096  HA  ASN B 243     -24.974  27.918 -63.863  1.00 55.47           H\nATOM  10097  HB3 ASN B 243     -26.868  26.448 -63.057  1.00 56.35           H\nATOM  10098  HB2 ASN B 243     -25.710  25.430 -62.236  1.00 56.35           H\nATOM  10099 HD22 ASN B 243     -26.009  23.438 -65.180  1.00 56.14           H\nATOM  10100 HD21 ASN B 243     -26.409  23.604 -63.492  1.00 56.14           H\nATOM  10101  N   PHE B 244     -24.310  28.344 -60.790  1.00 53.23           N\nATOM  10102  CA  PHE B 244     -24.501  29.142 -59.578  1.00 53.08           C\nATOM  10103  C   PHE B 244     -23.637  30.408 -59.633  1.00 52.85           C\nATOM  10104  O   PHE B 244     -22.458  30.328 -59.980  1.00 53.95           O\nATOM  10105  CB  PHE B 244     -24.145  28.272 -58.349  1.00 52.47           C\nATOM  10106  CG  PHE B 244     -24.191  28.918 -56.971  1.00 52.96           C\nATOM  10107  CD1 PHE B 244     -25.225  29.813 -56.616  1.00 54.97           C\nATOM  10108  CD2 PHE B 244     -23.303  28.476 -55.967  1.00 49.80           C\nATOM  10109  CE1 PHE B 244     -25.316  30.301 -55.321  1.00 53.41           C\nATOM  10110  CE2 PHE B 244     -23.418  28.969 -54.674  1.00 52.85           C\nATOM  10111  CZ  PHE B 244     -24.412  29.880 -54.356  1.00 54.86           C\nATOM  10112  H   PHE B 244     -23.405  27.904 -60.888  1.00 53.23           H\nATOM  10113  HA  PHE B 244     -25.548  29.441 -59.491  1.00 53.08           H\nATOM  10114  HB3 PHE B 244     -23.137  27.877 -58.489  1.00 52.47           H\nATOM  10115  HB2 PHE B 244     -24.807  27.408 -58.317  1.00 52.47           H\nATOM  10116  HD1 PHE B 244     -25.958  30.121 -57.344  1.00 54.97           H\nATOM  10117  HD2 PHE B 244     -22.534  27.753 -56.196  1.00 49.80           H\nATOM  10118  HE1 PHE B 244     -26.102  30.993 -55.058  1.00 53.41           H\nATOM  10119  HE2 PHE B 244     -22.740  28.645 -53.903  1.00 52.85           H\nATOM  10120  HZ  PHE B 244     -24.480  30.251 -53.347  1.00 54.86           H\nATOM  10121  N   ASP B 245     -24.233  31.538 -59.226  1.00 53.58           N\nATOM  10122  CA  ASP B 245     -23.547  32.808 -59.028  1.00 54.95           C\nATOM  10123  C   ASP B 245     -23.975  33.313 -57.644  1.00 54.01           C\nATOM  10124  O   ASP B 245     -25.028  33.937 -57.512  1.00 55.38           O\nATOM  10125  CB  ASP B 245     -23.834  33.791 -60.193  1.00 56.06           C\nATOM  10126  CG  ASP B 245     -22.970  35.066 -60.261  1.00 61.79           C\nATOM  10127  OD1 ASP B 245     -22.441  35.520 -59.221  1.00 67.31           O\nATOM  10128  OD2 ASP B 245     -22.937  35.644 -61.368  1.00 72.02           O1-\nATOM  10129  H   ASP B 245     -25.215  31.528 -58.979  1.00 53.58           H\nATOM  10130  HA  ASP B 245     -22.467  32.643 -58.994  1.00 54.95           H\nATOM  10131  HB3 ASP B 245     -24.885  34.083 -60.179  1.00 56.06           H\nATOM  10132  HB2 ASP B 245     -23.717  33.248 -61.134  1.00 56.06           H\nATOM  10133  N   GLU B 246     -23.140  33.012 -56.636  1.00 54.72           N\nATOM  10134  CA  GLU B 246     -23.371  33.344 -55.229  1.00 55.83           C\nATOM  10135  C   GLU B 246     -23.410  34.856 -54.936  1.00 54.49           C\nATOM  10136  O   GLU B 246     -24.072  35.256 -53.980  1.00 54.81           O\nATOM  10137  CB  GLU B 246     -22.328  32.605 -54.364  1.00 55.73           C\nATOM  10138  CG  GLU B 246     -20.877  33.116 -54.457  1.00 59.53           C\nATOM  10139  CD  GLU B 246     -19.921  32.175 -53.715  1.00 63.20           C\nATOM  10140  OE1 GLU B 246     -19.318  31.320 -54.401  1.00 68.26           O\nATOM  10141  OE2 GLU B 246     -19.819  32.308 -52.475  1.00 64.95           O1-\nATOM  10142  H   GLU B 246     -22.299  32.490 -56.832  1.00 54.72           H\nATOM  10143  HA  GLU B 246     -24.356  32.948 -54.982  1.00 55.83           H\nATOM  10144  HB3 GLU B 246     -22.335  31.552 -54.644  1.00 55.73           H\nATOM  10145  HB2 GLU B 246     -22.644  32.628 -53.322  1.00 55.73           H\nATOM  10146  HG3 GLU B 246     -20.795  34.118 -54.036  1.00 59.53           H\nATOM  10147  HG2 GLU B 246     -20.571  33.199 -55.501  1.00 59.53           H\nATOM  10148  N   ARG B 247     -22.743  35.670 -55.772  1.00 54.45           N\nATOM  10149  CA  ARG B 247     -22.736  37.128 -55.658  1.00 54.32           C\nATOM  10150  C   ARG B 247     -24.076  37.776 -56.043  1.00 53.38           C\nATOM  10151  O   ARG B 247     -24.406  38.822 -55.485  1.00 50.89           O\nATOM  10152  CB  ARG B 247     -21.548  37.723 -56.437  1.00 54.68           C\nATOM  10153  CG  ARG B 247     -20.193  37.195 -55.932  1.00 56.11           C\nATOM  10154  CD  ARG B 247     -18.983  37.843 -56.621  1.00 59.17           C\nATOM  10155  NE  ARG B 247     -17.731  37.524 -55.909  1.00 62.95           N\nATOM  10156  CZ  ARG B 247     -17.115  38.270 -54.971  1.00 64.29           C\nATOM  10157  NH1 ARG B 247     -17.557  39.487 -54.616  1.00 63.79           N\nATOM  10158  NH2 ARG B 247     -16.026  37.782 -54.365  1.00 66.25           N1+\nATOM  10159  H   ARG B 247     -22.252  35.279 -56.564  1.00 54.45           H\nATOM  10160  HA  ARG B 247     -22.573  37.368 -54.612  1.00 54.32           H\nATOM  10161  HB3 ARG B 247     -21.559  38.808 -56.321  1.00 54.68           H\nATOM  10162  HB2 ARG B 247     -21.652  37.530 -57.504  1.00 54.68           H\nATOM  10163  HG3 ARG B 247     -20.170  36.133 -56.180  1.00 56.11           H\nATOM  10164  HG2 ARG B 247     -20.116  37.246 -54.847  1.00 56.11           H\nATOM  10165  HD3 ARG B 247     -19.126  38.902 -56.834  1.00 59.17           H\nATOM  10166  HD2 ARG B 247     -18.857  37.360 -57.590  1.00 59.17           H\nATOM  10167  HE  ARG B 247     -17.347  36.612 -56.112  1.00 62.95           H\nATOM  10168 HH12 ARG B 247     -17.084  40.021 -53.901  1.00 63.79           H\nATOM  10169 HH11 ARG B 247     -18.378  39.871 -55.062  1.00 63.79           H\nATOM  10170 HH22 ARG B 247     -15.560  38.314 -53.644  1.00 66.25           H\nATOM  10171 HH21 ARG B 247     -15.675  36.866 -54.606  1.00 66.25           H\nATOM  10172  N   LYS B 248     -24.835  37.129 -56.943  1.00 53.85           N\nATOM  10173  CA  LYS B 248     -26.166  37.565 -57.365  1.00 56.08           C\nATOM  10174  C   LYS B 248     -27.307  36.983 -56.511  1.00 55.48           C\nATOM  10175  O   LYS B 248     -28.383  37.582 -56.509  1.00 56.30           O\nATOM  10176  CB  LYS B 248     -26.371  37.191 -58.848  1.00 56.89           C\nATOM  10177  CG  LYS B 248     -25.530  38.044 -59.812  1.00 62.93           C\nATOM  10178  CD  LYS B 248     -25.820  37.712 -61.287  1.00 68.13           C\nATOM  10179  CE  LYS B 248     -25.126  38.639 -62.304  1.00 70.58           C\nATOM  10180  NZ  LYS B 248     -23.655  38.582 -62.225  1.00 72.77           N1+\nATOM  10181  H   LYS B 248     -24.495  36.270 -57.355  1.00 53.85           H\nATOM  10182  HA  LYS B 248     -26.230  38.651 -57.281  1.00 56.08           H\nATOM  10183  HB3 LYS B 248     -27.419  37.335 -59.113  1.00 56.89           H\nATOM  10184  HB2 LYS B 248     -26.164  36.131 -59.003  1.00 56.89           H\nATOM  10185  HG3 LYS B 248     -24.472  37.892 -59.596  1.00 62.93           H\nATOM  10186  HG2 LYS B 248     -25.734  39.100 -59.632  1.00 62.93           H\nATOM  10187  HD3 LYS B 248     -26.896  37.765 -61.456  1.00 68.13           H\nATOM  10188  HD2 LYS B 248     -25.548  36.675 -61.487  1.00 68.13           H\nATOM  10189  HE3 LYS B 248     -25.448  39.671 -62.158  1.00 70.58           H\nATOM  10190  HE2 LYS B 248     -25.423  38.354 -63.313  1.00 70.58           H\nATOM  10191  HZ1 LYS B 248     -23.353  37.620 -62.326  1.00 72.77           H\nATOM  10192  HZ2 LYS B 248     -23.245  39.148 -62.953  1.00 72.77           H\nATOM  10193  HZ3 LYS B 248     -23.353  38.918 -61.322  1.00 72.77           H\nATOM  10194  N   GLU B 249     -27.085  35.837 -55.842  1.00 55.31           N\nATOM  10195  CA  GLU B 249     -28.164  35.024 -55.269  1.00 54.66           C\nATOM  10196  C   GLU B 249     -28.213  34.977 -53.735  1.00 53.32           C\nATOM  10197  O   GLU B 249     -29.312  34.810 -53.206  1.00 53.69           O\nATOM  10198  CB  GLU B 249     -28.058  33.587 -55.812  1.00 54.81           C\nATOM  10199  CG  GLU B 249     -28.280  33.471 -57.337  1.00 56.52           C\nATOM  10200  CD  GLU B 249     -28.151  32.032 -57.854  1.00 59.58           C\nATOM  10201  OE1 GLU B 249     -28.706  31.125 -57.195  1.00 60.16           O\nATOM  10202  OE2 GLU B 249     -27.501  31.849 -58.907  1.00 66.71           O1-\nATOM  10203  H   GLU B 249     -26.174  35.403 -55.889  1.00 55.31           H\nATOM  10204  HA  GLU B 249     -29.135  35.410 -55.589  1.00 54.66           H\nATOM  10205  HB3 GLU B 249     -28.781  32.958 -55.290  1.00 54.81           H\nATOM  10206  HB2 GLU B 249     -27.075  33.181 -55.566  1.00 54.81           H\nATOM  10207  HG3 GLU B 249     -27.589  34.120 -57.876  1.00 56.52           H\nATOM  10208  HG2 GLU B 249     -29.280  33.829 -57.586  1.00 56.52           H\nATOM  10209  N   MET B 250     -27.063  35.057 -53.040  1.00 53.35           N\nATOM  10210  CA  MET B 250     -26.996  34.696 -51.618  1.00 54.38           C\nATOM  10211  C   MET B 250     -27.700  35.634 -50.631  1.00 55.46           C\nATOM  10212  O   MET B 250     -28.135  35.129 -49.601  1.00 54.70           O\nATOM  10213  CB  MET B 250     -25.557  34.376 -51.170  1.00 53.73           C\nATOM  10214  CG  MET B 250     -25.021  33.048 -51.731  1.00 54.26           C\nATOM  10215  SD  MET B 250     -26.002  31.546 -51.441  1.00 54.57           S\nATOM  10216  CE  MET B 250     -26.326  31.644 -49.668  1.00 47.87           C\nATOM  10217  H   MET B 250     -26.184  35.214 -53.514  1.00 53.35           H\nATOM  10218  HA  MET B 250     -27.568  33.774 -51.528  1.00 54.38           H\nATOM  10219  HB3 MET B 250     -25.497  34.329 -50.081  1.00 53.73           H\nATOM  10220  HB2 MET B 250     -24.893  35.192 -51.454  1.00 53.73           H\nATOM  10221  HG3 MET B 250     -24.018  32.873 -51.348  1.00 54.26           H\nATOM  10222  HG2 MET B 250     -24.925  33.131 -52.808  1.00 54.26           H\nATOM  10223  HE1 MET B 250     -26.809  30.722 -49.356  1.00 47.87           H\nATOM  10224  HE2 MET B 250     -25.404  31.766 -49.103  1.00 47.87           H\nATOM  10225  HE3 MET B 250     -26.994  32.473 -49.443  1.00 47.87           H\nATOM  10226  N   ALA B 251     -27.870  36.931 -50.940  1.00 55.59           N\nATOM  10227  CA  ALA B 251     -28.673  37.835 -50.102  1.00 57.16           C\nATOM  10228  C   ALA B 251     -30.165  37.450 -50.052  1.00 58.06           C\nATOM  10229  O   ALA B 251     -30.779  37.578 -48.993  1.00 58.13           O\nATOM  10230  CB  ALA B 251     -28.495  39.288 -50.558  1.00 55.82           C\nATOM  10231  H   ALA B 251     -27.488  37.309 -51.797  1.00 55.59           H\nATOM  10232  HA  ALA B 251     -28.287  37.767 -49.082  1.00 57.16           H\nATOM  10233  HB1 ALA B 251     -29.095  39.968 -49.951  1.00 55.82           H\nATOM  10234  HB2 ALA B 251     -27.458  39.600 -50.456  1.00 55.82           H\nATOM  10235  HB3 ALA B 251     -28.787  39.431 -51.597  1.00 55.82           H\nATOM  10236  N   THR B 252     -30.698  36.938 -51.176  1.00 58.19           N\nATOM  10237  CA  THR B 252     -32.061  36.418 -51.286  1.00 59.13           C\nATOM  10238  C   THR B 252     -32.223  35.048 -50.595  1.00 58.31           C\nATOM  10239  O   THR B 252     -33.235  34.839 -49.928  1.00 60.63           O\nATOM  10240  CB  THR B 252     -32.500  36.279 -52.771  1.00 59.46           C\nATOM  10241  OG1 THR B 252     -32.437  37.550 -53.389  1.00 61.39           O\nATOM  10242  CG2 THR B 252     -33.918  35.721 -52.996  1.00 60.91           C\nATOM  10243  H   THR B 252     -30.124  36.862 -52.004  1.00 58.19           H\nATOM  10244  HA  THR B 252     -32.735  37.124 -50.796  1.00 59.13           H\nATOM  10245  HB  THR B 252     -31.796  35.638 -53.301  1.00 59.46           H\nATOM  10246  HG1 THR B 252     -31.517  37.834 -53.418  1.00 61.39           H\nATOM  10247 HG21 THR B 252     -34.192  35.766 -54.051  1.00 60.91           H\nATOM  10248 HG22 THR B 252     -33.998  34.676 -52.694  1.00 60.91           H\nATOM  10249 HG23 THR B 252     -34.661  36.290 -52.436  1.00 60.91           H\nATOM  10250  N   ILE B 253     -31.226  34.155 -50.732  1.00 57.15           N\nATOM  10251  CA  ILE B 253     -31.237  32.817 -50.129  1.00 55.46           C\nATOM  10252  C   ILE B 253     -31.039  32.851 -48.594  1.00 54.97           C\nATOM  10253  O   ILE B 253     -31.676  32.061 -47.897  1.00 53.79           O\nATOM  10254  CB  ILE B 253     -30.195  31.874 -50.810  1.00 54.71           C\nATOM  10255  CG1 ILE B 253     -30.577  31.636 -52.293  1.00 55.75           C\nATOM  10256  CG2 ILE B 253     -29.997  30.518 -50.098  1.00 49.20           C\nATOM  10257  CD1 ILE B 253     -29.499  30.937 -53.135  1.00 57.44           C\nATOM  10258  H   ILE B 253     -30.420  34.388 -51.296  1.00 57.15           H\nATOM  10259  HA  ILE B 253     -32.226  32.388 -50.307  1.00 55.46           H\nATOM  10260  HB  ILE B 253     -29.233  32.386 -50.797  1.00 54.71           H\nATOM  10261 HG13 ILE B 253     -30.812  32.581 -52.781  1.00 55.75           H\nATOM  10262 HG12 ILE B 253     -31.499  31.056 -52.335  1.00 55.75           H\nATOM  10263 HG21 ILE B 253     -29.260  29.897 -50.607  1.00 49.20           H\nATOM  10264 HG22 ILE B 253     -29.633  30.641 -49.081  1.00 49.20           H\nATOM  10265 HG23 ILE B 253     -30.930  29.956 -50.050  1.00 49.20           H\nATOM  10266 HD11 ILE B 253     -29.743  30.996 -54.196  1.00 57.44           H\nATOM  10267 HD12 ILE B 253     -28.523  31.402 -52.999  1.00 57.44           H\nATOM  10268 HD13 ILE B 253     -29.412  29.880 -52.886  1.00 57.44           H\nATOM  10269  N   LEU B 254     -30.222  33.796 -48.092  1.00 54.64           N\nATOM  10270  CA  LEU B 254     -30.038  34.066 -46.661  1.00 54.94           C\nATOM  10271  C   LEU B 254     -31.295  34.664 -45.999  1.00 56.13           C\nATOM  10272  O   LEU B 254     -31.527  34.381 -44.825  1.00 57.56           O\nATOM  10273  CB  LEU B 254     -28.818  34.988 -46.433  1.00 53.45           C\nATOM  10274  CG  LEU B 254     -27.435  34.327 -46.654  1.00 53.46           C\nATOM  10275  CD1 LEU B 254     -26.325  35.375 -46.866  1.00 52.60           C\nATOM  10276  CD2 LEU B 254     -27.049  33.344 -45.537  1.00 53.53           C\nATOM  10277  H   LEU B 254     -29.709  34.398 -48.724  1.00 54.64           H\nATOM  10278  HA  LEU B 254     -29.846  33.113 -46.173  1.00 54.94           H\nATOM  10279  HB3 LEU B 254     -28.835  35.393 -45.419  1.00 53.45           H\nATOM  10280  HB2 LEU B 254     -28.924  35.853 -47.091  1.00 53.45           H\nATOM  10281  HG  LEU B 254     -27.497  33.738 -47.568  1.00 53.46           H\nATOM  10282 HD11 LEU B 254     -25.876  35.258 -47.851  1.00 52.60           H\nATOM  10283 HD12 LEU B 254     -26.699  36.397 -46.799  1.00 52.60           H\nATOM  10284 HD13 LEU B 254     -25.521  35.280 -46.135  1.00 52.60           H\nATOM  10285 HD21 LEU B 254     -26.245  32.688 -45.872  1.00 53.53           H\nATOM  10286 HD22 LEU B 254     -26.701  33.866 -44.645  1.00 53.53           H\nATOM  10287 HD23 LEU B 254     -27.877  32.705 -45.243  1.00 53.53           H\nATOM  10288  N   SER B 255     -32.097  35.444 -46.752  0.50 55.94           N\nATOM  10289  CA  SER B 255     -33.379  35.986 -46.283  0.50 55.67           C\nATOM  10290  C   SER B 255     -34.488  34.917 -46.176  0.50 56.55           C\nATOM  10291  O   SER B 255     -35.391  35.084 -45.356  0.50 57.04           O\nATOM  10292  CB  SER B 255     -33.787  37.207 -47.141  0.50 55.50           C\nATOM  10293  OG  SER B 255     -34.458  36.871 -48.340  0.50 51.06           O\nATOM  10294  H   SER B 255     -31.842  35.649 -47.707  0.50 55.94           H\nATOM  10295  HA  SER B 255     -33.206  36.363 -45.273  0.50 55.67           H\nATOM  10296  HB3 SER B 255     -32.923  37.831 -47.370  0.50 55.50           H\nATOM  10297  HB2 SER B 255     -34.467  37.835 -46.565  0.50 55.50           H\nATOM  10298  HG  SER B 255     -33.884  36.316 -48.878  0.50 51.06           H\nATOM  10299  N   LYS B 256     -34.384  33.839 -46.977  1.00 57.63           N\nATOM  10300  CA  LYS B 256     -35.292  32.691 -46.961  1.00 58.28           C\nATOM  10301  C   LYS B 256     -35.024  31.686 -45.825  1.00 59.17           C\nATOM  10302  O   LYS B 256     -35.875  30.821 -45.620  1.00 58.69           O\nATOM  10303  CB  LYS B 256     -35.259  31.978 -48.329  1.00 59.05           C\nATOM  10304  CG  LYS B 256     -35.997  32.725 -49.447  1.00 61.64           C\nATOM  10305  CD  LYS B 256     -36.038  31.898 -50.739  1.00 65.49           C\nATOM  10306  CE  LYS B 256     -36.774  32.612 -51.881  1.00 67.29           C\nATOM  10307  NZ  LYS B 256     -36.917  31.738 -53.058  1.00 69.24           N1+\nATOM  10308  H   LYS B 256     -33.612  33.780 -47.626  1.00 57.63           H\nATOM  10309  HA  LYS B 256     -36.305  33.066 -46.805  1.00 58.28           H\nATOM  10310  HB3 LYS B 256     -35.744  31.005 -48.238  1.00 59.05           H\nATOM  10311  HB2 LYS B 256     -34.231  31.771 -48.628  1.00 59.05           H\nATOM  10312  HG3 LYS B 256     -35.524  33.687 -49.634  1.00 61.64           H\nATOM  10313  HG2 LYS B 256     -37.016  32.943 -49.126  1.00 61.64           H\nATOM  10314  HD3 LYS B 256     -36.513  30.937 -50.532  1.00 65.49           H\nATOM  10315  HD2 LYS B 256     -35.016  31.669 -51.049  1.00 65.49           H\nATOM  10316  HE3 LYS B 256     -36.234  33.515 -52.170  1.00 67.29           H\nATOM  10317  HE2 LYS B 256     -37.770  32.920 -51.558  1.00 67.29           H\nATOM  10318  HZ1 LYS B 256     -36.003  31.416 -53.352  1.00 69.24           H\nATOM  10319  HZ2 LYS B 256     -37.475  30.933 -52.813  1.00 69.24           H\nATOM  10320  HZ3 LYS B 256     -37.360  32.241 -53.813  1.00 69.24           H\nATOM  10321  N   MET B 257     -33.889  31.794 -45.104  1.00 60.31           N\nATOM  10322  CA  MET B 257     -33.583  30.942 -43.946  1.00 60.66           C\nATOM  10323  C   MET B 257     -34.615  31.112 -42.810  1.00 60.99           C\nATOM  10324  O   MET B 257     -35.092  32.231 -42.604  1.00 63.39           O\nATOM  10325  CB  MET B 257     -32.189  31.271 -43.373  1.00 60.82           C\nATOM  10326  CG  MET B 257     -31.016  30.838 -44.257  1.00 60.49           C\nATOM  10327  SD  MET B 257     -29.417  30.762 -43.394  1.00 60.55           S\nATOM  10328  CE  MET B 257     -29.288  32.438 -42.713  1.00 61.27           C\nATOM  10329  H   MET B 257     -33.226  32.526 -45.317  1.00 60.31           H\nATOM  10330  HA  MET B 257     -33.589  29.918 -44.319  1.00 60.66           H\nATOM  10331  HB3 MET B 257     -32.066  30.790 -42.401  1.00 60.82           H\nATOM  10332  HB2 MET B 257     -32.124  32.342 -43.177  1.00 60.82           H\nATOM  10333  HG3 MET B 257     -30.934  31.494 -45.121  1.00 60.49           H\nATOM  10334  HG2 MET B 257     -31.213  29.842 -44.649  1.00 60.49           H\nATOM  10335  HE1 MET B 257     -28.306  32.583 -42.264  1.00 61.27           H\nATOM  10336  HE2 MET B 257     -29.425  33.185 -43.494  1.00 61.27           H\nATOM  10337  HE3 MET B 257     -30.041  32.599 -41.942  1.00 61.27           H\nATOM  10338  N   PRO B 258     -34.909  30.018 -42.067  1.00 60.93           N\nATOM  10339  CA  PRO B 258     -35.762  30.097 -40.870  1.00 62.63           C\nATOM  10340  C   PRO B 258     -35.113  30.946 -39.761  1.00 65.46           C\nATOM  10341  O   PRO B 258     -33.937  30.753 -39.449  1.00 64.82           O\nATOM  10342  CB  PRO B 258     -35.947  28.629 -40.464  1.00 61.98           C\nATOM  10343  CG  PRO B 258     -34.707  27.915 -40.976  1.00 60.80           C\nATOM  10344  CD  PRO B 258     -34.384  28.662 -42.263  1.00 60.23           C\nATOM  10345  HA  PRO B 258     -36.733  30.523 -41.133  1.00 62.63           H\nATOM  10346  HB3 PRO B 258     -36.824  28.232 -40.969  1.00 61.98           H\nATOM  10347  HB2 PRO B 258     -36.112  28.488 -39.397  1.00 61.98           H\nATOM  10348  HG3 PRO B 258     -34.861  26.848 -41.128  1.00 60.80           H\nATOM  10349  HG2 PRO B 258     -33.888  28.039 -40.267  1.00 60.80           H\nATOM  10350  HD2 PRO B 258     -33.312  28.633 -42.459  1.00 60.23           H\nATOM  10351  HD3 PRO B 258     -34.900  28.206 -43.109  1.00 60.23           H\nATOM  10352  N   LYS B 259     -35.888  31.904 -39.233  1.00 68.99           N\nATOM  10353  CA  LYS B 259     -35.450  32.848 -38.207  1.00 71.53           C\nATOM  10354  C   LYS B 259     -35.665  32.268 -36.792  1.00 72.27           C\nATOM  10355  O   LYS B 259     -36.624  31.517 -36.596  1.00 71.59           O\nATOM  10356  CB  LYS B 259     -36.238  34.161 -38.387  1.00 72.97           C\nATOM  10357  CG  LYS B 259     -35.869  34.905 -39.683  0.00 72.00           C\nATOM  10358  CD  LYS B 259     -36.604  36.244 -39.830  0.00 72.14           C\nATOM  10359  CE  LYS B 259     -36.221  36.975 -41.127  0.00 72.10           C\nATOM  10360  NZ  LYS B 259     -36.929  38.261 -41.259  0.00 72.05           N1+\nATOM  10361  H   LYS B 259     -36.842  32.002 -39.547  1.00 68.99           H\nATOM  10362  HA  LYS B 259     -34.393  33.050 -38.383  1.00 71.53           H\nATOM  10363  HB3 LYS B 259     -36.033  34.824 -37.545  1.00 72.97           H\nATOM  10364  HB2 LYS B 259     -37.311  33.964 -38.359  1.00 72.97           H\nATOM  10365  HG3 LYS B 259     -36.093  34.278 -40.546  1.00 72.00           H\nATOM  10366  HG2 LYS B 259     -34.793  35.079 -39.705  1.00 72.00           H\nATOM  10367  HD3 LYS B 259     -36.378  36.873 -38.967  1.00 72.14           H\nATOM  10368  HD2 LYS B 259     -37.680  36.065 -39.807  1.00 72.14           H\nATOM  10369  HE3 LYS B 259     -36.456  36.356 -41.994  1.00 72.10           H\nATOM  10370  HE2 LYS B 259     -35.147  37.165 -41.150  1.00 72.10           H\nATOM  10371  HZ1 LYS B 259     -36.696  38.858 -40.478  1.00 72.05           H\nATOM  10372  HZ2 LYS B 259     -36.652  38.711 -42.120  1.00 72.05           H\nATOM  10373  HZ3 LYS B 259     -37.926  38.098 -41.273  1.00 72.05           H\nATOM  10374  N   PRO B 260     -34.784  32.626 -35.828  1.00 74.67           N\nATOM  10375  CA  PRO B 260     -34.926  32.213 -34.418  1.00 76.77           C\nATOM  10376  C   PRO B 260     -36.155  32.848 -33.745  1.00 78.60           C\nATOM  10377  O   PRO B 260     -36.401  34.041 -33.934  1.00 79.73           O\nATOM  10378  CB  PRO B 260     -33.628  32.716 -33.763  1.00 76.17           C\nATOM  10379  CG  PRO B 260     -33.216  33.913 -34.599  1.00 76.76           C\nATOM  10380  CD  PRO B 260     -33.628  33.509 -36.006  1.00 75.85           C\nATOM  10381  HA  PRO B 260     -34.986  31.125 -34.342  1.00 76.77           H\nATOM  10382  HB3 PRO B 260     -32.862  31.945 -33.825  1.00 76.17           H\nATOM  10383  HB2 PRO B 260     -33.736  32.973 -32.708  1.00 76.17           H\nATOM  10384  HG3 PRO B 260     -32.160  34.152 -34.522  1.00 76.76           H\nATOM  10385  HG2 PRO B 260     -33.781  34.792 -34.286  1.00 76.76           H\nATOM  10386  HD2 PRO B 260     -33.841  34.394 -36.607  1.00 75.85           H\nATOM  10387  HD3 PRO B 260     -32.833  32.943 -36.492  1.00 75.85           H\nATOM  10388  N   LYS B 261     -36.890  32.045 -32.959  1.00 80.34           N\nATOM  10389  CA  LYS B 261     -37.982  32.532 -32.118  1.00 81.58           C\nATOM  10390  C   LYS B 261     -37.381  33.268 -30.897  1.00 82.01           C\nATOM  10391  O   LYS B 261     -36.554  32.668 -30.208  1.00 80.24           O\nATOM  10392  CB  LYS B 261     -38.842  31.330 -31.675  1.00 81.58           C\nATOM  10393  CG  LYS B 261     -40.126  31.743 -30.928  1.00 83.77           C\nATOM  10394  CD  LYS B 261     -40.979  30.559 -30.450  1.00 86.26           C\nATOM  10395  CE  LYS B 261     -41.631  29.754 -31.588  1.00 87.34           C\nATOM  10396  NZ  LYS B 261     -42.417  28.622 -31.067  1.00 88.20           N1+\nATOM  10397  H   LYS B 261     -36.630  31.074 -32.834  1.00 80.34           H\nATOM  10398  HA  LYS B 261     -38.602  33.176 -32.739  1.00 81.58           H\nATOM  10399  HB3 LYS B 261     -38.258  30.660 -31.042  1.00 81.58           H\nATOM  10400  HB2 LYS B 261     -39.113  30.755 -32.560  1.00 81.58           H\nATOM  10401  HG3 LYS B 261     -40.729  32.393 -31.564  1.00 83.77           H\nATOM  10402  HG2 LYS B 261     -39.867  32.340 -30.053  1.00 83.77           H\nATOM  10403  HD3 LYS B 261     -41.750  30.936 -29.777  1.00 86.26           H\nATOM  10404  HD2 LYS B 261     -40.350  29.908 -29.845  1.00 86.26           H\nATOM  10405  HE3 LYS B 261     -40.877  29.353 -32.264  1.00 87.34           H\nATOM  10406  HE2 LYS B 261     -42.287  30.397 -32.176  1.00 87.34           H\nATOM  10407  HZ1 LYS B 261     -43.124  28.956 -30.429  1.00 88.20           H\nATOM  10408  HZ2 LYS B 261     -42.850  28.127 -31.832  1.00 88.20           H\nATOM  10409  HZ3 LYS B 261     -41.788  27.994 -30.579  1.00 88.20           H\nATOM  10410  N   PRO B 262     -37.778  34.539 -30.652  1.00 83.94           N\nATOM  10411  CA  PRO B 262     -37.268  35.306 -29.499  1.00 84.95           C\nATOM  10412  C   PRO B 262     -37.815  34.789 -28.146  1.00 85.81           C\nATOM  10413  O   PRO B 262     -38.798  34.043 -28.139  1.00 85.26           O\nATOM  10414  CB  PRO B 262     -37.750  36.736 -29.805  1.00 85.26           C\nATOM  10415  CG  PRO B 262     -39.042  36.549 -30.580  1.00 84.83           C\nATOM  10416  CD  PRO B 262     -38.758  35.311 -31.421  1.00 84.67           C\nATOM  10417  HA  PRO B 262     -36.177  35.271 -29.492  1.00 84.95           H\nATOM  10418  HB3 PRO B 262     -37.013  37.237 -30.434  1.00 85.26           H\nATOM  10419  HB2 PRO B 262     -37.895  37.357 -28.919  1.00 85.26           H\nATOM  10420  HG3 PRO B 262     -39.327  37.419 -31.172  1.00 84.83           H\nATOM  10421  HG2 PRO B 262     -39.854  36.337 -29.883  1.00 84.83           H\nATOM  10422  HD2 PRO B 262     -39.680  34.763 -31.614  1.00 84.67           H\nATOM  10423  HD3 PRO B 262     -38.311  35.592 -32.376  1.00 84.67           H\nATOM  10424  N   PRO B 263     -37.197  35.213 -27.019  1.00 88.02           N\nATOM  10425  CA  PRO B 263     -37.687  34.841 -25.679  1.00 89.69           C\nATOM  10426  C   PRO B 263     -39.024  35.533 -25.302  1.00 90.91           C\nATOM  10427  O   PRO B 263     -39.376  36.529 -25.937  1.00 90.53           O\nATOM  10428  CB  PRO B 263     -36.530  35.261 -24.756  1.00 89.94           C\nATOM  10429  CG  PRO B 263     -35.858  36.417 -25.481  1.00 89.77           C\nATOM  10430  CD  PRO B 263     -35.975  36.017 -26.947  1.00 88.68           C\nATOM  10431  HA  PRO B 263     -37.801  33.760 -25.667  1.00 89.69           H\nATOM  10432  HB3 PRO B 263     -35.827  34.432 -24.662  1.00 89.94           H\nATOM  10433  HB2 PRO B 263     -36.845  35.534 -23.748  1.00 89.94           H\nATOM  10434  HG3 PRO B 263     -34.830  36.595 -25.163  1.00 89.77           H\nATOM  10435  HG2 PRO B 263     -36.426  37.332 -25.308  1.00 89.77           H\nATOM  10436  HD2 PRO B 263     -35.989  36.895 -27.592  1.00 88.68           H\nATOM  10437  HD3 PRO B 263     -35.129  35.393 -27.239  1.00 88.68           H\nATOM  10438  N   PRO B 264     -39.741  35.016 -24.272  1.00 92.52           N\nATOM  10439  CA  PRO B 264     -41.034  35.583 -23.837  1.00 93.06           C\nATOM  10440  C   PRO B 264     -40.940  37.006 -23.254  1.00 92.90           C\nATOM  10441  O   PRO B 264     -41.684  37.881 -23.693  1.00 92.66           O\nATOM  10442  CB  PRO B 264     -41.572  34.571 -22.803  1.00 93.09           C\nATOM  10443  CG  PRO B 264     -40.788  33.294 -23.048  0.00 92.68           C\nATOM  10444  CD  PRO B 264     -39.434  33.805 -23.514  0.00 92.40           C\nATOM  10445  HA  PRO B 264     -41.697  35.591 -24.704  1.00 93.06           H\nATOM  10446  HB3 PRO B 264     -42.647  34.411 -22.900  1.00 93.09           H\nATOM  10447  HB2 PRO B 264     -41.389  34.907 -21.782  1.00 93.09           H\nATOM  10448  HG3 PRO B 264     -41.256  32.732 -23.858  1.00 92.68           H\nATOM  10449  HG2 PRO B 264     -40.731  32.641 -22.177  1.00 92.68           H\nATOM  10450  HD2 PRO B 264     -38.798  34.064 -22.666  1.00 92.40           H\nATOM  10451  HD3 PRO B 264     -38.940  33.031 -24.091  1.00 92.40           H\nHETATM10452  N   NME B 265     -40.026  37.206 -22.292  1.00  0.00           N\nHETATM10453  C   NME B 265     -39.847  38.486 -21.624  1.00  0.00           C\nHETATM10454  H   NME B 265     -39.447  36.438 -21.986  1.00  0.00           H\nHETATM10455  H1  NME B 265     -39.565  39.261 -22.337  1.00  0.00           H\nHETATM10456  H2  NME B 265     -40.766  38.792 -21.122  1.00  0.00           H\nHETATM10457  H3  NME B 265     -39.060  38.408 -20.875  1.00  0.00           H\nEND"
  },
  {
    "path": "src/openfe/tests/data/eg5/__init__.py",
    "content": ""
  },
  {
    "path": "src/openfe/tests/data/eg5/eg5_cofactor.sdf",
    "content": "3L9H\n                    3D\n Schrodinger Suite 2021-1.\n 39 41  0  0  1  0            999 V2000\n   17.7103    1.3810   16.7258 P   0  0  0  0  0  0\n   16.2918    1.9380   16.9415 O   0  0  0  0  0  0\n   17.7048   -0.1381   16.4765 O   0  5  0  0  0  0\n   18.4945    2.1622   15.6604 O   0  5  0  0  0  0\n   20.1704    1.9553   18.6598 P   0  0  0  0  0  0\n   21.0614    1.4768   17.5414 O   0  0  0  0  0  0\n   20.2345    3.3559   19.2252 O   0  5  0  0  0  0\n   18.5522    1.6400   18.2257 O   0  0  0  0  0  0\n   20.3327    0.8377   19.9634 O   0  0  0  0  0  0\n   19.5869    1.0879   21.1452 C   0  0  0  0  0  0\n   20.4613    1.1653   22.4074 C   0  0  1  0  0  0\n   21.0911   -0.0950   22.5958 O   0  0  0  0  0  0\n   21.6078    2.1760   22.3912 C   0  0  1  0  0  0\n   21.7761    2.7834   23.6633 O   0  0  0  0  0  0\n   22.8150    1.3580   21.9342 C   0  0  1  0  0  0\n   24.0771    1.7580   22.4399 O   0  0  0  0  0  0\n   22.4830   -0.0283   22.4899 C   0  0  2  0  0  0\n   22.9954   -1.1724   21.6426 N   0  0  0  0  0  0\n   22.4947   -1.6440   20.4842 C   0  0  0  0  0  0\n   23.2096   -2.5994   19.9459 N   0  0  0  0  0  0\n   24.2457   -2.7439   20.7874 C   0  0  0  0  0  0\n   25.3696   -3.6002   20.7533 C   0  0  0  0  0  0\n   25.5873   -4.5319   19.7432 N   0  0  0  0  0  0\n   26.2748   -3.5190   21.7663 N   0  0  0  0  0  0\n   26.0465   -2.6305   22.7424 C   0  0  0  0  0  0\n   25.0272   -1.7702   22.8844 N   0  0  0  0  0  0\n   24.1457   -1.8743   21.8585 C   0  0  0  0  0  0\n   18.9006    0.2596   21.2825 H   0  0  0  0  0  0\n   18.9668    1.9826   21.0671 H   0  0  0  0  0  0\n   19.7967    1.3439   23.2547 H   0  0  0  0  0  0\n   21.4113    2.9719   21.6708 H   0  0  0  0  0  0\n   22.6054    3.2689   23.6516 H   0  0  0  0  0  0\n   22.8340    1.3030   20.8442 H   0  0  0  0  0  0\n   24.3615    2.5656   21.9940 H   0  0  0  0  0  0\n   22.8770   -0.1608   23.5002 H   0  0  0  0  0  0\n   21.5746   -1.2447   20.0891 H   0  0  0  0  0  0\n   26.3917   -5.1389   19.8129 H   0  0  0  0  0  0\n   24.9075   -4.6313   19.0027 H   0  0  0  0  0  0\n   26.7890   -2.6030   23.5264 H   0  0  0  0  0  0\n  1  2  2  0  0  0\n  1  3  1  0  0  0\n  1  4  1  0  0  0\n  1  8  1  0  0  0\n  5  6  2  0  0  0\n  5  7  1  0  0  0\n  5  8  1  0  0  0\n  5  9  1  0  0  0\n  9 10  1  0  0  0\n 10 11  1  0  0  0\n 10 28  1  0  0  0\n 10 29  1  0  0  0\n 11 12  1  0  0  0\n 11 13  1  0  0  0\n 11 30  1  0  0  0\n 12 17  1  0  0  0\n 13 14  1  0  0  0\n 13 15  1  0  0  0\n 13 31  1  0  0  0\n 14 32  1  0  0  0\n 15 16  1  0  0  0\n 15 17  1  0  0  0\n 15 33  1  0  0  0\n 16 34  1  0  0  0\n 17 18  1  0  0  0\n 17 35  1  0  0  0\n 18 19  1  0  0  0\n 18 27  1  0  0  0\n 19 20  2  0  0  0\n 19 36  1  0  0  0\n 20 21  1  0  0  0\n 21 22  1  0  0  0\n 21 27  2  0  0  0\n 22 23  1  0  0  0\n 22 24  2  0  0  0\n 23 37  1  0  0  0\n 23 38  1  0  0  0\n 24 25  1  0  0  0\n 25 26  2  0  0  0\n 25 39  1  0  0  0\n 26 27  1  0  0  0\nM  CHG  3   3  -1   4  -1   7  -1\nM  END\n$$$$\n"
  },
  {
    "path": "src/openfe/tests/data/eg5/eg5_ligands.sdf",
    "content": "lig_CHEMBL1078691\n                    3D\n Schrodinger Suite 2022-3.\n 52 55  0  0  1  0            999 V2000\n   35.1506    6.9961   16.0497 H   0  0  0  0  0  0\n   34.3743    7.0705   16.5998 O   0  0  0  0  0  0\n   33.2046    7.3830   15.9898 C   0  0  0  0  0  0\n   32.0447    6.9520   16.6533 C   0  0  0  0  0  0\n   32.1282    6.3166   17.5227 H   0  0  0  0  0  0\n   30.7825    7.3762   16.2356 C   0  0  0  0  0  0\n   29.9005    7.0576   16.7698 H   0  0  0  0  0  0\n   30.6855    8.2450   15.1420 C   0  0  0  0  0  0\n   29.3301    8.7627   14.7491 C   0  0  2  0  0  0\n   28.5854    8.3128   15.4086 H   0  0  0  0  0  0\n   29.0334    8.2926   13.4113 N   0  0  0  0  0  0\n   29.1849    7.3041   13.2524 H   0  0  0  0  0  0\n   28.0015    8.9176   12.7152 C   0  0  0  0  0  0\n   27.6064    8.3593   11.4896 C   0  0  0  0  0  0\n   28.0744    7.4593   11.1200 H   0  0  0  0  0  0\n   26.6215    8.9895   10.7190 C   0  0  0  0  0  0\n   26.3839    8.5619    9.7591 H   0  0  0  0  0  0\n   25.9919   10.1712   11.1752 C   0  0  0  0  0  0\n   24.9721   10.8852   10.2862 C   0  0  0  0  0  0\n   25.7685   11.7006    9.2629 C   0  0  0  0  0  0\n   25.1850   12.2615    8.5441 H   0  0  0  0  0  0\n   26.4154   11.0282    8.7187 H   0  0  0  0  0  0\n   26.3849   12.4375    9.7712 H   0  0  0  0  0  0\n   24.0760   11.8274   11.0884 C   0  0  0  0  0  0\n   24.6975   12.5884   11.5194 H   0  0  0  0  0  0\n   23.5851   11.3401   11.9242 H   0  0  0  0  0  0\n   23.3168   12.3089   10.4711 H   0  0  0  0  0  0\n   24.0346    9.8607    9.6499 C   0  0  0  0  0  0\n   23.1879   10.2624    9.1189 H   0  0  0  0  0  0\n   23.5850    9.3883   10.5023 H   0  0  0  0  0  0\n   24.5077    9.1197    9.0090 H   0  0  0  0  0  0\n   26.3813   10.7069   12.4232 C   0  0  0  0  0  0\n   25.9589   11.6155   12.8183 H   0  0  0  0  0  0\n   27.3886   10.1014   13.1842 C   0  0  0  0  0  0\n   27.8259   10.7731   14.4732 C   0  0  1  0  0  0\n   27.8533   11.8496   14.2952 H   0  0  0  0  0  0\n   26.8794   10.5164   15.5097 O   0  0  0  0  0  0\n   27.1625   11.1892   16.7294 C   0  0  0  0  0  0\n   27.1951   12.2677   16.5678 H   0  0  0  0  0  0\n   26.3524   10.9946   17.4323 H   0  0  0  0  0  0\n   28.4911   10.6767   17.2983 C   0  0  0  0  0  0\n   28.7333   11.1954   18.2261 H   0  0  0  0  0  0\n   28.4005    9.6180   17.5453 H   0  0  0  0  0  0\n   29.6124   10.8762   16.2710 C   0  0  0  0  0  0\n   29.8008   11.9464   16.1678 H   0  0  0  0  0  0\n   30.5418   10.4474   16.6445 H   0  0  0  0  0  0\n   29.2323   10.3026   14.8842 C   0  0  1  0  0  0\n   29.9366   10.7258   14.1662 H   0  0  0  0  0  0\n   31.8413    8.6247   14.4221 C   0  0  0  0  0  0\n   31.7566    9.2763   13.5652 H   0  0  0  0  0  0\n   33.1113    8.1894   14.8427 C   0  0  0  0  0  0\n   33.9873    8.5296   14.3176 H   0  0  0  0  0  0\n  1  2  1  0  0  0\n  2  3  1  0  0  0\n  3 51  1  0  0  0\n  3  4  2  0  0  0\n  4  5  1  0  0  0\n  4  6  1  0  0  0\n  6  7  1  0  0  0\n  6  8  2  0  0  0\n  8  9  1  0  0  0\n  8 49  1  0  0  0\n  9 47  1  0  0  0\n  9 10  1  0  0  0\n  9 11  1  0  0  0\n 11 12  1  0  0  0\n 11 13  1  0  0  0\n 13 34  1  0  0  0\n 13 14  2  0  0  0\n 14 15  1  0  0  0\n 14 16  1  0  0  0\n 16 17  1  0  0  0\n 16 18  2  0  0  0\n 18 19  1  0  0  0\n 18 32  1  0  0  0\n 19 20  1  0  0  0\n 19 24  1  0  0  0\n 19 28  1  0  0  0\n 20 21  1  0  0  0\n 20 22  1  0  0  0\n 20 23  1  0  0  0\n 24 25  1  0  0  0\n 24 26  1  0  0  0\n 24 27  1  0  0  0\n 28 29  1  0  0  0\n 28 30  1  0  0  0\n 28 31  1  0  0  0\n 32 33  1  0  0  0\n 32 34  2  0  0  0\n 34 35  1  0  0  0\n 35 47  1  0  0  0\n 35 36  1  0  0  0\n 35 37  1  0  0  0\n 37 38  1  0  0  0\n 38 39  1  0  0  0\n 38 40  1  0  0  0\n 38 41  1  0  0  0\n 41 42  1  0  0  0\n 41 43  1  0  0  0\n 41 44  1  0  0  0\n 44 45  1  0  0  0\n 44 46  1  0  0  0\n 44 47  1  0  0  0\n 47 48  1  0  0  0\n 49 50  1  0  0  0\n 49 51  2  0  0  0\n 51 52  1  0  0  0\nM  END\n> <s_m_source_file>\nligprep_eg5.smi\n\n> <i_m_source_file_index>\n3\n\n> <i_lp_mmshare_version>\n53161\n\n> <i_f3d_flags>\n0\n\n> <s_epik_input>\nW09IXWMxW2NIXVtjSF1jKFtjSF1bY0hdMSlbQ0BIXShbTkhdMilbQ0BIXShbQ0gyXVtDSDJdW0NIMl1PMylbQ0BIXTNjKGMyNClbY0hdYyhbY0hdW2NIXTQpQyhbQ0gzXSkoW0NIM10pW0NIM10=\n\n> <s_epik_cmdline>\nJ2VwaWtfcHl0aG9uJywgJy1waHQnLCAnMC4wJywgJy1waCcsICc3LjQnLCAnLXRuJywgJzgnLCAnLW1hJywgJzUwMCcsICctaW1hZScsICc8aW5maWxlLm1hZT4nLCAnLW9tYWUnLCAnPG91dGZpbGUubWFlPic=\n\n> <r_lp_tautomer_probability>\n1\n\n> <r_epik_Ionization_Penalty>\n  0.0010\n\n> <r_epik_Ionization_Penalty_Charging>\n  0.0000\n\n> <r_epik_Ionization_Penalty_Neutral>\n  0.0010\n\n> <r_epik_State_Penalty>\n -0.0000\n\n> <r_epik_Charging_Adjusted_Penalty>\n0\n\n> <i_epik_Tot_Q>\n0\n\n> <i_epik_Tot_abs_Q>\n0\n\n> <s_lp_Force_Field>\nS-OPLS\n\n> <r_lp_Energy>\n34.1252\n\n> <b_lp_Chiralities_Consistent>\n1\n\n> <s_lp_Variant>\nlig_CHEMBL1078691-1\n\n> <s_i_glide_gridfile>\nglide-grid_EG5-3L9H\n\n> <i_i_glide_lignum>\n3\n\n> <i_i_glide_rotatable_bonds>\n3\n\n> <r_i_docking_score>\n-8.97665928402366\n\n> <r_i_glide_ligand_efficiency>\n-0.359066371360946\n\n> <r_i_glide_ligand_efficiency_sa>\n-1.04991643792862\n\n> <r_i_glide_ligand_efficiency_ln>\n-2.12773725908467\n\n> <r_i_glide_gscore>\n-8.97665928402366\n\n> <r_i_glide_lipo>\n-5.06383813021649\n\n> <r_i_glide_hbond>\n-0.431309273878793\n\n> <r_i_glide_metal>\n-0\n\n> <r_i_glide_rewards>\n-1.28824924773551\n\n> <r_i_glide_evdw>\n-34.2456703186035\n\n> <r_i_glide_ecoul>\n-6.52582502365112\n\n> <r_i_glide_erotb>\n0.49789463728498\n\n> <r_i_glide_esite>\n0\n\n> <r_i_glide_emodel>\n-51.6245432573516\n\n> <r_i_glide_energy>\n-40.7714953422546\n\n> <r_i_glide_einternal>\n1.23162662982941\n\n> <i_i_glide_confnum>\n2\n\n> <i_i_glide_posenum>\n1\n\n> <r_i_glide_eff_state_penalty>\n-0\n\n> <r_i_glide_rmsd>\n0.0779755402671082\n\n> <s_glide_core_constrain_type>\nsnapped_core_restrain\n\n$$$$\nlig_CHEMBL1078774\n                    3D\n Schrodinger Suite 2022-3.\n 52 55  0  0  1  0            999 V2000\n   35.1317    7.1361   15.9189 H   0  0  0  0  0  0\n   34.3769    7.1037   16.4998 O   0  0  0  0  0  0\n   33.1652    7.3943   15.9602 C   0  0  0  0  0  0\n   32.0523    6.9447   16.6649 C   0  0  0  0  0  0\n   32.1848    6.2954   17.5273 H   0  0  0  0  0  0\n   30.7676    7.3612   16.2917 C   0  0  0  0  0  0\n   29.9132    7.0126   16.8534 H   0  0  0  0  0  0\n   30.6110    8.2402   15.2132 C   0  0  0  0  0  0\n   29.2527    8.7515   14.8401 C   0  0  2  0  0  0\n   28.5177    8.3167   15.5212 H   0  0  0  0  0  0\n   28.9515    8.2587   13.5087 N   0  0  0  0  0  0\n   29.1186    7.2738   13.3365 H   0  0  0  0  0  0\n   27.9696    8.9051   12.7651 C   0  0  0  0  0  0\n   27.6156    8.3613   11.5183 C   0  0  0  0  0  0\n   28.0902    7.4551   11.1617 H   0  0  0  0  0  0\n   26.6584    8.9961   10.7199 C   0  0  0  0  0  0\n   26.4477    8.5667    9.7540 H   0  0  0  0  0  0\n   26.0117   10.1756   11.1654 C   0  0  0  0  0  0\n   24.9931   10.8765   10.2682 C   0  0  0  0  0  0\n   25.7815   11.7127    9.2589 C   0  0  0  0  0  0\n   25.1851   12.2654    8.5382 H   0  0  0  0  0  0\n   26.4421   11.0483    8.7182 H   0  0  0  0  0  0\n   26.3857   12.4520    9.7704 H   0  0  0  0  0  0\n   24.0600   11.7945   11.0720 C   0  0  0  0  0  0\n   24.6348   12.5868   11.5261 H   0  0  0  0  0  0\n   23.5850   11.2763   11.8923 H   0  0  0  0  0  0\n   23.2851   12.2360   10.4513 H   0  0  0  0  0  0\n   24.0847    9.8280    9.6200 C   0  0  0  0  0  0\n   23.2374   10.1884    9.0655 H   0  0  0  0  0  0\n   23.5965    9.3881   10.4568 H   0  0  0  0  0  0\n   24.5681    9.0774    9.0037 H   0  0  0  0  0  0\n   26.3762   10.7143   12.4168 C   0  0  0  0  0  0\n   25.9463   11.6243   12.7961 H   0  0  0  0  0  0\n   27.3553   10.1016   13.2063 C   0  0  0  0  0  0\n   27.7772   10.7805   14.4987 C   0  0  1  0  0  0\n   27.8208   11.8547   14.3064 H   0  0  0  0  0  0\n   26.8226   10.5519   15.5345 O   0  0  0  0  0  0\n   27.1192   11.2365   16.7459 C   0  0  0  0  0  0\n   27.1635   12.3123   16.5691 H   0  0  0  0  0  0\n   26.3120   11.0645   17.4581 H   0  0  0  0  0  0\n   28.4479   10.7181   17.3127 C   0  0  0  0  0  0\n   28.6956   11.2441   18.2357 H   0  0  0  0  0  0\n   28.3556    9.6619   17.5676 H   0  0  0  0  0  0\n   29.5640   10.9118   16.2829 C   0  0  0  0  0  0\n   29.7348   11.9812   16.1491 H   0  0  0  0  0  0\n   30.5011   10.5045   16.6567 H   0  0  0  0  0  0\n   29.1753   10.2968   14.9230 C   0  0  1  0  0  0\n   29.8748   10.6986   14.1896 H   0  0  0  0  0  0\n   31.7232    8.6610   14.4697 C   0  0  0  0  0  0\n   31.6100    9.3232   13.6206 H   0  0  0  0  0  0\n   32.9883    8.2352   14.8420 C   0  0  0  0  0  0\n   33.9851    8.7065   14.1028 F   0  0  0  0  0  0\n  1  2  1  0  0  0\n  2  3  1  0  0  0\n  3 51  1  0  0  0\n  3  4  2  0  0  0\n  4  5  1  0  0  0\n  4  6  1  0  0  0\n  6  7  1  0  0  0\n  6  8  2  0  0  0\n  8  9  1  0  0  0\n  8 49  1  0  0  0\n  9 47  1  0  0  0\n  9 10  1  0  0  0\n  9 11  1  0  0  0\n 11 12  1  0  0  0\n 11 13  1  0  0  0\n 13 34  1  0  0  0\n 13 14  2  0  0  0\n 14 15  1  0  0  0\n 14 16  1  0  0  0\n 16 17  1  0  0  0\n 16 18  2  0  0  0\n 18 19  1  0  0  0\n 18 32  1  0  0  0\n 19 20  1  0  0  0\n 19 24  1  0  0  0\n 19 28  1  0  0  0\n 20 21  1  0  0  0\n 20 22  1  0  0  0\n 20 23  1  0  0  0\n 24 25  1  0  0  0\n 24 26  1  0  0  0\n 24 27  1  0  0  0\n 28 29  1  0  0  0\n 28 30  1  0  0  0\n 28 31  1  0  0  0\n 32 33  1  0  0  0\n 32 34  2  0  0  0\n 34 35  1  0  0  0\n 35 47  1  0  0  0\n 35 36  1  0  0  0\n 35 37  1  0  0  0\n 37 38  1  0  0  0\n 38 39  1  0  0  0\n 38 40  1  0  0  0\n 38 41  1  0  0  0\n 41 42  1  0  0  0\n 41 43  1  0  0  0\n 41 44  1  0  0  0\n 44 45  1  0  0  0\n 44 46  1  0  0  0\n 44 47  1  0  0  0\n 47 48  1  0  0  0\n 49 50  1  0  0  0\n 49 51  2  0  0  0\n 51 52  1  0  0  0\nM  END\n> <s_m_source_file>\nligprep_eg5.smi\n\n> <i_m_source_file_index>\n4\n\n> <i_lp_mmshare_version>\n53161\n\n> <i_f3d_flags>\n0\n\n> <s_epik_input>\nW09IXWMxW2NIXVtjSF1jKFtjSF1jMUYpW0NASF0oW05IXTIpW0NASF0oW0NIMl1bQ0gyXVtDSDJdTzMpW0NASF0zYyhjMjQpW2NIXWMoW2NIXVtjSF00KUMoW0NIM10pKFtDSDNdKVtDSDNd\n\n> <s_epik_cmdline>\nJ2VwaWtfcHl0aG9uJywgJy1waHQnLCAnMC4wJywgJy1waCcsICc3LjQnLCAnLXRuJywgJzgnLCAnLW1hJywgJzUwMCcsICctaW1hZScsICc8aW5maWxlLm1hZT4nLCAnLW9tYWUnLCAnPG91dGZpbGUubWFlPic=\n\n> <r_lp_tautomer_probability>\n1\n\n> <r_epik_Ionization_Penalty>\n  0.0129\n\n> <r_epik_Ionization_Penalty_Charging>\n  0.0000\n\n> <r_epik_Ionization_Penalty_Neutral>\n  0.0129\n\n> <r_epik_State_Penalty>\n -0.0000\n\n> <r_epik_Charging_Adjusted_Penalty>\n0\n\n> <i_epik_Tot_Q>\n0\n\n> <i_epik_Tot_abs_Q>\n0\n\n> <s_lp_Force_Field>\nS-OPLS\n\n> <r_lp_Energy>\n40.6678\n\n> <b_lp_Chiralities_Consistent>\n1\n\n> <s_lp_Variant>\nlig_CHEMBL1078774-1\n\n> <s_i_glide_gridfile>\nglide-grid_EG5-3L9H\n\n> <i_i_glide_lignum>\n4\n\n> <i_i_glide_rotatable_bonds>\n3\n\n> <r_i_docking_score>\n-8.97337207022735\n\n> <r_i_glide_ligand_efficiency>\n-0.345129695008744\n\n> <r_i_glide_ligand_efficiency_sa>\n-1.02244536344363\n\n> <r_i_glide_ligand_efficiency_ln>\n-2.10736698665757\n\n> <r_i_glide_gscore>\n-8.97337207022735\n\n> <r_i_glide_lipo>\n-5.06032647734131\n\n> <r_i_glide_hbond>\n-0.454813574920432\n\n> <r_i_glide_metal>\n-0\n\n> <r_i_glide_rewards>\n-1.37207791070462\n\n> <r_i_glide_evdw>\n-31.0318450927734\n\n> <r_i_glide_ecoul>\n-6.59056234359741\n\n> <r_i_glide_erotb>\n0.454022498917303\n\n> <r_i_glide_esite>\n0\n\n> <r_i_glide_emodel>\n-53.833901517828\n\n> <r_i_glide_energy>\n-37.6224074363708\n\n> <r_i_glide_einternal>\n1.32856965065002\n\n> <i_i_glide_confnum>\n11\n\n> <i_i_glide_posenum>\n3\n\n> <r_i_glide_eff_state_penalty>\n-0\n\n> <r_i_glide_rmsd>\n0.0977424974958633\n\n> <s_glide_core_constrain_type>\nsnapped_core_restrain\n"
  },
  {
    "path": "src/openfe/tests/data/eg5/eg5_protein.pdb",
    "content": "HEADER    MOTOR PROTEIN                           05-JAN-10   3L9H\nTITLE     X-RAY STRUCTURE OF MITOTIC KINESIN-5 (KSP, KIF11, EG5)IN\nTITLE    2 COMPLEX WITH THE HEXAHYDRO-2H-PYRANO[3,2-C]QUINOLINE EMD\nTITLE    3 534085\nEXPDTA    X-RAY DIFFRACTION\nREMARK   2 RESOLUTION.    2.00 ANGSTROMS\nREMARK   3  R VALUE : 0.234000\nREMARK   3  FREE R VALUE : 0.258000\nREMARK   4 3L9H COMPLIES WITH FORMAT V. 3.20, 01-DEC-08\nREMARK 200  TEMPERATURE           (KELVIN) : 100.00\nREMARK 200  PH                             : 7.00\nREMARK 350 BIOMOLECULE: 1\nREMARK 350 APPLY THE FOLLOWING TO CHAINS: A\nREMARK 350   BIOMT1  1   1.000000 0.000000 0.000000   0.000000\nREMARK 350   BIOMT2  1   0.000000 1.000000 0.000000   0.000000\nREMARK 350   BIOMT3  1   0.000000 0.000000 1.000000   0.000000\nREMARK 350 BIOMOLECULE: 2\nREMARK 350 APPLY THE FOLLOWING TO CHAINS: B\nREMARK 350   BIOMT1  1   1.000000 0.000000 0.000000   0.000000\nREMARK 350   BIOMT2  1   0.000000 1.000000 0.000000   0.000000\nREMARK 350   BIOMT3  1   0.000000 0.000000 1.000000   0.000000\nREMARK 888\nREMARK 888 WRITTEN BY MAESTRO (A PRODUCT OF SCHRODINGER, LLC)\nSEQRES   1 A  349  ACE GLY LYS ASN ILE GLN VAL VAL VAL ARG CYS ARG PRO\nSEQRES   2 A  349  PHE ASN LEU ALA GLU ARG LYS ALA SER ALA HIS SER ILE\nSEQRES   3 A  349  VAL GLU CYS ASP PRO VAL ARG LYS GLU VAL SER VAL ARG\nSEQRES   4 A  349  THR GLY GLY LEU ALA ASP LYS SER SER ARG LYS THR TYR\nSEQRES   5 A  349  THR PHE ASP MET VAL PHE GLY ALA SER THR LYS GLN ILE\nSEQRES   6 A  349  ASP VAL TYR ARG SER VAL VAL CYS PRO ILE LEU ASP GLU\nSEQRES   7 A  349  VAL ILE MET GLY TYR ASN CYS THR ILE PHE ALA TYR GLY\nSEQRES   8 A  349  GLN THR GLY THR GLY LYS THR PHE THR MET GLU GLY GLU\nSEQRES   9 A  349  ARG SER PRO ASN GLU GLU TYR THR TRP GLU GLU ASP PRO\nSEQRES  10 A  349  LEU ALA GLY ILE ILE PRO ARG THR LEU HIS GLN ILE PHE\nSEQRES  11 A  349  GLU LYS LEU THR ASP ASN GLY THR GLU PHE SER VAL LYS\nSEQRES  12 A  349  VAL SER LEU LEU GLU ILE TYR ASN GLU GLU LEU PHE ASP\nSEQRES  13 A  349  LEU LEU ASN PRO SER SER ASP VAL SER GLU ARG LEU GLN\nSEQRES  14 A  349  MET PHE ASP ASP PRO ARG ASN LYS ARG GLY VAL ILE ILE\nSEQRES  15 A  349  LYS GLY LEU GLU GLU ILE THR VAL HIS ASN LYS ASP GLU\nSEQRES  16 A  349  VAL TYR GLN ILE LEU GLU LYS GLY ALA ALA LYS ARG THR\nSEQRES  17 A  349  THR ALA ALA THR LEU MET ASN ALA TYR SER SER ARG SER\nSEQRES  18 A  349  HIS SER VAL PHE SER VAL THR ILE HIS MET LYS GLU THR\nSEQRES  19 A  349  THR ILE ASP GLY GLU GLU LEU VAL LYS ILE GLY LYS LEU\nSEQRES  20 A  349  ASN LEU VAL ASP LEU ALA GLY SER GLU ASN ILE GLY ARG\nSEQRES  21 A  349  SER GLY ALA VAL ASP LYS ARG ALA ARG GLU ALA GLY ASN\nSEQRES  22 A  349  ILE ASN GLN SER LEU LEU THR LEU GLY ARG VAL ILE THR\nSEQRES  23 A  349  ALA LEU VAL GLU ARG THR PRO HIS VAL PRO TYR ARG GLU\nSEQRES  24 A  349  SER LYS LEU THR ARG ILE LEU GLN ASP SER LEU GLY GLY\nSEQRES  25 A  349  ARG THR ARG THR SER ILE ILE ALA THR ILE SER PRO ALA\nSEQRES  26 A  349  SER LEU ASN LEU GLU GLU THR LEU SER THR LEU GLU TYR\nSEQRES  27 A  349  ALA HIS ARG ALA LYS ASN ILE LEU ASN LYS NME\nFORMUL   2  HOH   *7(H2 0)\nHELIX    1   1 LEU A   30  LEU A   30  1\nHELIX    2   2 ALA A   31  ALA A   31  1\nHELIX    3   3 GLU A   32  GLU A   32  1\nHELIX    4   4 ARG A   33  ARG A   33  1\nHELIX    5   5 GLN A   78  GLN A   78  1\nHELIX    6   6 ILE A   79  ILE A   79  1\nHELIX    7   7 ASP A   80  ASP A   80  1\nHELIX    8   8 VAL A   81  VAL A   81  1\nHELIX    9   9 TYR A   82  TYR A   82  1\nHELIX   10  10 ARG A   83  ARG A   83  1\nHELIX   11  11 SER A   84  SER A   84  1\nHELIX   12  12 CYS A   87  CYS A   87  1\nHELIX   13  13 PRO A   88  PRO A   88  1\nHELIX   14  14 ILE A   89  ILE A   89  1\nHELIX   15  15 LEU A   90  LEU A   90  1\nHELIX   16  16 ASP A   91  ASP A   91  1\nHELIX   17  17 GLU A   92  GLU A   92  1\nHELIX   18  18 VAL A   93  VAL A   93  1\nHELIX   19  19 ILE A   94  ILE A   94  1\nHELIX   20  20 LYS A  111  LYS A  111  1\nHELIX   21  21 THR A  112  THR A  112  1\nHELIX   22  22 PHE A  113  PHE A  113  1\nHELIX   23  23 THR A  114  THR A  114  1\nHELIX   24  24 MET A  115  MET A  115  1\nHELIX   25  25 ILE A  136  ILE A  136  1\nHELIX   26  26 PRO A  137  PRO A  137  1\nHELIX   27  27 ARG A  138  ARG A  138  1\nHELIX   28  28 THR A  139  THR A  139  1\nHELIX   29  29 LEU A  140  LEU A  140  1\nHELIX   30  30 HIS A  141  HIS A  141  1\nHELIX   31  31 GLN A  142  GLN A  142  1\nHELIX   32  32 ILE A  143  ILE A  143  1\nHELIX   33  33 PHE A  144  PHE A  144  1\nHELIX   34  34 GLU A  145  GLU A  145  1\nHELIX   35  35 LYS A  146  LYS A  146  1\nHELIX   36  36 VAL A  210  VAL A  210  1\nHELIX   37  37 TYR A  211  TYR A  211  1\nHELIX   38  38 GLN A  212  GLN A  212  1\nHELIX   39  39 ILE A  213  ILE A  213  1\nHELIX   40  40 LEU A  214  LEU A  214  1\nHELIX   41  41 GLU A  215  GLU A  215  1\nHELIX   42  42 LYS A  216  LYS A  216  1\nHELIX   43  43 GLY A  217  GLY A  217  1\nHELIX   44  44 ALA A  218  ALA A  218  1\nHELIX   45  45 ALA A  219  ALA A  219  1\nHELIX   46  46 LYS A  220  LYS A  220  1\nHELIX   47  47 ARG A  221  ARG A  221  1\nHELIX   48  48 THR A  222  THR A  222  1\nHELIX   49  49 THR A  223  THR A  223  1\nHELIX   50  50 ALA A  224  ALA A  224  1\nHELIX   51  51 ALA A  225  ALA A  225  1\nHELIX   52  52 THR A  226  THR A  226  1\nHELIX   53  53 LEU A  227  LEU A  227  1\nHELIX   54  54 TYR A  231  TYR A  231  1\nHELIX   55  55 SER A  232  SER A  232  1\nHELIX   56  56 SER A  233  SER A  233  1\nHELIX   57  57 ARG A  234  ARG A  234  1\nHELIX   58  58 GLN A  290  GLN A  290  1\nHELIX   59  59 SER A  291  SER A  291  1\nHELIX   60  60 LEU A  292  LEU A  292  1\nHELIX   61  61 LEU A  293  LEU A  293  1\nHELIX   62  62 THR A  294  THR A  294  1\nHELIX   63  63 LEU A  295  LEU A  295  1\nHELIX   64  64 GLY A  296  GLY A  296  1\nHELIX   65  65 ARG A  297  ARG A  297  1\nHELIX   66  66 VAL A  298  VAL A  298  1\nHELIX   67  67 ILE A  299  ILE A  299  1\nHELIX   68  68 THR A  300  THR A  300  1\nHELIX   69  69 ALA A  301  ALA A  301  1\nHELIX   70  70 LEU A  302  LEU A  302  1\nHELIX   71  71 VAL A  303  VAL A  303  1\nHELIX   72  72 LYS A  315  LYS A  315  1\nHELIX   73  73 LEU A  316  LEU A  316  1\nHELIX   74  74 THR A  317  THR A  317  1\nHELIX   75  75 ARG A  318  ARG A  318  1\nHELIX   76  76 ILE A  319  ILE A  319  1\nHELIX   77  77 LEU A  343  LEU A  343  1\nHELIX   78  78 GLU A  344  GLU A  344  1\nHELIX   79  79 GLU A  345  GLU A  345  1\nHELIX   80  80 THR A  346  THR A  346  1\nHELIX   81  81 LEU A  347  LEU A  347  1\nHELIX   82  82 SER A  348  SER A  348  1\nHELIX   83  83 THR A  349  THR A  349  1\nHELIX   84  84 LEU A  350  LEU A  350  1\nHELIX   85  85 GLU A  351  GLU A  351  1\nHELIX   86  86 TYR A  352  TYR A  352  1\nHELIX   87  87 ALA A  353  ALA A  353  1\nHELIX   88  88 HIS A  354  HIS A  354  1\nHELIX   89  89 ARG A  355  ARG A  355  1\nHELIX   90  90 ALA A  356  ALA A  356  1\nTURN     1   1 GLY A  16  GLY A  16\nTURN     2   2 LYS A  17  LYS A  17\nTURN     3   3 ASN A  18  ASN A  18\nTURN     4   4 ILE A  19  ILE A  19\nTURN     5   5 GLN A  20  GLN A  20\nTURN     6   6 VAL A  21  VAL A  21\nTURN     7   7 CYS A  25  CYS A  25\nTURN     8   8 ARG A  26  ARG A  26\nTURN     9   9 PRO A  27  PRO A  27\nTURN    10  10 PHE A  28  PHE A  28\nTURN    11  11 ASN A  29  ASN A  29\nTURN    12  12 LYS A  34  LYS A  34\nTURN    13  13 ALA A  35  ALA A  35\nTURN    14  14 SER A  36  SER A  36\nTURN    15  15 ALA A  37  ALA A  37\nTURN    16  16 HIS A  38  HIS A  38\nTURN    17  17 SER A  39  SER A  39\nTURN    18  18 ILE A  40  ILE A  40\nTURN    19  19 PRO A  45  PRO A  45\nTURN    20  20 VAL A  46  VAL A  46\nTURN    21  21 ARG A  47  ARG A  47\nTURN    22  22 LYS A  48  LYS A  48\nTURN    23  23 LEU A  57  LEU A  57\nTURN    24  24 ALA A  58  ALA A  58\nTURN    25  25 ASP A  59  ASP A  59\nTURN    26  26 LYS A  60  LYS A  60\nTURN    27  27 PHE A  68  PHE A  68\nTURN    28  28 ASP A  69  ASP A  69\nTURN    29  29 GLY A  73  GLY A  73\nTURN    30  30 ALA A  74  ALA A  74\nTURN    31  31 SER A  75  SER A  75\nTURN    32  32 THR A  76  THR A  76\nTURN    33  33 LYS A  77  LYS A  77\nTURN    34  34 VAL A  85  VAL A  85\nTURN    35  35 VAL A  86  VAL A  86\nTURN    36  36 MET A  95  MET A  95\nTURN    37  37 GLY A  96  GLY A  96\nTURN    38  38 TYR A  97  TYR A  97\nTURN    39  39 TYR A 104  TYR A 104\nTURN    40  40 GLY A 105  GLY A 105\nTURN    41  41 GLN A 106  GLN A 106\nTURN    42  42 THR A 107  THR A 107\nTURN    43  43 GLY A 108  GLY A 108\nTURN    44  44 THR A 109  THR A 109\nTURN    45  45 GLY A 110  GLY A 110\nTURN    46  46 GLU A 116  GLU A 116\nTURN    47  47 GLY A 117  GLY A 117\nTURN    48  48 GLU A 118  GLU A 118\nTURN    49  49 ARG A 119  ARG A 119\nTURN    50  50 SER A 120  SER A 120\nTURN    51  51 PRO A 121  PRO A 121\nTURN    52  52 ASN A 122  ASN A 122\nTURN    53  53 GLU A 123  GLU A 123\nTURN    54  54 GLU A 124  GLU A 124\nTURN    55  55 TYR A 125  TYR A 125\nTURN    56  56 THR A 126  THR A 126\nTURN    57  57 TRP A 127  TRP A 127\nTURN    58  58 GLU A 128  GLU A 128\nTURN    59  59 GLU A 129  GLU A 129\nTURN    60  60 ASP A 130  ASP A 130\nTURN    61  61 PRO A 131  PRO A 131\nTURN    62  62 LEU A 132  LEU A 132\nTURN    63  63 ALA A 133  ALA A 133\nTURN    64  64 GLY A 134  GLY A 134\nTURN    65  65 ILE A 135  ILE A 135\nTURN    66  66 LEU A 147  LEU A 147\nTURN    67  67 THR A 148  THR A 148\nTURN    68  68 ASP A 149  ASP A 149\nTURN    69  69 ASN A 150  ASN A 150\nTURN    70  70 GLY A 151  GLY A 151\nTURN    71  71 THR A 152  THR A 152\nTURN    72  72 ASN A 165  ASN A 165\nTURN    73  73 GLU A 166  GLU A 166\nTURN    74  74 LEU A 171  LEU A 171\nTURN    75  75 LEU A 172  LEU A 172\nTURN    76  76 ASN A 173  ASN A 173\nTURN    77  77 PRO A 174  PRO A 174\nTURN    78  78 SER A 175  SER A 175\nTURN    79  79 SER A 176  SER A 176\nTURN    80  80 ASP A 177  ASP A 177\nTURN    81  81 VAL A 178  VAL A 178\nTURN    82  82 SER A 179  SER A 179\nTURN    83  83 GLU A 180  GLU A 180\nTURN    84  84 ASP A 187  ASP A 187\nTURN    85  85 PRO A 188  PRO A 188\nTURN    86  86 ARG A 189  ARG A 189\nTURN    87  87 ASN A 190  ASN A 190\nTURN    88  88 LYS A 191  LYS A 191\nTURN    89  89 ARG A 192  ARG A 192\nTURN    90  90 GLY A 193  GLY A 193\nTURN    91  91 GLY A 198  GLY A 198\nTURN    92  92 LEU A 199  LEU A 199\nTURN    93  93 GLU A 200  GLU A 200\nTURN    94  94 GLU A 201  GLU A 201\nTURN    95  95 VAL A 204  VAL A 204\nTURN    96  96 HIS A 205  HIS A 205\nTURN    97  97 ASN A 206  ASN A 206\nTURN    98  98 LYS A 207  LYS A 207\nTURN    99  99 ASP A 208  ASP A 208\nTURN   100 100 GLU A 209  GLU A 209\nTURN   101 101 MET A 228  MET A 228\nTURN   102 102 ASN A 229  ASN A 229\nTURN   103 103 ALA A 230  ALA A 230\nTURN   104 104 SER A 235  SER A 235\nTURN   105 105 THR A 249  THR A 249\nTURN   106 106 ILE A 250  ILE A 250\nTURN   107 107 ASP A 251  ASP A 251\nTURN   108 108 GLY A 252  GLY A 252\nTURN   109 109 GLU A 253  GLU A 253\nTURN   110 110 LEU A 266  LEU A 266\nTURN   111 111 ALA A 267  ALA A 267\nTURN   112 112 GLY A 268  GLY A 268\nTURN   113 113 SER A 269  SER A 269\nTURN   114 114 GLU A 270  GLU A 270\nTURN   115 115 ASN A 271  ASN A 271\nTURN   116 116 ILE A 272  ILE A 272\nTURN   117 117 GLY A 273  GLY A 273\nTURN   118 118 ARG A 274  ARG A 274\nTURN   119 119 SER A 275  SER A 275\nTURN   120 120 GLY A 276  GLY A 276\nTURN   121 121 ALA A 277  ALA A 277\nTURN   122 122 VAL A 278  VAL A 278\nTURN   123 123 ASP A 279  ASP A 279\nTURN   124 124 LYS A 280  LYS A 280\nTURN   125 125 ARG A 281  ARG A 281\nTURN   126 126 ALA A 282  ALA A 282\nTURN   127 127 ARG A 283  ARG A 283\nTURN   128 128 GLU A 284  GLU A 284\nTURN   129 129 ALA A 285  ALA A 285\nTURN   130 130 GLY A 286  GLY A 286\nTURN   131 131 ASN A 287  ASN A 287\nTURN   132 132 ILE A 288  ILE A 288\nTURN   133 133 ASN A 289  ASN A 289\nTURN   134 134 GLU A 304  GLU A 304\nTURN   135 135 ARG A 305  ARG A 305\nTURN   136 136 THR A 306  THR A 306\nTURN   137 137 PRO A 307  PRO A 307\nTURN   138 138 HIS A 308  HIS A 308\nTURN   139 139 VAL A 309  VAL A 309\nTURN   140 140 PRO A 310  PRO A 310\nTURN   141 141 TYR A 311  TYR A 311\nTURN   142 142 ARG A 312  ARG A 312\nTURN   143 143 GLU A 313  GLU A 313\nTURN   144 144 SER A 314  SER A 314\nTURN   145 145 LEU A 320  LEU A 320\nTURN   146 146 GLN A 321  GLN A 321\nTURN   147 147 ASP A 322  ASP A 322\nTURN   148 148 SER A 323  SER A 323\nTURN   149 149 LEU A 324  LEU A 324\nTURN   150 150 GLY A 325  GLY A 325\nTURN   151 151 GLY A 326  GLY A 326\nTURN   152 152 ARG A 327  ARG A 327\nTURN   153 153 THR A 328  THR A 328\nTURN   154 154 ARG A 329  ARG A 329\nTURN   155 155 THR A 330  THR A 330\nTURN   156 156 SER A 331  SER A 331\nTURN   157 157 ILE A 332  ILE A 332\nTURN   158 158 ILE A 333  ILE A 333\nTURN   159 159 ALA A 334  ALA A 334\nTURN   160 160 THR A 335  THR A 335\nTURN   161 161 ILE A 336  ILE A 336\nTURN   162 162 SER A 337  SER A 337\nTURN   163 163 PRO A 338  PRO A 338\nTURN   164 164 ALA A 339  ALA A 339\nTURN   165 165 SER A 340  SER A 340\nTURN   166 166 LEU A 341  LEU A 341\nTURN   167 167 ASN A 342  ASN A 342\nTURN   168 168 LYS A 357  LYS A 357\nTURN   169 169 ASN A 358  ASN A 358\nTURN   170 170 ILE A 359  ILE A 359\nTURN   171 171 LEU A 360  LEU A 360\nTURN   172 172 ASN A 361  ASN A 361\nTURN   173 173 LYS A 362  LYS A 362\nSHEET    1   1 1 VAL A  22  VAL A  22  0\nSHEET    1   2 1 VAL A  23  VAL A  23  0\nSHEET    1   3 1 ARG A  24  ARG A  24  0\nSHEET    1   4 1 VAL A  41  VAL A  41  0\nSHEET    1   5 1 GLU A  42  GLU A  42  0\nSHEET    1   6 1 CYS A  43  CYS A  43  0\nSHEET    1   7 1 ASP A  44  ASP A  44  0\nSHEET    1   8 1 GLU A  49  GLU A  49  0\nSHEET    1   9 1 VAL A  50  VAL A  50  0\nSHEET    1  10 1 SER A  51  SER A  51  0\nSHEET    1  11 1 VAL A  52  VAL A  52  0\nSHEET    1  12 1 ARG A  53  ARG A  53  0\nSHEET    1  13 1 THR A  54  THR A  54  0\nSHEET    1  14 1 GLY A  55  GLY A  55  0\nSHEET    1  15 1 GLY A  56  GLY A  56  0\nSHEET    1  16 1 SER A  61  SER A  61  0\nSHEET    1  17 1 SER A  62  SER A  62  0\nSHEET    1  18 1 ARG A  63  ARG A  63  0\nSHEET    1  19 1 LYS A  64  LYS A  64  0\nSHEET    1  20 1 THR A  65  THR A  65  0\nSHEET    1  21 1 TYR A  66  TYR A  66  0\nSHEET    1  22 1 THR A  67  THR A  67  0\nSHEET    1  23 1 MET A  70  MET A  70  0\nSHEET    1  24 1 VAL A  71  VAL A  71  0\nSHEET    1  25 1 PHE A  72  PHE A  72  0\nSHEET    1  26 1 ASN A  98  ASN A  98  0\nSHEET    1  27 1 CYS A  99  CYS A  99  0\nSHEET    1  28 1 THR A 100  THR A 100  0\nSHEET    1  29 1 ILE A 101  ILE A 101  0\nSHEET    1  30 1 PHE A 102  PHE A 102  0\nSHEET    1  31 1 ALA A 103  ALA A 103  0\nSHEET    1  32 1 GLU A 153  GLU A 153  0\nSHEET    1  33 1 PHE A 154  PHE A 154  0\nSHEET    1  34 1 SER A 155  SER A 155  0\nSHEET    1  35 1 VAL A 156  VAL A 156  0\nSHEET    1  36 1 LYS A 157  LYS A 157  0\nSHEET    1  37 1 VAL A 158  VAL A 158  0\nSHEET    1  38 1 SER A 159  SER A 159  0\nSHEET    1  39 1 LEU A 160  LEU A 160  0\nSHEET    1  40 1 LEU A 161  LEU A 161  0\nSHEET    1  41 1 GLU A 162  GLU A 162  0\nSHEET    1  42 1 ILE A 163  ILE A 163  0\nSHEET    1  43 1 TYR A 164  TYR A 164  0\nSHEET    1  44 1 GLU A 167  GLU A 167  0\nSHEET    1  45 1 LEU A 168  LEU A 168  0\nSHEET    1  46 1 PHE A 169  PHE A 169  0\nSHEET    1  47 1 ASP A 170  ASP A 170  0\nSHEET    1  48 1 ARG A 181  ARG A 181  0\nSHEET    1  49 1 LEU A 182  LEU A 182  0\nSHEET    1  50 1 GLN A 183  GLN A 183  0\nSHEET    1  51 1 MET A 184  MET A 184  0\nSHEET    1  52 1 PHE A 185  PHE A 185  0\nSHEET    1  53 1 ASP A 186  ASP A 186  0\nSHEET    1  54 1 VAL A 194  VAL A 194  0\nSHEET    1  55 1 ILE A 195  ILE A 195  0\nSHEET    1  56 1 ILE A 196  ILE A 196  0\nSHEET    1  57 1 LYS A 197  LYS A 197  0\nSHEET    1  58 1 ILE A 202  ILE A 202  0\nSHEET    1  59 1 THR A 203  THR A 203  0\nSHEET    1  60 1 HIS A 236  HIS A 236  0\nSHEET    1  61 1 SER A 237  SER A 237  0\nSHEET    1  62 1 VAL A 238  VAL A 238  0\nSHEET    1  63 1 PHE A 239  PHE A 239  0\nSHEET    1  64 1 SER A 240  SER A 240  0\nSHEET    1  65 1 VAL A 241  VAL A 241  0\nSHEET    1  66 1 THR A 242  THR A 242  0\nSHEET    1  67 1 ILE A 243  ILE A 243  0\nSHEET    1  68 1 HIS A 244  HIS A 244  0\nSHEET    1  69 1 MET A 245  MET A 245  0\nSHEET    1  70 1 LYS A 246  LYS A 246  0\nSHEET    1  71 1 GLU A 247  GLU A 247  0\nSHEET    1  72 1 THR A 248  THR A 248  0\nSHEET    1  73 1 GLU A 254  GLU A 254  0\nSHEET    1  74 1 LEU A 255  LEU A 255  0\nSHEET    1  75 1 VAL A 256  VAL A 256  0\nSHEET    1  76 1 LYS A 257  LYS A 257  0\nSHEET    1  77 1 ILE A 258  ILE A 258  0\nSHEET    1  78 1 GLY A 259  GLY A 259  0\nSHEET    1  79 1 LYS A 260  LYS A 260  0\nSHEET    1  80 1 LEU A 261  LEU A 261  0\nSHEET    1  81 1 ASN A 262  ASN A 262  0\nSHEET    1  82 1 LEU A 263  LEU A 263  0\nSHEET    1  83 1 VAL A 264  VAL A 264  0\nSHEET    1  84 1 ASP A 265  ASP A 265  0\nCRYST1  160.950   79.718   69.513  90.00  96.88  90.00 C 1 2 1       8\nHETATM    1  CH3 ACE A  15      24.431 -17.877 -11.476  1.00  0.00           C  \nHETATM    2  C   ACE A  15      24.674 -16.414 -11.124  1.00  0.00           C  \nHETATM    3  O   ACE A  15      25.798 -15.931 -11.253  1.00  0.00           O  \nHETATM    4  H1  ACE A  15      25.311 -18.475 -11.239  1.00  0.00           H  \nHETATM    5  H2  ACE A  15      23.585 -18.282 -10.919  1.00  0.00           H  \nHETATM    6  H3  ACE A  15      24.223 -17.978 -12.542  1.00  0.00           H  \nATOM      7  N   GLY A  16      23.614 -15.724 -10.670  1.00 56.82           N  \nATOM      8  CA  GLY A  16      23.646 -14.323 -10.247  1.00 57.15           C  \nATOM      9  C   GLY A  16      24.213 -14.203  -8.825  1.00 56.24           C  \nATOM     10  O   GLY A  16      25.151 -14.910  -8.454  1.00 56.63           O  \nATOM     11  H   GLY A  16      22.728 -16.199 -10.583  1.00 56.82           H  \nATOM     12  HA3 GLY A  16      22.635 -13.918 -10.293  1.00 57.15           H  \nATOM     13  HA2 GLY A  16      24.256 -13.729 -10.929  1.00 57.15           H  \nATOM     14  N   LYS A  17      23.662 -13.267  -8.040  1.00 53.91           N  \nATOM     15  CA  LYS A  17      24.105 -13.003  -6.677  1.00 51.35           C  \nATOM     16  C   LYS A  17      22.888 -12.704  -5.798  1.00 48.72           C  \nATOM     17  O   LYS A  17      22.318 -11.618  -5.893  1.00 48.83           O  \nATOM     18  CB  LYS A  17      25.153 -11.868  -6.699  1.00 53.46           C  \nATOM     19  CG  LYS A  17      25.712 -11.461  -5.324  1.00 54.84           C  \nATOM     20  CD  LYS A  17      26.495 -12.582  -4.611  1.00 56.79           C  \nATOM     21  CE  LYS A  17      27.010 -12.193  -3.216  1.00 57.01           C  \nATOM     22  NZ  LYS A  17      28.016 -11.119  -3.266  1.00 59.10           N1+\nATOM     23  H   LYS A  17      22.912 -12.683  -8.386  1.00 53.91           H  \nATOM     24  HA  LYS A  17      24.578 -13.900  -6.274  1.00 51.35           H  \nATOM     25  HB3 LYS A  17      24.714 -10.985  -7.167  1.00 53.46           H  \nATOM     26  HB2 LYS A  17      25.987 -12.157  -7.341  1.00 53.46           H  \nATOM     27  HG3 LYS A  17      24.896 -11.125  -4.688  1.00 54.84           H  \nATOM     28  HG2 LYS A  17      26.353 -10.591  -5.464  1.00 54.84           H  \nATOM     29  HD3 LYS A  17      27.325 -12.908  -5.240  1.00 56.79           H  \nATOM     30  HD2 LYS A  17      25.855 -13.456  -4.490  1.00 56.79           H  \nATOM     31  HE3 LYS A  17      27.459 -13.061  -2.732  1.00 57.01           H  \nATOM     32  HE2 LYS A  17      26.180 -11.874  -2.586  1.00 57.01           H  \nATOM     33  HZ1 LYS A  17      28.326 -10.902  -2.329  1.00 59.10           H  \nATOM     34  HZ2 LYS A  17      28.805 -11.418  -3.822  1.00 59.10           H  \nATOM     35  HZ3 LYS A  17      27.606 -10.296  -3.682  1.00 59.10           H  \nATOM     36  N   ASN A  18      22.534 -13.674  -4.941  1.00 45.87           N  \nATOM     37  CA  ASN A  18      21.461 -13.558  -3.950  1.00 44.12           C  \nATOM     38  C   ASN A  18      21.811 -12.503  -2.887  1.00 40.49           C  \nATOM     39  O   ASN A  18      22.990 -12.349  -2.557  1.00 38.53           O  \nATOM     40  CB  ASN A  18      21.221 -14.929  -3.273  1.00 45.88           C  \nATOM     41  CG  ASN A  18      20.663 -16.028  -4.189  1.00 48.93           C  \nATOM     42  OD1 ASN A  18      20.711 -15.937  -5.414  1.00 50.57           O  \nATOM     43  ND2 ASN A  18      20.140 -17.097  -3.585  1.00 49.83           N  \nATOM     44  H   ASN A  18      23.043 -14.546  -4.940  1.00 45.87           H  \nATOM     45  HA  ASN A  18      20.571 -13.264  -4.502  1.00 44.12           H  \nATOM     46  HB3 ASN A  18      20.515 -14.801  -2.452  1.00 45.88           H  \nATOM     47  HB2 ASN A  18      22.147 -15.292  -2.823  1.00 45.88           H  \nATOM     48 HD22 ASN A  18      19.764 -17.854  -4.136  1.00 49.83           H  \nATOM     49 HD21 ASN A  18      20.101 -17.148  -2.577  1.00 49.83           H  \nATOM     50  N   ILE A  19      20.785 -11.816  -2.354  1.00 37.01           N  \nATOM     51  CA  ILE A  19      20.936 -10.859  -1.254  1.00 33.92           C  \nATOM     52  C   ILE A  19      21.437 -11.568   0.018  1.00 32.91           C  \nATOM     53  O   ILE A  19      20.806 -12.523   0.471  1.00 32.02           O  \nATOM     54  CB  ILE A  19      19.627 -10.064  -0.954  1.00 34.31           C  \nATOM     55  CG1 ILE A  19      19.307  -9.139  -2.156  1.00 33.64           C  \nATOM     56  CG2 ILE A  19      19.667  -9.262   0.374  1.00 32.90           C  \nATOM     57  CD1 ILE A  19      18.136  -8.165  -1.954  1.00 33.56           C  \nATOM     58  H   ILE A  19      19.841 -11.995  -2.674  1.00 37.01           H  \nATOM     59  HA  ILE A  19      21.695 -10.142  -1.565  1.00 33.92           H  \nATOM     60  HB  ILE A  19      18.810 -10.781  -0.877  1.00 34.31           H  \nATOM     61 HG13 ILE A  19      19.108  -9.745  -3.041  1.00 33.64           H  \nATOM     62 HG12 ILE A  19      20.194  -8.558  -2.400  1.00 33.64           H  \nATOM     63 HG21 ILE A  19      18.744  -8.711   0.540  1.00 32.90           H  \nATOM     64 HG22 ILE A  19      19.775  -9.903   1.249  1.00 32.90           H  \nATOM     65 HG23 ILE A  19      20.487  -8.546   0.385  1.00 32.90           H  \nATOM     66 HD11 ILE A  19      17.783  -7.782  -2.911  1.00 33.56           H  \nATOM     67 HD12 ILE A  19      17.298  -8.645  -1.453  1.00 33.56           H  \nATOM     68 HD13 ILE A  19      18.433  -7.305  -1.357  1.00 33.56           H  \nATOM     69  N   GLN A  20      22.581 -11.093   0.535  1.00 31.83           N  \nATOM     70  CA  GLN A  20      23.246 -11.666   1.700  1.00 31.76           C  \nATOM     71  C   GLN A  20      22.649 -11.100   2.987  1.00 29.83           C  \nATOM     72  O   GLN A  20      22.845  -9.923   3.283  1.00 30.30           O  \nATOM     73  CB  GLN A  20      24.758 -11.400   1.625  1.00 32.28           C  \nATOM     74  CG  GLN A  20      25.436 -12.188   0.492  1.00 35.88           C  \nATOM     75  CD  GLN A  20      26.959 -12.095   0.565  1.00 37.61           C  \nATOM     76  OE1 GLN A  20      27.516 -11.013   0.728  1.00 40.61           O  \nATOM     77  NE2 GLN A  20      27.641 -13.231   0.418  1.00 39.78           N  \nATOM     78  H   GLN A  20      23.027 -10.292   0.113  1.00 31.83           H  \nATOM     79  HA  GLN A  20      23.099 -12.747   1.693  1.00 31.76           H  \nATOM     80  HB3 GLN A  20      25.214 -11.687   2.575  1.00 32.28           H  \nATOM     81  HB2 GLN A  20      24.946 -10.332   1.506  1.00 32.28           H  \nATOM     82  HG3 GLN A  20      25.101 -11.819  -0.477  1.00 35.88           H  \nATOM     83  HG2 GLN A  20      25.137 -13.236   0.546  1.00 35.88           H  \nATOM     84 HE22 GLN A  20      28.649 -13.230   0.470  1.00 39.78           H  \nATOM     85 HE21 GLN A  20      27.153 -14.107   0.292  1.00 39.78           H  \nATOM     86  N   VAL A  21      21.934 -11.949   3.729  1.00 27.26           N  \nATOM     87  CA  VAL A  21      21.259 -11.549   4.953  1.00 26.53           C  \nATOM     88  C   VAL A  21      22.034 -12.104   6.151  1.00 27.22           C  \nATOM     89  O   VAL A  21      22.328 -13.298   6.190  1.00 28.15           O  \nATOM     90  CB  VAL A  21      19.814 -12.090   5.008  1.00 25.02           C  \nATOM     91  CG1 VAL A  21      19.068 -11.635   6.274  1.00 25.05           C  \nATOM     92  CG2 VAL A  21      19.017 -11.669   3.758  1.00 23.47           C  \nATOM     93  H   VAL A  21      21.845 -12.920   3.455  1.00 27.26           H  \nATOM     94  HA  VAL A  21      21.201 -10.464   5.023  1.00 26.53           H  \nATOM     95  HB  VAL A  21      19.847 -13.180   5.024  1.00 25.02           H  \nATOM     96 HG11 VAL A  21      18.077 -12.072   6.286  1.00 25.05           H  \nATOM     97 HG12 VAL A  21      19.552 -11.950   7.198  1.00 25.05           H  \nATOM     98 HG13 VAL A  21      18.960 -10.550   6.308  1.00 25.05           H  \nATOM     99 HG21 VAL A  21      17.985 -12.007   3.810  1.00 23.47           H  \nATOM    100 HG22 VAL A  21      19.002 -10.586   3.641  1.00 23.47           H  \nATOM    101 HG23 VAL A  21      19.438 -12.094   2.848  1.00 23.47           H  \nATOM    102  N   VAL A  22      22.328 -11.218   7.110  1.00 26.44           N  \nATOM    103  CA  VAL A  22      23.018 -11.556   8.348  1.00 27.25           C  \nATOM    104  C   VAL A  22      22.177 -11.059   9.531  1.00 25.59           C  \nATOM    105  O   VAL A  22      21.467 -10.064   9.391  1.00 22.16           O  \nATOM    106  CB  VAL A  22      24.448 -10.936   8.400  1.00 28.72           C  \nATOM    107  CG1 VAL A  22      25.230 -11.232   7.107  1.00 32.98           C  \nATOM    108  CG2 VAL A  22      24.532  -9.431   8.717  1.00 29.91           C  \nATOM    109  H   VAL A  22      22.039 -10.253   7.012  1.00 26.44           H  \nATOM    110  HA  VAL A  22      23.093 -12.636   8.430  1.00 27.25           H  \nATOM    111  HB  VAL A  22      24.979 -11.448   9.204  1.00 28.72           H  \nATOM    112 HG11 VAL A  22      26.256 -10.888   7.188  1.00 32.98           H  \nATOM    113 HG12 VAL A  22      25.247 -12.299   6.884  1.00 32.98           H  \nATOM    114 HG13 VAL A  22      24.798 -10.723   6.246  1.00 32.98           H  \nATOM    115 HG21 VAL A  22      25.564  -9.082   8.681  1.00 29.91           H  \nATOM    116 HG22 VAL A  22      23.965  -8.856   7.986  1.00 29.91           H  \nATOM    117 HG23 VAL A  22      24.156  -9.193   9.712  1.00 29.91           H  \nATOM    118  N   VAL A  23      22.269 -11.757  10.672  1.00 24.13           N  \nATOM    119  CA  VAL A  23      21.580 -11.373  11.905  1.00 23.21           C  \nATOM    120  C   VAL A  23      22.603 -10.887  12.939  1.00 24.05           C  \nATOM    121  O   VAL A  23      23.682 -11.468  13.034  1.00 25.40           O  \nATOM    122  CB  VAL A  23      20.755 -12.554  12.494  1.00 22.95           C  \nATOM    123  CG1 VAL A  23      20.241 -12.363  13.940  1.00 24.02           C  \nATOM    124  CG2 VAL A  23      19.558 -12.861  11.584  1.00 22.44           C  \nATOM    125  H   VAL A  23      22.869 -12.569  10.723  1.00 24.13           H  \nATOM    126  HA  VAL A  23      20.892 -10.560  11.698  1.00 23.21           H  \nATOM    127  HB  VAL A  23      21.392 -13.440  12.499  1.00 22.95           H  \nATOM    128 HG11 VAL A  23      19.594 -13.190  14.235  1.00 24.02           H  \nATOM    129 HG12 VAL A  23      21.051 -12.334  14.669  1.00 24.02           H  \nATOM    130 HG13 VAL A  23      19.663 -11.444  14.038  1.00 24.02           H  \nATOM    131 HG21 VAL A  23      19.017 -13.731  11.946  1.00 22.44           H  \nATOM    132 HG22 VAL A  23      18.855 -12.029  11.559  1.00 22.44           H  \nATOM    133 HG23 VAL A  23      19.868 -13.067  10.560  1.00 22.44           H  \nATOM    134  N   ARG A  24      22.228  -9.857  13.714  1.00 23.76           N  \nATOM    135  CA  ARG A  24      23.009  -9.381  14.849  1.00 24.07           C  \nATOM    136  C   ARG A  24      22.105  -9.252  16.077  1.00 23.91           C  \nATOM    137  O   ARG A  24      21.280  -8.343  16.138  1.00 23.91           O  \nATOM    138  CB  ARG A  24      23.730  -8.063  14.503  1.00 24.65           C  \nATOM    139  CG  ARG A  24      24.711  -7.627  15.607  1.00 24.28           C  \nATOM    140  CD  ARG A  24      25.349  -6.260  15.344  1.00 22.93           C  \nATOM    141  NE  ARG A  24      26.436  -5.996  16.300  1.00 21.81           N  \nATOM    142  CZ  ARG A  24      27.196  -4.891  16.374  1.00 24.11           C  \nATOM    143  NH1 ARG A  24      26.979  -3.833  15.585  1.00 24.49           N  \nATOM    144  NH2 ARG A  24      28.200  -4.844  17.256  1.00 25.73           N1+\nATOM    145  H   ARG A  24      21.323  -9.426  13.575  1.00 23.76           H  \nATOM    146  HA  ARG A  24      23.778 -10.111  15.093  1.00 24.07           H  \nATOM    147  HB3 ARG A  24      23.004  -7.272  14.310  1.00 24.65           H  \nATOM    148  HB2 ARG A  24      24.290  -8.193  13.576  1.00 24.65           H  \nATOM    149  HG3 ARG A  24      25.460  -8.393  15.812  1.00 24.28           H  \nATOM    150  HG2 ARG A  24      24.138  -7.528  16.530  1.00 24.28           H  \nATOM    151  HD3 ARG A  24      24.600  -5.494  15.551  1.00 22.93           H  \nATOM    152  HD2 ARG A  24      25.651  -6.135  14.304  1.00 22.93           H  \nATOM    153  HE  ARG A  24      26.586  -6.718  16.995  1.00 21.81           H  \nATOM    154 HH12 ARG A  24      27.579  -3.019  15.648  1.00 24.49           H  \nATOM    155 HH11 ARG A  24      26.195  -3.825  14.944  1.00 24.49           H  \nATOM    156 HH22 ARG A  24      28.781  -4.020  17.314  1.00 25.73           H  \nATOM    157 HH21 ARG A  24      28.395  -5.632  17.860  1.00 25.73           H  \nATOM    158  N   CYS A  25      22.320 -10.131  17.063  1.00 22.64           N  \nATOM    159  CA  CYS A  25      21.715 -10.009  18.383  1.00 24.93           C  \nATOM    160  C   CYS A  25      22.588  -9.082  19.242  1.00 26.45           C  \nATOM    161  O   CYS A  25      23.783  -9.344  19.369  1.00 27.13           O  \nATOM    162  CB  CYS A  25      21.520 -11.392  19.031  1.00 25.80           C  \nATOM    163  SG  CYS A  25      20.550 -11.265  20.560  1.00 30.42           S  \nATOM    164  H   CYS A  25      23.024 -10.851  16.953  1.00 22.64           H  \nATOM    165  HA  CYS A  25      20.730  -9.558  18.277  1.00 24.93           H  \nATOM    166  HB3 CYS A  25      22.478 -11.867  19.248  1.00 25.80           H  \nATOM    167  HB2 CYS A  25      20.986 -12.055  18.350  1.00 25.80           H  \nATOM    168  HG  CYS A  25      21.450 -10.556  21.249  1.00 30.42           H  \nATOM    169  N   ARG A  26      21.984  -8.031  19.822  1.00 25.64           N  \nATOM    170  CA  ARG A  26      22.656  -7.160  20.793  1.00 26.31           C  \nATOM    171  C   ARG A  26      22.728  -7.840  22.184  1.00 28.11           C  \nATOM    172  O   ARG A  26      21.927  -8.735  22.456  1.00 25.72           O  \nATOM    173  CB  ARG A  26      21.952  -5.782  20.834  1.00 26.30           C  \nATOM    174  CG  ARG A  26      20.507  -5.752  21.363  1.00 27.32           C  \nATOM    175  CD  ARG A  26      20.138  -4.352  21.882  1.00 28.22           C  \nATOM    176  NE  ARG A  26      18.758  -4.277  22.384  1.00 29.36           N  \nATOM    177  CZ  ARG A  26      18.256  -4.736  23.544  1.00 28.29           C  \nATOM    178  NH1 ARG A  26      19.002  -5.395  24.439  1.00 33.40           N  \nATOM    179  NH2 ARG A  26      16.966  -4.516  23.822  1.00 32.13           N1+\nATOM    180  H   ARG A  26      20.997  -7.868  19.671  1.00 25.64           H  \nATOM    181  HA  ARG A  26      23.671  -6.993  20.430  1.00 26.31           H  \nATOM    182  HB3 ARG A  26      21.972  -5.339  19.838  1.00 26.30           H  \nATOM    183  HB2 ARG A  26      22.541  -5.102  21.444  1.00 26.30           H  \nATOM    184  HG3 ARG A  26      20.349  -6.488  22.150  1.00 27.32           H  \nATOM    185  HG2 ARG A  26      19.835  -6.033  20.552  1.00 27.32           H  \nATOM    186  HD3 ARG A  26      20.220  -3.632  21.067  1.00 28.22           H  \nATOM    187  HD2 ARG A  26      20.837  -4.017  22.650  1.00 28.22           H  \nATOM    188  HE  ARG A  26      18.133  -3.743  21.793  1.00 29.36           H  \nATOM    189 HH12 ARG A  26      18.610  -5.668  25.334  1.00 33.40           H  \nATOM    190 HH11 ARG A  26      19.982  -5.572  24.262  1.00 33.40           H  \nATOM    191 HH22 ARG A  26      16.568  -4.859  24.687  1.00 32.13           H  \nATOM    192 HH21 ARG A  26      16.379  -4.009  23.175  1.00 32.13           H  \nATOM    193  N   PRO A  27      23.652  -7.395  23.064  1.00 31.04           N  \nATOM    194  CA  PRO A  27      23.677  -7.832  24.471  1.00 34.75           C  \nATOM    195  C   PRO A  27      22.548  -7.213  25.306  1.00 38.49           C  \nATOM    196  O   PRO A  27      21.915  -6.248  24.873  1.00 38.86           O  \nATOM    197  CB  PRO A  27      25.056  -7.353  24.962  1.00 34.27           C  \nATOM    198  CG  PRO A  27      25.342  -6.111  24.137  1.00 33.61           C  \nATOM    199  CD  PRO A  27      24.740  -6.460  22.783  1.00 32.04           C  \nATOM    200  HA  PRO A  27      23.596  -8.916  24.550  1.00 34.75           H  \nATOM    201  HB3 PRO A  27      25.810  -8.110  24.748  1.00 34.27           H  \nATOM    202  HB2 PRO A  27      25.101  -7.153  26.034  1.00 34.27           H  \nATOM    203  HG3 PRO A  27      26.400  -5.854  24.084  1.00 33.61           H  \nATOM    204  HG2 PRO A  27      24.810  -5.259  24.564  1.00 33.61           H  \nATOM    205  HD2 PRO A  27      24.418  -5.557  22.278  1.00 32.04           H  \nATOM    206  HD3 PRO A  27      25.468  -6.964  22.151  1.00 32.04           H  \nATOM    207  N   PHE A  28      22.361  -7.759  26.519  1.00 42.80           N  \nATOM    208  CA  PHE A  28      21.550  -7.130  27.558  1.00 45.58           C  \nATOM    209  C   PHE A  28      22.172  -5.810  28.030  1.00 48.44           C  \nATOM    210  O   PHE A  28      23.350  -5.792  28.395  1.00 50.16           O  \nATOM    211  CB  PHE A  28      21.358  -8.084  28.755  1.00 46.72           C  \nATOM    212  CG  PHE A  28      20.412  -9.250  28.530  1.00 46.51           C  \nATOM    213  CD1 PHE A  28      20.782 -10.554  28.922  1.00 48.45           C  \nATOM    214  CD2 PHE A  28      19.106  -9.029  28.045  1.00 45.93           C  \nATOM    215  CE1 PHE A  28      19.877 -11.597  28.786  1.00 49.91           C  \nATOM    216  CE2 PHE A  28      18.214 -10.080  27.926  1.00 45.72           C  \nATOM    217  CZ  PHE A  28      18.601 -11.357  28.293  1.00 47.71           C  \nATOM    218  H   PHE A  28      22.906  -8.560  26.800  1.00 42.80           H  \nATOM    219  HA  PHE A  28      20.582  -6.909  27.113  1.00 45.58           H  \nATOM    220  HB3 PHE A  28      20.972  -7.535  29.615  1.00 46.72           H  \nATOM    221  HB2 PHE A  28      22.331  -8.471  29.061  1.00 46.72           H  \nATOM    222  HD1 PHE A  28      21.763 -10.747  29.330  1.00 48.45           H  \nATOM    223  HD2 PHE A  28      18.780  -8.044  27.770  1.00 45.93           H  \nATOM    224  HE1 PHE A  28      20.159 -12.596  29.085  1.00 49.91           H  \nATOM    225  HE2 PHE A  28      17.217  -9.903  27.555  1.00 45.72           H  \nATOM    226  HZ  PHE A  28      17.891 -12.159  28.207  1.00 47.71           H  \nATOM    227  N   ASN A  29      21.356  -4.744  28.045  1.00 50.46           N  \nATOM    228  CA  ASN A  29      21.730  -3.436  28.584  1.00 53.78           C  \nATOM    229  C   ASN A  29      21.845  -3.467  30.123  1.00 55.58           C  \nATOM    230  O   ASN A  29      21.491  -4.460  30.761  1.00 55.96           O  \nATOM    231  CB  ASN A  29      20.788  -2.331  28.027  1.00 53.62           C  \nATOM    232  CG  ASN A  29      19.304  -2.428  28.409  1.00 54.79           C  \nATOM    233  OD1 ASN A  29      18.962  -2.562  29.578  1.00 53.72           O  \nATOM    234  ND2 ASN A  29      18.409  -2.325  27.424  1.00 53.06           N  \nATOM    235  H   ASN A  29      20.391  -4.853  27.754  1.00 50.46           H  \nATOM    236  HA  ASN A  29      22.729  -3.210  28.207  1.00 53.78           H  \nATOM    237  HB3 ASN A  29      20.871  -2.323  26.939  1.00 53.62           H  \nATOM    238  HB2 ASN A  29      21.142  -1.352  28.351  1.00 53.62           H  \nATOM    239 HD22 ASN A  29      17.423  -2.390  27.631  1.00 53.06           H  \nATOM    240 HD21 ASN A  29      18.707  -2.207  26.467  1.00 53.06           H  \nATOM    241  N   LEU A  30      22.341  -2.359  30.693  1.00 57.56           N  \nATOM    242  CA  LEU A  30      22.530  -2.164  32.133  1.00 59.64           C  \nATOM    243  C   LEU A  30      21.217  -2.299  32.935  1.00 60.88           C  \nATOM    244  O   LEU A  30      21.245  -2.847  34.034  1.00 62.21           O  \nATOM    245  CB  LEU A  30      23.193  -0.788  32.386  1.00 60.12           C  \nATOM    246  CG  LEU A  30      24.697  -0.689  32.028  1.00 60.89           C  \nATOM    247  CD1 LEU A  30      25.005  -0.909  30.531  1.00 60.86           C  \nATOM    248  CD2 LEU A  30      25.298   0.642  32.525  1.00 62.34           C  \nATOM    249  H   LEU A  30      22.613  -1.583  30.107  1.00 57.56           H  \nATOM    250  HA  LEU A  30      23.203  -2.946  32.490  1.00 59.64           H  \nATOM    251  HB3 LEU A  30      23.099  -0.560  33.450  1.00 60.12           H  \nATOM    252  HB2 LEU A  30      22.635  -0.005  31.869  1.00 60.12           H  \nATOM    253  HG  LEU A  30      25.206  -1.469  32.590  1.00 60.89           H  \nATOM    254 HD11 LEU A  30      25.918  -0.401  30.221  1.00 60.86           H  \nATOM    255 HD12 LEU A  30      25.141  -1.966  30.307  1.00 60.86           H  \nATOM    256 HD13 LEU A  30      24.200  -0.535  29.898  1.00 60.86           H  \nATOM    257 HD21 LEU A  30      26.157   0.462  33.173  1.00 62.34           H  \nATOM    258 HD22 LEU A  30      25.636   1.279  31.708  1.00 62.34           H  \nATOM    259 HD23 LEU A  30      24.580   1.227  33.101  1.00 62.34           H  \nATOM    260  N   ALA A  31      20.094  -1.847  32.350  1.00 61.49           N  \nATOM    261  CA  ALA A  31      18.746  -1.937  32.915  1.00 61.47           C  \nATOM    262  C   ALA A  31      18.064  -3.316  32.763  1.00 60.67           C  \nATOM    263  O   ALA A  31      16.956  -3.472  33.275  1.00 59.44           O  \nATOM    264  CB  ALA A  31      17.889  -0.813  32.311  1.00 63.13           C  \nATOM    265  H   ALA A  31      20.149  -1.452  31.421  1.00 61.49           H  \nATOM    266  HA  ALA A  31      18.815  -1.746  33.986  1.00 61.47           H  \nATOM    267  HB1 ALA A  31      16.896  -0.782  32.762  1.00 63.13           H  \nATOM    268  HB2 ALA A  31      18.348   0.162  32.477  1.00 63.13           H  \nATOM    269  HB3 ALA A  31      17.755  -0.936  31.236  1.00 63.13           H  \nATOM    270  N   GLU A  32      18.716  -4.284  32.093  1.00 60.89           N  \nATOM    271  CA  GLU A  32      18.238  -5.659  31.908  1.00 61.52           C  \nATOM    272  C   GLU A  32      19.019  -6.665  32.769  1.00 61.89           C  \nATOM    273  O   GLU A  32      18.408  -7.600  33.286  1.00 62.53           O  \nATOM    274  CB  GLU A  32      18.311  -6.042  30.413  1.00 60.85           C  \nATOM    275  CG  GLU A  32      17.153  -5.444  29.581  1.00 60.97           C  \nATOM    276  CD  GLU A  32      17.285  -5.627  28.059  1.00 60.90           C  \nATOM    277  OE1 GLU A  32      18.420  -5.548  27.545  1.00 59.14           O  \nATOM    278  OE2 GLU A  32      16.237  -5.813  27.404  1.00 59.59           O1-\nATOM    279  H   GLU A  32      19.606  -4.068  31.665  1.00 60.89           H  \nATOM    280  HA  GLU A  32      17.194  -5.739  32.219  1.00 61.52           H  \nATOM    281  HB3 GLU A  32      18.307  -7.127  30.297  1.00 60.85           H  \nATOM    282  HB2 GLU A  32      19.269  -5.707  30.016  1.00 60.85           H  \nATOM    283  HG3 GLU A  32      17.065  -4.377  29.778  1.00 60.97           H  \nATOM    284  HG2 GLU A  32      16.214  -5.886  29.918  1.00 60.97           H  \nATOM    285  N   ARG A  33      20.340  -6.462  32.926  1.00 62.13           N  \nATOM    286  CA  ARG A  33      21.209  -7.335  33.724  1.00 62.76           C  \nATOM    287  C   ARG A  33      20.979  -7.224  35.241  1.00 63.12           C  \nATOM    288  O   ARG A  33      21.171  -8.225  35.930  1.00 62.75           O  \nATOM    289  CB  ARG A  33      22.684  -7.061  33.394  1.00 62.27           C  \nATOM    290  CG  ARG A  33      23.081  -7.461  31.963  1.00 62.64           C  \nATOM    291  CD  ARG A  33      24.594  -7.388  31.686  1.00 63.34           C  \nATOM    292  NE  ARG A  33      25.108  -6.008  31.607  1.00 64.48           N  \nATOM    293  CZ  ARG A  33      25.614  -5.231  32.585  1.00 65.42           C  \nATOM    294  NH1 ARG A  33      25.669  -5.606  33.872  1.00 65.97           N  \nATOM    295  NH2 ARG A  33      26.099  -4.031  32.252  1.00 64.71           N1+\nATOM    296  H   ARG A  33      20.784  -5.681  32.463  1.00 62.13           H  \nATOM    297  HA  ARG A  33      20.991  -8.369  33.450  1.00 62.76           H  \nATOM    298  HB3 ARG A  33      23.312  -7.627  34.084  1.00 62.27           H  \nATOM    299  HB2 ARG A  33      22.902  -6.006  33.567  1.00 62.27           H  \nATOM    300  HG3 ARG A  33      22.571  -6.784  31.279  1.00 62.64           H  \nATOM    301  HG2 ARG A  33      22.712  -8.456  31.710  1.00 62.64           H  \nATOM    302  HD3 ARG A  33      24.844  -7.946  30.784  1.00 63.34           H  \nATOM    303  HD2 ARG A  33      25.130  -7.890  32.492  1.00 63.34           H  \nATOM    304  HE  ARG A  33      25.048  -5.606  30.681  1.00 64.48           H  \nATOM    305 HH12 ARG A  33      26.068  -4.999  34.573  1.00 65.97           H  \nATOM    306 HH11 ARG A  33      25.321  -6.515  34.144  1.00 65.97           H  \nATOM    307 HH22 ARG A  33      26.501  -3.428  32.955  1.00 64.71           H  \nATOM    308 HH21 ARG A  33      26.088  -3.724  31.290  1.00 64.71           H  \nATOM    309  N   LYS A  34      20.542  -6.049  35.732  1.00 63.45           N  \nATOM    310  CA  LYS A  34      20.125  -5.846  37.126  1.00 64.03           C  \nATOM    311  C   LYS A  34      18.891  -6.680  37.512  1.00 64.60           C  \nATOM    312  O   LYS A  34      18.813  -7.142  38.650  1.00 65.69           O  \nATOM    313  CB  LYS A  34      19.824  -4.358  37.376  1.00 63.62           C  \nATOM    314  CG  LYS A  34      21.065  -3.453  37.415  1.00 64.63           C  \nATOM    315  CD  LYS A  34      20.789  -2.005  37.873  1.00 64.91           C  \nATOM    316  CE  LYS A  34      19.717  -1.227  37.078  1.00 65.86           C  \nATOM    317  NZ  LYS A  34      18.341  -1.488  37.545  1.00 65.56           N1+\nATOM    318  H   LYS A  34      20.419  -5.265  35.107  1.00 63.45           H  \nATOM    319  HA  LYS A  34      20.950  -6.153  37.772  1.00 64.03           H  \nATOM    320  HB3 LYS A  34      19.325  -4.259  38.343  1.00 63.62           H  \nATOM    321  HB2 LYS A  34      19.117  -4.007  36.623  1.00 63.62           H  \nATOM    322  HG3 LYS A  34      21.548  -3.445  36.441  1.00 64.63           H  \nATOM    323  HG2 LYS A  34      21.798  -3.890  38.094  1.00 64.63           H  \nATOM    324  HD3 LYS A  34      21.726  -1.452  37.797  1.00 64.91           H  \nATOM    325  HD2 LYS A  34      20.549  -2.003  38.937  1.00 64.91           H  \nATOM    326  HE3 LYS A  34      19.803  -1.439  36.014  1.00 65.86           H  \nATOM    327  HE2 LYS A  34      19.894  -0.158  37.197  1.00 65.86           H  \nATOM    328  HZ1 LYS A  34      18.263  -1.240  38.522  1.00 65.56           H  \nATOM    329  HZ2 LYS A  34      17.690  -0.934  37.006  1.00 65.56           H  \nATOM    330  HZ3 LYS A  34      18.123  -2.467  37.430  1.00 65.56           H  \nATOM    331  N   ALA A  35      17.971  -6.869  36.550  1.00 64.26           N  \nATOM    332  CA  ALA A  35      16.790  -7.719  36.680  1.00 64.31           C  \nATOM    333  C   ALA A  35      17.092  -9.217  36.489  1.00 64.22           C  \nATOM    334  O   ALA A  35      16.199 -10.028  36.731  1.00 63.88           O  \nATOM    335  CB  ALA A  35      15.740  -7.245  35.661  1.00 63.53           C  \nATOM    336  H   ALA A  35      18.120  -6.462  35.638  1.00 64.26           H  \nATOM    337  HA  ALA A  35      16.372  -7.591  37.681  1.00 64.31           H  \nATOM    338  HB1 ALA A  35      14.813  -7.812  35.755  1.00 63.53           H  \nATOM    339  HB2 ALA A  35      15.494  -6.194  35.812  1.00 63.53           H  \nATOM    340  HB3 ALA A  35      16.093  -7.359  34.636  1.00 63.53           H  \nATOM    341  N   SER A  36      18.322  -9.555  36.050  1.00 64.97           N  \nATOM    342  CA  SER A  36      18.800 -10.899  35.709  1.00 64.87           C  \nATOM    343  C   SER A  36      17.929 -11.548  34.618  1.00 64.00           C  \nATOM    344  O   SER A  36      17.423 -12.656  34.806  1.00 64.70           O  \nATOM    345  CB  SER A  36      18.947 -11.771  36.979  1.00 65.13           C  \nATOM    346  OG  SER A  36      20.030 -11.309  37.760  1.00 65.33           O  \nATOM    347  H   SER A  36      18.995  -8.816  35.901  1.00 64.97           H  \nATOM    348  HA  SER A  36      19.789 -10.778  35.263  1.00 64.87           H  \nATOM    349  HB3 SER A  36      19.168 -12.806  36.714  1.00 65.13           H  \nATOM    350  HB2 SER A  36      18.037 -11.784  37.578  1.00 65.13           H  \nATOM    351  HG  SER A  36      19.806 -10.439  38.101  1.00 65.33           H  \nATOM    352  N   ALA A  37      17.737 -10.805  33.513  1.00 62.61           N  \nATOM    353  CA  ALA A  37      16.912 -11.194  32.371  1.00 60.97           C  \nATOM    354  C   ALA A  37      17.411 -12.488  31.710  1.00 59.83           C  \nATOM    355  O   ALA A  37      18.604 -12.606  31.429  1.00 59.91           O  \nATOM    356  CB  ALA A  37      16.888 -10.037  31.358  1.00 60.54           C  \nATOM    357  H   ALA A  37      18.169  -9.893  33.451  1.00 62.61           H  \nATOM    358  HA  ALA A  37      15.895 -11.351  32.736  1.00 60.97           H  \nATOM    359  HB1 ALA A  37      16.288 -10.288  30.483  1.00 60.54           H  \nATOM    360  HB2 ALA A  37      16.458  -9.138  31.800  1.00 60.54           H  \nATOM    361  HB3 ALA A  37      17.892  -9.787  31.012  1.00 60.54           H  \nATOM    362  N   HIS A  38      16.481 -13.426  31.476  1.00 58.07           N  \nATOM    363  CA  HIS A  38      16.738 -14.670  30.753  1.00 56.37           C  \nATOM    364  C   HIS A  38      16.643 -14.400  29.245  1.00 53.14           C  \nATOM    365  O   HIS A  38      15.660 -13.812  28.788  1.00 52.97           O  \nATOM    366  CB  HIS A  38      15.751 -15.767  31.212  1.00 57.37           C  \nATOM    367  CG  HIS A  38      14.291 -15.485  30.947  1.00 58.33           C  \nATOM    368  ND1 HIS A  38      13.585 -16.074  29.891  1.00 58.82           N  \nATOM    369  CD2 HIS A  38      13.450 -14.624  31.621  1.00 58.28           C  \nATOM    370  CE1 HIS A  38      12.377 -15.531  29.957  1.00 58.75           C  \nATOM    371  NE2 HIS A  38      12.241 -14.664  30.957  1.00 57.35           N  \nATOM    372  H   HIS A  38      15.522 -13.252  31.738  1.00 58.07           H  \nATOM    373  HA  HIS A  38      17.746 -15.016  30.992  1.00 56.37           H  \nATOM    374  HB3 HIS A  38      15.872 -15.941  32.282  1.00 57.37           H  \nATOM    375  HB2 HIS A  38      16.010 -16.711  30.730  1.00 57.37           H  \nATOM    376  HD2 HIS A  38      13.617 -13.990  32.479  1.00 58.28           H  \nATOM    377  HE1 HIS A  38      11.582 -15.745  29.259  1.00 58.75           H  \nATOM    378  HE2 HIS A  38      11.414 -14.125  31.176  1.00 57.35           H  \nATOM    379  N   SER A  39      17.675 -14.828  28.504  1.00 49.89           N  \nATOM    380  CA  SER A  39      17.704 -14.716  27.050  1.00 45.41           C  \nATOM    381  C   SER A  39      16.875 -15.843  26.426  1.00 41.77           C  \nATOM    382  O   SER A  39      17.040 -17.004  26.804  1.00 42.08           O  \nATOM    383  CB  SER A  39      19.161 -14.739  26.551  1.00 45.19           C  \nATOM    384  OG  SER A  39      19.209 -14.520  25.156  1.00 47.29           O  \nATOM    385  H   SER A  39      18.452 -15.303  28.940  1.00 49.89           H  \nATOM    386  HA  SER A  39      17.269 -13.757  26.762  1.00 45.41           H  \nATOM    387  HB3 SER A  39      19.642 -15.690  26.781  1.00 45.19           H  \nATOM    388  HB2 SER A  39      19.745 -13.958  27.038  1.00 45.19           H  \nATOM    389  HG  SER A  39      20.064 -14.807  24.823  1.00 47.29           H  \nATOM    390  N   ILE A  40      16.029 -15.469  25.458  1.00 37.57           N  \nATOM    391  CA  ILE A  40      15.319 -16.412  24.602  1.00 34.91           C  \nATOM    392  C   ILE A  40      16.072 -16.669  23.282  1.00 33.66           C  \nATOM    393  O   ILE A  40      15.690 -17.599  22.583  1.00 33.63           O  \nATOM    394  CB  ILE A  40      13.869 -15.941  24.296  1.00 35.48           C  \nATOM    395  CG1 ILE A  40      13.760 -14.583  23.564  1.00 33.76           C  \nATOM    396  CG2 ILE A  40      13.027 -15.957  25.585  1.00 34.54           C  \nATOM    397  CD1 ILE A  40      12.395 -14.342  22.904  1.00 35.52           C  \nATOM    398  H   ILE A  40      15.953 -14.491  25.210  1.00 37.57           H  \nATOM    399  HA  ILE A  40      15.246 -17.381  25.101  1.00 34.91           H  \nATOM    400  HB  ILE A  40      13.424 -16.682  23.630  1.00 35.48           H  \nATOM    401 HG13 ILE A  40      14.516 -14.505  22.786  1.00 33.76           H  \nATOM    402 HG12 ILE A  40      13.969 -13.775  24.262  1.00 33.76           H  \nATOM    403 HG21 ILE A  40      11.981 -15.719  25.397  1.00 34.54           H  \nATOM    404 HG22 ILE A  40      13.053 -16.939  26.055  1.00 34.54           H  \nATOM    405 HG23 ILE A  40      13.409 -15.238  26.309  1.00 34.54           H  \nATOM    406 HD11 ILE A  40      12.030 -13.338  23.116  1.00 35.52           H  \nATOM    407 HD12 ILE A  40      12.463 -14.437  21.821  1.00 35.52           H  \nATOM    408 HD13 ILE A  40      11.639 -15.044  23.249  1.00 35.52           H  \nATOM    409  N   VAL A  41      17.127 -15.892  22.973  1.00 32.34           N  \nATOM    410  CA  VAL A  41      17.910 -16.023  21.744  1.00 33.13           C  \nATOM    411  C   VAL A  41      19.268 -16.693  22.034  1.00 33.37           C  \nATOM    412  O   VAL A  41      20.004 -16.236  22.908  1.00 33.03           O  \nATOM    413  CB  VAL A  41      18.170 -14.635  21.087  1.00 31.02           C  \nATOM    414  CG1 VAL A  41      19.098 -14.683  19.855  1.00 30.01           C  \nATOM    415  CG2 VAL A  41      16.850 -13.950  20.688  1.00 32.15           C  \nATOM    416  H   VAL A  41      17.427 -15.172  23.616  1.00 32.34           H  \nATOM    417  HA  VAL A  41      17.365 -16.627  21.017  1.00 33.13           H  \nATOM    418  HB  VAL A  41      18.658 -13.993  21.822  1.00 31.02           H  \nATOM    419 HG11 VAL A  41      19.158 -13.711  19.368  1.00 30.01           H  \nATOM    420 HG12 VAL A  41      20.120 -14.963  20.111  1.00 30.01           H  \nATOM    421 HG13 VAL A  41      18.727 -15.398  19.122  1.00 30.01           H  \nATOM    422 HG21 VAL A  41      17.034 -13.002  20.180  1.00 32.15           H  \nATOM    423 HG22 VAL A  41      16.264 -14.575  20.016  1.00 32.15           H  \nATOM    424 HG23 VAL A  41      16.235 -13.727  21.558  1.00 32.15           H  \nATOM    425  N   GLU A  42      19.589 -17.725  21.239  1.00 34.68           N  \nATOM    426  CA  GLU A  42      20.917 -18.330  21.142  1.00 37.62           C  \nATOM    427  C   GLU A  42      21.416 -18.169  19.704  1.00 37.62           C  \nATOM    428  O   GLU A  42      20.675 -18.465  18.768  1.00 37.32           O  \nATOM    429  CB  GLU A  42      20.870 -19.823  21.518  1.00 39.30           C  \nATOM    430  CG  GLU A  42      20.636 -20.073  23.023  1.00 44.83           C  \nATOM    431  CD  GLU A  42      20.549 -21.556  23.429  1.00 48.30           C  \nATOM    432  OE1 GLU A  42      20.972 -22.431  22.640  1.00 49.42           O  \nATOM    433  OE2 GLU A  42      20.044 -21.792  24.548  1.00 47.07           O1-\nATOM    434  H   GLU A  42      18.920 -18.039  20.547  1.00 34.68           H  \nATOM    435  HA  GLU A  42      21.621 -17.826  21.807  1.00 37.62           H  \nATOM    436  HB3 GLU A  42      21.808 -20.295  21.217  1.00 39.30           H  \nATOM    437  HB2 GLU A  42      20.085 -20.318  20.944  1.00 39.30           H  \nATOM    438  HG3 GLU A  42      19.726 -19.565  23.342  1.00 44.83           H  \nATOM    439  HG2 GLU A  42      21.448 -19.620  23.592  1.00 44.83           H  \nATOM    440  N   CYS A  43      22.673 -17.727  19.570  1.00 37.12           N  \nATOM    441  CA  CYS A  43      23.362 -17.537  18.297  1.00 38.66           C  \nATOM    442  C   CYS A  43      24.501 -18.560  18.197  1.00 40.09           C  \nATOM    443  O   CYS A  43      25.208 -18.786  19.180  1.00 40.18           O  \nATOM    444  CB  CYS A  43      23.930 -16.109  18.189  1.00 37.97           C  \nATOM    445  SG  CYS A  43      22.581 -14.923  17.915  1.00 39.98           S  \nATOM    446  H   CYS A  43      23.223 -17.540  20.396  1.00 37.12           H  \nATOM    447  HA  CYS A  43      22.683 -17.703  17.458  1.00 38.66           H  \nATOM    448  HB3 CYS A  43      24.633 -16.027  17.360  1.00 37.97           H  \nATOM    449  HB2 CYS A  43      24.478 -15.833  19.091  1.00 37.97           H  \nATOM    450  HG  CYS A  43      22.271 -15.343  16.686  1.00 39.98           H  \nATOM    451  N   ASP A  44      24.675 -19.122  16.992  1.00 39.18           N  \nATOM    452  CA  ASP A  44      25.745 -20.054  16.646  1.00 39.68           C  \nATOM    453  C   ASP A  44      26.288 -19.598  15.274  1.00 37.75           C  \nATOM    454  O   ASP A  44      25.747 -20.029  14.256  1.00 34.98           O  \nATOM    455  CB  ASP A  44      25.243 -21.526  16.689  1.00 42.51           C  \nATOM    456  CG  ASP A  44      26.304 -22.640  16.552  1.00 45.22           C  \nATOM    457  OD1 ASP A  44      27.392 -22.396  15.984  1.00 46.28           O  \nATOM    458  OD2 ASP A  44      25.957 -23.782  16.927  1.00 48.98           O1-\nATOM    459  H   ASP A  44      24.035 -18.897  16.240  1.00 39.18           H  \nATOM    460  HA  ASP A  44      26.544 -19.997  17.385  1.00 39.68           H  \nATOM    461  HB3 ASP A  44      24.480 -21.676  15.923  1.00 42.51           H  \nATOM    462  HB2 ASP A  44      24.713 -21.677  17.631  1.00 42.51           H  \nATOM    463  N   PRO A  45      27.326 -18.725  15.265  1.00 37.21           N  \nATOM    464  CA  PRO A  45      27.967 -18.229  14.028  1.00 38.23           C  \nATOM    465  C   PRO A  45      28.553 -19.293  13.082  1.00 39.60           C  \nATOM    466  O   PRO A  45      28.496 -19.092  11.869  1.00 38.37           O  \nATOM    467  CB  PRO A  45      29.075 -17.287  14.534  1.00 37.82           C  \nATOM    468  CG  PRO A  45      28.604 -16.837  15.904  1.00 36.47           C  \nATOM    469  CD  PRO A  45      27.909 -18.077  16.443  1.00 37.30           C  \nATOM    470  HA  PRO A  45      27.216 -17.646  13.490  1.00 38.23           H  \nATOM    471  HB3 PRO A  45      29.255 -16.449  13.862  1.00 37.82           H  \nATOM    472  HB2 PRO A  45      30.020 -17.823  14.645  1.00 37.82           H  \nATOM    473  HG3 PRO A  45      27.875 -16.033  15.797  1.00 36.47           H  \nATOM    474  HG2 PRO A  45      29.409 -16.478  16.545  1.00 36.47           H  \nATOM    475  HD2 PRO A  45      28.630 -18.758  16.898  1.00 37.30           H  \nATOM    476  HD3 PRO A  45      27.177 -17.794  17.199  1.00 37.30           H  \nATOM    477  N   VAL A  46      29.099 -20.388  13.643  1.00 40.68           N  \nATOM    478  CA  VAL A  46      29.722 -21.487  12.894  1.00 42.73           C  \nATOM    479  C   VAL A  46      28.687 -22.267  12.062  1.00 44.14           C  \nATOM    480  O   VAL A  46      28.940 -22.553  10.892  1.00 44.76           O  \nATOM    481  CB  VAL A  46      30.458 -22.486  13.837  1.00 45.34           C  \nATOM    482  CG1 VAL A  46      31.100 -23.688  13.109  1.00 45.35           C  \nATOM    483  CG2 VAL A  46      31.527 -21.776  14.687  1.00 45.25           C  \nATOM    484  H   VAL A  46      29.087 -20.492  14.648  1.00 40.68           H  \nATOM    485  HA  VAL A  46      30.452 -21.054  12.208  1.00 42.73           H  \nATOM    486  HB  VAL A  46      29.730 -22.898  14.537  1.00 45.34           H  \nATOM    487 HG11 VAL A  46      31.679 -24.301  13.799  1.00 45.35           H  \nATOM    488 HG12 VAL A  46      30.355 -24.347  12.661  1.00 45.35           H  \nATOM    489 HG13 VAL A  46      31.773 -23.357  12.318  1.00 45.35           H  \nATOM    490 HG21 VAL A  46      32.043 -22.479  15.342  1.00 45.25           H  \nATOM    491 HG22 VAL A  46      32.277 -21.296  14.058  1.00 45.25           H  \nATOM    492 HG23 VAL A  46      31.090 -21.009  15.327  1.00 45.25           H  \nATOM    493  N   ARG A  47      27.526 -22.541  12.678  1.00 43.50           N  \nATOM    494  CA  ARG A  47      26.360 -23.145  12.036  1.00 44.40           C  \nATOM    495  C   ARG A  47      25.573 -22.138  11.171  1.00 43.29           C  \nATOM    496  O   ARG A  47      24.765 -22.558  10.344  1.00 42.55           O  \nATOM    497  CB  ARG A  47      25.470 -23.732  13.148  1.00 46.46           C  \nATOM    498  CG  ARG A  47      24.634 -24.946  12.709  1.00 51.87           C  \nATOM    499  CD  ARG A  47      25.373 -26.293  12.807  1.00 55.57           C  \nATOM    500  NE  ARG A  47      25.573 -26.702  14.211  1.00 59.35           N  \nATOM    501  CZ  ARG A  47      26.228 -27.780  14.675  1.00 61.63           C  \nATOM    502  NH1 ARG A  47      26.815 -28.666  13.855  1.00 62.28           N  \nATOM    503  NH2 ARG A  47      26.297 -27.967  15.999  1.00 61.37           N1+\nATOM    504  H   ARG A  47      27.410 -22.283  13.650  1.00 43.50           H  \nATOM    505  HA  ARG A  47      26.716 -23.954  11.395  1.00 44.40           H  \nATOM    506  HB3 ARG A  47      24.822 -22.955  13.557  1.00 46.46           H  \nATOM    507  HB2 ARG A  47      26.096 -24.040  13.985  1.00 46.46           H  \nATOM    508  HG3 ARG A  47      24.162 -24.818  11.735  1.00 51.87           H  \nATOM    509  HG2 ARG A  47      23.812 -24.987  13.422  1.00 51.87           H  \nATOM    510  HD3 ARG A  47      26.382 -26.156  12.417  1.00 55.57           H  \nATOM    511  HD2 ARG A  47      24.903 -27.063  12.194  1.00 55.57           H  \nATOM    512  HE  ARG A  47      25.181 -26.066  14.893  1.00 59.35           H  \nATOM    513 HH12 ARG A  47      27.304 -29.468  14.225  1.00 62.28           H  \nATOM    514 HH11 ARG A  47      26.768 -28.530  12.856  1.00 62.28           H  \nATOM    515 HH22 ARG A  47      26.780 -28.765  16.383  1.00 61.37           H  \nATOM    516 HH21 ARG A  47      25.881 -27.292  16.627  1.00 61.37           H  \nATOM    517  N   LYS A  48      25.816 -20.833  11.401  1.00 42.41           N  \nATOM    518  CA  LYS A  48      25.125 -19.669  10.841  1.00 40.29           C  \nATOM    519  C   LYS A  48      23.639 -19.630  11.243  1.00 39.93           C  \nATOM    520  O   LYS A  48      22.806 -19.196  10.448  1.00 39.37           O  \nATOM    521  CB  LYS A  48      25.321 -19.575   9.313  1.00 41.78           C  \nATOM    522  CG  LYS A  48      26.783 -19.476   8.864  1.00 43.17           C  \nATOM    523  CD  LYS A  48      26.912 -19.576   7.334  1.00 45.52           C  \nATOM    524  CE  LYS A  48      28.298 -19.179   6.800  1.00 47.46           C  \nATOM    525  NZ  LYS A  48      29.365 -20.080   7.271  1.00 50.93           N1+\nATOM    526  H   LYS A  48      26.512 -20.608  12.099  1.00 42.41           H  \nATOM    527  HA  LYS A  48      25.585 -18.790  11.295  1.00 40.29           H  \nATOM    528  HB3 LYS A  48      24.817 -18.679   8.955  1.00 41.78           H  \nATOM    529  HB2 LYS A  48      24.841 -20.420   8.818  1.00 41.78           H  \nATOM    530  HG3 LYS A  48      27.375 -20.263   9.331  1.00 43.17           H  \nATOM    531  HG2 LYS A  48      27.198 -18.530   9.212  1.00 43.17           H  \nATOM    532  HD3 LYS A  48      26.155 -18.950   6.864  1.00 45.52           H  \nATOM    533  HD2 LYS A  48      26.677 -20.594   7.020  1.00 45.52           H  \nATOM    534  HE3 LYS A  48      28.544 -18.162   7.107  1.00 47.46           H  \nATOM    535  HE2 LYS A  48      28.291 -19.189   5.709  1.00 47.46           H  \nATOM    536  HZ1 LYS A  48      30.254 -19.777   6.901  1.00 50.93           H  \nATOM    537  HZ2 LYS A  48      29.397 -20.063   8.281  1.00 50.93           H  \nATOM    538  HZ3 LYS A  48      29.173 -21.022   6.959  1.00 50.93           H  \nATOM    539  N   GLU A  49      23.340 -20.092  12.468  1.00 38.53           N  \nATOM    540  CA  GLU A  49      21.989 -20.229  12.994  1.00 39.11           C  \nATOM    541  C   GLU A  49      21.716 -19.262  14.143  1.00 37.38           C  \nATOM    542  O   GLU A  49      22.619 -18.913  14.903  1.00 35.68           O  \nATOM    543  CB  GLU A  49      21.744 -21.672  13.470  1.00 41.64           C  \nATOM    544  CG  GLU A  49      21.632 -22.677  12.306  1.00 47.78           C  \nATOM    545  CD  GLU A  49      21.267 -24.114  12.711  1.00 51.12           C  \nATOM    546  OE1 GLU A  49      21.072 -24.382  13.918  1.00 50.60           O  \nATOM    547  OE2 GLU A  49      21.203 -24.946  11.779  1.00 52.69           O1-\nATOM    548  H   GLU A  49      24.088 -20.390  13.081  1.00 38.53           H  \nATOM    549  HA  GLU A  49      21.275 -20.012  12.205  1.00 39.11           H  \nATOM    550  HB3 GLU A  49      20.830 -21.710  14.066  1.00 41.64           H  \nATOM    551  HB2 GLU A  49      22.553 -21.979  14.136  1.00 41.64           H  \nATOM    552  HG3 GLU A  49      22.569 -22.702  11.752  1.00 47.78           H  \nATOM    553  HG2 GLU A  49      20.871 -22.325  11.608  1.00 47.78           H  \nATOM    554  N   VAL A  50      20.431 -18.915  14.258  1.00 35.62           N  \nATOM    555  CA  VAL A  50      19.838 -18.205  15.377  1.00 35.40           C  \nATOM    556  C   VAL A  50      18.571 -18.974  15.785  1.00 35.75           C  \nATOM    557  O   VAL A  50      17.700 -19.221  14.950  1.00 34.76           O  \nATOM    558  CB  VAL A  50      19.523 -16.727  15.021  1.00 35.70           C  \nATOM    559  CG1 VAL A  50      18.625 -16.548  13.786  1.00 37.29           C  \nATOM    560  CG2 VAL A  50      18.952 -15.935  16.210  1.00 33.58           C  \nATOM    561  H   VAL A  50      19.773 -19.247  13.564  1.00 35.62           H  \nATOM    562  HA  VAL A  50      20.536 -18.211  16.215  1.00 35.40           H  \nATOM    563  HB  VAL A  50      20.481 -16.267  14.772  1.00 35.70           H  \nATOM    564 HG11 VAL A  50      18.651 -15.512  13.455  1.00 37.29           H  \nATOM    565 HG12 VAL A  50      18.971 -17.152  12.949  1.00 37.29           H  \nATOM    566 HG13 VAL A  50      17.586 -16.808  13.984  1.00 37.29           H  \nATOM    567 HG21 VAL A  50      18.835 -14.883  15.954  1.00 33.58           H  \nATOM    568 HG22 VAL A  50      17.976 -16.305  16.524  1.00 33.58           H  \nATOM    569 HG23 VAL A  50      19.625 -15.992  17.065  1.00 33.58           H  \nATOM    570  N   SER A  51      18.531 -19.373  17.063  1.00 34.36           N  \nATOM    571  CA  SER A  51      17.468 -20.172  17.656  1.00 34.46           C  \nATOM    572  C   SER A  51      16.752 -19.323  18.711  1.00 35.79           C  \nATOM    573  O   SER A  51      17.421 -18.742  19.564  1.00 35.89           O  \nATOM    574  CB  SER A  51      18.094 -21.444  18.258  1.00 37.01           C  \nATOM    575  OG  SER A  51      17.089 -22.332  18.698  1.00 39.31           O  \nATOM    576  H   SER A  51      19.288 -19.117  17.685  1.00 34.36           H  \nATOM    577  HA  SER A  51      16.753 -20.474  16.893  1.00 34.46           H  \nATOM    578  HB3 SER A  51      18.754 -21.205  19.092  1.00 37.01           H  \nATOM    579  HB2 SER A  51      18.702 -21.958  17.512  1.00 37.01           H  \nATOM    580  HG  SER A  51      16.696 -22.752  17.929  1.00 39.31           H  \nATOM    581  N   VAL A  52      15.415 -19.273  18.632  1.00 34.84           N  \nATOM    582  CA  VAL A  52      14.570 -18.466  19.509  1.00 36.07           C  \nATOM    583  C   VAL A  52      13.629 -19.387  20.295  1.00 36.69           C  \nATOM    584  O   VAL A  52      12.938 -20.195  19.682  1.00 39.27           O  \nATOM    585  CB  VAL A  52      13.694 -17.470  18.700  1.00 35.47           C  \nATOM    586  CG1 VAL A  52      12.754 -16.624  19.585  1.00 35.27           C  \nATOM    587  CG2 VAL A  52      14.562 -16.535  17.847  1.00 35.83           C  \nATOM    588  H   VAL A  52      14.937 -19.779  17.897  1.00 34.84           H  \nATOM    589  HA  VAL A  52      15.179 -17.887  20.200  1.00 36.07           H  \nATOM    590  HB  VAL A  52      13.066 -18.031  18.006  1.00 35.47           H  \nATOM    591 HG11 VAL A  52      12.254 -15.847  19.008  1.00 35.27           H  \nATOM    592 HG12 VAL A  52      11.970 -17.226  20.044  1.00 35.27           H  \nATOM    593 HG13 VAL A  52      13.310 -16.132  20.384  1.00 35.27           H  \nATOM    594 HG21 VAL A  52      13.940 -15.795  17.347  1.00 35.83           H  \nATOM    595 HG22 VAL A  52      15.292 -16.000  18.453  1.00 35.83           H  \nATOM    596 HG23 VAL A  52      15.104 -17.079  17.073  1.00 35.83           H  \nATOM    597  N   ARG A  53      13.596 -19.219  21.626  1.00 38.55           N  \nATOM    598  CA  ARG A  53      12.708 -19.929  22.540  1.00 41.08           C  \nATOM    599  C   ARG A  53      11.301 -19.320  22.495  1.00 42.23           C  \nATOM    600  O   ARG A  53      11.147 -18.142  22.817  1.00 42.18           O  \nATOM    601  CB  ARG A  53      13.308 -19.884  23.957  1.00 42.63           C  \nATOM    602  CG  ARG A  53      12.695 -20.937  24.895  1.00 47.38           C  \nATOM    603  CD  ARG A  53      13.301 -20.956  26.312  1.00 50.43           C  \nATOM    604  NE  ARG A  53      12.954 -19.765  27.106  1.00 55.27           N  \nATOM    605  CZ  ARG A  53      11.773 -19.503  27.694  1.00 56.95           C  \nATOM    606  NH1 ARG A  53      10.725 -20.334  27.608  1.00 59.72           N  \nATOM    607  NH2 ARG A  53      11.635 -18.378  28.398  1.00 58.53           N1+\nATOM    608  H   ARG A  53      14.210 -18.533  22.048  1.00 38.55           H  \nATOM    609  HA  ARG A  53      12.663 -20.969  22.216  1.00 41.08           H  \nATOM    610  HB3 ARG A  53      13.209 -18.887  24.384  1.00 42.63           H  \nATOM    611  HB2 ARG A  53      14.378 -20.065  23.894  1.00 42.63           H  \nATOM    612  HG3 ARG A  53      12.747 -21.932  24.454  1.00 47.38           H  \nATOM    613  HG2 ARG A  53      11.632 -20.710  24.970  1.00 47.38           H  \nATOM    614  HD3 ARG A  53      14.386 -20.910  26.218  1.00 50.43           H  \nATOM    615  HD2 ARG A  53      13.092 -21.887  26.839  1.00 50.43           H  \nATOM    616  HE  ARG A  53      13.688 -19.077  27.192  1.00 55.27           H  \nATOM    617 HH12 ARG A  53       9.863 -20.138  28.096  1.00 59.72           H  \nATOM    618 HH11 ARG A  53      10.810 -21.196  27.087  1.00 59.72           H  \nATOM    619 HH22 ARG A  53      10.759 -18.164  28.851  1.00 58.53           H  \nATOM    620 HH21 ARG A  53      12.418 -17.748  28.518  1.00 58.53           H  \nATOM    621  N   THR A  54      10.315 -20.130  22.084  1.00 44.25           N  \nATOM    622  CA  THR A  54       8.952 -19.675  21.795  1.00 46.39           C  \nATOM    623  C   THR A  54       7.912 -20.111  22.851  1.00 48.51           C  \nATOM    624  O   THR A  54       6.730 -19.818  22.669  1.00 47.93           O  \nATOM    625  CB  THR A  54       8.506 -20.154  20.387  1.00 46.41           C  \nATOM    626  OG1 THR A  54       8.198 -21.537  20.340  1.00 47.70           O  \nATOM    627  CG2 THR A  54       9.533 -19.812  19.297  1.00 45.46           C  \nATOM    628  H   THR A  54      10.518 -21.093  21.852  1.00 44.25           H  \nATOM    629  HA  THR A  54       8.923 -18.586  21.777  1.00 46.39           H  \nATOM    630  HB  THR A  54       7.588 -19.621  20.132  1.00 46.41           H  \nATOM    631  HG1 THR A  54       7.416 -21.688  20.879  1.00 47.70           H  \nATOM    632 HG21 THR A  54       9.094 -19.880  18.307  1.00 45.46           H  \nATOM    633 HG22 THR A  54       9.909 -18.794  19.410  1.00 45.46           H  \nATOM    634 HG23 THR A  54      10.385 -20.489  19.326  1.00 45.46           H  \nATOM    635  N   GLY A  55       8.352 -20.762  23.938  1.00 50.52           N  \nATOM    636  CA  GLY A  55       7.480 -21.176  25.034  1.00 54.71           C  \nATOM    637  C   GLY A  55       8.156 -22.294  25.833  1.00 58.31           C  \nATOM    638  O   GLY A  55       9.194 -22.820  25.432  1.00 58.28           O  \nATOM    639  H   GLY A  55       9.332 -20.992  24.022  1.00 50.52           H  \nATOM    640  HA3 GLY A  55       6.524 -21.542  24.657  1.00 54.71           H  \nATOM    641  HA2 GLY A  55       7.282 -20.322  25.684  1.00 54.71           H  \nATOM    642  N   GLY A  56       7.548 -22.653  26.974  1.00 60.67           N  \nATOM    643  CA  GLY A  56       8.051 -23.681  27.884  1.00 63.02           C  \nATOM    644  C   GLY A  56       8.911 -23.040  28.982  1.00 64.97           C  \nATOM    645  O   GLY A  56       8.605 -21.952  29.470  1.00 66.30           O  \nATOM    646  H   GLY A  56       6.699 -22.182  27.251  1.00 60.67           H  \nATOM    647  HA3 GLY A  56       8.609 -24.451  27.350  1.00 63.02           H  \nATOM    648  HA2 GLY A  56       7.202 -24.178  28.355  1.00 63.02           H  \nATOM    649  N   LEU A  57       9.960 -23.767  29.392  1.00 65.39           N  \nATOM    650  CA  LEU A  57      10.880 -23.457  30.487  1.00 66.24           C  \nATOM    651  C   LEU A  57      12.337 -23.533  29.994  1.00 66.92           C  \nATOM    652  O   LEU A  57      12.604 -24.014  28.895  1.00 67.15           O  \nATOM    653  CB  LEU A  57      10.671 -24.493  31.629  1.00 65.98           C  \nATOM    654  CG  LEU A  57       9.336 -24.417  32.408  1.00 66.38           C  \nATOM    655  CD1 LEU A  57       9.050 -23.014  32.978  1.00 66.32           C  \nATOM    656  CD2 LEU A  57       8.135 -25.026  31.654  1.00 66.04           C  \nATOM    657  H   LEU A  57      10.144 -24.652  28.934  1.00 65.39           H  \nATOM    658  HA  LEU A  57      10.716 -22.442  30.850  1.00 66.24           H  \nATOM    659  HB3 LEU A  57      11.462 -24.359  32.369  1.00 65.98           H  \nATOM    660  HB2 LEU A  57      10.814 -25.505  31.246  1.00 65.98           H  \nATOM    661  HG  LEU A  57       9.490 -25.064  33.273  1.00 66.38           H  \nATOM    662 HD11 LEU A  57       8.654 -23.084  33.991  1.00 66.32           H  \nATOM    663 HD12 LEU A  57       9.951 -22.404  33.034  1.00 66.32           H  \nATOM    664 HD13 LEU A  57       8.323 -22.467  32.379  1.00 66.32           H  \nATOM    665 HD21 LEU A  57       7.600 -25.731  32.291  1.00 66.04           H  \nATOM    666 HD22 LEU A  57       7.417 -24.270  31.337  1.00 66.04           H  \nATOM    667 HD23 LEU A  57       8.444 -25.576  30.766  1.00 66.04           H  \nATOM    668  N   ALA A  58      13.282 -23.106  30.847  1.00 67.23           N  \nATOM    669  CA  ALA A  58      14.722 -23.288  30.626  1.00 66.48           C  \nATOM    670  C   ALA A  58      15.191 -24.760  30.712  1.00 65.87           C  \nATOM    671  O   ALA A  58      16.263 -25.069  30.194  1.00 66.21           O  \nATOM    672  CB  ALA A  58      15.487 -22.411  31.626  1.00 67.06           C  \nATOM    673  H   ALA A  58      13.015 -22.712  31.737  1.00 67.23           H  \nATOM    674  HA  ALA A  58      14.957 -22.932  29.621  1.00 66.48           H  \nATOM    675  HB1 ALA A  58      16.565 -22.487  31.477  1.00 67.06           H  \nATOM    676  HB2 ALA A  58      15.218 -21.360  31.512  1.00 67.06           H  \nATOM    677  HB3 ALA A  58      15.274 -22.698  32.657  1.00 67.06           H  \nATOM    678  N   ASP A  59      14.380 -25.629  31.341  1.00 64.61           N  \nATOM    679  CA  ASP A  59      14.613 -27.069  31.489  1.00 62.91           C  \nATOM    680  C   ASP A  59      14.027 -27.872  30.301  1.00 61.47           C  \nATOM    681  O   ASP A  59      14.523 -28.958  30.004  1.00 60.79           O  \nATOM    682  CB  ASP A  59      14.013 -27.543  32.841  1.00 64.61           C  \nATOM    683  CG  ASP A  59      14.357 -28.965  33.326  1.00 65.60           C  \nATOM    684  OD1 ASP A  59      13.610 -29.438  34.211  1.00 65.91           O  \nATOM    685  OD2 ASP A  59      15.424 -29.494  32.945  1.00 67.03           O1-\nATOM    686  H   ASP A  59      13.523 -25.285  31.747  1.00 64.61           H  \nATOM    687  HA  ASP A  59      15.691 -27.240  31.504  1.00 62.91           H  \nATOM    688  HB3 ASP A  59      12.928 -27.426  32.808  1.00 64.61           H  \nATOM    689  HB2 ASP A  59      14.339 -26.855  33.623  1.00 64.61           H  \nATOM    690  N   LYS A  60      12.988 -27.332  29.640  1.00 60.27           N  \nATOM    691  CA  LYS A  60      12.234 -27.994  28.574  1.00 58.55           C  \nATOM    692  C   LYS A  60      11.502 -26.919  27.763  1.00 57.58           C  \nATOM    693  O   LYS A  60      10.641 -26.249  28.329  1.00 58.16           O  \nATOM    694  CB  LYS A  60      11.246 -29.008  29.208  1.00 58.27           C  \nATOM    695  CG  LYS A  60      10.230 -29.648  28.237  1.00 57.51           C  \nATOM    696  CD  LYS A  60       9.083 -30.356  28.971  1.00 57.75           C  \nATOM    697  CE  LYS A  60       7.980 -30.820  28.007  1.00 57.66           C  \nATOM    698  NZ  LYS A  60       6.835 -31.403  28.728  1.00 59.13           N1+\nATOM    699  H   LYS A  60      12.654 -26.418  29.908  1.00 60.27           H  \nATOM    700  HA  LYS A  60      12.925 -28.524  27.916  1.00 58.55           H  \nATOM    701  HB3 LYS A  60      10.685 -28.487  29.985  1.00 58.27           H  \nATOM    702  HB2 LYS A  60      11.796 -29.797  29.723  1.00 58.27           H  \nATOM    703  HG3 LYS A  60      10.746 -30.354  27.585  1.00 57.51           H  \nATOM    704  HG2 LYS A  60       9.787 -28.901  27.578  1.00 57.51           H  \nATOM    705  HD3 LYS A  60       8.663 -29.680  29.719  1.00 57.75           H  \nATOM    706  HD2 LYS A  60       9.484 -31.210  29.519  1.00 57.75           H  \nATOM    707  HE3 LYS A  60       8.374 -31.558  27.308  1.00 57.66           H  \nATOM    708  HE2 LYS A  60       7.615 -29.979  27.416  1.00 57.66           H  \nATOM    709  HZ1 LYS A  60       6.441 -30.714  29.352  1.00 59.13           H  \nATOM    710  HZ2 LYS A  60       6.132 -31.697  28.064  1.00 59.13           H  \nATOM    711  HZ3 LYS A  60       7.144 -32.202  29.263  1.00 59.13           H  \nATOM    712  N   SER A  61      11.804 -26.800  26.461  1.00 55.59           N  \nATOM    713  CA  SER A  61      11.184 -25.804  25.584  1.00 52.94           C  \nATOM    714  C   SER A  61      11.201 -26.196  24.105  1.00 51.62           C  \nATOM    715  O   SER A  61      12.091 -26.917  23.654  1.00 50.85           O  \nATOM    716  CB  SER A  61      11.836 -24.420  25.787  1.00 53.73           C  \nATOM    717  OG  SER A  61      13.243 -24.448  25.640  1.00 53.69           O  \nATOM    718  H   SER A  61      12.502 -27.395  26.037  1.00 55.59           H  \nATOM    719  HA  SER A  61      10.130 -25.722  25.859  1.00 52.94           H  \nATOM    720  HB3 SER A  61      11.550 -23.993  26.742  1.00 53.73           H  \nATOM    721  HB2 SER A  61      11.464 -23.725  25.037  1.00 53.73           H  \nATOM    722  HG  SER A  61      13.613 -24.916  26.393  1.00 53.69           H  \nATOM    723  N   SER A  62      10.226 -25.619  23.385  1.00 49.47           N  \nATOM    724  CA  SER A  62      10.166 -25.547  21.930  1.00 48.07           C  \nATOM    725  C   SER A  62      10.924 -24.301  21.439  1.00 46.24           C  \nATOM    726  O   SER A  62      10.928 -23.273  22.124  1.00 45.55           O  \nATOM    727  CB  SER A  62       8.681 -25.529  21.509  1.00 47.76           C  \nATOM    728  OG  SER A  62       8.012 -24.350  21.921  1.00 48.25           O  \nATOM    729  H   SER A  62       9.546 -25.042  23.859  1.00 49.47           H  \nATOM    730  HA  SER A  62      10.634 -26.439  21.509  1.00 48.07           H  \nATOM    731  HB3 SER A  62       8.157 -26.394  21.918  1.00 47.76           H  \nATOM    732  HB2 SER A  62       8.601 -25.603  20.423  1.00 47.76           H  \nATOM    733  HG  SER A  62       8.378 -23.607  21.434  1.00 48.25           H  \nATOM    734  N   ARG A  63      11.545 -24.421  20.255  1.00 44.90           N  \nATOM    735  CA  ARG A  63      12.338 -23.359  19.639  1.00 44.08           C  \nATOM    736  C   ARG A  63      12.109 -23.317  18.121  1.00 42.93           C  \nATOM    737  O   ARG A  63      11.867 -24.360  17.511  1.00 42.40           O  \nATOM    738  CB  ARG A  63      13.844 -23.546  19.956  1.00 45.10           C  \nATOM    739  CG  ARG A  63      14.193 -23.757  21.448  1.00 45.50           C  \nATOM    740  CD  ARG A  63      15.702 -23.796  21.744  1.00 47.24           C  \nATOM    741  NE  ARG A  63      16.331 -22.470  21.625  1.00 48.56           N  \nATOM    742  CZ  ARG A  63      16.618 -21.599  22.607  1.00 50.82           C  \nATOM    743  NH1 ARG A  63      17.148 -20.416  22.281  1.00 50.08           N  \nATOM    744  NH2 ARG A  63      16.394 -21.879  23.899  1.00 53.19           N1+\nATOM    745  H   ARG A  63      11.485 -25.284  19.733  1.00 44.90           H  \nATOM    746  HA  ARG A  63      11.999 -22.409  20.047  1.00 44.08           H  \nATOM    747  HB3 ARG A  63      14.386 -22.681  19.572  1.00 45.10           H  \nATOM    748  HB2 ARG A  63      14.222 -24.405  19.400  1.00 45.10           H  \nATOM    749  HG3 ARG A  63      13.721 -24.643  21.872  1.00 45.50           H  \nATOM    750  HG2 ARG A  63      13.765 -22.912  21.986  1.00 45.50           H  \nATOM    751  HD3 ARG A  63      16.183 -24.375  20.955  1.00 47.24           H  \nATOM    752  HD2 ARG A  63      15.931 -24.323  22.671  1.00 47.24           H  \nATOM    753  HE  ARG A  63      16.567 -22.205  20.675  1.00 48.56           H  \nATOM    754 HH12 ARG A  63      17.389 -19.747  22.998  1.00 50.08           H  \nATOM    755 HH11 ARG A  63      17.317 -20.176  21.313  1.00 50.08           H  \nATOM    756 HH22 ARG A  63      16.697 -21.240  24.619  1.00 53.19           H  \nATOM    757 HH21 ARG A  63      16.017 -22.779  24.158  1.00 53.19           H  \nATOM    758  N   LYS A  64      12.243 -22.113  17.542  1.00 42.57           N  \nATOM    759  CA  LYS A  64      12.290 -21.874  16.099  1.00 41.26           C  \nATOM    760  C   LYS A  64      13.727 -21.515  15.707  1.00 38.78           C  \nATOM    761  O   LYS A  64      14.285 -20.579  16.277  1.00 38.88           O  \nATOM    762  CB  LYS A  64      11.341 -20.719  15.719  1.00 43.63           C  \nATOM    763  CG  LYS A  64       9.853 -21.103  15.742  1.00 47.59           C  \nATOM    764  CD  LYS A  64       8.963 -19.947  15.245  1.00 49.93           C  \nATOM    765  CE  LYS A  64       7.452 -20.233  15.277  1.00 51.92           C  \nATOM    766  NZ  LYS A  64       6.896 -20.212  16.643  1.00 52.03           N1+\nATOM    767  H   LYS A  64      12.452 -21.312  18.124  1.00 42.57           H  \nATOM    768  HA  LYS A  64      11.987 -22.768  15.550  1.00 41.26           H  \nATOM    769  HB3 LYS A  64      11.573 -20.396  14.702  1.00 43.63           H  \nATOM    770  HB2 LYS A  64      11.521 -19.851  16.356  1.00 43.63           H  \nATOM    771  HG3 LYS A  64       9.567 -21.418  16.744  1.00 47.59           H  \nATOM    772  HG2 LYS A  64       9.698 -21.971  15.100  1.00 47.59           H  \nATOM    773  HD3 LYS A  64       9.240 -19.718  14.216  1.00 49.93           H  \nATOM    774  HD2 LYS A  64       9.182 -19.042  15.811  1.00 49.93           H  \nATOM    775  HE3 LYS A  64       7.235 -21.193  14.807  1.00 51.92           H  \nATOM    776  HE2 LYS A  64       6.929 -19.471  14.698  1.00 51.92           H  \nATOM    777  HZ1 LYS A  64       7.349 -20.921  17.203  1.00 52.03           H  \nATOM    778  HZ2 LYS A  64       7.054 -19.304  17.057  1.00 52.03           H  \nATOM    779  HZ3 LYS A  64       5.904 -20.396  16.605  1.00 52.03           H  \nATOM    780  N   THR A  65      14.279 -22.251  14.731  1.00 38.63           N  \nATOM    781  CA  THR A  65      15.624 -22.045  14.195  1.00 37.37           C  \nATOM    782  C   THR A  65      15.543 -21.489  12.763  1.00 37.22           C  \nATOM    783  O   THR A  65      14.638 -21.840  12.004  1.00 36.21           O  \nATOM    784  CB  THR A  65      16.422 -23.376  14.149  1.00 38.99           C  \nATOM    785  OG1 THR A  65      15.835 -24.338  13.291  1.00 41.01           O  \nATOM    786  CG2 THR A  65      16.615 -24.005  15.536  1.00 37.71           C  \nATOM    787  H   THR A  65      13.750 -22.996  14.299  1.00 38.63           H  \nATOM    788  HA  THR A  65      16.176 -21.339  14.813  1.00 37.37           H  \nATOM    789  HB  THR A  65      17.416 -23.169  13.748  1.00 38.99           H  \nATOM    790  HG1 THR A  65      15.820 -23.986  12.397  1.00 41.01           H  \nATOM    791 HG21 THR A  65      17.197 -24.926  15.470  1.00 37.71           H  \nATOM    792 HG22 THR A  65      17.158 -23.326  16.189  1.00 37.71           H  \nATOM    793 HG23 THR A  65      15.664 -24.247  16.012  1.00 37.71           H  \nATOM    794  N   TYR A  66      16.520 -20.633  12.437  1.00 35.89           N  \nATOM    795  CA  TYR A  66      16.673 -19.986  11.139  1.00 35.61           C  \nATOM    796  C   TYR A  66      18.160 -19.982  10.792  1.00 34.68           C  \nATOM    797  O   TYR A  66      18.961 -19.578  11.634  1.00 34.69           O  \nATOM    798  CB  TYR A  66      16.185 -18.525  11.219  1.00 35.24           C  \nATOM    799  CG  TYR A  66      14.757 -18.318  11.670  1.00 35.81           C  \nATOM    800  CD1 TYR A  66      14.474 -18.140  13.042  1.00 36.83           C  \nATOM    801  CD2 TYR A  66      13.711 -18.298  10.726  1.00 36.87           C  \nATOM    802  CE1 TYR A  66      13.147 -17.964  13.471  1.00 37.60           C  \nATOM    803  CE2 TYR A  66      12.385 -18.118  11.157  1.00 38.67           C  \nATOM    804  CZ  TYR A  66      12.101 -17.957  12.529  1.00 38.55           C  \nATOM    805  OH  TYR A  66      10.815 -17.800  12.953  1.00 40.55           O  \nATOM    806  H   TYR A  66      17.215 -20.385  13.128  1.00 35.89           H  \nATOM    807  HA  TYR A  66      16.119 -20.521  10.365  1.00 35.61           H  \nATOM    808  HB3 TYR A  66      16.315 -18.038  10.252  1.00 35.24           H  \nATOM    809  HB2 TYR A  66      16.813 -17.985  11.926  1.00 35.24           H  \nATOM    810  HD1 TYR A  66      15.272 -18.152  13.770  1.00 36.83           H  \nATOM    811  HD2 TYR A  66      13.922 -18.428   9.675  1.00 36.87           H  \nATOM    812  HE1 TYR A  66      12.933 -17.841  14.523  1.00 37.60           H  \nATOM    813  HE2 TYR A  66      11.590 -18.115  10.428  1.00 38.67           H  \nATOM    814  HH  TYR A  66      10.173 -17.850  12.234  1.00 40.55           H  \nATOM    815  N   THR A  67      18.492 -20.370   9.553  1.00 34.56           N  \nATOM    816  CA  THR A  67      19.838 -20.225   9.001  1.00 35.90           C  \nATOM    817  C   THR A  67      19.908 -18.928   8.175  1.00 34.33           C  \nATOM    818  O   THR A  67      18.936 -18.573   7.507  1.00 36.54           O  \nATOM    819  CB  THR A  67      20.212 -21.422   8.088  1.00 35.84           C  \nATOM    820  OG1 THR A  67      20.182 -22.608   8.859  1.00 40.38           O  \nATOM    821  CG2 THR A  67      21.604 -21.340   7.430  1.00 38.08           C  \nATOM    822  H   THR A  67      17.781 -20.696   8.915  1.00 34.56           H  \nATOM    823  HA  THR A  67      20.568 -20.176   9.809  1.00 35.90           H  \nATOM    824  HB  THR A  67      19.461 -21.532   7.303  1.00 35.84           H  \nATOM    825  HG1 THR A  67      20.919 -22.602   9.475  1.00 40.38           H  \nATOM    826 HG21 THR A  67      21.846 -22.267   6.910  1.00 38.08           H  \nATOM    827 HG22 THR A  67      21.661 -20.541   6.690  1.00 38.08           H  \nATOM    828 HG23 THR A  67      22.384 -21.164   8.173  1.00 38.08           H  \nATOM    829  N   PHE A  68      21.066 -18.259   8.238  1.00 33.30           N  \nATOM    830  CA  PHE A  68      21.389 -17.033   7.511  1.00 34.46           C  \nATOM    831  C   PHE A  68      22.759 -17.169   6.829  1.00 35.45           C  \nATOM    832  O   PHE A  68      23.421 -18.194   6.989  1.00 35.78           O  \nATOM    833  CB  PHE A  68      21.330 -15.843   8.491  1.00 32.88           C  \nATOM    834  CG  PHE A  68      19.921 -15.483   8.914  1.00 32.39           C  \nATOM    835  CD1 PHE A  68      19.367 -16.013  10.098  1.00 30.02           C  \nATOM    836  CD2 PHE A  68      19.095 -14.754   8.036  1.00 32.12           C  \nATOM    837  CE1 PHE A  68      18.043 -15.746  10.414  1.00 32.75           C  \nATOM    838  CE2 PHE A  68      17.775 -14.503   8.376  1.00 32.46           C  \nATOM    839  CZ  PHE A  68      17.250 -14.992   9.562  1.00 30.39           C  \nATOM    840  H   PHE A  68      21.812 -18.624   8.818  1.00 33.30           H  \nATOM    841  HA  PHE A  68      20.670 -16.864   6.708  1.00 34.46           H  \nATOM    842  HB3 PHE A  68      21.772 -14.953   8.047  1.00 32.88           H  \nATOM    843  HB2 PHE A  68      21.927 -16.056   9.378  1.00 32.88           H  \nATOM    844  HD1 PHE A  68      19.971 -16.617  10.760  1.00 30.02           H  \nATOM    845  HD2 PHE A  68      19.488 -14.390   7.099  1.00 32.12           H  \nATOM    846  HE1 PHE A  68      17.621 -16.109  11.333  1.00 32.75           H  \nATOM    847  HE2 PHE A  68      17.161 -13.925   7.710  1.00 32.46           H  \nATOM    848  HZ  PHE A  68      16.224 -14.788   9.826  1.00 30.39           H  \nATOM    849  N   ASP A  69      23.163 -16.140   6.066  1.00 35.34           N  \nATOM    850  CA  ASP A  69      24.493 -16.049   5.450  1.00 36.28           C  \nATOM    851  C   ASP A  69      25.610 -15.856   6.493  1.00 36.61           C  \nATOM    852  O   ASP A  69      26.680 -16.434   6.315  1.00 37.28           O  \nATOM    853  CB  ASP A  69      24.591 -14.990   4.326  1.00 36.93           C  \nATOM    854  CG  ASP A  69      23.641 -15.265   3.149  1.00 38.87           C  \nATOM    855  OD1 ASP A  69      22.434 -14.959   3.276  1.00 40.13           O  \nATOM    856  OD2 ASP A  69      24.112 -15.913   2.188  1.00 42.22           O1-\nATOM    857  H   ASP A  69      22.567 -15.331   5.942  1.00 35.34           H  \nATOM    858  HA  ASP A  69      24.684 -17.016   4.980  1.00 36.28           H  \nATOM    859  HB3 ASP A  69      25.615 -14.931   3.951  1.00 36.93           H  \nATOM    860  HB2 ASP A  69      24.363 -14.000   4.722  1.00 36.93           H  \nATOM    861  N   MET A  70      25.328 -15.109   7.573  1.00 36.59           N  \nATOM    862  CA  MET A  70      26.141 -15.024   8.791  1.00 35.56           C  \nATOM    863  C   MET A  70      25.221 -14.753   9.990  1.00 34.74           C  \nATOM    864  O   MET A  70      24.092 -14.298   9.811  1.00 31.88           O  \nATOM    865  CB  MET A  70      27.245 -13.939   8.688  1.00 39.47           C  \nATOM    866  CG  MET A  70      28.322 -14.212   7.626  1.00 45.06           C  \nATOM    867  SD  MET A  70      29.760 -13.111   7.657  1.00 51.52           S  \nATOM    868  CE  MET A  70      29.062 -11.670   6.820  1.00 51.68           C  \nATOM    869  H   MET A  70      24.422 -14.665   7.634  1.00 36.59           H  \nATOM    870  HA  MET A  70      26.610 -15.994   8.966  1.00 35.56           H  \nATOM    871  HB3 MET A  70      27.748 -13.844   9.652  1.00 39.47           H  \nATOM    872  HB2 MET A  70      26.797 -12.965   8.505  1.00 39.47           H  \nATOM    873  HG3 MET A  70      27.894 -14.157   6.626  1.00 45.06           H  \nATOM    874  HG2 MET A  70      28.697 -15.228   7.752  1.00 45.06           H  \nATOM    875  HE1 MET A  70      29.856 -10.977   6.548  1.00 51.68           H  \nATOM    876  HE2 MET A  70      28.535 -11.960   5.911  1.00 51.68           H  \nATOM    877  HE3 MET A  70      28.369 -11.165   7.488  1.00 51.68           H  \nATOM    878  N   VAL A  71      25.721 -15.024  11.204  1.00 32.66           N  \nATOM    879  CA  VAL A  71      25.039 -14.676  12.450  1.00 31.78           C  \nATOM    880  C   VAL A  71      26.083 -14.187  13.464  1.00 32.81           C  \nATOM    881  O   VAL A  71      27.161 -14.770  13.568  1.00 31.61           O  \nATOM    882  CB  VAL A  71      24.218 -15.858  13.050  1.00 31.25           C  \nATOM    883  CG1 VAL A  71      23.634 -15.563  14.447  1.00 33.70           C  \nATOM    884  CG2 VAL A  71      23.070 -16.276  12.115  1.00 33.69           C  \nATOM    885  H   VAL A  71      26.654 -15.397  11.301  1.00 32.66           H  \nATOM    886  HA  VAL A  71      24.354 -13.848  12.264  1.00 31.78           H  \nATOM    887  HB  VAL A  71      24.876 -16.723  13.154  1.00 31.25           H  \nATOM    888 HG11 VAL A  71      22.986 -16.367  14.791  1.00 33.70           H  \nATOM    889 HG12 VAL A  71      24.415 -15.453  15.197  1.00 33.70           H  \nATOM    890 HG13 VAL A  71      23.042 -14.647  14.442  1.00 33.70           H  \nATOM    891 HG21 VAL A  71      22.454 -17.056  12.556  1.00 33.69           H  \nATOM    892 HG22 VAL A  71      22.414 -15.436  11.887  1.00 33.69           H  \nATOM    893 HG23 VAL A  71      23.449 -16.666  11.172  1.00 33.69           H  \nATOM    894  N   PHE A  72      25.719 -13.119  14.185  1.00 31.41           N  \nATOM    895  CA  PHE A  72      26.526 -12.450  15.196  1.00 30.44           C  \nATOM    896  C   PHE A  72      25.753 -12.437  16.520  1.00 33.41           C  \nATOM    897  O   PHE A  72      24.587 -12.040  16.544  1.00 34.20           O  \nATOM    898  CB  PHE A  72      26.847 -11.021  14.712  1.00 31.40           C  \nATOM    899  CG  PHE A  72      27.760 -10.979  13.499  1.00 31.93           C  \nATOM    900  CD1 PHE A  72      29.136 -11.266  13.630  1.00 29.89           C  \nATOM    901  CD2 PHE A  72      27.205 -10.842  12.208  1.00 33.00           C  \nATOM    902  CE1 PHE A  72      29.929 -11.384  12.496  1.00 31.75           C  \nATOM    903  CE2 PHE A  72      28.014 -10.967  11.089  1.00 32.57           C  \nATOM    904  CZ  PHE A  72      29.364 -11.249  11.234  1.00 33.90           C  \nATOM    905  H   PHE A  72      24.816 -12.695  14.010  1.00 31.41           H  \nATOM    906  HA  PHE A  72      27.465 -12.985  15.353  1.00 30.44           H  \nATOM    907  HB3 PHE A  72      27.306 -10.456  15.517  1.00 31.40           H  \nATOM    908  HB2 PHE A  72      25.931 -10.482  14.472  1.00 31.40           H  \nATOM    909  HD1 PHE A  72      29.570 -11.420  14.606  1.00 29.89           H  \nATOM    910  HD2 PHE A  72      26.147 -10.667  12.084  1.00 33.00           H  \nATOM    911  HE1 PHE A  72      30.981 -11.610  12.593  1.00 31.75           H  \nATOM    912  HE2 PHE A  72      27.585 -10.874  10.101  1.00 32.57           H  \nATOM    913  HZ  PHE A  72      29.965 -11.388  10.350  1.00 33.90           H  \nATOM    914  N   GLY A  73      26.425 -12.873  17.595  1.00 33.64           N  \nATOM    915  CA  GLY A  73      25.866 -12.923  18.944  1.00 32.52           C  \nATOM    916  C   GLY A  73      26.119 -11.609  19.694  1.00 32.30           C  \nATOM    917  O   GLY A  73      26.727 -10.675  19.171  1.00 31.71           O  \nATOM    918  H   GLY A  73      27.381 -13.180  17.486  1.00 33.64           H  \nATOM    919  HA3 GLY A  73      26.341 -13.742  19.485  1.00 32.52           H  \nATOM    920  HA2 GLY A  73      24.796 -13.133  18.922  1.00 32.52           H  \nATOM    921  N   ALA A  74      25.654 -11.570  20.953  1.00 32.62           N  \nATOM    922  CA  ALA A  74      25.782 -10.462  21.907  1.00 32.76           C  \nATOM    923  C   ALA A  74      27.219  -9.977  22.186  1.00 33.54           C  \nATOM    924  O   ALA A  74      27.400  -8.803  22.505  1.00 34.23           O  \nATOM    925  CB  ALA A  74      25.111 -10.902  23.215  1.00 33.34           C  \nATOM    926  H   ALA A  74      25.162 -12.377  21.306  1.00 32.62           H  \nATOM    927  HA  ALA A  74      25.233  -9.608  21.511  1.00 32.76           H  \nATOM    928  HB1 ALA A  74      25.340 -10.228  24.037  1.00 33.34           H  \nATOM    929  HB2 ALA A  74      24.026 -10.938  23.104  1.00 33.34           H  \nATOM    930  HB3 ALA A  74      25.445 -11.895  23.519  1.00 33.34           H  \nATOM    931  N   SER A  75      28.206 -10.877  22.054  1.00 34.01           N  \nATOM    932  CA  SER A  75      29.630 -10.609  22.262  1.00 34.43           C  \nATOM    933  C   SER A  75      30.325  -9.871  21.098  1.00 34.89           C  \nATOM    934  O   SER A  75      31.456  -9.423  21.286  1.00 35.01           O  \nATOM    935  CB  SER A  75      30.322 -11.951  22.582  1.00 34.37           C  \nATOM    936  OG  SER A  75      30.361 -12.814  21.460  1.00 36.98           O  \nATOM    937  H   SER A  75      27.980 -11.824  21.783  1.00 34.01           H  \nATOM    938  HA  SER A  75      29.725  -9.972  23.144  1.00 34.43           H  \nATOM    939  HB3 SER A  75      29.817 -12.458  23.405  1.00 34.37           H  \nATOM    940  HB2 SER A  75      31.348 -11.775  22.912  1.00 34.37           H  \nATOM    941  HG  SER A  75      31.027 -12.491  20.847  1.00 36.98           H  \nATOM    942  N   THR A  76      29.667  -9.780  19.928  1.00 34.17           N  \nATOM    943  CA  THR A  76      30.229  -9.228  18.694  1.00 32.21           C  \nATOM    944  C   THR A  76      30.534  -7.723  18.814  1.00 32.29           C  \nATOM    945  O   THR A  76      29.636  -6.940  19.122  1.00 33.66           O  \nATOM    946  CB  THR A  76      29.264  -9.433  17.497  1.00 32.67           C  \nATOM    947  OG1 THR A  76      29.038 -10.820  17.342  1.00 34.27           O  \nATOM    948  CG2 THR A  76      29.752  -8.888  16.145  1.00 30.68           C  \nATOM    949  H   THR A  76      28.727 -10.146  19.861  1.00 34.17           H  \nATOM    950  HA  THR A  76      31.157  -9.765  18.486  1.00 32.21           H  \nATOM    951  HB  THR A  76      28.303  -8.970  17.723  1.00 32.67           H  \nATOM    952  HG1 THR A  76      28.499 -11.118  18.079  1.00 34.27           H  \nATOM    953 HG21 THR A  76      28.994  -8.998  15.372  1.00 30.68           H  \nATOM    954 HG22 THR A  76      29.980  -7.827  16.190  1.00 30.68           H  \nATOM    955 HG23 THR A  76      30.641  -9.419  15.811  1.00 30.68           H  \nATOM    956  N   LYS A  77      31.793  -7.357  18.541  1.00 29.27           N  \nATOM    957  CA  LYS A  77      32.267  -5.976  18.504  1.00 30.93           C  \nATOM    958  C   LYS A  77      32.053  -5.354  17.115  1.00 29.85           C  \nATOM    959  O   LYS A  77      31.833  -6.067  16.137  1.00 28.59           O  \nATOM    960  CB  LYS A  77      33.761  -5.957  18.893  1.00 30.84           C  \nATOM    961  CG  LYS A  77      34.063  -6.449  20.324  1.00 33.75           C  \nATOM    962  CD  LYS A  77      33.336  -5.696  21.455  1.00 39.24           C  \nATOM    963  CE  LYS A  77      33.618  -4.182  21.480  1.00 41.33           C  \nATOM    964  NZ  LYS A  77      32.957  -3.518  22.617  1.00 40.00           N1+\nATOM    965  H   LYS A  77      32.469  -8.065  18.279  1.00 29.27           H  \nATOM    966  HA  LYS A  77      31.702  -5.374  19.217  1.00 30.93           H  \nATOM    967  HB3 LYS A  77      34.155  -4.946  18.786  1.00 30.84           H  \nATOM    968  HB2 LYS A  77      34.328  -6.566  18.189  1.00 30.84           H  \nATOM    969  HG3 LYS A  77      35.138  -6.386  20.493  1.00 33.75           H  \nATOM    970  HG2 LYS A  77      33.822  -7.511  20.396  1.00 33.75           H  \nATOM    971  HD3 LYS A  77      33.645  -6.137  22.405  1.00 39.24           H  \nATOM    972  HD2 LYS A  77      32.263  -5.882  21.388  1.00 39.24           H  \nATOM    973  HE3 LYS A  77      33.267  -3.708  20.563  1.00 41.33           H  \nATOM    974  HE2 LYS A  77      34.692  -3.999  21.546  1.00 41.33           H  \nATOM    975  HZ1 LYS A  77      33.292  -3.915  23.483  1.00 40.00           H  \nATOM    976  HZ2 LYS A  77      33.164  -2.530  22.600  1.00 40.00           H  \nATOM    977  HZ3 LYS A  77      31.957  -3.651  22.553  1.00 40.00           H  \nATOM    978  N   GLN A  78      32.143  -4.017  17.053  1.00 28.05           N  \nATOM    979  CA  GLN A  78      32.015  -3.236  15.820  1.00 27.78           C  \nATOM    980  C   GLN A  78      33.085  -3.566  14.763  1.00 28.95           C  \nATOM    981  O   GLN A  78      32.777  -3.556  13.572  1.00 25.92           O  \nATOM    982  CB  GLN A  78      32.124  -1.743  16.156  1.00 27.45           C  \nATOM    983  CG  GLN A  78      31.092  -1.171  17.144  1.00 25.90           C  \nATOM    984  CD  GLN A  78      29.726  -0.917  16.518  1.00 24.67           C  \nATOM    985  OE1 GLN A  78      29.121  -1.813  15.941  1.00 25.98           O  \nATOM    986  NE2 GLN A  78      29.217   0.305  16.656  1.00 22.88           N  \nATOM    987  H   GLN A  78      32.325  -3.488  17.893  1.00 28.05           H  \nATOM    988  HA  GLN A  78      31.040  -3.449  15.380  1.00 27.78           H  \nATOM    989  HB3 GLN A  78      32.078  -1.186  15.221  1.00 27.45           H  \nATOM    990  HB2 GLN A  78      33.113  -1.556  16.570  1.00 27.45           H  \nATOM    991  HG3 GLN A  78      31.474  -0.219  17.501  1.00 25.90           H  \nATOM    992  HG2 GLN A  78      30.980  -1.802  18.026  1.00 25.90           H  \nATOM    993 HE22 GLN A  78      28.300   0.518  16.278  1.00 22.88           H  \nATOM    994 HE21 GLN A  78      29.726   1.032  17.144  1.00 22.88           H  \nATOM    995  N   ILE A  79      34.312  -3.860  15.227  1.00 27.36           N  \nATOM    996  CA  ILE A  79      35.437  -4.293  14.400  1.00 29.06           C  \nATOM    997  C   ILE A  79      35.202  -5.674  13.749  1.00 27.29           C  \nATOM    998  O   ILE A  79      35.612  -5.864  12.606  1.00 27.78           O  \nATOM    999  CB  ILE A  79      36.767  -4.300  15.218  1.00 30.11           C  \nATOM   1000  CG1 ILE A  79      38.034  -4.597  14.384  1.00 32.36           C  \nATOM   1001  CG2 ILE A  79      36.739  -5.239  16.442  1.00 27.95           C  \nATOM   1002  CD1 ILE A  79      38.249  -3.654  13.192  1.00 34.09           C  \nATOM   1003  H   ILE A  79      34.481  -3.839  16.222  1.00 27.36           H  \nATOM   1004  HA  ILE A  79      35.528  -3.560  13.597  1.00 29.06           H  \nATOM   1005  HB  ILE A  79      36.887  -3.288  15.609  1.00 30.11           H  \nATOM   1006 HG13 ILE A  79      38.019  -5.628  14.037  1.00 32.36           H  \nATOM   1007 HG12 ILE A  79      38.909  -4.524  15.030  1.00 32.36           H  \nATOM   1008 HG21 ILE A  79      37.631  -5.104  17.055  1.00 27.95           H  \nATOM   1009 HG22 ILE A  79      35.881  -5.043  17.081  1.00 27.95           H  \nATOM   1010 HG23 ILE A  79      36.709  -6.287  16.149  1.00 27.95           H  \nATOM   1011 HD11 ILE A  79      39.256  -3.766  12.789  1.00 34.09           H  \nATOM   1012 HD12 ILE A  79      37.549  -3.863  12.383  1.00 34.09           H  \nATOM   1013 HD13 ILE A  79      38.125  -2.612  13.483  1.00 34.09           H  \nATOM   1014  N   ASP A  80      34.496  -6.576  14.456  1.00 28.59           N  \nATOM   1015  CA  ASP A  80      34.096  -7.901  13.971  1.00 27.29           C  \nATOM   1016  C   ASP A  80      33.113  -7.801  12.795  1.00 29.89           C  \nATOM   1017  O   ASP A  80      33.333  -8.469  11.786  1.00 27.87           O  \nATOM   1018  CB  ASP A  80      33.499  -8.817  15.069  1.00 28.62           C  \nATOM   1019  CG  ASP A  80      34.316  -9.001  16.360  1.00 31.56           C  \nATOM   1020  OD1 ASP A  80      33.704  -9.485  17.337  1.00 29.84           O  \nATOM   1021  OD2 ASP A  80      35.545  -8.768  16.344  1.00 31.94           O1-\nATOM   1022  H   ASP A  80      34.181  -6.339  15.385  1.00 28.59           H  \nATOM   1023  HA  ASP A  80      34.999  -8.385  13.593  1.00 27.29           H  \nATOM   1024  HB3 ASP A  80      33.320  -9.811  14.655  1.00 28.62           H  \nATOM   1025  HB2 ASP A  80      32.531  -8.417  15.362  1.00 28.62           H  \nATOM   1026  N   VAL A  81      32.088  -6.936  12.927  1.00 26.47           N  \nATOM   1027  CA  VAL A  81      31.121  -6.618  11.870  1.00 27.06           C  \nATOM   1028  C   VAL A  81      31.795  -5.975  10.643  1.00 27.68           C  \nATOM   1029  O   VAL A  81      31.490  -6.368   9.518  1.00 27.78           O  \nATOM   1030  CB  VAL A  81      29.992  -5.665  12.372  1.00 26.45           C  \nATOM   1031  CG1 VAL A  81      29.049  -5.125  11.271  1.00 26.19           C  \nATOM   1032  CG2 VAL A  81      29.156  -6.336  13.473  1.00 24.32           C  \nATOM   1033  H   VAL A  81      31.979  -6.430  13.796  1.00 26.47           H  \nATOM   1034  HA  VAL A  81      30.666  -7.557  11.547  1.00 27.06           H  \nATOM   1035  HB  VAL A  81      30.461  -4.793  12.830  1.00 26.45           H  \nATOM   1036 HG11 VAL A  81      28.219  -4.569  11.705  1.00 26.19           H  \nATOM   1037 HG12 VAL A  81      29.553  -4.438  10.591  1.00 26.19           H  \nATOM   1038 HG13 VAL A  81      28.625  -5.937  10.679  1.00 26.19           H  \nATOM   1039 HG21 VAL A  81      28.342  -5.691  13.801  1.00 24.32           H  \nATOM   1040 HG22 VAL A  81      28.719  -7.274  13.129  1.00 24.32           H  \nATOM   1041 HG23 VAL A  81      29.766  -6.549  14.348  1.00 24.32           H  \nATOM   1042  N   TYR A  82      32.711  -5.020  10.877  1.00 31.58           N  \nATOM   1043  CA  TYR A  82      33.408  -4.314   9.808  1.00 34.08           C  \nATOM   1044  C   TYR A  82      34.322  -5.230   8.971  1.00 34.35           C  \nATOM   1045  O   TYR A  82      34.248  -5.177   7.746  1.00 35.44           O  \nATOM   1046  CB  TYR A  82      34.152  -3.082  10.357  1.00 37.56           C  \nATOM   1047  CG  TYR A  82      34.718  -2.221   9.244  1.00 40.86           C  \nATOM   1048  CD1 TYR A  82      36.027  -2.444   8.767  1.00 42.74           C  \nATOM   1049  CD2 TYR A  82      33.891  -1.271   8.611  1.00 41.86           C  \nATOM   1050  CE1 TYR A  82      36.479  -1.771   7.618  1.00 44.29           C  \nATOM   1051  CE2 TYR A  82      34.356  -0.578   7.479  1.00 43.80           C  \nATOM   1052  CZ  TYR A  82      35.638  -0.849   6.968  1.00 45.95           C  \nATOM   1053  OH  TYR A  82      36.059  -0.227   5.834  1.00 47.94           O  \nATOM   1054  H   TYR A  82      32.915  -4.733  11.826  1.00 31.58           H  \nATOM   1055  HA  TYR A  82      32.635  -3.937   9.137  1.00 34.08           H  \nATOM   1056  HB3 TYR A  82      34.951  -3.382  11.038  1.00 37.56           H  \nATOM   1057  HB2 TYR A  82      33.465  -2.472  10.945  1.00 37.56           H  \nATOM   1058  HD1 TYR A  82      36.662  -3.177   9.242  1.00 42.74           H  \nATOM   1059  HD2 TYR A  82      32.887  -1.096   8.969  1.00 41.86           H  \nATOM   1060  HE1 TYR A  82      37.464  -1.978   7.225  1.00 44.29           H  \nATOM   1061  HE2 TYR A  82      33.716   0.140   6.990  1.00 43.80           H  \nATOM   1062  HH  TYR A  82      35.398   0.358   5.457  1.00 47.94           H  \nATOM   1063  N   ARG A  83      35.144  -6.056   9.637  1.00 33.61           N  \nATOM   1064  CA  ARG A  83      36.062  -7.003   8.998  1.00 33.79           C  \nATOM   1065  C   ARG A  83      35.344  -8.068   8.154  1.00 32.60           C  \nATOM   1066  O   ARG A  83      35.787  -8.337   7.039  1.00 31.20           O  \nATOM   1067  CB  ARG A  83      36.916  -7.697  10.076  1.00 33.24           C  \nATOM   1068  CG  ARG A  83      38.028  -6.810  10.662  1.00 34.93           C  \nATOM   1069  CD  ARG A  83      38.706  -7.420  11.905  1.00 36.32           C  \nATOM   1070  NE  ARG A  83      39.373  -8.706  11.627  1.00 35.56           N  \nATOM   1071  CZ  ARG A  83      40.584  -8.918  11.080  1.00 37.72           C  \nATOM   1072  NH1 ARG A  83      41.398  -7.911  10.726  1.00 36.80           N  \nATOM   1073  NH2 ARG A  83      40.987 -10.179  10.880  1.00 38.76           N1+\nATOM   1074  H   ARG A  83      35.147  -6.047  10.650  1.00 33.61           H  \nATOM   1075  HA  ARG A  83      36.721  -6.447   8.327  1.00 33.79           H  \nATOM   1076  HB3 ARG A  83      37.394  -8.576   9.641  1.00 33.24           H  \nATOM   1077  HB2 ARG A  83      36.269  -8.073  10.871  1.00 33.24           H  \nATOM   1078  HG3 ARG A  83      37.666  -5.809  10.897  1.00 34.93           H  \nATOM   1079  HG2 ARG A  83      38.775  -6.665   9.880  1.00 34.93           H  \nATOM   1080  HD3 ARG A  83      37.937  -7.639  12.647  1.00 36.32           H  \nATOM   1081  HD2 ARG A  83      39.382  -6.707  12.377  1.00 36.32           H  \nATOM   1082  HE  ARG A  83      38.815  -9.520  11.845  1.00 35.56           H  \nATOM   1083 HH12 ARG A  83      42.302  -8.097  10.317  1.00 36.80           H  \nATOM   1084 HH11 ARG A  83      41.108  -6.955  10.874  1.00 36.80           H  \nATOM   1085 HH22 ARG A  83      41.891 -10.369  10.471  1.00 38.76           H  \nATOM   1086 HH21 ARG A  83      40.394 -10.953  11.141  1.00 38.76           H  \nATOM   1087  N   SER A  84      34.278  -8.663   8.710  1.00 29.89           N  \nATOM   1088  CA  SER A  84      33.582  -9.798   8.109  1.00 33.65           C  \nATOM   1089  C   SER A  84      32.568  -9.419   7.016  1.00 31.73           C  \nATOM   1090  O   SER A  84      32.480 -10.167   6.042  1.00 32.56           O  \nATOM   1091  CB  SER A  84      32.952 -10.655   9.221  1.00 33.28           C  \nATOM   1092  OG  SER A  84      31.922  -9.959   9.888  1.00 42.99           O  \nATOM   1093  H   SER A  84      33.966  -8.380   9.629  1.00 29.89           H  \nATOM   1094  HA  SER A  84      34.335 -10.429   7.630  1.00 33.65           H  \nATOM   1095  HB3 SER A  84      33.706 -10.959   9.949  1.00 33.28           H  \nATOM   1096  HB2 SER A  84      32.531 -11.570   8.802  1.00 33.28           H  \nATOM   1097  HG  SER A  84      32.322  -9.382  10.548  1.00 42.99           H  \nATOM   1098  N   VAL A  85      31.824  -8.306   7.184  1.00 32.27           N  \nATOM   1099  CA  VAL A  85      30.730  -7.941   6.274  1.00 30.87           C  \nATOM   1100  C   VAL A  85      31.093  -6.724   5.402  1.00 30.01           C  \nATOM   1101  O   VAL A  85      30.891  -6.804   4.192  1.00 32.23           O  \nATOM   1102  CB  VAL A  85      29.327  -7.758   6.969  1.00 32.16           C  \nATOM   1103  CG1 VAL A  85      29.183  -8.501   8.313  1.00 32.40           C  \nATOM   1104  CG2 VAL A  85      28.748  -6.334   7.115  1.00 32.73           C  \nATOM   1105  H   VAL A  85      31.936  -7.737   8.012  1.00 32.27           H  \nATOM   1106  HA  VAL A  85      30.580  -8.754   5.561  1.00 30.87           H  \nATOM   1107  HB  VAL A  85      28.630  -8.267   6.301  1.00 32.16           H  \nATOM   1108 HG11 VAL A  85      28.132  -8.636   8.573  1.00 32.40           H  \nATOM   1109 HG12 VAL A  85      29.644  -9.484   8.296  1.00 32.40           H  \nATOM   1110 HG13 VAL A  85      29.642  -7.955   9.132  1.00 32.40           H  \nATOM   1111 HG21 VAL A  85      27.754  -6.367   7.561  1.00 32.73           H  \nATOM   1112 HG22 VAL A  85      29.368  -5.726   7.770  1.00 32.73           H  \nATOM   1113 HG23 VAL A  85      28.641  -5.821   6.159  1.00 32.73           H  \nATOM   1114  N   VAL A  86      31.615  -5.632   5.994  1.00 28.37           N  \nATOM   1115  CA  VAL A  86      31.777  -4.360   5.277  1.00 30.45           C  \nATOM   1116  C   VAL A  86      33.036  -4.309   4.402  1.00 32.51           C  \nATOM   1117  O   VAL A  86      32.955  -3.773   3.301  1.00 30.96           O  \nATOM   1118  CB  VAL A  86      31.848  -3.126   6.215  1.00 29.71           C  \nATOM   1119  CG1 VAL A  86      31.919  -1.776   5.462  1.00 30.36           C  \nATOM   1120  CG2 VAL A  86      30.674  -3.082   7.193  1.00 30.48           C  \nATOM   1121  H   VAL A  86      31.796  -5.626   6.988  1.00 28.37           H  \nATOM   1122  HA  VAL A  86      30.912  -4.223   4.625  1.00 30.45           H  \nATOM   1123  HB  VAL A  86      32.753  -3.199   6.818  1.00 29.71           H  \nATOM   1124 HG11 VAL A  86      31.834  -0.938   6.151  1.00 30.36           H  \nATOM   1125 HG12 VAL A  86      32.862  -1.638   4.933  1.00 30.36           H  \nATOM   1126 HG13 VAL A  86      31.109  -1.683   4.738  1.00 30.36           H  \nATOM   1127 HG21 VAL A  86      30.776  -2.198   7.812  1.00 30.48           H  \nATOM   1128 HG22 VAL A  86      29.715  -3.038   6.676  1.00 30.48           H  \nATOM   1129 HG23 VAL A  86      30.669  -3.938   7.865  1.00 30.48           H  \nATOM   1130  N   CYS A  87      34.171  -4.829   4.898  1.00 33.65           N  \nATOM   1131  CA  CYS A  87      35.466  -4.747   4.221  1.00 34.56           C  \nATOM   1132  C   CYS A  87      35.499  -5.428   2.826  1.00 33.22           C  \nATOM   1133  O   CYS A  87      35.979  -4.778   1.898  1.00 32.37           O  \nATOM   1134  CB  CYS A  87      36.637  -5.135   5.153  1.00 37.83           C  \nATOM   1135  SG  CYS A  87      38.257  -4.723   4.441  1.00 49.64           S  \nATOM   1136  H   CYS A  87      34.171  -5.234   5.826  1.00 33.65           H  \nATOM   1137  HA  CYS A  87      35.602  -3.681   4.026  1.00 34.56           H  \nATOM   1138  HB3 CYS A  87      36.620  -6.192   5.414  1.00 37.83           H  \nATOM   1139  HB2 CYS A  87      36.552  -4.586   6.092  1.00 37.83           H  \nATOM   1140  HG  CYS A  87      38.187  -5.585   3.422  1.00 49.64           H  \nATOM   1141  N   PRO A  88      34.877  -6.623   2.651  1.00 32.21           N  \nATOM   1142  CA  PRO A  88      34.634  -7.211   1.317  1.00 33.69           C  \nATOM   1143  C   PRO A  88      33.717  -6.386   0.393  1.00 34.06           C  \nATOM   1144  O   PRO A  88      34.009  -6.288  -0.798  1.00 33.78           O  \nATOM   1145  CB  PRO A  88      34.022  -8.593   1.617  1.00 33.34           C  \nATOM   1146  CG  PRO A  88      34.480  -8.924   3.025  1.00 30.72           C  \nATOM   1147  CD  PRO A  88      34.482  -7.563   3.702  1.00 31.11           C  \nATOM   1148  HA  PRO A  88      35.606  -7.343   0.836  1.00 33.69           H  \nATOM   1149  HB3 PRO A  88      34.328  -9.352   0.896  1.00 33.34           H  \nATOM   1150  HB2 PRO A  88      32.931  -8.550   1.603  1.00 33.34           H  \nATOM   1151  HG3 PRO A  88      35.497  -9.317   2.995  1.00 30.72           H  \nATOM   1152  HG2 PRO A  88      33.849  -9.657   3.529  1.00 30.72           H  \nATOM   1153  HD2 PRO A  88      33.478  -7.319   4.039  1.00 31.11           H  \nATOM   1154  HD3 PRO A  88      35.141  -7.565   4.566  1.00 31.11           H  \nATOM   1155  N   ILE A  89      32.637  -5.810   0.955  1.00 33.67           N  \nATOM   1156  CA  ILE A  89      31.678  -4.963   0.237  1.00 32.79           C  \nATOM   1157  C   ILE A  89      32.318  -3.647  -0.250  1.00 33.05           C  \nATOM   1158  O   ILE A  89      32.088  -3.270  -1.398  1.00 33.90           O  \nATOM   1159  CB  ILE A  89      30.408  -4.655   1.095  1.00 34.37           C  \nATOM   1160  CG1 ILE A  89      29.592  -5.944   1.343  1.00 34.88           C  \nATOM   1161  CG2 ILE A  89      29.476  -3.569   0.514  1.00 31.66           C  \nATOM   1162  CD1 ILE A  89      28.557  -5.817   2.473  1.00 40.21           C  \nATOM   1163  H   ILE A  89      32.465  -5.932   1.943  1.00 33.67           H  \nATOM   1164  HA  ILE A  89      31.357  -5.514  -0.649  1.00 32.79           H  \nATOM   1165  HB  ILE A  89      30.747  -4.296   2.066  1.00 34.37           H  \nATOM   1166 HG13 ILE A  89      30.254  -6.776   1.582  1.00 34.88           H  \nATOM   1167 HG12 ILE A  89      29.083  -6.232   0.423  1.00 34.88           H  \nATOM   1168 HG21 ILE A  89      28.588  -3.427   1.130  1.00 31.66           H  \nATOM   1169 HG22 ILE A  89      29.954  -2.592   0.442  1.00 31.66           H  \nATOM   1170 HG23 ILE A  89      29.140  -3.861  -0.479  1.00 31.66           H  \nATOM   1171 HD11 ILE A  89      28.344  -6.790   2.915  1.00 40.21           H  \nATOM   1172 HD12 ILE A  89      28.909  -5.164   3.271  1.00 40.21           H  \nATOM   1173 HD13 ILE A  89      27.615  -5.412   2.109  1.00 40.21           H  \nATOM   1174  N   LEU A  90      33.136  -3.007   0.606  1.00 34.40           N  \nATOM   1175  CA  LEU A  90      33.893  -1.797   0.292  1.00 36.12           C  \nATOM   1176  C   LEU A  90      34.934  -2.024  -0.812  1.00 36.86           C  \nATOM   1177  O   LEU A  90      35.085  -1.142  -1.647  1.00 35.34           O  \nATOM   1178  CB  LEU A  90      34.528  -1.192   1.569  1.00 35.83           C  \nATOM   1179  CG  LEU A  90      35.307   0.134   1.353  1.00 37.20           C  \nATOM   1180  CD1 LEU A  90      34.436   1.251   0.742  1.00 39.93           C  \nATOM   1181  CD2 LEU A  90      36.004   0.598   2.643  1.00 37.31           C  \nATOM   1182  H   LEU A  90      33.258  -3.378   1.541  1.00 34.40           H  \nATOM   1183  HA  LEU A  90      33.165  -1.083  -0.095  1.00 36.12           H  \nATOM   1184  HB3 LEU A  90      35.196  -1.934   2.010  1.00 35.83           H  \nATOM   1185  HB2 LEU A  90      33.744  -1.024   2.310  1.00 35.83           H  \nATOM   1186  HG  LEU A  90      36.119  -0.063   0.652  1.00 37.20           H  \nATOM   1187 HD11 LEU A  90      34.560   2.196   1.266  1.00 39.93           H  \nATOM   1188 HD12 LEU A  90      34.701   1.426  -0.301  1.00 39.93           H  \nATOM   1189 HD13 LEU A  90      33.373   1.013   0.776  1.00 39.93           H  \nATOM   1190 HD21 LEU A  90      36.930   1.130   2.418  1.00 37.31           H  \nATOM   1191 HD22 LEU A  90      35.375   1.265   3.234  1.00 37.31           H  \nATOM   1192 HD23 LEU A  90      36.270  -0.252   3.270  1.00 37.31           H  \nATOM   1193  N   ASP A  91      35.598  -3.193  -0.840  1.00 36.65           N  \nATOM   1194  CA  ASP A  91      36.536  -3.564  -1.910  1.00 39.50           C  \nATOM   1195  C   ASP A  91      35.874  -3.637  -3.290  1.00 39.38           C  \nATOM   1196  O   ASP A  91      36.474  -3.162  -4.251  1.00 39.21           O  \nATOM   1197  CB  ASP A  91      37.327  -4.862  -1.621  1.00 39.23           C  \nATOM   1198  CG  ASP A  91      38.243  -4.809  -0.389  1.00 42.38           C  \nATOM   1199  OD1 ASP A  91      38.630  -3.692   0.019  1.00 41.38           O  \nATOM   1200  OD2 ASP A  91      38.656  -5.900   0.061  1.00 43.09           O1-\nATOM   1201  H   ASP A  91      35.449  -3.878  -0.112  1.00 36.65           H  \nATOM   1202  HA  ASP A  91      37.255  -2.745  -1.986  1.00 39.50           H  \nATOM   1203  HB3 ASP A  91      37.948  -5.118  -2.481  1.00 39.23           H  \nATOM   1204  HB2 ASP A  91      36.626  -5.687  -1.482  1.00 39.23           H  \nATOM   1205  N   GLU A  92      34.636  -4.153  -3.357  1.00 38.83           N  \nATOM   1206  CA  GLU A  92      33.822  -4.130  -4.570  1.00 39.48           C  \nATOM   1207  C   GLU A  92      33.406  -2.704  -4.992  1.00 38.74           C  \nATOM   1208  O   GLU A  92      33.427  -2.412  -6.187  1.00 36.80           O  \nATOM   1209  CB  GLU A  92      32.677  -5.155  -4.437  1.00 41.28           C  \nATOM   1210  CG  GLU A  92      31.664  -5.155  -5.606  1.00 42.07           C  \nATOM   1211  CD  GLU A  92      30.783  -6.408  -5.738  1.00 44.04           C  \nATOM   1212  OE1 GLU A  92      31.165  -7.481  -5.219  1.00 41.66           O  \nATOM   1213  OE2 GLU A  92      29.716  -6.276  -6.378  1.00 43.65           O1-\nATOM   1214  H   GLU A  92      34.199  -4.522  -2.524  1.00 38.83           H  \nATOM   1215  HA  GLU A  92      34.456  -4.501  -5.378  1.00 39.48           H  \nATOM   1216  HB3 GLU A  92      32.142  -5.003  -3.499  1.00 41.28           H  \nATOM   1217  HB2 GLU A  92      33.151  -6.134  -4.349  1.00 41.28           H  \nATOM   1218  HG3 GLU A  92      32.197  -5.039  -6.550  1.00 42.07           H  \nATOM   1219  HG2 GLU A  92      31.013  -4.287  -5.499  1.00 42.07           H  \nATOM   1220  N   VAL A  93      33.139  -1.814  -4.019  1.00 37.58           N  \nATOM   1221  CA  VAL A  93      32.923  -0.380  -4.251  1.00 39.39           C  \nATOM   1222  C   VAL A  93      34.175   0.314  -4.837  1.00 39.94           C  \nATOM   1223  O   VAL A  93      34.025   1.084  -5.783  1.00 38.57           O  \nATOM   1224  CB  VAL A  93      32.449   0.365  -2.966  1.00 39.78           C  \nATOM   1225  CG1 VAL A  93      32.354   1.898  -3.088  1.00 38.88           C  \nATOM   1226  CG2 VAL A  93      31.106  -0.188  -2.478  1.00 39.30           C  \nATOM   1227  H   VAL A  93      33.145  -2.116  -3.054  1.00 37.58           H  \nATOM   1228  HA  VAL A  93      32.130  -0.298  -4.994  1.00 39.39           H  \nATOM   1229  HB  VAL A  93      33.162   0.174  -2.172  1.00 39.78           H  \nATOM   1230 HG11 VAL A  93      31.929   2.340  -2.186  1.00 38.88           H  \nATOM   1231 HG12 VAL A  93      33.328   2.363  -3.237  1.00 38.88           H  \nATOM   1232 HG13 VAL A  93      31.716   2.176  -3.922  1.00 38.88           H  \nATOM   1233 HG21 VAL A  93      30.928   0.081  -1.439  1.00 39.30           H  \nATOM   1234 HG22 VAL A  93      30.281   0.183  -3.087  1.00 39.30           H  \nATOM   1235 HG23 VAL A  93      31.073  -1.272  -2.519  1.00 39.30           H  \nATOM   1236  N   ILE A  94      35.381  -0.018  -4.332  1.00 39.41           N  \nATOM   1237  CA  ILE A  94      36.664   0.464  -4.868  1.00 41.12           C  \nATOM   1238  C   ILE A  94      36.959  -0.065  -6.295  1.00 42.53           C  \nATOM   1239  O   ILE A  94      37.577   0.656  -7.077  1.00 42.63           O  \nATOM   1240  CB  ILE A  94      37.881   0.141  -3.934  1.00 41.77           C  \nATOM   1241  CG1 ILE A  94      37.738   0.693  -2.491  1.00 41.96           C  \nATOM   1242  CG2 ILE A  94      39.247   0.594  -4.501  1.00 41.60           C  \nATOM   1243  CD1 ILE A  94      37.118   2.090  -2.355  1.00 42.93           C  \nATOM   1244  H   ILE A  94      35.433  -0.655  -3.548  1.00 39.41           H  \nATOM   1245  HA  ILE A  94      36.581   1.547  -4.959  1.00 41.12           H  \nATOM   1246  HB  ILE A  94      37.938  -0.944  -3.835  1.00 41.77           H  \nATOM   1247 HG13 ILE A  94      38.703   0.678  -1.982  1.00 41.96           H  \nATOM   1248 HG12 ILE A  94      37.141   0.003  -1.907  1.00 41.96           H  \nATOM   1249 HG21 ILE A  94      40.053   0.409  -3.791  1.00 41.60           H  \nATOM   1250 HG22 ILE A  94      39.524   0.059  -5.409  1.00 41.60           H  \nATOM   1251 HG23 ILE A  94      39.249   1.660  -4.727  1.00 41.60           H  \nATOM   1252 HD11 ILE A  94      37.408   2.554  -1.412  1.00 42.93           H  \nATOM   1253 HD12 ILE A  94      37.428   2.758  -3.160  1.00 42.93           H  \nATOM   1254 HD13 ILE A  94      36.031   2.027  -2.368  1.00 42.93           H  \nATOM   1255  N   MET A  95      36.451  -1.262  -6.647  1.00 42.42           N  \nATOM   1256  CA  MET A  95      36.461  -1.797  -8.018  1.00 44.90           C  \nATOM   1257  C   MET A  95      35.496  -1.076  -8.985  1.00 45.13           C  \nATOM   1258  O   MET A  95      35.525  -1.380 -10.177  1.00 44.37           O  \nATOM   1259  CB  MET A  95      36.185  -3.314  -8.011  1.00 46.53           C  \nATOM   1260  CG  MET A  95      37.313  -4.150  -7.394  1.00 50.85           C  \nATOM   1261  SD  MET A  95      36.937  -5.920  -7.288  1.00 55.62           S  \nATOM   1262  CE  MET A  95      37.130  -6.386  -9.029  1.00 55.21           C  \nATOM   1263  H   MET A  95      35.964  -1.817  -5.956  1.00 42.42           H  \nATOM   1264  HA  MET A  95      37.461  -1.646  -8.428  1.00 44.90           H  \nATOM   1265  HB3 MET A  95      36.038  -3.661  -9.034  1.00 46.53           H  \nATOM   1266  HB2 MET A  95      35.251  -3.531  -7.499  1.00 46.53           H  \nATOM   1267  HG3 MET A  95      37.548  -3.798  -6.393  1.00 50.85           H  \nATOM   1268  HG2 MET A  95      38.227  -4.026  -7.975  1.00 50.85           H  \nATOM   1269  HE1 MET A  95      36.999  -7.462  -9.143  1.00 55.21           H  \nATOM   1270  HE2 MET A  95      36.388  -5.885  -9.650  1.00 55.21           H  \nATOM   1271  HE3 MET A  95      38.124  -6.120  -9.389  1.00 55.21           H  \nATOM   1272  N   GLY A  96      34.701  -0.117  -8.485  1.00 43.95           N  \nATOM   1273  CA  GLY A  96      33.850   0.740  -9.300  1.00 42.59           C  \nATOM   1274  C   GLY A  96      32.426   0.183  -9.428  1.00 42.57           C  \nATOM   1275  O   GLY A  96      31.765   0.478 -10.423  1.00 41.48           O  \nATOM   1276  H   GLY A  96      34.728   0.080  -7.494  1.00 43.95           H  \nATOM   1277  HA3 GLY A  96      34.283   0.899 -10.288  1.00 42.59           H  \nATOM   1278  HA2 GLY A  96      33.806   1.714  -8.817  1.00 42.59           H  \nATOM   1279  N   TYR A  97      31.959  -0.616  -8.453  1.00 41.65           N  \nATOM   1280  CA  TYR A  97      30.594  -1.150  -8.403  1.00 41.71           C  \nATOM   1281  C   TYR A  97      29.727  -0.365  -7.413  1.00 38.76           C  \nATOM   1282  O   TYR A  97      30.233   0.370  -6.562  1.00 37.69           O  \nATOM   1283  CB  TYR A  97      30.624  -2.643  -8.016  1.00 45.44           C  \nATOM   1284  CG  TYR A  97      31.041  -3.583  -9.133  1.00 52.18           C  \nATOM   1285  CD1 TYR A  97      32.369  -3.594  -9.610  1.00 54.66           C  \nATOM   1286  CD2 TYR A  97      30.085  -4.446  -9.708  1.00 53.53           C  \nATOM   1287  CE1 TYR A  97      32.728  -4.436 -10.680  1.00 57.85           C  \nATOM   1288  CE2 TYR A  97      30.447  -5.296 -10.769  1.00 57.11           C  \nATOM   1289  CZ  TYR A  97      31.765  -5.284 -11.263  1.00 58.28           C  \nATOM   1290  OH  TYR A  97      32.105  -6.094 -12.307  1.00 60.52           O  \nATOM   1291  H   TYR A  97      32.551  -0.842  -7.666  1.00 41.65           H  \nATOM   1292  HA  TYR A  97      30.123  -1.070  -9.385  1.00 41.71           H  \nATOM   1293  HB3 TYR A  97      29.632  -2.965  -7.695  1.00 45.44           H  \nATOM   1294  HB2 TYR A  97      31.253  -2.798  -7.149  1.00 45.44           H  \nATOM   1295  HD1 TYR A  97      33.115  -2.953  -9.166  1.00 54.66           H  \nATOM   1296  HD2 TYR A  97      29.068  -4.456  -9.345  1.00 53.53           H  \nATOM   1297  HE1 TYR A  97      33.744  -4.428 -11.046  1.00 57.85           H  \nATOM   1298  HE2 TYR A  97      29.708  -5.950 -11.210  1.00 57.11           H  \nATOM   1299  HH  TYR A  97      33.026  -6.009 -12.564  1.00 60.52           H  \nATOM   1300  N   ASN A  98      28.411  -0.575  -7.554  1.00 36.08           N  \nATOM   1301  CA  ASN A  98      27.384  -0.057  -6.660  1.00 33.17           C  \nATOM   1302  C   ASN A  98      27.034  -1.142  -5.638  1.00 29.96           C  \nATOM   1303  O   ASN A  98      26.784  -2.287  -6.022  1.00 27.65           O  \nATOM   1304  CB  ASN A  98      26.144   0.359  -7.479  1.00 34.52           C  \nATOM   1305  CG  ASN A  98      26.423   1.507  -8.460  1.00 37.68           C  \nATOM   1306  OD1 ASN A  98      27.249   2.378  -8.202  1.00 37.20           O  \nATOM   1307  ND2 ASN A  98      25.727   1.517  -9.596  1.00 36.60           N  \nATOM   1308  H   ASN A  98      28.085  -1.200  -8.278  1.00 36.08           H  \nATOM   1309  HA  ASN A  98      27.764   0.825  -6.148  1.00 33.17           H  \nATOM   1310  HB3 ASN A  98      25.353   0.691  -6.805  1.00 34.52           H  \nATOM   1311  HB2 ASN A  98      25.747  -0.499  -8.024  1.00 34.52           H  \nATOM   1312 HD22 ASN A  98      25.873   2.254 -10.270  1.00 36.60           H  \nATOM   1313 HD21 ASN A  98      25.081   0.767  -9.813  1.00 36.60           H  \nATOM   1314  N   CYS A  99      27.016  -0.749  -4.358  1.00 28.42           N  \nATOM   1315  CA  CYS A  99      26.696  -1.611  -3.225  1.00 26.99           C  \nATOM   1316  C   CYS A  99      25.673  -0.908  -2.318  1.00 24.43           C  \nATOM   1317  O   CYS A  99      25.582   0.320  -2.325  1.00 23.39           O  \nATOM   1318  CB  CYS A  99      27.955  -1.985  -2.425  1.00 26.76           C  \nATOM   1319  SG  CYS A  99      29.011  -3.136  -3.354  1.00 30.41           S  \nATOM   1320  H   CYS A  99      27.243   0.211  -4.130  1.00 28.42           H  \nATOM   1321  HA  CYS A  99      26.241  -2.526  -3.591  1.00 26.99           H  \nATOM   1322  HB3 CYS A  99      27.680  -2.458  -1.483  1.00 26.76           H  \nATOM   1323  HB2 CYS A  99      28.525  -1.090  -2.189  1.00 26.76           H  \nATOM   1324  HG  CYS A  99      30.010  -3.165  -2.466  1.00 30.41           H  \nATOM   1325  N   THR A 100      24.921  -1.703  -1.543  1.00 23.88           N  \nATOM   1326  CA  THR A 100      23.961  -1.219  -0.553  1.00 23.96           C  \nATOM   1327  C   THR A 100      23.948  -2.173   0.649  1.00 24.20           C  \nATOM   1328  O   THR A 100      24.034  -3.385   0.467  1.00 24.93           O  \nATOM   1329  CB  THR A 100      22.521  -1.117  -1.133  1.00 21.66           C  \nATOM   1330  OG1 THR A 100      22.493  -0.090  -2.101  1.00 23.67           O  \nATOM   1331  CG2 THR A 100      21.398  -0.804  -0.122  1.00 20.28           C  \nATOM   1332  H   THR A 100      25.014  -2.708  -1.619  1.00 23.88           H  \nATOM   1333  HA  THR A 100      24.284  -0.238  -0.213  1.00 23.96           H  \nATOM   1334  HB  THR A 100      22.274  -2.046  -1.648  1.00 21.66           H  \nATOM   1335  HG1 THR A 100      21.640  -0.127  -2.550  1.00 23.67           H  \nATOM   1336 HG21 THR A 100      20.452  -0.608  -0.628  1.00 20.28           H  \nATOM   1337 HG22 THR A 100      21.223  -1.636   0.560  1.00 20.28           H  \nATOM   1338 HG23 THR A 100      21.637   0.074   0.478  1.00 20.28           H  \nATOM   1339  N   ILE A 101      23.827  -1.612   1.859  1.00 23.51           N  \nATOM   1340  CA  ILE A 101      23.663  -2.377   3.089  1.00 21.26           C  \nATOM   1341  C   ILE A 101      22.478  -1.766   3.854  1.00 20.88           C  \nATOM   1342  O   ILE A 101      22.540  -0.599   4.238  1.00 21.37           O  \nATOM   1343  CB  ILE A 101      24.924  -2.353   4.005  1.00 21.03           C  \nATOM   1344  CG1 ILE A 101      26.227  -2.696   3.242  1.00 21.50           C  \nATOM   1345  CG2 ILE A 101      24.751  -3.311   5.208  1.00 19.72           C  \nATOM   1346  CD1 ILE A 101      27.506  -2.553   4.084  1.00 22.58           C  \nATOM   1347  H   ILE A 101      23.786  -0.604   1.949  1.00 23.51           H  \nATOM   1348  HA  ILE A 101      23.433  -3.418   2.864  1.00 21.26           H  \nATOM   1349  HB  ILE A 101      25.049  -1.341   4.391  1.00 21.03           H  \nATOM   1350 HG13 ILE A 101      26.338  -2.050   2.372  1.00 21.50           H  \nATOM   1351 HG12 ILE A 101      26.162  -3.711   2.852  1.00 21.50           H  \nATOM   1352 HG21 ILE A 101      25.608  -3.268   5.879  1.00 19.72           H  \nATOM   1353 HG22 ILE A 101      23.874  -3.074   5.811  1.00 19.72           H  \nATOM   1354 HG23 ILE A 101      24.646  -4.344   4.877  1.00 19.72           H  \nATOM   1355 HD11 ILE A 101      28.371  -2.365   3.448  1.00 22.58           H  \nATOM   1356 HD12 ILE A 101      27.433  -1.726   4.791  1.00 22.58           H  \nATOM   1357 HD13 ILE A 101      27.708  -3.461   4.651  1.00 22.58           H  \nATOM   1358  N   PHE A 102      21.428  -2.574   4.056  1.00 20.90           N  \nATOM   1359  CA  PHE A 102      20.280  -2.239   4.896  1.00 21.42           C  \nATOM   1360  C   PHE A 102      20.543  -2.625   6.359  1.00 22.24           C  \nATOM   1361  O   PHE A 102      21.201  -3.632   6.615  1.00 22.50           O  \nATOM   1362  CB  PHE A 102      19.023  -2.974   4.390  1.00 21.24           C  \nATOM   1363  CG  PHE A 102      18.434  -2.482   3.079  1.00 24.65           C  \nATOM   1364  CD1 PHE A 102      17.545  -1.388   3.071  1.00 24.59           C  \nATOM   1365  CD2 PHE A 102      18.848  -3.032   1.847  1.00 23.12           C  \nATOM   1366  CE1 PHE A 102      17.011  -0.931   1.874  1.00 27.89           C  \nATOM   1367  CE2 PHE A 102      18.315  -2.550   0.657  1.00 26.02           C  \nATOM   1368  CZ  PHE A 102      17.391  -1.513   0.671  1.00 25.24           C  \nATOM   1369  H   PHE A 102      21.449  -3.517   3.690  1.00 20.90           H  \nATOM   1370  HA  PHE A 102      20.086  -1.169   4.849  1.00 21.42           H  \nATOM   1371  HB3 PHE A 102      18.231  -2.908   5.138  1.00 21.24           H  \nATOM   1372  HB2 PHE A 102      19.243  -4.035   4.295  1.00 21.24           H  \nATOM   1373  HD1 PHE A 102      17.263  -0.913   3.999  1.00 24.59           H  \nATOM   1374  HD2 PHE A 102      19.564  -3.840   1.828  1.00 23.12           H  \nATOM   1375  HE1 PHE A 102      16.305  -0.114   1.877  1.00 27.89           H  \nATOM   1376  HE2 PHE A 102      18.617  -2.981  -0.285  1.00 26.02           H  \nATOM   1377  HZ  PHE A 102      16.978  -1.148  -0.258  1.00 25.24           H  \nATOM   1378  N   ALA A 103      19.945  -1.860   7.281  1.00 19.47           N  \nATOM   1379  CA  ALA A 103      19.755  -2.227   8.677  1.00 20.05           C  \nATOM   1380  C   ALA A 103      18.246  -2.264   8.921  1.00 19.29           C  \nATOM   1381  O   ALA A 103      17.575  -1.250   8.726  1.00 18.27           O  \nATOM   1382  CB  ALA A 103      20.464  -1.237   9.610  1.00 18.35           C  \nATOM   1383  H   ALA A 103      19.478  -1.012   6.990  1.00 19.47           H  \nATOM   1384  HA  ALA A 103      20.173  -3.213   8.870  1.00 20.05           H  \nATOM   1385  HB1 ALA A 103      20.191  -1.415  10.649  1.00 18.35           H  \nATOM   1386  HB2 ALA A 103      21.543  -1.363   9.545  1.00 18.35           H  \nATOM   1387  HB3 ALA A 103      20.232  -0.200   9.375  1.00 18.35           H  \nATOM   1388  N   TYR A 104      17.754  -3.448   9.308  1.00 17.95           N  \nATOM   1389  CA  TYR A 104      16.345  -3.736   9.559  1.00 19.33           C  \nATOM   1390  C   TYR A 104      16.200  -4.308  10.975  1.00 20.55           C  \nATOM   1391  O   TYR A 104      17.114  -4.974  11.451  1.00 22.06           O  \nATOM   1392  CB  TYR A 104      15.845  -4.732   8.486  1.00 18.75           C  \nATOM   1393  CG  TYR A 104      14.369  -5.088   8.581  1.00 19.21           C  \nATOM   1394  CD1 TYR A 104      13.953  -6.183   9.364  1.00 21.30           C  \nATOM   1395  CD2 TYR A 104      13.402  -4.303   7.921  1.00 20.16           C  \nATOM   1396  CE1 TYR A 104      12.582  -6.462   9.515  1.00 21.55           C  \nATOM   1397  CE2 TYR A 104      12.031  -4.588   8.061  1.00 20.84           C  \nATOM   1398  CZ  TYR A 104      11.621  -5.671   8.861  1.00 22.27           C  \nATOM   1399  OH  TYR A 104      10.296  -5.965   8.993  1.00 22.91           O  \nATOM   1400  H   TYR A 104      18.392  -4.217   9.471  1.00 17.95           H  \nATOM   1401  HA  TYR A 104      15.759  -2.819   9.496  1.00 19.33           H  \nATOM   1402  HB3 TYR A 104      16.428  -5.655   8.536  1.00 18.75           H  \nATOM   1403  HB2 TYR A 104      16.032  -4.326   7.491  1.00 18.75           H  \nATOM   1404  HD1 TYR A 104      14.685  -6.793   9.871  1.00 21.30           H  \nATOM   1405  HD2 TYR A 104      13.708  -3.467   7.319  1.00 20.16           H  \nATOM   1406  HE1 TYR A 104      12.267  -7.288  10.129  1.00 21.55           H  \nATOM   1407  HE2 TYR A 104      11.300  -3.979   7.551  1.00 20.84           H  \nATOM   1408  HH  TYR A 104       9.725  -5.398   8.471  1.00 22.91           H  \nATOM   1409  N   GLY A 105      15.040  -4.081  11.605  1.00 19.26           N  \nATOM   1410  CA  GLY A 105      14.725  -4.644  12.911  1.00 21.52           C  \nATOM   1411  C   GLY A 105      13.948  -3.638  13.755  1.00 20.28           C  \nATOM   1412  O   GLY A 105      13.716  -2.494  13.358  1.00 18.68           O  \nATOM   1413  H   GLY A 105      14.335  -3.496  11.171  1.00 19.26           H  \nATOM   1414  HA3 GLY A 105      15.626  -4.913  13.463  1.00 21.52           H  \nATOM   1415  HA2 GLY A 105      14.135  -5.550  12.776  1.00 21.52           H  \nATOM   1416  N   GLN A 106      13.532  -4.107  14.940  1.00 21.44           N  \nATOM   1417  CA  GLN A 106      12.794  -3.351  15.948  1.00 20.84           C  \nATOM   1418  C   GLN A 106      13.602  -2.165  16.513  1.00 21.07           C  \nATOM   1419  O   GLN A 106      14.830  -2.189  16.500  1.00 21.08           O  \nATOM   1420  CB  GLN A 106      12.285  -4.341  17.023  1.00 22.65           C  \nATOM   1421  CG  GLN A 106      11.686  -3.716  18.302  1.00 25.55           C  \nATOM   1422  CD  GLN A 106      11.212  -4.756  19.314  1.00 28.83           C  \nATOM   1423  OE1 GLN A 106      11.800  -5.827  19.446  1.00 30.01           O  \nATOM   1424  NE2 GLN A 106      10.160  -4.423  20.062  1.00 30.80           N  \nATOM   1425  H   GLN A 106      13.737  -5.069  15.184  1.00 21.44           H  \nATOM   1426  HA  GLN A 106      11.921  -2.955  15.433  1.00 20.84           H  \nATOM   1427  HB3 GLN A 106      13.097  -5.003  17.309  1.00 22.65           H  \nATOM   1428  HB2 GLN A 106      11.533  -4.986  16.564  1.00 22.65           H  \nATOM   1429  HG3 GLN A 106      10.860  -3.055  18.037  1.00 25.55           H  \nATOM   1430  HG2 GLN A 106      12.430  -3.114  18.820  1.00 25.55           H  \nATOM   1431 HE22 GLN A 106       9.782  -5.072  20.738  1.00 30.80           H  \nATOM   1432 HE21 GLN A 106       9.710  -3.527  19.937  1.00 30.80           H  \nATOM   1433  N   THR A 107      12.892  -1.140  17.001  1.00 22.00           N  \nATOM   1434  CA  THR A 107      13.447   0.056  17.620  1.00 22.73           C  \nATOM   1435  C   THR A 107      14.171  -0.302  18.923  1.00 24.87           C  \nATOM   1436  O   THR A 107      13.597  -0.965  19.788  1.00 22.44           O  \nATOM   1437  CB  THR A 107      12.342   1.100  17.933  1.00 22.42           C  \nATOM   1438  OG1 THR A 107      11.751   1.514  16.718  1.00 21.89           O  \nATOM   1439  CG2 THR A 107      12.816   2.371  18.664  1.00 22.99           C  \nATOM   1440  H   THR A 107      11.882  -1.188  16.966  1.00 22.00           H  \nATOM   1441  HA  THR A 107      14.161   0.483  16.918  1.00 22.73           H  \nATOM   1442  HB  THR A 107      11.556   0.631  18.527  1.00 22.42           H  \nATOM   1443  HG1 THR A 107      10.878   1.871  16.912  1.00 21.89           H  \nATOM   1444 HG21 THR A 107      12.005   3.093  18.758  1.00 22.99           H  \nATOM   1445 HG22 THR A 107      13.164   2.156  19.675  1.00 22.99           H  \nATOM   1446 HG23 THR A 107      13.633   2.857  18.128  1.00 22.99           H  \nATOM   1447  N   GLY A 108      15.426   0.146  19.009  1.00 25.38           N  \nATOM   1448  CA  GLY A 108      16.298  -0.095  20.144  1.00 25.41           C  \nATOM   1449  C   GLY A 108      17.017  -1.451  20.065  1.00 23.92           C  \nATOM   1450  O   GLY A 108      17.517  -1.888  21.099  1.00 21.87           O  \nATOM   1451  H   GLY A 108      15.804   0.707  18.251  1.00 25.38           H  \nATOM   1452  HA3 GLY A 108      15.743  -0.023  21.081  1.00 25.41           H  \nATOM   1453  HA2 GLY A 108      17.032   0.707  20.154  1.00 25.41           H  \nATOM   1454  N   THR A 109      17.076  -2.123  18.898  1.00 21.42           N  \nATOM   1455  CA  THR A 109      17.781  -3.405  18.737  1.00 22.55           C  \nATOM   1456  C   THR A 109      19.199  -3.267  18.150  1.00 24.86           C  \nATOM   1457  O   THR A 109      19.950  -4.237  18.261  1.00 23.18           O  \nATOM   1458  CB  THR A 109      16.997  -4.425  17.881  1.00 25.44           C  \nATOM   1459  OG1 THR A 109      16.842  -4.014  16.541  1.00 25.10           O  \nATOM   1460  CG2 THR A 109      15.633  -4.772  18.479  1.00 23.33           C  \nATOM   1461  H   THR A 109      16.676  -1.715  18.062  1.00 21.42           H  \nATOM   1462  HA  THR A 109      17.907  -3.876  19.711  1.00 22.55           H  \nATOM   1463  HB  THR A 109      17.569  -5.351  17.845  1.00 25.44           H  \nATOM   1464  HG1 THR A 109      16.186  -3.307  16.514  1.00 25.10           H  \nATOM   1465 HG21 THR A 109      15.155  -5.552  17.892  1.00 23.33           H  \nATOM   1466 HG22 THR A 109      15.742  -5.149  19.493  1.00 23.33           H  \nATOM   1467 HG23 THR A 109      14.966  -3.911  18.523  1.00 23.33           H  \nATOM   1468  N   GLY A 110      19.571  -2.092  17.614  1.00 22.69           N  \nATOM   1469  CA  GLY A 110      20.961  -1.794  17.276  1.00 22.97           C  \nATOM   1470  C   GLY A 110      21.173  -1.403  15.813  1.00 23.46           C  \nATOM   1471  O   GLY A 110      22.295  -1.577  15.341  1.00 22.88           O  \nATOM   1472  H   GLY A 110      18.894  -1.346  17.498  1.00 22.69           H  \nATOM   1473  HA3 GLY A 110      21.636  -2.620  17.506  1.00 22.97           H  \nATOM   1474  HA2 GLY A 110      21.290  -0.967  17.897  1.00 22.97           H  \nATOM   1475  N   LYS A 111      20.159  -0.894  15.085  1.00 19.23           N  \nATOM   1476  CA  LYS A 111      20.320  -0.437  13.696  1.00 20.76           C  \nATOM   1477  C   LYS A 111      21.287   0.753  13.576  1.00 20.44           C  \nATOM   1478  O   LYS A 111      22.252   0.649  12.821  1.00 21.60           O  \nATOM   1479  CB  LYS A 111      18.975  -0.072  13.046  1.00 18.15           C  \nATOM   1480  CG  LYS A 111      17.980  -1.229  12.902  1.00 21.24           C  \nATOM   1481  CD  LYS A 111      16.680  -0.802  12.193  1.00 20.68           C  \nATOM   1482  CE  LYS A 111      15.860   0.293  12.895  1.00 18.44           C  \nATOM   1483  NZ  LYS A 111      15.512  -0.068  14.276  1.00 18.27           N1+\nATOM   1484  H   LYS A 111      19.254  -0.729  15.516  1.00 19.23           H  \nATOM   1485  HA  LYS A 111      20.746  -1.266  13.128  1.00 20.76           H  \nATOM   1486  HB3 LYS A 111      19.175   0.306  12.045  1.00 18.15           H  \nATOM   1487  HB2 LYS A 111      18.514   0.747  13.593  1.00 18.15           H  \nATOM   1488  HG3 LYS A 111      17.754  -1.645  13.883  1.00 21.24           H  \nATOM   1489  HG2 LYS A 111      18.443  -2.037  12.336  1.00 21.24           H  \nATOM   1490  HD3 LYS A 111      16.047  -1.674  12.051  1.00 20.68           H  \nATOM   1491  HD2 LYS A 111      16.922  -0.454  11.189  1.00 20.68           H  \nATOM   1492  HE3 LYS A 111      14.929   0.454  12.353  1.00 18.44           H  \nATOM   1493  HE2 LYS A 111      16.395   1.242  12.901  1.00 18.44           H  \nATOM   1494  HZ1 LYS A 111      16.356  -0.186  14.826  1.00 18.27           H  \nATOM   1495  HZ2 LYS A 111      14.963   0.677  14.684  1.00 18.27           H  \nATOM   1496  HZ3 LYS A 111      14.983  -0.929  14.281  1.00 18.27           H  \nATOM   1497  N   THR A 112      21.037   1.827  14.348  1.00 20.23           N  \nATOM   1498  CA  THR A 112      21.883   3.023  14.425  1.00 21.91           C  \nATOM   1499  C   THR A 112      23.283   2.719  14.991  1.00 21.96           C  \nATOM   1500  O   THR A 112      24.266   3.230  14.460  1.00 20.36           O  \nATOM   1501  CB  THR A 112      21.250   4.137  15.307  1.00 23.15           C  \nATOM   1502  OG1 THR A 112      19.962   4.458  14.824  1.00 24.85           O  \nATOM   1503  CG2 THR A 112      22.054   5.448  15.386  1.00 22.97           C  \nATOM   1504  H   THR A 112      20.204   1.838  14.930  1.00 20.23           H  \nATOM   1505  HA  THR A 112      22.007   3.408  13.411  1.00 21.91           H  \nATOM   1506  HB  THR A 112      21.113   3.767  16.322  1.00 23.15           H  \nATOM   1507  HG1 THR A 112      19.384   3.697  14.974  1.00 24.85           H  \nATOM   1508 HG21 THR A 112      21.507   6.208  15.946  1.00 22.97           H  \nATOM   1509 HG22 THR A 112      23.015   5.318  15.883  1.00 22.97           H  \nATOM   1510 HG23 THR A 112      22.242   5.845  14.389  1.00 22.97           H  \nATOM   1511  N   PHE A 113      23.354   1.861  16.023  1.00 22.76           N  \nATOM   1512  CA  PHE A 113      24.592   1.384  16.635  1.00 23.80           C  \nATOM   1513  C   PHE A 113      25.478   0.622  15.637  1.00 21.95           C  \nATOM   1514  O   PHE A 113      26.684   0.843  15.619  1.00 22.14           O  \nATOM   1515  CB  PHE A 113      24.269   0.536  17.883  1.00 23.71           C  \nATOM   1516  CG  PHE A 113      25.481   0.078  18.677  1.00 26.76           C  \nATOM   1517  CD1 PHE A 113      26.063   0.946  19.624  1.00 27.02           C  \nATOM   1518  CD2 PHE A 113      26.141  -1.129  18.359  1.00 26.47           C  \nATOM   1519  CE1 PHE A 113      27.228   0.578  20.283  1.00 27.82           C  \nATOM   1520  CE2 PHE A 113      27.308  -1.475  19.024  1.00 29.17           C  \nATOM   1521  CZ  PHE A 113      27.843  -0.632  19.988  1.00 28.08           C  \nATOM   1522  H   PHE A 113      22.490   1.526  16.442  1.00 22.76           H  \nATOM   1523  HA  PHE A 113      25.145   2.267  16.963  1.00 23.80           H  \nATOM   1524  HB3 PHE A 113      23.679  -0.338  17.603  1.00 23.71           H  \nATOM   1525  HB2 PHE A 113      23.637   1.118  18.554  1.00 23.71           H  \nATOM   1526  HD1 PHE A 113      25.601   1.897  19.842  1.00 27.02           H  \nATOM   1527  HD2 PHE A 113      25.737  -1.787  17.604  1.00 26.47           H  \nATOM   1528  HE1 PHE A 113      27.658   1.237  21.023  1.00 27.82           H  \nATOM   1529  HE2 PHE A 113      27.800  -2.408  18.796  1.00 29.17           H  \nATOM   1530  HZ  PHE A 113      28.744  -0.921  20.505  1.00 28.08           H  \nATOM   1531  N   THR A 114      24.870  -0.227  14.795  1.00 21.64           N  \nATOM   1532  CA  THR A 114      25.576  -0.934  13.733  1.00 22.49           C  \nATOM   1533  C   THR A 114      26.054   0.029  12.631  1.00 24.03           C  \nATOM   1534  O   THR A 114      27.251   0.055  12.356  1.00 20.85           O  \nATOM   1535  CB  THR A 114      24.714  -2.051  13.092  1.00 24.26           C  \nATOM   1536  OG1 THR A 114      24.377  -3.012  14.073  1.00 21.97           O  \nATOM   1537  CG2 THR A 114      25.388  -2.795  11.930  1.00 22.94           C  \nATOM   1538  H   THR A 114      23.869  -0.367  14.852  1.00 21.64           H  \nATOM   1539  HA  THR A 114      26.462  -1.396  14.170  1.00 22.49           H  \nATOM   1540  HB  THR A 114      23.774  -1.629  12.732  1.00 24.26           H  \nATOM   1541  HG1 THR A 114      23.727  -2.617  14.666  1.00 21.97           H  \nATOM   1542 HG21 THR A 114      24.766  -3.619  11.597  1.00 22.94           H  \nATOM   1543 HG22 THR A 114      25.531  -2.149  11.065  1.00 22.94           H  \nATOM   1544 HG23 THR A 114      26.358  -3.198  12.221  1.00 22.94           H  \nATOM   1545  N   MET A 115      25.125   0.805  12.046  1.00 23.61           N  \nATOM   1546  CA  MET A 115      25.385   1.675  10.898  1.00 25.56           C  \nATOM   1547  C   MET A 115      26.330   2.850  11.186  1.00 25.01           C  \nATOM   1548  O   MET A 115      27.101   3.210  10.302  1.00 22.73           O  \nATOM   1549  CB  MET A 115      24.050   2.181  10.296  1.00 28.20           C  \nATOM   1550  CG  MET A 115      23.882   1.813   8.819  1.00 36.97           C  \nATOM   1551  SD  MET A 115      23.787   0.024   8.540  1.00 41.03           S  \nATOM   1552  CE  MET A 115      24.716  -0.077   7.001  1.00 40.29           C  \nATOM   1553  H   MET A 115      24.161   0.751  12.351  1.00 23.61           H  \nATOM   1554  HA  MET A 115      25.889   1.049  10.161  1.00 25.56           H  \nATOM   1555  HB3 MET A 115      23.960   3.262  10.401  1.00 28.20           H  \nATOM   1556  HB2 MET A 115      23.194   1.784  10.837  1.00 28.20           H  \nATOM   1557  HG3 MET A 115      24.714   2.230   8.252  1.00 36.97           H  \nATOM   1558  HG2 MET A 115      22.978   2.270   8.415  1.00 36.97           H  \nATOM   1559  HE1 MET A 115      24.860  -1.119   6.736  1.00 40.29           H  \nATOM   1560  HE2 MET A 115      24.180   0.428   6.199  1.00 40.29           H  \nATOM   1561  HE3 MET A 115      25.697   0.381   7.124  1.00 40.29           H  \nATOM   1562  N   GLU A 116      26.241   3.432  12.389  1.00 24.06           N  \nATOM   1563  CA  GLU A 116      26.899   4.688  12.749  1.00 25.23           C  \nATOM   1564  C   GLU A 116      27.826   4.525  13.943  1.00 25.96           C  \nATOM   1565  O   GLU A 116      28.910   5.108  13.950  1.00 25.46           O  \nATOM   1566  CB  GLU A 116      25.842   5.731  13.139  1.00 25.27           C  \nATOM   1567  CG  GLU A 116      24.681   5.814  12.145  1.00 28.22           C  \nATOM   1568  CD  GLU A 116      23.925   7.134  12.194  1.00 28.85           C  \nATOM   1569  OE1 GLU A 116      23.921   7.810  13.248  1.00 30.85           O  \nATOM   1570  OE2 GLU A 116      23.365   7.458  11.130  1.00 32.46           O1-\nATOM   1571  H   GLU A 116      25.565   3.083  13.058  1.00 24.06           H  \nATOM   1572  HA  GLU A 116      27.482   5.077  11.912  1.00 25.23           H  \nATOM   1573  HB3 GLU A 116      26.339   6.696  13.227  1.00 25.27           H  \nATOM   1574  HB2 GLU A 116      25.435   5.536  14.133  1.00 25.27           H  \nATOM   1575  HG3 GLU A 116      23.969   5.011  12.337  1.00 28.22           H  \nATOM   1576  HG2 GLU A 116      25.051   5.652  11.135  1.00 28.22           H  \nATOM   1577  N   GLY A 117      27.354   3.768  14.944  1.00 24.48           N  \nATOM   1578  CA  GLY A 117      27.987   3.678  16.245  1.00 25.32           C  \nATOM   1579  C   GLY A 117      27.735   4.949  17.053  1.00 27.26           C  \nATOM   1580  O   GLY A 117      26.839   5.745  16.765  1.00 27.39           O  \nATOM   1581  H   GLY A 117      26.444   3.337  14.849  1.00 24.48           H  \nATOM   1582  HA3 GLY A 117      29.054   3.530  16.112  1.00 25.32           H  \nATOM   1583  HA2 GLY A 117      27.601   2.831  16.808  1.00 25.32           H  \nATOM   1584  N   GLU A 118      28.550   5.102  18.096  1.00 28.11           N  \nATOM   1585  CA  GLU A 118      28.487   6.196  19.053  1.00 28.54           C  \nATOM   1586  C   GLU A 118      29.873   6.386  19.675  1.00 29.30           C  \nATOM   1587  O   GLU A 118      30.763   5.558  19.483  1.00 27.87           O  \nATOM   1588  CB  GLU A 118      27.388   5.893  20.096  1.00 31.14           C  \nATOM   1589  CG  GLU A 118      27.600   4.600  20.918  1.00 32.60           C  \nATOM   1590  CD  GLU A 118      26.412   4.280  21.833  1.00 34.85           C  \nATOM   1591  OE1 GLU A 118      25.272   4.234  21.316  1.00 33.99           O  \nATOM   1592  OE2 GLU A 118      26.658   4.072  23.040  1.00 36.88           O1-\nATOM   1593  H   GLU A 118      29.272   4.415  18.270  1.00 28.11           H  \nATOM   1594  HA  GLU A 118      28.238   7.120  18.528  1.00 28.54           H  \nATOM   1595  HB3 GLU A 118      26.429   5.861  19.577  1.00 31.14           H  \nATOM   1596  HB2 GLU A 118      27.307   6.731  20.788  1.00 31.14           H  \nATOM   1597  HG3 GLU A 118      28.514   4.679  21.509  1.00 32.60           H  \nATOM   1598  HG2 GLU A 118      27.741   3.746  20.254  1.00 32.60           H  \nATOM   1599  N   ARG A 119      30.028   7.492  20.411  1.00 28.64           N  \nATOM   1600  CA  ARG A 119      31.229   7.764  21.190  1.00 31.10           C  \nATOM   1601  C   ARG A 119      31.181   7.022  22.530  1.00 30.49           C  \nATOM   1602  O   ARG A 119      30.154   7.060  23.212  1.00 30.81           O  \nATOM   1603  CB  ARG A 119      31.395   9.287  21.404  1.00 31.76           C  \nATOM   1604  CG  ARG A 119      31.425  10.139  20.114  1.00 32.25           C  \nATOM   1605  CD  ARG A 119      32.334   9.605  18.990  1.00 35.36           C  \nATOM   1606  NE  ARG A 119      33.708   9.358  19.453  1.00 36.57           N  \nATOM   1607  CZ  ARG A 119      34.644  10.249  19.821  1.00 34.93           C  \nATOM   1608  NH1 ARG A 119      34.510  11.570  19.649  1.00 36.05           N  \nATOM   1609  NH2 ARG A 119      35.750   9.786  20.404  1.00 36.63           N1+\nATOM   1610  H   ARG A 119      29.262   8.140  20.519  1.00 28.64           H  \nATOM   1611  HA  ARG A 119      32.092   7.396  20.634  1.00 31.10           H  \nATOM   1612  HB3 ARG A 119      32.321   9.460  21.955  1.00 31.76           H  \nATOM   1613  HB2 ARG A 119      30.610   9.670  22.054  1.00 31.76           H  \nATOM   1614  HG3 ARG A 119      31.628  11.190  20.323  1.00 32.25           H  \nATOM   1615  HG2 ARG A 119      30.407  10.127  19.723  1.00 32.25           H  \nATOM   1616  HD3 ARG A 119      32.416  10.358  18.212  1.00 35.36           H  \nATOM   1617  HD2 ARG A 119      31.894   8.735  18.510  1.00 35.36           H  \nATOM   1618  HE  ARG A 119      33.910   8.387  19.662  1.00 36.57           H  \nATOM   1619 HH12 ARG A 119      35.227  12.208  19.963  1.00 36.05           H  \nATOM   1620 HH11 ARG A 119      33.688  11.937  19.185  1.00 36.05           H  \nATOM   1621 HH22 ARG A 119      36.471  10.409  20.742  1.00 36.63           H  \nATOM   1622 HH21 ARG A 119      35.849   8.793  20.574  1.00 36.63           H  \nATOM   1623  N   SER A 120      32.322   6.419  22.899  1.00 32.22           N  \nATOM   1624  CA  SER A 120      32.587   5.871  24.228  1.00 32.57           C  \nATOM   1625  C   SER A 120      32.531   7.002  25.279  1.00 32.68           C  \nATOM   1626  O   SER A 120      33.111   8.060  25.020  1.00 31.36           O  \nATOM   1627  CB  SER A 120      33.986   5.226  24.243  1.00 32.71           C  \nATOM   1628  OG  SER A 120      33.976   3.966  23.608  1.00 34.94           O  \nATOM   1629  H   SER A 120      33.108   6.418  22.259  1.00 32.22           H  \nATOM   1630  HA  SER A 120      31.849   5.097  24.407  1.00 32.57           H  \nATOM   1631  HB3 SER A 120      34.331   5.067  25.266  1.00 32.71           H  \nATOM   1632  HB2 SER A 120      34.717   5.867  23.761  1.00 32.71           H  \nATOM   1633  HG  SER A 120      33.912   4.110  22.657  1.00 34.94           H  \nATOM   1634  N   PRO A 121      31.827   6.786  26.416  1.00 34.84           N  \nATOM   1635  CA  PRO A 121      31.739   7.769  27.517  1.00 37.38           C  \nATOM   1636  C   PRO A 121      33.075   8.361  28.004  1.00 39.81           C  \nATOM   1637  O   PRO A 121      34.088   7.662  28.018  1.00 39.38           O  \nATOM   1638  CB  PRO A 121      31.059   6.978  28.647  1.00 38.04           C  \nATOM   1639  CG  PRO A 121      30.200   5.954  27.933  1.00 38.85           C  \nATOM   1640  CD  PRO A 121      31.046   5.584  26.725  1.00 35.74           C  \nATOM   1641  HA  PRO A 121      31.078   8.569  27.179  1.00 37.38           H  \nATOM   1642  HB3 PRO A 121      30.475   7.613  29.313  1.00 38.04           H  \nATOM   1643  HB2 PRO A 121      31.801   6.457  29.255  1.00 38.04           H  \nATOM   1644  HG3 PRO A 121      29.278   6.431  27.598  1.00 38.85           H  \nATOM   1645  HG2 PRO A 121      29.932   5.099  28.554  1.00 38.85           H  \nATOM   1646  HD2 PRO A 121      31.729   4.767  26.962  1.00 35.74           H  \nATOM   1647  HD3 PRO A 121      30.387   5.270  25.915  1.00 35.74           H  \nATOM   1648  N   ASN A 122      33.023   9.640  28.414  1.00 41.25           N  \nATOM   1649  CA  ASN A 122      34.096  10.377  29.097  1.00 43.22           C  \nATOM   1650  C   ASN A 122      35.334  10.693  28.223  1.00 44.35           C  \nATOM   1651  O   ASN A 122      36.402  10.950  28.778  1.00 44.32           O  \nATOM   1652  CB  ASN A 122      34.481   9.651  30.421  1.00 42.57           C  \nATOM   1653  CG  ASN A 122      35.081  10.549  31.509  1.00 44.13           C  \nATOM   1654  OD1 ASN A 122      34.754  11.729  31.616  1.00 43.28           O  \nATOM   1655  ND2 ASN A 122      35.964   9.982  32.334  1.00 42.61           N  \nATOM   1656  H   ASN A 122      32.146  10.134  28.344  1.00 41.25           H  \nATOM   1657  HA  ASN A 122      33.708  11.369  29.330  1.00 43.22           H  \nATOM   1658  HB3 ASN A 122      35.141   8.804  30.221  1.00 42.57           H  \nATOM   1659  HB2 ASN A 122      33.580   9.230  30.870  1.00 42.57           H  \nATOM   1660 HD22 ASN A 122      36.390  10.528  33.068  1.00 42.61           H  \nATOM   1661 HD21 ASN A 122      36.221   9.012  32.222  1.00 42.61           H  \nATOM   1662  N   GLU A 123      35.182  10.689  26.884  1.00 44.87           N  \nATOM   1663  CA  GLU A 123      36.237  10.983  25.900  1.00 45.91           C  \nATOM   1664  C   GLU A 123      37.492  10.091  26.054  1.00 45.85           C  \nATOM   1665  O   GLU A 123      38.608  10.613  26.022  1.00 45.69           O  \nATOM   1666  CB  GLU A 123      36.618  12.488  25.904  1.00 46.51           C  \nATOM   1667  CG  GLU A 123      35.465  13.470  25.625  1.00 49.83           C  \nATOM   1668  CD  GLU A 123      35.978  14.909  25.460  1.00 51.36           C  \nATOM   1669  OE1 GLU A 123      36.522  15.450  26.449  1.00 52.20           O  \nATOM   1670  OE2 GLU A 123      35.824  15.447  24.341  1.00 52.40           O1-\nATOM   1671  H   GLU A 123      34.277  10.463  26.499  1.00 44.87           H  \nATOM   1672  HA  GLU A 123      35.817  10.750  24.921  1.00 45.91           H  \nATOM   1673  HB3 GLU A 123      37.388  12.660  25.149  1.00 46.51           H  \nATOM   1674  HB2 GLU A 123      37.082  12.744  26.858  1.00 46.51           H  \nATOM   1675  HG3 GLU A 123      34.742  13.446  26.442  1.00 49.83           H  \nATOM   1676  HG2 GLU A 123      34.926  13.158  24.729  1.00 49.83           H  \nATOM   1677  N   GLU A 124      37.301   8.770  26.239  1.00 45.90           N  \nATOM   1678  CA  GLU A 124      38.400   7.801  26.356  1.00 46.68           C  \nATOM   1679  C   GLU A 124      39.345   7.778  25.144  1.00 46.72           C  \nATOM   1680  O   GLU A 124      40.561   7.776  25.328  1.00 46.68           O  \nATOM   1681  CB  GLU A 124      37.866   6.373  26.591  1.00 48.60           C  \nATOM   1682  CG  GLU A 124      37.466   6.069  28.046  1.00 51.23           C  \nATOM   1683  CD  GLU A 124      37.313   4.561  28.298  1.00 52.35           C  \nATOM   1684  OE1 GLU A 124      38.315   3.834  28.112  1.00 52.94           O  \nATOM   1685  OE2 GLU A 124      36.197   4.153  28.687  1.00 53.19           O1-\nATOM   1686  H   GLU A 124      36.364   8.397  26.284  1.00 45.90           H  \nATOM   1687  HA  GLU A 124      39.004   8.092  27.218  1.00 46.68           H  \nATOM   1688  HB3 GLU A 124      38.611   5.649  26.254  1.00 48.60           H  \nATOM   1689  HB2 GLU A 124      36.994   6.206  25.958  1.00 48.60           H  \nATOM   1690  HG3 GLU A 124      36.548   6.602  28.299  1.00 51.23           H  \nATOM   1691  HG2 GLU A 124      38.231   6.442  28.728  1.00 51.23           H  \nATOM   1692  N   TYR A 125      38.753   7.747  23.944  1.00 44.20           N  \nATOM   1693  CA  TYR A 125      39.460   7.603  22.678  1.00 43.39           C  \nATOM   1694  C   TYR A 125      39.227   8.852  21.824  1.00 43.25           C  \nATOM   1695  O   TYR A 125      38.278   9.603  22.054  1.00 43.62           O  \nATOM   1696  CB  TYR A 125      38.926   6.355  21.932  1.00 43.13           C  \nATOM   1697  CG  TYR A 125      38.839   5.088  22.766  1.00 42.67           C  \nATOM   1698  CD1 TYR A 125      37.653   4.810  23.472  1.00 41.89           C  \nATOM   1699  CD2 TYR A 125      39.932   4.203  22.861  1.00 42.68           C  \nATOM   1700  CE1 TYR A 125      37.562   3.675  24.298  1.00 41.87           C  \nATOM   1701  CE2 TYR A 125      39.838   3.056  23.677  1.00 40.06           C  \nATOM   1702  CZ  TYR A 125      38.658   2.799  24.404  1.00 41.85           C  \nATOM   1703  OH  TYR A 125      38.576   1.706  25.216  1.00 42.69           O  \nATOM   1704  H   TYR A 125      37.745   7.806  23.885  1.00 44.20           H  \nATOM   1705  HA  TYR A 125      40.534   7.488  22.833  1.00 43.39           H  \nATOM   1706  HB3 TYR A 125      39.537   6.153  21.052  1.00 43.13           H  \nATOM   1707  HB2 TYR A 125      37.923   6.559  21.551  1.00 43.13           H  \nATOM   1708  HD1 TYR A 125      36.819   5.489  23.400  1.00 41.89           H  \nATOM   1709  HD2 TYR A 125      40.845   4.406  22.320  1.00 42.68           H  \nATOM   1710  HE1 TYR A 125      36.654   3.487  24.852  1.00 41.87           H  \nATOM   1711  HE2 TYR A 125      40.679   2.383  23.755  1.00 40.06           H  \nATOM   1712  HH  TYR A 125      37.807   1.727  25.790  1.00 42.69           H  \nATOM   1713  N   THR A 126      40.058   8.987  20.785  1.00 42.92           N  \nATOM   1714  CA  THR A 126      39.752   9.778  19.596  1.00 43.57           C  \nATOM   1715  C   THR A 126      38.758   8.984  18.710  1.00 42.84           C  \nATOM   1716  O   THR A 126      38.630   7.772  18.894  1.00 42.17           O  \nATOM   1717  CB  THR A 126      41.062  10.065  18.818  1.00 44.90           C  \nATOM   1718  OG1 THR A 126      41.562   8.932  18.130  1.00 44.67           O  \nATOM   1719  CG2 THR A 126      42.184  10.664  19.681  1.00 45.17           C  \nATOM   1720  H   THR A 126      40.829   8.343  20.678  1.00 42.92           H  \nATOM   1721  HA  THR A 126      39.292  10.725  19.888  1.00 43.57           H  \nATOM   1722  HB  THR A 126      40.825  10.817  18.067  1.00 44.90           H  \nATOM   1723  HG1 THR A 126      41.244   8.977  17.222  1.00 44.67           H  \nATOM   1724 HG21 THR A 126      43.038  10.945  19.066  1.00 45.17           H  \nATOM   1725 HG22 THR A 126      41.843  11.560  20.200  1.00 45.17           H  \nATOM   1726 HG23 THR A 126      42.542   9.958  20.431  1.00 45.17           H  \nATOM   1727  N   TRP A 127      38.039   9.657  17.792  1.00 42.95           N  \nATOM   1728  CA  TRP A 127      36.971   9.026  16.996  1.00 43.84           C  \nATOM   1729  C   TRP A 127      37.456   7.869  16.094  1.00 44.40           C  \nATOM   1730  O   TRP A 127      36.702   6.923  15.878  1.00 42.80           O  \nATOM   1731  CB  TRP A 127      36.197  10.097  16.200  1.00 42.89           C  \nATOM   1732  CG  TRP A 127      36.894  10.708  15.021  1.00 42.66           C  \nATOM   1733  CD1 TRP A 127      37.614  11.851  15.050  1.00 44.16           C  \nATOM   1734  CD2 TRP A 127      37.031  10.178  13.662  1.00 43.10           C  \nATOM   1735  NE1 TRP A 127      38.178  12.071  13.812  1.00 43.55           N  \nATOM   1736  CE2 TRP A 127      37.867  11.064  12.923  1.00 43.27           C  \nATOM   1737  CE3 TRP A 127      36.565   9.027  12.981  1.00 45.46           C  \nATOM   1738  CZ2 TRP A 127      38.235  10.813  11.592  1.00 43.09           C  \nATOM   1739  CZ3 TRP A 127      36.904   8.778  11.635  1.00 44.80           C  \nATOM   1740  CH2 TRP A 127      37.743   9.669  10.939  1.00 45.11           C  \nATOM   1741  H   TRP A 127      38.188  10.645  17.651  1.00 42.95           H  \nATOM   1742  HA  TRP A 127      36.268   8.596  17.711  1.00 43.84           H  \nATOM   1743  HB3 TRP A 127      35.868  10.893  16.870  1.00 42.89           H  \nATOM   1744  HB2 TRP A 127      35.281   9.650  15.819  1.00 42.89           H  \nATOM   1745  HD1 TRP A 127      37.737  12.476  15.923  1.00 44.16           H  \nATOM   1746  HE1 TRP A 127      38.799  12.846  13.626  1.00 43.55           H  \nATOM   1747  HE3 TRP A 127      35.955   8.308  13.504  1.00 45.46           H  \nATOM   1748  HZ2 TRP A 127      38.917  11.486  11.102  1.00 43.09           H  \nATOM   1749  HZ3 TRP A 127      36.531   7.891  11.144  1.00 44.80           H  \nATOM   1750  HH2 TRP A 127      38.019   9.469   9.914  1.00 45.11           H  \nATOM   1751  N   GLU A 128      38.710   7.954  15.617  1.00 45.51           N  \nATOM   1752  CA  GLU A 128      39.398   6.942  14.814  1.00 46.17           C  \nATOM   1753  C   GLU A 128      39.657   5.634  15.581  1.00 44.95           C  \nATOM   1754  O   GLU A 128      39.607   4.565  14.975  1.00 45.02           O  \nATOM   1755  CB  GLU A 128      40.754   7.490  14.311  1.00 48.66           C  \nATOM   1756  CG  GLU A 128      40.691   8.813  13.515  1.00 52.56           C  \nATOM   1757  CD  GLU A 128      40.914  10.115  14.309  1.00 55.33           C  \nATOM   1758  OE1 GLU A 128      41.225  11.131  13.651  1.00 56.74           O  \nATOM   1759  OE2 GLU A 128      40.761  10.106  15.547  1.00 55.59           O1-\nATOM   1760  H   GLU A 128      39.257   8.784  15.818  1.00 45.51           H  \nATOM   1761  HA  GLU A 128      38.770   6.715  13.950  1.00 46.17           H  \nATOM   1762  HB3 GLU A 128      41.195   6.739  13.655  1.00 48.66           H  \nATOM   1763  HB2 GLU A 128      41.461   7.575  15.139  1.00 48.66           H  \nATOM   1764  HG3 GLU A 128      39.740   8.874  12.989  1.00 52.56           H  \nATOM   1765  HG2 GLU A 128      41.447   8.756  12.734  1.00 52.56           H  \nATOM   1766  N   GLU A 129      39.943   5.757  16.887  1.00 42.89           N  \nATOM   1767  CA  GLU A 129      40.312   4.658  17.778  1.00 42.13           C  \nATOM   1768  C   GLU A 129      39.141   4.139  18.624  1.00 41.35           C  \nATOM   1769  O   GLU A 129      39.318   3.133  19.310  1.00 39.97           O  \nATOM   1770  CB  GLU A 129      41.457   5.134  18.691  1.00 46.76           C  \nATOM   1771  CG  GLU A 129      42.753   5.444  17.913  1.00 51.38           C  \nATOM   1772  CD  GLU A 129      43.966   5.784  18.793  1.00 54.75           C  \nATOM   1773  OE1 GLU A 129      43.773   6.200  19.958  1.00 56.39           O  \nATOM   1774  OE2 GLU A 129      45.091   5.619  18.272  1.00 57.50           O1-\nATOM   1775  H   GLU A 129      39.949   6.677  17.305  1.00 42.89           H  \nATOM   1776  HA  GLU A 129      40.674   3.811  17.193  1.00 42.13           H  \nATOM   1777  HB3 GLU A 129      41.666   4.380  19.453  1.00 46.76           H  \nATOM   1778  HB2 GLU A 129      41.137   6.028  19.228  1.00 46.76           H  \nATOM   1779  HG3 GLU A 129      42.591   6.284  17.235  1.00 51.38           H  \nATOM   1780  HG2 GLU A 129      43.004   4.588  17.285  1.00 51.38           H  \nATOM   1781  N   ASP A 130      37.984   4.823  18.578  1.00 38.84           N  \nATOM   1782  CA  ASP A 130      36.802   4.514  19.376  1.00 36.35           C  \nATOM   1783  C   ASP A 130      36.222   3.145  18.943  1.00 34.79           C  \nATOM   1784  O   ASP A 130      35.811   3.019  17.788  1.00 33.59           O  \nATOM   1785  CB  ASP A 130      35.758   5.649  19.243  1.00 37.00           C  \nATOM   1786  CG  ASP A 130      34.789   5.722  20.430  1.00 37.96           C  \nATOM   1787  OD1 ASP A 130      34.764   6.790  21.075  1.00 37.28           O  \nATOM   1788  OD2 ASP A 130      34.098   4.718  20.702  1.00 37.20           O1-\nATOM   1789  H   ASP A 130      37.922   5.642  17.989  1.00 38.84           H  \nATOM   1790  HA  ASP A 130      37.147   4.505  20.408  1.00 36.35           H  \nATOM   1791  HB3 ASP A 130      35.182   5.546  18.322  1.00 37.00           H  \nATOM   1792  HB2 ASP A 130      36.271   6.606  19.133  1.00 37.00           H  \nATOM   1793  N   PRO A 131      36.208   2.142  19.855  1.00 34.64           N  \nATOM   1794  CA  PRO A 131      35.711   0.793  19.533  1.00 33.09           C  \nATOM   1795  C   PRO A 131      34.185   0.699  19.343  1.00 30.37           C  \nATOM   1796  O   PRO A 131      33.726  -0.330  18.848  1.00 29.21           O  \nATOM   1797  CB  PRO A 131      36.193  -0.058  20.716  1.00 34.60           C  \nATOM   1798  CG  PRO A 131      36.187   0.905  21.890  1.00 35.14           C  \nATOM   1799  CD  PRO A 131      36.628   2.219  21.257  1.00 34.51           C  \nATOM   1800  HA  PRO A 131      36.185   0.431  18.620  1.00 33.09           H  \nATOM   1801  HB3 PRO A 131      37.212  -0.398  20.526  1.00 34.60           H  \nATOM   1802  HB2 PRO A 131      35.583  -0.944  20.902  1.00 34.60           H  \nATOM   1803  HG3 PRO A 131      36.825   0.591  22.717  1.00 35.14           H  \nATOM   1804  HG2 PRO A 131      35.170   1.008  22.272  1.00 35.14           H  \nATOM   1805  HD2 PRO A 131      36.175   3.059  21.783  1.00 34.51           H  \nATOM   1806  HD3 PRO A 131      37.712   2.319  21.304  1.00 34.51           H  \nATOM   1807  N   LEU A 132      33.441   1.758  19.712  1.00 28.68           N  \nATOM   1808  CA  LEU A 132      31.997   1.874  19.520  1.00 26.61           C  \nATOM   1809  C   LEU A 132      31.618   2.564  18.198  1.00 26.87           C  \nATOM   1810  O   LEU A 132      30.422   2.668  17.942  1.00 24.37           O  \nATOM   1811  CB  LEU A 132      31.344   2.590  20.725  1.00 25.86           C  \nATOM   1812  CG  LEU A 132      31.572   1.931  22.100  1.00 27.89           C  \nATOM   1813  CD1 LEU A 132      30.827   2.718  23.197  1.00 26.82           C  \nATOM   1814  CD2 LEU A 132      31.207   0.435  22.132  1.00 27.95           C  \nATOM   1815  H   LEU A 132      33.891   2.572  20.114  1.00 28.68           H  \nATOM   1816  HA  LEU A 132      31.566   0.875  19.463  1.00 26.61           H  \nATOM   1817  HB3 LEU A 132      30.268   2.660  20.559  1.00 25.86           H  \nATOM   1818  HB2 LEU A 132      31.700   3.616  20.775  1.00 25.86           H  \nATOM   1819  HG  LEU A 132      32.636   2.006  22.323  1.00 27.89           H  \nATOM   1820 HD11 LEU A 132      31.444   2.814  24.090  1.00 26.82           H  \nATOM   1821 HD12 LEU A 132      30.565   3.725  22.871  1.00 26.82           H  \nATOM   1822 HD13 LEU A 132      29.898   2.232  23.493  1.00 26.82           H  \nATOM   1823 HD21 LEU A 132      30.730   0.145  23.068  1.00 27.95           H  \nATOM   1824 HD22 LEU A 132      30.523   0.168  21.329  1.00 27.95           H  \nATOM   1825 HD23 LEU A 132      32.101  -0.180  22.023  1.00 27.95           H  \nATOM   1826  N   ALA A 133      32.596   2.973  17.363  1.00 25.36           N  \nATOM   1827  CA  ALA A 133      32.378   3.463  15.994  1.00 25.95           C  \nATOM   1828  C   ALA A 133      31.762   2.377  15.100  1.00 25.66           C  \nATOM   1829  O   ALA A 133      32.189   1.231  15.192  1.00 23.39           O  \nATOM   1830  CB  ALA A 133      33.726   3.923  15.414  1.00 22.78           C  \nATOM   1831  H   ALA A 133      33.561   2.871  17.646  1.00 25.36           H  \nATOM   1832  HA  ALA A 133      31.692   4.309  16.039  1.00 25.95           H  \nATOM   1833  HB1 ALA A 133      33.595   4.415  14.451  1.00 22.78           H  \nATOM   1834  HB2 ALA A 133      34.219   4.632  16.078  1.00 22.78           H  \nATOM   1835  HB3 ALA A 133      34.410   3.086  15.268  1.00 22.78           H  \nATOM   1836  N   GLY A 134      30.772   2.739  14.272  1.00 26.37           N  \nATOM   1837  CA  GLY A 134      30.015   1.791  13.452  1.00 24.19           C  \nATOM   1838  C   GLY A 134      30.543   1.771  12.017  1.00 26.33           C  \nATOM   1839  O   GLY A 134      31.680   2.159  11.749  1.00 25.05           O  \nATOM   1840  H   GLY A 134      30.473   3.705  14.241  1.00 26.37           H  \nATOM   1841  HA3 GLY A 134      28.964   2.069  13.447  1.00 24.19           H  \nATOM   1842  HA2 GLY A 134      30.057   0.780  13.858  1.00 24.19           H  \nATOM   1843  N   ILE A 135      29.699   1.273  11.101  1.00 26.17           N  \nATOM   1844  CA  ILE A 135      30.011   1.047   9.689  1.00 26.40           C  \nATOM   1845  C   ILE A 135      30.429   2.323   8.931  1.00 27.39           C  \nATOM   1846  O   ILE A 135      31.471   2.289   8.285  1.00 28.26           O  \nATOM   1847  CB  ILE A 135      28.844   0.323   8.946  1.00 27.45           C  \nATOM   1848  CG1 ILE A 135      28.660  -1.103   9.526  1.00 25.10           C  \nATOM   1849  CG2 ILE A 135      28.981   0.289   7.405  1.00 27.06           C  \nATOM   1850  CD1 ILE A 135      27.487  -1.903   8.948  1.00 23.56           C  \nATOM   1851  H   ILE A 135      28.779   0.972  11.397  1.00 26.17           H  \nATOM   1852  HA  ILE A 135      30.875   0.378   9.673  1.00 26.40           H  \nATOM   1853  HB  ILE A 135      27.927   0.871   9.160  1.00 27.45           H  \nATOM   1854 HG13 ILE A 135      28.518  -1.050  10.599  1.00 25.10           H  \nATOM   1855 HG12 ILE A 135      29.574  -1.677   9.424  1.00 25.10           H  \nATOM   1856 HG21 ILE A 135      28.166  -0.257   6.934  1.00 27.06           H  \nATOM   1857 HG22 ILE A 135      28.956   1.286   6.967  1.00 27.06           H  \nATOM   1858 HG23 ILE A 135      29.913  -0.180   7.099  1.00 27.06           H  \nATOM   1859 HD11 ILE A 135      27.298  -2.788   9.554  1.00 23.56           H  \nATOM   1860 HD12 ILE A 135      26.573  -1.310   8.931  1.00 23.56           H  \nATOM   1861 HD13 ILE A 135      27.690  -2.249   7.934  1.00 23.56           H  \nATOM   1862  N   ILE A 136      29.640   3.407   9.040  1.00 28.24           N  \nATOM   1863  CA  ILE A 136      29.866   4.696   8.376  1.00 28.10           C  \nATOM   1864  C   ILE A 136      31.250   5.328   8.672  1.00 28.82           C  \nATOM   1865  O   ILE A 136      32.006   5.476   7.714  1.00 28.49           O  \nATOM   1866  CB  ILE A 136      28.701   5.708   8.631  1.00 28.83           C  \nATOM   1867  CG1 ILE A 136      27.423   5.289   7.869  1.00 30.10           C  \nATOM   1868  CG2 ILE A 136      29.016   7.183   8.289  1.00 28.01           C  \nATOM   1869  CD1 ILE A 136      26.135   5.923   8.408  1.00 29.54           C  \nATOM   1870  H   ILE A 136      28.792   3.343   9.593  1.00 28.24           H  \nATOM   1871  HA  ILE A 136      29.860   4.476   7.306  1.00 28.10           H  \nATOM   1872  HB  ILE A 136      28.461   5.661   9.692  1.00 28.83           H  \nATOM   1873 HG13 ILE A 136      27.302   4.206   7.888  1.00 30.10           H  \nATOM   1874 HG12 ILE A 136      27.528   5.562   6.821  1.00 30.10           H  \nATOM   1875 HG21 ILE A 136      28.143   7.818   8.431  1.00 28.01           H  \nATOM   1876 HG22 ILE A 136      29.802   7.596   8.919  1.00 28.01           H  \nATOM   1877 HG23 ILE A 136      29.321   7.288   7.248  1.00 28.01           H  \nATOM   1878 HD11 ILE A 136      25.308   5.213   8.387  1.00 29.54           H  \nATOM   1879 HD12 ILE A 136      26.259   6.255   9.435  1.00 29.54           H  \nATOM   1880 HD13 ILE A 136      25.844   6.792   7.820  1.00 29.54           H  \nATOM   1881  N   PRO A 137      31.603   5.656   9.942  1.00 27.97           N  \nATOM   1882  CA  PRO A 137      32.911   6.275  10.241  1.00 29.98           C  \nATOM   1883  C   PRO A 137      34.133   5.409   9.883  1.00 31.46           C  \nATOM   1884  O   PRO A 137      35.117   5.961   9.390  1.00 32.74           O  \nATOM   1885  CB  PRO A 137      32.846   6.600  11.740  1.00 30.07           C  \nATOM   1886  CG  PRO A 137      31.811   5.638  12.296  1.00 28.98           C  \nATOM   1887  CD  PRO A 137      30.800   5.538  11.161  1.00 26.54           C  \nATOM   1888  HA  PRO A 137      32.997   7.210   9.682  1.00 29.98           H  \nATOM   1889  HB3 PRO A 137      32.496   7.625  11.863  1.00 30.07           H  \nATOM   1890  HB2 PRO A 137      33.805   6.521  12.255  1.00 30.07           H  \nATOM   1891  HG3 PRO A 137      31.376   5.966  13.240  1.00 28.98           H  \nATOM   1892  HG2 PRO A 137      32.272   4.665  12.462  1.00 28.98           H  \nATOM   1893  HD2 PRO A 137      30.222   4.619  11.236  1.00 26.54           H  \nATOM   1894  HD3 PRO A 137      30.110   6.380  11.208  1.00 26.54           H  \nATOM   1895  N   ARG A 138      34.026   4.081  10.075  1.00 32.19           N  \nATOM   1896  CA  ARG A 138      35.033   3.106   9.651  1.00 31.81           C  \nATOM   1897  C   ARG A 138      35.192   3.034   8.126  1.00 34.98           C  \nATOM   1898  O   ARG A 138      36.327   2.939   7.670  1.00 35.97           O  \nATOM   1899  CB  ARG A 138      34.697   1.708  10.196  1.00 31.32           C  \nATOM   1900  CG  ARG A 138      34.800   1.593  11.720  1.00 28.44           C  \nATOM   1901  CD  ARG A 138      34.463   0.174  12.202  1.00 28.17           C  \nATOM   1902  NE  ARG A 138      34.462   0.097  13.668  1.00 28.21           N  \nATOM   1903  CZ  ARG A 138      35.517   0.038  14.500  1.00 30.29           C  \nATOM   1904  NH1 ARG A 138      36.782  -0.044  14.061  1.00 28.82           N  \nATOM   1905  NH2 ARG A 138      35.296   0.079  15.817  1.00 28.61           N1+\nATOM   1906  H   ARG A 138      33.182   3.702  10.484  1.00 32.19           H  \nATOM   1907  HA  ARG A 138      35.996   3.413  10.065  1.00 31.81           H  \nATOM   1908  HB3 ARG A 138      35.386   0.980   9.766  1.00 31.32           H  \nATOM   1909  HB2 ARG A 138      33.698   1.414   9.869  1.00 31.32           H  \nATOM   1910  HG3 ARG A 138      34.194   2.342  12.232  1.00 28.44           H  \nATOM   1911  HG2 ARG A 138      35.832   1.823  11.987  1.00 28.44           H  \nATOM   1912  HD3 ARG A 138      35.213  -0.527  11.835  1.00 28.17           H  \nATOM   1913  HD2 ARG A 138      33.508  -0.163  11.797  1.00 28.17           H  \nATOM   1914  HE  ARG A 138      33.552   0.234  14.093  1.00 28.21           H  \nATOM   1915 HH12 ARG A 138      37.554  -0.059  14.711  1.00 28.82           H  \nATOM   1916 HH11 ARG A 138      36.969  -0.061  13.069  1.00 28.82           H  \nATOM   1917 HH22 ARG A 138      36.067   0.069  16.468  1.00 28.61           H  \nATOM   1918 HH21 ARG A 138      34.354   0.176  16.172  1.00 28.61           H  \nATOM   1919  N   THR A 139      34.079   3.101   7.371  1.00 35.78           N  \nATOM   1920  CA  THR A 139      34.073   3.106   5.906  1.00 36.79           C  \nATOM   1921  C   THR A 139      34.789   4.343   5.345  1.00 37.82           C  \nATOM   1922  O   THR A 139      35.692   4.162   4.533  1.00 35.78           O  \nATOM   1923  CB  THR A 139      32.640   3.040   5.305  1.00 37.62           C  \nATOM   1924  OG1 THR A 139      32.080   1.775   5.587  1.00 35.78           O  \nATOM   1925  CG2 THR A 139      32.523   3.258   3.785  1.00 37.13           C  \nATOM   1926  H   THR A 139      33.175   3.173   7.821  1.00 35.78           H  \nATOM   1927  HA  THR A 139      34.623   2.223   5.574  1.00 36.79           H  \nATOM   1928  HB  THR A 139      32.004   3.777   5.795  1.00 37.62           H  \nATOM   1929  HG1 THR A 139      31.906   1.732   6.534  1.00 35.78           H  \nATOM   1930 HG21 THR A 139      31.495   3.118   3.457  1.00 37.13           H  \nATOM   1931 HG22 THR A 139      32.797   4.272   3.494  1.00 37.13           H  \nATOM   1932 HG23 THR A 139      33.152   2.561   3.232  1.00 37.13           H  \nATOM   1933  N   LEU A 140      34.419   5.551   5.813  1.00 39.09           N  \nATOM   1934  CA  LEU A 140      35.057   6.808   5.409  1.00 40.74           C  \nATOM   1935  C   LEU A 140      36.559   6.833   5.729  1.00 42.29           C  \nATOM   1936  O   LEU A 140      37.342   7.149   4.836  1.00 42.16           O  \nATOM   1937  CB  LEU A 140      34.361   8.037   6.044  1.00 40.56           C  \nATOM   1938  CG  LEU A 140      33.082   8.569   5.359  1.00 42.13           C  \nATOM   1939  CD1 LEU A 140      33.229   8.796   3.845  1.00 41.68           C  \nATOM   1940  CD2 LEU A 140      31.831   7.757   5.698  1.00 45.74           C  \nATOM   1941  H   LEU A 140      33.673   5.622   6.493  1.00 39.09           H  \nATOM   1942  HA  LEU A 140      34.978   6.865   4.325  1.00 40.74           H  \nATOM   1943  HB3 LEU A 140      35.068   8.864   6.014  1.00 40.56           H  \nATOM   1944  HB2 LEU A 140      34.175   7.859   7.104  1.00 40.56           H  \nATOM   1945  HG  LEU A 140      32.912   9.556   5.794  1.00 42.13           H  \nATOM   1946 HD11 LEU A 140      32.799   9.753   3.551  1.00 41.68           H  \nATOM   1947 HD12 LEU A 140      34.270   8.814   3.524  1.00 41.68           H  \nATOM   1948 HD13 LEU A 140      32.718   8.017   3.282  1.00 41.68           H  \nATOM   1949 HD21 LEU A 140      30.960   8.173   5.198  1.00 45.74           H  \nATOM   1950 HD22 LEU A 140      31.923   6.716   5.390  1.00 45.74           H  \nATOM   1951 HD23 LEU A 140      31.633   7.798   6.767  1.00 45.74           H  \nATOM   1952  N   HIS A 141      36.933   6.455   6.965  1.00 42.88           N  \nATOM   1953  CA  HIS A 141      38.323   6.362   7.417  1.00 44.87           C  \nATOM   1954  C   HIS A 141      39.172   5.410   6.556  1.00 44.22           C  \nATOM   1955  O   HIS A 141      40.252   5.805   6.121  1.00 43.81           O  \nATOM   1956  CB  HIS A 141      38.364   5.966   8.907  1.00 46.81           C  \nATOM   1957  CG  HIS A 141      39.755   5.914   9.494  1.00 50.62           C  \nATOM   1958  ND1 HIS A 141      40.556   4.783   9.456  1.00 52.14           N  \nATOM   1959  CD2 HIS A 141      40.506   6.879  10.125  1.00 51.05           C  \nATOM   1960  CE1 HIS A 141      41.724   5.111  10.016  1.00 52.04           C  \nATOM   1961  NE2 HIS A 141      41.765   6.367  10.446  1.00 50.72           N  \nATOM   1962  H   HIS A 141      36.226   6.201   7.644  1.00 42.88           H  \nATOM   1963  HA  HIS A 141      38.755   7.360   7.325  1.00 44.87           H  \nATOM   1964  HB3 HIS A 141      37.884   4.998   9.058  1.00 46.81           H  \nATOM   1965  HB2 HIS A 141      37.789   6.684   9.490  1.00 46.81           H  \nATOM   1966  HD1 HIS A 141      40.324   3.889   9.047  1.00 52.14           H  \nATOM   1967  HD2 HIS A 141      40.244   7.900  10.357  1.00 51.05           H  \nATOM   1968  HE1 HIS A 141      42.555   4.426  10.104  1.00 52.04           H  \nATOM   1969  N   GLN A 142      38.652   4.194   6.318  1.00 43.78           N  \nATOM   1970  CA  GLN A 142      39.307   3.161   5.521  1.00 44.19           C  \nATOM   1971  C   GLN A 142      39.404   3.486   4.024  1.00 44.75           C  \nATOM   1972  O   GLN A 142      40.373   3.054   3.409  1.00 45.21           O  \nATOM   1973  CB  GLN A 142      38.637   1.795   5.758  1.00 45.44           C  \nATOM   1974  CG  GLN A 142      38.894   1.197   7.158  1.00 48.56           C  \nATOM   1975  CD  GLN A 142      40.296   0.608   7.316  1.00 50.10           C  \nATOM   1976  OE1 GLN A 142      41.260   1.338   7.532  1.00 49.63           O  \nATOM   1977  NE2 GLN A 142      40.413  -0.718   7.226  1.00 51.81           N  \nATOM   1978  H   GLN A 142      37.752   3.947   6.709  1.00 43.78           H  \nATOM   1979  HA  GLN A 142      40.332   3.100   5.881  1.00 44.19           H  \nATOM   1980  HB3 GLN A 142      38.957   1.074   5.003  1.00 45.44           H  \nATOM   1981  HB2 GLN A 142      37.565   1.911   5.604  1.00 45.44           H  \nATOM   1982  HG3 GLN A 142      38.165   0.419   7.366  1.00 48.56           H  \nATOM   1983  HG2 GLN A 142      38.747   1.951   7.932  1.00 48.56           H  \nATOM   1984 HE22 GLN A 142      41.319  -1.150   7.330  1.00 51.81           H  \nATOM   1985 HE21 GLN A 142      39.604  -1.294   7.044  1.00 51.81           H  \nATOM   1986  N   ILE A 143      38.466   4.278   3.470  1.00 43.60           N  \nATOM   1987  CA  ILE A 143      38.564   4.817   2.108  1.00 43.61           C  \nATOM   1988  C   ILE A 143      39.809   5.711   1.944  1.00 45.62           C  \nATOM   1989  O   ILE A 143      40.591   5.468   1.028  1.00 44.70           O  \nATOM   1990  CB  ILE A 143      37.278   5.581   1.658  1.00 42.40           C  \nATOM   1991  CG1 ILE A 143      36.127   4.588   1.384  1.00 40.31           C  \nATOM   1992  CG2 ILE A 143      37.458   6.515   0.436  1.00 40.71           C  \nATOM   1993  CD1 ILE A 143      34.728   5.228   1.419  1.00 38.90           C  \nATOM   1994  H   ILE A 143      37.676   4.585   4.022  1.00 43.60           H  \nATOM   1995  HA  ILE A 143      38.693   3.965   1.437  1.00 43.61           H  \nATOM   1996  HB  ILE A 143      36.963   6.210   2.489  1.00 42.40           H  \nATOM   1997 HG13 ILE A 143      36.150   3.777   2.110  1.00 40.31           H  \nATOM   1998 HG12 ILE A 143      36.285   4.097   0.424  1.00 40.31           H  \nATOM   1999 HG21 ILE A 143      36.514   6.960   0.128  1.00 40.71           H  \nATOM   2000 HG22 ILE A 143      38.128   7.350   0.646  1.00 40.71           H  \nATOM   2001 HG23 ILE A 143      37.857   5.972  -0.421  1.00 40.71           H  \nATOM   2002 HD11 ILE A 143      33.951   4.471   1.317  1.00 38.90           H  \nATOM   2003 HD12 ILE A 143      34.555   5.750   2.359  1.00 38.90           H  \nATOM   2004 HD13 ILE A 143      34.584   5.944   0.612  1.00 38.90           H  \nATOM   2005  N   PHE A 144      40.008   6.663   2.874  1.00 46.96           N  \nATOM   2006  CA  PHE A 144      41.208   7.504   2.934  1.00 49.07           C  \nATOM   2007  C   PHE A 144      42.489   6.763   3.345  1.00 50.61           C  \nATOM   2008  O   PHE A 144      43.560   7.331   3.162  1.00 51.54           O  \nATOM   2009  CB  PHE A 144      40.983   8.717   3.858  1.00 48.69           C  \nATOM   2010  CG  PHE A 144      39.969   9.712   3.337  1.00 49.25           C  \nATOM   2011  CD1 PHE A 144      40.245  10.472   2.182  1.00 49.30           C  \nATOM   2012  CD2 PHE A 144      38.703   9.816   3.944  1.00 48.10           C  \nATOM   2013  CE1 PHE A 144      39.263  11.287   1.639  1.00 48.65           C  \nATOM   2014  CE2 PHE A 144      37.731  10.627   3.383  1.00 49.28           C  \nATOM   2015  CZ  PHE A 144      38.011  11.351   2.233  1.00 49.42           C  \nATOM   2016  H   PHE A 144      39.328   6.796   3.610  1.00 46.96           H  \nATOM   2017  HA  PHE A 144      41.395   7.879   1.926  1.00 49.07           H  \nATOM   2018  HB3 PHE A 144      41.917   9.259   4.012  1.00 48.69           H  \nATOM   2019  HB2 PHE A 144      40.673   8.365   4.841  1.00 48.69           H  \nATOM   2020  HD1 PHE A 144      41.215  10.416   1.714  1.00 49.30           H  \nATOM   2021  HD2 PHE A 144      38.487   9.269   4.847  1.00 48.10           H  \nATOM   2022  HE1 PHE A 144      39.468  11.865   0.749  1.00 48.65           H  \nATOM   2023  HE2 PHE A 144      36.755  10.688   3.840  1.00 49.28           H  \nATOM   2024  HZ  PHE A 144      37.248  11.968   1.796  1.00 49.42           H  \nATOM   2025  N   GLU A 145      42.386   5.537   3.881  1.00 51.76           N  \nATOM   2026  CA  GLU A 145      43.545   4.720   4.230  1.00 53.26           C  \nATOM   2027  C   GLU A 145      44.002   3.875   3.030  1.00 53.56           C  \nATOM   2028  O   GLU A 145      45.191   3.859   2.727  1.00 53.41           O  \nATOM   2029  CB  GLU A 145      43.215   3.852   5.466  1.00 54.78           C  \nATOM   2030  CG  GLU A 145      44.400   3.059   6.056  1.00 58.42           C  \nATOM   2031  CD  GLU A 145      45.499   3.967   6.626  1.00 60.55           C  \nATOM   2032  OE1 GLU A 145      46.488   4.204   5.899  1.00 61.57           O  \nATOM   2033  OE2 GLU A 145      45.330   4.414   7.783  1.00 60.12           O1-\nATOM   2034  H   GLU A 145      41.475   5.128   4.038  1.00 51.76           H  \nATOM   2035  HA  GLU A 145      44.368   5.384   4.500  1.00 53.26           H  \nATOM   2036  HB3 GLU A 145      42.444   3.132   5.197  1.00 54.78           H  \nATOM   2037  HB2 GLU A 145      42.774   4.476   6.246  1.00 54.78           H  \nATOM   2038  HG3 GLU A 145      44.823   2.387   5.308  1.00 58.42           H  \nATOM   2039  HG2 GLU A 145      44.033   2.412   6.854  1.00 58.42           H  \nATOM   2040  N   LYS A 146      43.050   3.195   2.371  1.00 52.91           N  \nATOM   2041  CA  LYS A 146      43.314   2.210   1.323  1.00 53.75           C  \nATOM   2042  C   LYS A 146      43.578   2.834  -0.060  1.00 54.11           C  \nATOM   2043  O   LYS A 146      44.247   2.187  -0.861  1.00 53.73           O  \nATOM   2044  CB  LYS A 146      42.151   1.191   1.273  1.00 54.00           C  \nATOM   2045  CG  LYS A 146      41.928   0.435   2.607  1.00 56.01           C  \nATOM   2046  CD  LYS A 146      42.075  -1.090   2.530  1.00 56.78           C  \nATOM   2047  CE  LYS A 146      40.922  -1.777   1.782  1.00 56.67           C  \nATOM   2048  NZ  LYS A 146      41.048  -3.243   1.840  1.00 56.24           N1+\nATOM   2049  H   LYS A 146      42.087   3.267   2.676  1.00 52.91           H  \nATOM   2050  HA  LYS A 146      44.217   1.659   1.597  1.00 53.75           H  \nATOM   2051  HB3 LYS A 146      42.335   0.476   0.470  1.00 54.00           H  \nATOM   2052  HB2 LYS A 146      41.227   1.705   0.999  1.00 54.00           H  \nATOM   2053  HG3 LYS A 146      40.933   0.655   2.988  1.00 56.01           H  \nATOM   2054  HG2 LYS A 146      42.617   0.799   3.370  1.00 56.01           H  \nATOM   2055  HD3 LYS A 146      42.144  -1.481   3.547  1.00 56.78           H  \nATOM   2056  HD2 LYS A 146      43.025  -1.332   2.050  1.00 56.78           H  \nATOM   2057  HE3 LYS A 146      40.897  -1.466   0.737  1.00 56.67           H  \nATOM   2058  HE2 LYS A 146      39.963  -1.500   2.222  1.00 56.67           H  \nATOM   2059  HZ1 LYS A 146      40.276  -3.650   1.322  1.00 56.24           H  \nATOM   2060  HZ2 LYS A 146      41.918  -3.530   1.417  1.00 56.24           H  \nATOM   2061  HZ3 LYS A 146      41.011  -3.557   2.799  1.00 56.24           H  \nATOM   2062  N   LEU A 147      43.076   4.056  -0.325  1.00 53.89           N  \nATOM   2063  CA  LEU A 147      43.275   4.755  -1.603  1.00 54.30           C  \nATOM   2064  C   LEU A 147      44.414   5.781  -1.547  1.00 56.38           C  \nATOM   2065  O   LEU A 147      45.034   5.990  -2.588  1.00 57.15           O  \nATOM   2066  CB  LEU A 147      41.971   5.437  -2.073  1.00 52.68           C  \nATOM   2067  CG  LEU A 147      41.046   4.548  -2.925  1.00 51.66           C  \nATOM   2068  CD1 LEU A 147      40.693   3.211  -2.254  1.00 49.87           C  \nATOM   2069  CD2 LEU A 147      39.783   5.332  -3.314  1.00 48.79           C  \nATOM   2070  H   LEU A 147      42.510   4.528   0.368  1.00 53.89           H  \nATOM   2071  HA  LEU A 147      43.561   4.039  -2.376  1.00 54.30           H  \nATOM   2072  HB3 LEU A 147      42.221   6.286  -2.709  1.00 52.68           H  \nATOM   2073  HB2 LEU A 147      41.439   5.869  -1.230  1.00 52.68           H  \nATOM   2074  HG  LEU A 147      41.570   4.305  -3.852  1.00 51.66           H  \nATOM   2075 HD11 LEU A 147      39.750   2.815  -2.616  1.00 49.87           H  \nATOM   2076 HD12 LEU A 147      41.453   2.456  -2.460  1.00 49.87           H  \nATOM   2077 HD13 LEU A 147      40.603   3.313  -1.172  1.00 49.87           H  \nATOM   2078 HD21 LEU A 147      38.968   4.674  -3.612  1.00 48.79           H  \nATOM   2079 HD22 LEU A 147      39.422   5.954  -2.494  1.00 48.79           H  \nATOM   2080 HD23 LEU A 147      39.994   5.992  -4.153  1.00 48.79           H  \nATOM   2081  N   THR A 148      44.691   6.386  -0.376  1.00 57.67           N  \nATOM   2082  CA  THR A 148      45.844   7.284  -0.198  1.00 58.54           C  \nATOM   2083  C   THR A 148      47.175   6.508  -0.107  1.00 60.02           C  \nATOM   2084  O   THR A 148      48.210   7.060  -0.480  1.00 59.77           O  \nATOM   2085  CB  THR A 148      45.720   8.185   1.059  1.00 58.20           C  \nATOM   2086  OG1 THR A 148      44.516   8.922   0.985  1.00 58.85           O  \nATOM   2087  CG2 THR A 148      46.851   9.207   1.278  1.00 58.05           C  \nATOM   2088  H   THR A 148      44.149   6.173   0.448  1.00 57.67           H  \nATOM   2089  HA  THR A 148      45.907   7.938  -1.072  1.00 58.54           H  \nATOM   2090  HB  THR A 148      45.682   7.548   1.941  1.00 58.20           H  \nATOM   2091  HG1 THR A 148      43.790   8.324   1.177  1.00 58.85           H  \nATOM   2092 HG21 THR A 148      46.613   9.880   2.103  1.00 58.05           H  \nATOM   2093 HG22 THR A 148      47.795   8.724   1.531  1.00 58.05           H  \nATOM   2094 HG23 THR A 148      47.012   9.816   0.388  1.00 58.05           H  \nATOM   2095  N   ASP A 149      47.112   5.233   0.325  1.00 61.81           N  \nATOM   2096  CA  ASP A 149      48.198   4.247   0.267  1.00 63.39           C  \nATOM   2097  C   ASP A 149      48.673   4.050  -1.186  1.00 64.18           C  \nATOM   2098  O   ASP A 149      49.865   4.188  -1.460  1.00 64.37           O  \nATOM   2099  CB  ASP A 149      47.769   2.947   1.010  1.00 64.12           C  \nATOM   2100  CG  ASP A 149      48.717   1.730   1.096  1.00 65.61           C  \nATOM   2101  OD1 ASP A 149      49.522   1.479   0.172  1.00 66.85           O  \nATOM   2102  OD2 ASP A 149      48.519   0.960   2.061  1.00 67.42           O1-\nATOM   2103  H   ASP A 149      46.223   4.871   0.640  1.00 61.81           H  \nATOM   2104  HA  ASP A 149      49.037   4.671   0.822  1.00 63.39           H  \nATOM   2105  HB3 ASP A 149      46.823   2.598   0.592  1.00 64.12           H  \nATOM   2106  HB2 ASP A 149      47.534   3.237   2.034  1.00 64.12           H  \nATOM   2107  N   ASN A 150      47.713   3.798  -2.088  1.00 64.99           N  \nATOM   2108  CA  ASN A 150      47.926   3.705  -3.532  1.00 65.74           C  \nATOM   2109  C   ASN A 150      48.150   5.098  -4.151  1.00 65.03           C  \nATOM   2110  O   ASN A 150      47.802   6.117  -3.553  1.00 65.91           O  \nATOM   2111  CB  ASN A 150      46.702   3.004  -4.171  1.00 67.17           C  \nATOM   2112  CG  ASN A 150      46.561   1.530  -3.764  1.00 68.38           C  \nATOM   2113  OD1 ASN A 150      46.375   1.213  -2.592  1.00 69.69           O  \nATOM   2114  ND2 ASN A 150      46.630   0.615  -4.732  1.00 69.67           N  \nATOM   2115  H   ASN A 150      46.759   3.697  -1.773  1.00 64.99           H  \nATOM   2116  HA  ASN A 150      48.813   3.088  -3.689  1.00 65.74           H  \nATOM   2117  HB3 ASN A 150      46.770   3.053  -5.259  1.00 67.17           H  \nATOM   2118  HB2 ASN A 150      45.784   3.528  -3.899  1.00 67.17           H  \nATOM   2119 HD22 ASN A 150      46.538  -0.364  -4.502  1.00 69.67           H  \nATOM   2120 HD21 ASN A 150      46.765   0.888  -5.694  1.00 69.67           H  \nATOM   2121  N   GLY A 151      48.679   5.108  -5.385  1.00 64.36           N  \nATOM   2122  CA  GLY A 151      48.858   6.310  -6.205  1.00 63.41           C  \nATOM   2123  C   GLY A 151      47.542   6.803  -6.838  1.00 62.81           C  \nATOM   2124  O   GLY A 151      47.594   7.619  -7.756  1.00 63.61           O  \nATOM   2125  H   GLY A 151      48.945   4.231  -5.810  1.00 64.36           H  \nATOM   2126  HA3 GLY A 151      49.567   6.082  -7.001  1.00 63.41           H  \nATOM   2127  HA2 GLY A 151      49.297   7.114  -5.611  1.00 63.41           H  \nATOM   2128  N   THR A 152      46.379   6.304  -6.380  1.00 60.95           N  \nATOM   2129  CA  THR A 152      45.049   6.654  -6.871  1.00 59.02           C  \nATOM   2130  C   THR A 152      44.722   8.134  -6.610  1.00 58.13           C  \nATOM   2131  O   THR A 152      44.837   8.591  -5.473  1.00 57.82           O  \nATOM   2132  CB  THR A 152      43.938   5.798  -6.196  1.00 59.09           C  \nATOM   2133  OG1 THR A 152      44.261   4.424  -6.291  1.00 59.39           O  \nATOM   2134  CG2 THR A 152      42.539   5.969  -6.819  1.00 57.71           C  \nATOM   2135  H   THR A 152      46.406   5.680  -5.588  1.00 60.95           H  \nATOM   2136  HA  THR A 152      45.039   6.473  -7.946  1.00 59.02           H  \nATOM   2137  HB  THR A 152      43.879   6.041  -5.134  1.00 59.09           H  \nATOM   2138  HG1 THR A 152      45.064   4.263  -5.791  1.00 59.39           H  \nATOM   2139 HG21 THR A 152      41.792   5.397  -6.269  1.00 57.71           H  \nATOM   2140 HG22 THR A 152      42.214   7.007  -6.821  1.00 57.71           H  \nATOM   2141 HG23 THR A 152      42.521   5.627  -7.854  1.00 57.71           H  \nATOM   2142  N   GLU A 153      44.316   8.840  -7.674  1.00 56.97           N  \nATOM   2143  CA  GLU A 153      43.813  10.207  -7.618  1.00 56.69           C  \nATOM   2144  C   GLU A 153      42.294  10.144  -7.433  1.00 55.11           C  \nATOM   2145  O   GLU A 153      41.599   9.811  -8.389  1.00 55.09           O  \nATOM   2146  CB  GLU A 153      44.273  10.944  -8.896  1.00 57.96           C  \nATOM   2147  CG  GLU A 153      43.615  12.319  -9.151  1.00 60.39           C  \nATOM   2148  CD  GLU A 153      44.224  13.071 -10.343  1.00 61.93           C  \nATOM   2149  OE1 GLU A 153      45.468  13.196 -10.383  1.00 62.34           O  \nATOM   2150  OE2 GLU A 153      43.432  13.531 -11.195  1.00 61.46           O1-\nATOM   2151  H   GLU A 153      44.278   8.398  -8.583  1.00 56.97           H  \nATOM   2152  HA  GLU A 153      44.244  10.734  -6.764  1.00 56.69           H  \nATOM   2153  HB3 GLU A 153      44.125  10.311  -9.770  1.00 57.96           H  \nATOM   2154  HB2 GLU A 153      45.354  11.070  -8.816  1.00 57.96           H  \nATOM   2155  HG3 GLU A 153      43.725  12.947  -8.266  1.00 60.39           H  \nATOM   2156  HG2 GLU A 153      42.542  12.200  -9.310  1.00 60.39           H  \nATOM   2157  N   PHE A 154      41.811  10.402  -6.207  1.00 52.70           N  \nATOM   2158  CA  PHE A 154      40.409  10.189  -5.850  1.00 49.80           C  \nATOM   2159  C   PHE A 154      39.805  11.395  -5.124  1.00 49.14           C  \nATOM   2160  O   PHE A 154      40.516  12.198  -4.520  1.00 48.93           O  \nATOM   2161  CB  PHE A 154      40.270   8.882  -5.029  1.00 48.80           C  \nATOM   2162  CG  PHE A 154      40.753   8.928  -3.589  1.00 49.66           C  \nATOM   2163  CD1 PHE A 154      39.834   9.060  -2.527  1.00 48.25           C  \nATOM   2164  CD2 PHE A 154      42.134   8.956  -3.307  1.00 48.95           C  \nATOM   2165  CE1 PHE A 154      40.296   9.160  -1.222  1.00 49.33           C  \nATOM   2166  CE2 PHE A 154      42.577   9.068  -1.999  1.00 50.09           C  \nATOM   2167  CZ  PHE A 154      41.661   9.160  -0.961  1.00 50.47           C  \nATOM   2168  H   PHE A 154      42.428  10.684  -5.459  1.00 52.70           H  \nATOM   2169  HA  PHE A 154      39.842  10.079  -6.770  1.00 49.80           H  \nATOM   2170  HB3 PHE A 154      40.788   8.074  -5.539  1.00 48.80           H  \nATOM   2171  HB2 PHE A 154      39.223   8.577  -5.016  1.00 48.80           H  \nATOM   2172  HD1 PHE A 154      38.772   9.071  -2.725  1.00 48.25           H  \nATOM   2173  HD2 PHE A 154      42.849   8.884  -4.108  1.00 48.95           H  \nATOM   2174  HE1 PHE A 154      39.591   9.236  -0.407  1.00 49.33           H  \nATOM   2175  HE2 PHE A 154      43.637   9.076  -1.788  1.00 50.09           H  \nATOM   2176  HZ  PHE A 154      42.016   9.234   0.053  1.00 50.47           H  \nATOM   2177  N   SER A 155      38.469  11.445  -5.189  1.00 45.90           N  \nATOM   2178  CA  SER A 155      37.605  12.383  -4.490  1.00 45.47           C  \nATOM   2179  C   SER A 155      36.435  11.587  -3.901  1.00 43.55           C  \nATOM   2180  O   SER A 155      35.952  10.651  -4.539  1.00 43.15           O  \nATOM   2181  CB  SER A 155      37.138  13.465  -5.485  1.00 43.93           C  \nATOM   2182  OG  SER A 155      36.300  14.422  -4.866  1.00 46.92           O  \nATOM   2183  H   SER A 155      37.983  10.724  -5.708  1.00 45.90           H  \nATOM   2184  HA  SER A 155      38.153  12.855  -3.672  1.00 45.47           H  \nATOM   2185  HB3 SER A 155      36.597  13.016  -6.319  1.00 43.93           H  \nATOM   2186  HB2 SER A 155      37.999  13.985  -5.908  1.00 43.93           H  \nATOM   2187  HG  SER A 155      36.085  15.101  -5.511  1.00 46.92           H  \nATOM   2188  N   VAL A 156      36.000  11.984  -2.698  1.00 42.99           N  \nATOM   2189  CA  VAL A 156      34.894  11.360  -1.981  1.00 40.85           C  \nATOM   2190  C   VAL A 156      33.810  12.424  -1.770  1.00 40.89           C  \nATOM   2191  O   VAL A 156      34.131  13.524  -1.330  1.00 42.32           O  \nATOM   2192  CB  VAL A 156      35.356  10.843  -0.588  1.00 40.60           C  \nATOM   2193  CG1 VAL A 156      34.222  10.235   0.260  1.00 41.68           C  \nATOM   2194  CG2 VAL A 156      36.494   9.818  -0.715  1.00 41.72           C  \nATOM   2195  H   VAL A 156      36.427  12.779  -2.245  1.00 42.99           H  \nATOM   2196  HA  VAL A 156      34.477  10.525  -2.544  1.00 40.85           H  \nATOM   2197  HB  VAL A 156      35.761  11.686  -0.030  1.00 40.60           H  \nATOM   2198 HG11 VAL A 156      34.606   9.830   1.197  1.00 41.68           H  \nATOM   2199 HG12 VAL A 156      33.457  10.965   0.524  1.00 41.68           H  \nATOM   2200 HG13 VAL A 156      33.741   9.420  -0.281  1.00 41.68           H  \nATOM   2201 HG21 VAL A 156      36.798   9.446   0.263  1.00 41.72           H  \nATOM   2202 HG22 VAL A 156      36.191   8.963  -1.320  1.00 41.72           H  \nATOM   2203 HG23 VAL A 156      37.379  10.259  -1.174  1.00 41.72           H  \nATOM   2204  N   LYS A 157      32.554  12.066  -2.066  1.00 39.19           N  \nATOM   2205  CA  LYS A 157      31.364  12.855  -1.753  1.00 37.21           C  \nATOM   2206  C   LYS A 157      30.448  12.020  -0.860  1.00 35.33           C  \nATOM   2207  O   LYS A 157      30.394  10.804  -1.033  1.00 33.52           O  \nATOM   2208  CB  LYS A 157      30.613  13.221  -3.044  1.00 38.54           C  \nATOM   2209  CG  LYS A 157      31.374  14.195  -3.957  1.00 42.32           C  \nATOM   2210  CD  LYS A 157      30.564  14.651  -5.183  1.00 44.23           C  \nATOM   2211  CE  LYS A 157      30.042  13.484  -6.041  1.00 46.31           C  \nATOM   2212  NZ  LYS A 157      29.441  13.952  -7.301  1.00 48.40           N1+\nATOM   2213  H   LYS A 157      32.378  11.139  -2.432  1.00 39.19           H  \nATOM   2214  HA  LYS A 157      31.636  13.767  -1.224  1.00 37.21           H  \nATOM   2215  HB3 LYS A 157      29.661  13.684  -2.780  1.00 38.54           H  \nATOM   2216  HB2 LYS A 157      30.368  12.305  -3.585  1.00 38.54           H  \nATOM   2217  HG3 LYS A 157      32.302  13.731  -4.294  1.00 42.32           H  \nATOM   2218  HG2 LYS A 157      31.669  15.073  -3.380  1.00 42.32           H  \nATOM   2219  HD3 LYS A 157      31.199  15.299  -5.788  1.00 44.23           H  \nATOM   2220  HD2 LYS A 157      29.731  15.273  -4.854  1.00 44.23           H  \nATOM   2221  HE3 LYS A 157      29.285  12.913  -5.502  1.00 46.31           H  \nATOM   2222  HE2 LYS A 157      30.858  12.801  -6.269  1.00 46.31           H  \nATOM   2223  HZ1 LYS A 157      28.645  14.539  -7.074  1.00 48.40           H  \nATOM   2224  HZ2 LYS A 157      30.113  14.485  -7.834  1.00 48.40           H  \nATOM   2225  HZ3 LYS A 157      29.111  13.167  -7.844  1.00 48.40           H  \nATOM   2226  N   VAL A 158      29.719  12.691   0.042  1.00 34.70           N  \nATOM   2227  CA  VAL A 158      28.712  12.071   0.897  1.00 32.77           C  \nATOM   2228  C   VAL A 158      27.419  12.897   0.905  1.00 33.04           C  \nATOM   2229  O   VAL A 158      27.466  14.124   0.841  1.00 33.91           O  \nATOM   2230  CB  VAL A 158      29.195  11.895   2.364  1.00 32.67           C  \nATOM   2231  CG1 VAL A 158      30.320  10.856   2.474  1.00 31.61           C  \nATOM   2232  CG2 VAL A 158      29.590  13.197   3.086  1.00 33.84           C  \nATOM   2233  H   VAL A 158      29.828  13.693   0.139  1.00 34.70           H  \nATOM   2234  HA  VAL A 158      28.463  11.094   0.490  1.00 32.77           H  \nATOM   2235  HB  VAL A 158      28.360  11.477   2.929  1.00 32.67           H  \nATOM   2236 HG11 VAL A 158      30.587  10.678   3.516  1.00 31.61           H  \nATOM   2237 HG12 VAL A 158      30.008   9.902   2.052  1.00 31.61           H  \nATOM   2238 HG13 VAL A 158      31.220  11.177   1.950  1.00 31.61           H  \nATOM   2239 HG21 VAL A 158      29.920  12.976   4.100  1.00 33.84           H  \nATOM   2240 HG22 VAL A 158      30.411  13.704   2.579  1.00 33.84           H  \nATOM   2241 HG23 VAL A 158      28.763  13.901   3.163  1.00 33.84           H  \nATOM   2242  N   SER A 159      26.288  12.188   1.014  1.00 31.10           N  \nATOM   2243  CA  SER A 159      24.956  12.763   1.155  1.00 29.81           C  \nATOM   2244  C   SER A 159      24.130  11.910   2.125  1.00 27.90           C  \nATOM   2245  O   SER A 159      24.349  10.703   2.221  1.00 26.67           O  \nATOM   2246  CB  SER A 159      24.300  12.933  -0.234  1.00 29.49           C  \nATOM   2247  OG  SER A 159      23.938  11.706  -0.832  1.00 33.07           O  \nATOM   2248  H   SER A 159      26.335  11.178   1.066  1.00 31.10           H  \nATOM   2249  HA  SER A 159      25.060  13.752   1.604  1.00 29.81           H  \nATOM   2250  HB3 SER A 159      24.963  13.476  -0.908  1.00 29.49           H  \nATOM   2251  HB2 SER A 159      23.394  13.532  -0.143  1.00 29.49           H  \nATOM   2252  HG  SER A 159      23.162  11.357  -0.379  1.00 33.07           H  \nATOM   2253  N   LEU A 160      23.191  12.566   2.816  1.00 28.07           N  \nATOM   2254  CA  LEU A 160      22.306  11.969   3.803  1.00 24.85           C  \nATOM   2255  C   LEU A 160      20.880  12.425   3.496  1.00 24.84           C  \nATOM   2256  O   LEU A 160      20.458  13.495   3.937  1.00 25.97           O  \nATOM   2257  CB  LEU A 160      22.785  12.377   5.208  1.00 25.10           C  \nATOM   2258  CG  LEU A 160      22.040  11.742   6.395  1.00 24.01           C  \nATOM   2259  CD1 LEU A 160      22.077  10.203   6.383  1.00 23.66           C  \nATOM   2260  CD2 LEU A 160      22.594  12.318   7.710  1.00 27.15           C  \nATOM   2261  H   LEU A 160      23.064  13.561   2.656  1.00 28.07           H  \nATOM   2262  HA  LEU A 160      22.339  10.883   3.723  1.00 24.85           H  \nATOM   2263  HB3 LEU A 160      22.694  13.460   5.286  1.00 25.10           H  \nATOM   2264  HB2 LEU A 160      23.844  12.138   5.308  1.00 25.10           H  \nATOM   2265  HG  LEU A 160      20.996  12.036   6.322  1.00 24.01           H  \nATOM   2266 HD11 LEU A 160      22.331   9.789   7.359  1.00 23.66           H  \nATOM   2267 HD12 LEU A 160      21.107   9.795   6.098  1.00 23.66           H  \nATOM   2268 HD13 LEU A 160      22.809   9.823   5.676  1.00 23.66           H  \nATOM   2269 HD21 LEU A 160      21.872  12.248   8.522  1.00 27.15           H  \nATOM   2270 HD22 LEU A 160      23.491  11.786   8.013  1.00 27.15           H  \nATOM   2271 HD23 LEU A 160      22.870  13.368   7.611  1.00 27.15           H  \nATOM   2272  N   LEU A 161      20.178  11.585   2.725  1.00 23.65           N  \nATOM   2273  CA  LEU A 161      18.763  11.735   2.419  1.00 23.59           C  \nATOM   2274  C   LEU A 161      17.957  10.936   3.440  1.00 21.28           C  \nATOM   2275  O   LEU A 161      18.292   9.777   3.681  1.00 20.76           O  \nATOM   2276  CB  LEU A 161      18.505  11.202   0.998  1.00 25.98           C  \nATOM   2277  CG  LEU A 161      17.033  11.282   0.536  1.00 27.94           C  \nATOM   2278  CD1 LEU A 161      16.530  12.740   0.453  1.00 26.95           C  \nATOM   2279  CD2 LEU A 161      16.840  10.505  -0.775  1.00 28.87           C  \nATOM   2280  H   LEU A 161      20.608  10.725   2.416  1.00 23.65           H  \nATOM   2281  HA  LEU A 161      18.486  12.789   2.464  1.00 23.59           H  \nATOM   2282  HB3 LEU A 161      18.833  10.162   0.949  1.00 25.98           H  \nATOM   2283  HB2 LEU A 161      19.133  11.741   0.294  1.00 25.98           H  \nATOM   2284  HG  LEU A 161      16.399  10.772   1.262  1.00 27.94           H  \nATOM   2285 HD11 LEU A 161      16.005  12.957  -0.476  1.00 26.95           H  \nATOM   2286 HD12 LEU A 161      15.837  12.952   1.268  1.00 26.95           H  \nATOM   2287 HD13 LEU A 161      17.345  13.459   0.529  1.00 26.95           H  \nATOM   2288 HD21 LEU A 161      16.277  11.069  -1.518  1.00 28.87           H  \nATOM   2289 HD22 LEU A 161      17.790  10.223  -1.229  1.00 28.87           H  \nATOM   2290 HD23 LEU A 161      16.295   9.582  -0.586  1.00 28.87           H  \nATOM   2291  N   GLU A 162      16.897  11.549   3.986  1.00 21.39           N  \nATOM   2292  CA  GLU A 162      16.019  10.906   4.960  1.00 22.91           C  \nATOM   2293  C   GLU A 162      14.555  11.099   4.593  1.00 21.99           C  \nATOM   2294  O   GLU A 162      14.198  12.121   4.018  1.00 22.20           O  \nATOM   2295  CB  GLU A 162      16.314  11.413   6.378  1.00 20.42           C  \nATOM   2296  CG  GLU A 162      17.813  11.301   6.698  1.00 26.15           C  \nATOM   2297  CD  GLU A 162      18.207  11.221   8.163  1.00 25.20           C  \nATOM   2298  OE1 GLU A 162      19.430  11.100   8.351  1.00 25.08           O  \nATOM   2299  OE2 GLU A 162      17.346  11.279   9.067  1.00 25.71           O1-\nATOM   2300  H   GLU A 162      16.682  12.509   3.746  1.00 21.39           H  \nATOM   2301  HA  GLU A 162      16.202   9.834   4.931  1.00 22.91           H  \nATOM   2302  HB3 GLU A 162      15.718  10.829   7.081  1.00 20.42           H  \nATOM   2303  HB2 GLU A 162      15.992  12.449   6.483  1.00 20.42           H  \nATOM   2304  HG3 GLU A 162      18.343  12.141   6.245  1.00 26.15           H  \nATOM   2305  HG2 GLU A 162      18.219  10.404   6.234  1.00 26.15           H  \nATOM   2306  N   ILE A 163      13.748  10.087   4.932  1.00 19.55           N  \nATOM   2307  CA  ILE A 163      12.349   9.985   4.552  1.00 20.11           C  \nATOM   2308  C   ILE A 163      11.533   9.827   5.840  1.00 19.59           C  \nATOM   2309  O   ILE A 163      11.668   8.809   6.516  1.00 19.30           O  \nATOM   2310  CB  ILE A 163      12.078   8.749   3.638  1.00 21.56           C  \nATOM   2311  CG1 ILE A 163      13.127   8.643   2.505  1.00 20.64           C  \nATOM   2312  CG2 ILE A 163      10.636   8.778   3.078  1.00 20.03           C  \nATOM   2313  CD1 ILE A 163      12.921   7.468   1.546  1.00 22.06           C  \nATOM   2314  H   ILE A 163      14.131   9.298   5.439  1.00 19.55           H  \nATOM   2315  HA  ILE A 163      12.029  10.877   4.019  1.00 20.11           H  \nATOM   2316  HB  ILE A 163      12.171   7.837   4.228  1.00 21.56           H  \nATOM   2317 HG13 ILE A 163      14.128   8.540   2.925  1.00 20.64           H  \nATOM   2318 HG12 ILE A 163      13.142   9.570   1.940  1.00 20.64           H  \nATOM   2319 HG21 ILE A 163      10.416   7.893   2.482  1.00 20.03           H  \nATOM   2320 HG22 ILE A 163       9.887   8.806   3.870  1.00 20.03           H  \nATOM   2321 HG23 ILE A 163      10.476   9.651   2.444  1.00 20.03           H  \nATOM   2322 HD11 ILE A 163      13.870   7.141   1.119  1.00 22.06           H  \nATOM   2323 HD12 ILE A 163      12.479   6.616   2.060  1.00 22.06           H  \nATOM   2324 HD13 ILE A 163      12.267   7.746   0.721  1.00 22.06           H  \nATOM   2325  N   TYR A 164      10.696  10.828   6.140  1.00 19.64           N  \nATOM   2326  CA  TYR A 164       9.721  10.786   7.225  1.00 22.59           C  \nATOM   2327  C   TYR A 164       8.374  11.223   6.644  1.00 21.43           C  \nATOM   2328  O   TYR A 164       8.281  12.327   6.108  1.00 23.00           O  \nATOM   2329  CB  TYR A 164      10.197  11.657   8.411  1.00 18.51           C  \nATOM   2330  CG  TYR A 164       9.213  11.791   9.564  1.00 20.90           C  \nATOM   2331  CD1 TYR A 164       8.145  12.713   9.489  1.00 20.72           C  \nATOM   2332  CD2 TYR A 164       9.358  10.989  10.715  1.00 20.94           C  \nATOM   2333  CE1 TYR A 164       7.207  12.802  10.533  1.00 23.50           C  \nATOM   2334  CE2 TYR A 164       8.437  11.104  11.775  1.00 24.08           C  \nATOM   2335  CZ  TYR A 164       7.352  11.996  11.676  1.00 23.90           C  \nATOM   2336  OH  TYR A 164       6.450  12.096  12.694  1.00 25.55           O  \nATOM   2337  H   TYR A 164      10.647  11.636   5.533  1.00 19.64           H  \nATOM   2338  HA  TYR A 164       9.611   9.763   7.592  1.00 22.59           H  \nATOM   2339  HB3 TYR A 164      10.442  12.660   8.073  1.00 18.51           H  \nATOM   2340  HB2 TYR A 164      11.132  11.247   8.795  1.00 18.51           H  \nATOM   2341  HD1 TYR A 164       8.033  13.346   8.622  1.00 20.72           H  \nATOM   2342  HD2 TYR A 164      10.175  10.287  10.793  1.00 20.94           H  \nATOM   2343  HE1 TYR A 164       6.385  13.499  10.459  1.00 23.50           H  \nATOM   2344  HE2 TYR A 164       8.559  10.504  12.663  1.00 24.08           H  \nATOM   2345  HH  TYR A 164       6.727  11.613  13.480  1.00 25.55           H  \nATOM   2346  N   ASN A 165       7.362  10.345   6.766  1.00 22.76           N  \nATOM   2347  CA  ASN A 165       5.983  10.536   6.297  1.00 27.93           C  \nATOM   2348  C   ASN A 165       5.897  10.807   4.774  1.00 25.77           C  \nATOM   2349  O   ASN A 165       5.116  11.654   4.343  1.00 25.97           O  \nATOM   2350  CB  ASN A 165       5.284  11.629   7.154  1.00 30.06           C  \nATOM   2351  CG  ASN A 165       3.753  11.598   7.077  1.00 37.45           C  \nATOM   2352  OD1 ASN A 165       3.134  10.551   7.252  1.00 40.14           O  \nATOM   2353  ND2 ASN A 165       3.138  12.753   6.813  1.00 39.66           N  \nATOM   2354  H   ASN A 165       7.538   9.465   7.237  1.00 22.76           H  \nATOM   2355  HA  ASN A 165       5.457   9.591   6.434  1.00 27.93           H  \nATOM   2356  HB3 ASN A 165       5.663  12.622   6.904  1.00 30.06           H  \nATOM   2357  HB2 ASN A 165       5.531  11.470   8.204  1.00 30.06           H  \nATOM   2358 HD22 ASN A 165       2.132  12.785   6.747  1.00 39.66           H  \nATOM   2359 HD21 ASN A 165       3.673  13.595   6.653  1.00 39.66           H  \nATOM   2360  N   GLU A 166       6.738  10.110   3.987  1.00 25.78           N  \nATOM   2361  CA  GLU A 166       6.918  10.284   2.536  1.00 27.67           C  \nATOM   2362  C   GLU A 166       7.451  11.664   2.104  1.00 27.00           C  \nATOM   2363  O   GLU A 166       7.320  12.014   0.930  1.00 28.61           O  \nATOM   2364  CB  GLU A 166       5.646   9.878   1.740  1.00 29.56           C  \nATOM   2365  CG  GLU A 166       5.176   8.430   1.952  1.00 29.68           C  \nATOM   2366  CD  GLU A 166       6.246   7.410   1.559  1.00 30.08           C  \nATOM   2367  OE1 GLU A 166       6.974   6.970   2.473  1.00 27.75           O  \nATOM   2368  OE2 GLU A 166       6.325   7.090   0.354  1.00 28.15           O1-\nATOM   2369  H   GLU A 166       7.338   9.418   4.415  1.00 25.78           H  \nATOM   2370  HA  GLU A 166       7.729   9.609   2.263  1.00 27.67           H  \nATOM   2371  HB3 GLU A 166       5.813  10.018   0.670  1.00 29.56           H  \nATOM   2372  HB2 GLU A 166       4.824  10.550   1.986  1.00 29.56           H  \nATOM   2373  HG3 GLU A 166       4.275   8.248   1.365  1.00 29.68           H  \nATOM   2374  HG2 GLU A 166       4.885   8.283   2.991  1.00 29.68           H  \nATOM   2375  N   GLU A 167       8.070  12.407   3.035  1.00 26.94           N  \nATOM   2376  CA  GLU A 167       8.728  13.677   2.757  1.00 27.18           C  \nATOM   2377  C   GLU A 167      10.241  13.479   2.866  1.00 28.13           C  \nATOM   2378  O   GLU A 167      10.716  12.938   3.864  1.00 24.51           O  \nATOM   2379  CB  GLU A 167       8.249  14.772   3.724  1.00 31.62           C  \nATOM   2380  CG  GLU A 167       6.712  14.884   3.845  1.00 40.49           C  \nATOM   2381  CD  GLU A 167       6.180  16.204   4.427  1.00 46.73           C  \nATOM   2382  OE1 GLU A 167       6.986  17.113   4.729  1.00 51.21           O  \nATOM   2383  OE2 GLU A 167       4.938  16.298   4.528  1.00 50.72           O1-\nATOM   2384  H   GLU A 167       8.134  12.074   3.987  1.00 26.94           H  \nATOM   2385  HA  GLU A 167       8.488  14.013   1.748  1.00 27.18           H  \nATOM   2386  HB3 GLU A 167       8.678  15.715   3.380  1.00 31.62           H  \nATOM   2387  HB2 GLU A 167       8.656  14.599   4.718  1.00 31.62           H  \nATOM   2388  HG3 GLU A 167       6.353  14.073   4.480  1.00 40.49           H  \nATOM   2389  HG2 GLU A 167       6.248  14.724   2.872  1.00 40.49           H  \nATOM   2390  N   LEU A 168      10.955  13.934   1.830  1.00 25.62           N  \nATOM   2391  CA  LEU A 168      12.407  13.871   1.716  1.00 26.26           C  \nATOM   2392  C   LEU A 168      13.048  15.068   2.427  1.00 27.12           C  \nATOM   2393  O   LEU A 168      12.573  16.189   2.263  1.00 27.76           O  \nATOM   2394  CB  LEU A 168      12.789  13.886   0.225  1.00 26.24           C  \nATOM   2395  CG  LEU A 168      12.244  12.705  -0.602  1.00 27.75           C  \nATOM   2396  CD1 LEU A 168      12.632  12.868  -2.083  1.00 26.99           C  \nATOM   2397  CD2 LEU A 168      12.667  11.338  -0.037  1.00 24.52           C  \nATOM   2398  H   LEU A 168      10.475  14.361   1.048  1.00 25.62           H  \nATOM   2399  HA  LEU A 168      12.758  12.946   2.169  1.00 26.26           H  \nATOM   2400  HB3 LEU A 168      13.875  13.911   0.133  1.00 26.24           H  \nATOM   2401  HB2 LEU A 168      12.424  14.812  -0.220  1.00 26.24           H  \nATOM   2402  HG  LEU A 168      11.154  12.740  -0.564  1.00 27.75           H  \nATOM   2403 HD11 LEU A 168      11.737  12.916  -2.701  1.00 26.99           H  \nATOM   2404 HD12 LEU A 168      13.192  13.786  -2.264  1.00 26.99           H  \nATOM   2405 HD13 LEU A 168      13.246  12.046  -2.452  1.00 26.99           H  \nATOM   2406 HD21 LEU A 168      12.868  10.606  -0.817  1.00 24.52           H  \nATOM   2407 HD22 LEU A 168      13.567  11.414   0.574  1.00 24.52           H  \nATOM   2408 HD23 LEU A 168      11.870  10.926   0.583  1.00 24.52           H  \nATOM   2409  N   PHE A 169      14.124  14.803   3.177  1.00 27.59           N  \nATOM   2410  CA  PHE A 169      14.868  15.787   3.954  1.00 28.06           C  \nATOM   2411  C   PHE A 169      16.367  15.569   3.752  1.00 27.91           C  \nATOM   2412  O   PHE A 169      16.814  14.435   3.584  1.00 26.56           O  \nATOM   2413  CB  PHE A 169      14.509  15.657   5.448  1.00 27.08           C  \nATOM   2414  CG  PHE A 169      13.043  15.882   5.762  1.00 29.27           C  \nATOM   2415  CD1 PHE A 169      12.213  14.804   6.134  1.00 26.75           C  \nATOM   2416  CD2 PHE A 169      12.467  17.153   5.562  1.00 29.59           C  \nATOM   2417  CE1 PHE A 169      10.861  15.027   6.356  1.00 29.38           C  \nATOM   2418  CE2 PHE A 169      11.120  17.359   5.817  1.00 29.78           C  \nATOM   2419  CZ  PHE A 169      10.322  16.299   6.219  1.00 29.34           C  \nATOM   2420  H   PHE A 169      14.431  13.843   3.280  1.00 27.59           H  \nATOM   2421  HA  PHE A 169      14.627  16.796   3.611  1.00 28.06           H  \nATOM   2422  HB3 PHE A 169      15.077  16.395   6.017  1.00 27.08           H  \nATOM   2423  HB2 PHE A 169      14.812  14.681   5.832  1.00 27.08           H  \nATOM   2424  HD1 PHE A 169      12.619  13.808   6.238  1.00 26.75           H  \nATOM   2425  HD2 PHE A 169      13.070  17.964   5.186  1.00 29.59           H  \nATOM   2426  HE1 PHE A 169      10.213  14.210   6.626  1.00 29.38           H  \nATOM   2427  HE2 PHE A 169      10.688  18.340   5.677  1.00 29.78           H  \nATOM   2428  HZ  PHE A 169       9.269  16.457   6.400  1.00 29.34           H  \nATOM   2429  N   ASP A 170      17.109  16.680   3.802  1.00 28.99           N  \nATOM   2430  CA  ASP A 170      18.554  16.738   3.668  1.00 31.65           C  \nATOM   2431  C   ASP A 170      19.115  17.011   5.069  1.00 31.23           C  \nATOM   2432  O   ASP A 170      18.846  18.070   5.634  1.00 33.73           O  \nATOM   2433  CB  ASP A 170      18.923  17.840   2.652  1.00 32.63           C  \nATOM   2434  CG  ASP A 170      20.381  17.900   2.188  1.00 36.16           C  \nATOM   2435  OD1 ASP A 170      21.291  17.440   2.913  1.00 37.04           O  \nATOM   2436  OD2 ASP A 170      20.576  18.543   1.139  1.00 37.99           O1-\nATOM   2437  H   ASP A 170      16.659  17.570   3.984  1.00 28.99           H  \nATOM   2438  HA  ASP A 170      18.941  15.785   3.299  1.00 31.65           H  \nATOM   2439  HB3 ASP A 170      18.651  18.819   3.054  1.00 32.63           H  \nATOM   2440  HB2 ASP A 170      18.289  17.729   1.774  1.00 32.63           H  \nATOM   2441  N   LEU A 171      19.872  16.041   5.600  1.00 32.05           N  \nATOM   2442  CA  LEU A 171      20.402  16.076   6.962  1.00 33.78           C  \nATOM   2443  C   LEU A 171      21.898  16.424   7.024  1.00 36.20           C  \nATOM   2444  O   LEU A 171      22.421  16.452   8.135  1.00 37.78           O  \nATOM   2445  CB  LEU A 171      20.058  14.747   7.678  1.00 31.15           C  \nATOM   2446  CG  LEU A 171      18.695  14.759   8.402  1.00 31.77           C  \nATOM   2447  CD1 LEU A 171      18.679  15.685   9.621  1.00 29.95           C  \nATOM   2448  CD2 LEU A 171      17.497  14.983   7.464  1.00 27.08           C  \nATOM   2449  H   LEU A 171      20.055  15.200   5.068  1.00 32.05           H  \nATOM   2450  HA  LEU A 171      19.925  16.881   7.523  1.00 33.78           H  \nATOM   2451  HB3 LEU A 171      20.814  14.496   8.422  1.00 31.15           H  \nATOM   2452  HB2 LEU A 171      20.079  13.929   6.960  1.00 31.15           H  \nATOM   2453  HG  LEU A 171      18.586  13.765   8.822  1.00 31.77           H  \nATOM   2454 HD11 LEU A 171      18.104  15.244  10.434  1.00 29.95           H  \nATOM   2455 HD12 LEU A 171      19.685  15.874   9.993  1.00 29.95           H  \nATOM   2456 HD13 LEU A 171      18.226  16.642   9.385  1.00 29.95           H  \nATOM   2457 HD21 LEU A 171      16.625  14.435   7.814  1.00 27.08           H  \nATOM   2458 HD22 LEU A 171      17.217  16.034   7.401  1.00 27.08           H  \nATOM   2459 HD23 LEU A 171      17.703  14.632   6.453  1.00 27.08           H  \nATOM   2460  N   LEU A 172      22.550  16.751   5.892  1.00 38.78           N  \nATOM   2461  CA  LEU A 172      23.935  17.241   5.883  1.00 42.77           C  \nATOM   2462  C   LEU A 172      24.066  18.716   5.474  1.00 44.63           C  \nATOM   2463  O   LEU A 172      25.080  19.299   5.852  1.00 46.83           O  \nATOM   2464  CB  LEU A 172      24.832  16.352   4.992  1.00 39.05           C  \nATOM   2465  CG  LEU A 172      25.307  15.037   5.645  1.00 37.98           C  \nATOM   2466  CD1 LEU A 172      26.123  14.192   4.643  1.00 35.12           C  \nATOM   2467  CD2 LEU A 172      26.075  15.258   6.962  1.00 35.36           C  \nATOM   2468  H   LEU A 172      22.069  16.724   5.002  1.00 38.78           H  \nATOM   2469  HA  LEU A 172      24.344  17.220   6.893  1.00 42.77           H  \nATOM   2470  HB3 LEU A 172      25.727  16.901   4.703  1.00 39.05           H  \nATOM   2471  HB2 LEU A 172      24.313  16.142   4.059  1.00 39.05           H  \nATOM   2472  HG  LEU A 172      24.424  14.469   5.913  1.00 37.98           H  \nATOM   2473 HD11 LEU A 172      25.708  13.191   4.535  1.00 35.12           H  \nATOM   2474 HD12 LEU A 172      26.142  14.639   3.649  1.00 35.12           H  \nATOM   2475 HD13 LEU A 172      27.162  14.073   4.950  1.00 35.12           H  \nATOM   2476 HD21 LEU A 172      26.871  14.529   7.105  1.00 35.36           H  \nATOM   2477 HD22 LEU A 172      26.525  16.250   7.011  1.00 35.36           H  \nATOM   2478 HD23 LEU A 172      25.406  15.157   7.815  1.00 35.36           H  \nATOM   2479  N   ASN A 173      23.092  19.302   4.748  1.00 48.64           N  \nATOM   2480  CA  ASN A 173      23.133  20.692   4.261  1.00 51.22           C  \nATOM   2481  C   ASN A 173      23.265  21.701   5.426  1.00 53.10           C  \nATOM   2482  O   ASN A 173      22.304  21.851   6.180  1.00 51.10           O  \nATOM   2483  CB  ASN A 173      21.855  20.967   3.432  1.00 53.38           C  \nATOM   2484  CG  ASN A 173      21.805  22.326   2.717  1.00 55.13           C  \nATOM   2485  OD1 ASN A 173      22.729  23.131   2.801  1.00 57.22           O  \nATOM   2486  ND2 ASN A 173      20.729  22.571   1.970  1.00 54.72           N  \nATOM   2487  H   ASN A 173      22.302  18.749   4.439  1.00 48.64           H  \nATOM   2488  HA  ASN A 173      23.978  20.739   3.576  1.00 51.22           H  \nATOM   2489  HB3 ASN A 173      20.953  20.828   4.030  1.00 53.38           H  \nATOM   2490  HB2 ASN A 173      21.824  20.230   2.638  1.00 53.38           H  \nATOM   2491 HD22 ASN A 173      20.662  23.429   1.441  1.00 54.72           H  \nATOM   2492 HD21 ASN A 173      20.003  21.875   1.876  1.00 54.72           H  \nATOM   2493  N   PRO A 174      24.427  22.381   5.556  1.00 55.43           N  \nATOM   2494  CA  PRO A 174      24.622  23.370   6.626  1.00 55.93           C  \nATOM   2495  C   PRO A 174      23.961  24.738   6.347  1.00 56.43           C  \nATOM   2496  O   PRO A 174      23.924  25.563   7.259  1.00 57.87           O  \nATOM   2497  CB  PRO A 174      26.151  23.476   6.701  1.00 56.37           C  \nATOM   2498  CG  PRO A 174      26.603  23.310   5.258  1.00 57.18           C  \nATOM   2499  CD  PRO A 174      25.612  22.296   4.692  1.00 55.65           C  \nATOM   2500  HA  PRO A 174      24.239  22.998   7.578  1.00 55.93           H  \nATOM   2501  HB3 PRO A 174      26.540  22.654   7.305  1.00 56.37           H  \nATOM   2502  HB2 PRO A 174      26.509  24.405   7.147  1.00 56.37           H  \nATOM   2503  HG3 PRO A 174      27.642  22.996   5.162  1.00 57.18           H  \nATOM   2504  HG2 PRO A 174      26.492  24.260   4.733  1.00 57.18           H  \nATOM   2505  HD2 PRO A 174      25.383  22.520   3.649  1.00 55.65           H  \nATOM   2506  HD3 PRO A 174      26.043  21.298   4.737  1.00 55.65           H  \nATOM   2507  N   SER A 175      23.478  24.962   5.110  1.00 56.90           N  \nATOM   2508  CA  SER A 175      22.917  26.234   4.655  1.00 57.82           C  \nATOM   2509  C   SER A 175      21.427  26.351   5.007  1.00 58.21           C  \nATOM   2510  O   SER A 175      21.030  27.361   5.587  1.00 59.23           O  \nATOM   2511  CB  SER A 175      23.116  26.386   3.132  1.00 58.15           C  \nATOM   2512  OG  SER A 175      24.487  26.344   2.795  1.00 58.20           O  \nATOM   2513  H   SER A 175      23.525  24.227   4.417  1.00 56.90           H  \nATOM   2514  HA  SER A 175      23.447  27.053   5.146  1.00 57.82           H  \nATOM   2515  HB3 SER A 175      22.720  27.346   2.798  1.00 58.15           H  \nATOM   2516  HB2 SER A 175      22.582  25.622   2.569  1.00 58.15           H  \nATOM   2517  HG  SER A 175      24.795  25.438   2.878  1.00 58.20           H  \nATOM   2518  N   SER A 176      20.641  25.321   4.652  1.00 58.11           N  \nATOM   2519  CA  SER A 176      19.201  25.264   4.893  1.00 57.43           C  \nATOM   2520  C   SER A 176      18.903  24.357   6.097  1.00 57.06           C  \nATOM   2521  O   SER A 176      19.651  23.416   6.358  1.00 56.98           O  \nATOM   2522  CB  SER A 176      18.519  24.749   3.613  1.00 58.25           C  \nATOM   2523  OG  SER A 176      17.116  24.806   3.721  1.00 59.33           O  \nATOM   2524  H   SER A 176      21.050  24.514   4.205  1.00 58.11           H  \nATOM   2525  HA  SER A 176      18.816  26.263   5.106  1.00 57.43           H  \nATOM   2526  HB3 SER A 176      18.800  23.716   3.414  1.00 58.25           H  \nATOM   2527  HB2 SER A 176      18.821  25.342   2.748  1.00 58.25           H  \nATOM   2528  HG  SER A 176      16.809  25.690   3.498  1.00 59.33           H  \nATOM   2529  N   ASP A 177      17.790  24.649   6.786  1.00 56.57           N  \nATOM   2530  CA  ASP A 177      17.235  23.873   7.901  1.00 57.04           C  \nATOM   2531  C   ASP A 177      16.579  22.562   7.423  1.00 55.49           C  \nATOM   2532  O   ASP A 177      16.300  22.407   6.233  1.00 54.80           O  \nATOM   2533  CB  ASP A 177      16.266  24.712   8.788  1.00 59.67           C  \nATOM   2534  CG  ASP A 177      15.378  25.748   8.070  1.00 62.71           C  \nATOM   2535  OD1 ASP A 177      14.852  25.430   6.979  1.00 63.65           O  \nATOM   2536  OD2 ASP A 177      15.145  26.810   8.686  1.00 64.94           O1-\nATOM   2537  H   ASP A 177      17.208  25.413   6.470  1.00 56.57           H  \nATOM   2538  HA  ASP A 177      18.079  23.589   8.533  1.00 57.04           H  \nATOM   2539  HB3 ASP A 177      16.863  25.222   9.546  1.00 59.67           H  \nATOM   2540  HB2 ASP A 177      15.595  24.060   9.350  1.00 59.67           H  \nATOM   2541  N   VAL A 178      16.343  21.634   8.367  1.00 53.79           N  \nATOM   2542  CA  VAL A 178      15.723  20.332   8.095  1.00 52.83           C  \nATOM   2543  C   VAL A 178      14.278  20.406   7.574  1.00 52.35           C  \nATOM   2544  O   VAL A 178      13.897  19.522   6.816  1.00 53.10           O  \nATOM   2545  CB  VAL A 178      15.698  19.406   9.336  1.00 52.72           C  \nATOM   2546  CG1 VAL A 178      17.108  19.092   9.820  1.00 52.31           C  \nATOM   2547  CG2 VAL A 178      14.819  19.901  10.498  1.00 53.46           C  \nATOM   2548  H   VAL A 178      16.580  21.823   9.330  1.00 53.79           H  \nATOM   2549  HA  VAL A 178      16.325  19.847   7.324  1.00 52.83           H  \nATOM   2550  HB  VAL A 178      15.286  18.445   9.020  1.00 52.72           H  \nATOM   2551 HG11 VAL A 178      17.080  18.289  10.550  1.00 52.31           H  \nATOM   2552 HG12 VAL A 178      17.740  18.772   8.992  1.00 52.31           H  \nATOM   2553 HG13 VAL A 178      17.567  19.958  10.294  1.00 52.31           H  \nATOM   2554 HG21 VAL A 178      14.971  19.292  11.385  1.00 53.46           H  \nATOM   2555 HG22 VAL A 178      15.050  20.931  10.768  1.00 53.46           H  \nATOM   2556 HG23 VAL A 178      13.760  19.839  10.251  1.00 53.46           H  \nATOM   2557  N   SER A 179      13.519  21.448   7.957  1.00 51.84           N  \nATOM   2558  CA  SER A 179      12.134  21.677   7.532  1.00 50.53           C  \nATOM   2559  C   SER A 179      11.957  21.927   6.020  1.00 49.55           C  \nATOM   2560  O   SER A 179      10.836  21.802   5.527  1.00 48.64           O  \nATOM   2561  CB  SER A 179      11.533  22.809   8.390  1.00 50.49           C  \nATOM   2562  OG  SER A 179      12.186  24.046   8.186  1.00 49.66           O  \nATOM   2563  H   SER A 179      13.912  22.160   8.556  1.00 51.84           H  \nATOM   2564  HA  SER A 179      11.578  20.766   7.760  1.00 50.53           H  \nATOM   2565  HB3 SER A 179      11.590  22.553   9.447  1.00 50.49           H  \nATOM   2566  HB2 SER A 179      10.474  22.936   8.160  1.00 50.49           H  \nATOM   2567  HG  SER A 179      12.054  24.334   7.279  1.00 49.66           H  \nATOM   2568  N   GLU A 180      13.058  22.246   5.319  1.00 49.36           N  \nATOM   2569  CA  GLU A 180      13.113  22.473   3.882  1.00 49.04           C  \nATOM   2570  C   GLU A 180      13.111  21.123   3.140  1.00 48.31           C  \nATOM   2571  O   GLU A 180      14.169  20.533   2.924  1.00 48.45           O  \nATOM   2572  CB  GLU A 180      14.378  23.308   3.597  1.00 51.29           C  \nATOM   2573  CG  GLU A 180      14.324  24.086   2.267  1.00 55.71           C  \nATOM   2574  CD  GLU A 180      13.886  25.541   2.488  1.00 58.55           C  \nATOM   2575  OE1 GLU A 180      12.722  25.737   2.906  1.00 58.48           O  \nATOM   2576  OE2 GLU A 180      14.726  26.437   2.249  1.00 58.81           O1-\nATOM   2577  H   GLU A 180      13.940  22.333   5.806  1.00 49.36           H  \nATOM   2578  HA  GLU A 180      12.232  23.049   3.590  1.00 49.04           H  \nATOM   2579  HB3 GLU A 180      15.264  22.673   3.589  1.00 51.29           H  \nATOM   2580  HB2 GLU A 180      14.559  23.996   4.426  1.00 51.29           H  \nATOM   2581  HG3 GLU A 180      13.648  23.606   1.558  1.00 55.71           H  \nATOM   2582  HG2 GLU A 180      15.307  24.066   1.794  1.00 55.71           H  \nATOM   2583  N   ARG A 181      11.908  20.641   2.795  1.00 46.01           N  \nATOM   2584  CA  ARG A 181      11.706  19.364   2.113  1.00 46.71           C  \nATOM   2585  C   ARG A 181      12.213  19.394   0.656  1.00 45.19           C  \nATOM   2586  O   ARG A 181      12.084  20.415  -0.022  1.00 45.10           O  \nATOM   2587  CB  ARG A 181      10.220  18.964   2.224  1.00 48.88           C  \nATOM   2588  CG  ARG A 181       9.244  19.850   1.418  1.00 53.95           C  \nATOM   2589  CD  ARG A 181       7.754  19.627   1.735  1.00 58.90           C  \nATOM   2590  NE  ARG A 181       7.311  18.229   1.586  1.00 62.40           N  \nATOM   2591  CZ  ARG A 181       7.171  17.509   0.457  1.00 63.28           C  \nATOM   2592  NH1 ARG A 181       7.504  17.984  -0.753  1.00 64.77           N  \nATOM   2593  NH2 ARG A 181       6.678  16.268   0.547  1.00 63.18           N1+\nATOM   2594  H   ARG A 181      11.077  21.165   3.030  1.00 46.01           H  \nATOM   2595  HA  ARG A 181      12.289  18.630   2.669  1.00 46.71           H  \nATOM   2596  HB3 ARG A 181       9.929  18.968   3.275  1.00 48.88           H  \nATOM   2597  HB2 ARG A 181      10.117  17.929   1.894  1.00 48.88           H  \nATOM   2598  HG3 ARG A 181       9.426  19.814   0.344  1.00 53.95           H  \nATOM   2599  HG2 ARG A 181       9.457  20.880   1.705  1.00 53.95           H  \nATOM   2600  HD3 ARG A 181       7.165  20.192   1.013  1.00 58.90           H  \nATOM   2601  HD2 ARG A 181       7.489  20.033   2.712  1.00 58.90           H  \nATOM   2602  HE  ARG A 181       7.090  17.776   2.466  1.00 62.40           H  \nATOM   2603 HH12 ARG A 181       7.380  17.423  -1.583  1.00 64.77           H  \nATOM   2604 HH11 ARG A 181       7.879  18.918  -0.836  1.00 64.77           H  \nATOM   2605 HH22 ARG A 181       6.537  15.704  -0.278  1.00 63.18           H  \nATOM   2606 HH21 ARG A 181       6.397  15.901   1.447  1.00 63.18           H  \nATOM   2607  N   LEU A 182      12.770  18.259   0.209  1.00 41.92           N  \nATOM   2608  CA  LEU A 182      13.299  18.066  -1.143  1.00 39.89           C  \nATOM   2609  C   LEU A 182      12.213  17.500  -2.073  1.00 38.35           C  \nATOM   2610  O   LEU A 182      11.207  16.974  -1.598  1.00 38.67           O  \nATOM   2611  CB  LEU A 182      14.511  17.107  -1.092  1.00 40.08           C  \nATOM   2612  CG  LEU A 182      15.627  17.483  -0.091  1.00 39.80           C  \nATOM   2613  CD1 LEU A 182      16.759  16.436  -0.147  1.00 39.86           C  \nATOM   2614  CD2 LEU A 182      16.149  18.923  -0.282  1.00 39.90           C  \nATOM   2615  H   LEU A 182      12.827  17.461   0.829  1.00 41.92           H  \nATOM   2616  HA  LEU A 182      13.623  19.025  -1.551  1.00 39.89           H  \nATOM   2617  HB3 LEU A 182      14.946  17.033  -2.090  1.00 40.08           H  \nATOM   2618  HB2 LEU A 182      14.167  16.103  -0.852  1.00 40.08           H  \nATOM   2619  HG  LEU A 182      15.209  17.425   0.915  1.00 39.80           H  \nATOM   2620 HD11 LEU A 182      16.928  15.991   0.834  1.00 39.86           H  \nATOM   2621 HD12 LEU A 182      16.529  15.616  -0.827  1.00 39.86           H  \nATOM   2622 HD13 LEU A 182      17.704  16.860  -0.480  1.00 39.86           H  \nATOM   2623 HD21 LEU A 182      17.227  18.999  -0.141  1.00 39.90           H  \nATOM   2624 HD22 LEU A 182      15.931  19.308  -1.278  1.00 39.90           H  \nATOM   2625 HD23 LEU A 182      15.688  19.597   0.441  1.00 39.90           H  \nATOM   2626  N   GLN A 183      12.449  17.604  -3.387  1.00 36.55           N  \nATOM   2627  CA  GLN A 183      11.569  17.071  -4.429  1.00 36.23           C  \nATOM   2628  C   GLN A 183      12.327  15.986  -5.198  1.00 33.70           C  \nATOM   2629  O   GLN A 183      13.508  16.181  -5.482  1.00 32.46           O  \nATOM   2630  CB  GLN A 183      11.155  18.217  -5.375  1.00 40.21           C  \nATOM   2631  CG  GLN A 183      10.294  19.294  -4.686  1.00 46.32           C  \nATOM   2632  CD  GLN A 183      10.070  20.524  -5.567  1.00 51.85           C  \nATOM   2633  OE1 GLN A 183       9.771  20.409  -6.753  1.00 53.00           O  \nATOM   2634  NE2 GLN A 183      10.189  21.717  -4.981  1.00 54.16           N  \nATOM   2635  H   GLN A 183      13.312  18.021  -3.708  1.00 36.55           H  \nATOM   2636  HA  GLN A 183      10.668  16.627  -4.002  1.00 36.23           H  \nATOM   2637  HB3 GLN A 183      10.599  17.807  -6.220  1.00 40.21           H  \nATOM   2638  HB2 GLN A 183      12.049  18.680  -5.798  1.00 40.21           H  \nATOM   2639  HG3 GLN A 183      10.767  19.618  -3.758  1.00 46.32           H  \nATOM   2640  HG2 GLN A 183       9.325  18.877  -4.409  1.00 46.32           H  \nATOM   2641 HE22 GLN A 183      10.020  22.560  -5.510  1.00 54.16           H  \nATOM   2642 HE21 GLN A 183      10.426  21.786  -4.002  1.00 54.16           H  \nATOM   2643  N   MET A 184      11.634  14.890  -5.554  1.00 32.15           N  \nATOM   2644  CA  MET A 184      12.185  13.854  -6.428  1.00 35.07           C  \nATOM   2645  C   MET A 184      11.328  13.685  -7.684  1.00 35.72           C  \nATOM   2646  O   MET A 184      10.109  13.860  -7.649  1.00 34.61           O  \nATOM   2647  CB  MET A 184      12.407  12.522  -5.682  1.00 34.84           C  \nATOM   2648  CG  MET A 184      11.141  11.723  -5.318  1.00 38.74           C  \nATOM   2649  SD  MET A 184      11.469  10.099  -4.586  1.00 41.75           S  \nATOM   2650  CE  MET A 184      12.019   9.209  -6.055  1.00 40.67           C  \nATOM   2651  H   MET A 184      10.658  14.802  -5.315  1.00 32.15           H  \nATOM   2652  HA  MET A 184      13.162  14.185  -6.768  1.00 35.07           H  \nATOM   2653  HB3 MET A 184      12.998  12.711  -4.787  1.00 34.84           H  \nATOM   2654  HB2 MET A 184      13.047  11.899  -6.306  1.00 34.84           H  \nATOM   2655  HG3 MET A 184      10.513  11.553  -6.192  1.00 38.74           H  \nATOM   2656  HG2 MET A 184      10.539  12.299  -4.616  1.00 38.74           H  \nATOM   2657  HE1 MET A 184      12.197   8.162  -5.816  1.00 40.67           H  \nATOM   2658  HE2 MET A 184      11.275   9.266  -6.846  1.00 40.67           H  \nATOM   2659  HE3 MET A 184      12.946   9.641  -6.425  1.00 40.67           H  \nATOM   2660  N   PHE A 185      12.027  13.326  -8.765  1.00 38.29           N  \nATOM   2661  CA  PHE A 185      11.511  13.112 -10.109  1.00 42.79           C  \nATOM   2662  C   PHE A 185      12.190  11.854 -10.660  1.00 44.70           C  \nATOM   2663  O   PHE A 185      13.246  11.458 -10.169  1.00 44.77           O  \nATOM   2664  CB  PHE A 185      11.885  14.325 -10.993  1.00 43.13           C  \nATOM   2665  CG  PHE A 185      11.475  15.680 -10.444  1.00 43.75           C  \nATOM   2666  CD1 PHE A 185      12.364  16.403  -9.619  1.00 43.96           C  \nATOM   2667  CD2 PHE A 185      10.152  16.142 -10.600  1.00 44.55           C  \nATOM   2668  CE1 PHE A 185      11.950  17.586  -9.023  1.00 44.32           C  \nATOM   2669  CE2 PHE A 185       9.760  17.332 -10.002  1.00 45.42           C  \nATOM   2670  CZ  PHE A 185      10.658  18.052  -9.225  1.00 45.48           C  \nATOM   2671  H   PHE A 185      13.027  13.195  -8.672  1.00 38.29           H  \nATOM   2672  HA  PHE A 185      10.429  12.968 -10.092  1.00 42.79           H  \nATOM   2673  HB3 PHE A 185      11.422  14.208 -11.975  1.00 43.13           H  \nATOM   2674  HB2 PHE A 185      12.962  14.343 -11.174  1.00 43.13           H  \nATOM   2675  HD1 PHE A 185      13.365  16.035  -9.441  1.00 43.96           H  \nATOM   2676  HD2 PHE A 185       9.442  15.574 -11.185  1.00 44.55           H  \nATOM   2677  HE1 PHE A 185      12.632  18.143  -8.397  1.00 44.32           H  \nATOM   2678  HE2 PHE A 185       8.752  17.694 -10.134  1.00 45.42           H  \nATOM   2679  HZ  PHE A 185      10.344  18.976  -8.766  1.00 45.48           H  \nATOM   2680  N   ASP A 186      11.608  11.273 -11.714  1.00 49.80           N  \nATOM   2681  CA  ASP A 186      12.247  10.204 -12.488  1.00 53.56           C  \nATOM   2682  C   ASP A 186      13.375  10.786 -13.350  1.00 53.93           C  \nATOM   2683  O   ASP A 186      13.199  11.856 -13.933  1.00 53.64           O  \nATOM   2684  CB  ASP A 186      11.238   9.432 -13.367  1.00 56.42           C  \nATOM   2685  CG  ASP A 186      10.033   8.857 -12.608  1.00 58.79           C  \nATOM   2686  OD1 ASP A 186       9.009   8.610 -13.280  1.00 61.00           O  \nATOM   2687  OD2 ASP A 186      10.179   8.532 -11.406  1.00 60.88           O1-\nATOM   2688  H   ASP A 186      10.743  11.638 -12.085  1.00 49.80           H  \nATOM   2689  HA  ASP A 186      12.695   9.493 -11.790  1.00 53.56           H  \nATOM   2690  HB3 ASP A 186      11.742   8.602 -13.863  1.00 56.42           H  \nATOM   2691  HB2 ASP A 186      10.860  10.092 -14.151  1.00 56.42           H  \nATOM   2692  N   ASP A 187      14.506  10.066 -13.412  1.00 55.24           N  \nATOM   2693  CA  ASP A 187      15.660  10.426 -14.235  1.00 58.13           C  \nATOM   2694  C   ASP A 187      15.295  10.136 -15.712  1.00 59.52           C  \nATOM   2695  O   ASP A 187      14.926   8.996 -15.999  1.00 59.93           O  \nATOM   2696  CB  ASP A 187      16.911   9.644 -13.752  1.00 58.39           C  \nATOM   2697  CG  ASP A 187      18.283  10.085 -14.307  1.00 59.33           C  \nATOM   2698  OD1 ASP A 187      18.375  10.537 -15.470  1.00 60.74           O  \nATOM   2699  OD2 ASP A 187      19.271   9.846 -13.580  1.00 60.02           O1-\nATOM   2700  H   ASP A 187      14.570   9.185 -12.921  1.00 55.24           H  \nATOM   2701  HA  ASP A 187      15.863  11.477 -14.052  1.00 58.13           H  \nATOM   2702  HB3 ASP A 187      16.784   8.582 -13.960  1.00 58.39           H  \nATOM   2703  HB2 ASP A 187      16.948   9.704 -12.663  1.00 58.39           H  \nATOM   2704  N   PRO A 188      15.387  11.151 -16.613  1.00 60.65           N  \nATOM   2705  CA  PRO A 188      15.169  10.977 -18.066  1.00 62.13           C  \nATOM   2706  C   PRO A 188      15.918   9.815 -18.748  1.00 63.15           C  \nATOM   2707  O   PRO A 188      15.374   9.233 -19.685  1.00 63.29           O  \nATOM   2708  CB  PRO A 188      15.589  12.328 -18.669  1.00 62.23           C  \nATOM   2709  CG  PRO A 188      15.324  13.330 -17.563  1.00 61.55           C  \nATOM   2710  CD  PRO A 188      15.690  12.553 -16.309  1.00 60.85           C  \nATOM   2711  HA  PRO A 188      14.096  10.835 -18.208  1.00 62.13           H  \nATOM   2712  HB3 PRO A 188      15.044  12.568 -19.582  1.00 62.23           H  \nATOM   2713  HB2 PRO A 188      16.654  12.331 -18.909  1.00 62.23           H  \nATOM   2714  HG3 PRO A 188      14.260  13.571 -17.542  1.00 61.55           H  \nATOM   2715  HG2 PRO A 188      15.879  14.262 -17.675  1.00 61.55           H  \nATOM   2716  HD2 PRO A 188      16.757  12.650 -16.110  1.00 60.85           H  \nATOM   2717  HD3 PRO A 188      15.132  12.945 -15.459  1.00 60.85           H  \nATOM   2718  N   ARG A 189      17.128   9.495 -18.256  1.00 64.44           N  \nATOM   2719  CA  ARG A 189      17.941   8.367 -18.704  1.00 65.37           C  \nATOM   2720  C   ARG A 189      17.538   7.090 -17.948  1.00 66.47           C  \nATOM   2721  O   ARG A 189      16.638   6.387 -18.409  1.00 66.61           O  \nATOM   2722  CB  ARG A 189      19.440   8.703 -18.541  1.00 65.44           C  \nATOM   2723  CG  ARG A 189      19.894   9.938 -19.326  1.00 66.51           C  \nATOM   2724  CD  ARG A 189      21.406  10.165 -19.175  1.00 66.86           C  \nATOM   2725  NE  ARG A 189      21.821  11.485 -19.674  1.00 66.26           N  \nATOM   2726  CZ  ARG A 189      21.719  12.656 -19.015  1.00 66.65           C  \nATOM   2727  NH1 ARG A 189      21.194  12.743 -17.781  1.00 66.57           N  \nATOM   2728  NH2 ARG A 189      22.156  13.771 -19.612  1.00 65.04           N1+\nATOM   2729  H   ARG A 189      17.492  10.010 -17.464  1.00 64.44           H  \nATOM   2730  HA  ARG A 189      17.758   8.189 -19.766  1.00 65.37           H  \nATOM   2731  HB3 ARG A 189      20.039   7.845 -18.853  1.00 65.44           H  \nATOM   2732  HB2 ARG A 189      19.674   8.874 -17.489  1.00 65.44           H  \nATOM   2733  HG3 ARG A 189      19.318  10.832 -19.082  1.00 66.51           H  \nATOM   2734  HG2 ARG A 189      19.686   9.721 -20.375  1.00 66.51           H  \nATOM   2735  HD3 ARG A 189      21.914   9.469 -19.843  1.00 66.86           H  \nATOM   2736  HD2 ARG A 189      21.777   9.943 -18.174  1.00 66.86           H  \nATOM   2737  HE  ARG A 189      22.187  11.498 -20.615  1.00 66.26           H  \nATOM   2738 HH12 ARG A 189      21.130  13.631 -17.306  1.00 66.57           H  \nATOM   2739 HH11 ARG A 189      20.850  11.912 -17.318  1.00 66.57           H  \nATOM   2740 HH22 ARG A 189      22.091  14.662 -19.141  1.00 65.04           H  \nATOM   2741 HH21 ARG A 189      22.555  13.734 -20.539  1.00 65.04           H  \nATOM   2742  N   ASN A 190      18.237   6.806 -16.833  1.00 66.58           N  \nATOM   2743  CA  ASN A 190      18.134   5.599 -16.007  1.00 66.84           C  \nATOM   2744  C   ASN A 190      16.696   5.336 -15.546  1.00 66.83           C  \nATOM   2745  O   ASN A 190      16.134   6.142 -14.806  1.00 66.79           O  \nATOM   2746  CB  ASN A 190      19.070   5.736 -14.780  1.00 67.44           C  \nATOM   2747  CG  ASN A 190      20.569   5.739 -15.104  1.00 68.51           C  \nATOM   2748  OD1 ASN A 190      20.992   5.373 -16.199  1.00 68.94           O  \nATOM   2749  ND2 ASN A 190      21.388   6.142 -14.130  1.00 68.38           N  \nATOM   2750  H   ASN A 190      18.941   7.465 -16.533  1.00 66.58           H  \nATOM   2751  HA  ASN A 190      18.479   4.775 -16.636  1.00 66.84           H  \nATOM   2752  HB3 ASN A 190      18.901   4.901 -14.098  1.00 67.44           H  \nATOM   2753  HB2 ASN A 190      18.825   6.643 -14.224  1.00 67.44           H  \nATOM   2754 HD22 ASN A 190      22.385   6.160 -14.286  1.00 68.38           H  \nATOM   2755 HD21 ASN A 190      21.018   6.451 -13.243  1.00 68.38           H  \nATOM   2756  N   LYS A 191      16.145   4.198 -15.991  1.00 66.99           N  \nATOM   2757  CA  LYS A 191      14.784   3.760 -15.671  1.00 67.22           C  \nATOM   2758  C   LYS A 191      14.638   3.258 -14.222  1.00 66.45           C  \nATOM   2759  O   LYS A 191      13.533   3.302 -13.683  1.00 65.12           O  \nATOM   2760  CB  LYS A 191      14.349   2.676 -16.675  1.00 68.00           C  \nATOM   2761  CG  LYS A 191      14.388   3.157 -18.140  1.00 69.16           C  \nATOM   2762  CD  LYS A 191      13.687   2.212 -19.128  1.00 69.10           C  \nATOM   2763  CE  LYS A 191      12.152   2.257 -19.017  1.00 69.33           C  \nATOM   2764  NZ  LYS A 191      11.504   1.395 -20.020  1.00 70.64           N1+\nATOM   2765  H   LYS A 191      16.671   3.600 -16.611  1.00 66.99           H  \nATOM   2766  HA  LYS A 191      14.117   4.617 -15.785  1.00 67.22           H  \nATOM   2767  HB3 LYS A 191      13.336   2.365 -16.419  1.00 68.00           H  \nATOM   2768  HB2 LYS A 191      14.973   1.788 -16.570  1.00 68.00           H  \nATOM   2769  HG3 LYS A 191      15.427   3.272 -18.450  1.00 69.16           H  \nATOM   2770  HG2 LYS A 191      13.946   4.152 -18.216  1.00 69.16           H  \nATOM   2771  HD3 LYS A 191      14.042   1.193 -18.961  1.00 69.10           H  \nATOM   2772  HD2 LYS A 191      13.995   2.476 -20.140  1.00 69.10           H  \nATOM   2773  HE3 LYS A 191      11.795   3.278 -19.160  1.00 69.33           H  \nATOM   2774  HE2 LYS A 191      11.820   1.937 -18.030  1.00 69.33           H  \nATOM   2775  HZ1 LYS A 191      11.795   0.438 -19.884  1.00 70.64           H  \nATOM   2776  HZ2 LYS A 191      10.500   1.457 -19.921  1.00 70.64           H  \nATOM   2777  HZ3 LYS A 191      11.768   1.698 -20.947  1.00 70.64           H  \nATOM   2778  N   ARG A 192      15.758   2.817 -13.624  1.00 66.07           N  \nATOM   2779  CA  ARG A 192      15.870   2.398 -12.226  1.00 65.07           C  \nATOM   2780  C   ARG A 192      16.387   3.527 -11.313  1.00 63.80           C  \nATOM   2781  O   ARG A 192      16.500   3.310 -10.106  1.00 64.94           O  \nATOM   2782  CB  ARG A 192      16.781   1.154 -12.141  1.00 65.08           C  \nATOM   2783  CG  ARG A 192      16.354   0.029 -13.106  1.00 65.38           C  \nATOM   2784  CD  ARG A 192      17.045  -1.325 -12.868  1.00 64.94           C  \nATOM   2785  NE  ARG A 192      16.612  -1.982 -11.621  1.00 63.91           N  \nATOM   2786  CZ  ARG A 192      15.437  -2.598 -11.387  1.00 65.68           C  \nATOM   2787  NH1 ARG A 192      14.472  -2.687 -12.315  1.00 64.31           N  \nATOM   2788  NH2 ARG A 192      15.218  -3.147 -10.188  1.00 65.10           N1+\nATOM   2789  H   ARG A 192      16.619   2.820 -14.150  1.00 66.07           H  \nATOM   2790  HA  ARG A 192      14.884   2.117 -11.857  1.00 65.07           H  \nATOM   2791  HB3 ARG A 192      16.782   0.784 -11.115  1.00 65.08           H  \nATOM   2792  HB2 ARG A 192      17.813   1.432 -12.363  1.00 65.08           H  \nATOM   2793  HG3 ARG A 192      16.453   0.313 -14.153  1.00 65.38           H  \nATOM   2794  HG2 ARG A 192      15.282  -0.096 -12.947  1.00 65.38           H  \nATOM   2795  HD3 ARG A 192      18.107  -1.133 -12.717  1.00 64.94           H  \nATOM   2796  HD2 ARG A 192      16.986  -1.979 -13.739  1.00 64.94           H  \nATOM   2797  HE  ARG A 192      17.285  -1.929 -10.868  1.00 63.91           H  \nATOM   2798 HH12 ARG A 192      13.592  -3.134 -12.099  1.00 64.31           H  \nATOM   2799 HH11 ARG A 192      14.604  -2.267 -13.223  1.00 64.31           H  \nATOM   2800 HH22 ARG A 192      14.344  -3.614  -9.984  1.00 65.10           H  \nATOM   2801 HH21 ARG A 192      15.898  -3.059  -9.446  1.00 65.10           H  \nATOM   2802  N   GLY A 193      16.702   4.693 -11.905  1.00 61.68           N  \nATOM   2803  CA  GLY A 193      17.254   5.858 -11.229  1.00 57.85           C  \nATOM   2804  C   GLY A 193      16.195   6.959 -11.119  1.00 54.40           C  \nATOM   2805  O   GLY A 193      15.203   6.988 -11.851  1.00 54.74           O  \nATOM   2806  H   GLY A 193      16.527   4.797 -12.895  1.00 61.68           H  \nATOM   2807  HA3 GLY A 193      18.090   6.238 -11.817  1.00 57.85           H  \nATOM   2808  HA2 GLY A 193      17.645   5.607 -10.242  1.00 57.85           H  \nATOM   2809  N   VAL A 194      16.460   7.887 -10.193  1.00 51.20           N  \nATOM   2810  CA  VAL A 194      15.654   9.067  -9.903  1.00 47.88           C  \nATOM   2811  C   VAL A 194      16.595  10.258  -9.641  1.00 45.73           C  \nATOM   2812  O   VAL A 194      17.732  10.067  -9.208  1.00 44.54           O  \nATOM   2813  CB  VAL A 194      14.747   8.844  -8.654  1.00 48.42           C  \nATOM   2814  CG1 VAL A 194      13.683   7.760  -8.910  1.00 48.70           C  \nATOM   2815  CG2 VAL A 194      15.511   8.570  -7.342  1.00 48.70           C  \nATOM   2816  H   VAL A 194      17.309   7.814  -9.651  1.00 51.20           H  \nATOM   2817  HA  VAL A 194      15.032   9.315 -10.764  1.00 47.88           H  \nATOM   2818  HB  VAL A 194      14.191   9.765  -8.486  1.00 48.42           H  \nATOM   2819 HG11 VAL A 194      12.988   7.675  -8.078  1.00 48.70           H  \nATOM   2820 HG12 VAL A 194      13.096   7.988  -9.801  1.00 48.70           H  \nATOM   2821 HG13 VAL A 194      14.133   6.777  -9.049  1.00 48.70           H  \nATOM   2822 HG21 VAL A 194      14.826   8.324  -6.533  1.00 48.70           H  \nATOM   2823 HG22 VAL A 194      16.195   7.727  -7.446  1.00 48.70           H  \nATOM   2824 HG23 VAL A 194      16.091   9.432  -7.015  1.00 48.70           H  \nATOM   2825  N   ILE A 195      16.084  11.468  -9.901  1.00 44.00           N  \nATOM   2826  CA  ILE A 195      16.733  12.741  -9.594  1.00 42.15           C  \nATOM   2827  C   ILE A 195      16.114  13.287  -8.303  1.00 39.98           C  \nATOM   2828  O   ILE A 195      14.891  13.378  -8.232  1.00 40.39           O  \nATOM   2829  CB  ILE A 195      16.504  13.768 -10.746  1.00 42.60           C  \nATOM   2830  CG1 ILE A 195      17.329  13.348 -11.983  1.00 44.09           C  \nATOM   2831  CG2 ILE A 195      16.803  15.243 -10.378  1.00 43.47           C  \nATOM   2832  CD1 ILE A 195      16.950  14.086 -13.272  1.00 45.10           C  \nATOM   2833  H   ILE A 195      15.130  11.535 -10.231  1.00 44.00           H  \nATOM   2834  HA  ILE A 195      17.807  12.603  -9.450  1.00 42.15           H  \nATOM   2835  HB  ILE A 195      15.450  13.718 -11.028  1.00 42.60           H  \nATOM   2836 HG13 ILE A 195      17.219  12.279 -12.164  1.00 44.09           H  \nATOM   2837 HG12 ILE A 195      18.390  13.501 -11.781  1.00 44.09           H  \nATOM   2838 HG21 ILE A 195      16.663  15.907 -11.231  1.00 43.47           H  \nATOM   2839 HG22 ILE A 195      16.142  15.624  -9.599  1.00 43.47           H  \nATOM   2840 HG23 ILE A 195      17.831  15.362 -10.034  1.00 43.47           H  \nATOM   2841 HD11 ILE A 195      17.393  13.586 -14.133  1.00 45.10           H  \nATOM   2842 HD12 ILE A 195      15.869  14.112 -13.415  1.00 45.10           H  \nATOM   2843 HD13 ILE A 195      17.320  15.111 -13.274  1.00 45.10           H  \nATOM   2844  N   ILE A 196      16.960  13.663  -7.333  1.00 39.35           N  \nATOM   2845  CA  ILE A 196      16.533  14.278  -6.076  1.00 38.26           C  \nATOM   2846  C   ILE A 196      17.091  15.711  -6.063  1.00 39.38           C  \nATOM   2847  O   ILE A 196      18.280  15.916  -5.810  1.00 41.32           O  \nATOM   2848  CB  ILE A 196      17.032  13.494  -4.827  1.00 37.13           C  \nATOM   2849  CG1 ILE A 196      16.555  12.020  -4.838  1.00 37.59           C  \nATOM   2850  CG2 ILE A 196      16.604  14.156  -3.495  1.00 36.34           C  \nATOM   2851  CD1 ILE A 196      17.502  11.069  -4.096  1.00 38.64           C  \nATOM   2852  H   ILE A 196      17.957  13.568  -7.465  1.00 39.35           H  \nATOM   2853  HA  ILE A 196      15.445  14.330  -6.013  1.00 38.26           H  \nATOM   2854  HB  ILE A 196      18.123  13.484  -4.855  1.00 37.13           H  \nATOM   2855 HG13 ILE A 196      16.473  11.644  -5.856  1.00 37.59           H  \nATOM   2856 HG12 ILE A 196      15.547  11.943  -4.428  1.00 37.59           H  \nATOM   2857 HG21 ILE A 196      17.029  13.633  -2.639  1.00 36.34           H  \nATOM   2858 HG22 ILE A 196      16.914  15.197  -3.420  1.00 36.34           H  \nATOM   2859 HG23 ILE A 196      15.519  14.141  -3.383  1.00 36.34           H  \nATOM   2860 HD11 ILE A 196      16.967  10.192  -3.730  1.00 38.64           H  \nATOM   2861 HD12 ILE A 196      18.293  10.717  -4.759  1.00 38.64           H  \nATOM   2862 HD13 ILE A 196      17.981  11.552  -3.245  1.00 38.64           H  \nATOM   2863  N   LYS A 197      16.206  16.669  -6.375  1.00 38.14           N  \nATOM   2864  CA  LYS A 197      16.483  18.101  -6.405  1.00 37.79           C  \nATOM   2865  C   LYS A 197      16.796  18.642  -5.000  1.00 36.85           C  \nATOM   2866  O   LYS A 197      15.981  18.483  -4.091  1.00 35.36           O  \nATOM   2867  CB  LYS A 197      15.276  18.827  -7.042  1.00 37.13           C  \nATOM   2868  CG  LYS A 197      15.433  20.356  -7.147  1.00 39.41           C  \nATOM   2869  CD  LYS A 197      14.198  21.047  -7.739  1.00 41.69           C  \nATOM   2870  CE  LYS A 197      14.383  22.571  -7.820  1.00 44.71           C  \nATOM   2871  NZ  LYS A 197      13.187  23.240  -8.360  1.00 46.18           N1+\nATOM   2872  H   LYS A 197      15.243  16.408  -6.536  1.00 38.14           H  \nATOM   2873  HA  LYS A 197      17.350  18.254  -7.051  1.00 37.79           H  \nATOM   2874  HB3 LYS A 197      14.377  18.605  -6.466  1.00 37.13           H  \nATOM   2875  HB2 LYS A 197      15.103  18.421  -8.040  1.00 37.13           H  \nATOM   2876  HG3 LYS A 197      16.309  20.586  -7.755  1.00 39.41           H  \nATOM   2877  HG2 LYS A 197      15.622  20.788  -6.164  1.00 39.41           H  \nATOM   2878  HD3 LYS A 197      13.326  20.807  -7.128  1.00 41.69           H  \nATOM   2879  HD2 LYS A 197      13.999  20.639  -8.732  1.00 41.69           H  \nATOM   2880  HE3 LYS A 197      15.236  22.815  -8.455  1.00 44.71           H  \nATOM   2881  HE2 LYS A 197      14.591  22.979  -6.831  1.00 44.71           H  \nATOM   2882  HZ1 LYS A 197      12.394  23.046  -7.765  1.00 46.18           H  \nATOM   2883  HZ2 LYS A 197      13.344  24.237  -8.397  1.00 46.18           H  \nATOM   2884  HZ3 LYS A 197      12.998  22.895  -9.291  1.00 46.18           H  \nATOM   2885  N   GLY A 198      17.950  19.316  -4.887  1.00 38.11           N  \nATOM   2886  CA  GLY A 198      18.369  20.028  -3.683  1.00 39.85           C  \nATOM   2887  C   GLY A 198      19.177  19.157  -2.710  1.00 40.71           C  \nATOM   2888  O   GLY A 198      19.602  19.689  -1.687  1.00 41.56           O  \nATOM   2889  H   GLY A 198      18.561  19.387  -5.688  1.00 38.11           H  \nATOM   2890  HA3 GLY A 198      17.508  20.447  -3.159  1.00 39.85           H  \nATOM   2891  HA2 GLY A 198      18.990  20.872  -3.984  1.00 39.85           H  \nATOM   2892  N   LEU A 199      19.406  17.860  -3.002  1.00 40.46           N  \nATOM   2893  CA  LEU A 199      20.236  16.974  -2.181  1.00 40.03           C  \nATOM   2894  C   LEU A 199      21.720  17.357  -2.291  1.00 41.70           C  \nATOM   2895  O   LEU A 199      22.331  17.127  -3.336  1.00 41.24           O  \nATOM   2896  CB  LEU A 199      19.980  15.500  -2.569  1.00 37.82           C  \nATOM   2897  CG  LEU A 199      20.751  14.454  -1.727  1.00 36.34           C  \nATOM   2898  CD1 LEU A 199      20.402  14.545  -0.229  1.00 35.93           C  \nATOM   2899  CD2 LEU A 199      20.538  13.032  -2.280  1.00 35.17           C  \nATOM   2900  H   LEU A 199      19.042  17.467  -3.858  1.00 40.46           H  \nATOM   2901  HA  LEU A 199      19.922  17.100  -1.144  1.00 40.03           H  \nATOM   2902  HB3 LEU A 199      20.215  15.363  -3.626  1.00 37.82           H  \nATOM   2903  HB2 LEU A 199      18.917  15.298  -2.467  1.00 37.82           H  \nATOM   2904  HG  LEU A 199      21.819  14.653  -1.826  1.00 36.34           H  \nATOM   2905 HD11 LEU A 199      20.575  13.602   0.290  1.00 35.93           H  \nATOM   2906 HD12 LEU A 199      21.018  15.297   0.260  1.00 35.93           H  \nATOM   2907 HD13 LEU A 199      19.361  14.826  -0.071  1.00 35.93           H  \nATOM   2908 HD21 LEU A 199      21.481  12.487  -2.325  1.00 35.17           H  \nATOM   2909 HD22 LEU A 199      19.850  12.452  -1.670  1.00 35.17           H  \nATOM   2910 HD23 LEU A 199      20.127  13.046  -3.290  1.00 35.17           H  \nATOM   2911  N   GLU A 200      22.260  17.926  -1.202  1.00 42.28           N  \nATOM   2912  CA  GLU A 200      23.662  18.300  -1.065  1.00 45.64           C  \nATOM   2913  C   GLU A 200      24.586  17.084  -1.041  1.00 45.00           C  \nATOM   2914  O   GLU A 200      24.344  16.134  -0.298  1.00 43.55           O  \nATOM   2915  CB  GLU A 200      23.881  19.147   0.208  1.00 49.57           C  \nATOM   2916  CG  GLU A 200      23.403  20.605   0.081  1.00 57.01           C  \nATOM   2917  CD  GLU A 200      24.177  21.431  -0.956  1.00 60.33           C  \nATOM   2918  OE1 GLU A 200      25.428  21.389  -0.918  1.00 62.11           O  \nATOM   2919  OE2 GLU A 200      23.506  22.099  -1.773  1.00 62.56           O1-\nATOM   2920  H   GLU A 200      21.673  18.114  -0.396  1.00 42.28           H  \nATOM   2921  HA  GLU A 200      23.922  18.895  -1.943  1.00 45.64           H  \nATOM   2922  HB3 GLU A 200      24.932  19.133   0.505  1.00 49.57           H  \nATOM   2923  HB2 GLU A 200      23.357  18.684   1.045  1.00 49.57           H  \nATOM   2924  HG3 GLU A 200      23.558  21.094   1.039  1.00 57.01           H  \nATOM   2925  HG2 GLU A 200      22.331  20.635  -0.120  1.00 57.01           H  \nATOM   2926  N   GLU A 201      25.655  17.189  -1.835  1.00 45.79           N  \nATOM   2927  CA  GLU A 201      26.770  16.261  -1.858  1.00 46.72           C  \nATOM   2928  C   GLU A 201      27.987  17.028  -1.341  1.00 46.76           C  \nATOM   2929  O   GLU A 201      28.514  17.885  -2.050  1.00 47.10           O  \nATOM   2930  CB  GLU A 201      26.981  15.751  -3.293  1.00 48.30           C  \nATOM   2931  CG  GLU A 201      25.827  14.857  -3.797  1.00 53.27           C  \nATOM   2932  CD  GLU A 201      26.003  14.333  -5.231  1.00 56.17           C  \nATOM   2933  OE1 GLU A 201      25.324  13.334  -5.553  1.00 57.27           O  \nATOM   2934  OE2 GLU A 201      26.803  14.919  -5.994  1.00 58.06           O1-\nATOM   2935  H   GLU A 201      25.767  18.019  -2.401  1.00 45.79           H  \nATOM   2936  HA  GLU A 201      26.586  15.402  -1.213  1.00 46.72           H  \nATOM   2937  HB3 GLU A 201      27.913  15.188  -3.337  1.00 48.30           H  \nATOM   2938  HB2 GLU A 201      27.107  16.605  -3.962  1.00 48.30           H  \nATOM   2939  HG3 GLU A 201      24.884  15.404  -3.759  1.00 53.27           H  \nATOM   2940  HG2 GLU A 201      25.715  14.006  -3.124  1.00 53.27           H  \nATOM   2941  N   ILE A 202      28.387  16.724  -0.098  1.00 46.40           N  \nATOM   2942  CA  ILE A 202      29.537  17.339   0.553  1.00 46.13           C  \nATOM   2943  C   ILE A 202      30.800  16.547   0.202  1.00 45.18           C  \nATOM   2944  O   ILE A 202      30.892  15.369   0.548  1.00 45.33           O  \nATOM   2945  CB  ILE A 202      29.374  17.399   2.100  1.00 45.98           C  \nATOM   2946  CG1 ILE A 202      28.192  18.330   2.456  1.00 47.32           C  \nATOM   2947  CG2 ILE A 202      30.658  17.856   2.835  1.00 45.32           C  \nATOM   2948  CD1 ILE A 202      27.916  18.466   3.957  1.00 48.95           C  \nATOM   2949  H   ILE A 202      27.912  15.995   0.419  1.00 46.40           H  \nATOM   2950  HA  ILE A 202      29.652  18.364   0.192  1.00 46.13           H  \nATOM   2951  HB  ILE A 202      29.126  16.398   2.460  1.00 45.98           H  \nATOM   2952 HG13 ILE A 202      27.279  17.981   1.970  1.00 47.32           H  \nATOM   2953 HG12 ILE A 202      28.382  19.324   2.049  1.00 47.32           H  \nATOM   2954 HG21 ILE A 202      30.512  17.895   3.913  1.00 45.32           H  \nATOM   2955 HG22 ILE A 202      31.500  17.184   2.676  1.00 45.32           H  \nATOM   2956 HG23 ILE A 202      30.965  18.850   2.509  1.00 45.32           H  \nATOM   2957 HD11 ILE A 202      26.907  18.840   4.115  1.00 48.95           H  \nATOM   2958 HD12 ILE A 202      28.011  17.511   4.474  1.00 48.95           H  \nATOM   2959 HD13 ILE A 202      28.597  19.176   4.426  1.00 48.95           H  \nATOM   2960  N   THR A 203      31.755  17.231  -0.447  1.00 44.53           N  \nATOM   2961  CA  THR A 203      33.084  16.702  -0.726  1.00 44.04           C  \nATOM   2962  C   THR A 203      33.895  16.557   0.574  1.00 43.54           C  \nATOM   2963  O   THR A 203      34.031  17.525   1.323  1.00 43.23           O  \nATOM   2964  CB  THR A 203      33.879  17.615  -1.695  1.00 44.86           C  \nATOM   2965  OG1 THR A 203      33.165  17.718  -2.911  1.00 43.73           O  \nATOM   2966  CG2 THR A 203      35.301  17.121  -2.028  1.00 44.45           C  \nATOM   2967  H   THR A 203      31.594  18.191  -0.714  1.00 44.53           H  \nATOM   2968  HA  THR A 203      32.958  15.728  -1.197  1.00 44.04           H  \nATOM   2969  HB  THR A 203      33.948  18.621  -1.278  1.00 44.86           H  \nATOM   2970  HG1 THR A 203      33.191  16.868  -3.355  1.00 43.73           H  \nATOM   2971 HG21 THR A 203      35.766  17.749  -2.788  1.00 44.45           H  \nATOM   2972 HG22 THR A 203      35.957  17.141  -1.157  1.00 44.45           H  \nATOM   2973 HG23 THR A 203      35.287  16.098  -2.407  1.00 44.45           H  \nATOM   2974  N   VAL A 204      34.418  15.345   0.788  1.00 44.30           N  \nATOM   2975  CA  VAL A 204      35.281  14.998   1.904  1.00 45.77           C  \nATOM   2976  C   VAL A 204      36.712  14.913   1.337  1.00 46.96           C  \nATOM   2977  O   VAL A 204      36.987  14.072   0.480  1.00 47.51           O  \nATOM   2978  CB  VAL A 204      34.901  13.628   2.533  1.00 44.79           C  \nATOM   2979  CG1 VAL A 204      35.601  13.429   3.888  1.00 45.00           C  \nATOM   2980  CG2 VAL A 204      33.382  13.431   2.688  1.00 44.50           C  \nATOM   2981  H   VAL A 204      34.268  14.612   0.105  1.00 44.30           H  \nATOM   2982  HA  VAL A 204      35.229  15.762   2.681  1.00 45.77           H  \nATOM   2983  HB  VAL A 204      35.224  12.820   1.880  1.00 44.79           H  \nATOM   2984 HG11 VAL A 204      35.324  12.471   4.321  1.00 45.00           H  \nATOM   2985 HG12 VAL A 204      36.685  13.444   3.790  1.00 45.00           H  \nATOM   2986 HG13 VAL A 204      35.324  14.207   4.601  1.00 45.00           H  \nATOM   2987 HG21 VAL A 204      33.152  12.516   3.236  1.00 44.50           H  \nATOM   2988 HG22 VAL A 204      32.926  14.261   3.218  1.00 44.50           H  \nATOM   2989 HG23 VAL A 204      32.889  13.352   1.719  1.00 44.50           H  \nATOM   2990  N   HIS A 205      37.575  15.836   1.781  1.00 48.27           N  \nATOM   2991  CA  HIS A 205      38.931  16.026   1.262  1.00 50.42           C  \nATOM   2992  C   HIS A 205      39.951  15.083   1.921  1.00 50.78           C  \nATOM   2993  O   HIS A 205      40.913  14.695   1.260  1.00 50.81           O  \nATOM   2994  CB  HIS A 205      39.346  17.499   1.461  1.00 50.66           C  \nATOM   2995  CG  HIS A 205      38.441  18.496   0.772  1.00 50.85           C  \nATOM   2996  ND1 HIS A 205      37.443  19.173   1.453  1.00 51.12           N1+\nATOM   2997  CD2 HIS A 205      38.419  18.960  -0.530  1.00 50.79           C  \nATOM   2998  CE1 HIS A 205      36.831  19.966   0.580  1.00 50.20           C  \nATOM   2999  NE2 HIS A 205      37.383  19.876  -0.628  1.00 50.46           N  \nATOM   3000  H   HIS A 205      37.269  16.496   2.488  1.00 48.27           H  \nATOM   3001  HA  HIS A 205      38.931  15.817   0.190  1.00 50.42           H  \nATOM   3002  HB3 HIS A 205      40.355  17.653   1.078  1.00 50.66           H  \nATOM   3003  HB2 HIS A 205      39.386  17.740   2.524  1.00 50.66           H  \nATOM   3004  HD1 HIS A 205      37.198  19.056   2.434  1.00 51.12           H  \nATOM   3005  HD2 HIS A 205      39.029  18.715  -1.387  1.00 50.79           H  \nATOM   3006  HE1 HIS A 205      35.993  20.603   0.824  1.00 50.20           H  \nATOM   3007  HE2 HIS A 205      37.102  20.383  -1.456  1.00 50.46           H  \nATOM   3008  N   ASN A 206      39.723  14.732   3.196  1.00 51.18           N  \nATOM   3009  CA  ASN A 206      40.587  13.867   4.002  1.00 51.18           C  \nATOM   3010  C   ASN A 206      39.800  13.298   5.192  1.00 51.21           C  \nATOM   3011  O   ASN A 206      38.724  13.802   5.521  1.00 51.46           O  \nATOM   3012  CB  ASN A 206      41.888  14.608   4.425  1.00 50.68           C  \nATOM   3013  CG  ASN A 206      41.676  15.927   5.184  1.00 52.37           C  \nATOM   3014  OD1 ASN A 206      41.149  15.935   6.292  1.00 53.55           O  \nATOM   3015  ND2 ASN A 206      42.102  17.048   4.600  1.00 52.82           N  \nATOM   3016  H   ASN A 206      38.896  15.074   3.667  1.00 51.18           H  \nATOM   3017  HA  ASN A 206      40.870  13.027   3.366  1.00 51.18           H  \nATOM   3018  HB3 ASN A 206      42.489  14.809   3.538  1.00 50.68           H  \nATOM   3019  HB2 ASN A 206      42.503  13.956   5.047  1.00 50.68           H  \nATOM   3020 HD22 ASN A 206      41.990  17.933   5.072  1.00 52.82           H  \nATOM   3021 HD21 ASN A 206      42.546  17.020   3.693  1.00 52.82           H  \nATOM   3022  N   LYS A 207      40.377  12.268   5.835  1.00 52.18           N  \nATOM   3023  CA  LYS A 207      39.844  11.647   7.051  1.00 53.37           C  \nATOM   3024  C   LYS A 207      39.692  12.620   8.237  1.00 53.82           C  \nATOM   3025  O   LYS A 207      38.712  12.501   8.964  1.00 53.82           O  \nATOM   3026  CB  LYS A 207      40.661  10.397   7.432  1.00 55.31           C  \nATOM   3027  CG  LYS A 207      42.174  10.642   7.607  1.00 56.90           C  \nATOM   3028  CD  LYS A 207      42.791   9.989   8.851  1.00 58.37           C  \nATOM   3029  CE  LYS A 207      42.207  10.523  10.171  1.00 58.94           C  \nATOM   3030  NZ  LYS A 207      43.150  10.352  11.287  1.00 60.33           N1+\nATOM   3031  H   LYS A 207      41.258  11.904   5.502  1.00 52.18           H  \nATOM   3032  HA  LYS A 207      38.849  11.290   6.798  1.00 53.37           H  \nATOM   3033  HB3 LYS A 207      40.517   9.625   6.679  1.00 55.31           H  \nATOM   3034  HB2 LYS A 207      40.234   9.970   8.340  1.00 55.31           H  \nATOM   3035  HG3 LYS A 207      42.401  11.707   7.630  1.00 56.90           H  \nATOM   3036  HG2 LYS A 207      42.690  10.265   6.723  1.00 56.90           H  \nATOM   3037  HD3 LYS A 207      43.870  10.153   8.813  1.00 58.37           H  \nATOM   3038  HD2 LYS A 207      42.651   8.907   8.799  1.00 58.37           H  \nATOM   3039  HE3 LYS A 207      41.268  10.025  10.414  1.00 58.94           H  \nATOM   3040  HE2 LYS A 207      41.982  11.584  10.088  1.00 58.94           H  \nATOM   3041  HZ1 LYS A 207      43.986  10.889  11.103  1.00 60.33           H  \nATOM   3042  HZ2 LYS A 207      42.716  10.697  12.135  1.00 60.33           H  \nATOM   3043  HZ3 LYS A 207      43.382   9.375  11.397  1.00 60.33           H  \nATOM   3044  N   ASP A 208      40.598  13.605   8.367  1.00 53.64           N  \nATOM   3045  CA  ASP A 208      40.578  14.669   9.385  1.00 54.33           C  \nATOM   3046  C   ASP A 208      39.460  15.724   9.194  1.00 53.71           C  \nATOM   3047  O   ASP A 208      39.445  16.713   9.926  1.00 54.95           O  \nATOM   3048  CB  ASP A 208      41.962  15.346   9.585  1.00 56.35           C  \nATOM   3049  CG  ASP A 208      43.135  14.361   9.717  1.00 58.62           C  \nATOM   3050  OD1 ASP A 208      43.298  13.818  10.832  1.00 59.21           O  \nATOM   3051  OD2 ASP A 208      43.750  14.043   8.674  1.00 60.63           O1-\nATOM   3052  H   ASP A 208      41.367  13.656   7.713  1.00 53.64           H  \nATOM   3053  HA  ASP A 208      40.341  14.177  10.331  1.00 54.33           H  \nATOM   3054  HB3 ASP A 208      41.945  15.959  10.488  1.00 56.35           H  \nATOM   3055  HB2 ASP A 208      42.172  16.024   8.757  1.00 56.35           H  \nATOM   3056  N   GLU A 209      38.540  15.490   8.244  1.00 52.25           N  \nATOM   3057  CA  GLU A 209      37.350  16.296   7.978  1.00 50.66           C  \nATOM   3058  C   GLU A 209      36.059  15.451   8.073  1.00 48.60           C  \nATOM   3059  O   GLU A 209      34.976  16.033   8.133  1.00 47.52           O  \nATOM   3060  CB  GLU A 209      37.525  16.928   6.584  1.00 52.62           C  \nATOM   3061  CG  GLU A 209      36.485  18.011   6.222  1.00 55.80           C  \nATOM   3062  CD  GLU A 209      36.679  18.541   4.802  1.00 58.39           C  \nATOM   3063  OE1 GLU A 209      36.692  17.701   3.880  1.00 60.18           O  \nATOM   3064  OE2 GLU A 209      36.806  19.774   4.639  1.00 60.45           O1-\nATOM   3065  H   GLU A 209      38.660  14.682   7.649  1.00 52.25           H  \nATOM   3066  HA  GLU A 209      37.265  17.096   8.715  1.00 50.66           H  \nATOM   3067  HB3 GLU A 209      37.498  16.128   5.842  1.00 52.62           H  \nATOM   3068  HB2 GLU A 209      38.523  17.363   6.509  1.00 52.62           H  \nATOM   3069  HG3 GLU A 209      36.537  18.827   6.945  1.00 55.80           H  \nATOM   3070  HG2 GLU A 209      35.470  17.620   6.273  1.00 55.80           H  \nATOM   3071  N   VAL A 210      36.179  14.107   8.111  1.00 46.40           N  \nATOM   3072  CA  VAL A 210      35.064  13.157   8.216  1.00 44.14           C  \nATOM   3073  C   VAL A 210      34.184  13.402   9.451  1.00 43.51           C  \nATOM   3074  O   VAL A 210      32.966  13.475   9.303  1.00 42.39           O  \nATOM   3075  CB  VAL A 210      35.563  11.677   8.236  1.00 44.48           C  \nATOM   3076  CG1 VAL A 210      34.548  10.607   8.703  1.00 42.85           C  \nATOM   3077  CG2 VAL A 210      36.103  11.282   6.855  1.00 42.99           C  \nATOM   3078  H   VAL A 210      37.100  13.694   8.085  1.00 46.40           H  \nATOM   3079  HA  VAL A 210      34.438  13.300   7.333  1.00 44.14           H  \nATOM   3080  HB  VAL A 210      36.393  11.620   8.937  1.00 44.48           H  \nATOM   3081 HG11 VAL A 210      34.965   9.606   8.597  1.00 42.85           H  \nATOM   3082 HG12 VAL A 210      34.286  10.715   9.756  1.00 42.85           H  \nATOM   3083 HG13 VAL A 210      33.629  10.648   8.118  1.00 42.85           H  \nATOM   3084 HG21 VAL A 210      36.648  10.339   6.899  1.00 42.99           H  \nATOM   3085 HG22 VAL A 210      35.287  11.165   6.144  1.00 42.99           H  \nATOM   3086 HG23 VAL A 210      36.777  12.038   6.453  1.00 42.99           H  \nATOM   3087  N   TYR A 211      34.816  13.545  10.629  1.00 42.45           N  \nATOM   3088  CA  TYR A 211      34.116  13.676  11.904  1.00 41.99           C  \nATOM   3089  C   TYR A 211      33.244  14.937  12.017  1.00 43.14           C  \nATOM   3090  O   TYR A 211      32.134  14.827  12.533  1.00 42.53           O  \nATOM   3091  CB  TYR A 211      35.115  13.564  13.065  1.00 40.52           C  \nATOM   3092  CG  TYR A 211      34.451  13.378  14.414  1.00 39.40           C  \nATOM   3093  CD1 TYR A 211      33.783  12.168  14.683  1.00 39.03           C  \nATOM   3094  CD2 TYR A 211      34.452  14.409  15.376  1.00 39.70           C  \nATOM   3095  CE1 TYR A 211      33.083  12.003  15.887  1.00 37.82           C  \nATOM   3096  CE2 TYR A 211      33.743  14.243  16.582  1.00 39.48           C  \nATOM   3097  CZ  TYR A 211      33.032  13.052  16.824  1.00 38.29           C  \nATOM   3098  OH  TYR A 211      32.279  12.914  17.953  1.00 39.27           O  \nATOM   3099  H   TYR A 211      35.824  13.494  10.668  1.00 42.45           H  \nATOM   3100  HA  TYR A 211      33.441  12.820  11.965  1.00 41.99           H  \nATOM   3101  HB3 TYR A 211      35.794  14.418  13.086  1.00 40.52           H  \nATOM   3102  HB2 TYR A 211      35.730  12.685  12.894  1.00 40.52           H  \nATOM   3103  HD1 TYR A 211      33.791  11.368  13.957  1.00 39.03           H  \nATOM   3104  HD2 TYR A 211      34.960  15.341  15.179  1.00 39.70           H  \nATOM   3105  HE1 TYR A 211      32.574  11.072  16.069  1.00 37.82           H  \nATOM   3106  HE2 TYR A 211      33.720  15.047  17.304  1.00 39.48           H  \nATOM   3107  HH  TYR A 211      32.066  13.751  18.382  1.00 39.27           H  \nATOM   3108  N   GLN A 212      33.723  16.076  11.484  1.00 43.75           N  \nATOM   3109  CA  GLN A 212      32.967  17.331  11.390  1.00 43.56           C  \nATOM   3110  C   GLN A 212      31.652  17.219  10.604  1.00 41.95           C  \nATOM   3111  O   GLN A 212      30.649  17.793  11.026  1.00 41.64           O  \nATOM   3112  CB  GLN A 212      33.842  18.445  10.781  1.00 46.00           C  \nATOM   3113  CG  GLN A 212      34.710  19.183  11.809  1.00 48.97           C  \nATOM   3114  CD  GLN A 212      35.341  20.426  11.181  1.00 50.63           C  \nATOM   3115  OE1 GLN A 212      36.243  20.316  10.355  1.00 50.62           O  \nATOM   3116  NE2 GLN A 212      34.862  21.612  11.560  1.00 51.22           N  \nATOM   3117  H   GLN A 212      34.640  16.078  11.061  1.00 43.75           H  \nATOM   3118  HA  GLN A 212      32.696  17.617  12.407  1.00 43.56           H  \nATOM   3119  HB3 GLN A 212      33.199  19.188  10.303  1.00 46.00           H  \nATOM   3120  HB2 GLN A 212      34.464  18.044   9.979  1.00 46.00           H  \nATOM   3121  HG3 GLN A 212      35.495  18.526  12.185  1.00 48.97           H  \nATOM   3122  HG2 GLN A 212      34.109  19.478  12.671  1.00 48.97           H  \nATOM   3123 HE22 GLN A 212      35.249  22.458  11.168  1.00 51.22           H  \nATOM   3124 HE21 GLN A 212      34.119  21.673  12.241  1.00 51.22           H  \nATOM   3125  N   ILE A 213      31.687  16.476   9.487  1.00 40.96           N  \nATOM   3126  CA  ILE A 213      30.529  16.230   8.629  1.00 40.40           C  \nATOM   3127  C   ILE A 213      29.480  15.340   9.326  1.00 38.82           C  \nATOM   3128  O   ILE A 213      28.289  15.636   9.231  1.00 38.70           O  \nATOM   3129  CB  ILE A 213      30.957  15.608   7.268  1.00 41.38           C  \nATOM   3130  CG1 ILE A 213      31.837  16.609   6.480  1.00 41.39           C  \nATOM   3131  CG2 ILE A 213      29.782  15.120   6.391  1.00 41.81           C  \nATOM   3132  CD1 ILE A 213      32.608  15.980   5.316  1.00 43.68           C  \nATOM   3133  H   ILE A 213      32.552  16.034   9.207  1.00 40.96           H  \nATOM   3134  HA  ILE A 213      30.056  17.193   8.425  1.00 40.40           H  \nATOM   3135  HB  ILE A 213      31.577  14.737   7.480  1.00 41.38           H  \nATOM   3136 HG13 ILE A 213      32.570  17.079   7.135  1.00 41.39           H  \nATOM   3137 HG12 ILE A 213      31.216  17.426   6.109  1.00 41.39           H  \nATOM   3138 HG21 ILE A 213      30.126  14.797   5.412  1.00 41.81           H  \nATOM   3139 HG22 ILE A 213      29.266  14.267   6.831  1.00 41.81           H  \nATOM   3140 HG23 ILE A 213      29.053  15.914   6.230  1.00 41.81           H  \nATOM   3141 HD11 ILE A 213      33.407  16.639   4.973  1.00 43.68           H  \nATOM   3142 HD12 ILE A 213      33.065  15.033   5.605  1.00 43.68           H  \nATOM   3143 HD13 ILE A 213      31.949  15.797   4.470  1.00 43.68           H  \nATOM   3144  N   LEU A 214      29.945  14.313  10.058  1.00 37.14           N  \nATOM   3145  CA  LEU A 214      29.104  13.416  10.852  1.00 36.39           C  \nATOM   3146  C   LEU A 214      28.479  14.105  12.081  1.00 36.96           C  \nATOM   3147  O   LEU A 214      27.314  13.834  12.371  1.00 36.52           O  \nATOM   3148  CB  LEU A 214      29.912  12.164  11.257  1.00 34.22           C  \nATOM   3149  CG  LEU A 214      30.410  11.292  10.082  1.00 34.05           C  \nATOM   3150  CD1 LEU A 214      31.178  10.063  10.600  1.00 33.97           C  \nATOM   3151  CD2 LEU A 214      29.303  10.894   9.091  1.00 31.89           C  \nATOM   3152  H   LEU A 214      30.941  14.140  10.094  1.00 37.14           H  \nATOM   3153  HA  LEU A 214      28.269  13.107  10.222  1.00 36.39           H  \nATOM   3154  HB3 LEU A 214      29.294  11.542  11.899  1.00 34.22           H  \nATOM   3155  HB2 LEU A 214      30.763  12.466  11.870  1.00 34.22           H  \nATOM   3156  HG  LEU A 214      31.126  11.880   9.516  1.00 34.05           H  \nATOM   3157 HD11 LEU A 214      31.949   9.759   9.893  1.00 33.97           H  \nATOM   3158 HD12 LEU A 214      31.673  10.271  11.547  1.00 33.97           H  \nATOM   3159 HD13 LEU A 214      30.517   9.209  10.755  1.00 33.97           H  \nATOM   3160 HD21 LEU A 214      29.456   9.893   8.693  1.00 31.89           H  \nATOM   3161 HD22 LEU A 214      28.316  10.916   9.549  1.00 31.89           H  \nATOM   3162 HD23 LEU A 214      29.286  11.573   8.238  1.00 31.89           H  \nATOM   3163  N   GLU A 215      29.221  15.016  12.741  1.00 36.83           N  \nATOM   3164  CA  GLU A 215      28.717  15.886  13.811  1.00 37.19           C  \nATOM   3165  C   GLU A 215      27.581  16.810  13.352  1.00 35.62           C  \nATOM   3166  O   GLU A 215      26.598  16.939  14.080  1.00 34.59           O  \nATOM   3167  CB  GLU A 215      29.846  16.745  14.410  1.00 38.50           C  \nATOM   3168  CG  GLU A 215      30.763  16.002  15.394  1.00 40.59           C  \nATOM   3169  CD  GLU A 215      31.796  16.959  16.002  1.00 43.18           C  \nATOM   3170  OE1 GLU A 215      32.668  17.433  15.241  1.00 43.05           O  \nATOM   3171  OE2 GLU A 215      31.698  17.203  17.225  1.00 42.79           O1-\nATOM   3172  H   GLU A 215      30.184  15.164  12.467  1.00 36.83           H  \nATOM   3173  HA  GLU A 215      28.313  15.245  14.597  1.00 37.19           H  \nATOM   3174  HB3 GLU A 215      29.426  17.616  14.918  1.00 38.50           H  \nATOM   3175  HB2 GLU A 215      30.451  17.147  13.597  1.00 38.50           H  \nATOM   3176  HG3 GLU A 215      31.280  15.179  14.902  1.00 40.59           H  \nATOM   3177  HG2 GLU A 215      30.163  15.548  16.184  1.00 40.59           H  \nATOM   3178  N   LYS A 216      27.722  17.402  12.152  1.00 34.60           N  \nATOM   3179  CA  LYS A 216      26.673  18.182  11.491  1.00 35.20           C  \nATOM   3180  C   LYS A 216      25.416  17.356  11.182  1.00 33.65           C  \nATOM   3181  O   LYS A 216      24.317  17.870  11.373  1.00 33.67           O  \nATOM   3182  CB  LYS A 216      27.231  18.877  10.226  1.00 37.19           C  \nATOM   3183  CG  LYS A 216      27.593  20.356  10.444  1.00 41.61           C  \nATOM   3184  CD  LYS A 216      26.351  21.265  10.575  1.00 45.71           C  \nATOM   3185  CE  LYS A 216      26.675  22.749  10.822  1.00 48.01           C  \nATOM   3186  NZ  LYS A 216      27.247  22.987  12.161  1.00 49.53           N1+\nATOM   3187  H   LYS A 216      28.573  17.260  11.625  1.00 34.60           H  \nATOM   3188  HA  LYS A 216      26.375  18.944  12.212  1.00 35.20           H  \nATOM   3189  HB3 LYS A 216      26.504  18.839   9.412  1.00 37.19           H  \nATOM   3190  HB2 LYS A 216      28.097  18.331   9.849  1.00 37.19           H  \nATOM   3191  HG3 LYS A 216      28.196  20.697   9.602  1.00 41.61           H  \nATOM   3192  HG2 LYS A 216      28.229  20.439  11.325  1.00 41.61           H  \nATOM   3193  HD3 LYS A 216      25.684  20.900  11.358  1.00 45.71           H  \nATOM   3194  HD2 LYS A 216      25.772  21.194   9.652  1.00 45.71           H  \nATOM   3195  HE3 LYS A 216      25.762  23.341  10.737  1.00 48.01           H  \nATOM   3196  HE2 LYS A 216      27.363  23.120  10.062  1.00 48.01           H  \nATOM   3197  HZ1 LYS A 216      28.109  22.470  12.256  1.00 49.53           H  \nATOM   3198  HZ2 LYS A 216      27.434  23.973  12.278  1.00 49.53           H  \nATOM   3199  HZ3 LYS A 216      26.594  22.683  12.868  1.00 49.53           H  \nATOM   3200  N   GLY A 217      25.605  16.088  10.778  1.00 33.75           N  \nATOM   3201  CA  GLY A 217      24.547  15.106  10.549  1.00 32.24           C  \nATOM   3202  C   GLY A 217      23.714  14.869  11.815  1.00 30.95           C  \nATOM   3203  O   GLY A 217      22.497  15.046  11.788  1.00 30.94           O  \nATOM   3204  H   GLY A 217      26.553  15.763  10.645  1.00 33.75           H  \nATOM   3205  HA3 GLY A 217      25.004  14.166  10.240  1.00 32.24           H  \nATOM   3206  HA2 GLY A 217      23.908  15.430   9.735  1.00 32.24           H  \nATOM   3207  N   ALA A 218      24.390  14.516  12.921  1.00 31.76           N  \nATOM   3208  CA  ALA A 218      23.798  14.267  14.237  1.00 30.06           C  \nATOM   3209  C   ALA A 218      23.133  15.502  14.875  1.00 30.68           C  \nATOM   3210  O   ALA A 218      22.100  15.352  15.529  1.00 28.25           O  \nATOM   3211  CB  ALA A 218      24.881  13.694  15.163  1.00 30.77           C  \nATOM   3212  H   ALA A 218      25.394  14.401  12.862  1.00 31.76           H  \nATOM   3213  HA  ALA A 218      23.026  13.507  14.110  1.00 30.06           H  \nATOM   3214  HB1 ALA A 218      24.487  13.496  16.160  1.00 30.77           H  \nATOM   3215  HB2 ALA A 218      25.266  12.752  14.774  1.00 30.77           H  \nATOM   3216  HB3 ALA A 218      25.725  14.378  15.267  1.00 30.77           H  \nATOM   3217  N   ALA A 219      23.713  16.694  14.654  1.00 30.08           N  \nATOM   3218  CA  ALA A 219      23.179  17.977  15.111  1.00 31.41           C  \nATOM   3219  C   ALA A 219      21.873  18.360  14.401  1.00 31.60           C  \nATOM   3220  O   ALA A 219      20.940  18.801  15.070  1.00 31.54           O  \nATOM   3221  CB  ALA A 219      24.238  19.073  14.927  1.00 34.27           C  \nATOM   3222  H   ALA A 219      24.578  16.734  14.129  1.00 30.08           H  \nATOM   3223  HA  ALA A 219      22.967  17.890  16.178  1.00 31.41           H  \nATOM   3224  HB1 ALA A 219      23.867  20.042  15.264  1.00 34.27           H  \nATOM   3225  HB2 ALA A 219      25.135  18.850  15.505  1.00 34.27           H  \nATOM   3226  HB3 ALA A 219      24.533  19.176  13.883  1.00 34.27           H  \nATOM   3227  N   LYS A 220      21.809  18.143  13.075  1.00 32.32           N  \nATOM   3228  CA  LYS A 220      20.595  18.345  12.285  1.00 32.64           C  \nATOM   3229  C   LYS A 220      19.482  17.338  12.624  1.00 30.46           C  \nATOM   3230  O   LYS A 220      18.320  17.736  12.611  1.00 31.31           O  \nATOM   3231  CB  LYS A 220      20.920  18.360  10.780  1.00 35.19           C  \nATOM   3232  CG  LYS A 220      21.672  19.626  10.319  1.00 41.44           C  \nATOM   3233  CD  LYS A 220      21.510  19.893   8.816  1.00 45.82           C  \nATOM   3234  CE  LYS A 220      20.213  20.659   8.510  1.00 46.78           C  \nATOM   3235  NZ  LYS A 220      19.777  20.499   7.115  1.00 49.70           N1+\nATOM   3236  H   LYS A 220      22.615  17.785  12.580  1.00 32.32           H  \nATOM   3237  HA  LYS A 220      20.203  19.330  12.545  1.00 32.64           H  \nATOM   3238  HB3 LYS A 220      19.977  18.318  10.235  1.00 35.19           H  \nATOM   3239  HB2 LYS A 220      21.471  17.464  10.492  1.00 35.19           H  \nATOM   3240  HG3 LYS A 220      22.730  19.537  10.549  1.00 41.44           H  \nATOM   3241  HG2 LYS A 220      21.329  20.497  10.878  1.00 41.44           H  \nATOM   3242  HD3 LYS A 220      21.528  18.946   8.280  1.00 45.82           H  \nATOM   3243  HD2 LYS A 220      22.371  20.456   8.456  1.00 45.82           H  \nATOM   3244  HE3 LYS A 220      20.345  21.720   8.724  1.00 46.78           H  \nATOM   3245  HE2 LYS A 220      19.409  20.315   9.148  1.00 46.78           H  \nATOM   3246  HZ1 LYS A 220      20.506  20.849   6.506  1.00 49.70           H  \nATOM   3247  HZ2 LYS A 220      19.595  19.527   6.900  1.00 49.70           H  \nATOM   3248  HZ3 LYS A 220      18.939  21.039   6.955  1.00 49.70           H  \nATOM   3249  N   ARG A 221      19.833  16.090  12.988  1.00 29.75           N  \nATOM   3250  CA  ARG A 221      18.874  15.095  13.486  1.00 28.19           C  \nATOM   3251  C   ARG A 221      18.180  15.489  14.797  1.00 27.11           C  \nATOM   3252  O   ARG A 221      17.042  15.071  14.998  1.00 26.10           O  \nATOM   3253  CB  ARG A 221      19.540  13.730  13.697  1.00 30.31           C  \nATOM   3254  CG  ARG A 221      19.927  13.005  12.406  1.00 30.67           C  \nATOM   3255  CD  ARG A 221      19.353  11.585  12.409  1.00 34.41           C  \nATOM   3256  NE  ARG A 221      19.885  10.797  11.306  1.00 31.18           N  \nATOM   3257  CZ  ARG A 221      21.010  10.074  11.293  1.00 30.15           C  \nATOM   3258  NH1 ARG A 221      21.803   9.984  12.368  1.00 26.01           N  \nATOM   3259  NH2 ARG A 221      21.325   9.427  10.169  1.00 29.12           N1+\nATOM   3260  H   ARG A 221      20.805  15.811  12.963  1.00 29.75           H  \nATOM   3261  HA  ARG A 221      18.085  14.982  12.742  1.00 28.19           H  \nATOM   3262  HB3 ARG A 221      18.846  13.096  14.253  1.00 30.31           H  \nATOM   3263  HB2 ARG A 221      20.414  13.819  14.341  1.00 30.31           H  \nATOM   3264  HG3 ARG A 221      21.000  13.015  12.220  1.00 30.67           H  \nATOM   3265  HG2 ARG A 221      19.474  13.541  11.571  1.00 30.67           H  \nATOM   3266  HD3 ARG A 221      18.287  11.652  12.185  1.00 34.41           H  \nATOM   3267  HD2 ARG A 221      19.428  11.083  13.374  1.00 34.41           H  \nATOM   3268  HE  ARG A 221      19.373  10.871  10.431  1.00 31.18           H  \nATOM   3269 HH12 ARG A 221      22.601   9.356  12.361  1.00 26.01           H  \nATOM   3270 HH11 ARG A 221      21.562  10.468  13.219  1.00 26.01           H  \nATOM   3271 HH22 ARG A 221      22.124   8.802  10.158  1.00 29.12           H  \nATOM   3272 HH21 ARG A 221      20.746   9.532   9.345  1.00 29.12           H  \nATOM   3273  N   THR A 222      18.853  16.278  15.650  1.00 25.90           N  \nATOM   3274  CA  THR A 222      18.279  16.788  16.895  1.00 26.98           C  \nATOM   3275  C   THR A 222      17.165  17.823  16.633  1.00 24.38           C  \nATOM   3276  O   THR A 222      16.139  17.783  17.313  1.00 25.97           O  \nATOM   3277  CB  THR A 222      19.360  17.426  17.804  1.00 27.34           C  \nATOM   3278  OG1 THR A 222      20.358  16.460  18.081  1.00 28.70           O  \nATOM   3279  CG2 THR A 222      18.845  17.969  19.149  1.00 29.13           C  \nATOM   3280  H   THR A 222      19.787  16.585  15.420  1.00 25.90           H  \nATOM   3281  HA  THR A 222      17.835  15.947  17.433  1.00 26.98           H  \nATOM   3282  HB  THR A 222      19.845  18.247  17.278  1.00 27.34           H  \nATOM   3283  HG1 THR A 222      20.778  16.198  17.257  1.00 28.70           H  \nATOM   3284 HG21 THR A 222      19.672  18.309  19.774  1.00 29.13           H  \nATOM   3285 HG22 THR A 222      18.177  18.821  19.018  1.00 29.13           H  \nATOM   3286 HG23 THR A 222      18.304  17.202  19.703  1.00 29.13           H  \nATOM   3287  N   THR A 223      17.357  18.681  15.615  1.00 26.05           N  \nATOM   3288  CA  THR A 223      16.345  19.631  15.145  1.00 28.52           C  \nATOM   3289  C   THR A 223      15.186  18.937  14.394  1.00 27.17           C  \nATOM   3290  O   THR A 223      14.052  19.396  14.510  1.00 27.18           O  \nATOM   3291  CB  THR A 223      16.954  20.753  14.254  1.00 30.32           C  \nATOM   3292  OG1 THR A 223      17.185  20.375  12.911  1.00 39.33           O  \nATOM   3293  CG2 THR A 223      18.227  21.389  14.832  1.00 30.64           C  \nATOM   3294  H   THR A 223      18.222  18.652  15.094  1.00 26.05           H  \nATOM   3295  HA  THR A 223      15.915  20.115  16.024  1.00 28.52           H  \nATOM   3296  HB  THR A 223      16.208  21.548  14.198  1.00 30.32           H  \nATOM   3297  HG1 THR A 223      17.773  19.613  12.896  1.00 39.33           H  \nATOM   3298 HG21 THR A 223      18.547  22.240  14.229  1.00 30.64           H  \nATOM   3299 HG22 THR A 223      18.057  21.750  15.847  1.00 30.64           H  \nATOM   3300 HG23 THR A 223      19.055  20.682  14.863  1.00 30.64           H  \nATOM   3301  N   ALA A 224      15.468  17.821  13.696  1.00 25.91           N  \nATOM   3302  CA  ALA A 224      14.459  16.977  13.053  1.00 24.46           C  \nATOM   3303  C   ALA A 224      13.585  16.233  14.076  1.00 23.90           C  \nATOM   3304  O   ALA A 224      12.376  16.155  13.878  1.00 20.38           O  \nATOM   3305  CB  ALA A 224      15.144  15.998  12.089  1.00 24.41           C  \nATOM   3306  H   ALA A 224      16.426  17.505  13.626  1.00 25.91           H  \nATOM   3307  HA  ALA A 224      13.802  17.620  12.466  1.00 24.46           H  \nATOM   3308  HB1 ALA A 224      14.407  15.437  11.516  1.00 24.41           H  \nATOM   3309  HB2 ALA A 224      15.777  16.522  11.374  1.00 24.41           H  \nATOM   3310  HB3 ALA A 224      15.764  15.276  12.618  1.00 24.41           H  \nATOM   3311  N   ALA A 225      14.198  15.758  15.174  1.00 24.13           N  \nATOM   3312  CA  ALA A 225      13.517  15.140  16.311  1.00 25.95           C  \nATOM   3313  C   ALA A 225      12.609  16.104  17.090  1.00 25.57           C  \nATOM   3314  O   ALA A 225      11.577  15.664  17.597  1.00 26.74           O  \nATOM   3315  CB  ALA A 225      14.558  14.488  17.233  1.00 23.02           C  \nATOM   3316  H   ALA A 225      15.204  15.839  15.252  1.00 24.13           H  \nATOM   3317  HA  ALA A 225      12.867  14.358  15.926  1.00 25.95           H  \nATOM   3318  HB1 ALA A 225      14.085  14.009  18.091  1.00 23.02           H  \nATOM   3319  HB2 ALA A 225      15.121  13.720  16.701  1.00 23.02           H  \nATOM   3320  HB3 ALA A 225      15.273  15.218  17.614  1.00 23.02           H  \nATOM   3321  N   THR A 226      12.980  17.394  17.136  1.00 25.99           N  \nATOM   3322  CA  THR A 226      12.169  18.458  17.729  1.00 26.54           C  \nATOM   3323  C   THR A 226      10.896  18.746  16.904  1.00 25.91           C  \nATOM   3324  O   THR A 226       9.824  18.897  17.491  1.00 26.81           O  \nATOM   3325  CB  THR A 226      12.980  19.776  17.866  1.00 27.83           C  \nATOM   3326  OG1 THR A 226      14.105  19.547  18.692  1.00 29.02           O  \nATOM   3327  CG2 THR A 226      12.208  20.975  18.450  1.00 30.31           C  \nATOM   3328  H   THR A 226      13.843  17.678  16.696  1.00 25.99           H  \nATOM   3329  HA  THR A 226      11.861  18.136  18.726  1.00 26.54           H  \nATOM   3330  HB  THR A 226      13.365  20.071  16.891  1.00 27.83           H  \nATOM   3331  HG1 THR A 226      14.675  18.896  18.271  1.00 29.02           H  \nATOM   3332 HG21 THR A 226      12.874  21.822  18.620  1.00 30.31           H  \nATOM   3333 HG22 THR A 226      11.422  21.321  17.778  1.00 30.31           H  \nATOM   3334 HG23 THR A 226      11.747  20.720  19.404  1.00 30.31           H  \nATOM   3335  N   LEU A 227      11.039  18.796  15.569  1.00 26.53           N  \nATOM   3336  CA  LEU A 227       9.971  19.157  14.634  1.00 26.89           C  \nATOM   3337  C   LEU A 227       8.993  18.011  14.324  1.00 26.84           C  \nATOM   3338  O   LEU A 227       7.818  18.293  14.092  1.00 27.26           O  \nATOM   3339  CB  LEU A 227      10.609  19.683  13.327  1.00 28.85           C  \nATOM   3340  CG  LEU A 227      11.323  21.046  13.476  1.00 34.29           C  \nATOM   3341  CD1 LEU A 227      12.190  21.352  12.239  1.00 36.73           C  \nATOM   3342  CD2 LEU A 227      10.335  22.189  13.799  1.00 33.59           C  \nATOM   3343  H   LEU A 227      11.951  18.646  15.160  1.00 26.53           H  \nATOM   3344  HA  LEU A 227       9.381  19.956  15.084  1.00 26.89           H  \nATOM   3345  HB3 LEU A 227       9.850  19.773  12.547  1.00 28.85           H  \nATOM   3346  HB2 LEU A 227      11.318  18.937  12.962  1.00 28.85           H  \nATOM   3347  HG  LEU A 227      12.007  20.981  14.322  1.00 34.29           H  \nATOM   3348 HD11 LEU A 227      12.043  22.359  11.849  1.00 36.73           H  \nATOM   3349 HD12 LEU A 227      13.248  21.261  12.485  1.00 36.73           H  \nATOM   3350 HD13 LEU A 227      11.980  20.664  11.421  1.00 36.73           H  \nATOM   3351 HD21 LEU A 227      10.441  23.048  13.137  1.00 33.59           H  \nATOM   3352 HD22 LEU A 227       9.296  21.866  13.724  1.00 33.59           H  \nATOM   3353 HD23 LEU A 227      10.488  22.551  14.816  1.00 33.59           H  \nATOM   3354  N   MET A 228       9.485  16.762  14.295  1.00 25.26           N  \nATOM   3355  CA  MET A 228       8.739  15.587  13.838  1.00 24.70           C  \nATOM   3356  C   MET A 228       8.686  14.531  14.949  1.00 23.35           C  \nATOM   3357  O   MET A 228       9.711  14.233  15.564  1.00 20.92           O  \nATOM   3358  CB  MET A 228       9.408  15.055  12.555  1.00 24.08           C  \nATOM   3359  CG  MET A 228       9.168  15.961  11.334  1.00 24.87           C  \nATOM   3360  SD  MET A 228      10.164  15.579   9.869  1.00 24.76           S  \nATOM   3361  CE  MET A 228      11.710  16.421  10.296  1.00 26.75           C  \nATOM   3362  H   MET A 228      10.463  16.606  14.503  1.00 25.26           H  \nATOM   3363  HA  MET A 228       7.710  15.854  13.592  1.00 24.70           H  \nATOM   3364  HB3 MET A 228       9.025  14.062  12.329  1.00 24.08           H  \nATOM   3365  HB2 MET A 228      10.476  14.923  12.717  1.00 24.08           H  \nATOM   3366  HG3 MET A 228       9.346  17.007  11.584  1.00 24.87           H  \nATOM   3367  HG2 MET A 228       8.119  15.895  11.046  1.00 24.87           H  \nATOM   3368  HE1 MET A 228      12.441  16.291   9.498  1.00 26.75           H  \nATOM   3369  HE2 MET A 228      11.541  17.488  10.443  1.00 26.75           H  \nATOM   3370  HE3 MET A 228      12.121  16.003  11.213  1.00 26.75           H  \nATOM   3371  N   ASN A 229       7.472  14.008  15.196  1.00 23.78           N  \nATOM   3372  CA  ASN A 229       7.145  13.104  16.305  1.00 26.25           C  \nATOM   3373  C   ASN A 229       7.753  11.712  16.102  1.00 24.54           C  \nATOM   3374  O   ASN A 229       7.451  11.061  15.101  1.00 24.23           O  \nATOM   3375  CB  ASN A 229       5.610  12.979  16.458  1.00 28.76           C  \nATOM   3376  CG  ASN A 229       4.848  14.258  16.830  1.00 36.20           C  \nATOM   3377  OD1 ASN A 229       3.625  14.278  16.730  1.00 39.05           O  \nATOM   3378  ND2 ASN A 229       5.529  15.321  17.270  1.00 36.12           N  \nATOM   3379  H   ASN A 229       6.691  14.297  14.625  1.00 23.78           H  \nATOM   3380  HA  ASN A 229       7.558  13.541  17.217  1.00 26.25           H  \nATOM   3381  HB3 ASN A 229       5.383  12.247  17.236  1.00 28.76           H  \nATOM   3382  HB2 ASN A 229       5.175  12.586  15.537  1.00 28.76           H  \nATOM   3383 HD22 ASN A 229       5.033  16.163  17.521  1.00 36.12           H  \nATOM   3384 HD21 ASN A 229       6.537  15.300  17.359  1.00 36.12           H  \nATOM   3385  N   ALA A 230       8.584  11.290  17.072  1.00 23.31           N  \nATOM   3386  CA  ALA A 230       9.316  10.019  17.096  1.00 22.45           C  \nATOM   3387  C   ALA A 230      10.159   9.809  15.823  1.00 22.19           C  \nATOM   3388  O   ALA A 230      10.096   8.743  15.212  1.00 21.45           O  \nATOM   3389  CB  ALA A 230       8.342   8.859  17.379  1.00 23.18           C  \nATOM   3390  H   ALA A 230       8.781  11.910  17.844  1.00 23.31           H  \nATOM   3391  HA  ALA A 230      10.017  10.078  17.928  1.00 22.45           H  \nATOM   3392  HB1 ALA A 230       8.873   7.917  17.512  1.00 23.18           H  \nATOM   3393  HB2 ALA A 230       7.773   9.040  18.292  1.00 23.18           H  \nATOM   3394  HB3 ALA A 230       7.629   8.729  16.567  1.00 23.18           H  \nATOM   3395  N   TYR A 231      10.893  10.865  15.427  1.00 20.58           N  \nATOM   3396  CA  TYR A 231      11.648  10.941  14.177  1.00 23.09           C  \nATOM   3397  C   TYR A 231      12.699   9.831  14.038  1.00 23.15           C  \nATOM   3398  O   TYR A 231      12.776   9.221  12.977  1.00 21.50           O  \nATOM   3399  CB  TYR A 231      12.298  12.330  14.036  1.00 21.56           C  \nATOM   3400  CG  TYR A 231      13.026  12.550  12.723  1.00 22.51           C  \nATOM   3401  CD1 TYR A 231      14.422  12.360  12.636  1.00 22.41           C  \nATOM   3402  CD2 TYR A 231      12.293  12.898  11.571  1.00 22.80           C  \nATOM   3403  CE1 TYR A 231      15.072  12.484  11.394  1.00 26.33           C  \nATOM   3404  CE2 TYR A 231      12.946  13.045  10.336  1.00 22.49           C  \nATOM   3405  CZ  TYR A 231      14.330  12.820  10.244  1.00 23.24           C  \nATOM   3406  OH  TYR A 231      14.942  12.918   9.032  1.00 25.69           O  \nATOM   3407  H   TYR A 231      10.889  11.702  15.996  1.00 20.58           H  \nATOM   3408  HA  TYR A 231      10.930  10.820  13.365  1.00 23.09           H  \nATOM   3409  HB3 TYR A 231      13.004  12.479  14.852  1.00 21.56           H  \nATOM   3410  HB2 TYR A 231      11.542  13.108  14.131  1.00 21.56           H  \nATOM   3411  HD1 TYR A 231      14.993  12.090  13.512  1.00 22.41           H  \nATOM   3412  HD2 TYR A 231      11.225  13.034  11.626  1.00 22.80           H  \nATOM   3413  HE1 TYR A 231      16.136  12.318  11.326  1.00 26.33           H  \nATOM   3414  HE2 TYR A 231      12.381  13.310   9.454  1.00 22.49           H  \nATOM   3415  HH  TYR A 231      15.826  12.530   9.037  1.00 25.69           H  \nATOM   3416  N   SER A 232      13.458   9.578  15.115  1.00 22.12           N  \nATOM   3417  CA  SER A 232      14.523   8.577  15.172  1.00 21.84           C  \nATOM   3418  C   SER A 232      14.069   7.130  14.895  1.00 21.72           C  \nATOM   3419  O   SER A 232      14.886   6.351  14.409  1.00 22.45           O  \nATOM   3420  CB  SER A 232      15.255   8.712  16.523  1.00 21.64           C  \nATOM   3421  OG  SER A 232      14.455   8.291  17.612  1.00 26.16           O  \nATOM   3422  H   SER A 232      13.306  10.103  15.965  1.00 22.12           H  \nATOM   3423  HA  SER A 232      15.235   8.841  14.386  1.00 21.84           H  \nATOM   3424  HB3 SER A 232      15.571   9.743  16.688  1.00 21.64           H  \nATOM   3425  HB2 SER A 232      16.164   8.108  16.515  1.00 21.64           H  \nATOM   3426  HG  SER A 232      14.425   7.331  17.616  1.00 26.16           H  \nATOM   3427  N   SER A 233      12.798   6.807  15.193  1.00 20.41           N  \nATOM   3428  CA  SER A 233      12.223   5.475  15.018  1.00 20.63           C  \nATOM   3429  C   SER A 233      11.335   5.334  13.770  1.00 19.00           C  \nATOM   3430  O   SER A 233      11.184   4.210  13.297  1.00 19.49           O  \nATOM   3431  CB  SER A 233      11.483   5.075  16.311  1.00 24.24           C  \nATOM   3432  OG  SER A 233      10.309   5.832  16.529  1.00 29.04           O  \nATOM   3433  H   SER A 233      12.181   7.506  15.583  1.00 20.41           H  \nATOM   3434  HA  SER A 233      13.034   4.762  14.890  1.00 20.63           H  \nATOM   3435  HB3 SER A 233      12.140   5.172  17.176  1.00 24.24           H  \nATOM   3436  HB2 SER A 233      11.190   4.028  16.256  1.00 24.24           H  \nATOM   3437  HG  SER A 233       9.885   5.511  17.328  1.00 29.04           H  \nATOM   3438  N   ARG A 234      10.761   6.437  13.263  1.00 18.33           N  \nATOM   3439  CA  ARG A 234       9.834   6.423  12.126  1.00 22.18           C  \nATOM   3440  C   ARG A 234      10.484   6.846  10.803  1.00 22.21           C  \nATOM   3441  O   ARG A 234       9.923   6.518   9.757  1.00 20.94           O  \nATOM   3442  CB  ARG A 234       8.635   7.335  12.426  1.00 23.89           C  \nATOM   3443  CG  ARG A 234       7.771   6.850  13.597  1.00 25.44           C  \nATOM   3444  CD  ARG A 234       6.533   7.735  13.784  1.00 31.15           C  \nATOM   3445  NE  ARG A 234       5.779   7.372  14.993  1.00 38.50           N  \nATOM   3446  CZ  ARG A 234       4.777   8.070  15.560  1.00 41.33           C  \nATOM   3447  NH1 ARG A 234       4.323   9.221  15.039  1.00 40.07           N  \nATOM   3448  NH2 ARG A 234       4.217   7.600  16.681  1.00 42.46           N1+\nATOM   3449  H   ARG A 234      10.909   7.329  13.714  1.00 18.33           H  \nATOM   3450  HA  ARG A 234       9.444   5.415  11.969  1.00 22.18           H  \nATOM   3451  HB3 ARG A 234       8.000   7.413  11.542  1.00 23.89           H  \nATOM   3452  HB2 ARG A 234       8.997   8.342  12.632  1.00 23.89           H  \nATOM   3453  HG3 ARG A 234       8.335   6.741  14.524  1.00 25.44           H  \nATOM   3454  HG2 ARG A 234       7.434   5.847  13.328  1.00 25.44           H  \nATOM   3455  HD3 ARG A 234       5.845   7.536  12.961  1.00 31.15           H  \nATOM   3456  HD2 ARG A 234       6.785   8.794  13.732  1.00 31.15           H  \nATOM   3457  HE  ARG A 234       6.063   6.507  15.431  1.00 38.50           H  \nATOM   3458 HH12 ARG A 234       3.570   9.728  15.479  1.00 40.07           H  \nATOM   3459 HH11 ARG A 234       4.741   9.588  14.196  1.00 40.07           H  \nATOM   3460 HH22 ARG A 234       3.464   8.103  17.128  1.00 42.46           H  \nATOM   3461 HH21 ARG A 234       4.542   6.736  17.091  1.00 42.46           H  \nATOM   3462  N   SER A 235      11.627   7.550  10.843  1.00 19.99           N  \nATOM   3463  CA  SER A 235      12.362   7.927   9.638  1.00 19.86           C  \nATOM   3464  C   SER A 235      13.190   6.754   9.090  1.00 19.77           C  \nATOM   3465  O   SER A 235      13.654   5.908   9.854  1.00 20.24           O  \nATOM   3466  CB  SER A 235      13.218   9.191   9.887  1.00 21.58           C  \nATOM   3467  OG  SER A 235      14.389   8.940  10.641  1.00 21.88           O  \nATOM   3468  H   SER A 235      12.049   7.797  11.728  1.00 19.99           H  \nATOM   3469  HA  SER A 235      11.616   8.202   8.894  1.00 19.86           H  \nATOM   3470  HB3 SER A 235      12.630   9.964  10.381  1.00 21.58           H  \nATOM   3471  HB2 SER A 235      13.532   9.613   8.932  1.00 21.58           H  \nATOM   3472  HG  SER A 235      14.132   8.796  11.556  1.00 21.88           H  \nATOM   3473  N   HIS A 236      13.385   6.775   7.767  1.00 18.17           N  \nATOM   3474  CA  HIS A 236      14.415   6.021   7.061  1.00 19.29           C  \nATOM   3475  C   HIS A 236      15.540   7.008   6.739  1.00 18.44           C  \nATOM   3476  O   HIS A 236      15.240   8.154   6.412  1.00 20.59           O  \nATOM   3477  CB  HIS A 236      13.838   5.446   5.751  1.00 18.44           C  \nATOM   3478  CG  HIS A 236      12.567   4.658   5.915  1.00 20.86           C  \nATOM   3479  ND1 HIS A 236      12.567   3.288   6.186  1.00 20.53           N  \nATOM   3480  CD2 HIS A 236      11.262   5.099   5.848  1.00 19.38           C  \nATOM   3481  CE1 HIS A 236      11.289   2.955   6.262  1.00 18.42           C  \nATOM   3482  NE2 HIS A 236      10.470   3.991   6.085  1.00 19.60           N  \nATOM   3483  H   HIS A 236      12.937   7.503   7.225  1.00 18.17           H  \nATOM   3484  HA  HIS A 236      14.788   5.205   7.682  1.00 19.29           H  \nATOM   3485  HB3 HIS A 236      14.579   4.798   5.281  1.00 18.44           H  \nATOM   3486  HB2 HIS A 236      13.643   6.244   5.034  1.00 18.44           H  \nATOM   3487  HD2 HIS A 236      10.849   6.082   5.670  1.00 19.38           H  \nATOM   3488  HE1 HIS A 236      10.952   1.951   6.463  1.00 18.42           H  \nATOM   3489  HE2 HIS A 236       9.458   3.974   6.127  1.00 19.60           H  \nATOM   3490  N   SER A 237      16.795   6.553   6.800  1.00 20.58           N  \nATOM   3491  CA  SER A 237      17.963   7.337   6.407  1.00 21.26           C  \nATOM   3492  C   SER A 237      18.805   6.538   5.412  1.00 21.57           C  \nATOM   3493  O   SER A 237      18.957   5.331   5.575  1.00 20.33           O  \nATOM   3494  CB  SER A 237      18.746   7.785   7.658  1.00 24.54           C  \nATOM   3495  OG  SER A 237      19.438   6.740   8.306  1.00 26.90           O  \nATOM   3496  H   SER A 237      16.979   5.608   7.117  1.00 20.58           H  \nATOM   3497  HA  SER A 237      17.636   8.238   5.889  1.00 21.26           H  \nATOM   3498  HB3 SER A 237      18.080   8.263   8.376  1.00 24.54           H  \nATOM   3499  HB2 SER A 237      19.489   8.527   7.370  1.00 24.54           H  \nATOM   3500  HG  SER A 237      20.153   6.437   7.740  1.00 26.90           H  \nATOM   3501  N   VAL A 238      19.332   7.242   4.403  1.00 22.05           N  \nATOM   3502  CA  VAL A 238      20.194   6.705   3.361  1.00 22.38           C  \nATOM   3503  C   VAL A 238      21.449   7.588   3.345  1.00 23.09           C  \nATOM   3504  O   VAL A 238      21.437   8.661   2.740  1.00 25.68           O  \nATOM   3505  CB  VAL A 238      19.505   6.745   1.960  1.00 21.69           C  \nATOM   3506  CG1 VAL A 238      20.417   6.244   0.817  1.00 20.82           C  \nATOM   3507  CG2 VAL A 238      18.179   5.960   1.947  1.00 20.75           C  \nATOM   3508  H   VAL A 238      19.125   8.231   4.327  1.00 22.05           H  \nATOM   3509  HA  VAL A 238      20.492   5.678   3.581  1.00 22.38           H  \nATOM   3510  HB  VAL A 238      19.240   7.777   1.727  1.00 21.69           H  \nATOM   3511 HG11 VAL A 238      19.878   6.212  -0.131  1.00 20.82           H  \nATOM   3512 HG12 VAL A 238      21.283   6.888   0.664  1.00 20.82           H  \nATOM   3513 HG13 VAL A 238      20.787   5.239   1.019  1.00 20.82           H  \nATOM   3514 HG21 VAL A 238      17.729   5.956   0.953  1.00 20.75           H  \nATOM   3515 HG22 VAL A 238      18.326   4.924   2.248  1.00 20.75           H  \nATOM   3516 HG23 VAL A 238      17.448   6.400   2.625  1.00 20.75           H  \nATOM   3517  N   PHE A 239      22.506   7.123   4.030  1.00 25.74           N  \nATOM   3518  CA  PHE A 239      23.827   7.740   3.977  1.00 25.50           C  \nATOM   3519  C   PHE A 239      24.558   7.114   2.787  1.00 27.21           C  \nATOM   3520  O   PHE A 239      24.990   5.967   2.888  1.00 25.60           O  \nATOM   3521  CB  PHE A 239      24.578   7.511   5.311  1.00 24.56           C  \nATOM   3522  CG  PHE A 239      25.854   8.329   5.462  1.00 23.56           C  \nATOM   3523  CD1 PHE A 239      27.025   7.986   4.751  1.00 24.94           C  \nATOM   3524  CD2 PHE A 239      25.838   9.529   6.207  1.00 23.03           C  \nATOM   3525  CE1 PHE A 239      28.138   8.812   4.803  1.00 25.28           C  \nATOM   3526  CE2 PHE A 239      26.973  10.326   6.270  1.00 24.84           C  \nATOM   3527  CZ  PHE A 239      28.118   9.970   5.570  1.00 24.20           C  \nATOM   3528  H   PHE A 239      22.445   6.239   4.520  1.00 25.74           H  \nATOM   3529  HA  PHE A 239      23.731   8.815   3.829  1.00 25.50           H  \nATOM   3530  HB3 PHE A 239      24.830   6.458   5.432  1.00 24.56           H  \nATOM   3531  HB2 PHE A 239      23.920   7.740   6.149  1.00 24.56           H  \nATOM   3532  HD1 PHE A 239      27.060   7.091   4.149  1.00 24.94           H  \nATOM   3533  HD2 PHE A 239      24.948   9.833   6.737  1.00 23.03           H  \nATOM   3534  HE1 PHE A 239      29.017   8.553   4.233  1.00 25.28           H  \nATOM   3535  HE2 PHE A 239      26.959  11.237   6.851  1.00 24.84           H  \nATOM   3536  HZ  PHE A 239      28.992  10.604   5.608  1.00 24.20           H  \nATOM   3537  N   SER A 240      24.678   7.865   1.684  1.00 28.35           N  \nATOM   3538  CA  SER A 240      25.437   7.427   0.520  1.00 31.42           C  \nATOM   3539  C   SER A 240      26.833   8.061   0.527  1.00 32.07           C  \nATOM   3540  O   SER A 240      26.976   9.215   0.929  1.00 32.25           O  \nATOM   3541  CB  SER A 240      24.635   7.678  -0.772  1.00 34.03           C  \nATOM   3542  OG  SER A 240      24.801   8.961  -1.338  1.00 40.12           O  \nATOM   3543  H   SER A 240      24.334   8.817   1.676  1.00 28.35           H  \nATOM   3544  HA  SER A 240      25.557   6.350   0.576  1.00 31.42           H  \nATOM   3545  HB3 SER A 240      23.573   7.482  -0.617  1.00 34.03           H  \nATOM   3546  HB2 SER A 240      24.974   6.957  -1.515  1.00 34.03           H  \nATOM   3547  HG  SER A 240      24.336   9.607  -0.796  1.00 40.12           H  \nATOM   3548  N   VAL A 241      27.817   7.288   0.052  1.00 33.55           N  \nATOM   3549  CA  VAL A 241      29.173   7.736  -0.231  1.00 34.45           C  \nATOM   3550  C   VAL A 241      29.516   7.325  -1.670  1.00 34.62           C  \nATOM   3551  O   VAL A 241      29.385   6.151  -2.006  1.00 35.51           O  \nATOM   3552  CB  VAL A 241      30.218   7.168   0.778  1.00 34.83           C  \nATOM   3553  CG1 VAL A 241      30.239   5.637   0.921  1.00 38.79           C  \nATOM   3554  CG2 VAL A 241      31.645   7.669   0.487  1.00 35.64           C  \nATOM   3555  H   VAL A 241      27.608   6.336  -0.224  1.00 33.55           H  \nATOM   3556  HA  VAL A 241      29.205   8.822  -0.168  1.00 34.45           H  \nATOM   3557  HB  VAL A 241      29.942   7.557   1.759  1.00 34.83           H  \nATOM   3558 HG11 VAL A 241      30.890   5.333   1.741  1.00 38.79           H  \nATOM   3559 HG12 VAL A 241      29.247   5.242   1.140  1.00 38.79           H  \nATOM   3560 HG13 VAL A 241      30.619   5.155   0.020  1.00 38.79           H  \nATOM   3561 HG21 VAL A 241      32.356   7.285   1.217  1.00 35.64           H  \nATOM   3562 HG22 VAL A 241      32.007   7.357  -0.493  1.00 35.64           H  \nATOM   3563 HG23 VAL A 241      31.682   8.757   0.528  1.00 35.64           H  \nATOM   3564  N   THR A 242      29.937   8.305  -2.483  1.00 35.79           N  \nATOM   3565  CA  THR A 242      30.386   8.109  -3.859  1.00 37.70           C  \nATOM   3566  C   THR A 242      31.881   8.444  -3.934  1.00 37.87           C  \nATOM   3567  O   THR A 242      32.287   9.492  -3.432  1.00 37.49           O  \nATOM   3568  CB  THR A 242      29.638   9.035  -4.853  1.00 37.97           C  \nATOM   3569  OG1 THR A 242      28.251   8.772  -4.771  1.00 39.56           O  \nATOM   3570  CG2 THR A 242      30.056   8.873  -6.329  1.00 37.97           C  \nATOM   3571  H   THR A 242      30.018   9.247  -2.121  1.00 35.79           H  \nATOM   3572  HA  THR A 242      30.233   7.075  -4.163  1.00 37.70           H  \nATOM   3573  HB  THR A 242      29.780  10.077  -4.562  1.00 37.97           H  \nATOM   3574  HG1 THR A 242      27.942   9.076  -3.910  1.00 39.56           H  \nATOM   3575 HG21 THR A 242      29.443   9.500  -6.978  1.00 37.97           H  \nATOM   3576 HG22 THR A 242      31.093   9.162  -6.497  1.00 37.97           H  \nATOM   3577 HG23 THR A 242      29.940   7.842  -6.663  1.00 37.97           H  \nATOM   3578  N   ILE A 243      32.662   7.550  -4.557  1.00 39.49           N  \nATOM   3579  CA  ILE A 243      34.109   7.678  -4.676  1.00 41.33           C  \nATOM   3580  C   ILE A 243      34.449   7.701  -6.177  1.00 42.69           C  \nATOM   3581  O   ILE A 243      34.334   6.678  -6.850  1.00 41.59           O  \nATOM   3582  CB  ILE A 243      34.876   6.490  -4.019  1.00 42.17           C  \nATOM   3583  CG1 ILE A 243      34.339   6.106  -2.620  1.00 40.50           C  \nATOM   3584  CG2 ILE A 243      36.390   6.787  -3.930  1.00 40.47           C  \nATOM   3585  CD1 ILE A 243      34.920   4.783  -2.110  1.00 41.65           C  \nATOM   3586  H   ILE A 243      32.248   6.725  -4.976  1.00 39.49           H  \nATOM   3587  HA  ILE A 243      34.458   8.602  -4.216  1.00 41.33           H  \nATOM   3588  HB  ILE A 243      34.752   5.605  -4.645  1.00 42.17           H  \nATOM   3589 HG13 ILE A 243      33.255   5.995  -2.632  1.00 40.50           H  \nATOM   3590 HG12 ILE A 243      34.550   6.905  -1.908  1.00 40.50           H  \nATOM   3591 HG21 ILE A 243      36.951   5.895  -3.657  1.00 40.47           H  \nATOM   3592 HG22 ILE A 243      36.803   7.155  -4.866  1.00 40.47           H  \nATOM   3593 HG23 ILE A 243      36.598   7.551  -3.181  1.00 40.47           H  \nATOM   3594 HD11 ILE A 243      34.284   4.344  -1.342  1.00 41.65           H  \nATOM   3595 HD12 ILE A 243      35.006   4.057  -2.917  1.00 41.65           H  \nATOM   3596 HD13 ILE A 243      35.912   4.930  -1.687  1.00 41.65           H  \nATOM   3597  N   HIS A 244      34.874   8.872  -6.667  1.00 44.46           N  \nATOM   3598  CA  HIS A 244      35.465   9.037  -7.994  1.00 47.53           C  \nATOM   3599  C   HIS A 244      36.957   8.733  -7.886  1.00 47.71           C  \nATOM   3600  O   HIS A 244      37.603   9.276  -6.996  1.00 47.71           O  \nATOM   3601  CB  HIS A 244      35.233  10.474  -8.489  1.00 49.46           C  \nATOM   3602  CG  HIS A 244      33.777  10.794  -8.685  1.00 52.62           C  \nATOM   3603  ND1 HIS A 244      33.068  10.377  -9.815  1.00 53.91           N  \nATOM   3604  CD2 HIS A 244      32.917  11.459  -7.836  1.00 52.34           C  \nATOM   3605  CE1 HIS A 244      31.825  10.785  -9.607  1.00 52.76           C  \nATOM   3606  NE2 HIS A 244      31.678  11.428  -8.450  1.00 53.06           N  \nATOM   3607  H   HIS A 244      34.966   9.663  -6.042  1.00 44.46           H  \nATOM   3608  HA  HIS A 244      35.003   8.345  -8.703  1.00 47.53           H  \nATOM   3609  HB3 HIS A 244      35.744  10.631  -9.440  1.00 49.46           H  \nATOM   3610  HB2 HIS A 244      35.656  11.195  -7.789  1.00 49.46           H  \nATOM   3611  HD2 HIS A 244      33.081  11.910  -6.869  1.00 52.34           H  \nATOM   3612  HE1 HIS A 244      31.016  10.606 -10.300  1.00 52.76           H  \nATOM   3613  HE2 HIS A 244      30.815  11.798  -8.084  1.00 53.06           H  \nATOM   3614  N   MET A 245      37.457   7.850  -8.758  1.00 48.94           N  \nATOM   3615  CA  MET A 245      38.824   7.338  -8.731  1.00 49.37           C  \nATOM   3616  C   MET A 245      39.421   7.438 -10.134  1.00 51.21           C  \nATOM   3617  O   MET A 245      38.759   7.086 -11.108  1.00 50.79           O  \nATOM   3618  CB  MET A 245      38.819   5.865  -8.272  1.00 47.53           C  \nATOM   3619  CG  MET A 245      38.271   5.654  -6.855  1.00 47.54           C  \nATOM   3620  SD  MET A 245      37.955   3.929  -6.414  1.00 44.84           S  \nATOM   3621  CE  MET A 245      36.293   3.751  -7.119  1.00 45.83           C  \nATOM   3622  H   MET A 245      36.852   7.437  -9.457  1.00 48.94           H  \nATOM   3623  HA  MET A 245      39.444   7.918  -8.045  1.00 49.37           H  \nATOM   3624  HB3 MET A 245      39.834   5.467  -8.312  1.00 47.53           H  \nATOM   3625  HB2 MET A 245      38.237   5.267  -8.972  1.00 47.53           H  \nATOM   3626  HG3 MET A 245      37.325   6.176  -6.737  1.00 47.54           H  \nATOM   3627  HG2 MET A 245      38.961   6.087  -6.134  1.00 47.54           H  \nATOM   3628  HE1 MET A 245      35.952   2.719  -7.071  1.00 45.83           H  \nATOM   3629  HE2 MET A 245      35.584   4.362  -6.562  1.00 45.83           H  \nATOM   3630  HE3 MET A 245      36.276   4.068  -8.160  1.00 45.83           H  \nATOM   3631  N   LYS A 246      40.684   7.866 -10.183  1.00 52.65           N  \nATOM   3632  CA  LYS A 246      41.535   7.895 -11.359  1.00 54.10           C  \nATOM   3633  C   LYS A 246      42.818   7.169 -10.943  1.00 54.52           C  \nATOM   3634  O   LYS A 246      43.819   7.799 -10.602  1.00 54.51           O  \nATOM   3635  CB  LYS A 246      41.739   9.358 -11.806  1.00 54.81           C  \nATOM   3636  CG  LYS A 246      42.485   9.497 -13.141  1.00 57.30           C  \nATOM   3637  CD  LYS A 246      42.701  10.970 -13.530  1.00 58.78           C  \nATOM   3638  CE  LYS A 246      43.164  11.179 -14.981  1.00 60.80           C  \nATOM   3639  NZ  LYS A 246      42.095  10.892 -15.956  1.00 61.59           N1+\nATOM   3640  H   LYS A 246      41.126   8.187  -9.332  1.00 52.65           H  \nATOM   3641  HA  LYS A 246      41.081   7.338 -12.181  1.00 54.10           H  \nATOM   3642  HB3 LYS A 246      42.254   9.926 -11.031  1.00 54.81           H  \nATOM   3643  HB2 LYS A 246      40.760   9.829 -11.914  1.00 54.81           H  \nATOM   3644  HG3 LYS A 246      41.921   8.974 -13.913  1.00 57.30           H  \nATOM   3645  HG2 LYS A 246      43.454   9.000 -13.088  1.00 57.30           H  \nATOM   3646  HD3 LYS A 246      43.469  11.377 -12.874  1.00 58.78           H  \nATOM   3647  HD2 LYS A 246      41.801  11.554 -13.329  1.00 58.78           H  \nATOM   3648  HE3 LYS A 246      44.032  10.555 -15.198  1.00 60.80           H  \nATOM   3649  HE2 LYS A 246      43.476  12.215 -15.118  1.00 60.80           H  \nATOM   3650  HZ1 LYS A 246      41.307  11.498 -15.780  1.00 61.59           H  \nATOM   3651  HZ2 LYS A 246      42.444  11.052 -16.890  1.00 61.59           H  \nATOM   3652  HZ3 LYS A 246      41.808   9.928 -15.866  1.00 61.59           H  \nATOM   3653  N   GLU A 247      42.715   5.832 -10.913  1.00 55.12           N  \nATOM   3654  CA  GLU A 247      43.784   4.911 -10.550  1.00 56.95           C  \nATOM   3655  C   GLU A 247      44.915   4.946 -11.578  1.00 58.47           C  \nATOM   3656  O   GLU A 247      44.640   4.787 -12.762  1.00 58.51           O  \nATOM   3657  CB  GLU A 247      43.189   3.496 -10.407  1.00 56.93           C  \nATOM   3658  CG  GLU A 247      44.225   2.401 -10.073  1.00 58.97           C  \nATOM   3659  CD  GLU A 247      43.569   1.035  -9.857  1.00 60.88           C  \nATOM   3660  OE1 GLU A 247      42.999   0.506 -10.837  1.00 62.91           O  \nATOM   3661  OE2 GLU A 247      43.629   0.548  -8.706  1.00 61.38           O1-\nATOM   3662  H   GLU A 247      41.860   5.400 -11.234  1.00 55.12           H  \nATOM   3663  HA  GLU A 247      44.178   5.209  -9.579  1.00 56.95           H  \nATOM   3664  HB3 GLU A 247      42.663   3.231 -11.326  1.00 56.93           H  \nATOM   3665  HB2 GLU A 247      42.429   3.516  -9.626  1.00 56.93           H  \nATOM   3666  HG3 GLU A 247      44.795   2.691  -9.188  1.00 58.97           H  \nATOM   3667  HG2 GLU A 247      44.950   2.292 -10.880  1.00 58.97           H  \nATOM   3668  N   THR A 248      46.150   5.112 -11.092  1.00 59.07           N  \nATOM   3669  CA  THR A 248      47.364   5.048 -11.894  1.00 60.38           C  \nATOM   3670  C   THR A 248      48.174   3.841 -11.380  1.00 60.78           C  \nATOM   3671  O   THR A 248      49.039   3.969 -10.512  1.00 60.10           O  \nATOM   3672  CB  THR A 248      48.164   6.380 -11.808  1.00 61.01           C  \nATOM   3673  OG1 THR A 248      48.631   6.673 -10.505  1.00 63.16           O  \nATOM   3674  CG2 THR A 248      47.349   7.593 -12.286  1.00 61.02           C  \nATOM   3675  H   THR A 248      46.288   5.253 -10.101  1.00 59.07           H  \nATOM   3676  HA  THR A 248      47.135   4.874 -12.946  1.00 60.38           H  \nATOM   3677  HB  THR A 248      49.041   6.290 -12.451  1.00 61.01           H  \nATOM   3678  HG1 THR A 248      49.173   5.935 -10.211  1.00 63.16           H  \nATOM   3679 HG21 THR A 248      46.540   7.829 -11.593  1.00 61.02           H  \nATOM   3680 HG22 THR A 248      47.976   8.481 -12.372  1.00 61.02           H  \nATOM   3681 HG23 THR A 248      46.897   7.411 -13.258  1.00 61.02           H  \nATOM   3682  N   THR A 249      47.830   2.661 -11.924  1.00 61.35           N  \nATOM   3683  CA  THR A 249      48.451   1.356 -11.655  1.00 61.85           C  \nATOM   3684  C   THR A 249      49.974   1.367 -11.930  1.00 61.20           C  \nATOM   3685  O   THR A 249      50.436   2.222 -12.687  1.00 61.63           O  \nATOM   3686  CB  THR A 249      47.775   0.282 -12.555  1.00 62.62           C  \nATOM   3687  OG1 THR A 249      46.380   0.301 -12.329  1.00 63.50           O  \nATOM   3688  CG2 THR A 249      48.237  -1.174 -12.374  1.00 63.08           C  \nATOM   3689  H   THR A 249      47.096   2.643 -12.619  1.00 61.35           H  \nATOM   3690  HA  THR A 249      48.287   1.113 -10.603  1.00 61.85           H  \nATOM   3691  HB  THR A 249      47.925   0.556 -13.600  1.00 62.62           H  \nATOM   3692  HG1 THR A 249      45.978  -0.434 -12.800  1.00 63.50           H  \nATOM   3693 HG21 THR A 249      49.255  -1.308 -12.728  1.00 63.08           H  \nATOM   3694 HG22 THR A 249      48.182  -1.491 -11.333  1.00 63.08           H  \nATOM   3695 HG23 THR A 249      47.620  -1.853 -12.965  1.00 63.08           H  \nATOM   3696  N   ILE A 250      50.739   0.444 -11.314  1.00 60.81           N  \nATOM   3697  CA  ILE A 250      52.208   0.371 -11.433  1.00 60.26           C  \nATOM   3698  C   ILE A 250      52.738   0.202 -12.880  1.00 60.18           C  \nATOM   3699  O   ILE A 250      53.884   0.564 -13.145  1.00 60.31           O  \nATOM   3700  CB  ILE A 250      52.833  -0.742 -10.532  1.00 60.33           C  \nATOM   3701  CG1 ILE A 250      52.798  -2.204 -11.054  1.00 59.91           C  \nATOM   3702  CG2 ILE A 250      52.350  -0.643  -9.073  1.00 59.68           C  \nATOM   3703  CD1 ILE A 250      51.405  -2.813 -11.267  1.00 59.13           C  \nATOM   3704  H   ILE A 250      50.309  -0.236 -10.705  1.00 60.81           H  \nATOM   3705  HA  ILE A 250      52.589   1.331 -11.079  1.00 60.26           H  \nATOM   3706  HB  ILE A 250      53.896  -0.500 -10.486  1.00 60.33           H  \nATOM   3707 HG13 ILE A 250      53.348  -2.837 -10.358  1.00 59.91           H  \nATOM   3708 HG12 ILE A 250      53.356  -2.284 -11.988  1.00 59.91           H  \nATOM   3709 HG21 ILE A 250      52.903  -1.328  -8.430  1.00 59.68           H  \nATOM   3710 HG22 ILE A 250      52.501   0.364  -8.681  1.00 59.68           H  \nATOM   3711 HG23 ILE A 250      51.292  -0.878  -8.971  1.00 59.68           H  \nATOM   3712 HD11 ILE A 250      51.460  -3.901 -11.245  1.00 59.13           H  \nATOM   3713 HD12 ILE A 250      50.690  -2.503 -10.506  1.00 59.13           H  \nATOM   3714 HD13 ILE A 250      51.009  -2.537 -12.240  1.00 59.13           H  \nATOM   3715  N   ASP A 251      51.877  -0.296 -13.783  1.00 60.25           N  \nATOM   3716  CA  ASP A 251      52.093  -0.443 -15.227  1.00 60.38           C  \nATOM   3717  C   ASP A 251      51.906   0.869 -16.021  1.00 59.91           C  \nATOM   3718  O   ASP A 251      52.124   0.866 -17.232  1.00 60.56           O  \nATOM   3719  CB  ASP A 251      51.210  -1.577 -15.810  1.00 60.98           C  \nATOM   3720  CG  ASP A 251      51.362  -2.949 -15.123  1.00 62.11           C  \nATOM   3721  OD1 ASP A 251      52.484  -3.264 -14.662  1.00 61.91           O  \nATOM   3722  OD2 ASP A 251      50.386  -3.726 -15.198  1.00 62.45           O1-\nATOM   3723  H   ASP A 251      50.959  -0.569 -13.462  1.00 60.25           H  \nATOM   3724  HA  ASP A 251      53.135  -0.719 -15.386  1.00 60.38           H  \nATOM   3725  HB3 ASP A 251      51.435  -1.722 -16.868  1.00 60.98           H  \nATOM   3726  HB2 ASP A 251      50.162  -1.280 -15.744  1.00 60.98           H  \nATOM   3727  N   GLY A 252      51.533   1.965 -15.340  1.00 59.46           N  \nATOM   3728  CA  GLY A 252      51.425   3.314 -15.890  1.00 58.92           C  \nATOM   3729  C   GLY A 252      50.054   3.604 -16.519  1.00 59.26           C  \nATOM   3730  O   GLY A 252      49.792   4.764 -16.834  1.00 59.89           O  \nATOM   3731  H   GLY A 252      51.351   1.878 -14.347  1.00 59.46           H  \nATOM   3732  HA3 GLY A 252      52.207   3.491 -16.631  1.00 58.92           H  \nATOM   3733  HA2 GLY A 252      51.593   4.024 -15.080  1.00 58.92           H  \nATOM   3734  N   GLU A 253      49.181   2.592 -16.697  1.00 59.20           N  \nATOM   3735  CA  GLU A 253      47.828   2.766 -17.232  1.00 59.24           C  \nATOM   3736  C   GLU A 253      46.901   3.473 -16.229  1.00 59.28           C  \nATOM   3737  O   GLU A 253      46.977   3.209 -15.027  1.00 59.03           O  \nATOM   3738  CB  GLU A 253      47.239   1.422 -17.710  1.00 58.97           C  \nATOM   3739  CG  GLU A 253      47.239   0.276 -16.668  1.00 60.46           C  \nATOM   3740  CD  GLU A 253      46.358  -0.937 -17.017  1.00 61.44           C  \nATOM   3741  OE1 GLU A 253      46.334  -1.858 -16.171  1.00 62.15           O  \nATOM   3742  OE2 GLU A 253      45.713  -0.943 -18.091  1.00 61.94           O1-\nATOM   3743  H   GLU A 253      49.438   1.656 -16.422  1.00 59.20           H  \nATOM   3744  HA  GLU A 253      47.908   3.405 -18.115  1.00 59.24           H  \nATOM   3745  HB3 GLU A 253      47.776   1.095 -18.601  1.00 58.97           H  \nATOM   3746  HB2 GLU A 253      46.218   1.616 -18.042  1.00 58.97           H  \nATOM   3747  HG3 GLU A 253      46.911   0.649 -15.699  1.00 60.46           H  \nATOM   3748  HG2 GLU A 253      48.261  -0.074 -16.521  1.00 60.46           H  \nATOM   3749  N   GLU A 254      46.051   4.360 -16.766  1.00 59.88           N  \nATOM   3750  CA  GLU A 254      45.186   5.249 -15.999  1.00 60.07           C  \nATOM   3751  C   GLU A 254      43.718   4.831 -16.186  1.00 59.53           C  \nATOM   3752  O   GLU A 254      43.112   5.189 -17.197  1.00 59.70           O  \nATOM   3753  CB  GLU A 254      45.443   6.709 -16.427  1.00 61.29           C  \nATOM   3754  CG  GLU A 254      46.924   7.132 -16.311  1.00 62.36           C  \nATOM   3755  CD  GLU A 254      47.130   8.637 -16.518  1.00 63.74           C  \nATOM   3756  OE1 GLU A 254      46.738   9.130 -17.600  1.00 64.15           O  \nATOM   3757  OE2 GLU A 254      47.679   9.276 -15.594  1.00 63.61           O1-\nATOM   3758  H   GLU A 254      46.043   4.499 -17.766  1.00 59.88           H  \nATOM   3759  HA  GLU A 254      45.447   5.191 -14.948  1.00 60.07           H  \nATOM   3760  HB3 GLU A 254      44.829   7.369 -15.813  1.00 61.29           H  \nATOM   3761  HB2 GLU A 254      45.111   6.858 -17.456  1.00 61.29           H  \nATOM   3762  HG3 GLU A 254      47.521   6.610 -17.060  1.00 62.36           H  \nATOM   3763  HG2 GLU A 254      47.330   6.821 -15.348  1.00 62.36           H  \nATOM   3764  N   LEU A 255      43.180   4.067 -15.219  1.00 58.86           N  \nATOM   3765  CA  LEU A 255      41.805   3.560 -15.232  1.00 58.29           C  \nATOM   3766  C   LEU A 255      40.913   4.453 -14.360  1.00 57.75           C  \nATOM   3767  O   LEU A 255      41.251   4.697 -13.202  1.00 57.53           O  \nATOM   3768  CB  LEU A 255      41.739   2.102 -14.708  1.00 58.62           C  \nATOM   3769  CG  LEU A 255      42.695   1.080 -15.367  1.00 59.01           C  \nATOM   3770  CD1 LEU A 255      42.701   1.131 -16.908  1.00 58.57           C  \nATOM   3771  CD2 LEU A 255      44.110   1.121 -14.761  1.00 59.86           C  \nATOM   3772  H   LEU A 255      43.733   3.839 -14.403  1.00 58.86           H  \nATOM   3773  HA  LEU A 255      41.415   3.576 -16.252  1.00 58.29           H  \nATOM   3774  HB3 LEU A 255      40.718   1.748 -14.855  1.00 58.62           H  \nATOM   3775  HB2 LEU A 255      41.892   2.077 -13.627  1.00 58.62           H  \nATOM   3776  HG  LEU A 255      42.291   0.103 -15.096  1.00 59.01           H  \nATOM   3777 HD11 LEU A 255      42.773   0.126 -17.324  1.00 58.57           H  \nATOM   3778 HD12 LEU A 255      41.789   1.575 -17.307  1.00 58.57           H  \nATOM   3779 HD13 LEU A 255      43.542   1.705 -17.299  1.00 58.57           H  \nATOM   3780 HD21 LEU A 255      44.449   0.119 -14.496  1.00 59.86           H  \nATOM   3781 HD22 LEU A 255      44.831   1.533 -15.462  1.00 59.86           H  \nATOM   3782 HD23 LEU A 255      44.162   1.728 -13.856  1.00 59.86           H  \nATOM   3783  N   VAL A 256      39.772   4.886 -14.918  1.00 57.07           N  \nATOM   3784  CA  VAL A 256      38.769   5.674 -14.203  1.00 55.73           C  \nATOM   3785  C   VAL A 256      37.654   4.739 -13.697  1.00 54.78           C  \nATOM   3786  O   VAL A 256      37.149   3.923 -14.470  1.00 54.63           O  \nATOM   3787  CB  VAL A 256      38.147   6.774 -15.109  1.00 56.83           C  \nATOM   3788  CG1 VAL A 256      37.027   7.586 -14.422  1.00 57.15           C  \nATOM   3789  CG2 VAL A 256      39.229   7.743 -15.624  1.00 57.77           C  \nATOM   3790  H   VAL A 256      39.545   4.628 -15.868  1.00 57.07           H  \nATOM   3791  HA  VAL A 256      39.237   6.171 -13.355  1.00 55.73           H  \nATOM   3792  HB  VAL A 256      37.708   6.293 -15.984  1.00 56.83           H  \nATOM   3793 HG11 VAL A 256      36.685   8.401 -15.061  1.00 57.15           H  \nATOM   3794 HG12 VAL A 256      36.150   6.978 -14.200  1.00 57.15           H  \nATOM   3795 HG13 VAL A 256      37.374   8.025 -13.486  1.00 57.15           H  \nATOM   3796 HG21 VAL A 256      38.797   8.514 -16.263  1.00 57.77           H  \nATOM   3797 HG22 VAL A 256      39.733   8.243 -14.796  1.00 57.77           H  \nATOM   3798 HG23 VAL A 256      39.988   7.228 -16.213  1.00 57.77           H  \nATOM   3799  N   LYS A 257      37.297   4.882 -12.411  1.00 51.70           N  \nATOM   3800  CA  LYS A 257      36.267   4.096 -11.731  1.00 48.93           C  \nATOM   3801  C   LYS A 257      35.394   5.013 -10.863  1.00 46.97           C  \nATOM   3802  O   LYS A 257      35.898   5.988 -10.307  1.00 45.71           O  \nATOM   3803  CB  LYS A 257      36.932   3.004 -10.863  1.00 50.03           C  \nATOM   3804  CG  LYS A 257      37.610   1.885 -11.674  1.00 50.79           C  \nATOM   3805  CD  LYS A 257      38.182   0.733 -10.824  1.00 50.90           C  \nATOM   3806  CE  LYS A 257      39.599   0.953 -10.258  1.00 50.77           C  \nATOM   3807  NZ  LYS A 257      39.631   1.866  -9.101  1.00 52.08           N1+\nATOM   3808  H   LYS A 257      37.745   5.597 -11.851  1.00 51.70           H  \nATOM   3809  HA  LYS A 257      35.617   3.621 -12.468  1.00 48.93           H  \nATOM   3810  HB3 LYS A 257      36.171   2.541 -10.233  1.00 50.03           H  \nATOM   3811  HB2 LYS A 257      37.646   3.464 -10.184  1.00 50.03           H  \nATOM   3812  HG3 LYS A 257      38.403   2.295 -12.300  1.00 50.79           H  \nATOM   3813  HG2 LYS A 257      36.874   1.470 -12.364  1.00 50.79           H  \nATOM   3814  HD3 LYS A 257      38.185  -0.176 -11.428  1.00 50.90           H  \nATOM   3815  HD2 LYS A 257      37.501   0.527 -10.001  1.00 50.90           H  \nATOM   3816  HE3 LYS A 257      40.268   1.325 -11.034  1.00 50.77           H  \nATOM   3817  HE2 LYS A 257      40.004  -0.002  -9.923  1.00 50.77           H  \nATOM   3818  HZ1 LYS A 257      39.030   1.505  -8.371  1.00 52.08           H  \nATOM   3819  HZ2 LYS A 257      40.576   1.935  -8.747  1.00 52.08           H  \nATOM   3820  HZ3 LYS A 257      39.307   2.780  -9.379  1.00 52.08           H  \nATOM   3821  N   ILE A 258      34.106   4.658 -10.739  1.00 44.56           N  \nATOM   3822  CA  ILE A 258      33.141   5.328  -9.869  1.00 42.44           C  \nATOM   3823  C   ILE A 258      32.493   4.263  -8.973  1.00 40.52           C  \nATOM   3824  O   ILE A 258      31.740   3.424  -9.467  1.00 38.13           O  \nATOM   3825  CB  ILE A 258      32.027   6.079 -10.663  1.00 43.22           C  \nATOM   3826  CG1 ILE A 258      32.645   7.190 -11.544  1.00 43.77           C  \nATOM   3827  CG2 ILE A 258      30.926   6.672  -9.747  1.00 45.13           C  \nATOM   3828  CD1 ILE A 258      31.642   7.914 -12.454  1.00 43.79           C  \nATOM   3829  H   ILE A 258      33.760   3.844 -11.234  1.00 44.56           H  \nATOM   3830  HA  ILE A 258      33.644   6.058  -9.234  1.00 42.44           H  \nATOM   3831  HB  ILE A 258      31.547   5.364 -11.335  1.00 43.22           H  \nATOM   3832 HG13 ILE A 258      33.426   6.775 -12.181  1.00 43.77           H  \nATOM   3833 HG12 ILE A 258      33.145   7.917 -10.906  1.00 43.77           H  \nATOM   3834 HG21 ILE A 258      30.165   7.201 -10.320  1.00 45.13           H  \nATOM   3835 HG22 ILE A 258      30.392   5.911  -9.178  1.00 45.13           H  \nATOM   3836 HG23 ILE A 258      31.351   7.380  -9.034  1.00 45.13           H  \nATOM   3837 HD11 ILE A 258      32.147   8.348 -13.316  1.00 43.79           H  \nATOM   3838 HD12 ILE A 258      30.876   7.234 -12.828  1.00 43.79           H  \nATOM   3839 HD13 ILE A 258      31.143   8.726 -11.925  1.00 43.79           H  \nATOM   3840  N   GLY A 259      32.801   4.332  -7.672  1.00 37.82           N  \nATOM   3841  CA  GLY A 259      32.202   3.496  -6.640  1.00 36.40           C  \nATOM   3842  C   GLY A 259      31.053   4.262  -5.984  1.00 34.07           C  \nATOM   3843  O   GLY A 259      31.104   5.487  -5.890  1.00 31.38           O  \nATOM   3844  H   GLY A 259      33.422   5.067  -7.355  1.00 37.82           H  \nATOM   3845  HA3 GLY A 259      32.954   3.321  -5.874  1.00 36.40           H  \nATOM   3846  HA2 GLY A 259      31.876   2.528  -7.023  1.00 36.40           H  \nATOM   3847  N   LYS A 260      30.053   3.529  -5.474  1.00 34.92           N  \nATOM   3848  CA  LYS A 260      28.978   4.071  -4.644  1.00 35.62           C  \nATOM   3849  C   LYS A 260      28.524   3.011  -3.631  1.00 34.43           C  \nATOM   3850  O   LYS A 260      28.368   1.848  -3.994  1.00 33.78           O  \nATOM   3851  CB  LYS A 260      27.843   4.620  -5.535  1.00 38.36           C  \nATOM   3852  CG  LYS A 260      26.584   5.118  -4.799  1.00 43.96           C  \nATOM   3853  CD  LYS A 260      25.539   5.668  -5.789  1.00 46.47           C  \nATOM   3854  CE  LYS A 260      24.143   5.904  -5.188  1.00 47.84           C  \nATOM   3855  NZ  LYS A 260      24.126   6.991  -4.194  1.00 49.34           N1+\nATOM   3856  H   LYS A 260      30.055   2.524  -5.588  1.00 34.92           H  \nATOM   3857  HA  LYS A 260      29.389   4.904  -4.081  1.00 35.62           H  \nATOM   3858  HB3 LYS A 260      27.538   3.834  -6.221  1.00 38.36           H  \nATOM   3859  HB2 LYS A 260      28.235   5.428  -6.153  1.00 38.36           H  \nATOM   3860  HG3 LYS A 260      26.861   5.884  -4.074  1.00 43.96           H  \nATOM   3861  HG2 LYS A 260      26.135   4.301  -4.233  1.00 43.96           H  \nATOM   3862  HD3 LYS A 260      25.439   4.972  -6.623  1.00 46.47           H  \nATOM   3863  HD2 LYS A 260      25.914   6.594  -6.227  1.00 46.47           H  \nATOM   3864  HE3 LYS A 260      23.769   4.990  -4.727  1.00 47.84           H  \nATOM   3865  HE2 LYS A 260      23.443   6.165  -5.982  1.00 47.84           H  \nATOM   3866  HZ1 LYS A 260      24.433   7.853  -4.623  1.00 49.34           H  \nATOM   3867  HZ2 LYS A 260      23.190   7.109  -3.834  1.00 49.34           H  \nATOM   3868  HZ3 LYS A 260      24.746   6.759  -3.432  1.00 49.34           H  \nATOM   3869  N   LEU A 261      28.303   3.443  -2.382  1.00 33.81           N  \nATOM   3870  CA  LEU A 261      27.833   2.610  -1.279  1.00 31.60           C  \nATOM   3871  C   LEU A 261      26.693   3.348  -0.570  1.00 29.63           C  \nATOM   3872  O   LEU A 261      26.902   4.487  -0.160  1.00 29.87           O  \nATOM   3873  CB  LEU A 261      29.019   2.310  -0.339  1.00 29.94           C  \nATOM   3874  CG  LEU A 261      28.707   1.493   0.936  1.00 31.43           C  \nATOM   3875  CD1 LEU A 261      28.100   0.114   0.637  1.00 27.52           C  \nATOM   3876  CD2 LEU A 261      29.960   1.351   1.820  1.00 29.62           C  \nATOM   3877  H   LEU A 261      28.470   4.416  -2.158  1.00 33.81           H  \nATOM   3878  HA  LEU A 261      27.465   1.662  -1.659  1.00 31.60           H  \nATOM   3879  HB3 LEU A 261      29.463   3.253  -0.035  1.00 29.94           H  \nATOM   3880  HB2 LEU A 261      29.794   1.809  -0.911  1.00 29.94           H  \nATOM   3881  HG  LEU A 261      27.977   2.052   1.518  1.00 31.43           H  \nATOM   3882 HD11 LEU A 261      28.088  -0.516   1.527  1.00 27.52           H  \nATOM   3883 HD12 LEU A 261      27.070   0.195   0.288  1.00 27.52           H  \nATOM   3884 HD13 LEU A 261      28.681  -0.408  -0.118  1.00 27.52           H  \nATOM   3885 HD21 LEU A 261      30.315   0.320   1.865  1.00 29.62           H  \nATOM   3886 HD22 LEU A 261      30.791   1.955   1.455  1.00 29.62           H  \nATOM   3887 HD23 LEU A 261      29.750   1.662   2.843  1.00 29.62           H  \nATOM   3888  N   ASN A 262      25.536   2.685  -0.416  1.00 30.06           N  \nATOM   3889  CA  ASN A 262      24.382   3.200   0.329  1.00 27.76           C  \nATOM   3890  C   ASN A 262      24.290   2.460   1.665  1.00 25.27           C  \nATOM   3891  O   ASN A 262      24.167   1.239   1.685  1.00 25.48           O  \nATOM   3892  CB  ASN A 262      23.073   3.000  -0.463  1.00 28.70           C  \nATOM   3893  CG  ASN A 262      23.064   3.717  -1.813  1.00 33.27           C  \nATOM   3894  OD1 ASN A 262      23.089   4.945  -1.868  1.00 35.47           O  \nATOM   3895  ND2 ASN A 262      23.018   2.949  -2.903  1.00 30.78           N  \nATOM   3896  H   ASN A 262      25.441   1.753  -0.799  1.00 30.06           H  \nATOM   3897  HA  ASN A 262      24.491   4.266   0.533  1.00 27.76           H  \nATOM   3898  HB3 ASN A 262      22.231   3.384   0.114  1.00 28.70           H  \nATOM   3899  HB2 ASN A 262      22.878   1.940  -0.607  1.00 28.70           H  \nATOM   3900 HD22 ASN A 262      22.995   3.360  -3.824  1.00 30.78           H  \nATOM   3901 HD21 ASN A 262      23.005   1.940  -2.812  1.00 30.78           H  \nATOM   3902  N   LEU A 263      24.334   3.219   2.762  1.00 25.22           N  \nATOM   3903  CA  LEU A 263      24.276   2.707   4.124  1.00 25.09           C  \nATOM   3904  C   LEU A 263      22.918   3.140   4.677  1.00 22.26           C  \nATOM   3905  O   LEU A 263      22.766   4.266   5.153  1.00 22.01           O  \nATOM   3906  CB  LEU A 263      25.496   3.239   4.911  1.00 27.62           C  \nATOM   3907  CG  LEU A 263      26.846   2.806   4.287  1.00 30.92           C  \nATOM   3908  CD1 LEU A 263      28.031   3.570   4.886  1.00 34.54           C  \nATOM   3909  CD2 LEU A 263      27.074   1.283   4.334  1.00 30.34           C  \nATOM   3910  H   LEU A 263      24.449   4.222   2.678  1.00 25.22           H  \nATOM   3911  HA  LEU A 263      24.313   1.617   4.137  1.00 25.09           H  \nATOM   3912  HB3 LEU A 263      25.446   2.904   5.948  1.00 27.62           H  \nATOM   3913  HB2 LEU A 263      25.458   4.327   4.950  1.00 27.62           H  \nATOM   3914  HG  LEU A 263      26.841   3.099   3.238  1.00 30.92           H  \nATOM   3915 HD11 LEU A 263      28.952   3.354   4.345  1.00 34.54           H  \nATOM   3916 HD12 LEU A 263      27.874   4.646   4.822  1.00 34.54           H  \nATOM   3917 HD13 LEU A 263      28.191   3.299   5.928  1.00 34.54           H  \nATOM   3918 HD21 LEU A 263      28.055   1.027   4.732  1.00 30.34           H  \nATOM   3919 HD22 LEU A 263      26.334   0.773   4.945  1.00 30.34           H  \nATOM   3920 HD23 LEU A 263      27.009   0.849   3.337  1.00 30.34           H  \nATOM   3921  N   VAL A 264      21.940   2.242   4.499  1.00 21.33           N  \nATOM   3922  CA  VAL A 264      20.529   2.499   4.732  1.00 21.12           C  \nATOM   3923  C   VAL A 264      20.145   1.974   6.121  1.00 20.78           C  \nATOM   3924  O   VAL A 264      20.395   0.811   6.423  1.00 22.61           O  \nATOM   3925  CB  VAL A 264      19.640   1.807   3.661  1.00 22.88           C  \nATOM   3926  CG1 VAL A 264      18.133   2.074   3.863  1.00 19.18           C  \nATOM   3927  CG2 VAL A 264      20.061   2.208   2.236  1.00 19.56           C  \nATOM   3928  H   VAL A 264      22.165   1.325   4.132  1.00 21.33           H  \nATOM   3929  HA  VAL A 264      20.354   3.570   4.673  1.00 21.12           H  \nATOM   3930  HB  VAL A 264      19.789   0.730   3.725  1.00 22.88           H  \nATOM   3931 HG11 VAL A 264      17.544   1.672   3.041  1.00 19.18           H  \nATOM   3932 HG12 VAL A 264      17.761   1.613   4.777  1.00 19.18           H  \nATOM   3933 HG13 VAL A 264      17.925   3.143   3.922  1.00 19.18           H  \nATOM   3934 HG21 VAL A 264      19.474   1.677   1.491  1.00 19.56           H  \nATOM   3935 HG22 VAL A 264      19.939   3.276   2.069  1.00 19.56           H  \nATOM   3936 HG23 VAL A 264      21.104   1.960   2.036  1.00 19.56           H  \nATOM   3937  N   ASP A 265      19.531   2.845   6.926  1.00 21.91           N  \nATOM   3938  CA  ASP A 265      19.002   2.547   8.249  1.00 22.53           C  \nATOM   3939  C   ASP A 265      17.505   2.839   8.163  1.00 21.18           C  \nATOM   3940  O   ASP A 265      17.105   3.999   8.094  1.00 19.87           O  \nATOM   3941  CB  ASP A 265      19.778   3.337   9.328  1.00 23.03           C  \nATOM   3942  CG  ASP A 265      19.279   3.361  10.784  1.00 26.46           C  \nATOM   3943  OD1 ASP A 265      18.330   2.628  11.137  1.00 25.06           O  \nATOM   3944  OD2 ASP A 265      19.921   4.108  11.553  1.00 29.68           O1-\nATOM   3945  H   ASP A 265      19.354   3.784   6.589  1.00 21.91           H  \nATOM   3946  HA  ASP A 265      19.118   1.487   8.475  1.00 22.53           H  \nATOM   3947  HB3 ASP A 265      19.882   4.365   8.991  1.00 23.03           H  \nATOM   3948  HB2 ASP A 265      20.793   2.940   9.350  1.00 23.03           H  \nATOM   3949  N   LEU A 266      16.721   1.757   8.122  1.00 19.19           N  \nATOM   3950  CA  LEU A 266      15.273   1.789   7.967  1.00 20.84           C  \nATOM   3951  C   LEU A 266      14.579   2.204   9.268  1.00 20.61           C  \nATOM   3952  O   LEU A 266      15.143   2.039  10.350  1.00 20.90           O  \nATOM   3953  CB  LEU A 266      14.803   0.386   7.531  1.00 17.59           C  \nATOM   3954  CG  LEU A 266      15.381  -0.068   6.173  1.00 21.63           C  \nATOM   3955  CD1 LEU A 266      15.095  -1.554   5.947  1.00 18.98           C  \nATOM   3956  CD2 LEU A 266      14.833   0.777   5.013  1.00 19.35           C  \nATOM   3957  H   LEU A 266      17.135   0.839   8.215  1.00 19.19           H  \nATOM   3958  HA  LEU A 266      15.020   2.519   7.196  1.00 20.84           H  \nATOM   3959  HB3 LEU A 266      13.713   0.353   7.484  1.00 17.59           H  \nATOM   3960  HB2 LEU A 266      15.084  -0.335   8.301  1.00 17.59           H  \nATOM   3961  HG  LEU A 266      16.466   0.035   6.182  1.00 21.63           H  \nATOM   3962 HD11 LEU A 266      15.381  -1.883   4.949  1.00 18.98           H  \nATOM   3963 HD12 LEU A 266      15.647  -2.165   6.661  1.00 18.98           H  \nATOM   3964 HD13 LEU A 266      14.032  -1.752   6.071  1.00 18.98           H  \nATOM   3965 HD21 LEU A 266      14.946   0.276   4.052  1.00 19.35           H  \nATOM   3966 HD22 LEU A 266      13.773   0.980   5.155  1.00 19.35           H  \nATOM   3967 HD23 LEU A 266      15.349   1.734   4.940  1.00 19.35           H  \nATOM   3968  N   ALA A 267      13.331   2.675   9.129  1.00 21.47           N  \nATOM   3969  CA  ALA A 267      12.390   2.869  10.230  1.00 19.08           C  \nATOM   3970  C   ALA A 267      12.118   1.549  10.960  1.00 19.61           C  \nATOM   3971  O   ALA A 267      12.099   0.499  10.316  1.00 18.68           O  \nATOM   3972  CB  ALA A 267      11.079   3.422   9.666  1.00 18.56           C  \nATOM   3973  H   ALA A 267      12.955   2.799   8.198  1.00 21.47           H  \nATOM   3974  HA  ALA A 267      12.812   3.596  10.924  1.00 19.08           H  \nATOM   3975  HB1 ALA A 267      10.395   3.692  10.470  1.00 18.56           H  \nATOM   3976  HB2 ALA A 267      11.258   4.314   9.066  1.00 18.56           H  \nATOM   3977  HB3 ALA A 267      10.573   2.692   9.033  1.00 18.56           H  \nATOM   3978  N   GLY A 268      11.906   1.640  12.281  1.00 20.90           N  \nATOM   3979  CA  GLY A 268      11.627   0.527  13.183  1.00 21.41           C  \nATOM   3980  C   GLY A 268      10.481  -0.354  12.668  1.00 22.97           C  \nATOM   3981  O   GLY A 268       9.420   0.151  12.303  1.00 21.66           O  \nATOM   3982  H   GLY A 268      11.923   2.560  12.704  1.00 20.90           H  \nATOM   3983  HA3 GLY A 268      11.344   0.954  14.142  1.00 21.41           H  \nATOM   3984  HA2 GLY A 268      12.535  -0.057  13.338  1.00 21.41           H  \nATOM   3985  N   SER A 269      10.715  -1.674  12.655  1.00 23.42           N  \nATOM   3986  CA  SER A 269       9.807  -2.677  12.104  1.00 24.42           C  \nATOM   3987  C   SER A 269       8.610  -3.066  12.996  1.00 27.82           C  \nATOM   3988  O   SER A 269       7.819  -3.892  12.540  1.00 27.45           O  \nATOM   3989  CB  SER A 269      10.635  -3.908  11.686  1.00 22.75           C  \nATOM   3990  OG  SER A 269      11.128  -4.632  12.793  1.00 25.27           O  \nATOM   3991  H   SER A 269      11.603  -2.028  12.986  1.00 23.42           H  \nATOM   3992  HA  SER A 269       9.382  -2.263  11.189  1.00 24.42           H  \nATOM   3993  HB3 SER A 269      11.466  -3.623  11.043  1.00 22.75           H  \nATOM   3994  HB2 SER A 269      10.007  -4.583  11.110  1.00 22.75           H  \nATOM   3995  HG  SER A 269      11.645  -5.375  12.469  1.00 25.27           H  \nATOM   3996  N   GLU A 270       8.484  -2.509  14.219  1.00 30.78           N  \nATOM   3997  CA  GLU A 270       7.446  -2.890  15.187  1.00 34.86           C  \nATOM   3998  C   GLU A 270       6.014  -2.668  14.677  1.00 37.87           C  \nATOM   3999  O   GLU A 270       5.767  -1.746  13.900  1.00 37.82           O  \nATOM   4000  CB  GLU A 270       7.677  -2.271  16.597  1.00 34.89           C  \nATOM   4001  CG  GLU A 270       7.064  -0.883  16.938  1.00 37.74           C  \nATOM   4002  CD  GLU A 270       7.750   0.331  16.298  1.00 43.02           C  \nATOM   4003  OE1 GLU A 270       8.632   0.912  16.971  1.00 35.23           O  \nATOM   4004  OE2 GLU A 270       7.397   0.674  15.149  1.00 47.66           O1-\nATOM   4005  H   GLU A 270       9.168  -1.834  14.538  1.00 30.78           H  \nATOM   4006  HA  GLU A 270       7.586  -3.959  15.296  1.00 34.86           H  \nATOM   4007  HB3 GLU A 270       8.734  -2.288  16.849  1.00 34.89           H  \nATOM   4008  HB2 GLU A 270       7.248  -2.972  17.314  1.00 34.89           H  \nATOM   4009  HG3 GLU A 270       7.103  -0.757  18.022  1.00 37.74           H  \nATOM   4010  HG2 GLU A 270       6.000  -0.854  16.705  1.00 37.74           H  \nATOM   4011  N   ASN A 271       5.093  -3.516  15.160  1.00 41.83           N  \nATOM   4012  CA  ASN A 271       3.653  -3.420  14.910  1.00 44.48           C  \nATOM   4013  C   ASN A 271       3.085  -2.097  15.443  1.00 45.67           C  \nATOM   4014  O   ASN A 271       3.433  -1.684  16.551  1.00 46.37           O  \nATOM   4015  CB  ASN A 271       2.931  -4.602  15.597  1.00 47.15           C  \nATOM   4016  CG  ASN A 271       3.222  -5.969  14.971  1.00 50.68           C  \nATOM   4017  OD1 ASN A 271       3.251  -6.109  13.750  1.00 51.46           O  \nATOM   4018  ND2 ASN A 271       3.409  -6.993  15.806  1.00 52.35           N  \nATOM   4019  H   ASN A 271       5.382  -4.244  15.803  1.00 41.83           H  \nATOM   4020  HA  ASN A 271       3.521  -3.479  13.828  1.00 44.48           H  \nATOM   4021  HB3 ASN A 271       1.851  -4.459  15.531  1.00 47.15           H  \nATOM   4022  HB2 ASN A 271       3.170  -4.622  16.663  1.00 47.15           H  \nATOM   4023 HD22 ASN A 271       3.582  -7.920  15.447  1.00 52.35           H  \nATOM   4024 HD21 ASN A 271       3.401  -6.849  16.806  1.00 52.35           H  \nATOM   4025  N   ILE A 272       2.195  -1.486  14.649  1.00 13.83           N  \nATOM   4026  CA  ILE A 272       1.460  -0.288  15.034  1.00 15.42           C  \nATOM   4027  C   ILE A 272       0.055  -0.677  15.526  1.00 16.71           C  \nATOM   4028  O   ILE A 272      -0.660  -1.417  14.847  1.00 17.84           O  \nATOM   4029  CB  ILE A 272       1.359   0.732  13.855  1.00  0.00           C  \nATOM   4030  CG1 ILE A 272       0.739   2.089  14.265  1.00  0.00           C  \nATOM   4031  CG2 ILE A 272       0.636   0.199  12.597  1.00  0.00           C  \nATOM   4032  CD1 ILE A 272       1.489   2.818  15.390  1.00  0.00           C  \nATOM   4033  HB  ILE A 272       2.385   0.939  13.546  1.00  0.00           H  \nATOM   4034 HG12 ILE A 272       0.710   2.745  13.399  1.00  0.00           H  \nATOM   4035 HG13 ILE A 272      -0.305   1.958  14.546  1.00  0.00           H  \nATOM   4036 HG21 ILE A 272       0.745   0.894  11.765  1.00  0.00           H  \nATOM   4037 HG22 ILE A 272       1.045  -0.756  12.271  1.00  0.00           H  \nATOM   4038 HG23 ILE A 272      -0.434   0.071  12.759  1.00  0.00           H  \nATOM   4039 HD11 ILE A 272       1.318   3.893  15.335  1.00  0.00           H  \nATOM   4040 HD12 ILE A 272       1.152   2.483  16.371  1.00  0.00           H  \nATOM   4041 HD13 ILE A 272       2.565   2.652  15.328  1.00  0.00           H  \nATOM   4042  H   ILE A 272       1.951  -1.893  13.758  1.00 13.83           H  \nATOM   4043  HA  ILE A 272       1.988   0.206  15.852  1.00 15.42           H  \nATOM   4044  N   GLY A 273      -0.321  -0.123  16.688  1.00 17.08           N  \nATOM   4045  CA  GLY A 273      -1.707  -0.053  17.131  1.00 15.97           C  \nATOM   4046  C   GLY A 273      -2.224   1.274  16.576  1.00 17.17           C  \nATOM   4047  O   GLY A 273      -1.744   2.333  16.984  1.00 15.94           O  \nATOM   4048  HA3 GLY A 273      -1.743  -0.038  18.221  1.00 15.97           H  \nATOM   4049  H   GLY A 273       0.342   0.445  17.196  1.00 17.08           H  \nATOM   4050  HA2 GLY A 273      -2.303  -0.901  16.788  1.00 15.97           H  \nATOM   4051  N   ARG A 274      -3.170   1.206  15.626  1.00 14.58           N  \nATOM   4052  CA  ARG A 274      -3.710   2.361  14.904  1.00 15.78           C  \nATOM   4053  C   ARG A 274      -4.465   3.351  15.808  1.00 16.40           C  \nATOM   4054  O   ARG A 274      -4.947   2.978  16.879  1.00 14.34           O  \nATOM   4055  CB  ARG A 274      -4.683   1.882  13.807  1.00  0.00           C  \nATOM   4056  CG  ARG A 274      -4.110   0.939  12.736  1.00  0.00           C  \nATOM   4057  CD  ARG A 274      -5.173   0.730  11.646  1.00  0.00           C  \nATOM   4058  NE  ARG A 274      -4.850  -0.312  10.660  1.00  0.00           N  \nATOM   4059  CZ  ARG A 274      -5.648  -0.682   9.636  1.00  0.00           C  \nATOM   4060  NH1 ARG A 274      -6.825  -0.080   9.392  1.00  0.00           N  \nATOM   4061  NH2 ARG A 274      -5.258  -1.682   8.836  1.00  0.00           N1+\nATOM   4062  HB2 ARG A 274      -5.538   1.392  14.279  1.00  0.00           H  \nATOM   4063  HB3 ARG A 274      -5.095   2.753  13.294  1.00  0.00           H  \nATOM   4064  HG2 ARG A 274      -3.252   1.449  12.296  1.00  0.00           H  \nATOM   4065  HG3 ARG A 274      -3.741  -0.004  13.141  1.00  0.00           H  \nATOM   4066  HD2 ARG A 274      -6.158   0.577  12.082  1.00  0.00           H  \nATOM   4067  HD3 ARG A 274      -5.223   1.648  11.059  1.00  0.00           H  \nATOM   4068  HE  ARG A 274      -3.971  -0.791  10.791  1.00  0.00           H  \nATOM   4069 HH12 ARG A 274      -7.416  -0.376   8.629  1.00  0.00           H  \nATOM   4070 HH11 ARG A 274      -7.136   0.672   9.995  1.00  0.00           H  \nATOM   4071 HH22 ARG A 274      -5.843  -1.982   8.070  1.00  0.00           H  \nATOM   4072 HH21 ARG A 274      -4.378  -2.151   8.997  1.00  0.00           H  \nATOM   4073  H   ARG A 274      -3.523   0.303  15.343  1.00 14.58           H  \nATOM   4074  HA  ARG A 274      -2.875   2.886  14.435  1.00 15.78           H  \nATOM   4075  N   SER A 275      -4.634   4.577  15.287  1.00 14.55           N  \nATOM   4076  CA  SER A 275      -5.642   5.542  15.722  1.00 16.42           C  \nATOM   4077  C   SER A 275      -7.041   5.056  15.281  1.00 17.16           C  \nATOM   4078  O   SER A 275      -7.532   5.453  14.228  1.00 16.93           O  \nATOM   4079  CB  SER A 275      -5.237   6.937  15.190  1.00  0.00           C  \nATOM   4080  OG  SER A 275      -5.114   6.983  13.779  1.00  0.00           O  \nATOM   4081  HB2 SER A 275      -5.971   7.682  15.497  1.00  0.00           H  \nATOM   4082  HB3 SER A 275      -4.285   7.241  15.628  1.00  0.00           H  \nATOM   4083  HG  SER A 275      -4.912   7.884  13.516  1.00  0.00           H  \nATOM   4084  H   SER A 275      -4.195   4.801  14.406  1.00 14.55           H  \nATOM   4085  HA  SER A 275      -5.633   5.592  16.813  1.00 16.42           H  \nATOM   4086  N   GLY A 276      -7.623   4.142  16.081  1.00 15.23           N  \nATOM   4087  CA  GLY A 276      -8.789   3.319  15.736  1.00 16.84           C  \nATOM   4088  C   GLY A 276     -10.083   4.105  15.468  1.00 16.88           C  \nATOM   4089  O   GLY A 276     -10.978   3.576  14.811  1.00 16.65           O  \nATOM   4090  HA3 GLY A 276      -8.971   2.619  16.551  1.00 16.84           H  \nATOM   4091  H   GLY A 276      -7.128   3.868  16.918  1.00 15.23           H  \nATOM   4092  HA2 GLY A 276      -8.544   2.721  14.859  1.00 16.84           H  \nATOM   4093  N   ALA A 277     -10.172   5.363  15.934  0.50 17.32           N  \nATOM   4094  CA  ALA A 277     -11.259   6.295  15.628  0.50 21.27           C  \nATOM   4095  C   ALA A 277     -11.269   6.770  14.161  0.50 23.22           C  \nATOM   4096  O   ALA A 277     -12.330   7.156  13.670  0.50 25.56           O  \nATOM   4097  CB  ALA A 277     -11.154   7.497  16.578  1.00  0.00           C  \nATOM   4098  HB1 ALA A 277     -10.208   8.027  16.450  1.00  0.00           H  \nATOM   4099  HB2 ALA A 277     -11.960   8.211  16.405  1.00  0.00           H  \nATOM   4100  HB3 ALA A 277     -11.219   7.180  17.619  1.00  0.00           H  \nATOM   4101  H   ALA A 277      -9.405   5.739  16.473  1.00 17.32           H  \nATOM   4102  HA  ALA A 277     -12.207   5.789  15.820  1.00 21.27           H  \nATOM   4103  N   VAL A 278     -10.101   6.733  13.496  1.00 20.27           N  \nATOM   4104  CA  VAL A 278      -9.903   7.185  12.120  1.00 20.59           C  \nATOM   4105  C   VAL A 278     -10.267   6.104  11.081  1.00 19.48           C  \nATOM   4106  O   VAL A 278     -10.578   6.480   9.959  1.00 18.81           O  \nATOM   4107  CB  VAL A 278      -8.430   7.644  11.878  1.00  0.00           C  \nATOM   4108  CG1 VAL A 278      -8.113   8.110  10.438  1.00  0.00           C  \nATOM   4109  CG2 VAL A 278      -8.026   8.757  12.863  1.00  0.00           C  \nATOM   4110  HB  VAL A 278      -7.772   6.797  12.070  1.00  0.00           H  \nATOM   4111 HG11 VAL A 278      -7.115   8.546  10.376  1.00  0.00           H  \nATOM   4112 HG12 VAL A 278      -8.127   7.286   9.725  1.00  0.00           H  \nATOM   4113 HG13 VAL A 278      -8.823   8.865  10.099  1.00  0.00           H  \nATOM   4114 HG21 VAL A 278      -7.001   9.086  12.691  1.00  0.00           H  \nATOM   4115 HG22 VAL A 278      -8.675   9.628  12.764  1.00  0.00           H  \nATOM   4116 HG23 VAL A 278      -8.078   8.418  13.898  1.00  0.00           H  \nATOM   4117  H   VAL A 278      -9.275   6.379  13.962  1.00 20.27           H  \nATOM   4118  HA  VAL A 278     -10.555   8.042  11.939  1.00 20.59           H  \nATOM   4119  N   ASP A 279     -10.264   4.806  11.440  1.00 16.88           N  \nATOM   4120  CA  ASP A 279     -10.481   3.666  10.523  1.00 15.78           C  \nATOM   4121  C   ASP A 279     -11.818   3.643   9.743  1.00 14.21           C  \nATOM   4122  O   ASP A 279     -11.919   2.900   8.766  1.00 16.58           O  \nATOM   4123  CB  ASP A 279     -10.245   2.299  11.216  1.00  0.00           C  \nATOM   4124  CG  ASP A 279      -8.841   2.072  11.805  1.00  0.00           C  \nATOM   4125  OD1 ASP A 279      -7.871   2.700  11.324  1.00  0.00           O  \nATOM   4126  OD2 ASP A 279      -8.731   1.143  12.633  1.00  0.00           O1-\nATOM   4127  HB2 ASP A 279     -10.970   2.182  12.023  1.00  0.00           H  \nATOM   4128  HB3 ASP A 279     -10.425   1.486  10.511  1.00  0.00           H  \nATOM   4129  H   ASP A 279     -10.019   4.563  12.390  1.00 16.88           H  \nATOM   4130  HA  ASP A 279      -9.725   3.773   9.743  1.00 15.78           H  \nATOM   4131  N   LYS A 280     -12.794   4.471  10.148  1.00 16.18           N  \nATOM   4132  CA  LYS A 280     -14.050   4.729   9.437  1.00 16.76           C  \nATOM   4133  C   LYS A 280     -13.888   5.639   8.192  1.00 17.04           C  \nATOM   4134  O   LYS A 280     -14.762   5.619   7.326  1.00 18.73           O  \nATOM   4135  CB  LYS A 280     -15.038   5.302  10.477  1.00  0.00           C  \nATOM   4136  CG  LYS A 280     -16.442   5.659   9.960  1.00  0.00           C  \nATOM   4137  CD  LYS A 280     -17.382   6.064  11.102  1.00  0.00           C  \nATOM   4138  CE  LYS A 280     -18.753   6.540  10.598  1.00  0.00           C  \nATOM   4139  NZ  LYS A 280     -19.634   6.933  11.711  1.00  0.00           N1+\nATOM   4140  HB2 LYS A 280     -15.144   4.572  11.282  1.00  0.00           H  \nATOM   4141  HB3 LYS A 280     -14.601   6.190  10.937  1.00  0.00           H  \nATOM   4142  HG2 LYS A 280     -16.378   6.486   9.251  1.00  0.00           H  \nATOM   4143  HG3 LYS A 280     -16.862   4.813   9.415  1.00  0.00           H  \nATOM   4144  HD2 LYS A 280     -17.511   5.214  11.775  1.00  0.00           H  \nATOM   4145  HD3 LYS A 280     -16.910   6.852  11.692  1.00  0.00           H  \nATOM   4146  HE2 LYS A 280     -18.633   7.395   9.930  1.00  0.00           H  \nATOM   4147  HE3 LYS A 280     -19.240   5.750  10.025  1.00  0.00           H  \nATOM   4148  HZ1 LYS A 280     -19.206   7.684  12.233  1.00  0.00           H  \nATOM   4149  HZ2 LYS A 280     -20.523   7.243  11.345  1.00  0.00           H  \nATOM   4150  HZ3 LYS A 280     -19.781   6.141  12.321  1.00  0.00           H  \nATOM   4151  H   LYS A 280     -12.628   5.043  10.963  1.00 16.18           H  \nATOM   4152  HA  LYS A 280     -14.444   3.773   9.089  1.00 16.76           H  \nATOM   4153  N   ARG A 281     -12.786   6.411   8.122  1.00 17.25           N  \nATOM   4154  CA  ARG A 281     -12.413   7.331   7.043  1.00 16.47           C  \nATOM   4155  C   ARG A 281     -12.039   6.565   5.763  1.00 18.22           C  \nATOM   4156  O   ARG A 281     -10.873   6.214   5.576  1.00 17.69           O  \nATOM   4157  CB  ARG A 281     -11.258   8.226   7.560  1.00  0.00           C  \nATOM   4158  CG  ARG A 281     -10.642   9.271   6.615  1.00  0.00           C  \nATOM   4159  CD  ARG A 281     -11.616  10.269   5.976  1.00  0.00           C  \nATOM   4160  NE  ARG A 281     -10.845  11.345   5.330  1.00  0.00           N  \nATOM   4161  CZ  ARG A 281     -11.113  12.659   5.250  1.00  0.00           C  \nATOM   4162  NH1 ARG A 281     -12.265  13.188   5.688  1.00  0.00           N  \nATOM   4163  NH2 ARG A 281     -10.180  13.461   4.721  1.00  0.00           N1+\nATOM   4164  HB2 ARG A 281     -11.576   8.729   8.474  1.00  0.00           H  \nATOM   4165  HB3 ARG A 281     -10.425   7.585   7.842  1.00  0.00           H  \nATOM   4166  HG2 ARG A 281      -9.812   9.780   7.108  1.00  0.00           H  \nATOM   4167  HG3 ARG A 281     -10.181   8.713   5.801  1.00  0.00           H  \nATOM   4168  HD2 ARG A 281     -12.137   9.774   5.156  1.00  0.00           H  \nATOM   4169  HD3 ARG A 281     -12.375  10.609   6.680  1.00  0.00           H  \nATOM   4170  HE  ARG A 281      -9.934  11.057   4.992  1.00  0.00           H  \nATOM   4171 HH12 ARG A 281     -12.434  14.181   5.625  1.00  0.00           H  \nATOM   4172 HH11 ARG A 281     -12.968  12.589   6.094  1.00  0.00           H  \nATOM   4173 HH22 ARG A 281     -10.333  14.455   4.645  1.00  0.00           H  \nATOM   4174 HH21 ARG A 281      -9.286  13.073   4.448  1.00  0.00           H  \nATOM   4175  H   ARG A 281     -12.107   6.343   8.871  1.00 17.25           H  \nATOM   4176  HA  ARG A 281     -13.272   7.970   6.829  1.00 16.47           H  \nATOM   4177  N   ALA A 282     -13.044   6.336   4.902  1.00 19.52           N  \nATOM   4178  CA  ALA A 282     -12.904   5.703   3.592  1.00 19.44           C  \nATOM   4179  C   ALA A 282     -12.391   6.711   2.545  1.00 21.06           C  \nATOM   4180  O   ALA A 282     -13.111   7.061   1.610  1.00 20.72           O  \nATOM   4181  CB  ALA A 282     -14.249   5.064   3.207  1.00  0.00           C  \nATOM   4182  HB1 ALA A 282     -14.186   4.560   2.241  1.00  0.00           H  \nATOM   4183  HB2 ALA A 282     -14.552   4.318   3.943  1.00  0.00           H  \nATOM   4184  HB3 ALA A 282     -15.045   5.807   3.144  1.00  0.00           H  \nATOM   4185  H   ALA A 282     -13.979   6.626   5.152  1.00 19.52           H  \nATOM   4186  HA  ALA A 282     -12.169   4.899   3.663  1.00 19.44           H  \nATOM   4187  N   ARG A 283     -11.140   7.151   2.742  1.00 20.98           N  \nATOM   4188  CA  ARG A 283     -10.361   7.987   1.834  1.00 20.56           C  \nATOM   4189  C   ARG A 283      -8.867   7.890   2.193  1.00 19.71           C  \nATOM   4190  O   ARG A 283      -8.040   7.843   1.282  1.00 21.33           O  \nATOM   4191  CB  ARG A 283     -10.856   9.453   1.813  1.00  0.00           C  \nATOM   4192  CG  ARG A 283     -10.199  10.274   0.683  1.00  0.00           C  \nATOM   4193  CD  ARG A 283      -9.815  11.709   1.078  1.00  0.00           C  \nATOM   4194  NE  ARG A 283      -8.888  12.297   0.094  1.00  0.00           N  \nATOM   4195  CZ  ARG A 283      -7.556  12.092   0.021  1.00  0.00           C  \nATOM   4196  NH1 ARG A 283      -6.885  11.364   0.927  1.00  0.00           N  \nATOM   4197  NH2 ARG A 283      -6.874  12.631  -0.997  1.00  0.00           N1+\nATOM   4198  HB2 ARG A 283     -11.939   9.492   1.689  1.00  0.00           H  \nATOM   4199  HB3 ARG A 283     -10.655   9.907   2.783  1.00  0.00           H  \nATOM   4200  HG2 ARG A 283      -9.369   9.760   0.198  1.00  0.00           H  \nATOM   4201  HG3 ARG A 283     -10.960  10.342  -0.096  1.00  0.00           H  \nATOM   4202  HD2 ARG A 283     -10.709  12.329   0.998  1.00  0.00           H  \nATOM   4203  HD3 ARG A 283      -9.478  11.805   2.108  1.00  0.00           H  \nATOM   4204  HE  ARG A 283      -9.324  12.843  -0.635  1.00  0.00           H  \nATOM   4205 HH12 ARG A 283      -5.892  11.211   0.838  1.00  0.00           H  \nATOM   4206 HH11 ARG A 283      -7.368  10.987   1.736  1.00  0.00           H  \nATOM   4207 HH22 ARG A 283      -5.877  12.491  -1.074  1.00  0.00           H  \nATOM   4208 HH21 ARG A 283      -7.348  13.184  -1.696  1.00  0.00           H  \nATOM   4209  H   ARG A 283     -10.636   6.795   3.544  1.00 20.98           H  \nATOM   4210  HA  ARG A 283     -10.484   7.566   0.833  1.00 20.56           H  \nATOM   4211  N   GLU A 284      -8.548   7.823   3.499  1.00 21.43           N  \nATOM   4212  CA  GLU A 284      -7.213   7.479   3.995  1.00 20.61           C  \nATOM   4213  C   GLU A 284      -7.036   5.952   4.037  1.00 20.80           C  \nATOM   4214  O   GLU A 284      -8.017   5.212   4.134  1.00 19.82           O  \nATOM   4215  CB  GLU A 284      -6.952   8.120   5.382  1.00  0.00           C  \nATOM   4216  CG  GLU A 284      -6.329   9.535   5.334  1.00  0.00           C  \nATOM   4217  CD  GLU A 284      -7.333  10.675   5.127  1.00  0.00           C  \nATOM   4218  OE1 GLU A 284      -7.797  10.851   3.979  1.00  0.00           O  \nATOM   4219  OE2 GLU A 284      -7.623  11.375   6.120  1.00  0.00           O1-\nATOM   4220  HB2 GLU A 284      -7.878   8.149   5.958  1.00  0.00           H  \nATOM   4221  HB3 GLU A 284      -6.286   7.484   5.967  1.00  0.00           H  \nATOM   4222  HG2 GLU A 284      -5.798   9.707   6.272  1.00  0.00           H  \nATOM   4223  HG3 GLU A 284      -5.561   9.586   4.560  1.00  0.00           H  \nATOM   4224  H   GLU A 284      -9.273   7.884   4.198  1.00 21.43           H  \nATOM   4225  HA  GLU A 284      -6.466   7.864   3.299  1.00 20.61           H  \nATOM   4226  N   ALA A 285      -5.769   5.522   3.946  1.00 20.97           N  \nATOM   4227  CA  ALA A 285      -5.365   4.119   3.890  1.00 20.77           C  \nATOM   4228  C   ALA A 285      -5.089   3.530   5.282  1.00 20.48           C  \nATOM   4229  O   ALA A 285      -4.831   4.271   6.233  1.00 20.59           O  \nATOM   4230  CB  ALA A 285      -4.108   4.031   3.009  1.00  0.00           C  \nATOM   4231  HB1 ALA A 285      -4.330   4.338   1.986  1.00  0.00           H  \nATOM   4232  HB2 ALA A 285      -3.312   4.677   3.378  1.00  0.00           H  \nATOM   4233  HB3 ALA A 285      -3.717   3.014   2.964  1.00  0.00           H  \nATOM   4234  H   ALA A 285      -5.020   6.196   3.896  1.00 20.97           H  \nATOM   4235  HA  ALA A 285      -6.155   3.530   3.419  1.00 20.77           H  \nATOM   4236  N   GLY A 286      -5.105   2.187   5.350  1.00 19.09           N  \nATOM   4237  CA  GLY A 286      -4.703   1.409   6.521  1.00 17.64           C  \nATOM   4238  C   GLY A 286      -3.176   1.280   6.506  1.00 16.69           C  \nATOM   4239  O   GLY A 286      -2.641   0.267   6.055  1.00 15.61           O  \nATOM   4240  HA3 GLY A 286      -5.159   0.420   6.467  1.00 17.64           H  \nATOM   4241  H   GLY A 286      -5.331   1.662   4.519  1.00 19.09           H  \nATOM   4242  HA2 GLY A 286      -5.044   1.874   7.447  1.00 17.64           H  \nATOM   4243  N   ASN A 287      -2.496   2.330   6.985  1.00 18.01           N  \nATOM   4244  CA  ASN A 287      -1.044   2.496   6.983  1.00 16.78           C  \nATOM   4245  C   ASN A 287      -0.629   3.506   8.069  1.00 17.94           C  \nATOM   4246  O   ASN A 287      -1.492   4.106   8.711  1.00 15.20           O  \nATOM   4247  CB  ASN A 287      -0.543   2.912   5.561  1.00  0.00           C  \nATOM   4248  CG  ASN A 287      -0.861   4.337   5.074  1.00  0.00           C  \nATOM   4249  OD1 ASN A 287      -1.742   5.020   5.591  1.00  0.00           O  \nATOM   4250  ND2 ASN A 287      -0.134   4.792   4.051  1.00  0.00           N  \nATOM   4251  HB2 ASN A 287       0.542   2.850   5.546  1.00  0.00           H  \nATOM   4252  HB3 ASN A 287      -0.894   2.201   4.813  1.00  0.00           H  \nATOM   4253 HD22 ASN A 287      -0.300   5.721   3.691  1.00  0.00           H  \nATOM   4254 HD21 ASN A 287       0.570   4.212   3.614  1.00  0.00           H  \nATOM   4255  H   ASN A 287      -3.011   3.130   7.329  1.00 18.01           H  \nATOM   4256  HA  ASN A 287      -0.566   1.556   7.265  1.00 16.78           H  \nATOM   4257  N   ILE A 288       0.688   3.744   8.165  1.00 39.42           N  \nATOM   4258  CA  ILE A 288       1.245   5.043   8.559  1.00 36.53           C  \nATOM   4259  C   ILE A 288       2.668   5.256   8.016  1.00 31.50           C  \nATOM   4260  O   ILE A 288       3.021   6.407   7.762  1.00 34.96           O  \nATOM   4261  CB  ILE A 288       1.211   5.423  10.079  1.00 39.81           C  \nATOM   4262  CG1 ILE A 288       1.167   4.244  11.074  1.00 41.18           C  \nATOM   4263  CG2 ILE A 288       0.086   6.432  10.379  1.00 39.92           C  \nATOM   4264  CD1 ILE A 288       2.422   3.361  11.081  1.00 43.90           C  \nATOM   4265  HA  ILE A 288       0.646   5.780   8.018  1.00 36.53           H  \nATOM   4266  HB  ILE A 288       2.123   5.971  10.324  1.00 39.81           H  \nATOM   4267 HG13 ILE A 288       0.281   3.633  10.901  1.00 41.18           H  \nATOM   4268 HG12 ILE A 288       1.044   4.649  12.079  1.00 41.18           H  \nATOM   4269 HG21 ILE A 288       0.153   6.797  11.404  1.00 39.92           H  \nATOM   4270 HG22 ILE A 288       0.150   7.302   9.725  1.00 39.92           H  \nATOM   4271 HG23 ILE A 288      -0.903   5.995  10.257  1.00 39.92           H  \nATOM   4272 HD11 ILE A 288       2.221   2.410  10.593  1.00 43.90           H  \nATOM   4273 HD12 ILE A 288       3.265   3.831  10.576  1.00 43.90           H  \nATOM   4274 HD13 ILE A 288       2.741   3.143  12.100  1.00 43.90           H  \nATOM   4275  H   ILE A 288       1.322   3.154   7.647  1.00 39.42           H  \nATOM   4276  N   ASN A 289       3.438   4.173   7.812  1.00 28.46           N  \nATOM   4277  CA  ASN A 289       4.759   4.223   7.193  1.00 23.85           C  \nATOM   4278  C   ASN A 289       4.670   3.513   5.837  1.00 21.26           C  \nATOM   4279  O   ASN A 289       4.866   2.300   5.758  1.00 18.44           O  \nATOM   4280  CB  ASN A 289       5.815   3.594   8.132  1.00 23.77           C  \nATOM   4281  CG  ASN A 289       7.244   4.043   7.803  1.00 25.10           C  \nATOM   4282  OD1 ASN A 289       7.622   4.158   6.638  1.00 25.42           O  \nATOM   4283  ND2 ASN A 289       8.049   4.290   8.836  1.00 14.33           N  \nATOM   4284  H   ASN A 289       3.106   3.252   8.066  1.00 28.46           H  \nATOM   4285  HA  ASN A 289       5.078   5.242   6.963  1.00 23.85           H  \nATOM   4286  HB3 ASN A 289       5.754   2.506   8.161  1.00 23.77           H  \nATOM   4287  HB2 ASN A 289       5.605   3.925   9.151  1.00 23.77           H  \nATOM   4288 HD22 ASN A 289       8.997   4.605   8.686  1.00 14.33           H  \nATOM   4289 HD21 ASN A 289       7.720   4.166   9.783  1.00 14.33           H  \nATOM   4290  N   GLN A 290       4.359   4.298   4.794  1.00 21.33           N  \nATOM   4291  CA  GLN A 290       4.189   3.826   3.424  1.00 21.12           C  \nATOM   4292  C   GLN A 290       5.474   3.227   2.823  1.00 19.80           C  \nATOM   4293  O   GLN A 290       5.379   2.219   2.126  1.00 17.84           O  \nATOM   4294  CB  GLN A 290       3.600   4.974   2.574  1.00 22.69           C  \nATOM   4295  CG  GLN A 290       3.310   4.652   1.092  1.00 21.91           C  \nATOM   4296  CD  GLN A 290       2.296   3.518   0.906  1.00 24.64           C  \nATOM   4297  OE1 GLN A 290       1.446   3.284   1.764  1.00 22.56           O  \nATOM   4298  NE2 GLN A 290       2.362   2.823  -0.229  1.00 26.54           N  \nATOM   4299  H   GLN A 290       4.231   5.292   4.940  1.00 21.33           H  \nATOM   4300  HA  GLN A 290       3.454   3.020   3.471  1.00 21.12           H  \nATOM   4301  HB3 GLN A 290       4.270   5.828   2.626  1.00 22.69           H  \nATOM   4302  HB2 GLN A 290       2.676   5.318   3.041  1.00 22.69           H  \nATOM   4303  HG3 GLN A 290       4.236   4.407   0.570  1.00 21.91           H  \nATOM   4304  HG2 GLN A 290       2.916   5.541   0.600  1.00 21.91           H  \nATOM   4305 HE22 GLN A 290       1.714   2.070  -0.411  1.00 26.54           H  \nATOM   4306 HE21 GLN A 290       3.058   3.058  -0.927  1.00 26.54           H  \nATOM   4307  N   SER A 291       6.640   3.814   3.142  1.00 19.05           N  \nATOM   4308  CA  SER A 291       7.958   3.328   2.729  1.00 20.94           C  \nATOM   4309  C   SER A 291       8.326   1.947   3.288  1.00 20.92           C  \nATOM   4310  O   SER A 291       8.857   1.126   2.540  1.00 21.32           O  \nATOM   4311  CB  SER A 291       9.036   4.383   3.048  1.00 20.43           C  \nATOM   4312  OG  SER A 291       9.212   5.251   1.948  1.00 20.74           O  \nATOM   4313  H   SER A 291       6.632   4.656   3.702  1.00 19.05           H  \nATOM   4314  HA  SER A 291       7.932   3.178   1.655  1.00 20.94           H  \nATOM   4315  HB3 SER A 291       9.999   3.917   3.252  1.00 20.43           H  \nATOM   4316  HB2 SER A 291       8.778   4.964   3.934  1.00 20.43           H  \nATOM   4317  HG  SER A 291       8.467   5.867   1.940  1.00 20.74           H  \nATOM   4318  N   LEU A 292       8.008   1.704   4.571  1.00 19.79           N  \nATOM   4319  CA  LEU A 292       8.260   0.428   5.240  1.00 20.51           C  \nATOM   4320  C   LEU A 292       7.312  -0.687   4.760  1.00 21.92           C  \nATOM   4321  O   LEU A 292       7.773  -1.810   4.557  1.00 19.80           O  \nATOM   4322  CB  LEU A 292       8.196   0.637   6.767  1.00 21.65           C  \nATOM   4323  CG  LEU A 292       8.647  -0.567   7.624  1.00 25.71           C  \nATOM   4324  CD1 LEU A 292      10.086  -1.034   7.309  1.00 23.44           C  \nATOM   4325  CD2 LEU A 292       8.463  -0.257   9.121  1.00 25.41           C  \nATOM   4326  H   LEU A 292       7.554   2.420   5.121  1.00 19.79           H  \nATOM   4327  HA  LEU A 292       9.276   0.128   4.976  1.00 20.51           H  \nATOM   4328  HB3 LEU A 292       7.175   0.907   7.039  1.00 21.65           H  \nATOM   4329  HB2 LEU A 292       8.807   1.498   7.038  1.00 21.65           H  \nATOM   4330  HG  LEU A 292       7.981  -1.402   7.403  1.00 25.71           H  \nATOM   4331 HD11 LEU A 292      10.645  -1.305   8.205  1.00 23.44           H  \nATOM   4332 HD12 LEU A 292      10.069  -1.916   6.668  1.00 23.44           H  \nATOM   4333 HD13 LEU A 292      10.667  -0.271   6.793  1.00 23.44           H  \nATOM   4334 HD21 LEU A 292       7.907  -1.056   9.612  1.00 25.41           H  \nATOM   4335 HD22 LEU A 292       9.414  -0.151   9.641  1.00 25.41           H  \nATOM   4336 HD23 LEU A 292       7.912   0.669   9.286  1.00 25.41           H  \nATOM   4337  N   LEU A 293       6.025  -0.350   4.553  1.00 20.92           N  \nATOM   4338  CA  LEU A 293       5.007  -1.251   4.004  1.00 22.29           C  \nATOM   4339  C   LEU A 293       5.330  -1.695   2.573  1.00 22.16           C  \nATOM   4340  O   LEU A 293       5.236  -2.887   2.282  1.00 23.04           O  \nATOM   4341  CB  LEU A 293       3.624  -0.569   4.031  1.00 21.25           C  \nATOM   4342  CG  LEU A 293       3.002  -0.458   5.436  1.00 24.69           C  \nATOM   4343  CD1 LEU A 293       1.803   0.504   5.422  1.00 21.82           C  \nATOM   4344  CD2 LEU A 293       2.644  -1.833   6.037  1.00 24.44           C  \nATOM   4345  H   LEU A 293       5.722   0.595   4.752  1.00 20.92           H  \nATOM   4346  HA  LEU A 293       4.983  -2.148   4.625  1.00 22.29           H  \nATOM   4347  HB3 LEU A 293       2.923  -1.109   3.393  1.00 21.25           H  \nATOM   4348  HB2 LEU A 293       3.719   0.424   3.588  1.00 21.25           H  \nATOM   4349  HG  LEU A 293       3.754  -0.014   6.087  1.00 24.69           H  \nATOM   4350 HD11 LEU A 293       1.941   1.272   6.182  1.00 21.82           H  \nATOM   4351 HD12 LEU A 293       1.690   1.012   4.464  1.00 21.82           H  \nATOM   4352 HD13 LEU A 293       0.854   0.008   5.627  1.00 21.82           H  \nATOM   4353 HD21 LEU A 293       1.641  -1.863   6.462  1.00 24.44           H  \nATOM   4354 HD22 LEU A 293       2.699  -2.629   5.294  1.00 24.44           H  \nATOM   4355 HD23 LEU A 293       3.335  -2.092   6.839  1.00 24.44           H  \nATOM   4356  N   THR A 294       5.724  -0.734   1.721  1.00 22.88           N  \nATOM   4357  CA  THR A 294       6.076  -0.982   0.326  1.00 21.29           C  \nATOM   4358  C   THR A 294       7.383  -1.775   0.168  1.00 22.41           C  \nATOM   4359  O   THR A 294       7.451  -2.590  -0.746  1.00 21.52           O  \nATOM   4360  CB  THR A 294       6.203   0.323  -0.492  1.00 20.03           C  \nATOM   4361  OG1 THR A 294       5.003   1.058  -0.389  1.00 16.51           O  \nATOM   4362  CG2 THR A 294       6.453   0.118  -1.993  1.00 20.26           C  \nATOM   4363  H   THR A 294       5.782   0.225   2.038  1.00 22.88           H  \nATOM   4364  HA  THR A 294       5.275  -1.577  -0.114  1.00 21.29           H  \nATOM   4365  HB  THR A 294       7.003   0.929  -0.067  1.00 20.03           H  \nATOM   4366  HG1 THR A 294       4.942   1.413   0.505  1.00 16.51           H  \nATOM   4367 HG21 THR A 294       6.440   1.066  -2.530  1.00 20.26           H  \nATOM   4368 HG22 THR A 294       7.416  -0.345  -2.197  1.00 20.26           H  \nATOM   4369 HG23 THR A 294       5.687  -0.524  -2.427  1.00 20.26           H  \nATOM   4370  N   LEU A 295       8.366  -1.583   1.069  1.00 23.24           N  \nATOM   4371  CA  LEU A 295       9.595  -2.382   1.122  1.00 22.73           C  \nATOM   4372  C   LEU A 295       9.312  -3.875   1.365  1.00 22.80           C  \nATOM   4373  O   LEU A 295       9.913  -4.710   0.692  1.00 22.35           O  \nATOM   4374  CB  LEU A 295      10.562  -1.789   2.174  1.00 22.23           C  \nATOM   4375  CG  LEU A 295      11.905  -2.541   2.346  1.00 25.11           C  \nATOM   4376  CD1 LEU A 295      12.750  -2.545   1.057  1.00 20.75           C  \nATOM   4377  CD2 LEU A 295      12.686  -2.005   3.558  1.00 21.13           C  \nATOM   4378  H   LEU A 295       8.254  -0.885   1.793  1.00 23.24           H  \nATOM   4379  HA  LEU A 295      10.072  -2.306   0.145  1.00 22.73           H  \nATOM   4380  HB3 LEU A 295      10.050  -1.767   3.137  1.00 22.23           H  \nATOM   4381  HB2 LEU A 295      10.769  -0.748   1.924  1.00 22.23           H  \nATOM   4382  HG  LEU A 295      11.692  -3.582   2.579  1.00 25.11           H  \nATOM   4383 HD11 LEU A 295      13.813  -2.393   1.245  1.00 20.75           H  \nATOM   4384 HD12 LEU A 295      12.653  -3.502   0.543  1.00 20.75           H  \nATOM   4385 HD13 LEU A 295      12.433  -1.767   0.364  1.00 20.75           H  \nATOM   4386 HD21 LEU A 295      12.902  -2.811   4.260  1.00 21.13           H  \nATOM   4387 HD22 LEU A 295      13.636  -1.555   3.274  1.00 21.13           H  \nATOM   4388 HD23 LEU A 295      12.129  -1.243   4.105  1.00 21.13           H  \nATOM   4389  N   GLY A 296       8.369  -4.172   2.276  1.00 23.61           N  \nATOM   4390  CA  GLY A 296       7.920  -5.530   2.575  1.00 22.93           C  \nATOM   4391  C   GLY A 296       7.180  -6.155   1.384  1.00 24.51           C  \nATOM   4392  O   GLY A 296       7.392  -7.331   1.104  1.00 24.67           O  \nATOM   4393  H   GLY A 296       7.924  -3.421   2.787  1.00 23.61           H  \nATOM   4394  HA3 GLY A 296       7.254  -5.502   3.437  1.00 22.93           H  \nATOM   4395  HA2 GLY A 296       8.774  -6.153   2.844  1.00 22.93           H  \nATOM   4396  N   ARG A 297       6.356  -5.370   0.667  1.00 23.60           N  \nATOM   4397  CA  ARG A 297       5.608  -5.798  -0.522  1.00 23.93           C  \nATOM   4398  C   ARG A 297       6.494  -5.977  -1.768  1.00 23.58           C  \nATOM   4399  O   ARG A 297       6.197  -6.857  -2.573  1.00 23.29           O  \nATOM   4400  CB  ARG A 297       4.473  -4.797  -0.798  1.00 24.98           C  \nATOM   4401  CG  ARG A 297       3.398  -4.782   0.303  1.00 23.29           C  \nATOM   4402  CD  ARG A 297       2.517  -3.531   0.221  1.00 25.05           C  \nATOM   4403  NE  ARG A 297       1.533  -3.471   1.316  1.00 23.01           N  \nATOM   4404  CZ  ARG A 297       0.821  -2.392   1.694  1.00 22.41           C  \nATOM   4405  NH1 ARG A 297       0.936  -1.208   1.076  1.00 24.72           N  \nATOM   4406  NH2 ARG A 297      -0.030  -2.499   2.721  1.00 19.41           N1+\nATOM   4407  H   ARG A 297       6.227  -4.408   0.949  1.00 23.60           H  \nATOM   4408  HA  ARG A 297       5.152  -6.765  -0.306  1.00 23.93           H  \nATOM   4409  HB3 ARG A 297       3.985  -5.040  -1.743  1.00 24.98           H  \nATOM   4410  HB2 ARG A 297       4.898  -3.801  -0.929  1.00 24.98           H  \nATOM   4411  HG3 ARG A 297       3.835  -4.865   1.298  1.00 23.29           H  \nATOM   4412  HG2 ARG A 297       2.780  -5.672   0.179  1.00 23.29           H  \nATOM   4413  HD3 ARG A 297       1.963  -3.529  -0.718  1.00 25.05           H  \nATOM   4414  HD2 ARG A 297       3.150  -2.646   0.230  1.00 25.05           H  \nATOM   4415  HE  ARG A 297       1.391  -4.336   1.817  1.00 23.01           H  \nATOM   4416 HH12 ARG A 297       0.377  -0.413   1.363  1.00 24.72           H  \nATOM   4417 HH11 ARG A 297       1.571  -1.105   0.292  1.00 24.72           H  \nATOM   4418 HH22 ARG A 297      -0.572  -1.699   3.017  1.00 19.41           H  \nATOM   4419 HH21 ARG A 297      -0.142  -3.378   3.206  1.00 19.41           H  \nATOM   4420  N   VAL A 298       7.569  -5.179  -1.896  1.00 24.92           N  \nATOM   4421  CA  VAL A 298       8.597  -5.324  -2.930  1.00 24.78           C  \nATOM   4422  C   VAL A 298       9.428  -6.600  -2.718  1.00 27.12           C  \nATOM   4423  O   VAL A 298       9.617  -7.341  -3.679  1.00 27.82           O  \nATOM   4424  CB  VAL A 298       9.517  -4.068  -3.026  1.00 23.28           C  \nATOM   4425  CG1 VAL A 298      10.884  -4.277  -3.713  1.00 22.42           C  \nATOM   4426  CG2 VAL A 298       8.779  -2.922  -3.738  1.00 24.57           C  \nATOM   4427  H   VAL A 298       7.723  -4.443  -1.219  1.00 24.92           H  \nATOM   4428  HA  VAL A 298       8.085  -5.436  -3.886  1.00 24.78           H  \nATOM   4429  HB  VAL A 298       9.728  -3.728  -2.011  1.00 23.28           H  \nATOM   4430 HG11 VAL A 298      11.404  -3.329  -3.847  1.00 22.42           H  \nATOM   4431 HG12 VAL A 298      11.547  -4.914  -3.126  1.00 22.42           H  \nATOM   4432 HG13 VAL A 298      10.769  -4.725  -4.700  1.00 22.42           H  \nATOM   4433 HG21 VAL A 298       9.370  -2.008  -3.739  1.00 24.57           H  \nATOM   4434 HG22 VAL A 298       8.568  -3.176  -4.777  1.00 24.57           H  \nATOM   4435 HG23 VAL A 298       7.827  -2.690  -3.264  1.00 24.57           H  \nATOM   4436  N   ILE A 299       9.844  -6.865  -1.466  1.00 27.82           N  \nATOM   4437  CA  ILE A 299      10.501  -8.110  -1.055  1.00 30.85           C  \nATOM   4438  C   ILE A 299       9.614  -9.347  -1.296  1.00 32.84           C  \nATOM   4439  O   ILE A 299      10.116 -10.335  -1.827  1.00 33.53           O  \nATOM   4440  CB  ILE A 299      10.977  -8.048   0.432  1.00 28.95           C  \nATOM   4441  CG1 ILE A 299      12.201  -7.106   0.550  1.00 27.94           C  \nATOM   4442  CG2 ILE A 299      11.256  -9.415   1.115  1.00 27.72           C  \nATOM   4443  CD1 ILE A 299      12.596  -6.762   1.990  1.00 30.35           C  \nATOM   4444  H   ILE A 299       9.659  -6.198  -0.728  1.00 27.82           H  \nATOM   4445  HA  ILE A 299      11.384  -8.225  -1.688  1.00 30.85           H  \nATOM   4446  HB  ILE A 299      10.172  -7.583   1.004  1.00 28.95           H  \nATOM   4447 HG13 ILE A 299      12.011  -6.176   0.014  1.00 27.94           H  \nATOM   4448 HG12 ILE A 299      13.063  -7.544   0.054  1.00 27.94           H  \nATOM   4449 HG21 ILE A 299      11.655  -9.289   2.122  1.00 27.72           H  \nATOM   4450 HG22 ILE A 299      10.348 -10.006   1.228  1.00 27.72           H  \nATOM   4451 HG23 ILE A 299      11.971 -10.018   0.559  1.00 27.72           H  \nATOM   4452 HD11 ILE A 299      12.945  -5.732   2.065  1.00 30.35           H  \nATOM   4453 HD12 ILE A 299      11.750  -6.876   2.664  1.00 30.35           H  \nATOM   4454 HD13 ILE A 299      13.397  -7.412   2.346  1.00 30.35           H  \nATOM   4455  N   THR A 300       8.315  -9.246  -0.964  1.00 33.27           N  \nATOM   4456  CA  THR A 300       7.307 -10.282  -1.203  1.00 34.38           C  \nATOM   4457  C   THR A 300       7.119 -10.599  -2.697  1.00 34.53           C  \nATOM   4458  O   THR A 300       7.111 -11.773  -3.058  1.00 38.06           O  \nATOM   4459  CB  THR A 300       5.925  -9.904  -0.600  1.00 33.97           C  \nATOM   4460  OG1 THR A 300       6.051  -9.752   0.800  1.00 33.69           O  \nATOM   4461  CG2 THR A 300       4.781 -10.901  -0.854  1.00 35.88           C  \nATOM   4462  H   THR A 300       7.983  -8.393  -0.533  1.00 33.27           H  \nATOM   4463  HA  THR A 300       7.659 -11.189  -0.715  1.00 34.38           H  \nATOM   4464  HB  THR A 300       5.617  -8.936  -0.994  1.00 33.97           H  \nATOM   4465  HG1 THR A 300       6.568  -8.957   0.975  1.00 33.69           H  \nATOM   4466 HG21 THR A 300       3.886 -10.623  -0.296  1.00 35.88           H  \nATOM   4467 HG22 THR A 300       4.496 -10.933  -1.905  1.00 35.88           H  \nATOM   4468 HG23 THR A 300       5.058 -11.909  -0.550  1.00 35.88           H  \nATOM   4469  N   ALA A 301       7.025  -9.554  -3.536  1.00 34.90           N  \nATOM   4470  CA  ALA A 301       6.903  -9.676  -4.986  1.00 35.29           C  \nATOM   4471  C   ALA A 301       8.136 -10.310  -5.653  1.00 36.92           C  \nATOM   4472  O   ALA A 301       7.967 -11.109  -6.572  1.00 36.87           O  \nATOM   4473  CB  ALA A 301       6.605  -8.299  -5.592  1.00 33.23           C  \nATOM   4474  H   ALA A 301       7.034  -8.612  -3.168  1.00 34.90           H  \nATOM   4475  HA  ALA A 301       6.048 -10.326  -5.182  1.00 35.29           H  \nATOM   4476  HB1 ALA A 301       6.523  -8.362  -6.676  1.00 33.23           H  \nATOM   4477  HB2 ALA A 301       5.663  -7.898  -5.217  1.00 33.23           H  \nATOM   4478  HB3 ALA A 301       7.389  -7.578  -5.359  1.00 33.23           H  \nATOM   4479  N   LEU A 302       9.341  -9.972  -5.165  1.00 35.19           N  \nATOM   4480  CA  LEU A 302      10.617 -10.501  -5.649  1.00 36.10           C  \nATOM   4481  C   LEU A 302      10.817 -11.994  -5.333  1.00 37.90           C  \nATOM   4482  O   LEU A 302      11.231 -12.731  -6.229  1.00 38.70           O  \nATOM   4483  CB  LEU A 302      11.775  -9.653  -5.082  1.00 33.95           C  \nATOM   4484  CG  LEU A 302      11.927  -8.270  -5.752  1.00 33.02           C  \nATOM   4485  CD1 LEU A 302      12.863  -7.367  -4.932  1.00 30.87           C  \nATOM   4486  CD2 LEU A 302      12.384  -8.368  -7.219  1.00 32.24           C  \nATOM   4487  H   LEU A 302       9.397  -9.297  -4.413  1.00 35.19           H  \nATOM   4488  HA  LEU A 302      10.625 -10.408  -6.735  1.00 36.10           H  \nATOM   4489  HB3 LEU A 302      12.720 -10.188  -5.189  1.00 33.95           H  \nATOM   4490  HB2 LEU A 302      11.626  -9.535  -4.008  1.00 33.95           H  \nATOM   4491  HG  LEU A 302      10.952  -7.786  -5.759  1.00 33.02           H  \nATOM   4492 HD11 LEU A 302      12.589  -6.320  -5.056  1.00 30.87           H  \nATOM   4493 HD12 LEU A 302      12.821  -7.589  -3.866  1.00 30.87           H  \nATOM   4494 HD13 LEU A 302      13.899  -7.481  -5.246  1.00 30.87           H  \nATOM   4495 HD21 LEU A 302      13.063  -7.560  -7.487  1.00 32.24           H  \nATOM   4496 HD22 LEU A 302      12.891  -9.310  -7.427  1.00 32.24           H  \nATOM   4497 HD23 LEU A 302      11.531  -8.303  -7.893  1.00 32.24           H  \nATOM   4498  N   VAL A 303      10.523 -12.413  -4.089  1.00 38.90           N  \nATOM   4499  CA  VAL A 303      10.735 -13.791  -3.625  1.00 41.75           C  \nATOM   4500  C   VAL A 303       9.666 -14.775  -4.143  1.00 43.21           C  \nATOM   4501  O   VAL A 303      10.007 -15.927  -4.411  1.00 42.07           O  \nATOM   4502  CB  VAL A 303      10.807 -13.895  -2.074  1.00 41.73           C  \nATOM   4503  CG1 VAL A 303      11.944 -13.029  -1.510  1.00 42.94           C  \nATOM   4504  CG2 VAL A 303       9.489 -13.646  -1.318  1.00 45.02           C  \nATOM   4505  H   VAL A 303      10.190 -11.752  -3.399  1.00 38.90           H  \nATOM   4506  HA  VAL A 303      11.698 -14.128  -4.015  1.00 41.75           H  \nATOM   4507  HB  VAL A 303      11.085 -14.922  -1.831  1.00 41.73           H  \nATOM   4508 HG11 VAL A 303      11.874 -12.941  -0.429  1.00 42.94           H  \nATOM   4509 HG12 VAL A 303      12.917 -13.453  -1.757  1.00 42.94           H  \nATOM   4510 HG13 VAL A 303      11.931 -12.017  -1.903  1.00 42.94           H  \nATOM   4511 HG21 VAL A 303       9.646 -13.631  -0.239  1.00 45.02           H  \nATOM   4512 HG22 VAL A 303       9.054 -12.694  -1.601  1.00 45.02           H  \nATOM   4513 HG23 VAL A 303       8.753 -14.425  -1.514  1.00 45.02           H  \nATOM   4514  N   GLU A 304       8.419 -14.302  -4.321  1.00 45.70           N  \nATOM   4515  CA  GLU A 304       7.319 -15.062  -4.926  1.00 49.45           C  \nATOM   4516  C   GLU A 304       7.352 -15.055  -6.465  1.00 51.34           C  \nATOM   4517  O   GLU A 304       6.543 -15.753  -7.076  1.00 52.06           O  \nATOM   4518  CB  GLU A 304       5.968 -14.524  -4.409  1.00 49.94           C  \nATOM   4519  CG  GLU A 304       5.766 -14.754  -2.895  1.00 53.37           C  \nATOM   4520  CD  GLU A 304       4.437 -14.240  -2.318  1.00 56.10           C  \nATOM   4521  OE1 GLU A 304       3.721 -13.481  -3.009  1.00 59.28           O  \nATOM   4522  OE2 GLU A 304       4.166 -14.611  -1.154  1.00 56.03           O1-\nATOM   4523  H   GLU A 304       8.204 -13.349  -4.058  1.00 45.70           H  \nATOM   4524  HA  GLU A 304       7.402 -16.106  -4.619  1.00 49.45           H  \nATOM   4525  HB3 GLU A 304       5.148 -15.001  -4.949  1.00 49.94           H  \nATOM   4526  HB2 GLU A 304       5.896 -13.460  -4.641  1.00 49.94           H  \nATOM   4527  HG3 GLU A 304       6.568 -14.277  -2.334  1.00 53.37           H  \nATOM   4528  HG2 GLU A 304       5.842 -15.822  -2.687  1.00 53.37           H  \nATOM   4529  N   ARG A 305       8.267 -14.269  -7.063  1.00 52.96           N  \nATOM   4530  CA  ARG A 305       8.451 -14.085  -8.506  1.00 55.80           C  \nATOM   4531  C   ARG A 305       7.221 -13.496  -9.225  1.00 56.10           C  \nATOM   4532  O   ARG A 305       7.021 -13.758 -10.411  1.00 58.37           O  \nATOM   4533  CB  ARG A 305       8.973 -15.374  -9.180  1.00 56.75           C  \nATOM   4534  CG  ARG A 305      10.239 -15.954  -8.517  1.00 57.95           C  \nATOM   4535  CD  ARG A 305      11.136 -16.732  -9.495  1.00 60.70           C  \nATOM   4536  NE  ARG A 305      11.780 -15.824 -10.464  1.00 64.39           N  \nATOM   4537  CZ  ARG A 305      12.596 -16.142 -11.484  1.00 65.17           C  \nATOM   4538  NH1 ARG A 305      12.973 -17.406 -11.728  1.00 65.84           N  \nATOM   4539  NH2 ARG A 305      13.042 -15.161 -12.279  1.00 65.41           N1+\nATOM   4540  H   ARG A 305       8.893 -13.734  -6.478  1.00 52.96           H  \nATOM   4541  HA  ARG A 305       9.232 -13.330  -8.600  1.00 55.80           H  \nATOM   4542  HB3 ARG A 305       9.176 -15.150 -10.228  1.00 56.75           H  \nATOM   4543  HB2 ARG A 305       8.197 -16.141  -9.195  1.00 56.75           H  \nATOM   4544  HG3 ARG A 305      10.010 -16.547  -7.630  1.00 57.95           H  \nATOM   4545  HG2 ARG A 305      10.817 -15.106  -8.144  1.00 57.95           H  \nATOM   4546  HD3 ARG A 305      10.501 -17.385 -10.095  1.00 60.70           H  \nATOM   4547  HD2 ARG A 305      11.843 -17.377  -8.972  1.00 60.70           H  \nATOM   4548  HE  ARG A 305      11.549 -14.849 -10.341  1.00 64.39           H  \nATOM   4549 HH12 ARG A 305      13.586 -17.624 -12.500  1.00 65.84           H  \nATOM   4550 HH11 ARG A 305      12.642 -18.151 -11.133  1.00 65.84           H  \nATOM   4551 HH22 ARG A 305      13.655 -15.370 -13.054  1.00 65.41           H  \nATOM   4552 HH21 ARG A 305      12.766 -14.204 -12.115  1.00 65.41           H  \nATOM   4553  N   THR A 306       6.430 -12.696  -8.490  1.00 55.97           N  \nATOM   4554  CA  THR A 306       5.245 -11.991  -8.971  1.00 55.57           C  \nATOM   4555  C   THR A 306       5.644 -10.969 -10.065  1.00 54.94           C  \nATOM   4556  O   THR A 306       6.546 -10.170  -9.800  1.00 56.07           O  \nATOM   4557  CB  THR A 306       4.586 -11.200  -7.810  1.00 55.82           C  \nATOM   4558  OG1 THR A 306       4.186 -12.106  -6.799  1.00 55.58           O  \nATOM   4559  CG2 THR A 306       3.334 -10.393  -8.204  1.00 56.42           C  \nATOM   4560  H   THR A 306       6.702 -12.498  -7.537  1.00 55.97           H  \nATOM   4561  HA  THR A 306       4.537 -12.745  -9.307  1.00 55.57           H  \nATOM   4562  HB  THR A 306       5.313 -10.515  -7.373  1.00 55.82           H  \nATOM   4563  HG1 THR A 306       4.963 -12.539  -6.437  1.00 55.58           H  \nATOM   4564 HG21 THR A 306       2.893  -9.910  -7.331  1.00 56.42           H  \nATOM   4565 HG22 THR A 306       3.556  -9.606  -8.922  1.00 56.42           H  \nATOM   4566 HG23 THR A 306       2.573 -11.038  -8.645  1.00 56.42           H  \nATOM   4567  N   PRO A 307       5.012 -11.029 -11.265  1.00 54.81           N  \nATOM   4568  CA  PRO A 307       5.316 -10.129 -12.400  1.00 54.33           C  \nATOM   4569  C   PRO A 307       5.409  -8.623 -12.091  1.00 52.41           C  \nATOM   4570  O   PRO A 307       6.333  -7.975 -12.581  1.00 53.53           O  \nATOM   4571  CB  PRO A 307       4.195 -10.423 -13.411  1.00 54.49           C  \nATOM   4572  CG  PRO A 307       3.832 -11.872 -13.152  1.00 55.69           C  \nATOM   4573  CD  PRO A 307       3.988 -12.008 -11.644  1.00 55.25           C  \nATOM   4574  HA  PRO A 307       6.269 -10.462 -12.816  1.00 54.33           H  \nATOM   4575  HB3 PRO A 307       4.505 -10.254 -14.442  1.00 54.49           H  \nATOM   4576  HB2 PRO A 307       3.323  -9.794 -13.221  1.00 54.49           H  \nATOM   4577  HG3 PRO A 307       4.559 -12.515 -13.650  1.00 55.69           H  \nATOM   4578  HG2 PRO A 307       2.840 -12.145 -13.513  1.00 55.69           H  \nATOM   4579  HD2 PRO A 307       3.055 -11.761 -11.136  1.00 55.25           H  \nATOM   4580  HD3 PRO A 307       4.261 -13.035 -11.403  1.00 55.25           H  \nATOM   4581  N   HIS A 308       4.480  -8.115 -11.264  1.00 49.84           N  \nATOM   4582  CA  HIS A 308       4.475  -6.737 -10.785  1.00 47.05           C  \nATOM   4583  C   HIS A 308       5.226  -6.639  -9.449  1.00 44.45           C  \nATOM   4584  O   HIS A 308       4.877  -7.347  -8.504  1.00 44.53           O  \nATOM   4585  CB  HIS A 308       3.017  -6.256 -10.651  1.00 48.81           C  \nATOM   4586  CG  HIS A 308       2.866  -4.820 -10.204  1.00 50.00           C  \nATOM   4587  ND1 HIS A 308       3.509  -3.758 -10.852  1.00 49.02           N  \nATOM   4588  CD2 HIS A 308       2.134  -4.318  -9.148  1.00 51.40           C  \nATOM   4589  CE1 HIS A 308       3.149  -2.677 -10.172  1.00 50.89           C  \nATOM   4590  NE2 HIS A 308       2.335  -2.949  -9.151  1.00 51.97           N  \nATOM   4591  H   HIS A 308       3.760  -8.716 -10.891  1.00 49.84           H  \nATOM   4592  HA  HIS A 308       4.970  -6.097 -11.520  1.00 47.05           H  \nATOM   4593  HB3 HIS A 308       2.471  -6.894  -9.955  1.00 48.81           H  \nATOM   4594  HB2 HIS A 308       2.511  -6.353 -11.612  1.00 48.81           H  \nATOM   4595  HD2 HIS A 308       1.513  -4.808  -8.413  1.00 51.40           H  \nATOM   4596  HE1 HIS A 308       3.485  -1.681 -10.418  1.00 50.89           H  \nATOM   4597  HE2 HIS A 308       1.946  -2.282  -8.497  1.00 51.97           H  \nATOM   4598  N   VAL A 309       6.210  -5.730  -9.399  1.00 40.26           N  \nATOM   4599  CA  VAL A 309       6.958  -5.388  -8.193  1.00 35.27           C  \nATOM   4600  C   VAL A 309       6.672  -3.893  -7.912  1.00 31.25           C  \nATOM   4601  O   VAL A 309       7.007  -3.063  -8.761  1.00 30.60           O  \nATOM   4602  CB  VAL A 309       8.486  -5.578  -8.400  1.00 34.02           C  \nATOM   4603  CG1 VAL A 309       9.287  -5.234  -7.127  1.00 31.38           C  \nATOM   4604  CG2 VAL A 309       8.829  -7.015  -8.837  1.00 34.36           C  \nATOM   4605  H   VAL A 309       6.421  -5.179 -10.219  1.00 40.26           H  \nATOM   4606  HA  VAL A 309       6.664  -6.036  -7.372  1.00 35.27           H  \nATOM   4607  HB  VAL A 309       8.828  -4.920  -9.200  1.00 34.02           H  \nATOM   4608 HG11 VAL A 309      10.335  -5.511  -7.234  1.00 31.38           H  \nATOM   4609 HG12 VAL A 309       9.256  -4.169  -6.900  1.00 31.38           H  \nATOM   4610 HG13 VAL A 309       8.902  -5.772  -6.261  1.00 31.38           H  \nATOM   4611 HG21 VAL A 309       9.898  -7.121  -9.014  1.00 34.36           H  \nATOM   4612 HG22 VAL A 309       8.543  -7.741  -8.076  1.00 34.36           H  \nATOM   4613 HG23 VAL A 309       8.328  -7.291  -9.764  1.00 34.36           H  \nATOM   4614  N   PRO A 310       6.005  -3.573  -6.776  1.00 30.38           N  \nATOM   4615  CA  PRO A 310       5.485  -2.217  -6.504  1.00 29.30           C  \nATOM   4616  C   PRO A 310       6.547  -1.196  -6.030  1.00 28.73           C  \nATOM   4617  O   PRO A 310       6.369  -0.589  -4.976  1.00 27.93           O  \nATOM   4618  CB  PRO A 310       4.382  -2.493  -5.462  1.00 29.27           C  \nATOM   4619  CG  PRO A 310       4.892  -3.683  -4.673  1.00 29.44           C  \nATOM   4620  CD  PRO A 310       5.557  -4.524  -5.753  1.00 29.54           C  \nATOM   4621  HA  PRO A 310       5.019  -1.802  -7.400  1.00 29.30           H  \nATOM   4622  HB3 PRO A 310       3.462  -2.770  -5.979  1.00 29.27           H  \nATOM   4623  HB2 PRO A 310       4.139  -1.651  -4.814  1.00 29.27           H  \nATOM   4624  HG3 PRO A 310       4.108  -4.216  -4.134  1.00 29.44           H  \nATOM   4625  HG2 PRO A 310       5.635  -3.352  -3.947  1.00 29.44           H  \nATOM   4626  HD2 PRO A 310       6.373  -5.115  -5.340  1.00 29.54           H  \nATOM   4627  HD3 PRO A 310       4.826  -5.203  -6.196  1.00 29.54           H  \nATOM   4628  N   TYR A 311       7.620  -0.987  -6.819  1.00 28.68           N  \nATOM   4629  CA  TYR A 311       8.672   0.003  -6.543  1.00 29.45           C  \nATOM   4630  C   TYR A 311       8.145   1.442  -6.443  1.00 28.70           C  \nATOM   4631  O   TYR A 311       8.620   2.187  -5.594  1.00 24.95           O  \nATOM   4632  CB  TYR A 311       9.757  -0.010  -7.637  1.00 31.49           C  \nATOM   4633  CG  TYR A 311      10.513  -1.304  -7.844  1.00 34.07           C  \nATOM   4634  CD1 TYR A 311      11.369  -1.804  -6.839  1.00 35.28           C  \nATOM   4635  CD2 TYR A 311      10.416  -1.974  -9.080  1.00 36.40           C  \nATOM   4636  CE1 TYR A 311      12.137  -2.959  -7.084  1.00 36.88           C  \nATOM   4637  CE2 TYR A 311      11.189  -3.121  -9.326  1.00 39.34           C  \nATOM   4638  CZ  TYR A 311      12.055  -3.610  -8.332  1.00 38.02           C  \nATOM   4639  OH  TYR A 311      12.803  -4.719  -8.591  1.00 38.99           O  \nATOM   4640  H   TYR A 311       7.717  -1.523  -7.672  1.00 28.68           H  \nATOM   4641  HA  TYR A 311       9.129  -0.259  -5.588  1.00 29.45           H  \nATOM   4642  HB3 TYR A 311      10.508   0.751  -7.414  1.00 31.49           H  \nATOM   4643  HB2 TYR A 311       9.318   0.290  -8.591  1.00 31.49           H  \nATOM   4644  HD1 TYR A 311      11.455  -1.293  -5.891  1.00 35.28           H  \nATOM   4645  HD2 TYR A 311       9.767  -1.597  -9.857  1.00 36.40           H  \nATOM   4646  HE1 TYR A 311      12.791  -3.336  -6.314  1.00 36.88           H  \nATOM   4647  HE2 TYR A 311      11.118  -3.623 -10.280  1.00 39.34           H  \nATOM   4648  HH  TYR A 311      13.397  -4.944  -7.864  1.00 38.99           H  \nATOM   4649  N   ARG A 312       7.188   1.807  -7.311  1.00 28.58           N  \nATOM   4650  CA  ARG A 312       6.659   3.166  -7.431  1.00 28.46           C  \nATOM   4651  C   ARG A 312       5.696   3.596  -6.313  1.00 24.21           C  \nATOM   4652  O   ARG A 312       5.388   4.787  -6.238  1.00 25.31           O  \nATOM   4653  CB  ARG A 312       6.044   3.356  -8.827  1.00 35.11           C  \nATOM   4654  CG  ARG A 312       7.102   3.240  -9.934  1.00 41.09           C  \nATOM   4655  CD  ARG A 312       6.584   3.695 -11.308  1.00 45.95           C  \nATOM   4656  NE  ARG A 312       7.696   3.974 -12.232  1.00 49.55           N  \nATOM   4657  CZ  ARG A 312       8.467   5.079 -12.213  1.00 51.02           C  \nATOM   4658  NH1 ARG A 312       8.266   6.062 -11.323  1.00 53.12           N  \nATOM   4659  NH2 ARG A 312       9.460   5.204 -13.102  1.00 51.89           N1+\nATOM   4660  H   ARG A 312       6.829   1.128  -7.966  1.00 28.58           H  \nATOM   4661  HA  ARG A 312       7.497   3.854  -7.366  1.00 28.46           H  \nATOM   4662  HB3 ARG A 312       5.599   4.351  -8.887  1.00 35.11           H  \nATOM   4663  HB2 ARG A 312       5.231   2.647  -8.994  1.00 35.11           H  \nATOM   4664  HG3 ARG A 312       7.356   2.182 -10.010  1.00 41.09           H  \nATOM   4665  HG2 ARG A 312       8.031   3.744  -9.660  1.00 41.09           H  \nATOM   4666  HD3 ARG A 312       5.854   4.503 -11.250  1.00 45.95           H  \nATOM   4667  HD2 ARG A 312       6.065   2.852 -11.766  1.00 45.95           H  \nATOM   4668  HE  ARG A 312       7.905   3.251 -12.905  1.00 49.55           H  \nATOM   4669 HH12 ARG A 312       8.822   6.911 -11.373  1.00 53.12           H  \nATOM   4670 HH11 ARG A 312       7.512   5.999 -10.656  1.00 53.12           H  \nATOM   4671 HH22 ARG A 312      10.008   6.053 -13.123  1.00 51.89           H  \nATOM   4672 HH21 ARG A 312       9.644   4.480 -13.781  1.00 51.89           H  \nATOM   4673  N   GLU A 313       5.258   2.660  -5.455  1.00 23.86           N  \nATOM   4674  CA  GLU A 313       4.308   2.931  -4.375  1.00 23.27           C  \nATOM   4675  C   GLU A 313       4.916   3.625  -3.136  1.00 22.41           C  \nATOM   4676  O   GLU A 313       4.150   3.962  -2.235  1.00 20.21           O  \nATOM   4677  CB  GLU A 313       3.521   1.649  -4.026  1.00 23.76           C  \nATOM   4678  CG  GLU A 313       2.783   1.049  -5.251  1.00 28.94           C  \nATOM   4679  CD  GLU A 313       1.772  -0.074  -4.958  1.00 31.02           C  \nATOM   4680  OE1 GLU A 313       1.386  -0.741  -5.943  1.00 28.97           O  \nATOM   4681  OE2 GLU A 313       1.392  -0.263  -3.781  1.00 31.90           O1-\nATOM   4682  H   GLU A 313       5.566   1.702  -5.551  1.00 23.86           H  \nATOM   4683  HA  GLU A 313       3.572   3.640  -4.760  1.00 23.27           H  \nATOM   4684  HB3 GLU A 313       2.808   1.881  -3.234  1.00 23.76           H  \nATOM   4685  HB2 GLU A 313       4.197   0.900  -3.617  1.00 23.76           H  \nATOM   4686  HG3 GLU A 313       3.518   0.669  -5.963  1.00 28.94           H  \nATOM   4687  HG2 GLU A 313       2.241   1.842  -5.767  1.00 28.94           H  \nATOM   4688  N   SER A 314       6.237   3.885  -3.112  1.00 21.60           N  \nATOM   4689  CA  SER A 314       6.876   4.691  -2.067  1.00 21.14           C  \nATOM   4690  C   SER A 314       8.168   5.363  -2.542  1.00 20.47           C  \nATOM   4691  O   SER A 314       8.789   4.903  -3.498  1.00 20.55           O  \nATOM   4692  CB  SER A 314       7.115   3.854  -0.795  1.00 20.33           C  \nATOM   4693  OG  SER A 314       8.272   3.039  -0.874  1.00 17.31           O  \nATOM   4694  H   SER A 314       6.828   3.597  -3.879  1.00 21.60           H  \nATOM   4695  HA  SER A 314       6.182   5.497  -1.822  1.00 21.14           H  \nATOM   4696  HB3 SER A 314       6.244   3.259  -0.538  1.00 20.33           H  \nATOM   4697  HB2 SER A 314       7.258   4.536   0.041  1.00 20.33           H  \nATOM   4698  HG  SER A 314       8.167   2.414  -1.599  1.00 17.31           H  \nATOM   4699  N   LYS A 315       8.568   6.408  -1.800  1.00 21.93           N  \nATOM   4700  CA  LYS A 315       9.823   7.142  -1.964  1.00 24.01           C  \nATOM   4701  C   LYS A 315      11.064   6.248  -1.788  1.00 23.64           C  \nATOM   4702  O   LYS A 315      11.952   6.307  -2.637  1.00 23.92           O  \nATOM   4703  CB  LYS A 315       9.868   8.328  -0.972  1.00 25.23           C  \nATOM   4704  CG  LYS A 315       8.738   9.365  -1.122  1.00 30.47           C  \nATOM   4705  CD  LYS A 315       8.782  10.164  -2.430  1.00 34.06           C  \nATOM   4706  CE  LYS A 315       7.603  11.137  -2.569  1.00 40.37           C  \nATOM   4707  NZ  LYS A 315       7.659  11.880  -3.839  1.00 44.85           N1+\nATOM   4708  H   LYS A 315       7.987   6.703  -1.024  1.00 21.93           H  \nATOM   4709  HA  LYS A 315       9.848   7.526  -2.985  1.00 24.01           H  \nATOM   4710  HB3 LYS A 315      10.825   8.844  -1.059  1.00 25.23           H  \nATOM   4711  HB2 LYS A 315       9.831   7.938   0.046  1.00 25.23           H  \nATOM   4712  HG3 LYS A 315       8.799  10.059  -0.283  1.00 30.47           H  \nATOM   4713  HG2 LYS A 315       7.768   8.880  -1.031  1.00 30.47           H  \nATOM   4714  HD3 LYS A 315       8.796   9.486  -3.282  1.00 34.06           H  \nATOM   4715  HD2 LYS A 315       9.714  10.729  -2.450  1.00 34.06           H  \nATOM   4716  HE3 LYS A 315       7.605  11.853  -1.747  1.00 40.37           H  \nATOM   4717  HE2 LYS A 315       6.658  10.593  -2.522  1.00 40.37           H  \nATOM   4718  HZ1 LYS A 315       7.645  11.229  -4.610  1.00 44.85           H  \nATOM   4719  HZ2 LYS A 315       6.864  12.499  -3.902  1.00 44.85           H  \nATOM   4720  HZ3 LYS A 315       8.511  12.422  -3.871  1.00 44.85           H  \nATOM   4721  N   LEU A 316      11.089   5.425  -0.722  1.00 22.60           N  \nATOM   4722  CA  LEU A 316      12.199   4.528  -0.375  1.00 21.91           C  \nATOM   4723  C   LEU A 316      12.537   3.524  -1.485  1.00 21.21           C  \nATOM   4724  O   LEU A 316      13.696   3.436  -1.881  1.00 22.09           O  \nATOM   4725  CB  LEU A 316      11.882   3.800   0.951  1.00 22.01           C  \nATOM   4726  CG  LEU A 316      12.999   2.887   1.506  1.00 23.74           C  \nATOM   4727  CD1 LEU A 316      14.245   3.698   1.908  1.00 23.65           C  \nATOM   4728  CD2 LEU A 316      12.484   2.037   2.680  1.00 21.42           C  \nATOM   4729  H   LEU A 316      10.308   5.422  -0.079  1.00 22.60           H  \nATOM   4730  HA  LEU A 316      13.077   5.158  -0.226  1.00 21.91           H  \nATOM   4731  HB3 LEU A 316      10.970   3.215   0.817  1.00 22.01           H  \nATOM   4732  HB2 LEU A 316      11.655   4.540   1.715  1.00 22.01           H  \nATOM   4733  HG  LEU A 316      13.297   2.177   0.734  1.00 23.74           H  \nATOM   4734 HD11 LEU A 316      14.887   3.140   2.591  1.00 23.65           H  \nATOM   4735 HD12 LEU A 316      14.841   3.954   1.033  1.00 23.65           H  \nATOM   4736 HD13 LEU A 316      13.975   4.631   2.402  1.00 23.65           H  \nATOM   4737 HD21 LEU A 316      12.783   0.994   2.569  1.00 21.42           H  \nATOM   4738 HD22 LEU A 316      12.876   2.398   3.628  1.00 21.42           H  \nATOM   4739 HD23 LEU A 316      11.399   2.052   2.762  1.00 21.42           H  \nATOM   4740  N   THR A 317      11.516   2.793  -1.956  1.00 20.82           N  \nATOM   4741  CA  THR A 317      11.660   1.732  -2.951  1.00 21.01           C  \nATOM   4742  C   THR A 317      11.792   2.248  -4.401  1.00 22.51           C  \nATOM   4743  O   THR A 317      12.246   1.472  -5.239  1.00 24.89           O  \nATOM   4744  CB  THR A 317      10.476   0.741  -2.867  1.00 20.28           C  \nATOM   4745  OG1 THR A 317       9.239   1.389  -3.069  1.00 19.26           O  \nATOM   4746  CG2 THR A 317      10.406   0.013  -1.519  1.00 21.44           C  \nATOM   4747  H   THR A 317      10.584   2.932  -1.588  1.00 20.82           H  \nATOM   4748  HA  THR A 317      12.575   1.177  -2.728  1.00 21.01           H  \nATOM   4749  HB  THR A 317      10.586  -0.012  -3.648  1.00 20.28           H  \nATOM   4750  HG1 THR A 317       9.195   1.713  -3.977  1.00 19.26           H  \nATOM   4751 HG21 THR A 317       9.618  -0.737  -1.530  1.00 21.44           H  \nATOM   4752 HG22 THR A 317      11.343  -0.503  -1.310  1.00 21.44           H  \nATOM   4753 HG23 THR A 317      10.207   0.695  -0.691  1.00 21.44           H  \nATOM   4754  N   ARG A 318      11.474   3.530  -4.672  1.00 24.39           N  \nATOM   4755  CA  ARG A 318      11.843   4.211  -5.922  1.00 24.64           C  \nATOM   4756  C   ARG A 318      13.339   4.554  -5.939  1.00 24.75           C  \nATOM   4757  O   ARG A 318      14.006   4.280  -6.936  1.00 22.73           O  \nATOM   4758  CB  ARG A 318      11.035   5.513  -6.102  1.00 26.49           C  \nATOM   4759  CG  ARG A 318       9.578   5.282  -6.509  1.00 30.67           C  \nATOM   4760  CD  ARG A 318       8.700   6.540  -6.458  1.00 32.24           C  \nATOM   4761  NE  ARG A 318       9.039   7.522  -7.503  1.00 37.00           N  \nATOM   4762  CZ  ARG A 318       8.560   8.777  -7.606  1.00 39.39           C  \nATOM   4763  NH1 ARG A 318       7.674   9.276  -6.730  1.00 42.30           N  \nATOM   4764  NH2 ARG A 318       8.972   9.552  -8.616  1.00 40.43           N1+\nATOM   4765  H   ARG A 318      11.077   4.109  -3.945  1.00 24.39           H  \nATOM   4766  HA  ARG A 318      11.641   3.552  -6.769  1.00 24.64           H  \nATOM   4767  HB3 ARG A 318      11.498   6.121  -6.881  1.00 26.49           H  \nATOM   4768  HB2 ARG A 318      11.080   6.105  -5.188  1.00 26.49           H  \nATOM   4769  HG3 ARG A 318       9.116   4.507  -5.913  1.00 30.67           H  \nATOM   4770  HG2 ARG A 318       9.596   4.898  -7.530  1.00 30.67           H  \nATOM   4771  HD3 ARG A 318       8.892   7.041  -5.508  1.00 32.24           H  \nATOM   4772  HD2 ARG A 318       7.641   6.285  -6.461  1.00 32.24           H  \nATOM   4773  HE  ARG A 318       9.701   7.210  -8.198  1.00 37.00           H  \nATOM   4774 HH12 ARG A 318       7.284  10.196  -6.868  1.00 42.30           H  \nATOM   4775 HH11 ARG A 318       7.321   8.689  -5.984  1.00 42.30           H  \nATOM   4776 HH22 ARG A 318       8.631  10.497  -8.713  1.00 40.43           H  \nATOM   4777 HH21 ARG A 318       9.590   9.185  -9.332  1.00 40.43           H  \nATOM   4778  N   ILE A 319      13.825   5.147  -4.834  1.00 24.38           N  \nATOM   4779  CA  ILE A 319      15.213   5.573  -4.641  1.00 25.59           C  \nATOM   4780  C   ILE A 319      16.201   4.390  -4.594  1.00 25.42           C  \nATOM   4781  O   ILE A 319      17.299   4.508  -5.137  1.00 25.60           O  \nATOM   4782  CB  ILE A 319      15.347   6.455  -3.356  1.00 26.11           C  \nATOM   4783  CG1 ILE A 319      14.636   7.814  -3.564  1.00 27.58           C  \nATOM   4784  CG2 ILE A 319      16.790   6.700  -2.857  1.00 26.26           C  \nATOM   4785  CD1 ILE A 319      14.237   8.535  -2.268  1.00 29.91           C  \nATOM   4786  H   ILE A 319      13.199   5.341  -4.064  1.00 24.38           H  \nATOM   4787  HA  ILE A 319      15.488   6.184  -5.503  1.00 25.59           H  \nATOM   4788  HB  ILE A 319      14.819   5.934  -2.555  1.00 26.11           H  \nATOM   4789 HG13 ILE A 319      13.730   7.674  -4.148  1.00 27.58           H  \nATOM   4790 HG12 ILE A 319      15.266   8.468  -4.166  1.00 27.58           H  \nATOM   4791 HG21 ILE A 319      16.806   7.378  -2.004  1.00 26.26           H  \nATOM   4792 HG22 ILE A 319      17.275   5.783  -2.526  1.00 26.26           H  \nATOM   4793 HG23 ILE A 319      17.406   7.145  -3.639  1.00 26.26           H  \nATOM   4794 HD11 ILE A 319      14.615   9.556  -2.268  1.00 29.91           H  \nATOM   4795 HD12 ILE A 319      13.153   8.602  -2.178  1.00 29.91           H  \nATOM   4796 HD13 ILE A 319      14.606   8.031  -1.374  1.00 29.91           H  \nATOM   4797  N   LEU A 320      15.774   3.273  -3.983  1.00 23.39           N  \nATOM   4798  CA  LEU A 320      16.553   2.046  -3.809  1.00 23.27           C  \nATOM   4799  C   LEU A 320      16.024   0.900  -4.693  1.00 22.23           C  \nATOM   4800  O   LEU A 320      16.201  -0.263  -4.328  1.00 18.72           O  \nATOM   4801  CB  LEU A 320      16.543   1.650  -2.312  1.00 23.58           C  \nATOM   4802  CG  LEU A 320      17.160   2.689  -1.352  1.00 25.87           C  \nATOM   4803  CD1 LEU A 320      16.935   2.246   0.099  1.00 25.90           C  \nATOM   4804  CD2 LEU A 320      18.655   2.952  -1.628  1.00 25.98           C  \nATOM   4805  H   LEU A 320      14.859   3.273  -3.551  1.00 23.39           H  \nATOM   4806  HA  LEU A 320      17.586   2.207  -4.119  1.00 23.27           H  \nATOM   4807  HB3 LEU A 320      17.081   0.713  -2.168  1.00 23.58           H  \nATOM   4808  HB2 LEU A 320      15.514   1.445  -2.012  1.00 23.58           H  \nATOM   4809  HG  LEU A 320      16.623   3.630  -1.471  1.00 25.87           H  \nATOM   4810 HD11 LEU A 320      17.117   3.064   0.796  1.00 25.90           H  \nATOM   4811 HD12 LEU A 320      15.916   1.893   0.258  1.00 25.90           H  \nATOM   4812 HD13 LEU A 320      17.601   1.426   0.358  1.00 25.90           H  \nATOM   4813 HD21 LEU A 320      19.249   2.942  -0.714  1.00 25.98           H  \nATOM   4814 HD22 LEU A 320      19.087   2.205  -2.295  1.00 25.98           H  \nATOM   4815 HD23 LEU A 320      18.799   3.927  -2.093  1.00 25.98           H  \nATOM   4816  N   GLN A 321      15.407   1.223  -5.846  1.00 21.93           N  \nATOM   4817  CA  GLN A 321      14.906   0.249  -6.824  1.00 25.12           C  \nATOM   4818  C   GLN A 321      15.974  -0.748  -7.309  1.00 23.77           C  \nATOM   4819  O   GLN A 321      15.700  -1.947  -7.354  1.00 25.82           O  \nATOM   4820  CB  GLN A 321      14.206   0.987  -7.991  1.00 25.91           C  \nATOM   4821  CG  GLN A 321      13.803   0.080  -9.178  1.00 35.95           C  \nATOM   4822  CD  GLN A 321      12.874   0.714 -10.217  1.00 39.40           C  \nATOM   4823  OE1 GLN A 321      12.394   0.014 -11.104  1.00 43.71           O  \nATOM   4824  NE2 GLN A 321      12.623   2.024 -10.141  1.00 41.83           N  \nATOM   4825  H   GLN A 321      15.287   2.197  -6.086  1.00 21.93           H  \nATOM   4826  HA  GLN A 321      14.142  -0.339  -6.310  1.00 25.12           H  \nATOM   4827  HB3 GLN A 321      14.853   1.786  -8.357  1.00 25.91           H  \nATOM   4828  HB2 GLN A 321      13.316   1.476  -7.595  1.00 25.91           H  \nATOM   4829  HG3 GLN A 321      13.309  -0.815  -8.802  1.00 35.95           H  \nATOM   4830  HG2 GLN A 321      14.693  -0.256  -9.712  1.00 35.95           H  \nATOM   4831 HE22 GLN A 321      12.032   2.464 -10.830  1.00 41.83           H  \nATOM   4832 HE21 GLN A 321      13.039   2.584  -9.411  1.00 41.83           H  \nATOM   4833  N   ASP A 322      17.174  -0.234  -7.626  1.00 25.83           N  \nATOM   4834  CA  ASP A 322      18.310  -1.015  -8.114  1.00 27.25           C  \nATOM   4835  C   ASP A 322      18.931  -1.931  -7.032  1.00 28.86           C  \nATOM   4836  O   ASP A 322      19.571  -2.922  -7.381  1.00 28.79           O  \nATOM   4837  CB  ASP A 322      19.382  -0.093  -8.743  1.00 28.99           C  \nATOM   4838  CG  ASP A 322      20.349  -0.795  -9.709  1.00 32.05           C  \nATOM   4839  OD1 ASP A 322      19.857  -1.492 -10.624  1.00 27.75           O  \nATOM   4840  OD2 ASP A 322      21.569  -0.580  -9.559  1.00 31.15           O1-\nATOM   4841  H   ASP A 322      17.328   0.763  -7.538  1.00 25.83           H  \nATOM   4842  HA  ASP A 322      17.902  -1.664  -8.887  1.00 27.25           H  \nATOM   4843  HB3 ASP A 322      19.936   0.416  -7.951  1.00 28.99           H  \nATOM   4844  HB2 ASP A 322      18.893   0.709  -9.298  1.00 28.99           H  \nATOM   4845  N   SER A 323      18.711  -1.613  -5.746  1.00 28.11           N  \nATOM   4846  CA  SER A 323      19.153  -2.419  -4.602  1.00 26.92           C  \nATOM   4847  C   SER A 323      18.236  -3.628  -4.332  1.00 28.99           C  \nATOM   4848  O   SER A 323      18.616  -4.507  -3.563  1.00 30.38           O  \nATOM   4849  CB  SER A 323      19.220  -1.520  -3.354  1.00 24.83           C  \nATOM   4850  OG  SER A 323      20.107  -0.443  -3.569  1.00 25.15           O  \nATOM   4851  H   SER A 323      18.146  -0.804  -5.528  1.00 28.11           H  \nATOM   4852  HA  SER A 323      20.152  -2.810  -4.795  1.00 26.92           H  \nATOM   4853  HB3 SER A 323      19.580  -2.087  -2.495  1.00 24.83           H  \nATOM   4854  HB2 SER A 323      18.239  -1.134  -3.082  1.00 24.83           H  \nATOM   4855  HG  SER A 323      19.763   0.099  -4.283  1.00 25.15           H  \nATOM   4856  N   LEU A 324      17.047  -3.653  -4.948  1.00 28.47           N  \nATOM   4857  CA  LEU A 324      16.007  -4.642  -4.701  1.00 29.95           C  \nATOM   4858  C   LEU A 324      15.714  -5.360  -6.023  1.00 32.13           C  \nATOM   4859  O   LEU A 324      14.773  -4.995  -6.721  1.00 30.55           O  \nATOM   4860  CB  LEU A 324      14.776  -3.901  -4.127  1.00 26.21           C  \nATOM   4861  CG  LEU A 324      14.992  -3.285  -2.725  1.00 28.34           C  \nATOM   4862  CD1 LEU A 324      13.824  -2.358  -2.345  1.00 24.74           C  \nATOM   4863  CD2 LEU A 324      15.268  -4.347  -1.641  1.00 26.31           C  \nATOM   4864  H   LEU A 324      16.799  -2.905  -5.582  1.00 28.47           H  \nATOM   4865  HA  LEU A 324      16.330  -5.402  -3.987  1.00 29.95           H  \nATOM   4866  HB3 LEU A 324      13.923  -4.579  -4.082  1.00 26.21           H  \nATOM   4867  HB2 LEU A 324      14.495  -3.107  -4.820  1.00 26.21           H  \nATOM   4868  HG  LEU A 324      15.870  -2.640  -2.778  1.00 28.34           H  \nATOM   4869 HD11 LEU A 324      14.170  -1.530  -1.725  1.00 24.74           H  \nATOM   4870 HD12 LEU A 324      13.347  -1.919  -3.223  1.00 24.74           H  \nATOM   4871 HD13 LEU A 324      13.049  -2.890  -1.795  1.00 24.74           H  \nATOM   4872 HD21 LEU A 324      14.682  -4.177  -0.738  1.00 26.31           H  \nATOM   4873 HD22 LEU A 324      15.038  -5.356  -1.986  1.00 26.31           H  \nATOM   4874 HD23 LEU A 324      16.319  -4.334  -1.347  1.00 26.31           H  \nATOM   4875  N   GLY A 325      16.541  -6.365  -6.353  1.00 33.04           N  \nATOM   4876  CA  GLY A 325      16.398  -7.173  -7.566  1.00 35.57           C  \nATOM   4877  C   GLY A 325      17.047  -6.528  -8.804  1.00 36.92           C  \nATOM   4878  O   GLY A 325      16.805  -6.999  -9.916  1.00 37.76           O  \nATOM   4879  H   GLY A 325      17.297  -6.616  -5.731  1.00 33.04           H  \nATOM   4880  HA3 GLY A 325      15.348  -7.383  -7.772  1.00 35.57           H  \nATOM   4881  HA2 GLY A 325      16.874  -8.131  -7.383  1.00 35.57           H  \nATOM   4882  N   GLY A 326      17.848  -5.463  -8.629  1.00 36.99           N  \nATOM   4883  CA  GLY A 326      18.547  -4.767  -9.708  1.00 35.83           C  \nATOM   4884  C   GLY A 326      20.015  -5.204  -9.764  1.00 36.25           C  \nATOM   4885  O   GLY A 326      20.351  -6.339  -9.431  1.00 36.30           O  \nATOM   4886  H   GLY A 326      18.015  -5.127  -7.692  1.00 36.99           H  \nATOM   4887  HA3 GLY A 326      18.475  -3.698  -9.542  1.00 35.83           H  \nATOM   4888  HA2 GLY A 326      18.087  -4.949 -10.679  1.00 35.83           H  \nATOM   4889  N   ARG A 327      20.876  -4.291 -10.238  1.00 34.63           N  \nATOM   4890  CA  ARG A 327      22.294  -4.513 -10.534  1.00 36.55           C  \nATOM   4891  C   ARG A 327      23.259  -4.020  -9.437  1.00 36.94           C  \nATOM   4892  O   ARG A 327      24.462  -3.961  -9.692  1.00 38.93           O  \nATOM   4893  CB  ARG A 327      22.628  -3.865 -11.892  1.00 38.14           C  \nATOM   4894  CG  ARG A 327      21.859  -4.470 -13.075  1.00 42.41           C  \nATOM   4895  CD  ARG A 327      22.327  -3.867 -14.405  1.00 46.96           C  \nATOM   4896  NE  ARG A 327      21.543  -4.365 -15.547  1.00 51.13           N  \nATOM   4897  CZ  ARG A 327      21.654  -3.970 -16.830  1.00 54.30           C  \nATOM   4898  NH1 ARG A 327      22.509  -3.008 -17.211  1.00 55.38           N  \nATOM   4899  NH2 ARG A 327      20.886  -4.556 -17.757  1.00 54.29           N1+\nATOM   4900  H   ARG A 327      20.530  -3.364 -10.461  1.00 34.63           H  \nATOM   4901  HA  ARG A 327      22.468  -5.583 -10.626  1.00 36.55           H  \nATOM   4902  HB3 ARG A 327      23.692  -3.980 -12.104  1.00 38.14           H  \nATOM   4903  HB2 ARG A 327      22.442  -2.791 -11.843  1.00 38.14           H  \nATOM   4904  HG3 ARG A 327      20.777  -4.393 -12.959  1.00 42.41           H  \nATOM   4905  HG2 ARG A 327      22.092  -5.536 -13.080  1.00 42.41           H  \nATOM   4906  HD3 ARG A 327      23.346  -4.210 -14.594  1.00 46.96           H  \nATOM   4907  HD2 ARG A 327      22.365  -2.778 -14.361  1.00 46.96           H  \nATOM   4908  HE  ARG A 327      20.874  -5.088 -15.328  1.00 51.13           H  \nATOM   4909 HH12 ARG A 327      22.580  -2.730 -18.179  1.00 55.38           H  \nATOM   4910 HH11 ARG A 327      23.098  -2.558 -16.525  1.00 55.38           H  \nATOM   4911 HH22 ARG A 327      20.956  -4.279 -18.726  1.00 54.29           H  \nATOM   4912 HH21 ARG A 327      20.236  -5.284 -17.501  1.00 54.29           H  \nATOM   4913  N   THR A 328      22.747  -3.688  -8.245  1.00 34.16           N  \nATOM   4914  CA  THR A 328      23.559  -3.342  -7.077  1.00 31.72           C  \nATOM   4915  C   THR A 328      23.710  -4.595  -6.192  1.00 30.02           C  \nATOM   4916  O   THR A 328      22.729  -5.311  -5.995  1.00 30.34           O  \nATOM   4917  CB  THR A 328      22.844  -2.225  -6.270  1.00 31.13           C  \nATOM   4918  OG1 THR A 328      22.993  -0.998  -6.956  1.00 32.46           O  \nATOM   4919  CG2 THR A 328      23.300  -1.990  -4.826  1.00 28.96           C  \nATOM   4920  H   THR A 328      21.749  -3.742  -8.095  1.00 34.16           H  \nATOM   4921  HA  THR A 328      24.548  -2.990  -7.375  1.00 31.72           H  \nATOM   4922  HB  THR A 328      21.779  -2.434  -6.245  1.00 31.13           H  \nATOM   4923  HG1 THR A 328      22.532  -1.051  -7.801  1.00 32.46           H  \nATOM   4924 HG21 THR A 328      22.845  -1.086  -4.430  1.00 28.96           H  \nATOM   4925 HG22 THR A 328      23.018  -2.808  -4.165  1.00 28.96           H  \nATOM   4926 HG23 THR A 328      24.376  -1.865  -4.778  1.00 28.96           H  \nATOM   4927  N   ARG A 329      24.920  -4.825  -5.647  1.00 29.31           N  \nATOM   4928  CA  ARG A 329      25.159  -5.848  -4.622  1.00 29.30           C  \nATOM   4929  C   ARG A 329      24.519  -5.399  -3.301  1.00 26.80           C  \nATOM   4930  O   ARG A 329      24.894  -4.345  -2.795  1.00 29.25           O  \nATOM   4931  CB  ARG A 329      26.676  -6.102  -4.459  1.00 30.11           C  \nATOM   4932  CG  ARG A 329      27.028  -7.054  -3.295  1.00 31.58           C  \nATOM   4933  CD  ARG A 329      28.530  -7.319  -3.128  1.00 32.48           C  \nATOM   4934  NE  ARG A 329      28.805  -8.080  -1.897  1.00 36.20           N  \nATOM   4935  CZ  ARG A 329      29.960  -8.660  -1.517  1.00 37.53           C  \nATOM   4936  NH1 ARG A 329      31.079  -8.578  -2.250  1.00 35.50           N  \nATOM   4937  NH2 ARG A 329      29.991  -9.349  -0.370  1.00 37.85           N1+\nATOM   4938  H   ARG A 329      25.689  -4.196  -5.843  1.00 29.31           H  \nATOM   4939  HA  ARG A 329      24.692  -6.783  -4.941  1.00 29.30           H  \nATOM   4940  HB3 ARG A 329      27.182  -5.151  -4.296  1.00 30.11           H  \nATOM   4941  HB2 ARG A 329      27.075  -6.500  -5.392  1.00 30.11           H  \nATOM   4942  HG3 ARG A 329      26.549  -8.003  -3.543  1.00 31.58           H  \nATOM   4943  HG2 ARG A 329      26.599  -6.744  -2.344  1.00 31.58           H  \nATOM   4944  HD3 ARG A 329      29.129  -6.411  -3.215  1.00 32.48           H  \nATOM   4945  HD2 ARG A 329      28.828  -7.985  -3.937  1.00 32.48           H  \nATOM   4946  HE  ARG A 329      28.011  -8.160  -1.272  1.00 36.20           H  \nATOM   4947 HH12 ARG A 329      31.942  -8.995  -1.935  1.00 35.50           H  \nATOM   4948 HH11 ARG A 329      31.068  -8.087  -3.140  1.00 35.50           H  \nATOM   4949 HH22 ARG A 329      30.850  -9.774  -0.052  1.00 37.85           H  \nATOM   4950 HH21 ARG A 329      29.159  -9.437   0.200  1.00 37.85           H  \nATOM   4951  N   THR A 330      23.585  -6.195  -2.764  1.00 27.34           N  \nATOM   4952  CA  THR A 330      22.833  -5.805  -1.574  1.00 27.33           C  \nATOM   4953  C   THR A 330      22.998  -6.817  -0.436  1.00 28.41           C  \nATOM   4954  O   THR A 330      22.941  -8.026  -0.661  1.00 25.07           O  \nATOM   4955  CB  THR A 330      21.336  -5.609  -1.892  1.00 28.09           C  \nATOM   4956  OG1 THR A 330      21.251  -4.518  -2.784  1.00 26.38           O  \nATOM   4957  CG2 THR A 330      20.423  -5.299  -0.692  1.00 25.58           C  \nATOM   4958  H   THR A 330      23.317  -7.057  -3.217  1.00 27.34           H  \nATOM   4959  HA  THR A 330      23.184  -4.846  -1.209  1.00 27.33           H  \nATOM   4960  HB  THR A 330      20.953  -6.483  -2.414  1.00 28.09           H  \nATOM   4961  HG1 THR A 330      20.321  -4.374  -2.990  1.00 26.38           H  \nATOM   4962 HG21 THR A 330      19.409  -5.070  -1.018  1.00 25.58           H  \nATOM   4963 HG22 THR A 330      20.346  -6.139  -0.003  1.00 25.58           H  \nATOM   4964 HG23 THR A 330      20.795  -4.440  -0.132  1.00 25.58           H  \nATOM   4965  N   SER A 331      23.172  -6.258   0.770  1.00 29.22           N  \nATOM   4966  CA  SER A 331      23.208  -6.960   2.044  1.00 28.06           C  \nATOM   4967  C   SER A 331      22.117  -6.397   2.968  1.00 27.09           C  \nATOM   4968  O   SER A 331      21.711  -5.247   2.801  1.00 26.08           O  \nATOM   4969  CB  SER A 331      24.594  -6.766   2.691  1.00 30.03           C  \nATOM   4970  OG  SER A 331      25.566  -7.557   2.044  1.00 34.99           O  \nATOM   4971  H   SER A 331      23.211  -5.249   0.838  1.00 29.22           H  \nATOM   4972  HA  SER A 331      23.008  -8.013   1.876  1.00 28.06           H  \nATOM   4973  HB3 SER A 331      24.578  -7.064   3.740  1.00 30.03           H  \nATOM   4974  HB2 SER A 331      24.898  -5.719   2.665  1.00 30.03           H  \nATOM   4975  HG  SER A 331      25.398  -8.478   2.258  1.00 34.99           H  \nATOM   4976  N   ILE A 332      21.676  -7.210   3.940  1.00 26.63           N  \nATOM   4977  CA  ILE A 332      20.734  -6.799   4.982  1.00 25.76           C  \nATOM   4978  C   ILE A 332      21.270  -7.288   6.338  1.00 25.56           C  \nATOM   4979  O   ILE A 332      21.546  -8.477   6.483  1.00 25.03           O  \nATOM   4980  CB  ILE A 332      19.301  -7.385   4.767  1.00 25.98           C  \nATOM   4981  CG1 ILE A 332      18.706  -6.971   3.397  1.00 25.58           C  \nATOM   4982  CG2 ILE A 332      18.322  -7.013   5.910  1.00 24.93           C  \nATOM   4983  CD1 ILE A 332      17.372  -7.647   3.060  1.00 24.29           C  \nATOM   4984  H   ILE A 332      22.042  -8.151   4.015  1.00 26.63           H  \nATOM   4985  HA  ILE A 332      20.665  -5.712   5.022  1.00 25.76           H  \nATOM   4986  HB  ILE A 332      19.387  -8.473   4.759  1.00 25.98           H  \nATOM   4987 HG13 ILE A 332      19.402  -7.207   2.594  1.00 25.58           H  \nATOM   4988 HG12 ILE A 332      18.567  -5.893   3.361  1.00 25.58           H  \nATOM   4989 HG21 ILE A 332      17.328  -7.427   5.742  1.00 24.93           H  \nATOM   4990 HG22 ILE A 332      18.640  -7.398   6.879  1.00 24.93           H  \nATOM   4991 HG23 ILE A 332      18.217  -5.931   6.002  1.00 24.93           H  \nATOM   4992 HD11 ILE A 332      17.191  -7.638   1.985  1.00 24.29           H  \nATOM   4993 HD12 ILE A 332      17.363  -8.684   3.392  1.00 24.29           H  \nATOM   4994 HD13 ILE A 332      16.534  -7.133   3.532  1.00 24.29           H  \nATOM   4995  N   ILE A 333      21.373  -6.369   7.310  1.00 23.67           N  \nATOM   4996  CA  ILE A 333      21.724  -6.674   8.694  1.00 22.02           C  \nATOM   4997  C   ILE A 333      20.440  -6.573   9.539  1.00 22.07           C  \nATOM   4998  O   ILE A 333      19.974  -5.473   9.831  1.00 19.54           O  \nATOM   4999  CB  ILE A 333      22.815  -5.724   9.275  1.00 22.12           C  \nATOM   5000  CG1 ILE A 333      24.092  -5.708   8.397  1.00 19.60           C  \nATOM   5001  CG2 ILE A 333      23.164  -6.116  10.732  1.00 21.06           C  \nATOM   5002  CD1 ILE A 333      25.101  -4.611   8.762  1.00 20.16           C  \nATOM   5003  H   ILE A 333      21.156  -5.400   7.112  1.00 23.67           H  \nATOM   5004  HA  ILE A 333      22.112  -7.688   8.772  1.00 22.02           H  \nATOM   5005  HB  ILE A 333      22.423  -4.704   9.285  1.00 22.12           H  \nATOM   5006 HG13 ILE A 333      23.830  -5.571   7.348  1.00 19.60           H  \nATOM   5007 HG12 ILE A 333      24.590  -6.673   8.455  1.00 19.60           H  \nATOM   5008 HG21 ILE A 333      24.005  -5.553  11.122  1.00 21.06           H  \nATOM   5009 HG22 ILE A 333      22.333  -5.948  11.417  1.00 21.06           H  \nATOM   5010 HG23 ILE A 333      23.435  -7.170  10.800  1.00 21.06           H  \nATOM   5011 HD11 ILE A 333      25.798  -4.441   7.943  1.00 20.16           H  \nATOM   5012 HD12 ILE A 333      24.605  -3.663   8.976  1.00 20.16           H  \nATOM   5013 HD13 ILE A 333      25.694  -4.891   9.633  1.00 20.16           H  \nATOM   5014  N   ALA A 334      19.885  -7.739   9.893  1.00 19.22           N  \nATOM   5015  CA  ALA A 334      18.684  -7.884  10.708  1.00 21.48           C  \nATOM   5016  C   ALA A 334      19.051  -7.877  12.199  1.00 23.05           C  \nATOM   5017  O   ALA A 334      19.550  -8.875  12.713  1.00 22.81           O  \nATOM   5018  CB  ALA A 334      17.975  -9.180  10.297  1.00 20.70           C  \nATOM   5019  H   ALA A 334      20.340  -8.603   9.622  1.00 19.22           H  \nATOM   5020  HA  ALA A 334      17.999  -7.067  10.492  1.00 21.48           H  \nATOM   5021  HB1 ALA A 334      17.090  -9.364  10.906  1.00 20.70           H  \nATOM   5022  HB2 ALA A 334      17.653  -9.122   9.257  1.00 20.70           H  \nATOM   5023  HB3 ALA A 334      18.631 -10.046  10.386  1.00 20.70           H  \nATOM   5024  N   THR A 335      18.818  -6.745  12.873  1.00 22.98           N  \nATOM   5025  CA  THR A 335      19.144  -6.551  14.283  1.00 22.61           C  \nATOM   5026  C   THR A 335      17.963  -6.989  15.178  1.00 23.15           C  \nATOM   5027  O   THR A 335      16.813  -6.705  14.845  1.00 20.17           O  \nATOM   5028  CB  THR A 335      19.513  -5.071  14.550  1.00 24.16           C  \nATOM   5029  OG1 THR A 335      18.447  -4.191  14.261  1.00 25.56           O  \nATOM   5030  CG2 THR A 335      20.736  -4.617  13.739  1.00 21.73           C  \nATOM   5031  H   THR A 335      18.379  -5.959  12.407  1.00 22.98           H  \nATOM   5032  HA  THR A 335      20.018  -7.151  14.513  1.00 22.61           H  \nATOM   5033  HB  THR A 335      19.746  -4.953  15.609  1.00 24.16           H  \nATOM   5034  HG1 THR A 335      17.770  -4.296  14.940  1.00 25.56           H  \nATOM   5035 HG21 THR A 335      21.008  -3.591  13.976  1.00 21.73           H  \nATOM   5036 HG22 THR A 335      21.604  -5.240  13.954  1.00 21.73           H  \nATOM   5037 HG23 THR A 335      20.550  -4.660  12.666  1.00 21.73           H  \nATOM   5038  N   ILE A 336      18.265  -7.699  16.280  1.00 21.79           N  \nATOM   5039  CA  ILE A 336      17.268  -8.275  17.194  1.00 23.08           C  \nATOM   5040  C   ILE A 336      17.679  -8.119  18.672  1.00 23.78           C  \nATOM   5041  O   ILE A 336      18.863  -7.976  18.979  1.00 23.15           O  \nATOM   5042  CB  ILE A 336      17.006  -9.791  16.908  1.00 23.04           C  \nATOM   5043  CG1 ILE A 336      18.258 -10.693  17.057  1.00 23.18           C  \nATOM   5044  CG2 ILE A 336      16.309  -9.996  15.549  1.00 22.42           C  \nATOM   5045  CD1 ILE A 336      17.981 -12.195  16.922  1.00 22.53           C  \nATOM   5046  H   ILE A 336      19.233  -7.901  16.497  1.00 21.79           H  \nATOM   5047  HA  ILE A 336      16.329  -7.733  17.086  1.00 23.08           H  \nATOM   5048  HB  ILE A 336      16.289 -10.135  17.656  1.00 23.04           H  \nATOM   5049 HG13 ILE A 336      18.712 -10.544  18.034  1.00 23.18           H  \nATOM   5050 HG12 ILE A 336      19.011 -10.404  16.323  1.00 23.18           H  \nATOM   5051 HG21 ILE A 336      15.961 -11.021  15.422  1.00 22.42           H  \nATOM   5052 HG22 ILE A 336      15.432  -9.356  15.458  1.00 22.42           H  \nATOM   5053 HG23 ILE A 336      16.976  -9.770  14.716  1.00 22.42           H  \nATOM   5054 HD11 ILE A 336      18.867 -12.770  17.186  1.00 22.53           H  \nATOM   5055 HD12 ILE A 336      17.172 -12.513  17.580  1.00 22.53           H  \nATOM   5056 HD13 ILE A 336      17.714 -12.465  15.900  1.00 22.53           H  \nATOM   5057  N   SER A 337      16.668  -8.167  19.555  1.00 25.88           N  \nATOM   5058  CA  SER A 337      16.814  -8.197  21.010  1.00 27.99           C  \nATOM   5059  C   SER A 337      16.876  -9.661  21.508  1.00 28.21           C  \nATOM   5060  O   SER A 337      16.176 -10.506  20.948  1.00 24.65           O  \nATOM   5061  CB  SER A 337      15.593  -7.484  21.625  1.00 29.04           C  \nATOM   5062  OG  SER A 337      15.634  -7.507  23.039  1.00 32.61           O  \nATOM   5063  H   SER A 337      15.721  -8.266  19.211  1.00 25.88           H  \nATOM   5064  HA  SER A 337      17.712  -7.637  21.272  1.00 27.99           H  \nATOM   5065  HB3 SER A 337      14.664  -7.951  21.296  1.00 29.04           H  \nATOM   5066  HB2 SER A 337      15.554  -6.443  21.309  1.00 29.04           H  \nATOM   5067  HG  SER A 337      14.790  -7.178  23.372  1.00 32.61           H  \nATOM   5068  N   PRO A 338      17.658  -9.931  22.578  1.00 30.07           N  \nATOM   5069  CA  PRO A 338      17.649 -11.235  23.264  1.00 31.62           C  \nATOM   5070  C   PRO A 338      16.479 -11.459  24.246  1.00 32.46           C  \nATOM   5071  O   PRO A 338      16.252 -12.608  24.622  1.00 33.11           O  \nATOM   5072  CB  PRO A 338      18.993 -11.243  24.008  1.00 30.65           C  \nATOM   5073  CG  PRO A 338      19.242  -9.783  24.348  1.00 32.34           C  \nATOM   5074  CD  PRO A 338      18.653  -9.031  23.162  1.00 30.98           C  \nATOM   5075  HA  PRO A 338      17.639 -12.047  22.539  1.00 31.62           H  \nATOM   5076  HB3 PRO A 338      19.779 -11.612  23.350  1.00 30.65           H  \nATOM   5077  HB2 PRO A 338      19.001 -11.869  24.901  1.00 30.65           H  \nATOM   5078  HG3 PRO A 338      20.290  -9.549  24.539  1.00 32.34           H  \nATOM   5079  HG2 PRO A 338      18.678  -9.521  25.242  1.00 32.34           H  \nATOM   5080  HD2 PRO A 338      18.230  -8.078  23.479  1.00 30.98           H  \nATOM   5081  HD3 PRO A 338      19.414  -8.834  22.409  1.00 30.98           H  \nATOM   5082  N   ALA A 339      15.796 -10.384  24.679  1.00 30.89           N  \nATOM   5083  CA  ALA A 339      14.817 -10.410  25.770  1.00 29.88           C  \nATOM   5084  C   ALA A 339      13.478 -11.059  25.385  1.00 31.52           C  \nATOM   5085  O   ALA A 339      12.995 -10.862  24.270  1.00 27.09           O  \nATOM   5086  CB  ALA A 339      14.592  -8.976  26.268  1.00 31.10           C  \nATOM   5087  H   ALA A 339      16.020  -9.470  24.309  1.00 30.89           H  \nATOM   5088  HA  ALA A 339      15.253 -10.985  26.590  1.00 29.88           H  \nATOM   5089  HB1 ALA A 339      13.924  -8.954  27.129  1.00 31.10           H  \nATOM   5090  HB2 ALA A 339      15.531  -8.512  26.572  1.00 31.10           H  \nATOM   5091  HB3 ALA A 339      14.154  -8.349  25.494  1.00 31.10           H  \nATOM   5092  N   SER A 340      12.893 -11.791  26.348  1.00 31.98           N  \nATOM   5093  CA  SER A 340      11.622 -12.516  26.238  1.00 34.26           C  \nATOM   5094  C   SER A 340      10.394 -11.650  25.894  1.00 34.39           C  \nATOM   5095  O   SER A 340       9.469 -12.153  25.256  1.00 35.26           O  \nATOM   5096  CB  SER A 340      11.413 -13.321  27.535  1.00 34.41           C  \nATOM   5097  OG  SER A 340      11.082 -12.502  28.641  1.00 35.04           O  \nATOM   5098  H   SER A 340      13.360 -11.883  27.239  1.00 31.98           H  \nATOM   5099  HA  SER A 340      11.743 -13.233  25.427  1.00 34.26           H  \nATOM   5100  HB3 SER A 340      12.316 -13.879  27.777  1.00 34.41           H  \nATOM   5101  HB2 SER A 340      10.617 -14.054  27.398  1.00 34.41           H  \nATOM   5102  HG  SER A 340      10.189 -12.168  28.521  1.00 35.04           H  \nATOM   5103  N   LEU A 341      10.421 -10.371  26.305  1.00 35.73           N  \nATOM   5104  CA  LEU A 341       9.390  -9.361  26.045  1.00 37.29           C  \nATOM   5105  C   LEU A 341       9.254  -8.984  24.558  1.00 36.72           C  \nATOM   5106  O   LEU A 341       8.204  -8.476  24.163  1.00 36.23           O  \nATOM   5107  CB  LEU A 341       9.729  -8.094  26.862  1.00 41.08           C  \nATOM   5108  CG  LEU A 341       9.662  -8.271  28.396  1.00 46.36           C  \nATOM   5109  CD1 LEU A 341      10.236  -7.035  29.119  1.00 46.09           C  \nATOM   5110  CD2 LEU A 341       8.241  -8.625  28.883  1.00 46.76           C  \nATOM   5111  H   LEU A 341      11.225 -10.048  26.824  1.00 35.73           H  \nATOM   5112  HA  LEU A 341       8.429  -9.764  26.365  1.00 37.29           H  \nATOM   5113  HB3 LEU A 341       9.056  -7.281  26.583  1.00 41.08           H  \nATOM   5114  HB2 LEU A 341      10.728  -7.758  26.579  1.00 41.08           H  \nATOM   5115  HG  LEU A 341      10.314  -9.105  28.661  1.00 46.36           H  \nATOM   5116 HD11 LEU A 341      10.936  -7.335  29.901  1.00 46.09           H  \nATOM   5117 HD12 LEU A 341      10.780  -6.377  28.440  1.00 46.09           H  \nATOM   5118 HD13 LEU A 341       9.462  -6.429  29.590  1.00 46.09           H  \nATOM   5119 HD21 LEU A 341       7.937  -8.041  29.752  1.00 46.76           H  \nATOM   5120 HD22 LEU A 341       7.490  -8.459  28.110  1.00 46.76           H  \nATOM   5121 HD23 LEU A 341       8.185  -9.675  29.171  1.00 46.76           H  \nATOM   5122  N   ASN A 342      10.316  -9.227  23.776  1.00 33.70           N  \nATOM   5123  CA  ASN A 342      10.427  -8.851  22.369  1.00 33.45           C  \nATOM   5124  C   ASN A 342      10.262 -10.054  21.427  1.00 33.28           C  \nATOM   5125  O   ASN A 342      10.554  -9.897  20.245  1.00 31.23           O  \nATOM   5126  CB  ASN A 342      11.779  -8.136  22.130  1.00 34.11           C  \nATOM   5127  CG  ASN A 342      12.017  -6.929  23.046  1.00 35.86           C  \nATOM   5128  OD1 ASN A 342      12.997  -6.893  23.782  1.00 37.36           O  \nATOM   5129  ND2 ASN A 342      11.125  -5.939  23.021  1.00 39.01           N  \nATOM   5130  H   ASN A 342      11.134  -9.666  24.178  1.00 33.70           H  \nATOM   5131  HA  ASN A 342       9.627  -8.170  22.080  1.00 33.45           H  \nATOM   5132  HB3 ASN A 342      11.852  -7.793  21.099  1.00 34.11           H  \nATOM   5133  HB2 ASN A 342      12.598  -8.843  22.271  1.00 34.11           H  \nATOM   5134 HD22 ASN A 342      11.256  -5.129  23.609  1.00 39.01           H  \nATOM   5135 HD21 ASN A 342      10.298  -6.000  22.443  1.00 39.01           H  \nATOM   5136  N   LEU A 343       9.791 -11.209  21.939  1.00 32.73           N  \nATOM   5137  CA  LEU A 343       9.600 -12.474  21.216  1.00 31.59           C  \nATOM   5138  C   LEU A 343       8.869 -12.338  19.870  1.00 31.46           C  \nATOM   5139  O   LEU A 343       9.404 -12.795  18.863  1.00 31.83           O  \nATOM   5140  CB  LEU A 343       8.906 -13.497  22.150  1.00 31.98           C  \nATOM   5141  CG  LEU A 343       8.491 -14.860  21.533  1.00 32.11           C  \nATOM   5142  CD1 LEU A 343       9.664 -15.621  20.892  1.00 31.95           C  \nATOM   5143  CD2 LEU A 343       7.759 -15.739  22.565  1.00 37.07           C  \nATOM   5144  H   LEU A 343       9.558 -11.238  22.922  1.00 32.73           H  \nATOM   5145  HA  LEU A 343      10.604 -12.840  20.998  1.00 31.59           H  \nATOM   5146  HB3 LEU A 343       8.012 -13.029  22.565  1.00 31.98           H  \nATOM   5147  HB2 LEU A 343       9.557 -13.686  23.004  1.00 31.98           H  \nATOM   5148  HG  LEU A 343       7.767 -14.660  20.743  1.00 32.11           H  \nATOM   5149 HD11 LEU A 343       9.305 -16.462  20.300  1.00 31.95           H  \nATOM   5150 HD12 LEU A 343      10.257 -14.991  20.231  1.00 31.95           H  \nATOM   5151 HD13 LEU A 343      10.335 -16.021  21.647  1.00 31.95           H  \nATOM   5152 HD21 LEU A 343       6.801 -16.084  22.174  1.00 37.07           H  \nATOM   5153 HD22 LEU A 343       8.337 -16.621  22.838  1.00 37.07           H  \nATOM   5154 HD23 LEU A 343       7.554 -15.199  23.490  1.00 37.07           H  \nATOM   5155  N   GLU A 344       7.684 -11.703  19.875  1.00 32.34           N  \nATOM   5156  CA  GLU A 344       6.853 -11.503  18.686  1.00 30.85           C  \nATOM   5157  C   GLU A 344       7.560 -10.700  17.578  1.00 28.00           C  \nATOM   5158  O   GLU A 344       7.491 -11.098  16.416  1.00 28.52           O  \nATOM   5159  CB  GLU A 344       5.503 -10.883  19.105  1.00 33.98           C  \nATOM   5160  CG  GLU A 344       4.516 -10.626  17.938  1.00 42.77           C  \nATOM   5161  CD  GLU A 344       3.134 -10.090  18.346  1.00 47.25           C  \nATOM   5162  OE1 GLU A 344       2.268 -10.053  17.443  1.00 48.91           O  \nATOM   5163  OE2 GLU A 344       2.947  -9.717  19.527  1.00 49.27           O1-\nATOM   5164  H   GLU A 344       7.318 -11.337  20.745  1.00 32.34           H  \nATOM   5165  HA  GLU A 344       6.644 -12.494  18.278  1.00 30.85           H  \nATOM   5166  HB3 GLU A 344       5.691  -9.947  19.635  1.00 33.98           H  \nATOM   5167  HB2 GLU A 344       5.029 -11.549  19.828  1.00 33.98           H  \nATOM   5168  HG3 GLU A 344       4.377 -11.553  17.380  1.00 42.77           H  \nATOM   5169  HG2 GLU A 344       4.942  -9.905  17.239  1.00 42.77           H  \nATOM   5170  N   GLU A 345       8.252  -9.617  17.970  1.00 25.97           N  \nATOM   5171  CA  GLU A 345       8.998  -8.749  17.059  1.00 27.03           C  \nATOM   5172  C   GLU A 345      10.326  -9.344  16.580  1.00 26.23           C  \nATOM   5173  O   GLU A 345      10.704  -9.108  15.435  1.00 23.96           O  \nATOM   5174  CB  GLU A 345       9.219  -7.366  17.704  1.00 27.74           C  \nATOM   5175  CG  GLU A 345       7.931  -6.605  18.094  1.00 31.24           C  \nATOM   5176  CD  GLU A 345       6.999  -6.187  16.946  1.00 33.29           C  \nATOM   5177  OE1 GLU A 345       5.950  -5.599  17.283  1.00 35.69           O  \nATOM   5178  OE2 GLU A 345       7.323  -6.421  15.760  1.00 35.01           O1-\nATOM   5179  H   GLU A 345       8.278  -9.368  18.948  1.00 25.97           H  \nATOM   5180  HA  GLU A 345       8.395  -8.643  16.161  1.00 27.03           H  \nATOM   5181  HB3 GLU A 345       9.821  -6.740  17.043  1.00 27.74           H  \nATOM   5182  HB2 GLU A 345       9.818  -7.495  18.606  1.00 27.74           H  \nATOM   5183  HG3 GLU A 345       8.213  -5.696  18.624  1.00 31.24           H  \nATOM   5184  HG2 GLU A 345       7.357  -7.196  18.809  1.00 31.24           H  \nATOM   5185  N   THR A 346      10.992 -10.133  17.435  1.00 25.10           N  \nATOM   5186  CA  THR A 346      12.191 -10.889  17.085  1.00 25.31           C  \nATOM   5187  C   THR A 346      11.876 -11.987  16.053  1.00 26.27           C  \nATOM   5188  O   THR A 346      12.596 -12.070  15.064  1.00 25.60           O  \nATOM   5189  CB  THR A 346      12.841 -11.524  18.339  1.00 24.58           C  \nATOM   5190  OG1 THR A 346      13.329 -10.480  19.153  1.00 20.56           O  \nATOM   5191  CG2 THR A 346      14.004 -12.499  18.087  1.00 23.70           C  \nATOM   5192  H   THR A 346      10.649 -10.254  18.380  1.00 25.10           H  \nATOM   5193  HA  THR A 346      12.908 -10.197  16.635  1.00 25.31           H  \nATOM   5194  HB  THR A 346      12.079 -12.047  18.920  1.00 24.58           H  \nATOM   5195  HG1 THR A 346      13.567 -10.859  20.008  1.00 20.56           H  \nATOM   5196 HG21 THR A 346      14.502 -12.770  19.018  1.00 23.70           H  \nATOM   5197 HG22 THR A 346      13.653 -13.426  17.636  1.00 23.70           H  \nATOM   5198 HG23 THR A 346      14.751 -12.062  17.424  1.00 23.70           H  \nATOM   5199  N   LEU A 347      10.775 -12.739  16.246  1.00 25.55           N  \nATOM   5200  CA  LEU A 347      10.278 -13.718  15.274  1.00 27.06           C  \nATOM   5201  C   LEU A 347       9.847 -13.071  13.949  1.00 26.24           C  \nATOM   5202  O   LEU A 347      10.187 -13.618  12.903  1.00 22.77           O  \nATOM   5203  CB  LEU A 347       9.115 -14.548  15.862  1.00 29.01           C  \nATOM   5204  CG  LEU A 347       9.513 -15.536  16.978  1.00 31.73           C  \nATOM   5205  CD1 LEU A 347       8.254 -16.211  17.562  1.00 34.42           C  \nATOM   5206  CD2 LEU A 347      10.555 -16.569  16.505  1.00 33.31           C  \nATOM   5207  H   LEU A 347      10.216 -12.610  17.080  1.00 25.55           H  \nATOM   5208  HA  LEU A 347      11.105 -14.390  15.037  1.00 27.06           H  \nATOM   5209  HB3 LEU A 347       8.641 -15.118  15.061  1.00 29.01           H  \nATOM   5210  HB2 LEU A 347       8.347 -13.869  16.237  1.00 29.01           H  \nATOM   5211  HG  LEU A 347       9.984 -14.983  17.788  1.00 31.73           H  \nATOM   5212 HD11 LEU A 347       8.416 -17.258  17.818  1.00 34.42           H  \nATOM   5213 HD12 LEU A 347       7.937 -15.701  18.471  1.00 34.42           H  \nATOM   5214 HD13 LEU A 347       7.414 -16.175  16.868  1.00 34.42           H  \nATOM   5215 HD21 LEU A 347      10.474 -17.520  17.030  1.00 33.31           H  \nATOM   5216 HD22 LEU A 347      10.464 -16.771  15.438  1.00 33.31           H  \nATOM   5217 HD23 LEU A 347      11.566 -16.202  16.679  1.00 33.31           H  \nATOM   5218  N   SER A 348       9.157 -11.916  14.006  1.00 25.08           N  \nATOM   5219  CA  SER A 348       8.751 -11.138  12.831  1.00 25.81           C  \nATOM   5220  C   SER A 348       9.954 -10.669  11.989  1.00 25.76           C  \nATOM   5221  O   SER A 348       9.922 -10.822  10.769  1.00 26.65           O  \nATOM   5222  CB  SER A 348       7.854  -9.959  13.265  1.00 27.51           C  \nATOM   5223  OG  SER A 348       7.412  -9.202  12.155  1.00 31.87           O  \nATOM   5224  H   SER A 348       8.897 -11.532  14.906  1.00 25.08           H  \nATOM   5225  HA  SER A 348       8.151 -11.798  12.202  1.00 25.81           H  \nATOM   5226  HB3 SER A 348       8.387  -9.297  13.946  1.00 27.51           H  \nATOM   5227  HB2 SER A 348       6.977 -10.326  13.799  1.00 27.51           H  \nATOM   5228  HG  SER A 348       6.989  -8.396  12.475  1.00 31.87           H  \nATOM   5229  N   THR A 349      11.003 -10.163  12.660  1.00 24.55           N  \nATOM   5230  CA  THR A 349      12.247  -9.724  12.031  1.00 23.43           C  \nATOM   5231  C   THR A 349      13.052 -10.879  11.410  1.00 24.65           C  \nATOM   5232  O   THR A 349      13.573 -10.697  10.312  1.00 23.30           O  \nATOM   5233  CB  THR A 349      13.139  -8.939  13.030  1.00 24.23           C  \nATOM   5234  OG1 THR A 349      12.512  -7.695  13.268  1.00 21.82           O  \nATOM   5235  CG2 THR A 349      14.592  -8.659  12.595  1.00 22.09           C  \nATOM   5236  H   THR A 349      10.949 -10.059  13.665  1.00 24.55           H  \nATOM   5237  HA  THR A 349      11.964  -9.061  11.215  1.00 23.43           H  \nATOM   5238  HB  THR A 349      13.169  -9.469  13.983  1.00 24.23           H  \nATOM   5239  HG1 THR A 349      11.669  -7.850  13.708  1.00 21.82           H  \nATOM   5240 HG21 THR A 349      15.081  -7.968  13.280  1.00 22.09           H  \nATOM   5241 HG22 THR A 349      15.195  -9.568  12.582  1.00 22.09           H  \nATOM   5242 HG23 THR A 349      14.630  -8.216  11.601  1.00 22.09           H  \nATOM   5243  N   LEU A 350      13.109 -12.041  12.084  1.00 25.56           N  \nATOM   5244  CA  LEU A 350      13.788 -13.237  11.584  1.00 27.20           C  \nATOM   5245  C   LEU A 350      13.072 -13.869  10.381  1.00 27.84           C  \nATOM   5246  O   LEU A 350      13.756 -14.253   9.437  1.00 27.94           O  \nATOM   5247  CB  LEU A 350      13.974 -14.263  12.718  1.00 26.67           C  \nATOM   5248  CG  LEU A 350      14.993 -13.826  13.793  1.00 28.29           C  \nATOM   5249  CD1 LEU A 350      14.977 -14.792  14.987  1.00 28.78           C  \nATOM   5250  CD2 LEU A 350      16.412 -13.625  13.243  1.00 27.19           C  \nATOM   5251  H   LEU A 350      12.660 -12.122  12.987  1.00 25.56           H  \nATOM   5252  HA  LEU A 350      14.774 -12.932  11.228  1.00 27.20           H  \nATOM   5253  HB3 LEU A 350      14.302 -15.218  12.304  1.00 26.67           H  \nATOM   5254  HB2 LEU A 350      13.004 -14.458  13.180  1.00 26.67           H  \nATOM   5255  HG  LEU A 350      14.691 -12.855  14.175  1.00 28.29           H  \nATOM   5256 HD11 LEU A 350      15.048 -14.239  15.922  1.00 28.78           H  \nATOM   5257 HD12 LEU A 350      14.062 -15.384  15.020  1.00 28.78           H  \nATOM   5258 HD13 LEU A 350      15.810 -15.494  14.961  1.00 28.78           H  \nATOM   5259 HD21 LEU A 350      17.171 -13.922  13.964  1.00 27.19           H  \nATOM   5260 HD22 LEU A 350      16.574 -14.193  12.328  1.00 27.19           H  \nATOM   5261 HD23 LEU A 350      16.593 -12.574  13.014  1.00 27.19           H  \nATOM   5262  N   GLU A 351      11.729 -13.918  10.405  1.00 29.78           N  \nATOM   5263  CA  GLU A 351      10.897 -14.351   9.279  1.00 31.65           C  \nATOM   5264  C   GLU A 351      11.052 -13.447   8.047  1.00 31.57           C  \nATOM   5265  O   GLU A 351      11.253 -13.967   6.952  1.00 32.81           O  \nATOM   5266  CB  GLU A 351       9.415 -14.442   9.706  1.00 34.82           C  \nATOM   5267  CG  GLU A 351       9.089 -15.628  10.644  1.00 41.40           C  \nATOM   5268  CD  GLU A 351       9.012 -17.019   9.990  1.00 44.64           C  \nATOM   5269  OE1 GLU A 351       8.808 -17.977  10.768  1.00 46.61           O  \nATOM   5270  OE2 GLU A 351       9.166 -17.130   8.752  1.00 43.42           O1-\nATOM   5271  H   GLU A 351      11.231 -13.603  11.229  1.00 29.78           H  \nATOM   5272  HA  GLU A 351      11.241 -15.345   8.987  1.00 31.65           H  \nATOM   5273  HB3 GLU A 351       8.760 -14.465   8.833  1.00 34.82           H  \nATOM   5274  HB2 GLU A 351       9.146 -13.523  10.228  1.00 34.82           H  \nATOM   5275  HG3 GLU A 351       8.128 -15.437  11.124  1.00 41.40           H  \nATOM   5276  HG2 GLU A 351       9.823 -15.674  11.447  1.00 41.40           H  \nATOM   5277  N   TYR A 352      11.003 -12.121   8.257  1.00 31.02           N  \nATOM   5278  CA  TYR A 352      11.183 -11.096   7.226  1.00 29.54           C  \nATOM   5279  C   TYR A 352      12.561 -11.175   6.549  1.00 30.19           C  \nATOM   5280  O   TYR A 352      12.638 -11.172   5.320  1.00 29.15           O  \nATOM   5281  CB  TYR A 352      10.941  -9.712   7.861  1.00 31.28           C  \nATOM   5282  CG  TYR A 352      10.909  -8.538   6.899  1.00 31.74           C  \nATOM   5283  CD1 TYR A 352      12.105  -7.957   6.423  1.00 32.52           C  \nATOM   5284  CD2 TYR A 352       9.666  -7.997   6.508  1.00 34.47           C  \nATOM   5285  CE1 TYR A 352      12.057  -6.833   5.578  1.00 34.85           C  \nATOM   5286  CE2 TYR A 352       9.619  -6.861   5.679  1.00 34.55           C  \nATOM   5287  CZ  TYR A 352      10.814  -6.273   5.225  1.00 34.94           C  \nATOM   5288  OH  TYR A 352      10.764  -5.148   4.458  1.00 38.19           O  \nATOM   5289  H   TYR A 352      10.828 -11.777   9.193  1.00 31.02           H  \nATOM   5290  HA  TYR A 352      10.422 -11.259   6.461  1.00 29.54           H  \nATOM   5291  HB3 TYR A 352      11.686  -9.508   8.630  1.00 31.28           H  \nATOM   5292  HB2 TYR A 352       9.983  -9.726   8.383  1.00 31.28           H  \nATOM   5293  HD1 TYR A 352      13.063  -8.353   6.724  1.00 32.52           H  \nATOM   5294  HD2 TYR A 352       8.745  -8.431   6.867  1.00 34.47           H  \nATOM   5295  HE1 TYR A 352      12.977  -6.384   5.232  1.00 34.85           H  \nATOM   5296  HE2 TYR A 352       8.666  -6.434   5.408  1.00 34.55           H  \nATOM   5297  HH  TYR A 352      11.632  -4.825   4.208  1.00 38.19           H  \nATOM   5298  N   ALA A 353      13.613 -11.259   7.380  1.00 27.84           N  \nATOM   5299  CA  ALA A 353      15.006 -11.392   6.971  1.00 29.40           C  \nATOM   5300  C   ALA A 353      15.267 -12.694   6.196  1.00 30.72           C  \nATOM   5301  O   ALA A 353      15.927 -12.648   5.161  1.00 30.09           O  \nATOM   5302  CB  ALA A 353      15.882 -11.289   8.228  1.00 27.70           C  \nATOM   5303  H   ALA A 353      13.452 -11.242   8.379  1.00 27.84           H  \nATOM   5304  HA  ALA A 353      15.244 -10.552   6.315  1.00 29.40           H  \nATOM   5305  HB1 ALA A 353      16.944 -11.308   7.999  1.00 27.70           H  \nATOM   5306  HB2 ALA A 353      15.690 -10.351   8.749  1.00 27.70           H  \nATOM   5307  HB3 ALA A 353      15.681 -12.101   8.928  1.00 27.70           H  \nATOM   5308  N   HIS A 354      14.709 -13.816   6.684  1.00 33.52           N  \nATOM   5309  CA  HIS A 354      14.829 -15.146   6.081  1.00 36.23           C  \nATOM   5310  C   HIS A 354      14.273 -15.219   4.648  1.00 36.11           C  \nATOM   5311  O   HIS A 354      14.891 -15.860   3.800  1.00 35.43           O  \nATOM   5312  CB  HIS A 354      14.171 -16.190   7.008  1.00 39.61           C  \nATOM   5313  CG  HIS A 354      14.169 -17.595   6.464  1.00 43.40           C  \nATOM   5314  ND1 HIS A 354      13.043 -18.192   5.920  1.00 45.98           N  \nATOM   5315  CD2 HIS A 354      15.174 -18.530   6.362  1.00 45.87           C  \nATOM   5316  CE1 HIS A 354      13.408 -19.407   5.506  1.00 46.42           C  \nATOM   5317  NE2 HIS A 354      14.687 -19.680   5.739  1.00 47.89           N  \nATOM   5318  H   HIS A 354      14.176 -13.770   7.543  1.00 33.52           H  \nATOM   5319  HA  HIS A 354      15.893 -15.380   6.021  1.00 36.23           H  \nATOM   5320  HB3 HIS A 354      13.144 -15.904   7.235  1.00 39.61           H  \nATOM   5321  HB2 HIS A 354      14.701 -16.216   7.961  1.00 39.61           H  \nATOM   5322  HD1 HIS A 354      12.122 -17.784   5.848  1.00 45.98           H  \nATOM   5323  HD2 HIS A 354      16.207 -18.456   6.670  1.00 45.87           H  \nATOM   5324  HE1 HIS A 354      12.730 -20.102   5.032  1.00 46.42           H  \nATOM   5325  N   ARG A 355      13.143 -14.537   4.402  1.00 36.76           N  \nATOM   5326  CA  ARG A 355      12.517 -14.414   3.086  1.00 38.68           C  \nATOM   5327  C   ARG A 355      13.401 -13.656   2.087  1.00 37.05           C  \nATOM   5328  O   ARG A 355      13.551 -14.125   0.961  1.00 37.00           O  \nATOM   5329  CB  ARG A 355      11.158 -13.712   3.231  1.00 42.28           C  \nATOM   5330  CG  ARG A 355      10.110 -14.551   3.984  1.00 47.63           C  \nATOM   5331  CD  ARG A 355       8.919 -13.729   4.514  1.00 52.45           C  \nATOM   5332  NE  ARG A 355       8.232 -12.974   3.451  1.00 57.27           N  \nATOM   5333  CZ  ARG A 355       7.507 -13.472   2.432  1.00 59.95           C  \nATOM   5334  NH1 ARG A 355       7.277 -14.783   2.267  1.00 61.16           N  \nATOM   5335  NH2 ARG A 355       6.986 -12.630   1.539  1.00 59.95           N1+\nATOM   5336  H   ARG A 355      12.695 -14.036   5.158  1.00 36.76           H  \nATOM   5337  HA  ARG A 355      12.352 -15.418   2.688  1.00 38.68           H  \nATOM   5338  HB3 ARG A 355      10.762 -13.487   2.239  1.00 42.28           H  \nATOM   5339  HB2 ARG A 355      11.291 -12.749   3.725  1.00 42.28           H  \nATOM   5340  HG3 ARG A 355      10.586 -15.024   4.839  1.00 47.63           H  \nATOM   5341  HG2 ARG A 355       9.776 -15.392   3.378  1.00 47.63           H  \nATOM   5342  HD3 ARG A 355       9.230 -13.064   5.319  1.00 52.45           H  \nATOM   5343  HD2 ARG A 355       8.187 -14.406   4.955  1.00 52.45           H  \nATOM   5344  HE  ARG A 355       8.369 -11.974   3.483  1.00 57.27           H  \nATOM   5345 HH12 ARG A 355       6.718 -15.114   1.494  1.00 61.16           H  \nATOM   5346 HH11 ARG A 355       7.646 -15.447   2.932  1.00 61.16           H  \nATOM   5347 HH22 ARG A 355       6.427 -12.984   0.775  1.00 59.95           H  \nATOM   5348 HH21 ARG A 355       7.088 -11.629   1.640  1.00 59.95           H  \nATOM   5349  N   ALA A 356      13.994 -12.531   2.528  1.00 35.18           N  \nATOM   5350  CA  ALA A 356      14.840 -11.652   1.719  1.00 33.47           C  \nATOM   5351  C   ALA A 356      16.122 -12.299   1.155  1.00 34.33           C  \nATOM   5352  O   ALA A 356      16.671 -11.759   0.196  1.00 32.89           O  \nATOM   5353  CB  ALA A 356      15.169 -10.392   2.530  1.00 31.30           C  \nATOM   5354  H   ALA A 356      13.837 -12.235   3.482  1.00 35.18           H  \nATOM   5355  HA  ALA A 356      14.239 -11.344   0.861  1.00 33.47           H  \nATOM   5356  HB1 ALA A 356      15.697  -9.665   1.913  1.00 31.30           H  \nATOM   5357  HB2 ALA A 356      14.260  -9.909   2.892  1.00 31.30           H  \nATOM   5358  HB3 ALA A 356      15.793 -10.619   3.394  1.00 31.30           H  \nATOM   5359  N   LYS A 357      16.542 -13.454   1.707  1.00 34.54           N  \nATOM   5360  CA  LYS A 357      17.620 -14.300   1.182  1.00 38.30           C  \nATOM   5361  C   LYS A 357      17.369 -14.808  -0.252  1.00 40.22           C  \nATOM   5362  O   LYS A 357      18.329 -14.975  -1.002  1.00 40.04           O  \nATOM   5363  CB  LYS A 357      17.807 -15.533   2.085  1.00 38.47           C  \nATOM   5364  CG  LYS A 357      18.277 -15.247   3.521  1.00 39.23           C  \nATOM   5365  CD  LYS A 357      18.350 -16.526   4.374  1.00 41.33           C  \nATOM   5366  CE  LYS A 357      19.476 -17.487   3.943  1.00 42.15           C  \nATOM   5367  NZ  LYS A 357      19.315 -18.824   4.536  1.00 41.28           N1+\nATOM   5368  H   LYS A 357      16.036 -13.828   2.497  1.00 34.54           H  \nATOM   5369  HA  LYS A 357      18.540 -13.714   1.182  1.00 38.30           H  \nATOM   5370  HB3 LYS A 357      18.539 -16.183   1.606  1.00 38.47           H  \nATOM   5371  HB2 LYS A 357      16.878 -16.104   2.112  1.00 38.47           H  \nATOM   5372  HG3 LYS A 357      17.600 -14.541   4.001  1.00 39.23           H  \nATOM   5373  HG2 LYS A 357      19.256 -14.769   3.492  1.00 39.23           H  \nATOM   5374  HD3 LYS A 357      17.383 -17.032   4.329  1.00 41.33           H  \nATOM   5375  HD2 LYS A 357      18.487 -16.248   5.420  1.00 41.33           H  \nATOM   5376  HE3 LYS A 357      20.448 -17.078   4.222  1.00 42.15           H  \nATOM   5377  HE2 LYS A 357      19.495 -17.633   2.866  1.00 42.15           H  \nATOM   5378  HZ1 LYS A 357      18.442 -19.226   4.225  1.00 41.28           H  \nATOM   5379  HZ2 LYS A 357      20.081 -19.417   4.251  1.00 41.28           H  \nATOM   5380  HZ3 LYS A 357      19.302 -18.745   5.545  1.00 41.28           H  \nATOM   5381  N   ASN A 358      16.092 -15.061  -0.589  1.00 41.32           N  \nATOM   5382  CA  ASN A 358      15.650 -15.622  -1.871  1.00 42.57           C  \nATOM   5383  C   ASN A 358      15.533 -14.572  -2.994  1.00 43.12           C  \nATOM   5384  O   ASN A 358      15.154 -14.949  -4.103  1.00 44.49           O  \nATOM   5385  CB  ASN A 358      14.309 -16.374  -1.669  1.00 45.39           C  \nATOM   5386  CG  ASN A 358      14.402 -17.633  -0.795  1.00 48.23           C  \nATOM   5387  OD1 ASN A 358      15.486 -18.106  -0.459  1.00 51.21           O  \nATOM   5388  ND2 ASN A 358      13.247 -18.198  -0.441  1.00 48.45           N  \nATOM   5389  H   ASN A 358      15.361 -14.884   0.088  1.00 41.32           H  \nATOM   5390  HA  ASN A 358      16.405 -16.345  -2.187  1.00 42.57           H  \nATOM   5391  HB3 ASN A 358      13.921 -16.708  -2.632  1.00 45.39           H  \nATOM   5392  HB2 ASN A 358      13.557 -15.703  -1.253  1.00 45.39           H  \nATOM   5393 HD22 ASN A 358      13.249 -19.033   0.126  1.00 48.45           H  \nATOM   5394 HD21 ASN A 358      12.367 -17.799  -0.735  1.00 48.45           H  \nATOM   5395  N   ILE A 359      15.870 -13.298  -2.724  1.00 41.07           N  \nATOM   5396  CA  ILE A 359      15.922 -12.247  -3.742  1.00 40.73           C  \nATOM   5397  C   ILE A 359      17.249 -12.346  -4.515  1.00 41.82           C  \nATOM   5398  O   ILE A 359      18.304 -12.456  -3.893  1.00 42.57           O  \nATOM   5399  CB  ILE A 359      15.808 -10.820  -3.132  1.00 40.12           C  \nATOM   5400  CG1 ILE A 359      14.491 -10.680  -2.342  1.00 40.44           C  \nATOM   5401  CG2 ILE A 359      15.912  -9.700  -4.197  1.00 39.64           C  \nATOM   5402  CD1 ILE A 359      14.395  -9.422  -1.478  1.00 41.20           C  \nATOM   5403  H   ILE A 359      16.188 -13.046  -1.799  1.00 41.07           H  \nATOM   5404  HA  ILE A 359      15.089 -12.384  -4.434  1.00 40.73           H  \nATOM   5405  HB  ILE A 359      16.629 -10.691  -2.426  1.00 40.12           H  \nATOM   5406 HG13 ILE A 359      14.369 -11.526  -1.668  1.00 40.44           H  \nATOM   5407 HG12 ILE A 359      13.644 -10.718  -3.026  1.00 40.44           H  \nATOM   5408 HG21 ILE A 359      15.784  -8.708  -3.769  1.00 39.64           H  \nATOM   5409 HG22 ILE A 359      16.881  -9.688  -4.691  1.00 39.64           H  \nATOM   5410 HG23 ILE A 359      15.152  -9.819  -4.970  1.00 39.64           H  \nATOM   5411 HD11 ILE A 359      13.471  -9.461  -0.913  1.00 41.20           H  \nATOM   5412 HD12 ILE A 359      15.216  -9.362  -0.764  1.00 41.20           H  \nATOM   5413 HD13 ILE A 359      14.376  -8.506  -2.067  1.00 41.20           H  \nATOM   5414  N   LEU A 360      17.148 -12.289  -5.851  1.00 42.09           N  \nATOM   5415  CA  LEU A 360      18.259 -12.379  -6.793  1.00 44.36           C  \nATOM   5416  C   LEU A 360      18.584 -10.983  -7.347  1.00 43.24           C  \nATOM   5417  O   LEU A 360      17.731 -10.392  -8.009  1.00 43.73           O  \nATOM   5418  CB  LEU A 360      17.838 -13.359  -7.916  1.00 47.52           C  \nATOM   5419  CG  LEU A 360      18.827 -13.511  -9.095  1.00 50.60           C  \nATOM   5420  CD1 LEU A 360      20.160 -14.139  -8.649  1.00 52.74           C  \nATOM   5421  CD2 LEU A 360      18.178 -14.305 -10.241  1.00 52.55           C  \nATOM   5422  H   LEU A 360      16.232 -12.178  -6.268  1.00 42.09           H  \nATOM   5423  HA  LEU A 360      19.144 -12.779  -6.296  1.00 44.36           H  \nATOM   5424  HB3 LEU A 360      16.879 -13.029  -8.320  1.00 47.52           H  \nATOM   5425  HB2 LEU A 360      17.647 -14.341  -7.479  1.00 47.52           H  \nATOM   5426  HG  LEU A 360      19.053 -12.529  -9.510  1.00 50.60           H  \nATOM   5427 HD11 LEU A 360      20.456 -14.983  -9.272  1.00 52.74           H  \nATOM   5428 HD12 LEU A 360      20.959 -13.402  -8.693  1.00 52.74           H  \nATOM   5429 HD13 LEU A 360      20.120 -14.502  -7.622  1.00 52.74           H  \nATOM   5430 HD21 LEU A 360      18.918 -14.645 -10.967  1.00 52.55           H  \nATOM   5431 HD22 LEU A 360      17.650 -15.184  -9.870  1.00 52.55           H  \nATOM   5432 HD23 LEU A 360      17.458 -13.689 -10.780  1.00 52.55           H  \nATOM   5433  N   ASN A 361      19.826 -10.525  -7.120  1.00 42.13           N  \nATOM   5434  CA  ASN A 361      20.409  -9.317  -7.721  1.00 44.33           C  \nATOM   5435  C   ASN A 361      21.481  -9.727  -8.753  1.00 45.70           C  \nATOM   5436  O   ASN A 361      21.829 -10.904  -8.863  1.00 46.71           O  \nATOM   5437  CB  ASN A 361      21.000  -8.406  -6.611  1.00 42.58           C  \nATOM   5438  CG  ASN A 361      19.954  -7.713  -5.722  1.00 42.14           C  \nATOM   5439  OD1 ASN A 361      18.849  -8.206  -5.519  1.00 39.55           O  \nATOM   5440  ND2 ASN A 361      20.302  -6.554  -5.167  1.00 40.89           N  \nATOM   5441  H   ASN A 361      20.470 -11.086  -6.578  1.00 42.13           H  \nATOM   5442  HA  ASN A 361      19.623  -8.764  -8.240  1.00 44.33           H  \nATOM   5443  HB3 ASN A 361      21.589  -7.613  -7.074  1.00 42.58           H  \nATOM   5444  HB2 ASN A 361      21.690  -8.964  -5.978  1.00 42.58           H  \nATOM   5445 HD22 ASN A 361      19.656  -6.060  -4.566  1.00 40.89           H  \nATOM   5446 HD21 ASN A 361      21.210  -6.144  -5.357  1.00 40.89           H  \nATOM   5447  N   LYS A 362      21.952  -8.738  -9.527  1.00 46.44           N  \nATOM   5448  CA  LYS A 362      22.835  -8.915 -10.684  1.00 48.00           C  \nATOM   5449  C   LYS A 362      24.015  -7.925 -10.624  1.00 47.90           C  \nATOM   5450  O   LYS A 362      24.285  -7.235 -11.609  1.00 48.26           O  \nATOM   5451  CB  LYS A 362      21.999  -8.754 -11.976  1.00 48.16           C  \nATOM   5452  CG  LYS A 362      20.896  -9.814 -12.162  1.00 50.94           C  \nATOM   5453  CD  LYS A 362      20.050  -9.600 -13.427  1.00 53.33           C  \nATOM   5454  CE  LYS A 362      19.194  -8.321 -13.372  1.00 55.16           C  \nATOM   5455  NZ  LYS A 362      18.323  -8.195 -14.553  1.00 55.37           N1+\nATOM   5456  H   LYS A 362      21.599  -7.799  -9.388  1.00 46.44           H  \nATOM   5457  HA  LYS A 362      23.276  -9.914 -10.680  1.00 48.00           H  \nATOM   5458  HB3 LYS A 362      22.656  -8.802 -12.846  1.00 48.16           H  \nATOM   5459  HB2 LYS A 362      21.562  -7.756 -11.977  1.00 48.16           H  \nATOM   5460  HG3 LYS A 362      20.227  -9.826 -11.302  1.00 50.94           H  \nATOM   5461  HG2 LYS A 362      21.355 -10.803 -12.199  1.00 50.94           H  \nATOM   5462  HD3 LYS A 362      19.409 -10.471 -13.565  1.00 53.33           H  \nATOM   5463  HD2 LYS A 362      20.709  -9.569 -14.297  1.00 53.33           H  \nATOM   5464  HE3 LYS A 362      19.817  -7.429 -13.320  1.00 55.16           H  \nATOM   5465  HE2 LYS A 362      18.567  -8.327 -12.480  1.00 55.16           H  \nATOM   5466  HZ1 LYS A 362      17.768  -7.355 -14.460  1.00 55.37           H  \nATOM   5467  HZ2 LYS A 362      18.883  -8.146 -15.391  1.00 55.37           H  \nATOM   5468  HZ3 LYS A 362      17.708  -8.995 -14.604  1.00 55.37           H  \nHETATM 5469  N   NME A 363      24.687  -7.866  -9.462  1.00  0.00           N  \nHETATM 5470  C   NME A 363      25.822  -6.985  -9.210  1.00  0.00           C  \nHETATM 5471  H   NME A 363      24.395  -8.463  -8.702  1.00  0.00           H  \nHETATM 5472  H1  NME A 363      26.066  -6.336 -10.052  1.00  0.00           H  \nHETATM 5473  H2  NME A 363      25.607  -6.348  -8.351  1.00  0.00           H  \nHETATM 5474  H3  NME A 363      26.705  -7.577  -8.974  1.00  0.00           H  \nTER    5475      NME A 363 \nHETATM 5476  O   HOH A 372      14.127   2.495  15.237  1.00 20.25           O  \nHETATM 5477  H1  HOH A 372      13.297   2.286  15.760  1.00 20.25           H  \nHETATM 5478  H2  HOH A 372      14.921   2.463  15.861  1.00 20.25           H  \nHETATM 5479  O   HOH A 377      22.168  -5.652  17.068  1.00 24.29           O  \nHETATM 5480  H1  HOH A 377      21.799  -6.550  16.818  1.00 24.29           H  \nHETATM 5481  H2  HOH A 377      21.449  -5.112  17.515  1.00 24.29           H  \nHETATM 5482  O   HOH A 395      14.808   3.792  12.670  1.00 27.35           O  \nHETATM 5483  H1  HOH A 395      15.161   3.112  12.024  1.00 27.35           H  \nHETATM 5484  H2  HOH A 395      14.745   3.389  13.587  1.00 27.35           H  \nHETATM 5485  O   HOH A 419      26.199  -7.665  18.971  1.00 30.83           O  \nHETATM 5486  H1  HOH A 419      25.560  -8.426  19.111  1.00 30.83           H  \nHETATM 5487  H2  HOH A 419      26.576  -7.383  19.855  1.00 30.83           H  \nHETATM 5488  O   HOH A 468      30.820  15.098  19.149  1.00 67.44           O  \nHETATM 5489  H1  HOH A 468      29.991  15.360  19.644  1.00 67.44           H  \nHETATM 5490  H2  HOH A 468      31.104  15.865  18.563  1.00 67.44           H  \nHETATM 5491  O   HOH A 484      27.842  -6.299  21.160  1.00 38.37           O  \nHETATM 5492  H1  HOH A 484      28.606  -6.492  20.537  1.00 38.37           H  \nHETATM 5493  H2  HOH A 484      27.781  -7.031  21.842  1.00 38.37           H  \nHETATM 5494  O   HOH A 499      22.332   5.193   9.602  1.00 41.21           O  \nHETATM 5495  H1  HOH A 499      22.732   5.985  10.074  1.00 41.21           H  \nHETATM 5496  H2  HOH A 499      21.557   4.857  10.143  1.00 41.21           H  \nCONECT 5476 5477 5478\nCONECT 5477 5476\nCONECT 5478 5476\nCONECT 5479 5480 5481\nCONECT 5480 5479\nCONECT 5481 5479\nCONECT 5482 5483 5484\nCONECT 5483 5482\nCONECT 5484 5482\nCONECT 5485 5486 5487\nCONECT 5486 5485\nCONECT 5487 5485\nCONECT 5488 5489 5490\nCONECT 5489 5488\nCONECT 5490 5488\nCONECT 5491 5492 5493\nCONECT 5492 5491\nCONECT 5493 5491\nCONECT 5494 5495 5496\nCONECT 5495 5494\nCONECT 5496 5494\nEND   \n"
  },
  {
    "path": "src/openfe/tests/data/external_formats/__init__.py",
    "content": "\n"
  },
  {
    "path": "src/openfe/tests/data/external_formats/somebenzenes_edges.edge",
    "content": "1c91235:9c91235  # benzene -> toluene\n1c91235:7876633  # benzene -> phenol\n1c91235:2a51f95  # benzene -> benzonitrile\n1c91235:efja0bc  # benzene -> anisole\n1c91235:7877722  # benzene -> styrene\n1c91235:99930cd  # benzene -> benzaldehyde\n"
  },
  {
    "path": "src/openfe/tests/data/htf/__init__.py",
    "content": ""
  },
  {
    "path": "src/openfe/tests/data/htf/chloroethane.sdf",
    "content": "chloroethane\n     RDKit          3D\n\n  8  7  0  0  0  0  0  0  0  0999 V2000\n   -1.3775    1.4853   -0.3054 Cl  0  0  0  0  0  0  0  0  0  0  0  0\n   -0.7289   -0.1486    0.0141 C   0  0  0  0  0  0  0  0  0  0  0  0\n    0.7801   -0.0222    0.0530 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -1.0446   -0.7625   -0.8423 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -1.1589   -0.4787    0.9822 H   0  0  0  0  0  0  0  0  0  0  0  0\n    1.1368    0.9399   -0.3538 H   0  0  0  0  0  0  0  0  0  0  0  0\n    1.2037   -0.8083   -0.6046 H   0  0  0  0  0  0  0  0  0  0  0  0\n    1.1892   -0.2049    1.0569 H   0  0  0  0  0  0  0  0  0  0  0  0\n  1  2  1  0\n  2  3  1  0\n  2  4  1  0\n  2  5  1  0\n  3  6  1  0\n  3  7  1  0\n  3  8  1  0\nM  END\n>  <atom.dprop.PartialCharge>  (1)\n-0.20252500000000001 0.038874999999999993 -0.107225 0.062575000000000006 0.062575000000000006 0.048574999999999993 0.048574999999999993 0.048574999999999993\n\n$$$$"
  },
  {
    "path": "src/openfe/tests/data/htf/ethane.sdf",
    "content": "ethane\n     RDKit          3D\n\n  8  7  0  0  0  0  0  0  0  0999 V2000\n   -1.1246    0.8482   -0.1808 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -0.7289   -0.1486    0.0141 C   0  0  0  0  0  0  0  0  0  0  0  0\n    0.7801   -0.0222    0.0530 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -1.0446   -0.7625   -0.8423 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -1.1589   -0.4787    0.9822 H   0  0  0  0  0  0  0  0  0  0  0  0\n    1.1368    0.9399   -0.3538 H   0  0  0  0  0  0  0  0  0  0  0  0\n    1.2037   -0.8083   -0.6046 H   0  0  0  0  0  0  0  0  0  0  0  0\n    1.1892   -0.2049    1.0569 H   0  0  0  0  0  0  0  0  0  0  0  0\n  1  2  1  0\n  2  3  1  0\n  2  4  1  0\n  2  5  1  0\n  3  6  1  0\n  3  7  1  0\n  3  8  1  0\nM  END\n>  <atom.dprop.PartialCharge>  (1)\n0.031449999999999999 -0.094350000000000003 -0.094350000000000003 0.031449999999999999 0.031449999999999999 0.031449999999999999 0.031449999999999999 0.031449999999999999\n\n$$$$"
  },
  {
    "path": "src/openfe/tests/data/htf/fluoroethane.sdf",
    "content": "fluoroethane\n     RDKit          3D\n\n  8  7  0  0  0  0  0  0  0  0999 V2000\n   -1.2190    1.0859   -0.2273 F   0  0  0  0  0  0  0  0  0  0  0  0\n   -0.7289   -0.1486    0.0141 C   0  0  0  0  0  0  0  0  0  0  0  0\n    0.7801   -0.0222    0.0530 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -1.0446   -0.7625   -0.8423 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -1.1589   -0.4787    0.9822 H   0  0  0  0  0  0  0  0  0  0  0  0\n    1.1368    0.9399   -0.3538 H   0  0  0  0  0  0  0  0  0  0  0  0\n    1.2037   -0.8083   -0.6046 H   0  0  0  0  0  0  0  0  0  0  0  0\n    1.1892   -0.2049    1.0569 H   0  0  0  0  0  0  0  0  0  0  0  0\n  1  2  1  0\n  2  3  1  0\n  2  4  1  0\n  2  5  1  0\n  3  6  1  0\n  3  7  1  0\n  3  8  1  0\nM  END\n>  <atom.dprop.PartialCharge>  (1)\n-0.24917500000000001 0.159025 -0.13097500000000001 0.038824999999999991 0.038824999999999991 0.047824999999999993 0.047824999999999993 0.047824999999999993\n\n$$$$"
  },
  {
    "path": "src/openfe/tests/data/htf/t4_lysozyme_data/benzene.sdf",
    "content": "benzene\n     RDKit          3D\n\n 12 12  0  0  0  0  0  0  0  0999 V2000\n   -6.6806    7.0134   -0.0533 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.2858    7.1609   -0.9477 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.8665    6.0569   -1.5923 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.6603    6.2343   -2.7247 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.8944    7.5191   -3.2149 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.3035    8.6211   -2.6006 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.5003    8.4444   -1.4758 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.7098    5.0628   -1.2014 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -9.0935    5.3789   -3.2180 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -9.5294    7.6705   -4.0709 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.4705    9.6119   -2.9925 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.0579    9.3041   -0.9946 H   0  0  0  0  0  0  0  0  0  0  0  0\n  1  2  1  0\n  2  3  2  0\n  2  7  1  0\n  3  4  1  0\n  3  8  1  0\n  4  5  2  0\n  4  9  1  0\n  5  6  1  0\n  5 10  1  0\n  6  7  2  0\n  6 11  1  0\n  7 12  1  0\nM  END\n>  <atom.dprop.PartialCharge>  (1)\n0.13 -0.13 -0.13 -0.13 -0.13 -0.13 -0.13 0.13 0.13 0.13 0.13 0.13\n\n$$$$"
  },
  {
    "path": "src/openfe/tests/data/htf/t4_lysozyme_data/chlorobenzene.sdf",
    "content": "chlorobenzene\n     RDKit          3D\n\n 12 12  0  0  0  0  0  0  0  0999 V2000\n   -6.3030    6.9214    0.5047 Cl  0  0  0  0  0  0  0  0  0  0  0  0\n   -7.2858    7.1609   -0.9477 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.8665    6.0569   -1.5923 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.6603    6.2343   -2.7247 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.8944    7.5191   -3.2149 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.3035    8.6211   -2.6006 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.5003    8.4444   -1.4758 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.7098    5.0628   -1.2014 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -9.0935    5.3789   -3.2180 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -9.5294    7.6705   -4.0709 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.4705    9.6119   -2.9925 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.0579    9.3041   -0.9946 H   0  0  0  0  0  0  0  0  0  0  0  0\n  1  2  1  0\n  2  3  2  0\n  2  7  1  0\n  3  4  1  0\n  3  8  1  0\n  4  5  2  0\n  4  9  1  0\n  5  6  1  0\n  5 10  1  0\n  6  7  2  0\n  6 11  1  0\n  7 12  1  0\nM  END\n>  <atom.dprop.PartialCharge>  (1)\n-0.097566666666666677 0.017233333333333326 -0.12416666666666668 -0.12216666666666667 -0.12916666666666668 -0.12216666666666667 -0.12416666666666668 0.14683333333333332 0.13683333333333333\n0.13483333333333333 0.13683333333333333 0.14683333333333332\n\n$$$$\n"
  },
  {
    "path": "src/openfe/tests/data/htf/t4_lysozyme_data/fluorobenzene.sdf",
    "content": "fluorobenzene\n     RDKit          3D\n\n 12 12  0  0  0  0  0  0  0  0999 V2000\n   -6.5362    6.9783    0.1601 F   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.2858    7.1609   -0.9477 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.8665    6.0569   -1.5923 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.6603    6.2343   -2.7247 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.8944    7.5191   -3.2149 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.3035    8.6211   -2.6006 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.5003    8.4444   -1.4758 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.7098    5.0628   -1.2014 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -9.0935    5.3789   -3.2180 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -9.5294    7.6705   -4.0709 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.4705    9.6119   -2.9925 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.0579    9.3041   -0.9946 H   0  0  0  0  0  0  0  0  0  0  0  0\n  1  2  1  0\n  2  3  2  0\n  2  7  1  0\n  3  4  1  0\n  3  8  1  0\n  4  5  2  0\n  4  9  1  0\n  5  6  1  0\n  5 10  1  0\n  6  7  2  0\n  6 11  1  0\n  7 12  1  0\nM  END\n>  <atom.dprop.PartialCharge>  (1)\n-0.14198333333333335 0.12381666666666666 -0.16608333333333336 -0.10508333333333333 -0.14508333333333334 -0.10508333333333333 -0.16608333333333336 0.14791666666666664 0.13691666666666666\n0.13591666666666666 0.13691666666666666 0.14791666666666664\n\n$$$$\n"
  },
  {
    "path": "src/openfe/tests/data/lomap_basic/1,3,7-trimethylnaphthalene.mol2",
    "content": "@<TRIPOS>MOLECULE\n*****\n 27 28 0 0 0\nSMALL\nGASTEIGER\n\n@<TRIPOS>ATOM\n      1 C           0.9251    0.1494   -0.0025 C.3     1  LIG1       -0.0397\n      2 C           2.4242    0.1552    0.0465 C.ar    1  LIG1       -0.0498\n      3 C           3.1297   -1.0574    0.0810 C.ar    1  LIG1       -0.0509\n      4 C           4.5422   -1.1042    0.1427 C.ar    1  LIG1       -0.0147\n      5 C           5.2861   -2.3145    0.1727 C.ar    1  LIG1       -0.0425\n      6 C           6.6903   -2.2735    0.2331 C.ar    1  LIG1       -0.0553\n      7 C           7.3760   -1.0578    0.2620 C.ar    1  LIG1       -0.0496\n      8 C           6.6436    0.1328    0.2358 C.ar    1  LIG1       -0.0511\n      9 C           5.2413    0.1261    0.1765 C.ar    1  LIG1       -0.0174\n     10 C           4.5298    1.3362    0.1522 C.ar    1  LIG1       -0.0538\n     11 C           3.1361    1.3519    0.0914 C.ar    1  LIG1       -0.0582\n     12 C           8.8737   -1.0147    0.3281 C.3     1  LIG1       -0.0397\n     13 C           4.6094   -3.6603    0.1443 C.3     1  LIG1       -0.0391\n     14 H           0.5282    1.1476   -0.2149 H       1  LIG1        0.0278\n     15 H           0.5194   -0.1845    0.9575 H       1  LIG1        0.0278\n     16 H           0.5728   -0.5198   -0.7944 H       1  LIG1        0.0278\n     17 H           2.5577   -1.9826    0.0575 H       1  LIG1        0.0626\n     18 H           7.2540   -3.2043    0.2569 H       1  LIG1        0.0623\n     19 H           7.1781    1.0810    0.2619 H       1  LIG1        0.0626\n     20 H           5.0603    2.2854    0.1820 H       1  LIG1        0.0624\n     21 H           2.6157    2.3065    0.0777 H       1  LIG1        0.0620\n     22 H           9.3069   -2.0200    0.3015 H       1  LIG1        0.0278\n     23 H           9.1960   -0.5332    1.2567 H       1  LIG1        0.0278\n     24 H           9.2731   -0.4567   -0.5249 H       1  LIG1        0.0278\n     25 H           5.3371   -4.4789    0.1591 H       1  LIG1        0.0278\n     26 H           4.0157   -3.7691   -0.7690 H       1  LIG1        0.0278\n     27 H           3.9645   -3.7798    1.0209 H       1  LIG1        0.0278\n@<TRIPOS>BOND\n     1     6     7   ar\n     2     5     6   ar\n     3     7     8   ar\n     4     8     9   ar\n     5     9    10   ar\n     6     4     9   ar\n     7    10    11   ar\n     8     2    11   ar\n     9     2     3   ar\n    10     3     4   ar\n    11     4     5   ar\n    12     1     2    1\n    13     5    13    1\n    14     7    12    1\n    15     1    14    1\n    16     1    15    1\n    17     1    16    1\n    18     3    17    1\n    19     6    18    1\n    20     8    19    1\n    21    10    20    1\n    22    11    21    1\n    23    12    22    1\n    24    12    23    1\n    25    12    24    1\n    26    13    25    1\n    27    13    26    1\n    28    13    27    1\n"
  },
  {
    "path": "src/openfe/tests/data/lomap_basic/1-butyl-4-methylbenzene.mol2",
    "content": "@<TRIPOS>MOLECULE\n*****\n 27 27 0 0 0\nSMALL\nGASTEIGER\n\n@<TRIPOS>ATOM\n      1 C           1.9899   -1.5496    1.4095 C.3     1  LIG1       -0.0653\n      2 C           3.0612   -0.6401    0.8303 C.3     1  LIG1       -0.0556\n      3 C           3.5100    0.4139    1.8419 C.3     1  LIG1       -0.0493\n      4 C           4.5859    1.3256    1.2470 C.3     1  LIG1       -0.0277\n      5 C           5.0777    2.3433    2.2464 C.ar    1  LIG1       -0.0473\n      6 C           4.4793    3.6056    2.3316 C.ar    1  LIG1       -0.0583\n      7 C           4.9350    4.5439    3.2608 C.ar    1  LIG1       -0.0586\n      8 C           5.9858    4.2317    4.1299 C.ar    1  LIG1       -0.0504\n      9 C           6.5860    2.9711    4.0431 C.ar    1  LIG1       -0.0586\n     10 C           6.1309    2.0320    3.1146 C.ar    1  LIG1       -0.0583\n     11 C           6.4975    5.2565    5.0979 C.3     1  LIG1       -0.0397\n     12 H           1.6931   -2.3034    0.6726 H       1  LIG1        0.0230\n     13 H           1.0980   -0.9785    1.6885 H       1  LIG1        0.0230\n     14 H           2.3560   -2.0720    2.3000 H       1  LIG1        0.0230\n     15 H           2.6700   -0.1517   -0.0688 H       1  LIG1        0.0263\n     16 H           3.9190   -1.2484    0.5229 H       1  LIG1        0.0263\n     17 H           3.8957   -0.0824    2.7418 H       1  LIG1        0.0268\n     18 H           2.6473    1.0144    2.1583 H       1  LIG1        0.0268\n     19 H           4.1939    1.8426    0.3620 H       1  LIG1        0.0313\n     20 H           5.4358    0.7279    0.8940 H       1  LIG1        0.0313\n     21 H           3.6566    3.8691    1.6710 H       1  LIG1        0.0620\n     22 H           4.4634    5.5233    3.3010 H       1  LIG1        0.0620\n     23 H           7.4138    2.7097    4.6988 H       1  LIG1        0.0620\n     24 H           6.6080    1.0557    3.0700 H       1  LIG1        0.0620\n     25 H           7.0175    4.7827    5.9374 H       1  LIG1        0.0278\n     26 H           5.6710    5.8412    5.5155 H       1  LIG1        0.0278\n     27 H           7.1937    5.9336    4.5926 H       1  LIG1        0.0278\n@<TRIPOS>BOND\n     1     5     6   ar\n     2     6     7   ar\n     3     5    10   ar\n     4     9    10   ar\n     5     8     9   ar\n     6     7     8   ar\n     7     1     2    1\n     8     2     3    1\n     9     3     4    1\n    10     4     5    1\n    11     8    11    1\n    12     1    12    1\n    13     1    13    1\n    14     1    14    1\n    15     2    15    1\n    16     2    16    1\n    17     3    17    1\n    18     3    18    1\n    19     4    19    1\n    20     4    20    1\n    21     6    21    1\n    22     7    22    1\n    23     9    23    1\n    24    10    24    1\n    25    11    25    1\n    26    11    26    1\n    27    11    27    1\n"
  },
  {
    "path": "src/openfe/tests/data/lomap_basic/2,6-dimethylnaphthalene.mol2",
    "content": "@<TRIPOS>MOLECULE\n*****\n 24 25 0 0 0\nSMALL\nGASTEIGER\n\n@<TRIPOS>ATOM\n      1 C           0.8817   -0.0759    0.0737 C.3     1  LIG1       -0.0397\n      2 C           2.3811   -0.0540    0.0354 C.ar    1  LIG1       -0.0499\n      3 C           3.0834    1.1532    0.0347 C.ar    1  LIG1       -0.0582\n      4 C           4.4799    1.1582   -0.0011 C.ar    1  LIG1       -0.0538\n      5 C           5.2032   -0.0442   -0.0356 C.ar    1  LIG1       -0.0176\n      6 C           6.6087   -0.0550   -0.0772 C.ar    1  LIG1       -0.0511\n      7 C           7.3242   -1.2594   -0.1176 C.ar    1  LIG1       -0.0499\n      8 C           8.8235   -1.2393   -0.1486 C.3     1  LIG1       -0.0397\n      9 C           6.6224   -2.4667   -0.0984 C.ar    1  LIG1       -0.0582\n     10 C           5.2258   -2.4717   -0.0573 C.ar    1  LIG1       -0.0538\n     11 C           4.5024   -1.2692   -0.0283 C.ar    1  LIG1       -0.0176\n     12 C           3.0971   -1.2586    0.0081 C.ar    1  LIG1       -0.0511\n     13 H           0.4638    0.9355    0.0362 H       1  LIG1        0.0278\n     14 H           0.5354   -0.5508    0.9973 H       1  LIG1        0.0278\n     15 H           0.4903   -0.6304   -0.7856 H       1  LIG1        0.0278\n     16 H           2.5515    2.1015    0.0601 H       1  LIG1        0.0620\n     17 H           5.0016    2.1125   -0.0033 H       1  LIG1        0.0624\n     18 H           7.1539    0.8869   -0.0807 H       1  LIG1        0.0626\n     19 H           9.2330   -2.2332   -0.3578 H       1  LIG1        0.0278\n     20 H           9.2150   -0.9034    0.8167 H       1  LIG1        0.0278\n     21 H           9.1785   -0.5651   -0.9354 H       1  LIG1        0.0278\n     22 H           7.1546   -3.4149   -0.1177 H       1  LIG1        0.0620\n     23 H           4.7045   -3.4261   -0.0479 H       1  LIG1        0.0624\n     24 H           2.5515   -2.2003    0.0134 H       1  LIG1        0.0626\n@<TRIPOS>BOND\n     1     2     3   ar\n     2     3     4   ar\n     3     2    12   ar\n     4    11    12   ar\n     5    10    11   ar\n     6     5    11   ar\n     7     9    10   ar\n     8     7     9   ar\n     9     6     7   ar\n    10     5     6   ar\n    11     4     5   ar\n    12     1     2    1\n    13     7     8    1\n    14     1    13    1\n    15     1    14    1\n    16     1    15    1\n    17     3    16    1\n    18     4    17    1\n    19     6    18    1\n    20     8    19    1\n    21     8    20    1\n    22     8    21    1\n    23     9    22    1\n    24    10    23    1\n    25    12    24    1\n"
  },
  {
    "path": "src/openfe/tests/data/lomap_basic/2-methyl-6-propylnaphthalene.mol2",
    "content": "@<TRIPOS>MOLECULE\n*****\n 30 31 0 0 0\nSMALL\nGASTEIGER\n\n@<TRIPOS>ATOM\n      1 C           0.7969    1.3147   -1.5722 C.3     1  LIG1       -0.0650\n      2 C           2.3162    1.3551   -1.5843 C.3     1  LIG1       -0.0519\n      3 C           2.8874    1.3784   -0.1657 C.3     1  LIG1       -0.0279\n      4 C           4.3949    1.4239   -0.1763 C.ar    1  LIG1       -0.0468\n      5 C           5.1419    0.2376   -0.2084 C.ar    1  LIG1       -0.0508\n      6 C           6.5466    0.2630   -0.2482 C.ar    1  LIG1       -0.0176\n      7 C           7.2164    1.5056   -0.2598 C.ar    1  LIG1       -0.0176\n      8 C           6.4634    2.6893   -0.2285 C.ar    1  LIG1       -0.0538\n      9 C           5.0678    2.6494   -0.1901 C.ar    1  LIG1       -0.0580\n     10 C           8.6208    1.5306   -0.3057 C.ar    1  LIG1       -0.0511\n     11 C           9.3673    0.3447   -0.3470 C.ar    1  LIG1       -0.0499\n     12 C           8.6960   -0.8804   -0.3232 C.ar    1  LIG1       -0.0582\n     13 C           7.3000   -0.9207   -0.2780 C.ar    1  LIG1       -0.0538\n     14 C          10.8656    0.4019   -0.3796 C.3     1  LIG1       -0.0397\n     15 H           0.4106    1.2994   -2.5961 H       1  LIG1        0.0230\n     16 H           0.3854    2.1942   -1.0670 H       1  LIG1        0.0230\n     17 H           0.4325    0.4199   -1.0579 H       1  LIG1        0.0230\n     18 H           2.6477    2.2415   -2.1391 H       1  LIG1        0.0266\n     19 H           2.6945    0.4813   -2.1292 H       1  LIG1        0.0266\n     20 H           2.5534    0.4943    0.3922 H       1  LIG1        0.0313\n     21 H           2.5001    2.2454    0.3843 H       1  LIG1        0.0313\n     22 H           4.6215   -0.7184   -0.2065 H       1  LIG1        0.0626\n     23 H           6.9606    3.6568   -0.2384 H       1  LIG1        0.0624\n     24 H           4.5102    3.5829   -0.1747 H       1  LIG1        0.0620\n     25 H           9.1424    2.4858   -0.3125 H       1  LIG1        0.0626\n     26 H           9.2523   -1.8147   -0.3422 H       1  LIG1        0.0620\n     27 H           6.8033   -1.8881   -0.2657 H       1  LIG1        0.0624\n     28 H          11.2977   -0.5759   -0.6162 H       1  LIG1        0.0278\n     29 H          11.2498    0.7216    0.5938 H       1  LIG1        0.0278\n     30 H          11.2028    1.1048   -1.1483 H       1  LIG1        0.0278\n@<TRIPOS>BOND\n     1     4     9   ar\n     2     8     9   ar\n     3     4     5   ar\n     4     5     6   ar\n     5     6    13   ar\n     6     6     7   ar\n     7    12    13   ar\n     8    11    12   ar\n     9    10    11   ar\n    10     7    10   ar\n    11     7     8   ar\n    12     1     2    1\n    13     2     3    1\n    14     3     4    1\n    15    11    14    1\n    16     1    15    1\n    17     1    16    1\n    18     1    17    1\n    19     2    18    1\n    20     2    19    1\n    21     3    20    1\n    22     3    21    1\n    23     5    22    1\n    24     8    23    1\n    25     9    24    1\n    26    10    25    1\n    27    12    26    1\n    28    13    27    1\n    29    14    28    1\n    30    14    29    1\n    31    14    30    1\n"
  },
  {
    "path": "src/openfe/tests/data/lomap_basic/2-methylnaphthalene.mol2",
    "content": "@<TRIPOS>MOLECULE\n*****\n 21 22 0 0 0\nSMALL\nGASTEIGER\n\n@<TRIPOS>ATOM\n      1 C           0.9750   -0.0348    0.0833 C.3     1  LIG1       -0.0397\n      2 C           2.4749   -0.0532    0.0754 C.ar    1  LIG1       -0.0499\n      3 C           3.2098    1.1400    0.0597 C.ar    1  LIG1       -0.0511\n      4 C           4.6141    1.1264   -0.0127 C.ar    1  LIG1       -0.0176\n      5 C           5.3554    2.3190   -0.0614 C.ar    1  LIG1       -0.0540\n      6 C           6.7465    2.2894   -0.1768 C.ar    1  LIG1       -0.0612\n      7 C           7.4142    1.0702   -0.2321 C.ar    1  LIG1       -0.0612\n      8 C           6.6939   -0.1236   -0.1628 C.ar    1  LIG1       -0.0540\n      9 C           5.2934   -0.1107   -0.0560 C.ar    1  LIG1       -0.0179\n     10 C           4.5528   -1.3018   -0.0057 C.ar    1  LIG1       -0.0538\n     11 C           3.1574   -1.2723    0.0551 C.ar    1  LIG1       -0.0582\n     12 H           0.5850    0.9882    0.1017 H       1  LIG1        0.0278\n     13 H           0.5915   -0.5586    0.9643 H       1  LIG1        0.0278\n     14 H           0.5924   -0.5209   -0.8204 H       1  LIG1        0.0278\n     15 H           2.6835    2.0917    0.0844 H       1  LIG1        0.0626\n     16 H           4.8512    3.2813   -0.0218 H       1  LIG1        0.0624\n     17 H           7.3059    3.2198   -0.2301 H       1  LIG1        0.0618\n     18 H           8.4962    1.0459   -0.3322 H       1  LIG1        0.0618\n     19 H           7.2331   -1.0669   -0.2063 H       1  LIG1        0.0624\n     20 H           5.0575   -2.2644   -0.0289 H       1  LIG1        0.0624\n     21 H           2.6062   -2.2099    0.0730 H       1  LIG1        0.0620\n@<TRIPOS>BOND\n     1     1     2    1\n     2     2     3   ar\n     3     3     4   ar\n     4     4     5   ar\n     5     5     6   ar\n     6     6     7   ar\n     7     7     8   ar\n     8     8     9   ar\n     9     4     9   ar\n    10     9    10   ar\n    11    10    11   ar\n    12     2    11   ar\n    13     1    12    1\n    14     1    13    1\n    15     1    14    1\n    16     3    15    1\n    17     5    16    1\n    18     6    17    1\n    19     7    18    1\n    20     8    19    1\n    21    10    20    1\n    22    11    21    1\n"
  },
  {
    "path": "src/openfe/tests/data/lomap_basic/2-naftanol.mol2",
    "content": "@<TRIPOS>MOLECULE\n*****\n 19 20 0 0 0\nSMALL\nGASTEIGER\n\n@<TRIPOS>ATOM\n      1 O           9.9477   -4.1875    1.4569 O.3     1  LIG1       -0.5067\n      2 C           9.0676   -3.1850    1.1716 C.ar    1  LIG1        0.1175\n      3 C           7.7820   -3.1808    1.6974 C.ar    1  LIG1       -0.0196\n      4 C           6.9153   -2.1329    1.3798 C.ar    1  LIG1       -0.0506\n      5 C           7.3294   -1.0867    0.5375 C.ar    1  LIG1       -0.0177\n      6 C           6.4703   -0.0252    0.2106 C.ar    1  LIG1       -0.0540\n      7 C           6.8977    1.0066   -0.6271 C.ar    1  LIG1       -0.0612\n      8 C           8.1878    0.9906   -1.1489 C.ar    1  LIG1       -0.0612\n      9 C           9.0548   -0.0574   -0.8344 C.ar    1  LIG1       -0.0539\n     10 C           8.6411   -1.1023    0.0071 C.ar    1  LIG1       -0.0144\n     11 C           9.5008   -2.1625    0.3346 C.ar    1  LIG1       -0.0125\n     12 H           9.5144   -4.8197    2.0534 H       1  LIG1        0.2921\n     13 H           7.4363   -3.9757    2.3505 H       1  LIG1        0.0654\n     14 H           5.9102   -2.1360    1.7951 H       1  LIG1        0.0625\n     15 H           5.4583    0.0059    0.6080 H       1  LIG1        0.0624\n     16 H           6.2223    1.8225   -0.8713 H       1  LIG1        0.0618\n     17 H           8.5216    1.7931   -1.8011 H       1  LIG1        0.0618\n     18 H          10.0593   -0.0532   -1.2512 H       1  LIG1        0.0624\n     19 H          10.5134   -2.1967   -0.0603 H       1  LIG1        0.0660\n@<TRIPOS>BOND\n     1     2     3   ar\n     2     2    11   ar\n     3     3     4   ar\n     4     4     5   ar\n     5     5     6   ar\n     6     5    10   ar\n     7     6     7   ar\n     8     7     8   ar\n     9     8     9   ar\n    10     9    10   ar\n    11    10    11   ar\n    12     1     2    1\n    13     1    12    1\n    14     3    13    1\n    15     4    14    1\n    16     6    15    1\n    17     7    16    1\n    18     8    17    1\n    19     9    18    1\n    20    11    19    1\n"
  },
  {
    "path": "src/openfe/tests/data/lomap_basic/README.md",
    "content": "Testfiles from Lomap's basic tests\n"
  },
  {
    "path": "src/openfe/tests/data/lomap_basic/__init__.py",
    "content": ""
  },
  {
    "path": "src/openfe/tests/data/lomap_basic/methylcyclohexane.mol2",
    "content": "@<TRIPOS>MOLECULE\n*****\n 21 21 0 0 0\nSMALL\nGASTEIGER\n\n@<TRIPOS>ATOM\n      1 C           0.9730    0.1554    0.1412 C.3     1  LIG1       -0.0624\n      2 C           2.4934    0.1043   -0.0303 C.3     1  LIG1       -0.0439\n      3 C           2.9737   -1.3048   -0.4072 C.3     1  LIG1       -0.0505\n      4 C           2.6388   -1.6853   -1.8487 C.3     1  LIG1       -0.0528\n      5 C           3.1458   -0.6424   -2.8397 C.3     1  LIG1       -0.0530\n      6 C           2.6503    0.7581   -2.4959 C.3     1  LIG1       -0.0528\n      7 C           2.9839    1.1382   -1.0536 C.3     1  LIG1       -0.0505\n      8 H           0.6557    1.1542    0.4607 H       1  LIG1        0.0232\n      9 H           0.6478   -0.5562    0.9081 H       1  LIG1        0.0232\n     10 H           0.4392   -0.0840   -0.7835 H       1  LIG1        0.0232\n     11 H           2.9316    0.3596    0.9431 H       1  LIG1        0.0298\n     12 H           2.5484   -2.0480    0.2778 H       1  LIG1        0.0268\n     13 H           4.0632   -1.3509   -0.2778 H       1  LIG1        0.0268\n     14 H           3.0861   -2.6588   -2.0822 H       1  LIG1        0.0265\n     15 H           1.5550   -1.8040   -1.9616 H       1  LIG1        0.0265\n     16 H           4.2430   -0.6482   -2.8423 H       1  LIG1        0.0265\n     17 H           2.8244   -0.9091   -3.8522 H       1  LIG1        0.0265\n     18 H           3.1052    1.4851   -3.1790 H       1  LIG1        0.0265\n     19 H           1.5667    0.8148   -2.6555 H       1  LIG1        0.0265\n     20 H           4.0736    1.2348   -0.9613 H       1  LIG1        0.0268\n     21 H           2.5648    2.1260   -0.8271 H       1  LIG1        0.0268\n@<TRIPOS>BOND\n     1     2     7    1\n     2     2     3    1\n     3     6     7    1\n     4     5     6    1\n     5     4     5    1\n     6     3     4    1\n     7     1     2    1\n     8     1     8    1\n     9     1     9    1\n    10     1    10    1\n    11     2    11    1\n    12     3    12    1\n    13     3    13    1\n    14     4    14    1\n    15     4    15    1\n    16     5    16    1\n    17     5    17    1\n    18     6    18    1\n    19     6    19    1\n    20     7    20    1\n    21     7    21    1\n"
  },
  {
    "path": "src/openfe/tests/data/lomap_basic/toluene.mol2",
    "content": "@<TRIPOS>MOLECULE\n*****\n 15 15 0 0 0\nSMALL\nGASTEIGER\n\n@<TRIPOS>ATOM\n      1 C           0.9562    0.0874    0.1225 C.3     1  LIG1       -0.0397\n      2 C           2.4532    0.1169    0.0327 C.ar    1  LIG1       -0.0504\n      3 C           3.1480    1.3313   -0.0192 C.ar    1  LIG1       -0.0588\n      4 C           4.5410    1.3447   -0.1106 C.ar    1  LIG1       -0.0615\n      5 C           5.2502    0.1457   -0.1538 C.ar    1  LIG1       -0.0617\n      6 C           4.5672   -1.0681   -0.1065 C.ar    1  LIG1       -0.0615\n      7 C           3.1745   -1.0830   -0.0148 C.ar    1  LIG1       -0.0588\n      8 H           0.5405    1.0944    0.2295 H       1  LIG1        0.0278\n      9 H           0.6412   -0.4972    0.9928 H       1  LIG1        0.0278\n     10 H           0.5343   -0.3590   -0.7834 H       1  LIG1        0.0278\n     11 H           2.6097    2.2757    0.0116 H       1  LIG1        0.0620\n     12 H           5.0726    2.2915   -0.1488 H       1  LIG1        0.0618\n     13 H           6.3343    0.1573   -0.2252 H       1  LIG1        0.0618\n     14 H           5.1186   -2.0039   -0.1418 H       1  LIG1        0.0618\n     15 H           2.6530   -2.0368    0.0195 H       1  LIG1        0.0620\n@<TRIPOS>BOND\n     1     2     3   ar\n     2     3     4   ar\n     3     2     7   ar\n     4     6     7   ar\n     5     5     6   ar\n     6     4     5   ar\n     7     1     2    1\n     8     1     8    1\n     9     1     9    1\n    10     1    10    1\n    11     3    11    1\n    12     4    12    1\n    13     5    13    1\n    14     6    14    1\n    15     7    15    1\n"
  },
  {
    "path": "src/openfe/tests/data/multi_molecule.sdf",
    "content": "\n     RDKit          2D\n\n  3  2  0  0  0  0  0  0  0  0999 V2000\n    0.0000    0.0000    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0\n    1.2990    0.7500    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0\n    2.5981   -0.0000    0.0000 O   0  0  0  0  0  0  0  0  0  0  0  0\n  1  2  1  0\n  2  3  1  0\nM  END\n$$$$\n\n     RDKit          2D\n\n  3  2  0  0  0  0  0  0  0  0999 V2000\n    0.0000    0.0000    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0\n    1.2990    0.7500    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0\n    2.5981   -0.0000    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0\n  1  2  1  0\n  2  3  1  0\nM  END\n$$$$\n"
  },
  {
    "path": "src/openfe/tests/data/openmm_afe/__init__.py",
    "content": "\n"
  },
  {
    "path": "src/openfe/tests/data/openmm_md/__init__.py",
    "content": "\n"
  },
  {
    "path": "src/openfe/tests/data/openmm_rfe/__init__.py",
    "content": ""
  },
  {
    "path": "src/openfe/tests/data/openmm_rfe/benzene_toluene_hybrid_top/hybrid_topology_atoms.csv",
    "content": ",serial,name,element,resSeq,resName,chainID,segmentID,formal_charge\n0,,C1x,C,0,UNK,0,,\n1,,C2x,C,0,UNK,0,,\n2,,C3x,C,0,UNK,0,,\n3,,C4x,C,0,UNK,0,,\n4,,C5x,C,0,UNK,0,,\n5,,C6x,C,0,UNK,0,,\n6,,H1x,H,0,UNK,0,,\n7,,H2x,H,0,UNK,0,,\n8,,H3x,H,0,UNK,0,,\n9,,H4x,H,0,UNK,0,,\n10,,H5x,H,0,UNK,0,,\n11,,H6x,H,0,UNK,0,,\n12,,H1x,H,0,UNK,0,,\n13,,H2x,H,0,UNK,0,,\n14,,C1x,C,0,UNK,0,,\n15,,H3x,H,0,UNK,0,,\n"
  },
  {
    "path": "src/openfe/tests/data/openmm_rfe/benzene_toluene_hybrid_top/hybrid_topology_bonds.txt",
    "content": "0.000000000000000000e+00 1.000000000000000000e+00 1.500000000000000000e+00 2.000000000000000000e+00\n0.000000000000000000e+00 5.000000000000000000e+00 1.500000000000000000e+00 1.000000000000000000e+00\n0.000000000000000000e+00 6.000000000000000000e+00 1.000000000000000000e+00 1.000000000000000000e+00\n1.000000000000000000e+00 2.000000000000000000e+00 1.500000000000000000e+00 1.000000000000000000e+00\n1.000000000000000000e+00 7.000000000000000000e+00 1.000000000000000000e+00 1.000000000000000000e+00\n2.000000000000000000e+00 3.000000000000000000e+00 1.500000000000000000e+00 2.000000000000000000e+00\n2.000000000000000000e+00 8.000000000000000000e+00 1.000000000000000000e+00 1.000000000000000000e+00\n3.000000000000000000e+00 4.000000000000000000e+00 1.500000000000000000e+00 1.000000000000000000e+00\n3.000000000000000000e+00 9.000000000000000000e+00 1.000000000000000000e+00 1.000000000000000000e+00\n4.000000000000000000e+00 5.000000000000000000e+00 1.500000000000000000e+00 2.000000000000000000e+00\n4.000000000000000000e+00 1.000000000000000000e+01 1.000000000000000000e+00 1.000000000000000000e+00\n5.000000000000000000e+00 1.100000000000000000e+01 1.000000000000000000e+00 1.000000000000000000e+00\n1.200000000000000000e+01 1.400000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00\n1.300000000000000000e+01 1.400000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00\n1.400000000000000000e+01 1.500000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00\n4.000000000000000000e+00 1.400000000000000000e+01 0.000000000000000000e+00 0.000000000000000000e+00\n"
  },
  {
    "path": "src/openfe/tests/data/openmm_rfe/charged_benzenes.sdf",
    "content": "benzene\n  PyMOL2.5          3D                             0\n\n 12 12  0  0  0  0  0  0  0  0999 V2000\n    1.4045   -0.0000    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0\n    0.7022    1.2164    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -0.7023    1.2164    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -1.4045   -0.0000    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -0.7023   -1.2164    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0\n    0.7023   -1.2164    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0\n    2.5079   -0.0000    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0\n    1.2540    2.1720    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -1.2540    2.1720    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -2.5079   -0.0000    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -1.2540   -2.1719    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0\n    1.2540   -2.1720    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0\n  1  2  2  0  0  0  0\n  1  6  1  0  0  0  0\n  1  7  1  0  0  0  0\n  2  3  1  0  0  0  0\n  2  8  1  0  0  0  0\n  3  4  2  0  0  0  0\n  3  9  1  0  0  0  0\n  4  5  1  0  0  0  0\n  4 10  1  0  0  0  0\n  5  6  2  0  0  0  0\n  5 11  1  0  0  0  0\n  6 12  1  0  0  0  0\nM  END\n$$$$\naniline\n  PyMOL2.5          3D                             0\n\n 15 15  0  0  0  0  0  0  0  0999 V2000\n    1.4045   -0.0000    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0\n    0.7022    1.2164    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -0.7023    1.2164    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -1.4045   -0.0000    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -0.7023   -1.2164    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0\n    0.7023   -1.2164    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0\n    3.2106    0.8251    0.4756 H   0  0  0  0  0  0  0  0  0  0  0  0\n    3.2117   -0.8238    0.4772 H   0  0  0  0  0  0  0  0  0  0  0  0\n    3.2117   -0.0000   -0.9520 H   0  0  0  0  0  0  0  0  0  0  0  0\n    2.8745   -0.0000    0.0000 N   0  3  0  0  0  0  0  0  0  0  0  0\n    1.2540    2.1720    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -1.2540    2.1720    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -2.5079   -0.0000    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -1.2540   -2.1719    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0\n    1.2540   -2.1720    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0\n  1  2  2  0  0  0  0\n  1  6  1  0  0  0  0\n  1 10  1  0  0  0  0\n  2  3  1  0  0  0  0\n  2 11  1  0  0  0  0\n  3  4  2  0  0  0  0\n  3 12  1  0  0  0  0\n  4  5  1  0  0  0  0\n  4 13  1  0  0  0  0\n  5  6  2  0  0  0  0\n  5 14  1  0  0  0  0\n  6 15  1  0  0  0  0\n  7 10  1  0  0  0  0\n  8 10  1  0  0  0  0\n  9 10  1  0  0  0  0\nM  END\n$$$$\nbenzoic_acid\n  PyMOL2.5          3D                             0\n\n 14 14  0  0  0  0  0  0  0  0999 V2000\n    1.4045   -0.0000    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0\n    2.7445   -0.0000    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0\n    3.2607   -1.0833    0.0000 O   0  5  0  0  0  0  0  0  0  0  0  0\n    0.7022    1.2164    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -0.7023    1.2164    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0\n    3.4265    1.0159    0.0000 O   0  0  0  0  0  0  0  0  0  0  0  0\n   -1.4045   -0.0000    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -0.7023   -1.2164    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0\n    0.7023   -1.2164    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0\n    1.2540    2.1720    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -1.2540    2.1720    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -2.5079   -0.0000    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -1.2540   -2.1719    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0\n    1.2540   -2.1720    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0\n  1  2  1  0  0  0  0\n  1  4  2  0  0  0  0\n  1  9  1  0  0  0  0\n  2  3  1  0  0  0  0\n  2  6  2  0  0  0  0\n  4  5  1  0  0  0  0\n  4 10  1  0  0  0  0\n  5  7  2  0  0  0  0\n  5 11  1  0  0  0  0\n  7  8  1  0  0  0  0\n  7 12  1  0  0  0  0\n  8  9  2  0  0  0  0\n  8 13  1  0  0  0  0\n  9 14  1  0  0  0  0\nM  END\n$$$$\n"
  },
  {
    "path": "src/openfe/tests/data/openmm_rfe/dummy_charge_ligand_23.sdf",
    "content": "ligand_23\n     RDKit          3D\n\n 36 38  0  0  0  0  0  0  0  0999 V2000\n   -1.9600   21.5500  -27.3300 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -1.2900   22.4100  -28.2000 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -1.9600   22.9500  -29.2900 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -3.3000   22.6200  -29.5400 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -3.9700   21.7600  -28.6500 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -3.2900   21.2300  -27.5600 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -5.6400   21.3500  -28.9200 Cl  0  0  0  0  0  0  0  0  0  0  0  0\n   -4.0400   23.1500  -30.7100 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -4.2300   22.4200  -31.6700 O   0  0  0  0  0  0  0  0  0  0  0  0\n   -4.5100   24.4100  -30.6500 N   0  0  0  0  0  0  0  0  0  0  0  0\n   -5.2900   25.1100  -31.5800 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -5.9600   24.5500  -32.6800 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -6.7800   25.3600  -33.4600 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -6.9200   26.6500  -33.1800 N   0  0  0  0  0  0  0  0  0  0  0  0\n   -6.3000   27.2300  -32.1600 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -5.5100   26.4600  -31.3100 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -6.5400   28.5800  -31.8800 N   0  0  0  0  0  0  0  0  0  0  0  0\n   -5.7100   29.4500  -31.2300 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -4.6200   29.1200  -30.8100 O   0  0  0  0  0  0  0  0  0  0  0  0\n   -6.2300   30.8500  -31.0300 C   0  0  1  0  0  0  0  0  0  0  0  0\n   -5.5800   31.7500  -29.9800 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -5.3600   32.0200  -31.4700 C   0  0  1  0  0  0  0  0  0  0  0  0\n   -4.1100   31.7200  -32.0100 F   0  0  0  0  0  0  0  0  0  0  0  0\n   -1.1100   24.0500  -30.3300 Cl  0  0  0  0  0  0  0  0  0  0  0  0\n   -7.3100   30.9400  -31.1600 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -5.8600   32.9000  -31.8800 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -1.4400   21.1300  -26.4800 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -0.2600   22.6600  -28.0200 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -3.8100   20.5600  -26.8900 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -4.3200   24.9800  -29.8400 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -5.8400   23.5000  -32.9100 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.3100   24.9400  -34.3000 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -5.0600   26.9100  -30.4300 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.4000   29.0100  -32.1800 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -6.3500   32.2000  -29.3600 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -4.9200   31.1500  -29.3500 H   0  0  0  0  0  0  0  0  0  0  0  0\n 13 32  1  0\n 13 14  1  0\n 12 13  2  0\n 14 15  2  0\n 12 31  1  0\n 11 12  1  0\n 17 34  1  0\n 15 17  1  0\n 15 16  1  0\n 22 23  1  0\n 17 18  1  0\n 22 26  1  6\n  8  9  2  0\n 11 16  2  0\n 10 11  1  0\n 20 22  1  0\n 21 22  1  0\n 16 33  1  0\n 18 20  1  0\n 18 19  2  0\n 20 25  1  6\n 20 21  1  0\n  8 10  1  0\n  4  8  1  0\n 10 30  1  0\n  3 24  1  0\n 21 35  1  0\n 21 36  1  0\n  3  4  2  0\n  4  5  1  0\n  2  3  1  0\n  5  7  1  0\n  5  6  2  0\n  2 28  1  0\n  1  2  2  0\n  1  6  1  0\n  6 29  1  0\n  1 27  1  0\nM  END\n>  <atom.dprop.PartialCharge>  (1) \n-0.097000000000000003 -0.1295 0.050899999999999994 -0.1426 0.050899999999999994 -0.1295 -0.058400000000000007 0.68969999999999998 -0.53810000000000002 -0.46510000000000001 0.1236\n-0.32829999999999998 0.44219999999999998 -0.72699999999999998 0.54220000000000002 -0.27029999999999998 -0.5464 0.69610000000000005 -0.56910000000000005 -0.23069999999999999\n-0.13339999999999999 0.12759999999999999 -0.20530000000000001 -0.058400000000000007 0.1237 0.1027 0.14799999999999999 0.1565 0.1565 0.32550000000000001 0.14199999999999999\n0.022099999999999995 0.20300000000000001 0.33750000000000002 0.094200000000000006 0.094200000000000006\n\n$$$$\n"
  },
  {
    "path": "src/openfe/tests/data/openmm_rfe/dummy_charge_ligand_55.sdf",
    "content": "ligand_55\n     RDKit          3D\n\n 33 34  0  0  0  0  0  0  0  0999 V2000\n   -1.9600   21.5500  -27.3300 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -1.2900   22.4100  -28.2000 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -1.9600   22.9500  -29.2900 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -3.3000   22.6200  -29.5400 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -3.9700   21.7600  -28.6500 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -3.2900   21.2300  -27.5600 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -5.6400   21.3500  -28.9200 Cl  0  0  0  0  0  0  0  0  0  0  0  0\n   -4.0400   23.1500  -30.7100 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -4.2300   22.4200  -31.6700 O   0  0  0  0  0  0  0  0  0  0  0  0\n   -4.5100   24.4100  -30.6500 N   0  0  0  0  0  0  0  0  0  0  0  0\n   -5.2900   25.1100  -31.5800 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -5.9600   24.5500  -32.6800 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -6.7800   25.3600  -33.4600 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -6.9200   26.6500  -33.1800 N   0  0  0  0  0  0  0  0  0  0  0  0\n   -6.3000   27.2300  -32.1600 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -5.5100   26.4600  -31.3100 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -6.5400   28.5800  -31.8800 N   0  0  0  0  0  0  0  0  0  0  0  0\n   -5.7100   29.4500  -31.2300 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -4.6200   29.1200  -30.8100 O   0  0  0  0  0  0  0  0  0  0  0  0\n   -1.1100   24.0500  -30.3300 Cl  0  0  0  0  0  0  0  0  0  0  0  0\n   -1.4400   21.1300  -26.4800 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -0.2600   22.6600  -28.0200 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -3.8100   20.5600  -26.8900 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -4.3200   24.9800  -29.8400 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -5.8400   23.5000  -32.9100 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.3100   24.9400  -34.3000 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -5.0600   26.9100  -30.4300 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.4000   29.0100  -32.1800 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -5.1900   31.8500  -30.6800 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -5.5900   32.8600  -30.8200 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -4.9100   31.7200  -29.6300 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -6.2500   30.8500  -31.0300 O   0  0  0  0  0  0  0  0  0  0  0  0\n   -4.3200   31.7100  -31.3200 H   0  0  0  0  0  0  0  0  0  0  0  0\n 13 26  1  0\n 13 14  1  0\n 12 13  2  0\n 14 15  2  0\n 12 25  1  0\n 11 12  1  0\n 17 28  1  0\n 15 17  1  0\n 15 16  1  0\n 17 18  1  0\n  8  9  2  0\n 11 16  2  0\n 10 11  1  0\n 29 33  1  0\n 16 27  1  0\n 18 32  1  0\n 18 19  2  0\n 29 32  1  0\n 29 30  1  0\n  8 10  1  0\n  4  8  1  0\n 29 31  1  0\n 10 24  1  0\n  3 20  1  0\n  3  4  2  0\n  4  5  1  0\n  2  3  1  0\n  5  7  1  0\n  5  6  2  0\n  2 22  1  0\n  1  2  2  0\n  1  6  1  0\n  6 23  1  0\n  1 21  1  0\nM  END\n>  <atom.dprop.PartialCharge>  (1) \n-0.094999969696969694 -0.1279999696969697 0.052400030303030309 -0.1445999696969697 0.052400030303030309 -0.1279999696969697 -0.059899969696969695 0.69270003030303029 -0.54809996969696972\n-0.4610999696969697 0.1306000303030303 -0.2992999696969697 0.44520003030303029 -0.72799996969696967 0.55120003030303033 -0.32229996969696967 -0.51939996969696967 0.74610003030303029\n-0.57699996969696965 -0.059899969696969695 0.1480000303030303 0.15800003030303031 0.15800003030303031 0.33150003030303032 0.1840000303030303 0.028100030303030307 0.1790000303030303\n0.35250003030303029 0.1387000303030303 0.055033030303030306 0.055033030303030306 -0.44289996969696971 0.055033030303030306\n\n$$$$\n"
  },
  {
    "path": "src/openfe/tests/data/openmm_rfe/ligand_23.sdf",
    "content": "ligand_23\n     RDKit          3D\n\n 36 38  0  0  0  0  0  0  0  0999 V2000\n   -1.9600   21.5500  -27.3300 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -1.2900   22.4100  -28.2000 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -1.9600   22.9500  -29.2900 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -3.3000   22.6200  -29.5400 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -3.9700   21.7600  -28.6500 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -3.2900   21.2300  -27.5600 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -5.6400   21.3500  -28.9200 Cl  0  0  0  0  0  0  0  0  0  0  0  0\n   -4.0400   23.1500  -30.7100 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -4.2300   22.4200  -31.6700 O   0  0  0  0  0  0  0  0  0  0  0  0\n   -4.5100   24.4100  -30.6500 N   0  0  0  0  0  0  0  0  0  0  0  0\n   -5.2900   25.1100  -31.5800 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -5.9600   24.5500  -32.6800 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -6.7800   25.3600  -33.4600 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -6.9200   26.6500  -33.1800 N   0  0  0  0  0  0  0  0  0  0  0  0\n   -6.3000   27.2300  -32.1600 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -5.5100   26.4600  -31.3100 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -6.5400   28.5800  -31.8800 N   0  0  0  0  0  0  0  0  0  0  0  0\n   -5.7100   29.4500  -31.2300 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -4.6200   29.1200  -30.8100 O   0  0  0  0  0  0  0  0  0  0  0  0\n   -6.2300   30.8500  -31.0300 C   0  0  1  0  0  0  0  0  0  0  0  0\n   -5.5800   31.7500  -29.9800 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -5.3600   32.0200  -31.4700 C   0  0  1  0  0  0  0  0  0  0  0  0\n   -4.1100   31.7200  -32.0100 F   0  0  0  0  0  0  0  0  0  0  0  0\n   -1.1100   24.0500  -30.3300 Cl  0  0  0  0  0  0  0  0  0  0  0  0\n   -7.3100   30.9400  -31.1600 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -5.8600   32.9000  -31.8800 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -1.4400   21.1300  -26.4800 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -0.2600   22.6600  -28.0200 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -3.8100   20.5600  -26.8900 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -4.3200   24.9800  -29.8400 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -5.8400   23.5000  -32.9100 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.3100   24.9400  -34.3000 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -5.0600   26.9100  -30.4300 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.4000   29.0100  -32.1800 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -6.3500   32.2000  -29.3600 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -4.9200   31.1500  -29.3500 H   0  0  0  0  0  0  0  0  0  0  0  0\n 13 32  1  0\n 13 14  1  0\n 12 13  2  0\n 14 15  2  0\n 12 31  1  0\n 11 12  1  0\n 17 34  1  0\n 15 17  1  0\n 15 16  1  0\n 22 23  1  0\n 17 18  1  0\n 22 26  1  6\n  8  9  2  0\n 11 16  2  0\n 10 11  1  0\n 20 22  1  0\n 21 22  1  0\n 16 33  1  0\n 18 20  1  0\n 18 19  2  0\n 20 25  1  6\n 20 21  1  0\n  8 10  1  0\n  4  8  1  0\n 10 30  1  0\n  3 24  1  0\n 21 35  1  0\n 21 36  1  0\n  3  4  2  0\n  4  5  1  0\n  2  3  1  0\n  5  7  1  0\n  5  6  2  0\n  2 28  1  0\n  1  2  2  0\n  1  6  1  0\n  6 29  1  0\n  1 27  1  0\nM  END\n$$$$\n"
  },
  {
    "path": "src/openfe/tests/data/openmm_rfe/ligand_55.sdf",
    "content": "ligand_55\n     RDKit          3D\n\n 33 34  0  0  0  0  0  0  0  0999 V2000\n   -1.9600   21.5500  -27.3300 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -1.2900   22.4100  -28.2000 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -1.9600   22.9500  -29.2900 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -3.3000   22.6200  -29.5400 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -3.9700   21.7600  -28.6500 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -3.2900   21.2300  -27.5600 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -5.6400   21.3500  -28.9200 Cl  0  0  0  0  0  0  0  0  0  0  0  0\n   -4.0400   23.1500  -30.7100 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -4.2300   22.4200  -31.6700 O   0  0  0  0  0  0  0  0  0  0  0  0\n   -4.5100   24.4100  -30.6500 N   0  0  0  0  0  0  0  0  0  0  0  0\n   -5.2900   25.1100  -31.5800 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -5.9600   24.5500  -32.6800 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -6.7800   25.3600  -33.4600 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -6.9200   26.6500  -33.1800 N   0  0  0  0  0  0  0  0  0  0  0  0\n   -6.3000   27.2300  -32.1600 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -5.5100   26.4600  -31.3100 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -6.5400   28.5800  -31.8800 N   0  0  0  0  0  0  0  0  0  0  0  0\n   -5.7100   29.4500  -31.2300 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -4.6200   29.1200  -30.8100 O   0  0  0  0  0  0  0  0  0  0  0  0\n   -1.1100   24.0500  -30.3300 Cl  0  0  0  0  0  0  0  0  0  0  0  0\n   -1.4400   21.1300  -26.4800 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -0.2600   22.6600  -28.0200 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -3.8100   20.5600  -26.8900 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -4.3200   24.9800  -29.8400 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -5.8400   23.5000  -32.9100 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.3100   24.9400  -34.3000 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -5.0600   26.9100  -30.4300 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.4000   29.0100  -32.1800 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -5.1900   31.8500  -30.6800 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -5.5900   32.8600  -30.8200 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -4.9100   31.7200  -29.6300 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -6.2500   30.8500  -31.0300 O   0  0  0  0  0  0  0  0  0  0  0  0\n   -4.3200   31.7100  -31.3200 H   0  0  0  0  0  0  0  0  0  0  0  0\n 13 26  1  0\n 13 14  1  0\n 12 13  2  0\n 14 15  2  0\n 12 25  1  0\n 11 12  1  0\n 17 28  1  0\n 15 17  1  0\n 15 16  1  0\n 17 18  1  0\n  8  9  2  0\n 11 16  2  0\n 10 11  1  0\n 29 33  1  0\n 16 27  1  0\n 18 32  1  0\n 18 19  2  0\n 29 32  1  0\n 29 30  1  0\n  8 10  1  0\n  4  8  1  0\n 29 31  1  0\n 10 24  1  0\n  3 20  1  0\n  3  4  2  0\n  4  5  1  0\n  2  3  1  0\n  5  7  1  0\n  5  6  2  0\n  2 22  1  0\n  1  2  2  0\n  1  6  1  0\n  6 23  1  0\n  1 21  1  0\nM  END\n$$$$\n"
  },
  {
    "path": "src/openfe/tests/data/openmm_rfe/malt1_shapefit_1832577-09-9.sdf",
    "content": "1832577-09-9\n     RDKit          3D\n\n 42 44  0  0  0  0  0  0  0  0999 V2000\n  -10.5334  -24.7004   10.8465 C   0  0  0  0  0  0  0  0  0  0  0  0\n  -12.2375  -23.4317   11.9659 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.0781  -15.7676   14.8202 C   0  0  0  0  0  0  0  0  0  0  0  0\n  -11.4686  -25.7088   10.6839 C   0  0  0  0  0  0  0  0  0  0  0  0\n  -10.9226  -23.5382   11.5125 C   0  0  0  0  0  0  0  0  0  0  0  0\n  -13.1112  -24.4951   11.7511 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.6176  -15.0858   13.6901 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.3276  -17.0469   14.3752 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.9990  -19.1925   14.2702 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.7389  -19.3130   12.8049 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.1967  -18.2212   12.2237 C   0  0  0  0  0  0  0  0  0  0  0  0\n  -10.0695  -21.3590   12.4332 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -6.6229  -18.7823   10.3075 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -9.4574  -17.7523    8.9592 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.9112  -18.0842   10.7331 C   0  0  1  0  0  0  0  0  0  0  0  0\n  -14.5419  -24.4050   12.1861 C   0  0  0  0  0  0  0  0  0  0  0  0\n  -12.7444  -25.6344   11.1183 N   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.5397  -15.8574   12.6119 N   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.8095  -18.1459   15.0128 N   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.0014  -17.0717   13.0171 N   0  0  0  0  0  0  0  0  0  0  0  0\n   -9.9582  -22.5164   11.6556 N   0  0  0  0  0  0  0  0  0  0  0  0\n   -9.0189  -20.4821   12.1403 N   0  0  0  0  0  0  0  0  0  0  0  0\n  -10.9683  -21.1116   13.2336 O   0  0  0  0  0  0  0  0  0  0  0  0\n   -9.0133  -18.6233    9.9903 O   0  0  0  0  0  0  0  0  0  0  0  0\n  -14.8129  -23.3365   12.9853 F   0  0  0  0  0  0  0  0  0  0  0  0\n  -15.3944  -24.3052   11.1299 F   0  0  0  0  0  0  0  0  0  0  0  0\n  -14.9390  -25.5006   12.8886 F   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.1927  -13.4497   13.6054 Cl  0  0  0  0  0  0  0  0  0  0  0  0\n   -9.5246  -24.8290   10.4673 H   0  0  0  0  0  0  0  0  0  0  0  0\n  -12.6096  -22.5382   12.4512 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.2318  -15.3930   15.8221 H   0  0  0  0  0  0  0  0  0  0  0  0\n  -11.2061  -26.6332   10.1807 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -9.3567  -20.1035   14.7754 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -6.6919  -19.8701   10.4066 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -5.7650  -18.4293   10.8885 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -6.4262  -18.5845    9.2476 H   0  0  0  0  0  0  0  0  0  0  0  0\n  -10.2928  -18.2284    8.4403 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.6511  -17.5717    8.2429 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -9.8072  -16.8053    9.3830 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.8052  -17.0236   10.4761 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -9.0700  -22.6660   11.1835 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.5590  -20.6256   11.2464 H   0  0  0  0  0  0  0  0  0  0  0  0\n  1  4  2  0\n  1  5  1  0\n  2  5  2  0\n  2  6  1  0\n  3  7  1  0\n  3  8  2  0\n  4 17  1  0\n  5 21  1  0\n  6 16  1  0\n  6 17  2  0\n  7 18  2  0\n  7 28  1  0\n  8 19  1  0\n  8 20  1  0\n  9 10  1  0\n  9 19  2  0\n 10 11  2  0\n 10 22  1  0\n 11 15  1  0\n 11 20  1  0\n 12 21  1  0\n 12 22  1  0\n 12 23  2  0\n 13 15  1  0\n 14 24  1  0\n 15 24  1  0\n 16 25  1  0\n 16 26  1  0\n 16 27  1  0\n 18 20  1  0\n  1 29  1  0\n  2 30  1  0\n  3 31  1  0\n  4 32  1  0\n  9 33  1  0\n 13 34  1  0\n 13 35  1  0\n 13 36  1  0\n 14 37  1  0\n 14 38  1  0\n 14 39  1  0\n 15 40  1  6\n 21 41  1  0\n 22 42  1  0\nM  END\n>  <atom.dprop.PartialCharge>  (1)\n-0.28232385714285713 -0.21832385714285713 -0.27862385714285715 0.42117614285714289 0.10657614285714286 0.34757614285714289 0.39957614285714288 0.34647614285714284 0.41317614285714288\n-0.16672385714285712 0.064376142857142854 0.75507614285714286 -0.10212385714285714 0.10967614285714286 0.19037614285714288 0.59957614285714289 -0.63702385714285714 -0.51012385714285713\n-0.61002385714285712 0.054176142857142853 -0.46912385714285715 -0.43812385714285712 -0.58612385714285709 -0.38862385714285713 -0.22632385714285713 -0.22632385714285713 -0.22632385714285713\n-0.042323857142857142 0.14797614285714286 0.19997614285714288 0.19197614285714287 0.036076142857142855 0.032076142857142852 0.06534314285714285 0.06534314285714285 0.06534314285714285\n0.036343142857142852 0.036343142857142852 0.036343142857142852 0.063676142857142862 0.31947614285714288 0.30447614285714286\n\n$$$$\n"
  },
  {
    "path": "src/openfe/tests/data/openmm_rfe/malt1_shapefit_Pfizer-01-01.sdf",
    "content": "Pfizer-01-01\n     RDKit          3D\n\n 41 43  0  0  0  0  0  0  0  0999 V2000\n  -10.4516  -24.7374   10.8592 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.0415  -15.7554   14.6861 C   0  0  0  0  0  0  0  0  0  0  0  0\n  -12.1995  -23.5068   11.9598 C   0  0  0  0  0  0  0  0  0  0  0  0\n  -11.3650  -25.7538   10.6519 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.6252  -15.0904   13.5309 C   0  0  0  0  0  0  0  0  0  0  0  0\n  -10.8751  -23.5938   11.5374 C   0  0  0  0  0  0  0  0  0  0  0  0\n  -13.0474  -24.5795   11.6985 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.3405  -17.0307   14.2671 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -9.0021  -19.1792   14.2556 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.7289  -19.3573   12.8025 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.2349  -18.2799   12.1537 C   0  0  0  0  0  0  0  0  0  0  0  0\n  -10.0585  -21.4037   12.4667 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -9.1650  -17.7186    9.8701 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -6.6506  -17.6895   10.1921 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.9771  -18.2985   10.6433 C   0  0  0  0  0  0  0  0  0  0  0  0\n  -14.4786  -24.5193   12.1303 C   0  0  0  0  0  0  0  0  0  0  0  0\n  -12.6493  -25.7028   11.0565 N   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.6436  -15.8678   12.4511 N   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.8156  -18.1033   14.9523 N   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.0598  -17.0872   12.8947 N   0  0  0  0  0  0  0  0  0  0  0  0\n   -9.9191  -22.5788   11.7247 N   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.9690  -20.5680   12.2086 N   0  0  0  0  0  0  0  0  0  0  0  0\n  -11.0007  -21.1080   13.1964 O   0  0  0  0  0  0  0  0  0  0  0  0\n  -15.1528  -23.4749   11.5765 F   0  0  0  0  0  0  0  0  0  0  0  0\n  -15.1768  -25.6365   11.7900 F   0  0  0  0  0  0  0  0  0  0  0  0\n  -14.6164  -24.3881   13.4776 F   0  0  0  0  0  0  0  0  0  0  0  0\n   -9.4316  -24.8426   10.5033 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.1283  -15.3694   15.6916 H   0  0  0  0  0  0  0  0  0  0  0  0\n  -12.5978  -22.6339   12.4625 H   0  0  0  0  0  0  0  0  0  0  0  0\n  -11.0765  -26.6639   10.1381 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.3103  -14.0623   13.4264 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -9.3639  -20.0703   14.7933 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -9.3154  -16.6559   10.0803 H   0  0  0  0  0  0  0  0  0  0  0  0\n  -10.0909  -18.2494   10.1233 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -9.0120  -17.8326    8.7910 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -6.6454  -16.5986   10.2486 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -6.4604  -17.9536    9.1452 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -5.8198  -18.0816   10.7876 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.9000  -19.3380   10.3085 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -9.0114  -22.7367   11.2938 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.4315  -20.8010   11.3813 H   0  0  0  0  0  0  0  0  0  0  0  0\n  1  4  2  0\n  1  6  1  0\n  2  5  1  0\n  2  8  2  0\n  3  6  2  0\n  3  7  1  0\n  4 17  1  0\n  5 18  2  0\n  6 21  1  0\n  7 16  1  0\n  7 17  2  0\n  8 19  1  0\n  8 20  1  0\n  9 10  1  0\n  9 19  2  0\n 10 11  2  0\n 10 22  1  0\n 11 15  1  0\n 11 20  1  0\n 12 21  1  0\n 12 22  1  0\n 12 23  2  0\n 13 15  1  0\n 14 15  1  0\n 16 24  1  0\n 16 25  1  0\n 16 26  1  0\n 18 20  1  0\n  1 27  1  0\n  2 28  1  0\n  3 29  1  0\n  4 30  1  0\n  5 31  1  0\n  9 32  1  0\n 13 33  1  0\n 13 34  1  0\n 13 35  1  0\n 14 36  1  0\n 14 37  1  0\n 14 38  1  0\n 15 39  1  0\n 21 40  1  0\n 22 41  1  0\nM  END\n>  <atom.dprop.PartialCharge>  (1)\n-0.24122690243902437 -0.29752690243902435 -0.26022690243902435 0.41927309756097564 0.37157309756097562 0.10867309756097562 0.35167309756097564 0.3465730975609756 0.45327309756097561\n-0.13062690243902439 0.019473097560975618 0.77017309756097563 -0.094026902439024382 -0.094026902439024382 -0.016326902439024384 0.59867309756097564 -0.63792690243902439\n-0.56402690243902442 -0.61792690243902437 0.051273097560975624 -0.4700269024390244 -0.44502690243902437 -0.59702690243902434 -0.22855990243902438 -0.22855990243902438 -0.22855990243902438\n0.19107309756097562 0.18307309756097562 0.16007309756097562 0.039173097560975624 0.055873097560975624 0.059173097560975621 0.048940097560975622 0.048940097560975622 0.048940097560975622\n0.048940097560975622 0.048940097560975622 0.048940097560975622 0.045773097560975619 0.32057309756097563 0.31257309756097562\n\n$$$$\n"
  },
  {
    "path": "src/openfe/tests/data/openmm_rfe/reference.xml",
    "content": "<?xml version='1.0' encoding='us-ascii'?>\n<System openmmVersion=\"7.7\" type=\"System\" version=\"1\">\n\t<PeriodicBoxVectors>\n\t\t<A x=\"2\" y=\"0\" z=\"0\"/>\n\t\t<B x=\"0\" y=\"2\" z=\"0\"/>\n\t\t<C x=\"0\" y=\"0\" z=\"2\"/>\n\t</PeriodicBoxVectors>\n\t<Particles>\n\t\t<Particle mass=\"10.018727\"/>\n\t\t<Particle mass=\"10.018727\"/>\n\t\t<Particle mass=\"12.01078\"/>\n\t\t<Particle mass=\"12.01078\"/>\n\t\t<Particle mass=\"12.01078\"/>\n\t\t<Particle mass=\"10.018727\"/>\n\t\t<Particle mass=\"35.4532\"/>\n\t\t<Particle mass=\"12.01078\"/>\n\t\t<Particle mass=\"15.99943\"/>\n\t\t<Particle mass=\"12.014667\"/>\n\t\t<Particle mass=\"12.01078\"/>\n\t\t<Particle mass=\"10.018727\"/>\n\t\t<Particle mass=\"10.018727\"/>\n\t\t<Particle mass=\"14.00672\"/>\n\t\t<Particle mass=\"12.01078\"/>\n\t\t<Particle mass=\"10.018727\"/>\n\t\t<Particle mass=\"12.014667\"/>\n\t\t<Particle mass=\"12.01078\"/>\n\t\t<Particle mass=\"15.99943\"/>\n\t\t<Particle mass=\"10.018727\"/>\n\t\t<Particle mass=\"8.026674\"/>\n\t\t<Particle mass=\"10.018727\"/>\n\t\t<Particle mass=\"18.99840325\"/>\n\t\t<Particle mass=\"35.4532\"/>\n\t\t<Particle mass=\"3\"/>\n\t\t<Particle mass=\"3\"/>\n\t\t<Particle mass=\"3\"/>\n\t\t<Particle mass=\"3\"/>\n\t\t<Particle mass=\"3\"/>\n\t\t<Particle mass=\"3\"/>\n\t\t<Particle mass=\"3\"/>\n\t\t<Particle mass=\"3\"/>\n\t\t<Particle mass=\"3\"/>\n\t\t<Particle mass=\"3\"/>\n\t\t<Particle mass=\"3\"/>\n\t\t<Particle mass=\"3\"/>\n\t\t<Particle mass=\"6.034621\"/>\n\t\t<Particle mass=\"3\"/>\n\t\t<Particle mass=\"3\"/>\n\t\t<Particle mass=\"15.99943\"/>\n\t\t<Particle mass=\"3\"/>\n\t</Particles>\n\t<Constraints>\n\t\t<Constraint d=\".1085358495916\" p1=\"12\" p2=\"31\"/>\n\t\t<Constraint d=\".1085358495916\" p1=\"11\" p2=\"30\"/>\n\t\t<Constraint d=\".10194818650269998\" p1=\"16\" p2=\"33\"/>\n\t\t<Constraint d=\".1093899492634\" p1=\"21\" p2=\"25\"/>\n\t\t<Constraint d=\".1085358495916\" p1=\"15\" p2=\"32\"/>\n\t\t<Constraint d=\".1093899492634\" p1=\"19\" p2=\"24\"/>\n\t\t<Constraint d=\".10194818650269998\" p1=\"9\" p2=\"29\"/>\n\t\t<Constraint d=\".1093899492634\" p1=\"20\" p2=\"34\"/>\n\t\t<Constraint d=\".1093899492634\" p1=\"20\" p2=\"35\"/>\n\t\t<Constraint d=\".1085358495916\" p1=\"1\" p2=\"27\"/>\n\t\t<Constraint d=\".1085358495916\" p1=\"5\" p2=\"28\"/>\n\t\t<Constraint d=\".1085358495916\" p1=\"0\" p2=\"26\"/>\n\t\t<Constraint d=\".1093899492634\" p1=\"36\" p2=\"40\"/>\n\t\t<Constraint d=\".1093899492634\" p1=\"36\" p2=\"37\"/>\n\t\t<Constraint d=\".1093899492634\" p1=\"36\" p2=\"38\"/>\n\t</Constraints>\n\t<Forces>\n\t\t<Force energy=\"(K/2)*(r-length)^2;K = (1-lambda_bonds)*K1 + lambda_bonds*K2;length = (1-lambda_bonds)*length1 + lambda_bonds*length2;\" forceGroup=\"0\" name=\"CustomBondForce\" type=\"CustomBondForce\" usesPeriodic=\"0\" version=\"3\">\n\t\t\t<PerBondParameters>\n\t\t\t\t<Parameter name=\"length1\"/>\n\t\t\t\t<Parameter name=\"K1\"/>\n\t\t\t\t<Parameter name=\"length2\"/>\n\t\t\t\t<Parameter name=\"K2\"/>\n\t\t\t</PerBondParameters>\n\t\t\t<GlobalParameters>\n\t\t\t\t<Parameter default=\"0\" name=\"lambda_bonds\"/>\n\t\t\t</GlobalParameters>\n\t\t\t<EnergyParameterDerivatives/>\n\t\t\t<Bonds>\n\t\t\t\t<Bond p1=\"12\" p2=\"13\" param1=\".1328776712165\" param2=\"372632.1249267455\" param3=\".1328776712165\" param4=\"372632.1249267455\"/>\n\t\t\t\t<Bond p1=\"11\" p2=\"12\" param1=\".13871932271809997\" param2=\"301905.092578521\" param3=\".13871932271809997\" param4=\"301905.092578521\"/>\n\t\t\t\t<Bond p1=\"13\" p2=\"14\" param1=\".1328776712165\" param2=\"372632.1249267455\" param3=\".1328776712165\" param4=\"372632.1249267455\"/>\n\t\t\t\t<Bond p1=\"10\" p2=\"11\" param1=\".13871932271809997\" param2=\"301905.092578521\" param3=\".13871932271809997\" param4=\"301905.092578521\"/>\n\t\t\t\t<Bond p1=\"14\" p2=\"16\" param1=\".13901605546889997\" param2=\"326381.7456334099\" param3=\".13901605546889997\" param4=\"326381.7456334099\"/>\n\t\t\t\t<Bond p1=\"14\" p2=\"15\" param1=\".13871932271809997\" param2=\"301905.092578521\" param3=\".13871932271809997\" param4=\"301905.092578521\"/>\n\t\t\t\t<Bond p1=\"16\" p2=\"17\" param1=\".13818977766829998\" param2=\"412347.817359175\" param3=\".13818977766829998\" param4=\"412347.817359175\"/>\n\t\t\t\t<Bond p1=\"7\" p2=\"8\" param1=\".12251983862219998\" param2=\"487602.3277661968\" param3=\".12251983862219998\" param4=\"487602.3277661968\"/>\n\t\t\t\t<Bond p1=\"10\" p2=\"15\" param1=\".13871932271809997\" param2=\"301905.092578521\" param3=\".13871932271809997\" param4=\"301905.092578521\"/>\n\t\t\t\t<Bond p1=\"9\" p2=\"10\" param1=\".13901605546889997\" param2=\"326381.7456334099\" param3=\".13901605546889997\" param4=\"326381.7456334099\"/>\n\t\t\t\t<Bond p1=\"17\" p2=\"18\" param1=\".12251983862219998\" param2=\"487602.3277661968\" param3=\".12251983862219998\" param4=\"487602.3277661968\"/>\n\t\t\t\t<Bond p1=\"7\" p2=\"9\" param1=\".13818977766829998\" param2=\"412347.817359175\" param3=\".13818977766829998\" param4=\"412347.817359175\"/>\n\t\t\t\t<Bond p1=\"3\" p2=\"7\" param1=\".1454628925034\" param2=\"233580.24861764675\" param3=\".1454628925034\" param4=\"233580.24861764675\"/>\n\t\t\t\t<Bond p1=\"2\" p2=\"23\" param1=\".1746066037062\" param2=\"182441.45424436082\" param3=\".1746066037062\" param4=\"182441.45424436082\"/>\n\t\t\t\t<Bond p1=\"2\" p2=\"3\" param1=\".13871932271809997\" param2=\"301905.092578521\" param3=\".13871932271809997\" param4=\"301905.092578521\"/>\n\t\t\t\t<Bond p1=\"3\" p2=\"4\" param1=\".13871932271809997\" param2=\"301905.092578521\" param3=\".13871932271809997\" param4=\"301905.092578521\"/>\n\t\t\t\t<Bond p1=\"1\" p2=\"2\" param1=\".13871932271809997\" param2=\"301905.092578521\" param3=\".13871932271809997\" param4=\"301905.092578521\"/>\n\t\t\t\t<Bond p1=\"4\" p2=\"6\" param1=\".1746066037062\" param2=\"182441.45424436082\" param3=\".1746066037062\" param4=\"182441.45424436082\"/>\n\t\t\t\t<Bond p1=\"4\" p2=\"5\" param1=\".13871932271809997\" param2=\"301905.092578521\" param3=\".13871932271809997\" param4=\"301905.092578521\"/>\n\t\t\t\t<Bond p1=\"0\" p2=\"1\" param1=\".13871932271809997\" param2=\"301905.092578521\" param3=\".13871932271809997\" param4=\"301905.092578521\"/>\n\t\t\t\t<Bond p1=\"0\" p2=\"5\" param1=\".13871932271809997\" param2=\"301905.092578521\" param3=\".13871932271809997\" param4=\"301905.092578521\"/>\n\t\t\t</Bonds>\n\t\t</Force>\n\t\t<Force forceGroup=\"0\" name=\"HarmonicBondForce\" type=\"HarmonicBondForce\" usesPeriodic=\"0\" version=\"2\">\n\t\t\t<Bonds>\n\t\t\t\t<Bond d=\".1358690858053\" k=\"284889.5726108851\" p1=\"21\" p2=\"22\"/>\n\t\t\t\t<Bond d=\".152190126495\" k=\"221435.25929028585\" p1=\"19\" p2=\"21\"/>\n\t\t\t\t<Bond d=\".152190126495\" k=\"221435.25929028585\" p1=\"20\" p2=\"21\"/>\n\t\t\t\t<Bond d=\".1523435958334\" k=\"275676.60854900297\" p1=\"17\" p2=\"19\"/>\n\t\t\t\t<Bond d=\".152190126495\" k=\"221435.25929028585\" p1=\"19\" p2=\"20\"/>\n\t\t\t\t<Bond d=\".13457412327989998\" k=\"252005.6732566329\" p1=\"17\" p2=\"39\"/>\n\t\t\t\t<Bond d=\".1425895053732\" k=\"306888.771877389\" p1=\"36\" p2=\"39\"/>\n\t\t\t</Bonds>\n\t\t</Force>\n\t\t<Force energy=\"(K/2)*(theta-theta0)^2;K = (1.0-lambda_angles)*K_1 + lambda_angles*K_2;theta0 = (1.0-lambda_angles)*theta0_1 + lambda_angles*theta0_2;\" forceGroup=\"0\" name=\"CustomAngleForce\" type=\"CustomAngleForce\" usesPeriodic=\"0\" version=\"3\">\n\t\t\t<PerAngleParameters>\n\t\t\t\t<Parameter name=\"theta0_1\"/>\n\t\t\t\t<Parameter name=\"K_1\"/>\n\t\t\t\t<Parameter name=\"theta0_2\"/>\n\t\t\t\t<Parameter name=\"K_2\"/>\n\t\t\t</PerAngleParameters>\n\t\t\t<GlobalParameters>\n\t\t\t\t<Parameter default=\"0\" name=\"lambda_angles\"/>\n\t\t\t</GlobalParameters>\n\t\t\t<EnergyParameterDerivatives/>\n\t\t\t<Angles>\n\t\t\t\t<Angle p1=\"0\" p2=\"1\" p3=\"2\" param1=\"2.213186435767863\" param2=\"484.4928854933472\" param3=\"2.213186435767863\" param4=\"484.4928854933472\"/>\n\t\t\t\t<Angle p1=\"0\" p2=\"1\" p3=\"27\" param1=\"2.254679037277145\" param2=\"285.07077453214373\" param3=\"2.254679037277145\" param4=\"285.07077453214373\"/>\n\t\t\t\t<Angle p1=\"0\" p2=\"5\" p3=\"4\" param1=\"2.213186435767863\" param2=\"484.4928854933472\" param3=\"2.213186435767863\" param4=\"484.4928854933472\"/>\n\t\t\t\t<Angle p1=\"0\" p2=\"5\" p3=\"28\" param1=\"2.254679037277145\" param2=\"285.07077453214373\" param3=\"2.254679037277145\" param4=\"285.07077453214373\"/>\n\t\t\t\t<Angle p1=\"1\" p2=\"0\" p3=\"5\" param1=\"2.213186435767863\" param2=\"484.4928854933472\" param3=\"2.213186435767863\" param4=\"484.4928854933472\"/>\n\t\t\t\t<Angle p1=\"1\" p2=\"0\" p3=\"26\" param1=\"2.254679037277145\" param2=\"285.07077453214373\" param3=\"2.254679037277145\" param4=\"285.07077453214373\"/>\n\t\t\t\t<Angle p1=\"1\" p2=\"2\" p3=\"3\" param1=\"2.213186435767863\" param2=\"484.4928854933472\" param3=\"2.213186435767863\" param4=\"484.4928854933472\"/>\n\t\t\t\t<Angle p1=\"1\" p2=\"2\" p3=\"23\" param1=\"2.213186435767863\" param2=\"484.4928854933472\" param3=\"2.213186435767863\" param4=\"484.4928854933472\"/>\n\t\t\t\t<Angle p1=\"2\" p2=\"1\" p3=\"27\" param1=\"2.254679037277145\" param2=\"285.07077453214373\" param3=\"2.254679037277145\" param4=\"285.07077453214373\"/>\n\t\t\t\t<Angle p1=\"2\" p2=\"3\" p3=\"4\" param1=\"2.213186435767863\" param2=\"484.4928854933472\" param3=\"2.213186435767863\" param4=\"484.4928854933472\"/>\n\t\t\t\t<Angle p1=\"2\" p2=\"3\" p3=\"7\" param1=\"2.213186435767863\" param2=\"484.4928854933472\" param3=\"2.213186435767863\" param4=\"484.4928854933472\"/>\n\t\t\t\t<Angle p1=\"3\" p2=\"2\" p3=\"23\" param1=\"2.213186435767863\" param2=\"484.4928854933472\" param3=\"2.213186435767863\" param4=\"484.4928854933472\"/>\n\t\t\t\t<Angle p1=\"3\" p2=\"4\" p3=\"5\" param1=\"2.213186435767863\" param2=\"484.4928854933472\" param3=\"2.213186435767863\" param4=\"484.4928854933472\"/>\n\t\t\t\t<Angle p1=\"3\" p2=\"4\" p3=\"6\" param1=\"2.213186435767863\" param2=\"484.4928854933472\" param3=\"2.213186435767863\" param4=\"484.4928854933472\"/>\n\t\t\t\t<Angle p1=\"3\" p2=\"7\" p3=\"8\" param1=\"2.213186435767863\" param2=\"484.4928854933472\" param3=\"2.213186435767863\" param4=\"484.4928854933472\"/>\n\t\t\t\t<Angle p1=\"3\" p2=\"7\" p3=\"9\" param1=\"2.213186435767863\" param2=\"484.4928854933472\" param3=\"2.213186435767863\" param4=\"484.4928854933472\"/>\n\t\t\t\t<Angle p1=\"4\" p2=\"3\" p3=\"7\" param1=\"2.213186435767863\" param2=\"484.4928854933472\" param3=\"2.213186435767863\" param4=\"484.4928854933472\"/>\n\t\t\t\t<Angle p1=\"4\" p2=\"5\" p3=\"28\" param1=\"2.254679037277145\" param2=\"285.07077453214373\" param3=\"2.254679037277145\" param4=\"285.07077453214373\"/>\n\t\t\t\t<Angle p1=\"5\" p2=\"0\" p3=\"26\" param1=\"2.254679037277145\" param2=\"285.07077453214373\" param3=\"2.254679037277145\" param4=\"285.07077453214373\"/>\n\t\t\t\t<Angle p1=\"5\" p2=\"4\" p3=\"6\" param1=\"2.213186435767863\" param2=\"484.4928854933472\" param3=\"2.213186435767863\" param4=\"484.4928854933472\"/>\n\t\t\t\t<Angle p1=\"7\" p2=\"9\" p3=\"10\" param1=\"2.048083786426299\" param2=\"463.76980237685206\" param3=\"2.048083786426299\" param4=\"463.76980237685206\"/>\n\t\t\t\t<Angle p1=\"7\" p2=\"9\" p3=\"29\" param1=\"2.0159797763293597\" param2=\"530.9012827843272\" param3=\"2.0159797763293597\" param4=\"530.9012827843272\"/>\n\t\t\t\t<Angle p1=\"8\" p2=\"7\" p3=\"9\" param1=\"2.213186435767863\" param2=\"484.4928854933472\" param3=\"2.213186435767863\" param4=\"484.4928854933472\"/>\n\t\t\t\t<Angle p1=\"9\" p2=\"10\" p3=\"11\" param1=\"2.213186435767863\" param2=\"484.4928854933472\" param3=\"2.213186435767863\" param4=\"484.4928854933472\"/>\n\t\t\t\t<Angle p1=\"9\" p2=\"10\" p3=\"15\" param1=\"2.213186435767863\" param2=\"484.4928854933472\" param3=\"2.213186435767863\" param4=\"484.4928854933472\"/>\n\t\t\t\t<Angle p1=\"10\" p2=\"9\" p3=\"29\" param1=\"2.0159797763293597\" param2=\"530.9012827843272\" param3=\"2.0159797763293597\" param4=\"530.9012827843272\"/>\n\t\t\t\t<Angle p1=\"10\" p2=\"11\" p3=\"12\" param1=\"2.213186435767863\" param2=\"484.4928854933472\" param3=\"2.213186435767863\" param4=\"484.4928854933472\"/>\n\t\t\t\t<Angle p1=\"10\" p2=\"11\" p3=\"30\" param1=\"2.254679037277145\" param2=\"285.07077453214373\" param3=\"2.254679037277145\" param4=\"285.07077453214373\"/>\n\t\t\t\t<Angle p1=\"10\" p2=\"15\" p3=\"14\" param1=\"2.213186435767863\" param2=\"484.4928854933472\" param3=\"2.213186435767863\" param4=\"484.4928854933472\"/>\n\t\t\t\t<Angle p1=\"10\" p2=\"15\" p3=\"32\" param1=\"2.254679037277145\" param2=\"285.07077453214373\" param3=\"2.254679037277145\" param4=\"285.07077453214373\"/>\n\t\t\t\t<Angle p1=\"11\" p2=\"10\" p3=\"15\" param1=\"2.213186435767863\" param2=\"484.4928854933472\" param3=\"2.213186435767863\" param4=\"484.4928854933472\"/>\n\t\t\t\t<Angle p1=\"11\" p2=\"12\" p3=\"13\" param1=\"2.213186435767863\" param2=\"484.4928854933472\" param3=\"2.213186435767863\" param4=\"484.4928854933472\"/>\n\t\t\t\t<Angle p1=\"11\" p2=\"12\" p3=\"31\" param1=\"2.254679037277145\" param2=\"285.07077453214373\" param3=\"2.254679037277145\" param4=\"285.07077453214373\"/>\n\t\t\t\t<Angle p1=\"12\" p2=\"11\" p3=\"30\" param1=\"2.254679037277145\" param2=\"285.07077453214373\" param3=\"2.254679037277145\" param4=\"285.07077453214373\"/>\n\t\t\t\t<Angle p1=\"12\" p2=\"13\" p3=\"14\" param1=\"1.9699775782320603\" param2=\"460.89961161789523\" param3=\"1.9699775782320603\" param4=\"460.89961161789523\"/>\n\t\t\t\t<Angle p1=\"13\" p2=\"12\" p3=\"31\" param1=\"2.254679037277145\" param2=\"285.07077453214373\" param3=\"2.254679037277145\" param4=\"285.07077453214373\"/>\n\t\t\t\t<Angle p1=\"13\" p2=\"14\" p3=\"15\" param1=\"2.213186435767863\" param2=\"484.4928854933472\" param3=\"2.213186435767863\" param4=\"484.4928854933472\"/>\n\t\t\t\t<Angle p1=\"13\" p2=\"14\" p3=\"16\" param1=\"2.213186435767863\" param2=\"484.4928854933472\" param3=\"2.213186435767863\" param4=\"484.4928854933472\"/>\n\t\t\t\t<Angle p1=\"14\" p2=\"15\" p3=\"32\" param1=\"2.254679037277145\" param2=\"285.07077453214373\" param3=\"2.254679037277145\" param4=\"285.07077453214373\"/>\n\t\t\t\t<Angle p1=\"14\" p2=\"16\" p3=\"17\" param1=\"2.048083786426299\" param2=\"463.76980237685206\" param3=\"2.048083786426299\" param4=\"463.76980237685206\"/>\n\t\t\t\t<Angle p1=\"14\" p2=\"16\" p3=\"33\" param1=\"2.0159797763293597\" param2=\"530.9012827843272\" param3=\"2.0159797763293597\" param4=\"530.9012827843272\"/>\n\t\t\t\t<Angle p1=\"15\" p2=\"14\" p3=\"16\" param1=\"2.213186435767863\" param2=\"484.4928854933472\" param3=\"2.213186435767863\" param4=\"484.4928854933472\"/>\n\t\t\t\t<Angle p1=\"16\" p2=\"17\" p3=\"18\" param1=\"2.213186435767863\" param2=\"484.4928854933472\" param3=\"2.213186435767863\" param4=\"484.4928854933472\"/>\n\t\t\t\t<Angle p1=\"17\" p2=\"16\" p3=\"33\" param1=\"2.0159797763293597\" param2=\"530.9012827843272\" param3=\"2.0159797763293597\" param4=\"530.9012827843272\"/>\n\t\t\t</Angles>\n\t\t</Force>\n\t\t<Force forceGroup=\"0\" name=\"HarmonicAngleForce\" type=\"HarmonicAngleForce\" usesPeriodic=\"0\" version=\"2\">\n\t\t\t<Angles>\n\t\t\t\t<Angle a=\"2.213186435767863\" k=\"484.4928854933472\" p1=\"16\" p2=\"17\" p3=\"19\"/>\n\t\t\t\t<Angle a=\"2.075101872321204\" k=\"247.73547057550505\" p1=\"17\" p2=\"19\" p3=\"20\"/>\n\t\t\t\t<Angle a=\"2.075101872321204\" k=\"247.73547057550505\" p1=\"17\" p2=\"19\" p3=\"21\"/>\n\t\t\t\t<Angle a=\"1.989244072621022\" k=\"308.2444922396122\" p1=\"17\" p2=\"19\" p3=\"24\"/>\n\t\t\t\t<Angle a=\"2.213186435767863\" k=\"484.4928854933472\" p1=\"18\" p2=\"17\" p3=\"19\"/>\n\t\t\t\t<Angle a=\"1.2917422253232633\" k=\"1046.343507881973\" p1=\"19\" p2=\"20\" p3=\"21\"/>\n\t\t\t\t<Angle a=\"2.075101872321204\" k=\"247.73547057550505\" p1=\"19\" p2=\"20\" p3=\"34\"/>\n\t\t\t\t<Angle a=\"2.075101872321204\" k=\"247.73547057550505\" p1=\"19\" p2=\"20\" p3=\"35\"/>\n\t\t\t\t<Angle a=\"1.2917422253232633\" k=\"1046.343507881973\" p1=\"19\" p2=\"21\" p3=\"20\"/>\n\t\t\t\t<Angle a=\"2.075101872321204\" k=\"247.73547057550505\" p1=\"19\" p2=\"21\" p3=\"22\"/>\n\t\t\t\t<Angle a=\"2.075101872321204\" k=\"247.73547057550505\" p1=\"19\" p2=\"21\" p3=\"25\"/>\n\t\t\t\t<Angle a=\"1.2917422253232633\" k=\"1046.343507881973\" p1=\"20\" p2=\"19\" p3=\"21\"/>\n\t\t\t\t<Angle a=\"2.075101872321204\" k=\"247.73547057550505\" p1=\"20\" p2=\"19\" p3=\"24\"/>\n\t\t\t\t<Angle a=\"2.075101872321204\" k=\"247.73547057550505\" p1=\"20\" p2=\"21\" p3=\"22\"/>\n\t\t\t\t<Angle a=\"2.075101872321204\" k=\"247.73547057550505\" p1=\"20\" p2=\"21\" p3=\"25\"/>\n\t\t\t\t<Angle a=\"2.075101872321204\" k=\"247.73547057550505\" p1=\"21\" p2=\"19\" p3=\"24\"/>\n\t\t\t\t<Angle a=\"2.075101872321204\" k=\"247.73547057550505\" p1=\"21\" p2=\"20\" p3=\"34\"/>\n\t\t\t\t<Angle a=\"2.075101872321204\" k=\"247.73547057550505\" p1=\"21\" p2=\"20\" p3=\"35\"/>\n\t\t\t\t<Angle a=\"1.989244072621022\" k=\"308.2444922396122\" p1=\"22\" p2=\"21\" p3=\"25\"/>\n\t\t\t\t<Angle a=\"1.989244072621022\" k=\"308.2444922396122\" p1=\"34\" p2=\"20\" p3=\"35\"/>\n\t\t\t\t<Angle a=\"2.213186435767863\" k=\"484.4928854933472\" p1=\"16\" p2=\"17\" p3=\"39\"/>\n\t\t\t\t<Angle a=\"1.9260385591386002\" k=\"544.678275491328\" p1=\"17\" p2=\"39\" p3=\"36\"/>\n\t\t\t\t<Angle a=\"2.2247562159442307\" k=\"1685.4135433330089\" p1=\"18\" p2=\"17\" p3=\"39\"/>\n\t\t\t\t<Angle a=\"2.017654719697188\" k=\"408.161690475075\" p1=\"37\" p2=\"36\" p3=\"38\"/>\n\t\t\t\t<Angle a=\"2.034139115548445\" k=\"445.22208650928565\" p1=\"37\" p2=\"36\" p3=\"39\"/>\n\t\t\t\t<Angle a=\"2.017654719697188\" k=\"408.161690475075\" p1=\"37\" p2=\"36\" p3=\"40\"/>\n\t\t\t\t<Angle a=\"2.034139115548445\" k=\"445.22208650928565\" p1=\"38\" p2=\"36\" p3=\"39\"/>\n\t\t\t\t<Angle a=\"2.017654719697188\" k=\"408.161690475075\" p1=\"38\" p2=\"36\" p3=\"40\"/>\n\t\t\t\t<Angle a=\"2.034139115548445\" k=\"445.22208650928565\" p1=\"39\" p2=\"36\" p3=\"40\"/>\n\t\t\t</Angles>\n\t\t</Force>\n\t\t<Force energy=\"(1-lambda_torsions)*U1 + lambda_torsions*U2;U1 = K1*(1+cos(periodicity1*theta-phase1));U2 = K2*(1+cos(periodicity2*theta-phase2));\" forceGroup=\"0\" name=\"CustomTorsionForce\" type=\"CustomTorsionForce\" usesPeriodic=\"0\" version=\"3\">\n\t\t\t<PerTorsionParameters>\n\t\t\t\t<Parameter name=\"periodicity1\"/>\n\t\t\t\t<Parameter name=\"phase1\"/>\n\t\t\t\t<Parameter name=\"K1\"/>\n\t\t\t\t<Parameter name=\"periodicity2\"/>\n\t\t\t\t<Parameter name=\"phase2\"/>\n\t\t\t\t<Parameter name=\"K2\"/>\n\t\t\t</PerTorsionParameters>\n\t\t\t<GlobalParameters>\n\t\t\t\t<Parameter default=\"0\" name=\"lambda_torsions\"/>\n\t\t\t</GlobalParameters>\n\t\t\t<EnergyParameterDerivatives/>\n\t\t\t<Torsions>\n\t\t\t\t<Torsion p1=\"14\" p2=\"16\" p3=\"17\" p4=\"18\" param1=\"0\" param2=\"0\" param3=\"0\" param4=\"2\" param5=\"3.141592653589793\" param6=\"7.569054279772552\"/>\n\t\t\t\t<Torsion p1=\"14\" p2=\"16\" p3=\"17\" p4=\"18\" param1=\"0\" param2=\"0\" param3=\"0\" param4=\"1\" param5=\"0\" param6=\"-.20151306284204928\"/>\n\t\t\t\t<Torsion p1=\"18\" p2=\"17\" p3=\"16\" p4=\"33\" param1=\"0\" param2=\"0\" param3=\"0\" param4=\"2\" param5=\"3.141592653589793\" param6=\"2.0338395226397696\"/>\n\t\t\t\t<Torsion p1=\"18\" p2=\"17\" p3=\"16\" p4=\"33\" param1=\"0\" param2=\"0\" param3=\"0\" param4=\"1\" param5=\"0\" param6=\"3.7308670004513265\"/>\n\t\t\t\t<Torsion p1=\"14\" p2=\"16\" p3=\"17\" p4=\"18\" param1=\"2\" param2=\"3.141592653589793\" param3=\"12.978553656010488\" param4=\"0\" param5=\"0\" param6=\"0\"/>\n\t\t\t\t<Torsion p1=\"14\" p2=\"16\" p3=\"17\" p4=\"18\" param1=\"1\" param2=\"0\" param3=\"-1.7791009333444447\" param4=\"0\" param5=\"0\" param6=\"0\"/>\n\t\t\t\t<Torsion p1=\"18\" p2=\"17\" p3=\"16\" p4=\"33\" param1=\"2\" param2=\"3.141592653589793\" param3=\"9.825603686165657\" param4=\"0\" param5=\"0\" param6=\"0\"/>\n\t\t\t\t<Torsion p1=\"18\" p2=\"17\" p3=\"16\" p4=\"33\" param1=\"1\" param2=\"0\" param3=\"5.255757435827624\" param4=\"0\" param5=\"0\" param6=\"0\"/>\n\t\t\t</Torsions>\n\t\t</Force>\n\t\t<Force forceGroup=\"0\" name=\"PeriodicTorsionForce\" type=\"PeriodicTorsionForce\" usesPeriodic=\"0\" version=\"2\">\n\t\t\t<Torsions>\n\t\t\t\t<Torsion k=\"7.569054279772552\" p1=\"14\" p2=\"16\" p3=\"17\" p4=\"19\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"-.20151306284204928\" p1=\"14\" p2=\"16\" p3=\"17\" p4=\"19\" periodicity=\"1\" phase=\"0\"/>\n\t\t\t\t<Torsion k=\".5582971568453936\" p1=\"16\" p2=\"17\" p3=\"19\" p4=\"20\" periodicity=\"1\" phase=\"0\"/>\n\t\t\t\t<Torsion k=\".5582971568453936\" p1=\"16\" p2=\"17\" p3=\"19\" p4=\"21\" periodicity=\"1\" phase=\"0\"/>\n\t\t\t\t<Torsion k=\".5582971568453936\" p1=\"16\" p2=\"17\" p3=\"19\" p4=\"24\" periodicity=\"1\" phase=\"0\"/>\n\t\t\t\t<Torsion k=\"15.298209578308768\" p1=\"17\" p2=\"19\" p3=\"20\" p4=\"21\" periodicity=\"2\" phase=\"0\"/>\n\t\t\t\t<Torsion k=\"14.045841771639935\" p1=\"17\" p2=\"19\" p3=\"20\" p4=\"21\" periodicity=\"1\" phase=\"0\"/>\n\t\t\t\t<Torsion k=\"-5.247457475575384\" p1=\"17\" p2=\"19\" p3=\"20\" p4=\"34\" periodicity=\"2\" phase=\"0\"/>\n\t\t\t\t<Torsion k=\"-5.247457475575384\" p1=\"17\" p2=\"19\" p3=\"20\" p4=\"35\" periodicity=\"2\" phase=\"0\"/>\n\t\t\t\t<Torsion k=\"15.298209578308768\" p1=\"17\" p2=\"19\" p3=\"21\" p4=\"20\" periodicity=\"2\" phase=\"0\"/>\n\t\t\t\t<Torsion k=\"14.045841771639935\" p1=\"17\" p2=\"19\" p3=\"21\" p4=\"20\" periodicity=\"1\" phase=\"0\"/>\n\t\t\t\t<Torsion k=\"-5.247457475575384\" p1=\"17\" p2=\"19\" p3=\"21\" p4=\"22\" periodicity=\"2\" phase=\"0\"/>\n\t\t\t\t<Torsion k=\"-5.247457475575384\" p1=\"17\" p2=\"19\" p3=\"21\" p4=\"25\" periodicity=\"2\" phase=\"0\"/>\n\t\t\t\t<Torsion k=\"-3.9592503385778186\" p1=\"18\" p2=\"17\" p3=\"19\" p4=\"20\" periodicity=\"2\" phase=\"5.585053606381854\"/>\n\t\t\t\t<Torsion k=\"-3.9592503385778186\" p1=\"18\" p2=\"17\" p3=\"19\" p4=\"21\" periodicity=\"2\" phase=\"5.585053606381854\"/>\n\t\t\t\t<Torsion k=\".5582971568453936\" p1=\"18\" p2=\"17\" p3=\"19\" p4=\"24\" periodicity=\"1\" phase=\"0\"/>\n\t\t\t\t<Torsion k=\"7.569054279772552\" p1=\"19\" p2=\"17\" p3=\"16\" p4=\"33\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"-.20151306284204928\" p1=\"19\" p2=\"17\" p3=\"16\" p4=\"33\" periodicity=\"1\" phase=\"0\"/>\n\t\t\t\t<Torsion k=\"15.298209578308768\" p1=\"19\" p2=\"20\" p3=\"21\" p4=\"22\" periodicity=\"2\" phase=\"0\"/>\n\t\t\t\t<Torsion k=\"14.045841771639935\" p1=\"19\" p2=\"20\" p3=\"21\" p4=\"22\" periodicity=\"1\" phase=\"0\"/>\n\t\t\t\t<Torsion k=\"15.298209578308768\" p1=\"19\" p2=\"20\" p3=\"21\" p4=\"25\" periodicity=\"2\" phase=\"0\"/>\n\t\t\t\t<Torsion k=\"14.045841771639935\" p1=\"19\" p2=\"20\" p3=\"21\" p4=\"25\" periodicity=\"1\" phase=\"0\"/>\n\t\t\t\t<Torsion k=\"15.298209578308768\" p1=\"19\" p2=\"21\" p3=\"20\" p4=\"34\" periodicity=\"2\" phase=\"0\"/>\n\t\t\t\t<Torsion k=\"14.045841771639935\" p1=\"19\" p2=\"21\" p3=\"20\" p4=\"34\" periodicity=\"1\" phase=\"0\"/>\n\t\t\t\t<Torsion k=\"15.298209578308768\" p1=\"19\" p2=\"21\" p3=\"20\" p4=\"35\" periodicity=\"2\" phase=\"0\"/>\n\t\t\t\t<Torsion k=\"14.045841771639935\" p1=\"19\" p2=\"21\" p3=\"20\" p4=\"35\" periodicity=\"1\" phase=\"0\"/>\n\t\t\t\t<Torsion k=\"15.298209578308768\" p1=\"20\" p2=\"19\" p3=\"21\" p4=\"22\" periodicity=\"2\" phase=\"0\"/>\n\t\t\t\t<Torsion k=\"14.045841771639935\" p1=\"20\" p2=\"19\" p3=\"21\" p4=\"22\" periodicity=\"1\" phase=\"0\"/>\n\t\t\t\t<Torsion k=\"15.298209578308768\" p1=\"20\" p2=\"19\" p3=\"21\" p4=\"25\" periodicity=\"2\" phase=\"0\"/>\n\t\t\t\t<Torsion k=\"14.045841771639935\" p1=\"20\" p2=\"19\" p3=\"21\" p4=\"25\" periodicity=\"1\" phase=\"0\"/>\n\t\t\t\t<Torsion k=\"15.298209578308768\" p1=\"20\" p2=\"21\" p3=\"19\" p4=\"24\" periodicity=\"2\" phase=\"0\"/>\n\t\t\t\t<Torsion k=\"14.045841771639935\" p1=\"20\" p2=\"21\" p3=\"19\" p4=\"24\" periodicity=\"1\" phase=\"0\"/>\n\t\t\t\t<Torsion k=\"15.298209578308768\" p1=\"21\" p2=\"19\" p3=\"20\" p4=\"34\" periodicity=\"2\" phase=\"0\"/>\n\t\t\t\t<Torsion k=\"14.045841771639935\" p1=\"21\" p2=\"19\" p3=\"20\" p4=\"34\" periodicity=\"1\" phase=\"0\"/>\n\t\t\t\t<Torsion k=\"15.298209578308768\" p1=\"21\" p2=\"19\" p3=\"20\" p4=\"35\" periodicity=\"2\" phase=\"0\"/>\n\t\t\t\t<Torsion k=\"14.045841771639935\" p1=\"21\" p2=\"19\" p3=\"20\" p4=\"35\" periodicity=\"1\" phase=\"0\"/>\n\t\t\t\t<Torsion k=\"15.298209578308768\" p1=\"21\" p2=\"20\" p3=\"19\" p4=\"24\" periodicity=\"2\" phase=\"0\"/>\n\t\t\t\t<Torsion k=\"14.045841771639935\" p1=\"21\" p2=\"20\" p3=\"19\" p4=\"24\" periodicity=\"1\" phase=\"0\"/>\n\t\t\t\t<Torsion k=\"-5.247457475575384\" p1=\"22\" p2=\"21\" p3=\"19\" p4=\"24\" periodicity=\"2\" phase=\"0\"/>\n\t\t\t\t<Torsion k=\"-5.247457475575384\" p1=\"22\" p2=\"21\" p3=\"20\" p4=\"34\" periodicity=\"2\" phase=\"0\"/>\n\t\t\t\t<Torsion k=\"-5.247457475575384\" p1=\"22\" p2=\"21\" p3=\"20\" p4=\"35\" periodicity=\"2\" phase=\"0\"/>\n\t\t\t\t<Torsion k=\"-5.247457475575384\" p1=\"24\" p2=\"19\" p3=\"20\" p4=\"34\" periodicity=\"2\" phase=\"0\"/>\n\t\t\t\t<Torsion k=\"-5.247457475575384\" p1=\"24\" p2=\"19\" p3=\"20\" p4=\"35\" periodicity=\"2\" phase=\"0\"/>\n\t\t\t\t<Torsion k=\"-5.247457475575384\" p1=\"24\" p2=\"19\" p3=\"21\" p4=\"25\" periodicity=\"2\" phase=\"0\"/>\n\t\t\t\t<Torsion k=\"-5.247457475575384\" p1=\"25\" p2=\"21\" p3=\"20\" p4=\"34\" periodicity=\"2\" phase=\"0\"/>\n\t\t\t\t<Torsion k=\"-5.247457475575384\" p1=\"25\" p2=\"21\" p3=\"20\" p4=\"35\" periodicity=\"2\" phase=\"0\"/>\n\t\t\t\t<Torsion k=\"1.5341333333333336\" p1=\"17\" p2=\"19\" p3=\"16\" p4=\"18\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"1.5341333333333336\" p1=\"17\" p2=\"16\" p3=\"18\" p4=\"19\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"1.5341333333333336\" p1=\"17\" p2=\"18\" p3=\"19\" p4=\"16\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"15.321515534533985\" p1=\"0\" p2=\"1\" p3=\"2\" p4=\"3\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"15.321515534533985\" p1=\"0\" p2=\"1\" p3=\"2\" p4=\"23\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"15.321515534533985\" p1=\"0\" p2=\"5\" p3=\"4\" p4=\"3\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"15.321515534533985\" p1=\"0\" p2=\"5\" p3=\"4\" p4=\"6\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"15.321515534533985\" p1=\"1\" p2=\"0\" p3=\"5\" p4=\"4\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"15.321515534533985\" p1=\"1\" p2=\"0\" p3=\"5\" p4=\"28\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"15.321515534533985\" p1=\"1\" p2=\"2\" p3=\"3\" p4=\"4\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"15.321515534533985\" p1=\"1\" p2=\"2\" p3=\"3\" p4=\"7\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"15.321515534533985\" p1=\"2\" p2=\"1\" p3=\"0\" p4=\"5\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"15.321515534533985\" p1=\"2\" p2=\"1\" p3=\"0\" p4=\"26\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"15.321515534533985\" p1=\"2\" p2=\"3\" p3=\"4\" p4=\"5\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"15.321515534533985\" p1=\"2\" p2=\"3\" p3=\"4\" p4=\"6\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"4.173190890070053\" p1=\"2\" p2=\"3\" p3=\"7\" p4=\"8\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"4.173190890070053\" p1=\"2\" p2=\"3\" p3=\"7\" p4=\"9\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"15.321515534533985\" p1=\"3\" p2=\"2\" p3=\"1\" p4=\"27\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"15.321515534533985\" p1=\"3\" p2=\"4\" p3=\"5\" p4=\"28\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"7.569054279772552\" p1=\"3\" p2=\"7\" p3=\"9\" p4=\"10\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"-.20151306284204928\" p1=\"3\" p2=\"7\" p3=\"9\" p4=\"10\" periodicity=\"1\" phase=\"0\"/>\n\t\t\t\t<Torsion k=\"7.569054279772552\" p1=\"3\" p2=\"7\" p3=\"9\" p4=\"29\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"-.20151306284204928\" p1=\"3\" p2=\"7\" p3=\"9\" p4=\"29\" periodicity=\"1\" phase=\"0\"/>\n\t\t\t\t<Torsion k=\"15.321515534533985\" p1=\"4\" p2=\"3\" p3=\"2\" p4=\"23\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"4.173190890070053\" p1=\"4\" p2=\"3\" p3=\"7\" p4=\"8\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"4.173190890070053\" p1=\"4\" p2=\"3\" p3=\"7\" p4=\"9\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"15.321515534533985\" p1=\"4\" p2=\"5\" p3=\"0\" p4=\"26\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"15.321515534533985\" p1=\"5\" p2=\"0\" p3=\"1\" p4=\"27\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"15.321515534533985\" p1=\"5\" p2=\"4\" p3=\"3\" p4=\"7\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"15.321515534533985\" p1=\"6\" p2=\"4\" p3=\"3\" p4=\"7\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"15.321515534533985\" p1=\"6\" p2=\"4\" p3=\"5\" p4=\"28\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"15.321515534533985\" p1=\"7\" p2=\"3\" p3=\"2\" p4=\"23\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"4.991902713141489\" p1=\"7\" p2=\"9\" p3=\"10\" p4=\"11\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"4.991902713141489\" p1=\"7\" p2=\"9\" p3=\"10\" p4=\"15\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"12.978553656010488\" p1=\"8\" p2=\"7\" p3=\"9\" p4=\"10\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"-1.7791009333444447\" p1=\"8\" p2=\"7\" p3=\"9\" p4=\"10\" periodicity=\"1\" phase=\"0\"/>\n\t\t\t\t<Torsion k=\"9.825603686165657\" p1=\"8\" p2=\"7\" p3=\"9\" p4=\"29\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"5.255757435827624\" p1=\"8\" p2=\"7\" p3=\"9\" p4=\"29\" periodicity=\"1\" phase=\"0\"/>\n\t\t\t\t<Torsion k=\"15.321515534533985\" p1=\"9\" p2=\"10\" p3=\"11\" p4=\"12\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"15.321515534533985\" p1=\"9\" p2=\"10\" p3=\"11\" p4=\"30\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"15.321515534533985\" p1=\"9\" p2=\"10\" p3=\"15\" p4=\"14\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"15.321515534533985\" p1=\"9\" p2=\"10\" p3=\"15\" p4=\"32\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"15.321515534533985\" p1=\"10\" p2=\"11\" p3=\"12\" p4=\"13\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"15.321515534533985\" p1=\"10\" p2=\"11\" p3=\"12\" p4=\"31\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"15.321515534533985\" p1=\"10\" p2=\"15\" p3=\"14\" p4=\"13\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"15.321515534533985\" p1=\"10\" p2=\"15\" p3=\"14\" p4=\"16\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"4.991902713141489\" p1=\"11\" p2=\"10\" p3=\"9\" p4=\"29\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"15.321515534533985\" p1=\"11\" p2=\"10\" p3=\"15\" p4=\"14\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"15.321515534533985\" p1=\"11\" p2=\"10\" p3=\"15\" p4=\"32\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"24.741172824496353\" p1=\"11\" p2=\"12\" p3=\"13\" p4=\"14\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"15.321515534533985\" p1=\"12\" p2=\"11\" p3=\"10\" p4=\"15\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"24.741172824496353\" p1=\"12\" p2=\"13\" p3=\"14\" p4=\"15\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"15.614143831453664\" p1=\"12\" p2=\"13\" p3=\"14\" p4=\"16\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"15.321515534533985\" p1=\"13\" p2=\"12\" p3=\"11\" p4=\"30\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"15.321515534533985\" p1=\"13\" p2=\"14\" p3=\"15\" p4=\"32\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"4.991902713141489\" p1=\"13\" p2=\"14\" p3=\"16\" p4=\"17\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"4.991902713141489\" p1=\"13\" p2=\"14\" p3=\"16\" p4=\"33\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"15.614143831453664\" p1=\"14\" p2=\"13\" p3=\"12\" p4=\"31\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"7.569054279772552\" p1=\"14\" p2=\"16\" p3=\"17\" p4=\"39\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"-.20151306284204928\" p1=\"14\" p2=\"16\" p3=\"17\" p4=\"39\" periodicity=\"1\" phase=\"0\"/>\n\t\t\t\t<Torsion k=\"4.991902713141489\" p1=\"15\" p2=\"10\" p3=\"9\" p4=\"29\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"15.321515534533985\" p1=\"15\" p2=\"10\" p3=\"11\" p4=\"30\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"4.991902713141489\" p1=\"15\" p2=\"14\" p3=\"16\" p4=\"17\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"4.991902713141489\" p1=\"15\" p2=\"14\" p3=\"16\" p4=\"33\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"15.321515534533985\" p1=\"16\" p2=\"14\" p3=\"15\" p4=\"32\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"11.63090805571212\" p1=\"16\" p2=\"17\" p3=\"39\" p4=\"36\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\".19822050697733679\" p1=\"17\" p2=\"39\" p3=\"36\" p4=\"37\" periodicity=\"3\" phase=\"0\"/>\n\t\t\t\t<Torsion k=\".19822050697733679\" p1=\"17\" p2=\"39\" p3=\"36\" p4=\"38\" periodicity=\"3\" phase=\"0\"/>\n\t\t\t\t<Torsion k=\".19822050697733679\" p1=\"17\" p2=\"39\" p3=\"36\" p4=\"40\" periodicity=\"3\" phase=\"0\"/>\n\t\t\t\t<Torsion k=\"4.869377577647952\" p1=\"18\" p2=\"17\" p3=\"39\" p4=\"36\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\".7025718355151895\" p1=\"18\" p2=\"17\" p3=\"39\" p4=\"36\" periodicity=\"1\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"15.321515534533985\" p1=\"23\" p2=\"2\" p3=\"1\" p4=\"27\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"15.321515534533985\" p1=\"26\" p2=\"0\" p3=\"1\" p4=\"27\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"15.321515534533985\" p1=\"26\" p2=\"0\" p3=\"5\" p4=\"28\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"15.321515534533985\" p1=\"30\" p2=\"11\" p3=\"12\" p4=\"31\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"7.569054279772552\" p1=\"33\" p2=\"16\" p3=\"17\" p4=\"39\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"-.20151306284204928\" p1=\"33\" p2=\"16\" p3=\"17\" p4=\"39\" periodicity=\"1\" phase=\"0\"/>\n\t\t\t\t<Torsion k=\"1.5341333333333336\" p1=\"0\" p2=\"26\" p3=\"1\" p4=\"5\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"1.5341333333333336\" p1=\"0\" p2=\"1\" p3=\"5\" p4=\"26\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"1.5341333333333336\" p1=\"0\" p2=\"5\" p3=\"26\" p4=\"1\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"1.5341333333333336\" p1=\"1\" p2=\"27\" p3=\"0\" p4=\"2\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"1.5341333333333336\" p1=\"1\" p2=\"0\" p3=\"2\" p4=\"27\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"1.5341333333333336\" p1=\"1\" p2=\"2\" p3=\"27\" p4=\"0\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"1.5341333333333336\" p1=\"2\" p2=\"23\" p3=\"1\" p4=\"3\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"1.5341333333333336\" p1=\"2\" p2=\"1\" p3=\"3\" p4=\"23\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"1.5341333333333336\" p1=\"2\" p2=\"3\" p3=\"23\" p4=\"1\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"1.5341333333333336\" p1=\"3\" p2=\"7\" p3=\"2\" p4=\"4\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"1.5341333333333336\" p1=\"3\" p2=\"2\" p3=\"4\" p4=\"7\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"1.5341333333333336\" p1=\"3\" p2=\"4\" p3=\"7\" p4=\"2\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"1.5341333333333336\" p1=\"4\" p2=\"6\" p3=\"3\" p4=\"5\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"1.5341333333333336\" p1=\"4\" p2=\"3\" p3=\"5\" p4=\"6\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"1.5341333333333336\" p1=\"4\" p2=\"5\" p3=\"6\" p4=\"3\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"1.5341333333333336\" p1=\"5\" p2=\"28\" p3=\"0\" p4=\"4\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"1.5341333333333336\" p1=\"5\" p2=\"0\" p3=\"4\" p4=\"28\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"1.5341333333333336\" p1=\"5\" p2=\"4\" p3=\"28\" p4=\"0\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"1.5341333333333336\" p1=\"7\" p2=\"9\" p3=\"3\" p4=\"8\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"1.5341333333333336\" p1=\"7\" p2=\"3\" p3=\"8\" p4=\"9\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"1.5341333333333336\" p1=\"7\" p2=\"8\" p3=\"9\" p4=\"3\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"1.3946666666666667\" p1=\"9\" p2=\"29\" p3=\"7\" p4=\"10\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"1.3946666666666667\" p1=\"9\" p2=\"7\" p3=\"10\" p4=\"29\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"1.3946666666666667\" p1=\"9\" p2=\"10\" p3=\"29\" p4=\"7\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"1.5341333333333336\" p1=\"10\" p2=\"15\" p3=\"9\" p4=\"11\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"1.5341333333333336\" p1=\"10\" p2=\"9\" p3=\"11\" p4=\"15\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"1.5341333333333336\" p1=\"10\" p2=\"11\" p3=\"15\" p4=\"9\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"1.5341333333333336\" p1=\"11\" p2=\"30\" p3=\"10\" p4=\"12\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"1.5341333333333336\" p1=\"11\" p2=\"10\" p3=\"12\" p4=\"30\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"1.5341333333333336\" p1=\"11\" p2=\"12\" p3=\"30\" p4=\"10\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"1.5341333333333336\" p1=\"12\" p2=\"31\" p3=\"11\" p4=\"13\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"1.5341333333333336\" p1=\"12\" p2=\"11\" p3=\"13\" p4=\"31\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"1.5341333333333336\" p1=\"12\" p2=\"13\" p3=\"31\" p4=\"11\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"1.5341333333333336\" p1=\"14\" p2=\"16\" p3=\"13\" p4=\"15\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"1.5341333333333336\" p1=\"14\" p2=\"13\" p3=\"15\" p4=\"16\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"1.5341333333333336\" p1=\"14\" p2=\"15\" p3=\"16\" p4=\"13\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"1.5341333333333336\" p1=\"15\" p2=\"32\" p3=\"10\" p4=\"14\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"1.5341333333333336\" p1=\"15\" p2=\"10\" p3=\"14\" p4=\"32\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"1.5341333333333336\" p1=\"15\" p2=\"14\" p3=\"32\" p4=\"10\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"1.3946666666666667\" p1=\"16\" p2=\"33\" p3=\"14\" p4=\"17\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"1.3946666666666667\" p1=\"16\" p2=\"14\" p3=\"17\" p4=\"33\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"1.3946666666666667\" p1=\"16\" p2=\"17\" p3=\"33\" p4=\"14\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"14.644\" p1=\"17\" p2=\"39\" p3=\"16\" p4=\"18\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"14.644\" p1=\"17\" p2=\"16\" p3=\"18\" p4=\"39\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t\t<Torsion k=\"14.644\" p1=\"17\" p2=\"18\" p3=\"39\" p4=\"16\" periodicity=\"2\" phase=\"3.141592653589793\"/>\n\t\t\t</Torsions>\n\t\t</Force>\n\t\t<Force alpha=\"0\" cutoff=\"1\" dispersionCorrection=\"1\" ewaldTolerance=\".0005\" exceptionsUsePeriodic=\"0\" forceGroup=\"0\" includeDirectSpace=\"1\" ljAlpha=\"0\" ljnx=\"0\" ljny=\"0\" ljnz=\"0\" method=\"0\" name=\"NonbondedForce\" nx=\"0\" ny=\"0\" nz=\"0\" recipForceGroup=\"-1\" rfDielectric=\"78.3\" switchingDistance=\"-1\" type=\"NonbondedForce\" useSwitchingFunction=\"0\" version=\"4\">\n\t\t\t<GlobalParameters>\n\t\t\t\t<Parameter default=\"0\" name=\"lambda_electrostatics_core\"/>\n\t\t\t\t<Parameter default=\"0\" name=\"lambda_sterics_core\"/>\n\t\t\t\t<Parameter default=\"0\" name=\"lambda_electrostatics_delete\"/>\n\t\t\t\t<Parameter default=\"0\" name=\"lambda_electrostatics_insert\"/>\n\t\t\t</GlobalParameters>\n\t\t\t<ParticleOffsets>\n\t\t\t\t<Offset eps=\"0\" parameter=\"lambda_electrostatics_core\" particle=\"0\" q=\"6.0001853853464127e-05\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" parameter=\"lambda_electrostatics_core\" particle=\"1\" q=\".0010300003923475742\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" parameter=\"lambda_electrostatics_core\" particle=\"2\" q=\"-.0011599971912801266\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" parameter=\"lambda_electrostatics_core\" particle=\"3\" q=\"-.0021499968133866787\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" parameter=\"lambda_electrostatics_core\" particle=\"4\" q=\"-.0011599971912801266\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" parameter=\"lambda_electrostatics_core\" particle=\"5\" q=\".0010300003923475742\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" parameter=\"lambda_electrostatics_core\" particle=\"6\" q=\"-.0007899976335465908\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" parameter=\"lambda_electrostatics_core\" particle=\"7\" q=\".00137001508846879\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" parameter=\"lambda_electrostatics_core\" particle=\"8\" q=\".007919969502836466\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" parameter=\"lambda_electrostatics_core\" particle=\"9\" q=\"-.008590010460466146\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" parameter=\"lambda_electrostatics_core\" particle=\"10\" q=\".009820009116083397\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" parameter=\"lambda_electrostatics_core\" particle=\"11\" q=\"-.0032500005327165127\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" parameter=\"lambda_electrostatics_core\" particle=\"12\" q=\".005950006190687418\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" parameter=\"lambda_electrostatics_core\" particle=\"13\" q=\".0469799661077559\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" parameter=\"lambda_electrostatics_core\" particle=\"14\" q=\".024080040398985147\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" parameter=\"lambda_electrostatics_core\" particle=\"15\" q=\"-.04535999661311507\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" parameter=\"lambda_electrostatics_core\" particle=\"16\" q=\".014669957105070353\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" parameter=\"lambda_electrostatics_core\" particle=\"17\" q=\".049890043679624796\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" parameter=\"lambda_electrostatics_core\" particle=\"18\" q=\".053150000516325235\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" parameter=\"lambda_electrostatics_delete\" particle=\"19\" q=\".247979999675105\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" parameter=\"lambda_electrostatics_delete\" particle=\"20\" q=\".12688000608856478\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" parameter=\"lambda_electrostatics_delete\" particle=\"21\" q=\"-.1561100025040408\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" parameter=\"lambda_electrostatics_delete\" particle=\"22\" q=\".18995000530655184\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" parameter=\"lambda_electrostatics_core\" particle=\"23\" q=\"-.0007899976335465908\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" parameter=\"lambda_electrostatics_delete\" particle=\"24\" q=\"-.0980899993640681\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" parameter=\"lambda_electrostatics_delete\" particle=\"25\" q=\"-.09341999779765804\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" parameter=\"lambda_electrostatics_core\" particle=\"26\" q=\".001339989248663187\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" parameter=\"lambda_electrostatics_core\" particle=\"27\" q=\".00019999081268906593\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" parameter=\"lambda_electrostatics_core\" particle=\"28\" q=\".00019999081268906593\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" parameter=\"lambda_electrostatics_core\" particle=\"29\" q=\"-.0035600042901933193\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" parameter=\"lambda_electrostatics_core\" particle=\"30\" q=\"-.001330000814050436\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" parameter=\"lambda_electrostatics_core\" particle=\"31\" q=\".007030003238469366\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" parameter=\"lambda_electrostatics_core\" particle=\"32\" q=\"-.0316899991594255\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" parameter=\"lambda_electrostatics_core\" particle=\"33\" q=\".011789979878813028\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" parameter=\"lambda_electrostatics_delete\" particle=\"34\" q=\"-.09678000103061397\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" parameter=\"lambda_electrostatics_delete\" particle=\"35\" q=\"-.09678000103061397\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" parameter=\"lambda_electrostatics_insert\" particle=\"36\" q=\".14007000749309859\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" parameter=\"lambda_electrostatics_insert\" particle=\"37\" q=\".05332000305255254\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" parameter=\"lambda_electrostatics_insert\" particle=\"38\" q=\".05332000305255254\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" parameter=\"lambda_electrostatics_insert\" particle=\"39\" q=\"-.4603399919966857\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" parameter=\"lambda_electrostatics_insert\" particle=\"40\" q=\".05332000305255254\" sig=\"0\"/>\n\t\t\t</ParticleOffsets>\n\t\t\t<ExceptionOffsets>\n\t\t\t\t<Offset eps=\"0\" exception=\"78\" parameter=\"lambda_electrostatics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"78\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"79\" parameter=\"lambda_electrostatics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"79\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"80\" parameter=\"lambda_electrostatics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"80\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"81\" parameter=\"lambda_electrostatics_core\" q=\".00016659860791037873\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"81\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"82\" parameter=\"lambda_electrostatics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"82\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"83\" parameter=\"lambda_electrostatics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"83\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"84\" parameter=\"lambda_electrostatics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"84\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"85\" parameter=\"lambda_electrostatics_core\" q=\".00016850897116012752\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"85\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"86\" parameter=\"lambda_electrostatics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"86\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"87\" parameter=\"lambda_electrostatics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"87\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"88\" parameter=\"lambda_electrostatics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"88\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"89\" parameter=\"lambda_electrostatics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"89\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"90\" parameter=\"lambda_electrostatics_core\" q=\".00016850897116012752\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"90\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"91\" parameter=\"lambda_electrostatics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"91\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"92\" parameter=\"lambda_electrostatics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"92\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"93\" parameter=\"lambda_electrostatics_core\" q=\"6.0870634662298605e-05\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"93\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"94\" parameter=\"lambda_electrostatics_core\" q=\"2.3459712084772204e-05\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"94\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"95\" parameter=\"lambda_electrostatics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"95\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"96\" parameter=\"lambda_electrostatics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"96\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"97\" parameter=\"lambda_electrostatics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"97\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"98\" parameter=\"lambda_electrostatics_core\" q=\".00044514218401757455\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"98\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"99\" parameter=\"lambda_electrostatics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"99\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"100\" parameter=\"lambda_electrostatics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"100\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"101\" parameter=\"lambda_electrostatics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"101\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"102\" parameter=\"lambda_electrostatics_core\" q=\".00044514218401757455\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"102\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"103\" parameter=\"lambda_electrostatics_core\" q=\"-.0005217697174946245\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"103\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"104\" parameter=\"lambda_electrostatics_core\" q=\".00086807807155527\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"104\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"105\" parameter=\"lambda_electrostatics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"105\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"106\" parameter=\"lambda_electrostatics_core\" q=\".00086807807155527\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"106\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"107\" parameter=\"lambda_electrostatics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"107\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"108\" parameter=\"lambda_electrostatics_core\" q=\"8.618019219052211e-05\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"108\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"109\" parameter=\"lambda_electrostatics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"109\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"110\" parameter=\"lambda_electrostatics_core\" q=\"8.618019219052211e-05\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"110\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"111\" parameter=\"lambda_electrostatics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"111\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"112\" parameter=\"lambda_electrostatics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"112\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"113\" parameter=\"lambda_electrostatics_core\" q=\"-.001391876315428732\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"113\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"114\" parameter=\"lambda_electrostatics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"114\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"115\" parameter=\"lambda_electrostatics_core\" q=\"-.0036471365275225903\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"115\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"116\" parameter=\"lambda_electrostatics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"116\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"117\" parameter=\"lambda_electrostatics_core\" q=\"-.002192979807264739\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"117\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"118\" parameter=\"lambda_electrostatics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"118\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"119\" parameter=\"lambda_electrostatics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"119\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"120\" parameter=\"lambda_electrostatics_core\" q=\"-.0055000777366771\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"120\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"121\" parameter=\"lambda_electrostatics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"121\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"122\" parameter=\"lambda_electrostatics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"122\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"123\" parameter=\"lambda_electrostatics_core\" q=\"-.0009408102326742135\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"123\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"124\" parameter=\"lambda_electrostatics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"124\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"125\" parameter=\"lambda_electrostatics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"125\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"126\" parameter=\"lambda_electrostatics_core\" q=\"-.013442717774604707\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"126\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"127\" parameter=\"lambda_electrostatics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"127\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"128\" parameter=\"lambda_electrostatics_core\" q=\"-.007229070402273469\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"128\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"129\" parameter=\"lambda_electrostatics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"129\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"130\" parameter=\"lambda_electrostatics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"130\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"131\" parameter=\"lambda_electrostatics_core\" q=\"-.02642469578975229\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"131\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"132\" parameter=\"lambda_electrostatics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"132\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"133\" parameter=\"lambda_electrostatics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"133\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"134\" parameter=\"lambda_electrostatics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"134\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"135\" parameter=\"lambda_electrostatics_core\" q=\"-.01826924172552523\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"135\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"136\" parameter=\"lambda_electrostatics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"136\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"137\" parameter=\"lambda_electrostatics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"137\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"138\" parameter=\"lambda_electrostatics_core\" q=\"-.0029428754011848954\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"138\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"139\" parameter=\"lambda_electrostatics_core\" q=\".0027006178301614003\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"139\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"140\" parameter=\"lambda_electrostatics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"140\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"141\" parameter=\"lambda_electrostatics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"141\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"142\" parameter=\"lambda_electrostatics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"142\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"143\" parameter=\"lambda_electrostatics_core\" q=\"-.0008349130826900142\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"143\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"144\" parameter=\"lambda_electrostatics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"144\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"145\" parameter=\"lambda_electrostatics_core\" q=\"-.04074764213224408\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"145\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"146\" parameter=\"lambda_electrostatics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"146\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"147\" parameter=\"lambda_electrostatics_core\" q=\".013535835429843907\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"147\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"148\" parameter=\"lambda_electrostatics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"148\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"149\" parameter=\"lambda_electrostatics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"149\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"161\" parameter=\"lambda_electrostatics_core\" q=\"6.0870634662298605e-05\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"161\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"162\" parameter=\"lambda_electrostatics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"162\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"163\" parameter=\"lambda_electrostatics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"163\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"164\" parameter=\"lambda_electrostatics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"164\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"165\" parameter=\"lambda_electrostatics_core\" q=\"2.3459712084772204e-05\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"165\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"166\" parameter=\"lambda_electrostatics_core\" q=\"-.0005217697174946245\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"166\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"171\" parameter=\"lambda_electrostatics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"171\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"172\" parameter=\"lambda_electrostatics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"172\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"173\" parameter=\"lambda_electrostatics_core\" q=\"-8.474395054602381e-05\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"173\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"174\" parameter=\"lambda_electrostatics_core\" q=\"-8.474395054602381e-05\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"174\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"175\" parameter=\"lambda_electrostatics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"175\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"176\" parameter=\"lambda_electrostatics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"176\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"177\" parameter=\"lambda_electrostatics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"177\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"178\" parameter=\"lambda_electrostatics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"178\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"179\" parameter=\"lambda_electrostatics_core\" q=\"-.00030634639930656946\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"179\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"180\" parameter=\"lambda_electrostatics_core\" q=\".00011393361614350089\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"180\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"181\" parameter=\"lambda_electrostatics_core\" q=\"-.00011371281610210709\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"181\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"182\" parameter=\"lambda_electrostatics_core\" q=\".00020062895737675904\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"182\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"183\" parameter=\"lambda_electrostatics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"183\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"184\" parameter=\"lambda_electrostatics_core\" q=\".00011393361614350089\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"184\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"185\" parameter=\"lambda_electrostatics_core\" q=\"-.00030634639930656946\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"185\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"186\" parameter=\"lambda_electrostatics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"186\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"187\" parameter=\"lambda_electrostatics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"187\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"188\" parameter=\"lambda_electrostatics_core\" q=\"-.00011371281610210709\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"188\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"189\" parameter=\"lambda_electrostatics_core\" q=\".00020062895737675904\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"189\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"190\" parameter=\"lambda_electrostatics_core\" q=\"-.00016471563349071405\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"190\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"191\" parameter=\"lambda_electrostatics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"191\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"192\" parameter=\"lambda_electrostatics_core\" q=\".0037877122593877044\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"192\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"193\" parameter=\"lambda_electrostatics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"193\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"194\" parameter=\"lambda_electrostatics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"194\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"195\" parameter=\"lambda_electrostatics_core\" q=\"-4.4176774274776176e-05\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"195\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"196\" parameter=\"lambda_electrostatics_core\" q=\"-.01148498239015841\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"196\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"197\" parameter=\"lambda_electrostatics_core\" q=\"-.0007235158863080071\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"197\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"198\" parameter=\"lambda_electrostatics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"198\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"199\" parameter=\"lambda_electrostatics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"199\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"200\" parameter=\"lambda_electrostatics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"200\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"201\" parameter=\"lambda_electrostatics_core\" q=\".007598700174294357\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"201\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"202\" parameter=\"lambda_electrostatics_core\" q=\"-.006228913813490604\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"202\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"203\" parameter=\"lambda_electrostatics_core\" q=\".0009623651541676996\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"203\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"204\" parameter=\"lambda_electrostatics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"204\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"205\" parameter=\"lambda_electrostatics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"205\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"206\" parameter=\"lambda_electrostatics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"206\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"207\" parameter=\"lambda_electrostatics_core\" q=\".0038402648712212387\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"207\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"208\" parameter=\"lambda_electrostatics_core\" q=\".0009876489672204273\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"208\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"209\" parameter=\"lambda_electrostatics_core\" q=\".011338308362815047\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"209\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"210\" parameter=\"lambda_electrostatics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"210\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"211\" parameter=\"lambda_electrostatics_core\" q=\".007110142232513342\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"211\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"212\" parameter=\"lambda_electrostatics_core\" q=\".024759967075500808\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"212\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"213\" parameter=\"lambda_electrostatics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"213\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"214\" parameter=\"lambda_electrostatics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"214\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"215\" parameter=\"lambda_electrostatics_core\" q=\".01628040710537164\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"215\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"216\" parameter=\"lambda_electrostatics_core\" q=\".006243185457491668\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"216\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"217\" parameter=\"lambda_electrostatics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"217\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"218\" parameter=\"lambda_electrostatics_core\" q=\"-.015847863637973747\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"218\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"219\" parameter=\"lambda_electrostatics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"219\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"220\" parameter=\"lambda_electrostatics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"220\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"221\" parameter=\"lambda_electrostatics_core\" q=\".009488314532156067\" sig=\"0\"/>\n\t\t\t\t<Offset eps=\"0\" exception=\"221\" parameter=\"lambda_sterics_core\" q=\"0\" sig=\"0\"/>\n\t\t\t</ExceptionOffsets>\n\t\t\t<Particles>\n\t\t\t\t<Particle eps=\"0\" q=\"-.09701000262672703\" sig=\".3480646886945065\"/>\n\t\t\t\t<Particle eps=\"0\" q=\"-.12892000485832492\" sig=\".3480646886945065\"/>\n\t\t\t\t<Particle eps=\"0\" q=\".05228999893491467\" sig=\".3480646886945065\"/>\n\t\t\t\t<Particle eps=\"0\" q=\"-.14205999781067172\" sig=\".3480646886945065\"/>\n\t\t\t\t<Particle eps=\"0\" q=\".05228999893491467\" sig=\".3480646886945065\"/>\n\t\t\t\t<Particle eps=\"0\" q=\"-.12892000485832492\" sig=\".3480646886945065\"/>\n\t\t\t\t<Particle eps=\"0\" q=\"-.05909000073249141\" sig=\".33075278064606245\"/>\n\t\t\t\t<Particle eps=\"0\" q=\".6887199867827197\" sig=\".3480646886945065\"/>\n\t\t\t\t<Particle eps=\"0\" q=\"-.5489199768441418\" sig=\".30398122050658094\"/>\n\t\t\t\t<Particle eps=\"0\" q=\"-.4677799950974683\" sig=\".32068760236639016\"/>\n\t\t\t\t<Particle eps=\"0\" q=\".11818999688451488\" sig=\".3480646886945065\"/>\n\t\t\t\t<Particle eps=\"0\" q=\"-.28378000964100164\" sig=\".3480646886945065\"/>\n\t\t\t\t<Particle eps=\"0\" q=\".43838000188892084\" sig=\".3480646886945065\"/>\n\t\t\t\t<Particle eps=\"0\" q=\"-.7273799787896374\" sig=\".32068760236639016\"/>\n\t\t\t\t<Particle eps=\"0\" q=\".5425199855429431\" sig=\".3480646886945065\"/>\n\t\t\t\t<Particle eps=\"0\" q=\"-.29719001163418096\" sig=\".3480646886945065\"/>\n\t\t\t\t<Particle eps=\"0\" q=\"-.550849975241969\" sig=\".32068760236639016\"/>\n\t\t\t\t<Particle eps=\"0\" q=\".7012199748617908\" sig=\".3480646886945065\"/>\n\t\t\t\t<Particle eps=\"0\" q=\"-.5760700117486218\" sig=\".30398122050658094\"/>\n\t\t\t\t<Particle eps=\"0\" q=\"-.247979999675105\" sig=\".3379531761626621\"/>\n\t\t\t\t<Particle eps=\"0\" q=\"-.12688000608856478\" sig=\".3379531761626621\"/>\n\t\t\t\t<Particle eps=\"0\" q=\".1561100025040408\" sig=\".3379531761626621\"/>\n\t\t\t\t<Particle eps=\"0\" q=\"-.18995000530655184\" sig=\".3118145513491188\"/>\n\t\t\t\t<Particle eps=\"0\" q=\"-.05909000073249141\" sig=\".33075278064606245\"/>\n\t\t\t\t<Particle eps=\"0\" q=\".0980899993640681\" sig=\".2644543413268125\"/>\n\t\t\t\t<Particle eps=\"0\" q=\".09341999779765804\" sig=\".2583225710839196\"/>\n\t\t\t\t<Particle eps=\"0\" q=\".1467300046545764\" sig=\".25725815350632797\"/>\n\t\t\t\t<Particle eps=\"0\" q=\".1575700033766528\" sig=\".25725815350632797\"/>\n\t\t\t\t<Particle eps=\"0\" q=\".1575700033766528\" sig=\".25725815350632797\"/>\n\t\t\t\t<Particle eps=\"0\" q=\".33072000633304316\" sig=\".11034276772973169\"/>\n\t\t\t\t<Particle eps=\"0\" q=\".17483000348632535\" sig=\".25725815350632797\"/>\n\t\t\t\t<Particle eps=\"0\" q=\".025959999145319063\" sig=\".2453626527729973\"/>\n\t\t\t\t<Particle eps=\"0\" q=\".17348000298564634\" sig=\".25725815350632797\"/>\n\t\t\t\t<Particle eps=\"0\" q=\".3302200127703448\" sig=\".11034276772973169\"/>\n\t\t\t\t<Particle eps=\"0\" q=\".09678000103061397\" sig=\".2644543413268125\"/>\n\t\t\t\t<Particle eps=\"0\" q=\".09678000103061397\" sig=\".2644543413268125\"/>\n\t\t\t\t<Particle eps=\"0\" q=\"0\" sig=\".3379531761626621\"/>\n\t\t\t\t<Particle eps=\"0\" q=\"0\" sig=\".2583225710839196\"/>\n\t\t\t\t<Particle eps=\"0\" q=\"0\" sig=\".2583225710839196\"/>\n\t\t\t\t<Particle eps=\"0\" q=\"0\" sig=\".30251064904353125\"/>\n\t\t\t\t<Particle eps=\"0\" q=\"0\" sig=\".2583225710839196\"/>\n\t\t\t</Particles>\n\t\t\t<Exceptions>\n\t\t\t\t<Exception eps=\"0\" p1=\"34\" p2=\"36\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"34\" p2=\"37\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"34\" p2=\"38\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"34\" p2=\"39\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"34\" p2=\"40\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"35\" p2=\"36\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"35\" p2=\"37\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"35\" p2=\"38\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"35\" p2=\"39\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"35\" p2=\"40\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"19\" p2=\"36\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"19\" p2=\"37\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"19\" p2=\"38\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"19\" p2=\"39\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"19\" p2=\"40\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"20\" p2=\"36\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"20\" p2=\"37\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"20\" p2=\"38\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"20\" p2=\"39\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"20\" p2=\"40\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"21\" p2=\"36\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"21\" p2=\"37\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"21\" p2=\"38\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"21\" p2=\"39\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"21\" p2=\"40\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"22\" p2=\"36\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"22\" p2=\"37\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"22\" p2=\"38\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"22\" p2=\"39\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"22\" p2=\"40\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"24\" p2=\"36\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"24\" p2=\"37\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"24\" p2=\"38\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"24\" p2=\"39\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"24\" p2=\"40\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"25\" p2=\"36\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"25\" p2=\"37\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"25\" p2=\"38\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"25\" p2=\"39\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"25\" p2=\"40\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"34\" p2=\"35\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"34\" p2=\"19\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"34\" p2=\"20\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"34\" p2=\"21\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\".06490422671732708\" p1=\"34\" p2=\"22\" q=\"-.015319468091111016\" sig=\".2881344463379656\"/>\n\t\t\t\t<Exception eps=\".03301067803791333\" p1=\"34\" p2=\"24\" q=\".007910958532956197\" sig=\".26445434132681245\"/>\n\t\t\t\t<Exception eps=\".033662965793002965\" p1=\"34\" p2=\"25\" q=\".007534322902614418\" sig=\".261388456205366\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"35\" p2=\"19\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"35\" p2=\"20\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"35\" p2=\"21\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\".06490422671732708\" p1=\"35\" p2=\"22\" q=\"-.015319468091111016\" sig=\".2881344463379656\"/>\n\t\t\t\t<Exception eps=\".03301067803791333\" p1=\"35\" p2=\"24\" q=\".007910958532956197\" sig=\".26445434132681245\"/>\n\t\t\t\t<Exception eps=\".033662965793002965\" p1=\"35\" p2=\"25\" q=\".007534322902614418\" sig=\".261388456205366\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"19\" p2=\"20\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"19\" p2=\"21\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"19\" p2=\"22\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"19\" p2=\"24\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"19\" p2=\"25\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"20\" p2=\"21\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"20\" p2=\"22\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"20\" p2=\"24\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"20\" p2=\"25\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"21\" p2=\"22\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"21\" p2=\"24\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"21\" p2=\"25\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\".06490422671732708\" p1=\"22\" p2=\"24\" q=\"-.015526829916437005\" sig=\".2881344463379656\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"22\" p2=\"25\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\".033662965793002965\" p1=\"24\" p2=\"25\" q=\".007636306270469601\" sig=\".261388456205366\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"36\" p2=\"37\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"36\" p2=\"38\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"36\" p2=\"39\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"36\" p2=\"40\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"37\" p2=\"38\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"37\" p2=\"39\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"37\" p2=\"40\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"38\" p2=\"39\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"38\" p2=\"40\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"39\" p2=\"40\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"0\" p2=\"1\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"0\" p2=\"2\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"1\" p2=\"2\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\".1817515279188896\" p1=\"0\" p2=\"3\" q=\".011484367300638416\" sig=\".34806468869450646\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"1\" p2=\"3\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"2\" p2=\"3\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"0\" p2=\"4\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\".1817515279188896\" p1=\"1\" p2=\"4\" q=\"-.005617689097275837\" sig=\".34806468869450646\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"2\" p2=\"4\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"3\" p2=\"4\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"0\" p2=\"5\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"1\" p2=\"5\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\".1817515279188896\" p1=\"2\" p2=\"5\" q=\"-.005617689097275837\" sig=\".34806468869450646\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"3\" p2=\"5\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"4\" p2=\"5\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\".31778544075682036\" p1=\"0\" p2=\"6\" q=\".004776934271893578\" sig=\".33940873467028443\"/>\n\t\t\t\t<Exception eps=\".31778544075682036\" p1=\"2\" p2=\"6\" q=\"-.002574846729471736\" sig=\".33940873467028443\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"3\" p2=\"6\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"4\" p2=\"6\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"5\" p2=\"6\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\".1817515279188896\" p1=\"1\" p2=\"7\" q=\"-.07399148670171142\" sig=\".34806468869450646\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"2\" p2=\"7\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"3\" p2=\"7\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"4\" p2=\"7\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\".1817515279188896\" p1=\"5\" p2=\"7\" q=\"-.07399148670171142\" sig=\".34806468869450646\"/>\n\t\t\t\t<Exception eps=\".31778544075682036\" p1=\"6\" p2=\"7\" q=\"-.033913720436226986\" sig=\".33940873467028443\"/>\n\t\t\t\t<Exception eps=\".28271088721948956\" p1=\"2\" p2=\"8\" q=\"-.023919187503777972\" sig=\".32602295460054365\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"3\" p2=\"8\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\".28271088721948956\" p1=\"4\" p2=\"8\" q=\"-.023919187503777972\" sig=\".32602295460054365\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"7\" p2=\"8\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\".2525081613555379\" p1=\"2\" p2=\"9\" q=\"-.020383512871184176\" sig=\".33437614553044825\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"3\" p2=\"9\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\".2525081613555379\" p1=\"4\" p2=\"9\" q=\"-.020383512871184176\" sig=\".33437614553044825\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"7\" p2=\"9\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"8\" p2=\"9\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\".1817515279188896\" p1=\"3\" p2=\"10\" q=\"-.013991725582214568\" sig=\".34806468869450646\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"7\" p2=\"10\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\".28271088721948956\" p1=\"8\" p2=\"10\" q=\"-.054064041960880924\" sig=\".32602295460054365\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"9\" p2=\"10\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\".1817515279188896\" p1=\"7\" p2=\"11\" q=\"-.16287080374095894\" sig=\".34806468869450646\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"9\" p2=\"11\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"10\" p2=\"11\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\".2525081613555379\" p1=\"9\" p2=\"12\" q=\"-.17088782927868962\" sig=\".33437614553044825\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"10\" p2=\"12\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"11\" p2=\"12\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\".2525081613555379\" p1=\"10\" p2=\"13\" q=\"-.0716408645225048\" sig=\".33437614553044825\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"11\" p2=\"13\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"12\" p2=\"13\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\".2525081613555379\" p1=\"9\" p2=\"14\" q=\"-.21148333014796378\" sig=\".33437614553044825\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"10\" p2=\"14\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\".1817515279188896\" p1=\"11\" p2=\"14\" q=\"-.12829693893984373\" sig=\".34806468869450646\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"12\" p2=\"14\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"13\" p2=\"14\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\".1817515279188896\" p1=\"7\" p2=\"15\" q=\"-.17056725073720785\" sig=\".34806468869450646\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"9\" p2=\"15\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"10\" p2=\"15\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"11\" p2=\"15\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\".1817515279188896\" p1=\"12\" p2=\"15\" q=\"-.10856846488463388\" sig=\".34806468869450646\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"13\" p2=\"15\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"14\" p2=\"15\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\".2525081613555379\" p1=\"10\" p2=\"16\" q=\"-.054254130714736185\" sig=\".33437614553044825\"/>\n\t\t\t\t<Exception eps=\".2525081613555379\" p1=\"12\" p2=\"16\" q=\"-.2012346776559053\" sig=\".33437614553044825\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"13\" p2=\"16\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"14\" p2=\"16\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"15\" p2=\"16\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\".2525081613555379\" p1=\"13\" p2=\"17\" q=\"-.42504447536819956\" sig=\".33437614553044825\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"14\" p2=\"17\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\".1817515279188896\" p1=\"15\" p2=\"17\" q=\"-.1736629770727464\" sig=\".34806468869450646\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"16\" p2=\"17\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\".28271088721948956\" p1=\"14\" p2=\"18\" q=\"-.26044124537132113\" sig=\".32602295460054365\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"16\" p2=\"18\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"17\" p2=\"18\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\".2034301694080029\" p1=\"14\" p2=\"19\" q=\"-.11211175486556417\" sig=\".3430089324285842\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"16\" p2=\"19\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"17\" p2=\"19\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"18\" p2=\"19\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\".282626389057837\" p1=\"16\" p2=\"20\" q=\".05824320684382232\" sig=\".32932038926452606\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"17\" p2=\"20\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\".31643158293675233\" p1=\"18\" p2=\"20\" q=\".06090980549842061\" sig=\".32096719833462145\"/>\n\t\t\t\t<Exception eps=\".282626389057837\" p1=\"16\" p2=\"21\" q=\"-.07166099251197883\" sig=\".32932038926452606\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"17\" p2=\"21\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\".31643158293675233\" p1=\"18\" p2=\"21\" q=\"-.07494190914715014\" sig=\".32096719833462145\"/>\n\t\t\t\t<Exception eps=\".15229470109227483\" p1=\"17\" p2=\"22\" q=\"-.11099728162171443\" sig=\".3299396200218126\"/>\n\t\t\t\t<Exception eps=\".31778544075682036\" p1=\"0\" p2=\"23\" q=\".004776934271893578\" sig=\".33940873467028443\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"1\" p2=\"23\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"2\" p2=\"23\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"3\" p2=\"23\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\".31778544075682036\" p1=\"4\" p2=\"23\" q=\"-.002574846729471736\" sig=\".33940873467028443\"/>\n\t\t\t\t<Exception eps=\".31778544075682036\" p1=\"7\" p2=\"23\" q=\"-.033913720436226986\" sig=\".33940873467028443\"/>\n\t\t\t\t<Exception eps=\".10761271951717676\" p1=\"16\" p2=\"24\" q=\"-.04502739476765139\" sig=\".2925709718466013\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"17\" p2=\"24\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\".12048437265346983\" p1=\"18\" p2=\"24\" q=\"-.047088922571734186\" sig=\".2842177809166967\"/>\n\t\t\t\t<Exception eps=\".07898855856726843\" p1=\"17\" p2=\"25\" q=\".054589973756051936\" sig=\".30319362988921306\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"0\" p2=\"26\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"1\" p2=\"26\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\".0770442108427714\" p1=\"2\" p2=\"26\" q=\".006393759822589854\" sig=\".30266142110041716\"/>\n\t\t\t\t<Exception eps=\".0770442108427714\" p1=\"4\" p2=\"26\" q=\".006393759822589854\" sig=\".30266142110041716\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"5\" p2=\"26\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"0\" p2=\"27\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"1\" p2=\"27\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"2\" p2=\"27\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\".0770442108427714\" p1=\"3\" p2=\"27\" q=\"-.018653661945595694\" sig=\".30266142110041716\"/>\n\t\t\t\t<Exception eps=\".0770442108427714\" p1=\"5\" p2=\"27\" q=\"-.01692827133403696\" sig=\".30266142110041716\"/>\n\t\t\t\t<Exception eps=\".13470879051623594\" p1=\"23\" p2=\"27\" q=\"-.007759009679120907\" sig=\".2940054670761951\"/>\n\t\t\t\t<Exception eps=\".03265892998178476\" p1=\"26\" p2=\"27\" q=\".019266872774064903\" sig=\".2572581535063279\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"0\" p2=\"28\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\".0770442108427714\" p1=\"1\" p2=\"28\" q=\"-.01692827133403696\" sig=\".30266142110041716\"/>\n\t\t\t\t<Exception eps=\".0770442108427714\" p1=\"3\" p2=\"28\" q=\"-.018653661945595694\" sig=\".30266142110041716\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"4\" p2=\"28\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"5\" p2=\"28\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\".13470879051623594\" p1=\"6\" p2=\"28\" q=\"-.007759009679120907\" sig=\".2940054670761951\"/>\n\t\t\t\t<Exception eps=\".03265892998178476\" p1=\"26\" p2=\"28\" q=\".019266872774064903\" sig=\".2572581535063279\"/>\n\t\t\t\t<Exception eps=\".07319609766763858\" p1=\"3\" p2=\"29\" q=\"-.03915173614634788\" sig=\".22920372821211907\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"7\" p2=\"29\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\".11385507428502802\" p1=\"8\" p2=\"29\" q=\"-.15128234851519043\" sig=\".20716199411815628\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"9\" p2=\"29\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"10\" p2=\"29\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\".07319609766763858\" p1=\"11\" p2=\"29\" q=\"-.07820977215471926\" sig=\".22920372821211907\"/>\n\t\t\t\t<Exception eps=\".07319609766763858\" p1=\"15\" p2=\"29\" q=\"-.08190556877481125\" sig=\".22920372821211907\"/>\n\t\t\t\t<Exception eps=\".10703784582035802\" p1=\"9\" p2=\"30\" q=\"-.06815164847810304\" sig=\".288972877936359\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"10\" p2=\"30\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"11\" p2=\"30\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"12\" p2=\"30\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\".10703784582035802\" p1=\"13\" p2=\"30\" q=\"-.10597320352306298\" sig=\".288972877936359\"/>\n\t\t\t\t<Exception eps=\".0770442108427714\" p1=\"15\" p2=\"30\" q=\"-.04329810897508744\" sig=\".30266142110041716\"/>\n\t\t\t\t<Exception eps=\".07059460271713841\" p1=\"10\" p2=\"31\" q=\".002556843515089391\" sig=\".2967136707337519\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"11\" p2=\"31\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"12\" p2=\"31\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"13\" p2=\"31\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\".07059460271713841\" p1=\"14\" p2=\"31\" q=\".011736515300844429\" sig=\".2967136707337519\"/>\n\t\t\t\t<Exception eps=\".029924950389017466\" p1=\"30\" p2=\"31\" q=\".0037821556175676127\" sig=\".2513104031396626\"/>\n\t\t\t\t<Exception eps=\".10703784582035802\" p1=\"9\" p2=\"32\" q=\"-.06762539578844536\" sig=\".288972877936359\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"10\" p2=\"32\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\".0770442108427714\" p1=\"11\" p2=\"32\" q=\"-.04102513076648976\" sig=\".30266142110041716\"/>\n\t\t\t\t<Exception eps=\".10703784582035802\" p1=\"13\" p2=\"32\" q=\"-.10515490074343806\" sig=\".288972877936359\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"14\" p2=\"32\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"15\" p2=\"32\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\".10703784582035802\" p1=\"16\" p2=\"32\" q=\"-.07963454612468332\" sig=\".288972877936359\"/>\n\t\t\t\t<Exception eps=\".10169164601853607\" p1=\"13\" p2=\"33\" q=\"-.200162854904006\" sig=\".2155151850480609\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"14\" p2=\"33\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\".07319609766763858\" p1=\"15\" p2=\"33\" q=\"-.08178174119754847\" sig=\".22920372821211907\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"16\" p2=\"33\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"17\" p2=\"33\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\".11385507428502802\" p1=\"18\" p2=\"33\" q=\"-.1585248721968688\" sig=\".20716199411815628\"/>\n\t\t\t\t<Exception eps=\".08192665403713992\" p1=\"19\" p2=\"33\" q=\"-.06823996554958607\" sig=\".22414797194619684\"/>\n\t\t\t\t<Exception eps=\".07745799617230799\" p1=\"17\" p2=\"34\" q=\".05655339157484268\" sig=\".30625951501065946\"/>\n\t\t\t\t<Exception eps=\".07745799617230799\" p1=\"17\" p2=\"35\" q=\".05655339157484268\" sig=\".30625951501065946\"/>\n\t\t\t\t<Exception eps=\".282626389057837\" p1=\"16\" p2=\"36\" q=\"-.06258561596507095\" sig=\".32932038926452606\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"17\" p2=\"36\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\".31643158293675233\" p1=\"18\" p2=\"36\" q=\"-.061037841576332484\" sig=\".32096719833462145\"/>\n\t\t\t\t<Exception eps=\".07898855856726843\" p1=\"17\" p2=\"37\" q=\".033374323734525896\" sig=\".30319362988921306\"/>\n\t\t\t\t<Exception eps=\".07898855856726843\" p1=\"17\" p2=\"38\" q=\".033374323734525896\" sig=\".30319362988921306\"/>\n\t\t\t\t<Exception eps=\".25308994957902226\" p1=\"14\" p2=\"39\" q=\"-.21735720950619097\" sig=\".32528766886901883\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"16\" p2=\"39\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"17\" p2=\"39\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\"0\" p1=\"18\" p2=\"39\" q=\"0\" sig=\"1\"/>\n\t\t\t\t<Exception eps=\".10192594736453107\" p1=\"33\" p2=\"39\" q=\"-.13120073106574986\" sig=\".20642670838663146\"/>\n\t\t\t\t<Exception eps=\".07898855856726843\" p1=\"17\" p2=\"40\" q=\".033374323734525896\" sig=\".30319362988921306\"/>\n\t\t\t</Exceptions>\n\t\t</Force>\n\t\t<Force cutoff=\"1\" energy=\"U_sterics;U_sterics = select(step(r - r_LJ), 4*epsilon*x*(x-1.0), U_sterics_quad);U_sterics_quad = Force*(((r - r_LJ)^2)/2 - (r - r_LJ)) + U_sterics_cut;U_sterics_cut = 4*epsilon*((sigma/r_LJ)^6)*(((sigma/r_LJ)^6) - 1.0);Force = -4*epsilon*((-12*sigma^12)/(r_LJ^13) + (6*sigma^6)/(r_LJ^7));x = (sigma/r)^6;r_LJ = softcore_alpha*((26/7)*(sigma^6)*lambda_sterics_deprecated)^(1/6);lambda_sterics_deprecated = new_interaction*(1.0 - lambda_sterics_insert) + old_interaction*lambda_sterics_delete;epsilon = (1-lambda_sterics)*epsilonA + lambda_sterics*epsilonB;reff_sterics = sigma*((softcore_alpha*lambda_alpha + (r/sigma)^6))^(1/6);sigma = (1-lambda_sterics)*sigmaA + lambda_sterics*sigmaB;lambda_alpha = new_interaction*(1-lambda_sterics_insert) + old_interaction*lambda_sterics_delete;lambda_sterics = core_interaction*lambda_sterics_core + new_interaction*lambda_sterics_insert + old_interaction*lambda_sterics_delete;core_interaction = delta(unique_old1+unique_old2+unique_new1+unique_new2);new_interaction = max(unique_new1, unique_new2);old_interaction = max(unique_old1, unique_old2);epsilonA = sqrt(epsilonA1*epsilonA2);epsilonB = sqrt(epsilonB1*epsilonB2);sigmaA = 0.5*(sigmaA1 + sigmaA2);sigmaB = 0.5*(sigmaB1 + sigmaB2);\" forceGroup=\"0\" method=\"0\" name=\"CustomNonbondedForce\" switchingDistance=\"-1\" type=\"CustomNonbondedForce\" useLongRangeCorrection=\"0\" useSwitchingFunction=\"0\" version=\"2\">\n\t\t\t<PerParticleParameters>\n\t\t\t\t<Parameter name=\"sigmaA\"/>\n\t\t\t\t<Parameter name=\"epsilonA\"/>\n\t\t\t\t<Parameter name=\"sigmaB\"/>\n\t\t\t\t<Parameter name=\"epsilonB\"/>\n\t\t\t\t<Parameter name=\"unique_old\"/>\n\t\t\t\t<Parameter name=\"unique_new\"/>\n\t\t\t</PerParticleParameters>\n\t\t\t<GlobalParameters>\n\t\t\t\t<Parameter default=\".85\" name=\"softcore_alpha\"/>\n\t\t\t\t<Parameter default=\"0\" name=\"lambda_sterics_core\"/>\n\t\t\t\t<Parameter default=\"0\" name=\"lambda_electrostatics_core\"/>\n\t\t\t\t<Parameter default=\"0\" name=\"lambda_sterics_insert\"/>\n\t\t\t\t<Parameter default=\"0\" name=\"lambda_sterics_delete\"/>\n\t\t\t</GlobalParameters>\n\t\t\t<EnergyParameterDerivatives/>\n\t\t\t<Particles>\n\t\t\t\t<Particle param1=\".3480646886945065\" param2=\".3635030558377792\" param3=\".3480646886945065\" param4=\".3635030558377792\" param5=\"0\" param6=\"0\"/>\n\t\t\t\t<Particle param1=\".3480646886945065\" param2=\".3635030558377792\" param3=\".3480646886945065\" param4=\".3635030558377792\" param5=\"0\" param6=\"0\"/>\n\t\t\t\t<Particle param1=\".3480646886945065\" param2=\".3635030558377792\" param3=\".3480646886945065\" param4=\".3635030558377792\" param5=\"0\" param6=\"0\"/>\n\t\t\t\t<Particle param1=\".3480646886945065\" param2=\".3635030558377792\" param3=\".3480646886945065\" param4=\".3635030558377792\" param5=\"0\" param6=\"0\"/>\n\t\t\t\t<Particle param1=\".3480646886945065\" param2=\".3635030558377792\" param3=\".3480646886945065\" param4=\".3635030558377792\" param5=\"0\" param6=\"0\"/>\n\t\t\t\t<Particle param1=\".3480646886945065\" param2=\".3635030558377792\" param3=\".3480646886945065\" param4=\".3635030558377792\" param5=\"0\" param6=\"0\"/>\n\t\t\t\t<Particle param1=\".33075278064606245\" param2=\"1.111270837866897\" param3=\".33075278064606245\" param4=\"1.111270837866897\" param5=\"0\" param6=\"0\"/>\n\t\t\t\t<Particle param1=\".3480646886945065\" param2=\".3635030558377792\" param3=\".3480646886945065\" param4=\".3635030558377792\" param5=\"0\" param6=\"0\"/>\n\t\t\t\t<Particle param1=\".30398122050658094\" param2=\".8795023257036865\" param3=\".30398122050658094\" param4=\".8795023257036865\" param5=\"0\" param6=\"0\"/>\n\t\t\t\t<Particle param1=\".32068760236639016\" param2=\".7016212989374017\" param3=\".32068760236639016\" param4=\".7016212989374017\" param5=\"0\" param6=\"0\"/>\n\t\t\t\t<Particle param1=\".3480646886945065\" param2=\".3635030558377792\" param3=\".3480646886945065\" param4=\".3635030558377792\" param5=\"0\" param6=\"0\"/>\n\t\t\t\t<Particle param1=\".3480646886945065\" param2=\".3635030558377792\" param3=\".3480646886945065\" param4=\".3635030558377792\" param5=\"0\" param6=\"0\"/>\n\t\t\t\t<Particle param1=\".3480646886945065\" param2=\".3635030558377792\" param3=\".3480646886945065\" param4=\".3635030558377792\" param5=\"0\" param6=\"0\"/>\n\t\t\t\t<Particle param1=\".32068760236639016\" param2=\".7016212989374017\" param3=\".32068760236639016\" param4=\".7016212989374017\" param5=\"0\" param6=\"0\"/>\n\t\t\t\t<Particle param1=\".3480646886945065\" param2=\".3635030558377792\" param3=\".3480646886945065\" param4=\".3635030558377792\" param5=\"0\" param6=\"0\"/>\n\t\t\t\t<Particle param1=\".3480646886945065\" param2=\".3635030558377792\" param3=\".3480646886945065\" param4=\".3635030558377792\" param5=\"0\" param6=\"0\"/>\n\t\t\t\t<Particle param1=\".32068760236639016\" param2=\".7016212989374017\" param3=\".32068760236639016\" param4=\".7016212989374017\" param5=\"0\" param6=\"0\"/>\n\t\t\t\t<Particle param1=\".3480646886945065\" param2=\".3635030558377792\" param3=\".3480646886945065\" param4=\".3635030558377792\" param5=\"0\" param6=\"0\"/>\n\t\t\t\t<Particle param1=\".30398122050658094\" param2=\".8795023257036865\" param3=\".30398122050658094\" param4=\".8795023257036865\" param5=\"0\" param6=\"0\"/>\n\t\t\t\t<Particle param1=\".3379531761626621\" param2=\".45538911611061844\" param3=\".3379531761626621\" param4=\"0\" param5=\"1\" param6=\"0\"/>\n\t\t\t\t<Particle param1=\".3379531761626621\" param2=\".45538911611061844\" param3=\".3379531761626621\" param4=\"0\" param5=\"1\" param6=\"0\"/>\n\t\t\t\t<Particle param1=\".3379531761626621\" param2=\".45538911611061844\" param3=\".3379531761626621\" param4=\"0\" param5=\"1\" param6=\"0\"/>\n\t\t\t\t<Particle param1=\".3118145513491188\" param2=\".255224\" param3=\".3118145513491188\" param4=\"0\" param5=\"1\" param6=\"0\"/>\n\t\t\t\t<Particle param1=\".33075278064606245\" param2=\"1.111270837866897\" param3=\".33075278064606245\" param4=\"1.111270837866897\" param5=\"0\" param6=\"0\"/>\n\t\t\t\t<Particle param1=\".2644543413268125\" param2=\".06602135607582665\" param3=\".2644543413268125\" param4=\"0\" param5=\"1\" param6=\"0\"/>\n\t\t\t\t<Particle param1=\".2583225710839196\" param2=\".068656285380106\" param3=\".2583225710839196\" param4=\"0\" param5=\"1\" param6=\"0\"/>\n\t\t\t\t<Particle param1=\".25725815350632797\" param2=\".06531785996356952\" param3=\".25725815350632797\" param4=\".06531785996356952\" param5=\"0\" param6=\"0\"/>\n\t\t\t\t<Particle param1=\".25725815350632797\" param2=\".06531785996356952\" param3=\".25725815350632797\" param4=\".06531785996356952\" param5=\"0\" param6=\"0\"/>\n\t\t\t\t<Particle param1=\".25725815350632797\" param2=\".06531785996356952\" param3=\".25725815350632797\" param4=\".06531785996356952\" param5=\"0\" param6=\"0\"/>\n\t\t\t\t<Particle param1=\".11034276772973169\" param2=\".058955968900150965\" param3=\".11034276772973169\" param4=\".058955968900150965\" param5=\"0\" param6=\"0\"/>\n\t\t\t\t<Particle param1=\".25725815350632797\" param2=\".06531785996356952\" param3=\".25725815350632797\" param4=\".06531785996356952\" param5=\"0\" param6=\"0\"/>\n\t\t\t\t<Particle param1=\".2453626527729973\" param2=\".05483968129296432\" param3=\".2453626527729973\" param4=\".05483968129296432\" param5=\"0\" param6=\"0\"/>\n\t\t\t\t<Particle param1=\".25725815350632797\" param2=\".06531785996356952\" param3=\".25725815350632797\" param4=\".06531785996356952\" param5=\"0\" param6=\"0\"/>\n\t\t\t\t<Particle param1=\".11034276772973169\" param2=\".058955968900150965\" param3=\".11034276772973169\" param4=\".058955968900150965\" param5=\"0\" param6=\"0\"/>\n\t\t\t\t<Particle param1=\".2644543413268125\" param2=\".06602135607582665\" param3=\".2644543413268125\" param4=\"0\" param5=\"1\" param6=\"0\"/>\n\t\t\t\t<Particle param1=\".2644543413268125\" param2=\".06602135607582665\" param3=\".2644543413268125\" param4=\"0\" param5=\"1\" param6=\"0\"/>\n\t\t\t\t<Particle param1=\".3379531761626621\" param2=\"0\" param3=\".3379531761626621\" param4=\".45538911611061844\" param5=\"0\" param6=\"1\"/>\n\t\t\t\t<Particle param1=\".2583225710839196\" param2=\"0\" param3=\".2583225710839196\" param4=\".068656285380106\" param5=\"0\" param6=\"1\"/>\n\t\t\t\t<Particle param1=\".2583225710839196\" param2=\"0\" param3=\".2583225710839196\" param4=\".068656285380106\" param5=\"0\" param6=\"1\"/>\n\t\t\t\t<Particle param1=\".30251064904353125\" param2=\"0\" param3=\".30251064904353125\" param4=\".7048581468486769\" param5=\"0\" param6=\"1\"/>\n\t\t\t\t<Particle param1=\".2583225710839196\" param2=\"0\" param3=\".2583225710839196\" param4=\".068656285380106\" param5=\"0\" param6=\"1\"/>\n\t\t\t</Particles>\n\t\t\t<Exclusions>\n\t\t\t\t<Exclusion p1=\"34\" p2=\"36\"/>\n\t\t\t\t<Exclusion p1=\"34\" p2=\"37\"/>\n\t\t\t\t<Exclusion p1=\"34\" p2=\"38\"/>\n\t\t\t\t<Exclusion p1=\"34\" p2=\"39\"/>\n\t\t\t\t<Exclusion p1=\"34\" p2=\"40\"/>\n\t\t\t\t<Exclusion p1=\"35\" p2=\"36\"/>\n\t\t\t\t<Exclusion p1=\"35\" p2=\"37\"/>\n\t\t\t\t<Exclusion p1=\"35\" p2=\"38\"/>\n\t\t\t\t<Exclusion p1=\"35\" p2=\"39\"/>\n\t\t\t\t<Exclusion p1=\"35\" p2=\"40\"/>\n\t\t\t\t<Exclusion p1=\"19\" p2=\"36\"/>\n\t\t\t\t<Exclusion p1=\"19\" p2=\"37\"/>\n\t\t\t\t<Exclusion p1=\"19\" p2=\"38\"/>\n\t\t\t\t<Exclusion p1=\"19\" p2=\"39\"/>\n\t\t\t\t<Exclusion p1=\"19\" p2=\"40\"/>\n\t\t\t\t<Exclusion p1=\"20\" p2=\"36\"/>\n\t\t\t\t<Exclusion p1=\"20\" p2=\"37\"/>\n\t\t\t\t<Exclusion p1=\"20\" p2=\"38\"/>\n\t\t\t\t<Exclusion p1=\"20\" p2=\"39\"/>\n\t\t\t\t<Exclusion p1=\"20\" p2=\"40\"/>\n\t\t\t\t<Exclusion p1=\"21\" p2=\"36\"/>\n\t\t\t\t<Exclusion p1=\"21\" p2=\"37\"/>\n\t\t\t\t<Exclusion p1=\"21\" p2=\"38\"/>\n\t\t\t\t<Exclusion p1=\"21\" p2=\"39\"/>\n\t\t\t\t<Exclusion p1=\"21\" p2=\"40\"/>\n\t\t\t\t<Exclusion p1=\"22\" p2=\"36\"/>\n\t\t\t\t<Exclusion p1=\"22\" p2=\"37\"/>\n\t\t\t\t<Exclusion p1=\"22\" p2=\"38\"/>\n\t\t\t\t<Exclusion p1=\"22\" p2=\"39\"/>\n\t\t\t\t<Exclusion p1=\"22\" p2=\"40\"/>\n\t\t\t\t<Exclusion p1=\"24\" p2=\"36\"/>\n\t\t\t\t<Exclusion p1=\"24\" p2=\"37\"/>\n\t\t\t\t<Exclusion p1=\"24\" p2=\"38\"/>\n\t\t\t\t<Exclusion p1=\"24\" p2=\"39\"/>\n\t\t\t\t<Exclusion p1=\"24\" p2=\"40\"/>\n\t\t\t\t<Exclusion p1=\"25\" p2=\"36\"/>\n\t\t\t\t<Exclusion p1=\"25\" p2=\"37\"/>\n\t\t\t\t<Exclusion p1=\"25\" p2=\"38\"/>\n\t\t\t\t<Exclusion p1=\"25\" p2=\"39\"/>\n\t\t\t\t<Exclusion p1=\"25\" p2=\"40\"/>\n\t\t\t\t<Exclusion p1=\"34\" p2=\"35\"/>\n\t\t\t\t<Exclusion p1=\"34\" p2=\"19\"/>\n\t\t\t\t<Exclusion p1=\"34\" p2=\"20\"/>\n\t\t\t\t<Exclusion p1=\"34\" p2=\"21\"/>\n\t\t\t\t<Exclusion p1=\"34\" p2=\"22\"/>\n\t\t\t\t<Exclusion p1=\"34\" p2=\"24\"/>\n\t\t\t\t<Exclusion p1=\"34\" p2=\"25\"/>\n\t\t\t\t<Exclusion p1=\"35\" p2=\"19\"/>\n\t\t\t\t<Exclusion p1=\"35\" p2=\"20\"/>\n\t\t\t\t<Exclusion p1=\"35\" p2=\"21\"/>\n\t\t\t\t<Exclusion p1=\"35\" p2=\"22\"/>\n\t\t\t\t<Exclusion p1=\"35\" p2=\"24\"/>\n\t\t\t\t<Exclusion p1=\"35\" p2=\"25\"/>\n\t\t\t\t<Exclusion p1=\"19\" p2=\"20\"/>\n\t\t\t\t<Exclusion p1=\"19\" p2=\"21\"/>\n\t\t\t\t<Exclusion p1=\"19\" p2=\"22\"/>\n\t\t\t\t<Exclusion p1=\"19\" p2=\"24\"/>\n\t\t\t\t<Exclusion p1=\"19\" p2=\"25\"/>\n\t\t\t\t<Exclusion p1=\"20\" p2=\"21\"/>\n\t\t\t\t<Exclusion p1=\"20\" p2=\"22\"/>\n\t\t\t\t<Exclusion p1=\"20\" p2=\"24\"/>\n\t\t\t\t<Exclusion p1=\"20\" p2=\"25\"/>\n\t\t\t\t<Exclusion p1=\"21\" p2=\"22\"/>\n\t\t\t\t<Exclusion p1=\"21\" p2=\"24\"/>\n\t\t\t\t<Exclusion p1=\"21\" p2=\"25\"/>\n\t\t\t\t<Exclusion p1=\"22\" p2=\"24\"/>\n\t\t\t\t<Exclusion p1=\"22\" p2=\"25\"/>\n\t\t\t\t<Exclusion p1=\"24\" p2=\"25\"/>\n\t\t\t\t<Exclusion p1=\"36\" p2=\"37\"/>\n\t\t\t\t<Exclusion p1=\"36\" p2=\"38\"/>\n\t\t\t\t<Exclusion p1=\"36\" p2=\"39\"/>\n\t\t\t\t<Exclusion p1=\"36\" p2=\"40\"/>\n\t\t\t\t<Exclusion p1=\"37\" p2=\"38\"/>\n\t\t\t\t<Exclusion p1=\"37\" p2=\"39\"/>\n\t\t\t\t<Exclusion p1=\"37\" p2=\"40\"/>\n\t\t\t\t<Exclusion p1=\"38\" p2=\"39\"/>\n\t\t\t\t<Exclusion p1=\"38\" p2=\"40\"/>\n\t\t\t\t<Exclusion p1=\"39\" p2=\"40\"/>\n\t\t\t\t<Exclusion p1=\"0\" p2=\"1\"/>\n\t\t\t\t<Exclusion p1=\"0\" p2=\"2\"/>\n\t\t\t\t<Exclusion p1=\"1\" p2=\"2\"/>\n\t\t\t\t<Exclusion p1=\"0\" p2=\"3\"/>\n\t\t\t\t<Exclusion p1=\"1\" p2=\"3\"/>\n\t\t\t\t<Exclusion p1=\"2\" p2=\"3\"/>\n\t\t\t\t<Exclusion p1=\"0\" p2=\"4\"/>\n\t\t\t\t<Exclusion p1=\"1\" p2=\"4\"/>\n\t\t\t\t<Exclusion p1=\"2\" p2=\"4\"/>\n\t\t\t\t<Exclusion p1=\"3\" p2=\"4\"/>\n\t\t\t\t<Exclusion p1=\"0\" p2=\"5\"/>\n\t\t\t\t<Exclusion p1=\"1\" p2=\"5\"/>\n\t\t\t\t<Exclusion p1=\"2\" p2=\"5\"/>\n\t\t\t\t<Exclusion p1=\"3\" p2=\"5\"/>\n\t\t\t\t<Exclusion p1=\"4\" p2=\"5\"/>\n\t\t\t\t<Exclusion p1=\"0\" p2=\"6\"/>\n\t\t\t\t<Exclusion p1=\"2\" p2=\"6\"/>\n\t\t\t\t<Exclusion p1=\"3\" p2=\"6\"/>\n\t\t\t\t<Exclusion p1=\"4\" p2=\"6\"/>\n\t\t\t\t<Exclusion p1=\"5\" p2=\"6\"/>\n\t\t\t\t<Exclusion p1=\"1\" p2=\"7\"/>\n\t\t\t\t<Exclusion p1=\"2\" p2=\"7\"/>\n\t\t\t\t<Exclusion p1=\"3\" p2=\"7\"/>\n\t\t\t\t<Exclusion p1=\"4\" p2=\"7\"/>\n\t\t\t\t<Exclusion p1=\"5\" p2=\"7\"/>\n\t\t\t\t<Exclusion p1=\"6\" p2=\"7\"/>\n\t\t\t\t<Exclusion p1=\"2\" p2=\"8\"/>\n\t\t\t\t<Exclusion p1=\"3\" p2=\"8\"/>\n\t\t\t\t<Exclusion p1=\"4\" p2=\"8\"/>\n\t\t\t\t<Exclusion p1=\"7\" p2=\"8\"/>\n\t\t\t\t<Exclusion p1=\"2\" p2=\"9\"/>\n\t\t\t\t<Exclusion p1=\"3\" p2=\"9\"/>\n\t\t\t\t<Exclusion p1=\"4\" p2=\"9\"/>\n\t\t\t\t<Exclusion p1=\"7\" p2=\"9\"/>\n\t\t\t\t<Exclusion p1=\"8\" p2=\"9\"/>\n\t\t\t\t<Exclusion p1=\"3\" p2=\"10\"/>\n\t\t\t\t<Exclusion p1=\"7\" p2=\"10\"/>\n\t\t\t\t<Exclusion p1=\"8\" p2=\"10\"/>\n\t\t\t\t<Exclusion p1=\"9\" p2=\"10\"/>\n\t\t\t\t<Exclusion p1=\"7\" p2=\"11\"/>\n\t\t\t\t<Exclusion p1=\"9\" p2=\"11\"/>\n\t\t\t\t<Exclusion p1=\"10\" p2=\"11\"/>\n\t\t\t\t<Exclusion p1=\"9\" p2=\"12\"/>\n\t\t\t\t<Exclusion p1=\"10\" p2=\"12\"/>\n\t\t\t\t<Exclusion p1=\"11\" p2=\"12\"/>\n\t\t\t\t<Exclusion p1=\"10\" p2=\"13\"/>\n\t\t\t\t<Exclusion p1=\"11\" p2=\"13\"/>\n\t\t\t\t<Exclusion p1=\"12\" p2=\"13\"/>\n\t\t\t\t<Exclusion p1=\"9\" p2=\"14\"/>\n\t\t\t\t<Exclusion p1=\"10\" p2=\"14\"/>\n\t\t\t\t<Exclusion p1=\"11\" p2=\"14\"/>\n\t\t\t\t<Exclusion p1=\"12\" p2=\"14\"/>\n\t\t\t\t<Exclusion p1=\"13\" p2=\"14\"/>\n\t\t\t\t<Exclusion p1=\"7\" p2=\"15\"/>\n\t\t\t\t<Exclusion p1=\"9\" p2=\"15\"/>\n\t\t\t\t<Exclusion p1=\"10\" p2=\"15\"/>\n\t\t\t\t<Exclusion p1=\"11\" p2=\"15\"/>\n\t\t\t\t<Exclusion p1=\"12\" p2=\"15\"/>\n\t\t\t\t<Exclusion p1=\"13\" p2=\"15\"/>\n\t\t\t\t<Exclusion p1=\"14\" p2=\"15\"/>\n\t\t\t\t<Exclusion p1=\"10\" p2=\"16\"/>\n\t\t\t\t<Exclusion p1=\"12\" p2=\"16\"/>\n\t\t\t\t<Exclusion p1=\"13\" p2=\"16\"/>\n\t\t\t\t<Exclusion p1=\"14\" p2=\"16\"/>\n\t\t\t\t<Exclusion p1=\"15\" p2=\"16\"/>\n\t\t\t\t<Exclusion p1=\"13\" p2=\"17\"/>\n\t\t\t\t<Exclusion p1=\"14\" p2=\"17\"/>\n\t\t\t\t<Exclusion p1=\"15\" p2=\"17\"/>\n\t\t\t\t<Exclusion p1=\"16\" p2=\"17\"/>\n\t\t\t\t<Exclusion p1=\"14\" p2=\"18\"/>\n\t\t\t\t<Exclusion p1=\"16\" p2=\"18\"/>\n\t\t\t\t<Exclusion p1=\"17\" p2=\"18\"/>\n\t\t\t\t<Exclusion p1=\"14\" p2=\"19\"/>\n\t\t\t\t<Exclusion p1=\"16\" p2=\"19\"/>\n\t\t\t\t<Exclusion p1=\"17\" p2=\"19\"/>\n\t\t\t\t<Exclusion p1=\"18\" p2=\"19\"/>\n\t\t\t\t<Exclusion p1=\"16\" p2=\"20\"/>\n\t\t\t\t<Exclusion p1=\"17\" p2=\"20\"/>\n\t\t\t\t<Exclusion p1=\"18\" p2=\"20\"/>\n\t\t\t\t<Exclusion p1=\"16\" p2=\"21\"/>\n\t\t\t\t<Exclusion p1=\"17\" p2=\"21\"/>\n\t\t\t\t<Exclusion p1=\"18\" p2=\"21\"/>\n\t\t\t\t<Exclusion p1=\"17\" p2=\"22\"/>\n\t\t\t\t<Exclusion p1=\"0\" p2=\"23\"/>\n\t\t\t\t<Exclusion p1=\"1\" p2=\"23\"/>\n\t\t\t\t<Exclusion p1=\"2\" p2=\"23\"/>\n\t\t\t\t<Exclusion p1=\"3\" p2=\"23\"/>\n\t\t\t\t<Exclusion p1=\"4\" p2=\"23\"/>\n\t\t\t\t<Exclusion p1=\"7\" p2=\"23\"/>\n\t\t\t\t<Exclusion p1=\"16\" p2=\"24\"/>\n\t\t\t\t<Exclusion p1=\"17\" p2=\"24\"/>\n\t\t\t\t<Exclusion p1=\"18\" p2=\"24\"/>\n\t\t\t\t<Exclusion p1=\"17\" p2=\"25\"/>\n\t\t\t\t<Exclusion p1=\"0\" p2=\"26\"/>\n\t\t\t\t<Exclusion p1=\"1\" p2=\"26\"/>\n\t\t\t\t<Exclusion p1=\"2\" p2=\"26\"/>\n\t\t\t\t<Exclusion p1=\"4\" p2=\"26\"/>\n\t\t\t\t<Exclusion p1=\"5\" p2=\"26\"/>\n\t\t\t\t<Exclusion p1=\"0\" p2=\"27\"/>\n\t\t\t\t<Exclusion p1=\"1\" p2=\"27\"/>\n\t\t\t\t<Exclusion p1=\"2\" p2=\"27\"/>\n\t\t\t\t<Exclusion p1=\"3\" p2=\"27\"/>\n\t\t\t\t<Exclusion p1=\"5\" p2=\"27\"/>\n\t\t\t\t<Exclusion p1=\"23\" p2=\"27\"/>\n\t\t\t\t<Exclusion p1=\"26\" p2=\"27\"/>\n\t\t\t\t<Exclusion p1=\"0\" p2=\"28\"/>\n\t\t\t\t<Exclusion p1=\"1\" p2=\"28\"/>\n\t\t\t\t<Exclusion p1=\"3\" p2=\"28\"/>\n\t\t\t\t<Exclusion p1=\"4\" p2=\"28\"/>\n\t\t\t\t<Exclusion p1=\"5\" p2=\"28\"/>\n\t\t\t\t<Exclusion p1=\"6\" p2=\"28\"/>\n\t\t\t\t<Exclusion p1=\"26\" p2=\"28\"/>\n\t\t\t\t<Exclusion p1=\"3\" p2=\"29\"/>\n\t\t\t\t<Exclusion p1=\"7\" p2=\"29\"/>\n\t\t\t\t<Exclusion p1=\"8\" p2=\"29\"/>\n\t\t\t\t<Exclusion p1=\"9\" p2=\"29\"/>\n\t\t\t\t<Exclusion p1=\"10\" p2=\"29\"/>\n\t\t\t\t<Exclusion p1=\"11\" p2=\"29\"/>\n\t\t\t\t<Exclusion p1=\"15\" p2=\"29\"/>\n\t\t\t\t<Exclusion p1=\"9\" p2=\"30\"/>\n\t\t\t\t<Exclusion p1=\"10\" p2=\"30\"/>\n\t\t\t\t<Exclusion p1=\"11\" p2=\"30\"/>\n\t\t\t\t<Exclusion p1=\"12\" p2=\"30\"/>\n\t\t\t\t<Exclusion p1=\"13\" p2=\"30\"/>\n\t\t\t\t<Exclusion p1=\"15\" p2=\"30\"/>\n\t\t\t\t<Exclusion p1=\"10\" p2=\"31\"/>\n\t\t\t\t<Exclusion p1=\"11\" p2=\"31\"/>\n\t\t\t\t<Exclusion p1=\"12\" p2=\"31\"/>\n\t\t\t\t<Exclusion p1=\"13\" p2=\"31\"/>\n\t\t\t\t<Exclusion p1=\"14\" p2=\"31\"/>\n\t\t\t\t<Exclusion p1=\"30\" p2=\"31\"/>\n\t\t\t\t<Exclusion p1=\"9\" p2=\"32\"/>\n\t\t\t\t<Exclusion p1=\"10\" p2=\"32\"/>\n\t\t\t\t<Exclusion p1=\"11\" p2=\"32\"/>\n\t\t\t\t<Exclusion p1=\"13\" p2=\"32\"/>\n\t\t\t\t<Exclusion p1=\"14\" p2=\"32\"/>\n\t\t\t\t<Exclusion p1=\"15\" p2=\"32\"/>\n\t\t\t\t<Exclusion p1=\"16\" p2=\"32\"/>\n\t\t\t\t<Exclusion p1=\"13\" p2=\"33\"/>\n\t\t\t\t<Exclusion p1=\"14\" p2=\"33\"/>\n\t\t\t\t<Exclusion p1=\"15\" p2=\"33\"/>\n\t\t\t\t<Exclusion p1=\"16\" p2=\"33\"/>\n\t\t\t\t<Exclusion p1=\"17\" p2=\"33\"/>\n\t\t\t\t<Exclusion p1=\"18\" p2=\"33\"/>\n\t\t\t\t<Exclusion p1=\"19\" p2=\"33\"/>\n\t\t\t\t<Exclusion p1=\"17\" p2=\"34\"/>\n\t\t\t\t<Exclusion p1=\"17\" p2=\"35\"/>\n\t\t\t\t<Exclusion p1=\"16\" p2=\"36\"/>\n\t\t\t\t<Exclusion p1=\"17\" p2=\"36\"/>\n\t\t\t\t<Exclusion p1=\"18\" p2=\"36\"/>\n\t\t\t\t<Exclusion p1=\"17\" p2=\"37\"/>\n\t\t\t\t<Exclusion p1=\"17\" p2=\"38\"/>\n\t\t\t\t<Exclusion p1=\"14\" p2=\"39\"/>\n\t\t\t\t<Exclusion p1=\"16\" p2=\"39\"/>\n\t\t\t\t<Exclusion p1=\"17\" p2=\"39\"/>\n\t\t\t\t<Exclusion p1=\"18\" p2=\"39\"/>\n\t\t\t\t<Exclusion p1=\"33\" p2=\"39\"/>\n\t\t\t\t<Exclusion p1=\"17\" p2=\"40\"/>\n\t\t\t</Exclusions>\n\t\t\t<Functions/>\n\t\t\t<InteractionGroups>\n\t\t\t\t<InteractionGroup>\n\t\t\t\t\t<Set1>\n\t\t\t\t\t\t<Particle index=\"19\"/>\n\t\t\t\t\t\t<Particle index=\"20\"/>\n\t\t\t\t\t\t<Particle index=\"21\"/>\n\t\t\t\t\t\t<Particle index=\"22\"/>\n\t\t\t\t\t\t<Particle index=\"24\"/>\n\t\t\t\t\t\t<Particle index=\"25\"/>\n\t\t\t\t\t\t<Particle index=\"34\"/>\n\t\t\t\t\t\t<Particle index=\"35\"/>\n\t\t\t\t\t</Set1>\n\t\t\t\t\t<Set2>\n\t\t\t\t\t\t<Particle index=\"0\"/>\n\t\t\t\t\t\t<Particle index=\"1\"/>\n\t\t\t\t\t\t<Particle index=\"2\"/>\n\t\t\t\t\t\t<Particle index=\"3\"/>\n\t\t\t\t\t\t<Particle index=\"4\"/>\n\t\t\t\t\t\t<Particle index=\"5\"/>\n\t\t\t\t\t\t<Particle index=\"6\"/>\n\t\t\t\t\t\t<Particle index=\"7\"/>\n\t\t\t\t\t\t<Particle index=\"8\"/>\n\t\t\t\t\t\t<Particle index=\"9\"/>\n\t\t\t\t\t\t<Particle index=\"10\"/>\n\t\t\t\t\t\t<Particle index=\"11\"/>\n\t\t\t\t\t\t<Particle index=\"12\"/>\n\t\t\t\t\t\t<Particle index=\"13\"/>\n\t\t\t\t\t\t<Particle index=\"14\"/>\n\t\t\t\t\t\t<Particle index=\"15\"/>\n\t\t\t\t\t\t<Particle index=\"16\"/>\n\t\t\t\t\t\t<Particle index=\"17\"/>\n\t\t\t\t\t\t<Particle index=\"18\"/>\n\t\t\t\t\t\t<Particle index=\"23\"/>\n\t\t\t\t\t\t<Particle index=\"26\"/>\n\t\t\t\t\t\t<Particle index=\"27\"/>\n\t\t\t\t\t\t<Particle index=\"28\"/>\n\t\t\t\t\t\t<Particle index=\"29\"/>\n\t\t\t\t\t\t<Particle index=\"30\"/>\n\t\t\t\t\t\t<Particle index=\"31\"/>\n\t\t\t\t\t\t<Particle index=\"32\"/>\n\t\t\t\t\t\t<Particle index=\"33\"/>\n\t\t\t\t\t</Set2>\n\t\t\t\t</InteractionGroup>\n\t\t\t\t<InteractionGroup>\n\t\t\t\t\t<Set1>\n\t\t\t\t\t\t<Particle index=\"19\"/>\n\t\t\t\t\t\t<Particle index=\"20\"/>\n\t\t\t\t\t\t<Particle index=\"21\"/>\n\t\t\t\t\t\t<Particle index=\"22\"/>\n\t\t\t\t\t\t<Particle index=\"24\"/>\n\t\t\t\t\t\t<Particle index=\"25\"/>\n\t\t\t\t\t\t<Particle index=\"34\"/>\n\t\t\t\t\t\t<Particle index=\"35\"/>\n\t\t\t\t\t</Set1>\n\t\t\t\t\t<Set2/>\n\t\t\t\t</InteractionGroup>\n\t\t\t\t<InteractionGroup>\n\t\t\t\t\t<Set1>\n\t\t\t\t\t\t<Particle index=\"36\"/>\n\t\t\t\t\t\t<Particle index=\"37\"/>\n\t\t\t\t\t\t<Particle index=\"38\"/>\n\t\t\t\t\t\t<Particle index=\"39\"/>\n\t\t\t\t\t\t<Particle index=\"40\"/>\n\t\t\t\t\t</Set1>\n\t\t\t\t\t<Set2>\n\t\t\t\t\t\t<Particle index=\"0\"/>\n\t\t\t\t\t\t<Particle index=\"1\"/>\n\t\t\t\t\t\t<Particle index=\"2\"/>\n\t\t\t\t\t\t<Particle index=\"3\"/>\n\t\t\t\t\t\t<Particle index=\"4\"/>\n\t\t\t\t\t\t<Particle index=\"5\"/>\n\t\t\t\t\t\t<Particle index=\"6\"/>\n\t\t\t\t\t\t<Particle index=\"7\"/>\n\t\t\t\t\t\t<Particle index=\"8\"/>\n\t\t\t\t\t\t<Particle index=\"9\"/>\n\t\t\t\t\t\t<Particle index=\"10\"/>\n\t\t\t\t\t\t<Particle index=\"11\"/>\n\t\t\t\t\t\t<Particle index=\"12\"/>\n\t\t\t\t\t\t<Particle index=\"13\"/>\n\t\t\t\t\t\t<Particle index=\"14\"/>\n\t\t\t\t\t\t<Particle index=\"15\"/>\n\t\t\t\t\t\t<Particle index=\"16\"/>\n\t\t\t\t\t\t<Particle index=\"17\"/>\n\t\t\t\t\t\t<Particle index=\"18\"/>\n\t\t\t\t\t\t<Particle index=\"23\"/>\n\t\t\t\t\t\t<Particle index=\"26\"/>\n\t\t\t\t\t\t<Particle index=\"27\"/>\n\t\t\t\t\t\t<Particle index=\"28\"/>\n\t\t\t\t\t\t<Particle index=\"29\"/>\n\t\t\t\t\t\t<Particle index=\"30\"/>\n\t\t\t\t\t\t<Particle index=\"31\"/>\n\t\t\t\t\t\t<Particle index=\"32\"/>\n\t\t\t\t\t\t<Particle index=\"33\"/>\n\t\t\t\t\t</Set2>\n\t\t\t\t</InteractionGroup>\n\t\t\t\t<InteractionGroup>\n\t\t\t\t\t<Set1>\n\t\t\t\t\t\t<Particle index=\"36\"/>\n\t\t\t\t\t\t<Particle index=\"37\"/>\n\t\t\t\t\t\t<Particle index=\"38\"/>\n\t\t\t\t\t\t<Particle index=\"39\"/>\n\t\t\t\t\t\t<Particle index=\"40\"/>\n\t\t\t\t\t</Set1>\n\t\t\t\t\t<Set2/>\n\t\t\t\t</InteractionGroup>\n\t\t\t\t<InteractionGroup>\n\t\t\t\t\t<Set1>\n\t\t\t\t\t\t<Particle index=\"0\"/>\n\t\t\t\t\t\t<Particle index=\"1\"/>\n\t\t\t\t\t\t<Particle index=\"2\"/>\n\t\t\t\t\t\t<Particle index=\"3\"/>\n\t\t\t\t\t\t<Particle index=\"4\"/>\n\t\t\t\t\t\t<Particle index=\"5\"/>\n\t\t\t\t\t\t<Particle index=\"6\"/>\n\t\t\t\t\t\t<Particle index=\"7\"/>\n\t\t\t\t\t\t<Particle index=\"8\"/>\n\t\t\t\t\t\t<Particle index=\"9\"/>\n\t\t\t\t\t\t<Particle index=\"10\"/>\n\t\t\t\t\t\t<Particle index=\"11\"/>\n\t\t\t\t\t\t<Particle index=\"12\"/>\n\t\t\t\t\t\t<Particle index=\"13\"/>\n\t\t\t\t\t\t<Particle index=\"14\"/>\n\t\t\t\t\t\t<Particle index=\"15\"/>\n\t\t\t\t\t\t<Particle index=\"16\"/>\n\t\t\t\t\t\t<Particle index=\"17\"/>\n\t\t\t\t\t\t<Particle index=\"18\"/>\n\t\t\t\t\t\t<Particle index=\"23\"/>\n\t\t\t\t\t\t<Particle index=\"26\"/>\n\t\t\t\t\t\t<Particle index=\"27\"/>\n\t\t\t\t\t\t<Particle index=\"28\"/>\n\t\t\t\t\t\t<Particle index=\"29\"/>\n\t\t\t\t\t\t<Particle index=\"30\"/>\n\t\t\t\t\t\t<Particle index=\"31\"/>\n\t\t\t\t\t\t<Particle index=\"32\"/>\n\t\t\t\t\t\t<Particle index=\"33\"/>\n\t\t\t\t\t</Set1>\n\t\t\t\t\t<Set2/>\n\t\t\t\t</InteractionGroup>\n\t\t\t\t<InteractionGroup>\n\t\t\t\t\t<Set1>\n\t\t\t\t\t\t<Particle index=\"0\"/>\n\t\t\t\t\t\t<Particle index=\"1\"/>\n\t\t\t\t\t\t<Particle index=\"2\"/>\n\t\t\t\t\t\t<Particle index=\"3\"/>\n\t\t\t\t\t\t<Particle index=\"4\"/>\n\t\t\t\t\t\t<Particle index=\"5\"/>\n\t\t\t\t\t\t<Particle index=\"6\"/>\n\t\t\t\t\t\t<Particle index=\"7\"/>\n\t\t\t\t\t\t<Particle index=\"8\"/>\n\t\t\t\t\t\t<Particle index=\"9\"/>\n\t\t\t\t\t\t<Particle index=\"10\"/>\n\t\t\t\t\t\t<Particle index=\"11\"/>\n\t\t\t\t\t\t<Particle index=\"12\"/>\n\t\t\t\t\t\t<Particle index=\"13\"/>\n\t\t\t\t\t\t<Particle index=\"14\"/>\n\t\t\t\t\t\t<Particle index=\"15\"/>\n\t\t\t\t\t\t<Particle index=\"16\"/>\n\t\t\t\t\t\t<Particle index=\"17\"/>\n\t\t\t\t\t\t<Particle index=\"18\"/>\n\t\t\t\t\t\t<Particle index=\"23\"/>\n\t\t\t\t\t\t<Particle index=\"26\"/>\n\t\t\t\t\t\t<Particle index=\"27\"/>\n\t\t\t\t\t\t<Particle index=\"28\"/>\n\t\t\t\t\t\t<Particle index=\"29\"/>\n\t\t\t\t\t\t<Particle index=\"30\"/>\n\t\t\t\t\t\t<Particle index=\"31\"/>\n\t\t\t\t\t\t<Particle index=\"32\"/>\n\t\t\t\t\t\t<Particle index=\"33\"/>\n\t\t\t\t\t</Set1>\n\t\t\t\t\t<Set2>\n\t\t\t\t\t\t<Particle index=\"0\"/>\n\t\t\t\t\t\t<Particle index=\"1\"/>\n\t\t\t\t\t\t<Particle index=\"2\"/>\n\t\t\t\t\t\t<Particle index=\"3\"/>\n\t\t\t\t\t\t<Particle index=\"4\"/>\n\t\t\t\t\t\t<Particle index=\"5\"/>\n\t\t\t\t\t\t<Particle index=\"6\"/>\n\t\t\t\t\t\t<Particle index=\"7\"/>\n\t\t\t\t\t\t<Particle index=\"8\"/>\n\t\t\t\t\t\t<Particle index=\"9\"/>\n\t\t\t\t\t\t<Particle index=\"10\"/>\n\t\t\t\t\t\t<Particle index=\"11\"/>\n\t\t\t\t\t\t<Particle index=\"12\"/>\n\t\t\t\t\t\t<Particle index=\"13\"/>\n\t\t\t\t\t\t<Particle index=\"14\"/>\n\t\t\t\t\t\t<Particle index=\"15\"/>\n\t\t\t\t\t\t<Particle index=\"16\"/>\n\t\t\t\t\t\t<Particle index=\"17\"/>\n\t\t\t\t\t\t<Particle index=\"18\"/>\n\t\t\t\t\t\t<Particle index=\"23\"/>\n\t\t\t\t\t\t<Particle index=\"26\"/>\n\t\t\t\t\t\t<Particle index=\"27\"/>\n\t\t\t\t\t\t<Particle index=\"28\"/>\n\t\t\t\t\t\t<Particle index=\"29\"/>\n\t\t\t\t\t\t<Particle index=\"30\"/>\n\t\t\t\t\t\t<Particle index=\"31\"/>\n\t\t\t\t\t\t<Particle index=\"32\"/>\n\t\t\t\t\t\t<Particle index=\"33\"/>\n\t\t\t\t\t</Set2>\n\t\t\t\t</InteractionGroup>\n\t\t\t\t<InteractionGroup>\n\t\t\t\t\t<Set1>\n\t\t\t\t\t\t<Particle index=\"36\"/>\n\t\t\t\t\t\t<Particle index=\"37\"/>\n\t\t\t\t\t\t<Particle index=\"38\"/>\n\t\t\t\t\t\t<Particle index=\"39\"/>\n\t\t\t\t\t\t<Particle index=\"40\"/>\n\t\t\t\t\t</Set1>\n\t\t\t\t\t<Set2>\n\t\t\t\t\t\t<Particle index=\"36\"/>\n\t\t\t\t\t\t<Particle index=\"37\"/>\n\t\t\t\t\t\t<Particle index=\"38\"/>\n\t\t\t\t\t\t<Particle index=\"39\"/>\n\t\t\t\t\t\t<Particle index=\"40\"/>\n\t\t\t\t\t</Set2>\n\t\t\t\t</InteractionGroup>\n\t\t\t\t<InteractionGroup>\n\t\t\t\t\t<Set1>\n\t\t\t\t\t\t<Particle index=\"19\"/>\n\t\t\t\t\t\t<Particle index=\"20\"/>\n\t\t\t\t\t\t<Particle index=\"21\"/>\n\t\t\t\t\t\t<Particle index=\"22\"/>\n\t\t\t\t\t\t<Particle index=\"24\"/>\n\t\t\t\t\t\t<Particle index=\"25\"/>\n\t\t\t\t\t\t<Particle index=\"34\"/>\n\t\t\t\t\t\t<Particle index=\"35\"/>\n\t\t\t\t\t</Set1>\n\t\t\t\t\t<Set2>\n\t\t\t\t\t\t<Particle index=\"19\"/>\n\t\t\t\t\t\t<Particle index=\"20\"/>\n\t\t\t\t\t\t<Particle index=\"21\"/>\n\t\t\t\t\t\t<Particle index=\"22\"/>\n\t\t\t\t\t\t<Particle index=\"24\"/>\n\t\t\t\t\t\t<Particle index=\"25\"/>\n\t\t\t\t\t\t<Particle index=\"34\"/>\n\t\t\t\t\t\t<Particle index=\"35\"/>\n\t\t\t\t\t</Set2>\n\t\t\t\t</InteractionGroup>\n\t\t\t</InteractionGroups>\n\t\t</Force>\n\t\t<Force energy=\"U_electrostatics + U_sterics;U_sterics = select(step(r - r_LJ), 4*epsilon*x*(x-1.0), U_sterics_quad);U_sterics_quad = Force*(((r - r_LJ)^2)/2 - (r - r_LJ)) + U_sterics_cut;U_sterics_cut = 4*epsilon*((sigma/r_LJ)^6)*(((sigma/r_LJ)^6) - 1.0);Force = -4*epsilon*((-12*sigma^12)/(r_LJ^13) + (6*sigma^6)/(r_LJ^7));x = (sigma/r)^6;r_LJ = softcore_alpha*((26/7)*(sigma^6)*lambda_sterics_deprecated)^(1/6);lambda_sterics_deprecated = new_interaction*(1.0 - lambda_sterics_insert) + old_interaction*lambda_sterics_delete;U_electrostatics = (lambda_electrostatics_insert * unique_new + unique_old * (1 - lambda_electrostatics_delete)) * ONE_4PI_EPS0*chargeProd/r;ONE_4PI_EPS0 = 138.935458;epsilon = (1-lambda_sterics)*epsilonA + lambda_sterics*epsilonB;sigma = (1-lambda_sterics)*sigmaA + lambda_sterics*sigmaB;lambda_sterics = new_interaction*lambda_sterics_insert + old_interaction*lambda_sterics_delete;new_interaction = delta(1-unique_new); old_interaction = delta(1-unique_old);\" forceGroup=\"0\" name=\"CustomBondForce\" type=\"CustomBondForce\" usesPeriodic=\"0\" version=\"3\">\n\t\t\t<PerBondParameters>\n\t\t\t\t<Parameter name=\"chargeProd\"/>\n\t\t\t\t<Parameter name=\"sigmaA\"/>\n\t\t\t\t<Parameter name=\"epsilonA\"/>\n\t\t\t\t<Parameter name=\"sigmaB\"/>\n\t\t\t\t<Parameter name=\"epsilonB\"/>\n\t\t\t\t<Parameter name=\"unique_old\"/>\n\t\t\t\t<Parameter name=\"unique_new\"/>\n\t\t\t</PerBondParameters>\n\t\t\t<GlobalParameters>\n\t\t\t\t<Parameter default=\".85\" name=\"softcore_alpha\"/>\n\t\t\t\t<Parameter default=\"0\" name=\"lambda_electrostatics_insert\"/>\n\t\t\t\t<Parameter default=\"0\" name=\"lambda_electrostatics_delete\"/>\n\t\t\t\t<Parameter default=\"0\" name=\"lambda_sterics_insert\"/>\n\t\t\t\t<Parameter default=\"0\" name=\"lambda_sterics_delete\"/>\n\t\t\t</GlobalParameters>\n\t\t\t<EnergyParameterDerivatives/>\n\t\t\t<Bonds/>\n\t\t</Force>\n\t</Forces>\n</System>"
  },
  {
    "path": "src/openfe/tests/data/openmm_septop/__init__.py",
    "content": ""
  },
  {
    "path": "src/openfe/tests/data/serialization/__init__.py",
    "content": ""
  },
  {
    "path": "src/openfe/tests/data/serialization/ethane_template.sdf",
    "content": "\n     RDKit          2D\n\n  8  7  0  0  0  0  0  0  0  0999 V2000\n    0.0000    0.0000    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0\n    1.5000    0.0000    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -1.5000    0.0000    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0\n    0.0000    1.5000    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -0.0000   -1.5000    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0\n    3.0000    0.0000    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0\n    1.5000   -1.5000    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0\n    1.5000    1.5000    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0\n  1  2  1  0\n  1  3  1  0\n  1  4  1  0\n  1  5  1  0\n  2  6  1  0\n  2  7  1  0\n  2  8  1  0\nM  END\n\n>  <ofe-name>\nethane\n\n>  <ofe-version>\n{GUFE_VERSION}\n\n$$$$\n"
  },
  {
    "path": "src/openfe/tests/data/serialization/network_template.graphml",
    "content": "<graphml xmlns=\"http://graphml.graphdrawing.org/xmlns\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://graphml.graphdrawing.org/xmlns http://graphml.graphdrawing.org/xmlns/1.0/graphml.xsd\">\n  <key id=\"d2\" for=\"edge\" attr.name=\"mapping\" attr.type=\"string\" />\n  <key id=\"d1\" for=\"node\" attr.name=\"moldict\" attr.type=\"string\" />\n  <key id=\"d0\" for=\"graph\" attr.name=\"ofe_version\" attr.type=\"string\" />\n  <graph edgedefault=\"directed\">\n    <node id=\"mol0\">\n      <data key=\"d1\">{\"__module__\": \"gufe.components.smallmoleculecomponent\", \"__qualname__\": \"SmallMoleculeComponent\", \"atoms\": [[6, 0, 0, false, 0, 0, {}], [6, 0, 0, false, 0, 0, {}]], \"bonds\": [[0, 1, 1, 0, {}]], \"conformer\": [\"\\u0093NUMPY\\u0001\\u0000v\\u0000{'descr': '&lt;f8', 'fortran_order': False, 'shape': (2, 3), }                                                          \\n\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u00e8\\u00bf\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0090&lt;\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u00e8?\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0090\\u00bc\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\", {}], \"molprops\": {\"ofe-name\": \"\"}}</data>\n    </node>\n    <node id=\"mol1\">\n      <data key=\"d1\">{\"__module__\": \"gufe.components.smallmoleculecomponent\", \"__qualname__\": \"SmallMoleculeComponent\", \"atoms\": [[6, 0, 0, false, 0, 0, {}], [6, 0, 0, false, 0, 0, {}], [8, 0, 0, false, 0, 0, {}]], \"bonds\": [[0, 1, 1, 0, {}], [1, 2, 1, 0, {}]], \"conformer\": [\"\\u0093NUMPY\\u0001\\u0000v\\u0000{'descr': '&lt;f8', 'fortran_order': False, 'shape': (3, 3), }                                                          \\n\\u00809B.\\u00dc\\u00c8\\u00f4\\u00bf\\u00f5\\u00ff\\u00ff\\u00ff\\u00ff\\u00ff\\u00cf\\u00bf\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0001\\u0000\\u0000\\u0000\\u0000\\u0000\\u00e0?\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u00809B.\\u00dc\\u00c8\\u00f4?\\u0006\\u0000\\u0000\\u0000\\u0000\\u0000\\u00d0\\u00bf\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\", {}], \"molprops\": {\"ofe-name\": \"\"}}</data>\n    </node>\n    <node id=\"mol2\">\n      <data key=\"d1\">{\"__module__\": \"gufe.components.smallmoleculecomponent\", \"__qualname__\": \"SmallMoleculeComponent\", \"atoms\": [[6, 0, 0, false, 0, 0, {}], [8, 0, 0, false, 0, 0, {}]], \"bonds\": [[0, 1, 1, 0, {}]], \"conformer\": [\"\\u0093NUMPY\\u0001\\u0000v\\u0000{'descr': '&lt;f8', 'fortran_order': False, 'shape': (2, 3), }                                                          \\n\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u00e8\\u00bf\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0090&lt;\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u00e8?\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0090\\u00bc\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\", {}], \"molprops\": {\"ofe-name\": \"\"}}</data>\n    </node>\n    <edge source=\"mol0\" target=\"mol2\" id=\"0\">\n      <data key=\"d2\">[[0, 0]]</data>\n    </edge>\n    <edge source=\"mol1\" target=\"mol0\" id=\"0\">\n      <data key=\"d2\">[[0, 0], [1, 1]]</data>\n    </edge>\n    <edge source=\"mol1\" target=\"mol2\" id=\"0\">\n      <data key=\"d2\">[[0, 0], [2, 1]]</data>\n    </edge>\n    <data key=\"d0\">{OFE_VERSION}</data>\n  </graph>\n</graphml>\n"
  },
  {
    "path": "src/openfe/tests/dev/__init__.py",
    "content": ""
  },
  {
    "path": "src/openfe/tests/dev/serialization_test_templates.py",
    "content": "#!/usr/bin/env python\n\n# This script creates several files used in testing setup serialization:\n#\n# * openfe/tests/data/multi_molecule.sdf\n# * openfe/tests/data/serialization/ethane_template.sdf\n# * openfe/tests/data/serialization/network_template.graphml\n#\n# The two serialization templates need manual editing to replace the current\n# version of gufe with:\n# {GUFE_VERSION}\n\nfrom rdkit import Chem\nfrom rdkit.Chem import AllChem\n\nfrom openfe import LigandAtomMapping, LigandNetwork, SmallMoleculeComponent\n\n# multi_molecule.sdf\nmol1 = Chem.MolFromSmiles(\"CCO\")\nmol2 = Chem.MolFromSmiles(\"CCC\")\n\nwriter = Chem.SDWriter(\"multi_molecule.sdf\")\nwriter.write(mol1)\nwriter.write(mol2)\nwriter.close()\n\n\ndef mol_from_smiles(smiles: str) -> Chem.Mol:\n    m = Chem.MolFromSmiles(smiles)\n    AllChem.Compute2DCoords(m)  # type: ignore[attr-defined]\n\n    return m\n\n\n# ethane_template.sdf\nm = SmallMoleculeComponent(mol_from_smiles(\"CC\"), name=\"ethane\")\n\nwith open(\"ethane_template.sdf\", mode=\"w\") as tmpl:\n    tmpl.write(m.to_sdf())\n\n# ethane_with_H_template.sdf\nm2 = SmallMoleculeComponent(Chem.AddHs(m.to_rdkit()))\n\nwith open(\"ethane_with_H_template.sdf\", mode=\"w\") as tmpl:\n    tmpl.write(m2.to_sdf())\n\n\n# network_template.graphml\nmol1 = SmallMoleculeComponent(mol_from_smiles(\"CCO\"))\nmol2 = SmallMoleculeComponent(mol_from_smiles(\"CC\"))\nmol3 = SmallMoleculeComponent(mol_from_smiles(\"CO\"))\n\nedge12 = LigandAtomMapping(mol1, mol2, {0: 0, 1: 1})\nedge23 = LigandAtomMapping(mol2, mol3, {0: 0})\nedge13 = LigandAtomMapping(mol1, mol3, {0: 0, 2: 1})\n\nnetwork = LigandNetwork([edge12, edge23, edge13])\n\nwith open(\"network_template.graphml\", \"w\") as fn:\n    fn.write(network.to_graphml())\n"
  },
  {
    "path": "src/openfe/tests/protocols/__init__.py",
    "content": ""
  },
  {
    "path": "src/openfe/tests/protocols/conftest.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\nimport gzip\nimport pathlib\nfrom importlib import resources\nfrom typing import Optional\n\nimport MDAnalysis as mda\nimport openmm\nimport pooch\nimport pytest\nfrom gufe.tests.test_tokenization import GufeTokenizableTestsMixin\nfrom openff.units import Quantity, unit\nfrom openff.units.openmm import from_openmm\nfrom openmm import Platform\nfrom rdkit import Chem\nfrom rdkit.Geometry import Point3D\n\nimport openfe\nfrom openfe.data._registry import (\n    POOCH_CACHE,\n    zenodo_industry_benchmark_systems,\n    zenodo_md_resume_data,\n    zenodo_resume_data,\n    zenodo_rfe_simulation_nc,\n    zenodo_t4_lysozyme_traj,\n)\n\n\n@pytest.fixture\ndef benzene_vacuum_system(benzene_modifications):\n    return openfe.ChemicalSystem(\n        {\"ligand\": benzene_modifications[\"benzene\"]},\n    )\n\n\n@pytest.fixture(scope=\"session\")\ndef benzene_system(benzene_modifications):\n    return openfe.ChemicalSystem(\n        {\n            \"ligand\": benzene_modifications[\"benzene\"],\n            \"solvent\": openfe.SolventComponent(\n                positive_ion=\"Na\",\n                negative_ion=\"Cl\",\n                ion_concentration=0.15 * unit.molar,\n            ),\n        },\n    )\n\n\n@pytest.fixture\ndef benzene_complex_system(benzene_modifications, T4_protein_component):\n    return openfe.ChemicalSystem(\n        {\n            \"ligand\": benzene_modifications[\"benzene\"],\n            \"solvent\": openfe.SolventComponent(\n                positive_ion=\"Na\",\n                negative_ion=\"Cl\",\n                ion_concentration=0.15 * unit.molar,\n            ),\n            \"protein\": T4_protein_component,\n        }\n    )\n\n\n@pytest.fixture\ndef toluene_vacuum_system(benzene_modifications):\n    return openfe.ChemicalSystem(\n        {\"ligand\": benzene_modifications[\"toluene\"]},\n    )\n\n\n@pytest.fixture(scope=\"session\")\ndef toluene_system(benzene_modifications):\n    return openfe.ChemicalSystem(\n        {\n            \"ligand\": benzene_modifications[\"toluene\"],\n            \"solvent\": openfe.SolventComponent(\n                positive_ion=\"Na\", negative_ion=\"Cl\", ion_concentration=0.15 * unit.molar\n            ),\n        },\n    )\n\n\n@pytest.fixture\ndef toluene_complex_system(benzene_modifications, T4_protein_component):\n    return openfe.ChemicalSystem(\n        {\n            \"ligand\": benzene_modifications[\"toluene\"],\n            \"solvent\": openfe.SolventComponent(\n                positive_ion=\"Na\", negative_ion=\"Cl\", ion_concentration=0.15 * unit.molar\n            ),\n            \"protein\": T4_protein_component,\n        }\n    )\n\n\n@pytest.fixture(scope=\"session\")\ndef benzene_to_toluene_mapping(benzene_modifications):\n    mapper = openfe.setup.LomapAtomMapper(element_change=False)\n\n    molA = benzene_modifications[\"benzene\"]\n    molB = benzene_modifications[\"toluene\"]\n\n    return next(mapper.suggest_mappings(molA, molB))\n\n\n@pytest.fixture\ndef benzene_charges():\n    files = {}\n    with resources.as_file(resources.files(\"openfe.tests.data.openmm_rfe\")) as d:\n        fn = str(d / \"charged_benzenes.sdf\")\n        supp = Chem.SDMolSupplier(str(fn), removeHs=False)\n        for rdmol in supp:\n            files[rdmol.GetProp(\"_Name\")] = openfe.SmallMoleculeComponent(rdmol)\n    return files\n\n\n@pytest.fixture\ndef benzene_to_benzoic_mapping(benzene_charges):\n    mapper = openfe.setup.LomapAtomMapper(element_change=False)\n    molA = benzene_charges[\"benzene\"]\n    molB = benzene_charges[\"benzoic_acid\"]\n    return next(mapper.suggest_mappings(molA, molB))\n\n\n@pytest.fixture\ndef benzoic_to_benzene_mapping(benzene_charges):\n    mapper = openfe.setup.LomapAtomMapper(element_change=False)\n    molA = benzene_charges[\"benzoic_acid\"]\n    molB = benzene_charges[\"benzene\"]\n    return next(mapper.suggest_mappings(molA, molB))\n\n\n@pytest.fixture\ndef benzene_to_aniline_mapping(benzene_charges):\n    mapper = openfe.setup.LomapAtomMapper(element_change=False)\n    molA = benzene_charges[\"benzene\"]\n    molB = benzene_charges[\"aniline\"]\n    return next(mapper.suggest_mappings(molA, molB))\n\n\n@pytest.fixture\ndef aniline_to_benzene_mapping(benzene_charges):\n    mapper = openfe.setup.LomapAtomMapper(element_change=False)\n    molA = benzene_charges[\"aniline\"]\n    molB = benzene_charges[\"benzene\"]\n    return next(mapper.suggest_mappings(molA, molB))\n\n\n@pytest.fixture\ndef aniline_to_benzoic_mapping(benzene_charges):\n    mapper = openfe.setup.LomapAtomMapper(element_change=False)\n    molA = benzene_charges[\"aniline\"]\n    molB = benzene_charges[\"benzoic_acid\"]\n    return next(mapper.suggest_mappings(molA, molB))\n\n\n@pytest.fixture\ndef benzene_many_solv_system(benzene_modifications):\n    rdmol_phenol = benzene_modifications[\"phenol\"].to_rdkit()\n    rdmol_benzo = benzene_modifications[\"benzonitrile\"].to_rdkit()\n\n    conf_phenol = rdmol_phenol.GetConformer()\n    conf_benzo = rdmol_benzo.GetConformer()\n\n    for atm in range(rdmol_phenol.GetNumAtoms()):\n        x, y, z = conf_phenol.GetAtomPosition(atm)\n        conf_phenol.SetAtomPosition(atm, Point3D(x + 30, y, z))\n\n    for atm in range(rdmol_benzo.GetNumAtoms()):\n        x, y, z = conf_benzo.GetAtomPosition(atm)\n        conf_benzo.SetAtomPosition(atm, Point3D(x, y + 30, z))\n\n    phenol = openfe.SmallMoleculeComponent.from_rdkit(rdmol_phenol, name=\"phenol\")\n\n    benzo = openfe.SmallMoleculeComponent.from_rdkit(rdmol_benzo, name=\"benzonitrile\")\n\n    return openfe.ChemicalSystem(\n        {\n            \"whatligand\": benzene_modifications[\"benzene\"],\n            \"foo\": phenol,\n            \"bar\": benzo,\n            \"solvent\": openfe.SolventComponent(),\n        },\n    )\n\n\n@pytest.fixture\ndef toluene_many_solv_system(benzene_modifications):\n    rdmol_phenol = benzene_modifications[\"phenol\"].to_rdkit()\n    rdmol_benzo = benzene_modifications[\"benzonitrile\"].to_rdkit()\n\n    conf_phenol = rdmol_phenol.GetConformer()\n    conf_benzo = rdmol_benzo.GetConformer()\n\n    for atm in range(rdmol_phenol.GetNumAtoms()):\n        x, y, z = conf_phenol.GetAtomPosition(atm)\n        conf_phenol.SetAtomPosition(atm, Point3D(x + 30, y, z))\n\n    for atm in range(rdmol_benzo.GetNumAtoms()):\n        x, y, z = conf_benzo.GetAtomPosition(atm)\n        conf_benzo.SetAtomPosition(atm, Point3D(x, y + 30, z))\n\n    phenol = openfe.SmallMoleculeComponent.from_rdkit(rdmol_phenol, name=\"phenol\")\n\n    benzo = openfe.SmallMoleculeComponent.from_rdkit(rdmol_benzo, name=\"benzonitrile\")\n    return openfe.ChemicalSystem(\n        {\n            \"whatligand\": benzene_modifications[\"toluene\"],\n            \"foo\": phenol,\n            \"bar\": benzo,\n            \"solvent\": openfe.SolventComponent(),\n        },\n    )\n\n\n@pytest.fixture\ndef rfe_transformation_json() -> str:\n    \"\"\"string of a RFE results similar to quickrun\n\n    generated with gen-serialized-results.py\n    \"\"\"\n    d = resources.files(\"openfe.tests.data.openmm_rfe\")\n\n    with gzip.open((d / \"RHFEProtocol_json_results.gz\").as_posix(), \"r\") as f:  # type: ignore\n        return f.read().decode()  # type: ignore\n\n\n@pytest.fixture\ndef afe_solv_transformation_json() -> str:\n    \"\"\"\n    string of a Absolute Solvation result (CN in water) generated by quickrun\n\n    generated with gen-serialized-results.py\n    \"\"\"\n    d = resources.files(\"openfe.tests.data.openmm_afe\")\n    fname = \"AHFEProtocol_json_results.gz\"\n\n    with gzip.open((d / fname).as_posix(), \"r\") as f:  # type: ignore\n        return f.read().decode()  # type: ignore\n\n\n@pytest.fixture\ndef abfe_transformation_json_path() -> str:\n    \"\"\"\n    Path to an Absolute Binding result (tyk2 complex) generated by quickrun\n\n    generated with gen-serialized-results.py\n    \"\"\"\n    d = resources.files(\"openfe.tests.data.openmm_afe\")\n    fname = \"ABFEProtocol_json_results.json.gz\"\n\n    return str(d / fname)\n\n\n@pytest.fixture\ndef md_json() -> str:\n    \"\"\"\n    string of a MD result (TYK ligand lig_ejm_31  in water) generated by quickrun\n\n    generated with gen-serialized-results.py\n    \"\"\"\n    d = resources.files(\"openfe.tests.data.openmm_md\")\n    fname = \"MDProtocol_json_results.gz\"\n\n    with gzip.open((d / fname).as_posix(), \"r\") as f:  # type: ignore\n        return f.read().decode()  # type: ignore\n\n\n@pytest.fixture\ndef septop_json() -> str:\n    \"\"\"\n    Path to a SepTop result (hif2a)\n\n    generated with gen-serialized-results.py\n    \"\"\"\n    d = resources.files(\"openfe.tests.data.openmm_septop\")\n    fname = \"SepTopProtocol_json_results.gz\"\n\n    with gzip.open((d / fname).as_posix(), \"r\") as f:  # type: ignore\n        return f.read().decode()  # type: ignore\n\n\npooch_industry_benchmark_systems = pooch.create(\n    path=POOCH_CACHE,\n    base_url=zenodo_industry_benchmark_systems[\"base_url\"],\n    registry={\n        zenodo_industry_benchmark_systems[\"fname\"]: zenodo_industry_benchmark_systems[\"known_hash\"]\n    },\n)\n\n\n@pytest.fixture\ndef industry_benchmark_files():\n    pooch_industry_benchmark_systems.fetch(\n        \"industry_benchmark_systems.zip\", processor=pooch.Unzip()\n    )\n    cache_dir = pathlib.Path(\n        POOCH_CACHE / \"industry_benchmark_systems.zip.unzip/industry_benchmark_systems\"\n    )\n    return cache_dir\n\n\npooch_t4_lysozyme = pooch.create(\n    path=POOCH_CACHE,\n    base_url=zenodo_t4_lysozyme_traj[\"base_url\"],\n    registry={zenodo_t4_lysozyme_traj[\"fname\"]: zenodo_t4_lysozyme_traj[\"known_hash\"]},\n)\n\n\n# session scope for downstream reuse\n@pytest.fixture(scope=\"session\")\ndef t4_lysozyme_trajectory_dir():\n    pooch_t4_lysozyme.fetch(\"t4_lysozyme_trajectory.zip\", processor=pooch.Unzip())\n    cache_dir = pathlib.Path(\n        POOCH_CACHE / \"t4_lysozyme_trajectory.zip.unzip/t4_lysozyme_trajectory\"\n    )\n    return cache_dir\n\n\n@pytest.fixture\ndef simulation_nc():\n    return pooch.retrieve(\n        url=zenodo_rfe_simulation_nc[\"base_url\"] + zenodo_rfe_simulation_nc[\"fname\"],\n        known_hash=zenodo_rfe_simulation_nc[\"known_hash\"],\n        path=POOCH_CACHE,\n    )\n\n\npooch_resume_data = pooch.create(\n    path=POOCH_CACHE,\n    base_url=zenodo_resume_data[\"base_url\"],\n    registry={zenodo_resume_data[\"fname\"]: zenodo_resume_data[\"known_hash\"]},\n)\n\n\n@pytest.fixture(scope=\"session\")\ndef htop_trajectory_path():\n    pooch_resume_data.fetch(\"multistate_checkpoints.zip\", processor=pooch.Unzip())\n    topdir = \"multistate_checkpoints.zip.unzip/multistate_checkpoints\"\n    subdir = \"hybrid_top\"\n    filename = \"simulation.nc\"\n    return pathlib.Path(pooch.os_cache(\"openfe\") / f\"{topdir}/{subdir}/{filename}\")\n\n\n@pytest.fixture(scope=\"session\")\ndef htop_checkpoint_path():\n    pooch_resume_data.fetch(\"multistate_checkpoints.zip\", processor=pooch.Unzip())\n    topdir = \"multistate_checkpoints.zip.unzip/multistate_checkpoints\"\n    subdir = \"hybrid_top\"\n    filename = \"checkpoint.chk\"\n    return pathlib.Path(pooch.os_cache(\"openfe\") / f\"{topdir}/{subdir}/{filename}\")\n\n\n@pytest.fixture(scope=\"module\")\ndef ahfe_vac_trajectory_path():\n    pooch_resume_data.fetch(\"multistate_checkpoints.zip\", processor=pooch.Unzip())\n    topdir = \"multistate_checkpoints.zip.unzip/multistate_checkpoints\"\n    subdir = \"ahfes\"\n    filename = \"vacuum.nc\"\n    return pathlib.Path(pooch.os_cache(\"openfe\") / f\"{topdir}/{subdir}/{filename}\")\n\n\n@pytest.fixture(scope=\"module\")\ndef vac_checkpoint_path():\n    pooch_resume_data.fetch(\"multistate_checkpoints.zip\", processor=pooch.Unzip())\n    topdir = \"multistate_checkpoints.zip.unzip/multistate_checkpoints\"\n    subdir = \"ahfes\"\n    filename = \"vacuum_checkpoint.nc\"\n    return pathlib.Path(pooch.os_cache(\"openfe\") / f\"{topdir}/{subdir}/{filename}\")\n\n\n@pytest.fixture(scope=\"module\")\ndef ahfe_solv_trajectory_path():\n    pooch_resume_data.fetch(\"multistate_checkpoints.zip\", processor=pooch.Unzip())\n    topdir = \"multistate_checkpoints.zip.unzip/multistate_checkpoints\"\n    subdir = \"ahfes\"\n    filename = \"solvent.nc\"\n    return pathlib.Path(pooch.os_cache(\"openfe\") / f\"{topdir}/{subdir}/{filename}\")\n\n\n@pytest.fixture(scope=\"module\")\ndef ahfe_solv_checkpoint_path():\n    pooch_resume_data.fetch(\"multistate_checkpoints.zip\", processor=pooch.Unzip())\n    topdir = \"multistate_checkpoints.zip.unzip/multistate_checkpoints\"\n    subdir = \"ahfes\"\n    filename = \"solvent_checkpoint.nc\"\n    return pathlib.Path(pooch.os_cache(\"openfe\") / f\"{topdir}/{subdir}/{filename}\")\n\n\n@pytest.fixture(scope=\"module\")\ndef septop_solv_trajectory_path():\n    pooch_resume_data.fetch(\"multistate_checkpoints.zip\", processor=pooch.Unzip())\n    topdir = \"multistate_checkpoints.zip.unzip/multistate_checkpoints\"\n    subdir = \"septop\"\n    filename = \"solvent.nc\"\n    return pathlib.Path(pooch.os_cache(\"openfe\") / f\"{topdir}/{subdir}/{filename}\")\n\n\n@pytest.fixture(scope=\"module\")\ndef septop_solv_checkpoint_path():\n    pooch_resume_data.fetch(\"multistate_checkpoints.zip\", processor=pooch.Unzip())\n    topdir = \"multistate_checkpoints.zip.unzip/multistate_checkpoints\"\n    subdir = \"septop\"\n    filename = \"solvent_checkpoint.nc\"\n    return pathlib.Path(pooch.os_cache(\"openfe\") / f\"{topdir}/{subdir}/{filename}\")\n\n\npooch_md_resume_data = pooch.create(\n    path=POOCH_CACHE,\n    base_url=zenodo_md_resume_data[\"base_url\"],\n    registry={zenodo_md_resume_data[\"fname\"]: zenodo_md_resume_data[\"known_hash\"]},\n)\n\n\n@pytest.fixture(scope=\"module\")\ndef plain_md_checkpoint_path():\n    pooch_md_resume_data.fetch(\"checkpoint.xml\")\n    return pathlib.Path(pooch.os_cache(\"openfe\") / \"checkpoint.xml\")\n\n\n@pytest.fixture(scope=\"session\")\ndef available_platforms() -> set[str]:\n    return {\n        Platform.getPlatform(i).getName()\n        for i in range(Platform.getNumPlatforms())\n    }  # fmt: skip\n\n\n@pytest.fixture(scope=\"session\")\ndef get_available_openmm_platforms() -> set[str]:\n    \"\"\"\n    OpenMM Platforms that are available and functional on system\n    \"\"\"\n    import openmm\n    from openmm import Platform\n\n    # Get platforms that openmm was built with\n    platforms = {Platform.getPlatform(i).getName() for i in range(Platform.getNumPlatforms())}\n\n    # Now check if we can actually use the platforms\n    working_platforms = set()\n    for platform in platforms:\n        system = openmm.System()\n        system.addParticle(1.0)\n        integrator = openmm.VerletIntegrator(0.001)\n        try:\n            context = openmm.Context(system, integrator, Platform.getPlatformByName(platform))\n            working_platforms.add(platform)\n            del context\n        except openmm.OpenMMException:\n            continue\n        finally:\n            del system, integrator\n\n    return working_platforms\n\n\nclass ModGufeTokenizableTestsMixin(GufeTokenizableTestsMixin):\n    \"\"\"\n    A modified gufe tokenizable tests mixin which allows\n    for repr to be lazily evaluated.\n    \"\"\"\n\n    def test_repr(self, instance):\n        \"\"\"\n        Overwrites the base `test_repr` call.\n        \"\"\"\n        assert isinstance(repr(instance), str)\n        assert self.repr in repr(instance)\n\n\ndef compute_energy(\n    system: openmm.System,\n    positions: openmm.unit.Quantity,\n    box_vectors: Optional[openmm.unit.Quantity],\n    context_params: Optional[dict[str, float]] = None,\n    platform=None,\n) -> Quantity:\n    \"\"\"\n    Computes the potential energy of a system at a given set of positions.\n\n    Parameters\n    ----------\n    system: openmm.System\n      The system to compute the energy of.\n    positions: openmm.unit.Quantity\n      The positions to compute the energy at.\n    box_vectors: Optional[openmm.unit.Quantity]\n      The box vectors to use if any.\n    context_params: Optional[dict[str, float]]\n      Any global context parameters to set.\n    platform: str\n      The platform to use.\n\n    Returns\n    -------\n    potential : openff.units.Quantity\n        The computed potential energy in openff unit.\n    \"\"\"\n    context_params = context_params if context_params is not None else {}\n\n    integrator = openmm.VerletIntegrator(0.0001 * openmm.unit.femtoseconds)\n\n    if platform is None:\n        context = openmm.Context(system, integrator)\n    if platform is not None:\n        context = openmm.Context(system, integrator, platform)\n\n    for key, value in context_params.items():\n        context.setParameter(key, value)\n\n    if box_vectors is not None:\n        context.setPeriodicBoxVectors(*box_vectors)\n    context.setPositions(positions)\n\n    state = context.getState(getEnergy=True)\n    potential = state.getPotentialEnergy()\n    del context, integrator, state\n    return from_openmm(potential)\n"
  },
  {
    "path": "src/openfe/tests/protocols/openmm_abfe/__init__.py",
    "content": ""
  },
  {
    "path": "src/openfe/tests/protocols/openmm_abfe/conftest.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\nimport gufe\nimport pytest\n\nfrom openfe.protocols import openmm_afe\n\n\n@pytest.fixture\ndef benzene_complex_dag(benzene_modifications, T4_protein_component):\n    s = openmm_afe.AbsoluteBindingProtocol.default_settings()\n    s.complex_output_settings.output_indices = \"not water\"\n    s.solvent_output_settings.output_indices = \"not water\"\n\n    protocol = openmm_afe.AbsoluteBindingProtocol(\n        settings=s,\n    )\n\n    stateA = gufe.ChemicalSystem(\n        {\n            \"protein\": T4_protein_component,\n            \"benzene\": benzene_modifications[\"benzene\"],\n            \"solvent\": gufe.SolventComponent(),\n        }\n    )\n\n    stateB = gufe.ChemicalSystem(\n        {\n            \"protein\": T4_protein_component,\n            \"solvent\": gufe.SolventComponent(),\n        }\n    )\n\n    return protocol.create(stateA=stateA, stateB=stateB, mapping=None)\n"
  },
  {
    "path": "src/openfe/tests/protocols/openmm_abfe/test_abfe_energies.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\nimport collections\nimport copy\nfrom importlib import resources\n\nimport gufe\nimport numpy as np\nimport openmm\nimport pytest\nfrom openmm import Platform\nfrom openmm import unit as ommunit\nfrom openmmtools.alchemy import (\n    AbsoluteAlchemicalFactory,\n    AlchemicalRegion,\n    AlchemicalState,\n)\n\nfrom openfe.protocols import openmm_afe\nfrom openfe.protocols.openmm_afe.abfe_units import (\n    ABFEComplexSetupUnit,\n)\nfrom openfe.protocols.openmm_utils.omm_settings import OpenMMSolvationSettings\nfrom openfe.protocols.openmm_utils.serialization import deserialize\n\n\nclass AlchemStateRest(AlchemicalState):\n    \"\"\"\n    A modified AlchemicalState for testing.\n\n    Note: we don't need this in the main protocol since we use composable\n    thermodynamic states.\n    \"\"\"\n\n    lambda_restraints = AlchemicalState._LambdaParameter(\"lambda_restraints\")\n\n\ndef get_alchemical_energy_components(alchemical_system, alchemical_state, positions, platform):\n    \"\"\"Compute potential energy of the alchemical system by Force.\n\n    This can be useful for debug and analysis.\n\n    Parameters\n    ----------\n    alchemical_system : openmm.AlchemicalSystem\n        An alchemically modified system.\n    alchemical_state : AlchemicalState\n        The alchemical state to set the Context to.\n    positions : openmm.unit.Quantity of dimension (natoms, 3)\n        Coordinates to use for energy test (units of distance).\n    platform : openmm.Platform, optional\n        The OpenMM platform to use to compute the energy. If None,\n        OpenMM tries to select the fastest available.\n\n    Returns\n    -------\n    energy_components : dict str: openmm.unit.Quantity\n        A string label describing the role of the force associated to\n        its contribution to the potential energy.\n\n    \"\"\"\n    # Find and label all forces.\n    force_labels = AbsoluteAlchemicalFactory._find_force_components(alchemical_system)\n    assert len(force_labels) <= 32, (\n        \"The alchemical system has more than 32 force groups; \"\n        \"can't compute individual force component energies.\"\n    )\n\n    # Create deep copy of alchemical system.\n    system = copy.deepcopy(alchemical_system)\n\n    # Separate all forces into separate force groups.\n    for force_index, force in enumerate(system.getForces()):\n        force.setForceGroup(force_index)\n\n    assert len(force_labels) == len(system.getForces())\n\n    # Create a Context in the given state.\n    integrator = openmm.LangevinMiddleIntegrator(\n        300 * openmm.unit.kelvin,\n        1.0 / openmm.unit.picosecond,\n        1.0 * openmm.unit.femtoseconds,\n    )\n    # integrator = openmm.VerletIntegrator(0.0 * ommunit.femtoseconds)\n    context = openmm.Context(system, integrator, platform)\n    context.setPeriodicBoxVectors(*system.getDefaultPeriodicBoxVectors())\n    context.setPositions(np.round(positions, 3))\n    context.setVelocitiesToTemperature(300, 42)\n    alchemical_state.apply_to_context(context)\n\n    # Get energy components\n    energy_components = collections.OrderedDict()\n    for force_label, force_index in force_labels.items():\n        energy_components[force_label] = context.getState(\n            getEnergy=True,\n            groups={force_index},\n        ).getPotentialEnergy()\n\n    # Clean up\n    del context, integrator\n    return energy_components\n\n\n@pytest.mark.slow\nclass TestT4EnergiesRegression:\n    \"\"\"\n    Test:\n      * Regression of a system energies against a previously serialized one.\n      * That the energies do what we think they should be doing.\n    \"\"\"\n\n    @pytest.fixture()\n    def t4_reference_system(self):\n        with resources.as_file(resources.files(\"openfe.tests.data.openmm_afe\")) as d:\n            f = d / \"T4_abfe_system.xml.bz2\"\n            system = deserialize(f)\n        return system\n\n    @pytest.fixture()\n    def t4_validation_data(self, benzene_modifications, T4_protein_component, tmp_path):\n        s = openmm_afe.AbsoluteBindingProtocol.default_settings()\n        s.protocol_repeats = 1\n        s.engine_settings.compute_platform = \"cpu\"\n        s.forcefield_settings.small_molecule_forcefield = \"openff-2.2.1\"\n        s.complex_solvation_settings = OpenMMSolvationSettings(\n            solvent_padding=None,\n            number_of_solvent_molecules=1000,\n            box_shape=\"dodecahedron\",\n        )\n\n        protocol = openmm_afe.AbsoluteBindingProtocol(settings=s)\n\n        stateA = gufe.ChemicalSystem(\n            {\n                \"protein\": T4_protein_component,\n                \"benzene\": benzene_modifications[\"benzene\"],\n                \"solvent\": gufe.SolventComponent(),\n            }\n        )\n\n        stateB = gufe.ChemicalSystem(\n            {\n                \"protein\": T4_protein_component,\n                \"solvent\": gufe.SolventComponent(),\n            }\n        )\n\n        dag = protocol.create(stateA=stateA, stateB=stateB, mapping=None)\n\n        complex_units = [u for u in dag.protocol_units if isinstance(u, ABFEComplexSetupUnit)]\n\n        results = complex_units[0].run(\n            dry=True, scratch_basepath=tmp_path, shared_basepath=tmp_path\n        )\n        return results\n\n    @staticmethod\n    def get_energy_components(\n        system,\n        indices,\n        positions,\n        lambda_sterics,\n        lambda_electrostatics,\n        lambda_restraints,\n    ):\n        platform = Platform.getPlatformByName(\"Reference\")\n        alchemical_region = AlchemicalRegion(alchemical_atoms=indices)\n\n        alchemical_state = AlchemStateRest.from_system(\n            system, parameters_name_suffix=alchemical_region.name\n        )\n\n        alchemical_state.lambda_sterics = lambda_sterics\n        alchemical_state.lambda_electrostatics = lambda_electrostatics\n        alchemical_state.lambda_restraints = lambda_restraints\n\n        return get_alchemical_energy_components(\n            system, alchemical_state, positions, platform=platform\n        )\n\n    @pytest.mark.parametrize(\"lambda_val\", [0, 1])\n    def test_energies_regression(self, lambda_val, t4_reference_system, t4_validation_data):\n        energies_ref = self.get_energy_components(\n            t4_reference_system,\n            t4_validation_data[\"alchem_indices\"],\n            t4_validation_data[\"debug_positions\"],\n            lambda_val,\n            lambda_val,\n            lambda_val,\n        )\n\n        energies_val = self.get_energy_components(\n            t4_validation_data[\"alchem_system\"],\n            t4_validation_data[\"alchem_indices\"],\n            t4_validation_data[\"debug_positions\"],\n            lambda_val,\n            lambda_val,\n            lambda_val,\n        )\n\n        # Check the keys match\n        assert [k for k in energies_ref.keys()] == [k for k in energies_val.keys()]\n\n        for key in energies_ref.keys():\n            e_ref = energies_ref[key].value_in_unit(ommunit.kilojoule_per_mole)\n            e_val = energies_val[key].value_in_unit(ommunit.kilojoule_per_mole)\n            assert pytest.approx(e_ref, abs=1e-3) == e_val\n\n    def test_lambda_scale(self, t4_validation_data):\n        def assert_energies(actual, expected, nonbonded_lower: bool):\n            assert [k for k in expected.keys()] == [k for k in actual.keys()]\n            for key in expected.keys():\n                e_ref = expected[key].value_in_unit(ommunit.kilojoule_per_mole)\n                e_val = actual[key].value_in_unit(ommunit.kilojoule_per_mole)\n\n                # Knowing exactly by how much the NBF has reduced is hard, so we\n                # just check it's lower\n                if nonbonded_lower and key == \"unmodified NonbondedForce\":\n                    assert e_val < e_ref\n                else:\n                    assert e_val == pytest.approx(e_ref, abs=0.1)\n\n        # lambda 1 on all\n        energies = self.get_energy_components(\n            t4_validation_data[\"alchem_system\"],\n            t4_validation_data[\"alchem_indices\"],\n            t4_validation_data[\"debug_positions\"],\n            lambda_sterics=1.0,\n            lambda_electrostatics=1.0,\n            lambda_restraints=1.0,\n        )\n\n        # turn off restraints\n        expected = copy.deepcopy(energies)\n        expected[\"unmodified CustomCompoundBondForce\"] = 0 * ommunit.kilojoule_per_mole\n\n        energies = self.get_energy_components(\n            t4_validation_data[\"alchem_system\"],\n            t4_validation_data[\"alchem_indices\"],\n            t4_validation_data[\"debug_positions\"],\n            lambda_sterics=1.0,\n            lambda_electrostatics=1.0,\n            lambda_restraints=0.0,\n        )\n\n        assert_energies(energies, expected, nonbonded_lower=False)\n\n        # turn off electrostatics\n\n        energies = self.get_energy_components(\n            t4_validation_data[\"alchem_system\"],\n            t4_validation_data[\"alchem_indices\"],\n            t4_validation_data[\"debug_positions\"],\n            lambda_sterics=1.0,\n            lambda_electrostatics=0.0,\n            lambda_restraints=0.0,\n        )\n\n        # assert all but the NonbondedForce, that should just be lower\n        assert_energies(energies, expected, nonbonded_lower=True)\n\n        # turn off sterics\n        expected = copy.deepcopy(energies)\n        expected[\"alchemically modified NonbondedForce for non-alchemical/alchemical sterics\"] = (\n            0 * ommunit.kilojoule_per_mole\n        )\n        expected[\n            \"alchemically modified BondForce for non-alchemical/alchemical sterics exceptions\"\n        ] = 0 * ommunit.kilojoule_per_mole\n\n        energies = self.get_energy_components(\n            t4_validation_data[\"alchem_system\"],\n            t4_validation_data[\"alchem_indices\"],\n            t4_validation_data[\"debug_positions\"],\n            lambda_sterics=0.0,\n            lambda_electrostatics=0.0,\n            lambda_restraints=0.0,\n        )\n\n        # assert all but the NonbondedForce, that should just be lower\n        assert_energies(energies, expected, nonbonded_lower=False)\n"
  },
  {
    "path": "src/openfe/tests/protocols/openmm_abfe/test_abfe_protocol.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\nfrom math import sqrt\nfrom unittest import mock\n\nimport gufe\nimport mdtraj as mdt\nimport numpy as np\nimport openmm\nimport pytest\nfrom numpy.testing import assert_allclose\nfrom openff.units import unit as offunit\nfrom openff.units.openmm import from_openmm, to_openmm\nfrom openmm import (\n    CustomBondForce,\n    CustomCompoundBondForce,\n    CustomNonbondedForce,\n    HarmonicAngleForce,\n    HarmonicBondForce,\n    MonteCarloBarostat,\n    MonteCarloMembraneBarostat,\n    NonbondedForce,\n    PeriodicTorsionForce,\n)\nfrom openmm import unit as omm_unit\nfrom openmm import unit as ommunit\nfrom openmmtools.alchemy import (\n    AlchemicalRegion,\n)\nfrom openmmtools.multistate.multistatesampler import MultiStateSampler\nfrom openmmtools.tests import test_alchemy\nfrom openmmtools.tests.test_alchemy import (\n    check_interacting_energy_components,\n    check_noninteracting_energy_components,\n    compare_system_energies,\n)\n\nimport openfe\nfrom openfe import ChemicalSystem, SmallMoleculeComponent, SolventComponent\nfrom openfe.protocols import openmm_afe\nfrom openfe.protocols.openmm_afe import (\n    AbsoluteBindingProtocol,\n)\n\nfrom .utils import UNIT_TYPES, _get_units\n\n\n@pytest.fixture()\ndef default_settings():\n    return AbsoluteBindingProtocol.default_settings()\n\n\n@pytest.fixture(scope=\"module\")\ndef benzene_wcharges(benzene_modifications):\n    benz_off = benzene_modifications[\"benzene\"].to_openff()\n    benz_off.assign_partial_charges(partial_charge_method=\"gasteiger\")\n    return SmallMoleculeComponent.from_openff(benz_off)\n\n\ndef test_create_default_protocol(default_settings):\n    # this is roughly how it should be created\n    protocol = AbsoluteBindingProtocol(\n        settings=default_settings,\n    )\n    assert protocol\n\n\ndef test_serialize_protocol(default_settings):\n    protocol = AbsoluteBindingProtocol(\n        settings=default_settings,\n    )\n\n    ser = protocol.to_dict()\n    ret = AbsoluteBindingProtocol.from_dict(ser)\n    assert protocol == ret\n\n\ndef test_repeat_units(benzene_modifications, T4_protein_component):\n    protocol = openmm_afe.AbsoluteBindingProtocol(\n        settings=openmm_afe.AbsoluteBindingProtocol.default_settings()\n    )\n\n    stateA = gufe.ChemicalSystem(\n        {\n            \"protein\": T4_protein_component,\n            \"benzene\": benzene_modifications[\"benzene\"],\n            \"solvent\": gufe.SolventComponent(),\n        }\n    )\n\n    stateB = gufe.ChemicalSystem(\n        {\n            \"protein\": T4_protein_component,\n            \"solvent\": gufe.SolventComponent(),\n        }\n    )\n\n    dag = protocol.create(\n        stateA=stateA,\n        stateB=stateB,\n        mapping=None,\n    )\n\n    # 6 protocol unit, 3 per repeat\n    pus = list(dag.protocol_units)\n    assert len(pus) == 18\n\n    # Check info for each repeat\n    for phase in [\"solvent\", \"complex\"]:\n        setup = _get_units(pus, UNIT_TYPES[phase][\"setup\"])\n        sim = _get_units(pus, UNIT_TYPES[phase][\"sim\"])\n        analysis = _get_units(pus, UNIT_TYPES[phase][\"analysis\"])\n\n        # Should be 3 of each set\n        assert len(setup) == len(sim) == len(analysis) == 3\n\n        # Check that the dag chain is correct\n        for analysis_pu in analysis:\n            repeat_id = analysis_pu.inputs[\"repeat_id\"]\n            setup_pu = [s for s in setup if s.inputs[\"repeat_id\"] == repeat_id][0]\n            sim_pu = [s for s in sim if s.inputs[\"repeat_id\"] == repeat_id][0]\n            assert analysis_pu.inputs[\"setup_results\"] == setup_pu\n            assert analysis_pu.inputs[\"simulation_results\"] == sim_pu\n            assert sim_pu.inputs[\"setup_results\"] == setup_pu\n\n\ndef test_create_independent_repeat_ids(benzene_modifications, T4_protein_component):\n    s = openmm_afe.AbsoluteBindingProtocol.default_settings()\n\n    protocol = openmm_afe.AbsoluteBindingProtocol(\n        settings=s,\n    )\n\n    stateA = gufe.ChemicalSystem(\n        {\n            \"protein\": T4_protein_component,\n            \"benzene\": benzene_modifications[\"benzene\"],\n            \"solvent\": gufe.SolventComponent(),\n        }\n    )\n\n    stateB = gufe.ChemicalSystem(\n        {\n            \"protein\": T4_protein_component,\n            \"solvent\": gufe.SolventComponent(),\n        }\n    )\n\n    dags = []\n    for i in range(2):\n        dags.append(protocol.create(stateA=stateA, stateB=stateB, mapping=None))\n\n    repeat_ids = set()\n\n    for dag in dags:\n        # 3 sets of 6 units\n        assert len(list(dag.protocol_units)) == 18\n        for u in dag.protocol_units:\n            repeat_ids.add(u.inputs[\"repeat_id\"])\n\n    # squashed by repeat_id, that's 2 sets of 6\n    assert len(repeat_ids) == 12\n\n\ndef test_mda_universe_error():\n    \"\"\"\n    Test that we get an error if we pass no positions or trajectory\n    when calling the mda Universe getter.\n    \"\"\"\n    with pytest.raises(ValueError, match=\"No positions to create\"):\n        _ = openmm_afe.ABFEComplexSetupUnit._get_mda_universe(\n            topology=\"foo\", positions=None, trajectory=None\n        )\n\n\nclass TestT4LysozymeDryRun:\n    solvent = SolventComponent(ion_concentration=0 * offunit.molar)\n    num_all_not_water = 2634  # 9 counterions to neutralize\n    num_protein_component_atoms = 2614\n    # No ions\n    num_ligand_atoms = 12\n    expected_complex_particles = 32607\n    expected_ligand_solvent_particles = 3012\n\n    barostat_by_phase = {\n        \"complex\": MonteCarloBarostat,\n        \"solvent\": MonteCarloBarostat,\n    }\n\n    @pytest.fixture(scope=\"class\", autouse=True)\n    def set_platform(self, get_available_openmm_platforms):\n        \"\"\"\n        Set the platform used by this test, overriding the openmmtools default.\n\n        If a CUDA-enabled GPU is present, it will attempt to set the platform\n        to CUDA + mixed precision. Otherwise the Reference platform will be used.\n\n        We need this because system size discrepancies can occur see <https://github.com/openmm/openmm/issues/5230> for more details.\n\n        Note\n        ----\n        - must keep autouse=True to ensure it is used without being called explicitly\n        \"\"\"\n        original_platform = test_alchemy.GLOBAL_ALCHEMY_PLATFORM\n\n        # set the new platform\n        # Try cuda if available, then CPU\n        if \"CUDA\" in get_available_openmm_platforms:\n            test_platform = openmm.Platform.getPlatformByName(\"CUDA\")\n            test_platform.setPropertyDefaultValue(\"Precision\", \"mixed\")\n            test_alchemy.GLOBAL_ALCHEMY_PLATFORM = test_platform\n        else:\n            test_alchemy.GLOBAL_ALCHEMY_PLATFORM = openmm.Platform.getPlatformByName(\"Reference\")\n        yield\n        # restore the old value\n        test_alchemy.GLOBAL_ALCHEMY_PLATFORM = original_platform\n\n    @pytest.fixture(scope=\"class\")\n    def protocol(self, settings):\n        return openmm_afe.AbsoluteBindingProtocol(\n            settings=settings,\n        )\n\n    @pytest.fixture(scope=\"class\")\n    def settings(self):\n        s = openmm_afe.AbsoluteBindingProtocol.default_settings()\n        s.protocol_repeats = 1\n        s.engine_settings.compute_platform = \"cpu\"\n        s.complex_output_settings.output_indices = \"not water\"\n        s.complex_solvation_settings.box_shape = \"dodecahedron\"\n        s.complex_solvation_settings.solvent_padding = None\n        s.complex_solvation_settings.number_of_solvent_molecules = 10000\n        s.solvent_solvation_settings.box_shape = \"cube\"\n        s.solvent_solvation_settings.solvent_padding = None\n        s.solvent_solvation_settings.number_of_solvent_molecules = 1000\n        return s\n\n    @pytest.fixture(scope=\"class\")\n    def dag(self, protocol, benzene_wcharges, T4_protein_component):\n        stateA = ChemicalSystem(\n            {\n                \"benzene\": benzene_wcharges,\n                \"protein\": T4_protein_component,\n                \"solvent\": self.solvent,\n            }\n        )\n\n        stateB = ChemicalSystem(\n            {\n                \"protein\": T4_protein_component,\n                \"solvent\": self.solvent,\n            }\n        )\n\n        return protocol.create(\n            stateA=stateA,\n            stateB=stateB,\n            mapping=None,\n        )\n\n    @pytest.fixture(scope=\"class\")\n    def complex_setup_units(self, dag):\n        return _get_units(dag.protocol_units, UNIT_TYPES[\"complex\"][\"setup\"])\n\n    @pytest.fixture(scope=\"class\")\n    def complex_sim_units(self, dag):\n        return _get_units(dag.protocol_units, UNIT_TYPES[\"complex\"][\"sim\"])\n\n    @pytest.fixture(scope=\"class\")\n    def solvent_setup_units(self, dag):\n        return _get_units(dag.protocol_units, UNIT_TYPES[\"solvent\"][\"setup\"])\n\n    @pytest.fixture(scope=\"class\")\n    def solvent_sim_units(self, dag):\n        return _get_units(dag.protocol_units, UNIT_TYPES[\"solvent\"][\"sim\"])\n\n    def test_number_of_units(\n        self,\n        dag,\n        complex_setup_units,\n        complex_sim_units,\n        solvent_setup_units,\n        solvent_sim_units,\n    ):\n        assert len(list(dag.protocol_units)) == 6\n        assert len(complex_setup_units) == len(complex_sim_units) == 1\n        assert len(solvent_setup_units) == len(solvent_sim_units) == 1\n\n    def _assert_force_num(self, system, forcetype, number):\n        forces = [f for f in system.getForces() if isinstance(f, forcetype)]\n        assert len(forces) == number\n\n    def _assert_expected_alchemical_forces(self, system, phase: str, settings):\n        \"\"\"\n        Assert the forces expected in the alchemical system.\n        \"\"\"\n        barostat_type = self.barostat_by_phase[phase]\n        self._assert_force_num(system, NonbondedForce, 1)\n        self._assert_force_num(system, CustomNonbondedForce, 2)\n        self._assert_force_num(system, CustomBondForce, 2)\n        self._assert_force_num(system, HarmonicBondForce, 1)\n        self._assert_force_num(system, HarmonicAngleForce, 1)\n        self._assert_force_num(system, PeriodicTorsionForce, 1)\n        self._assert_force_num(system, barostat_type, 1)\n\n        if phase == \"complex\":\n            self._assert_force_num(system, CustomCompoundBondForce, 1)\n            assert len(system.getForces()) == 10\n        else:\n            assert len(system.getForces()) == 9\n\n        # Check the nonbonded force has the right contents\n        nonbond = [f for f in system.getForces() if isinstance(f, NonbondedForce)]\n        assert len(nonbond) == 1\n        assert nonbond[0].getNonbondedMethod() == NonbondedForce.PME\n        assert (\n            from_openmm(nonbond[0].getCutoffDistance())\n            == settings.forcefield_settings.nonbonded_cutoff\n        )\n\n        # Check the barostat made it all the way through\n        barostat = [f for f in system.getForces() if isinstance(f, barostat_type)]\n        assert len(barostat) == 1\n        expected_frequency = int(\n            (\n                settings.complex_integrator_settings\n                if phase == \"complex\"\n                else settings.solvent_integrator_settings\n            ).barostat_frequency.m\n        )\n        assert barostat[0].getFrequency() == expected_frequency\n        assert barostat[0].getDefaultPressure() == to_openmm(settings.thermo_settings.pressure)\n        assert barostat[0].getDefaultTemperature() == to_openmm(\n            settings.thermo_settings.temperature\n        )\n\n    def _assert_expected_nonalchemical_forces(self, system, phase: str, settings):\n        \"\"\"\n        Assert the forces expected in the non-alchemical system.\n        \"\"\"\n        barostat_type = self.barostat_by_phase[phase]\n        self._assert_force_num(system, NonbondedForce, 1)\n        self._assert_force_num(system, HarmonicBondForce, 1)\n        self._assert_force_num(system, HarmonicAngleForce, 1)\n        self._assert_force_num(system, PeriodicTorsionForce, 1)\n        self._assert_force_num(system, barostat_type, 1)\n\n        assert len(system.getForces()) == 5\n\n        # Check that the nonbonded force has the right contents\n        nonbond = [f for f in system.getForces() if isinstance(f, NonbondedForce)]\n        assert len(nonbond) == 1\n        assert nonbond[0].getNonbondedMethod() == NonbondedForce.PME\n        assert (\n            from_openmm(nonbond[0].getCutoffDistance())\n            == settings.forcefield_settings.nonbonded_cutoff\n        )\n\n        # Check the barostat made it all the way through\n        barostat = [f for f in system.getForces() if isinstance(f, barostat_type)]\n        assert len(barostat) == 1\n        expected_frequency = int(\n            (\n                settings.complex_integrator_settings\n                if phase == \"complex\"\n                else settings.solvent_integrator_settings\n            ).barostat_frequency.m\n        )\n        assert barostat[0].getFrequency() == expected_frequency\n\n        assert barostat[0].getDefaultPressure() == to_openmm(settings.thermo_settings.pressure)\n        assert barostat[0].getDefaultTemperature() == to_openmm(\n            settings.thermo_settings.temperature\n        )\n\n    def _verify_sampler(self, sampler, phase: str, settings):\n        \"\"\"\n        Utility to verify the contents of the sampler.\n        \"\"\"\n        assert sampler.is_periodic\n        assert isinstance(sampler, MultiStateSampler)\n        barostat_type = self.barostat_by_phase[phase]\n        assert isinstance(sampler._thermodynamic_states[0].barostat, barostat_type)\n        assert sampler._thermodynamic_states[1].pressure == to_openmm(\n            settings.thermo_settings.pressure\n        )\n        for state in sampler._thermodynamic_states:\n            system = state.get_system(remove_thermostat=True)\n            self._assert_expected_alchemical_forces(system, phase, settings)\n\n    def _check_box_vectors(self, system):\n        self._test_dodecahedron_vectors(system)\n\n    @staticmethod\n    def _test_dodecahedron_vectors(system):\n        # dodecahedron has the following shape:\n        # [width, 0, 0], [0, width, 0], [0.5, 0.5, 0.5 * sqrt(2)] * width\n\n        vectors = system.getDefaultPeriodicBoxVectors()\n        width = float(from_openmm(vectors)[0][0].to(\"nanometer\").m)\n\n        expected_vectors = [\n            [width, 0, 0],\n            [0, width, 0],\n            [0.5 * width, 0.5 * width, 0.5 * sqrt(2) * width],\n        ] * offunit.nanometer\n\n        assert_allclose(\n            expected_vectors,\n            from_openmm(vectors),\n        )\n\n    @staticmethod\n    def _test_cubic_vectors(system):\n        # cube is an identity matrix\n        vectors = system.getDefaultPeriodicBoxVectors()\n        width = float(from_openmm(vectors)[0][0].to(\"nanometer\").m)\n\n        expected_vectors = [\n            [width, 0, 0],\n            [0, width, 0],\n            [0, 0, width],\n        ] * offunit.nanometer\n\n        assert_allclose(\n            expected_vectors,\n            from_openmm(vectors),\n        )\n\n    @staticmethod\n    def _test_energies(reference_system, alchemical_system, alchemical_regions, positions):\n        compare_system_energies(\n            reference_system=reference_system,\n            alchemical_system=alchemical_system,\n            alchemical_regions=alchemical_regions,\n            positions=positions,\n        )\n\n        check_noninteracting_energy_components(\n            reference_system=reference_system,\n            alchemical_system=alchemical_system,\n            alchemical_regions=alchemical_regions,\n            positions=positions,\n        )\n\n        check_interacting_energy_components(\n            reference_system=reference_system,\n            alchemical_system=alchemical_system,\n            alchemical_regions=alchemical_regions,\n            positions=positions,\n        )\n\n    def test_complex_dry_run(self, complex_setup_units, complex_sim_units, settings, tmp_path):\n        setup_results = complex_setup_units[0].run(\n            dry=True,\n            verbose=True,\n            scratch_basepath=tmp_path,\n            shared_basepath=tmp_path,\n        )\n        sim_results = complex_sim_units[0].run(\n            system=setup_results[\"alchem_system\"],\n            positions=setup_results[\"debug_positions\"],\n            selection_indices=setup_results[\"selection_indices\"],\n            box_vectors=setup_results[\"box_vectors\"],\n            alchemical_restraints=True,\n            dry=True,\n            scratch_basepath=tmp_path,\n            shared_basepath=tmp_path,\n        )\n\n        # Check the sampler\n        self._verify_sampler(sim_results[\"sampler\"], phase=\"complex\", settings=settings)\n\n        # Check the alchemical system\n        assert setup_results[\"alchem_system\"].getNumParticles() == self.expected_complex_particles\n        self._assert_expected_alchemical_forces(\n            setup_results[\"alchem_system\"], phase=\"complex\", settings=settings\n        )\n        self._check_box_vectors(setup_results[\"alchem_system\"])\n\n        # Check the alchemical indices\n        expected_indices = [\n            i + self.num_protein_component_atoms - 1 for i in range(self.num_ligand_atoms)\n        ]\n        assert expected_indices == setup_results[\"alchem_indices\"]\n\n        # Check the non-alchemical system\n        assert setup_results[\"standard_system\"].getNumParticles() == self.expected_complex_particles\n        self._assert_expected_nonalchemical_forces(\n            setup_results[\"standard_system\"],\n            \"complex\",\n            settings=settings,\n        )\n        self._check_box_vectors(setup_results[\"standard_system\"])\n        # Check the box vectors haven't changed (they shouldn't have because we didn't do MD)\n        assert_allclose(\n            from_openmm(setup_results[\"alchem_system\"].getDefaultPeriodicBoxVectors()),\n            from_openmm(setup_results[\"standard_system\"].getDefaultPeriodicBoxVectors()),\n        )\n\n        # Check the PDB\n        pdb = mdt.load_pdb(setup_results[\"pdb_structure\"])\n        assert pdb.n_atoms == self.num_all_not_water\n\n        # Check energies\n        alchem_region = AlchemicalRegion(alchemical_atoms=setup_results[\"alchem_indices\"])\n        self._test_energies(\n            reference_system=setup_results[\"standard_system\"],\n            alchemical_system=setup_results[\"alchem_system\"],\n            alchemical_regions=alchem_region,\n            positions=setup_results[\"debug_positions\"],\n        )\n\n    def test_solvent_dry_run(self, solvent_setup_units, solvent_sim_units, settings, tmp_path):\n        setup_results = solvent_setup_units[0].run(\n            dry=True,\n            verbose=True,\n            scratch_basepath=tmp_path,\n            shared_basepath=tmp_path,\n        )\n        sim_results = solvent_sim_units[0].run(\n            system=setup_results[\"alchem_system\"],\n            positions=setup_results[\"debug_positions\"],\n            selection_indices=setup_results[\"selection_indices\"],\n            box_vectors=setup_results[\"box_vectors\"],\n            alchemical_restraints=False,\n            dry=True,\n            scratch_basepath=tmp_path,\n            shared_basepath=tmp_path,\n        )\n\n        # Check the sampler\n        self._verify_sampler(sim_results[\"sampler\"], phase=\"solvent\", settings=settings)\n\n        # Check the alchemical system\n        assert (\n            setup_results[\"alchem_system\"].getNumParticles()\n            == self.expected_ligand_solvent_particles\n        )\n        self._assert_expected_alchemical_forces(\n            setup_results[\"alchem_system\"], phase=\"solvent\", settings=settings\n        )\n        self._test_cubic_vectors(setup_results[\"alchem_system\"])\n\n        # Check the alchemical indices\n        expected_indices = [i for i in range(self.num_ligand_atoms)]\n        assert expected_indices == setup_results[\"alchem_indices\"]\n\n        # Check the non-alchemical system\n        assert (\n            setup_results[\"standard_system\"].getNumParticles()\n            == self.expected_ligand_solvent_particles\n        )\n        self._assert_expected_nonalchemical_forces(\n            setup_results[\"standard_system\"], phase=\"solvent\", settings=settings\n        )\n        self._test_cubic_vectors(setup_results[\"standard_system\"])\n\n        # Check the box vectors haven't changed (they shouldn't have because we didn't do MD)\n        assert_allclose(\n            from_openmm(setup_results[\"alchem_system\"].getDefaultPeriodicBoxVectors()),\n            from_openmm(setup_results[\"standard_system\"].getDefaultPeriodicBoxVectors()),\n        )\n\n        # Check the PDB\n        pdb = mdt.load_pdb(setup_results[\"pdb_structure\"])\n        assert pdb.n_atoms == self.num_ligand_atoms\n\n        # Check energies\n        alchem_region = AlchemicalRegion(alchemical_atoms=setup_results[\"alchem_indices\"])\n\n        self._test_energies(\n            reference_system=setup_results[\"standard_system\"],\n            alchemical_system=setup_results[\"alchem_system\"],\n            alchemical_regions=alchem_region,\n            positions=setup_results[\"debug_positions\"],\n        )\n\n\n@pytest.mark.slow\nclass TestT4LysozymeTIP4PExtraSettingsDryRun(TestT4LysozymeDryRun):\n    \"\"\"\n    TIP4P and a few extra settings to test out the dry run.\n    \"\"\"\n\n    expected_complex_particles = 42598\n    expected_ligand_solvent_particles = 4012\n\n    @pytest.fixture(scope=\"class\")\n    def settings(self):\n        s = openmm_afe.AbsoluteBindingProtocol.default_settings()\n        s.protocol_repeats = 1\n        s.engine_settings.compute_platform = \"cpu\"\n        s.complex_output_settings.output_indices = \"not water\"\n        s.complex_solvation_settings.box_shape = \"dodecahedron\"\n        s.complex_solvation_settings.solvent_padding = None\n        s.complex_solvation_settings.number_of_solvent_molecules = 10000\n        s.complex_solvation_settings.solvent_model = \"tip4pew\"\n        s.solvent_solvation_settings.box_shape = \"cube\"\n        s.solvent_solvation_settings.solvent_padding = None\n        s.solvent_solvation_settings.number_of_solvent_molecules = 1000\n        s.solvent_solvation_settings.solvent_model = \"tip4pew\"\n        s.forcefield_settings.nonbonded_cutoff = 0.8 * offunit.nanometer\n        s.forcefield_settings.forcefields = [\n            \"amber/ff14SB.xml\",  # ff14SB protein force field\n            \"amber/tip4pew_standard.xml\",  # FF we are testing with the fun VS\n            \"amber/phosaa10.xml\",  # Handles THE TPO\n        ]\n        s.complex_integrator_settings.reassign_velocities = True\n        s.solvent_integrator_settings.reassign_velocities = True\n        s.complex_integrator_settings.barostat_frequency = 100.0 * offunit.timestep\n        s.solvent_integrator_settings.barostat_frequency = 100.0 * offunit.timestep\n        s.thermo_settings.pressure = 1.1 * offunit.bar\n        return s\n\n\ndef test_user_charges(benzene_modifications, T4_protein_component, tmp_path):\n    s = openmm_afe.AbsoluteBindingProtocol.default_settings()\n    s.protocol_repeats = 1\n    s.engine_settings.compute_platform = \"cpu\"\n    s.complex_solvation_settings.box_shape = \"dodecahedron\"\n    s.complex_solvation_settings.solvent_padding = 0.8 * offunit.nanometer\n    s.forcefield_settings.nonbonded_cutoff = 0.7 * offunit.nanometer\n\n    protocol = openmm_afe.AbsoluteBindingProtocol(settings=s)\n\n    def assign_fictitious_charges(offmol):\n        \"\"\"\n        Get a random array of fake partial charges for your offmol.\n        \"\"\"\n        rand_arr = np.random.randint(1, 10, size=offmol.n_atoms) / 100\n        rand_arr[-1] = -sum(rand_arr[:-1])\n        return rand_arr * offunit.elementary_charge\n\n    benzene_offmol = benzene_modifications[\"benzene\"].to_openff()\n    offmol_pchgs = assign_fictitious_charges(benzene_offmol)\n    benzene_offmol.partial_charges = offmol_pchgs\n    benzene_smc = openfe.SmallMoleculeComponent.from_openff(benzene_offmol)\n\n    # check propchgs\n    prop_chgs = benzene_smc.to_dict()[\"molprops\"][\"atom.dprop.PartialCharge\"]\n    prop_chgs = np.array(prop_chgs.split(), dtype=float)\n    assert_allclose(prop_chgs, offmol_pchgs)\n\n    stateA = gufe.ChemicalSystem(\n        {\n            \"protein\": T4_protein_component,\n            \"benzene\": benzene_smc,\n            \"solvent\": gufe.SolventComponent(),\n        }\n    )\n\n    stateB = gufe.ChemicalSystem(\n        {\n            \"protein\": T4_protein_component,\n            \"solvent\": gufe.SolventComponent(),\n        }\n    )\n\n    dag = protocol.create(stateA=stateA, stateB=stateB, mapping=None)\n\n    complex_setup_units = _get_units(dag.protocol_units, UNIT_TYPES[\"complex\"][\"setup\"])\n\n    results = complex_setup_units[0].run(\n        dry=True,\n        scratch_basepath=tmp_path,\n        shared_basepath=tmp_path,\n    )\n\n    system_nbf = [\n        f for f in results[\"standard_system\"].getForces() if isinstance(f, NonbondedForce)\n    ][0]\n    alchem_system_nbf = [\n        f\n        for f in results[\"alchem_system\"].getForces()\n        if isinstance(f, NonbondedForce)\n    ][0]  # fmt: skip\n\n    for i in range(12):\n        # add 2613 to account for the protein\n        index = i + 2613\n\n        c, s, e = system_nbf.getParticleParameters(index)\n        assert pytest.approx(prop_chgs[i]) == c.value_in_unit(ommunit.elementary_charge)\n        offsets = alchem_system_nbf.getParticleParameterOffset(i)\n        assert pytest.approx(prop_chgs[i]) == offsets[2]\n\n\n@pytest.mark.slow\nclass TestA2AMembraneDryRun(TestT4LysozymeDryRun):\n    \"\"\"\n    A test case for a membrane.\n\n    TODO\n    ----\n    * The energies coming from this system are very high. Maybe replace with\n      a larger test case?\n    \"\"\"\n\n    solvent = SolventComponent(ion_concentration=0 * offunit.molar)\n    num_all_not_water = 16080\n    num_protein_component_atoms = 39391\n    expected_complex_particles = 39426\n    expected_ligand_solvent_particles = 3036\n\n    # No ions\n    num_ligand_atoms = 36\n    expected_ligand_solvent_particles = 3036\n\n    barostat_by_phase = {\n        \"complex\": MonteCarloMembraneBarostat,\n        \"solvent\": MonteCarloBarostat,\n    }\n\n    @pytest.fixture(scope=\"class\")\n    def settings(self):\n        s = openmm_afe.AbsoluteBindingProtocol.default_settings()\n        s.protocol_repeats = 1\n        s.engine_settings.compute_platform = \"cpu\"\n        s.complex_output_settings.output_indices = \"not water\"\n        s.solvent_solvation_settings.box_shape = \"cube\"\n        s.solvent_solvation_settings.solvent_padding = None\n        s.solvent_solvation_settings.number_of_solvent_molecules = 1000\n        return s\n\n    @pytest.fixture(scope=\"class\")\n    def dag(self, settings, a2a_ligands, a2a_protein_membrane_component):\n        stateA = ChemicalSystem(\n            {\n                \"ligand\": a2a_ligands[0],\n                \"protein\": a2a_protein_membrane_component,\n                \"solvent\": self.solvent,\n            }\n        )\n\n        stateB = ChemicalSystem(\n            {\n                \"protein\": a2a_protein_membrane_component,\n                \"solvent\": self.solvent,\n            }\n        )\n\n        adaptive_settings = AbsoluteBindingProtocol._adaptive_settings(\n            stateA=stateA,\n            stateB=stateB,\n            initial_settings=settings,\n        )\n\n        protocol = AbsoluteBindingProtocol(settings=adaptive_settings)\n\n        return protocol.create(\n            stateA=stateA,\n            stateB=stateB,\n            mapping=None,\n        )\n\n    def _check_box_vectors(self, system):\n        self._test_orthogonal_vectors(system)\n\n    @staticmethod\n    def _test_orthogonal_vectors(system):\n        \"\"\"Test that the system has an orthorhombic (rectangular) periodic box.\"\"\"\n        vectors = system.getDefaultPeriodicBoxVectors()\n        vectors = from_openmm(vectors)  # convert to a Quantity array\n\n        # Extract box lengths in nanometers\n        width_x, width_y, width_z = [v[i].to(\"nanometer\").m for i, v in enumerate(vectors)]\n\n        # Expected orthogonal box (axis-aligned)\n        expected_vectors = (\n            np.array(\n                [\n                    [width_x, 0, 0],\n                    [0, width_y, 0],\n                    [0, 0, width_z],\n                ]\n            )\n            * offunit.nanometer\n        )\n\n        assert_allclose(\n            vectors, expected_vectors, atol=1e-5, err_msg=f\"Box is not orthogonal:\\n{vectors}\"\n        )\n"
  },
  {
    "path": "src/openfe/tests/protocols/openmm_abfe/test_abfe_protocol_results.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\nimport gzip\nimport itertools\nimport json\nfrom pathlib import Path\nfrom unittest import mock\n\nimport gufe\nimport numpy as np\nimport openmm\nimport pytest\nfrom openff.units import unit as offunit\n\nimport openfe\nfrom openfe.protocols import openmm_afe\nfrom openfe.protocols.restraint_utils.geometry.boresch import BoreschRestraintGeometry\n\nfrom .utils import UNIT_TYPES, _get_units\n\n\n@pytest.fixture()\ndef patcher():\n    with (\n        mock.patch(\n            \"openfe.protocols.openmm_afe.abfe_units.ABFESolventSetupUnit.run\",\n            return_value={\n                \"system\": Path(\"system.xml.bz2\"),\n                \"positions\": Path(\"positions.npy\"),\n                \"pdb_structure\": Path(\"hybrid_system.pdb\"),\n                \"selection_indices\": np.zeros(100),\n                \"box_vectors\": [np.zeros(3), np.zeros(3), np.zeros(3)] * offunit.nm,\n                \"standard_state_correction\": 0 * offunit.kilocalorie_per_mole,\n                \"restraint_geometry\": None,\n                \"gufe_version\": gufe.__version__,\n                \"openfe_version\": openfe.__version__,\n                \"openmm_version\": openmm.__version__,\n            },\n        ),\n        mock.patch(\n            \"openfe.protocols.openmm_afe.abfe_units.ABFEComplexSetupUnit.run\",\n            return_value={\n                \"system\": Path(\"system.xml.bz2\"),\n                \"positions\": Path(\"positions.npy\"),\n                \"pdb_structure\": Path(\"hybrid_system.pdb\"),\n                \"selection_indices\": np.zeros(100),\n                \"box_vectors\": [np.zeros(3), np.zeros(3), np.zeros(3)] * offunit.nm,\n                \"standard_state_correction\": 0 * offunit.kilocalorie_per_mole,\n                \"restraint_geometry\": True,\n            },\n        ),\n        mock.patch(\n            \"openfe.protocols.openmm_afe.base_afe_units.np.load\",\n            return_value=np.zeros(100),\n        ),\n        mock.patch(\n            \"openfe.protocols.openmm_afe.base_afe_units.deserialize\",\n            return_value=\"foo\",\n        ),\n        mock.patch(\n            \"openfe.protocols.openmm_afe.abfe_units.ABFEComplexSimUnit.run\",\n            return_value={\n                \"trajectory\": Path(\"file.nc\"),\n                \"checkpoint\": Path(\"chk.chk\"),\n            },\n        ),\n        mock.patch(\n            \"openfe.protocols.openmm_afe.abfe_units.ABFESolventSimUnit.run\",\n            return_value={\n                \"trajectory\": Path(\"file.nc\"),\n                \"checkpoint\": Path(\"chk.chk\"),\n            },\n        ),\n        mock.patch(\n            \"openfe.protocols.openmm_afe.abfe_units.ABFEComplexAnalysisUnit.run\",\n            return_value={\"foo\": \"bar\"},\n        ),\n        mock.patch(\n            \"openfe.protocols.openmm_afe.abfe_units.ABFESolventAnalysisUnit.run\",\n            return_value={\"foo\": \"bar\"},\n        ),\n    ):\n        yield\n\n\ndef test_gather(benzene_complex_dag, patcher, tmp_path):\n    # check that .gather behaves as expected\n    dagres = gufe.protocols.execute_DAG(\n        benzene_complex_dag,\n        shared_basedir=tmp_path,\n        scratch_basedir=tmp_path,\n        keep_shared=True,\n    )\n\n    protocol = openmm_afe.AbsoluteBindingProtocol(\n        settings=openmm_afe.AbsoluteBindingProtocol.default_settings(),\n    )\n\n    res = protocol.gather([dagres])\n\n    assert isinstance(res, openmm_afe.AbsoluteBindingProtocolResult)\n\n\ndef test_unit_tagging(benzene_complex_dag, patcher, tmp_path):\n    # test that executing the units includes correct gen and repeat info\n\n    dag_units = benzene_complex_dag.protocol_units\n\n    for phase in [\"solvent\", \"complex\"]:\n        setup_results = {}\n        sim_results = {}\n        analysis_results = {}\n\n        setup_units = _get_units(dag_units, UNIT_TYPES[phase][\"setup\"])\n        sim_units = _get_units(dag_units, UNIT_TYPES[phase][\"sim\"])\n        a_units = _get_units(dag_units, UNIT_TYPES[phase][\"analysis\"])\n\n        for u in setup_units:\n            rid = u.inputs[\"repeat_id\"]\n            setup_results[rid] = u.execute(context=gufe.Context(tmp_path, tmp_path))\n\n        for u in sim_units:\n            rid = u.inputs[\"repeat_id\"]\n            sim_results[rid] = u.execute(\n                context=gufe.Context(tmp_path, tmp_path),\n                setup_results=setup_results[rid],\n            )\n\n        for u in a_units:\n            rid = u.inputs[\"repeat_id\"]\n            analysis_results[rid] = u.execute(\n                context=gufe.Context(tmp_path, tmp_path),\n                setup_results=setup_results[rid],\n                simulation_results=sim_results[rid],\n            )\n\n        for results in [setup_results, sim_results, analysis_results]:\n            for ret in results.values():\n                assert isinstance(ret, gufe.ProtocolUnitResult)\n                assert ret.outputs[\"generation\"] == 0\n\n        assert len(setup_results) == len(sim_results) == len(analysis_results) == 3\n\n\nclass TestProtocolResult:\n    @pytest.fixture()\n    def protocolresult(self, abfe_transformation_json_path):\n        with gzip.open(abfe_transformation_json_path) as f:\n            pr = openfe.ProtocolResult.from_json(f)\n\n        return pr\n\n    def test_reload_protocol_result(self, afe_solv_transformation_json):\n        d = json.loads(afe_solv_transformation_json, cls=gufe.tokenization.JSON_HANDLER.decoder)\n\n        pr = openmm_afe.AbsoluteBindingProtocolResult.from_dict(d[\"protocol_result\"])\n\n        assert pr\n\n    def test_get_estimate(self, protocolresult):\n        est = protocolresult.get_estimate()\n\n        assert est\n        assert est.m == pytest.approx(-19.74, abs=0.01)\n        assert isinstance(est, offunit.Quantity)\n        assert est.is_compatible_with(offunit.kilojoule_per_mole)\n\n    def test_get_uncertainty(self, protocolresult):\n        est = protocolresult.get_uncertainty()\n\n        assert est\n        assert est.m == pytest.approx(0.85, abs=0.01)\n        assert isinstance(est, offunit.Quantity)\n        assert est.is_compatible_with(offunit.kilojoule_per_mole)\n\n    def test_get_individual(self, protocolresult):\n        inds = protocolresult.get_individual_estimates()\n\n        assert isinstance(inds, dict)\n        assert isinstance(inds[\"solvent\"], list)\n        assert isinstance(inds[\"complex\"], list)\n        assert len(inds[\"solvent\"]) == len(inds[\"complex\"]) == 3\n        for e, u in itertools.chain(inds[\"solvent\"], inds[\"complex\"]):\n            assert e.is_compatible_with(offunit.kilojoule_per_mole)\n            assert u.is_compatible_with(offunit.kilojoule_per_mole)\n\n    @pytest.mark.parametrize(\"key\", [\"solvent\", \"complex\"])\n    def test_get_forwards_etc(self, key, protocolresult):\n        far = protocolresult.get_forward_and_reverse_energy_analysis()\n\n        assert isinstance(far, dict)\n        assert isinstance(far[key], list)\n\n        for f in far[key]:\n            if f is not None:\n                assert isinstance(f, dict)\n\n                for k in [\n                    \"fractions\",\n                    \"forward_DGs\",\n                    \"forward_dDGs\",\n                    \"reverse_DGs\",\n                    \"reverse_dDGs\",\n                ]:\n                    assert k in f\n\n                    if k == \"fractions\":\n                        assert isinstance(f[k], np.ndarray)\n\n    @pytest.mark.parametrize(\"key\", [\"solvent\", \"complex\"])\n    def test_get_frwd_reverse_none_return(self, key, protocolresult):\n        # fetch the first result of type key\n        data = [i for i in protocolresult.data[key].values()][0][0]\n        # set the output to None\n        data.outputs[\"forward_and_reverse_energies\"] = None\n\n        # now fetch the analysis results and expect a warning\n        wmsg = f\"were found in the forward and reverse dictionaries of the repeats of the {key}\"\n        with pytest.warns(UserWarning, match=wmsg):\n            protocolresult.get_forward_and_reverse_energy_analysis()\n\n    @pytest.mark.parametrize(\"key, n_rep\", [(\"solvent\", 14), (\"complex\", 30)])\n    def test_get_overlap_matrices(self, key, n_rep, protocolresult):\n        ovp = protocolresult.get_overlap_matrices()\n\n        assert isinstance(ovp, dict)\n        assert isinstance(ovp[key], list)\n        assert len(ovp[key]) == 3\n\n        ovp1 = ovp[key][0]\n        assert isinstance(ovp1[\"matrix\"], np.ndarray)\n        assert ovp1[\"matrix\"].shape == (n_rep, n_rep)\n\n    @pytest.mark.parametrize(\"key, n_rep\", [(\"solvent\", 14), (\"complex\", 30)])\n    def test_get_replica_transition_statistics(self, n_rep, key, protocolresult):\n        rpx = protocolresult.get_replica_transition_statistics()\n\n        assert isinstance(rpx, dict)\n        assert isinstance(rpx[key], list)\n        assert len(rpx[key]) == 3\n        rpx1 = rpx[key][0]\n        assert \"eigenvalues\" in rpx1\n        assert \"matrix\" in rpx1\n        assert rpx1[\"eigenvalues\"].shape == (n_rep,)\n        assert rpx1[\"matrix\"].shape == (n_rep, n_rep)\n\n    @pytest.mark.parametrize(\"key\", [\"solvent\", \"complex\"])\n    def test_equilibration_iterations(self, key, protocolresult):\n        eq = protocolresult.equilibration_iterations()\n\n        assert isinstance(eq, dict)\n        assert isinstance(eq[key], list)\n        assert len(eq[key]) == 3\n        assert all(isinstance(v, float) for v in eq[key])\n\n    @pytest.mark.parametrize(\"key\", [\"solvent\", \"complex\"])\n    def test_production_iterations(self, key, protocolresult):\n        prod = protocolresult.production_iterations()\n\n        assert isinstance(prod, dict)\n        assert isinstance(prod[key], list)\n        assert len(prod[key]) == 3\n        assert all(isinstance(v, float) for v in prod[key])\n\n    def test_filenotfound_replica_states(self, protocolresult):\n        errmsg = \"File could not be found\"\n\n        with pytest.raises(ValueError, match=errmsg):\n            protocolresult.get_replica_states()\n\n    def test_restraint_geometry(self, protocolresult):\n        geom = protocolresult.restraint_geometries()\n        assert isinstance(geom, list)\n        assert len(geom) == 3\n        assert isinstance(geom[0], BoreschRestraintGeometry)\n        assert geom[0].guest_atoms == [1779, 1778, 1777]\n        assert geom[0].host_atoms == [852, 853, 854]\n        assert pytest.approx(geom[0].r_aA0, rel=1e-2) == 1.041035 * offunit.nanometer\n        assert pytest.approx(geom[0].theta_A0, rel=1e-2) == 1.063788 * offunit.radian\n        assert pytest.approx(geom[0].theta_B0, rel=1e-2) == 1.230858 * offunit.radian\n        assert pytest.approx(geom[0].phi_A0, rel=1e-2) == 1.155133 * offunit.radian\n        assert pytest.approx(geom[0].phi_B0, rel=1e-2) == 1.141134 * offunit.radian\n        assert pytest.approx(geom[0].phi_C0, rel=1e-2) == -0.621615 * offunit.radian\n\n    @pytest.mark.parametrize(\n        \"key, expected_size\",\n        [\n            [\"solvent\", 41],\n            [\"complex\", 1828],\n        ],\n    )\n    def test_selection_indices(self, key, protocolresult, expected_size):\n        indices = protocolresult.selection_indices()\n\n        assert isinstance(indices, dict)\n        assert isinstance(indices[key], list)\n        for inds in indices[key]:\n            assert isinstance(inds, np.ndarray)\n            assert len(inds) == expected_size\n"
  },
  {
    "path": "src/openfe/tests/protocols/openmm_abfe/test_abfe_settings.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\nimport pytest\n\nfrom openfe import ChemicalSystem, SolventComponent\nfrom openfe.protocols.openmm_afe import (\n    AbsoluteBindingProtocol,\n    AbsoluteBindingSettings,\n)\n\n\n@pytest.fixture()\ndef default_settings():\n    return AbsoluteBindingProtocol.default_settings()\n\n\ndef test_create_default_settings():\n    settings = AbsoluteBindingProtocol.default_settings()\n    assert settings\n\n\ndef test_negative_repeats_settings(default_settings):\n    with pytest.raises(ValueError, match=\"protocol_repeats must be a positive\"):\n        default_settings.protocol_repeats = -1\n\n\n@pytest.mark.parametrize(\n    \"val\",\n    [\n        {\"elec\": [0.0, -1], \"vdw\": [0.0, 1.0], \"restraints\": [0.0, 1.0]},\n        {\"elec\": [0.0, 1.5], \"vdw\": [0.0, 1.5], \"restraints\": [-0.1, 1.0]},\n    ],\n)\ndef test_incorrect_window_settings(val, default_settings):\n    errmsg = \"Lambda windows must be between 0 and 1.\"\n    lambda_settings = default_settings.complex_lambda_settings\n    with pytest.raises(ValueError, match=errmsg):\n        lambda_settings.lambda_elec = val[\"elec\"]\n        lambda_settings.lambda_vdw = val[\"vdw\"]\n        lambda_settings.lambda_restraints = val[\"restraints\"]\n\n\n@pytest.mark.parametrize(\n    \"val\",\n    [\n        {\n            \"elec\": [0.0, 0.1, 0.0],\n            \"vdw\": [0.0, 1.0, 1.0],\n            \"restraints\": [0.0, 1.0, 1.0],\n        },\n        {\n            \"elec\": [0.0, 0.1, 0.2],\n            \"vdw\": [0.0, 1.0, 0.2],\n            \"restraints\": [0.0, 1.0, 1.0],\n        },\n        {\n            \"elec\": [0.0, 0.1, 0.2],\n            \"vdw\": [0.0, 1.0, 1.0],\n            \"restraints\": [0.0, 1.0, 0.0],\n        },\n    ],\n)\ndef test_monotonic_lambda_windows(val, default_settings):\n    errmsg = \"The lambda schedule is not monotonic.\"\n    lambda_settings = default_settings.complex_lambda_settings\n\n    with pytest.raises(ValueError, match=errmsg):\n        lambda_settings.lambda_elec = val[\"elec\"]\n        lambda_settings.lambda_vdw = val[\"vdw\"]\n        lambda_settings.lambda_restraints = val[\"restraints\"]\n\n\ndef test_equil_not_all_complex(default_settings):\n    with pytest.raises(ValueError, match=\"output_indices must be all\"):\n        default_settings.complex_equil_output_settings.output_indices = \"not water\"\n\n\ndef test_equil_not_all_solvent(default_settings):\n    with pytest.raises(ValueError, match=\"output_indices must be all\"):\n        default_settings.solvent_equil_output_settings.output_indices = \"not water\"\n\n\ndef test_adaptive_settings_no_protein_membrane(toluene_complex_system, default_settings):\n    settings = AbsoluteBindingProtocol._adaptive_settings(\n        toluene_complex_system,\n        toluene_complex_system,\n        default_settings,\n    )\n\n    assert isinstance(settings, AbsoluteBindingSettings)\n    # Should use default barostat since no ProteinMembraneComponent\n    assert settings.complex_integrator_settings.barostat == \"MonteCarloBarostat\"\n\n\ndef test_adaptive_settings_with_protein_membrane(a2a_protein_membrane_component, a2a_ligands):\n    stateA = ChemicalSystem(\n        {\n            \"ligandA\": a2a_ligands[0],\n            \"protein\": a2a_protein_membrane_component,\n            \"solvent\": SolventComponent(),\n        }\n    )\n\n    settings = AbsoluteBindingProtocol._adaptive_settings(stateA, stateA)\n    assert isinstance(settings, AbsoluteBindingSettings)\n    # Barostat should have been updated\n    assert settings.complex_integrator_settings.barostat == \"MonteCarloMembraneBarostat\"\n"
  },
  {
    "path": "src/openfe/tests/protocols/openmm_abfe/test_abfe_slow.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\nimport pathlib\n\nimport pytest\nfrom openff.units import unit as offunit\n\nimport openfe\nfrom openfe.protocols.openmm_afe import AbsoluteBindingProtocol\nfrom openfe.protocols.openmm_utils.charge_generation import HAS_NAGL, HAS_OPENEYE\n\n\n@pytest.mark.integration\n@pytest.mark.flaky(reruns=3)  # pytest-rerunfailures; we can get bad minimisation\n@pytest.mark.skipif(not HAS_NAGL, reason=\"need NAGL\")\n@pytest.mark.skipif(\n    HAS_OPENEYE and HAS_NAGL,\n    reason=\"NAGL/openeye incompatibility. See https://github.com/openforcefield/openff-nagl/issues/177\",\n)\n@pytest.mark.parametrize(\"platform\", [\"CUDA\"])\ndef test_openmm_run_engine(\n    platform,\n    available_platforms,\n    eg5_protein,\n    eg5_ligands,\n    eg5_cofactor,\n    tmp_path,\n):\n    if platform not in available_platforms:\n        pytest.skip(f\"OpenMM Platform: {platform} not available\")\n\n    settings = AbsoluteBindingProtocol.default_settings()\n\n    # Run a really short calculation to check everything is going well\n    settings.protocol_repeats = 1\n    settings.engine_settings.compute_platform = \"CUDA\"\n\n    # Solvent\n    settings.solvent_equil_simulation_settings.equilibration_length_nvt = 10 * offunit.picosecond\n    settings.solvent_equil_simulation_settings.equilibration_length = 10 * offunit.picosecond\n    settings.solvent_equil_simulation_settings.production_length = 10 * offunit.picosecond\n    settings.solvent_simulation_settings.equilibration_length = 50 * offunit.picosecond\n    settings.solvent_simulation_settings.production_length = 125 * offunit.picosecond\n    settings.solvent_simulation_settings.early_termination_target_error = 0.12 * offunit.kilocalorie_per_mole  # fmt: skip\n    settings.solvent_simulation_settings.time_per_iteration = 2.5 * offunit.ps\n    settings.solvent_solvation_settings.box_shape = \"dodecahedron\"\n    settings.solvent_solvation_settings.solvent_padding = 1.5 * offunit.nanometer\n\n    # Complex\n    settings.complex_equil_simulation_settings.equilibration_length_nvt = 10 * offunit.picosecond\n    settings.complex_equil_simulation_settings.equilibration_length = 10 * offunit.picosecond\n    settings.complex_equil_simulation_settings.production_length = 100 * offunit.picosecond\n    settings.complex_simulation_settings.equilibration_length = 50 * offunit.picosecond\n    settings.complex_simulation_settings.production_length = 125 * offunit.picosecond\n    settings.complex_simulation_settings.early_termination_target_error = 0.12 * offunit.kilocalorie_per_mole  # fmt: skip\n    settings.complex_simulation_settings.time_per_iteration = 2.5 * offunit.ps\n    settings.complex_solvation_settings.box_shape = \"dodecahedron\"\n    settings.complex_solvation_settings.solvent_padding = 0.9 * offunit.nanometer\n\n    # General FF things\n    settings.forcefield_settings.nonbonded_cutoff = 0.8 * offunit.nanometer\n    settings.partial_charge_settings.partial_charge_method = \"nagl\"\n    settings.partial_charge_settings.nagl_model = \"openff-gnn-am1bcc-0.1.0-rc.3.pt\"\n\n    protocol = AbsoluteBindingProtocol(settings=settings)\n\n    # unpack ligands\n    ligand, _ = eg5_ligands\n\n    stateA = openfe.ChemicalSystem(\n        {\n            \"protein\": eg5_protein,\n            \"cofactor\": eg5_cofactor,\n            \"ligand\": ligand,\n            \"solvent\": openfe.SolventComponent(),\n        }\n    )\n\n    stateB = openfe.ChemicalSystem(\n        {\n            \"protein\": eg5_protein,\n            \"cofactor\": eg5_cofactor,\n            \"solvent\": openfe.SolventComponent(),\n        }\n    )\n\n    # Create DAG from protocol, get the vacuum and solvent units\n    # and eventually dry run the first solvent unit\n    dag = protocol.create(\n        stateA=stateA,\n        stateB=stateB,\n        mapping=None,\n    )\n\n    cwd = pathlib.Path(tmp_path)\n    r = openfe.execute_DAG(dag, shared_basedir=cwd, scratch_basedir=cwd, keep_shared=True)\n\n    assert r.ok()\n\n    # Check outputs of solvent & complex results\n    for phase in [\"solvent\", \"complex\"]:\n        purs = [pur for pur in r.protocol_unit_results if pur.outputs[\"simtype\"] == phase]\n\n        # get the path to the simulation unit shared dict\n        for pur in purs:\n            if \"Simulation\" in pur.name:\n                sim_shared = tmp_path / f\"shared_{pur.source_key}_attempt_0\"\n                assert sim_shared.exists()\n                assert pathlib.Path(sim_shared).is_dir()\n\n        # check the analysis outputs\n        for pur in purs:\n            if \"Analysis\" not in pur.name:\n                continue\n\n            unit_shared = tmp_path / f\"shared_{pur.source_key}_attempt_0\"\n            assert unit_shared.exists()\n            assert pathlib.Path(unit_shared).is_dir()\n\n            # Does the checkpoint file exist?\n            checkpoint = pur.outputs[\"checkpoint\"]\n            assert checkpoint == sim_shared / f\"{pur.outputs['simtype']}_checkpoint.nc\"\n            assert checkpoint.exists()\n\n            # Does the trajectory file exist?\n            nc = pur.outputs[\"trajectory\"]\n            assert nc == sim_shared / f\"{pur.outputs['simtype']}.nc\"\n            assert nc.exists()\n\n    # Test results methods that need files present\n    results = protocol.gather([r])\n    states = results.get_replica_states()\n    assert len(states.items()) == 2\n    assert len(states[\"solvent\"]) == 1\n    assert len(states[\"complex\"]) == 1\n    assert states[\"solvent\"][0].shape[1] == 14\n    assert states[\"complex\"][0].shape[1] == 30\n"
  },
  {
    "path": "src/openfe/tests/protocols/openmm_abfe/test_abfe_tokenization.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\nimport gzip\n\nimport pytest\n\nimport openfe\nfrom openfe.protocols.openmm_afe import (\n    ABFEComplexAnalysisUnit,\n    ABFEComplexSetupUnit,\n    ABFEComplexSimUnit,\n    ABFESolventAnalysisUnit,\n    ABFESolventSetupUnit,\n    ABFESolventSimUnit,\n    AbsoluteBindingProtocol,\n    AbsoluteBindingProtocolResult,\n)\n\nfrom ..conftest import ModGufeTokenizableTestsMixin\n\n\n@pytest.fixture\ndef protocol():\n    return AbsoluteBindingProtocol(AbsoluteBindingProtocol.default_settings())\n\n\n@pytest.fixture\ndef protocol_units(protocol, benzene_complex_system, T4_protein_component):\n    stateA = benzene_complex_system\n    stateB = openfe.ChemicalSystem(\n        {\"protein\": T4_protein_component, \"solvent\": openfe.SolventComponent()}\n    )\n    pus = protocol.create(\n        stateA=stateA,\n        stateB=stateB,\n        mapping=None,\n    )\n    return list(pus.protocol_units)\n\n\ndef _filter_units(pus, classtype):\n    for pu in pus:\n        if isinstance(pu, classtype):\n            return pu\n\n\n@pytest.fixture\ndef complex_protocol_setup_unit(protocol_units):\n    return _filter_units(protocol_units, ABFEComplexSetupUnit)\n\n\n@pytest.fixture\ndef complex_protocol_sim_unit(protocol_units):\n    return _filter_units(protocol_units, ABFEComplexSimUnit)\n\n\n@pytest.fixture\ndef complex_protocol_analysis_unit(protocol_units):\n    return _filter_units(protocol_units, ABFEComplexAnalysisUnit)\n\n\n@pytest.fixture\ndef solvent_protocol_setup_unit(protocol_units):\n    return _filter_units(protocol_units, ABFESolventSetupUnit)\n\n\n@pytest.fixture\ndef solvent_protocol_sim_unit(protocol_units):\n    return _filter_units(protocol_units, ABFESolventSimUnit)\n\n\n@pytest.fixture\ndef solvent_protocol_analysis_unit(protocol_units):\n    return _filter_units(protocol_units, ABFESolventAnalysisUnit)\n\n\n@pytest.fixture\ndef protocol_result(abfe_transformation_json_path):\n    with gzip.open(abfe_transformation_json_path) as f:\n        pr = AbsoluteBindingProtocolResult.from_json(f)\n    return pr\n\n\nclass TestAbsoluteBindingProtocol(ModGufeTokenizableTestsMixin):\n    cls = AbsoluteBindingProtocol\n    key = None\n    repr = \"AbsoluteBindingProtocol-\"\n\n    @pytest.fixture()\n    def instance(self, protocol):\n        return protocol\n\n\nclass TestABFESolventSetupUnit(ModGufeTokenizableTestsMixin):\n    cls = ABFESolventSetupUnit\n    repr = \"ABFESolventSetupUnit(ABFE Setup: benzene solvent leg\"\n    key = None\n\n    @pytest.fixture()\n    def instance(self, solvent_protocol_setup_unit):\n        return solvent_protocol_setup_unit\n\n\nclass TestABFESolventSimUnit(ModGufeTokenizableTestsMixin):\n    cls = ABFESolventSimUnit\n    repr = \"ABFESolventSimUnit(ABFE Simulation: benzene solvent leg\"\n    key = None\n\n    @pytest.fixture()\n    def instance(self, solvent_protocol_sim_unit):\n        return solvent_protocol_sim_unit\n\n\nclass TestABFESolventAnalysisUnit(ModGufeTokenizableTestsMixin):\n    cls = ABFESolventAnalysisUnit\n    repr = \"ABFESolventAnalysisUnit(ABFE Analysis: benzene solvent leg\"\n    key = None\n\n    @pytest.fixture()\n    def instance(self, solvent_protocol_analysis_unit):\n        return solvent_protocol_analysis_unit\n\n\nclass TestABFEComplexSetupUnit(ModGufeTokenizableTestsMixin):\n    cls = ABFEComplexSetupUnit\n    repr = \"ABFEComplexSetupUnit(ABFE Setup: benzene complex leg\"\n    key = None\n\n    @pytest.fixture()\n    def instance(self, complex_protocol_setup_unit):\n        return complex_protocol_setup_unit\n\n\nclass TestABFEComplexSimUnit(ModGufeTokenizableTestsMixin):\n    cls = ABFEComplexSimUnit\n    repr = \"ABFEComplexSimUnit(ABFE Simulation: benzene complex leg\"\n    key = None\n\n    @pytest.fixture()\n    def instance(self, complex_protocol_sim_unit):\n        return complex_protocol_sim_unit\n\n\nclass TestABFEComplexAnalysisUnit(ModGufeTokenizableTestsMixin):\n    cls = ABFEComplexAnalysisUnit\n    repr = \"ABFEComplexAnalysisUnit(ABFE Analysis: benzene complex leg\"\n    key = None\n\n    @pytest.fixture()\n    def instance(self, complex_protocol_analysis_unit):\n        return complex_protocol_analysis_unit\n\n\nclass TestAbsoluteBindingProtocolResult(ModGufeTokenizableTestsMixin):\n    cls = AbsoluteBindingProtocolResult\n    key = None\n    repr = \"AbsoluteBindingProtocolResult-\"\n\n    @pytest.fixture()\n    def instance(self, protocol_result):\n        return protocol_result\n"
  },
  {
    "path": "src/openfe/tests/protocols/openmm_abfe/test_abfe_validation.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\nimport pytest\nfrom gufe import LigandAtomMapping, ProtocolDAGResult\n\nfrom openfe import ChemicalSystem, SolventComponent\nfrom openfe.protocols.openmm_afe import (\n    AbsoluteBindingProtocol,\n)\n\n\n@pytest.fixture()\ndef default_settings():\n    return AbsoluteBindingProtocol.default_settings()\n\n\n@pytest.mark.parametrize(\n    \"val\",\n    [\n        {\"elec\": [0.0, 1.0], \"vdw\": [1.0, 1.0], \"restraints\": [0.0, 0.0]},\n    ],\n)\ndef test_validate_complex_lambda_schedule_naked_charge(val, default_settings):\n    errmsg = (\n        \"There are states along this lambda schedule \"\n        \"where there are atoms with charges but no LJ \"\n        f\"interactions: lambda 0: \"\n        f\"elec {val['elec'][0]} vdW {val['vdw'][0]}\"\n    )\n    default_settings.complex_lambda_settings.lambda_elec = val[\"elec\"]\n    default_settings.complex_lambda_settings.lambda_vdw = val[\"vdw\"]\n    default_settings.complex_lambda_settings.lambda_restraints = val[\"restraints\"]\n    default_settings.complex_simulation_settings.n_replicas = 2\n    with pytest.raises(ValueError, match=errmsg):\n        AbsoluteBindingProtocol._validate_lambda_schedule(\n            default_settings.complex_lambda_settings,\n            default_settings.complex_simulation_settings,\n        )\n\n\n@pytest.mark.parametrize(\n    \"val\",\n    [\n        {\"elec\": [0.0, 1.0], \"vdw\": [1.0, 1.0], \"restraints\": [0.0, 0.0]},\n    ],\n)\ndef test_validate_solvent_lambda_schedule_naked_charge(val, default_settings):\n    errmsg = (\n        \"There are states along this lambda schedule \"\n        \"where there are atoms with charges but no LJ \"\n        f\"interactions: lambda 0: \"\n        f\"elec {val['elec'][0]} vdW {val['vdw'][0]}\"\n    )\n    default_settings.solvent_lambda_settings.lambda_elec = val[\"elec\"]\n    default_settings.solvent_lambda_settings.lambda_vdw = val[\"vdw\"]\n    default_settings.solvent_lambda_settings.lambda_restraints = val[\"restraints\"]\n    default_settings.solvent_simulation_settings.n_replicas = 2\n    with pytest.raises(ValueError, match=errmsg):\n        AbsoluteBindingProtocol._validate_lambda_schedule(\n            default_settings.solvent_lambda_settings,\n            default_settings.solvent_simulation_settings,\n        )\n\n\n@pytest.mark.parametrize(\n    \"val\",\n    [\n        {\"elec\": [1.0, 1.0], \"vdw\": [0.0, 1.0], \"restraints\": [0.0, 1.0]},\n    ],\n)\ndef test_validate_lambda_schedule_nreplicas(val, default_settings):\n    # Only testing complex since it'll be the same for solvent\n    default_settings.complex_lambda_settings.lambda_elec = val[\"elec\"]\n    default_settings.complex_lambda_settings.lambda_vdw = val[\"vdw\"]\n    default_settings.complex_lambda_settings.lambda_restraints = val[\"restraints\"]\n    n_replicas = 3\n    default_settings.complex_simulation_settings.n_replicas = n_replicas\n    errmsg = (\n        f\"Number of replicas {n_replicas} does not equal the\"\n        f\" number of lambda windows {len(val['vdw'])}\"\n    )\n    with pytest.raises(ValueError, match=errmsg):\n        AbsoluteBindingProtocol._validate_lambda_schedule(\n            default_settings.complex_lambda_settings,\n            default_settings.complex_simulation_settings,\n        )\n\n\n@pytest.mark.parametrize(\n    \"val\",\n    [\n        {\"elec\": [1.0, 1.0, 1.0], \"vdw\": [0.0, 1.0], \"restraints\": [1.0, 1.0]},\n    ],\n)\ndef test_validate_lambda_schedule_nwindows(val, default_settings):\n    # Only testing complex since it'll be the same for solvent\n    default_settings.complex_lambda_settings.lambda_elec = val[\"elec\"]\n    default_settings.complex_lambda_settings.lambda_vdw = val[\"vdw\"]\n    default_settings.complex_lambda_settings.lambda_restraints = val[\"restraints\"]\n    n_replicas = 3\n    default_settings.complex_simulation_settings.n_replicas = n_replicas\n    errmsg = (\n        \"Components elec, vdw, and restraints must have equal amount\"\n        f\" of lambda windows. Got {len(val['elec'])} elec lambda\"\n        f\" windows, {len(val['vdw'])} vdw lambda windows, and\"\n        f\"{len(val['restraints'])} restraints lambda windows.\"\n    )\n    with pytest.raises(ValueError, match=errmsg):\n        AbsoluteBindingProtocol._validate_lambda_schedule(\n            default_settings.complex_lambda_settings,\n            default_settings.complex_simulation_settings,\n        )\n\n\ndef test_validate_no_protcomp(\n    benzene_modifications,\n):\n    stateA = ChemicalSystem(\n        {\"benzene\": benzene_modifications[\"benzene\"], \"solvent\": SolventComponent()}\n    )\n\n    stateB = ChemicalSystem(\n        {\n            \"benzene\": benzene_modifications[\"benzene\"],\n            \"solvent\": SolventComponent(),\n        }\n    )\n\n    errmsg = \"No ProteinComponent found\"\n    with pytest.raises(ValueError, match=errmsg):\n        AbsoluteBindingProtocol._validate_endstates(stateA, stateB)\n\n\ndef test_validate_endstates_nosolvcomp_stateA(benzene_modifications, T4_protein_component):\n    stateA = ChemicalSystem(\n        {\n            \"benzene\": benzene_modifications[\"benzene\"],\n            \"protein\": T4_protein_component,\n        }\n    )\n\n    stateB = ChemicalSystem(\n        {\n            \"benzene\": benzene_modifications[\"benzene\"],\n            \"protein\": T4_protein_component,\n            \"solvent\": SolventComponent(),\n        }\n    )\n\n    with pytest.raises(ValueError, match=\"No SolventComponent found\"):\n        AbsoluteBindingProtocol._validate_endstates(stateA, stateB)\n\n\ndef test_validate_endstates_nosolvcomp_stateB(benzene_modifications, T4_protein_component):\n    stateA = ChemicalSystem(\n        {\n            \"benzene\": benzene_modifications[\"benzene\"],\n            \"protein\": T4_protein_component,\n            \"solvent\": SolventComponent(),\n        }\n    )\n\n    stateB = ChemicalSystem(\n        {\n            \"benzene\": benzene_modifications[\"benzene\"],\n            \"protein\": T4_protein_component,\n        }\n    )\n\n    with pytest.raises(ValueError, match=\"No SolventComponent found\"):\n        AbsoluteBindingProtocol._validate_endstates(stateA, stateB)\n\n\ndef test_validate_endstates_multiple_uniqueA(benzene_modifications, T4_protein_component):\n    stateA = ChemicalSystem(\n        {\n            \"benzene\": benzene_modifications[\"benzene\"],\n            \"toluene\": benzene_modifications[\"toluene\"],\n            \"protein\": T4_protein_component,\n            \"solvlent\": SolventComponent(),\n        }\n    )\n\n    stateB = ChemicalSystem(\n        {\n            \"protein\": T4_protein_component,\n            \"solvent\": SolventComponent(),\n        }\n    )\n\n    with pytest.raises(ValueError, match=\"Only one alchemical species\"):\n        AbsoluteBindingProtocol._validate_endstates(stateA, stateB)\n\n\ndef test_validate_solvent_endstates_solvent_dissapearing(\n    benzene_modifications, T4_protein_component\n):\n    stateA = ChemicalSystem(\n        {\n            \"benzene\": benzene_modifications[\"benzene\"],\n            \"protein\": T4_protein_component,\n            \"foo\": SolventComponent(smiles=\"C\"),\n            \"solvent\": SolventComponent(),\n        }\n    )\n\n    stateB = ChemicalSystem(\n        {\n            \"benzene\": benzene_modifications[\"benzene\"],\n            \"protein\": T4_protein_component,\n            \"solvent\": SolventComponent(),\n        }\n    )\n\n    errmsg = \"Only disappearing small molecule components\"\n    with pytest.raises(ValueError, match=errmsg):\n        AbsoluteBindingProtocol._validate_endstates(stateA, stateB)\n\n\ndef test_validate_endstates_unique_stateB(benzene_modifications, T4_protein_component):\n    stateA = ChemicalSystem(\n        {\n            \"benzene\": benzene_modifications[\"benzene\"],\n            \"protein\": T4_protein_component,\n            \"solvent\": SolventComponent(),\n        }\n    )\n\n    stateB = ChemicalSystem(\n        {\n            \"toluene\": benzene_modifications[\"toluene\"],\n            \"protein\": T4_protein_component,\n            \"solvent\": SolventComponent(),\n        }\n    )\n\n    with pytest.raises(ValueError, match=\"appearing in state B\"):\n        AbsoluteBindingProtocol._validate_endstates(stateA, stateB)\n\n\ndef test_charged_endstate(charged_benzene_modifications, T4_protein_component):\n    stateA = ChemicalSystem(\n        {\n            \"benzene\": charged_benzene_modifications[\"benzoic_acid\"],\n            \"protein\": T4_protein_component,\n            \"solvent\": SolventComponent(),\n        }\n    )\n\n    stateB = ChemicalSystem(\n        {\n            \"protein\": T4_protein_component,\n            \"solvent\": SolventComponent(),\n        }\n    )\n\n    errmsg = \"Charged alchemical molecules are not currently supported\"\n    with pytest.raises(ValueError, match=errmsg):\n        AbsoluteBindingProtocol._validate_endstates(stateA, stateB)\n\n\ndef test_validate_fail_extends(benzene_modifications, T4_protein_component, default_settings):\n    stateA = ChemicalSystem(\n        {\n            \"benzene\": benzene_modifications[\"benzene\"],\n            \"protein\": T4_protein_component,\n            \"solvent\": SolventComponent(),\n        }\n    )\n\n    stateB = ChemicalSystem(\n        {\n            \"protein\": T4_protein_component,\n            \"solvent\": SolventComponent(),\n        }\n    )\n\n    prot = AbsoluteBindingProtocol(settings=default_settings)\n    fake_result = ProtocolDAGResult(\n        protocol_units=[], protocol_unit_results=[], transformation_key=\"foo\"\n    )\n\n    with pytest.raises(ValueError, match=\"extend simulations\"):\n        prot.validate(stateA=stateA, stateB=stateB, mapping=None, extends=fake_result)\n\n\ndef test_high_timestep(benzene_modifications, T4_protein_component):\n    s = AbsoluteBindingProtocol.default_settings()\n    s.forcefield_settings.hydrogen_mass = 1.0\n\n    stateA = ChemicalSystem(\n        {\n            \"benzene\": benzene_modifications[\"benzene\"],\n            \"protein\": T4_protein_component,\n            \"solvent\": SolventComponent(),\n        }\n    )\n\n    stateB = ChemicalSystem(\n        {\n            \"protein\": T4_protein_component,\n            \"solvent\": SolventComponent(),\n        }\n    )\n\n    protocol = AbsoluteBindingProtocol(settings=s)\n\n    with pytest.raises(ValueError, match=\"too large for hydrogen\"):\n        protocol.validate(stateA=stateA, stateB=stateB, mapping=None)\n\n\ndef test_validate_warnings(benzene_modifications, T4_protein_component, default_settings):\n    stateA = ChemicalSystem(\n        {\n            \"benzene\": benzene_modifications[\"benzene\"],\n            \"protein\": T4_protein_component,\n            \"solvent\": SolventComponent(),\n        }\n    )\n\n    stateB = ChemicalSystem(\n        {\n            \"protein\": T4_protein_component,\n            \"solvent\": SolventComponent(),\n        }\n    )\n\n    mapping = LigandAtomMapping(\n        componentA=benzene_modifications[\"benzene\"],\n        componentB=benzene_modifications[\"benzene\"],\n        componentA_to_componentB={},\n    )\n\n    # one the complex restraints\n    default_settings.complex_lambda_settings.lambda_restraints = [\n        0 for _ in default_settings.complex_lambda_settings.lambda_restraints\n    ]\n\n    # add a restraint in solvent\n    default_settings.solvent_lambda_settings.lambda_restraints[-1] = 0.9\n\n    prot = AbsoluteBindingProtocol(settings=default_settings)\n\n    with pytest.warns(UserWarning) as record:\n        prot.validate(stateA=stateA, stateB=stateB, mapping=mapping, extends=None)\n\n    assert len(record) == 3\n    assert \"mapping was passed\" in str(record[0].message)\n    assert \"being applied in the complex\" in str(record[1].message)\n    assert \"add restraints in the solvent\" in str(record[2].message)\n"
  },
  {
    "path": "src/openfe/tests/protocols/openmm_abfe/utils.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\nfrom openfe.protocols.openmm_afe.abfe_units import (\n    ABFEComplexAnalysisUnit,\n    ABFEComplexSetupUnit,\n    ABFEComplexSimUnit,\n    ABFESolventAnalysisUnit,\n    ABFESolventSetupUnit,\n    ABFESolventSimUnit,\n)\n\nUNIT_TYPES = {\n    \"solvent\": {\n        \"setup\": ABFESolventSetupUnit,\n        \"sim\": ABFESolventSimUnit,\n        \"analysis\": ABFESolventAnalysisUnit,\n    },\n    \"complex\": {\n        \"setup\": ABFEComplexSetupUnit,\n        \"sim\": ABFEComplexSimUnit,\n        \"analysis\": ABFEComplexAnalysisUnit,\n    },\n}\n\n\ndef _get_units(protocol_units, unit_type):\n    \"\"\"\n    Helper method to extract setup units.\n    \"\"\"\n    return [pu for pu in protocol_units if isinstance(pu, unit_type)]\n"
  },
  {
    "path": "src/openfe/tests/protocols/openmm_ahfe/__init__.py",
    "content": ""
  },
  {
    "path": "src/openfe/tests/protocols/openmm_ahfe/test_ahfe_protocol.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\nimport sys\nfrom math import sqrt\nfrom unittest import mock\n\nimport gufe\nimport mdtraj as mdt\nimport numpy as np\nimport pytest\nfrom numpy.testing import assert_allclose\nfrom openff.units import unit as offunit\nfrom openff.units.openmm import ensure_quantity, from_openmm\nfrom openmm import (\n    CustomBondForce,\n    CustomNonbondedForce,\n    HarmonicAngleForce,\n    HarmonicBondForce,\n    NonbondedForce,\n    PeriodicTorsionForce,\n)\nfrom openmmtools.multistate.multistatesampler import MultiStateSampler\n\nimport openfe\nfrom openfe import ChemicalSystem, SolventComponent\nfrom openfe.protocols import openmm_afe\nfrom openfe.protocols.openmm_afe import (\n    AbsoluteSolvationProtocol,\n    AHFESolventSimUnit,\n)\nfrom openfe.protocols.openmm_utils.charge_generation import (\n    HAS_ESPALOMA_CHARGE,\n    HAS_NAGL,\n    HAS_OPENEYE,\n)\n\nfrom .utils import UNIT_TYPES, _get_units\n\n\n@pytest.fixture()\ndef protocol_dry_settings():\n    settings = AbsoluteSolvationProtocol.default_settings()\n    settings.vacuum_engine_settings.compute_platform = None\n    settings.solvent_engine_settings.compute_platform = None\n    settings.protocol_repeats = 1\n    return settings\n\n\n@pytest.fixture()\ndef default_settings():\n    return AbsoluteSolvationProtocol.default_settings()\n\n\ndef test_create_default_protocol(default_settings):\n    # this is roughly how it should be created\n    protocol = AbsoluteSolvationProtocol(settings=default_settings)\n    assert protocol\n\n\ndef test_serialize_protocol(default_settings):\n    protocol = AbsoluteSolvationProtocol(settings=default_settings)\n\n    ser = protocol.to_dict()\n    ret = AbsoluteSolvationProtocol.from_dict(ser)\n    assert protocol == ret\n\n\ndef test_bad_sampler():\n    class FakeSimSettings(gufe.settings.SettingsBaseModel):\n        sampler_method: str = \"foo bar\"\n\n    errmsg = \"Unknown sampler foo bar\"\n    with pytest.raises(AttributeError, match=errmsg):\n        AHFESolventSimUnit._get_sampler(\n            integrator=None,\n            reporter=None,\n            simulation_settings=FakeSimSettings(),\n            thermodynamic_settings=None,\n            compound_states=None,\n            sampler_states=None,\n            platform=None,\n            restart=False,\n        )\n\n\ndef test_repeat_units(benzene_system):\n    protocol = openmm_afe.AbsoluteSolvationProtocol(\n        settings=openmm_afe.AbsoluteSolvationProtocol.default_settings()\n    )\n\n    dag = protocol.create(\n        stateA=benzene_system,\n        stateB=ChemicalSystem({\"solvent\": SolventComponent()}),\n        mapping=None,\n    )\n\n    # 6 protocol unit, 3 per repeat\n    pus = list(dag.protocol_units)\n    assert len(pus) == 18\n\n    # Check info for each repeat\n    for phase in [\"solvent\", \"vacuum\"]:\n        setup = _get_units(pus, UNIT_TYPES[phase][\"setup\"])\n        sim = _get_units(pus, UNIT_TYPES[phase][\"sim\"])\n        analysis = _get_units(pus, UNIT_TYPES[phase][\"analysis\"])\n\n        # Should be 3 of each set\n        assert len(setup) == len(sim) == len(analysis) == 3\n\n        # Check that the dag chain is correct\n        for analysis_pu in analysis:\n            repeat_id = analysis_pu.inputs[\"repeat_id\"]\n            setup_pu = [s for s in setup if s.inputs[\"repeat_id\"] == repeat_id][0]\n            sim_pu = [s for s in sim if s.inputs[\"repeat_id\"] == repeat_id][0]\n            assert analysis_pu.inputs[\"setup_results\"] == setup_pu\n            assert analysis_pu.inputs[\"simulation_results\"] == sim_pu\n            assert sim_pu.inputs[\"setup_results\"] == setup_pu\n\n\ndef test_create_independent_repeat_ids(benzene_system):\n    protocol = openmm_afe.AbsoluteSolvationProtocol(\n        settings=openmm_afe.AbsoluteSolvationProtocol.default_settings()\n    )\n\n    stateB = ChemicalSystem({\"solvent\": SolventComponent()})\n\n    dags = []\n    for i in range(2):\n        dags.append(\n            protocol.create(\n                stateA=benzene_system,\n                stateB=stateB,\n                mapping=None,\n            )\n        )\n\n    repeat_ids = set()\n\n    for dag in dags:\n        # 3 sets of 6 units\n        assert len(list(dag.protocol_units)) == 18\n        for u in dag.protocol_units:\n            repeat_ids.add(u.inputs[\"repeat_id\"])\n\n    # squashed by repeat_id, that's 2 sets of 6\n    assert len(repeat_ids) == 12\n\n\ndef _assert_num_forces(system, forcetype, number):\n    \"\"\"\n    Helper method to check the number of forces of a given\n    type in a system.\n    \"\"\"\n    forces = [f for f in system.getForces() if isinstance(f, forcetype)]\n    assert len(forces) == number\n\n\ndef _verify_alchemical_sterics_force_parameters(\n    force,\n    long_range=True,\n    alpha=0.5,\n    beta=0,\n    a=1.0,\n    b=1.0,\n    c=6.0,\n    d=1.0,\n    e=1.0,\n    f=2.0,\n):\n    assert force.getUseLongRangeCorrection() is long_range\n\n    if force.getNumGlobalParameters() == 8:\n        shift = 0\n    else:\n        shift = 1\n\n    # Check the softcore parameters for the sterics forces\n    assert force.getGlobalParameterName(0 + shift) == \"softcore_alpha\"\n    assert force.getGlobalParameterName(1 + shift) == \"softcore_beta\"\n    assert force.getGlobalParameterName(2 + shift) == \"softcore_a\"\n    assert force.getGlobalParameterName(3 + shift) == \"softcore_b\"\n    assert force.getGlobalParameterName(4 + shift) == \"softcore_c\"\n    assert force.getGlobalParameterName(5 + shift) == \"softcore_d\"\n    assert force.getGlobalParameterName(6 + shift) == \"softcore_e\"\n    assert force.getGlobalParameterName(7 + shift) == \"softcore_f\"\n\n    assert force.getGlobalParameterDefaultValue(0 + shift) == alpha\n    assert force.getGlobalParameterDefaultValue(1 + shift) == beta\n    assert force.getGlobalParameterDefaultValue(2 + shift) == a\n    assert force.getGlobalParameterDefaultValue(3 + shift) == b\n    assert force.getGlobalParameterDefaultValue(4 + shift) == c\n    assert force.getGlobalParameterDefaultValue(5 + shift) == d\n    assert force.getGlobalParameterDefaultValue(6 + shift) == e\n    assert force.getGlobalParameterDefaultValue(7 + shift) == f\n\n\n@pytest.mark.parametrize(\"method\", [\"repex\", \"sams\", \"independent\", \"InDePeNdENT\"])\ndef test_setup_dry_sim_vac_benzene(benzene_system, method, protocol_dry_settings, tmp_path):\n    protocol_dry_settings.vacuum_simulation_settings.sampler_method = method\n\n    protocol = openmm_afe.AbsoluteSolvationProtocol(settings=protocol_dry_settings)\n\n    stateA = benzene_system\n\n    stateB = ChemicalSystem({\"solvent\": SolventComponent()})\n\n    # Create DAG from protocol, get the vacuum and solvent units\n    # and eventually dry run the first vacuum unit\n    dag = protocol.create(\n        stateA=stateA,\n        stateB=stateB,\n        mapping=None,\n    )\n    prot_units = list(dag.protocol_units)\n\n    assert len(prot_units) == 6\n\n    vac_setup_unit = _get_units(prot_units, UNIT_TYPES[\"vacuum\"][\"setup\"])\n    vac_sim_unit = _get_units(prot_units, UNIT_TYPES[\"vacuum\"][\"sim\"])\n\n    assert len(vac_setup_unit) == 1\n    assert len(vac_sim_unit) == 1\n\n    setup_results = vac_setup_unit[0].run(\n        dry=True, scratch_basepath=tmp_path, shared_basepath=tmp_path\n    )\n    sim_results = vac_sim_unit[0].run(\n        system=setup_results[\"alchem_system\"],\n        positions=setup_results[\"debug_positions\"],\n        selection_indices=setup_results[\"selection_indices\"],\n        box_vectors=setup_results[\"box_vectors\"],\n        alchemical_restraints=False,\n        dry=True,\n    )\n\n    sampler = sim_results[\"sampler\"]\n    assert isinstance(sampler, MultiStateSampler)\n    assert not sampler.is_periodic\n    assert sampler._thermodynamic_states[0].barostat is None\n\n    # standard system\n    system = setup_results[\"standard_system\"]\n    assert system.getNumParticles() == 12\n    assert len(system.getForces()) == 4\n    _assert_num_forces(system, NonbondedForce, 1)\n    _assert_num_forces(system, HarmonicBondForce, 1)\n    _assert_num_forces(system, HarmonicAngleForce, 1)\n    _assert_num_forces(system, PeriodicTorsionForce, 1)\n\n    # alchemical system\n    alchem_system = setup_results[\"alchem_system\"]\n    assert alchem_system.getNumParticles() == 12\n    assert len(alchem_system.getForces()) == 12\n    _assert_num_forces(alchem_system, NonbondedForce, 1)\n    _assert_num_forces(alchem_system, CustomNonbondedForce, 4)\n    _assert_num_forces(alchem_system, CustomBondForce, 4)\n    _assert_num_forces(alchem_system, HarmonicBondForce, 1)\n    _assert_num_forces(alchem_system, HarmonicAngleForce, 1)\n    _assert_num_forces(alchem_system, PeriodicTorsionForce, 1)\n\n    # Check some force contents\n    stericsf = [\n        f\n        for f in alchem_system.getForces()\n        if isinstance(f, CustomNonbondedForce) and \"U_sterics\" in f.getEnergyFunction()\n    ]\n\n    for force in stericsf:\n        _verify_alchemical_sterics_force_parameters(force)\n\n\n@pytest.mark.parametrize(\n    \"alpha, a, b, c, correction\",\n    [\n        [0.2, 2, 2, 1, True],\n        [0.35, 2.2, 1.5, 0, False],\n    ],\n)\ndef test_alchemical_settings_setup_vacuum(\n    alpha, a, b, c, correction, benzene_system, protocol_dry_settings, tmp_path\n):\n    \"\"\"\n    Test non default alchemical settings\n    \"\"\"\n    protocol_dry_settings.alchemical_settings.softcore_alpha = alpha\n    protocol_dry_settings.alchemical_settings.softcore_a = a\n    protocol_dry_settings.alchemical_settings.softcore_b = b\n    protocol_dry_settings.alchemical_settings.softcore_c = c\n    protocol_dry_settings.alchemical_settings.disable_alchemical_dispersion_correction = correction\n    protocol = openmm_afe.AbsoluteSolvationProtocol(settings=protocol_dry_settings)\n\n    stateA = benzene_system\n\n    stateB = ChemicalSystem({\"solvent\": SolventComponent()})\n\n    # Create DAG from protocol, get the vacuum and solvent units\n    # and eventually dry run the first vacuum unit\n    dag = protocol.create(\n        stateA=stateA,\n        stateB=stateB,\n        mapping=None,\n    )\n    prot_units = list(dag.protocol_units)\n\n    assert len(prot_units) == 6\n\n    vac_setup_unit = _get_units(prot_units, UNIT_TYPES[\"vacuum\"][\"setup\"])\n    vac_sim_unit = _get_units(prot_units, UNIT_TYPES[\"vacuum\"][\"sim\"])\n\n    assert len(vac_setup_unit) == 1\n    assert len(vac_sim_unit) == 1\n\n    results = vac_setup_unit[0].run(dry=True, scratch_basepath=tmp_path, shared_basepath=tmp_path)\n\n    alchem_system = results[\"alchem_system\"]\n    _assert_num_forces(alchem_system, NonbondedForce, 1)\n    _assert_num_forces(alchem_system, CustomNonbondedForce, 4)\n    _assert_num_forces(alchem_system, CustomBondForce, 4)\n    _assert_num_forces(alchem_system, HarmonicBondForce, 1)\n    _assert_num_forces(alchem_system, HarmonicAngleForce, 1)\n    _assert_num_forces(alchem_system, PeriodicTorsionForce, 1)\n\n    # Check some force contents\n    stericsf = [\n        f\n        for f in alchem_system.getForces()\n        if isinstance(f, CustomNonbondedForce) and \"U_sterics\" in f.getEnergyFunction()\n    ]\n\n    for force in stericsf:\n        _verify_alchemical_sterics_force_parameters(\n            force,\n            long_range=not correction,\n            alpha=alpha,\n            a=a,\n            b=b,\n            c=c,\n        )\n\n\ndef test_confgen_fail_AFE(benzene_system, protocol_dry_settings, tmp_path):\n    # check system parametrisation works even if confgen fails\n    protocol = openmm_afe.AbsoluteSolvationProtocol(settings=protocol_dry_settings)\n\n    stateA = benzene_system\n\n    stateB = ChemicalSystem({\"solvent\": SolventComponent()})\n\n    # Create DAG from protocol, get the vacuum and solvent units\n    # and eventually dry run the first vacuum unit\n    dag = protocol.create(\n        stateA=stateA,\n        stateB=stateB,\n        mapping=None,\n    )\n    prot_units = list(dag.protocol_units)\n    vac_setup_unit = _get_units(prot_units, UNIT_TYPES[\"vacuum\"][\"setup\"])\n\n    with mock.patch(\"rdkit.Chem.AllChem.EmbedMultipleConfs\", return_value=0):\n        # If this worked, the system will have been built\n        system = vac_setup_unit[0].run(\n            dry=True,\n            scratch_basepath=tmp_path,\n            shared_basepath=tmp_path,\n        )[\"alchem_system\"]\n        assert system\n\n\ndef test_setup_solv_benzene(benzene_system, protocol_dry_settings, tmp_path):\n    protocol_dry_settings.solvent_output_settings.output_indices = \"resname UNK\"\n\n    protocol = openmm_afe.AbsoluteSolvationProtocol(settings=protocol_dry_settings)\n\n    stateA = benzene_system\n\n    stateB = ChemicalSystem({\"solvent\": SolventComponent()})\n\n    # Create DAG from protocol, get the vacuum and solvent units\n    # and eventually dry run the first solvent unit\n    dag = protocol.create(\n        stateA=stateA,\n        stateB=stateB,\n        mapping=None,\n    )\n    prot_units = list(dag.protocol_units)\n\n    sol_setup_unit = _get_units(prot_units, UNIT_TYPES[\"solvent\"][\"setup\"])\n    sol_sim_unit = _get_units(prot_units, UNIT_TYPES[\"solvent\"][\"sim\"])\n\n    assert len(sol_setup_unit) == len(sol_sim_unit) == 1\n\n    setup_results = sol_setup_unit[0].run(\n        dry=True, scratch_basepath=tmp_path, shared_basepath=tmp_path\n    )\n    sim_results = sol_sim_unit[0].run(\n        system=setup_results[\"alchem_system\"],\n        positions=setup_results[\"debug_positions\"],\n        selection_indices=setup_results[\"selection_indices\"],\n        box_vectors=setup_results[\"box_vectors\"],\n        alchemical_restraints=False,\n        dry=True,\n        scratch_basepath=tmp_path,\n        shared_basepath=tmp_path,\n    )\n    sol_sampler = sim_results[\"sampler\"]\n    assert sol_sampler.is_periodic\n\n    pdb = mdt.load_pdb(setup_results[\"pdb_structure\"])\n    assert pdb.n_atoms == 12\n\n\ndef test_dry_run_vsite_fail(benzene_system, tmp_path, protocol_dry_settings):\n    protocol_dry_settings.vacuum_forcefield_settings.forcefields = [\n        \"amber/ff14SB.xml\",  # ff14SB protein force field\n        \"amber/tip4pew_standard.xml\",  # FF we are testing with the fun VS\n        \"amber/phosaa10.xml\",  # Handles THE TPO\n    ]\n    protocol_dry_settings.solvent_forcefield_settings.forcefields = [\n        \"amber/ff14SB.xml\",  # ff14SB protein force field\n        \"amber/tip4pew_standard.xml\",  # FF we are testing with the fun VS\n        \"amber/phosaa10.xml\",  # Handles THE TPO\n    ]\n    protocol_dry_settings.solvation_settings.solvent_model = \"tip4pew\"\n    protocol_dry_settings.integrator_settings.reassign_velocities = False\n\n    protocol = AbsoluteSolvationProtocol(settings=protocol_dry_settings)\n\n    stateA = benzene_system\n\n    stateB = ChemicalSystem({\"solvent\": SolventComponent()})\n\n    # Create DAG from protocol, get the vacuum and solvent units\n    # and eventually dry run the first solvent unit\n    dag = protocol.create(\n        stateA=stateA,\n        stateB=stateB,\n        mapping=None,\n    )\n    prot_units = list(dag.protocol_units)\n\n    sol_setup_unit = _get_units(prot_units, UNIT_TYPES[\"solvent\"][\"setup\"])\n    sol_sim_unit = _get_units(prot_units, UNIT_TYPES[\"solvent\"][\"sim\"])\n\n    setup_results = sol_setup_unit[0].run(\n        dry=True, scratch_basepath=tmp_path, shared_basepath=tmp_path\n    )\n    with pytest.raises(ValueError, match=\"are unstable\"):\n        sim_results = sol_sim_unit[0].run(\n            system=setup_results[\"alchem_system\"],\n            positions=setup_results[\"debug_positions\"],\n            selection_indices=setup_results[\"selection_indices\"],\n            box_vectors=setup_results[\"box_vectors\"],\n            alchemical_restraints=False,\n            dry=True,\n            scratch_basepath=tmp_path,\n            shared_basepath=tmp_path,\n        )\n\n\ndef test_setup_dry_sim_solv_benzene_tip4p(benzene_system, protocol_dry_settings, tmp_path):\n    protocol_dry_settings.vacuum_forcefield_settings.forcefields = [\n        \"amber/ff14SB.xml\",  # ff14SB protein force field\n        \"amber/tip4pew_standard.xml\",  # FF we are testing with the fun VS\n        \"amber/phosaa10.xml\",  # Handles THE TPO\n    ]\n    protocol_dry_settings.solvent_forcefield_settings.forcefields = [\n        \"amber/ff14SB.xml\",  # ff14SB protein force field\n        \"amber/tip4pew_standard.xml\",  # FF we are testing with the fun VS\n        \"amber/phosaa10.xml\",  # Handles THE TPO\n    ]\n    protocol_dry_settings.solvation_settings.solvent_model = \"tip4pew\"\n    protocol_dry_settings.integrator_settings.reassign_velocities = True\n\n    protocol = AbsoluteSolvationProtocol(settings=protocol_dry_settings)\n\n    stateA = benzene_system\n\n    stateB = ChemicalSystem({\"solvent\": SolventComponent()})\n\n    # Create DAG from protocol, get the vacuum and solvent units\n    # and eventually dry run the first solvent unit\n    dag = protocol.create(\n        stateA=stateA,\n        stateB=stateB,\n        mapping=None,\n    )\n    prot_units = list(dag.protocol_units)\n\n    sol_setup_units = _get_units(prot_units, UNIT_TYPES[\"solvent\"][\"setup\"])\n    sol_sim_units = _get_units(prot_units, UNIT_TYPES[\"solvent\"][\"sim\"])\n\n    setup_results = sol_setup_units[0].run(\n        dry=True, scratch_basepath=tmp_path, shared_basepath=tmp_path\n    )\n    sim_results = sol_sim_units[0].run(\n        system=setup_results[\"alchem_system\"],\n        positions=setup_results[\"debug_positions\"],\n        selection_indices=setup_results[\"selection_indices\"],\n        box_vectors=setup_results[\"box_vectors\"],\n        alchemical_restraints=False,\n        dry=True,\n        scratch_basepath=tmp_path,\n        shared_basepath=tmp_path,\n    )\n    sol_sampler = sim_results[\"sampler\"]\n    assert sol_sampler.is_periodic\n\n\ndef test_dry_run_solv_benzene_noncubic(benzene_system, protocol_dry_settings, tmp_path):\n    protocol_dry_settings.solvation_settings.solvent_padding = 1.5 * offunit.nanometer\n    protocol_dry_settings.solvation_settings.box_shape = \"dodecahedron\"\n\n    protocol = AbsoluteSolvationProtocol(settings=protocol_dry_settings)\n\n    stateA = benzene_system\n\n    stateB = ChemicalSystem({\"solvent\": SolventComponent()})\n\n    # Create DAG from protocol, get the vacuum and solvent units\n    # and eventually dry run the first solvent unit\n    dag = protocol.create(\n        stateA=stateA,\n        stateB=stateB,\n        mapping=None,\n    )\n    prot_units = list(dag.protocol_units)\n\n    sol_setup_units = _get_units(prot_units, UNIT_TYPES[\"solvent\"][\"setup\"])\n\n    results = sol_setup_units[0].run(dry=True, scratch_basepath=tmp_path, shared_basepath=tmp_path)\n    system = results[\"alchem_system\"]\n\n    vectors = system.getDefaultPeriodicBoxVectors()\n    width = float(from_openmm(vectors)[0][0].to(\"nanometer\").m)\n\n    # dodecahedron has the following shape:\n    # [width, 0, 0], [0, width, 0], [0.5, 0.5, 0.5 * sqrt(2)] * width\n\n    expected_vectors = [\n        [width, 0, 0],\n        [0, width, 0],\n        [0.5 * width, 0.5 * width, 0.5 * sqrt(2) * width],\n    ] * offunit.nanometer\n    assert_allclose(expected_vectors, from_openmm(vectors))\n\n\ndef test_dry_run_solv_user_charges_benzene(benzene_modifications, protocol_dry_settings, tmp_path):\n    \"\"\"\n    Create a test system with fictitious user supplied charges and\n    ensure that they are properly passed through to the constructed\n    alchemical system.\n    \"\"\"\n    protocol = openmm_afe.AbsoluteSolvationProtocol(settings=protocol_dry_settings)\n\n    def assign_fictitious_charges(offmol):\n        \"\"\"\n        Get a random array of fake partial charges for your offmol.\n        \"\"\"\n        rand_arr = np.random.randint(1, 10, size=offmol.n_atoms) / 100\n        rand_arr[-1] = -sum(rand_arr[:-1])\n        return rand_arr * offunit.elementary_charge\n\n    benzene_offmol = benzene_modifications[\"benzene\"].to_openff()\n    offmol_pchgs = assign_fictitious_charges(benzene_offmol)\n    benzene_offmol.partial_charges = offmol_pchgs\n    benzene_smc = openfe.SmallMoleculeComponent.from_openff(benzene_offmol)\n\n    # check propchgs\n    prop_chgs = benzene_smc.to_dict()[\"molprops\"][\"atom.dprop.PartialCharge\"]\n    prop_chgs = np.array(prop_chgs.split(), dtype=float)\n    np.testing.assert_allclose(prop_chgs, offmol_pchgs)\n\n    # Create ChemicalSystems\n    stateA = ChemicalSystem(\n        {\n            \"benzene\": benzene_smc,\n            \"solvent\": SolventComponent(),\n        }\n    )\n\n    stateB = ChemicalSystem({\"solvent\": SolventComponent()})\n\n    # Create DAG from protocol, get the vacuum and solvent units\n    # and eventually dry run the first solvent unit\n    dag = protocol.create(stateA=stateA, stateB=stateB, mapping=None)\n    prot_units = list(dag.protocol_units)\n\n    vac_setup_units = _get_units(prot_units, UNIT_TYPES[\"vacuum\"][\"setup\"])\n    sol_setup_units = _get_units(prot_units, UNIT_TYPES[\"solvent\"][\"setup\"])\n\n    # check sol_unit charges\n    results = sol_setup_units[0].run(dry=True, scratch_basepath=tmp_path, shared_basepath=tmp_path)\n    system = results[\"alchem_system\"]\n    nonbond = [f for f in system.getForces() if isinstance(f, NonbondedForce)]\n\n    assert len(nonbond) == 1\n\n    # loop through the 12 benzene atoms\n    # partial charge is stored in the offset\n    for i in range(12):\n        offsets = nonbond[0].getParticleParameterOffset(i)\n        c = ensure_quantity(offsets[2], \"openff\")\n        assert pytest.approx(c) == prop_chgs[i]\n\n    # check vac_unit charges\n    results = vac_setup_units[0].run(dry=True, scratch_basepath=tmp_path, shared_basepath=tmp_path)\n    system = results[\"alchem_system\"]\n    nonbond = [f for f in system.getForces() if isinstance(f, CustomNonbondedForce)]\n    assert len(nonbond) == 4\n\n    custom_elec = [n for n in nonbond if n.getGlobalParameterName(0) == \"lambda_electrostatics\"][0]\n\n    # loop through the 12 benzene atoms\n    for i in range(12):\n        c, s = custom_elec.getParticleParameters(i)\n        c = ensure_quantity(c, \"openff\")\n        assert pytest.approx(c) == prop_chgs[i]\n\n\n@pytest.mark.parametrize(\n    \"method, backend, ref_key\",\n    [\n        (\"am1bcc\", \"ambertools\", \"ambertools\"),\n        pytest.param(\n            \"am1bcc\",\n            \"openeye\",\n            \"openeye\",\n            marks=pytest.mark.skipif(not HAS_OPENEYE, reason=\"needs oechem\"),\n        ),\n        pytest.param(\n            \"nagl\",\n            \"rdkit\",\n            \"nagl\",\n            marks=pytest.mark.skipif(\n                not HAS_NAGL or HAS_OPENEYE or sys.platform.startswith(\"darwin\"),\n                reason=\"needs NAGL (without oechem) and/or on macos\",\n            ),\n        ),\n        pytest.param(\n            \"espaloma\",\n            \"rdkit\",\n            \"espaloma\",\n            marks=pytest.mark.skipif(not HAS_ESPALOMA_CHARGE, reason=\"needs espaloma charge\"),\n        ),\n    ],\n)\ndef test_dry_run_charge_backends(\n    CN_molecule, tmp_path, method, backend, ref_key, protocol_dry_settings, am1bcc_ref_charges\n):\n    \"\"\"\n    Check that partial charge generation with different backends\n    works as expected.\n    \"\"\"\n    protocol_dry_settings.partial_charge_settings.partial_charge_method = method\n    protocol_dry_settings.partial_charge_settings.off_toolkit_backend = backend\n    protocol_dry_settings.partial_charge_settings.nagl_model = \"openff-gnn-am1bcc-0.1.0-rc.1.pt\"\n\n    protocol = openmm_afe.AbsoluteSolvationProtocol(settings=protocol_dry_settings)\n\n    # Create ChemicalSystems\n    stateA = ChemicalSystem({\"benzene\": CN_molecule, \"solvent\": SolventComponent()})\n\n    stateB = ChemicalSystem({\"solvent\": SolventComponent()})\n\n    # Create DAG from protocol, get the vacuum and solvent units\n    # and eventually dry run the first solvent unit\n    dag = protocol.create(stateA=stateA, stateB=stateB, mapping=None)\n    prot_units = list(dag.protocol_units)\n\n    vac_setup_units = _get_units(prot_units, UNIT_TYPES[\"vacuum\"][\"setup\"])\n\n    # check vac_unit charges\n    results = vac_setup_units[0].run(dry=True, scratch_basepath=tmp_path, shared_basepath=tmp_path)\n    system = results[\"alchem_system\"]\n    nonbond = [f for f in system.getForces() if isinstance(f, CustomNonbondedForce)]\n    assert len(nonbond) == 4\n\n    custom_elec = [n for n in nonbond if n.getGlobalParameterName(0) == \"lambda_electrostatics\"][0]\n\n    charges = []\n    for i in range(system.getNumParticles()):\n        c, s = custom_elec.getParticleParameters(i)\n        charges.append(c)\n\n    assert_allclose(\n        am1bcc_ref_charges[ref_key],\n        charges * offunit.elementary_charge,\n        rtol=1e-4,\n    )\n\n\n@pytest.fixture\ndef benzene_solvation_dag(benzene_system, protocol_dry_settings):\n    protocol_dry_settings.protocol_repeats = 3\n    protocol = openmm_afe.AbsoluteSolvationProtocol(settings=protocol_dry_settings)\n\n    stateA = benzene_system\n\n    stateB = ChemicalSystem({\"solvent\": SolventComponent()})\n\n    return protocol.create(stateA=stateA, stateB=stateB, mapping=None)\n\n\n@pytest.mark.parametrize(\n    \"positions_write_frequency,velocities_write_frequency\",\n    [\n        [100 * offunit.picosecond, None],\n        [None, None],\n        [None, 100 * offunit.picosecond],\n    ],\n)\ndef test_dry_run_vacuum_write_frequency(\n    benzene_system,\n    positions_write_frequency,\n    velocities_write_frequency,\n    protocol_dry_settings,\n    tmp_path,\n):\n    protocol_dry_settings.solvent_output_settings.output_indices = \"resname UNK\"\n    protocol_dry_settings.solvent_output_settings.positions_write_frequency = positions_write_frequency  # fmt: skip\n    protocol_dry_settings.solvent_output_settings.velocities_write_frequency = velocities_write_frequency  # fmt: skip\n    protocol_dry_settings.vacuum_output_settings.positions_write_frequency = positions_write_frequency  # fmt: skip\n    protocol_dry_settings.vacuum_output_settings.velocities_write_frequency = velocities_write_frequency  # fmt: skip\n    # set the time per iteration to 1 ps to make the math easy\n    protocol_dry_settings.solvent_simulation_settings.time_per_iteration = 1 * offunit.picosecond\n    protocol_dry_settings.vacuum_simulation_settings.time_per_iteration = 1 * offunit.picosecond\n\n    protocol = openmm_afe.AbsoluteSolvationProtocol(settings=protocol_dry_settings)\n\n    stateA = benzene_system\n\n    stateB = ChemicalSystem({\"solvent\": SolventComponent()})\n\n    # Create DAG from protocol, get the vacuum and solvent units\n    dag = protocol.create(\n        stateA=stateA,\n        stateB=stateB,\n        mapping=None,\n    )\n    prot_units = list(dag.protocol_units)\n\n    assert len(prot_units) == 6\n\n    for phase in [\"solvent\", \"vacuum\"]:\n        setup_units = _get_units(prot_units, UNIT_TYPES[phase][\"setup\"])\n        sim_units = _get_units(prot_units, UNIT_TYPES[phase][\"sim\"])\n\n        setup_results = setup_units[0].run(\n            dry=True,\n            scratch_basepath=tmp_path,\n            shared_basepath=tmp_path,\n        )\n        sim_results = sim_units[0].run(\n            system=setup_results[\"alchem_system\"],\n            positions=setup_results[\"debug_positions\"],\n            selection_indices=setup_results[\"selection_indices\"],\n            box_vectors=setup_results[\"box_vectors\"],\n            alchemical_restraints=False,\n            dry=True,\n            scratch_basepath=tmp_path,\n            shared_basepath=tmp_path,\n        )\n        sampler = sim_results[\"sampler\"]\n        reporter = sampler._reporter\n        if positions_write_frequency:\n            assert reporter.position_interval == positions_write_frequency.m\n        else:\n            assert reporter.position_interval == 0\n        if velocities_write_frequency:\n            assert reporter.velocity_interval == velocities_write_frequency.m\n        else:\n            assert reporter.velocity_interval == 0\n"
  },
  {
    "path": "src/openfe/tests/protocols/openmm_ahfe/test_ahfe_protocol_results.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\nimport itertools\nimport json\nfrom pathlib import Path\nfrom unittest import mock\n\nimport gufe\nimport numpy as np\nimport openmm\nimport pytest\nfrom openff.units import unit as offunit\n\nimport openfe\nfrom openfe import ChemicalSystem, SolventComponent\nfrom openfe.protocols import openmm_afe\n\nfrom .utils import UNIT_TYPES, _get_units\n\n\n@pytest.fixture()\ndef protocol_dry_settings():\n    settings = openmm_afe.AbsoluteSolvationProtocol.default_settings()\n    settings.vacuum_engine_settings.compute_platform = None\n    settings.solvent_engine_settings.compute_platform = None\n    settings.protocol_repeats = 1\n    return settings\n\n\n@pytest.fixture\ndef benzene_solvation_dag(benzene_system, protocol_dry_settings):\n    protocol_dry_settings.protocol_repeats = 3\n    protocol = openmm_afe.AbsoluteSolvationProtocol(settings=protocol_dry_settings)\n\n    stateA = benzene_system\n\n    stateB = ChemicalSystem({\"solvent\": SolventComponent()})\n\n    return protocol.create(stateA=stateA, stateB=stateB, mapping=None)\n\n\n@pytest.fixture\ndef patcher():\n    with (\n        mock.patch(\n            \"openfe.protocols.openmm_afe.ahfe_units.AHFESolventSetupUnit.run\",\n            return_value={\n                \"system\": Path(\"system.xml.bz2\"),\n                \"positions\": Path(\"positions.npy\"),\n                \"pdb_structure\": Path(\"hybrid_system.pdb\"),\n                \"selection_indices\": np.zeros(100),\n                \"box_vectors\": [np.zeros(3), np.zeros(3), np.zeros(3)] * offunit.nm,\n                \"standard_state_correction\": 0 * offunit.kilocalorie_per_mole,\n                \"restraint_geometry\": None,\n                \"gufe_version\": gufe.__version__,\n                \"openfe_version\": openfe.__version__,\n                \"openmm_version\": openmm.__version__,\n            },\n        ),\n        mock.patch(\n            \"openfe.protocols.openmm_afe.ahfe_units.AHFEVacuumSetupUnit.run\",\n            return_value={\n                \"system\": Path(\"system.xml.bz2\"),\n                \"positions\": Path(\"positions.npy\"),\n                \"pdb_structure\": Path(\"hybrid_system.pdb\"),\n                \"selection_indices\": np.zeros(100),\n                \"box_vectors\": [np.zeros(3), np.zeros(3), np.zeros(3)] * offunit.nm,\n                \"standard_state_correction\": 0 * offunit.kilocalorie_per_mole,\n                \"restraint_geometry\": None,\n            },\n        ),\n        mock.patch(\n            \"openfe.protocols.openmm_afe.base_afe_units.np.load\",\n            return_value=np.zeros(100),\n        ),\n        mock.patch(\n            \"openfe.protocols.openmm_afe.base_afe_units.deserialize\",\n            return_value=\"foo\",\n        ),\n        mock.patch(\n            \"openfe.protocols.openmm_afe.ahfe_units.AHFESolventSimUnit.run\",\n            return_value={\n                \"trajectory\": Path(\"file.nc\"),\n                \"checkpoint\": Path(\"chk.chk\"),\n            },\n        ),\n        mock.patch(\n            \"openfe.protocols.openmm_afe.ahfe_units.AHFEVacuumSimUnit.run\",\n            return_value={\n                \"trajectory\": Path(\"file.nc\"),\n                \"checkpoint\": Path(\"chk.chk\"),\n            },\n        ),\n        mock.patch(\n            \"openfe.protocols.openmm_afe.ahfe_units.AHFESolventAnalysisUnit.run\",\n            return_value={\"foo\": \"bar\"},\n        ),\n        mock.patch(\n            \"openfe.protocols.openmm_afe.ahfe_units.AHFEVacuumAnalysisUnit.run\",\n            return_value={\"foo\": \"bar\"},\n        ),\n    ):\n        yield\n\n\ndef test_gather(benzene_solvation_dag, patcher, tmp_path):\n    # check that .gather behaves as expected\n    dagres = gufe.protocols.execute_DAG(\n        benzene_solvation_dag,\n        shared_basedir=tmp_path,\n        scratch_basedir=tmp_path,\n        keep_shared=True,\n    )\n\n    protocol = openmm_afe.AbsoluteSolvationProtocol(\n        settings=openmm_afe.AbsoluteSolvationProtocol.default_settings(),\n    )\n\n    res = protocol.gather([dagres])\n\n    assert isinstance(res, openmm_afe.AbsoluteSolvationProtocolResult)\n\n\ndef test_unit_tagging(benzene_solvation_dag, patcher, tmp_path):\n    # test that executing the units includes correct gen and repeat info\n\n    dag_units = benzene_solvation_dag.protocol_units\n\n    for phase in [\"solvent\", \"vacuum\"]:\n        setup_results = {}\n        sim_results = {}\n        analysis_results = {}\n\n        setup_units = _get_units(dag_units, UNIT_TYPES[phase][\"setup\"])\n        sim_units = _get_units(dag_units, UNIT_TYPES[phase][\"sim\"])\n        a_units = _get_units(dag_units, UNIT_TYPES[phase][\"analysis\"])\n\n        for u in setup_units:\n            rid = u.inputs[\"repeat_id\"]\n            setup_results[rid] = u.execute(context=gufe.Context(tmp_path, tmp_path))\n\n        for u in sim_units:\n            rid = u.inputs[\"repeat_id\"]\n            sim_results[rid] = u.execute(\n                context=gufe.Context(tmp_path, tmp_path),\n                setup_results=setup_results[rid],\n            )\n\n        for u in a_units:\n            rid = u.inputs[\"repeat_id\"]\n            analysis_results[rid] = u.execute(\n                context=gufe.Context(tmp_path, tmp_path),\n                setup_results=setup_results[rid],\n                simulation_results=sim_results[rid],\n            )\n\n        for results in [setup_results, sim_results, analysis_results]:\n            for ret in results.values():\n                assert isinstance(ret, gufe.ProtocolUnitResult)\n                assert ret.outputs[\"generation\"] == 0\n\n        assert len(setup_results) == len(sim_results) == len(analysis_results) == 3\n\n\nclass TestProtocolResult:\n    @pytest.fixture()\n    def protocolresult(self, afe_solv_transformation_json):\n        d = json.loads(afe_solv_transformation_json, cls=gufe.tokenization.JSON_HANDLER.decoder)\n\n        pr = openfe.ProtocolResult.from_dict(d[\"protocol_result\"])\n\n        return pr\n\n    def test_reload_protocol_result(self, afe_solv_transformation_json):\n        d = json.loads(afe_solv_transformation_json, cls=gufe.tokenization.JSON_HANDLER.decoder)\n\n        pr = openmm_afe.AbsoluteSolvationProtocolResult.from_dict(d[\"protocol_result\"])\n\n        assert pr\n\n    def test_get_estimate(self, protocolresult):\n        est = protocolresult.get_estimate()\n\n        assert est\n        assert est.m == pytest.approx(-2.47, abs=0.5)\n        assert isinstance(est, offunit.Quantity)\n        assert est.is_compatible_with(offunit.kilojoule_per_mole)\n\n    def test_get_uncertainty(self, protocolresult):\n        est = protocolresult.get_uncertainty()\n\n        assert est\n        assert est.m == pytest.approx(0.2, abs=0.2)\n        assert isinstance(est, offunit.Quantity)\n        assert est.is_compatible_with(offunit.kilojoule_per_mole)\n\n    def test_get_individual(self, protocolresult):\n        inds = protocolresult.get_individual_estimates()\n\n        assert isinstance(inds, dict)\n        assert isinstance(inds[\"solvent\"], list)\n        assert isinstance(inds[\"vacuum\"], list)\n        assert len(inds[\"solvent\"]) == len(inds[\"vacuum\"]) == 3\n        for e, u in itertools.chain(inds[\"solvent\"], inds[\"vacuum\"]):\n            assert e.is_compatible_with(offunit.kilojoule_per_mole)\n            assert u.is_compatible_with(offunit.kilojoule_per_mole)\n\n    @pytest.mark.parametrize(\"key\", [\"solvent\", \"vacuum\"])\n    def test_get_forwards_etc(self, key, protocolresult):\n        far = protocolresult.get_forward_and_reverse_energy_analysis()\n\n        assert isinstance(far, dict)\n        assert isinstance(far[key], list)\n        far1 = far[key][0]\n        assert isinstance(far1, dict)\n\n        for k in [\"fractions\", \"forward_DGs\", \"forward_dDGs\", \"reverse_DGs\", \"reverse_dDGs\"]:\n            assert k in far1\n\n            if k == \"fractions\":\n                assert isinstance(far1[k], np.ndarray)\n\n    @pytest.mark.parametrize(\"key\", [\"solvent\", \"vacuum\"])\n    def test_get_frwd_reverse_none_return(self, key, protocolresult):\n        # fetch the first result of type key\n        data = [i for i in protocolresult.data[key].values()][0][0]\n        # set the output to None\n        data.outputs[\"forward_and_reverse_energies\"] = None\n\n        # now fetch the analysis results and expect a warning\n        wmsg = f\"were found in the forward and reverse dictionaries of the repeats of the {key}\"\n        with pytest.warns(UserWarning, match=wmsg):\n            protocolresult.get_forward_and_reverse_energy_analysis()\n\n    @pytest.mark.parametrize(\"key\", [\"solvent\", \"vacuum\"])\n    def test_get_overlap_matrices(self, key, protocolresult):\n        ovp = protocolresult.get_overlap_matrices()\n\n        assert isinstance(ovp, dict)\n        assert isinstance(ovp[key], list)\n        assert len(ovp[key]) == 3\n\n        ovp1 = ovp[key][0]\n        assert isinstance(ovp1[\"matrix\"], np.ndarray)\n        assert ovp1[\"matrix\"].shape == (14, 14)\n\n    @pytest.mark.parametrize(\"key\", [\"solvent\", \"vacuum\"])\n    def test_get_replica_transition_statistics(self, key, protocolresult):\n        rpx = protocolresult.get_replica_transition_statistics()\n\n        assert isinstance(rpx, dict)\n        assert isinstance(rpx[key], list)\n        assert len(rpx[key]) == 3\n        rpx1 = rpx[key][0]\n        assert \"eigenvalues\" in rpx1\n        assert \"matrix\" in rpx1\n        assert rpx1[\"eigenvalues\"].shape == (14,)\n        assert rpx1[\"matrix\"].shape == (14, 14)\n\n    @pytest.mark.parametrize(\"key\", [\"solvent\", \"vacuum\"])\n    def test_equilibration_iterations(self, key, protocolresult):\n        eq = protocolresult.equilibration_iterations()\n\n        assert isinstance(eq, dict)\n        assert isinstance(eq[key], list)\n        assert len(eq[key]) == 3\n        assert all(isinstance(v, float) for v in eq[key])\n\n    @pytest.mark.parametrize(\"key\", [\"solvent\", \"vacuum\"])\n    def test_production_iterations(self, key, protocolresult):\n        prod = protocolresult.production_iterations()\n\n        assert isinstance(prod, dict)\n        assert isinstance(prod[key], list)\n        assert len(prod[key]) == 3\n        assert all(isinstance(v, float) for v in prod[key])\n\n    def test_filenotfound_replica_states(self, protocolresult):\n        errmsg = \"File could not be found\"\n\n        with pytest.raises(ValueError, match=errmsg):\n            protocolresult.get_replica_states()\n"
  },
  {
    "path": "src/openfe/tests/protocols/openmm_ahfe/test_ahfe_resume.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\n\nimport copy\nimport logging\nimport os\nimport pathlib\nimport shutil\n\nimport gufe\nimport openmm\nimport pytest\nfrom gufe.protocols.errors import ProtocolUnitExecutionError\nfrom numpy.testing import assert_allclose\nfrom openfe_analysis.utils.multistate import _determine_position_indices\nfrom openff.units import unit as offunit\nfrom openff.units.openmm import from_openmm\nfrom openmmtools.multistate import MultiStateReporter, ReplicaExchangeSampler\n\nimport openfe\nfrom openfe.data._registry import POOCH_CACHE\nfrom openfe.protocols import openmm_afe\n\nfrom ...conftest import HAS_INTERNET\nfrom .utils import _get_units\n\n\n@pytest.fixture()\ndef protocol_settings():\n    settings = openmm_afe.AbsoluteSolvationProtocol.default_settings()\n    settings.protocol_repeats = 1\n    settings.solvent_output_settings.output_indices = \"resname UNK\"\n    settings.solvation_settings.solvent_padding = None\n    settings.solvation_settings.number_of_solvent_molecules = 750\n    settings.solvation_settings.box_shape = \"dodecahedron\"\n    settings.vacuum_simulation_settings.equilibration_length = 100 * offunit.picosecond\n    settings.vacuum_simulation_settings.production_length = 200 * offunit.picosecond\n    settings.solvent_simulation_settings.equilibration_length = 100 * offunit.picosecond\n    settings.solvent_simulation_settings.production_length = 200 * offunit.picosecond\n    settings.vacuum_engine_settings.compute_platform = \"CUDA\"\n    settings.solvent_engine_settings.compute_platform = \"CUDA\"\n    settings.vacuum_simulation_settings.time_per_iteration = 2.5 * offunit.picosecond\n    settings.solvent_simulation_settings.time_per_iteration = 2.5 * offunit.picosecond\n    settings.vacuum_output_settings.checkpoint_interval = 100 * offunit.picosecond\n    settings.solvent_output_settings.checkpoint_interval = 100 * offunit.picosecond\n    settings.vacuum_engine_settings.compute_platform = None\n    settings.solvent_engine_settings.compute_platform = None\n    return settings\n\n\ndef test_verify_execution_environment():\n    # Verification should pass\n    openmm_afe.AHFESolventSimUnit._verify_execution_environment(\n        setup_outputs={\n            \"gufe_version\": gufe.__version__,\n            \"openfe_version\": openfe.__version__,\n            \"openmm_version\": openmm.__version__,\n        },\n    )\n\n\ndef test_verify_execution_environment_fail():\n    # Passing a bad version should fail\n    with pytest.raises(ProtocolUnitExecutionError, match=\"Python environment\"):\n        openmm_afe.AHFESolventSimUnit._verify_execution_environment(\n            setup_outputs={\n                \"gufe_version\": 0.1,\n                \"openfe_version\": openfe.__version__,\n                \"openmm_version\": openmm.__version__,\n            },\n        )\n\n\ndef test_verify_execution_env_missing_key():\n    errmsg = \"Missing environment information from setup outputs.\"\n    with pytest.raises(ProtocolUnitExecutionError, match=errmsg):\n        openmm_afe.AHFESolventSimUnit._verify_execution_environment(\n            setup_outputs={\n                \"foo_version\": 0.1,\n                \"openfe_version\": openfe.__version__,\n                \"openmm_version\": openmm.__version__,\n            },\n        )\n\n\n@pytest.mark.skipif(\n    not os.path.exists(POOCH_CACHE) and not HAS_INTERNET,\n    reason=\"Internet unavailable and test data is not cached locally\",\n)\ndef test_solvent_check_restart(protocol_settings, ahfe_solv_trajectory_path):\n    assert openmm_afe.AHFESolventSimUnit._check_restart(\n        output_settings=protocol_settings.solvent_output_settings,\n        shared_path=ahfe_solv_trajectory_path.parent,\n    )\n\n    assert not openmm_afe.AHFESolventSimUnit._check_restart(\n        output_settings=protocol_settings.solvent_output_settings,\n        shared_path=pathlib.Path(\".\"),\n    )\n\n\n@pytest.mark.skipif(\n    not os.path.exists(POOCH_CACHE) and not HAS_INTERNET,\n    reason=\"Internet unavailable and test data is not cached locally\",\n)\ndef test_vacuum_check_restart(protocol_settings, ahfe_vac_trajectory_path):\n    assert openmm_afe.AHFEVacuumSimUnit._check_restart(\n        output_settings=protocol_settings.vacuum_output_settings,\n        shared_path=ahfe_vac_trajectory_path.parent,\n    )\n\n    assert not openmm_afe.AHFEVacuumSimUnit._check_restart(\n        output_settings=protocol_settings.vacuum_output_settings,\n        shared_path=pathlib.Path(\".\"),\n    )\n\n\n@pytest.mark.skipif(\n    not os.path.exists(POOCH_CACHE) and not HAS_INTERNET,\n    reason=\"Internet unavailable and test data is not cached locally\",\n)\ndef test_check_restart_one_file_missing(protocol_settings, ahfe_vac_trajectory_path):\n    protocol_settings.vacuum_output_settings.checkpoint_storage_filename = \"foo.nc\"\n\n    errmsg = \"the trajectory file is present but not the checkpoint file.\"\n    with pytest.raises(IOError, match=errmsg):\n        openmm_afe.AHFEVacuumSimUnit._check_restart(\n            output_settings=protocol_settings.vacuum_output_settings,\n            shared_path=ahfe_vac_trajectory_path.parent,\n        )\n\n\nclass TestCheckpointResuming:\n    @pytest.fixture()\n    def protocol_dag(\n        self,\n        protocol_settings,\n        benzene_modifications,\n    ):\n        stateA = openfe.ChemicalSystem(\n            {\n                \"benzene\": benzene_modifications[\"benzene\"],\n                \"solvent\": openfe.SolventComponent(),\n            }\n        )\n\n        stateB = openfe.ChemicalSystem({\"solvent\": openfe.SolventComponent()})\n\n        protocol = openmm_afe.AbsoluteSolvationProtocol(settings=protocol_settings)\n\n        # Create DAG from protocol, get the vacuum and solvent units\n        # and eventually dry run the first solvent unit\n        return protocol.create(\n            stateA=stateA,\n            stateB=stateB,\n            mapping=None,\n        )\n\n    @staticmethod\n    def _check_sampler(sampler, num_iterations: int):\n        # Helper method to do some checks on the sampler\n        assert sampler._iteration == num_iterations\n        assert sampler.number_of_iterations == 80\n        assert sampler.is_completed is (num_iterations == 80)\n        assert sampler.n_states == sampler.n_replicas == 14\n        assert sampler.is_periodic\n        assert sampler.mcmc_moves[0].n_steps == 625\n        assert from_openmm(sampler.mcmc_moves[0].timestep) == 4 * offunit.fs\n\n    @staticmethod\n    def _get_positions(dataset):\n        frame_list = _determine_position_indices(dataset)\n        positions = []\n        for frame in frame_list:\n            positions.append(copy.deepcopy(dataset.variables[\"positions\"][frame].data))\n        return positions\n\n    @staticmethod\n    def _copy_simfiles(cwd: pathlib.Path, filepath):\n        shutil.copyfile(filepath, f\"{cwd}/{filepath.name}\")\n\n    @pytest.mark.integration\n    def test_resume(\n        self, protocol_dag, ahfe_solv_trajectory_path, ahfe_solv_checkpoint_path, tmp_path\n    ):\n        \"\"\"\n        Attempt to resume a simulation unit with pre-existing checkpoint &\n        trajectory files.\n        \"\"\"\n        self._copy_simfiles(tmp_path, ahfe_solv_trajectory_path)\n        self._copy_simfiles(tmp_path, ahfe_solv_checkpoint_path)\n\n        # 1. Check that the trajectory / checkpoint contain what we expect\n        reporter = MultiStateReporter(\n            tmp_path / \"solvent.nc\",\n            checkpoint_storage=\"solvent_checkpoint.nc\",\n        )\n        sampler = ReplicaExchangeSampler.from_storage(reporter)\n\n        self._check_sampler(sampler, num_iterations=40)\n\n        # Deep copy energies & positions for later comparison\n        init_energies = copy.deepcopy(reporter.read_energies())[0]\n        assert init_energies.shape == (41, 14, 14)\n        init_positions = self._get_positions(reporter._storage[0])\n        assert len(init_positions) == 2\n\n        reporter.close()\n        del sampler\n\n        # 2. get & run the units\n        pus = list(protocol_dag.protocol_units)\n        setup_unit = _get_units(pus, openmm_afe.AHFESolventSetupUnit)[0]\n        sim_unit = _get_units(pus, openmm_afe.AHFESolventSimUnit)[0]\n        analysis_unit = _get_units(pus, openmm_afe.AHFESolventAnalysisUnit)[0]\n\n        # Dry run the setup since it'll be easier to use the objects directly\n        setup_results = setup_unit.run(\n            dry=True,\n            scratch_basepath=tmp_path,\n            shared_basepath=tmp_path,\n        )\n\n        # Now we run the simultion in resume mode\n        sim_results = sim_unit.run(\n            system=setup_results[\"alchem_system\"],\n            positions=setup_results[\"debug_positions\"],\n            selection_indices=setup_results[\"selection_indices\"],\n            box_vectors=setup_results[\"box_vectors\"],\n            alchemical_restraints=False,\n            scratch_basepath=tmp_path,\n            shared_basepath=tmp_path,\n        )\n\n        # Finally we analyze the results\n        _ = analysis_unit.run(\n            trajectory=sim_results[\"trajectory\"],\n            checkpoint=sim_results[\"checkpoint\"],\n            scratch_basepath=tmp_path,\n            shared_basepath=tmp_path,\n        )\n\n        # Analyze the trajectory / checkpoint again\n        reporter = MultiStateReporter(\n            tmp_path / \"solvent.nc\",\n            checkpoint_storage=\"solvent_checkpoint.nc\",\n        )\n\n        sampler = ReplicaExchangeSampler.from_storage(reporter)\n\n        self._check_sampler(sampler, num_iterations=80)\n\n        # Check the energies and positions\n        energies = reporter.read_energies()[0]\n        assert energies.shape == (81, 14, 14)\n        assert_allclose(init_energies, energies[:41])\n\n        positions = self._get_positions(reporter._storage[0])\n        assert len(positions) == 3\n        for i in range(2):\n            assert_allclose(positions[i], init_positions[i])\n\n        reporter.close()\n        del sampler\n\n        # Check the free energy plots are there\n        mbar_overlap_file = tmp_path / \"mbar_overlap_matrix.png\"\n        assert (mbar_overlap_file).exists()\n\n    @pytest.mark.slow\n    def test_resume_fail_particles(\n        self, protocol_dag, ahfe_solv_trajectory_path, ahfe_solv_checkpoint_path, tmp_path\n    ):\n        \"\"\"\n        Test that the run unit will fail with a system incompatible\n        to the one present in the trajectory/checkpoint files.\n\n        Here we check that we don't have the same particles / mass.\n        \"\"\"\n        # copy files\n        self._copy_simfiles(tmp_path, ahfe_solv_trajectory_path)\n        self._copy_simfiles(tmp_path, ahfe_solv_checkpoint_path)\n\n        pus = list(protocol_dag.protocol_units)\n        setup_unit = _get_units(pus, openmm_afe.AHFESolventSetupUnit)[0]\n        sim_unit = _get_units(pus, openmm_afe.AHFESolventSimUnit)[0]\n\n        # Dry run the setup since it'll be easier to use the objects directly\n        setup_results = setup_unit.run(\n            dry=True, scratch_basepath=tmp_path, shared_basepath=tmp_path\n        )\n\n        # Create a fake system where we will add a particle\n        fake_system = copy.deepcopy(setup_results[\"alchem_system\"])\n        fake_system.addParticle(42)\n\n        # Fake system should trigger a mismatch\n        errmsg = \"Stored checkpoint System particles do not\"\n        with pytest.raises(ValueError, match=errmsg):\n            _ = sim_unit.run(\n                system=fake_system,\n                positions=setup_results[\"debug_positions\"],\n                selection_indices=setup_results[\"selection_indices\"],\n                box_vectors=setup_results[\"box_vectors\"],\n                alchemical_restraints=False,\n                scratch_basepath=tmp_path,\n                shared_basepath=tmp_path,\n            )\n\n    @pytest.mark.slow\n    def test_resume_fail_constraints(\n        self, protocol_dag, ahfe_solv_trajectory_path, ahfe_solv_checkpoint_path, tmp_path\n    ):\n        \"\"\"\n        Test that the run unit will fail with a system incompatible\n        to the one present in the trajectory/checkpoint files.\n\n        Here we check that we don't have the same constraints.\n        \"\"\"\n        # copy files\n        self._copy_simfiles(tmp_path, ahfe_solv_trajectory_path)\n        self._copy_simfiles(tmp_path, ahfe_solv_checkpoint_path)\n\n        pus = list(protocol_dag.protocol_units)\n        setup_unit = _get_units(pus, openmm_afe.AHFESolventSetupUnit)[0]\n        sim_unit = _get_units(pus, openmm_afe.AHFESolventSimUnit)[0]\n\n        # Dry run the setup since it'll be easier to use the objects directly\n        setup_results = setup_unit.run(\n            dry=True, scratch_basepath=tmp_path, shared_basepath=tmp_path\n        )\n\n        # Create a fake system without constraints\n        fake_system = copy.deepcopy(setup_results[\"alchem_system\"])\n\n        for i in reversed(range(fake_system.getNumConstraints())):\n            fake_system.removeConstraint(i)\n\n        # Fake system should trigger a mismatch\n        errmsg = \"Stored checkpoint System constraints do not\"\n        with pytest.raises(ValueError, match=errmsg):\n            _ = sim_unit.run(\n                system=fake_system,\n                positions=setup_results[\"debug_positions\"],\n                selection_indices=setup_results[\"selection_indices\"],\n                box_vectors=setup_results[\"box_vectors\"],\n                alchemical_restraints=False,\n                scratch_basepath=tmp_path,\n                shared_basepath=tmp_path,\n            )\n\n    @pytest.mark.slow\n    def test_resume_fail_forces(\n        self, protocol_dag, ahfe_solv_trajectory_path, ahfe_solv_checkpoint_path, tmp_path\n    ):\n        \"\"\"\n        Test that the run unit will fail with a system incompatible\n        to the one present in the trajectory/checkpoint files.\n\n        Here we check we don't have the same forces.\n        \"\"\"\n        # copy files\n        self._copy_simfiles(tmp_path, ahfe_solv_trajectory_path)\n        self._copy_simfiles(tmp_path, ahfe_solv_checkpoint_path)\n\n        pus = list(protocol_dag.protocol_units)\n        setup_unit = _get_units(pus, openmm_afe.AHFESolventSetupUnit)[0]\n        sim_unit = _get_units(pus, openmm_afe.AHFESolventSimUnit)[0]\n\n        # Dry run the setup since it'll be easier to use the objects directly\n        setup_results = setup_unit.run(\n            dry=True, scratch_basepath=tmp_path, shared_basepath=tmp_path\n        )\n\n        # Create a fake system without the last force\n        fake_system = copy.deepcopy(setup_results[\"alchem_system\"])\n        fake_system.removeForce(fake_system.getNumForces() - 1)\n\n        # Fake system should trigger a mismatch\n        errmsg = \"Number of forces stored in checkpoint System\"\n        with pytest.raises(ValueError, match=errmsg):\n            _ = sim_unit.run(\n                system=fake_system,\n                positions=setup_results[\"debug_positions\"],\n                selection_indices=setup_results[\"selection_indices\"],\n                box_vectors=setup_results[\"box_vectors\"],\n                alchemical_restraints=False,\n                scratch_basepath=tmp_path,\n                shared_basepath=tmp_path,\n            )\n\n    @pytest.mark.slow\n    def test_resume_differ_barostat(\n        self,\n        protocol_dag,\n        ahfe_solv_trajectory_path,\n        ahfe_solv_checkpoint_path,\n        tmp_path,\n    ):\n        \"\"\"\n        Test that the run unit will fail with a system incompatible\n        to the one present in the trajectory/checkpoint files.\n\n        Here we check what happens if you have a different barostat\n        \"\"\"\n        # copy files\n        self._copy_simfiles(tmp_path, ahfe_solv_trajectory_path)\n        self._copy_simfiles(tmp_path, ahfe_solv_checkpoint_path)\n\n        pus = list(protocol_dag.protocol_units)\n        setup_unit = _get_units(pus, openmm_afe.AHFESolventSetupUnit)[0]\n        sim_unit = _get_units(pus, openmm_afe.AHFESolventSimUnit)[0]\n\n        # Dry run the setup since it'll be easier to use the objects directly\n        setup_results = setup_unit.run(\n            dry=True, scratch_basepath=tmp_path, shared_basepath=tmp_path\n        )\n\n        # Create a fake system with the fake force type\n        fake_system = copy.deepcopy(setup_results[\"alchem_system\"])\n\n        # Loop through forces and remove the force matching force type\n        for i, f in enumerate(fake_system.getForces()):\n            if isinstance(f, openmm.MonteCarloBarostat):\n                findex = i\n\n        fake_system.removeForce(findex)\n\n        # Now add the new barostat\n        new_force = openmm.MonteCarloBarostat(\n            1 * openmm.unit.atmosphere, 300 * openmm.unit.kelvin, 100\n        )\n        fake_system.addForce(new_force)\n\n        # Fake system should trigger a mismatch\n        errmsg = \"stored checkpoint System does not match the same force\"\n        with pytest.raises(ValueError, match=errmsg):\n            _ = sim_unit.run(\n                system=fake_system,\n                positions=setup_results[\"debug_positions\"],\n                selection_indices=setup_results[\"selection_indices\"],\n                box_vectors=setup_results[\"box_vectors\"],\n                alchemical_restraints=False,\n                scratch_basepath=tmp_path,\n                shared_basepath=tmp_path,\n            )\n\n    @pytest.mark.slow\n    def test_resume_differ_forces(\n        self,\n        protocol_dag,\n        ahfe_solv_trajectory_path,\n        ahfe_solv_checkpoint_path,\n        tmp_path,\n        caplog,\n    ):\n        \"\"\"\n        Test that the run unit will fail with a system incompatible\n        to the one present in the trajectory/checkpoint files.\n\n        Here we check we have a different force\n        \"\"\"\n        # copy files\n        self._copy_simfiles(tmp_path, ahfe_solv_trajectory_path)\n        self._copy_simfiles(tmp_path, ahfe_solv_checkpoint_path)\n\n        pus = list(protocol_dag.protocol_units)\n        setup_unit = _get_units(pus, openmm_afe.AHFESolventSetupUnit)[0]\n        sim_unit = _get_units(pus, openmm_afe.AHFESolventSimUnit)[0]\n\n        # Dry run the setup since it'll be easier to use the objects directly\n        setup_results = setup_unit.run(\n            dry=True, scratch_basepath=tmp_path, shared_basepath=tmp_path\n        )\n\n        # Create a fake system with the fake force type\n        fake_system = copy.deepcopy(setup_results[\"alchem_system\"])\n\n        # Loop through forces and remove the force matching force type\n        for i, f in enumerate(fake_system.getForces()):\n            if isinstance(f, openmm.NonbondedForce):\n                findex = i\n\n        fake_system.removeForce(findex)\n\n        # Now add a fake force\n        new_force = openmm.NonbondedForce()\n        new_force.setNonbondedMethod(openmm.NonbondedForce.PME)\n        new_force.addGlobalParameter(\"lambda_electrostatics\", 1.0)\n\n        fake_system.addForce(new_force)\n\n        # Mismatching force should trigger a warning\n        wmsg = \"does not exactly match one of the forces in the simulated System\"\n        caplog.set_level(logging.INFO)\n\n        _ = sim_unit.run(\n            system=fake_system,\n            positions=setup_results[\"debug_positions\"],\n            selection_indices=setup_results[\"selection_indices\"],\n            box_vectors=setup_results[\"box_vectors\"],\n            alchemical_restraints=False,\n            scratch_basepath=tmp_path,\n            shared_basepath=tmp_path,\n            dry=True,\n        )\n\n        assert wmsg in caplog.text\n\n    @pytest.mark.slow\n    @pytest.mark.parametrize(\"bad_file\", [\"trajectory\", \"checkpoint\"])\n    def test_resume_bad_files(\n        self, protocol_dag, ahfe_solv_trajectory_path, ahfe_solv_checkpoint_path, bad_file, tmp_path\n    ):\n        \"\"\"\n        Test what happens when you have a bad trajectory and/or checkpoint\n        files.\n        \"\"\"\n        # copy files\n\n        if bad_file == \"trajectory\":\n            with open(tmp_path / \"solvent.nc\", \"w\") as f:\n                f.write(\"foo\")\n        else:\n            self._copy_simfiles(tmp_path, ahfe_solv_trajectory_path)\n\n        if bad_file == \"checkpoint\":\n            with open(tmp_path / \"solvent_checkpoint.nc\", \"w\") as f:\n                f.write(\"bar\")\n        else:\n            self._copy_simfiles(tmp_path, ahfe_solv_checkpoint_path)\n\n        pus = list(protocol_dag.protocol_units)\n        setup_unit = _get_units(pus, openmm_afe.AHFESolventSetupUnit)[0]\n        sim_unit = _get_units(pus, openmm_afe.AHFESolventSimUnit)[0]\n\n        # Dry run the setup since it'll be easier to use the objects directly\n        setup_results = setup_unit.run(\n            dry=True, scratch_basepath=tmp_path, shared_basepath=tmp_path\n        )\n\n        with pytest.raises(OSError, match=\"Unknown file format\"):\n            _ = sim_unit.run(\n                system=setup_results[\"alchem_system\"],\n                positions=setup_results[\"debug_positions\"],\n                selection_indices=setup_results[\"selection_indices\"],\n                box_vectors=setup_results[\"box_vectors\"],\n                alchemical_restraints=False,\n                scratch_basepath=tmp_path,\n                shared_basepath=tmp_path,\n            )\n"
  },
  {
    "path": "src/openfe/tests/protocols/openmm_ahfe/test_ahfe_settings.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\nimport pytest\n\nfrom openfe.protocols import openmm_afe\nfrom openfe.protocols.openmm_afe import (\n    AbsoluteSolvationProtocol,\n)\n\n\n@pytest.fixture()\ndef default_settings():\n    return AbsoluteSolvationProtocol.default_settings()\n\n\ndef test_create_default_settings():\n    settings = AbsoluteSolvationProtocol.default_settings()\n    assert settings\n\n\ndef test_invalid_protocol_repeats():\n    settings = AbsoluteSolvationProtocol.default_settings()\n    with pytest.raises(ValueError, match=\"must be a positive value\"):\n        settings.protocol_repeats = -1\n\n\n@pytest.mark.parametrize(\n    \"val\",\n    [\n        {\"elec\": [0.0, -1], \"vdw\": [0.0, 1.0], \"restraints\": [0.0, 1.0]},\n        {\"elec\": [0.0, 1.5], \"vdw\": [0.0, 1.5], \"restraints\": [-0.1, 1.0]},\n    ],\n)\ndef test_incorrect_window_settings(val, default_settings):\n    errmsg = \"Lambda windows must be between 0 and 1.\"\n    lambda_settings = default_settings.lambda_settings\n    with pytest.raises(ValueError, match=errmsg):\n        lambda_settings.lambda_elec = val[\"elec\"]\n        lambda_settings.lambda_vdw = val[\"vdw\"]\n        lambda_settings.lambda_restraints = val[\"restraints\"]\n\n\n@pytest.mark.parametrize(\n    \"val\",\n    [\n        {\"elec\": [0.0, 0.1, 0.0], \"vdw\": [0.0, 1.0, 1.0], \"restraints\": [0.0, 1.0, 1.0]},\n    ],\n)\ndef test_monotonic_lambda_windows(val, default_settings):\n    errmsg = \"The lambda schedule is not monotonically increasing\"\n    lambda_settings = default_settings.lambda_settings\n\n    with pytest.raises(ValueError, match=errmsg):\n        lambda_settings.lambda_elec = val[\"elec\"]\n        lambda_settings.lambda_vdw = val[\"vdw\"]\n        lambda_settings.lambda_restraints = val[\"restraints\"]\n"
  },
  {
    "path": "src/openfe/tests/protocols/openmm_ahfe/test_ahfe_slow.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\n\nimport pathlib\n\nimport pytest\nfrom gufe.protocols import execute_DAG\nfrom openff.units import unit\n\nimport openfe\nfrom openfe.protocols import openmm_afe\n\n\n@pytest.mark.integration  # takes too long to be a slow test ~ 4 mins locally\n@pytest.mark.flaky(reruns=3)  # pytest-rerunfailures; we can get bad minimisation\n@pytest.mark.parametrize(\n    \"platform\",\n    [pytest.param(\"CPU\", marks=pytest.mark.xfail(reason=\"see openfe issue #1670\")), \"CUDA\"],\n)\ndef test_openmm_run_engine(\n    platform,\n    get_available_openmm_platforms,\n    benzene_modifications,\n    tmp_path,\n):\n    if platform not in get_available_openmm_platforms:\n        pytest.skip(f\"OpenMM Platform: {platform} not available\")\n\n    # Run a really short calculation to check everything is going well\n    s = openmm_afe.AbsoluteSolvationProtocol.default_settings()\n    s.protocol_repeats = 1\n    s.solvent_output_settings.output_indices = \"resname UNK\"\n    s.vacuum_equil_simulation_settings.equilibration_length = 0.1 * unit.picosecond\n    s.vacuum_equil_simulation_settings.production_length = 0.1 * unit.picosecond\n    s.vacuum_simulation_settings.equilibration_length = 0.1 * unit.picosecond\n    s.vacuum_simulation_settings.production_length = 0.1 * unit.picosecond\n    s.solvent_equil_simulation_settings.equilibration_length_nvt = 0.1 * unit.picosecond\n    s.solvent_equil_simulation_settings.equilibration_length = 0.1 * unit.picosecond\n    s.solvent_equil_simulation_settings.production_length = 0.1 * unit.picosecond\n    s.solvent_simulation_settings.equilibration_length = 0.1 * unit.picosecond\n    s.solvent_simulation_settings.production_length = 0.1 * unit.picosecond\n    s.vacuum_engine_settings.compute_platform = platform\n    s.solvent_engine_settings.compute_platform = platform\n    s.vacuum_simulation_settings.time_per_iteration = 20 * unit.femtosecond\n    s.solvent_simulation_settings.time_per_iteration = 20 * unit.femtosecond\n    s.vacuum_output_settings.checkpoint_interval = 20 * unit.femtosecond\n    s.solvent_output_settings.checkpoint_interval = 20 * unit.femtosecond\n    s.vacuum_simulation_settings.n_replicas = 20\n    s.solvent_simulation_settings.n_replicas = 20\n    s.lambda_settings.lambda_elec = [\n        0.0, 0.25, 0.5, 0.75, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,\n        1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0\n    ]  # fmt: skip\n    s.lambda_settings.lambda_vdw = [\n        0.0, 0.0, 0.0, 0.0, 0.0, 0.05, 0.1, 0.2, 0.3, 0.4, 0.5,\n        0.6, 0.65, 0.7, 0.75, 0.8, 0.85, 0.9, 0.95, 1.0\n    ]  # fmt: skip\n    s.lambda_settings.lambda_restraints = [1.0 for i in range(20)]\n\n    protocol = openmm_afe.AbsoluteSolvationProtocol(\n        settings=s,\n    )\n\n    stateA = openfe.ChemicalSystem(\n        {\n            \"benzene\": benzene_modifications[\"benzene\"],\n            \"solvent\": openfe.SolventComponent(),\n        }\n    )\n\n    stateB = openfe.ChemicalSystem({\"solvent\": openfe.SolventComponent()})\n\n    # Create DAG from protocol, get the vacuum and solvent units\n    # and eventually dry run the first solvent unit\n    dag = protocol.create(\n        stateA=stateA,\n        stateB=stateB,\n        mapping=None,\n    )\n\n    r = execute_DAG(dag, shared_basedir=tmp_path, scratch_basedir=tmp_path, keep_shared=True)\n\n    assert r.ok()\n\n    # Check outputs of solvent & vacuum results\n    for phase in [\"solvent\", \"vacuum\"]:\n        purs = [pur for pur in r.protocol_unit_results if pur.outputs[\"simtype\"] == phase]\n\n        # get the path to the simulation unit shared dict\n        for pur in purs:\n            if \"Simulation\" in pur.name:\n                sim_shared = tmp_path / f\"shared_{pur.source_key}_attempt_0\"\n                assert sim_shared.exists()\n                assert pathlib.Path(sim_shared).is_dir()\n\n        # check the analysis outputs\n        for pur in purs:\n            if \"Analysis\" not in pur.name:\n                continue\n\n            unit_shared = tmp_path / f\"shared_{pur.source_key}_attempt_0\"\n            assert unit_shared.exists()\n            assert pathlib.Path(unit_shared).is_dir()\n\n            # Does the checkpoint file exist?\n            checkpoint = pur.outputs[\"checkpoint\"]\n            assert checkpoint == sim_shared / f\"{pur.outputs['simtype']}_checkpoint.nc\"\n            assert checkpoint.exists()\n\n            # Does the trajectory file exist?\n            nc = pur.outputs[\"trajectory\"]\n            assert nc == sim_shared / f\"{pur.outputs['simtype']}.nc\"\n            assert nc.exists()\n\n    # Test results methods that need files present\n    results = protocol.gather([r])\n    states = results.get_replica_states()\n    assert len(states.items()) == 2\n    assert len(states[\"solvent\"]) == 1\n    assert states[\"solvent\"][0].shape[1] == 20\n"
  },
  {
    "path": "src/openfe/tests/protocols/openmm_ahfe/test_ahfe_tokenization.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\nimport json\n\nimport gufe\nimport pytest\n\nimport openfe\nfrom openfe.protocols import openmm_afe\nfrom openfe.protocols.openmm_afe import (\n    AHFESolventAnalysisUnit,\n    AHFESolventSetupUnit,\n    AHFESolventSimUnit,\n    AHFEVacuumAnalysisUnit,\n    AHFEVacuumSetupUnit,\n    AHFEVacuumSimUnit,\n)\n\nfrom ..conftest import ModGufeTokenizableTestsMixin\n\n\n@pytest.fixture\ndef protocol():\n    return openmm_afe.AbsoluteSolvationProtocol(\n        openmm_afe.AbsoluteSolvationProtocol.default_settings()\n    )\n\n\n@pytest.fixture\ndef protocol_units(protocol, benzene_system):\n    pus = protocol.create(\n        stateA=benzene_system,\n        stateB=openfe.ChemicalSystem({\"solvent\": openfe.SolventComponent()}),\n        mapping=None,\n    )\n    return list(pus.protocol_units)\n\n\ndef _filter_units(pus, classtype):\n    for pu in pus:\n        if isinstance(pu, classtype):\n            return pu\n\n\n@pytest.fixture\ndef solvent_protocol_setup_unit(protocol_units):\n    return _filter_units(protocol_units, AHFESolventSetupUnit)\n\n\n@pytest.fixture\ndef solvent_protocol_sim_unit(protocol_units):\n    return _filter_units(protocol_units, AHFESolventSimUnit)\n\n\n@pytest.fixture\ndef solvent_protocol_analysis_unit(protocol_units):\n    return _filter_units(protocol_units, AHFESolventAnalysisUnit)\n\n\n@pytest.fixture\ndef vacuum_protocol_setup_unit(protocol_units):\n    return _filter_units(protocol_units, AHFEVacuumSetupUnit)\n\n\n@pytest.fixture\ndef vacuum_protocol_sim_unit(protocol_units):\n    return _filter_units(protocol_units, AHFEVacuumSimUnit)\n\n\n@pytest.fixture\ndef vacuum_protocol_analysis_unit(protocol_units):\n    return _filter_units(protocol_units, AHFEVacuumAnalysisUnit)\n\n\n@pytest.fixture\ndef protocol_result(afe_solv_transformation_json):\n    d = json.loads(afe_solv_transformation_json, cls=gufe.tokenization.JSON_HANDLER.decoder)\n    pr = openmm_afe.AbsoluteSolvationProtocolResult.from_dict(d[\"protocol_result\"])\n    return pr\n\n\nclass TestAbsoluteSolvationProtocol(ModGufeTokenizableTestsMixin):\n    cls = openmm_afe.AbsoluteSolvationProtocol\n    key = None\n    repr = \"AbsoluteSolvationProtocol-\"\n\n    @pytest.fixture()\n    def instance(self, protocol):\n        return protocol\n\n\nclass TestAHFESolventSetupUnit(ModGufeTokenizableTestsMixin):\n    cls = AHFESolventSetupUnit\n    repr = \"AHFESolventSetupUnit(AHFE Setup: benzene solvent leg\"\n    key = None\n\n    @pytest.fixture()\n    def instance(self, solvent_protocol_setup_unit):\n        return solvent_protocol_setup_unit\n\n\nclass TestAHFESolventSimUnit(ModGufeTokenizableTestsMixin):\n    cls = AHFESolventSimUnit\n    repr = \"AHFESolventSimUnit(AHFE Simulation: benzene solvent leg\"\n    key = None\n\n    @pytest.fixture()\n    def instance(self, solvent_protocol_sim_unit):\n        return solvent_protocol_sim_unit\n\n\nclass TestAHFESolventAnalysisUnit(ModGufeTokenizableTestsMixin):\n    cls = AHFESolventAnalysisUnit\n    repr = \"AHFESolventAnalysisUnit(AHFE Analysis: benzene solvent leg\"\n    key = None\n\n    @pytest.fixture()\n    def instance(self, solvent_protocol_analysis_unit):\n        return solvent_protocol_analysis_unit\n\n\nclass TestAHFEVacuumSetupUnit(ModGufeTokenizableTestsMixin):\n    cls = AHFEVacuumSetupUnit\n    repr = \"AHFEVacuumSetupUnit(AHFE Setup: benzene vacuum leg\"\n    key = None\n\n    @pytest.fixture()\n    def instance(self, vacuum_protocol_setup_unit):\n        return vacuum_protocol_setup_unit\n\n\nclass TestAHFEVacuumSimUnit(ModGufeTokenizableTestsMixin):\n    cls = AHFEVacuumSimUnit\n    repr = \"AHFEVacuumSimUnit(AHFE Simulation: benzene vacuum leg\"\n    key = None\n\n    @pytest.fixture()\n    def instance(self, vacuum_protocol_sim_unit):\n        return vacuum_protocol_sim_unit\n\n\nclass TestAHFEVacuumAnalysisUnit(ModGufeTokenizableTestsMixin):\n    cls = AHFEVacuumAnalysisUnit\n    repr = \"AHFEVacuumAnalysisUnit(AHFE Analysis: benzene vacuum leg\"\n    key = None\n\n    @pytest.fixture()\n    def instance(self, vacuum_protocol_analysis_unit):\n        return vacuum_protocol_analysis_unit\n\n\nclass TestAbsoluteSolvationProtocolResult(ModGufeTokenizableTestsMixin):\n    cls = openmm_afe.AbsoluteSolvationProtocolResult\n    key = None\n    repr = \"AbsoluteSolvationProtocolResult-\"\n\n    @pytest.fixture()\n    def instance(self, protocol_result):\n        return protocol_result\n"
  },
  {
    "path": "src/openfe/tests/protocols/openmm_ahfe/test_ahfe_validation.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\nimport pytest\nfrom gufe import LigandAtomMapping, ProtocolDAGResult\nfrom openff.units import unit as offunit\n\nfrom openfe import ChemicalSystem, SolventComponent\nfrom openfe.protocols import openmm_afe\nfrom openfe.protocols.openmm_afe import (\n    AbsoluteSolvationProtocol,\n)\nfrom openfe.protocols.openmm_utils import system_validation\n\n\n@pytest.fixture()\ndef default_settings():\n    return AbsoluteSolvationProtocol.default_settings()\n\n\n@pytest.fixture()\ndef stateA(benzene_modifications):\n    return ChemicalSystem(\n        {\"benzene\": benzene_modifications[\"benzene\"], \"solvent\": SolventComponent()}\n    )\n\n\n@pytest.fixture()\ndef stateB():\n    return ChemicalSystem({\"solvent\": SolventComponent()})\n\n\n@pytest.mark.parametrize(\n    \"val\",\n    [\n        {\"elec\": [0.0, 1.0], \"vdw\": [1.0, 1.0], \"restraints\": [0.0, 0.0]},\n    ],\n)\ndef test_validate_lambda_schedule_naked_charge(val, default_settings):\n    errmsg = (\n        \"There are states along this lambda schedule \"\n        \"where there are atoms with charges but no LJ \"\n        f\"interactions: lambda 0: \"\n        f\"elec {val['elec'][0]} vdW {val['vdw'][0]}\"\n    )\n    default_settings.lambda_settings.lambda_elec = val[\"elec\"]\n    default_settings.lambda_settings.lambda_vdw = val[\"vdw\"]\n    default_settings.lambda_settings.lambda_restraints = val[\"restraints\"]\n    default_settings.vacuum_simulation_settings.n_replicas = 2\n    default_settings.solvent_simulation_settings.n_replicas = 2\n    with pytest.raises(ValueError, match=errmsg):\n        AbsoluteSolvationProtocol._validate_lambda_schedule(\n            default_settings.lambda_settings,\n            default_settings.vacuum_simulation_settings,\n        )\n    with pytest.raises(ValueError, match=errmsg):\n        AbsoluteSolvationProtocol._validate_lambda_schedule(\n            default_settings.lambda_settings,\n            default_settings.solvent_simulation_settings,\n        )\n\n\n@pytest.mark.parametrize(\n    \"val\",\n    [\n        {\"elec\": [1.0, 1.0], \"vdw\": [0.0, 1.0], \"restraints\": [0.0, 0.0]},\n    ],\n)\ndef test_validate_lambda_schedule_nreplicas(val, default_settings):\n    default_settings.lambda_settings.lambda_elec = val[\"elec\"]\n    default_settings.lambda_settings.lambda_vdw = val[\"vdw\"]\n    default_settings.lambda_settings.lambda_restraints = val[\"restraints\"]\n    n_replicas = 3\n    default_settings.vacuum_simulation_settings.n_replicas = n_replicas\n    errmsg = (\n        f\"Number of replicas {n_replicas} does not equal the\"\n        f\" number of lambda windows {len(val['vdw'])}\"\n    )\n    with pytest.raises(ValueError, match=errmsg):\n        AbsoluteSolvationProtocol._validate_lambda_schedule(\n            default_settings.lambda_settings,\n            default_settings.vacuum_simulation_settings,\n        )\n\n\n@pytest.mark.parametrize(\n    \"val\",\n    [\n        {\"elec\": [1.0, 1.0, 1.0], \"vdw\": [0.0, 1.0], \"restraints\": [0.0, 0.0]},\n    ],\n)\ndef test_validate_lambda_schedule_nwindows(val, default_settings):\n    default_settings.lambda_settings.lambda_elec = val[\"elec\"]\n    default_settings.lambda_settings.lambda_vdw = val[\"vdw\"]\n    default_settings.lambda_settings.lambda_restraints = val[\"restraints\"]\n    n_replicas = 3\n    default_settings.vacuum_simulation_settings.n_replicas = n_replicas\n    errmsg = (\n        \"Components elec, vdw, and restraints must have equal amount\"\n        f\" of lambda windows. Got {len(val['elec'])} elec lambda\"\n        f\" windows, {len(val['vdw'])} vdw lambda windows, and\"\n        f\"{len(val['restraints'])} restraints lambda windows.\"\n    )\n    with pytest.raises(ValueError, match=errmsg):\n        AbsoluteSolvationProtocol._validate_lambda_schedule(\n            default_settings.lambda_settings,\n            default_settings.vacuum_simulation_settings,\n        )\n\n\n@pytest.mark.parametrize(\n    \"val\",\n    [\n        {\"elec\": [1.0, 1.0], \"vdw\": [1.0, 1.0], \"restraints\": [0.0, 1.0]},\n    ],\n)\ndef test_validate_lambda_schedule_nonzero_restraints(val, default_settings):\n    wmsg = (\n        \"Non-zero restraint lambdas applied. The absolute \"\n        \"solvation protocol doesn't apply restraints, \"\n        \"therefore restraints won't be applied.\"\n    )\n    default_settings.lambda_settings.lambda_elec = val[\"elec\"]\n    default_settings.lambda_settings.lambda_vdw = val[\"vdw\"]\n    default_settings.lambda_settings.lambda_restraints = val[\"restraints\"]\n    default_settings.vacuum_simulation_settings.n_replicas = 2\n    with pytest.warns(UserWarning, match=wmsg):\n        AbsoluteSolvationProtocol._validate_lambda_schedule(\n            default_settings.lambda_settings,\n            default_settings.vacuum_simulation_settings,\n        )\n\n\ndef test_validate_endstates_protcomp(benzene_modifications, T4_protein_component):\n    stateA = ChemicalSystem(\n        {\n            \"benzene\": benzene_modifications[\"benzene\"],\n            \"protein\": T4_protein_component,\n            \"solvent\": SolventComponent(),\n        }\n    )\n\n    stateB = ChemicalSystem(\n        {\n            \"benzene\": benzene_modifications[\"benzene\"],\n            \"phenol\": benzene_modifications[\"phenol\"],\n            \"solvent\": SolventComponent(),\n        }\n    )\n\n    with pytest.raises(ValueError, match=\"Protein components are not allowed\"):\n        AbsoluteSolvationProtocol._validate_endstates(stateA, stateB)\n\n\ndef test_validate_endstates_nosolvcomp_stateA(benzene_modifications, T4_protein_component):\n    stateA = ChemicalSystem(\n        {\n            \"benzene\": benzene_modifications[\"benzene\"],\n        }\n    )\n\n    stateB = ChemicalSystem(\n        {\n            \"benzene\": benzene_modifications[\"benzene\"],\n            \"phenol\": benzene_modifications[\"phenol\"],\n            \"solvent\": SolventComponent(),\n        }\n    )\n\n    with pytest.raises(ValueError, match=\"No SolventComponent found in stateA\"):\n        AbsoluteSolvationProtocol._validate_endstates(stateA, stateB)\n\n\ndef test_validate_endstates_nosolvcomp_stateB(benzene_modifications, T4_protein_component):\n    stateA = ChemicalSystem(\n        {\n            \"benzene\": benzene_modifications[\"benzene\"],\n            \"solvent\": SolventComponent(),\n        }\n    )\n\n    stateB = ChemicalSystem(\n        {\n            \"benzene\": benzene_modifications[\"benzene\"],\n            \"phenol\": benzene_modifications[\"phenol\"],\n        }\n    )\n\n    with pytest.raises(ValueError, match=\"No SolventComponent found in stateA and/or stateB\"):\n        AbsoluteSolvationProtocol._validate_endstates(stateA, stateB)\n\n\ndef test_validate_alchem_comps_appearingB(benzene_modifications):\n    stateA = ChemicalSystem(\n        {\n            \"solvent\": SolventComponent(),\n            \"toluene\": benzene_modifications[\"toluene\"],\n        }\n    )\n\n    stateB = ChemicalSystem(\n        {\"benzene\": benzene_modifications[\"benzene\"], \"solvent\": SolventComponent()}\n    )\n\n    with pytest.raises(ValueError, match=\"Components appearing in state B\"):\n        AbsoluteSolvationProtocol._validate_endstates(stateA, stateB)\n\n\ndef test_validate_alchem_comps_multi(benzene_modifications):\n    stateA = ChemicalSystem(\n        {\n            \"benzene\": benzene_modifications[\"benzene\"],\n            \"toluene\": benzene_modifications[\"toluene\"],\n            \"solvent\": SolventComponent(),\n        }\n    )\n\n    stateB = ChemicalSystem({\"solvent\": SolventComponent()})\n\n    alchem_comps = system_validation.get_alchemical_components(stateA, stateB)\n\n    assert len(alchem_comps[\"stateA\"]) == 2\n\n    with pytest.raises(ValueError, match=\"Only one alchemical species\"):\n        AbsoluteSolvationProtocol._validate_endstates(stateA, stateB)\n\n\ndef test_validate_alchem_nonsmc(benzene_modifications):\n    stateA = ChemicalSystem(\n        {\n            \"solvent\": SolventComponent(),\n            \"solvent2\": SolventComponent(smiles=\"C\"),\n        }\n    )\n\n    stateB = ChemicalSystem(\n        {\n            \"solvent\": SolventComponent(),\n        }\n    )\n\n    errmsg = \"Only disappearing SmallMoleculeComponents\"\n    with pytest.raises(ValueError, match=errmsg):\n        AbsoluteSolvationProtocol._validate_endstates(stateA, stateB)\n\n\ndef test_charged_alchem_comp(charged_benzene_modifications):\n    stateA = ChemicalSystem(\n        {\n            \"solute\": charged_benzene_modifications[\"benzoic_acid\"],\n            \"solvent\": SolventComponent(),\n        }\n    )\n\n    stateB = ChemicalSystem(\n        {\n            \"solvent\": SolventComponent(),\n        }\n    )\n\n    assert charged_benzene_modifications[\"benzoic_acid\"].total_charge == -1\n\n    with pytest.raises(ValueError, match=\"Charged alchemical molecules\"):\n        AbsoluteSolvationProtocol._validate_endstates(stateA, stateB)\n\n\ndef test_extends_error(default_settings, stateA, stateB):\n    fake_results = ProtocolDAGResult(\n        protocol_units=[], protocol_unit_results=[], transformation_key=\"foo\"\n    )\n    protocol = openmm_afe.AbsoluteSolvationProtocol(settings=default_settings)\n\n    with pytest.raises(ValueError, match=\"Can't extend simulation\"):\n        protocol.validate(stateA=stateA, stateB=stateB, mapping=None, extends=fake_results)\n\n\ndef test_vac_bad_nonbonded(stateA, stateB):\n    settings = openmm_afe.AbsoluteSolvationProtocol.default_settings()\n    settings.vacuum_forcefield_settings.nonbonded_method = \"pme\"\n    protocol = openmm_afe.AbsoluteSolvationProtocol(settings=settings)\n\n    with pytest.raises(ValueError, match=\"Only the nocutoff\"):\n        protocol.validate(stateA=stateA, stateB=stateB, mapping=None)\n\n\ndef test_vac_nvt_error(stateA, stateB):\n    settings = openmm_afe.AbsoluteSolvationProtocol.default_settings()\n    settings.vacuum_equil_simulation_settings.equilibration_length_nvt = 1 * offunit.nanosecond\n    protocol = openmm_afe.AbsoluteSolvationProtocol(settings=settings)\n\n    with pytest.raises(ValueError, match=\"cannot be run in vacuum\"):\n        protocol.validate(stateA=stateA, stateB=stateB, mapping=None)\n\n\ndef test_mapping_warning(benzene_modifications, default_settings, stateA, stateB):\n    # Pass in a fake mapping and expect a warning it won't be used\n    protocol = openmm_afe.AbsoluteSolvationProtocol(settings=default_settings)\n    mapping = LigandAtomMapping(\n        componentA=benzene_modifications[\"benzene\"],\n        componentB=benzene_modifications[\"benzene\"],\n        componentA_to_componentB={},\n    )\n\n    with pytest.warns(UserWarning, match=\"mapping was passed\"):\n        protocol.validate(stateA=stateA, stateB=stateB, mapping=mapping)\n\n\n@pytest.mark.parametrize(\"phase\", [\"solvent\", \"vacuum\"])\ndef test_high_timestep(phase, stateA, stateB):\n    s = AbsoluteSolvationProtocol.default_settings()\n    if phase == \"solvent\":\n        s.solvent_forcefield_settings.hydrogen_mass = 1.0\n    else:\n        s.vacuum_forcefield_settings.hydrogen_mass = 1.0\n\n    protocol = openmm_afe.AbsoluteSolvationProtocol(\n        settings=s,\n    )\n\n    with pytest.raises(ValueError, match=\"too large for hydrogen\"):\n        protocol.validate(stateA=stateA, stateB=stateB, mapping=None)\n"
  },
  {
    "path": "src/openfe/tests/protocols/openmm_ahfe/utils.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\nfrom openfe.protocols.openmm_afe import (\n    AbsoluteSolvationProtocol,\n    AHFESolventAnalysisUnit,\n    AHFESolventSetupUnit,\n    AHFESolventSimUnit,\n    AHFEVacuumAnalysisUnit,\n    AHFEVacuumSetupUnit,\n    AHFEVacuumSimUnit,\n)\n\nUNIT_TYPES = {\n    \"solvent\": {\n        \"setup\": AHFESolventSetupUnit,\n        \"sim\": AHFESolventSimUnit,\n        \"analysis\": AHFESolventAnalysisUnit,\n    },\n    \"vacuum\": {\n        \"setup\": AHFEVacuumSetupUnit,\n        \"sim\": AHFEVacuumSimUnit,\n        \"analysis\": AHFEVacuumAnalysisUnit,\n    },\n}\n\n\ndef _get_units(protocol_units, unit_type):\n    \"\"\"\n    Helper method to extract setup units.\n    \"\"\"\n    return [pu for pu in protocol_units if isinstance(pu, unit_type)]\n"
  },
  {
    "path": "src/openfe/tests/protocols/openmm_md/__init__.py",
    "content": ""
  },
  {
    "path": "src/openfe/tests/protocols/openmm_md/test_plain_md_protocol.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\nimport json\nimport logging\nimport pathlib\nimport sys\nfrom unittest import mock\n\nimport gufe\nimport numpy as np\nimport openmm\nimport pytest\nfrom gufe import ChemicalSystem, LigandAtomMapping, SmallMoleculeComponent\nfrom numpy.testing import assert_allclose\nfrom openff.units import unit\nfrom openff.units.openmm import from_openmm, to_openmm\nfrom openmm import MonteCarloBarostat, NonbondedForce\nfrom openmm import unit as omm_unit\nfrom openmmtools.states import ThermodynamicState\nfrom pydantic import ValidationError\n\nimport openfe\nfrom openfe.protocols import openmm_md\nfrom openfe.protocols.openmm_md.plain_md_methods import (\n    PlainMDProtocol,\n    PlainMDProtocolResult,\n    PlainMDSetupUnit,\n    PlainMDSimulationUnit,\n)\nfrom openfe.protocols.openmm_utils import serialization\nfrom openfe.protocols.openmm_utils.charge_generation import (\n    HAS_ESPALOMA_CHARGE,\n    HAS_NAGL,\n    HAS_OPENEYE,\n)\nfrom openfe.tests.conftest import HAS_ESPALOMA\n\n\n@pytest.fixture()\ndef vac_settings():\n    settings = PlainMDProtocol.default_settings()\n    settings.forcefield_settings.nonbonded_method = \"nocutoff\"\n    settings.engine_settings.compute_platform = None\n    return settings\n\n\n@pytest.mark.parametrize(\n    \"inputs, expected\",\n    [\n        # inputs are current step count, nvt steps, npt steps and prod steps\n        # outputs are steps to run for nvt, npt, prod and if the production phase has started\n        pytest.param([50, 100, 100, 100], [50, 100, 100, False], id=\"nvt resuming\"),\n        pytest.param([101, 100, 100, 100], [0, 99, 100, False], id=\"npt resuming\"),\n        pytest.param([220, 100, 100, 100], [0, 0, 80, True], id=\"prod resuming\"),\n        pytest.param([200, 100, 100, 100], [0, 0, 100, False], id=\"prod resuming not started\"),\n    ],\n)\ndef test_get_remaining_steps(inputs, expected):\n    nvt, npt, prod, is_prod = PlainMDSimulationUnit._get_remaining_steps(*inputs)\n    assert nvt == expected[0]\n    assert npt == expected[1]\n    assert prod == expected[2]\n    assert is_prod == expected[3]\n\n\ndef test_create_default_settings():\n    settings = PlainMDProtocol.default_settings()\n\n    assert settings\n\n\ndef test_create_default_protocol():\n    # this is roughly how it should be created\n    protocol = PlainMDProtocol(\n        settings=PlainMDProtocol.default_settings(),\n    )\n\n    assert protocol\n\n\ndef test_invalid_protocol_repeats():\n    settings = PlainMDProtocol.default_settings()\n    with pytest.raises(ValueError, match=\"must be a positive value\"):\n        settings.protocol_repeats = -1\n\n\ndef test_serialize_protocol():\n    protocol = PlainMDProtocol(\n        settings=PlainMDProtocol.default_settings(),\n    )\n\n    ser = protocol.to_dict()\n\n    ret = PlainMDProtocol.from_dict(ser)\n\n    assert protocol == ret\n\n\ndef test_create_independent_repeat_ids(benzene_system):\n    # if we create two dags each with 3 repeats, they should give 6 repeat_ids\n    # this allows multiple DAGs in flight for one Transformation that don't clash on gather\n    settings = PlainMDProtocol.default_settings()\n    # Default protocol is 1 repeat, change to 3 repeats\n    settings.protocol_repeats = 3\n    protocol = PlainMDProtocol(settings=settings)\n    dag1 = protocol.create(\n        stateA=benzene_system,\n        stateB=benzene_system,\n        mapping=None,\n    )\n    dag2 = protocol.create(\n        stateA=benzene_system,\n        stateB=benzene_system,\n        mapping=None,\n    )\n\n    repeat_ids = set()\n    u: PlainMDSetupUnit | PlainMDSimulationUnit\n    for u in dag1.protocol_units:\n        repeat_ids.add(u.inputs[\"repeat_id\"])\n    for u in dag2.protocol_units:\n        repeat_ids.add(u.inputs[\"repeat_id\"])\n\n    assert len(repeat_ids) == 6\n\n\ndef test_dry_run_default_vacuum(benzene_vacuum_system, vac_settings, tmp_path):\n    protocol = PlainMDProtocol(settings=vac_settings)\n\n    # create DAG from protocol and take the setup unit\n    dag = protocol.create(\n        stateA=benzene_vacuum_system,\n        stateB=benzene_vacuum_system,\n        mapping=None,\n    )\n    setup_unit = list(dag.protocol_units)[0]\n    result = setup_unit.run(\n        dry=True, verbose=True, scratch_basepath=tmp_path, shared_basepath=tmp_path\n    )\n    system = result[\"debug\"][\"system\"]\n    assert not ThermodynamicState(\n        system,\n        temperature=to_openmm(protocol.settings.thermo_settings.temperature),\n    ).is_periodic\n\n    assert (\n        ThermodynamicState(\n            system,\n            temperature=to_openmm(protocol.settings.thermo_settings.temperature),\n        ).barostat\n        is None\n    )\n\n\ndef test_dry_run_logger_output(benzene_vacuum_system, vac_settings, tmp_path, caplog):\n    vac_settings.simulation_settings.equilibration_length_nvt = 1 * unit.picosecond\n    vac_settings.simulation_settings.equilibration_length = 1 * unit.picosecond\n    vac_settings.simulation_settings.production_length = 1 * unit.picosecond\n\n    protocol = PlainMDProtocol(\n        settings=vac_settings,\n    )\n\n    # create DAG from protocol\n    dag = protocol.create(\n        stateA=benzene_vacuum_system,\n        stateB=benzene_vacuum_system,\n        mapping=None,\n    )\n    setup_unit = list(dag.protocol_units)[0]\n\n    caplog.set_level(logging.INFO)\n    setup_results = setup_unit.run(\n        dry=False, verbose=True, scratch_basepath=tmp_path, shared_basepath=tmp_path\n    )\n\n    messages = [r.message for r in caplog.records]\n    assert \"Creating system\" in messages\n    # now run the production unit after extracting outputs from the setup unit\n    system = serialization.deserialize(setup_results[\"system\"])\n    positions = np.load(setup_results[\"positions\"]) * omm_unit.nanometers\n    topology = openmm.app.PDBFile(str(setup_results[\"system_pdb\"])).getTopology()\n    equil_steps_nvt = setup_results[\"equil_steps_nvt\"]\n    equil_steps_npt = setup_results[\"equil_steps_npt\"]\n    prod_steps = setup_results[\"prod_steps\"]\n    prod_unit = list(dag.protocol_units)[1]\n    prod_unit.run(\n        system=system,\n        positions=positions,\n        topology=topology,\n        equil_steps_nvt=equil_steps_nvt,\n        equil_steps_npt=equil_steps_npt,\n        prod_steps=prod_steps,\n        dry=False,\n        verbose=True,\n        scratch_basepath=tmp_path,\n        shared_basepath=tmp_path,\n    )\n    messages = [r.message for r in caplog.records]\n    assert \"Minimizing systems\" in messages\n    assert \"Running NVT equilibration for 250 steps\" in messages\n    assert \"Running NPT equilibration for 250 steps\" in messages\n    assert \"Running production phase for 250 steps\" in messages\n\n\ndef test_dry_run_ffcache_none_vacuum(benzene_vacuum_system, vac_settings, tmp_path):\n    vac_settings.output_settings.forcefield_cache = None\n\n    protocol = PlainMDProtocol(\n        settings=vac_settings,\n    )\n    assert protocol.settings.output_settings.forcefield_cache is None\n\n    # create DAG from protocol and take first (and only) work unit from within\n    dag = protocol.create(\n        stateA=benzene_vacuum_system,\n        stateB=benzene_vacuum_system,\n        mapping=None,\n    )\n    dag_unit = list(dag.protocol_units)[0]\n    dag_unit.run(dry=True, scratch_basepath=tmp_path, shared_basepath=tmp_path)[\"debug\"][\"system\"]\n\n\ndef test_dry_run_gaff_vacuum(benzene_vacuum_system, vac_settings, tmp_path):\n    vac_settings.forcefield_settings.small_molecule_forcefield = \"gaff-2.11\"\n\n    protocol = PlainMDProtocol(\n        settings=vac_settings,\n    )\n\n    # create DAG from protocol and take first (and only) work unit from within\n    dag = protocol.create(\n        stateA=benzene_vacuum_system,\n        stateB=benzene_vacuum_system,\n        mapping=None,\n    )\n    dag_unit = list(dag.protocol_units)[0]\n    dag_unit.run(dry=True, scratch_basepath=tmp_path, shared_basepath=tmp_path)[\"debug\"][\"system\"]\n\n\n@pytest.mark.xfail(reason=\"Issue #1940\")\n@pytest.mark.skipif(not HAS_ESPALOMA, reason=\"espaloma is not available\")\ndef test_dry_run_espaloma_vacuum_user_charges(benzene_modifications, vac_settings, tmp_path):\n    vac_settings.forcefield_settings.small_molecule_forcefield = \"espaloma-0.3.2\"\n\n    protocol = PlainMDProtocol(\n        settings=vac_settings,\n    )\n\n    # add some dummy charges to the benzene molecule\n    benzene = benzene_modifications[\"benzene\"]\n    benzene_openff = benzene.to_openff()\n    # assign some fake charges\n    expected_charges = [-0.5, -0.5, -0.5, -0.5, -0.5, -0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5]\n    benzene_openff.partial_charges = expected_charges * unit.elementary_charge\n    benzene_system = ChemicalSystem({\"ligand\": SmallMoleculeComponent.from_openff(benzene_openff)})\n    # create DAG from protocol and take first (and only) work unit from within\n    dag = protocol.create(\n        stateA=benzene_system,\n        stateB=benzene_system,\n        mapping=None,\n    )\n    dag_unit = list(dag.protocol_units)[0]\n    result = dag_unit.run(dry=True, scratch_basepath=tmp_path, shared_basepath=tmp_path)\n    system = result[\"debug\"][\"system\"]\n    assert system.getNumParticles() == 12\n    # check the charges assigned\n    nb_force = [f for f in system.getForces() if isinstance(f, NonbondedForce)][0]\n    charges = []\n    for i in range(nb_force.getNumParticles()):\n        c, _, _ = nb_force.getParticleParameters(i)\n        charges.append(c.value_in_unit(omm_unit.elementary_charge))\n    assert_allclose(charges, expected_charges, rtol=1e-6)\n\n\n@pytest.mark.parametrize(\n    \"method, backend, ref_key\",\n    [\n        (\"am1bcc\", \"ambertools\", \"ambertools\"),\n        pytest.param(\n            \"am1bcc\",\n            \"openeye\",\n            \"openeye\",\n            marks=pytest.mark.skipif(not HAS_OPENEYE, reason=\"needs oechem\"),\n        ),\n        pytest.param(\n            \"nagl\",\n            \"rdkit\",\n            \"nagl\",\n            marks=pytest.mark.skipif(\n                not HAS_NAGL or HAS_OPENEYE or sys.platform.startswith(\"darwin\"),\n                reason=\"needs NAGL (without oechem) and/or on macos\",\n            ),\n        ),\n        pytest.param(\n            \"espaloma\",\n            \"rdkit\",\n            \"espaloma\",\n            marks=pytest.mark.skipif(not HAS_ESPALOMA_CHARGE, reason=\"needs espaloma charge\"),\n        ),\n    ],\n)\ndef test_dry_run_charge_backends(\n    CN_molecule, tmp_path, method, backend, ref_key, vac_settings, am1bcc_ref_charges\n):\n    vac_settings.partial_charge_settings.partial_charge_method = method\n    vac_settings.partial_charge_settings.off_toolkit_backend = backend\n    vac_settings.partial_charge_settings.nagl_model = \"openff-gnn-am1bcc-0.1.0-rc.1.pt\"\n\n    protocol = PlainMDProtocol(settings=vac_settings)\n\n    csystem = openfe.ChemicalSystem({\"ligand\": CN_molecule})\n\n    dag = protocol.create(stateA=csystem, stateB=csystem, mapping=None)\n    md_unit = list(dag.protocol_units)[0]\n\n    result = md_unit.run(dry=True, scratch_basepath=tmp_path, shared_basepath=tmp_path)\n    system = result[\"debug\"][\"system\"]\n\n    nonbond = [f for f in system.getForces() if isinstance(f, NonbondedForce)][0]\n\n    charges = []\n    for i in range(system.getNumParticles()):\n        c, s, e = nonbond.getParticleParameters(i)\n        charges.append(from_openmm(c))\n\n    charges = unit.Quantity.from_list(charges)\n\n    assert_allclose(am1bcc_ref_charges[ref_key], charges, rtol=1e-4)\n\n\ndef test_dry_many_molecules_solvent(benzene_many_solv_system, tmp_path):\n    \"\"\"\n    A basic test flushing \"will it work if you pass multiple molecules\"\n    \"\"\"\n    settings = PlainMDProtocol.default_settings()\n    settings.engine_settings.compute_platform = None\n\n    protocol = PlainMDProtocol(settings=settings)\n\n    # create DAG from protocol and take first (and only) work unit from within\n    dag = protocol.create(\n        stateA=benzene_many_solv_system,\n        stateB=benzene_many_solv_system,\n        mapping=None,\n    )\n    dag_unit = list(dag.protocol_units)[0]\n\n    dag_unit.run(dry=True, scratch_basepath=tmp_path, shared_basepath=tmp_path)[\"debug\"][\"system\"]\n\n\nBENZ = \"\"\"\\\nbenzene\n  PyMOL2.5          3D                             0\n\n 12 12  0  0  0  0  0  0  0  0999 V2000\n    1.4045   -0.0000    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0\n    0.7022    1.2164    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -0.7023    1.2164    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -1.4045   -0.0000    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -0.7023   -1.2164    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0\n    0.7023   -1.2164    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0\n    2.5079   -0.0000    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0\n    1.2540    2.1720    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -1.2540    2.1720    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -2.5079   -0.0000    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -1.2540   -2.1719    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0\n    1.2540   -2.1720    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0\n  1  2  2  0  0  0  0\n  1  6  1  0  0  0  0\n  1  7  1  0  0  0  0\n  2  3  1  0  0  0  0\n  2  8  1  0  0  0  0\n  3  4  2  0  0  0  0\n  3  9  1  0  0  0  0\n  4  5  1  0  0  0  0\n  4 10  1  0  0  0  0\n  5  6  2  0  0  0  0\n  5 11  1  0  0  0  0\n  6 12  1  0  0  0  0\nM  END\n$$$$\n\"\"\"\n\n\nPYRIDINE = \"\"\"\\\npyridine\n  PyMOL2.5          3D                             0\n\n 11 11  0  0  0  0  0  0  0  0999 V2000\n    1.4045   -0.0000    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -0.7023    1.2164    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -1.4045   -0.0000    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -0.7023   -1.2164    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0\n    0.7023   -1.2164    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0\n    2.4940   -0.0325    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0\n    1.2473   -2.1604    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -1.2473   -2.1604    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -2.4945   -0.0000    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -1.2753    2.1437    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0\n    0.7525    1.3034    0.0000 N   0  0  0  0  0  0  0  0  0  0  0  0\n  1  5  1  0  0  0  0\n  1  6  1  0  0  0  0\n  1 11  2  0  0  0  0\n  2  3  2  0  0  0  0\n  2 10  1  0  0  0  0\n  3  4  1  0  0  0  0\n  3  9  1  0  0  0  0\n  4  5  2  0  0  0  0\n  4  8  1  0  0  0  0\n  5  7  1  0  0  0  0\n  2 11  1  0  0  0  0\nM  END\n$$$$\n\"\"\"\n\n\ndef test_dry_run_ligand_tip4p(benzene_system, tmp_path):\n    \"\"\"\n    Test that we can create a system with virtual sites in the\n    environment (waters)\n    \"\"\"\n    settings = PlainMDProtocol.default_settings()\n    settings.engine_settings.compute_platform = None\n    settings.forcefield_settings.forcefields = [\n        \"amber/ff14SB.xml\",  # ff14SB protein force field\n        \"amber/tip4pew_standard.xml\",  # FF we are testing with the fun VS\n        \"amber/phosaa10.xml\",  # Handles THE TPO\n    ]\n    # we need a larger padding distance when using the dodecahedron box\n    settings.solvation_settings.solvent_padding = 1.5 * unit.nanometer\n    settings.forcefield_settings.nonbonded_cutoff = 0.9 * unit.nanometer\n    settings.solvation_settings.solvent_model = \"tip4pew\"\n    settings.integrator_settings.reassign_velocities = True\n\n    protocol = PlainMDProtocol(settings=settings)\n    dag = protocol.create(\n        stateA=benzene_system,\n        stateB=benzene_system,\n        mapping=None,\n    )\n    dag_unit = list(dag.protocol_units)[0]\n\n    result = dag_unit.run(dry=True, scratch_basepath=tmp_path, shared_basepath=tmp_path)\n    system = result[\"debug\"][\"system\"]\n    assert system\n\n\n@pytest.mark.slow\ndef test_dry_run_complex(benzene_complex_system, tmp_path):\n    # this will be very time consuming\n    settings = PlainMDProtocol.default_settings()\n    settings.engine_settings.compute_platform = None\n\n    protocol = PlainMDProtocol(settings=settings)\n    dag = protocol.create(\n        stateA=benzene_complex_system,\n        stateB=benzene_complex_system,\n        mapping=None,\n    )\n    dag_unit = list(dag.protocol_units)[0]\n\n    result = dag_unit.run(dry=True, scratch_basepath=tmp_path, shared_basepath=tmp_path)\n    sim = result[\"debug\"][\"system\"]\n    assert ThermodynamicState(\n        sim,\n        temperature=to_openmm(protocol.settings.thermo_settings.temperature),\n    ).is_periodic\n    assert isinstance(\n        ThermodynamicState(\n            sim,\n            temperature=to_openmm(protocol.settings.thermo_settings.temperature),\n        ).barostat,\n        MonteCarloBarostat,\n    )\n    assert (\n        ThermodynamicState(\n            sim,\n            temperature=to_openmm(protocol.settings.thermo_settings.temperature),\n        ).pressure\n        == 1 * omm_unit.bar\n    )\n\n\ndef test_hightimestep(benzene_vacuum_system, tmp_path):\n    settings = PlainMDProtocol.default_settings()\n    settings.forcefield_settings.hydrogen_mass = 1.0\n    settings.forcefield_settings.nonbonded_method = \"nocutoff\"\n\n    p = PlainMDProtocol(settings=settings)\n    errmsg = \"too large for hydrogen mass\"\n    # make sure this is triggered in validate\n    with pytest.raises(ValueError, match=errmsg):\n        _ = p.create(\n            stateA=benzene_vacuum_system,\n            stateB=benzene_vacuum_system,\n            mapping=None,\n        )\n\n\ndef test_vaccuum_PME_error(benzene_vacuum_system):\n    p = PlainMDProtocol(\n        settings=PlainMDProtocol.default_settings(),\n    )\n    errmsg = \"PME cannot be used for vacuum transform\"\n    # make sure this is triggered in validate\n    with pytest.raises(ValueError, match=errmsg):\n        _ = p.create(\n            stateA=benzene_vacuum_system,\n            stateB=benzene_vacuum_system,\n            mapping=None,\n        )\n\n\ndef test_multiple_basesolvents_error(a2a_protein_membrane_component):\n    p = PlainMDProtocol(\n        settings=PlainMDProtocol.default_settings(),\n    )\n    system = ChemicalSystem(\n        {\n            \"protein-membrane\": a2a_protein_membrane_component,\n            \"solvent\": openfe.SolventComponent(),\n        }\n    )\n    errmsg = \"Multiple BaseSolventComponents found, only one is supported.\"\n    with pytest.raises(ValueError, match=errmsg):\n        _ = p.create(\n            stateA=system,\n            stateB=system,\n            mapping=None,\n        )\n\n\ndef test_states_not_matching_error(benzene_vacuum_system, toluene_vacuum_system):\n    p = PlainMDProtocol(settings=PlainMDProtocol.default_settings())\n    errmsg = \"The two end states do not match.\"\n    with pytest.raises(ValueError, match=errmsg):\n        _ = p.create(\n            stateA=benzene_vacuum_system,\n            stateB=toluene_vacuum_system,\n            mapping=None,\n        )\n\n\ndef test_mapping_warning(benzene_vacuum_system, tmp_path):\n    settings = PlainMDProtocol.default_settings()\n    settings.forcefield_settings.nonbonded_method = \"nocutoff\"\n    p = PlainMDProtocol(settings=settings)\n    warnmsg = \"A mapping was passed but is not used by this Protocol.\"\n    benzene = benzene_vacuum_system.components[\"ligand\"]\n    with pytest.warns(match=warnmsg):\n        _ = p.create(\n            stateA=benzene_vacuum_system,\n            stateB=benzene_vacuum_system,\n            mapping=LigandAtomMapping(\n                componentA=benzene,\n                componentB=benzene,\n                componentA_to_componentB=dict((i, i) for i in range(12)),\n            ),\n        )\n\n\n@pytest.fixture\ndef solvent_protocol_dag(benzene_system):\n    settings = PlainMDProtocol.default_settings()\n    settings.protocol_repeats = 3\n    protocol = PlainMDProtocol(settings=settings)\n\n    return protocol.create(\n        stateA=benzene_system,\n        stateB=benzene_system,\n        mapping=None,\n    )\n\n\ndef test_unit_tagging(benzene_system, tmp_path):\n    # test that executing the Units includes correct generation and repeat info\n    settings = PlainMDProtocol.default_settings()\n    settings.protocol_repeats = 3\n    protocol = PlainMDProtocol(settings=settings)\n    dag = protocol.create(\n        stateA=benzene_system,\n        stateB=benzene_system,\n        mapping=None,\n    )\n    dag_units = dag.protocol_units\n\n    with mock.patch(\n        \"openfe.protocols.openmm_md.plain_md_methods.PlainMDSimulationUnit.run\",\n        return_value={\n            \"nc\": \"simulation.xtc\",\n            \"last_checkpoint\": \"checkpoint.chk\",\n        },\n    ):\n        results = []\n        for u in dag_units:\n            # just execute the setup unit so we don't have to pass the results though to the simulation unit\n            if isinstance(u, PlainMDSetupUnit):\n                ret = u.execute(context=gufe.Context(tmp_path, tmp_path))\n                results.append(ret)\n\n    repeats = set()\n    for ret in results:\n        assert isinstance(ret, gufe.ProtocolUnitResult)\n        assert ret.outputs[\"generation\"] == 0\n        repeats.add(ret.outputs[\"repeat_id\"])\n    # repeats are random ints, so check we got 3 individual numbers\n    assert len(repeats) == 3\n\n\ndef test_gather(solvent_protocol_dag, tmp_path):\n    # check .gather behaves as expected\n    with mock.patch(\n        \"openfe.protocols.openmm_md.plain_md_methods.PlainMDSimulationUnit.run\",\n        return_value={\n            \"nc\": \"simulation.xtc\",\n            \"last_checkpoint\": \"checkpoint.chk\",\n        },\n    ):\n        dagres = gufe.protocols.execute_DAG(\n            solvent_protocol_dag,\n            shared_basedir=tmp_path,\n            scratch_basedir=tmp_path,\n            keep_shared=True,\n        )\n\n    settings = PlainMDProtocol.default_settings()\n    settings.protocol_repeats = 3\n    prot = PlainMDProtocol(settings=settings)\n\n    res = prot.gather([dagres])\n\n    assert isinstance(res, PlainMDProtocolResult)\n\n\nclass TestProtocolResult:\n    @pytest.fixture()\n    def protocolresult(self, md_json):\n        d = json.loads(md_json, cls=gufe.tokenization.JSON_HANDLER.decoder)\n\n        pr = openfe.ProtocolResult.from_dict(d[\"protocol_result\"])\n\n        return pr\n\n    def test_reload_protocol_result(self, md_json):\n        d = json.loads(md_json, cls=gufe.tokenization.JSON_HANDLER.decoder)\n\n        pr = openmm_md.plain_md_methods.PlainMDProtocolResult.from_dict(d[\"protocol_result\"])\n\n        assert pr\n\n    def test_get_estimate(self, protocolresult):\n        est = protocolresult.get_estimate()\n\n        assert est is None\n\n    def test_get_uncertainty(self, protocolresult):\n        est = protocolresult.get_uncertainty()\n\n        assert est is None\n\n    def test_get_traj_filename(self, protocolresult):\n        traj = protocolresult.get_traj_filename()\n\n        assert isinstance(traj, list)\n        assert isinstance(traj[0], pathlib.Path)\n\n    def test_get_pdb_filename(self, protocolresult):\n        pdb = protocolresult.get_pdb_filename()\n\n        assert isinstance(pdb, list)\n        assert isinstance(pdb[0], pathlib.Path)\n"
  },
  {
    "path": "src/openfe/tests/protocols/openmm_md/test_plain_md_resume.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\nimport os\nimport pathlib\nimport shutil\n\nimport gufe\nimport openmm\nimport openmm.unit as openmm_unit\nimport pytest\nfrom gufe import ChemicalSystem, SmallMoleculeComponent\nfrom gufe.protocols.errors import ProtocolUnitExecutionError\nfrom openff.units import unit\n\nimport openfe\nfrom openfe.data._registry import POOCH_CACHE\nfrom openfe.protocols.openmm_md.plain_md_methods import (\n    PlainMDProtocol,\n    PlainMDSetupUnit,\n    PlainMDSimulationUnit,\n)\n\nfrom ...conftest import HAS_INTERNET\n\n\n@pytest.fixture()\ndef vacuum_protocol_settings():\n    # setup a cheap vacuum md protocol\n    settings = PlainMDProtocol.default_settings()\n    settings.protocol_repeats = 1\n    settings.forcefield_settings.nonbonded_method = \"nocutoff\"\n    settings.engine_settings.compute_platform = None\n    settings.simulation_settings.equilibration_length_nvt = 1 * unit.picoseconds\n    settings.simulation_settings.equilibration_length = 1 * unit.picoseconds\n    settings.simulation_settings.production_length = 1 * unit.picoseconds\n    settings.output_settings.checkpoint_interval = 0.5 * unit.picoseconds\n    settings.output_settings.trajectory_write_interval = 0.5 * unit.picoseconds\n    return settings\n\n\ndef test_verify_execution_environment():\n    # verify using the current versions of the software\n    PlainMDSimulationUnit._verify_execution_environment(\n        setup_outputs={\n            \"gufe_version\": gufe.__version__,\n            \"openfe_version\": openfe.__version__,\n            \"openmm_version\": openmm.__version__,\n        }\n    )\n\n\ndef test_verify_execution_environment_fail():\n    # pass in different versions to force failure\n    with pytest.raises(ProtocolUnitExecutionError, match=\"Python environment\"):\n        PlainMDSimulationUnit._verify_execution_environment(\n            setup_outputs={\n                \"gufe_version\": 0.1,\n                \"openfe_version\": openmm.__version__,\n                \"openmm_version\": openmm.__version__,\n            }\n        )\n\n\ndef test_verify_execution_env_missing_key():\n    errmsg = \"Missing environment information from setup outputs.\"\n    with pytest.raises(ProtocolUnitExecutionError, match=errmsg):\n        PlainMDSimulationUnit._verify_execution_environment(\n            setup_outputs={\n                \"foo_version\": 0.1,\n                \"openfe_version\": openfe.__version__,\n                \"openmm_version\": openmm.__version__,\n            },\n        )\n\n\n@pytest.mark.skipif(\n    not os.path.exists(POOCH_CACHE) and not HAS_INTERNET,\n    reason=\"Internet unavailable and test data is not cached locally\",\n)\ndef test_check_restart(vacuum_protocol_settings, plain_md_checkpoint_path):\n    # test we can correctly detect when we should be restarting\n    assert PlainMDSimulationUnit._check_restart(\n        output_settings=vacuum_protocol_settings.output_settings,\n        shared_path=plain_md_checkpoint_path.parent,\n    )\n\n    # make sure it does not try and restart if inputs are missing\n    assert not PlainMDSimulationUnit._check_restart(\n        output_settings=vacuum_protocol_settings.output_settings,\n        shared_path=pathlib.Path(\".\"),\n    )\n\n\n@pytest.mark.skipif(\n    not os.path.exists(POOCH_CACHE) and not HAS_INTERNET,\n    reason=\"Internet unavailable and test data is not cached locally\",\n)\nclass TestPlainMDResume:\n    @pytest.fixture\n    def protocol_dag(self, vacuum_protocol_settings, benzene_vacuum_system):\n        protocol = PlainMDProtocol(\n            settings=vacuum_protocol_settings,\n        )\n        return protocol.create(\n            stateA=benzene_vacuum_system, stateB=benzene_vacuum_system, mapping=None\n        )\n\n    def test_resume(\n        self, protocol_dag, tmp_path, caplog, vacuum_protocol_settings, plain_md_checkpoint_path\n    ):\n        # test that we can resume a simulation from a checkpoint\n        protocol_units = list(protocol_dag.protocol_units)\n        setup_unit: PlainMDSetupUnit = protocol_units[0]\n        simulation_unit: PlainMDSimulationUnit = protocol_units[1]\n        # copy the files over\n        shutil.copyfile(plain_md_checkpoint_path, tmp_path / \"checkpoint.xml\")\n        # dry run the setup unit\n        setup_results = setup_unit.run(\n            dry=True, scratch_basepath=tmp_path, shared_basepath=tmp_path\n        )\n        # make sure the protocol thinks it can restart\n        assert PlainMDSimulationUnit._check_restart(\n            output_settings=vacuum_protocol_settings.output_settings,\n            shared_path=tmp_path,\n        )\n        # now run the simulation unit in resume mode this should be 0.5 ps of equilibration and 1 ps of production\n        sim_results = simulation_unit.run(\n            system=setup_results[\"debug\"][\"system\"],\n            positions=setup_results[\"debug\"][\"positions\"],\n            topology=setup_results[\"debug\"][\"topology\"],\n            equil_steps_nvt=setup_results[\"equil_steps_nvt\"],\n            equil_steps_npt=setup_results[\"equil_steps_npt\"],\n            prod_steps=setup_results[\"prod_steps\"],\n            verbose=True,\n            scratch_basepath=tmp_path,\n            shared_basepath=tmp_path,\n        )\n        # make sure it prints that its restarting\n        assert \"Restarting simulation from checkpoint state\" in caplog.text\n        # check the number of npt steps to run is correct, this should be 0.5 ps at 4fs timestep\n        assert \"Running NPT equilibration for 125 steps\" in caplog.text\n        # make sure the production phase steps are correct, this should be the full 1ps at 4fs timestep\n        assert \"Running production phase for 250 steps\" in caplog.text\n\n        # check the outputs of the simulation unit\n        assert sim_results[\"system_pdb\"].exists()\n        assert sim_results[\"nc\"].exists()\n        assert sim_results[\"last_checkpoint\"]\n\n        # load the final checkpoint and check the simulation time is correct, this should be 3 ps\n        # also check the total step count\n        simulation = openmm.app.Simulation(\n            setup_results[\"debug\"][\"topology\"],\n            setup_results[\"debug\"][\"system\"],\n            openmm.LangevinMiddleIntegrator(\n                298.15 * openmm_unit.kelvin,\n                1.0 / openmm_unit.picosecond,\n                4 * openmm_unit.femtoseconds,\n            ),\n        )\n        simulation.context.setPositions(setup_results[\"debug\"][\"positions\"])\n        simulation.loadState(str(sim_results[\"last_checkpoint\"]))\n        total_sim_time = simulation.context.getTime()\n        # check the time is 3 ps\n        assert total_sim_time.value_in_unit(openmm_unit.picoseconds) == pytest.approx(3)\n        # check the step count has been extended\n        assert simulation.context.getStepCount() == 750\n"
  },
  {
    "path": "src/openfe/tests/protocols/openmm_md/test_plain_md_slow.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\nimport pathlib\n\nimport pytest\nfrom gufe.protocols import execute_DAG\nfrom openff.units import unit\n\nfrom openfe.protocols import openmm_md\n\n\n@pytest.mark.integration\n@pytest.mark.parametrize(\"platform\", [\"CPU\", \"CUDA\"])\ndef test_vacuum_sim(\n    benzene_vacuum_system,\n    platform,\n    available_platforms,\n    tmp_path,\n):\n    if platform not in available_platforms:\n        pytest.skip(f\"OpenMM Platform: {platform} is not available\")\n\n    # Run a vacuum MD simulation and check what files we get.\n    settings = openmm_md.PlainMDProtocol.default_settings()\n    settings.simulation_settings.equilibration_length_nvt = None\n    settings.simulation_settings.equilibration_length = 10 * unit.picosecond\n    settings.simulation_settings.production_length = 20 * unit.picosecond\n    settings.output_settings.checkpoint_interval = 5 * unit.picosecond\n    settings.forcefield_settings.nonbonded_method = \"nocutoff\"\n    settings.engine_settings.compute_platform = platform\n\n    prot = openmm_md.PlainMDProtocol(settings)\n\n    dag = prot.create(\n        stateA=benzene_vacuum_system,\n        stateB=benzene_vacuum_system,\n        mapping=None,\n    )\n\n    r = execute_DAG(\n        dag,\n        shared_basedir=tmp_path,\n        scratch_basedir=tmp_path,\n        keep_shared=True,\n    )\n\n    assert r.ok()\n\n    assert len(r.protocol_unit_results) == 2\n\n    pur = r.protocol_unit_results[1]\n    unit_shared = tmp_path / f\"shared_{pur.source_key}_attempt_0\"\n    assert unit_shared.exists()\n    assert pathlib.Path(unit_shared).is_dir()\n\n    # check the files\n    files = [\n        \"equil_npt.pdb\",\n        \"minimized.pdb\",\n        \"simulation.xtc\",\n        \"simulation.log\",\n        \"checkpoint.xml\",\n    ]\n    for file in files:\n        assert (unit_shared / file).exists()\n\n    # NVT PDB should not exist\n    assert not (unit_shared / \"equil_nvt.pdb\").exists()\n\n    # check that the output file paths are correct\n    assert pur.outputs[\"system_pdb\"] == unit_shared / \"system.pdb\"\n    assert pur.outputs[\"minimized_pdb\"] == unit_shared / \"minimized.pdb\"\n    assert pur.outputs[\"nc\"] == unit_shared / \"simulation.xtc\"\n    assert pur.outputs[\"last_checkpoint\"] == unit_shared / \"checkpoint.xml\"\n    assert pur.outputs[\"npt_equil_pdb\"] == unit_shared / \"equil_npt.pdb\"\n    assert pur.outputs[\"nvt_equil_pdb\"] is None\n\n\n@pytest.mark.integration\n@pytest.mark.parametrize(\"platform\", [\"CUDA\"])\ndef test_complex_solvent_sim_gpu(\n    benzene_complex_system,\n    platform,\n    available_platforms,\n    tmp_path,\n):\n    if platform not in available_platforms:\n        pytest.skip(f\"OpenMM Platform: {platform} is not available\")\n\n    # Run an MD simulation and check what files we get.\n    settings = openmm_md.PlainMDProtocol.default_settings()\n    settings.simulation_settings.equilibration_length_nvt = 50 * unit.picosecond\n    settings.simulation_settings.equilibration_length = 50 * unit.picosecond\n    settings.simulation_settings.production_length = 100 * unit.picosecond\n    settings.output_settings.checkpoint_interval = 10 * unit.picosecond\n    settings.engine_settings.compute_platform = platform\n\n    prot = openmm_md.PlainMDProtocol(settings)\n\n    dag = prot.create(\n        stateA=benzene_complex_system,\n        stateB=benzene_complex_system,\n        mapping=None,\n    )\n\n    r = execute_DAG(\n        dag,\n        shared_basedir=tmp_path,\n        scratch_basedir=tmp_path,\n        keep_shared=True,\n    )\n\n    assert r.ok()\n\n    assert len(r.protocol_unit_results) == 2\n\n    pur = r.protocol_unit_results[1]\n    unit_shared = tmp_path / f\"shared_{pur.source_key}_attempt_0\"\n    assert unit_shared.exists()\n    assert pathlib.Path(unit_shared).is_dir()\n\n    # check the files\n    files = [\n        \"checkpoint.xml\",\n        \"equil_nvt.pdb\",\n        \"equil_npt.pdb\",\n        \"minimized.pdb\",\n        \"simulation.xtc\",\n        \"simulation.log\",\n    ]\n    for file in files:\n        assert (unit_shared / file).exists()\n\n    # check that the output file paths are correct\n    assert pur.outputs[\"system_pdb\"] == unit_shared / \"system.pdb\"\n    assert pur.outputs[\"minimized_pdb\"] == unit_shared / \"minimized.pdb\"\n    assert pur.outputs[\"nc\"] == unit_shared / \"simulation.xtc\"\n    assert pur.outputs[\"last_checkpoint\"] == unit_shared / \"checkpoint.xml\"\n    assert pur.outputs[\"nvt_equil_pdb\"] == unit_shared / \"equil_nvt.pdb\"\n    assert pur.outputs[\"npt_equil_pdb\"] == unit_shared / \"equil_npt.pdb\"\n"
  },
  {
    "path": "src/openfe/tests/protocols/openmm_md/test_plain_md_tokenization.py",
    "content": "# This ccode is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\nimport json\n\nimport gufe\nimport pytest\nfrom gufe.tests.test_tokenization import GufeTokenizableTestsMixin\n\nfrom openfe.protocols import openmm_md\n\n\n@pytest.fixture\ndef protocol():\n    return openmm_md.PlainMDProtocol(openmm_md.PlainMDProtocol.default_settings())\n\n\n@pytest.fixture\ndef protocol_units(protocol, benzene_system):\n    pus = protocol.create(\n        stateA=benzene_system,\n        stateB=benzene_system,\n        mapping=None,\n    )\n    return list(pus.protocol_units)\n\n\n@pytest.fixture\ndef protocol_setup_unit(protocol, protocol_units):\n    for pu in protocol_units:\n        if isinstance(pu, openmm_md.PlainMDSetupUnit):\n            return pu\n\n\n@pytest.fixture\ndef protocol_simulation_unit(protocol, protocol_units):\n    for pu in protocol_units:\n        if isinstance(pu, openmm_md.PlainMDSimulationUnit):\n            return pu\n\n\n@pytest.fixture\ndef protocol_result(md_json):\n    d = json.loads(md_json, cls=gufe.tokenization.JSON_HANDLER.decoder)\n    pr = gufe.ProtocolResult.from_dict(d[\"protocol_result\"])\n    return pr\n\n\nclass TestPlainMDProtocol(GufeTokenizableTestsMixin):\n    cls = openmm_md.PlainMDProtocol\n    key = None\n    repr = \"PlainMDProtocol-\"\n\n    @pytest.fixture()\n    def instance(self, protocol):\n        return protocol\n\n    def test_repr(self, instance):\n        \"\"\"\n        Overwrites the base `test_repr` call to do a bit more.\n        \"\"\"\n        assert isinstance(repr(instance), str)\n        assert self.repr in repr(instance)\n\n\nclass TestPlainMDSetupUnit(GufeTokenizableTestsMixin):\n    cls = openmm_md.PlainMDSetupUnit\n    repr = \"PlainMDSetupUnit(\"\n    key = None\n\n    @pytest.fixture\n    def instance(self, protocol_setup_unit):\n        return protocol_setup_unit\n\n    def test_repr(self, instance):\n        \"\"\"\n        Overwrites the base `test_repr` call to do a bit more.\n        \"\"\"\n        assert isinstance(repr(instance), str)\n        assert self.repr in repr(instance)\n\n\nclass TestPlainMDSimulationUnit(GufeTokenizableTestsMixin):\n    cls = openmm_md.PlainMDSimulationUnit\n    repr = \"PlainMDSimulationUnit(\"\n    key = None\n\n    @pytest.fixture()\n    def instance(self, protocol_simulation_unit):\n        return protocol_simulation_unit\n\n    def test_repr(self, instance):\n        assert isinstance(repr(instance), str)\n        assert self.repr in repr(instance)\n\n\nclass TestPlainMDProtocolResult(GufeTokenizableTestsMixin):\n    cls = openmm_md.PlainMDProtocolResult\n    key = None\n    repr = \"PlainMDProtocolResult-\"\n\n    @pytest.fixture()\n    def instance(self, protocol_result):\n        return protocol_result\n\n    def test_repr(self, instance):\n        \"\"\"\n        Overwrites the base `test_repr` call to do a bit more.\n        \"\"\"\n        assert isinstance(repr(instance), str)\n        assert self.repr in repr(instance)\n"
  },
  {
    "path": "src/openfe/tests/protocols/openmm_rfe/__init__.py",
    "content": ""
  },
  {
    "path": "src/openfe/tests/protocols/openmm_rfe/helpers.py",
    "content": "from itertools import chain\n\nimport numpy as np\nimport openmm\nfrom gufe import LigandAtomMapping, ProteinComponent, SolventComponent\nfrom openff.units.openmm import ensure_quantity, from_openmm, to_openmm\nfrom openmm import app, unit\nfrom openmmforcefields.generators import SystemGenerator\n\nfrom openfe.protocols.openmm_rfe import _rfe_utils\nfrom openfe.protocols.openmm_rfe._rfe_utils.relative import HybridTopologyFactory\nfrom openfe.protocols.openmm_utils import system_creation\n\n\ndef make_htf(\n    mapping: LigandAtomMapping,\n    settings,\n    protein: ProteinComponent = None,\n    solvent: SolventComponent = None,\n) -> HybridTopologyFactory:\n    \"\"\"Code copied from the RBFE protocol to make an HTF.\"\"\"\n\n    system_generator = SystemGenerator(\n        forcefields=settings.forcefield_settings.forcefields,\n        small_molecule_forcefield=settings.forcefield_settings.small_molecule_forcefield,\n        forcefield_kwargs={\n            \"constraints\": app.HBonds,\n            \"rigidWater\": True,\n            \"hydrogenMass\": settings.forcefield_settings.hydrogen_mass * unit.amu,\n            \"removeCMMotion\": settings.integrator_settings.remove_com,\n        },\n        periodic_forcefield_kwargs={\n            \"nonbondedMethod\": app.PME,\n            \"nonbondedCutoff\": 0.9 * unit.nanometers,\n        },\n        barostat=openmm.MonteCarloBarostat(\n            ensure_quantity(settings.thermo_settings.pressure, \"openmm\"),\n            ensure_quantity(settings.thermo_settings.temperature, \"openmm\"),\n            settings.integrator_settings.barostat_frequency.m,\n        ),\n        cache=None,\n    )\n    small_mols = [mapping.componentA, mapping.componentB]\n    # copy a lot of code from the RHT protocol\n    off_small_mols = {\n        \"stateA\": [(mapping.componentA, mapping.componentA.to_openff())],\n        \"stateB\": [(mapping.componentB, mapping.componentB.to_openff())],\n        \"both\": [\n            (m, m.to_openff())\n            for m in small_mols\n            if (m != mapping.componentA and m != mapping.componentB)\n        ],\n    }\n\n    # c. force the creation of parameters\n    # This is necessary because we need to have the FF templates\n    # registered ahead of solvating the system.\n    for smc, mol in chain(\n        off_small_mols[\"stateA\"], off_small_mols[\"stateB\"], off_small_mols[\"both\"]\n    ):\n        system_generator.create_system(mol.to_topology().to_openmm(), molecules=[mol])\n\n    # c. get OpenMM Modeller + a dictionary of resids for each component\n    stateA_modeller, comp_resids = system_creation.get_omm_modeller(\n        # add the protein if passed\n        protein_comp=protein,\n        # add the solvent if passed\n        solvent_comp=solvent,\n        small_mols=dict(chain(off_small_mols[\"stateA\"], off_small_mols[\"both\"])),\n        omm_forcefield=system_generator.forcefield,\n        solvent_settings=settings.solvation_settings,\n    )\n    # d. get topology & positions\n    # Note: roundtrip positions to remove vec3 issues\n    stateA_topology = stateA_modeller.getTopology()\n    stateA_positions = to_openmm(from_openmm(stateA_modeller.getPositions()))\n\n    # e. create the stateA System\n    stateA_system = system_generator.create_system(\n        stateA_modeller.topology,\n        molecules=[m for _, m in chain(off_small_mols[\"stateA\"], off_small_mols[\"both\"])],\n    )\n\n    # 2. Get stateB system\n    # a. get the topology\n    stateB_topology, stateB_alchem_resids = _rfe_utils.topologyhelpers.combined_topology(\n        stateA_topology,\n        # zeroth item (there's only one) then get the OFF representation\n        off_small_mols[\"stateB\"][0][1].to_topology().to_openmm(),\n        exclude_resids=comp_resids[mapping.componentA],\n    )\n\n    # b. get a list of small molecules for stateB\n    stateB_system = system_generator.create_system(\n        stateB_topology,\n        molecules=[m for _, m in chain(off_small_mols[\"stateB\"], off_small_mols[\"both\"])],\n    )\n\n    #  c. Define correspondence mappings between the two systems\n    ligand_mappings = _rfe_utils.topologyhelpers.get_system_mappings(\n        mapping.componentA_to_componentB,\n        stateA_system,\n        stateA_topology,\n        comp_resids[mapping.componentA],\n        stateB_system,\n        stateB_topology,\n        stateB_alchem_resids,\n        # These are non-optional settings for this method\n        fix_constraints=True,\n    )\n\n    #  e. Finally get the positions\n    stateB_positions = _rfe_utils.topologyhelpers.set_and_check_new_positions(\n        ligand_mappings,\n        stateA_topology,\n        stateB_topology,\n        old_positions=ensure_quantity(stateA_positions, \"openmm\"),\n        insert_positions=ensure_quantity(off_small_mols[\"stateB\"][0][1].conformers[0], \"openmm\"),\n    )\n    return HybridTopologyFactory(\n        old_system=stateA_system,\n        old_positions=stateA_positions,\n        old_topology=stateA_topology,\n        new_system=stateB_system,\n        new_positions=stateB_positions,\n        new_topology=stateB_topology,\n        old_to_new_atom_map=ligand_mappings[\"old_to_new_atom_map\"],\n        old_to_new_core_atom_map=ligand_mappings[\"old_to_new_core_atom_map\"],\n        use_dispersion_correction=settings.alchemical_settings.use_dispersion_correction,\n        softcore_alpha=settings.alchemical_settings.softcore_alpha,\n        softcore_LJ_v2=True,\n        softcore_LJ_v2_alpha=settings.alchemical_settings.softcore_alpha,\n        interpolate_old_and_new_14s=settings.alchemical_settings.turn_off_core_unique_exceptions,\n    )\n\n\ndef _make_system_with_cmap(\n    map_sizes: list[int],\n    mapped_torsions: list[tuple[int, int, int, int, int, int, int, int, int]] | None = None,\n    num_atoms: int = 8,\n) -> tuple[openmm.System, openmm.app.Topology, openmm.unit.Quantity]:\n    \"\"\"\n    Build an OpenMM System with a CMAP term based on the provided mapping data.\n\n    Parameters\n    ----------\n    map_sizes : list[int]\n        A list of integers specifying the sizes of the CMAP grids to be added.\n    mapped_torsions : list[tuple[int, int, int, int, int, int, int, int, int]], optional\n        A list of tuples specifying the atom indices for each mapped torsion.\n        Each tuple should contain 9 integers: the first is the map index,\n        followed by the 8 atom indices defining the two dihedrals.\n        If None, a default torsion will be added using the first 8 atoms.\n    num_atoms : int, optional\n        The total number of atoms in the system must be >= 8. Default is 8 the minimum required for a single CMAP.\n\n    Returns\n    -------\n    tuple[openmm.System, openmm.app.Topology, openmm.unit.Quantity]\n        A tuple containing the OpenMM System, Topology, and Positions.\n    \"\"\"\n    assert num_atoms >= 8, \"num_atoms must be at least 8 to accommodate mapped torsions\"\n    system = openmm.System()\n    # add dummy forces to avoid errors\n    for force in [\n        openmm.NonbondedForce,\n        openmm.HarmonicBondForce,\n        openmm.HarmonicAngleForce,\n        openmm.PeriodicTorsionForce,\n    ]:\n        system.addForce(force())\n\n    for _ in range(num_atoms):\n        system.addParticle(12.0)  # Add carbon-like particles\n\n    # create a CMAP force if we have map sizes to add\n    if map_sizes:\n        cmap_force = openmm.CMAPTorsionForce()\n\n        for map_size in map_sizes:\n            # Create a grid for the CMAP\n            grid = [0.0] * (map_size * map_size)\n            cmap_force.addMap(map_size, grid)\n\n        if mapped_torsions is None:\n            # add a single cmap term for all atoms using the first map\n            mapped_torsions = [(0, 0, 1, 2, 3, 4, 5, 6, 7)]\n\n        for torsion in mapped_torsions:\n            cmap_force.addTorsion(torsion[0], *torsion[1:])\n\n        system.addForce(cmap_force)\n\n    # build a basic topology for the number of atoms bonding each atom to the next\n    topology = openmm.app.Topology()\n    chain = topology.addChain()\n    res = topology.addResidue(\"RES\", chain)\n    atoms = []\n    for i in range(num_atoms):\n        atom = topology.addAtom(f\"C{i + 1}\", openmm.app.element.carbon, res)\n        atoms.append(atom)\n        if i > 0:\n            topology.addBond(atoms[i - 1], atoms[i])\n    # build a fake set of positions\n    positions = openmm.unit.Quantity(np.zeros((num_atoms, 3)), openmm.unit.nanometer)\n    return system, topology, positions\n"
  },
  {
    "path": "src/openfe/tests/protocols/openmm_rfe/test_hybrid_factory.py",
    "content": "import copy\n\nimport openmm\nimport pytest\nfrom openff.units import unit as offunit\nfrom openmm import app, unit\n\nfrom openfe.protocols.openmm_rfe import RelativeHybridTopologyProtocol, _rfe_utils\nfrom openfe.protocols.openmm_rfe._rfe_utils.relative import HybridTopologyFactory\nfrom openfe.tests.protocols.openmm_rfe.helpers import _make_system_with_cmap, make_htf\n\n\ndef test_cmap_system_no_dummy_pme_energy(htf_cmap_chlorobenzene_to_fluorobenzene):\n    \"\"\"\n    Test that we can make a hybrid topology for a system with conserved CMAP terms not in the alchemical region and that\n    the hybrid energy matches the end state energy.\n    \"\"\"\n    htf = htf_cmap_chlorobenzene_to_fluorobenzene[\"htf\"]\n    # make sure the cmap force was added to the internal store\n    assert \"cmap_torsion_force\" in htf._hybrid_system_forces\n    hybrid_system = htf.hybrid_system\n    # make sure we can find the force in the system\n    forces = htf_cmap_chlorobenzene_to_fluorobenzene[\"forces\"]\n    assert isinstance(forces[\"CMAPTorsionForce\"], openmm.CMAPTorsionForce)\n\n    integrator = openmm.LangevinIntegrator(\n        300 * unit.kelvin, 1.0 / unit.picosecond, 0.002 * unit.picoseconds\n    )\n    platform = openmm.Platform.getPlatformByName(\"Reference\")\n    default_lambda = _rfe_utils.lambdaprotocol.LambdaProtocol()\n\n    hybrid_simulation = app.Simulation(\n        topology=htf.omm_hybrid_topology,\n        system=hybrid_system,\n        integrator=integrator,\n        platform=platform,\n    )\n    for end_state, ref_system, ref_top, pos in [\n        (0, htf._old_system, htf._old_topology, htf._old_positions),\n        (1, htf._new_system, htf._new_topology, htf._new_positions),\n    ]:\n        # set lambda\n        # set all lambda values to the current end state\n        for name, func in default_lambda.functions.items():\n            val = func(end_state)\n            hybrid_simulation.context.setParameter(name, val)\n        # set positions\n        hybrid_simulation.context.setPositions(pos)\n        # get the hybrid system energy\n        hybrid_state = hybrid_simulation.context.getState(getEnergy=True)\n        hybrid_energy = hybrid_state.getPotentialEnergy().value_in_unit(unit.kilojoule_per_mole)\n        # now create a reference simulation\n        ref_simulation = app.Simulation(\n            topology=ref_top,\n            system=ref_system,\n            integrator=copy.deepcopy(integrator),\n            platform=platform,\n        )\n        ref_simulation.context.setPositions(pos)\n        ref_state = ref_simulation.context.getState(getEnergy=True)\n        ref_energy = ref_state.getPotentialEnergy().value_in_unit(unit.kilojoule_per_mole)\n        # energies should be the same\n        assert ref_energy == pytest.approx(hybrid_energy, rel=1e-5)\n        # make sure the energy is non-zero to avoid false positives\n        assert 0.0 != pytest.approx(hybrid_energy)\n\n\ndef test_cmap_missing_cmap_error():\n    \"\"\"Test that an error is raised if a CMAPTorsionForce is only present in one of the end states.\"\"\"\n    with pytest.raises(\n        RuntimeError,\n        match=\"Inconsistent CMAPTorsionForce between end states expected to be present in both\",\n    ):\n        old_system, old_topology, old_positions = _make_system_with_cmap([4])\n        new_system, new_topology, new_positions = _make_system_with_cmap([])\n        _ = HybridTopologyFactory(\n            old_system=old_system,\n            old_topology=old_topology,\n            old_positions=old_positions,\n            new_system=new_system,\n            new_topology=new_topology,\n            new_positions=new_positions,\n            # map all atoms so that one of the cmap atoms is in the alchemical core region\n            old_to_new_atom_map={0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7},\n            old_to_new_core_atom_map={4: 4},  # atom 4 is part of the cmap torsion\n        )\n\n\ndef test_verify_cmap_incompatible_maps_error():\n    \"\"\"Test that an error is raised if the number of CMAP terms differ between the end states.\"\"\"\n    old_cmap = openmm.CMAPTorsionForce()\n    new_cmap = openmm.CMAPTorsionForce()\n    old_cmap.addMap(2, [0.0] * 2 * 2)  # add one map\n    new_cmap.addMap(2, [0.0] * 2 * 2)  # add one map\n    new_cmap.addMap(2, [0.0] * 2 * 2)  # add a second map to make them incompatible\n    with pytest.raises(\n        RuntimeError,\n        match=\"Incompatible CMAPTorsionForce between end states expected to have same number of maps, found old: 1 and new: 2\",\n    ):\n        _ = HybridTopologyFactory._verify_cmap_compatibility(old_cmap, new_cmap)\n\n\ndef test_verify_cmap_incompatible_torsions_error():\n    \"\"\"Test that an error is raised if the number of CMAP torsions differ between the end states.\"\"\"\n    old_cmap = openmm.CMAPTorsionForce()\n    new_cmap = openmm.CMAPTorsionForce()\n    old_cmap.addMap(2, [0.0] * 2 * 2)  # add one map\n    new_cmap.addMap(2, [0.0] * 2 * 2)  # add one map\n    # add torsions\n    old_cmap.addTorsion(0, 0, 1, 2, 3, 4, 5, 6, 7)\n    new_cmap.addTorsion(0, 0, 1, 2, 3, 4, 5, 6, 7)\n    new_cmap.addTorsion(0, 1, 2, 3, 4, 5, 6, 7, 8)  # add a second torsion to make them incompatible\n    with pytest.raises(\n        RuntimeError,\n        match=\"Incompatible CMAPTorsionForce between end states expected to have same number of torsions, found old: 1 and new: 2\",\n    ):\n        _ = HybridTopologyFactory._verify_cmap_compatibility(old_cmap, new_cmap)\n\n\ndef test_cmap_maps_incompatible_error():\n    \"\"\"Test that an error is raised if the CMAP maps differ between the end states using a dummy system.\n    In this case the map parameters differ for map index 0 between the old and new systems\n    \"\"\"\n    old_system, old_topology, old_positions = _make_system_with_cmap([4])\n    new_system, new_topology, new_positions = _make_system_with_cmap([3])\n    with pytest.raises(\n        RuntimeError,\n        match=\"Incompatible CMAPTorsionForce map parameters found between end states for map 0 expected\",\n    ):\n        _ = HybridTopologyFactory(\n            old_system=old_system,\n            old_topology=old_topology,\n            old_positions=old_positions,\n            new_system=new_system,\n            new_topology=new_topology,\n            new_positions=new_positions,\n            # map all atoms so they end up in the environment\n            old_to_new_atom_map={0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7},\n            old_to_new_core_atom_map={},\n        )\n\n\ndef test_cmap_torsions_incompatible_error():\n    \"\"\"Test that an error is raised if the CMAP torsions differ between the end states using a dummy system.\n    In this case there is an extra cmap torsion in the new system not present in the old system.\"\"\"\n    old_system, old_topology, old_positions = _make_system_with_cmap([4], num_atoms=12)\n    new_system, new_topology, new_positions = _make_system_with_cmap(\n        [4],\n        num_atoms=12,\n        mapped_torsions=[\n            # change the mapped atoms from the default\n            (0, 4, 5, 6, 7, 8, 9, 10, 11)\n        ],\n    )\n    with pytest.raises(\n        RuntimeError, match=\"Incompatible CMAPTorsionForce term found between end states for atoms \"\n    ):\n        _ = HybridTopologyFactory(\n            old_system=old_system,\n            old_topology=old_topology,\n            old_positions=old_positions,\n            new_system=new_system,\n            new_topology=new_topology,\n            new_positions=new_positions,\n            # map all atoms so they end up in the environment\n            old_to_new_atom_map={\n                0: 0,\n                1: 1,\n                2: 2,\n                3: 3,\n                4: 4,\n                5: 5,\n                6: 6,\n                7: 7,\n                8: 8,\n                9: 9,\n                10: 10,\n                11: 11,\n            },\n            old_to_new_core_atom_map={},\n        )\n\n\ndef test_cmap_map_index_incompatible_error():\n    \"\"\"Test that an error is raised if the CMAP map indices differ between the end states using a dummy system.\n    In this case the map index for the single cmap torsion differs between the old and new systems.\"\"\"\n    old_system, old_topology, old_positions = _make_system_with_cmap([4, 5])\n    new_system, new_topology, new_positions = _make_system_with_cmap(\n        [4, 5],\n        mapped_torsions=[\n            # change the map index from the default\n            (1, 0, 1, 2, 3, 4, 5, 6, 7)\n        ],\n    )\n    # modify one of the torsions in the new system to make them incompatible\n    with pytest.raises(\n        RuntimeError,\n        match=\"Incompatible CMAPTorsionForce map index found between end states for atoms \",\n    ):\n        _ = HybridTopologyFactory(\n            old_system=old_system,\n            old_topology=old_topology,\n            old_positions=old_positions,\n            new_system=new_system,\n            new_topology=new_topology,\n            new_positions=new_positions,\n            # map all atoms so they end up in the environment\n            old_to_new_atom_map={0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7},\n            old_to_new_core_atom_map={},\n        )\n\n\ndef test_cmap_in_alchemical_region_error():\n    \"\"\"Test that an error is raised if a CMAP torsion is in the alchemical region.\"\"\"\n    old_system, old_topology, old_positions = _make_system_with_cmap([4])\n    new_system, new_topology, new_positions = _make_system_with_cmap([4])\n    with pytest.raises(\n        RuntimeError,\n        match=\"Incompatible CMAPTorsionForce term found in alchemical region for old system atoms\",\n    ):\n        _ = HybridTopologyFactory(\n            old_system=old_system,\n            old_topology=old_topology,\n            old_positions=old_positions,\n            new_system=new_system,\n            new_topology=new_topology,\n            new_positions=new_positions,\n            # map all atoms so that one of the cmap atoms is in the alchemical core region\n            old_to_new_atom_map={0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7},\n            old_to_new_core_atom_map={4: 4},  # atom 4 is part of the cmap torsion\n        )\n\n\n@pytest.mark.parametrize(\"softcore_alpha\", [pytest.param(0.5), pytest.param(0.75)])\ndef test_softcore_parameters(chloroethane_to_fluoroethane_mapping, softcore_alpha):\n    \"\"\"\n    Make sure the softcore parameters are correctly set by the HTF\n    \"\"\"\n    settings = RelativeHybridTopologyProtocol.default_settings()\n    settings.alchemical_settings.softcore_alpha = softcore_alpha\n    htf = make_htf(mapping=chloroethane_to_fluoroethane_mapping, settings=settings)\n    forces = {force.getName(): force for force in htf.hybrid_system.getForces()}\n    # only the custom nonbonded forces and the custom bond sterics force should have these parameters set\n    for force in [forces[\"CustomNonbondedForce\"], forces[\"CustomBondForce_exceptions\"]]:\n        num_params = force.getNumGlobalParameters()\n        hybrid_soft_core = None\n        for i in range(num_params):\n            # get the name of the parameter\n            param_name = force.getGlobalParameterName(i)\n            if param_name == \"softcore_alpha\":\n                hybrid_soft_core = force.getGlobalParameterDefaultValue(i)\n                break\n\n        assert hybrid_soft_core == softcore_alpha\n\n\ndef test_particles_mass_no_dummy(htf_chloro_fluoroethane):\n    \"\"\"\n    Make sure the number of particles is correct and the masses are as expected when no dummy atoms are in the hybrid system\n    \"\"\"\n    hybrid_system = htf_chloro_fluoroethane[\"hybrid_system\"]\n    assert hybrid_system.getNumParticles() == 8\n    expected_mass = [\n        27.225801625000003 * unit.dalton,  # Average of Cl/F\n        8.026674 * unit.dalton,  # Carbon with 2Hs and HMR\n        6.034621 * unit.dalton,  # Carbon with 3Hs and HMR\n        3 * unit.dalton,  # HMR Hydrogen\n        3 * unit.dalton,\n        3 * unit.dalton,\n        3 * unit.dalton,\n        3 * unit.dalton,\n    ]\n    for idx in range(hybrid_system.getNumParticles()):\n        assert hybrid_system.getParticleMass(idx) == expected_mass[idx]\n\n\ndef test_particle_mass_dummy(htf_chloro_ethane):\n    \"\"\"\n    Make sure the number of particles is correct and the masses are as expected when dummy atoms are in the hybrid system\n    \"\"\"\n    hybrid_system = htf_chloro_ethane[\"hybrid_system\"]\n    # as we have a single unique atom at each end state there should be 9 particles\n    assert hybrid_system.getNumParticles() == 9\n    expected_mass = [\n        35.4532 * unit.dalton,  # CL mass\n        7.0306475 * unit.dalton,  # Average mass of Carbon with 2Hs and 3Hs with HMR\n        6.034621 * unit.dalton,  # Carbon with 3Hs and HMR\n        3 * unit.dalton,  # HMR Hydrogen\n        3 * unit.dalton,\n        3 * unit.dalton,\n        3 * unit.dalton,\n        3 * unit.dalton,\n        3 * unit.dalton,\n    ]\n    for idx in range(hybrid_system.getNumParticles()):\n        assert hybrid_system.getParticleMass(idx) == expected_mass[idx]\n\n\ndef test_constraints_count_no_dummy(htf_chloro_fluoroethane):\n    \"\"\"The number of hydrogens does not change so 5 constraints in total.\"\"\"\n    assert htf_chloro_fluoroethane[\"hybrid_system\"].getNumConstraints() == 5\n\n\ndef test_constraints_count_dummy(htf_chloro_ethane):\n    \"\"\"The number of hydrogens changes so we have an additional constraint for the unique ethane hydrogen.\"\"\"\n    assert htf_chloro_ethane[\"hybrid_system\"].getNumConstraints() == 6\n\n\ndef test_hybrid_forces_no_dummy(htf_chloro_fluoroethane):\n    \"\"\"\n    Test that we only have the expected forces in the hybrid system.\n    \"\"\"\n    forces = htf_chloro_fluoroethane[\"forces\"]\n    expected_forces = {\n        \"CustomBondForce\",\n        \"HarmonicBondForce\",\n        \"CustomAngleForce\",\n        \"HarmonicAngleForce\",\n        \"CustomTorsionForce\",\n        \"PeriodicTorsionForce\",\n        \"NonbondedForce\",\n        \"CustomNonbondedForce\",\n        \"CustomBondForce_exceptions\",\n    }\n    assert not set(forces.keys()) - expected_forces\n\n\ndef test_hybrid_forces_dummy(htf_chloro_ethane):\n    forces = htf_chloro_ethane[\"forces\"]\n    expected_forces = {\n        \"CustomBondForce\",\n        \"HarmonicBondForce\",\n        \"CustomAngleForce\",\n        \"HarmonicAngleForce\",\n        \"CustomTorsionForce\",\n        \"PeriodicTorsionForce\",\n        \"NonbondedForce\",\n        \"CustomNonbondedForce\",\n        \"CustomBondForce_exceptions\",\n    }\n    assert not set(forces.keys()) - expected_forces\n\n\ndef test_bond_force_no_dummy(htf_chloro_fluoroethane):\n    \"\"\"\n    Test the standard and interpolated custom forces are correctly setup when we have no dummy atoms.\n    \"\"\"\n    forces = htf_chloro_fluoroethane[\"forces\"]\n    mapping = htf_chloro_fluoroethane[\"mapping\"]\n    chloro_labels = htf_chloro_fluoroethane[\"chloro_labels\"]\n    fluoro_labels = htf_chloro_fluoroethane[\"fluoro_labels\"]\n\n    # there should be no standard bond force terms\n    standard_bond_force = forces[\"HarmonicBondForce\"]\n    assert standard_bond_force.getNumBonds() == 0\n    # there should be two forces in the interpolated bond force\n    custom_bond_force = forces[\"CustomBondForce\"]\n    # there should be a single global parameter for lambda\n    assert custom_bond_force.getNumGlobalParameters() == 1\n    # make sure it has the correct name\n    assert custom_bond_force.getGlobalParameterName(0) == \"lambda_bonds\"\n\n    num_bonds = custom_bond_force.getNumBonds()\n    assert num_bonds == 2\n    # now check the parameters are correctly interpolated\n    for i in range(num_bonds):\n        p1, p2, params = custom_bond_force.getBondParameters(i)\n        # p1, p2 are the index in chloroethane get the expected parameters from the labels\n        chloro_bond = chloro_labels[\"Bonds\"][(p1, p2)]\n        # make sure the initial parameters match chloroethane\n        # this also implicitly checks the per bond parameters have been entered in the expected order\n        assert params[0] == chloro_bond.length.m_as(offunit.nanometer)\n        assert params[1] == chloro_bond.k.m_as(offunit.kilojoule_per_mole / offunit.nanometer**2)\n        # then check the fluoro parameters\n        # map the index first\n        f1 = mapping.componentA_to_componentB[p1]\n        f2 = mapping.componentA_to_componentB[p2]\n        fluoro_bond = fluoro_labels[\"Bonds\"][(f1, f2)]\n        assert params[2] == fluoro_bond.length.m_as(offunit.nanometer)\n        assert params[3] == fluoro_bond.k.m_as(offunit.kilojoule_per_mole / offunit.nanometer**2)\n\n\ndef test_bond_force_dummy(htf_chloro_ethane):\n    forces = htf_chloro_ethane[\"forces\"]\n    mapping = htf_chloro_ethane[\"mapping\"]\n    chloro_labels = htf_chloro_ethane[\"chloro_labels\"]\n    ethane_labels = htf_chloro_ethane[\"ethane_labels\"]\n\n    # there should be one standard bond force term (non-interpolated)\n    # as terms with a dummy atom are held fixed\n    # there would be 2 if the transformed atom was not H and involved in a constraint\n    standard_bond_force = forces[\"HarmonicBondForce\"]\n    num_bonds = standard_bond_force.getNumBonds()\n    assert num_bonds == 1\n    for i in range(num_bonds):\n        p1, p2, length, k = standard_bond_force.getBondParameters(i)\n        # make sure they correspond to the expected values in stateA chloroethane\n        chloro_bond = chloro_labels[\"Bonds\"][(p1, p2)]\n        assert length == chloro_bond.length.m_as(offunit.nanometer) * unit.nanometer\n        assert (\n            k\n            == chloro_bond.k.m_as(offunit.kilojoule_per_mole / offunit.nanometer**2)\n            * unit.kilojoule_per_mole\n            / unit.nanometer**2\n        )\n\n    # there should then be one interpolated (fully mapped) bond force for the central carbons\n    custom_bond_force = forces[\"CustomBondForce\"]\n    # there should be a single global parameter for lambda\n    assert custom_bond_force.getNumGlobalParameters() == 1\n    # make sure it has the correct name\n    assert custom_bond_force.getGlobalParameterName(0) == \"lambda_bonds\"\n\n    num_bonds = custom_bond_force.getNumBonds()\n    assert num_bonds == 1\n    for i in range(num_bonds):\n        p1, p2, params = custom_bond_force.getBondParameters(i)\n        # p1, p2 are the index in chloroethane get the expected parameters from the labels\n        chloro_bond = chloro_labels[\"Bonds\"][(p1, p2)]\n        # make sure the initial parameters match chloroethane\n        # this also implicitly checks the per bond parameters have been entered in the expected order\n        assert params[0] == chloro_bond.length.m_as(offunit.nanometer)\n        assert params[1] == chloro_bond.k.m_as(offunit.kilojoule_per_mole / offunit.nanometer**2)\n        # then check the ethane parameters\n        # map the index first\n        e1 = mapping.componentA_to_componentB[p1]\n        e2 = mapping.componentA_to_componentB[p2]\n        ethane_bond = ethane_labels[\"Bonds\"][(e1, e2)]\n        assert params[2] == ethane_bond.length.m_as(offunit.nanometer)\n        assert params[3] == ethane_bond.k.m_as(offunit.kilojoule_per_mole / offunit.nanometer**2)\n\n\ndef test_angle_force_no_dummy(htf_chloro_fluoroethane):\n    \"\"\"\n    Test the standard and interpolated custom angle forces are correctly setup when we have no dummy atoms.\n    \"\"\"\n    forces = htf_chloro_fluoroethane[\"forces\"]\n    mapping = htf_chloro_fluoroethane[\"mapping\"]\n    chloro_labels = htf_chloro_fluoroethane[\"chloro_labels\"]\n    fluoro_labels = htf_chloro_fluoroethane[\"fluoro_labels\"]\n\n    # there should be no standard angle force terms\n    standard_angle_force = forces[\"HarmonicAngleForce\"]\n    assert standard_angle_force.getNumAngles() == 0\n    # there should be 12 forces in the interpolated angle force even if the parameters are not interpolated\n    custom_angle_force = forces[\"CustomAngleForce\"]\n    # there should be a single global parameter for lambda\n    assert custom_angle_force.getNumGlobalParameters() == 1\n    # make sure it has the correct name\n    assert custom_angle_force.getGlobalParameterName(0) == \"lambda_angles\"\n\n    num_angles = custom_angle_force.getNumAngles()\n    assert num_angles == 12\n    # now check the parameters are correctly interpolated\n    for i in range(num_angles):\n        p1, p2, p3, params = custom_angle_force.getAngleParameters(i)\n        # p1, p2, p3 are the index in chloroethane get the expected parameters from the labels\n        chloro_angle = chloro_labels[\"Angles\"][(p1, p2, p3)]\n        # make sure the initial parameters match chloroethane\n        # this also implicitly checks the per angle parameters have been entered in the expected order\n        assert params[0] == chloro_angle.angle.m_as(offunit.radian)\n        assert params[1] == chloro_angle.k.m_as(offunit.kilojoule_per_mole / offunit.radian**2)\n        # then check the fluoro parameters\n        # map the index first\n        f1 = mapping.componentA_to_componentB[p1]\n        f2 = mapping.componentA_to_componentB[p2]\n        f3 = mapping.componentA_to_componentB[p3]\n        fluoro_angle = fluoro_labels[\"Angles\"][(f1, f2, f3)]\n        assert params[2] == fluoro_angle.angle.m_as(offunit.radian)\n        assert params[3] == fluoro_angle.k.m_as(offunit.kilojoule_per_mole / offunit.radian**2)\n\n\ndef test_angle_force_dummy(htf_chloro_ethane):\n    forces = htf_chloro_ethane[\"forces\"]\n    mapping = htf_chloro_ethane[\"mapping\"]\n    chloro_labels = htf_chloro_ethane[\"chloro_labels\"]\n    ethane_labels = htf_chloro_ethane[\"ethane_labels\"]\n\n    # there should be 6 standard angle force terms (non-interpolated)\n    # 3 for chloroethane involving the Cl atom\n    # 3 for ethane involving the unique H atom\n    standard_angle_force = forces[\"HarmonicAngleForce\"]\n    num_angles = standard_angle_force.getNumAngles()\n    assert num_angles == 6\n    for i in range(num_angles):\n        p1, p2, p3, angle, k = standard_angle_force.getAngleParameters(i)\n        # if the starting atom index is 0 it is a chloroethane angle else ethane\n        if p1 == 0 or p3 == 0:\n            chloro_angle = chloro_labels[\"Angles\"][(p1, p2, p3)]\n            assert angle == chloro_angle.angle.m_as(offunit.radian) * unit.radian\n            assert (\n                k\n                == chloro_angle.k.m_as(offunit.kilojoule_per_mole / offunit.radian**2)\n                * unit.kilojoule_per_mole\n                / unit.radian**2\n            )\n        else:\n            # manually map the Cl - H\n            e1 = 0\n            e2 = mapping.componentA_to_componentB[p2]\n            e3 = mapping.componentA_to_componentB[p3]\n            ethane_angle = ethane_labels[\"Angles\"][(e1, e2, e3)]\n            assert angle == ethane_angle.angle.m_as(offunit.radian) * unit.radian\n            assert (\n                k\n                == ethane_angle.k.m_as(offunit.kilojoule_per_mole / offunit.radian**2)\n                * unit.kilojoule_per_mole\n                / unit.radian**2\n            )\n\n    # there should then be 9 interpolated (fully mapped) angle terms\n    custom_angle_force = forces[\"CustomAngleForce\"]\n    # there should be a single global parameter for lambda\n    assert custom_angle_force.getNumGlobalParameters() == 1\n    # make sure it has the correct name\n    assert custom_angle_force.getGlobalParameterName(0) == \"lambda_angles\"\n\n    num_angles = custom_angle_force.getNumAngles()\n    assert num_angles == 9\n    for i in range(num_angles):\n        p1, p2, p3, params = custom_angle_force.getAngleParameters(i)\n        # p1, p2, p3 are the index in chloroethane get the expected parameters from the labels\n        chloro_angle = chloro_labels[\"Angles\"][(p1, p2, p3)]\n        # make sure the initial parameters match chloroethane\n        # this also implicitly checks the per angle parameters have been entered in the expected order\n        assert params[0] == chloro_angle.angle.m_as(offunit.radian)\n        assert params[1] == chloro_angle.k.m_as(offunit.kilojoule_per_mole / offunit.radian**2)\n        # then check the ethane parameters\n        # map the index first\n        e1 = mapping.componentA_to_componentB[p1]\n        e2 = mapping.componentA_to_componentB[p2]\n        e3 = mapping.componentA_to_componentB[p3]\n        ethane_angle = ethane_labels[\"Angles\"][(e1, e2, e3)]\n        assert params[2] == ethane_angle.angle.m_as(offunit.radian)\n        assert params[3] == ethane_angle.k.m_as(offunit.kilojoule_per_mole / offunit.radian**2)\n\n\ndef test_torsion_force_no_dummy(htf_chloro_fluoroethane):\n    \"\"\"\n    Test the standard and interpolated custom torsion forces are correctly setup when we have no dummy atoms.\n    \"\"\"\n    forces = htf_chloro_fluoroethane[\"forces\"]\n    mapping = htf_chloro_fluoroethane[\"mapping\"]\n    chloro_labels = htf_chloro_fluoroethane[\"chloro_labels\"]\n    fluoro_labels = htf_chloro_fluoroethane[\"fluoro_labels\"]\n\n    # there should be 6 standard torsion force terms (non-interpolated)\n    standard_torsion_force = forces[\"PeriodicTorsionForce\"]\n    num_torsions = standard_torsion_force.getNumTorsions()\n    assert num_torsions == 6\n    # now check the parameters are correctly assigned\n    for i in range(num_torsions):\n        p1, p2, p3, p4, periodicity, phase, k = standard_torsion_force.getTorsionParameters(i)\n        # p1, p2, p3, p4 are the index in chloroethane get the expected parameters from the labels\n        chloro_torsion = chloro_labels[\"ProperTorsions\"][(p1, p2, p3, p4)]\n        term_index = chloro_torsion.periodicity.index(periodicity)\n        assert periodicity == chloro_torsion.periodicity[term_index]\n        assert phase == chloro_torsion.phase[term_index].m_as(offunit.radian) * unit.radian\n        assert (\n            k\n            == chloro_torsion.k[term_index].m_as(offunit.kilojoule_per_mole)\n            * unit.kilojoule_per_mole\n        )\n        # map to fluoroethane\n        f1 = mapping.componentA_to_componentB[p1]\n        f2 = mapping.componentA_to_componentB[p2]\n        f3 = mapping.componentA_to_componentB[p3]\n        f4 = mapping.componentA_to_componentB[p4]\n        fluoro_torsion = fluoro_labels[\"ProperTorsions\"][(f1, f2, f3, f4)]\n        term_index = fluoro_torsion.periodicity.index(periodicity)\n        # make sure those parameters also match\n        assert periodicity == fluoro_torsion.periodicity[term_index]\n        assert phase == fluoro_torsion.phase[term_index].m_as(offunit.radian) * unit.radian\n        assert (\n            k\n            == fluoro_torsion.k[term_index].m_as(offunit.kilojoule_per_mole)\n            * unit.kilojoule_per_mole\n        )\n\n    # custom torsion forces\n    custom_torsion_force = forces[\"CustomTorsionForce\"]\n    # there should be a single global parameter for lambda\n    assert custom_torsion_force.getNumGlobalParameters() == 1\n    # make sure it has the correct name\n    assert custom_torsion_force.getGlobalParameterName(0) == \"lambda_torsions\"\n\n    num_torsions = custom_torsion_force.getNumTorsions()\n    # we have 3 interpolated torsions with two k values each which is 6 terms\n    # but the HTF interpolates each torsion from and to zero so 6 * 2 total parameters\n    assert num_torsions == 12\n    for i in range(num_torsions):\n        p1, p2, p3, p4, params = custom_torsion_force.getTorsionParameters(i)\n        # check which end state the parameters correspond to\n        # if the 3 starting parameters are zero its fluoroethane else chloroethane\n        if params[0] == 0.0 and params[1] == 0.0 and params[2] == 0.0:\n            # fluoroethane\n            f1 = mapping.componentA_to_componentB[p1]\n            f2 = mapping.componentA_to_componentB[p2]\n            f3 = mapping.componentA_to_componentB[p3]\n            f4 = mapping.componentA_to_componentB[p4]\n            fluoro_torsion = fluoro_labels[\"ProperTorsions\"][(f1, f2, f3, f4)]\n            # now we need to check which interaction this is if we have multiple periodicity's\n            periodicity = params[3]\n            term_index = fluoro_torsion.periodicity.index(periodicity)\n            assert periodicity == fluoro_torsion.periodicity[term_index]\n            assert params[4] == fluoro_torsion.phase[term_index].m_as(offunit.radian)\n            assert params[5] == fluoro_torsion.k[term_index].m_as(offunit.kilojoule_per_mole)\n\n        else:\n            # chloroethane\n            chloro_torsion = chloro_labels[\"ProperTorsions\"][(p1, p2, p3, p4)]\n            periodicity = params[0]\n            term_index = chloro_torsion.periodicity.index(periodicity)\n            assert periodicity == chloro_torsion.periodicity[term_index]\n            assert params[1] == chloro_torsion.phase[term_index].m_as(offunit.radian)\n            assert params[2] == chloro_torsion.k[term_index].m_as(offunit.kilojoule_per_mole)\n\n\ndef test_torsion_force_dummy(htf_chloro_ethane):\n    forces = htf_chloro_ethane[\"forces\"]\n    mapping = htf_chloro_ethane[\"mapping\"]\n    chloro_labels = htf_chloro_ethane[\"chloro_labels\"]\n    ethane_labels = htf_chloro_ethane[\"ethane_labels\"]\n\n    # there should be no interpolated torsion force terms\n    # as those involving a dummy atom are held fixed\n    # and in this example the fully mapped torsions have the same parameters\n    custom_torsion_force = forces[\"CustomTorsionForce\"]\n    assert custom_torsion_force.getNumTorsions() == 0\n    # there should be a single global parameter for lambda\n    assert custom_torsion_force.getNumGlobalParameters() == 1\n    # make sure it has the correct name\n    assert custom_torsion_force.getGlobalParameterName(0) == \"lambda_torsions\"\n\n    # 15 torsion terms in total in the standard periodic torsion force\n    # chloroethane has 3 unique torsions with 2 phases = 6\n    # chloroethane and ethane have 6 shared single phase torsions = 6\n    # ethane has 3 unique torsions with a single phase = 3\n    standard_torsion_force = forces[\"PeriodicTorsionForce\"]\n    num_torsions = standard_torsion_force.getNumTorsions()\n    assert num_torsions == 15\n    # now check the parameters are correctly assigned\n    for i in range(num_torsions):\n        p1, p2, p3, p4, periodicity, phase, k = standard_torsion_force.getTorsionParameters(i)\n        # determine if this is chloroethane or ethane\n        if p1 == 0:\n            # unique chloroethane torsion\n            chloro_torsion = chloro_labels[\"ProperTorsions\"][(p1, p2, p3, p4)]\n            assert periodicity in chloro_torsion.periodicity\n            term_index = chloro_torsion.periodicity.index(periodicity)\n            assert phase == chloro_torsion.phase[term_index].m_as(offunit.radian) * unit.radian\n            assert (\n                k\n                == chloro_torsion.k[term_index].m_as(offunit.kilojoule_per_mole)\n                * unit.kilojoule_per_mole\n            )\n        elif p1 == 8:\n            # unique ethane torsion\n            e1 = 0\n            e2 = mapping.componentA_to_componentB[p2]\n            e3 = mapping.componentA_to_componentB[p3]\n            e4 = mapping.componentA_to_componentB[p4]\n            ethane_torsion = ethane_labels[\"ProperTorsions\"][(e1, e2, e3, e4)]\n            assert periodicity in ethane_torsion.periodicity\n            term_index = ethane_torsion.periodicity.index(periodicity)\n            assert phase == ethane_torsion.phase[term_index].m_as(offunit.radian) * unit.radian\n            assert (\n                k\n                == ethane_torsion.k[term_index].m_as(offunit.kilojoule_per_mole)\n                * unit.kilojoule_per_mole\n            )\n\n        else:\n            # we have a mapped torsion so check the parameters are the same in both molecules\n            chloro_torsion = chloro_labels[\"ProperTorsions\"][(p1, p2, p3, p4)]\n            f1 = mapping.componentA_to_componentB[p1]\n            f2 = mapping.componentA_to_componentB[p2]\n            f3 = mapping.componentA_to_componentB[p3]\n            f4 = mapping.componentA_to_componentB[p4]\n            ethane_torsion = ethane_labels[\"ProperTorsions\"][(f1, f2, f3, f4)]\n            assert periodicity in chloro_torsion.periodicity\n            term_index = chloro_torsion.periodicity.index(periodicity)\n            assert phase == chloro_torsion.phase[term_index].m_as(offunit.radian) * unit.radian\n            assert (\n                k\n                == chloro_torsion.k[term_index].m_as(offunit.kilojoule_per_mole)\n                * unit.kilojoule_per_mole\n            )\n            # check ethane parameters match\n            assert periodicity in ethane_torsion.periodicity\n            term_index = ethane_torsion.periodicity.index(periodicity)\n            assert phase == ethane_torsion.phase[term_index].m_as(offunit.radian) * unit.radian\n            assert (\n                k\n                == ethane_torsion.k[term_index].m_as(offunit.kilojoule_per_mole)\n                * unit.kilojoule_per_mole\n            )\n\n\ndef test_nonbonded_force_no_dummy(htf_chloro_fluoroethane):\n    \"\"\"\n    Test the nonbonded particle parameters are correctly set when we have no dummy atoms.\n    \"\"\"\n    forces = htf_chloro_fluoroethane[\"forces\"]\n    chloro_labels = htf_chloro_fluoroethane[\"chloro_labels\"]\n\n    nonbonded_force = forces[\"NonbondedForce\"]\n    # there should be 4 global parameters used to scale the particle offsets\n    assert nonbonded_force.getNumGlobalParameters() == 4\n    expected_global_params = {\n        \"lambda_electrostatics_core\",\n        \"lambda_electrostatics_insert\",\n        \"lambda_electrostatics_delete\",\n        \"lambda_sterics_core\",\n    }\n    actual_global_params = {\n        nonbonded_force.getGlobalParameterName(i)\n        for i in range(nonbonded_force.getNumGlobalParameters())\n    }\n    assert actual_global_params == expected_global_params\n\n    # as the particles are fully mapped we should have just 8 particles\n    num_atoms = nonbonded_force.getNumParticles()\n    assert num_atoms == 8\n    # check the input parameters match the chloroethane parameters\n    chloro_charges = htf_chloro_fluoroethane[\"chloro_charges\"]\n    for i in range(num_atoms):\n        charge, sigma, epsilon = nonbonded_force.getParticleParameters(i)\n        chloro_vdw = chloro_labels[\"vdW\"][(i,)]\n        assert charge == chloro_charges[i] * unit.elementary_charge\n        assert sigma == chloro_vdw.sigma.m_as(offunit.nanometer) * unit.nanometer\n        # this is always zero as we use the softcore potential for the vdw\n        assert epsilon == 0.0 * unit.kilojoule_per_mole\n\n\ndef test_nonbonded_force_dummy(htf_chloro_ethane):\n    \"\"\"Test the nonbonded particle parameters are correctly set when we have dummy atoms.\"\"\"\n    forces = htf_chloro_ethane[\"forces\"]\n    chloro_labels = htf_chloro_ethane[\"chloro_labels\"]\n    ethane_labels = htf_chloro_ethane[\"ethane_labels\"]\n\n    nonbonded_force = forces[\"NonbondedForce\"]\n    # there should be 4 global parameters used to scale the particle offsets\n    assert nonbonded_force.getNumGlobalParameters() == 4\n    expected_global_params = {\n        \"lambda_electrostatics_core\",\n        \"lambda_electrostatics_insert\",\n        \"lambda_electrostatics_delete\",\n        \"lambda_sterics_core\",\n    }\n    actual_global_params = {\n        nonbonded_force.getGlobalParameterName(i)\n        for i in range(nonbonded_force.getNumGlobalParameters())\n    }\n    assert actual_global_params == expected_global_params\n\n    # as we have a single unique atom at each end state there should be 9 particles\n    num_atoms = nonbonded_force.getNumParticles()\n    assert num_atoms == 9\n    # check the input parameters match the chloroethane parameters for the mapped atoms\n    chloro_charges = htf_chloro_ethane[\"chloro_charges\"]\n\n    for i in range(num_atoms):\n        charge, sigma, epsilon = nonbonded_force.getParticleParameters(i)\n        if i == 0:\n            # unique chloro atom\n            chloro_vdw = chloro_labels[\"vdW\"][(i,)]\n            assert charge == chloro_charges[i] * unit.elementary_charge\n            assert sigma == chloro_vdw.sigma.m_as(offunit.nanometer) * unit.nanometer\n            # we use soft core for vdW so epsilon is zero\n            assert epsilon == 0.0 * unit.kilojoule_per_mole\n        elif i == 8:\n            # unique ethane hydrogen atom\n            e1 = 0\n            ethane_vdw = ethane_labels[\"vdW\"][(e1,)]\n            assert (\n                charge == 0.0 * unit.elementary_charge\n            )  # this should be zero and be scaled to the ethane value via particle offsets\n            assert sigma == ethane_vdw.sigma.m_as(offunit.nanometer) * unit.nanometer\n            # we use soft core for vdW so epsilon is zero\n            assert epsilon == 0.0 * unit.kilojoule_per_mole\n        else:\n            # mapped atoms should use the chloroethane parameters\n            # they will be adjusted using particle offsets\n            chloro_vdw = chloro_labels[\"vdW\"][(i,)]\n            assert charge == chloro_charges[i] * unit.elementary_charge\n            assert sigma == chloro_vdw.sigma.m_as(offunit.nanometer) * unit.nanometer\n            #  we use soft core for vdW so epsilon is zero\n            assert epsilon == 0.0 * unit.kilojoule_per_mole\n\n\ndef test_nonbonded_offsets_no_dummy(htf_chloro_fluoroethane):\n    \"\"\"Test that the nonbonded particle parameter offsets are correctly set when we have no dummy atoms.\"\"\"\n    forces = htf_chloro_fluoroethane[\"forces\"]\n    mapping = htf_chloro_fluoroethane[\"mapping\"]\n\n    nonbonded_force = forces[\"NonbondedForce\"]\n\n    # get the charges\n    chloro_charges = htf_chloro_fluoroethane[\"chloro_charges\"]\n    fluoro_charges = htf_chloro_fluoroethane[\"fluoro_charges\"]\n    # We scale the nonbonded electrostatics with lambda so check the offsets\n    # there should be 8 offsets one for each particle\n    num_offsets = nonbonded_force.getNumParticleParameterOffsets()\n    assert num_offsets == 8\n    for i in range(num_offsets):\n        offset_params = nonbonded_force.getParticleParameterOffset(i)\n        assert (\n            offset_params[0] == \"lambda_electrostatics_core\"\n        )  # Make sure only the electrostatics core lambda is used\n        particle_index = offset_params[1]\n        # make sure the epsilon and sigma scales are zero\n        assert offset_params[3] == offset_params[4] == 0.0\n        # calculate the scale for this particle index\n        f1 = mapping.componentA_to_componentB[particle_index]\n        charge_scale = fluoro_charges[f1] - chloro_charges[particle_index]\n        # check the offset value matches\n        assert offset_params[2] == charge_scale\n\n\ndef test_nonbonded_offsets_dummy(htf_chloro_ethane):\n    forces = htf_chloro_ethane[\"forces\"]\n    mapping = htf_chloro_ethane[\"mapping\"]\n\n    nonbonded_force = forces[\"NonbondedForce\"]\n    # there should be 9 offsets one for each particle\n    num_offsets = nonbonded_force.getNumParticleParameterOffsets()\n    assert num_offsets == 9\n    chloro_charges = htf_chloro_ethane[\"chloro_charges\"]\n    ethane_charges = htf_chloro_ethane[\"ethane_charges\"]\n    for i in range(num_offsets):\n        offset_params = nonbonded_force.getParticleParameterOffset(i)\n        particle_index = offset_params[1]\n        # make sure the epsilon and sigma scales are zero\n        assert offset_params[3] == offset_params[4] == 0.0\n        # calculate the scale for this particle index\n        if particle_index == 0:\n            # unique chloro atom\n            # make sure this particle is removed at lambda = 1\n            assert offset_params[0] == \"lambda_electrostatics_delete\"\n            charge_scale = 0.0 - chloro_charges[particle_index]\n        elif particle_index == 8:\n            # unique ethane hydrogen atom\n            # make sure this particle is inserted at lambda = 1\n            assert offset_params[0] == \"lambda_electrostatics_insert\"\n            e1 = 0\n            charge_scale = ethane_charges[e1] - 0.0\n        else:\n            # mapped atoms\n            # make sure the charge is scaled with the electrostatics core lambda\n            assert offset_params[0] == \"lambda_electrostatics_core\"\n            f1 = mapping.componentA_to_componentB[particle_index]\n            charge_scale = ethane_charges[f1] - chloro_charges[particle_index]\n        # check the offset value matches\n        assert offset_params[2] == charge_scale\n\n\ndef test_nonbonded_exceptions_no_dummy(htf_chloro_fluoroethane):\n    \"\"\"Test that the nonbonded exceptions are correctly set when we have no dummy atoms.\"\"\"\n    forces = htf_chloro_fluoroethane[\"forces\"]\n    chloroethane = htf_chloro_fluoroethane[\"chloroethane\"]\n    chloro_openff = chloroethane.to_openff()\n    chloro_labels = htf_chloro_fluoroethane[\"chloro_labels\"]\n    chloro_charges = htf_chloro_fluoroethane[\"chloro_charges\"]\n    electro_scale = htf_chloro_fluoroethane[\"electrostatic_scale\"]\n    vdw_scale = htf_chloro_fluoroethane[\"vdW_scale\"]\n\n    nonbonded_force = forces[\"NonbondedForce\"]\n\n    num_exceptions = nonbonded_force.getNumExceptions()\n    # there should be 28 in total (8 * 7) / 2\n    assert num_exceptions == 28\n\n    # there should 9 non-zero exceptions corresponding to the 9 proper torsions\n    exception_1_4s = []\n    # get all atoms with a minimal path of 3 bonds between them\n    for pair_1_4 in chloro_openff.nth_degree_neighbors(3):\n        a1 = chloro_openff.atoms.index(pair_1_4[0])\n        a2 = chloro_openff.atoms.index(pair_1_4[1])\n        exception_1_4s.append((a1, a2))\n    assert len(exception_1_4s) == 9\n    non_zero_exceptions = 0\n\n    # now check the parameters are correctly assigned\n    for i in range(num_exceptions):\n        p1, p2, charge_prod, sigma, epsilon = nonbonded_force.getExceptionParameters(i)\n        # check if this is a 1-4 interaction, should use the chloroethane parameters\n        if (p1, p2) in exception_1_4s or (p2, p1) in exception_1_4s:\n            charge1 = chloro_charges[p1]\n            charge2 = chloro_charges[p2]\n            expected_charge_prod = (\n                charge1 * charge2 * electro_scale\n            )  # get the scaled charge product\n            chloro_vdw1 = chloro_labels[\"vdW\"][(p1,)]\n            chloro_vdw2 = chloro_labels[\"vdW\"][(p2,)]\n            # Lorentz-Berthelot combining rules\n            expected_sigma = (chloro_vdw1.sigma + chloro_vdw2.sigma) / 2.0\n            expected_epsilon = (\n                (chloro_vdw1.epsilon * chloro_vdw2.epsilon) ** 0.5\n            ) * vdw_scale  # scaled epsilon by the 1-4 scale for the ff\n            assert expected_charge_prod == pytest.approx(\n                charge_prod.value_in_unit(unit.elementary_charge**2), rel=1e-5\n            )  # charge product\n            assert sigma == expected_sigma.m_as(offunit.nanometer) * unit.nanometer  # sigma\n            assert expected_epsilon.m_as(offunit.kilojoule_per_mole) == pytest.approx(\n                epsilon.value_in_unit(unit.kilojoule_per_mole), rel=1e-5\n            )  # epsilon\n            # track how many non-zero exceptions we have found\n            non_zero_exceptions += 1\n        # not a 1-4 so this should be set to zero\n        else:\n            assert charge_prod == 0.0 * unit.elementary_charge**2  # charge product\n            assert sigma == 1.0 * unit.nanometer  # sigma, dummy value of 1 used\n            assert epsilon == 0.0 * unit.kilojoule_per_mole  # epsilon, should always be zero\n\n    assert non_zero_exceptions == 9\n\n\ndef test_nonbonded_exceptions_dummy(htf_chloro_ethane):\n    \"\"\"Test that the nonbonded exceptions are correctly set when we have dummy atoms, any involving a dummy should be zeroed.\"\"\"\n    forces = htf_chloro_ethane[\"forces\"]\n    chloroethane = htf_chloro_ethane[\"chloroethane\"]\n    chloro_labels = htf_chloro_ethane[\"chloro_labels\"]\n    chloro_charges = htf_chloro_ethane[\"chloro_charges\"]\n    chloro_openff = chloroethane.to_openff()\n    electro_scale = htf_chloro_ethane[\"electrostatic_scale\"]\n    vdw_scale = htf_chloro_ethane[\"vdW_scale\"]\n\n    nonbonded_force = forces[\"NonbondedForce\"]\n\n    num_exceptions = nonbonded_force.getNumExceptions()\n    # there should be 36 in total (9 * 8) / 2\n    assert num_exceptions == 36\n\n    # get the expected exception atoms\n    exception_1_4s = []\n    # get all atoms with a minimal path of 3 bonds between them\n    for pair_1_4 in chloro_openff.nth_degree_neighbors(3):\n        a1 = chloro_openff.atoms.index(pair_1_4[0])\n        a2 = chloro_openff.atoms.index(pair_1_4[1])\n        exception_1_4s.append((a1, a2))\n    assert len(exception_1_4s) == 9\n    # manually add the 1-4s involving the unique ethane hydrogen atom (atom 8)\n    for i in [5, 6, 7]:\n        exception_1_4s.append((8, i))\n\n    # there should 6 non-zero exceptions corresponding to the 6 mapped proper torsions not involving a dummy atom\n    non_zero_exceptions = 0\n    # there should be 6 zeroed exceptions corresponding to those involving a dummy atom\n    zeroed_dummy_exceptions = 0\n\n    # now check the parameters are correctly assigned\n    for i in range(num_exceptions):\n        p1, p2, charge_prod, sigma, epsilon = nonbonded_force.getExceptionParameters(i)\n        # check if this is a 1-4 interaction\n        if (p1, p2) in exception_1_4s or (p2, p1) in exception_1_4s:\n            if p1 == 0 or p2 == 0 or p1 == 8 or p2 == 8:\n                # this is a dummy atom exception which should be interpolated in the custom steric bond force\n                # make sure the parameters are set to zero\n                assert (\n                    charge_prod == 0.0 * unit.elementary_charge**2\n                )  # charge product should always be zero\n                assert epsilon == 0.0 * unit.kilojoule_per_mole  # epsilon, should always be zero\n                # sigma will use a dummy value this is not important as epsilon is 0.0\n                zeroed_dummy_exceptions += 1\n            else:\n                # this is a mapped exception so check the parameters match chloroethane\n                charge1 = chloro_charges[p1]\n                charge2 = chloro_charges[p2]\n                expected_charge_prod = (\n                    charge1 * charge2 * electro_scale\n                )  # get the scaled charge product\n                chloro_vdw1 = chloro_labels[\"vdW\"][(p1,)]\n                chloro_vdw2 = chloro_labels[\"vdW\"][(p2,)]\n                # Lorentz-Berthelot combining rules\n                expected_sigma = (chloro_vdw1.sigma + chloro_vdw2.sigma) / 2.0\n                expected_epsilon = (\n                    (chloro_vdw1.epsilon * chloro_vdw2.epsilon) ** 0.5\n                ) * vdw_scale  # scaled epsilon by the 1-4 scale for the ff\n                assert expected_charge_prod == pytest.approx(\n                    charge_prod.value_in_unit(unit.elementary_charge**2), rel=1e-5\n                )  # charge product\n                assert sigma == expected_sigma.m_as(offunit.nanometer) * unit.nanometer  # sigma\n                assert expected_epsilon.m_as(offunit.kilojoule_per_mole) == pytest.approx(\n                    epsilon.value_in_unit(unit.kilojoule_per_mole), rel=1e-5\n                )  # epsilon\n                # track how many non-zero exceptions we have found\n                non_zero_exceptions += 1\n        # not a 1-4 so this should be set to zero\n        else:\n            assert (\n                charge_prod == 0.0 * unit.elementary_charge**2\n            )  # charge product should always be zero\n            assert sigma == 1.0 * unit.nanometer  # sigma, dummy value of 1 used\n            assert epsilon == 0.0 * unit.kilojoule_per_mole  # epsilon, should always be zero\n\n    assert non_zero_exceptions == 6\n    assert zeroed_dummy_exceptions == 6\n\n\ndef test_nonbonded_exception_offsets_no_dummy(htf_chloro_fluoroethane):\n    \"\"\"Test that the nonbonded exception parameter offsets are correctly set when we have no dummy atoms and interpolate between the end state values.\"\"\"\n    forces = htf_chloro_fluoroethane[\"forces\"]\n    mapping = htf_chloro_fluoroethane[\"mapping\"]\n    chloroethane = htf_chloro_fluoroethane[\"chloroethane\"]\n    chloro_openff = chloroethane.to_openff()\n    chloro_labels = htf_chloro_fluoroethane[\"chloro_labels\"]\n    fluoro_labels = htf_chloro_fluoroethane[\"fluoro_labels\"]\n    chloro_charges = htf_chloro_fluoroethane[\"chloro_charges\"]\n    fluoro_charges = htf_chloro_fluoroethane[\"fluoro_charges\"]\n    electro_scale = htf_chloro_fluoroethane[\"electrostatic_scale\"]\n    vdw_scale = htf_chloro_fluoroethane[\"vdW_scale\"]\n\n    nonbonded_force = forces[\"NonbondedForce\"]\n\n    # there should be 56 exception offsets 2 for each of the 28 exceptions to allow for electrostatics and vdw scaling\n    num_offsets = nonbonded_force.getNumExceptionParameterOffsets()\n    assert num_offsets == 56\n\n    # get the expected exception atoms\n    exception_1_4s = []\n    # get all atoms with a minimal path of 3 bonds between them\n    for pair_1_4 in chloro_openff.nth_degree_neighbors(3):\n        a1 = chloro_openff.atoms.index(pair_1_4[0])\n        a2 = chloro_openff.atoms.index(pair_1_4[1])\n        exception_1_4s.append((a1, a2))\n\n    # Only 12 of the offsets should be non-zero corresponding to the 1-4 interactions\n    # 9 from electrostatics\n    # 3 from sterics (3 torsions with Cl/F as all hydrogen vdW remain the same)\n    non_zero_offsets = 0\n    for i in range(num_offsets):\n        parameter, exception_index, charge_prod_scale, sigma_scale, epsilon_scale = (\n            nonbonded_force.getExceptionParameterOffset(i)\n        )\n        # get the index of the particles in the exception\n        p1, p2, _, _, _ = nonbonded_force.getExceptionParameters(exception_index)\n        # if this is not an expected exception it should not be scaled\n        if (p1, p2) not in exception_1_4s and (p2, p1) not in exception_1_4s:\n            # should be zero\n            assert charge_prod_scale == 0.0\n            assert sigma_scale == 0.0\n            assert epsilon_scale == 0.0\n        else:\n            # now check the parameters are correct\n            if parameter == \"lambda_electrostatics_core\":\n                # track how many we have found\n                if charge_prod_scale != 0.0:\n                    non_zero_offsets += 1\n                # electrostatics offset\n                chloro_charge1 = chloro_charges[p1]\n                chloro_charge2 = chloro_charges[p2]\n                f1 = mapping.componentA_to_componentB[p1]\n                f2 = mapping.componentA_to_componentB[p2]\n                fluoro_charge1 = fluoro_charges[f1]\n                fluoro_charge2 = fluoro_charges[f2]\n                # must use the 1-4 scale factor defined in the force field\n                expected_scale = (\n                    (fluoro_charge1 * fluoro_charge2) - (chloro_charge1 * chloro_charge2)\n                ) * electro_scale\n                assert expected_scale == pytest.approx(charge_prod_scale, rel=1e-5)\n                # sigma and epsilon should be zero\n                assert sigma_scale == 0.0\n                assert epsilon_scale == 0.0\n            elif parameter == \"lambda_sterics_core\":\n                if sigma_scale != 0.0 or epsilon_scale != 0.0:\n                    non_zero_offsets += 1\n                # sterics offset\n                chloro_vdw1 = chloro_labels[\"vdW\"][(p1,)]\n                chloro_vdw2 = chloro_labels[\"vdW\"][(p2,)]\n                f1 = mapping.componentA_to_componentB[p1]\n                f2 = mapping.componentA_to_componentB[p2]\n                fluoro_vdw1 = fluoro_labels[\"vdW\"][(f1,)]\n                fluoro_vdw2 = fluoro_labels[\"vdW\"][(f2,)]\n                # calculate the LJ parameters using Lorentz-Berthelot mixing\n                chloro_sigma = (chloro_vdw1.sigma + chloro_vdw2.sigma) / 2.0\n                chloro_epsilon = (chloro_vdw1.epsilon * chloro_vdw2.epsilon) ** 0.5\n                fluoro_sigma = (fluoro_vdw1.sigma + fluoro_vdw2.sigma) / 2.0\n                fluoro_epsilon = (fluoro_vdw1.epsilon * fluoro_vdw2.epsilon) ** 0.5\n                # now get the scales\n                expected_sigma_scale = fluoro_sigma.m_as(offunit.nanometer) - chloro_sigma.m_as(\n                    offunit.nanometer\n                )\n                # must use the 1-4 scale factor defined in the force field\n                expected_epsilon_scale = (\n                    fluoro_epsilon.m_as(offunit.kilojoule_per_mole)\n                    - chloro_epsilon.m_as(offunit.kilojoule_per_mole)\n                ) * vdw_scale\n                assert sigma_scale == expected_sigma_scale\n                assert expected_epsilon_scale == pytest.approx(epsilon_scale, rel=1e-5)\n    # make sure we found all non-zero offsets\n    assert non_zero_offsets == 12\n\n\ndef test_nonbonded_exception_offsets_dummy(htf_chloro_ethane):\n    \"\"\"Test that the nonbonded exception parameter offsets are correctly set when we have dummy atoms.\n    All values should be zero if involving a dummy atom.\"\"\"\n    forces = htf_chloro_ethane[\"forces\"]\n    chloroethane = htf_chloro_ethane[\"chloroethane\"]\n    chloro_labels = htf_chloro_ethane[\"chloro_labels\"]\n    chloro_charges = htf_chloro_ethane[\"chloro_charges\"]\n    chloro_openff = chloroethane.to_openff()\n    ethane_labels = htf_chloro_ethane[\"ethane_labels\"]\n    ethane_charges = htf_chloro_ethane[\"ethane_charges\"]\n    mapping = htf_chloro_ethane[\"mapping\"]\n    electro_scale = htf_chloro_ethane[\"electrostatic_scale\"]\n    vdw_scale = htf_chloro_ethane[\"vdW_scale\"]\n\n    nonbonded_force = forces[\"NonbondedForce\"]\n\n    # there are 36 exceptions so 72 offsets (2 lambda per exception)\n    # but the htf removes all offsets involving dummy atoms from the nonbonded force\n    # so we remove 2 * 7 offsets involving the unique chloro atom in chloroethane\n    # and 2 * 7 offsets involving the unique hydrogen atom in ethane\n    # and finally we remove 2 * 2 offsets involving the unique chloro and unique hydrogen atoms\n    num_offsets = nonbonded_force.getNumExceptionParameterOffsets()\n    assert num_offsets == 42\n\n    # get the expected exception atoms\n    exception_1_4s = []\n    # get all atoms with a minimal path of 3 bonds between them\n    # not involving the dummy atoms\n    for pair_1_4 in chloro_openff.nth_degree_neighbors(3):\n        a1 = chloro_openff.atoms.index(pair_1_4[0])\n        a2 = chloro_openff.atoms.index(pair_1_4[1])\n        if a1 != 0 and a2 != 0:\n            exception_1_4s.append((a1, a2))\n\n    # we expect only 12 offsets to be non-zero corresponding to the 6 mapped 1-4 interactions\n    # each with electrostatics and sterics offsets\n    non_zero_offsets = 0\n\n    for i in range(num_offsets):\n        parameter, exception_index, charge_prod_scale, sigma_scale, epsilon_scale = (\n            nonbonded_force.getExceptionParameterOffset(i)\n        )\n        # get the index of the particles in the exception\n        p1, p2, _, _, _ = nonbonded_force.getExceptionParameters(exception_index)\n        # if this is not an expected exception it should not be scaled\n        if (p1, p2) not in exception_1_4s and (p2, p1) not in exception_1_4s:\n            # should be zero\n            assert charge_prod_scale == 0.0\n            assert sigma_scale == 0.0\n            assert epsilon_scale == 0.0\n        else:\n            # now check the parameters are correct\n            if parameter == \"lambda_electrostatics_core\":\n                # track how many we have found\n                if charge_prod_scale != 0.0:\n                    non_zero_offsets += 1\n                # electrostatics offset\n                chloro_charge1 = chloro_charges[p1]\n                chloro_charge2 = chloro_charges[p2]\n                e1 = mapping.componentA_to_componentB[p1]\n                e2 = mapping.componentA_to_componentB[p2]\n                ethane_charge1 = ethane_charges[e1]\n                ethane_charge2 = ethane_charges[e2]\n                # must use the 1-4 scale factor defined in the force field\n                expected_scale = (\n                    (ethane_charge1 * ethane_charge2) - (chloro_charge1 * chloro_charge2)\n                ) * electro_scale\n                # we see some rounding issues here so use approx\n                assert expected_scale == pytest.approx(charge_prod_scale, rel=1e-5)\n                # sigma and epsilon should be zero\n                assert sigma_scale == 0.0\n                assert epsilon_scale == 0.0\n            elif parameter == \"lambda_sterics_core\":\n                if sigma_scale != 0.0 or epsilon_scale != 0.0:\n                    non_zero_offsets += 1\n                # sterics offset\n                chloro_vdw1 = chloro_labels[\"vdW\"][(p1,)]\n                chloro_vdw2 = chloro_labels[\"vdW\"][(p2,)]\n                e1 = mapping.componentA_to_componentB[p1]\n                e2 = mapping.componentA_to_componentB[p2]\n                ethane_vdw1 = ethane_labels[\"vdW\"][(e1,)]\n                ethane_vdw2 = ethane_labels[\"vdW\"][(e2,)]\n                # calculate the LJ parameters using Lorentz-Berthelot mixing\n                chloro_sigma = (chloro_vdw1.sigma + chloro_vdw2.sigma) / 2.0\n                chloro_epsilon = (chloro_vdw1.epsilon * chloro_vdw2.epsilon) ** 0.5\n                ethane_sigma = (ethane_vdw1.sigma + ethane_vdw2.sigma) / 2.0\n                ethane_epsilon = (ethane_vdw1.epsilon * ethane_vdw2.epsilon) ** 0.5\n                # now get the scales\n                expected_sigma_scale = ethane_sigma.m_as(offunit.nanometer) - chloro_sigma.m_as(\n                    offunit.nanometer\n                )\n                # must use the 1-4 scale factor defined in the force field\n                expected_epsilon_scale = (\n                    ethane_epsilon.m_as(offunit.kilojoule_per_mole)\n                    - chloro_epsilon.m_as(offunit.kilojoule_per_mole)\n                ) * vdw_scale\n                assert sigma_scale == expected_sigma_scale\n                assert epsilon_scale == expected_epsilon_scale\n    # make sure we found all non-zero offsets\n    assert non_zero_offsets == 12\n\n\ndef test_custom_nb_force_no_dummy(htf_chloro_fluoroethane):\n    \"\"\"\n    Test the custom nonbonded force is correctly setup when we have no dummy atoms.\n    This test implicitly checks that the global parameters are in the correct order.\n    \"\"\"\n    forces = htf_chloro_fluoroethane[\"forces\"]\n    mapping = htf_chloro_fluoroethane[\"mapping\"]\n    chloro_labels = htf_chloro_fluoroethane[\"chloro_labels\"]\n    fluoro_labels = htf_chloro_fluoroethane[\"fluoro_labels\"]\n\n    custom_nb_force = forces[\"CustomNonbondedForce\"]\n    # there should be 5 global parameters used to scale the particle parameters\n    assert custom_nb_force.getNumGlobalParameters() == 5\n    expected_global_params = {\n        \"lambda_sterics_core\",\n        \"lambda_sterics_insert\",\n        \"lambda_sterics_delete\",\n        \"lambda_electrostatics_core\",\n        \"softcore_alpha\",\n    }\n    actual_global_params = {\n        custom_nb_force.getGlobalParameterName(i)\n        for i in range(custom_nb_force.getNumGlobalParameters())\n    }\n    assert actual_global_params == expected_global_params\n\n    # there should be 8 particles as all atoms are mapped\n    num_particles = custom_nb_force.getNumParticles()\n    assert num_particles == 8\n    # now check the parameters are correctly assigned\n    for i in range(num_particles):\n        params = custom_nb_force.getParticleParameters(i)\n        # check the chloroethane parameters\n        chloro_vdw = chloro_labels[\"vdW\"][(i,)]\n        assert params[0] == chloro_vdw.sigma.m_as(offunit.nanometer)\n        assert params[1] == chloro_vdw.epsilon.m_as(offunit.kilojoule_per_mole)\n        # map to fluoroethane\n        f1 = mapping.componentA_to_componentB[i]\n        fluoro_vdw = fluoro_labels[\"vdW\"][(f1,)]\n        assert params[2] == fluoro_vdw.sigma.m_as(offunit.nanometer)\n        assert params[3] == fluoro_vdw.epsilon.m_as(offunit.kilojoule_per_mole)\n        # as we have no unique parameters both unique_old and unque_new should be zero\n        assert params[4] == 0.0\n        assert params[5] == 0.0\n\n\ndef test_custom_nb_force_dummy(htf_chloro_ethane):\n    forces = htf_chloro_ethane[\"forces\"]\n    mapping = htf_chloro_ethane[\"mapping\"]\n    chloro_labels = htf_chloro_ethane[\"chloro_labels\"]\n    ethane_labels = htf_chloro_ethane[\"ethane_labels\"]\n\n    custom_nb_force = forces[\"CustomNonbondedForce\"]\n    # there should be 5 global parameters used to scale the particle parameters\n    assert custom_nb_force.getNumGlobalParameters() == 5\n    expected_global_params = {\n        \"lambda_sterics_core\",\n        \"lambda_sterics_insert\",\n        \"lambda_sterics_delete\",\n        \"lambda_electrostatics_core\",\n        \"softcore_alpha\",\n    }\n    actual_global_params = {\n        custom_nb_force.getGlobalParameterName(i)\n        for i in range(custom_nb_force.getNumGlobalParameters())\n    }\n    assert actual_global_params == expected_global_params\n\n    # there should be 9 particles as we have 1 unique atom in each end state\n    num_particles = custom_nb_force.getNumParticles()\n    assert num_particles == 9\n    # now check the parameters are correctly assigned\n    for i in range(num_particles):\n        params = custom_nb_force.getParticleParameters(i)\n        if i == 0:\n            # unique chloro atom\n            chloro_vdw = chloro_labels[\"vdW\"][(i,)]\n            # lambda=0 parameters should be chloroethane values\n            assert params[0] == chloro_vdw.sigma.m_as(offunit.nanometer)\n            assert params[1] == chloro_vdw.epsilon.m_as(offunit.kilojoule_per_mole)\n            # lambda=0 parameters should be zeroed dummy atom values\n            assert params[2] == chloro_vdw.sigma.m_as(offunit.nanometer)\n            assert params[3] == 0.0\n            # check we correctly assign the unique_old and unique_new parameters\n            assert params[4] == 1  # unique_old should be true\n            assert params[5] == 0  # unique_new should be false\n        elif i == 8:\n            # unique ethane hydrogen atom\n            ethane_vdw = ethane_labels[\"vdW\"][(0,)]\n            # lambda=0 parameters should be zeroed dummy atom values\n            assert params[0] == ethane_vdw.sigma.m_as(offunit.nanometer)\n            assert params[1] == 0.0  # epsilon is zero for dummy atoms\n            # lambda=1 parameters should be ethane values\n            assert params[2] == ethane_vdw.sigma.m_as(offunit.nanometer)\n            assert params[3] == ethane_vdw.epsilon.m_as(offunit.kilojoule_per_mole)\n            # check we correctly assign the unique_old and unique_new parameters\n            assert params[4] == 0  # unique_old should be false\n            assert params[5] == 1  # unique_new should be true\n        else:\n            # mapped atoms should use the chloro at lambda=0 and ethane at lambda=1\n            chloro_vdw = chloro_labels[\"vdW\"][(i,)]\n            assert params[0] == chloro_vdw.sigma.m_as(offunit.nanometer)\n            assert params[1] == chloro_vdw.epsilon.m_as(offunit.kilojoule_per_mole)\n            e1 = mapping.componentA_to_componentB[i]\n            ethane_vdw = ethane_labels[\"vdW\"][(e1,)]\n            assert params[2] == ethane_vdw.sigma.m_as(offunit.nanometer)\n            assert params[3] == ethane_vdw.epsilon.m_as(offunit.kilojoule_per_mole)\n            # as we have no unique parameters both unique_old and unique_new should be zero\n            assert params[4] == 0\n            assert params[5] == 0\n\n\ndef test_custom_nb_exclusions_no_dummy(htf_chloro_fluoroethane):\n    \"\"\"\n    Test that the expected exclusions are correctly assigned when we have no dummy atoms.\n    This should only be the standard exclusions.\n    \"\"\"\n    forces = htf_chloro_fluoroethane[\"forces\"]\n\n    custom_nb_force = forces[\"CustomNonbondedForce\"]\n\n    num_exclusions = custom_nb_force.getNumExclusions()\n    # there should be 28 in total (8 * 7) / 2\n    assert num_exclusions == 28\n\n    # now check the exclusions are correctly assigned\n    exclusion_set = set()\n    for i in range(num_exclusions):\n        p1, p2 = custom_nb_force.getExclusionParticles(i)\n        exclusion_set.add((p1, p2))\n    # check we have all expected exclusions\n    for a1 in range(8):\n        for a2 in range(a1 + 1, 8):\n            assert (a1, a2) in exclusion_set\n\n\ndef test_custom_nb_exclusions_dummy(htf_chloro_ethane):\n    \"\"\"\n    Test that all exclusions are correctly assigned when we have dummy atoms,\n    this should involve an exclusion between the two dummy atoms 0-8.\n    \"\"\"\n    forces = htf_chloro_ethane[\"forces\"]\n\n    custom_nb_force = forces[\"CustomNonbondedForce\"]\n\n    num_exclusions = custom_nb_force.getNumExclusions()\n    # there should be 36 in total (9 * 8) / 2\n    assert num_exclusions == 36\n\n    # now check the exclusions are correctly assigned\n    exclusion_set = set()\n    for i in range(num_exclusions):\n        p1, p2 = custom_nb_force.getExclusionParticles(i)\n        exclusion_set.add((p1, p2))\n        # due to the way we add the exclusions for the unique_new atoms we need to add the reverse too\n        exclusion_set.add((p2, p1))\n    # check we have all expected exclusions\n    for a1 in range(9):\n        for a2 in range(a1 + 1, 9):\n            assert (a1, a2) in exclusion_set\n\n\ndef test_custom_nb_interation_groups_no_dummy(htf_chloro_fluoroethane):\n    \"\"\"\n    Test the interaction groups are correctly assigned when we have no dummy atoms.\n\n    \"\"\"\n    forces = htf_chloro_fluoroethane[\"forces\"]\n\n    custom_nb_force = forces[\"CustomNonbondedForce\"]\n\n    num_groups = custom_nb_force.getNumInteractionGroups()\n    # we should always have 8 groups\n    assert num_groups == 8\n\n    # now check the groups are correctly assigned\n    particle_set = set(range(8))\n    expected_groups = [\n        (set(), particle_set),  #  unique_old, core\n        (set(), set()),  # unique_old, env\n        (set(), particle_set),  # unique_new, core\n        (set(), set()),  # unique_new, env\n        (particle_set, set()),  # core, env\n        (particle_set, particle_set),  # core, core\n        (set(), set()),  # unique_new, unique_new\n        (set(), set()),  # unique_old, unique_old\n    ]\n    for i in range(num_groups):\n        group1, group2 = custom_nb_force.getInteractionGroupParameters(i)\n        expected_g1, expected_g2 = expected_groups[i]\n        assert set(group1) == expected_g1\n        assert set(group2) == expected_g2\n\n\ndef test_custom_nb_interation_groups_dummy(htf_chloro_ethane):\n    \"\"\"\n    Make sure the interaction groups are correctly assigned when we have dummy atoms.\n    The unique_old and unique_new atoms should be split to not interact.\n    \"\"\"\n    forces = htf_chloro_ethane[\"forces\"]\n\n    custom_nb_force = forces[\"CustomNonbondedForce\"]\n\n    num_groups = custom_nb_force.getNumInteractionGroups()\n    # we should always have 8 groups\n    assert num_groups == 8\n\n    # now check the groups are correctly assigned\n    core_set = set(range(1, 8))\n    unique_old_set = {0}\n    unique_new_set = {8}\n    expected_groups = [\n        (unique_old_set, core_set),  #  unique_old, core\n        (unique_old_set, set()),  # unique_old, env\n        (unique_new_set, core_set),  # unique_new, core\n        (unique_new_set, set()),  # unique_new, env\n        (core_set, set()),  # core, env\n        (core_set, core_set),  # core, core\n        (unique_new_set, unique_new_set),  # unique_new, unique_new\n        (unique_old_set, unique_old_set),  # unique_old, unique_old\n    ]\n    for i in range(num_groups):\n        group1, group2 = custom_nb_force.getInteractionGroupParameters(i)\n        expected_g1, expected_g2 = expected_groups[i]\n        assert set(group1) == expected_g1\n        assert set(group2) == expected_g2\n\n\ndef test_custom_sterics_force_no_dummy(htf_chloro_fluoroethane):\n    \"\"\"\n    Make sure there are no bonds in the custom sterics force when we have no dummy atoms.\n    \"\"\"\n    forces = htf_chloro_fluoroethane[\"forces\"]\n    custom_sterics_force = forces[\"CustomBondForce_exceptions\"]\n    # there should be 5 global parameters used to scale the particle parameters\n    assert custom_sterics_force.getNumGlobalParameters() == 5\n    expected_global_params = {\n        \"lambda_sterics_insert\",\n        \"lambda_sterics_delete\",\n        \"lambda_electrostatics_insert\",\n        \"lambda_electrostatics_delete\",\n        \"softcore_alpha\",\n    }\n    actual_global_params = {\n        custom_sterics_force.getGlobalParameterName(i)\n        for i in range(custom_sterics_force.getNumGlobalParameters())\n    }\n    assert actual_global_params == expected_global_params\n\n    # we should have no parameters in this force as there are no dummy atoms\n    assert custom_sterics_force.getNumBonds() == 0\n\n\ndef test_custom_sterics_force_dummy(htf_chloro_ethane):\n    \"\"\"\n    The custom sterics force should contain only 1-4 interactions involving dummy atoms make sure they are correctly interpolated.\n    \"\"\"\n    forces = htf_chloro_ethane[\"forces\"]\n    mapping = htf_chloro_ethane[\"mapping\"]\n    chloroethane = htf_chloro_ethane[\"chloroethane\"]\n    chloro_charges = htf_chloro_ethane[\"chloro_charges\"]\n    chloro_labels = htf_chloro_ethane[\"chloro_labels\"]\n    ethane_charges = htf_chloro_ethane[\"ethane_charges\"]\n    ethane_labels = htf_chloro_ethane[\"ethane_labels\"]\n    chloro_openff = chloroethane.to_openff()\n    electro_scale = htf_chloro_ethane[\"electrostatic_scale\"]\n    vdw_scale = htf_chloro_ethane[\"vdW_scale\"]\n\n    custom_sterics_force = forces[\"CustomBondForce_exceptions\"]\n    # there should be 5 global parameters used to scale the particle parameters\n    assert custom_sterics_force.getNumGlobalParameters() == 5\n    expected_global_params = {\n        \"lambda_sterics_insert\",\n        \"lambda_sterics_delete\",\n        \"lambda_electrostatics_insert\",\n        \"lambda_electrostatics_delete\",\n        \"softcore_alpha\",\n    }\n    actual_global_params = {\n        custom_sterics_force.getGlobalParameterName(i)\n        for i in range(custom_sterics_force.getNumGlobalParameters())\n    }\n    assert actual_global_params == expected_global_params\n\n    num_bonds = custom_sterics_force.getNumBonds()\n    # there should be 6 bonds corresponding to the 1-4s involving a dummy atom\n    # 3 involving the unique chloro atom to be interpolated out\n    # 3 involving the unique ethane hydrogen atom to be interpolated in\n    assert num_bonds == 6\n\n    # now check the bonds are correctly assigned\n    expected_bonds = []\n    # get all atoms with a minimal path of 3 bonds between them\n    for pair_1_4 in chloro_openff.nth_degree_neighbors(3):\n        a1 = chloro_openff.atoms.index(pair_1_4[0])\n        a2 = chloro_openff.atoms.index(pair_1_4[1])\n        if a1 == 0 or a2 == 0:\n            expected_bonds.append((a1, a2))\n    # manually add the 1-4s involving the unique ethane hydrogen atom (atom 8)\n    for i in [5, 6, 7]:\n        expected_bonds.append((8, i))\n\n    for i in range(num_bonds):\n        p1, p2, params = custom_sterics_force.getBondParameters(i)\n        # all parameters here should be 1-4 involving a dummy atom only\n        assert (p1, p2) in expected_bonds or (p2, p1) in expected_bonds\n        # now check the parameters are correct\n        if p1 == 0 or p2 == 0:\n            # unique chloro atom being removed\n            charge1 = chloro_charges[p1]\n            charge2 = chloro_charges[p2]\n            # check the charge product at lambda=0\n            assert charge1 * charge2 * electro_scale == pytest.approx(params[0], rel=1e-5)\n            # this is scaled by the unique flags make sure unique_old is 1 and unique_new is 0\n            assert params[5] == 1  # unique_old\n            assert params[6] == 0  # unique_new\n            # now check the vdw parameters at lambda=0\n            chloro_vdw1 = chloro_labels[\"vdW\"][(p1,)]\n            chloro_vdw2 = chloro_labels[\"vdW\"][(p2,)]\n            expected_sigma = (chloro_vdw1.sigma + chloro_vdw2.sigma) / 2.0\n            expected_epsilon = ((chloro_vdw1.epsilon * chloro_vdw2.epsilon) ** 0.5) * vdw_scale\n            assert params[1] == expected_sigma.m_as(offunit.nanometer)\n            assert expected_epsilon.m_as(offunit.kilojoule_per_mole) == pytest.approx(\n                params[2], rel=1e-5\n            )\n            # check the vdw go to zero at lambda=1\n            assert params[4] == 0.0  # epsilon at lambda=1\n            # sigma doesn't matter if epsilon is zero\n        elif p1 == 8 or p2 == 8:\n            # unique ethane hydrogen atom being inserted\n            e1 = 0 if p1 == 8 else mapping.componentA_to_componentB[p1]\n            e2 = 0 if p2 == 8 else mapping.componentA_to_componentB[p2]\n            ethane_charge1 = ethane_charges[e1]\n            ethane_charge2 = ethane_charges[e2]\n            # check the charge product at lambda=1\n            assert ethane_charge1 * ethane_charge2 * electro_scale == pytest.approx(\n                params[0], rel=1e-5\n            )\n            # this is scaled by the unique flags make sure unique_old is 0 and unique_new is 1\n            assert params[5] == 0  # unique_old\n            assert params[6] == 1  # unique_new\n            # now check the vdw parameters at lambda=1\n            ethane_vdw1 = ethane_labels[\"vdW\"][(e1,)]\n            ethane_vdw2 = ethane_labels[\"vdW\"][(e2,)]\n            expected_sigma = (ethane_vdw1.sigma + ethane_vdw2.sigma) / 2.0\n            expected_epsilon = ((ethane_vdw1.epsilon * ethane_vdw2.epsilon) ** 0.5) * vdw_scale\n            assert params[3] == expected_sigma.m_as(offunit.nanometer)\n            assert expected_epsilon.m_as(offunit.kilojoule_per_mole) == pytest.approx(\n                params[4], rel=1e-5\n            )\n            # check the vdw are zero at lambda=0\n            assert params[2] == 0.0  # epsilon at lambda=0\n\n\ndef test_vacuum_system_energy_no_dummy(htf_chloro_fluoroethane):\n    \"\"\"\n    Test that the hybrid system energy is the same at lambda=0 and lambda=1 as the pure systems.\n    All individual force components should match as there are no dummy atoms.\n    \"\"\"\n    integrator = openmm.LangevinIntegrator(\n        300 * unit.kelvin, 1.0 / unit.picosecond, 0.002 * unit.picoseconds\n    )\n    platform = openmm.Platform.getPlatformByName(\"CPU\")\n    default_lambda = _rfe_utils.lambdaprotocol.LambdaProtocol()\n    htf = htf_chloro_fluoroethane[\"htf\"]\n    hybrid_system = htf.hybrid_system\n    # set the nonbonded method to NoCutoff to avoid any cutoff issues\n    for force in hybrid_system.getForces():\n        if isinstance(force, openmm.NonbondedForce):\n            force.setNonbondedMethod(openmm.NonbondedForce.NoCutoff)\n        if isinstance(force, openmm.CustomNonbondedForce):\n            force.setNonbondedMethod(openmm.CustomNonbondedForce.NoCutoff)\n    hybrid_simulation = app.Simulation(\n        topology=htf.omm_hybrid_topology,\n        system=hybrid_system,\n        integrator=integrator,\n        platform=platform,\n    )\n    for end_state, ref_system, ref_top, pos in [\n        (0, htf._old_system, htf._old_topology, htf._old_positions),\n        (1, htf._new_system, htf._new_topology, htf._new_positions),\n    ]:\n        for force in ref_system.getForces():\n            if isinstance(force, openmm.NonbondedForce):\n                force.setNonbondedMethod(openmm.NonbondedForce.NoCutoff)\n        # set lambda\n        # set all lambda values to the current end state\n        for name, func in default_lambda.functions.items():\n            val = func(end_state)\n            hybrid_simulation.context.setParameter(name, val)\n        # set positions\n        hybrid_simulation.context.setPositions(pos)\n        # get the hybrid system energy\n        hybrid_state = hybrid_simulation.context.getState(getEnergy=True)\n        hybrid_energy = hybrid_state.getPotentialEnergy().value_in_unit(unit.kilojoule_per_mole)\n        # now create a reference simulation\n        ref_simulation = app.Simulation(\n            topology=ref_top,\n            system=ref_system,\n            integrator=copy.deepcopy(integrator),\n            platform=platform,\n        )\n        ref_simulation.context.setPositions(pos)\n        ref_state = ref_simulation.context.getState(getEnergy=True)\n        ref_energy = ref_state.getPotentialEnergy().value_in_unit(unit.kilojoule_per_mole)\n        # energies should be the same\n        assert ref_energy == pytest.approx(hybrid_energy, rel=1e-5)\n        # check the energy is non-zero to avoid false positives\n        assert 0.0 != pytest.approx(hybrid_energy)\n\n\ndef test_vacuum_system_energy_dummy(htf_chloro_ethane):\n    \"\"\"\n    Test that the hybrid system nonbonded energy is the same at lambda=0 and lambda=1 as the pure systems.\n    All individual force components will not match due to the presence of dummy atoms, only the total nonbonded energy should be the same.\n    \"\"\"\n    integrator = openmm.LangevinIntegrator(\n        300 * unit.kelvin, 1.0 / unit.picosecond, 0.002 * unit.picoseconds\n    )\n    platform = openmm.Platform.getPlatformByName(\"CPU\")\n    default_lambda = _rfe_utils.lambdaprotocol.LambdaProtocol()\n    htf = htf_chloro_ethane[\"htf\"]\n    hybrid_system = htf.hybrid_system\n    # # set the nonbonded method to NoCutoff to avoid any cutoff issues\n    for force in hybrid_system.getForces():\n        if isinstance(force, openmm.NonbondedForce):\n            force.setNonbondedMethod(openmm.NonbondedForce.NoCutoff)\n        if isinstance(force, openmm.CustomNonbondedForce):\n            force.setNonbondedMethod(openmm.CustomNonbondedForce.NoCutoff)\n\n    # set the nonbonded forces to group 1 to easily extract their energies and all others to 0\n    for force in hybrid_system.getForces():\n        if force.getName() in [\n            \"NonbondedForce\",\n            \"CustomNonbondedForce\",\n            \"CustomBondForce_exceptions\",\n        ]:\n            force.setForceGroup(1)\n        else:\n            force.setForceGroup(0)\n\n    hybrid_simulation = app.Simulation(\n        topology=htf.omm_hybrid_topology,\n        system=hybrid_system,\n        integrator=integrator,\n        platform=platform,\n    )\n\n    for end_state, ref_system, ref_top, pos in [\n        (0, htf._old_system, htf._old_topology, htf._old_positions),\n        (1, htf._new_system, htf._new_topology, htf._new_positions),\n    ]:\n        # set lambda\n        # set all lambda values to the current end state\n        for name, func in default_lambda.functions.items():\n            val = func(end_state)\n            hybrid_simulation.context.setParameter(name, val)\n        # set positions as the hybrid positions, as all mapped atoms are in the same place in both end states\n        hybrid_simulation.context.setPositions(htf.hybrid_positions)\n        # get the hybrid system nonbonded energy\n        hybrid_state = hybrid_simulation.context.getState(getEnergy=True, groups={1})\n        hybrid_energy = hybrid_state.getPotentialEnergy().value_in_unit(unit.kilojoule_per_mole)\n        # set the force group for the reference system nonbonded forces\n        for force in ref_system.getForces():\n            if force.getName() == \"NonbondedForce\":\n                force.setForceGroup(1)\n                force.setNonbondedMethod(openmm.NonbondedForce.NoCutoff)\n            else:\n                force.setForceGroup(0)\n        # now create a reference simulation\n        ref_simulation = app.Simulation(\n            topology=ref_top,\n            system=ref_system,\n            integrator=copy.deepcopy(integrator),\n            platform=platform,\n        )\n        ref_simulation.context.setPositions(pos)\n        ref_state = ref_simulation.context.getState(getEnergy=True, groups={1})\n        ref_energy = ref_state.getPotentialEnergy().value_in_unit(unit.kilojoule_per_mole)\n        # energies should be the same\n        # this is only true if we correctly interpolate the 1-4 interactions involving dummy atoms\n        assert ref_energy == pytest.approx(hybrid_energy, rel=1e-5)\n        # check the energy is non-zero to avoid false positives\n        assert 0.0 != pytest.approx(hybrid_energy)\n\n\ndef test_system_energy_pme_no_dummy(htf_chlorobenzene_fluorobenzene):\n    \"\"\"\n    Test that the hybrid system energy is the same at lambda=0 and lambda=1 as the pure systems using PME,\n    for a fully mapped system.\n    \"\"\"\n    integrator = openmm.LangevinIntegrator(\n        300 * unit.kelvin, 1.0 / unit.picosecond, 0.002 * unit.picoseconds\n    )\n    platform = openmm.Platform.getPlatformByName(\"CPU\")\n    default_lambda = _rfe_utils.lambdaprotocol.LambdaProtocol()\n    htf = htf_chlorobenzene_fluorobenzene[\"htf\"]\n    hybrid_system = htf.hybrid_system\n\n    hybrid_simulation = app.Simulation(\n        topology=htf.omm_hybrid_topology,\n        system=hybrid_system,\n        integrator=integrator,\n        platform=platform,\n    )\n    for end_state, ref_system, ref_top, pos in [\n        (0, htf._old_system, htf._old_topology, htf._old_positions),\n        (1, htf._new_system, htf._new_topology, htf._new_positions),\n    ]:\n        # set lambda\n        # set all lambda values to the current end state\n        for name, func in default_lambda.functions.items():\n            val = func(end_state)\n            hybrid_simulation.context.setParameter(name, val)\n        # set positions\n        hybrid_simulation.context.setPositions(pos)\n        # get the hybrid system energy\n        hybrid_state = hybrid_simulation.context.getState(getEnergy=True)\n        hybrid_energy = hybrid_state.getPotentialEnergy().value_in_unit(unit.kilojoule_per_mole)\n        # now create a reference simulation\n        ref_simulation = app.Simulation(\n            topology=ref_top,\n            system=ref_system,\n            integrator=copy.deepcopy(integrator),\n            platform=platform,\n        )\n        ref_simulation.context.setPositions(pos)\n        ref_state = ref_simulation.context.getState(getEnergy=True)\n        ref_energy = ref_state.getPotentialEnergy().value_in_unit(unit.kilojoule_per_mole)\n        # energies should be the same\n        assert ref_energy == pytest.approx(hybrid_energy, rel=1e-5)\n        # make sure the energy is non-zero to avoid false positives\n        assert 0.0 != pytest.approx(hybrid_energy)\n\n\ndef test_system_interaction_groups_no_dummy(htf_chlorobenzene_fluorobenzene):\n    \"\"\"Test the interaction groups are correctly assigned when we have environment atoms as well.\"\"\"\n    forces = htf_chlorobenzene_fluorobenzene[\"forces\"]\n    htf = htf_chlorobenzene_fluorobenzene[\"htf\"]\n    custom_nb_force = forces[\"CustomNonbondedForce\"]\n    num_groups = custom_nb_force.getNumInteractionGroups()\n    # we should always have 8 groups\n    assert num_groups == 8\n\n    # now check the groups are correctly assigned\n    # we assume the ligand topology is added to the end of the solvated protein topology which ends on index 21666\n    core_set = set(range(21667, 21679))\n    unique_old_set = set()\n    unique_new_set = set()\n    environment_set = set(range(0, 21667))\n    expected_groups = [\n        (unique_old_set, core_set),  # unique_old, core\n        (unique_old_set, environment_set),  # unique_old, env\n        (unique_new_set, core_set),  # unique_new, core\n        (unique_new_set, environment_set),  # unique_new, env\n        (core_set, environment_set),  # core, env\n        (core_set, core_set),  # core, core\n        (unique_new_set, unique_new_set),  # unique_new, unique_new\n        (unique_old_set, unique_old_set),  # unique_old, unique_old\n    ]\n    for i in range(num_groups):\n        group1, group2 = custom_nb_force.getInteractionGroupParameters(i)\n        expected_g1, expected_g2 = expected_groups[i]\n        assert set(group1) == expected_g1\n        assert set(group2) == expected_g2\n\n\ndef test_system_interaction_groups_dummy(htf_chlorobenzene_benzene):\n    \"\"\"Test the interaction groups are correctly assigned when we have environment atoms and dummy atoms.\"\"\"\n    forces = htf_chlorobenzene_benzene[\"forces\"]\n    htf = htf_chlorobenzene_benzene[\"htf\"]\n    custom_nb_force = forces[\"CustomNonbondedForce\"]\n    num_groups = custom_nb_force.getNumInteractionGroups()\n    # we should always have 8 groups\n    assert num_groups == 8\n\n    # now check the groups are correctly assigned\n    # we assume the ligand topology is added to the end of the solvated protein topology which ends on index 21666\n    core_set = set(range(21668, 21679))\n    unique_old_set = {21667}\n    unique_new_set = {21679}\n    environment_set = set(range(0, 21667))\n    expected_groups = [\n        (unique_old_set, core_set),  # unique_old, core\n        (unique_old_set, environment_set),  # unique_old, env\n        (unique_new_set, core_set),  # unique_new, core\n        (unique_new_set, environment_set),  # unique_new, env\n        (core_set, environment_set),  # core, env\n        (core_set, core_set),  # core, core\n        (unique_new_set, unique_new_set),  # unique_new, unique_new\n        (unique_old_set, unique_old_set),  # unique_old, unique_old\n    ]\n    for i in range(num_groups):\n        group1, group2 = custom_nb_force.getInteractionGroupParameters(i)\n        expected_g1, expected_g2 = expected_groups[i]\n        assert set(group1) == expected_g1\n        assert set(group2) == expected_g2\n\n\ndef test_system_energy_pme_dummy(htf_chlorobenzene_benzene):\n    \"\"\"\n    Test that the hybrid system nonbonded energy is the same at lambda=0 and lambda=1 as the pure systems using PME,\n    for a system with dummy atoms.\n    \"\"\"\n    integrator = openmm.LangevinIntegrator(\n        300 * unit.kelvin, 1.0 / unit.picosecond, 0.002 * unit.picoseconds\n    )\n    platform = openmm.Platform.getPlatformByName(\"CPU\")\n    default_lambda = _rfe_utils.lambdaprotocol.LambdaProtocol()\n    htf = htf_chlorobenzene_benzene[\"htf\"]\n    hybrid_system = htf.hybrid_system\n\n    # set the nonbonded forces to group 1 to easily extract their energies and all others to 0\n    for force in hybrid_system.getForces():\n        if force.getName() in [\n            \"NonbondedForce\",\n            \"CustomNonbondedForce\",\n            \"CustomBondForce_exceptions\",\n        ]:\n            force.setForceGroup(1)\n        else:\n            force.setForceGroup(0)\n\n    hybrid_simulation = app.Simulation(\n        topology=htf.omm_hybrid_topology,\n        system=hybrid_system,\n        integrator=integrator,\n        platform=platform,\n    )\n\n    for end_state, ref_system, ref_top, pos in [\n        (0, htf._old_system, htf._old_topology, htf._old_positions),\n        (1, htf._new_system, htf._new_topology, htf._new_positions),\n    ]:\n        # set lambda\n        # set all lambda values to the current end state\n        for name, func in default_lambda.functions.items():\n            val = func(end_state)\n            hybrid_simulation.context.setParameter(name, val)\n        # set positions as the hybrid positions, as all mapped atoms are in the same place in both end states\n        hybrid_simulation.context.setPositions(htf.hybrid_positions)\n        # get the hybrid system nonbonded energy\n        hybrid_state = hybrid_simulation.context.getState(getEnergy=True, groups={1})\n        hybrid_energy = hybrid_state.getPotentialEnergy().value_in_unit(unit.kilojoule_per_mole)\n        # set the force group for the reference system nonbonded forces\n        for force in ref_system.getForces():\n            if force.getName() == \"NonbondedForce\":\n                force.setForceGroup(1)\n            else:\n                force.setForceGroup(0)\n        # now create a reference simulation\n        ref_simulation = app.Simulation(\n            topology=ref_top,\n            system=ref_system,\n            integrator=copy.deepcopy(integrator),\n            platform=platform,\n        )\n        ref_simulation.context.setPositions(pos)\n        ref_state = ref_simulation.context.getState(getEnergy=True, groups={1})\n        ref_energy = ref_state.getPotentialEnergy().value_in_unit(unit.kilojoule_per_mole)\n        # energies should be the same\n        # this is only true if we correctly interpolate the 1-4 interactions involving dummy atoms\n        # make sure the energy is non-zero to avoid false positives\n        assert 0.0 != pytest.approx(hybrid_energy)\n        assert hybrid_energy == pytest.approx(ref_energy, rel=1e-5)\n"
  },
  {
    "path": "src/openfe/tests/protocols/openmm_rfe/test_hybrid_top_protocol.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\nimport copy\nimport json\nimport sys\nimport xml.etree.ElementTree as ET\nfrom importlib import resources\nfrom math import sqrt\nfrom pathlib import Path\nfrom unittest import mock\n\nimport gufe\nimport mdtraj as mdt\nimport numpy as np\nimport openmm\nimport pytest\nfrom kartograf import KartografAtomMapper\nfrom kartograf.atom_aligner import align_mol_shape\nfrom numpy.testing import assert_allclose\nfrom openff.toolkit import Molecule\nfrom openff.units import unit\nfrom openff.units.openmm import ensure_quantity, from_openmm, to_openmm\nfrom openmm import (\n    CustomNonbondedForce,\n    MonteCarloBarostat,\n    MonteCarloMembraneBarostat,\n    NonbondedForce,\n    XmlSerializer,\n    app,\n)\nfrom openmm import unit as omm_unit\nfrom openmmforcefields.generators import SMIRNOFFTemplateGenerator\nfrom openmmtools.multistate.multistatesampler import MultiStateSampler\nfrom rdkit import Chem\nfrom rdkit.Geometry import Point3D\n\nimport openfe\nfrom openfe import setup\nfrom openfe.protocols import openmm_rfe\nfrom openfe.protocols.openmm_rfe._rfe_utils import topologyhelpers\nfrom openfe.protocols.openmm_rfe.hybridtop_units import (\n    HybridTopologyMultiStateAnalysisUnit,\n    HybridTopologyMultiStateSimulationUnit,\n    HybridTopologySetupUnit,\n)\nfrom openfe.protocols.openmm_utils import omm_compute, system_creation\nfrom openfe.protocols.openmm_utils.charge_generation import (\n    HAS_ESPALOMA_CHARGE,\n    HAS_NAGL,\n    HAS_OPENEYE,\n)\n\n\ndef _get_units(protocol_units, unit_type):\n    \"\"\"\n    Helper method to extract setup units\n    \"\"\"\n    return [pu for pu in protocol_units if isinstance(pu, unit_type)]\n\n\n@pytest.fixture()\ndef vac_settings():\n    settings = openmm_rfe.RelativeHybridTopologyProtocol.default_settings()\n    settings.forcefield_settings.nonbonded_method = \"nocutoff\"\n    settings.engine_settings.compute_platform = None\n    settings.protocol_repeats = 1\n    return settings\n\n\n@pytest.fixture()\ndef solv_settings():\n    settings = openmm_rfe.RelativeHybridTopologyProtocol.default_settings()\n    settings.engine_settings.compute_platform = None\n    settings.protocol_repeats = 1\n    return settings\n\n\ndef test_compute_platform_warn():\n    with pytest.warns(UserWarning, match=\"Non-CUDA platform selected: CPU\"):\n        omm_compute.get_openmm_platform(\"CPU\")\n\n\ndef test_append_topology(benzene_complex_system, toluene_complex_system):\n    mod = app.Modeller(\n        benzene_complex_system[\"protein\"].to_openmm_topology(),\n        benzene_complex_system[\"protein\"].to_openmm_positions(),\n    )\n    lig1 = benzene_complex_system[\"ligand\"].to_openff()\n    mod.add(\n        lig1.to_topology().to_openmm(),\n        ensure_quantity(lig1.conformers[0], \"openmm\"),\n    )\n\n    top1 = mod.topology\n\n    assert len(list(top1.atoms())) == 2625\n    assert len(list(top1.bonds())) == 2645\n\n    lig2 = toluene_complex_system[\"ligand\"].to_openff()\n\n    top2, appended_resids = openmm_rfe._rfe_utils.topologyhelpers.combined_topology(\n        top1,\n        lig2.to_topology().to_openmm(),\n        exclude_resids=np.asarray(list(top1.residues())[-1].index),\n    )\n\n    assert len(list(top2.atoms())) == 2625 + 3  # added methyl\n    assert len(list(top2.bonds())) == 2645 + 4 - 1  # add methyl bonds, minus hydrogen\n    assert appended_resids[0] == len(list(top1.residues())) - 1\n\n\ndef test_append_topology_no_exclude(benzene_complex_system, toluene_complex_system):\n    mod = app.Modeller(\n        benzene_complex_system[\"protein\"].to_openmm_topology(),\n        benzene_complex_system[\"protein\"].to_openmm_positions(),\n    )\n    lig1 = benzene_complex_system[\"ligand\"].to_openff()\n    mod.add(\n        lig1.to_topology().to_openmm(),\n        ensure_quantity(lig1.conformers[0], \"openmm\"),\n    )\n\n    top1 = mod.topology\n\n    assert len(list(top1.atoms())) == 2625\n    assert len(list(top1.bonds())) == 2645\n\n    lig2 = toluene_complex_system[\"ligand\"].to_openff()\n\n    top2, appended_resids = openmm_rfe._rfe_utils.topologyhelpers.combined_topology(\n        top1,\n        lig2.to_topology().to_openmm(),\n        exclude_resids=None,\n    )\n\n    assert len(list(top2.atoms())) == 2625 + 15  # added toluene\n    assert len(list(top2.bonds())) == 2645 + 15  # 15 bonds in toluene\n    assert appended_resids[0] == len(list(top1.residues()))\n\n\ndef test_create_default_settings():\n    settings = openmm_rfe.RelativeHybridTopologyProtocol.default_settings()\n\n    assert settings\n\n\ndef test_adaptive_settings_no_initial(benzene_system, toluene_system, benzene_to_toluene_mapping):\n    settings = openmm_rfe.RelativeHybridTopologyProtocol._adaptive_settings(\n        stateA=benzene_system,\n        stateB=toluene_system,\n        mapping=[benzene_to_toluene_mapping],\n    )\n    # this is a solvent system make sure the padding is 1.5 nm\n    assert settings.solvation_settings.solvent_padding == 1.5 * unit.nanometer\n    # make sure the default parameter is not changed\n    assert settings.protocol_repeats == 3\n\n\ndef test_create_default_protocol():\n    # this is roughly how it should be created\n    protocol = openmm_rfe.RelativeHybridTopologyProtocol(\n        settings=openmm_rfe.RelativeHybridTopologyProtocol.default_settings(),\n    )\n\n    assert protocol\n\n\ndef test_invalid_protocol_repeats():\n    settings = openmm_rfe.RelativeHybridTopologyProtocol.default_settings()\n    with pytest.raises(ValueError, match=\"must be a positive value\"):\n        settings.protocol_repeats = -1\n\n\ndef test_serialize_protocol():\n    protocol = openmm_rfe.RelativeHybridTopologyProtocol(\n        settings=openmm_rfe.RelativeHybridTopologyProtocol.default_settings(),\n    )\n\n    ser = protocol.to_dict()\n\n    ret = openmm_rfe.RelativeHybridTopologyProtocol.from_dict(ser)\n\n    assert protocol == ret\n\n\ndef test_repeat_units(benzene_system, toluene_system, benzene_to_toluene_mapping):\n    settings = openmm_rfe.RelativeHybridTopologyProtocol.default_settings()\n\n    protocol = openmm_rfe.RelativeHybridTopologyProtocol(\n        settings=settings,\n    )\n\n    dag = protocol.create(\n        stateA=benzene_system,\n        stateB=toluene_system,\n        mapping=benzene_to_toluene_mapping,\n    )\n\n    # 9 protocol units, 3 per repeat\n    pus = list(dag.protocol_units)\n    assert len(pus) == 9\n\n    # Aggregate some info for each repeat\n    setup = _get_units(pus, HybridTopologySetupUnit)\n    simulation = _get_units(pus, HybridTopologyMultiStateSimulationUnit)\n    analysis = _get_units(pus, HybridTopologyMultiStateAnalysisUnit)\n\n    # Should be 3 of everything\n    assert len(setup) == len(simulation) == len(analysis) == 3\n\n    # Check that the dag chain is correct\n    for analysis_pu in analysis:\n        repeat_id = analysis_pu.inputs[\"repeat_id\"]\n        setup_pu = [s for s in setup if s.inputs[\"repeat_id\"] == repeat_id][0]\n        sim_pu = [s for s in simulation if s.inputs[\"repeat_id\"] == repeat_id][0]\n\n        assert analysis_pu.inputs[\"setup_results\"] == setup_pu\n        assert analysis_pu.inputs[\"simulation_results\"] == sim_pu\n        assert sim_pu.inputs[\"setup_results\"] == setup_pu\n\n\ndef test_create_independent_repeat_ids(benzene_system, toluene_system, benzene_to_toluene_mapping):\n    # if we create two dags each with 3 repeats, they should give 6 repeat_ids\n    # this allows multiple DAGs in flight for one Transformation that don't clash on gather\n    settings = openmm_rfe.RelativeHybridTopologyProtocol.default_settings()\n\n    protocol = openmm_rfe.RelativeHybridTopologyProtocol(\n        settings=settings,\n    )\n    dag1 = protocol.create(\n        stateA=benzene_system,\n        stateB=toluene_system,\n        mapping=benzene_to_toluene_mapping,\n    )\n    dag2 = protocol.create(\n        stateA=benzene_system,\n        stateB=toluene_system,\n        mapping=benzene_to_toluene_mapping,\n    )\n\n    repeat_ids = set()\n    for u in dag1.protocol_units:\n        repeat_ids.add(u.inputs[\"repeat_id\"])\n    for u in dag2.protocol_units:\n        repeat_ids.add(u.inputs[\"repeat_id\"])\n\n    assert len(repeat_ids) == 6\n\n\ndef test_bad_sampler():\n    class FakeSimSettings(gufe.settings.SettingsBaseModel):\n        sampler_method: str = \"foo bar\"\n\n    errmsg = \"Unknown sampler foo bar\"\n    with pytest.raises(AttributeError, match=errmsg):\n        HybridTopologyMultiStateSimulationUnit._get_sampler(\n            system=None,\n            positions=None,\n            lambdas=None,\n            integrator=None,\n            reporter=None,\n            simulation_settings=FakeSimSettings(),\n            thermo_settings=None,\n            alchem_settings=None,\n            platform=None,\n            restart=False,\n            dry=False,\n        )\n\n\n@pytest.mark.parametrize(\"method\", [\"repex\", \"sams\", \"independent\", \"InDePeNdENT\"])\ndef test_setup_dry_sim_default_vacuum(\n    benzene_vacuum_system,\n    toluene_vacuum_system,\n    benzene_to_toluene_mapping,\n    method,\n    vac_settings,\n    tmp_path,\n    benzene_toluene_topology,\n):\n    vac_settings.simulation_settings.sampler_method = method\n\n    protocol = openmm_rfe.RelativeHybridTopologyProtocol(\n        settings=vac_settings,\n    )\n\n    # create DAG from protocol and take first (and only) work unit from within\n    dag = protocol.create(\n        stateA=benzene_vacuum_system,\n        stateB=toluene_vacuum_system,\n        mapping=benzene_to_toluene_mapping,\n    )\n    dag_setup_unit = _get_units(dag.protocol_units, HybridTopologySetupUnit)[0]\n    dag_sim_unit = _get_units(dag.protocol_units, HybridTopologyMultiStateSimulationUnit)[0]\n\n    # Manually run the units\n    setup_results = dag_setup_unit.run(\n        dry=True, scratch_basepath=tmp_path, shared_basepath=tmp_path\n    )\n\n    sim_results = dag_sim_unit.run(\n        system=setup_results[\"hybrid_system\"],\n        positions=setup_results[\"hybrid_positions\"],\n        selection_indices=setup_results[\"selection_indices\"],\n        dry=True,\n        scratch_basepath=tmp_path,\n        shared_basepath=tmp_path,\n    )\n\n    sampler = sim_results[\"sampler\"]\n    assert isinstance(sampler, MultiStateSampler)\n    assert not sampler.is_periodic\n    assert sampler._thermodynamic_states[0].barostat is None\n\n    # Check hybrid OMM and MDTtraj Topologies\n    htf = setup_results[\"hybrid_factory\"]\n    # 16 atoms:\n    # 11 common atoms, 1 extra hydrogen in benzene, 4 extra in toluene\n    # 12 bonds in benzene + 4 extra toluene bonds\n    assert len(list(htf.hybrid_topology.atoms)) == 16\n    assert len(list(htf.omm_hybrid_topology.atoms())) == 16\n    assert len(list(htf.hybrid_topology.bonds)) == 16\n    assert len(list(htf.omm_hybrid_topology.bonds())) == 16\n\n    # smoke test - can convert back the mdtraj topology\n    ret_top = mdt.Topology.to_openmm(htf.hybrid_topology)\n    assert len(list(ret_top.atoms())) == 16\n    assert len(list(ret_top.bonds())) == 16\n\n    # check that our PDB has the right number of atoms\n    pdb = mdt.load_pdb(tmp_path / \"hybrid_system.pdb\")\n    assert pdb.n_atoms == 16\n\n    # regression test that we have the expected mdtraj topology\n    assert benzene_toluene_topology == htf.hybrid_topology\n\n    # check we can extract the correct positions for the end states\n    old_positions = htf.old_positions(htf.hybrid_positions)\n    # check the shape and positions match the input\n    assert old_positions.shape == (12, 3)\n    # compare with the input positions which are stored on the htf\n    assert_allclose(\n        old_positions.value_in_unit(omm_unit.angstrom),\n        htf._old_positions.value_in_unit(omm_unit.angstrom),\n    )\n    # same for toluene\n    new_positions = htf.new_positions(htf.hybrid_positions)\n    assert new_positions.shape == (15, 3)\n    assert_allclose(\n        new_positions.value_in_unit(omm_unit.angstrom),\n        htf._new_positions.value_in_unit(omm_unit.angstrom),\n    )\n\n\ndef test_setup_gaff_vacuum(\n    benzene_vacuum_system, toluene_vacuum_system, benzene_to_toluene_mapping, vac_settings, tmp_path\n):\n    \"\"\"\n    Simple dry run of the setup unit to make sure that parameterisation\n    will work with gaff.\n    \"\"\"\n    vac_settings.forcefield_settings.small_molecule_forcefield = \"gaff-2.11\"\n\n    protocol = openmm_rfe.RelativeHybridTopologyProtocol(\n        settings=vac_settings,\n    )\n\n    # create DAG from protocol and take first (and only) work unit from within\n    dag = protocol.create(\n        stateA=benzene_vacuum_system,\n        stateB=toluene_vacuum_system,\n        mapping=benzene_to_toluene_mapping,\n    )\n    dag_setup_unit = _get_units(dag.protocol_units, HybridTopologySetupUnit)[0]\n\n    _ = dag_setup_unit.run(dry=True, scratch_basepath=tmp_path, shared_basepath=tmp_path)\n\n\n@pytest.mark.slow\ndef test_dry_many_molecules_solvent(\n    benzene_many_solv_system,\n    toluene_many_solv_system,\n    benzene_to_toluene_mapping,\n    solv_settings,\n    tmp_path,\n):\n    \"\"\"\n    A basic setup test flushing \"will it work if you pass multiple molecules\"\n    \"\"\"\n    protocol = openmm_rfe.RelativeHybridTopologyProtocol(\n        settings=solv_settings,\n    )\n\n    # create DAG from protocol and take first (and only) work unit from within\n    dag = protocol.create(\n        stateA=benzene_many_solv_system,\n        stateB=toluene_many_solv_system,\n        mapping=benzene_to_toluene_mapping,\n    )\n    dag_setup_unit = _get_units(dag.protocol_units, HybridTopologySetupUnit)[0]\n\n    _ = dag_setup_unit.run(dry=True, scratch_basepath=tmp_path, shared_basepath=tmp_path)\n\n\nBENZ = \"\"\"\\\nbenzene\n  PyMOL2.5          3D                             0\n\n 12 12  0  0  0  0  0  0  0  0999 V2000\n    1.4045   -0.0000    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0\n    0.7022    1.2164    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -0.7023    1.2164    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -1.4045   -0.0000    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -0.7023   -1.2164    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0\n    0.7023   -1.2164    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0\n    2.5079   -0.0000    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0\n    1.2540    2.1720    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -1.2540    2.1720    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -2.5079   -0.0000    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -1.2540   -2.1719    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0\n    1.2540   -2.1720    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0\n  1  2  2  0  0  0  0\n  1  6  1  0  0  0  0\n  1  7  1  0  0  0  0\n  2  3  1  0  0  0  0\n  2  8  1  0  0  0  0\n  3  4  2  0  0  0  0\n  3  9  1  0  0  0  0\n  4  5  1  0  0  0  0\n  4 10  1  0  0  0  0\n  5  6  2  0  0  0  0\n  5 11  1  0  0  0  0\n  6 12  1  0  0  0  0\nM  END\n$$$$\n\"\"\"\n\n\nPYRIDINE = \"\"\"\\\npyridine\n  PyMOL2.5          3D                             0\n\n 11 11  0  0  0  0  0  0  0  0999 V2000\n    1.4045   -0.0000    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -0.7023    1.2164    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -1.4045   -0.0000    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -0.7023   -1.2164    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0\n    0.7023   -1.2164    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0\n    2.4940   -0.0325    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0\n    1.2473   -2.1604    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -1.2473   -2.1604    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -2.4945   -0.0000    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -1.2753    2.1437    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0\n    0.7525    1.3034    0.0000 N   0  0  0  0  0  0  0  0  0  0  0  0\n  1  5  1  0  0  0  0\n  1  6  1  0  0  0  0\n  1 11  2  0  0  0  0\n  2  3  2  0  0  0  0\n  2 10  1  0  0  0  0\n  3  4  1  0  0  0  0\n  3  9  1  0  0  0  0\n  4  5  2  0  0  0  0\n  4  8  1  0  0  0  0\n  5  7  1  0  0  0  0\n  2 11  1  0  0  0  0\nM  END\n$$$$\n\"\"\"\n\n\ndef test_setup_core_element_change(vac_settings, tmp_path):\n    benz = openfe.SmallMoleculeComponent(Chem.MolFromMolBlock(BENZ, removeHs=False))\n    pyr = openfe.SmallMoleculeComponent(Chem.MolFromMolBlock(PYRIDINE, removeHs=False))\n\n    mapping = openfe.LigandAtomMapping(\n        benz, pyr, {0: 0, 1: 10, 2: 1, 3: 2, 4: 3, 5: 4, 6: 5, 8: 9, 9: 8, 10: 7, 11: 6}\n    )\n\n    protocol = openmm_rfe.RelativeHybridTopologyProtocol(settings=vac_settings)\n\n    dag = protocol.create(\n        stateA=openfe.ChemicalSystem({\"ligand\": benz}),\n        stateB=openfe.ChemicalSystem({\"ligand\": pyr}),\n        mapping=mapping,\n    )\n\n    dag_setup_unit = _get_units(dag.protocol_units, HybridTopologySetupUnit)[0]\n\n    results = dag_setup_unit.run(dry=True, scratch_basepath=tmp_path, shared_basepath=tmp_path)\n    system = results[\"hybrid_system\"]\n    assert system.getNumParticles() == 12\n    # Average mass between nitrogen and carbon\n    assert system.getParticleMass(1) == 12.0127235 * omm_unit.amu\n\n    # Get out the CustomNonbondedForce\n    cnf = [f for f in system.getForces() if f.__class__.__name__ == \"CustomNonbondedForce\"][0]\n    # there should be no new unique atoms\n    assert cnf.getInteractionGroupParameters(6) == [(), ()]\n    # there should be one old unique atom (spare hydrogen from the benzene)\n    assert cnf.getInteractionGroupParameters(7) == [(7,), (7,)]\n\n\n@pytest.mark.parametrize(\"method\", [\"repex\", \"sams\", \"independent\"])\ndef test_dry_run_ligand(\n    benzene_system, toluene_system, benzene_to_toluene_mapping, method, solv_settings, tmp_path\n):\n    # this might be a bit time consuming\n    solv_settings.simulation_settings.sampler_method = method\n    solv_settings.output_settings.output_indices = \"resname UNK\"\n\n    protocol = openmm_rfe.RelativeHybridTopologyProtocol(\n        settings=solv_settings,\n    )\n    dag = protocol.create(\n        stateA=benzene_system,\n        stateB=toluene_system,\n        mapping=benzene_to_toluene_mapping,\n    )\n    dag_setup_unit = _get_units(dag.protocol_units, HybridTopologySetupUnit)[0]\n    dag_sim_unit = _get_units(dag.protocol_units, HybridTopologyMultiStateSimulationUnit)[0]\n\n    # Manually run the units\n    setup_results = dag_setup_unit.run(\n        dry=True, scratch_basepath=tmp_path, shared_basepath=tmp_path\n    )\n\n    sim_results = dag_sim_unit.run(\n        system=setup_results[\"hybrid_system\"],\n        positions=setup_results[\"hybrid_positions\"],\n        selection_indices=setup_results[\"selection_indices\"],\n        dry=True,\n        scratch_basepath=tmp_path,\n        shared_basepath=tmp_path,\n    )\n\n    sampler = sim_results[\"sampler\"]\n    assert isinstance(sampler, MultiStateSampler)\n    assert sampler.is_periodic\n    assert isinstance(sampler._thermodynamic_states[0].barostat, MonteCarloBarostat)\n    assert sampler._thermodynamic_states[1].pressure == 1 * omm_unit.bar\n\n    # Check we have the right number of atoms in the PDB\n    pdb = mdt.load_pdb(tmp_path / \"hybrid_system.pdb\")\n    assert pdb.n_atoms == 16\n\n\ndef test_confgen_mocked_fail(\n    benzene_system, toluene_system, benzene_to_toluene_mapping, solv_settings, tmp_path\n):\n    \"\"\"\n    Check that even if conformer generation fails, we can still perform a sim\n    \"\"\"\n    protocol = openmm_rfe.RelativeHybridTopologyProtocol(settings=solv_settings)\n\n    dag = protocol.create(\n        stateA=benzene_system, stateB=toluene_system, mapping=benzene_to_toluene_mapping\n    )\n    dag_unit = list(dag.protocol_units)[0]\n\n    with mock.patch(\"rdkit.Chem.AllChem.EmbedMultipleConfs\", return_value=0):\n        sampler = dag_unit.run(dry=True, scratch_basepath=tmp_path, shared_basepath=tmp_path)\n\n        assert sampler\n\n\n@pytest.fixture(scope=\"session\")\ndef tip4p_hybrid_factory(\n    benzene_system,\n    toluene_system,\n    benzene_to_toluene_mapping,\n    tmp_path_factory,\n):\n    \"\"\"\n    Hybrid system with virtual sites in the environment (waters)\n    \"\"\"\n    settings = openmm_rfe.RelativeHybridTopologyProtocol.default_settings()\n    settings.engine_settings.compute_platform = None\n    settings.forcefield_settings.forcefields = [\n        \"amber/ff14SB.xml\",  # ff14SB protein force field\n        \"amber/tip4pew_standard.xml\",  # FF we are testing with the fun VS\n        \"amber/phosaa10.xml\",  # Handles THE TPO\n    ]\n    settings.solvation_settings.solvent_padding = 1.5 * unit.nanometer\n    settings.forcefield_settings.nonbonded_cutoff = 0.9 * unit.nanometer\n    settings.solvation_settings.solvent_model = \"tip4pew\"\n    settings.integrator_settings.reassign_velocities = True\n\n    protocol = openmm_rfe.RelativeHybridTopologyProtocol(\n        settings=settings,\n    )\n    dag = protocol.create(\n        stateA=benzene_system,\n        stateB=toluene_system,\n        mapping=benzene_to_toluene_mapping,\n    )\n    dag_setup_unit = [pu for pu in dag.protocol_units if isinstance(pu, HybridTopologySetupUnit)][0]\n\n    shared_temp = tmp_path_factory.mktemp(\"tip4p_shared\")\n    scratch_temp = tmp_path_factory.mktemp(\"tip4p_scratch\")\n\n    dag_unit_setup_result = dag_setup_unit.run(\n        dry=True,\n        scratch_basepath=scratch_temp,\n        shared_basepath=shared_temp,\n    )\n\n    return dag_unit_setup_result[\"hybrid_factory\"]\n\n\ndef test_tip4p_particle_count(tip4p_hybrid_factory):\n    \"\"\"\n    Check that the total number of particles in the system\n    are as expected.\n    \"\"\"\n\n    htf = tip4p_hybrid_factory\n\n    old_particle_count = htf._old_system.getNumParticles()\n    unique_new_count = len(htf._unique_new_atoms)\n    hybrid_particle_count = htf.hybrid_system.getNumParticles()\n\n    assert old_particle_count + unique_new_count == hybrid_particle_count\n\n\ndef test_tip4p_num_waters(tip4p_hybrid_factory):\n    \"\"\"\n    Check that the number of virtual sites is equal the number of waters.\n    \"\"\"\n\n    htf = tip4p_hybrid_factory\n\n    # Test 2\n    num_waters = len([r for r in htf._old_topology.residues() if r.name == \"HOH\"])\n    virtual_sites = [\n        ix\n        for ix in range(htf.hybrid_system.getNumParticles())\n        if htf.hybrid_system.isVirtualSite(ix)\n    ]\n    assert num_waters == len(virtual_sites)\n\n\ndef test_tip4p_check_vsite_parameters(tip4p_hybrid_factory):\n    \"\"\"\n    Check that the virtual site parameters are those expected\n    as defined by the tip4p-ew parameters in openmmforcefields\n    \"\"\"\n\n    htf = tip4p_hybrid_factory\n\n    virtual_sites = [\n        ix\n        for ix in range(htf.hybrid_system.getNumParticles())\n        if htf.hybrid_system.isVirtualSite(ix)\n    ]\n\n    # get the standard and custom nonbonded forces - one of each\n    nonbond = [f for f in htf.hybrid_system.getForces() if isinstance(f, NonbondedForce)][0]\n\n    cust_nonbond = [\n        f for f in htf.hybrid_system.getForces() if isinstance(f, CustomNonbondedForce)\n    ][0]\n\n    # loop through every virtual site and check that they have the\n    # expected tip4p parameters\n    for entry in virtual_sites:\n        vs = htf.hybrid_system.getVirtualSite(entry)\n        vs_mass = htf.hybrid_system.getParticleMass(entry)\n        assert ensure_quantity(vs_mass, \"openff\").m == pytest.approx(0)\n        vs_weights = [vs.getWeight(ix) for ix in range(vs.getNumParticles())]\n        np.testing.assert_allclose(vs_weights, [0.786646558, 0.106676721, 0.106676721])\n        c, s, e = nonbond.getParticleParameters(entry)\n        assert ensure_quantity(c, \"openff\").m == pytest.approx(-1.04844)\n        assert ensure_quantity(s, \"openff\").m == 1\n        assert ensure_quantity(e, \"openff\").m == 0\n\n        s1, e1, s2, e2, i, j = cust_nonbond.getParticleParameters(entry)\n\n        assert i == j == 0\n        assert s1 == s2 == 1\n        assert e1 == e2 == 0\n\n\n@pytest.mark.slow\n@pytest.mark.parametrize(\n    \"cutoff\",\n    [\n        1.0 * unit.nanometer,\n        12.0 * unit.angstrom,\n        0.9 * unit.nanometer,\n    ],\n)\ndef test_setup_ligand_system_cutoff(\n    cutoff, benzene_system, toluene_system, benzene_to_toluene_mapping, solv_settings, tmp_path\n):\n    \"\"\"\n    Test that the right nonbonded cutoff is propagated to the hybrid system.\n    \"\"\"\n    solv_settings.solvation_settings.solvent_padding = 1.5 * unit.nanometer\n    solv_settings.forcefield_settings.nonbonded_cutoff = cutoff\n\n    protocol = openmm_rfe.RelativeHybridTopologyProtocol(\n        settings=solv_settings,\n    )\n\n    dag = protocol.create(\n        stateA=benzene_system,\n        stateB=toluene_system,\n        mapping=benzene_to_toluene_mapping,\n    )\n\n    dag_setup_unit = [pu for pu in dag.protocol_units if isinstance(pu, HybridTopologySetupUnit)][0]\n\n    hs = dag_setup_unit.run(dry=True, scratch_basepath=tmp_path, shared_basepath=tmp_path)[\n        \"hybrid_system\"\n    ]\n\n    nbfs = [\n        f\n        for f in hs.getForces()\n        if isinstance(f, CustomNonbondedForce) or isinstance(f, NonbondedForce)\n    ]\n\n    for f in nbfs:\n        f_cutoff = from_openmm(f.getCutoffDistance())\n        assert f_cutoff == cutoff\n\n\n@pytest.mark.parametrize(\n    \"method, backend, ref_key\",\n    [\n        (\"am1bcc\", \"ambertools\", \"ambertools\"),\n        pytest.param(\n            \"am1bcc\",\n            \"openeye\",\n            \"openeye\",\n            marks=pytest.mark.skipif(not HAS_OPENEYE, reason=\"needs oechem\"),\n        ),\n        pytest.param(\n            \"nagl\",\n            \"rdkit\",\n            \"nagl\",\n            marks=pytest.mark.skipif(\n                not HAS_NAGL or HAS_OPENEYE or sys.platform.startswith(\"darwin\"),\n                reason=\"needs NAGL (without oechem) and/or on macos\",\n            ),\n        ),\n        pytest.param(\n            \"espaloma\",\n            \"rdkit\",\n            \"espaloma\",\n            marks=pytest.mark.skipif(not HAS_ESPALOMA_CHARGE, reason=\"needs espaloma charge\"),\n        ),\n    ],\n)\ndef test_setup_charge_backends(\n    CN_molecule, tmp_path, method, backend, ref_key, vac_settings, am1bcc_ref_charges\n):\n    vac_settings.partial_charge_settings.partial_charge_method = method\n    vac_settings.partial_charge_settings.off_toolkit_backend = backend\n    vac_settings.partial_charge_settings.nagl_model = \"openff-gnn-am1bcc-0.1.0-rc.1.pt\"\n\n    protocol = openmm_rfe.RelativeHybridTopologyProtocol(\n        settings=vac_settings,\n    )\n\n    # make stateB molecule\n    offmolB = Molecule.from_smiles(\"CCN\")\n    offmolB.generate_conformers()\n    molB = openfe.SmallMoleculeComponent.from_openff(offmolB)\n    a_molB = align_mol_shape(molB, ref_mol=CN_molecule)\n    mapper = KartografAtomMapper(atom_map_hydrogens=True)\n    mapping = next(mapper.suggest_mappings(CN_molecule, a_molB))\n\n    systemA = openfe.ChemicalSystem({\"l\": CN_molecule})\n    systemB = openfe.ChemicalSystem({\"l\": a_molB})\n\n    dag = protocol.create(stateA=systemA, stateB=systemB, mapping=mapping)\n\n    dag_setup_unit = [pu for pu in dag.protocol_units if isinstance(pu, HybridTopologySetupUnit)][0]\n\n    results = dag_setup_unit.run(dry=True, scratch_basepath=tmp_path, shared_basepath=tmp_path)\n    htf = results[\"hybrid_factory\"]\n    hybrid_system = results[\"hybrid_system\"]\n\n    # get the standard nonbonded force\n    nonbond = [f for f in hybrid_system.getForces() if isinstance(f, NonbondedForce)]\n    assert len(nonbond) == 1\n\n    # get the particle parameter offsets\n    c_offsets = {}\n    for i in range(nonbond[0].getNumParticleParameterOffsets()):\n        offset = nonbond[0].getParticleParameterOffset(i)\n        c_offsets[offset[1]] = ensure_quantity(offset[2], \"openff\")\n\n    # See the user charges test below for an idea of what we're doing here\n    # In this particular case we are solely checking that the old atoms\n    # match the reference charges in am1bcc_ref_charges\n    for i in range(hybrid_system.getNumParticles()):\n        c, s, e = nonbond[0].getParticleParameters(i)\n        # get the particle charge (c)\n        c = ensure_quantity(c, \"openff\")\n        # particle charge (c) is equal to molA particle charge\n        # offset (c_offsets) is equal to -(molA particle charge)\n        if i in htf._atom_classes[\"unique_old_atoms\"]:\n            idx = htf._hybrid_to_old_map[i]\n            ref = am1bcc_ref_charges[ref_key][idx]\n            np.testing.assert_allclose(c, ref, rtol=1e-4)\n            np.testing.assert_allclose(c_offsets[i], -ref, rtol=1e-4)\n        # particle charge (c) is equal to molA particle charge\n        # offset (c_offsets) is equal to difference between molB and molA\n        elif i in htf._atom_classes[\"core_atoms\"]:\n            old_i = htf._hybrid_to_old_map[i]\n            ref = am1bcc_ref_charges[ref_key][i]\n            np.testing.assert_allclose(c, ref, rtol=1e-4)\n\n\ndef test_setup_same_mol_different_charges(benzene_modifications, vac_settings, tmp_path):\n    \"\"\"\n    Issue #1120 - make sure we can do an RFE of a system with different\n    parameters but the same molecule.\n    \"\"\"\n    protocol = openmm_rfe.RelativeHybridTopologyProtocol(settings=vac_settings)\n\n    benzene_offmol = benzene_modifications[\"benzene\"].to_openff()\n    # Give state A some gasteiger charges\n    benzene_offmol.assign_partial_charges(partial_charge_method=\"gasteiger\")\n    stateA_charges = copy.deepcopy(benzene_offmol.partial_charges)\n    stateA_mol = openfe.SmallMoleculeComponent.from_openff(benzene_offmol)\n\n    # Give state B gasteiger charges scaled by 0.9\n    benzene_offmol.partial_charges *= 0.9\n    stateB_charges = copy.deepcopy(benzene_offmol.partial_charges)\n    stateB_mol = openfe.SmallMoleculeComponent.from_openff(benzene_offmol)\n\n    # Create new mapping\n    mapping = gufe.LigandAtomMapping(\n        componentA=stateA_mol,\n        componentB=stateB_mol,\n        componentA_to_componentB={i: i for i in range(12)},\n    )\n\n    # create DAG from protocol and take first (and only) work unit from within\n    dag = protocol.create(\n        stateA=openfe.ChemicalSystem({\"l\": stateA_mol}),\n        stateB=openfe.ChemicalSystem({\"l\": stateB_mol}),\n        mapping=mapping,\n    )\n    dag_setup_unit = [pu for pu in dag.protocol_units if isinstance(pu, HybridTopologySetupUnit)][0]\n\n    results = dag_setup_unit.run(dry=True, scratch_basepath=tmp_path, shared_basepath=tmp_path)\n    htf = results[\"hybrid_factory\"]\n    hybrid_system = results[\"hybrid_system\"]\n\n    # get the standard nonbonded force\n    nonbond = [f for f in hybrid_system.getForces() if isinstance(f, NonbondedForce)]\n\n    # get the particle parameters & offsets\n    for i in range(hybrid_system.getNumParticles()):\n        # All particles should be core atoms\n        assert i in htf._atom_classes[\"core_atoms\"]\n\n        # offsets\n        offset = ensure_quantity(nonbond[0].getParticleParameterOffset(i)[2], \"openff\")\n\n        # parameters\n        c, s, e = nonbond[0].getParticleParameters(i)\n        c = ensure_quantity(c, \"openff\")\n\n        # check state A charge\n        assert pytest.approx(c) == stateA_charges[i]\n\n        # check state B charge\n        c_diff = stateB_charges[i] - stateA_charges[i]\n        assert pytest.approx(offset) == c_diff\n\n        # check that the offset value is non-zero\n        assert abs(offset) > 0 * offset.units\n\n\n@pytest.mark.flaky(reruns=3)  # bad minimisation can happen\ndef test_setup_user_charges(benzene_modifications, vac_settings, tmp_path):\n    \"\"\"\n    Create a hybrid system with a set of fictitious user supplied charges\n    and ensure that they are properly passed through to the constructed\n    hybrid topology.\n    \"\"\"\n    protocol = openmm_rfe.RelativeHybridTopologyProtocol(\n        settings=vac_settings,\n    )\n\n    def assign_fictitious_charges(offmol):\n        \"\"\"\n        Get a random array of fake partial charges (ints because why not)\n        that sums up to 0. Note that OpenFF will complain if you try to\n        create a molecule that has a total charge that is different from\n        the expected formal charge, hence we enforce a zero charge here.\n        \"\"\"\n        rand_arr = np.random.randint(1, 10, size=offmol.n_atoms) / 100\n        rand_arr[-1] = -sum(rand_arr[:-1])\n        return rand_arr * unit.elementary_charge\n\n    def check_propchgs(smc, charge_array):\n        \"\"\"\n        Check that the partial charges we assigned to our offmol from which\n        the smc was constructed are present and the right ones.\n        \"\"\"\n        prop_chgs = smc.to_dict()[\"molprops\"][\"atom.dprop.PartialCharge\"]\n        prop_chgs = np.array(prop_chgs.split(), dtype=float)\n        np.testing.assert_allclose(prop_chgs, charge_array.m)\n\n    # Create new smc with overridden charges\n    benzene_offmol = benzene_modifications[\"benzene\"].to_openff()\n    toluene_offmol = benzene_modifications[\"toluene\"].to_openff()\n    benzene_rand_chg = assign_fictitious_charges(benzene_offmol)\n    toluene_rand_chg = assign_fictitious_charges(toluene_offmol)\n    benzene_offmol.partial_charges = benzene_rand_chg\n    toluene_offmol.partial_charges = toluene_rand_chg\n    benzene_smc = openfe.SmallMoleculeComponent.from_openff(benzene_offmol)\n    toluene_smc = openfe.SmallMoleculeComponent.from_openff(toluene_offmol)\n\n    # Check that the new smcs have the new overridden charges\n    check_propchgs(benzene_smc, benzene_rand_chg)\n    check_propchgs(toluene_smc, toluene_rand_chg)\n\n    # Create new mapping\n    mapper = openfe.setup.LomapAtomMapper(element_change=False)\n    mapping = next(mapper.suggest_mappings(benzene_smc, toluene_smc))\n\n    # create DAG from protocol and take first (and only) work unit from within\n    dag = protocol.create(\n        stateA=openfe.ChemicalSystem({\"l\": benzene_smc}),\n        stateB=openfe.ChemicalSystem({\"l\": toluene_smc}),\n        mapping=mapping,\n    )\n    dag_setup_unit = [pu for pu in dag.protocol_units if isinstance(pu, HybridTopologySetupUnit)][0]\n\n    results = dag_setup_unit.run(dry=True, scratch_basepath=tmp_path, shared_basepath=tmp_path)\n    htf = results[\"hybrid_factory\"]\n    hybrid_system = results[\"hybrid_system\"]\n\n    # get the standard nonbonded force\n    nonbond = [f for f in hybrid_system.getForces() if isinstance(f, NonbondedForce)]\n    assert len(nonbond) == 1\n\n    # get the particle parameter offsets\n    c_offsets = {}\n    for i in range(nonbond[0].getNumParticleParameterOffsets()):\n        offset = nonbond[0].getParticleParameterOffset(i)\n        c_offsets[offset[1]] = ensure_quantity(offset[2], \"openff\")\n\n    # Here is a bit of exposition on what we're doing\n    # HTF creates two sets of nonbonded forces, a standard one (for the\n    # PME) and a custom one (for sterics).\n    # Here we specifically check charges, so we only concentrate on the\n    # standard NonbondedForce.\n    # The way the NonbondedForce is constructed is as follows:\n    # - unique old atoms:\n    #  * The particle charge is set to the input molA particle charge\n    #  * The chargeScale offset is set to the negative value of the molA\n    #    particle charge (such that by scaling you effectively zero out\n    #    the charge.\n    # - unique new atoms:\n    #  * The particle charge is set to zero (doesn't exist in the starting\n    #    end state).\n    #  * The chargeScale offset is set to the value of the molB particle\n    #    charge (such that by scaling you effectively go from 0 to molB\n    #    charge).\n    # - core atoms:\n    #  * The particle charge is set to the input molA particle charge\n    #    (i.e. we start from a system that has molA charges).\n    #  * The particle charge offset is set to the difference between\n    #    the molB particle charge and the molA particle charge (i.e.\n    #    we scale by that difference to get to the value of the molB\n    #    particle charge).\n    for i in range(hybrid_system.getNumParticles()):\n        c, s, e = nonbond[0].getParticleParameters(i)\n        # get the particle charge (c)\n        c = ensure_quantity(c, \"openff\")\n        # particle charge (c) is equal to molA particle charge\n        # offset (c_offsets) is equal to -(molA particle charge)\n        if i in htf._atom_classes[\"unique_old_atoms\"]:\n            idx = htf._hybrid_to_old_map[i]\n            np.testing.assert_allclose(c, benzene_rand_chg[idx])\n            np.testing.assert_allclose(c_offsets[i], -benzene_rand_chg[idx])\n        # particle charge (c) is equal to 0\n        # offset (c_offsets) is equal to molB particle charge\n        elif i in htf._atom_classes[\"unique_new_atoms\"]:\n            idx = htf._hybrid_to_new_map[i]\n            np.testing.assert_allclose(c, 0 * unit.elementary_charge)\n            np.testing.assert_allclose(c_offsets[i], toluene_rand_chg[idx])\n        # particle charge (c) is equal to molA particle charge\n        # offset (c_offsets) is equal to difference between molB and molA\n        elif i in htf._atom_classes[\"core_atoms\"]:\n            old_i = htf._hybrid_to_old_map[i]\n            new_i = htf._hybrid_to_new_map[i]\n            c_exp = toluene_rand_chg[new_i] - benzene_rand_chg[old_i]\n            np.testing.assert_allclose(c, benzene_rand_chg[old_i])\n            np.testing.assert_allclose(c_offsets[i], c_exp)\n\n\ndef test_virtual_sites_no_reassign(\n    benzene_system, toluene_system, benzene_to_toluene_mapping, solv_settings, tmp_path\n):\n    \"\"\"\n    Because of some as-of-yet not fully identified issue, not reassigning\n    velocities will cause systems to NaN.\n    See https://github.com/choderalab/openmmtools/issues/695\n    \"\"\"\n    solv_settings.forcefield_settings.forcefields = [\n        \"amber/ff14SB.xml\",  # ff14SB protein force field\n        \"amber/tip4pew_standard.xml\",  # FF we are testing with the fun VS\n        \"amber/phosaa10.xml\",  # Handles THE TPO\n    ]\n    solv_settings.solvation_settings.solvent_padding = 1.0 * unit.nanometer\n    solv_settings.forcefield_settings.nonbonded_cutoff = 0.9 * unit.nanometer\n    solv_settings.solvation_settings.solvent_model = \"tip4pew\"\n    solv_settings.integrator_settings.reassign_velocities = False\n\n    protocol = openmm_rfe.RelativeHybridTopologyProtocol(\n        settings=solv_settings,\n    )\n    dag = protocol.create(\n        stateA=benzene_system,\n        stateB=toluene_system,\n        mapping=benzene_to_toluene_mapping,\n    )\n    dag_setup_unit = _get_units(dag.protocol_units, HybridTopologySetupUnit)[0]\n    dag_sim_unit = _get_units(dag.protocol_units, HybridTopologyMultiStateSimulationUnit)[0]\n\n    # Manually run the units\n    setup_results = dag_setup_unit.run(\n        dry=True, scratch_basepath=tmp_path, shared_basepath=tmp_path\n    )\n    errmsg = \"Simulations with virtual sites without velocity\"\n    with pytest.raises(ValueError, match=errmsg):\n        _ = dag_sim_unit.run(\n            system=setup_results[\"hybrid_system\"],\n            positions=setup_results[\"hybrid_positions\"],\n            selection_indices=setup_results[\"selection_indices\"],\n            dry=True,\n            scratch_basepath=tmp_path,\n            shared_basepath=tmp_path,\n        )\n\n\ndef test_setup_dodecahdron_ligand_box(\n    benzene_system, toluene_system, benzene_to_toluene_mapping, solv_settings, tmp_path\n):\n    \"\"\"\n    Test that a hybrid system with a dodechadron is built properly.\n    \"\"\"\n    solv_settings.solvation_settings.solvent_padding = 1.5 * unit.nanometer\n    solv_settings.solvation_settings.box_shape = \"dodecahedron\"\n    protocol = openmm_rfe.RelativeHybridTopologyProtocol(settings=solv_settings)\n\n    dag = protocol.create(\n        stateA=benzene_system,\n        stateB=toluene_system,\n        mapping=benzene_to_toluene_mapping,\n    )\n    dag_setup_unit = _get_units(dag.protocol_units, HybridTopologySetupUnit)[0]\n\n    hs = dag_setup_unit.run(dry=True, scratch_basepath=tmp_path, shared_basepath=tmp_path)[\n        \"hybrid_system\"\n    ]\n\n    vectors = hs.getDefaultPeriodicBoxVectors()\n\n    width = float(from_openmm(vectors)[0][0].to(\"nanometer\").m)\n    # dodecahedron has the following shape:\n    # [width, 0, 0], [0, width, 0], [0.5, 0.5, 0.5 * sqrt(2)] * width\n\n    expected_vectors = [\n        [width, 0, 0],\n        [0, width, 0],\n        [0.5 * width, 0.5 * width, 0.5 * sqrt(2) * width],\n    ] * unit.nanometer\n    assert_allclose(expected_vectors, from_openmm(vectors))\n\n\n@pytest.mark.slow\n@pytest.mark.parametrize(\"method\", [\"repex\", \"sams\", \"independent\"])\ndef test_dry_run_complex(\n    benzene_complex_system,\n    toluene_complex_system,\n    benzene_to_toluene_mapping,\n    method,\n    solv_settings,\n    tmp_path,\n):\n    # this will be very time consuming\n    solv_settings.simulation_settings.sampler_method = method\n    solv_settings.output_settings.output_indices = \"protein or resname  UNK\"\n\n    protocol = openmm_rfe.RelativeHybridTopologyProtocol(\n        settings=solv_settings,\n    )\n    dag = protocol.create(\n        stateA=benzene_complex_system,\n        stateB=toluene_complex_system,\n        mapping=benzene_to_toluene_mapping,\n    )\n    dag_setup_unit = _get_units(dag.protocol_units, HybridTopologySetupUnit)[0]\n    dag_sim_unit = _get_units(dag.protocol_units, HybridTopologyMultiStateSimulationUnit)[0]\n\n    setup_results = dag_setup_unit.run(\n        dry=True, scratch_basepath=tmp_path, shared_basepath=tmp_path\n    )\n    sim_results = dag_sim_unit.run(\n        system=setup_results[\"hybrid_system\"],\n        positions=setup_results[\"hybrid_positions\"],\n        selection_indices=setup_results[\"selection_indices\"],\n        dry=True,\n        scratch_basepath=tmp_path,\n        shared_basepath=tmp_path,\n    )\n    sampler = sim_results[\"sampler\"]\n    assert isinstance(sampler, MultiStateSampler)\n    assert sampler.is_periodic\n    assert isinstance(sampler._thermodynamic_states[0].barostat, MonteCarloBarostat)\n    assert sampler._thermodynamic_states[1].pressure == 1 * omm_unit.bar\n\n    # Check we have the right number of atoms in the PDB\n    pdb = mdt.load_pdb(tmp_path / \"hybrid_system.pdb\")\n    assert pdb.n_atoms == 2629\n\n\n@pytest.mark.slow\ndef test_dry_run_membrane_complex(\n    a2a_protein_membrane_component,\n    a2a_ligands,\n    tmpdir,\n):\n    # TODO check if we can remove the slow mark once the HTF speed up is merged\n    ligA = next(c for c in a2a_ligands if c.name == \"4g\")\n    ligB = next(c for c in a2a_ligands if c.name == \"4h\")\n\n    mapping = openfe.LigandAtomMapping(\n        componentA=ligA,\n        componentB=ligB,\n        componentA_to_componentB={i: i for i in range(36)},\n    )\n\n    settings = openmm_rfe.RelativeHybridTopologyProtocol.default_settings()\n    settings.protocol_repeats = 1\n    settings.engine_settings.compute_platform = \"cpu\"\n    settings.output_settings.output_indices = \"all\"\n\n    systemA = openfe.ChemicalSystem(\n        {\"ligand\": mapping.componentA, \"protein\": a2a_protein_membrane_component},\n        name=f\"{mapping.componentA.name}_{a2a_protein_membrane_component.name}\",\n    )\n    systemB = openfe.ChemicalSystem(\n        {\"ligand\": mapping.componentB, \"protein\": a2a_protein_membrane_component},\n        name=f\"{mapping.componentB.name}_{a2a_protein_membrane_component.name}\",\n    )\n\n    adaptive_settings = openmm_rfe.RelativeHybridTopologyProtocol._adaptive_settings(\n        stateA=systemA, stateB=systemB, mapping=mapping, initial_settings=settings\n    )\n    protocol = openmm_rfe.RelativeHybridTopologyProtocol(\n        settings=adaptive_settings,\n    )\n    dag = protocol.create(\n        stateA=systemA,\n        stateB=systemB,\n        mapping=mapping,\n    )\n    dag_setup_unit = _get_units(dag.protocol_units, HybridTopologySetupUnit)[0]\n    dag_sim_unit = _get_units(dag.protocol_units, HybridTopologyMultiStateSimulationUnit)[0]\n\n    with tmpdir.as_cwd():\n        setup_results = dag_setup_unit.run(dry=True)\n        input_box = a2a_protein_membrane_component.box_vectors\n        system_box = from_openmm(setup_results[\"hybrid_system\"].getDefaultPeriodicBoxVectors())\n        assert_allclose(system_box, input_box, atol=1e-5)\n        sim_results = dag_sim_unit.run(\n            system=setup_results[\"hybrid_system\"],\n            positions=setup_results[\"hybrid_positions\"],\n            selection_indices=setup_results[\"selection_indices\"],\n            dry=True,\n        )\n        sampler = sim_results[\"sampler\"]\n\n        assert isinstance(sampler, MultiStateSampler)\n        assert sampler.is_periodic\n        assert isinstance(sampler._thermodynamic_states[0].barostat, MonteCarloMembraneBarostat)\n        assert sampler._thermodynamic_states[1].pressure == 1 * omm_unit.bar\n\n        # Check we have the right number of atoms in the PDB\n        pdb = mdt.load_pdb(\"hybrid_system.pdb\")\n        # 39391 protein + membrane + water atoms\n        # 36 ligand atoms\n        assert pdb.n_atoms == 39427\n        box = sampler._thermodynamic_states[0].system.getDefaultPeriodicBoxVectors()\n        vectors = from_openmm(box)  # convert to a Quantity array\n\n        # Extract box lengths in nanometers\n        width_x, width_y, width_z = [v[i].to(\"nanometer\").m for i, v in enumerate(vectors)]\n\n        # Expected orthogonal box (axis-aligned)\n        expected_vectors = (\n            np.array(\n                [\n                    [width_x, 0, 0],\n                    [0, width_y, 0],\n                    [0, 0, width_z],\n                ]\n            )\n            * unit.nanometer\n        )\n\n        assert_allclose(\n            vectors, expected_vectors, atol=1e-5, err_msg=f\"Box is not orthogonal:\\n{vectors}\"\n        )\n\n\ndef test_lambda_schedule_default():\n    lambdas = openmm_rfe._rfe_utils.lambdaprotocol.LambdaProtocol(functions=\"default\")\n    assert len(lambdas.lambda_schedule) == 10\n\n\n@pytest.mark.parametrize(\"windows\", [11, 6, 9000])\ndef test_lambda_schedule(windows):\n    lambdas = openmm_rfe._rfe_utils.lambdaprotocol.LambdaProtocol(\n        functions=\"default\", windows=windows\n    )\n    assert len(lambdas.lambda_schedule) == windows\n\n\ndef test_setup_ligand_overlap_warning(\n    benzene_vacuum_system, toluene_vacuum_system, benzene_to_toluene_mapping, vac_settings, tmp_path\n):\n    protocol = openmm_rfe.RelativeHybridTopologyProtocol(\n        settings=vac_settings,\n    )\n\n    # update atom positions\n    sysA = benzene_vacuum_system\n    rdmol = benzene_vacuum_system[\"ligand\"].to_rdkit()\n    conf = rdmol.GetConformer()\n\n    for atm in range(rdmol.GetNumAtoms()):\n        x, y, z = conf.GetAtomPosition(atm)\n        conf.SetAtomPosition(atm, Point3D(x + 3, y, z))\n\n    new_ligand = openfe.SmallMoleculeComponent.from_rdkit(\n        rdmol, name=benzene_vacuum_system[\"ligand\"].name\n    )\n    components = dict(benzene_vacuum_system.components)\n    components[\"ligand\"] = new_ligand\n    sysA = openfe.ChemicalSystem(components)\n\n    mapping = benzene_to_toluene_mapping.copy_with_replacements(componentA=new_ligand)\n\n    # Specifically check that the first pair throws a warning\n    with pytest.warns(UserWarning, match=\"0 : 4 deviates\"):\n        dag = protocol.create(\n            stateA=sysA,\n            stateB=toluene_vacuum_system,\n            mapping=mapping,\n        )\n        dag_setup_unit = [\n            pu for pu in dag.protocol_units if isinstance(pu, HybridTopologySetupUnit)\n        ][0]\n\n        dag_setup_unit.run(dry=True, scratch_basepath=tmp_path, shared_basepath=tmp_path)\n\n\n@pytest.fixture\ndef solvent_protocol_dag(benzene_system, toluene_system, benzene_to_toluene_mapping):\n    settings = openmm_rfe.RelativeHybridTopologyProtocol.default_settings()\n    protocol = openmm_rfe.RelativeHybridTopologyProtocol(\n        settings=settings,\n    )\n    return protocol.create(\n        stateA=benzene_system,\n        stateB=toluene_system,\n        mapping=benzene_to_toluene_mapping,\n    )\n\n\n@pytest.fixture()\ndef unit_mock_patcher():\n    with (\n        mock.patch(\n            \"openfe.protocols.openmm_rfe.hybridtop_units.HybridTopologySetupUnit.run\",\n            return_value={\n                \"system\": Path(\"system.xml.bz2\"),\n                \"positions\": Path(\"positions.npy\"),\n                \"pdb_structure\": Path(\"hybrid_system.pdb\"),\n                \"selection_indices\": np.zeros(100),\n                \"gufe_version\": gufe.__version__,\n                \"openfe_version\": openfe.__version__,\n                \"openmm_version\": openmm.__version__,\n            },\n        ),\n        mock.patch(\n            \"openfe.protocols.openmm_rfe.hybridtop_units.np.load\",\n            return_value=np.zeros(100),\n        ),\n        mock.patch(\n            \"openfe.protocols.openmm_rfe.hybridtop_units.deserialize\",\n            return_value={\n                \"item\": \"foo\",\n            },\n        ),\n        mock.patch(\n            \"openfe.protocols.openmm_rfe.hybridtop_units.HybridTopologyMultiStateSimulationUnit.run\",\n            return_value={\n                \"nc\": Path(\"file.nc\"),\n                \"checkpoint\": Path(\"chk.chk\"),\n            },\n        ),\n        mock.patch(\n            \"openfe.protocols.openmm_rfe.hybridtop_units.HybridTopologyMultiStateAnalysisUnit.run\",\n            return_value={\n                \"foo\": \"bar\",\n            },\n        ),\n    ):\n        yield\n\n\ndef test_unit_tagging(solvent_protocol_dag, unit_mock_patcher, tmp_path):\n    # test that executing the Units includes correct generation and repeat info\n    dag_units = solvent_protocol_dag.protocol_units\n\n    setup_results = {}\n    sim_results = {}\n    analysis_results = {}\n\n    setup_units = _get_units(dag_units, HybridTopologySetupUnit)\n    sim_units = _get_units(dag_units, HybridTopologyMultiStateSimulationUnit)\n    analysis_units = _get_units(dag_units, HybridTopologyMultiStateAnalysisUnit)\n\n    for u in setup_units:\n        rid = u.inputs[\"repeat_id\"]\n        setup_results[rid] = u.execute(context=gufe.Context(tmp_path, tmp_path))\n\n    for u in sim_units:\n        rid = u.inputs[\"repeat_id\"]\n        sim_results[rid] = u.execute(\n            context=gufe.Context(tmp_path, tmp_path), setup_results=setup_results[rid]\n        )\n\n    for u in analysis_units:\n        rid = u.inputs[\"repeat_id\"]\n        analysis_results[rid] = u.execute(\n            context=gufe.Context(tmp_path, tmp_path),\n            setup_results=setup_results[rid],\n            simulation_results=sim_results[rid],\n        )\n\n    for results in [setup_results, sim_results, analysis_results]:\n        for ret in results.values():\n            assert isinstance(ret, gufe.ProtocolUnitResult)\n            assert ret.outputs[\"generation\"] == 0\n\n    # repeats are random ints, so check we got 3 individual numbers\n    assert len(setup_results) == len(sim_results) == len(analysis_results) == 3\n\n\ndef test_gather(solvent_protocol_dag, unit_mock_patcher, tmp_path):\n    # check .gather behaves as expected\n    dagres = gufe.protocols.execute_DAG(\n        solvent_protocol_dag,\n        shared_basedir=tmp_path,\n        scratch_basedir=tmp_path,\n        keep_shared=True,\n    )\n\n    prot = openmm_rfe.RelativeHybridTopologyProtocol(\n        settings=openmm_rfe.RelativeHybridTopologyProtocol.default_settings()\n    )\n\n    res = prot.gather([dagres])\n\n    assert isinstance(res, openmm_rfe.RelativeHybridTopologyProtocolResult)\n\n\nclass TestConstraintRemoval:\n    @staticmethod\n    def make_systems(\n        ligA: openfe.SmallMoleculeComponent,\n        ligB: openfe.SmallMoleculeComponent,\n        constraints,\n    ):\n        \"\"\"Make vacuum system for each, return Topology and System for each\"\"\"\n        omm_forcefield_A = app.ForceField(\"tip3p.xml\")\n        smirnoff_A = SMIRNOFFTemplateGenerator(\n            forcefield=\"openff-2.0.0.offxml\",\n            molecules=[ligA.to_openff()],\n        )\n        omm_forcefield_A.registerTemplateGenerator(smirnoff_A.generator)\n\n        omm_forcefield_B = app.ForceField(\"tip3p.xml\")\n        smirnoff_B = SMIRNOFFTemplateGenerator(\n            forcefield=\"openff-2.0.0.offxml\",\n            molecules=[ligB.to_openff()],\n        )\n        omm_forcefield_B.registerTemplateGenerator(smirnoff_B.generator)\n\n        stateA_modeller = app.Modeller(\n            ligA.to_openff().to_topology().to_openmm(),\n            ensure_quantity(ligA.to_openff().conformers[0], \"openmm\"),\n        )\n        stateA_topology = stateA_modeller.getTopology()\n        stateA_system = omm_forcefield_A.createSystem(\n            stateA_topology,\n            nonbondedMethod=app.CutoffNonPeriodic,\n            nonbondedCutoff=ensure_quantity(1.1 * unit.nm, \"openmm\"),\n            constraints=constraints,\n            rigidWater=True,\n            hydrogenMass=None,\n            removeCMMotion=True,\n        )\n\n        stateB_topology, _ = openmm_rfe._rfe_utils.topologyhelpers.combined_topology(\n            stateA_topology,\n            ligB.to_openff().to_topology().to_openmm(),\n            exclude_resids=np.array([r.index for r in list(stateA_topology.residues())]),\n        )\n        # since we're doing a swap of the only molecule, this is equivalent:\n        # stateB_topology = app.Modeller(\n        #    sysB['ligand'].to_openff().to_topology().to_openmm(),\n        #    ensure_quantity(sysB['ligand'].to_openff().conformers[0], 'openmm')\n        # )\n\n        stateB_system = omm_forcefield_B.createSystem(\n            stateB_topology,\n            nonbondedMethod=app.CutoffNonPeriodic,\n            nonbondedCutoff=ensure_quantity(1.1 * unit.nm, \"openmm\"),\n            constraints=constraints,\n            rigidWater=True,\n            hydrogenMass=None,\n            removeCMMotion=True,\n        )\n\n        return stateA_topology, stateA_system, stateB_topology, stateB_system\n\n    @pytest.mark.parametrize(\"reverse\", [False, True])\n    def test_remove_constraints_lengthchange(self, benzene_modifications, reverse):\n        # check that mappings are correctly corrected to avoid changes in\n        # constraint length\n        # use a phenol->toluene transform to test\n        ligA = benzene_modifications[\"phenol\"]\n        ligB = benzene_modifications[\"toluene\"]\n\n        mapping = {\n            0: 4, 1: 5, 2: 6, 3: 7, 4: 8, 5: 9, 6: 10,\n            7: 11, 8: 12, 9: 13, 10: 1, 11: 14, 12: 2,\n        }  # fmt: skip\n\n        expected = 10  # this should get removed from mapping\n\n        if reverse:\n            ligA, ligB = ligB, ligA\n            expected = mapping[expected]\n            mapping = {v: k for k, v in mapping.items()}\n\n        mapping = setup.LigandAtomMapping(\n            componentA=ligA,\n            componentB=ligB,\n            # this is default lomap\n            # importantly the H in -OH maps to one of the -CH3\n            # this constraint will change length\n            componentA_to_componentB=mapping,\n        )\n\n        stateA_topology, stateA_system, stateB_topology, stateB_system = self.make_systems(\n            ligA, ligB, constraints=app.HBonds\n        )\n\n        # this normally requires global indices, however as ligandA/B is only thing\n        # in system, this mapping is still correct\n        ret = openmm_rfe._rfe_utils.topologyhelpers._remove_constraints(\n            mapping.componentA_to_componentB,\n            stateA_system,\n            stateA_topology,\n            stateB_system,\n            stateB_topology,\n        )\n\n        # all of this just to check that an entry was removed from the mapping\n        # the removed constraint\n        assert expected not in ret\n        # but only one constraint should be removed\n        assert len(ret) == len(mapping.componentA_to_componentB) - 1\n\n    @pytest.mark.parametrize(\"reverse\", [False, True])\n    def test_constraint_to_harmonic(self, benzene_modifications, reverse):\n        ligA = benzene_modifications[\"benzene\"]\n        ligB = benzene_modifications[\"toluene\"]\n        expected = 10\n        mapping = {\n            0: 4, 1: 5, 2: 6, 3: 7, 4: 8, 5: 9,\n            6: 10, 7: 11, 8: 12, 9: 13, 10: 2, 11: 14\n        }  # fmt: skip\n        if reverse:\n            ligA, ligB = ligB, ligA\n            expected = mapping[expected]\n            mapping = {v: k for k, v in mapping.items()}\n\n        # this maps a -H to a -C, so the constraint on -H turns into a C-C bond\n        # H constraint is A(4, 10) and C-C is B(8, 2)\n        mapping = setup.LigandAtomMapping(\n            componentA=ligA, componentB=ligB, componentA_to_componentB=mapping\n        )\n\n        stateA_topology, stateA_system, stateB_topology, stateB_system = self.make_systems(\n            ligA, ligB, constraints=app.HBonds\n        )\n\n        ret = openmm_rfe._rfe_utils.topologyhelpers._remove_constraints(\n            mapping.componentA_to_componentB,\n            stateA_system,\n            stateA_topology,\n            stateB_system,\n            stateB_topology,\n        )\n\n        assert expected not in ret\n        assert len(ret) == len(mapping.componentA_to_componentB) - 1\n\n    @pytest.mark.parametrize(\"reverse\", [False, True])\n    def test_constraint_to_harmonic_nitrile(self, benzene_modifications, reverse):\n        # same as previous test, but ligands are swapped\n        # this follows a slightly different code path\n        ligA = benzene_modifications[\"toluene\"]\n        ligB = benzene_modifications[\"benzonitrile\"]\n\n        if reverse:\n            ligA, ligB = ligB, ligA\n\n        mapping = {\n            0: 0, 2: 1, 4: 2, 5: 3, 6: 4, 7: 5, 8: 6, 9: 7, 10: 8,\n            11: 9, 12: 10, 13: 11, 14: 12,\n        }  # fmt: skip\n        if reverse:\n            mapping = {v: k for k, v in mapping.items()}\n        mapping = setup.LigandAtomMapping(\n            componentA=ligA,\n            componentB=ligB,\n            componentA_to_componentB=mapping,\n        )\n\n        stateA_topology, stateA_system, stateB_topology, stateB_system = self.make_systems(\n            ligA, ligB, constraints=app.HBonds\n        )\n\n        ret = openmm_rfe._rfe_utils.topologyhelpers._remove_constraints(\n            mapping.componentA_to_componentB,\n            stateA_system,\n            stateA_topology,\n            stateB_system,\n            stateB_topology,\n        )\n\n        assert 0 not in ret\n        assert len(ret) == len(mapping.componentA_to_componentB) - 1\n\n    @pytest.mark.parametrize(\"reverse\", [False, True])\n    def test_non_H_constraint_fail(self, benzene_modifications, reverse):\n        # here we specify app.AllBonds constraints\n        # in this transform, the C-C[#N] to C-C[=O] constraint changes length\n        # indices A(8, 2) to B(6, 1)\n        # there's no Hydrogen involved so we can't trivially figure out the\n        # best atom to remove from mapping\n        # (but it would be 2 [& 1] in this case..)\n        ligA = benzene_modifications[\"toluene\"]\n        ligB = benzene_modifications[\"benzonitrile\"]\n\n        mapping = {\n            0: 0, 2: 1, 4: 2, 5: 3, 6: 4, 7: 5, 8: 6, 9: 7, 10: 8,\n            11: 9, 12: 10, 13: 11, 14: 12,\n        }  # fmt: skip\n\n        if reverse:\n            ligA, ligB = ligB, ligA\n            mapping = {v: k for k, v in mapping.items()}\n\n        mapping = setup.LigandAtomMapping(\n            componentA=ligA,\n            componentB=ligB,\n            componentA_to_componentB=mapping,\n        )\n\n        stateA_topology, stateA_system, stateB_topology, stateB_system = self.make_systems(\n            ligA, ligB, constraints=app.AllBonds\n        )\n\n        with pytest.raises(ValueError, match=\"resolve constraint\") as e:\n            _ = openmm_rfe._rfe_utils.topologyhelpers._remove_constraints(\n                mapping.componentA_to_componentB,\n                stateA_system,\n                stateA_topology,\n                stateB_system,\n                stateB_topology,\n            )\n        if not reverse:\n            assert \"A: 2-8 B: 1-6\" in str(e)\n        else:\n            assert \"A: 1-6 B: 2-8\" in str(e)\n\n    def test_double_constraint_fail(self):\n        # make sure catch cases where a H is involved with two different unique constraints in the end states\n        # see <https://github.com/OpenFreeEnergy/openfe/issues/1093>\n        with resources.as_file(resources.files(\"openfe.tests.data.openmm_rfe\")) as d:\n            fn1 = str(d / \"malt1_shapefit_Pfizer-01-01.sdf\")\n            fn2 = str(d / \"malt1_shapefit_1832577-09-9.sdf\")\n\n        lig1 = openfe.SmallMoleculeComponent.from_sdf_file(fn1)\n        lig2 = openfe.SmallMoleculeComponent.from_sdf_file(fn2)\n\n        # mapping taken from issue\n        mapping = setup.LigandAtomMapping(\n            componentA=lig1,\n            componentB=lig2,\n            componentA_to_componentB={\n                26: 28, 27: 30, 28: 29, 29: 31, 30: 27, 31: 32, 32: 38, 34: 13, 39: 40, 40: 41, 0: 0, 1: 2, 2: 1, 3: 3,\n                4: 6, 5: 4, 6: 5, 7: 7, 8: 8, 9: 9, 10: 10, 11: 11, 12: 23, 14: 14, 15: 15, 16: 16, 17: 17, 18: 18, 19: 19, 20: 20, 21: 21, 22: 22,\n            }\n        )  # fmt: skip\n\n        stateA_topology, stateA_system, stateB_topology, stateB_system = self.make_systems(\n            lig1, lig2, constraints=app.HBonds\n        )\n\n        with pytest.raises(ValueError, match=\"Atom 34 was involved in 2 unique constraints\"):\n            _ = openmm_rfe._rfe_utils.topologyhelpers._remove_constraints(\n                mapping.componentA_to_componentB,\n                stateA_system,\n                stateA_topology,\n                stateB_system,\n                stateB_topology,\n            )\n\n\n@pytest.fixture(scope=\"session\")\ndef tyk2_xml(tmp_path_factory):\n    with resources.as_file(resources.files(\"openfe.tests.data.openmm_rfe\")) as d:\n        fn1 = str(d / \"ligand_23.sdf\")\n        fn2 = str(d / \"ligand_55.sdf\")\n    lig23 = openfe.SmallMoleculeComponent.from_sdf_file(fn1)\n    lig55 = openfe.SmallMoleculeComponent.from_sdf_file(fn2)\n\n    mapping = setup.LigandAtomMapping(\n        componentA=lig23,\n        componentB=lig55,\n        # perses mapper output\n        componentA_to_componentB={\n            0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6,\n            7: 7, 8: 8, 9: 9, 10: 10, 11: 11, 12: 12,\n            13: 13, 14: 14, 15: 15, 16: 16, 17: 17,\n            18: 18, 23: 19, 26: 20, 27: 21, 28: 22,\n            29: 23, 30: 24, 31: 25, 32: 26, 33: 27,\n        }\n    )  # fmt: skip\n\n    vac_settings = openmm_rfe.RelativeHybridTopologyProtocol.default_settings()\n    vac_settings.forcefield_settings.nonbonded_method = \"nocutoff\"\n    vac_settings.engine_settings.compute_platform = None\n    vac_settings.forcefield_settings.small_molecule_forcefield = \"openff-2.0.0\"\n    vac_settings.forcefield_settings.hydrogen_mass = 3.0\n    vac_settings.protocol_repeats = 1\n\n    protocol = openmm_rfe.RelativeHybridTopologyProtocol(vac_settings)\n\n    dag = protocol.create(\n        stateA=openfe.ChemicalSystem({\"ligand\": lig23}),\n        stateB=openfe.ChemicalSystem({\"ligand\": lig55}),\n        mapping=mapping,\n    )\n    dag_setup_unit = _get_units(dag.protocol_units, HybridTopologySetupUnit)[0]\n\n    tmp = tmp_path_factory.mktemp(\"xml_reg\")\n\n    setup_results = dag_setup_unit.run(dry=True, shared_basepath=tmp)\n\n    system = setup_results[\"hybrid_system\"]\n\n    return ET.fromstring(XmlSerializer.serialize(system))\n\n\n@pytest.fixture(scope=\"session\")\ndef tyk2_reference_xml():\n    with resources.as_file(resources.files(\"openfe.tests.data.openmm_rfe\")) as d:\n        f = d / \"reference.xml\"\n        with open(f, \"r\") as i:\n            xmldata = i.read()\n    return ET.fromstring(xmldata)\n\n\n@pytest.mark.slow\nclass TestTyk2XmlRegression:\n    \"\"\"Generates Hybrid system XML and performs regression test\"\"\"\n\n    @staticmethod\n    def test_particles(tyk2_xml, tyk2_reference_xml):\n        # < Particle mass = \"10.018727\" / >\n        particles = tyk2_xml.find(\"Particles\")\n        assert particles\n\n        ref_particles = tyk2_reference_xml.find(\"Particles\")\n\n        for a, b in zip(particles, ref_particles):\n            assert float(a.get(\"mass\")) == pytest.approx(float(b.get(\"mass\")))\n\n    @staticmethod\n    def test_constraints(tyk2_xml, tyk2_reference_xml):\n        # <Constraint d=\".1085358495916\" p1=\"12\" p2=\"31\"/>\n        constraints = tyk2_xml.find(\"Constraints\")\n        assert constraints\n\n        ref_constraints = tyk2_reference_xml.find(\"Constraints\")\n        for a, b in zip(constraints, ref_constraints):\n            assert a.get(\"p1\") == b.get(\"p1\")\n            assert a.get(\"p2\") == b.get(\"p2\")\n            assert float(a.get(\"d\")) == pytest.approx(float(b.get(\"d\")))\n\n\nclass TestProtocolResult:\n    @pytest.fixture()\n    def protocolresult(self, rfe_transformation_json):\n        d = json.loads(rfe_transformation_json, cls=gufe.tokenization.JSON_HANDLER.decoder)\n\n        pr = openfe.ProtocolResult.from_dict(d[\"protocol_result\"])\n\n        return pr\n\n    def test_reload_protocol_result(self, rfe_transformation_json):\n        d = json.loads(rfe_transformation_json, cls=gufe.tokenization.JSON_HANDLER.decoder)\n\n        pr = openmm_rfe.RelativeHybridTopologyProtocolResult.from_dict(d[\"protocol_result\"])\n\n        assert pr\n\n    def test_get_estimate(self, protocolresult):\n        est = protocolresult.get_estimate()\n\n        assert est\n        assert est.m == pytest.approx(16.85, abs=0.3)\n        assert isinstance(est, unit.Quantity)\n        assert est.is_compatible_with(unit.kilojoule_per_mole)\n\n    def test_get_uncertainty(self, protocolresult):\n        est = protocolresult.get_uncertainty()\n\n        assert est\n        assert est.m == pytest.approx(0.1, abs=0.2)\n        assert isinstance(est, unit.Quantity)\n        assert est.is_compatible_with(unit.kilojoule_per_mole)\n\n    def test_get_individual(self, protocolresult):\n        inds = protocolresult.get_individual_estimates()\n\n        assert isinstance(inds, list)\n        assert len(inds) == 3\n        for e, u in inds:\n            assert e.is_compatible_with(unit.kilojoule_per_mole)\n            assert u.is_compatible_with(unit.kilojoule_per_mole)\n\n    def test_get_forwards_etc(self, protocolresult):\n        far = protocolresult.get_forward_and_reverse_energy_analysis()\n\n        assert isinstance(far, list)\n        far1 = far[0]\n        assert isinstance(far1, dict)\n        for k in [\"fractions\", \"forward_DGs\", \"forward_dDGs\", \"reverse_DGs\", \"reverse_dDGs\"]:\n            assert k in far1\n\n            if k == \"fractions\":\n                assert isinstance(far1[k], np.ndarray)\n            else:\n                assert isinstance(far1[k], unit.Quantity)\n                assert far1[k].is_compatible_with(unit.kilojoule_per_mole)\n\n    def test_none_foward_reverse_energies(self, protocolresult):\n        # get the first entry's results\n        data = [i for i in protocolresult.data.values()][0][0]\n        # set the forward and reverse analysis to None\n        data.outputs[\"forward_and_reverse_energies\"] = None\n\n        # now call the getter and expect a user warning\n        wmsg = \"One or more ``None`` entries were found in\"\n        with pytest.warns(UserWarning, match=wmsg):\n            protocolresult.get_forward_and_reverse_energy_analysis()\n\n    def test_get_overlap_matrices(self, protocolresult):\n        ovp = protocolresult.get_overlap_matrices()\n\n        assert isinstance(ovp, list)\n        assert len(ovp) == 3\n\n        ovp1 = ovp[0]\n        assert isinstance(ovp1[\"matrix\"], np.ndarray)\n        assert ovp1[\"matrix\"].shape == (11, 11)\n\n    def test_get_replica_transition_statistics(self, protocolresult):\n        rpx = protocolresult.get_replica_transition_statistics()\n\n        assert isinstance(rpx, list)\n        assert len(rpx) == 3\n        rpx1 = rpx[0]\n        assert \"eigenvalues\" in rpx1\n        assert \"matrix\" in rpx1\n        assert rpx1[\"eigenvalues\"].shape == (11,)\n        assert rpx1[\"matrix\"].shape == (11, 11)\n\n    def test_equilibration_iterations(self, protocolresult):\n        eq = protocolresult.equilibration_iterations()\n\n        assert isinstance(eq, list)\n        assert len(eq) == 3\n        assert all(isinstance(v, float) for v in eq)\n\n    def test_production_iterations(self, protocolresult):\n        prod = protocolresult.production_iterations()\n\n        assert isinstance(prod, list)\n        assert len(prod) == 3\n        assert all(isinstance(v, float) for v in prod)\n\n    def test_filenotfound_replica_states(self, protocolresult):\n        errmsg = \"File could not be found\"\n\n        with pytest.raises(ValueError, match=errmsg):\n            protocolresult.get_replica_states()\n\n\n@pytest.fixture(scope=\"session\")\ndef benzene_solvent_openmm_system(benzene_modifications):\n    smc = benzene_modifications[\"benzene\"]\n    offmol = smc.to_openff()\n    settings = openmm_rfe.RelativeHybridTopologyProtocol.default_settings()\n\n    system_generator = system_creation.get_system_generator(\n        forcefield_settings=settings.forcefield_settings,\n        integrator_settings=settings.integrator_settings,\n        thermo_settings=settings.thermo_settings,\n        cache=None,\n        has_solvent=True,\n    )\n\n    system_generator.create_system(\n        offmol.to_topology().to_openmm(),\n        molecules=[offmol],\n    )\n\n    modeller, _ = system_creation.get_omm_modeller(\n        protein_comp=None,\n        solvent_comp=openfe.SolventComponent(),\n        small_mols={smc: offmol},\n        omm_forcefield=system_generator.forcefield,\n        solvent_settings=settings.solvation_settings,\n    )\n\n    topology = modeller.getTopology()\n    positions = to_openmm(from_openmm(modeller.getPositions()))\n    system = system_generator.create_system(topology, molecules=[offmol])\n\n    return system, topology, positions\n\n\n@pytest.fixture(scope=\"session\")\ndef benzene_tip4p_solvent_openmm_system(benzene_modifications):\n    smc = benzene_modifications[\"benzene\"]\n    offmol = smc.to_openff()\n    settings = openmm_rfe.RelativeHybridTopologyProtocol.default_settings()\n    settings.forcefield_settings.forcefields = [\n        \"amber/ff14SB.xml\",\n        \"amber/tip4pew_standard.xml\",\n        \"amber/phosaa10.xml\",\n    ]\n    settings.solvation_settings.solvent_model = \"tip4pew\"\n\n    system_generator = system_creation.get_system_generator(\n        forcefield_settings=settings.forcefield_settings,\n        integrator_settings=settings.integrator_settings,\n        thermo_settings=settings.thermo_settings,\n        cache=None,\n        has_solvent=True,\n    )\n\n    system_generator.create_system(\n        offmol.to_topology().to_openmm(),\n        molecules=[offmol],\n    )\n\n    modeller, _ = system_creation.get_omm_modeller(\n        protein_comp=None,\n        solvent_comp=openfe.SolventComponent(),\n        small_mols={smc: offmol},\n        omm_forcefield=system_generator.forcefield,\n        solvent_settings=settings.solvation_settings,\n    )\n\n    topology = modeller.getTopology()\n    positions = to_openmm(from_openmm(modeller.getPositions()))\n    system = system_generator.create_system(topology, molecules=[offmol])\n\n    return system, topology, positions\n\n\n@pytest.fixture\ndef benzene_self_system_mapping(benzene_solvent_openmm_system):\n    \"\"\"\n    A fictitious mapping of benzene to benzene where there is no\n    alchemical transformation (this technically doesn't work in practice\n    because the RFE protocol expects an alchemical component).\n    \"\"\"\n    system, topology, positions = benzene_solvent_openmm_system\n\n    res = [r for r in topology.residues()]\n    benzene_res = [r for r in res if r.name == \"UNK\"][0]\n    benzene_ids = [a.index for a in benzene_res.atoms()]\n    env_ids = [a.index for a in topology.atoms() if a.index not in benzene_ids]\n    all_ids = [a.index for a in topology.atoms()]\n\n    system_mapping = {\n        \"new_to_old_atom_map\": {i: i for i in all_ids},\n        \"old_to_new_atom_map\": {i: i for i in all_ids},\n        \"new_to_old_core_atom_map\": {i: i for i in benzene_ids},\n        \"old_to_new_core_atom_map\": {i: i for i in benzene_ids},\n        \"old_to_new_env_atom_map\": {i: i for i in env_ids},\n        \"new_to_old_env_atom_map\": {i: i for i in env_ids},\n        \"old_mol_indices\": benzene_ids,\n        \"new_mol_indices\": benzene_ids,\n    }\n\n    return system_mapping\n\n\n@pytest.mark.parametrize(\n    \"ion, water\",\n    [\n        [\"NA\", \"SOL\"],\n        [\"NX\", \"WAT\"],\n    ],\n)\ndef test_get_ion_water_parameters_unknownresname(ion, water, benzene_solvent_openmm_system):\n    system, topology, positions = benzene_solvent_openmm_system\n\n    errmsg = \"Error encountered when attempting to explicitly handle\"\n\n    with pytest.raises(ValueError, match=errmsg):\n        topologyhelpers._get_ion_and_water_parameters(\n            topology, system, ion_resname=ion, water_resname=water\n        )\n\n\ndef test_get_alchemical_waters_no_waters(\n    benzene_solvent_openmm_system,\n):\n    system, topology, positions = benzene_solvent_openmm_system\n\n    errmsg = \"There are no waters\"\n\n    with pytest.raises(ValueError, match=errmsg):\n        topologyhelpers.get_alchemical_waters(\n            topology, positions, charge_difference=1, distance_cutoff=3.0 * unit.nanometer\n        )\n\n\ndef test_handle_alchemwats_incorrect_count(\n    benzene_solvent_openmm_system,\n):\n    \"\"\"\n    Check that an error is thrown when charge_difference != len(water_resids)\n    \"\"\"\n    system, topology, positions = benzene_solvent_openmm_system\n\n    errmsg = \"There should be as many alchemical water residues:\"\n\n    with pytest.raises(ValueError, match=errmsg):\n        topologyhelpers.handle_alchemical_waters(\n            water_resids=[1, 2, 3],\n            topology=topology,\n            system=system,\n            system_mapping={},\n            charge_difference=1,\n            solvent_component=openfe.SolventComponent(),\n        )\n\n\ndef test_handle_alchemwats_too_many_nbf(\n    benzene_solvent_openmm_system,\n):\n    \"\"\"\n    Check that an error is thrown when there are multiple NonbondedForces\n    \"\"\"\n    system, topology, positions = benzene_solvent_openmm_system\n\n    new_system = copy.deepcopy(system)\n    new_system.addForce(NonbondedForce())\n\n    errmsg = \"Too many NonbondedForce forces\"\n\n    with pytest.raises(ValueError, match=errmsg):\n        topologyhelpers.handle_alchemical_waters(\n            water_resids=[1],\n            topology=topology,\n            system=new_system,\n            system_mapping={},\n            charge_difference=1,\n            solvent_component=openfe.SolventComponent(),\n        )\n\n\ndef test_handle_alchemwats_vsite_water(\n    benzene_tip4p_solvent_openmm_system,\n):\n    \"\"\"\n    Check that an error is thrown when trying to use a 4 site\n    water as an alchemical species\n    \"\"\"\n    system, topology, positions = benzene_tip4p_solvent_openmm_system\n\n    errmsg = \"Non 3-site waters\"\n\n    with pytest.raises(ValueError, match=errmsg):\n        topologyhelpers.handle_alchemical_waters(\n            water_resids=[1],\n            topology=topology,\n            system=system,\n            system_mapping={},\n            charge_difference=1,\n            solvent_component=openfe.SolventComponent(),\n        )\n\n\ndef test_handle_alchemwats_incorrect_atom(\n    benzene_solvent_openmm_system,\n    benzene_self_system_mapping,\n):\n    \"\"\"\n    Check that an error is thrown when charge_difference != len(water_resids)\n    \"\"\"\n    system, topology, positions = benzene_solvent_openmm_system\n\n    # modify the charge of hydrogen atom 25\n    new_system = copy.deepcopy(system)  # protect the session scoped object\n    nbf = [i for i in new_system.getForces() if isinstance(i, NonbondedForce)][0]\n    c, s, e = nbf.getParticleParameters(25)\n    nbf.setParticleParameters(25, 1 * omm_unit.elementary_charge, s, e)\n\n    errmsg = \"modifying an atom that doesn't match\"\n\n    with pytest.raises(ValueError, match=errmsg):\n        topologyhelpers.handle_alchemical_waters(\n            water_resids=[5],\n            topology=topology,\n            system=new_system,\n            system_mapping=benzene_self_system_mapping,\n            charge_difference=1,\n            solvent_component=openfe.SolventComponent(),\n        )\n\n\ndef test_handle_alchemical_wats(\n    benzene_solvent_openmm_system,\n    benzene_self_system_mapping,\n):\n    system, topology, positions = benzene_solvent_openmm_system\n\n    n_env = len(benzene_self_system_mapping[\"old_to_new_env_atom_map\"])\n    n_core = len(benzene_self_system_mapping[\"old_to_new_core_atom_map\"])\n\n    topologyhelpers.handle_alchemical_waters(\n        water_resids=[5],\n        topology=topology,\n        system=system,\n        system_mapping=benzene_self_system_mapping,\n        charge_difference=1,\n        solvent_component=openfe.SolventComponent(),\n    )\n\n    # check the mappings\n    old_new_env = benzene_self_system_mapping[\"old_to_new_env_atom_map\"]\n    old_new_core = benzene_self_system_mapping[\"old_to_new_core_atom_map\"]\n    assert len(old_new_env) == n_env - 3\n    assert old_new_env == benzene_self_system_mapping[\"new_to_old_env_atom_map\"]\n    assert len(old_new_core) == n_core + 3\n    assert old_new_core == benzene_self_system_mapping[\"new_to_old_core_atom_map\"]\n    expected_old_new_core = {i: i for i in range(12)} | {24: 24, 25: 25, 26: 26}\n    assert old_new_core == expected_old_new_core\n\n    # system parameters checks\n    nbf = [i for i in system.getForces() if isinstance(i, NonbondedForce)][0]\n    # check the oxygen parameters\n    i_chg, i_sig, i_eps, o_chg, h_chg = topologyhelpers._get_ion_and_water_parameters(\n        topology, system, \"NA\", \"HOH\"\n    )\n\n    charge, sigma, epsilon = nbf.getParticleParameters(24)\n    assert charge == 1.0 * omm_unit.elementary_charge == i_chg\n    assert sigma == i_sig\n    assert epsilon == i_eps\n\n    # check the hydrogen parameters\n    for i in [25, 26]:\n        charge, _, _ = nbf.getParticleParameters(i)\n        assert charge == 0.0 * omm_unit.elementary_charge\n\n\ndef _assert_total_charge(system, atom_classes, chgA, chgB):\n    nonbond = [f for f in system.getForces() if isinstance(f, NonbondedForce)]\n\n    offsets = {}\n    for i in range(nonbond[0].getNumParticleParameterOffsets()):\n        offset = nonbond[0].getParticleParameterOffset(i)\n        assert len(offset) == 5\n        offsets[offset[1]] = ensure_quantity(offset[2], \"openff\")\n\n    stateA_charges = np.zeros(system.getNumParticles())\n    stateB_charges = np.zeros(system.getNumParticles())\n\n    for i in range(system.getNumParticles()):\n        # get the particle charge (c) and the chargeScale offset (c_offset)\n        c, s, e = nonbond[0].getParticleParameters(i)\n        c = ensure_quantity(c, \"openff\")\n\n        # particle charge (c) is equal to molA particle charge\n        # offset (c_offset) is equal to -(molA particle charge)\n        if i in atom_classes[\"unique_old_atoms\"]:\n            stateA_charges[i] = c.m\n        # particle charge (c) is equal to 0\n        # offset (c_offset) is equal to molB particle charge\n        elif i in atom_classes[\"unique_new_atoms\"]:\n            stateB_charges[i] = offsets[i].m\n        # particle charge (c) is equal to molA particle charge\n        # offset (c_offset) is equal to difference between molB and molA\n        elif i in atom_classes[\"core_atoms\"]:\n            stateA_charges[i] = c.m\n            stateB_charges[i] = c.m + offsets[i].m\n        # an environment atom\n        else:\n            assert i in atom_classes[\"environment_atoms\"]\n            stateA_charges[i] = c.m\n            stateB_charges[i] = c.m\n\n    assert chgA == pytest.approx(np.sum(stateA_charges))\n    assert chgB == pytest.approx(np.sum(stateB_charges))\n\n\ndef test_dry_run_alchemwater_solvent(benzene_to_benzoic_mapping, solv_settings, tmp_path):\n    stateA_system = openfe.ChemicalSystem(\n        {\n            \"ligand\": benzene_to_benzoic_mapping.componentA,\n            \"solvent\": openfe.SolventComponent(),\n        }\n    )\n    stateB_system = openfe.ChemicalSystem(\n        {\n            \"ligand\": benzene_to_benzoic_mapping.componentB,\n            \"solvent\": openfe.SolventComponent(),\n        }\n    )\n    solv_settings.alchemical_settings.explicit_charge_correction = True\n    protocol = openmm_rfe.RelativeHybridTopologyProtocol(\n        settings=solv_settings,\n    )\n\n    # create DAG from protocol and take first (and only) work unit from within\n    dag = protocol.create(\n        stateA=stateA_system,\n        stateB=stateB_system,\n        mapping=benzene_to_benzoic_mapping,\n    )\n\n    dag_setup_unit = _get_units(dag.protocol_units, HybridTopologySetupUnit)[0]\n\n    results = dag_setup_unit.run(dry=True, scratch_basepath=tmp_path, shared_basepath=tmp_path)\n    htf = results[\"hybrid_factory\"]\n    _assert_total_charge(htf.hybrid_system, htf._atom_classes, 0, 0)\n\n    assert len(htf._atom_classes[\"core_atoms\"]) == 14\n    assert len(htf._atom_classes[\"unique_new_atoms\"]) == 3\n    assert len(htf._atom_classes[\"unique_old_atoms\"]) == 1\n\n\n@pytest.mark.slow\n@pytest.mark.parametrize(\n    \"mapping_name,chgA,chgB,correction,core_atoms,new_uniq,old_uniq\",\n    [\n        [\"benzene_to_aniline_mapping\", 0, 1, False, 11, 4, 1],\n        [\"aniline_to_benzene_mapping\", 0, 0, True, 14, 1, 4],\n        [\"aniline_to_benzene_mapping\", 0, -1, False, 11, 1, 4],\n        [\"benzene_to_benzoic_mapping\", 0, 0, True, 14, 3, 1],\n        [\"benzene_to_benzoic_mapping\", 0, -1, False, 11, 3, 1],\n        [\"benzoic_to_benzene_mapping\", 0, 0, True, 14, 1, 3],\n        [\"benzoic_to_benzene_mapping\", 0, 1, False, 11, 1, 3],\n    ],\n)\ndef test_setup_complex_alchemwater_totcharge(\n    mapping_name,\n    chgA,\n    chgB,\n    correction,\n    core_atoms,\n    new_uniq,\n    old_uniq,\n    tmp_path,\n    request,\n    T4_protein_component,\n    solv_settings,\n):\n    mapping = request.getfixturevalue(mapping_name)\n    solvent = openfe.SolventComponent()\n    stateA_system = openfe.ChemicalSystem(\n        {\n            \"ligand\": mapping.componentA,\n            \"solvent\": solvent,\n            \"protein\": T4_protein_component,\n        }\n    )\n    stateB_system = openfe.ChemicalSystem(\n        {\n            \"ligand\": mapping.componentB,\n            \"solvent\": solvent,\n            \"protein\": T4_protein_component,\n        }\n    )\n\n    solv_settings.solvation_settings.solvent_padding = \"0.9 nm\"\n    solv_settings.solvation_settings.box_shape = \"dodecahedron\"\n    solv_settings.alchemical_settings.explicit_charge_correction = correction\n\n    protocol = openmm_rfe.RelativeHybridTopologyProtocol(\n        settings=solv_settings,\n    )\n\n    # create DAG from protocol and take first (and only) work unit from within\n    dag = protocol.create(\n        stateA=stateA_system,\n        stateB=stateB_system,\n        mapping=mapping,\n    )\n    dag_setup_unit = _get_units(dag.protocol_units, HybridTopologySetupUnit)[0]\n\n    setup_results = dag_setup_unit.run(\n        dry=True, scratch_basepath=tmp_path, shared_basepath=tmp_path\n    )\n    htf = setup_results[\"hybrid_factory\"]\n    _assert_total_charge(htf.hybrid_system, htf._atom_classes, chgA, chgB)\n\n    assert len(htf._atom_classes[\"core_atoms\"]) == core_atoms\n    assert len(htf._atom_classes[\"unique_new_atoms\"]) == new_uniq\n    assert len(htf._atom_classes[\"unique_old_atoms\"]) == old_uniq\n\n\ndef test_structural_analysis_error(tmp_path):\n    ret = openmm_rfe.hybridtop_units.HybridTopologyMultiStateAnalysisUnit._structural_analysis(\n        Path(tmp_path),\n        Path(tmp_path),\n        Path(tmp_path),\n        True,\n    )\n\n    assert \"structural_analysis_error\" in ret\n    assert \"structural_analysis\" not in ret\n\n\n@pytest.mark.parametrize(\n    \"positions_write_frequency,velocities_write_frequency\",\n    [\n        [100 * unit.picosecond, None],\n        [None, None],\n        [None, 100 * unit.picosecond],\n    ],\n)\ndef test_dry_run_vacuum_write_frequency(\n    benzene_vacuum_system,\n    toluene_vacuum_system,\n    benzene_to_toluene_mapping,\n    positions_write_frequency,\n    velocities_write_frequency,\n    vac_settings,\n    tmp_path,\n):\n    vac_settings.output_settings.positions_write_frequency = positions_write_frequency\n    vac_settings.output_settings.velocities_write_frequency = velocities_write_frequency\n\n    # set the time per iteration to 1 to get the expected outputs\n    vac_settings.simulation_settings.time_per_iteration = 1 * unit.picosecond\n\n    protocol = openmm_rfe.RelativeHybridTopologyProtocol(\n        settings=vac_settings,\n    )\n\n    # create DAG from protocol and take first (and only) work unit from within\n    dag = protocol.create(\n        stateA=benzene_vacuum_system,\n        stateB=toluene_vacuum_system,\n        mapping=benzene_to_toluene_mapping,\n    )\n    dag_setup_unit = _get_units(dag.protocol_units, HybridTopologySetupUnit)[0]\n    dag_sim_unit = _get_units(dag.protocol_units, HybridTopologyMultiStateSimulationUnit)[0]\n\n    # Manually run the units\n    setup_results = dag_setup_unit.run(\n        dry=True, scratch_basepath=tmp_path, shared_basepath=tmp_path\n    )\n\n    sim_results = dag_sim_unit.run(\n        system=setup_results[\"hybrid_system\"],\n        positions=setup_results[\"hybrid_positions\"],\n        selection_indices=setup_results[\"selection_indices\"],\n        dry=True,\n        scratch_basepath=tmp_path,\n        shared_basepath=tmp_path,\n    )\n\n    sampler = sim_results[\"sampler\"]\n    reporter = sampler._reporter\n    if positions_write_frequency:\n        assert reporter.position_interval == positions_write_frequency.m\n    else:\n        assert reporter.position_interval == 0\n    if velocities_write_frequency:\n        assert reporter.velocity_interval == velocities_write_frequency.m\n    else:\n        assert reporter.velocity_interval == 0\n"
  },
  {
    "path": "src/openfe/tests/protocols/openmm_rfe/test_hybrid_top_resume.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\nimport copy\nimport logging\nimport os\nimport pathlib\nimport shutil\n\nimport gufe\nimport numpy as np\nimport openmm\nimport pooch\nimport pytest\nfrom gufe.protocols import execute_DAG\nfrom gufe.protocols.errors import ProtocolUnitExecutionError\nfrom numpy.testing import assert_allclose\nfrom openfe_analysis.utils.multistate import _determine_position_indices\nfrom openff.units import unit as offunit\nfrom openff.units.openmm import from_openmm\nfrom openmmtools.multistate import MultiStateReporter\n\nimport openfe\nfrom openfe.data._registry import POOCH_CACHE\nfrom openfe.protocols import openmm_rfe\nfrom openfe.protocols.openmm_rfe._rfe_utils.multistate import HybridRepexSampler\nfrom openfe.protocols.openmm_rfe.hybridtop_units import (\n    HybridTopologyMultiStateAnalysisUnit,\n    HybridTopologyMultiStateSimulationUnit,\n    HybridTopologySetupUnit,\n)\n\nfrom ...conftest import HAS_INTERNET\nfrom .test_hybrid_top_protocol import _get_units\n\n\n@pytest.fixture()\ndef protocol_settings():\n    settings = openmm_rfe.RelativeHybridTopologyProtocol.default_settings()\n    settings.solvation_settings.solvent_padding = None\n    settings.solvation_settings.number_of_solvent_molecules = 750\n    settings.solvation_settings.box_shape = \"dodecahedron\"\n    settings.protocol_repeats = 1\n    settings.simulation_settings.equilibration_length = 100 * offunit.picosecond\n    settings.simulation_settings.production_length = 200 * offunit.picosecond\n    settings.simulation_settings.time_per_iteration = 2.5 * offunit.picosecond\n    settings.output_settings.checkpoint_interval = 100 * offunit.picosecond\n    settings.engine_settings.compute_platform = None\n    return settings\n\n\ndef test_verify_execution_environment():\n    # Verification should pass\n    openmm_rfe.HybridTopologyMultiStateSimulationUnit._verify_execution_environment(\n        setup_outputs={\n            \"gufe_version\": gufe.__version__,\n            \"openfe_version\": openfe.__version__,\n            \"openmm_version\": openmm.__version__,\n        },\n    )\n\n\ndef test_verify_execution_environment_fail():\n    # Passing a bad version should fail\n    with pytest.raises(ProtocolUnitExecutionError, match=\"Python environment\"):\n        openmm_rfe.HybridTopologyMultiStateSimulationUnit._verify_execution_environment(\n            setup_outputs={\n                \"gufe_version\": 0.1,\n                \"openfe_version\": openfe.__version__,\n                \"openmm_version\": openmm.__version__,\n            },\n        )\n\n\ndef test_verify_execution_env_missing_key():\n    errmsg = \"Missing environment information from setup outputs.\"\n    with pytest.raises(ProtocolUnitExecutionError, match=errmsg):\n        openmm_rfe.HybridTopologyMultiStateSimulationUnit._verify_execution_environment(\n            setup_outputs={\n                \"foo_version\": 0.1,\n                \"openfe_version\": openfe.__version__,\n                \"openmm_version\": openmm.__version__,\n            },\n        )\n\n\n@pytest.mark.skipif(\n    not os.path.exists(POOCH_CACHE) and not HAS_INTERNET,\n    reason=\"Internet unavailable and test data is not cached locally\",\n)\ndef test_check_restart(protocol_settings, htop_trajectory_path):\n    assert openmm_rfe.HybridTopologyMultiStateSimulationUnit._check_restart(\n        output_settings=protocol_settings.output_settings,\n        shared_path=htop_trajectory_path.parent,\n    )\n\n    assert not openmm_rfe.HybridTopologyMultiStateSimulationUnit._check_restart(\n        output_settings=protocol_settings.output_settings,\n        shared_path=pathlib.Path(\".\"),\n    )\n\n\n@pytest.mark.skipif(\n    not os.path.exists(POOCH_CACHE) and not HAS_INTERNET,\n    reason=\"Internet unavailable and test data is not cached locally\",\n)\nclass TestCheckpointResuming:\n    @pytest.fixture()\n    def protocol_dag(\n        self, protocol_settings, benzene_system, toluene_system, benzene_to_toluene_mapping\n    ):\n        protocol = openmm_rfe.RelativeHybridTopologyProtocol(settings=protocol_settings)\n\n        return protocol.create(\n            stateA=benzene_system, stateB=toluene_system, mapping=benzene_to_toluene_mapping\n        )\n\n    @staticmethod\n    def _check_sampler(sampler, num_iterations: int):\n        # Helper method to do some checks on the sampler\n        assert sampler._iteration == num_iterations\n        assert sampler.number_of_iterations == 80\n        assert sampler.is_completed is (num_iterations == 80)\n        assert sampler.n_states == sampler.n_replicas == 11\n        assert sampler.is_periodic\n        assert sampler.mcmc_moves[0].n_steps == 625\n        assert from_openmm(sampler.mcmc_moves[0].timestep) == 4 * offunit.fs\n\n    @staticmethod\n    def _get_positions(dataset):\n        frame_list = _determine_position_indices(dataset)\n        positions = []\n        for frame in frame_list:\n            positions.append(copy.deepcopy(dataset.variables[\"positions\"][frame].data))\n        return positions\n\n    @staticmethod\n    def _copy_simfiles(basedir: pathlib.Path, filepath):\n        shutil.copyfile(filepath, f\"{basedir}/{filepath.name}\")\n\n    @pytest.mark.integration\n    def test_resume(self, protocol_dag, htop_trajectory_path, htop_checkpoint_path, tmp_path):\n        \"\"\"\n        Attempt to resume a simulation unit with pre-existing checkpoint &\n        trajectory files.\n        \"\"\"\n        # copy files\n        self._copy_simfiles(tmp_path, htop_trajectory_path)\n        self._copy_simfiles(tmp_path, htop_checkpoint_path)\n\n        # 1. Check that the trajectory / checkpoint contain what we expect\n        reporter = MultiStateReporter(\n            tmp_path / \"simulation.nc\",\n            checkpoint_storage=\"checkpoint.chk\",\n        )\n        sampler = HybridRepexSampler.from_storage(reporter)\n\n        self._check_sampler(sampler, num_iterations=40)\n        # Deep copy energies & positions for later tests\n        init_energies = copy.deepcopy(reporter.read_energies())[0]\n        assert init_energies.shape == (41, 11, 11)\n        init_positions = self._get_positions(reporter._storage[0])\n        assert len(init_positions) == 2\n\n        reporter.close()\n        del sampler\n\n        # 2. get & run the units\n        pus = list(protocol_dag.protocol_units)\n        setup_unit = _get_units(pus, HybridTopologySetupUnit)[0]\n        simulation_unit = _get_units(pus, HybridTopologyMultiStateSimulationUnit)[0]\n        analysis_unit = _get_units(pus, HybridTopologyMultiStateAnalysisUnit)[0]\n\n        # Dry run the setup since it'll be easier to use the objects directly\n        setup_results = setup_unit.run(\n            dry=True, scratch_basepath=tmp_path, shared_basepath=tmp_path\n        )\n\n        # Now we run the simulation in resume mode\n        sim_results = simulation_unit.run(\n            system=setup_results[\"hybrid_system\"],\n            positions=setup_results[\"hybrid_positions\"],\n            selection_indices=setup_results[\"selection_indices\"],\n            scratch_basepath=tmp_path,\n            shared_basepath=tmp_path,\n        )\n\n        # Finally we analyze the results\n        _ = analysis_unit.run(\n            pdb_file=setup_results[\"pdb_structure\"],\n            trajectory=sim_results[\"nc\"],\n            checkpoint=sim_results[\"checkpoint\"],\n            scratch_basepath=tmp_path,\n            shared_basepath=tmp_path,\n        )\n\n        # 3. Analyze the trajectory/checkpoint again\n        reporter = MultiStateReporter(\n            tmp_path / \"simulation.nc\",\n            checkpoint_storage=\"checkpoint.chk\",\n        )\n        sampler = HybridRepexSampler.from_storage(reporter)\n\n        self._check_sampler(sampler, num_iterations=80)\n\n        # Check the energies and positions\n        energies = reporter.read_energies()[0]\n        assert energies.shape == (81, 11, 11)\n        assert_allclose(init_energies, energies[:41])\n\n        positions = self._get_positions(reporter._storage[0])\n        assert len(positions) == 3\n        for i in range(2):\n            assert_allclose(positions[i], init_positions[i])\n\n        reporter.close()\n        del sampler\n\n        # Check the openfe-analysis outputs are there\n        structural_analysis_file = tmp_path / \"structural_analysis.npz\"\n        assert (structural_analysis_file).exists()\n\n    @pytest.mark.slow\n    def test_resume_fail_particles(\n        self, protocol_dag, htop_trajectory_path, htop_checkpoint_path, tmp_path\n    ):\n        \"\"\"\n        Test that the run unit will fail with a system incompatible\n        to the one present in the trajectory/checkpoint files.\n\n        Here we check that we don't have the same particles / mass.\n        \"\"\"\n        # copy files\n        self._copy_simfiles(tmp_path, htop_trajectory_path)\n        self._copy_simfiles(tmp_path, htop_checkpoint_path)\n\n        pus = list(protocol_dag.protocol_units)\n        setup_unit = _get_units(pus, HybridTopologySetupUnit)[0]\n        simulation_unit = _get_units(pus, HybridTopologyMultiStateSimulationUnit)[0]\n\n        # Dry run the setup since it'll be easier to use the objects directly\n        setup_results = setup_unit.run(\n            dry=True, scratch_basepath=tmp_path, shared_basepath=tmp_path\n        )\n\n        # Fake system should trigger a mismatch\n        errmsg = \"Stored checkpoint System particles do not\"\n        with pytest.raises(ValueError, match=errmsg):\n            _ = simulation_unit.run(\n                system=openmm.System(),\n                positions=setup_results[\"hybrid_positions\"],\n                selection_indices=setup_results[\"selection_indices\"],\n                scratch_basepath=tmp_path,\n                shared_basepath=tmp_path,\n            )\n\n    @pytest.mark.slow\n    def test_resume_fail_constraints(\n        self, protocol_dag, htop_trajectory_path, htop_checkpoint_path, tmp_path\n    ):\n        \"\"\"\n        Test that the run unit will fail with a system incompatible\n        to the one present in the trajectory/checkpoint files.\n\n        Here we check that we don't have the same constraints.\n        \"\"\"\n        # copy files\n        self._copy_simfiles(tmp_path, htop_trajectory_path)\n        self._copy_simfiles(tmp_path, htop_checkpoint_path)\n\n        pus = list(protocol_dag.protocol_units)\n        setup_unit = _get_units(pus, HybridTopologySetupUnit)[0]\n        simulation_unit = _get_units(pus, HybridTopologyMultiStateSimulationUnit)[0]\n\n        # Dry run the setup since it'll be easier to use the objects directly\n        setup_results = setup_unit.run(\n            dry=True, scratch_basepath=tmp_path, shared_basepath=tmp_path\n        )\n\n        # Create a fake system without constraints\n        fake_system = copy.deepcopy(setup_results[\"hybrid_system\"])\n\n        for i in reversed(range(fake_system.getNumConstraints())):\n            fake_system.removeConstraint(i)\n\n        # Fake system should trigger a mismatch\n        errmsg = \"Stored checkpoint System constraints do not\"\n        with pytest.raises(ValueError, match=errmsg):\n            _ = simulation_unit.run(\n                system=fake_system,\n                positions=setup_results[\"hybrid_positions\"],\n                selection_indices=setup_results[\"selection_indices\"],\n                scratch_basepath=tmp_path,\n                shared_basepath=tmp_path,\n            )\n\n    @pytest.mark.slow\n    def test_resume_fail_forces(\n        self, protocol_dag, htop_trajectory_path, htop_checkpoint_path, tmp_path\n    ):\n        \"\"\"\n        Test that the run unit will fail with a system incompatible\n        to the one present in the trajectory/checkpoint files.\n\n        Here we check we don't have the same forces.\n        \"\"\"\n        # copy files\n        self._copy_simfiles(tmp_path, htop_trajectory_path)\n        self._copy_simfiles(tmp_path, htop_checkpoint_path)\n\n        pus = list(protocol_dag.protocol_units)\n        setup_unit = _get_units(pus, HybridTopologySetupUnit)[0]\n        simulation_unit = _get_units(pus, HybridTopologyMultiStateSimulationUnit)[0]\n\n        # Dry run the setup since it'll be easier to use the objects directly\n        setup_results = setup_unit.run(\n            dry=True, scratch_basepath=tmp_path, shared_basepath=tmp_path\n        )\n\n        # Create a fake system without the last force\n        fake_system = copy.deepcopy(setup_results[\"hybrid_system\"])\n        fake_system.removeForce(fake_system.getNumForces() - 1)\n\n        # Fake system should trigger a mismatch\n        errmsg = \"Number of forces stored in checkpoint System\"\n        with pytest.raises(ValueError, match=errmsg):\n            _ = simulation_unit.run(\n                system=fake_system,\n                positions=setup_results[\"hybrid_positions\"],\n                selection_indices=setup_results[\"selection_indices\"],\n                scratch_basepath=tmp_path,\n                shared_basepath=tmp_path,\n            )\n\n    @pytest.mark.slow\n    def test_resume_differ_barostat(\n        self, protocol_dag, htop_trajectory_path, htop_checkpoint_path, tmp_path\n    ):\n        \"\"\"\n        Test that the run unit will fail if the barostat differs.\n        \"\"\"\n        # copy files\n        self._copy_simfiles(tmp_path, htop_trajectory_path)\n        self._copy_simfiles(tmp_path, htop_checkpoint_path)\n\n        pus = list(protocol_dag.protocol_units)\n        setup_unit = _get_units(pus, HybridTopologySetupUnit)[0]\n        simulation_unit = _get_units(pus, HybridTopologyMultiStateSimulationUnit)[0]\n\n        # Dry run the setup since it'll be easier to use the objects directly\n        setup_results = setup_unit.run(\n            dry=True, scratch_basepath=tmp_path, shared_basepath=tmp_path\n        )\n\n        # Create a fake system with the fake forcetype\n        fake_system = copy.deepcopy(setup_results[\"hybrid_system\"])\n\n        # Loop through forces and remove the force matching force type\n        for i, f in enumerate(fake_system.getForces()):\n            if isinstance(f, openmm.MonteCarloBarostat):\n                findex = i\n\n        fake_system.removeForce(findex)\n        new_force = openmm.MonteCarloBarostat(\n            1 * openmm.unit.atmosphere, 300 * openmm.unit.kelvin, 100\n        )\n        fake_system.addForce(new_force)\n\n        # Fake system should trigger a mismatch\n        errmsg = \"stored checkpoint System does not match the same force\"\n        with pytest.raises(ValueError, match=errmsg):\n            _ = simulation_unit.run(\n                system=fake_system,\n                positions=setup_results[\"hybrid_positions\"],\n                selection_indices=setup_results[\"selection_indices\"],\n                scratch_basepath=tmp_path,\n                shared_basepath=tmp_path,\n            )\n\n    @pytest.mark.slow\n    def test_resume_differ_forces(\n        self, protocol_dag, htop_trajectory_path, htop_checkpoint_path, tmp_path, caplog\n    ):\n        \"\"\"\n        Test that the run unit will warn if forces don't match\n        to the one present in the trajectory/checkpoint files.\n        \"\"\"\n        # copy files\n        self._copy_simfiles(tmp_path, htop_trajectory_path)\n        self._copy_simfiles(tmp_path, htop_checkpoint_path)\n\n        pus = list(protocol_dag.protocol_units)\n        setup_unit = _get_units(pus, HybridTopologySetupUnit)[0]\n        simulation_unit = _get_units(pus, HybridTopologyMultiStateSimulationUnit)[0]\n\n        # Dry run the setup since it'll be easier to use the objects directly\n        setup_results = setup_unit.run(\n            dry=True, scratch_basepath=tmp_path, shared_basepath=tmp_path\n        )\n\n        # Create a fake system with the fake forcetype\n        fake_system = copy.deepcopy(setup_results[\"hybrid_system\"])\n\n        # Loop through forces and remove the force matching force type\n        for i, f in enumerate(fake_system.getForces()):\n            if isinstance(f, openmm.NonbondedForce):\n                findex = i\n\n        fake_system.removeForce(findex)\n        fake_system.addForce(openmm.NonbondedForce())\n\n        # Mismatching force should trigger a warning\n        wmsg = \"does not exactly match one of the forces in the simulated System\"\n        caplog.set_level(logging.INFO)\n\n        _ = simulation_unit.run(\n            system=fake_system,\n            positions=setup_results[\"hybrid_positions\"],\n            selection_indices=setup_results[\"selection_indices\"],\n            scratch_basepath=tmp_path,\n            shared_basepath=tmp_path,\n            dry=True,\n        )\n\n        assert wmsg in caplog.text\n\n    @pytest.mark.slow\n    @pytest.mark.parametrize(\"bad_file\", [\"trajectory\", \"checkpoint\"])\n    def test_resume_bad_files(\n        self, protocol_dag, htop_trajectory_path, htop_checkpoint_path, bad_file, tmp_path\n    ):\n        \"\"\"\n        Test what happens when you have a bad trajectory and/or checkpoint\n        files.\n        \"\"\"\n        # copy files\n        if bad_file == \"trajectory\":\n            with open(tmp_path / \"simulation.nc\", \"w\") as f:\n                f.write(\"foo\")\n        else:\n            self._copy_simfiles(tmp_path, htop_trajectory_path)\n\n        if bad_file == \"checkpoint\":\n            with open(tmp_path / \"checkpoint.chk\", \"w\") as f:\n                f.write(\"bar\")\n        else:\n            self._copy_simfiles(tmp_path, htop_checkpoint_path)\n\n        pus = list(protocol_dag.protocol_units)\n        setup_unit = _get_units(pus, HybridTopologySetupUnit)[0]\n        simulation_unit = _get_units(pus, HybridTopologyMultiStateSimulationUnit)[0]\n\n        # Dry run the setup since it'll be easier to use the objects directly\n        setup_results = setup_unit.run(\n            dry=True, scratch_basepath=tmp_path, shared_basepath=tmp_path\n        )\n\n        with pytest.raises(OSError, match=\"Unknown file format\"):\n            _ = simulation_unit.run(\n                system=setup_results[\"hybrid_system\"],\n                positions=setup_results[\"hybrid_positions\"],\n                selection_indices=setup_results[\"selection_indices\"],\n                scratch_basepath=tmp_path,\n                shared_basepath=tmp_path,\n            )\n\n    @pytest.mark.slow\n    @pytest.mark.parametrize(\"missing_file\", [\"trajectory\", \"checkpoint\"])\n    def test_missing_file(\n        self, protocol_dag, htop_trajectory_path, htop_checkpoint_path, missing_file, tmp_path\n    ):\n        \"\"\"\n        Test that an error is thrown if either file is missing but the other isn't.\n        \"\"\"\n        # copy files\n        if missing_file == \"trajectory\":\n            pass\n        else:\n            self._copy_simfiles(tmp_path, htop_trajectory_path)\n\n        if missing_file == \"checkpoint\":\n            pass\n        else:\n            self._copy_simfiles(tmp_path, htop_checkpoint_path)\n\n        pus = list(protocol_dag.protocol_units)\n        setup_unit = _get_units(pus, HybridTopologySetupUnit)[0]\n        simulation_unit = _get_units(pus, HybridTopologyMultiStateSimulationUnit)[0]\n\n        # Dry run the setup since it'll be easier to use the objects directly\n        setup_results = setup_unit.run(\n            dry=True, scratch_basepath=tmp_path, shared_basepath=tmp_path\n        )\n\n        errmsg = f\"file is present but not the {missing_file} file.\"\n        with pytest.raises(IOError, match=errmsg):\n            _ = simulation_unit.run(\n                system=setup_results[\"hybrid_system\"],\n                positions=setup_results[\"hybrid_positions\"],\n                selection_indices=setup_results[\"selection_indices\"],\n                scratch_basepath=tmp_path,\n                shared_basepath=tmp_path,\n            )\n"
  },
  {
    "path": "src/openfe/tests/protocols/openmm_rfe/test_hybrid_top_slow.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\nimport pathlib\n\nimport numpy as np\nimport pytest\nfrom gufe.protocols import execute_DAG\nfrom numpy.testing import assert_allclose\nfrom openff.units import unit as offunit\n\nimport openfe\nfrom openfe.protocols import openmm_rfe\nfrom openfe.protocols.openmm_utils.charge_generation import HAS_NAGL, HAS_OPENEYE\n\n\n@pytest.mark.slow\n@pytest.mark.flaky(reruns=3)  # pytest-rerunfailures; we can get bad minimization\n@pytest.mark.parametrize(\"platform\", [\"CPU\", \"CUDA\"])\ndef test_openmm_run_engine(\n    benzene_vacuum_system,\n    platform,\n    get_available_openmm_platforms,\n    benzene_modifications,\n    tmp_path,\n):\n    if platform not in get_available_openmm_platforms:\n        pytest.skip(f\"OpenMM Platform: {platform} not available\")\n    # this test actually runs MD\n    # these settings are a small self to self sim, that has enough eq that\n    # it doesn't occasionally crash\n    s = openfe.protocols.openmm_rfe.RelativeHybridTopologyProtocol.default_settings()\n    s.simulation_settings.equilibration_length = 0.1 * offunit.picosecond\n    s.simulation_settings.production_length = 0.1 * offunit.picosecond\n    s.simulation_settings.time_per_iteration = 20 * offunit.femtosecond\n    s.forcefield_settings.nonbonded_method = \"nocutoff\"\n    s.protocol_repeats = 1\n    s.engine_settings.compute_platform = platform\n    s.output_settings.checkpoint_interval = 20 * offunit.femtosecond\n    s.output_settings.positions_write_frequency = 20 * offunit.femtosecond\n\n    p = openmm_rfe.RelativeHybridTopologyProtocol(s)\n\n    b = benzene_vacuum_system[\"ligand\"]\n\n    # make a copy with a different name\n    rdmol = benzene_modifications[\"benzene\"].to_rdkit()\n    b_alt = openfe.SmallMoleculeComponent.from_rdkit(rdmol, name=\"alt\")\n    benzene_vacuum_alt_system = openfe.ChemicalSystem({\"ligand\": b_alt})\n\n    m = openfe.LigandAtomMapping(\n        componentA=b,\n        componentB=b_alt,\n        componentA_to_componentB={i: i for i in range(12)},\n    )\n    dag = p.create(\n        stateA=benzene_vacuum_system,\n        stateB=benzene_vacuum_alt_system,\n        mapping=[m],\n    )\n\n    r = execute_DAG(dag, shared_basedir=tmp_path, scratch_basedir=tmp_path, keep_shared=True)\n\n    assert r.ok()\n\n    # Get the path to the simulation unit shared\n    for pur in r.protocol_unit_results:\n        if \"Simulation\" in pur.name:\n            sim_shared = tmp_path / f\"shared_{pur.source_key}_attempt_0\"\n            assert sim_shared.exists()\n            assert pathlib.Path(sim_shared).is_dir()\n\n    for pur in r.protocol_unit_results:\n        if \"Analysis\" not in pur.name:\n            continue\n\n        analysis_shared = tmp_path / f\"shared_{pur.source_key}_attempt_0\"\n        assert analysis_shared.exists()\n        assert pathlib.Path(analysis_shared).is_dir()\n\n        # Check the checkpoint file exists\n        checkpoint = pur.outputs[\"checkpoint\"]\n        assert checkpoint.name == \"checkpoint.chk\"\n        assert checkpoint == sim_shared / \"checkpoint.chk\"\n        assert checkpoint.exists()\n\n        # Check the nc simulation file exists\n        # TODO: assert the number of frames\n        nc = pur.outputs[\"trajectory\"]\n        assert nc.name == \"simulation.nc\"\n        assert nc == sim_shared / \"simulation.nc\"\n        assert nc.exists()\n\n        # Check structural analysis contents\n        structural_analysis_file = analysis_shared / \"structural_analysis.npz\"\n        assert (structural_analysis_file).exists()\n        assert pur.outputs[\"structural_analysis\"] == structural_analysis_file\n\n        structural_data = np.load(pur.outputs[\"structural_analysis\"])\n        structural_keys = [\n            \"protein_RMSD\",\n            \"ligand_RMSD\",\n            \"ligand_COM_drift\",\n            \"protein_2D_RMSD\",\n            \"time_ps\",\n        ]\n        for key in structural_keys:\n            assert key in structural_data.keys()\n\n        # 6 frames being written to file\n        assert_allclose(structural_data[\"time_ps\"], [0.0, 0.02, 0.04, 0.06, 0.08, 0.1])\n        assert structural_data[\"ligand_RMSD\"].shape == (11, 6)\n        assert structural_data[\"ligand_COM_drift\"].shape == (11, 6)\n        # No protein so should be empty\n        assert structural_data[\"protein_RMSD\"].size == 0\n        assert structural_data[\"protein_2D_RMSD\"].size == 0\n\n    # Test results methods that need files present\n    results = p.gather([r])\n    states = results.get_replica_states()\n    assert len(states) == 1\n    assert states[0].shape[1] == 11\n\n\n@pytest.mark.integration  # takes ~7 minutes to run\n@pytest.mark.flaky(reruns=3)\n@pytest.mark.skipif(not HAS_NAGL, reason=\"need NAGL\")\n@pytest.mark.skipif(\n    HAS_OPENEYE and HAS_NAGL,\n    reason=\"NAGL/openeye incompatibility. See https://github.com/openforcefield/openff-nagl/issues/177\",\n)\ndef test_run_eg5_sim(eg5_protein, eg5_ligands, eg5_cofactor, tmp_path):\n    # this runs a very short eg5 complex leg\n    # different to previous test:\n    # - has a cofactor\n    # - has an alchemical swap present\n    # - runs in solvated protein\n    # if this passes 99.9% chance of a good time\n    s = openfe.protocols.openmm_rfe.RelativeHybridTopologyProtocol.default_settings()\n    s.simulation_settings.equilibration_length = 0.1 * offunit.picosecond\n    s.simulation_settings.production_length = 0.1 * offunit.picosecond\n    s.simulation_settings.time_per_iteration = 20 * offunit.femtosecond\n    s.forcefield_settings.nonbonded_cutoff = 0.8 * offunit.nanometer\n    s.partial_charge_settings.partial_charge_method = \"nagl\"\n    s.partial_charge_settings.nagl_model = \"openff-gnn-am1bcc-0.1.0-rc.3.pt\"\n    s.protocol_repeats = 1\n    s.output_settings.checkpoint_interval = 20 * offunit.femtosecond\n\n    p = openmm_rfe.RelativeHybridTopologyProtocol(s)\n\n    base_sys = {\n        \"protein\": eg5_protein,\n        \"cofactor\": eg5_cofactor,\n        \"solvent\": openfe.SolventComponent(),\n    }\n    # this is just a simple (unmapped) *-H -> *-F switch\n    l1, l2 = eg5_ligands[0], eg5_ligands[1]\n    m = openfe.LigandAtomMapping(\n        componentA=l1,\n        componentB=l2,\n        # a bit lucky, first 51 atoms map to each other, H->F swap is at 52\n        componentA_to_componentB={i: i for i in range(51)},\n    )\n\n    sys1 = openfe.ChemicalSystem(components={**base_sys, \"ligand\": l1})\n    sys2 = openfe.ChemicalSystem(components={**base_sys, \"ligand\": l2})\n\n    dag = p.create(stateA=sys1, stateB=sys2, mapping=[m])\n\n    r = execute_DAG(dag, shared_basedir=tmp_path, scratch_basedir=tmp_path, keep_shared=True)\n\n    assert r.ok()\n\n\n@pytest.mark.integration\n@pytest.mark.flaky(reruns=3)\ndef test_run_dodecahedron_sim(benzene_system, toluene_system, benzene_to_toluene_mapping, tmp_path):\n    \"\"\"\n    Test that we can run a ligand in solvent RFE with a non-cubic box\n    \"\"\"\n    settings = openmm_rfe.RelativeHybridTopologyProtocol.default_settings()\n    settings.solvation_settings.solvent_padding = 1.5 * offunit.nanometer\n    settings.solvation_settings.box_shape = \"dodecahedron\"\n    settings.protocol_repeats = 1\n    settings.simulation_settings.equilibration_length = 0.1 * offunit.picosecond\n    settings.simulation_settings.production_length = 0.1 * offunit.picosecond\n    settings.simulation_settings.time_per_iteration = 20 * offunit.femtosecond\n    settings.output_settings.checkpoint_interval = 20 * offunit.femtosecond\n    protocol = openmm_rfe.RelativeHybridTopologyProtocol(settings=settings)\n\n    dag = protocol.create(\n        stateA=benzene_system,\n        stateB=toluene_system,\n        mapping=benzene_to_toluene_mapping,\n    )\n\n    r = execute_DAG(\n        dag,\n        shared_basedir=tmp_path,\n        scratch_basedir=tmp_path,\n        keep_shared=True,\n    )\n\n    assert r.ok()\n"
  },
  {
    "path": "src/openfe/tests/protocols/openmm_rfe/test_hybrid_top_tokenization.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\n\nimport pytest\nfrom gufe.tests.test_tokenization import GufeTokenizableTestsMixin\nfrom openff.units import unit\n\nfrom openfe.protocols import openmm_rfe\nfrom openfe.protocols.openmm_rfe.hybridtop_units import (\n    HybridTopologyMultiStateAnalysisUnit,\n    HybridTopologyMultiStateSimulationUnit,\n    HybridTopologySetupUnit,\n)\n\n\"\"\"\ntodo:\n- RelativeHybridTopologyProtocolResult\n- RelativeHybridTopologyProtocol\n- RelativeHybridTopologyProtocolUnit\n\"\"\"\n\n\n@pytest.fixture\ndef rfe_protocol():\n    return openmm_rfe.RelativeHybridTopologyProtocol(\n        openmm_rfe.RelativeHybridTopologyProtocol.default_settings()\n    )\n\n\n@pytest.fixture\ndef rfe_protocol_other_input_units():\n    \"\"\"Identical to rfe_protocol, but with `kcal / mol` as input unit instead of `kilocalorie_per_mole`.\"\"\"\n    new_settings = openmm_rfe.RelativeHybridTopologyProtocol.default_settings()\n    new_settings.simulation_settings.early_termination_target_error = 0.0 * unit.kilocalorie/unit.mol  # fmt: skip\n    return openmm_rfe.RelativeHybridTopologyProtocol(new_settings)\n\n\n@pytest.fixture\ndef protocol_units(rfe_protocol, benzene_system, toluene_system, benzene_to_toluene_mapping):\n    pus = rfe_protocol.create(\n        stateA=benzene_system,\n        stateB=toluene_system,\n        mapping=[benzene_to_toluene_mapping],\n    )\n    return list(pus.protocol_units)\n\n\n@pytest.fixture\ndef protocol_setup_unit(protocol_units):\n    for pu in protocol_units:\n        if isinstance(pu, HybridTopologySetupUnit):\n            return pu\n\n\n@pytest.fixture\ndef protocol_simulation_unit(protocol_units):\n    for pu in protocol_units:\n        if isinstance(pu, HybridTopologyMultiStateSimulationUnit):\n            return pu\n\n\n@pytest.fixture\ndef protocol_analysis_unit(protocol_units):\n    for pu in protocol_units:\n        if isinstance(pu, HybridTopologyMultiStateAnalysisUnit):\n            return pu\n\n\n@pytest.mark.skip\nclass TestRelativeHybridTopologyProtocolResult(GufeTokenizableTestsMixin):\n    cls = openmm_rfe.RelativeHybridTopologyProtocolResult\n    repr = \"\"\n    key = \"\"\n\n    @pytest.fixture()\n    def instance(self):\n        pass\n\n\nclass TestRelativeHybridTopologyProtocolOtherInputUnits(GufeTokenizableTestsMixin):\n    cls = openmm_rfe.RelativeHybridTopologyProtocol\n    key = None\n    repr = \"<RelativeHybridTopologyProtocol-\"\n\n    @pytest.fixture()\n    def instance(self, rfe_protocol_other_input_units):\n        return rfe_protocol_other_input_units\n\n    def test_repr(self, instance):\n        \"\"\"\n        Overwrites the base `test_repr` call.\n        \"\"\"\n        assert isinstance(repr(instance), str)\n        assert self.repr in repr(instance)\n\n\nclass TestRelativeHybridTopologyProtocol(GufeTokenizableTestsMixin):\n    cls = openmm_rfe.RelativeHybridTopologyProtocol\n    key = None\n    repr = \"<RelativeHybridTopologyProtocol-\"\n\n    @pytest.fixture()\n    def instance(self, rfe_protocol):\n        return rfe_protocol\n\n    def test_repr(self, instance):\n        \"\"\"\n        Overwrites the base `test_repr` call.\n        \"\"\"\n        assert isinstance(repr(instance), str)\n        assert self.repr in repr(instance)\n\n\nclass TestHybridTopologySetupUnit(GufeTokenizableTestsMixin):\n    cls = openmm_rfe.HybridTopologySetupUnit\n    repr = \"HybridTopologySetupUnit(HybridTopology Setup:\"\n    key = None\n\n    @pytest.fixture()\n    def instance(self, protocol_setup_unit):\n        return protocol_setup_unit\n\n    def test_key_stable(self):\n        pytest.skip()\n\n    def test_repr(self, instance):\n        \"\"\"\n        Overwrites the base `test_repr` call.\n        \"\"\"\n        assert isinstance(repr(instance), str)\n        assert self.repr in repr(instance)\n\n\nclass TestHybridTopologyMultiStateSimulationUnit(GufeTokenizableTestsMixin):\n    cls = openmm_rfe.HybridTopologyMultiStateSimulationUnit\n    repr = \"HybridTopologyMultiStateSimulationUnit(HybridTopology Simulation:\"\n    key = None\n\n    @pytest.fixture()\n    def instance(self, protocol_simulation_unit):\n        return protocol_simulation_unit\n\n    def test_key_stable(self):\n        pytest.skip()\n\n    def test_repr(self, instance):\n        \"\"\"\n        Overwrites the base `test_repr` call.\n        \"\"\"\n        assert isinstance(repr(instance), str)\n        assert self.repr in repr(instance)\n\n\nclass TestHybridTopologyMultiStateAnalysisUnit(GufeTokenizableTestsMixin):\n    cls = openmm_rfe.HybridTopologyMultiStateAnalysisUnit\n    repr = \"HybridTopologyMultiStateAnalysisUnit(HybridTopology Analysis:\"\n    key = None\n\n    @pytest.fixture()\n    def instance(self, protocol_analysis_unit):\n        return protocol_analysis_unit\n\n    def test_key_stable(self):\n        pytest.skip()\n\n    def test_repr(self, instance):\n        \"\"\"\n        Overwrites the base `test_repr` call.\n        \"\"\"\n        assert isinstance(repr(instance), str)\n        assert self.repr in repr(instance)\n"
  },
  {
    "path": "src/openfe/tests/protocols/openmm_rfe/test_hybrid_top_validation.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\nimport logging\n\nimport pytest\nfrom openff.units import unit as offunit\n\nimport openfe\nfrom openfe import setup\nfrom openfe.protocols import openmm_rfe\n\n\n@pytest.fixture()\ndef vac_settings():\n    settings = openmm_rfe.RelativeHybridTopologyProtocol.default_settings()\n    settings.forcefield_settings.nonbonded_method = \"nocutoff\"\n    settings.engine_settings.compute_platform = None\n    settings.protocol_repeats = 1\n    return settings\n\n\n@pytest.fixture()\ndef solv_settings():\n    settings = openmm_rfe.RelativeHybridTopologyProtocol.default_settings()\n    settings.engine_settings.compute_platform = None\n    settings.protocol_repeats = 1\n    return settings\n\n\ndef test_invalid_protocol_repeats():\n    settings = openmm_rfe.RelativeHybridTopologyProtocol.default_settings()\n    with pytest.raises(ValueError, match=\"must be a positive value\"):\n        settings.protocol_repeats = -1\n\n\n@pytest.mark.parametrize(\"state\", [\"A\", \"B\"])\ndef test_endstate_two_alchemcomp_stateA(state, benzene_modifications):\n    first_state = openfe.ChemicalSystem(\n        {\n            \"ligandA\": benzene_modifications[\"benzene\"],\n            \"ligandB\": benzene_modifications[\"toluene\"],\n            \"solvent\": openfe.SolventComponent(),\n        }\n    )\n    other_state = openfe.ChemicalSystem(\n        {\n            \"ligandC\": benzene_modifications[\"phenol\"],\n            \"solvent\": openfe.SolventComponent(),\n        }\n    )\n\n    if state == \"A\":\n        args = (first_state, other_state)\n    else:\n        args = (other_state, first_state)\n\n    with pytest.raises(ValueError, match=\"Only one alchemical component\"):\n        openmm_rfe.RelativeHybridTopologyProtocol._validate_endstates(*args)\n\n\n@pytest.mark.parametrize(\"state\", [\"A\", \"B\"])\ndef test_endstates_not_smc(state, benzene_modifications):\n    first_state = openfe.ChemicalSystem(\n        {\n            \"ligand\": benzene_modifications[\"benzene\"],\n            \"foo\": openfe.SolventComponent(),\n        }\n    )\n    other_state = openfe.ChemicalSystem(\n        {\n            \"ligand\": benzene_modifications[\"benzene\"],\n            \"foo\": benzene_modifications[\"toluene\"],\n        }\n    )\n\n    if state == \"A\":\n        args = (first_state, other_state)\n    else:\n        args = (other_state, first_state)\n\n    errmsg = \"only SmallMoleculeComponents transformations\"\n    with pytest.raises(ValueError, match=errmsg):\n        openmm_rfe.RelativeHybridTopologyProtocol._validate_endstates(*args)\n\n\ndef test_validate_mapping_none_mapping():\n    errmsg = \"A single LigandAtomMapping is expected\"\n    with pytest.raises(ValueError, match=errmsg):\n        openmm_rfe.RelativeHybridTopologyProtocol._validate_mapping(None, None)\n\n\ndef test_validate_mapping_multi_mapping(benzene_to_toluene_mapping):\n    errmsg = \"A single LigandAtomMapping is expected\"\n    with pytest.raises(ValueError, match=errmsg):\n        openmm_rfe.RelativeHybridTopologyProtocol._validate_mapping(\n            [benzene_to_toluene_mapping] * 2, None\n        )\n\n\n@pytest.mark.parametrize(\"state\", [\"A\", \"B\"])\ndef test_validate_mapping_alchem_not_in(state, benzene_to_toluene_mapping):\n    errmsg = f\"not in alchemical components of state{state}\"\n\n    if state == \"A\":\n        alchem_comps = {\"stateA\": [], \"stateB\": [benzene_to_toluene_mapping.componentB]}\n    else:\n        alchem_comps = {\"stateA\": [benzene_to_toluene_mapping.componentA], \"stateB\": []}\n\n    with pytest.raises(ValueError, match=errmsg):\n        openmm_rfe.RelativeHybridTopologyProtocol._validate_mapping(\n            [benzene_to_toluene_mapping],\n            alchem_comps,\n        )\n\n\ndef test_vaccuum_PME_error(\n    benzene_vacuum_system, toluene_vacuum_system, benzene_to_toluene_mapping, solv_settings\n):\n    p = openmm_rfe.RelativeHybridTopologyProtocol(settings=solv_settings)\n\n    errmsg = \"PME cannot be used for vacuum transform\"\n    with pytest.raises(ValueError, match=errmsg):\n        p.validate(\n            stateA=benzene_vacuum_system,\n            stateB=toluene_vacuum_system,\n            mapping=benzene_to_toluene_mapping,\n        )\n\n\ndef test_multiple_basesolvents_error(a2a_protein_membrane_component, a2a_ligands, solv_settings):\n    p = openmm_rfe.RelativeHybridTopologyProtocol(settings=solv_settings)\n\n    errmsg = \"Multiple BaseSolventComponents found, only one is supported.\"\n    stateA = openfe.ChemicalSystem(\n        {\n            \"protein-membrane\": a2a_protein_membrane_component,\n            \"ligA\": a2a_ligands[0],\n            \"solvent\": openfe.SolventComponent(),\n        }\n    )\n    stateB = openfe.ChemicalSystem(\n        {\n            \"protein-membrane\": a2a_protein_membrane_component,\n            \"ligA\": a2a_ligands[1],\n            \"solvent\": openfe.SolventComponent(),\n        }\n    )\n    mapper = openfe.setup.LomapAtomMapper(element_change=False)\n\n    mapping = next(mapper.suggest_mappings(a2a_ligands[0], a2a_ligands[1]))\n    with pytest.raises(ValueError, match=errmsg):\n        p.validate(\n            stateA=stateA,\n            stateB=stateB,\n            mapping=mapping,\n        )\n\n\n@pytest.mark.parametrize(\"charge\", [None, \"gasteiger\"])\ndef test_smcs_same_charge_passes(charge, benzene_modifications):\n    benzene = benzene_modifications[\"benzene\"]\n    if charge is None:\n        smc = benzene\n    else:\n        offmol = benzene.to_openff()\n        offmol.assign_partial_charges(partial_charge_method=\"gasteiger\")\n        smc = openfe.SmallMoleculeComponent.from_openff(offmol)\n\n    # Just pass the same thing twice\n    state = openfe.ChemicalSystem({\"l\": smc})\n    openmm_rfe.RelativeHybridTopologyProtocol._validate_smcs(state, state)\n\n\ndef test_smcs_different_charges_none_not_none(benzene_modifications):\n    # smcA has no charges\n    smcA = benzene_modifications[\"benzene\"]\n\n    # smcB has charges\n    offmol = smcA.to_openff()\n    offmol.assign_partial_charges(partial_charge_method=\"gasteiger\")\n    smcB = openfe.SmallMoleculeComponent.from_openff(offmol)\n\n    state = openfe.ChemicalSystem({\"a\": smcA, \"b\": smcB})\n\n    errmsg = \"isomorphic but with different charges\"\n    with pytest.raises(ValueError, match=errmsg):\n        openmm_rfe.RelativeHybridTopologyProtocol._validate_smcs(state, state)\n\n\ndef test_smcs_different_charges_all(benzene_modifications):\n    offmol = benzene_modifications[\"benzene\"].to_openff()\n    offmol.assign_partial_charges(partial_charge_method=\"gasteiger\")\n    smcA = openfe.SmallMoleculeComponent.from_openff(offmol)\n\n    # now alter the offmol charges, scaling by 0.1\n    offmol.partial_charges *= 0.1\n    smcB = openfe.SmallMoleculeComponent.from_openff(offmol)\n\n    state = openfe.ChemicalSystem({\"l1\": smcA, \"l2\": smcB})\n\n    errmsg = \"isomorphic but with different charges\"\n    with pytest.raises(ValueError, match=errmsg):\n        openmm_rfe.RelativeHybridTopologyProtocol._validate_smcs(state, state)\n\n\ndef test_smcs_different_charges_different_endstates(benzene_modifications):\n    # This should just pass, the charge is different but only\n    # in the end states - which is an acceptable transformation.\n    offmol = benzene_modifications[\"benzene\"].to_openff()\n    offmol.assign_partial_charges(partial_charge_method=\"gasteiger\")\n    smcA = openfe.SmallMoleculeComponent.from_openff(offmol)\n\n    # now alter the offmol charges, scaling by 0.1\n    offmol.partial_charges *= 0.1\n    smcB = openfe.SmallMoleculeComponent.from_openff(offmol)\n\n    stateA = openfe.ChemicalSystem({\"l\": smcA})\n    stateB = openfe.ChemicalSystem({\"l\": smcB})\n\n    openmm_rfe.RelativeHybridTopologyProtocol._validate_smcs(stateA, stateB)\n\n\ndef test_solvent_nocutoff_error(\n    benzene_system,\n    toluene_system,\n    benzene_to_toluene_mapping,\n    vac_settings,\n):\n    p = openmm_rfe.RelativeHybridTopologyProtocol(settings=vac_settings)\n\n    errmsg = \"nocutoff cannot be used for solvent transformation\"\n\n    with pytest.raises(ValueError, match=errmsg):\n        p.validate(\n            stateA=benzene_system,\n            stateB=toluene_system,\n            mapping=benzene_to_toluene_mapping,\n        )\n\n\ndef test_nonwater_solvent_error(\n    benzene_modifications,\n    benzene_to_toluene_mapping,\n    solv_settings,\n):\n    solvent = openfe.SolventComponent(smiles=\"C\")\n    stateA = openfe.ChemicalSystem(\n        {\n            \"ligand\": benzene_modifications[\"benzene\"],\n            \"solvent\": solvent,\n        }\n    )\n\n    stateB = openfe.ChemicalSystem({\"ligand\": benzene_modifications[\"toluene\"], \"solvent\": solvent})\n\n    p = openmm_rfe.RelativeHybridTopologyProtocol(settings=solv_settings)\n\n    errmsg = \"Non water solvent is not currently supported\"\n\n    with pytest.raises(ValueError, match=errmsg):\n        p.validate(\n            stateA=stateA,\n            stateB=stateB,\n            mapping=benzene_to_toluene_mapping,\n        )\n\n\ndef test_too_many_solv_comps_error(\n    benzene_modifications,\n    benzene_to_toluene_mapping,\n    solv_settings,\n):\n    stateA = openfe.ChemicalSystem(\n        {\n            \"ligand\": benzene_modifications[\"benzene\"],\n            \"solvent!\": openfe.SolventComponent(neutralize=True),\n            \"solvent2\": openfe.SolventComponent(neutralize=False),\n        }\n    )\n\n    stateB = openfe.ChemicalSystem(\n        {\n            \"ligand\": benzene_modifications[\"toluene\"],\n            \"solvent!\": openfe.SolventComponent(neutralize=True),\n            \"solvent2\": openfe.SolventComponent(neutralize=False),\n        }\n    )\n\n    p = openmm_rfe.RelativeHybridTopologyProtocol(settings=solv_settings)\n\n    errmsg = \"Multiple SolventComponent found, only one is supported\"\n\n    with pytest.raises(ValueError, match=errmsg):\n        p.validate(\n            stateA=stateA,\n            stateB=stateB,\n            mapping=benzene_to_toluene_mapping,\n        )\n\n\ndef test_bad_solv_settings(\n    benzene_system,\n    toluene_system,\n    benzene_to_toluene_mapping,\n    solv_settings,\n):\n    \"\"\"\n    Test a case where the solvent settings would be wrong.\n    Not doing every cases since those are covered under\n    ``test_openmmutils.py``.\n    \"\"\"\n    solv_settings.solvation_settings.solvent_padding = 1.2 * offunit.nanometer\n    solv_settings.solvation_settings.number_of_solvent_molecules = 20\n\n    p = openmm_rfe.RelativeHybridTopologyProtocol(settings=solv_settings)\n\n    errmsg = \"Only one of solvent_padding, number_of_solvent_molecules,\"\n    with pytest.raises(ValueError, match=errmsg):\n        p.validate(stateA=benzene_system, stateB=toluene_system, mapping=benzene_to_toluene_mapping)\n\n\ndef test_too_many_prot_comps_error(\n    benzene_modifications,\n    benzene_to_toluene_mapping,\n    T4_protein_component,\n    eg5_protein,\n    solv_settings,\n):\n    stateA = openfe.ChemicalSystem(\n        {\n            \"ligand\": benzene_modifications[\"benzene\"],\n            \"solvent\": openfe.SolventComponent(),\n            \"protein1\": T4_protein_component,\n            \"protein2\": eg5_protein,\n        }\n    )\n\n    stateB = openfe.ChemicalSystem(\n        {\n            \"ligand\": benzene_modifications[\"toluene\"],\n            \"solvent\": openfe.SolventComponent(),\n            \"protein1\": T4_protein_component,\n            \"protein2\": eg5_protein,\n        }\n    )\n\n    p = openmm_rfe.RelativeHybridTopologyProtocol(settings=solv_settings)\n\n    errmsg = \"Multiple ProteinComponent found, only one is supported\"\n\n    with pytest.raises(ValueError, match=errmsg):\n        p.validate(\n            stateA=stateA,\n            stateB=stateB,\n            mapping=benzene_to_toluene_mapping,\n        )\n\n\ndef test_element_change_warning(atom_mapping_basic_test_files):\n    # check a mapping with element change gets rejected early\n    l1 = atom_mapping_basic_test_files[\"2-methylnaphthalene\"]\n    l2 = atom_mapping_basic_test_files[\"2-naftanol\"]\n\n    # We use the 'old' lomap defaults because the\n    # basic test files inputs we use aren't fully aligned\n    mapper = setup.LomapAtomMapper(\n        time=20, threed=True, max3d=1000.0, element_change=True, seed=\"\", shift=True\n    )\n\n    mapping = next(mapper.suggest_mappings(l1, l2))\n\n    alchem_comps = {\"stateA\": [l1], \"stateB\": [l2]}\n\n    with pytest.warns(UserWarning, match=\"Element change\"):\n        openmm_rfe.RelativeHybridTopologyProtocol._validate_mapping(\n            [mapping],\n            alchem_comps,\n        )\n\n\ndef test_charge_difference_no_corr(benzene_to_benzoic_mapping):\n    wmsg = (\n        \"A charge difference of 1 is observed between the end states. \"\n        \"No charge correction has been requested\"\n    )\n\n    with pytest.warns(UserWarning, match=wmsg):\n        openmm_rfe.RelativeHybridTopologyProtocol._validate_charge_difference(\n            benzene_to_benzoic_mapping,\n            \"pme\",\n            False,\n            openfe.SolventComponent(),\n        )\n\n\ndef test_charge_difference_no_solvent(benzene_to_benzoic_mapping):\n    errmsg = \"Cannot use explicit charge correction without solvent\"\n\n    with pytest.raises(ValueError, match=errmsg):\n        openmm_rfe.RelativeHybridTopologyProtocol._validate_charge_difference(\n            benzene_to_benzoic_mapping,\n            \"pme\",\n            True,\n            None,\n        )\n\n\ndef test_charge_difference_no_pme(benzene_to_benzoic_mapping):\n    errmsg = \"Explicit charge correction when not using PME\"\n\n    with pytest.raises(ValueError, match=errmsg):\n        openmm_rfe.RelativeHybridTopologyProtocol._validate_charge_difference(\n            benzene_to_benzoic_mapping,\n            \"nocutoff\",\n            True,\n            openfe.SolventComponent(),\n        )\n\n\ndef test_greater_than_one_charge_difference_error(aniline_to_benzoic_mapping):\n    errmsg = \"A charge difference of 2\"\n    with pytest.raises(ValueError, match=errmsg):\n        openmm_rfe.RelativeHybridTopologyProtocol._validate_charge_difference(\n            aniline_to_benzoic_mapping,\n            \"pme\",\n            True,\n            openfe.SolventComponent(),\n        )\n\n\n@pytest.mark.parametrize(\n    \"mapping_name,result\",\n    [\n        [\"benzene_to_toluene_mapping\", 0],\n        [\"benzene_to_benzoic_mapping\", 1],\n        [\"benzene_to_aniline_mapping\", -1],\n        [\"aniline_to_benzene_mapping\", 1],\n    ],\n)\ndef test_get_charge_difference(mapping_name, result, request, caplog):\n    mapping = request.getfixturevalue(mapping_name)\n    caplog.set_level(logging.INFO)\n\n    ion = r\"Na+\" if result == -1 else r\"Cl-\"\n    msg = (\n        f\"A charge difference of {result} is observed \"\n        \"between the end states. This will be addressed by \"\n        f\"transforming a water into a {ion} ion\"\n    )\n\n    openmm_rfe.RelativeHybridTopologyProtocol._validate_charge_difference(\n        mapping, \"pme\", True, openfe.SolventComponent()\n    )\n\n    if result != 0:\n        assert msg in caplog.text\n    else:\n        assert msg not in caplog.text\n\n\ndef test_hightimestep(\n    benzene_vacuum_system,\n    toluene_vacuum_system,\n    benzene_to_toluene_mapping,\n    vac_settings,\n):\n    vac_settings.forcefield_settings.hydrogen_mass = 1.0\n\n    p = openmm_rfe.RelativeHybridTopologyProtocol(settings=vac_settings)\n\n    errmsg = \"too large for hydrogen mass\"\n\n    with pytest.raises(ValueError, match=errmsg):\n        p.validate(\n            stateA=benzene_vacuum_system,\n            stateB=toluene_vacuum_system,\n            mapping=benzene_to_toluene_mapping,\n            extends=None,\n        )\n\n\ndef test_time_per_iteration_divmod(\n    benzene_vacuum_system,\n    toluene_vacuum_system,\n    benzene_to_toluene_mapping,\n    vac_settings,\n):\n    vac_settings.simulation_settings.time_per_iteration = 10 * offunit.ps\n    vac_settings.integrator_settings.timestep = 4 * offunit.ps\n\n    p = openmm_rfe.RelativeHybridTopologyProtocol(settings=vac_settings)\n\n    errmsg = \"does not evenly divide by the timestep\"\n\n    with pytest.raises(ValueError, match=errmsg):\n        p.validate(\n            stateA=benzene_vacuum_system,\n            stateB=toluene_vacuum_system,\n            mapping=benzene_to_toluene_mapping,\n            extends=None,\n        )\n\n\n@pytest.mark.parametrize(\"attribute\", [\"equilibration_length\", \"production_length\"])\ndef test_simsteps_not_timestep_divisible(\n    attribute,\n    benzene_vacuum_system,\n    toluene_vacuum_system,\n    benzene_to_toluene_mapping,\n    vac_settings,\n):\n    setattr(vac_settings.simulation_settings, attribute, 102 * offunit.fs)\n    p = openmm_rfe.RelativeHybridTopologyProtocol(settings=vac_settings)\n\n    errmsg = \"Simulation time not divisible by timestep\"\n\n    with pytest.raises(ValueError, match=errmsg):\n        p.validate(\n            stateA=benzene_vacuum_system,\n            stateB=toluene_vacuum_system,\n            mapping=benzene_to_toluene_mapping,\n            extends=None,\n        )\n\n\n@pytest.mark.parametrize(\"attribute\", [\"equilibration_length\", \"production_length\"])\ndef test_simsteps_not_mcstep_divisible(\n    attribute,\n    benzene_vacuum_system,\n    toluene_vacuum_system,\n    benzene_to_toluene_mapping,\n    vac_settings,\n):\n    setattr(vac_settings.simulation_settings, attribute, 102 * offunit.ps)\n    p = openmm_rfe.RelativeHybridTopologyProtocol(settings=vac_settings)\n\n    errmsg = \"should contain a number of steps divisible by the number of integrator timesteps\"\n\n    with pytest.raises(ValueError, match=errmsg):\n        p.validate(\n            stateA=benzene_vacuum_system,\n            stateB=toluene_vacuum_system,\n            mapping=benzene_to_toluene_mapping,\n            extends=None,\n        )\n\n\ndef test_checkpoint_interval_not_divisible_time_per_iter(\n    benzene_vacuum_system,\n    toluene_vacuum_system,\n    benzene_to_toluene_mapping,\n    vac_settings,\n):\n    vac_settings.output_settings.checkpoint_interval = 4 * offunit.ps\n    vac_settings.simulation_settings.time_per_iteration = 2.5 * offunit.ps\n    p = openmm_rfe.RelativeHybridTopologyProtocol(settings=vac_settings)\n\n    errmsg = \"does not evenly divide by the amount of time per state MCMC\"\n\n    with pytest.raises(ValueError, match=errmsg):\n        p.validate(\n            stateA=benzene_vacuum_system,\n            stateB=toluene_vacuum_system,\n            mapping=benzene_to_toluene_mapping,\n            extends=None,\n        )\n\n\n@pytest.mark.parametrize(\"attribute\", [\"positions_write_frequency\", \"velocities_write_frequency\"])\ndef test_pos_vel_write_frequency_not_divisible(\n    benzene_vacuum_system,\n    toluene_vacuum_system,\n    benzene_to_toluene_mapping,\n    attribute,\n    vac_settings,\n):\n    setattr(vac_settings.output_settings, attribute, 100.1 * offunit.picosecond)\n\n    p = openmm_rfe.RelativeHybridTopologyProtocol(settings=vac_settings)\n\n    errmsg = f\"The output settings' {attribute}\"\n    with pytest.raises(ValueError, match=errmsg):\n        p.validate(\n            stateA=benzene_vacuum_system,\n            stateB=toluene_vacuum_system,\n            mapping=benzene_to_toluene_mapping,\n            extends=None,\n        )\n\n\n@pytest.mark.parametrize(\n    \"attribute\", [\"real_time_analysis_interval\", \"real_time_analysis_interval\"]\n)\ndef test_real_time_analysis_not_divisible(\n    benzene_vacuum_system,\n    toluene_vacuum_system,\n    benzene_to_toluene_mapping,\n    attribute,\n    vac_settings,\n):\n    setattr(vac_settings.simulation_settings, attribute, 100.1 * offunit.picosecond)\n\n    p = openmm_rfe.RelativeHybridTopologyProtocol(settings=vac_settings)\n\n    errmsg = f\"The {attribute}\"\n    with pytest.raises(ValueError, match=errmsg):\n        p.validate(\n            stateA=benzene_vacuum_system,\n            stateB=toluene_vacuum_system,\n            mapping=benzene_to_toluene_mapping,\n            extends=None,\n        )\n\n\ndef test_n_replicas_not_n_windows(\n    benzene_vacuum_system,\n    toluene_vacuum_system,\n    benzene_to_toluene_mapping,\n    vac_settings,\n):\n    # For PR #125 we pin such that the number of lambda windows\n    # equals the numbers of replicas used - TODO: remove limitation\n    vac_settings.simulation_settings.n_replicas = 13\n    p = openmm_rfe.RelativeHybridTopologyProtocol(settings=vac_settings)\n\n    errmsg = \"Number of replicas in ``simulation_settings``:\"\n\n    with pytest.raises(ValueError, match=errmsg):\n        p.validate(\n            stateA=benzene_vacuum_system,\n            stateB=toluene_vacuum_system,\n            mapping=benzene_to_toluene_mapping,\n            extends=None,\n        )\n"
  },
  {
    "path": "src/openfe/tests/protocols/openmm_septop/__init__.py",
    "content": ""
  },
  {
    "path": "src/openfe/tests/protocols/openmm_septop/conftest.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\nimport gufe\nimport pytest\n\nfrom openfe.protocols.openmm_septop import SepTopProtocol\n\n\n@pytest.fixture()\ndef protocol_dry_settings():\n    # a set of settings for dry run tests\n    s = SepTopProtocol.default_settings()\n    s.engine_settings.compute_platform = None\n    s.protocol_repeats = 1\n    return s\n\n\n@pytest.fixture\ndef benzene_toluene_dag(\n    benzene_complex_system,\n    toluene_complex_system,\n    protocol_dry_settings,\n):\n    protocol = SepTopProtocol(settings=protocol_dry_settings)\n\n    return protocol.create(\n        stateA=benzene_complex_system,\n        stateB=toluene_complex_system,\n        mapping=None,\n    )\n"
  },
  {
    "path": "src/openfe/tests/protocols/openmm_septop/test_septop_protocol.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\nimport itertools\nimport json\nimport math\nimport pathlib\nfrom unittest import mock\n\nimport gufe\nimport mdtraj as md\nimport numpy as np\nimport openmm\nimport openmm.app\nimport openmm.unit\nimport pytest\nfrom numpy.testing import assert_allclose\nfrom openff.units import unit as offunit\nfrom openff.units.openmm import ensure_quantity, from_openmm, to_openmm\nfrom openmm import (\n    CustomBondForce,\n    CustomCompoundBondForce,\n    CustomNonbondedForce,\n    HarmonicAngleForce,\n    HarmonicBondForce,\n    MonteCarloBarostat,\n    MonteCarloMembraneBarostat,\n    NonbondedForce,\n    PeriodicTorsionForce,\n)\nfrom openmmtools.alchemy import AbsoluteAlchemicalFactory, AlchemicalRegion\nfrom openmmtools.multistate.multistatesampler import MultiStateSampler\n\nimport openfe.protocols.openmm_septop\nfrom openfe import ChemicalSystem, SolventComponent\nfrom openfe.protocols.openmm_septop import (\n    SepTopComplexAnalysisUnit,\n    SepTopComplexRunUnit,\n    SepTopComplexSetupUnit,\n    SepTopProtocol,\n    SepTopProtocolResult,\n    SepTopSolventAnalysisUnit,\n    SepTopSolventRunUnit,\n    SepTopSolventSetupUnit,\n)\nfrom openfe.protocols.openmm_utils.serialization import deserialize\nfrom openfe.protocols.restraint_utils.geometry.boresch import BoreschRestraintGeometry\nfrom openfe.tests.protocols.conftest import compute_energy\nfrom openfe.tests.protocols.openmm_ahfe.test_ahfe_protocol import (\n    _assert_num_forces,\n    _verify_alchemical_sterics_force_parameters,\n)\n\nfrom .utils import UNIT_TYPES, _get_units\n\nE_CHARGE = 1.602176634e-19 * openmm.unit.coulomb\nEPSILON0 = (\n    1e-6\n    * 8.8541878128e-12\n    / (openmm.unit.AVOGADRO_CONSTANT_NA * E_CHARGE**2)\n    * openmm.unit.farad\n    / openmm.unit.meter\n)\nONE_4PI_EPS0 = 1 / (4 * np.pi * EPSILON0) * EPSILON0.unit * 10.0  # nm -> angstrom\n\n\n@pytest.fixture()\ndef default_settings():\n    s = SepTopProtocol.default_settings()\n    return s\n\n\ndef test_create_default_protocol(default_settings):\n    # this is roughly how it should be created\n    protocol = SepTopProtocol(\n        settings=default_settings,\n    )\n    assert protocol\n    assert protocol.settings == default_settings\n\n\ndef test_serialize_protocol(default_settings):\n    protocol = SepTopProtocol(\n        settings=default_settings,\n    )\n\n    ser = protocol.to_dict()\n    ret = SepTopProtocol.from_dict(ser)\n    assert protocol == ret\n\n\ndef test_repeat_units(benzene_complex_system, toluene_complex_system, default_settings):\n    default_settings.protocol_repeats = 3\n    protocol = SepTopProtocol(\n        settings=default_settings,\n    )\n\n    dag = protocol.create(\n        stateA=benzene_complex_system,\n        stateB=toluene_complex_system,\n        mapping=None,\n    )\n\n    # 6 protocol unit, 3 per repeat\n    pus = list(dag.protocol_units)\n    assert len(pus) == 18\n\n    # Check info for each repeat\n    for phase in [\"solvent\", \"complex\"]:\n        setup = _get_units(pus, UNIT_TYPES[phase][\"setup\"])\n        sim = _get_units(pus, UNIT_TYPES[phase][\"sim\"])\n        analysis = _get_units(pus, UNIT_TYPES[phase][\"analysis\"])\n\n        # Should be 3 of each set\n        assert len(setup) == 3\n        assert len(sim) == 3\n        assert len(analysis) == 3\n\n        # check that the dag chain is correct\n        for analysis_pu in analysis:\n            repeat_id = analysis_pu.inputs[\"repeat_id\"]\n            setup_pu = [\n                s for s in setup if (s.inputs[\"repeat_id\"] == repeat_id) and (s.simtype == phase)\n            ][0]\n            sim_pu = [\n                s for s in sim if (s.inputs[\"repeat_id\"] == repeat_id) and (s.simtype == phase)\n            ][0]\n            assert analysis_pu.inputs[\"setup\"] == setup_pu\n            assert analysis_pu.inputs[\"simulation\"] == sim_pu\n            assert sim_pu.inputs[\"setup\"] == setup_pu\n\n\ndef test_create_independent_repeat_ids(\n    benzene_complex_system, toluene_complex_system, default_settings\n):\n    # if we create two dags each with 3 repeats, they should give 6 repeat_ids\n    # this allows multiple DAGs in flight for one Transformation that don't clash on gather\n    # Default protocol is 1 repeat, change to 3 repeats\n    default_settings.protocol_repeats = 3\n    protocol = SepTopProtocol(\n        settings=default_settings,\n    )\n\n    dags = []\n    for i in range(2):\n        dags.append(\n            protocol.create(\n                stateA=benzene_complex_system,\n                stateB=toluene_complex_system,\n                mapping=None,\n            )\n        )\n\n    repeat_ids = set()\n\n    for dag in dags:\n        # 3 repeats of 6 units\n        assert len(list(dag.protocol_units)) == 18\n        for u in dag.protocol_units:\n            repeat_ids.add(u.inputs[\"repeat_id\"])\n\n    # one uuid per repeat, so should equal 6\n    assert len(repeat_ids) == 6\n\n\n# Tests for the alchemical systems. This tests were modified from\n# femto (https://github.com/Psivant/femto/tree/main)\ndef compute_interaction_energy(\n    epsilon,\n    sigma,\n    charge,\n    distance,\n    lambda_vdw: float = 1.0,\n    lambda_charges: float = 1.0,\n):\n    r_electrostatics = distance\n    r_vdw = (0.5 * sigma**6 * (1.0 - lambda_vdw) + distance**6) ** (1.0 / 6.0)\n\n    return (\n        # vdw\n        4.0 * lambda_vdw * epsilon * ((sigma / r_vdw) ** 12 - (sigma / r_vdw) ** 6)\n        # electrostatics\n        + ONE_4PI_EPS0 * lambda_charges * charge / r_electrostatics\n    ) * openmm.unit.kilojoule_per_mole\n\n\n@pytest.fixture\ndef three_particle_system():\n    force = openmm.NonbondedForce()\n    force.setNonbondedMethod(openmm.NonbondedForce.NoCutoff)\n    force.setUseDispersionCorrection(False)\n\n    charges = 0.1, 0.2, -0.3\n    sigmas = 1.1, 1.2, 1.3\n    epsilons = 210, 220, 230\n\n    force.addParticle(charges[0], sigmas[0] * openmm.unit.angstrom, epsilons[0])\n    force.addParticle(charges[1], sigmas[1] * openmm.unit.angstrom, epsilons[1])\n    force.addParticle(charges[2], sigmas[2] * openmm.unit.angstrom, epsilons[2])\n\n    system = openmm.System()\n    system.addParticle(1.0)\n    system.addParticle(1.0)\n    system.addParticle(1.0)\n    system.addForce(force)\n\n    distances = [[0.0, 4.0, 3.0], [4.0, 0.0, 5.0], [3.0, 5.0, 0.0]]\n\n    def interaction_energy_fn(idx_a, idx_b, lambda_vdw: float = 1.0, lambda_charges: float = 1.0):\n        epsilon = np.sqrt(epsilons[idx_a] * epsilons[idx_b])\n        sigma = 0.5 * (sigmas[idx_a] + sigmas[idx_b])\n        charge = charges[idx_a] * charges[idx_b]\n\n        return compute_interaction_energy(\n            epsilon, sigma, charge, distances[idx_a][idx_b], lambda_vdw, lambda_charges\n        )\n\n    coords = (\n        np.array([[0.0, 0.0, 0.0], [distances[0][1], 0.0, 0.0], [0.0, distances[0][2], 0.0]])\n        * openmm.unit.angstrom\n    )\n\n    return system, coords, interaction_energy_fn\n\n\nclass TestNonbondedInteractions:\n    def test_one_ligand(self, three_particle_system):\n        \"\"\"Test scaling the nonbonded interactions of single particles.\"\"\"\n\n        system, coords, energy_fn = three_particle_system\n\n        factory = AbsoluteAlchemicalFactory(consistent_exceptions=False)\n        alchemical_region_A = AlchemicalRegion(alchemical_atoms=[0], name=\"A\")\n        alchemical_system = factory.create_alchemical_system(system, [alchemical_region_A])\n\n        energy_0 = compute_energy(\n            alchemical_system,\n            coords,\n            None,\n            {\n                \"lambda_sterics_A\": 1.0,\n                \"lambda_electrostatics_A\": 1.0,\n            },\n        )\n\n        # expect lig_1 + solvent, lig_1 + lig_2 and lig_2 + solvent\n        # interaction when\n        # lambda=0\n        expected_energy_0 = energy_fn(0, 2) + energy_fn(0, 1) + energy_fn(1, 2)\n        assert_allclose(energy_0, from_openmm(expected_energy_0), rtol=1e-05)\n\n        # expect only lig_2 + solvent interaction when lambda=1\n        energy_1 = compute_energy(\n            alchemical_system,\n            coords,\n            None,\n            {\n                \"lambda_sterics_A\": 0.0,\n                \"lambda_electrostatics_A\": 0.0,\n            },\n        )\n        expected_energy_1 = energy_fn(1, 2)\n        assert_allclose(energy_1, from_openmm(expected_energy_1), rtol=1e-05)\n\n        # expect all particles to interact but only lig - solvent interactions to be\n        # scaled\n        energy_05 = compute_energy(\n            alchemical_system,\n            coords,\n            None,\n            {\n                \"lambda_sterics_A\": 0.5,\n                \"lambda_electrostatics_A\": 0.5,\n            },\n        )\n        expected_energy_05 = energy_fn(1, 2) + energy_fn(0, 2, 0.5, 0.5) + energy_fn(0, 1, 0.5, 0.5)\n        assert_allclose(energy_05, from_openmm(expected_energy_05), rtol=1e-05)\n\n    def test_two_ligands(self, three_particle_system):\n        \"\"\"Test scaling the nonbonded interactions of single particles.\"\"\"\n\n        system, coords, energy_fn = three_particle_system\n\n        # Do it the openmm way\n        factory = AbsoluteAlchemicalFactory(consistent_exceptions=False)\n        alchemical_region_A = AlchemicalRegion(alchemical_atoms=[0], name=\"A\")\n        alchemical_region_B = AlchemicalRegion(alchemical_atoms=[1], name=\"B\")\n        alchemical_system = factory.create_alchemical_system(\n            system, [alchemical_region_A, alchemical_region_B]\n        )\n        energy_0 = compute_energy(\n            alchemical_system,\n            coords,\n            None,\n            {\n                \"lambda_sterics_A\": 1.0,\n                \"lambda_electrostatics_A\": 1.0,\n                \"lambda_sterics_B\": 0.0,\n                \"lambda_electrostatics_B\": 0.0,\n            },\n        )\n\n        # expect only lig_1 + solvent interaction when lambda=0\n        expected_energy_0 = energy_fn(0, 2)\n        assert_allclose(energy_0, from_openmm(expected_energy_0), rtol=1e-05)\n\n        # expect only lig_2 + solvent interaction when lambda=1\n        energy_1 = compute_energy(\n            alchemical_system,\n            coords,\n            None,\n            {\n                \"lambda_sterics_A\": 0.0,\n                \"lambda_electrostatics_A\": 0.0,\n                \"lambda_sterics_B\": 1.0,\n                \"lambda_electrostatics_B\": 1.0,\n            },\n        )\n        expected_energy_1 = energy_fn(1, 2)\n        assert_allclose(energy_1, from_openmm(expected_energy_1), rtol=1e-05)\n\n        # expect lig_1 + solvent and lig_2 + solvent interaction when lambda=0.5\n        # but no lig_1 + lig_2 interaction by default\n        energy_05 = compute_energy(\n            alchemical_system,\n            coords,\n            None,\n            {\n                \"lambda_sterics_A\": 0.5,\n                \"lambda_electrostatics_A\": 0.5,\n                \"lambda_sterics_B\": 0.5,\n                \"lambda_electrostatics_B\": 0.5,\n            },\n        )\n        expected_energy_05 = energy_fn(0, 2, 0.5, 0.5) + energy_fn(1, 2, 0.5, 0.5)\n        assert_allclose(energy_05, from_openmm(expected_energy_05), rtol=1e-05)\n\n    def test_two_ligands_charges(self, three_particle_system):\n        \"\"\"Test scaling the nonbonded interactions of single particles.\"\"\"\n\n        system, coords, energy_fn = three_particle_system\n\n        # Do it the openmm way\n        factory = AbsoluteAlchemicalFactory(consistent_exceptions=False)\n        alchemical_region_A = AlchemicalRegion(alchemical_atoms=[0], name=\"A\")\n        alchemical_region_B = AlchemicalRegion(alchemical_atoms=[1], name=\"B\")\n        alchemical_system = factory.create_alchemical_system(\n            system, [alchemical_region_A, alchemical_region_B]\n        )\n        energy = compute_energy(\n            alchemical_system,\n            coords,\n            None,\n            {\n                \"lambda_sterics_A\": 1.0,\n                \"lambda_electrostatics_A\": 0.8,\n                \"lambda_sterics_B\": 1.0,\n                \"lambda_electrostatics_B\": 0.2,\n            },\n        )\n        expected_energy = energy_fn(0, 2, 1.0, 0.8) + energy_fn(1, 2, 1.0, 0.2)\n\n        assert_allclose(energy, from_openmm(expected_energy), rtol=1e-05)\n\n\ndef test_dry_run_benzene_toluene(benzene_toluene_dag, tmp_path):\n    prot_units = list(benzene_toluene_dag.protocol_units)\n\n    assert len(prot_units) == 6\n\n    solv_setup_unit = [u for u in prot_units if isinstance(u, SepTopSolventSetupUnit)]\n    sol_run_unit = [u for u in prot_units if isinstance(u, SepTopSolventRunUnit)]\n    complex_setup_unit = [u for u in prot_units if isinstance(u, SepTopComplexSetupUnit)]\n    complex_run_unit = [u for u in prot_units if isinstance(u, SepTopComplexRunUnit)]\n    assert len(solv_setup_unit) == 1\n    assert len(sol_run_unit) == 1\n    assert len(complex_setup_unit) == 1\n    assert len(complex_run_unit) == 1\n\n    solv_setup_output = solv_setup_unit[0].run(\n        dry=True, scratch_basepath=tmp_path, shared_basepath=tmp_path\n    )\n    pdb = md.load_pdb(tmp_path / \"topology.pdb\")\n    assert pdb.n_atoms == 1762\n    central_atoms = np.array([[2, 19]], dtype=np.int32)\n    distance = md.compute_distances(pdb, central_atoms)[0][0]\n    assert np.isclose(distance, 0.8661)\n    pdb_file = openmm.app.pdbfile.PDBFile(str(solv_setup_output[\"topology\"]))\n    alchem_system = deserialize(solv_setup_output[\"system\"])\n    solv_sampler = sol_run_unit[0].run(\n        alchem_system,\n        pdb_file,\n        solv_setup_output[\"selection_indices\"],\n        dry=True,\n        scratch_basepath=tmp_path,\n        shared_basepath=tmp_path,\n    )[\"sampler\"]  # fmt: skip\n\n    assert solv_sampler.is_periodic\n    assert isinstance(solv_sampler, MultiStateSampler)\n    assert isinstance(solv_sampler._thermodynamic_states[0].barostat, MonteCarloBarostat)\n    assert solv_sampler._thermodynamic_states[1].pressure == 1 * openmm.unit.bar\n    # Check we have the right number of atoms in the PDB\n    pdb = md.load_pdb(tmp_path / \"alchemical_system.pdb\")\n    assert pdb.n_atoms == 31\n\n    # Test the solvent system\n    assert len(alchem_system.getForces()) == 14\n    _assert_num_forces(alchem_system, NonbondedForce, 1)\n    _assert_num_forces(alchem_system, CustomNonbondedForce, 4)\n    _assert_num_forces(alchem_system, CustomBondForce, 4)\n    _assert_num_forces(alchem_system, HarmonicBondForce, 2)\n    _assert_num_forces(alchem_system, HarmonicAngleForce, 1)\n    _assert_num_forces(alchem_system, PeriodicTorsionForce, 1)\n    _assert_num_forces(alchem_system, MonteCarloBarostat, 1)\n\n    # Check steric forces\n    for f in alchem_system.getForces():\n        if isinstance(f, CustomNonbondedForce) and \"U_sterics\" in f.getEnergyFunction():\n            _verify_alchemical_sterics_force_parameters(f)\n\n    complex_setup_output = complex_setup_unit[0].run(\n        dry=True, scratch_basepath=tmp_path, shared_basepath=tmp_path\n    )\n    pdb_file = openmm.app.pdbfile.PDBFile(str(complex_setup_output[\"topology\"]))\n    alchem_system = deserialize(complex_setup_output[\"system\"])\n    complex_sampler = complex_run_unit[0].run(\n        alchem_system,\n        pdb_file,\n        complex_setup_output[\"selection_indices\"],\n        dry=True,\n        scratch_basepath=tmp_path,\n        shared_basepath=tmp_path,\n    )[\"sampler\"]  # fmt: skip\n\n    assert complex_sampler.is_periodic\n    assert isinstance(complex_sampler, MultiStateSampler)\n    assert isinstance(complex_sampler._thermodynamic_states[0].barostat, MonteCarloBarostat)\n    assert complex_sampler._thermodynamic_states[1].pressure == 1 * openmm.unit.bar\n    # Check we have the right number of atoms in the PDB\n    pdb = md.load_pdb(tmp_path / \"alchemical_system.pdb\")\n    assert pdb.n_atoms == 2687\n\n    # Test the complex system\n    assert len(alchem_system.getForces()) == 15\n    _assert_num_forces(alchem_system, NonbondedForce, 1)\n    _assert_num_forces(alchem_system, CustomNonbondedForce, 4)\n    _assert_num_forces(alchem_system, CustomBondForce, 4)\n    _assert_num_forces(alchem_system, HarmonicBondForce, 1)\n    _assert_num_forces(alchem_system, HarmonicAngleForce, 1)\n    _assert_num_forces(alchem_system, PeriodicTorsionForce, 1)\n    _assert_num_forces(alchem_system, CustomCompoundBondForce, 2)\n    _assert_num_forces(alchem_system, MonteCarloBarostat, 1)\n\n    # Check steric forces\n    for f in alchem_system.getForces():\n        if isinstance(f, CustomNonbondedForce) and \"U_sterics\" in f.getEnergyFunction():\n            _verify_alchemical_sterics_force_parameters(f)\n\n\n@pytest.mark.parametrize(\"method\", [\"repex\", \"sams\", \"independent\"])\ndef test_dry_run_methods(\n    benzene_complex_system,\n    toluene_complex_system,\n    tmp_path,\n    protocol_dry_settings,\n    method,\n):\n    protocol_dry_settings.solvent_simulation_settings.sampler_method = method\n    protocol_dry_settings.complex_simulation_settings.sampler_method = method\n    protocol_dry_settings.complex_output_settings.output_indices = \"resname UNK\"\n    protocol_dry_settings.solvent_output_settings.output_indices = \"resname UNK\"\n\n    protocol = SepTopProtocol(\n        settings=protocol_dry_settings,\n    )\n    dag = protocol.create(\n        stateA=benzene_complex_system,\n        stateB=toluene_complex_system,\n        mapping=None,\n    )\n    dag_units = list(dag.protocol_units)\n    # Only check the cutoff for the Solvent SetUp Unit\n    solv_setup_unit = [u for u in dag_units if isinstance(u, SepTopSolventSetupUnit)]\n    sol_run_unit = [u for u in dag_units if isinstance(u, SepTopSolventRunUnit)]\n\n    solv_setup_output = solv_setup_unit[0].run(\n        dry=True, scratch_basepath=tmp_path, shared_basepath=tmp_path\n    )\n    pdb_file = openmm.app.pdbfile.PDBFile(str(solv_setup_output[\"topology\"]))\n    alchem_system = deserialize(solv_setup_output[\"system\"])\n    solv_sampler = sol_run_unit[0].run(\n        alchem_system,\n        pdb_file,\n        solv_setup_output[\"selection_indices\"],\n        dry=True,\n        scratch_basepath=tmp_path,\n        shared_basepath=tmp_path,\n    )[\"sampler\"]  # fmt: skip\n\n    assert isinstance(solv_sampler, MultiStateSampler)\n    assert solv_sampler.is_periodic\n    assert isinstance(solv_sampler._thermodynamic_states[0].barostat, MonteCarloBarostat)\n    assert solv_sampler._thermodynamic_states[1].pressure == 1 * openmm.unit.bar\n\n    # Check we have the right number of atoms in the PDB\n    pdb = md.load_pdb(tmp_path / \"alchemical_system.pdb\")\n    assert pdb.n_atoms == 27\n\n\n@pytest.mark.parametrize(\n    \"pressure\",\n    [\n        1.0,\n        0.9,\n        1.1,\n    ],\n)\ndef test_dry_run_ligand_system_pressure(\n    pressure,\n    benzene_complex_system,\n    toluene_complex_system,\n    tmp_path,\n    protocol_dry_settings,\n):\n    \"\"\"\n    Test that the right nonbonded cutoff is propagated to the system.\n    \"\"\"\n    # openfe settings requires openff/pint units\n    protocol_dry_settings.thermo_settings.pressure = pressure * offunit.bar\n\n    protocol = SepTopProtocol(\n        settings=protocol_dry_settings,\n    )\n    dag = protocol.create(\n        stateA=benzene_complex_system,\n        stateB=toluene_complex_system,\n        mapping=None,\n    )\n    dag_units = list(dag.protocol_units)\n    # Only check the cutoff for the Solvent SetUp Unit\n    solv_setup_unit = [u for u in dag_units if isinstance(u, SepTopSolventSetupUnit)]\n    sol_run_unit = [u for u in dag_units if isinstance(u, SepTopSolventRunUnit)]\n\n    solv_setup_output = solv_setup_unit[0].run(\n        dry=True, scratch_basepath=tmp_path, shared_basepath=tmp_path\n    )\n    pdb_file = openmm.app.pdbfile.PDBFile(str(solv_setup_output[\"topology\"]))\n    alchem_system = deserialize(solv_setup_output[\"system\"])\n    solv_sampler = sol_run_unit[0].run(\n        alchem_system,\n        pdb_file,\n        solv_setup_output[\"selection_indices\"],\n        dry=True,\n        scratch_basepath=tmp_path,\n        shared_basepath=tmp_path,\n    )[\"sampler\"]  # fmt: skip\n\n    # at this point, the units will be in openmm units\n    assert solv_sampler._thermodynamic_states[1].pressure == pressure * openmm.unit.bar\n\n\ndef test_virtual_sites_no_reassign(\n    benzene_complex_system,\n    toluene_complex_system,\n    tmp_path,\n    protocol_dry_settings,\n):\n    \"\"\"\n    Test that an error is raised when not reassigning velocities\n    in a system with virtual site.\n    \"\"\"\n    protocol_dry_settings.forcefield_settings.forcefields = [\n        \"amber/ff14SB.xml\",\n        \"amber/tip4pew_standard.xml\",  # FF with VS\n    ]\n    protocol_dry_settings.solvent_solvation_settings.solvent_model = \"tip4pew\"\n    protocol_dry_settings.solvent_integrator_settings.reassign_velocities = False\n\n    protocol = SepTopProtocol(\n        settings=protocol_dry_settings,\n    )\n    dag = protocol.create(\n        stateA=benzene_complex_system,\n        stateB=toluene_complex_system,\n        mapping=None,\n    )\n    dag_units = list(dag.protocol_units)\n    # Only check the Solvent Unit\n    solv_setup_unit = [u for u in dag_units if isinstance(u, SepTopSolventSetupUnit)]\n    solv_run_unit = [u for u in dag_units if isinstance(u, SepTopSolventRunUnit)]\n\n    setup_results = solv_setup_unit[0].run(\n        dry=True,\n        scratch_basepath=tmp_path,\n        shared_basepath=tmp_path,\n    )\n\n    pdb_file = openmm.app.pdbfile.PDBFile(str(setup_results[\"topology\"]))\n\n    with pytest.raises(ValueError, match=\"are unstable\"):\n        _ = solv_run_unit[0].run(\n            setup_results[\"alchem_system\"],\n            pdb_file,\n            setup_results[\"selection_indices\"],\n            dry=True,\n            scratch_basepath=tmp_path,\n            shared_basepath=tmp_path,\n        )  # fmt: skip\n\n\n@pytest.mark.parametrize(\n    \"cutoff\",\n    [1.0 * offunit.nanometer, 12.0 * offunit.angstrom, 0.9 * offunit.nanometer],\n)\ndef test_dry_run_ligand_system_cutoff(\n    cutoff,\n    benzene_complex_system,\n    toluene_complex_system,\n    tmp_path,\n    protocol_dry_settings,\n):\n    \"\"\"\n    Test that the right nonbonded cutoff is propagated to the system.\n    \"\"\"\n    protocol_dry_settings.solvent_solvation_settings.solvent_padding = 1.9 * offunit.nanometer\n    protocol_dry_settings.forcefield_settings.nonbonded_cutoff = cutoff\n\n    protocol = SepTopProtocol(\n        settings=protocol_dry_settings,\n    )\n    dag = protocol.create(\n        stateA=benzene_complex_system,\n        stateB=toluene_complex_system,\n        mapping=None,\n    )\n    dag_units = list(dag.protocol_units)\n    # Only check the cutoff for the Solvent SetUp Unit\n    solv_setup_unit = [u for u in dag_units if isinstance(u, SepTopSolventSetupUnit)]\n\n    serialized_system = solv_setup_unit[0].run(\n        dry=True, scratch_basepath=tmp_path, shared_basepath=tmp_path\n    )[\"system\"]\n    system = deserialize(serialized_system)\n    nbfs = [\n        f\n        for f in system.getForces()\n        if isinstance(f, CustomNonbondedForce) or isinstance(f, NonbondedForce)\n    ]\n\n    for f in nbfs:\n        f_cutoff = from_openmm(f.getCutoffDistance())\n        assert f_cutoff == cutoff\n\n\ndef test_dry_run_benzene_toluene_tip4p(\n    benzene_complex_system,\n    toluene_complex_system,\n    tmp_path,\n    protocol_dry_settings,\n):\n    protocol_dry_settings.forcefield_settings.forcefields = [\n        \"amber/ff14SB.xml\",  # ff14SB protein force field\n        \"amber/tip4pew_standard.xml\",  # FF we are testing with the fun VS\n        \"amber/phosaa10.xml\",  # Handles THE TPO\n    ]\n    protocol_dry_settings.solvent_solvation_settings.solvent_model = \"tip4pew\"\n    protocol_dry_settings.solvent_integrator_settings.reassign_velocities = True\n\n    protocol = SepTopProtocol(settings=protocol_dry_settings)\n\n    # Create DAG from protocol, get the solvent units\n    # and eventually dry run the first solvent unit\n    dag = protocol.create(\n        stateA=benzene_complex_system,\n        stateB=toluene_complex_system,\n        mapping=None,\n    )\n\n    prot_units = list(dag.protocol_units)\n\n    assert len(prot_units) == 6\n\n    solv_setup_unit = [u for u in prot_units if isinstance(u, SepTopSolventSetupUnit)]\n    sol_run_unit = [u for u in prot_units if isinstance(u, SepTopSolventRunUnit)]\n\n    assert len(solv_setup_unit) == 1\n    assert len(sol_run_unit) == 1\n\n    solv_setup_output = solv_setup_unit[0].run(\n        dry=True, scratch_basepath=tmp_path, shared_basepath=tmp_path\n    )\n    pdb_file = openmm.app.pdbfile.PDBFile(str(solv_setup_output[\"topology\"]))\n    alchem_system = deserialize(solv_setup_output[\"system\"])\n    solv_run = sol_run_unit[0].run(\n        alchem_system,\n        pdb_file,\n        solv_setup_output[\"selection_indices\"],\n        dry=True,\n        scratch_basepath=tmp_path,\n        shared_basepath=tmp_path,\n    )[\"sampler\"]  # fmt: skip\n\n    assert solv_run.is_periodic\n\n\ndef test_dry_run_benzene_toluene_noncubic(\n    benzene_complex_system,\n    toluene_complex_system,\n    tmp_path,\n    protocol_dry_settings,\n):\n    protocol_dry_settings.solvent_solvation_settings.solvent_padding = 1.5 * offunit.nanometer\n    protocol_dry_settings.solvent_solvation_settings.box_shape = \"dodecahedron\"\n\n    protocol = SepTopProtocol(settings=protocol_dry_settings)\n\n    # Create DAG from protocol, get the vacuum and solvent units\n    # and eventually dry run the first solvent unit\n    dag = protocol.create(\n        stateA=benzene_complex_system,\n        stateB=toluene_complex_system,\n        mapping=None,\n    )\n\n    prot_units = list(dag.protocol_units)\n\n    assert len(prot_units) == 6\n\n    solv_setup_unit = [u for u in prot_units if isinstance(u, SepTopSolventSetupUnit)]\n\n    assert len(solv_setup_unit) == 1\n\n    solv_setup_output = solv_setup_unit[0].run(\n        dry=True, scratch_basepath=tmp_path, shared_basepath=tmp_path\n    )\n    serialized_system = solv_setup_output[\"system\"]\n    system = deserialize(serialized_system)\n    vectors = system.getDefaultPeriodicBoxVectors()\n    width = float(from_openmm(vectors)[0][0].to(\"nanometer\").m)\n\n    # dodecahedron has the following shape:\n    # [width, 0, 0], [0, width, 0], [0.5, 0.5, 0.5 * sqrt(2)] * width\n\n    expected_vectors = [\n        [width, 0, 0],\n        [0, width, 0],\n        [0.5 * width, 0.5 * width, 0.5 * math.sqrt(2) * width],\n    ] * offunit.nanometer\n    assert_allclose(\n        expected_vectors,\n        from_openmm(vectors),\n    )\n\n\ndef test_dry_run_solv_user_charges_benzene_toluene(\n    benzene_modifications,\n    T4_protein_component,\n    tmp_path,\n    protocol_dry_settings,\n):\n    \"\"\"\n    Create a test system with fictitious user supplied charges and\n    ensure that they are properly passed through to the constructed\n    alchemical system.\n    \"\"\"\n    protocol = SepTopProtocol(settings=protocol_dry_settings)\n\n    def assign_fictitious_charges(offmol):\n        \"\"\"\n        Get a random array of fake partial charges for your offmol.\n        \"\"\"\n        rand_arr = np.random.randint(1, 10, size=offmol.n_atoms) / 100\n        rand_arr[-1] = -sum(rand_arr[:-1])\n        return rand_arr * offunit.elementary_charge\n\n    def check_partial_charges(offmol):\n        offmol_pchgs = assign_fictitious_charges(offmol)\n        offmol.partial_charges = offmol_pchgs\n        smc = openfe.SmallMoleculeComponent.from_openff(offmol)\n\n        # check propchgs\n        prop_chgs = smc.to_dict()[\"molprops\"][\"atom.dprop.PartialCharge\"]\n        prop_chgs = np.array(prop_chgs.split(), dtype=float)\n        np.testing.assert_allclose(prop_chgs, offmol_pchgs)\n        return smc, prop_chgs\n\n    benzene_offmol = benzene_modifications[\"benzene\"].to_openff()\n    toluene_offmol = benzene_modifications[\"toluene\"].to_openff()\n\n    benzene_smc, benzene_charge = check_partial_charges(benzene_offmol)\n    toluene_smc, toluene_charge = check_partial_charges(toluene_offmol)\n\n    # Create ChemicalSystems\n    stateA = ChemicalSystem(\n        {\n            \"benzene\": benzene_smc,\n            \"T4l\": T4_protein_component,\n            \"solvent\": SolventComponent(),\n        }\n    )\n\n    stateB = ChemicalSystem(\n        {\n            \"toluene\": toluene_smc,\n            \"T4l\": T4_protein_component,\n            \"solvent\": SolventComponent(),\n        }\n    )\n\n    # Create DAG from protocol, get the vacuum and solvent units\n    # and eventually dry run the first solvent unit\n    dag = protocol.create(\n        stateA=stateA,\n        stateB=stateB,\n        mapping=None,\n    )\n    prot_units = list(dag.protocol_units)\n\n    solv_setup_unit = [u for u in prot_units if isinstance(u, SepTopSolventSetupUnit)]\n    complex_setup_unit = [u for u in prot_units if isinstance(u, SepTopComplexSetupUnit)]\n\n    # check sol_unit charges\n    serialized_system = solv_setup_unit[0].run(\n        dry=True, scratch_basepath=tmp_path, shared_basepath=tmp_path\n    )[\"system\"]\n    system = deserialize(serialized_system)\n    nonbond = [f for f in system.getForces() if isinstance(f, openmm.NonbondedForce)]\n    assert len(nonbond) == 1\n\n    # loop through the 12 benzene atoms\n    # partial charge is stored in the offset\n    for i in range(12):\n        offsets = nonbond[0].getParticleParameterOffset(i)\n        c = ensure_quantity(offsets[2], \"openff\")\n        assert pytest.approx(c) == benzene_charge[i]\n    # loop through 15 toluene atoms\n    for inx, i in enumerate(range(12, 27)):\n        offsets = nonbond[0].getParticleParameterOffset(i)\n        c = ensure_quantity(offsets[2], \"openff\")\n        assert pytest.approx(c) == toluene_charge[inx]\n\n    # check complex_unit charges\n    serialized_system = complex_setup_unit[0].run(\n        dry=True, scratch_basepath=tmp_path, shared_basepath=tmp_path\n    )[\"system\"]\n    system = deserialize(serialized_system)\n    nonbond = [f for f in system.getForces() if isinstance(f, openmm.NonbondedForce)]\n    assert len(nonbond) == 1\n\n    # loop through the 12 benzene atoms\n    # partial charge is stored in the offset\n    for i in range(12):\n        offsets = nonbond[0].getParticleParameterOffset(i)\n        c = ensure_quantity(offsets[2], \"openff\")\n        assert pytest.approx(c) == benzene_charge[i]\n    # loop through 15 toluene atoms\n    for inx, i in enumerate(range(12, 27)):\n        offsets = nonbond[0].getParticleParameterOffset(i)\n        c = ensure_quantity(offsets[2], \"openff\")\n        assert pytest.approx(c) == toluene_charge[inx]\n\n\ndef test_high_timestep(\n    benzene_complex_system,\n    toluene_complex_system,\n    tmp_path,\n    protocol_dry_settings,\n):\n    protocol_dry_settings.forcefield_settings.hydrogen_mass = 1.0\n    protocol_dry_settings.forcefield_settings.hydrogen_mass = 1.0\n\n    protocol = SepTopProtocol(settings=protocol_dry_settings)\n\n    dag = protocol.create(\n        stateA=benzene_complex_system,\n        stateB=toluene_complex_system,\n        mapping=None,\n    )\n    prot_units = list(dag.protocol_units)\n\n    errmsg = \"too large for hydrogen mass\"\n    with pytest.raises(ValueError, match=errmsg):\n        prot_units[0].run(dry=True, scratch_basepath=tmp_path, shared_basepath=tmp_path)\n\n\ndef test_bad_sampler():\n    class FakeSimSettings(gufe.settings.SettingsBaseModel):\n        sampler_method: str = \"foo bar\"\n\n    errmsg = \"Unknown sampler foo bar\"\n    with pytest.raises(AttributeError, match=errmsg):\n        SepTopSolventRunUnit._get_sampler(\n            integrator=None,\n            reporter=None,\n            simulation_settings=FakeSimSettings(),\n            thermodynamic_settings=None,\n            compound_states=None,\n            sampler_states=None,\n            platform=None,\n            restart=False,\n        )\n\n\n@pytest.fixture\ndef T4L_xml(\n    benzene_complex_system,\n    toluene_complex_system,\n    tmp_path_factory,\n    protocol_dry_settings,\n):\n    # Fixing the number of solvent molecules in the solvent settings\n    # to test against reference xml\n    protocol_dry_settings.solvent_solvation_settings.solvent_padding = None\n    protocol_dry_settings.solvent_solvation_settings.number_of_solvent_molecules = 364\n    protocol_dry_settings.forcefield_settings.small_molecule_forcefield = \"openff-2.1.1\"\n    protocol = SepTopProtocol(settings=protocol_dry_settings)\n\n    dag = protocol.create(\n        stateA=benzene_complex_system,\n        stateB=toluene_complex_system,\n        mapping=None,\n    )\n    # Get the SepTopSolventSetupUnit\n    prot_units = list(dag.protocol_units)\n    solv_setup_unit = [u for u in prot_units if isinstance(u, SepTopSolventSetupUnit)]\n\n    tmp = tmp_path_factory.mktemp(\"xml_reg\")\n\n    dryrun = solv_setup_unit[0].run(dry=True, shared_basepath=tmp)\n\n    system = dryrun[\"system\"]\n    return deserialize(system)\n\n\nclass TestT4LXmlRegression:\n    \"\"\"Generates SepTop system XML (solvent) and performs regression test\"\"\"\n\n    @staticmethod\n    def test_particles(T4L_xml, T4L_septop_reference_xml):\n        nr_particles = T4L_xml.getNumParticles()\n        nr_particles_ref = T4L_septop_reference_xml.getNumParticles()\n        assert nr_particles == nr_particles_ref\n        particle_masses = [T4L_xml.getParticleMass(i) for i in range(nr_particles)]\n        particle_masses_ref = [\n            T4L_septop_reference_xml.getParticleMass(i) for i in range(nr_particles)\n        ]\n        assert particle_masses\n\n        for a, b in zip(particle_masses, particle_masses_ref):\n            assert a == b\n\n    @staticmethod\n    def test_constraints(T4L_xml, T4L_septop_reference_xml):\n        nr_constraints = T4L_xml.getNumConstraints()\n        nr_constraints_ref = T4L_septop_reference_xml.getNumConstraints()\n        assert nr_constraints == nr_constraints_ref\n        constraints = [T4L_xml.getConstraintParameters(i) for i in range(nr_constraints)]\n        constraints_ref = [\n            T4L_septop_reference_xml.getConstraintParameters(i) for i in range(nr_constraints)\n        ]\n        assert constraints\n\n        for a, b in zip(constraints, constraints_ref):\n            # Particle 1\n            assert a[0] == b[0]\n            # Particle 2\n            assert a[1] == b[1]\n            # Constraint Quantity\n            assert a[2] == b[2]\n\n\n@pytest.mark.slow\nclass TestA2AMembraneDryRun:\n    solvent = SolventComponent(ion_concentration=0 * offunit.molar)\n    num_all_not_water = 16116\n    num_complex_atoms = 39462\n    num_ligand_atoms_A = 36\n    num_ligand_atoms_B = 36\n\n    @pytest.fixture(scope=\"class\")\n    def settings(self):\n        s = SepTopProtocol.default_settings()\n        s.protocol_repeats = 1\n        s.engine_settings.compute_platform = \"cpu\"\n        s.complex_output_settings.output_indices = \"not water\"\n        s.complex_solvation_settings.box_shape = \"dodecahedron\"\n        s.complex_solvation_settings.solvent_padding = 0.9 * offunit.nanometer\n        s.solvent_solvation_settings.box_shape = \"cube\"\n        return s\n\n    @pytest.fixture(scope=\"function\")\n    def dag(self, settings, a2a_ligands, a2a_protein_membrane_component):\n        stateA = ChemicalSystem(\n            {\n                \"ligandA\": a2a_ligands[0],\n                \"protein\": a2a_protein_membrane_component,\n                \"solvent\": self.solvent,\n            }\n        )\n\n        stateB = ChemicalSystem(\n            {\n                \"ligandB\": a2a_ligands[1],\n                \"protein\": a2a_protein_membrane_component,\n                \"solvent\": self.solvent,\n            }\n        )\n\n        # adaptive settings\n        protocol_settings = SepTopProtocol._adaptive_settings(\n            stateA=stateA,\n            stateB=stateB,\n            initial_settings=settings,\n        )\n        protocol = SepTopProtocol(settings=protocol_settings)\n\n        return protocol.create(\n            stateA=stateA,\n            stateB=stateB,\n            mapping=None,\n        )\n\n    @pytest.fixture(scope=\"function\")\n    def complex_setup_units(self, dag):\n        return [u for u in dag.protocol_units if isinstance(u, SepTopComplexSetupUnit)]\n\n    @pytest.fixture(scope=\"function\")\n    def complex_run_units(self, dag):\n        return [u for u in dag.protocol_units if isinstance(u, SepTopComplexRunUnit)]\n\n    @pytest.fixture(scope=\"function\")\n    def complex_analysis_unit(self, dag):\n        return [u for u in dag.protocol_units if isinstance(u, SepTopComplexAnalysisUnit)]\n\n    @pytest.fixture(scope=\"function\")\n    def solvent_setup_units(self, dag):\n        return [u for u in dag.protocol_units if isinstance(u, SepTopSolventSetupUnit)]\n\n    @pytest.fixture(scope=\"function\")\n    def solvent_run_units(self, dag):\n        return [u for u in dag.protocol_units if isinstance(u, SepTopSolventRunUnit)]\n\n    @pytest.fixture(scope=\"function\")\n    def solvent_analysis_unit(self, dag):\n        return [u for u in dag.protocol_units if isinstance(u, SepTopSolventAnalysisUnit)]\n\n    def test_number_of_units(\n        self, dag, complex_setup_units, complex_run_units, solvent_setup_units, solvent_run_units\n    ):\n        assert len(list(dag.protocol_units)) == 6\n        assert len(complex_setup_units) == 1\n        assert len(complex_run_units) == 1\n        assert len(solvent_setup_units) == 1\n        assert len(solvent_run_units) == 1\n\n    def _assert_force_num(self, system, forcetype, number):\n        forces = [f for f in system.getForces() if isinstance(f, forcetype)]\n        assert len(forces) == number\n\n    def _assert_expected_alchemical_forces(self, system, complexed: bool, settings):\n        \"\"\"\n        Assert the forces expected in the alchemical system.\n        \"\"\"\n        if complexed:\n            barostat_type = MonteCarloMembraneBarostat\n            self._assert_force_num(system, HarmonicBondForce, 1)\n            # Two custom bonds for the two Boresch restraints\n            self._assert_force_num(system, CustomCompoundBondForce, 2)\n            assert len(system.getForces()) == 15\n        else:\n            # Extra bond in the solvent\n            self._assert_force_num(system, HarmonicBondForce, 2)\n            assert len(system.getForces()) == 14\n            barostat_type = MonteCarloBarostat\n\n        self._assert_force_num(system, NonbondedForce, 1)\n        self._assert_force_num(system, CustomNonbondedForce, 4)\n        self._assert_force_num(system, CustomBondForce, 4)\n        self._assert_force_num(system, HarmonicAngleForce, 1)\n        self._assert_force_num(system, PeriodicTorsionForce, 1)\n        self._assert_force_num(system, barostat_type, 1)\n\n        # Check the nonbonded force has the right contents\n        nonbond = [f for f in system.getForces() if isinstance(f, NonbondedForce)]\n        assert len(nonbond) == 1\n        assert nonbond[0].getNonbondedMethod() == NonbondedForce.PME\n        assert (\n            from_openmm(nonbond[0].getCutoffDistance())\n            == settings.forcefield_settings.nonbonded_cutoff\n        )\n\n        # Check the barostat made it all the way through\n        barostat = [f for f in system.getForces() if isinstance(f, barostat_type)]\n        assert len(barostat) == 1\n        assert barostat[0].getFrequency() == int(\n            settings.complex_integrator_settings.barostat_frequency.m\n        )\n        assert barostat[0].getDefaultPressure() == to_openmm(settings.thermo_settings.pressure)\n        assert barostat[0].getDefaultTemperature() == to_openmm(\n            settings.thermo_settings.temperature\n        )\n\n    def _assert_expected_nonalchemical_forces(self, system, complexed: bool, settings):\n        \"\"\"\n        Assert the forces expected in the non-alchemical system.\n        \"\"\"\n        if complexed:\n            barostat_type = MonteCarloMembraneBarostat\n        else:\n            barostat_type = MonteCarloBarostat\n        self._assert_force_num(system, NonbondedForce, 1)\n        self._assert_force_num(system, HarmonicBondForce, 1)\n        self._assert_force_num(system, HarmonicAngleForce, 1)\n        self._assert_force_num(system, PeriodicTorsionForce, 1)\n        self._assert_force_num(system, barostat_type, 1)\n\n        assert len(system.getForces()) == 5\n\n        # Check that the nonbonded force has the right contents\n        nonbond = [f for f in system.getForces() if isinstance(f, NonbondedForce)]\n        assert len(nonbond) == 1\n        assert nonbond[0].getNonbondedMethod() == NonbondedForce.PME\n        assert (\n            from_openmm(nonbond[0].getCutoffDistance())\n            == settings.forcefield_settings.nonbonded_cutoff\n        )\n\n        # Check the barostat made it all the way through\n        barostat = [f for f in system.getForces() if isinstance(f, barostat_type)]\n        assert len(barostat) == 1\n        assert barostat[0].getFrequency() == int(\n            settings.complex_integrator_settings.barostat_frequency.m\n        )\n        assert barostat[0].getDefaultPressure() == to_openmm(settings.thermo_settings.pressure)\n        assert barostat[0].getDefaultTemperature() == to_openmm(\n            settings.thermo_settings.temperature\n        )\n\n    def _verify_sampler(self, sampler, complexed: bool, settings):\n        \"\"\"\n        Utility to verify the contents of the sampler.\n        \"\"\"\n        assert sampler.is_periodic\n        assert isinstance(sampler, MultiStateSampler)\n        if complexed:\n            barostat_type = MonteCarloMembraneBarostat\n        else:\n            barostat_type = MonteCarloBarostat\n        assert isinstance(sampler._thermodynamic_states[0].barostat, barostat_type)\n        assert sampler._thermodynamic_states[1].pressure == to_openmm(\n            settings.thermo_settings.pressure\n        )\n        for state in sampler._thermodynamic_states:\n            system = state.get_system(remove_thermostat=True)\n            self._assert_expected_alchemical_forces(system, complexed, settings)\n\n    @staticmethod\n    def _test_orthogonal_vectors(system):\n        \"\"\"Test that the system has an orthorhombic (rectangular) periodic box.\"\"\"\n        vectors = system.getDefaultPeriodicBoxVectors()\n        vectors = from_openmm(vectors)  # convert to a Quantity array\n\n        # Extract box lengths in nanometers\n        width_x, width_y, width_z = [v[i].to(\"nanometer\").m for i, v in enumerate(vectors)]\n\n        # Expected orthogonal box (axis-aligned)\n        expected_vectors = (\n            np.array(\n                [\n                    [width_x, 0, 0],\n                    [0, width_y, 0],\n                    [0, 0, width_z],\n                ]\n            )\n            * offunit.nanometer\n        )\n\n        assert_allclose(\n            vectors, expected_vectors, atol=1e-5, err_msg=f\"Box is not orthogonal:\\n{vectors}\"\n        )\n\n    @staticmethod\n    def _test_cubic_vectors(system):\n        # cube is an identity matrix\n        vectors = system.getDefaultPeriodicBoxVectors()\n        width = float(from_openmm(vectors)[0][0].to(\"nanometer\").m)\n\n        expected_vectors = [\n            [width, 0, 0],\n            [0, width, 0],\n            [0, 0, width],\n        ] * offunit.nanometer\n\n        assert_allclose(\n            expected_vectors,\n            from_openmm(vectors),\n        )\n\n    def test_complex_dry_run(self, complex_setup_units, complex_run_units, tmpdir):\n        with tmpdir.as_cwd():\n            # Get adaptive settings\n            adaptive_settings = complex_setup_units[0]._inputs[\"protocol\"].settings\n            # Check that adaptive settings changed the barostat to membrane barostat\n            assert (\n                adaptive_settings.complex_integrator_settings.barostat\n                == \"MonteCarloMembraneBarostat\"\n            )\n            complex_setup_output = complex_setup_units[0].run(dry=True)\n            pdb_file = openmm.app.pdbfile.PDBFile(str(complex_setup_output[\"topology\"]))\n            system = deserialize(complex_setup_output[\"system\"])\n            indices = complex_setup_output[\"selection_indices\"]\n            data = complex_run_units[0].run(system, pdb_file, indices, dry=True)  # fmt: skip\n            # Check the sampler\n            self._verify_sampler(data[\"sampler\"], complexed=True, settings=adaptive_settings)\n\n            # Check the alchemical system\n            self._assert_expected_alchemical_forces(\n                complex_setup_output[\"alchem_restrained_system\"],\n                complexed=True,\n                settings=adaptive_settings,\n            )\n            self._test_orthogonal_vectors(complex_setup_output[\"alchem_restrained_system\"])\n\n            # Check the non-alchemical system\n            self._assert_expected_nonalchemical_forces(\n                complex_setup_output[\"system_AB\"], complexed=True, settings=adaptive_settings\n            )\n            self._test_orthogonal_vectors(complex_setup_output[\"system_AB\"])\n            # Check the box vectors haven't changed (they shouldn't have because we didn't do MD)\n            assert_allclose(\n                from_openmm(\n                    complex_setup_output[\"alchem_restrained_system\"].getDefaultPeriodicBoxVectors()\n                ),\n                from_openmm(complex_setup_output[\"system_AB\"].getDefaultPeriodicBoxVectors()),\n            )\n\n            # Check the PDB\n            pdb = md.load_pdb(\"alchemical_system.pdb\")\n            assert pdb.n_atoms == self.num_all_not_water\n\n            full_pdb = md.load_pdb(\"topology.pdb\")\n            assert full_pdb.n_atoms == self.num_complex_atoms\n\n    def test_solvent_dry_run(self, solvent_setup_units, solvent_run_units, settings, tmpdir):\n        with tmpdir.as_cwd():\n            solv_setup_output = solvent_setup_units[0].run(dry=True)\n            pdb_file = openmm.app.pdbfile.PDBFile(str(solv_setup_output[\"topology\"]))\n            system = deserialize(solv_setup_output[\"system\"])\n            indices = solv_setup_output[\"selection_indices\"]\n            data = solvent_run_units[0].run(system, pdb_file, indices, dry=True)  # fmt: skip\n\n            # Check the sampler\n            self._verify_sampler(data[\"sampler\"], complexed=False, settings=settings)\n\n            # Check the alchemical system\n            self._assert_expected_alchemical_forces(\n                solv_setup_output[\"alchem_restrained_system\"], complexed=False, settings=settings\n            )\n            self._test_cubic_vectors(solv_setup_output[\"alchem_restrained_system\"])\n\n            # Check the alchemical indices\n            expected_indices = [i for i in range(self.num_ligand_atoms_A + self.num_ligand_atoms_B)]\n            assert expected_indices == solv_setup_output[\"selection_indices\"].tolist()\n\n            # Check the non-alchemical system\n            self._assert_expected_nonalchemical_forces(\n                solv_setup_output[\"system_AB\"], complexed=False, settings=settings\n            )\n            self._test_cubic_vectors(solv_setup_output[\"system_AB\"])\n\n            # Check the PDB\n            pdb = md.load_pdb(\"alchemical_system.pdb\")\n            assert pdb.n_atoms == (self.num_ligand_atoms_A + self.num_ligand_atoms_B)\n"
  },
  {
    "path": "src/openfe/tests/protocols/openmm_septop/test_septop_protocol_results.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\nimport itertools\nimport json\nimport math\nimport pathlib\nfrom unittest import mock\n\nimport gufe\nimport mdtraj as md\nimport numpy as np\nimport openmm\nimport openmm.app\nimport openmm.unit\nimport pytest\nfrom numpy.testing import assert_allclose\nfrom openff.units import unit as offunit\nfrom openff.units.openmm import ensure_quantity, from_openmm, to_openmm\nfrom openmm import (\n    CustomBondForce,\n    CustomCompoundBondForce,\n    CustomNonbondedForce,\n    HarmonicAngleForce,\n    HarmonicBondForce,\n    MonteCarloBarostat,\n    MonteCarloMembraneBarostat,\n    NonbondedForce,\n    PeriodicTorsionForce,\n)\nfrom openmmtools.alchemy import AbsoluteAlchemicalFactory, AlchemicalRegion\nfrom openmmtools.multistate.multistatesampler import MultiStateSampler\n\nimport openfe.protocols.openmm_septop\nfrom openfe import ChemicalSystem, SolventComponent\nfrom openfe.protocols.openmm_septop import (\n    SepTopComplexRunUnit,\n    SepTopComplexSetupUnit,\n    SepTopProtocol,\n    SepTopProtocolResult,\n    SepTopSolventRunUnit,\n    SepTopSolventSetupUnit,\n)\nfrom openfe.protocols.openmm_septop.base_units import (\n    BaseSepTopAnalysisUnit,\n    BaseSepTopRunUnit,\n    BaseSepTopSetupUnit,\n)\nfrom openfe.protocols.openmm_utils.serialization import deserialize\nfrom openfe.protocols.restraint_utils.geometry.boresch import BoreschRestraintGeometry\nfrom openfe.tests.protocols.conftest import compute_energy\nfrom openfe.tests.protocols.openmm_ahfe.test_ahfe_protocol import (\n    _assert_num_forces,\n    _verify_alchemical_sterics_force_parameters,\n)\n\nfrom .utils import UNIT_TYPES, _get_units\n\n\n@pytest.fixture\ndef patcher():\n    base_path = \"openfe.protocols.openmm_septop.base_units\"\n    protocol_path = \"openfe.protocols.openmm_septop.equil_septop_method\"\n    with (\n        mock.patch(\n            f\"{protocol_path}.SepTopComplexSetupUnit.run\",\n            return_value={\n                \"system\": pathlib.Path(\"system.xml.bz2\"),\n                \"topology\": \"topology.pdb\",\n                \"standard_state_correction_A\": 0 * offunit.kilocalorie_per_mole,\n                \"standard_state_correction_B\": 0 * offunit.kilocalorie_per_mole,\n                \"restraint_geometry_A\": None,\n                \"restraint_geometry_B\": None,\n                \"selection_indices\": np.array(\n                    [\n                        0,\n                    ]\n                ),\n                \"subsampled_pdb_structure\": \"subsampled.pdb\",\n            },\n        ),\n        mock.patch(\n            f\"{protocol_path}.SepTopSolventSetupUnit.run\",\n            return_value={\n                \"system\": pathlib.Path(\"system.xml.bz2\"),\n                \"topology\": \"topology.pdb\",\n                \"standard_state_correction\": 0 * offunit.kilocalorie_per_mole,\n                \"selection_indices\": np.array(\n                    [\n                        0,\n                    ]\n                ),\n                \"subsampled_pdb_structure\": \"subsampled.pdb\",\n            },\n        ),\n        mock.patch(\n            f\"{protocol_path}.SepTopComplexRunUnit.run\",\n            return_value={\n                \"trajectory\": \"foo.nc\",\n                \"checkpoint\": \"bar.nc\",\n            },\n        ),\n        mock.patch(\n            f\"{protocol_path}.SepTopSolventRunUnit.run\",\n            return_value={\n                \"trajectory\": \"foo.nc\",\n                \"checkpoint\": \"bar.nc\",\n            },\n        ),\n        mock.patch(\n            f\"{protocol_path}.SepTopComplexAnalysisUnit.run\",\n            return_value={\"foo\": \"bar\"},\n        ),\n        mock.patch(\n            f\"{protocol_path}.SepTopSolventAnalysisUnit.run\",\n            return_value={\"foo\": \"bar\"},\n        ),\n        mock.patch(\n            f\"{base_path}.deserialize\",\n            return_value=\"foo\",\n        ),\n        mock.patch(\n            f\"{base_path}.openmm.app.pdbfile.PDBFile\",\n            return_value=\"foo\",\n        ),\n    ):\n        yield\n\n\ndef test_unit_tagging(benzene_toluene_dag, patcher, tmp_path):\n    # test that executing the units includes correct gen and repeat info\n    dag_units = benzene_toluene_dag.protocol_units\n\n    for phase in [\"solvent\", \"complex\"]:\n        setup_results = {}\n        sim_results = {}\n        analysis_results = {}\n\n        setup_units = _get_units(dag_units, UNIT_TYPES[phase][\"setup\"])\n        sim_units = _get_units(dag_units, UNIT_TYPES[phase][\"sim\"])\n        a_units = _get_units(dag_units, UNIT_TYPES[phase][\"analysis\"])\n\n        for u in setup_units:\n            rid = u.inputs[\"repeat_id\"]\n            setup_results[rid] = u.execute(context=gufe.Context(tmp_path, tmp_path))\n\n        for u in sim_units:\n            rid = u.inputs[\"repeat_id\"]\n            sim_results[rid] = u.execute(\n                context=gufe.Context(tmp_path, tmp_path),\n                setup=setup_results[rid],\n            )\n\n        for u in a_units:\n            rid = u.inputs[\"repeat_id\"]\n            analysis_results[rid] = u.execute(\n                context=gufe.Context(tmp_path, tmp_path),\n                setup=setup_results[rid],\n                simulation=sim_results[rid],\n            )\n\n        for results in [setup_results, sim_results, analysis_results]:\n            for ret in results.values():\n                assert isinstance(ret, gufe.ProtocolUnitResult)\n                assert ret.outputs[\"generation\"] == 0\n\n        assert len(setup_results) == 1\n        assert len(sim_results) == 1\n        assert len(analysis_results) == 1\n\n\ndef test_gather(benzene_toluene_dag, patcher, tmp_path):\n    # check that .gather behaves as expected\n    dagres = gufe.protocols.execute_DAG(\n        benzene_toluene_dag,\n        shared_basedir=tmp_path,\n        scratch_basedir=tmp_path,\n        keep_shared=True,\n    )\n\n    protocol = SepTopProtocol(\n        settings=SepTopProtocol.default_settings(),\n    )\n\n    res = protocol.gather([dagres])\n\n    assert isinstance(res, openfe.protocols.openmm_septop.SepTopProtocolResult)\n\n\nclass TestProtocolResult:\n    @pytest.fixture()\n    def protocolresult(self, septop_json):\n        d = json.loads(septop_json, cls=gufe.tokenization.JSON_HANDLER.decoder)\n\n        pr = openfe.ProtocolResult.from_dict(d[\"protocol_result\"])\n\n        return pr\n\n    def test_reload_protocol_result(self, septop_json):\n        d = json.loads(septop_json, cls=gufe.tokenization.JSON_HANDLER.decoder)\n\n        pr = SepTopProtocolResult.from_dict(d[\"protocol_result\"])\n\n        assert pr\n\n    def test_get_estimate(self, protocolresult):\n        est = protocolresult.get_estimate()\n\n        assert est\n        assert est.m == pytest.approx(1.6, abs=0.1)\n        assert isinstance(est, offunit.Quantity)\n        assert est.is_compatible_with(offunit.kilojoule_per_mole)\n\n    def test_get_uncertainty(self, protocolresult):\n        est = protocolresult.get_uncertainty()\n\n        assert est.m == pytest.approx(0.0, abs=0.1)\n        assert isinstance(est, offunit.Quantity)\n        assert est.is_compatible_with(offunit.kilojoule_per_mole)\n\n    def test_get_individual(self, protocolresult):\n        inds = protocolresult.get_individual_estimates()\n\n        assert isinstance(inds, dict)\n        assert isinstance(inds[\"solvent\"], list)\n        assert isinstance(inds[\"complex\"], list)\n        assert len(inds[\"solvent\"]) == len(inds[\"complex\"]) == 1\n        for e, u in itertools.chain(inds[\"solvent\"], inds[\"complex\"]):\n            assert e.is_compatible_with(offunit.kilojoule_per_mole)\n            assert u.is_compatible_with(offunit.kilojoule_per_mole)\n\n    def test_get_forwards_etc(self, protocolresult):\n        \"\"\"\n        Due to the short simulation times, we expect the frwd/reverse\n        analysis of the solvent to be None.\n        \"\"\"\n        wmsg = \"were found in the forward and reverse dictionaries of the repeats of the solvent\"\n        with pytest.warns(UserWarning, match=wmsg):\n            far = protocolresult.get_forward_and_reverse_energy_analysis()\n\n        assert isinstance(far, dict)\n        for key in [\"solvent\", \"complex\"]:\n            assert isinstance(far[key], list)\n\n        assert far[\"solvent\"][0] is None\n\n        complex_keys = list(far[\"complex\"][0].keys())\n\n        for key in [\"fractions\", \"forward_DGs\", \"forward_dDGs\", \"reverse_DGs\", \"reverse_dDGs\"]:\n            assert key in complex_keys\n            assert len(far[\"complex\"][0][key]) == 10\n\n    @pytest.mark.parametrize(\"key\", [\"solvent\", \"complex\"])\n    def test_get_overlap_matrices(self, key, protocolresult):\n        ovp = protocolresult.get_overlap_matrices()\n\n        assert isinstance(ovp, dict)\n        assert isinstance(ovp[key], list)\n        assert len(ovp[key]) == 1\n\n        ovp1 = ovp[key][0]\n        assert isinstance(ovp1[\"matrix\"], np.ndarray)\n        if key == \"solvent\":\n            lambda_nr = 27\n        else:\n            lambda_nr = 19\n        assert ovp1[\"matrix\"].shape == (lambda_nr, lambda_nr)\n\n    @pytest.mark.parametrize(\"key\", [\"solvent\", \"complex\"])\n    def test_get_replica_transition_statistics(self, key, protocolresult):\n        rpx = protocolresult.get_replica_transition_statistics()\n        if key == \"solvent\":\n            lambda_nr = 27\n        else:\n            lambda_nr = 19\n        assert isinstance(rpx, dict)\n        assert isinstance(rpx[key], list)\n        assert len(rpx[key]) == 1\n        rpx1 = rpx[key][0]\n        assert \"eigenvalues\" in rpx1\n        assert \"matrix\" in rpx1\n\n        assert rpx1[\"eigenvalues\"].shape == (lambda_nr,)\n        assert rpx1[\"matrix\"].shape == (lambda_nr, lambda_nr)\n\n    @pytest.mark.parametrize(\"key\", [\"solvent\", \"complex\"])\n    def test_equilibration_iterations(self, key, protocolresult):\n        eq = protocolresult.equilibration_iterations()\n\n        assert isinstance(eq, dict)\n        assert isinstance(eq[key], list)\n        assert len(eq[key]) == 1\n        assert all(isinstance(v, float) for v in eq[key])\n\n    @pytest.mark.parametrize(\"key\", [\"solvent\", \"complex\"])\n    def test_production_iterations(self, key, protocolresult):\n        prod = protocolresult.production_iterations()\n\n        assert isinstance(prod, dict)\n        assert isinstance(prod[key], list)\n        assert len(prod[key]) == 1\n        assert all(isinstance(v, float) for v in prod[key])\n\n    @pytest.mark.parametrize(\n        \"key, expected_size\",\n        [\n            [\"solvent\", 87],\n            [\"complex\", 1868],\n        ],\n    )\n    def test_selection_indices(self, key, protocolresult, expected_size):\n        indices = protocolresult.selection_indices()\n\n        assert isinstance(indices, dict)\n        assert isinstance(indices[key], list)\n        for inds in indices[key]:\n            assert isinstance(inds, np.ndarray)\n            assert len(inds) == expected_size\n\n    def test_filenotfound_replica_states(self, protocolresult):\n        errmsg = \"File could not be found\"\n\n        with pytest.raises(ValueError, match=errmsg):\n            protocolresult.get_replica_states()\n\n    def test_restraint_geometry(self, protocolresult):\n        geom = protocolresult.restraint_geometries()\n        assert isinstance(geom, tuple)\n        assert len(geom) == 2\n        assert isinstance(geom[0], list)\n        assert isinstance(geom[0][0], BoreschRestraintGeometry)\n        assert geom[0][0].guest_atoms == [1779, 1778, 1777]\n        assert geom[0][0].host_atoms == [802, 801, 800]\n        assert pytest.approx(geom[0][0].r_aA0, abs=0.01) == 0.75 * offunit.nanometer\n        assert pytest.approx(geom[0][0].theta_A0, abs=0.01) == 1.95 * offunit.radian\n        assert pytest.approx(geom[0][0].theta_B0, abs=0.01) == 1.33 * offunit.radian\n        assert pytest.approx(geom[0][0].phi_A0, abs=0.01) == 1.01 * offunit.radian\n        assert pytest.approx(geom[0][0].phi_B0, abs=0.01) == -1.24 * offunit.radian\n        assert pytest.approx(geom[0][0].phi_C0, abs=0.01) == -1.08 * offunit.radian\n"
  },
  {
    "path": "src/openfe/tests/protocols/openmm_septop/test_septop_resume.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\n\nimport copy\nimport logging\nimport os\nimport pathlib\nimport shutil\n\nimport gufe\nimport openmm\nimport pytest\nfrom gufe.protocols.errors import ProtocolUnitExecutionError\nfrom numpy.testing import assert_allclose\nfrom openfe_analysis.utils.multistate import _determine_position_indices\nfrom openff.units import unit as offunit\nfrom openff.units.openmm import from_openmm\nfrom openmmtools.multistate import MultiStateReporter, ReplicaExchangeSampler\n\nimport openfe\nfrom openfe.data._registry import POOCH_CACHE\nfrom openfe.protocols.openmm_septop import (\n    SepTopComplexRunUnit,\n    SepTopProtocol,\n    SepTopSolventAnalysisUnit,\n    SepTopSolventRunUnit,\n    SepTopSolventSetupUnit,\n)\n\nfrom ...conftest import HAS_INTERNET\nfrom .utils import _get_units\n\n\n@pytest.fixture()\ndef protocol_settings():\n    settings = SepTopProtocol.default_settings()\n    settings.protocol_repeats = 1\n    settings.solvent_output_settings.output_indices = \"resname UNK\"\n    settings.complex_solvation_settings.solvent_padding = None\n    settings.complex_solvation_settings.number_of_solvent_molecules = 50000\n    settings.complex_solvation_settings.box_shape = \"dodecahedron\"\n    settings.solvent_solvation_settings.solvent_padding = None\n    settings.solvent_solvation_settings.number_of_solvent_molecules = 1000\n    settings.solvent_solvation_settings.box_shape = \"dodecahedron\"\n    settings.complex_simulation_settings.equilibration_length = 50 * offunit.picosecond\n    settings.complex_simulation_settings.production_length = 50 * offunit.picosecond\n    settings.solvent_simulation_settings.equilibration_length = 50 * offunit.picosecond\n    settings.solvent_simulation_settings.production_length = 50 * offunit.picosecond\n    settings.complex_simulation_settings.time_per_iteration = 2.5 * offunit.picosecond\n    settings.solvent_simulation_settings.time_per_iteration = 2.5 * offunit.picosecond\n    settings.complex_output_settings.checkpoint_interval = 25 * offunit.picosecond\n    settings.solvent_output_settings.checkpoint_interval = 25 * offunit.picosecond\n    settings.complex_output_settings.positions_write_frequency = 25 * offunit.picosecond\n    settings.solvent_output_settings.positions_write_frequency = 25 * offunit.picosecond\n    settings.engine_settings.compute_platform = None\n    return settings\n\n\ndef test_verify_execution_environment():\n    # Verification should pass\n    SepTopComplexRunUnit._verify_execution_environment(\n        setup_outputs={\n            \"gufe_version\": gufe.__version__,\n            \"openfe_version\": openfe.__version__,\n            \"openmm_version\": openmm.__version__,\n        },\n    )\n\n\ndef test_verify_execution_environment_fail():\n    # Passing a bad version should fail\n    with pytest.raises(ProtocolUnitExecutionError, match=\"Python environment\"):\n        SepTopComplexRunUnit._verify_execution_environment(\n            setup_outputs={\n                \"gufe_version\": 0.1,\n                \"openfe_version\": openfe.__version__,\n                \"openmm_version\": openmm.__version__,\n            },\n        )\n\n\ndef test_verify_execution_env_missing_key():\n    errmsg = \"Missing environment information from setup outputs.\"\n    with pytest.raises(ProtocolUnitExecutionError, match=errmsg):\n        SepTopComplexRunUnit._verify_execution_environment(\n            setup_outputs={\n                \"foo_version\": 0.1,\n                \"openfe_version\": openfe.__version__,\n                \"openmm_version\": openmm.__version__,\n            },\n        )\n\n\n@pytest.mark.skipif(\n    not os.path.exists(POOCH_CACHE) and not HAS_INTERNET,\n    reason=\"Internet unavailable and test data is not cached locally\",\n)\ndef test_check_restart(protocol_settings, septop_solv_trajectory_path):\n    assert SepTopSolventRunUnit._check_restart(\n        output_settings=protocol_settings.solvent_output_settings,\n        shared_path=septop_solv_trajectory_path.parent,\n    )\n\n    assert not SepTopSolventRunUnit._check_restart(\n        output_settings=protocol_settings.solvent_output_settings,\n        shared_path=pathlib.Path(\".\"),\n    )\n\n\n@pytest.mark.skipif(\n    not os.path.exists(POOCH_CACHE) and not HAS_INTERNET,\n    reason=\"Internet unavailable and test data is not cached locally\",\n)\ndef test_check_restart_one_file_missing(protocol_settings, septop_solv_trajectory_path):\n    protocol_settings.solvent_output_settings.checkpoint_storage_filename = \"foo.nc\"\n\n    errmsg = \"the trajectory file is present but not the checkpoint file.\"\n    with pytest.raises(IOError, match=errmsg):\n        SepTopSolventRunUnit._check_restart(\n            output_settings=protocol_settings.solvent_output_settings,\n            shared_path=septop_solv_trajectory_path.parent,\n        )\n\n\nclass TestCheckpointResuming:\n    @pytest.fixture()\n    def protocol_dag(\n        self,\n        protocol_settings,\n        benzene_complex_system,\n        toluene_complex_system,\n    ):\n        protocol = SepTopProtocol(settings=protocol_settings)\n\n        return protocol.create(\n            stateA=benzene_complex_system,\n            stateB=toluene_complex_system,\n            mapping=None,\n        )\n\n    @pytest.fixture()\n    def protocol_units(self, protocol_dag):\n        pus = list(protocol_dag.protocol_units)\n        setup_unit = _get_units(pus, SepTopSolventSetupUnit)[0]\n        sim_unit = _get_units(pus, SepTopSolventRunUnit)[0]\n        analysis_unit = _get_units(pus, SepTopSolventAnalysisUnit)[0]\n        return setup_unit, sim_unit, analysis_unit\n\n    @pytest.fixture()\n    def setup_results(self, protocol_units, tmp_path):\n        setup_unit, _, _ = protocol_units\n\n        return setup_unit.run(\n            dry=True,\n            scratch_basepath=tmp_path,\n            shared_basepath=tmp_path,\n        )\n\n    @pytest.fixture()\n    def pdb_file(self, setup_results):\n        return openmm.app.pdbfile.PDBFile(str(setup_results[\"topology\"]))\n\n    @staticmethod\n    def _check_sampler(sampler, num_iterations: int):\n        # Helper method to do some checks on the sampler\n        assert sampler._iteration == num_iterations\n        assert sampler.number_of_iterations == 20\n        assert sampler.is_completed is (num_iterations == 20)\n        assert sampler.n_states == sampler.n_replicas == 27\n        assert sampler.is_periodic\n        assert sampler.mcmc_moves[0].n_steps == 625\n        assert from_openmm(sampler.mcmc_moves[0].timestep) == 4 * offunit.fs\n\n    @staticmethod\n    def _get_positions(dataset):\n        frame_list = _determine_position_indices(dataset)\n        positions = []\n        for frame in frame_list:\n            positions.append(copy.deepcopy(dataset.variables[\"positions\"][frame].data))\n\n        return positions\n\n    @staticmethod\n    def _copy_simfiles(cwd: pathlib.Path, filepath):\n        shutil.copyfile(filepath, f\"{cwd}/{filepath.name}\")\n\n    @pytest.mark.integration\n    def test_resume(\n        self,\n        protocol_dag,\n        protocol_units,\n        setup_results,\n        pdb_file,\n        septop_solv_trajectory_path,\n        septop_solv_checkpoint_path,\n        tmp_path,\n    ):\n        \"\"\"\n        Attempt to resume a simulation unit with pre-existing checkpoint &\n        trajectory files.\n        \"\"\"\n        self._copy_simfiles(tmp_path, septop_solv_trajectory_path)\n        self._copy_simfiles(tmp_path, septop_solv_checkpoint_path)\n\n        # 1. Check that the trajectory / checkpoint contain what we expect\n        reporter = MultiStateReporter(\n            tmp_path / \"solvent.nc\",\n            checkpoint_storage=\"solvent_checkpoint.nc\",\n        )\n        sampler = ReplicaExchangeSampler.from_storage(reporter)\n\n        self._check_sampler(sampler, num_iterations=10)\n\n        # Deep copy energies & positions for later comparison\n        init_energies = copy.deepcopy(reporter.read_energies())[0]\n        assert init_energies.shape == (11, 27, 27)\n        init_positions = self._get_positions(reporter._storage[0])\n        assert len(init_positions) == 2\n\n        reporter.close()\n        del sampler\n\n        # 2. get & run the units\n        _, sim_unit, analysis_unit = protocol_units\n\n        # Now we run the simulation in resume mode\n        sim_results = sim_unit.run(\n            setup_results[\"alchem_restrained_system\"],\n            pdb_file,\n            setup_results[\"selection_indices\"],\n            scratch_basepath=tmp_path,\n            shared_basepath=tmp_path,\n        )\n\n        # Finally we analyze the results\n        _ = analysis_unit.run(\n            trajectory=sim_results[\"trajectory\"],\n            checkpoint=sim_results[\"checkpoint\"],\n            scratch_basepath=tmp_path,\n            shared_basepath=tmp_path,\n        )\n\n        # Analyze the trajectory / checkpoint again\n        reporter = MultiStateReporter(\n            tmp_path / \"solvent.nc\",\n            checkpoint_storage=\"solvent_checkpoint.nc\",\n        )\n\n        sampler = ReplicaExchangeSampler.from_storage(reporter)\n\n        self._check_sampler(sampler, num_iterations=20)\n\n        # Check the energies and positions\n        energies = reporter.read_energies()[0]\n        assert energies.shape == (21, 27, 27)\n        assert_allclose(init_energies, energies[:11])\n\n        positions = self._get_positions(reporter._storage[0])\n        assert len(positions) == 3\n        for i in range(2):\n            assert_allclose(positions[i], init_positions[i])\n\n        reporter.close()\n        del sampler\n\n        # Check the free energy plots are there\n        mbar_overlap_file = tmp_path / \"mbar_overlap_matrix.png\"\n        assert (mbar_overlap_file).exists()\n\n    @pytest.mark.slow\n    def test_resume_fail_particles(\n        self,\n        protocol_dag,\n        protocol_units,\n        setup_results,\n        pdb_file,\n        septop_solv_trajectory_path,\n        septop_solv_checkpoint_path,\n        tmp_path,\n    ):\n        \"\"\"\n        Test that the run unit will fail with a system incompatible\n        to the one present in the trajectory/checkpoint files.\n\n        Here we check that we don't have the same particles / mass.\n        \"\"\"\n        # copy files\n        self._copy_simfiles(tmp_path, septop_solv_trajectory_path)\n        self._copy_simfiles(tmp_path, septop_solv_checkpoint_path)\n\n        _, sim_unit, _ = protocol_units\n\n        # Create a fake system where we will add a particle\n        fake_system = copy.deepcopy(setup_results[\"alchem_restrained_system\"])\n        fake_system.addParticle(42)\n\n        # Fake system should trigger a mismatch\n        errmsg = \"Stored checkpoint System particles do not\"\n        with pytest.raises(ValueError, match=errmsg):\n            _ = sim_unit.run(\n                fake_system,\n                pdb_file,\n                setup_results[\"selection_indices\"],\n                scratch_basepath=tmp_path,\n                shared_basepath=tmp_path,\n            )\n\n    @pytest.mark.slow\n    def test_resume_fail_constraints(\n        self,\n        protocol_dag,\n        protocol_units,\n        setup_results,\n        pdb_file,\n        septop_solv_trajectory_path,\n        septop_solv_checkpoint_path,\n        tmp_path,\n    ):\n        \"\"\"\n        Test that the run unit will fail with a system incompatible\n        to the one present in the trajectory/checkpoint files.\n\n        Here we check that we don't have the same constraints.\n        \"\"\"\n        # copy files\n        self._copy_simfiles(tmp_path, septop_solv_trajectory_path)\n        self._copy_simfiles(tmp_path, septop_solv_checkpoint_path)\n\n        _, sim_unit, _ = protocol_units\n\n        # Create a fake system without constraints\n        fake_system = copy.deepcopy(setup_results[\"alchem_restrained_system\"])\n\n        for i in reversed(range(fake_system.getNumConstraints())):\n            fake_system.removeConstraint(i)\n\n        # Fake system should trigger a mismatch\n        errmsg = \"Stored checkpoint System constraints do not\"\n        with pytest.raises(ValueError, match=errmsg):\n            _ = sim_unit.run(\n                fake_system,\n                pdb_file,\n                setup_results[\"selection_indices\"],\n                scratch_basepath=tmp_path,\n                shared_basepath=tmp_path,\n            )\n\n    @pytest.mark.slow\n    def test_resume_fail_forces(\n        self,\n        protocol_dag,\n        protocol_units,\n        setup_results,\n        pdb_file,\n        septop_solv_trajectory_path,\n        septop_solv_checkpoint_path,\n        tmp_path,\n    ):\n        \"\"\"\n        Test that the run unit will fail with a system incompatible\n        to the one present in the trajectory/checkpoint files.\n\n        Here we check we don't have the same forces.\n        \"\"\"\n        # copy files\n        self._copy_simfiles(tmp_path, septop_solv_trajectory_path)\n        self._copy_simfiles(tmp_path, septop_solv_checkpoint_path)\n\n        _, sim_unit, _ = protocol_units\n\n        # Create a fake system without the last force\n        fake_system = copy.deepcopy(setup_results[\"alchem_restrained_system\"])\n        fake_system.removeForce(fake_system.getNumForces() - 1)\n\n        # Fake system should trigger a mismatch\n        errmsg = \"Number of forces stored in checkpoint System\"\n        with pytest.raises(ValueError, match=errmsg):\n            _ = sim_unit.run(\n                fake_system,\n                pdb_file,\n                setup_results[\"selection_indices\"],\n                scratch_basepath=tmp_path,\n                shared_basepath=tmp_path,\n            )\n\n    @pytest.mark.slow\n    def test_resume_differ_barostat(\n        self,\n        protocol_dag,\n        protocol_units,\n        setup_results,\n        pdb_file,\n        septop_solv_trajectory_path,\n        septop_solv_checkpoint_path,\n        tmp_path,\n    ):\n        \"\"\"\n        Test that the run unit will fail with a system incompatible\n        to the one present in the trajectory/checkpoint files.\n\n        Here we check what happens if you have a different barostat\n        \"\"\"\n        # copy files\n        self._copy_simfiles(tmp_path, septop_solv_trajectory_path)\n        self._copy_simfiles(tmp_path, septop_solv_checkpoint_path)\n\n        _, sim_unit, _ = protocol_units\n\n        # Create a fake system with the fake force type\n        fake_system = copy.deepcopy(setup_results[\"alchem_restrained_system\"])\n\n        # Loop through forces and remove the force matching force type\n        for i, f in enumerate(fake_system.getForces()):\n            if isinstance(f, openmm.MonteCarloBarostat):\n                findex = i\n\n        fake_system.removeForce(findex)\n\n        # Now add the new barostat\n        new_force = openmm.MonteCarloBarostat(\n            1 * openmm.unit.atmosphere, 300 * openmm.unit.kelvin, 100\n        )\n        fake_system.addForce(new_force)\n\n        # Fake system should trigger a mismatch\n        errmsg = \"stored checkpoint System does not match the same force\"\n        with pytest.raises(ValueError, match=errmsg):\n            _ = sim_unit.run(\n                fake_system,\n                pdb_file,\n                setup_results[\"selection_indices\"],\n                scratch_basepath=tmp_path,\n                shared_basepath=tmp_path,\n            )\n\n    @pytest.mark.slow\n    def test_resume_differ_forces(\n        self,\n        protocol_dag,\n        protocol_units,\n        setup_results,\n        pdb_file,\n        septop_solv_trajectory_path,\n        septop_solv_checkpoint_path,\n        tmp_path,\n        caplog,\n    ):\n        \"\"\"\n        Test that the run unit will fail with a system incompatible\n        to the one present in the trajectory/checkpoint files.\n\n        Here we check we have a different force\n        \"\"\"\n        # copy files\n        self._copy_simfiles(tmp_path, septop_solv_trajectory_path)\n        self._copy_simfiles(tmp_path, septop_solv_checkpoint_path)\n\n        _, sim_unit, _ = protocol_units\n\n        # Create a fake system with the fake force type\n        fake_system = copy.deepcopy(setup_results[\"alchem_system\"])\n\n        # Loop through forces and remove the force matching force type\n        for i, f in enumerate(fake_system.getForces()):\n            if isinstance(f, openmm.NonbondedForce):\n                findex = i\n\n        fake_system.removeForce(findex)\n\n        # Now add a fake force\n        new_force = openmm.NonbondedForce()\n        new_force.setNonbondedMethod(openmm.NonbondedForce.PME)\n        new_force.addGlobalParameter(\"lambda_electrostatics_A\", 1.0)\n        new_force.addGlobalParameter(\"lambda_electrostatics_B\", 0.0)\n\n        fake_system.addForce(new_force)\n\n        # Mismatching force should trigger a warning\n        wmsg = \"does not exactly match one of the forces in the simulated System\"\n        caplog.set_level(logging.INFO)\n\n        _ = sim_unit.run(\n            fake_system,\n            pdb_file,\n            setup_results[\"selection_indices\"],\n            scratch_basepath=tmp_path,\n            shared_basepath=tmp_path,\n        )\n\n        assert wmsg in caplog.text\n\n    @pytest.mark.slow\n    @pytest.mark.parametrize(\"bad_file\", [\"trajectory\", \"checkpoint\"])\n    def test_resume_bad_files(\n        self,\n        protocol_dag,\n        protocol_units,\n        setup_results,\n        pdb_file,\n        septop_solv_trajectory_path,\n        septop_solv_checkpoint_path,\n        bad_file,\n        tmp_path,\n    ):\n        \"\"\"\n        Test what happens when you have a bad trajectory and/or checkpoint\n        files.\n        \"\"\"\n        # copy files\n\n        if bad_file == \"trajectory\":\n            with open(tmp_path / \"solvent.nc\", \"w\") as f:\n                f.write(\"foo\")\n        else:\n            self._copy_simfiles(tmp_path, septop_solv_trajectory_path)\n\n        if bad_file == \"checkpoint\":\n            with open(tmp_path / \"solvent_checkpoint.nc\", \"w\") as f:\n                f.write(\"bar\")\n        else:\n            self._copy_simfiles(tmp_path, septop_solv_checkpoint_path)\n\n        _, sim_unit, _ = protocol_units\n\n        with pytest.raises(OSError, match=\"Unknown file format\"):\n            _ = sim_unit.run(\n                setup_results[\"alchem_restrained_system\"],\n                pdb_file,\n                setup_results[\"selection_indices\"],\n                scratch_basepath=tmp_path,\n                shared_basepath=tmp_path,\n            )\n"
  },
  {
    "path": "src/openfe/tests/protocols/openmm_septop/test_septop_settings.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\n\nimport pytest\n\nfrom openfe import ChemicalSystem, SolventComponent\nfrom openfe.protocols.openmm_septop import (\n    SepTopProtocol,\n)\nfrom openfe.protocols.openmm_septop.equil_septop_settings import SepTopSettings\n\n\n@pytest.fixture()\ndef protocol_dry_settings():\n    # a set of settings for dry run tests\n    s = SepTopProtocol.default_settings()\n    s.engine_settings.compute_platform = None\n    s.protocol_repeats = 1\n    return s\n\n\n@pytest.fixture()\ndef default_settings():\n    s = SepTopProtocol.default_settings()\n    return s\n\n\ndef test_create_default_settings():\n    settings = SepTopProtocol.default_settings()\n    assert settings\n\n\n@pytest.mark.parametrize(\n    \"val\",\n    [\n        {\"elec\": [0.0, -1], \"vdw\": [0.0, 1.0], \"restraints\": [0.0, 1.0]},\n        {\"elec\": [0.0, 1], \"vdw\": [0.0, 1.5], \"restraints\": [0.0, 1.0]},\n        {\"elec\": [0.0, 1], \"vdw\": [0.0, 1], \"restraints\": [-0.1, 1.0]},\n    ],\n)\ndef test_incorrect_window_settings(val, default_settings):\n    errmsg = \"Lambda windows must be between 0 and 1.\"\n    lambda_settings = default_settings.complex_lambda_settings\n    with pytest.raises(ValueError, match=errmsg):\n        lambda_settings.lambda_elec_A = val[\"elec\"]\n        lambda_settings.lambda_vdw_A = val[\"vdw\"]\n        lambda_settings.lambda_restraints_A = val[\"restraints\"]\n\n\n@pytest.mark.parametrize(\n    \"val\",\n    [\n        {\n            \"elec\": [0.0, 0.1, 0.0],\n            \"vdw\": [0.0, 1.0, 1.0],\n            \"restraints\": [0.0, 1.0, 1.0],\n        },\n        {\n            \"elec\": [0.0, 0.0, 0.0],\n            \"vdw\": [0.0, 1.0, 0.0],\n            \"restraints\": [0.0, 1.0, 1.0],\n        },\n        {\n            \"elec\": [0.0, 0.0, 0.0],\n            \"vdw\": [0.0, 1.0, 1.0],\n            \"restraints\": [0.0, 1.0, 0.0],\n        },\n    ],\n)\ndef test_monotonic_lambda_windows_A(val, default_settings):\n    errmsg = \"The lambda schedule for ligand A\"\n    lambda_settings = default_settings.complex_lambda_settings\n\n    with pytest.raises(ValueError, match=errmsg):\n        lambda_settings.lambda_elec_A = val[\"elec\"]\n        lambda_settings.lambda_vdw_A = val[\"vdw\"]\n        lambda_settings.lambda_restraints_A = val[\"restraints\"]\n\n\n@pytest.mark.parametrize(\n    \"val\",\n    [\n        {\n            \"elec\": [1.0, 0.1, 1.0],\n            \"vdw\": [1.0, 1.0, 1.0],\n            \"restraints\": [1.0, 1.0, 1.0],\n        },\n        {\n            \"elec\": [1.0, 1.0, 1.0],\n            \"vdw\": [1.0, 0.0, 1.0],\n            \"restraints\": [1.0, 1.0, 1.0],\n        },\n        {\n            \"elec\": [1.0, 1.0, 1.0],\n            \"vdw\": [1.0, 1.0, 1.0],\n            \"restraints\": [1.0, 0.0, 1.0],\n        },\n    ],\n)\ndef test_monotonic_lambda_windows_B(val, default_settings):\n    errmsg = \"The lambda schedule for ligand B\"\n    lambda_settings = default_settings.complex_lambda_settings\n\n    with pytest.raises(ValueError, match=errmsg):\n        lambda_settings.lambda_elec_B = val[\"elec\"]\n        lambda_settings.lambda_vdw_B = val[\"vdw\"]\n        lambda_settings.lambda_restraints_B = val[\"restraints\"]\n\n\ndef test_output_induces_not_all(default_settings):\n    errmsg = \"Equilibration simulations need to output the full system\"\n\n    with pytest.raises(ValueError, match=errmsg):\n        default_settings.complex_equil_output_settings.output_indices = \"no water\"\n\n\ndef test_adaptive_settings_no_protein_membrane(toluene_complex_system, default_settings):\n    settings = SepTopProtocol._adaptive_settings(\n        toluene_complex_system, toluene_complex_system, default_settings\n    )\n\n    assert isinstance(settings, SepTopSettings)\n    # Should use default barostat since no ProteinMembraneComponent\n    assert settings.complex_integrator_settings.barostat == \"MonteCarloBarostat\"\n\n\ndef test_adaptive_settings_with_protein_membrane(a2a_protein_membrane_component, a2a_ligands):\n    stateA = ChemicalSystem(\n        {\n            \"ligandA\": a2a_ligands[0],\n            \"protein\": a2a_protein_membrane_component,\n            \"solvent\": SolventComponent(),\n        }\n    )\n\n    settings = SepTopProtocol._adaptive_settings(stateA, stateA)\n    assert isinstance(settings, SepTopSettings)\n    # Barostat should have been updated\n    assert settings.complex_integrator_settings.barostat == \"MonteCarloMembraneBarostat\"\n"
  },
  {
    "path": "src/openfe/tests/protocols/openmm_septop/test_septop_slow.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\n\nimport pathlib\n\nimport mdtraj as md\nimport numpy as np\nimport openmm\nimport pytest\nfrom gufe.protocols import execute_DAG\nfrom numpy.testing import assert_allclose\nfrom openff.units import unit\nfrom openff.units.openmm import from_openmm\n\nimport openfe\nfrom openfe import ChemicalSystem, SolventComponent\nfrom openfe.protocols.openmm_septop import (\n    SepTopProtocol,\n    SepTopSolventSetupUnit,\n)\nfrom openfe.protocols.openmm_septop.utils import SepTopParameterState\nfrom openfe.protocols.openmm_utils.serialization import deserialize\n\n\n@pytest.fixture()\ndef default_settings():\n    s = SepTopProtocol.default_settings()\n    s.engine_settings.compute_platform = None\n    return s\n\n\ndef compare_energies(alchemical_system, positions):\n    alchemical_state = SepTopParameterState.from_system(alchemical_system)\n\n    from openmmtools.alchemy import AbsoluteAlchemicalFactory\n\n    energy = AbsoluteAlchemicalFactory.get_energy_components(\n        alchemical_system, alchemical_state, positions\n    )\n    na_A = \"alchemically modified NonbondedForce for non-alchemical/alchemical sterics for region A\"\n    na_B = \"alchemically modified NonbondedForce for non-alchemical/alchemical sterics for region B\"\n    nonbonded = \"unmodified NonbondedForce\"\n\n    # Lambda 0: LigandA sterics on, elec on, ligand B sterics off, elec off\n    alchemical_state.lambda_sterics_A = 1\n    alchemical_state.lambda_sterics_B = 0\n    alchemical_state.lambda_electrostatics_A = 1\n    alchemical_state.lambda_electrostatics_B = 0\n    energy_0 = AbsoluteAlchemicalFactory.get_energy_components(\n        alchemical_system, alchemical_state, positions\n    )\n\n    # Lambda 7: LigandA sterics on, elec on, ligand B sterics on, elec off\n    alchemical_state.lambda_sterics_A = 1\n    alchemical_state.lambda_sterics_B = 1\n    alchemical_state.lambda_electrostatics_A = 1\n    alchemical_state.lambda_electrostatics_B = 0\n    energy_7 = AbsoluteAlchemicalFactory.get_energy_components(\n        alchemical_system, alchemical_state, positions\n    )\n\n    # Lambda 8: LigandA sterics on, elec partially on,\n    # ligand B sterics on, elec partially on\n    alchemical_state.lambda_sterics_A = 1\n    alchemical_state.lambda_sterics_B = 1\n    alchemical_state.lambda_electrostatics_A = 0.75\n    alchemical_state.lambda_electrostatics_B = 0.25\n    energy_8 = AbsoluteAlchemicalFactory.get_energy_components(\n        alchemical_system, alchemical_state, positions\n    )\n\n    # Lambda 12: LigandA sterics on, elec off, ligand B sterics on, elec on\n    alchemical_state.lambda_sterics_A = 1\n    alchemical_state.lambda_sterics_B = 1\n    alchemical_state.lambda_electrostatics_A = 0\n    alchemical_state.lambda_electrostatics_B = 1\n    energy_12 = AbsoluteAlchemicalFactory.get_energy_components(\n        alchemical_system, alchemical_state, positions\n    )\n\n    # Lambda 13: LigandA sterics partially on, elec off, ligand B sterics on, elec on\n    alchemical_state.lambda_sterics_A = 0.857142857\n    alchemical_state.lambda_sterics_B = 1\n    alchemical_state.lambda_electrostatics_A = 0\n    alchemical_state.lambda_electrostatics_B = 1\n    energy_13 = AbsoluteAlchemicalFactory.get_energy_components(\n        alchemical_system, alchemical_state, positions\n    )\n\n    return (\n        na_A,\n        na_B,\n        nonbonded,\n        energy,\n        energy_0,\n        energy_7,\n        energy_8,\n        energy_12,\n        energy_13,\n    )\n\n\n@pytest.mark.flaky(reruns=3)  # pytest-rerunfailures; we can get bad minimisation\ndef test_lambda_energies(\n    eg5_ligands,\n    eg5_protein,\n    eg5_cofactor,\n    tmp_path,\n    default_settings,\n):\n    # check system parametrisation works even if confgen fails\n    default_settings.protocol_repeats = 1\n    default_settings.solvent_equil_simulation_settings.minimization_steps = 100\n    default_settings.solvent_equil_simulation_settings.equilibration_length_nvt = (\n        10 * unit.picosecond\n    )\n    default_settings.solvent_equil_simulation_settings.equilibration_length = 10 * unit.picosecond\n    default_settings.solvent_equil_simulation_settings.production_length = 1 * unit.picosecond\n    default_settings.solvent_solvation_settings.box_shape = \"dodecahedron\"\n    default_settings.solvent_solvation_settings.solvent_padding = 1.8 * unit.nanometer\n\n    protocol = SepTopProtocol(\n        settings=default_settings,\n    )\n\n    stateA = ChemicalSystem(\n        {\n            \"lig_02\": eg5_ligands[0],\n            \"protein\": eg5_protein,\n            \"cofactor\": eg5_cofactor,\n            \"solvent\": SolventComponent(),\n        }\n    )\n\n    stateB = ChemicalSystem(\n        {\n            \"lig_03\": eg5_ligands[1],\n            \"protein\": eg5_protein,\n            \"cofactor\": eg5_cofactor,\n            \"solvent\": SolventComponent(),\n        }\n    )\n\n    # Create DAG from protocol, get the vacuum and solvent units\n    # and eventually dry run the first vacuum unit\n    dag = protocol.create(\n        stateA=stateA,\n        stateB=stateB,\n        mapping=None,\n    )\n    prot_units = list(dag.protocol_units)\n    solv_setup_unit = [u for u in prot_units if isinstance(u, SepTopSolventSetupUnit)]\n\n    output = solv_setup_unit[0].run(scratch_basepath=tmp_path, shared_basepath=tmp_path)\n    system = output[\"system\"]\n    alchemical_system = deserialize(system)\n    topology = output[\"topology\"]\n    pdb = openmm.app.pdbfile.PDBFile(str(topology))\n    positions = pdb.getPositions(asNumpy=True)\n\n    # Remove Harmonic restraint force solvent\n    alchemical_system.removeForce(13)\n\n    (\n        na_A,\n        na_B,\n        nonbonded,\n        energy,\n        energy_0,\n        energy_7,\n        energy_8,\n        energy_12,\n        energy_13,\n    ) = compare_energies(alchemical_system, positions)\n\n    for key, value in energy.items():\n        if key == na_A:\n            assert_allclose(from_openmm(value), from_openmm(energy_0[key]))\n            assert_allclose(from_openmm(value), from_openmm(energy_7[key]))\n            assert_allclose(from_openmm(value), from_openmm(energy_8[key]))\n            assert_allclose(from_openmm(value), from_openmm(energy_12[key]))\n            assert not np.allclose(from_openmm(value), from_openmm(energy_13[key]))\n\n        elif key == na_B:\n            assert not np.allclose(from_openmm(value), from_openmm(energy_0[key]))\n            assert_allclose(from_openmm(energy_0[key]), 0)\n            assert_allclose(from_openmm(value), from_openmm(energy_7[key]))\n            assert_allclose(from_openmm(value), from_openmm(energy_8[key]))\n            assert_allclose(from_openmm(value), from_openmm(energy_12[key]))\n            assert_allclose(from_openmm(value), from_openmm(energy_13[key]))\n\n        elif key == nonbonded:\n            assert not np.allclose(from_openmm(value), from_openmm(energy_0[key]))\n            assert_allclose(\n                from_openmm(energy_0[key]),\n                from_openmm(energy_7[key]),\n                rtol=1e-05,\n            )\n            assert not np.allclose(from_openmm(energy_0[key]), from_openmm(energy_8[key]))\n            assert not np.allclose(from_openmm(energy_0[key]), from_openmm(energy_12[key]))\n            assert not np.allclose(from_openmm(energy_0[key]), from_openmm(energy_13[key]))\n\n        else:\n            assert_allclose(from_openmm(value), from_openmm(energy_0[key]))\n            assert_allclose(from_openmm(value), from_openmm(energy_7[key]))\n            assert_allclose(from_openmm(value), from_openmm(energy_8[key]))\n            assert_allclose(from_openmm(value), from_openmm(energy_12[key]))\n            assert_allclose(from_openmm(value), from_openmm(energy_13[key]))\n\n\n@pytest.mark.integration\n@pytest.mark.flaky(reruns=3)  # pytest-rerunfailures; we can get bad minimisation\n@pytest.mark.parametrize(\"platform\", [\"CUDA\"])\ndef test_openmm_run_engine(\n    platform,\n    available_platforms,\n    benzene_modifications,\n    T4_protein_component,\n    tmp_path,\n    default_settings,\n):\n    if platform not in available_platforms:\n        pytest.skip(f\"OpenMM Platform: {platform} not available\")\n\n    # Run a really short calculation to check everything is going well\n    default_settings.protocol_repeats = 1\n    default_settings.solvent_output_settings.output_indices = \"resname UNK\"\n    default_settings.complex_equil_simulation_settings.equilibration_length = 0.1 * unit.picosecond\n    default_settings.complex_equil_simulation_settings.production_length = 0.1 * unit.picosecond\n    default_settings.complex_simulation_settings.equilibration_length = 0.1 * unit.picosecond\n    default_settings.complex_simulation_settings.production_length = 0.1 * unit.picosecond\n    default_settings.solvent_equil_simulation_settings.equilibration_length_nvt = (\n        0.1 * unit.picosecond\n    )\n    default_settings.solvent_equil_simulation_settings.equilibration_length = 0.1 * unit.picosecond\n    default_settings.solvent_equil_simulation_settings.production_length = 0.1 * unit.picosecond\n    default_settings.solvent_simulation_settings.equilibration_length = 0.1 * unit.picosecond\n    default_settings.solvent_simulation_settings.production_length = 0.1 * unit.picosecond\n    default_settings.engine_settings.compute_platform = platform\n    default_settings.complex_simulation_settings.time_per_iteration = 20 * unit.femtosecond\n    default_settings.solvent_simulation_settings.time_per_iteration = 20 * unit.femtosecond\n    default_settings.complex_output_settings.checkpoint_interval = 20 * unit.femtosecond\n    default_settings.solvent_output_settings.checkpoint_interval = 20 * unit.femtosecond\n\n    protocol = SepTopProtocol(\n        settings=default_settings,\n    )\n\n    stateA = openfe.ChemicalSystem(\n        {\n            \"benzene\": benzene_modifications[\"benzene\"],\n            \"T4L\": T4_protein_component,\n            \"solvent\": openfe.SolventComponent(),\n        }\n    )\n\n    stateB = openfe.ChemicalSystem(\n        {\n            \"toluene\": benzene_modifications[\"toluene\"],\n            \"T4L\": T4_protein_component,\n            \"solvent\": openfe.SolventComponent(),\n        }\n    )\n\n    # Create DAG from protocol\n    dag = protocol.create(\n        stateA=stateA,\n        stateB=stateB,\n        mapping=None,\n    )\n\n    r = execute_DAG(dag, shared_basedir=tmp_path, scratch_basedir=tmp_path, keep_shared=True)\n\n    assert r.ok()\n    for pur in r.protocol_unit_results:\n        unit_shared = tmp_path / f\"shared_{pur.source_key}_attempt_0\"\n        assert unit_shared.exists()\n        assert pathlib.Path(unit_shared).is_dir()\n        if \"SepTopComplexRunUnit\" in pur.source_key.split(\"-\") or \"SepTopSolventRunUnit\" in pur.source_key.split(\"-\"):  # fmt: skip\n            checkpoint = pur.outputs[\"checkpoint\"]\n            assert checkpoint == unit_shared / f\"{pur.outputs['simtype']}_checkpoint.nc\"\n            assert (unit_shared / checkpoint).exists()\n            nc = pur.outputs[\"trajectory\"]\n            assert nc == unit_shared / f\"{pur.outputs['simtype']}.nc\"\n            assert nc.exists()\n\n    # Test results methods that need files present\n    results = protocol.gather([r])\n    states = results.get_replica_states()\n    assert len(states.items()) == 2\n    assert len(states[\"solvent\"]) == 1\n    assert states[\"solvent\"][0].shape[1] == 27\n\n\n@pytest.mark.flaky(reruns=1)  # pytest-rerunfailures; we can get bad minimisation\n@pytest.mark.parametrize(\"platform\", [\"CUDA\"])\ndef test_restraints_solvent(\n    platform,\n    available_platforms,\n    benzene_complex_system,\n    toluene_complex_system,\n    tmp_path,\n    default_settings,\n):\n    if platform not in available_platforms:\n        pytest.skip(f\"OpenMM Platform: {platform} not available\")\n\n    # Run a really short calculation to check everything is going well\n    default_settings.protocol_repeats = 1\n    default_settings.solvent_equil_simulation_settings.equilibration_length_nvt = (\n        10 * unit.picosecond\n    )\n    default_settings.solvent_equil_simulation_settings.equilibration_length = 10 * unit.picosecond\n    default_settings.solvent_equil_simulation_settings.production_length = 10 * unit.picosecond\n    default_settings.engine_settings.compute_platform = platform\n\n    protocol = SepTopProtocol(\n        settings=default_settings,\n    )\n\n    # Create DAG from protocol, get the vacuum and solvent units\n    # and eventually dry run the first solvent unit\n    dag = protocol.create(\n        stateA=benzene_complex_system,\n        stateB=toluene_complex_system,\n        mapping=None,\n    )\n    prot_units = list(dag.protocol_units)\n    solv_setup_unit = [u for u in prot_units if isinstance(u, SepTopSolventSetupUnit)]\n\n    solv_setup_output = solv_setup_unit[0].run(scratch_basepath=tmp_path, shared_basepath=tmp_path)\n    pdb = md.load_pdb(tmp_path / \"topology.pdb\")\n    assert pdb.n_atoms == 1762\n    central_atoms = np.array([[2, 19]], dtype=np.int32)\n    distance = md.compute_distances(pdb, central_atoms)[0][0]\n    # For right now just checking that ligands at least somewhat apart\n    assert distance > 0.5\n"
  },
  {
    "path": "src/openfe/tests/protocols/openmm_septop/test_septop_tokenization.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\nimport json\n\nimport gufe\nimport pytest\nfrom gufe.tests.test_tokenization import GufeTokenizableTestsMixin\n\nfrom openfe.protocols import openmm_septop\n\n\n@pytest.fixture\ndef protocol():\n    return openmm_septop.SepTopProtocol(openmm_septop.SepTopProtocol.default_settings())\n\n\n@pytest.fixture\ndef protocol_units(protocol, benzene_complex_system, toluene_complex_system):\n    pus = protocol.create(\n        stateA=benzene_complex_system,\n        stateB=toluene_complex_system,\n        mapping=None,\n    )\n    return list(pus.protocol_units)\n\n\n@pytest.fixture\ndef solvent_setup_protocol_unit(protocol_units):\n    for pu in protocol_units:\n        if isinstance(pu, openmm_septop.SepTopSolventSetupUnit):\n            return pu\n\n\n@pytest.fixture\ndef solvent_run_protocol_unit(protocol_units):\n    for pu in protocol_units:\n        if isinstance(pu, openmm_septop.SepTopSolventRunUnit):\n            return pu\n\n\n@pytest.fixture\ndef solvent_analysis_protocol_unit(protocol_units):\n    for pu in protocol_units:\n        if isinstance(pu, openmm_septop.SepTopSolventAnalysisUnit):\n            return pu\n\n\n@pytest.fixture\ndef complex_setup_protocol_unit(protocol_units):\n    for pu in protocol_units:\n        if isinstance(pu, openmm_septop.SepTopComplexSetupUnit):\n            return pu\n\n\n@pytest.fixture\ndef complex_run_protocol_unit(protocol_units):\n    for pu in protocol_units:\n        if isinstance(pu, openmm_septop.SepTopComplexRunUnit):\n            return pu\n\n\n@pytest.fixture\ndef complex_analysis_protocol_unit(protocol_units):\n    for pu in protocol_units:\n        if isinstance(pu, openmm_septop.SepTopComplexAnalysisUnit):\n            return pu\n\n\n@pytest.fixture\ndef protocol_result(septop_json):\n    d = json.loads(\n        septop_json,\n        cls=gufe.tokenization.JSON_HANDLER.decoder,\n    )\n    pr = openmm_septop.SepTopProtocolResult.from_dict(d[\"protocol_result\"])\n    return pr\n\n\nclass TestSepTopProtocol(GufeTokenizableTestsMixin):\n    cls = openmm_septop.SepTopProtocol\n    key = None\n    repr = \"<SepTopProtocol-\"\n\n    @pytest.fixture()\n    def instance(self, protocol):\n        return protocol\n\n    def test_repr(self, instance):\n        \"\"\"\n        Overwrites the base `test_repr` call.\n        \"\"\"\n        assert isinstance(repr(instance), str)\n        assert self.repr in repr(instance)\n\n\nclass TestSepTopSolventSetupUnit(GufeTokenizableTestsMixin):\n    cls = openmm_septop.SepTopSolventSetupUnit\n    repr = (\n        \"SepTopSolventSetupUnit(SepTop RBFE Setup, transformation benzene to toluene, solvent leg\"\n    )\n    key = None\n\n    @pytest.fixture()\n    def instance(self, solvent_setup_protocol_unit):\n        return solvent_setup_protocol_unit\n\n    def test_repr(self, instance):\n        \"\"\"\n        Overwrites the base `test_repr` call.\n        \"\"\"\n        assert isinstance(repr(instance), str)\n        assert self.repr in repr(instance)\n\n\nclass TestSepTopSolventRunUnit(GufeTokenizableTestsMixin):\n    cls = openmm_septop.SepTopSolventRunUnit\n    repr = \"SepTopSolventRunUnit(SepTop RBFE Run, transformation benzene to toluene, solvent leg\"\n    key = None\n\n    @pytest.fixture()\n    def instance(self, solvent_run_protocol_unit):\n        return solvent_run_protocol_unit\n\n    def test_repr(self, instance):\n        \"\"\"\n        Overwrites the base `test_repr` call.\n        \"\"\"\n        assert isinstance(repr(instance), str)\n        assert self.repr in repr(instance)\n\n\nclass TestSepTopSolventAnalysisUnit(GufeTokenizableTestsMixin):\n    cls = openmm_septop.SepTopSolventAnalysisUnit\n    repr = \"SepTopSolventAnalysisUnit(SepTop RBFE Analysis, transformation benzene to toluene, solvent leg\"\n    key = None\n\n    @pytest.fixture()\n    def instance(self, solvent_analysis_protocol_unit):\n        return solvent_analysis_protocol_unit\n\n    def test_repr(self, instance):\n        \"\"\"\n        Overwrites the base `test_repr` call.\n        \"\"\"\n        assert isinstance(repr(instance), str)\n        assert self.repr in repr(instance)\n\n\nclass TestSepTopComplexSetupUnit(GufeTokenizableTestsMixin):\n    cls = openmm_septop.SepTopComplexSetupUnit\n    repr = (\n        \"SepTopComplexSetupUnit(SepTop RBFE Setup, transformation benzene to toluene, complex leg\"\n    )\n    key = None\n\n    @pytest.fixture()\n    def instance(self, complex_setup_protocol_unit):\n        return complex_setup_protocol_unit\n\n    def test_repr(self, instance):\n        \"\"\"\n        Overwrites the base `test_repr` call.\n        \"\"\"\n        assert isinstance(repr(instance), str)\n        assert self.repr in repr(instance)\n\n\nclass TestSepTopComplexRunUnit(GufeTokenizableTestsMixin):\n    cls = openmm_septop.SepTopComplexRunUnit\n    repr = \"SepTopComplexRunUnit(SepTop RBFE Run, transformation benzene to toluene, complex leg\"\n    key = None\n\n    @pytest.fixture()\n    def instance(self, complex_run_protocol_unit):\n        return complex_run_protocol_unit\n\n    def test_repr(self, instance):\n        \"\"\"\n        Overwrites the base `test_repr` call.\n        \"\"\"\n        assert isinstance(repr(instance), str)\n        assert self.repr in repr(instance)\n\n\nclass TestSepTopComplexAnalysisUnit(GufeTokenizableTestsMixin):\n    cls = openmm_septop.SepTopComplexAnalysisUnit\n    repr = \"SepTopComplexAnalysisUnit(SepTop RBFE Analysis, transformation benzene to toluene, complex leg\"\n    key = None\n\n    @pytest.fixture()\n    def instance(self, complex_analysis_protocol_unit):\n        return complex_analysis_protocol_unit\n\n    def test_repr(self, instance):\n        \"\"\"\n        Overwrites the base `test_repr` call.\n        \"\"\"\n        assert isinstance(repr(instance), str)\n        assert self.repr in repr(instance)\n\n\nclass TestSepTopProtocolResult(GufeTokenizableTestsMixin):\n    cls = openmm_septop.SepTopProtocolResult\n    key = None\n    repr = \"SepTopProtocolResult-\"\n\n    @pytest.fixture()\n    def instance(self, protocol_result):\n        return protocol_result\n\n    def test_repr(self, instance):\n        \"\"\"\n        Overwrites the base `test_repr` call.\n        \"\"\"\n        assert isinstance(repr(instance), str)\n        assert self.repr in repr(instance)\n"
  },
  {
    "path": "src/openfe/tests/protocols/openmm_septop/test_septop_validation.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\nimport pytest\n\nimport openfe\nfrom openfe import ChemicalSystem, SolventComponent\nfrom openfe.protocols.openmm_septop import (\n    SepTopProtocol,\n)\nfrom openfe.protocols.openmm_septop.equil_septop_method import (\n    _check_alchemical_charge_difference,\n)\nfrom openfe.protocols.openmm_utils import system_validation\n\n\n@pytest.fixture()\ndef default_settings():\n    s = SepTopProtocol.default_settings()\n    return s\n\n\n@pytest.mark.parametrize(\n    \"val\",\n    [\n        {\n            \"elec_A\": [1.0, 1.0],\n            \"vdw_A\": [0.0, 1.0],\n            \"restraints_A\": [0.0, 0.0],\n            \"elec_B\": [1.0, 1.0],\n            \"vdw_B\": [1.0, 1.0],\n            \"restraints_B\": [0.0, 0.0],\n        },\n    ],\n)\ndef test_validate_lambda_schedule_nreplicas(val, default_settings):\n    default_settings.complex_lambda_settings.lambda_elec_A = val[\"elec_A\"]\n    default_settings.complex_lambda_settings.lambda_vdw_A = val[\"vdw_A\"]\n    default_settings.complex_lambda_settings.lambda_restraints_A = val[\"restraints_A\"]\n    default_settings.complex_lambda_settings.lambda_elec_B = val[\"elec_B\"]\n    default_settings.complex_lambda_settings.lambda_vdw_B = val[\"vdw_B\"]\n    default_settings.complex_lambda_settings.lambda_restraints_B = val[\"restraints_B\"]\n    n_replicas = 3\n    default_settings.complex_simulation_settings.n_replicas = n_replicas\n    errmsg = (\n        f\"Number of replicas {n_replicas} does not equal the\"\n        f\" number of lambda windows {len(val['vdw_A'])}\"\n    )\n    with pytest.raises(ValueError, match=errmsg):\n        SepTopProtocol._validate_lambda_schedule(\n            default_settings.complex_lambda_settings,\n            default_settings.complex_simulation_settings,\n        )\n\n\n@pytest.mark.parametrize(\n    \"val\",\n    [\n        {\"elec\": [1.0, 1.0, 1.0], \"vdw\": [0.0, 1.0], \"restraints\": [0.0, 0.0]},\n    ],\n)\ndef test_validate_lambda_schedule_nwindows(val, default_settings):\n    default_settings.complex_lambda_settings.lambda_elec_A = val[\"elec\"]\n    default_settings.complex_lambda_settings.lambda_vdw_A = val[\"vdw\"]\n    default_settings.complex_lambda_settings.lambda_restraints_A = val[\"restraints\"]\n    n_replicas = 3\n    default_settings.complex_simulation_settings.n_replicas = n_replicas\n    errmsg = (\n        \"Components elec, vdw, and restraints must have equal amount of lambda \"\n        \"windows. Got 3 and 19 elec lambda windows\"\n    )\n    with pytest.raises(ValueError, match=errmsg):\n        SepTopProtocol._validate_lambda_schedule(\n            default_settings.complex_lambda_settings,\n            default_settings.complex_simulation_settings,\n        )\n\n\n@pytest.mark.parametrize(\n    \"val\",\n    [\n        {\n            \"elec_A\": [0.0, 1.0],\n            \"vdw_A\": [1.0, 1.0],\n            \"restraints_A\": [0.0, 0.0],\n            \"elec_B\": [1.0, 1.0],\n            \"vdw_B\": [1.0, 1.0],\n            \"restraints_B\": [0.0, 0.0],\n        },\n    ],\n)\ndef test_validate_lambda_schedule_nakedcharge(val, default_settings):\n    default_settings.complex_lambda_settings.lambda_elec_A = val[\"elec_A\"]\n    default_settings.complex_lambda_settings.lambda_vdw_A = val[\"vdw_A\"]\n    default_settings.complex_lambda_settings.lambda_restraints_A = val[\"restraints_A\"]\n    default_settings.complex_lambda_settings.lambda_elec_B = val[\"elec_B\"]\n    default_settings.complex_lambda_settings.lambda_vdw_B = val[\"vdw_B\"]\n    default_settings.complex_lambda_settings.lambda_restraints_B = val[\"restraints_B\"]\n    n_replicas = 2\n    default_settings.complex_simulation_settings.n_replicas = n_replicas\n    default_settings.solvent_simulation_settings.n_replicas = n_replicas\n    errmsg = (\n        \"There are states along this lambda schedule \"\n        \"where there are atoms with charges but no LJ \"\n        \"interactions: State A: l\"\n    )\n    with pytest.raises(ValueError, match=errmsg):\n        SepTopProtocol._validate_lambda_schedule(\n            default_settings.complex_lambda_settings,\n            default_settings.complex_simulation_settings,\n        )\n    with pytest.raises(ValueError, match=errmsg):\n        SepTopProtocol._validate_lambda_schedule(\n            default_settings.complex_lambda_settings,\n            default_settings.solvent_simulation_settings,\n        )\n\n\ndef test_check_alchem_charge_diff(charged_benzene_modifications):\n    errmsg = \"A charge difference of 1\"\n    with pytest.raises(ValueError, match=errmsg):\n        _check_alchemical_charge_difference(\n            charged_benzene_modifications[\"benzene\"],\n            charged_benzene_modifications[\"benzoic_acid\"],\n        )\n\n\ndef test_charge_error_create(charged_benzene_modifications, T4_protein_component, default_settings):\n    protocol = SepTopProtocol(\n        settings=default_settings,\n    )\n    stateA = ChemicalSystem(\n        {\n            \"benzene\": charged_benzene_modifications[\"benzene\"],\n            \"protein\": T4_protein_component,\n            \"solvent\": SolventComponent(),\n        }\n    )\n\n    stateB = ChemicalSystem(\n        {\n            \"benzoic\": charged_benzene_modifications[\"benzoic_acid\"],\n            \"protein\": T4_protein_component,\n            \"solvent\": SolventComponent(),\n        }\n    )\n    errmsg = \"A charge difference of 1\"\n    with pytest.raises(ValueError, match=errmsg):\n        protocol.create(\n            stateA=stateA,\n            stateB=stateB,\n            mapping=None,\n        )\n\n\n@pytest.mark.parametrize(\n    \"fail_endstate, system_A, system_B\",\n    [\n        (\"stateA\", \"benzene_system\", \"benzene_complex_system\"),\n        (\"stateB\", \"benzene_complex_system\", \"benzene_system\"),\n    ],\n)\ndef test_validate_endstates_protcomp(request, system_A, system_B, fail_endstate):\n    with pytest.raises(ValueError, match=\"No ProteinComponent found\"):\n        SepTopProtocol._validate_endstates(\n            request.getfixturevalue(system_A),\n            request.getfixturevalue(system_B),\n        )\n\n\n@pytest.fixture\ndef T4L_benzene_vacuum(benzene_modifications, T4_protein_component):\n    return openfe.ChemicalSystem(\n        {\n            \"benzene\": benzene_modifications[\"benzene\"],\n            \"protein\": T4_protein_component,\n        }\n    )\n\n\n@pytest.mark.parametrize(\n    \"fail_endstate, system_A, system_B\",\n    [\n        (\"stateA\", \"T4L_benzene_vacuum\", \"benzene_complex_system\"),\n        (\"stateB\", \"benzene_complex_system\", \"T4L_benzene_vacuum\"),\n    ],\n)\ndef test_validate_endstates_nosolvcomp(\n    request,\n    system_A,\n    system_B,\n    fail_endstate,\n):\n    with pytest.raises(ValueError, match=\"No SolventComponent found\"):\n        SepTopProtocol._validate_endstates(\n            request.getfixturevalue(system_A),\n            request.getfixturevalue(system_B),\n        )\n\n\n@pytest.fixture\ndef T4L_system(T4_protein_component):\n    return openfe.ChemicalSystem(\n        {\n            \"solvent\": openfe.SolventComponent(),\n            \"protein\": T4_protein_component,\n        }\n    )\n\n\n@pytest.mark.parametrize(\n    \"fail_endstate, system_A, system_B\",\n    [\n        (\"stateA\", \"T4L_system\", \"benzene_complex_system\"),\n        (\"stateB\", \"benzene_complex_system\", \"T4L_system\"),\n    ],\n)\ndef test_validate_alchem_comps_missing(\n    request,\n    system_A,\n    system_B,\n    fail_endstate,\n):\n    errmsg = (\n        \"Only one alchemical species is supported. \"\n        f\"Number of unique components found in {fail_endstate}\"\n    )\n\n    with pytest.raises(\n        ValueError,\n        match=errmsg,\n    ):\n        SepTopProtocol._validate_endstates(\n            request.getfixturevalue(system_A),\n            request.getfixturevalue(system_B),\n        )\n\n\ndef test_validate_alchem_comps_toomanyA(\n    benzene_modifications,\n    T4_protein_component,\n):\n    stateA = ChemicalSystem(\n        {\n            \"benzene\": benzene_modifications[\"benzene\"],\n            \"toluene\": benzene_modifications[\"toluene\"],\n            \"protein\": T4_protein_component,\n            \"solvent\": SolventComponent(),\n        }\n    )\n\n    stateB = ChemicalSystem(\n        {\n            \"phenol\": benzene_modifications[\"phenol\"],\n            \"protein\": T4_protein_component,\n            \"solvent\": SolventComponent(),\n        }\n    )\n\n    alchem_comps = system_validation.get_alchemical_components(stateA, stateB)\n\n    assert len(alchem_comps[\"stateA\"]) == 2\n\n    assert len(alchem_comps[\"stateB\"]) == 1\n\n    errmsg = (\n        \"Only one alchemical species is supported. Number of unique components found in stateA: 2.\"\n    )\n\n    with pytest.raises(ValueError, match=errmsg):\n        SepTopProtocol._validate_endstates(stateA, stateB)\n\n\ndef test_validate_alchem_nonsmc(\n    benzene_modifications,\n    T4_protein_component,\n):\n    stateA = ChemicalSystem(\n        {\n            \"benzene\": benzene_modifications[\"benzene\"],\n            \"protein\": T4_protein_component,\n            \"solvent\": SolventComponent(neutralize=False),\n        }\n    )\n\n    stateB = ChemicalSystem(\n        {\n            \"benzene\": benzene_modifications[\"benzene\"],\n            \"protein\": T4_protein_component,\n            \"solvent\": SolventComponent(),\n        }\n    )\n\n    errmsg = \"Only transforming SmallMoleculeComponents are supported by this Protocol.\"\n    with pytest.raises(ValueError, match=errmsg):\n        SepTopProtocol._validate_endstates(stateA, stateB)\n"
  },
  {
    "path": "src/openfe/tests/protocols/openmm_septop/utils.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\nfrom openfe.protocols.openmm_septop import (\n    SepTopComplexAnalysisUnit,\n    SepTopComplexRunUnit,\n    SepTopComplexSetupUnit,\n    SepTopSolventAnalysisUnit,\n    SepTopSolventRunUnit,\n    SepTopSolventSetupUnit,\n)\n\nUNIT_TYPES = {\n    \"solvent\": {\n        \"setup\": SepTopSolventSetupUnit,\n        \"sim\": SepTopSolventRunUnit,\n        \"analysis\": SepTopSolventAnalysisUnit,\n    },\n    \"complex\": {\n        \"setup\": SepTopComplexSetupUnit,\n        \"sim\": SepTopComplexRunUnit,\n        \"analysis\": SepTopComplexAnalysisUnit,\n    },\n}\n\n\ndef _get_units(protocol_units, unit_type):\n    \"\"\"\n    Helper method to extract setup units.\n    \"\"\"\n    return [pu for pu in protocol_units if isinstance(pu, unit_type)]\n"
  },
  {
    "path": "src/openfe/tests/protocols/restraints/__init__.py",
    "content": ""
  },
  {
    "path": "src/openfe/tests/protocols/restraints/test_geometry_base.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\n\nimport pytest\n\nfrom openfe.protocols.restraint_utils.geometry.base import HostGuestRestraintGeometry\n\n\ndef test_hostguest_geometry():\n    \"\"\"\n    A very basic will it build test.\n    \"\"\"\n    geom = HostGuestRestraintGeometry(guest_atoms=[1, 2, 3], host_atoms=[4])\n\n    assert isinstance(geom, HostGuestRestraintGeometry)\n\n\ndef test_hostguest_positiveidxs_validator():\n    \"\"\"\n    Check that the validator is working as intended.\n    \"\"\"\n    with pytest.raises(ValueError, match=\"negative indices passed\"):\n        _ = HostGuestRestraintGeometry(guest_atoms=[-1, 1], host_atoms=[0])\n"
  },
  {
    "path": "src/openfe/tests/protocols/restraints/test_geometry_boresch.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\nimport os\nimport pathlib\n\nimport MDAnalysis as mda\nimport pytest\nfrom openff.units import unit\nfrom rdkit import Chem\n\nfrom openfe.data._registry import POOCH_CACHE\nfrom openfe.protocols.restraint_utils.geometry.boresch.geometry import (\n    BoreschRestraintGeometry,\n    find_boresch_restraint,\n)\n\nfrom ...conftest import HAS_INTERNET\n\n\n@pytest.fixture()\ndef eg5_protein_ligand_universe(eg5_protein_pdb, eg5_ligands):\n    protein = mda.Universe(eg5_protein_pdb)\n    lig = mda.Universe(eg5_ligands[1].to_rdkit())\n    # add the residue name of the ligand\n    lig.add_TopologyAttr(\"resname\", [\"LIG\"])\n    return mda.Merge(protein.atoms, lig.atoms)\n\n\ndef test_get_boresch_missing_atoms(eg5_protein_ligand_universe, eg5_ligands):\n    \"\"\"\n    Test an error is raised if we do not provide guest and host atoms\n    \"\"\"\n\n    ligand_atoms = eg5_protein_ligand_universe.select_atoms(\"resname LIG\")\n    host_atoms = eg5_protein_ligand_universe.select_atoms(\"protein\")\n    with pytest.raises(ValueError, match=\"both ``guest_restraints_atoms_idxs`` and \"):\n        _ = find_boresch_restraint(\n            universe=eg5_protein_ligand_universe,\n            guest_rdmol=eg5_ligands[1].to_rdkit(),\n            guest_idxs=ligand_atoms.atoms.ix,\n            host_idxs=host_atoms.atoms.ix,\n            host_selection=\"backbone\",\n            guest_restraint_atoms_idxs=[33, 12, 13],\n        )\n\n\ndef test_boresch_too_few_host_atoms_found(eg5_protein_ligand_universe, eg5_ligands):\n    \"\"\"\n    Test an error is raised if we can not find a set of host atoms\n    \"\"\"\n    with pytest.raises(ValueError, match=\"Boresch-like restraint generation: too few atoms\"):\n        ligand_atoms = eg5_protein_ligand_universe.select_atoms(\"resname LIG\")\n        host_atoms = eg5_protein_ligand_universe.select_atoms(\"protein\")\n        _ = find_boresch_restraint(\n            universe=eg5_protein_ligand_universe,\n            guest_rdmol=eg5_ligands[1].to_rdkit(),\n            guest_idxs=ligand_atoms.atoms.ix,\n            host_idxs=host_atoms.atoms.ix,\n            # select an atom group with no atoms\n            host_selection=\"resnum 2\",\n        )\n\n\ndef test_boresch_restraint_user_defined(eg5_protein_ligand_universe, eg5_ligands):\n    \"\"\"\n    Test creating a restraint with a user supplied set of atoms.\n    \"\"\"\n    ligand_atoms = eg5_protein_ligand_universe.select_atoms(\"resname LIG\")\n    host_atoms = eg5_protein_ligand_universe.select_atoms(\"protein\")\n    restraint_geometry = find_boresch_restraint(\n        universe=eg5_protein_ligand_universe,\n        guest_rdmol=eg5_ligands[1].to_rdkit(),\n        guest_idxs=ligand_atoms.atoms.ix,\n        host_idxs=host_atoms.atoms.ix,\n        host_selection=\"backbone\",\n        guest_restraint_atoms_idxs=[33, 12, 13],\n        host_restraint_atoms_idxs=[3517, 1843, 3920],\n    )\n    host_ids = eg5_protein_ligand_universe.atoms[restraint_geometry.host_atoms]\n    # make sure we have backbone atoms\n    for a in host_ids:\n        # backbone atom names\n        assert a.name in [\"CA\", \"C\", \"O\", \"N\"]\n    assert restraint_geometry.guest_atoms == [5528, 5507, 5508]\n    assert restraint_geometry.host_atoms == [3517, 1843, 3920]\n    # check the measured values\n    assert 1.01590371 == pytest.approx(restraint_geometry.r_aA0.to(\"nanometer\").m)\n    assert 1.00327937 == pytest.approx(restraint_geometry.theta_A0.to(\"radians\").m)\n    assert 1.23561539 == pytest.approx(restraint_geometry.theta_B0.to(\"radians\").m)\n    assert 2.27961361 == pytest.approx(restraint_geometry.phi_A0.to(\"radians\").m)\n    assert 0.154240342 == pytest.approx(restraint_geometry.phi_B0.to(\"radians\").m)\n    assert -0.0239690127 == pytest.approx(restraint_geometry.phi_C0.to(\"radians\").m)\n\n\ndef test_boresch_no_guest_atoms_found_ethane(eg5_protein_pdb):\n    \"\"\"\n    Test an error is raised if we don't have enough ligand candidate atoms, we use ethane as\n    it has no rings and less than 3 heavy atoms.\n    \"\"\"\n    protein = mda.Universe(eg5_protein_pdb)\n    # generate ethane with a single conformation\n    lig = mda.Universe.from_smiles(\"CC\")\n    lig.add_TopologyAttr(\"resname\", [\"LIG\"])\n    universe = mda.Merge(protein.atoms, lig.atoms)\n\n    ligand_atoms = universe.select_atoms(\"resname LIG\")\n    with pytest.raises(ValueError, match=\"No suitable ligand atoms were found for the restraint\"):\n        _ = find_boresch_restraint(\n            universe=universe,\n            guest_rdmol=lig.atoms.convert_to(\"RDKIT\"),\n            guest_idxs=ligand_atoms.atoms.ix,\n            host_idxs=[1, 2, 3],\n            host_selection=\"backbone\",\n        )\n\n\ndef test_boresch_no_guest_atoms_found_collinear(eg5_protein_pdb):\n    protein = mda.Universe(eg5_protein_pdb)\n    # generate carbondioxide with a single conformation\n    lig = mda.Universe.from_smiles(\"O=C=O\")\n    lig.add_TopologyAttr(\"resname\", [\"LIG\"])\n    universe = mda.Merge(protein.atoms, lig.atoms)\n\n    ligand_atoms = universe.select_atoms(\"resname LIG\")\n    with pytest.raises(ValueError, match=\"No suitable ligand atoms found for the restraint.\"):\n        _ = find_boresch_restraint(\n            universe=universe,\n            guest_rdmol=lig.atoms.convert_to(\"RDKIT\", force=True),\n            guest_idxs=ligand_atoms.atoms.ix,\n            host_idxs=[1, 2, 3],\n            host_selection=\"backbone\",\n        )\n\n\ndef test_boresch_no_host_atom_pool(eg5_protein_ligand_universe, eg5_ligands):\n    \"\"\"\n    Make sure an error is raised if no good host atom can be found by setting the search distance very low\n    \"\"\"\n    ligand_atoms = eg5_protein_ligand_universe.select_atoms(\"resname LIG\")\n    host_atoms = eg5_protein_ligand_universe.select_atoms(\"protein\")\n    with pytest.raises(ValueError, match=\"No host atoms found within the search distance\"):\n        _ = find_boresch_restraint(\n            universe=eg5_protein_ligand_universe,\n            guest_rdmol=eg5_ligands[1].to_rdkit(),\n            guest_idxs=ligand_atoms.atoms.ix,\n            host_idxs=host_atoms.atoms.ix,\n            host_selection=\"backbone\",\n            host_min_distance=0.0 * unit.angstrom,\n            host_max_distance=0.1 * unit.angstrom,\n        )\n\n\ndef test_boresch_no_host_anchor(eg5_protein_ligand_universe, eg5_ligands):\n    \"\"\"\n    Make sure an error is raised if we can not find a host anchor from the pool.\n    We limit the selection to a single TYR near the binding site to\n    force only one residue being picked up.\n    \"\"\"\n\n    ligand_atoms = eg5_protein_ligand_universe.select_atoms(\"resname LIG\")\n    host_atoms = eg5_protein_ligand_universe.select_atoms(\"protein\")\n    with pytest.raises(ValueError, match=\"No suitable host atoms could be found\"):\n        _ = find_boresch_restraint(\n            universe=eg5_protein_ligand_universe,\n            guest_rdmol=eg5_ligands[1].to_rdkit(),\n            guest_idxs=ligand_atoms.atoms.ix,\n            host_idxs=host_atoms.atoms.ix,\n            host_selection=\"backbone and resname TYR\",\n            host_min_distance=0 * unit.nanometers,\n            host_max_distance=1 * unit.nanometers,\n        )\n\n\n@pytest.mark.slow\ndef test_get_boresch_restraint_single_frame(eg5_protein_ligand_universe, eg5_ligands):\n    \"\"\"\n    Make sure we can find a boresh restraint using a single frame\n    \"\"\"\n    ligand_atoms = eg5_protein_ligand_universe.select_atoms(\"resname LIG\")\n    host_atoms = eg5_protein_ligand_universe.select_atoms(\"protein\")\n    restraint_geometry = find_boresch_restraint(\n        universe=eg5_protein_ligand_universe,\n        guest_rdmol=eg5_ligands[1].to_rdkit(),\n        guest_idxs=ligand_atoms.atoms.ix,\n        host_idxs=host_atoms.atoms.ix,\n        host_selection=\"backbone\",\n    )\n    assert isinstance(restraint_geometry, BoreschRestraintGeometry)\n    host_ids = eg5_protein_ligand_universe.atoms[restraint_geometry.host_atoms]\n    # make sure we have backbone atoms\n    for a in host_ids:\n        # backbone atom names\n        assert a.name in [\"CA\", \"C\", \"O\", \"N\"]\n    assert restraint_geometry.guest_atoms == [5528, 5507, 5508]\n    assert restraint_geometry.host_atoms == [3517, 1843, 3920]\n    # check the measured values\n    assert 1.01590371 == pytest.approx(restraint_geometry.r_aA0.to(\"nanometer\").m)\n    assert 1.00327937 == pytest.approx(restraint_geometry.theta_A0.to(\"radians\").m)\n    assert 1.23561539 == pytest.approx(restraint_geometry.theta_B0.to(\"radians\").m)\n    assert 2.27961361 == pytest.approx(restraint_geometry.phi_A0.to(\"radians\").m)\n    assert 0.154240342 == pytest.approx(restraint_geometry.phi_B0.to(\"radians\").m)\n    assert -0.0239690127 == pytest.approx(restraint_geometry.phi_C0.to(\"radians\").m)\n\n\ndef test_get_boresch_restraint_dssp(eg5_protein_ligand_universe, eg5_ligands):\n    \"\"\"\n    Make sure we can find a boresh restraint using a single frame\n    \"\"\"\n    ligand_atoms = eg5_protein_ligand_universe.select_atoms(\"resname LIG\")\n    host_atoms = eg5_protein_ligand_universe.select_atoms(\"protein\")\n    restraint_geometry = find_boresch_restraint(\n        universe=eg5_protein_ligand_universe,\n        guest_rdmol=eg5_ligands[1].to_rdkit(),\n        guest_idxs=ligand_atoms.atoms.ix,\n        host_idxs=host_atoms.atoms.ix,\n        host_selection=\"backbone\",\n        dssp_filter=True,\n    )\n    assert isinstance(restraint_geometry, BoreschRestraintGeometry)\n    host_ids = eg5_protein_ligand_universe.atoms[restraint_geometry.host_atoms]\n    # make sure we have backbone atoms\n    for a in host_ids:\n        # backbone atom names\n        assert a.name in [\"CA\", \"C\", \"O\", \"N\"]\n    # we should get the same guest atoms\n    assert restraint_geometry.guest_atoms == [5528, 5507, 5508]\n    # different host atoms\n    assert restraint_geometry.host_atoms == [3517, 3058, 3548]\n    # check the measured values\n    assert 1.01590371 == pytest.approx(restraint_geometry.r_aA0.to(\"nanometer\").m)\n    assert 0.84966606 == pytest.approx(restraint_geometry.theta_A0.to(\"radians\").m)\n    assert 1.23561539 == pytest.approx(restraint_geometry.theta_B0.to(\"radians\").m)\n    assert 2.56825286 == pytest.approx(restraint_geometry.phi_A0.to(\"radians\").m)\n    assert -1.60162692 == pytest.approx(restraint_geometry.phi_B0.to(\"radians\").m)\n    assert -0.02396901 == pytest.approx(restraint_geometry.phi_C0.to(\"radians\").m)\n\n\n@pytest.mark.skipif(\n    not os.path.exists(POOCH_CACHE) and not HAS_INTERNET,\n    reason=\"Internet seems to be unavailable and test data is not cached locally.\",\n)\n@pytest.mark.parametrize(\n    \"system\",\n    [\n        \"jacs_set/bace\",\n        \"jacs_set/cdk2\",\n        \"jacs_set/jnk1\",\n        \"jacs_set/mcl1\",\n        \"jacs_set/p38\",\n        \"jacs_set/ptp1b\",\n        \"jacs_set/thrombin\",\n        \"jacs_set/tyk2\",\n        \"janssen_bace/bace_ciordia_prospective\",\n        \"janssen_bace/bace_p3_arg368_in\",\n        \"janssen_bace/ciordia_retro\",\n        \"janssen_bace/keranen_p2\",\n        \"merck/cdk8\",\n        \"merck/cmet\",\n        \"merck/eg5\",\n        \"merck/hif2a\",\n        \"merck/pfkfb3\",\n        \"merck/shp2\",\n        \"merck/syk\",\n        \"merck/tnks2\",\n        \"mcs_docking_set/hne\",\n        \"mcs_docking_set/renin\",\n        \"fragments/hsp90_2rings\",\n        \"fragments/hsp90_single_ring\",\n        \"fragments/jak2_set1\",\n        \"fragments/jak2_set2\",\n        \"fragments/liga\",\n        \"fragments/mcl1\",\n        \"fragments/mup1\",\n        \"fragments/p38\",\n        \"fragments/t4_lysozyme\",\n        \"miscellaneous_set/btk\",\n        \"miscellaneous_set/cdk8\",\n        \"miscellaneous_set/faah\",\n        \"miscellaneous_set/galectin\",\n        \"miscellaneous_set/hiv1_protease\",\n    ],\n)\ndef test_get_boresch_restrain_industry_benchmark_systems(system, industry_benchmark_files):\n    \"\"\"\n    Regression test generating boresch restraints for a single frame for most industry benchmark systems.\n    Currently, a single ligand is used from each system and the expected reference data is stored as SDtags\n    on the ligand.\n    \"\"\"\n    # load the protein\n    protein = mda.Universe(str(industry_benchmark_files / system / \"protein.pdb\"))\n    # load the ligand\n    ligand = [\n        m\n        for m in Chem.SDMolSupplier(\n            str(industry_benchmark_files / system / \"test_ligand.sdf\"), removeHs=False\n        )\n    ][0]\n    lig_uni = mda.Universe(ligand)\n    lig_uni.add_TopologyAttr(\"resname\", [\"LIG\"])\n    universe = mda.Merge(protein.atoms, lig_uni.atoms)\n\n    ligand_atoms = universe.select_atoms(\"resname LIG\")\n    lig_ids = ligand_atoms.atoms.ix\n    host_atoms = universe.select_atoms(\"protein\")\n    host_ids = host_atoms.atoms.ix\n\n    # create the geometry\n    restraint_geometry = find_boresch_restraint(\n        universe=universe,\n        guest_rdmol=ligand,\n        guest_idxs=lig_ids,\n        host_idxs=host_ids,\n        host_selection=\"backbone\",\n        anchor_finding_strategy=\"multi-residue\",\n        dssp_filter=False,\n        # reduce the search space for CI speed!\n        host_max_distance=1.5 * unit.nanometer,\n    )\n\n    # make sure we have backbone atoms as requested\n    host_restrain_atoms = universe.atoms[restraint_geometry.host_atoms]\n    for a in host_restrain_atoms:\n        # backbone atom names\n        assert a.name in [\"CA\", \"C\", \"O\", \"N\"]\n\n    # make sure the host/guest atoms are in the selection we gave\n    assert all(i in lig_ids for i in restraint_geometry.guest_atoms)\n    assert all(i in host_ids for i in restraint_geometry.host_atoms)\n\n    # finally make sure we get the expected values\n    for i, atom in enumerate(restraint_geometry.host_atoms):\n        assert ligand.GetIntProp(f\"Host{i}\") == atom\n    for i, atom in enumerate(restraint_geometry.guest_atoms):\n        assert ligand.GetIntProp(f\"Guest{i}\") == atom\n    for prop in [\"r_aA0\", \"theta_A0\", \"theta_B0\", \"phi_A0\", \"phi_B0\", \"phi_C0\"]:\n        assert pytest.approx(ligand.GetDoubleProp(prop)) == getattr(restraint_geometry, prop).m\n"
  },
  {
    "path": "src/openfe/tests/protocols/restraints/test_geometry_boresch_guest.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\nimport MDAnalysis as mda\nimport numpy as np\nimport pytest\nfrom openff.units import unit\n\nfrom openfe.protocols.restraint_utils.geometry.boresch.guest import (\n    _bonded_angles_from_pool,\n    _get_guest_atom_pool,\n    _sort_by_distance_from_atom,\n    find_guest_atom_candidates,\n)\nfrom openfe.protocols.restraint_utils.geometry.utils import (\n    get_aromatic_rings,\n    get_heavy_atom_idxs,\n)\n\n\n@pytest.mark.parametrize(\n    \"aromatic, expected\",\n    [\n        pytest.param(True, [(17, 15, 13), (17, 31, 33)], id=\"Aromatic\"),\n        pytest.param(\n            False,\n            [(17, 15, 13), (17, 18, 19), (17, 18, 23), (17, 18, 27), (17, 31, 33)],\n            id=\"Mixture\",\n        ),\n    ],\n)\ndef test_get_bond_angle_aromatic(eg5_ligands, aromatic, expected):\n    \"\"\"\n    Make sure non-aromatic atoms are correctly filtered when requested\n    \"\"\"\n    rd_mol = eg5_ligands[0].to_rdkit()\n    angles = _bonded_angles_from_pool(\n        rdmol=rd_mol,\n        atom_idx=17,\n        atom_pool=[a.GetIdx() for a in rd_mol.GetAtoms() if a.GetAtomicNum() > 1],\n        aromatic_only=aromatic,\n    )\n    assert angles == expected\n\n\ndef test_sort_by_distance(eg5_ligands):\n    rd_mol = eg5_ligands[0].to_rdkit()\n    sorted_atoms = _sort_by_distance_from_atom(rdmol=rd_mol, target_idx=33, atom_idxs=[1, 12, 18])\n    assert sorted_atoms == [12, 18, 1]\n\n\ndef test_get_guest_atom_pool(eg5_ligands):\n    rd_mol = eg5_ligands[0].to_rdkit()\n    rmsf = np.zeros(rd_mol.GetNumAtoms()) * unit.nanometer\n    pool_atoms, rings = _get_guest_atom_pool(\n        rdmol=rd_mol, rmsf=rmsf, rmsf_cutoff=0.1 * unit.nanometer\n    )\n    # make sure only rings were found\n    assert rings\n\n    # make sure all aromatic ring atoms are found\n    rings = get_aromatic_rings(rd_mol)\n    ring_atoms = [a for ring in rings for a in ring]\n    assert pool_atoms == set(ring_atoms)\n\n\ndef test_get_guest_atom_pool_all_heavy(eg5_ligands):\n    rd_mol = eg5_ligands[0].to_rdkit()\n    rmsf = np.zeros(rd_mol.GetNumAtoms()) * unit.nanometer\n    rings = get_aromatic_rings(rd_mol)\n    ring_atoms = [a for ring in rings for a in ring]\n    # add high rmsf values for all ring atoms\n    for i in ring_atoms:\n        rmsf[i] = 1 * unit.nanometer\n\n    pool_atoms, rings = _get_guest_atom_pool(\n        rdmol=rd_mol, rmsf=rmsf, rmsf_cutoff=0.1 * unit.nanometer\n    )\n    # make sure no rings were found\n    assert not rings\n    # make sure we get heavy atoms with no rings\n    heavy_atoms = get_heavy_atom_idxs(rd_mol)\n    assert pool_atoms == set(heavy_atoms) - set(ring_atoms)\n\n\ndef test_get_guest_atom_pool_no_atoms(eg5_ligands):\n    rd_mol = eg5_ligands[0].to_rdkit()\n    rmsf = np.ones(rd_mol.GetNumAtoms()) * unit.nanometer\n    pool_atoms, rings = _get_guest_atom_pool(\n        rdmol=rd_mol, rmsf=rmsf, rmsf_cutoff=0.1 * unit.nanometer\n    )\n    # make sure no rings were found\n    assert not rings\n    # make sure no atoms are returned\n    assert pool_atoms is None\n\n\ndef test_find_guest_atoms_normal(eg5_ligands):\n    rd_mol = eg5_ligands[0].to_rdkit()\n    lig = mda.Universe(rd_mol)\n    angles = find_guest_atom_candidates(\n        universe=lig,\n        rdmol=rd_mol,\n        guest_idxs=[a.ix for a in lig.atoms],\n    )\n    assert len(angles) == 24\n\n\ndef test_find_guest_atoms_no_atom_pool():\n    with pytest.raises(ValueError, match=\"No suitable ligand atoms were found for the restraint\"):\n        lig = mda.Universe.from_smiles(\"CC\")\n\n        _ = find_guest_atom_candidates(\n            universe=lig,\n            rdmol=lig.atoms.convert_to(\"RDKIT\"),\n            guest_idxs=[a.ix for a in lig.atoms],\n        )\n"
  },
  {
    "path": "src/openfe/tests/protocols/restraints/test_geometry_boresch_host.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\n\nimport os\n\nimport MDAnalysis as mda\nimport numpy as np\nimport pytest\nfrom numpy.testing import assert_equal\nfrom openff.units import unit\n\nfrom openfe.data._registry import POOCH_CACHE\nfrom openfe.protocols.restraint_utils.geometry.boresch.host import (\n    EvaluateBoreschAtoms,\n    EvaluateHostAtoms1,\n    EvaluateHostAtoms2,\n    find_host_anchor_bonded,\n    find_host_anchor_multi,\n    find_host_atom_candidates,\n)\nfrom openfe.protocols.restraint_utils.geometry.utils import (\n    check_angle_not_flat,\n    check_dihedral_bounds,\n    is_collinear,\n)\n\nfrom ...conftest import HAS_INTERNET\n\n\n@pytest.fixture\ndef eg5_protein_ligand_universe(eg5_protein_pdb, eg5_ligands):\n    protein = mda.Universe(eg5_protein_pdb)\n    lig = mda.Universe(eg5_ligands[1].to_rdkit())\n    # add the residue name of the ligand\n    lig.add_TopologyAttr(\"resname\", [\"LIG\"])\n    return mda.Merge(protein.atoms, lig.atoms)\n\n\n@pytest.fixture\ndef eg5_protein_ligand_universe_bonded(eg5_protein_pdb, eg5_ligands):\n    protein = mda.Universe(eg5_protein_pdb)\n    lig = mda.Universe(eg5_ligands[1].to_rdkit())\n    # add the residue name of the ligand\n    lig.add_TopologyAttr(\"resname\", [\"LIG\"])\n    merged_u = mda.Merge(protein.atoms, lig.atoms)\n    merged_u.guess_TopologyAttrs(context=\"default\", to_guess=[\"bonds\", \"angles\"])\n    return merged_u\n\n\ndef test_host_atom_candidates_dssp(eg5_protein_ligand_universe):\n    \"\"\"\n    Run DSSP search normally\n    \"\"\"\n    host_atoms = eg5_protein_ligand_universe.select_atoms(\"protein\")\n\n    idxs = find_host_atom_candidates(\n        universe=eg5_protein_ligand_universe,\n        host_idxs=host_atoms.ix,\n        # hand picked\n        guest_anchor_idx=5508,\n        host_selection=\"backbone and resnum 212:221\",\n        dssp_filter=True,\n    )\n    expected = np.array(\n        [\n            3144, 3146, 3145, 3143, 3162, 3206, 3200, 3207, 3126, 3201, 3127,\n            3163, 3199, 3202, 3164, 3125, 3165, 3177, 3208, 3179, 3124, 3216,\n            3209, 3109, 3107, 3178, 3110, 3180, 3108, 3248, 3217, 3249, 3226,\n            3218, 3228, 3227, 3250, 3219, 3251, 3229\n        ]\n    )  # fmt: skip\n    assert_equal(idxs, expected)\n\n\ndef test_host_atom_candidates_dssp_too_few_atoms(eg5_protein_ligand_universe):\n    \"\"\"\n    Make sure both dssp warnings are triggered\n    \"\"\"\n\n    host_atoms = eg5_protein_ligand_universe.select_atoms(\"protein\")\n    with (\n        pytest.warns(match=\"DSSP filter found\"),\n        pytest.warns(match=\"protein chain filter found\"),\n    ):\n        _ = find_host_atom_candidates(\n            universe=eg5_protein_ligand_universe,\n            host_idxs=host_atoms.ix,\n            # hand picked\n            guest_anchor_idx=5508,\n            host_selection=\"backbone and resnum 15:25\",\n            dssp_filter=True,\n            max_search_distance=2 * unit.nanometer,\n        )\n\n\ndef test_host_atom_candidate_small_search(eg5_protein_ligand_universe):\n    host_atoms = eg5_protein_ligand_universe.select_atoms(\"protein\")\n    with pytest.raises(ValueError, match=\"No host atoms found within the search distance\"):\n        _ = find_host_atom_candidates(\n            universe=eg5_protein_ligand_universe,\n            host_idxs=host_atoms.ix,\n            # hand picked\n            guest_anchor_idx=5508,\n            host_selection=\"backbone\",\n            dssp_filter=False,\n            max_search_distance=0.1 * unit.angstrom,\n        )\n\n\ndef test_evaluate_host1_bad_ref(eg5_protein_ligand_universe):\n    with pytest.raises(ValueError, match=\"Incorrect number of reference atoms passed\"):\n        _ = EvaluateHostAtoms1(\n            reference=eg5_protein_ligand_universe.atoms,\n            host_atom_pool=eg5_protein_ligand_universe.atoms,\n            angle_force_constant=83.68 * unit.kilojoule_per_mole / unit.radians**2,\n            temperature=298.15 * unit.kelvin,\n            minimum_distance=1 * unit.nanometer,\n        )\n\n\ndef test_evaluate_host1_good(eg5_protein_ligand_universe):\n    angle_fc = 83.68 * unit.kilojoule_per_mole / unit.radians**2\n    min_distance = 1 * unit.nanometer\n    temp = 298.15 * unit.kelvin\n    ho_eval = EvaluateHostAtoms1(\n        # picked from a successful boresch restraint search\n        reference=eg5_protein_ligand_universe.atoms[[5528, 5507, 5508]],\n        host_atom_pool=eg5_protein_ligand_universe.select_atoms(\"backbone and resnum 239\"),\n        minimum_distance=min_distance,\n        angle_force_constant=angle_fc,\n        temperature=temp,\n    )\n    # make sure properties are used during the evaluation\n    assert ho_eval.minimum_distance == min_distance.to(\"angstrom\").m\n    assert ho_eval.temperature == temp\n    assert ho_eval.angle_force_constant == angle_fc\n    ho_eval.run()\n    # make sure all atoms in this residue are valid as this is the residue selected\n    # during the automated search\n    assert ho_eval.results.valid.all()\n    assert not ho_eval.results.collinear.all()\n    assert np.allclose(\n        ho_eval.results.distances,\n        np.array([[10.79778922], [10.15903706], [11.19430463], [11.36472103]]),\n    )\n    assert np.allclose(\n        ho_eval.results.angles,\n        np.array([[1.26279048], [1.23561539], [1.15134184], [1.04697413]]),\n    )\n    assert np.allclose(\n        ho_eval.results.dihedrals,\n        np.array([[0.10499465], [-0.02396901], [-0.09271532], [-0.06136335]]),\n    )\n\n\ndef test_evaluate_host2_good(eg5_protein_ligand_universe):\n    h2_eval = EvaluateHostAtoms2(\n        # picked from a successful boresch restraint search\n        reference=eg5_protein_ligand_universe.atoms[[5528, 5507, 5508]],\n        host_atom_pool=eg5_protein_ligand_universe.select_atoms(\"backbone and resnum 264\"),\n        minimum_distance=1 * unit.nanometer,\n        angle_force_constant=83.68 * unit.kilojoule_per_mole / unit.radians**2,\n        temperature=298.15 * unit.kelvin,\n    )\n    h2_eval.run()\n    # make sure all atoms in this residue are valid as this is the residue selected\n    # during the automated search\n    assert h2_eval.results.valid.all()\n    assert not h2_eval.results.collinear.all()\n    assert np.allclose(\n        h2_eval.results.distances1,\n        np.array([[12.91959211], [13.2744748], [12.9710364], [13.44522909]]),\n    )\n    assert np.allclose(\n        h2_eval.results.distances2,\n        np.array([[12.2098888], [12.68587248], [12.38582154], [12.77150153]]),\n    )\n    assert np.allclose(\n        h2_eval.results.dihedrals,\n        np.array([[0.4069051], [0.46465918], [0.59372385], [0.65580398]]),\n    )\n\n\n@pytest.mark.slow\nclass TestFindAnchorMulti:\n    # G0-G1-G2\n    guest_atoms = [5528, 5507, 5508]\n    ref_anchor_indices = [133, 1, 16]\n    ref_h0g0_distance = 20.612924\n    ref_h0h1_distance = 25.805103\n    ref_h0h2_distance = 19.68613\n    ref_h1h2_distance = 7.47768\n\n    @pytest.fixture\n    def universe(self, eg5_protein_ligand_universe):\n        return eg5_protein_ligand_universe\n\n    @pytest.fixture\n    def host_anchor(self, universe):\n        return find_host_anchor_multi(\n            guest_atoms=universe.atoms[self.guest_atoms],\n            host_atom_pool=universe.select_atoms(\"backbone\"),\n            host_minimum_distance=0.5 * unit.nanometer,\n            guest_minimum_distance=2 * unit.nanometer,\n            angle_force_constant=83.68 * unit.kilojoule_per_mole / unit.radians**2,\n            temperature=298.15 * unit.kelvin,\n        )\n\n    def test_anchor_regression(self, host_anchor):\n        # regression test the anchor we find\n        assert_equal(host_anchor, self.ref_anchor_indices)\n\n    def test_host_guest_bond_distance(self, host_anchor, universe):\n        # check that the l0 g0 distance is at least the `guest_minimum_distance` (2nm)  for the `host_anchor` fixture.\n        dist = mda.lib.distances.calc_bonds(\n            universe.atoms[host_anchor[0]].position,\n            universe.atoms[self.guest_atoms[0]].position,\n            box=universe.dimensions,\n        )\n\n        assert dist == pytest.approx(self.ref_h0g0_distance, abs=1e-5)\n\n    def test_host_distances(self, host_anchor, universe):\n        # check the h0-h1, h1-h2, and h0-h2 distances\n        for i, j, ref in [\n            [0, 1, self.ref_h0h1_distance],\n            [1, 2, self.ref_h1h2_distance],\n            [0, 2, self.ref_h0h2_distance],\n        ]:\n            dist = mda.lib.distances.calc_bonds(\n                universe.atoms[host_anchor[i]].position,\n                universe.atoms[host_anchor[j]].position,\n                box=universe.dimensions,\n            )\n            assert dist == pytest.approx(ref, abs=1e-5)\n\n    def test_not_collinear(self, host_anchor, universe):\n        # check none of the g2-g1-g0-h0-h1-h2 vectors are not collinear\n        assert not is_collinear(\n            positions=np.vstack(\n                (\n                    universe.atoms[self.guest_atoms[::-1]].positions,\n                    universe.atoms[host_anchor].positions,\n                )\n            ),\n            atoms=[0, 1, 2, 3, 4, 5],\n            dimensions=universe.dimensions,\n        )\n\n    def test_angles(self, host_anchor, universe):\n        # check that the angles aren't flat\n        ag1 = mda.lib.distances.calc_angles(\n            universe.atoms[self.guest_atoms[1]].position,\n            universe.atoms[self.guest_atoms[0]].position,\n            universe.atoms[host_anchor[0]].position,\n            box=universe.dimensions,\n        )\n        ag2 = mda.lib.distances.calc_angles(\n            universe.atoms[self.guest_atoms[0]].position,\n            universe.atoms[host_anchor[0]].position,\n            universe.atoms[host_anchor[1]].position,\n            box=universe.dimensions,\n        )\n        for angle in [ag1, ag2]:\n            assert check_angle_not_flat(\n                angle=angle * unit.radians,\n                force_constant=83.68 * unit.kilojoule_per_mole / unit.radians**2,\n                temperature=298.15 * unit.kelvin,\n            )\n\n    def test_dihedrals(self, host_anchor, universe):\n        dih1 = mda.lib.distances.calc_dihedrals(\n            universe.atoms[self.guest_atoms[2]].position,\n            universe.atoms[self.guest_atoms[1]].position,\n            universe.atoms[self.guest_atoms[0]].position,\n            universe.atoms[host_anchor[0]].position,\n            box=universe.dimensions,\n        )\n        dih2 = mda.lib.distances.calc_dihedrals(\n            universe.atoms[self.guest_atoms[1]].position,\n            universe.atoms[self.guest_atoms[0]].position,\n            universe.atoms[host_anchor[0]].position,\n            universe.atoms[host_anchor[1]].position,\n            box=universe.dimensions,\n        )\n        dih3 = mda.lib.distances.calc_dihedrals(\n            universe.atoms[self.guest_atoms[0]].position,\n            universe.atoms[host_anchor[0]].position,\n            universe.atoms[host_anchor[1]].position,\n            universe.atoms[host_anchor[2]].position,\n            box=universe.dimensions,\n        )\n        assert check_dihedral_bounds(dih1 * unit.radians)\n        assert check_dihedral_bounds(dih2 * unit.radians)\n        assert check_dihedral_bounds(dih3 * unit.radians)\n\n\n@pytest.mark.slow\nclass TestFindAnchorBonded(TestFindAnchorMulti):\n    ref_anchor_indices = [133, 119, 118]\n    ref_h0g0_distance = 20.612924\n    ref_h0h1_distance = 1.34244\n    ref_h0h2_distance = 2.44758\n    ref_h1h2_distance = 1.53359\n\n    @pytest.fixture\n    def universe(self, eg5_protein_ligand_universe_bonded):\n        return eg5_protein_ligand_universe_bonded\n\n    @pytest.fixture\n    def host_anchor(self, universe):\n        return find_host_anchor_bonded(\n            guest_atoms=universe.atoms[self.guest_atoms],\n            host_atom_pool=universe.select_atoms(\"backbone\"),\n            guest_minimum_distance=0.5 * unit.nanometer,\n            angle_force_constant=83.68 * unit.kilojoule_per_mole / unit.radians**2,\n            temperature=298.15 * unit.kelvin,\n        )\n\n\n@pytest.mark.slow\n@pytest.mark.skipif(\n    not os.path.exists(POOCH_CACHE) and not HAS_INTERNET,\n    reason=\"Internet seems to be unavailable and test data is not cached locally.\",\n)\nclass TestFindAnchorBondedTrajectory(TestFindAnchorMulti):\n    guest_atoms = [2611, 2612, 2613]\n    ref_anchor_indices = [1253, 1254, 1255]\n    ref_h0g0_distance = 13.08494\n    ref_h0h1_distance = 1.50217\n    ref_h0h2_distance = 2.61515\n    ref_h1h2_distance = 1.55881\n\n    @pytest.fixture(scope=\"class\")\n    def universe(self, t4_lysozyme_trajectory_dir):\n        cache_dir = t4_lysozyme_trajectory_dir\n        universe = mda.Universe(\n            str(cache_dir / \"t4_toluene_complex.pdb\"),\n            str(cache_dir / \"t4_toluene_complex.xtc\"),\n        )\n        # guess bonds for the protein atoms\n        universe.select_atoms(\"protein\").guess_bonds()\n        return universe\n\n    @pytest.fixture(scope=\"class\")\n    def host_anchor(self, universe):\n        return find_host_anchor_bonded(\n            guest_atoms=universe.atoms[self.guest_atoms],\n            host_atom_pool=universe.select_atoms(\"backbone\"),\n            guest_minimum_distance=0.0 * unit.nanometer,\n            angle_force_constant=83.68 * unit.kilojoule_per_mole / unit.radians**2,\n            temperature=298.15 * unit.kelvin,\n        )\n\n\ndef test_boresch_evaluation_noatomgroup_error():\n    errmsg = \"Need to have at least one restraint\"\n    with pytest.raises(ValueError, match=errmsg):\n        EvaluateBoreschAtoms(\n            restraints=[],\n            angle_force_constant=83.68 * unit.kilojoule_per_mole / unit.radians**2,\n            temperature=298.15 * unit.kelvin,\n        )\n\n\ndef test_boresch_evaluation_incorrectnumber_error(eg5_protein_ligand_universe):\n    ag = eg5_protein_ligand_universe.atoms[:4]\n    errmsg = \"Incorrect number of restraint atoms passed\"\n    with pytest.raises(ValueError, match=errmsg):\n        EvaluateBoreschAtoms(\n            restraints=[ag],\n            angle_force_constant=83.68 * unit.kilojoule_per_mole / unit.radians**2,\n            temperature=298.15 * unit.kelvin,\n        )\n\n\n@pytest.mark.slow\ndef test_find_host_anchor_multi_none(eg5_protein_ligand_universe):\n    host_anchor = find_host_anchor_multi(\n        guest_atoms=eg5_protein_ligand_universe.atoms[[5528, 5507, 5508]],\n        host_atom_pool=eg5_protein_ligand_universe.select_atoms(\"backbone\"),\n        # Setting host and guest minimum distances to a large value so\n        # we find no atoms.\n        host_minimum_distance=4.5 * unit.nanometer,\n        guest_minimum_distance=4.5 * unit.nanometer,\n        angle_force_constant=83.68 * unit.kilojoule_per_mole / unit.radians**2,\n        temperature=298.15 * unit.kelvin,\n    )\n    # we should get None if no atoms can be found\n    assert host_anchor is None\n\n\n@pytest.mark.slow\ndef test_find_host_anchor_bonded_none(eg5_protein_ligand_universe_bonded):\n    host_anchor = find_host_anchor_bonded(\n        guest_atoms=eg5_protein_ligand_universe_bonded.atoms[[5528, 5507, 5508]],\n        host_atom_pool=eg5_protein_ligand_universe_bonded.select_atoms(\"backbone\"),\n        # Setting host and guest minimum distances to a large value so\n        # we find no atoms.\n        guest_minimum_distance=4.5 * unit.nanometer,\n        angle_force_constant=83.68 * unit.kilojoule_per_mole / unit.radians**2,\n        temperature=298.15 * unit.kelvin,\n    )\n\n    # we should get None if no atoms can be found\n    assert host_anchor is None\n\n\n@pytest.mark.slow\ndef test_find_host_anchor_bonded_nobonds_none(eg5_protein_ligand_universe):\n    # No angles were found, so it will attempt to find some\n    # It'll fail because there are no bonds available.\n    with pytest.warns(UserWarning, match=\"no angles found\"):\n        host_anchor = find_host_anchor_bonded(\n            guest_atoms=eg5_protein_ligand_universe.atoms[[5528, 5507, 5508]],\n            host_atom_pool=eg5_protein_ligand_universe.select_atoms(\"backbone\"),\n            # Setting host and guest minimum distances to a large value so\n            # we find no atoms.\n            guest_minimum_distance=0.5 * unit.nanometer,\n            angle_force_constant=83.68 * unit.kilojoule_per_mole / unit.radians**2,\n            temperature=298.15 * unit.kelvin,\n        )\n\n    # we should get None if no atoms can be found\n    assert host_anchor is None\n"
  },
  {
    "path": "src/openfe/tests/protocols/restraints/test_geometry_flatbottom.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\n\nimport MDAnalysis as mda\nimport pytest\nfrom openff.units import unit\n\nfrom openfe.protocols.restraint_utils.geometry.flatbottom import (\n    FlatBottomDistanceGeometry,\n    get_flatbottom_distance_restraint,\n)\n\n\n@pytest.fixture()\ndef eg5_protein_ligand_universe(eg5_protein_pdb, eg5_ligands):\n    protein = mda.Universe(eg5_protein_pdb)\n    lig = mda.Universe(eg5_ligands[1].to_rdkit())\n    # add the residue name of the ligand\n    lig.add_TopologyAttr(\"resname\", [\"LIG\"])\n    return mda.Merge(protein.atoms, lig.atoms)\n\n\ndef test_no_atoms_found(eg5_protein_ligand_universe):\n    with pytest.raises(ValueError, match=\"no atoms found in either the host or guest\"):\n        _ = get_flatbottom_distance_restraint(\n            universe=eg5_protein_ligand_universe,\n            # the protein starts at 15\n            host_selection=\"resnum 2\",\n            # the ligand is resnum 1, get only the heavy atoms\n            guest_selection=\"resname LIG and not name H*\",\n        )\n\n\n@pytest.mark.parametrize(\n    \"padding, well_radius\",\n    [\n        pytest.param(0.5, 0.666, id=\"0.5\"),\n        pytest.param(0.8, 0.966, id=\"0.8\"),\n    ],\n)\ndef test_get_flatbottom_restraint_from_selection(eg5_protein_ligand_universe, padding, well_radius):\n    expected_guest_atoms = eg5_protein_ligand_universe.select_atoms(\"resname LIG and not name H*\")\n    water_atoms = eg5_protein_ligand_universe.select_atoms(\"resname HOH\")\n    restraint_geometry = get_flatbottom_distance_restraint(\n        universe=eg5_protein_ligand_universe,\n        # select all residues around the ligand\n        host_selection=\"backbone and same resid as (around 4 resname LIG) and not resname HOH\",\n        # get all heavy atoms in the ligand\n        guest_selection=\"resname LIG and not name H*\",\n        padding=padding * unit.nanometer,\n    )\n    # make sure the guest atoms cover all heavy atoms in the ligand\n    assert restraint_geometry.guest_atoms == [a.ix for a in expected_guest_atoms]\n    # make sure no water atoms are selected as a host\n    assert not any(a.ix for a in water_atoms if a.ix in restraint_geometry.host_atoms)\n    assert isinstance(restraint_geometry, FlatBottomDistanceGeometry)\n    # probably could have a tighter check if we wanted\n    assert well_radius == pytest.approx(restraint_geometry.well_radius.to(\"nanometer\").m, abs=1e-4)\n\n\ndef test_get_flatbottom_restraint_from_atoms(eg5_protein_ligand_universe):\n    expected_guest_atoms = eg5_protein_ligand_universe.select_atoms(\"resname LIG and not name H*\")\n    host_atoms = eg5_protein_ligand_universe.select_atoms(\n        \"backbone and same resid as (around 4 resname LIG) and not resname HOH\"\n    )\n    host_atom_ix = [a.ix for a in host_atoms]\n    restraint_geometry = get_flatbottom_distance_restraint(\n        universe=eg5_protein_ligand_universe,\n        # take all host atoms within 4 angstroms\n        host_atoms=host_atom_ix,\n        # take the first few ligand atoms\n        guest_atoms=[5496, 5497, 5498, 5500],\n    )\n    guest_atoms = [a.ix for a in expected_guest_atoms]\n    assert all(i in guest_atoms for i in restraint_geometry.guest_atoms)\n    assert restraint_geometry.host_atoms == host_atom_ix\n    assert 1.1415 == pytest.approx(restraint_geometry.well_radius.to(\"nanometer\").m, abs=1e-4)\n"
  },
  {
    "path": "src/openfe/tests/protocols/restraints/test_geometry_harmonic.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\n\nimport MDAnalysis as mda\nimport pytest\n\nfrom openfe.protocols.restraint_utils.geometry.harmonic import (\n    DistanceRestraintGeometry,\n    get_distance_restraint,\n    get_molecule_centers_restraint,\n)\n\n\n@pytest.fixture()\ndef eg5_protein_ligand_universe(eg5_protein_pdb, eg5_ligands):\n    protein = mda.Universe(eg5_protein_pdb)\n    lig = mda.Universe(eg5_ligands[1].to_rdkit())\n    # add the residue name of the ligand\n    lig.add_TopologyAttr(\"resname\", [\"LIG\"])\n    return mda.Merge(protein.atoms, lig.atoms)\n\n\ndef test_hostguest_geometry():\n    \"\"\"\n    A very basic will it build test.\n    \"\"\"\n    geom = DistanceRestraintGeometry(guest_atoms=[1, 2, 3], host_atoms=[4])\n\n    assert isinstance(geom, DistanceRestraintGeometry)\n\n\ndef test_get_distance_restraint_selection(eg5_protein_ligand_universe):\n    \"\"\"\n    Check that you get a distance restraint using atom selections.\n    \"\"\"\n    expected_guest_atoms = eg5_protein_ligand_universe.select_atoms(\"resname LIG and not name H*\")\n    water_atoms = eg5_protein_ligand_universe.select_atoms(\"resname HOH\")\n    restraint_geometry = get_distance_restraint(\n        universe=eg5_protein_ligand_universe,\n        host_selection=\"backbone and same resid as (around 4 resname LIG) and not resname HOH\",\n        guest_selection=\"resname LIG and not name H*\",\n    )\n\n    # make sure the guest atoms cover all heavy atoms in the ligand\n    assert restraint_geometry.guest_atoms == [a.ix for a in expected_guest_atoms]\n    # make sure no water atoms are selected as a host\n    assert not any(a.ix for a in water_atoms if a.ix in restraint_geometry.host_atoms)\n    assert isinstance(restraint_geometry, DistanceRestraintGeometry)\n\n\ndef test_get_distance_restraint_atom_list(eg5_protein_ligand_universe):\n    \"\"\"\n    Check that we can get a restraint using a set of host and guest atom lists\n    \"\"\"\n    expected_guest_atoms = eg5_protein_ligand_universe.select_atoms(\"resname LIG and not name H*\")\n    host_atoms = [1, 2, 3]\n    restraint_geometry = get_distance_restraint(\n        universe=eg5_protein_ligand_universe,\n        # take the first few protein atoms\n        host_atoms=host_atoms,\n        # take the first few ligand atoms\n        guest_atoms=[5496, 5497, 5498, 5500],\n    )\n    guest_atoms = [a.ix for a in expected_guest_atoms]\n    assert all(i in guest_atoms for i in restraint_geometry.guest_atoms)\n    assert restraint_geometry.host_atoms == host_atoms\n\n\ndef test_get_molecule_centers_restraint(eg5_ligands):\n    \"\"\"\n    Create a centers distance restraint between pairs of ligands\n    \"\"\"\n    ligand_a, ligand_b = eg5_ligands\n    lig_a_rdmol = ligand_a.to_rdkit()\n    n_atoms_a = lig_a_rdmol.GetNumAtoms()\n    lig_b_rdmol = ligand_b.to_rdkit()\n    restraint_geometry = get_molecule_centers_restraint(\n        molA_rdmol=lig_a_rdmol,\n        molB_rdmol=lig_b_rdmol,\n        molA_idxs=[i for i in range(n_atoms_a)],\n        molB_idxs=[i + n_atoms_a for i in range(lig_b_rdmol.GetNumAtoms())],\n    )\n    assert isinstance(restraint_geometry, DistanceRestraintGeometry)\n    assert restraint_geometry.guest_atoms[0] <= n_atoms_a\n    assert restraint_geometry.host_atoms[0] > n_atoms_a\n"
  },
  {
    "path": "src/openfe/tests/protocols/restraints/test_geometry_utils.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\n\nimport itertools\nimport os\nfrom importlib import resources\n\nimport MDAnalysis as mda\nimport numpy as np\nimport pytest\nfrom openff.units import unit\nfrom rdkit import Chem\n\nfrom openfe.data._registry import POOCH_CACHE\nfrom openfe.protocols.restraint_utils.geometry.utils import (\n    CentroidDistanceSort,\n    FindHostAtoms,\n    _atomgroup_has_bonds,\n    _get_mda_selection,\n    _wrap_angle,\n    check_angle_not_flat,\n    check_angular_variance,\n    check_dihedral_bounds,\n    get_aromatic_atom_idxs,\n    get_aromatic_rings,\n    get_central_atom_idx,\n    get_heavy_atom_idxs,\n    get_local_rmsf,\n    is_collinear,\n    protein_chain_selection,\n    stable_secondary_structure_selection,\n)\n\nfrom ...conftest import HAS_INTERNET\n\n\n@pytest.fixture(scope=\"module\")\ndef eg5_pdb_universe(eg5_protein_pdb):\n    return mda.Universe(eg5_protein_pdb)\n\n\n@pytest.fixture\ndef eg5_protein_ligand_universe(eg5_protein_pdb, eg5_ligands):\n    protein = mda.Universe(eg5_protein_pdb)\n    lig = mda.Universe(eg5_ligands[1].to_rdkit())\n    # add the residue name of the ligand\n    lig.add_TopologyAttr(\"resname\", [\"LIG\"])\n    return mda.Merge(protein.atoms, lig.atoms)\n\n\n@pytest.fixture\ndef beta_barrel_universe():\n    with resources.as_file(resources.files(\"openfe.tests.data\")) as d:\n        beta_barrel_universe = mda.Universe(str(d / \"6CZJ.pdb.gz\"))\n    return beta_barrel_universe\n\n\ndef test_mda_selection_none_error(eg5_pdb_universe):\n    with pytest.raises(ValueError, match=\"one of either\"):\n        _ = _get_mda_selection(eg5_pdb_universe)\n\n\ndef test_mda_selection_both_args_error(eg5_pdb_universe):\n    with pytest.raises(ValueError, match=\"both atom_list and\"):\n        _ = _get_mda_selection(eg5_pdb_universe, atom_list=[0, 1, 2, 3], selection=\"all\")\n\n\ndef test_mda_selection_universe_atom_list(eg5_pdb_universe):\n    test_ag = _get_mda_selection(eg5_pdb_universe, atom_list=[0, 1, 2])\n    assert eg5_pdb_universe.atoms[[0, 1, 2]] == test_ag\n\n\ndef test_mda_selection_atomgroup_string(eg5_pdb_universe):\n    # test that the selection is reducing the atom group\n    test_ag = _get_mda_selection(eg5_pdb_universe.atoms, selection=\"protein\")\n    assert test_ag != eg5_pdb_universe.atoms\n    assert test_ag.n_atoms == 5474\n\n\n@pytest.mark.parametrize(\n    \"smiles, expected\",\n    [\n        [\"C1CCCCC1\", []],\n        [\"[C@@H]1([C@@H]([C@@H](OC([C@@H]1O)O)C(=O)O)O)O\", []],\n        [\"C1=CC=CC=C1\", [6]],\n        [\"C1=CC2C=CC1C=C2\", [8]],\n        [\"C1CC2=CC=CC=C2C1\", [6]],\n        [\"C1=COC=C1\", [5]],\n        [\"C1=CC=C2C=CC=CC2=C1\", [10]],\n        [\"C1=CC=C(C=C1)C2=CC=CC=C2\", [6, 6]],\n        [\"C1=CC=C(C=C1)C(C2=CC=CC=C2)(C3=CC=CC=C3Cl)N4C=CN=C4\", [6, 6, 6, 5]],\n    ],\n)\ndef test_aromatic_rings(smiles, expected):\n    mol = Chem.AddHs(Chem.MolFromSmiles(smiles))\n\n    # get the rings\n    rings = get_aromatic_rings(mol)\n\n    # check we have the right number of rings & their size\n    for i, r in enumerate(rings):\n        assert len(r) == expected[i]\n\n    # check that there is no overlap in atoms between each ring\n    for x, y in itertools.combinations(rings, 2):\n        assert x.isdisjoint(y)\n\n    # get the aromatic idx\n    arom_idxs = get_aromatic_atom_idxs(mol)\n\n    # Check that all the ring indices are aromatic\n    assert all(idx in arom_idxs for idx in itertools.chain(*rings))\n\n    # Also check the lengths match\n    assert sum(len(r) for r in rings) == len(arom_idxs)\n\n    # Finally check that all the arom_idxs are actually aromatic\n    for idx in arom_idxs:\n        at = mol.GetAtomWithIdx(idx)\n        assert at.GetIsAromatic()\n\n\n@pytest.mark.parametrize(\n    \"smiles, nheavy, nlight\",\n    [\n        [\"C1CCCCC1\", 6, 12],\n        [\"[C@@H]1([C@@H]([C@@H](OC([C@@H]1O)O)C(=O)O)O)O\", 13, 10],\n        [\"C1=CC=CC=C1\", 6, 6],\n        [\"C1=CC2C=CC1C=C2\", 8, 8],\n        [\"C1CC2=CC=CC=C2C1\", 9, 10],\n        [\"C1=COC=C1\", 5, 4],\n        [\"C1=CC=C2C=CC=CC2=C1\", 10, 8],\n        [\"C1=CC=C(C=C1)C2=CC=CC=C2\", 12, 10],\n        [\"C1=CC=C(C=C1)C(C2=CC=CC=C2)(C3=CC=CC=C3Cl)N4C=CN=C4\", 25, 17],\n    ],\n)\ndef test_heavy_atoms(smiles, nheavy, nlight):\n    mol = Chem.AddHs(Chem.MolFromSmiles(smiles))\n\n    n_atoms = len(list(mol.GetAtoms()))\n\n    heavy_atoms = get_heavy_atom_idxs(mol)\n\n    # check all the heavy atoms are indeed heavy\n    for idx in heavy_atoms:\n        at = mol.GetAtomWithIdx(idx)\n        assert at.GetAtomicNum() > 1\n\n    assert len(heavy_atoms) == nheavy\n    assert n_atoms == nheavy + nlight\n\n\n@pytest.mark.parametrize(\n    \"smiles, idx\",\n    [\n        [\"C1CCCCC1\", 2],\n        [\"[C@@H]1([C@@H]([C@@H](OC([C@@H]1O)O)C(=O)O)O)O\", 3],\n        [\"C1=CC=CC=C1\", 2],\n        [\"C1=CC2C=CC1C=C2\", 2],\n        [\"C1CC2=CC=CC=C2C1\", 2],\n        [\"C1=COC=C1\", 4],\n        [\"C1=CC=C2C=CC=CC2=C1\", 3],\n        [\"C1=CC=C(C=C1)C2=CC=CC=C2\", 6],\n        [\"C1=CC=C(C=C1)C(C2=CC=CC=C2)(C3=CC=CC=C3Cl)N4C=CN=C4\", 6],\n        [\"OC(COc1ccc(cc1)CC(=O)N)CNC(C)C\", 3],\n    ],\n)\ndef test_central_idx(smiles, idx):\n    \"\"\"\n    Regression tests for getting central atom idx.\n    \"\"\"\n    rdmol = Chem.AddHs(Chem.MolFromSmiles(smiles))\n    assert get_central_atom_idx(rdmol) == idx\n\n\ndef test_central_atom_disconnected():\n    mol = Chem.AddHs(Chem.MolFromSmiles(\"C.C\"))\n\n    with pytest.raises(ValueError, match=\"disconnected molecule\"):\n        _ = get_central_atom_idx(mol)\n\n\ndef test_collinear_too_few_atoms():\n    with pytest.raises(ValueError, match=\"Too few atoms passed\"):\n        _ = is_collinear(None, [1, 2], None)\n\n\ndef test_collinear_index_match_error_length():\n    with pytest.raises(ValueError, match=\"indices do not match\"):\n        _ = is_collinear(\n            positions=np.zeros((3, 3)),\n            atoms=[0, 1, 2, 3],\n        )\n\n\ndef test_collinear_index_match_error_index():\n    with pytest.raises(ValueError, match=\"atoms is not a list of index integers\"):\n        _ = is_collinear(\n            positions=np.zeros((4, 3)),\n            atoms=[1, 2.5, 3],\n        )\n\n\n@pytest.mark.parametrize(\n    \"arr, thresh, truth\",\n    [\n        [[[0, 0, -1], [1, 0, 0], [2, 0, 1]], 0.9, True],\n        [[[0, 0, -1], [1, 0, 0], [2, 0, 2]], 0.9, True],\n        [[[0, 0, -1], [1, 0, 0], [2, 0, 2]], 0.95, False],\n        [[[0, 1, -1], [1, 0, 0], [2, 0, 1]], 0.9, False],\n        [[[0, 1, -1], [1, 1, 0], [2, 1, 1]], 0.9, True],\n        [[[0, 1, -1], [1, 1, 0], [2, 1, 2]], 0.95, False],\n        [[[0, 0, -1], [1, 1, 0], [2, 2, 1]], 0.95, True],\n        [[[0, 0, -1], [1, 0, 0], [2, 0, 1]], 0.95, True],\n        [[[2, 0, -1], [1, 0, 0], [0, 0, 1]], 0.95, True],\n        [[[0, 0, 1], [0, 0, 0], [0, 0, 2]], 0.95, True],\n        [[[1, 1, 1], [0, 0, 0], [2, 2, 2]], 0.9, True],\n    ],\n)\ndef test_is_collinear_three_atoms(arr, thresh, truth):\n    assert (\n        is_collinear(\n            positions=np.array(arr),\n            atoms=[0, 1, 2],\n            threshold=thresh,\n        )\n        == truth\n    )\n\n\n@pytest.mark.parametrize(\n    \"arr, truth, dims\",\n    [\n        [[[0, 0, -1], [1, 0, 0], [2, 0, 1]], True, True],\n        [[[0, 0, -1], [1, 0, 0], [2, 0, 11]], False, False],\n        [[[0, 0, -1], [1, 0, 0], [2, 0, 11]], True, True],\n        [[[0, 0, -1], [1, 0, 0], [2, 0, 2]], False, True],\n        [[[0, 0, -1], [1, 0, 0], [2, 0, 12]], False, False],\n        [[[0, 0, -1], [1, 0, 0], [2, 0, 12]], False, True],\n    ],\n)\ndef test_is_collinear_three_atoms_dimensions(arr, truth, dims):\n    if dims:\n        dimensions = np.array([10.0, 10.0, 10.0, 90.0, 90.0, 90.0], dtype=float)\n    else:\n        dimensions = None\n\n    assert (\n        is_collinear(\n            positions=np.array(arr, dtype=float),\n            atoms=[0, 1, 2],\n            threshold=0.99,\n            dimensions=dimensions,\n        )\n        == truth\n    )\n\n\n@pytest.mark.parametrize(\n    \"arr, tresh, truth\",\n    [\n        # collinear all\n        [[[0, 0, -1], [1, 0, 0], [2, 0, 1], [3, 0, 2]], 0.99, True],\n        # not collinear for all\n        [[[0, 0, -1], [1, 0, 0], [2, 0, 2], [3, 0, 2]], 0.99, False],\n        # not collinear but within threshold\n        [[[0, 0, -1], [1, 0, 0], [2, 0, 2], [3, 0, 2]], 0.9, True],\n        # collinear for v3 and v4\n        [[[0, 0, -1], [1, 0, 0], [2, 0, 2], [3, 0, 4]], 0.99, True],\n        # collinear for v1 and v2\n        [[[0, 0, -1], [1, 0, 0], [2, 0, 1], [3, 0, 4]], 0.99, True],\n        # not collinear for all\n        [[[0, 1, -1], [1, 0, 0], [2, 0, 2], [3, 0, 2]], 0.99, False],\n    ],\n)\ndef test_is_collinear_four_atoms(arr, tresh, truth):\n    assert (\n        is_collinear(\n            positions=np.array(arr),\n            atoms=[0, 1, 2, 3],\n            threshold=tresh,\n        )\n        == truth\n    )\n\n\ndef test_wrap_angle_degrees():\n    for i in range(0, 361, 1):\n        angle = _wrap_angle(i * unit.degrees)\n        if i > 180:\n            expected = ((i - 360) * unit.degrees).to(\"radians\").m\n        else:\n            expected = (i * unit.degrees).to(\"radians\").m\n\n        assert angle.m == pytest.approx(expected)\n\n\n@pytest.mark.parametrize(\n    \"angle, expected\",\n    [\n        [0 * unit.radians, 0 * unit.radians],\n        [1 * unit.radians, 1 * unit.radians],\n        [4 * unit.radians, 4 - (2 * np.pi) * unit.radians],\n        [-4 * unit.radians, -4 + (2 * np.pi) * unit.radians],\n    ],\n)\ndef test_wrap_angle_radians(angle, expected):\n    assert _wrap_angle(angle) == pytest.approx(expected)\n\n\n@pytest.mark.parametrize(\n    \"limit, force, temperature\",\n    [\n        [0.7695366605411506, 83.68, 298.15],\n        [0.8339791717799163, 83.68, 350.0],\n        [0.5441445910402979, 167.36, 298.15],\n    ],\n)\ndef test_angle_not_flat(limit, force, temperature):\n    limit = limit * unit.radians\n    force = force * unit.kilojoule_per_mole / unit.radians**2\n    temperature = temperature * unit.kelvin\n\n    # test upper\n    assert check_angle_not_flat(limit + 0.01, force, temperature)\n    assert not check_angle_not_flat(limit - 0.01, force, temperature)\n\n    # test lower\n    limit = np.pi - limit\n    assert check_angle_not_flat(limit - 0.01, force, temperature)\n    assert not check_angle_not_flat(limit + 0.01, force, temperature)\n\n\n@pytest.mark.parametrize(\n    \"dihed, expected\",\n    [\n        [3 * unit.radians, False],\n        [0 * unit.radians, True],\n        [-3 * unit.radians, False],\n        [300 * unit.degrees, True],\n        [181 * unit.degrees, False],\n    ],\n)\ndef test_check_dihedral_bounds(dihed, expected):\n    ret = check_dihedral_bounds(dihed)\n    assert ret == expected\n\n\n@pytest.mark.parametrize(\n    \"dihed, lower, upper, expected\",\n    [\n        [3 * unit.radians, -3.1 * unit.radians, 3.1 * unit.radians, True],\n        [300 * unit.degrees, -61 * unit.degrees, 301 * unit.degrees, True],\n        [300 * unit.degrees, 299 * unit.degrees, -61 * unit.degrees, False],\n    ],\n)\ndef test_check_dihedral_bounds_defined(dihed, lower, upper, expected):\n    ret = check_dihedral_bounds(dihed, lower_cutoff=lower, upper_cutoff=upper)\n    assert ret == expected\n\n\ndef test_angular_variance():\n    \"\"\"\n    Manual check with for an input number of angles with\n    a known variance of 0.36216\n    \"\"\"\n    angles = [0, 1, 2, 6]\n\n    assert check_angular_variance(\n        angles=angles * unit.radians,\n        upper_bound=np.pi * unit.radians,\n        lower_bound=-np.pi * unit.radians,\n        width=0.37 * unit.radians,\n    )\n\n    assert not check_angular_variance(\n        angles=angles * unit.radians,\n        upper_bound=np.pi * unit.radians,\n        lower_bound=-np.pi * unit.radians,\n        width=0.35 * unit.radians,\n    )\n\n\ndef test_atomgroup_has_bonds(eg5_protein_pdb):\n    # Creating a new universe because we'll modify this one\n    u = mda.Universe(eg5_protein_pdb)\n\n    # PDB has water bonds\n    assert len(u.bonds) == 14\n    assert not _atomgroup_has_bonds(u)\n    assert _atomgroup_has_bonds(u.select_atoms(\"resname HOH\"))\n\n    # Delete the topology attr and everything is false\n    u.del_TopologyAttr(\"bonds\")\n    assert not _atomgroup_has_bonds(u)\n    assert not _atomgroup_has_bonds(u.select_atoms(\"resname HOH\"))\n\n    # Guess some bonds back\n    ag = u.atoms[:100]\n    ag.guess_bonds()\n    assert _atomgroup_has_bonds(ag)\n\n\n@pytest.fixture()\ndef t4_lysozyme_trajectory_universe(t4_lysozyme_trajectory_dir):\n    cache_dir = t4_lysozyme_trajectory_dir\n    universe = mda.Universe(\n        str(cache_dir / \"t4_toluene_complex.pdb\"),\n        str(cache_dir / \"t4_toluene_complex.xtc\"),\n    )\n    return universe\n\n\n@pytest.mark.skipif(\n    not os.path.exists(POOCH_CACHE) and not HAS_INTERNET,\n    reason=\"Internet seems to be unavailable and test data is not cached locally.\",\n)\ndef test_atomgroup_has_bonds_ions(t4_lysozyme_trajectory_universe):\n    # make a copy of the universe so we don't change things\n    u = t4_lysozyme_trajectory_universe.copy()\n\n    # Toluene (16) and cap (5) have bonds\n    assert len(u.bonds) == 21\n    assert not _atomgroup_has_bonds(u)\n    assert _atomgroup_has_bonds(u.select_atoms(\"resname UNK\"))\n\n    # Guess the bonds, ions won't have them but otherwise all residues should\n    u.select_atoms(\"not resname NA CL\").guess_bonds()  # don't guess ions\n    assert _atomgroup_has_bonds(u)\n\n\ndef test_centroid_distance_sort(eg5_protein_ligand_universe):\n    # quickly sort the atoms of the first residue\n    atom_sort = CentroidDistanceSort(\n        sortable_atoms=eg5_protein_ligand_universe.select_atoms(\"backbone and resnum 15\"),\n        reference_atoms=eg5_protein_ligand_universe.select_atoms(\"resname LIG\"),\n    )\n    atom_sort.run()\n    sorted_ids = [a.ix for a in atom_sort.results.sorted_atomgroup]\n    # hard code the ids we expect\n    assert sorted_ids == [2, 1]\n\n\ndef test_find_host_atoms(eg5_protein_ligand_universe):\n    # very small window to limit atoms for speed\n    min_cutoff = 1 * unit.nanometer\n    max_cutoff = 1.1 * unit.nanometer\n\n    atom_finder = FindHostAtoms(\n        host_atoms=eg5_protein_ligand_universe.select_atoms(\"backbone\"),\n        # hand picked ring atom\n        guest_atoms=eg5_protein_ligand_universe.atoms[5528],\n        min_search_distance=min_cutoff,\n        max_search_distance=max_cutoff,\n    )\n    atom_finder.min_cutoff == min_cutoff.to(\"angstrom\").m\n    atom_finder.max_cutoff == max_cutoff.to(\"angstrom\").m\n\n    atom_finder.run()\n    # should find the 28 close backbone atoms\n    assert len(atom_finder.results.host_idxs) == 28\n\n\ndef test_get_rmsf_single_frame(eg5_protein_ligand_universe):\n    ligand = eg5_protein_ligand_universe.select_atoms(\"resname LIG\")\n    rmsf = get_local_rmsf(atomgroup=ligand)\n    # as we have a single frame we should get all zeros back\n    assert np.allclose(rmsf.m, np.zeros(ligand.n_atoms))\n\n\n@pytest.mark.skipif(\n    not os.path.exists(POOCH_CACHE) and not HAS_INTERNET,\n    reason=\"Internet seems to be unavailable and test data is not cached locally.\",\n)\ndef test_get_rmsf_trajectory(t4_lysozyme_trajectory_universe):\n    # get the RMSF of just the ligand\n    ligand = t4_lysozyme_trajectory_universe.select_atoms(\"resname UNK\")\n    rmsf = get_local_rmsf(atomgroup=ligand)\n    assert len(rmsf) == ligand.n_atoms\n    # regression test the calculation of the rmsf\n    assert np.allclose(\n        rmsf.to(\"angstrom\").m,\n        np.array(\n            [\n                0.054697843819888965,\n                0.07512308066036011,\n                0.06000502046267635,\n                0.07180001811557828,\n                0.043416981393784,\n                0.05909972948285153,\n                0.13061051498104648,\n                0.15166255437235665,\n                0.17860692733595412,\n                0.1483198866730507,\n                0.14193714526412668,\n                0.06730488032625732,\n                1.0235330857263523,\n                1.0048466548200004,\n                1.0209553834502236,\n            ]\n        ),\n    )\n\n\n@pytest.mark.skipif(\n    not os.path.exists(POOCH_CACHE) and not HAS_INTERNET,\n    reason=\"Internet seems to be unavailable and test data is not cached locally.\",\n)\nclass TestStableSelection:\n    def test_stable_ss_selection(self, t4_lysozyme_trajectory_universe):\n        ligand = t4_lysozyme_trajectory_universe.select_atoms(\"resname LIG\")\n\n        # Topology is PDB so bonds will be missing\n        with pytest.warns(match=\"No bonds found in input Universe, will attempt to guess them.\"):\n            stable_protein = stable_secondary_structure_selection(\n                # DDSP should filter by protein we will check at the end\n                atomgroup=t4_lysozyme_trajectory_universe.atoms,\n            )\n            # make sure the ligand is not in this selection\n            overlapping_ligand = stable_protein.intersection(ligand.atoms)\n            assert overlapping_ligand.n_atoms == 0\n            # make sure we get the expected number of atoms\n            assert stable_protein.n_atoms == 780\n\n    def test_small_chain(self, t4_lysozyme_trajectory_universe):\n        \"\"\"\n        Artificially set min_structure_size so large that no chains are recognised.\n        \"\"\"\n        stable_protein = stable_secondary_structure_selection(\n            atomgroup=t4_lysozyme_trajectory_universe.atoms,\n            min_structure_size=999,\n        )\n\n        # Should have an empty atomgroup\n        assert len(stable_protein) == 0\n\n    def test_bad_dssp(self, t4_lysozyme_trajectory_universe):\n        \"\"\"\n        Cause DSSP to fail to yield an empty atomgroup.\n        \"\"\"\n        u_copy = t4_lysozyme_trajectory_universe.copy()\n\n        # rename all CA atoms to LA to make things break\n        for at in u_copy.atoms:\n            at.name = \"LA\"\n\n        stable_protein = stable_secondary_structure_selection(\n            atomgroup=u_copy.atoms,\n        )\n\n        # Should have an empty atomgroup\n        assert len(stable_protein) == 0\n\n    def test_beta_dssp(self, beta_barrel_universe):\n        \"\"\"\n        6CZJ is a straight up beta-barrel\n        \"\"\"\n        stable_protein = stable_secondary_structure_selection(\n            atomgroup=beta_barrel_universe.atoms,\n        )\n\n        assert len(stable_protein.residues) == 59\n\n\ndef test_protein_chain_selection(eg5_protein_ligand_universe):\n    ligand = eg5_protein_ligand_universe.select_atoms(\"resname LIG\")\n\n    # Topology is PDB so bonds will be missing\n    with pytest.warns(match=\"No bonds found in input Universe, will attempt to guess them.\"):\n        chain_selection = protein_chain_selection(\n            # the selection should filter for the protein we will check at the end\n            atomgroup=eg5_protein_ligand_universe.atoms,\n        )\n        overlapping_ligand = chain_selection.intersection(ligand.atoms)\n        assert overlapping_ligand.n_atoms == 0\n        # make sure we get the expected number of atoms\n        assert chain_selection.n_atoms == 5150\n\n\ndef test_protein_chain_selection_subchain(eg5_pdb_universe):\n    \"\"\"\n    Pass a subset of the residues in a chain\n    \"\"\"\n\n    sele = protein_chain_selection(\n        atomgroup=eg5_pdb_universe.residues[:28].atoms,\n    )\n\n    assert len(sele.residues) == 18\n    assert len(sele) == 282\n\n\ndef test_protein_chain_selection_nochains(eg5_pdb_universe):\n    \"\"\"\n    Artificially bump up the minimum number of residues per\n    chain such that we don't have any chains.\n    \"\"\"\n\n    sele = protein_chain_selection(\n        atomgroup=eg5_pdb_universe.atoms,\n        min_chain_length=99999,\n    )\n\n    assert len(sele) == 0\n\n\ndef test_protein_chain_selection_trim_too_large(eg5_pdb_universe):\n    \"\"\"\n    Use artificially large trim sizes that are greater than the length of the residue.\n    \"\"\"\n\n    sele = protein_chain_selection(\n        atomgroup=eg5_pdb_universe.atoms,\n        min_chain_length=30,\n        trim_chain_start=5000,\n        trim_chain_end=8000,\n    )\n\n    assert len(sele) == 0\n"
  },
  {
    "path": "src/openfe/tests/protocols/restraints/test_omm_restraints.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\n\nimport os\n\nimport openmm\nimport pytest\nfrom gufe import SmallMoleculeComponent\nfrom openff.units import unit\nfrom openmmtools.states import ThermodynamicState\n\nfrom openfe.data._registry import POOCH_CACHE\nfrom openfe.protocols.restraint_utils.openmm.omm_restraints import (\n    BoreschRestraint,\n    BoreschRestraintGeometry,\n    BoreschRestraintSettings,\n    CentroidFlatBottomRestraint,\n    CentroidHarmonicRestraint,\n    DistanceRestraintGeometry,\n    FlatBottomBondRestraint,\n    FlatBottomDistanceGeometry,\n    HarmonicBondRestraint,\n    RestraintParameterState,\n)\nfrom openfe.protocols.restraint_utils.settings import (\n    DistanceRestraintSettings,\n    FlatBottomRestraintSettings,\n)\n\nfrom ...conftest import HAS_INTERNET\n\n\ndef test_parameter_state_default():\n    param_state = RestraintParameterState()\n    assert param_state.lambda_restraints is None\n\n\n@pytest.mark.parametrize(\"suffix\", [None, \"foo\"])\n@pytest.mark.parametrize(\"lambda_var\", [0, 0.5, 1.0])\ndef test_parameter_state_suffix(suffix, lambda_var):\n    param_state = RestraintParameterState(\n        parameters_name_suffix=suffix, lambda_restraints=lambda_var\n    )\n\n    if suffix is not None:\n        param_name = f\"lambda_restraints_{suffix}\"\n    else:\n        param_name = \"lambda_restraints\"\n\n    assert getattr(param_state, param_name) == lambda_var\n    assert len(param_state._parameters.keys()) == 1\n    assert param_state._parameters[param_name] == lambda_var\n    assert param_state._parameters_name_suffix == suffix\n\n\n@pytest.mark.parametrize(\n    \"restraint, geometry_settings\",\n    [\n        pytest.param(HarmonicBondRestraint, {}, id=\"Harmonic\"),\n        pytest.param(\n            FlatBottomBondRestraint,\n            {\"well_radius\": 0.1 * unit.nanometer},\n            id=\"Flatbottom\",\n        ),\n    ],\n)\ndef test_single_bond_mixin(restraint, geometry_settings):\n    res = restraint(\n        restraint_settings=restraint._settings_cls(\n            spring_constant=20 * unit.kilojoule_per_mole / unit.nanometer**2\n        )\n    )\n    geometry_settings.update({\"guest_atoms\": [0, 1], \"host_atoms\": [2, 3]})\n    with pytest.raises(\n        ValueError, match=\"host_atoms and guest_atoms must only include a single index\"\n    ):\n        res._verify_geometry(geometry=res._geometry_cls(**geometry_settings))\n\n\ndef test_verify_inputs():\n    with pytest.raises(ValueError, match=\"Incorrect settings type DistanceRestraintSettings\"):\n        _ = FlatBottomBondRestraint(\n            restraint_settings=DistanceRestraintSettings(\n                spring_constant=20 * unit.kilojoule_per_mole / unit.nanometer**2\n            )\n        )\n\n\ndef test_verify_geometry():\n    with pytest.raises(ValueError, match=\"Incorrect geometry class type DistanceRestraintGeometry\"):\n        restraint = FlatBottomBondRestraint(\n            restraint_settings=FlatBottomRestraintSettings(\n                spring_constant=20 * unit.kilojoule_per_mole / unit.nanometer**2\n            )\n        )\n        geometry = DistanceRestraintGeometry(guest_atoms=[0], host_atoms=[1])\n        restraint._verify_geometry(geometry)\n\n\n@pytest.fixture\ndef tyk2_protein_ligand_system(industry_benchmark_files):\n    with open(\n        str(industry_benchmark_files / \"jacs_set\" / \"tyk2\" / \"protein_ligand_system.xml\")\n    ) as xml:\n        return openmm.XmlSerializer.deserialize(xml.read())\n\n\n@pytest.fixture\ndef tyk2_rdkit_ligand(industry_benchmark_files):\n    ligand = SmallMoleculeComponent.from_sdf_file(\n        str(industry_benchmark_files / \"jacs_set\" / \"tyk2\" / \"test_ligand.sdf\")\n    )\n    return ligand.to_rdkit()\n\n\n@pytest.mark.skipif(\n    not os.path.exists(POOCH_CACHE) and not HAS_INTERNET,\n    reason=\"Internet seems to be unavailable and test data is not cached locally.\",\n)\ndef test_harmonic_add_force(tyk2_protein_ligand_system):\n    restraint = HarmonicBondRestraint(\n        restraint_settings=DistanceRestraintSettings(\n            spring_constant=20 * unit.kilojoule_per_mole / unit.nanometer**2\n        )\n    )\n    state = ThermodynamicState(system=tyk2_protein_ligand_system)\n    geometry = DistanceRestraintGeometry(host_atoms=[0], guest_atoms=[4706])\n    restraint.add_force(\n        thermodynamic_state=state,\n        geometry=geometry,\n        controlling_parameter_name=\"lambda_restraints\",\n    )\n    system = state.system\n    forces = {force.__class__.__name__: force for force in system.getForces()}\n    restraint_force = forces[\"CustomBondForce\"]\n    # some other random global parameter is included in this force\n    assert restraint_force.getGlobalParameterName(1) == \"lambda_restraints\"\n    assert restraint_force.getEnergyFunction() == \"lambda_restraints * ((K/2)*r^2)\"\n    assert restraint_force.getNumBonds() == 1\n    # some other random global parameter is included in this force otherwise there should be 1\n    assert restraint_force.getNumGlobalParameters() == 2\n    # check the restraint parameters\n    host_atom, guest_atom, params = restraint_force.getBondParameters(0)\n    assert host_atom == geometry.host_atoms[0]\n    assert guest_atom == geometry.guest_atoms[0]\n    assert params[0] == restraint.settings.spring_constant.m\n\n\n@pytest.mark.skipif(\n    not os.path.exists(POOCH_CACHE) and not HAS_INTERNET,\n    reason=\"Internet seems to be unavailable and test data is not cached locally.\",\n)\ndef test_flatbottom_add_force(tyk2_protein_ligand_system):\n    restraint = FlatBottomBondRestraint(\n        restraint_settings=FlatBottomRestraintSettings(\n            spring_constant=20 * unit.kilojoule_per_mole / unit.nanometer**2\n        )\n    )\n    state = ThermodynamicState(system=tyk2_protein_ligand_system)\n    geometry = FlatBottomDistanceGeometry(\n        host_atoms=[0], guest_atoms=[4706], well_radius=1 * unit.nanometer\n    )\n    restraint.add_force(\n        thermodynamic_state=state,\n        geometry=geometry,\n        controlling_parameter_name=\"lambda_restraints\",\n    )\n    system = state.system\n    forces = {force.__class__.__name__: force for force in system.getForces()}\n    restraint_force = forces[\"CustomBondForce\"]\n    # some other random global parameter is included in this force\n    assert restraint_force.getGlobalParameterName(1) == \"lambda_restraints\"\n    assert (\n        restraint_force.getEnergyFunction() == \"lambda_restraints * (step(r-r0) * (K/2)*(r-r0)^2)\"\n    )\n    assert restraint_force.getNumBonds() == 1\n    # some other random global parameter is included in this force otherwise there should be 1\n    assert restraint_force.getNumGlobalParameters() == 2\n    # check the restraint parameters\n    host_atom, guest_atom, params = restraint_force.getBondParameters(0)\n    assert host_atom == geometry.host_atoms[0]\n    assert guest_atom == geometry.guest_atoms[0]\n    assert params[0] == restraint.settings.spring_constant.m\n    assert params[1] == geometry.well_radius.m\n\n\n@pytest.mark.skipif(\n    not os.path.exists(POOCH_CACHE) and not HAS_INTERNET,\n    reason=\"Internet seems to be unavailable and test data is not cached locally.\",\n)\ndef test_centriod_harmonic_add_force(tyk2_protein_ligand_system):\n    restraint = CentroidHarmonicRestraint(\n        restraint_settings=DistanceRestraintSettings(\n            spring_constant=20 * unit.kilojoule_per_mole / unit.nanometer**2\n        )\n    )\n    state = ThermodynamicState(system=tyk2_protein_ligand_system)\n    geometry = DistanceRestraintGeometry(\n        host_atoms=[0, 1, 2],\n        guest_atoms=[4706, 4705, 4704],\n    )\n    restraint.add_force(\n        thermodynamic_state=state,\n        geometry=geometry,\n        controlling_parameter_name=\"lambda_restraints\",\n    )\n    system = state.system\n    forces = {force.__class__.__name__: force for force in system.getForces()}\n    restraint_force = forces[\"CustomCentroidBondForce\"]\n    assert restraint_force.getGlobalParameterName(1) == \"lambda_restraints\"\n    assert restraint_force.getEnergyFunction() == \"lambda_restraints * ((K/2)*distance(g1,g2)^2)\"\n    assert restraint_force.getNumBonds() == 1\n    # some other random global parameter is included in this force otherwise there should be 1\n    assert restraint_force.getNumGlobalParameters() == 2\n    # check the restraint parameters\n    groups, params = restraint_force.getBondParameters(0)\n\n    assert params[0] == restraint.settings.spring_constant.m\n    host_atoms = list(restraint_force.getGroupParameters(0)[0])\n    guest_atoms = list(restraint_force.getGroupParameters(1)[0])\n    assert host_atoms == geometry.host_atoms\n    assert guest_atoms == geometry.guest_atoms\n\n\n@pytest.mark.skipif(\n    not os.path.exists(POOCH_CACHE) and not HAS_INTERNET,\n    reason=\"Internet seems to be unavailable and test data is not cached locally.\",\n)\ndef test_centroid_flat_bottom_add_force(tyk2_protein_ligand_system):\n    restraint = CentroidFlatBottomRestraint(\n        restraint_settings=FlatBottomRestraintSettings(\n            spring_constant=20 * unit.kilojoule_per_mole / unit.nanometer**2\n        )\n    )\n    state = ThermodynamicState(system=tyk2_protein_ligand_system)\n    geometry = FlatBottomDistanceGeometry(\n        host_atoms=[0, 1, 2],\n        guest_atoms=[4706, 4705, 4704],\n        well_radius=1 * unit.nanometer,\n    )\n    restraint.add_force(\n        thermodynamic_state=state,\n        geometry=geometry,\n        controlling_parameter_name=\"lambda_restraints\",\n    )\n    system = state.system\n    forces = {force.__class__.__name__: force for force in system.getForces()}\n    restraint_force = forces[\"CustomCentroidBondForce\"]\n    # some other random global parameter is included in this force\n    assert restraint_force.getGlobalParameterName(1) == \"lambda_restraints\"\n    assert (\n        restraint_force.getEnergyFunction()\n        == \"lambda_restraints * (step(distance(g1,g2)-r0) * (K/2)*(distance(g1,g2)-r0)^2)\"\n    )\n    assert restraint_force.getNumBonds() == 1\n    # some other random global parameter is included in this force otherwise there should be 1\n    assert restraint_force.getNumGlobalParameters() == 2\n    # check the restraint parameters\n    groups, params = restraint_force.getBondParameters(0)\n    assert params[0] == restraint.settings.spring_constant.m\n    assert params[1] == geometry.well_radius.m\n    host_atoms = list(restraint_force.getGroupParameters(0)[0])\n    guest_atoms = list(restraint_force.getGroupParameters(1)[0])\n    assert host_atoms == geometry.host_atoms\n    assert guest_atoms == geometry.guest_atoms\n\n\n@pytest.mark.skipif(\n    not os.path.exists(POOCH_CACHE) and not HAS_INTERNET,\n    reason=\"Internet seems to be unavailable and test data is not cached locally.\",\n)\ndef test_add_boresch_force(tyk2_protein_ligand_system, tyk2_rdkit_ligand):\n    restraint = BoreschRestraint(restraint_settings=BoreschRestraintSettings())\n    # create the geometry from the saved values in the sdf file\n    geometry = BoreschRestraintGeometry(\n        r_aA0=tyk2_rdkit_ligand.GetDoubleProp(\"r_aA0\") * unit.nanometer,\n        theta_A0=tyk2_rdkit_ligand.GetDoubleProp(\"theta_A0\") * unit.radians,\n        theta_B0=tyk2_rdkit_ligand.GetDoubleProp(\"theta_B0\") * unit.radians,\n        phi_A0=tyk2_rdkit_ligand.GetDoubleProp(\"phi_A0\") * unit.radians,\n        phi_B0=tyk2_rdkit_ligand.GetDoubleProp(\"phi_B0\") * unit.radians,\n        phi_C0=tyk2_rdkit_ligand.GetDoubleProp(\"phi_C0\") * unit.radians,\n        host_atoms=[tyk2_rdkit_ligand.GetIntProp(f\"Host{i}\") for i in range(3)],\n        guest_atoms=[tyk2_rdkit_ligand.GetIntProp(f\"Guest{i}\") for i in range(3)],\n    )\n    state = ThermodynamicState(system=tyk2_protein_ligand_system)\n    restraint.add_force(\n        thermodynamic_state=state,\n        geometry=geometry,\n        controlling_parameter_name=\"lambda_restraints\",\n    )\n    system = state.system\n    forces = {force.__class__.__name__: force for force in system.getForces()}\n    restraint_force = forces[\"CustomCompoundBondForce\"]\n    assert restraint_force.getGlobalParameterName(0) == \"lambda_restraints\"\n    assert \"lambda_restraints\" in restraint_force.getEnergyFunction()\n    assert restraint_force.getNumGlobalParameters() == 1\n    assert restraint_force.getNumBonds() == 1\n    atoms, parameters = restraint_force.getBondParameters(0)\n    assert geometry.host_atoms == list(atoms[:3][::-1])\n    assert geometry.guest_atoms == list(atoms[3:])\n    # check all the parameters\n    for i in range(restraint_force.getNumPerBondParameters()):\n        per_bond_parameter = restraint_force.getPerBondParameterName(i)\n        # if we have a force constant check the settings\n        if per_bond_parameter[0] == \"K\":\n            assert parameters[i] == getattr(restraint.settings, per_bond_parameter).m\n        # else check the geometry\n        else:\n            assert parameters[i] == getattr(geometry, per_bond_parameter).m\n\n\n@pytest.mark.skipif(\n    not os.path.exists(POOCH_CACHE) and not HAS_INTERNET,\n    reason=\"Internet seems to be unavailable and test data is not cached locally.\",\n)\ndef test_get_boresch_state_correction(tyk2_protein_ligand_system, tyk2_rdkit_ligand):\n    restraint = BoreschRestraint(restraint_settings=BoreschRestraintSettings())\n    # create the geometry from the saved values in the sdf file\n    geometry = BoreschRestraintGeometry(\n        r_aA0=tyk2_rdkit_ligand.GetDoubleProp(\"r_aA0\") * unit.nanometer,\n        theta_A0=tyk2_rdkit_ligand.GetDoubleProp(\"theta_A0\") * unit.radians,\n        theta_B0=tyk2_rdkit_ligand.GetDoubleProp(\"theta_B0\") * unit.radians,\n        phi_A0=tyk2_rdkit_ligand.GetDoubleProp(\"phi_A0\") * unit.radians,\n        phi_B0=tyk2_rdkit_ligand.GetDoubleProp(\"phi_B0\") * unit.radians,\n        phi_C0=tyk2_rdkit_ligand.GetDoubleProp(\"phi_C0\") * unit.radians,\n        host_atoms=[tyk2_rdkit_ligand.GetIntProp(f\"Host{i}\") for i in range(3)],\n        guest_atoms=[tyk2_rdkit_ligand.GetIntProp(f\"Guest{i}\") for i in range(3)],\n    )\n\n    state = ThermodynamicState(system=tyk2_protein_ligand_system)\n    correction = restraint.get_standard_state_correction(\n        thermodynamic_state=state, geometry=geometry\n    )\n    assert pytest.approx(correction.to(unit.kilocalorie_per_mole).m) == -9.28421610202858\n"
  },
  {
    "path": "src/openfe/tests/protocols/restraints/test_openmm_forces.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\n\nimport numpy as np\nimport openmm\nimport pytest\n\nfrom openfe.protocols.restraint_utils.openmm.omm_forces import (\n    add_force_in_separate_group,\n    get_boresch_energy_function,\n    get_custom_compound_bond_force,\n    get_periodic_boresch_energy_function,\n)\n\n\n@pytest.mark.parametrize(\"param\", [\"foo\", \"bar\"])\ndef test_boresch_energy_function(param):\n    \"\"\"\n    Base regression test for the energy function\n    \"\"\"\n    fn = get_boresch_energy_function(param)\n    assert fn == (\n        f\"{param} * E; \"\n        \"E = (K_r/2)*(distance(p3,p4) - r_aA0)^2 \"\n        \"+ (K_thetaA/2)*(angle(p2,p3,p4)-theta_A0)^2 + (K_thetaB/2)*(angle(p3,p4,p5)-theta_B0)^2 \"\n        \"+ (K_phiA/2)*dphi_A^2 + (K_phiB/2)*dphi_B^2 + (K_phiC/2)*dphi_C^2; \"\n        \"dphi_A = dA - floor(dA/(2.0*pi)+0.5)*(2.0*pi); dA = dihedral(p1,p2,p3,p4) - phi_A0; \"\n        \"dphi_B = dB - floor(dB/(2.0*pi)+0.5)*(2.0*pi); dB = dihedral(p2,p3,p4,p5) - phi_B0; \"\n        \"dphi_C = dC - floor(dC/(2.0*pi)+0.5)*(2.0*pi); dC = dihedral(p3,p4,p5,p6) - phi_C0; \"\n        f\"pi = {np.pi}; \"\n    )\n\n\n@pytest.mark.parametrize(\"param\", [\"foo\", \"bar\"])\ndef test_periodic_boresch_energy_function(param):\n    \"\"\"\n    Base regression test for the energy function\n    \"\"\"\n    fn = get_periodic_boresch_energy_function(param)\n    assert fn == (\n        f\"{param} * E; \"\n        \"E = (K_r/2)*(distance(p3,p4) - r_aA0)^2 \"\n        \"+ (K_thetaA/2)*(angle(p2,p3,p4)-theta_A0)^2 + (K_thetaB/2)*(angle(p3,p4,p5)-theta_B0)^2 \"\n        \"+ (K_phiA/2)*uphi_A + (K_phiB/2)*uphi_B + (K_phiC/2)*uphi_C; \"\n        \"uphi_A = (1-cos(dA)); dA = dihedral(p1,p2,p3,p4) - phi_A0; \"\n        \"uphi_B = (1-cos(dB)); dB = dihedral(p2,p3,p4,p5) - phi_B0; \"\n        \"uphi_C = (1-cos(dC)); dC = dihedral(p3,p4,p5,p6) - phi_C0; \"\n        f\"pi = {np.pi}; \"\n    )\n\n\n@pytest.mark.parametrize(\"num_atoms\", [6, 20])\ndef test_custom_compound_force(num_atoms):\n    fn = get_boresch_energy_function(\"lambda_restraints\")\n    force = get_custom_compound_bond_force(fn, num_atoms)\n\n    # Check we have the right object\n    assert isinstance(force, openmm.CustomCompoundBondForce)\n\n    # Check the energy function\n    assert force.getEnergyFunction() == fn\n\n    # Check the number of particles\n    assert force.getNumParticlesPerBond() == num_atoms\n\n\n@pytest.mark.parametrize(\n    \"groups, expected\",\n    [\n        [[0, 1, 2, 3, 4], 5],\n        [[1, 2, 3, 4, 5], 0],\n    ],\n)\ndef test_add_force_in_separate_group(groups, expected):\n    # Create an empty system\n    system = openmm.System()\n\n    # Create some forces with some force groups\n    base_forces = [\n        openmm.NonbondedForce(),\n        openmm.HarmonicBondForce(),\n        openmm.HarmonicAngleForce(),\n        openmm.PeriodicTorsionForce(),\n        openmm.CMMotionRemover(),\n    ]\n\n    for force, group in zip(base_forces, groups):\n        force.setForceGroup(group)\n\n    [system.addForce(force) for force in base_forces]\n\n    # Get your CustomCompoundBondForce\n    fn = get_boresch_energy_function(\"lambda_restraints\")\n    new_force = get_custom_compound_bond_force(fn, 6)\n    # new_force.setForceGroup(5)\n    # system.addForce(new_force)\n    add_force_in_separate_group(system=system, force=new_force)\n\n    # Loop through and check that we go assigned the expected force group\n    for force in system.getForces():\n        if isinstance(force, openmm.CustomCompoundBondForce):\n            assert force.getForceGroup() == expected\n\n\ndef test_add_too_many_force_groups():\n    # Create a system\n    system = openmm.System()\n\n    # Fill it upu with 32 forces with different groups\n    for i in range(32):\n        f = openmm.HarmonicBondForce()\n        f.setForceGroup(i)\n        system.addForce(f)\n\n    # Now try to add another force\n    with pytest.raises(ValueError, match=\"No available force group\"):\n        add_force_in_separate_group(system=system, force=openmm.HarmonicBondForce())\n"
  },
  {
    "path": "src/openfe/tests/protocols/restraints/test_settings.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\n\"\"\"\nTest the restraint settings.\n\"\"\"\n\nimport pytest\nfrom openff.units import unit\n\nfrom openfe.protocols.restraint_utils.settings import (\n    BoreschRestraintSettings,\n    DistanceRestraintSettings,\n    FlatBottomRestraintSettings,\n)\n\n\ndef test_distance_restraint_settings_default():\n    \"\"\"\n    Basic settings regression test\n    \"\"\"\n    settings = DistanceRestraintSettings(\n        spring_constant=10 * unit.kilojoule_per_mole / unit.nm**2,\n    )\n    assert settings.central_atoms_only is False\n    assert isinstance(settings, DistanceRestraintSettings)\n\n\ndef test_distance_restraint_negative_idxs():\n    \"\"\"\n    Check that an error is raised if you have negative\n    atom indices in host atoms.\n    \"\"\"\n    with pytest.raises(ValueError, match=\"negative indices passed\"):\n        _ = DistanceRestraintSettings(\n            spring_constant=10 * unit.kilojoule_per_mole / unit.nm**2,\n            host_atoms=[-1, 0, 2],\n            guest_atoms=[0, 1, 2],\n        )\n\n\ndef test_flatbottom_restraint_settings_default():\n    \"\"\"\n    Basic settings regression test\n    \"\"\"\n    settings = FlatBottomRestraintSettings(\n        spring_constant=10 * unit.kilojoule_per_mole / unit.nm**2,\n        well_radius=1 * unit.nanometer,\n    )\n    assert isinstance(settings, FlatBottomRestraintSettings)\n\n\ndef test_flatbottom_restraint_negative_well():\n    \"\"\"\n    Check that an error is raised if you have a negative\n    well radius.\n    \"\"\"\n    with pytest.raises(ValueError, match=\"well radius cannot be negative\"):\n        _ = FlatBottomRestraintSettings(\n            spring_constant=10 * unit.kilojoule_per_mole / unit.nm**2,\n            well_radius=-1 * unit.nm,\n        )\n\n\ndef test_boresch_restraint_settings_default():\n    \"\"\"\n    Basic settings regression test\n    \"\"\"\n    settings = BoreschRestraintSettings(\n        K_r=10 * unit.kilojoule_per_mole / unit.nm**2,\n        K_thetaA=10 * unit.kilojoule_per_mole / unit.radians**2,\n        K_thetaB=10 * unit.kilojoule_per_mole / unit.radians**2,\n        K_phiA=10 * unit.kilojoule_per_mole / unit.radians**2,\n        K_phiB=10 * unit.kilojoule_per_mole / unit.radians**2,\n        K_phiC=10 * unit.kilojoule_per_mole / unit.radians**2,\n    )\n    assert isinstance(settings, BoreschRestraintSettings)\n\n\n# TODO: re-enable this Issue #1556\n# def test_boresch_restraint_negative_idxs():\n#     \"\"\"\n#     Check that the positive_idxs_list validator is\n#     working as expected.\n#     \"\"\"\n#     with pytest.raises(ValueError, match=\"negative indices\"):\n#         _ = BoreschRestraintSettings(\n#             K_r=10 * unit.kilojoule_per_mole / unit.nm**2,\n#             K_thetaA=10 * unit.kilojoule_per_mole / unit.radians**2,\n#             K_thetaB=10 * unit.kilojoule_per_mole / unit.radians**2,\n#             phi_A0=10 * unit.kilojoule_per_mole / unit.radians**2,\n#             phi_B0=10 * unit.kilojoule_per_mole / unit.radians**2,\n#             phi_C0=10 * unit.kilojoule_per_mole / unit.radians**2,\n#             host_atoms=[-1, 0],\n#             guest_atoms=[0, 1],\n#         )\n"
  },
  {
    "path": "src/openfe/tests/protocols/test_openmm_settings.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\n\nimport numpy as np\nimport pytest\nfrom openff.units import unit\n\nfrom openfe.protocols.openmm_rfe import equil_rfe_settings\n\n# afe settings currently have no FloatQuantity values\nfrom openfe.protocols.openmm_utils import omm_settings\n\n\nclass TestOMMSettingsFromStrings:\n    # checks that we can set Settings fields via strings\n    def test_system_settings(self):\n        s = omm_settings.OpenMMSystemGeneratorFFSettings()\n\n        s.nonbonded_cutoff = \"1.1 nm\"\n\n        assert s.nonbonded_cutoff == 1.1 * unit.nanometer\n\n    def test_solvation_settings(self):\n        s = omm_settings.OpenMMSolvationSettings()\n\n        s.solvent_padding = \"1.1 nm\"\n\n        assert s.solvent_padding == 1.1 * unit.nanometer\n\n    def test_alchemical_sampler_settings(self):\n        # todo: early_termination_target_error is in kT, how to pass this as string?\n        pass\n\n    def test_integator_settings(self):\n        s = omm_settings.IntegratorSettings()\n\n        s.timestep = \"3 fs\"\n\n        assert s.timestep == 3.0 * unit.femtosecond\n\n        s.langevin_collision_rate = \"1.1 / ps\"\n\n        assert s.langevin_collision_rate == 1.1 / unit.picosecond\n\n        # todo: nsteps, barostat frequency require IntQuantity\n\n    def test_simulation_settings(self):\n        s = omm_settings.SimulationSettings(\n            equilibration_length=2.0 * unit.nanosecond,\n            production_length=5.0 * unit.nanosecond,\n        )\n\n        s.equilibration_length = \"2.5 ns\"\n        s.production_length = \"10 ns\"\n\n        assert s.equilibration_length == 2.5 * unit.nanosecond\n        assert s.production_length == 10.0 * unit.nanosecond\n\n\nclass TestEquilRFESettingsFromString:\n    def test_alchemical_settings(self):\n        s = equil_rfe_settings.AlchemicalSettings(softcore_LJ=\"gapsys\")\n\n        s.explicit_charge_correction_cutoff = \"0.85 nm\"\n\n        assert s.explicit_charge_correction_cutoff == 0.85 * unit.nanometer\n\n\nclass TestOpenMMSolvationSettings:\n    def test_unreduced_box_vectors(self):\n        s = omm_settings.OpenMMSolvationSettings()\n\n        # Taken from interchange tests, but we require units\n        # rhombic dodecahedron with first and last rows swapped\n        box_vectors = (\n            np.asarray(\n                [\n                    [0.5, 0.5, np.sqrt(2.0) / 2.0],\n                    [0.0, 1.0, 0.0],\n                    [1.0, 0.0, 0.0],\n                ],\n            )\n            * unit.nanometer\n        )\n\n        with pytest.raises(ValueError, match=\"not in OpenMM reduced form\"):\n            s.box_vectors = box_vectors\n\n    @pytest.mark.parametrize(\"n_solv\", [0, -1])\n    def test_non_positive_solvent(self, n_solv):\n        s = omm_settings.OpenMMSolvationSettings()\n\n        with pytest.raises(ValueError, match=\"must be positive\"):\n            s.number_of_solvent_molecules = n_solv\n\n    def test_box_size_properties_non_1d(self):\n        s = omm_settings.OpenMMSolvationSettings()\n\n        with pytest.raises(ValueError, match=\"must be a 1-D array\"):\n            s.box_size = np.array([[1, 2, 3], [1, 2, 3]]) * unit.angstrom\n\n\nclass TestOpenMMEngineSettings:\n    @pytest.mark.parametrize(\"platform\", [\"CUDA\", \"OpenCL\", \"cPu\"])\n    def test_ok_platforms(self, platform):\n        s = omm_settings.OpenMMEngineSettings(compute_platform=platform)\n        assert isinstance(s, omm_settings.OpenMMEngineSettings)\n\n    def test_fail_platform(self):\n        with pytest.raises(ValueError, match=\"OpenMM compute backends\"):\n            _ = omm_settings.OpenMMEngineSettings(compute_platform=\"foo\")\n"
  },
  {
    "path": "src/openfe/tests/protocols/test_openmmutils.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\nimport copy\nimport gzip\nimport os\nimport sys\nfrom importlib import resources\nfrom pathlib import Path\nfrom unittest import mock\n\nimport numpy as np\nimport pooch\nimport pytest\nfrom gufe import BaseSolventComponent\nfrom gufe.components.errors import ComponentValidationError\nfrom gufe.settings import OpenMMSystemGeneratorFFSettings, ThermoSettings\nfrom numpy.testing import assert_allclose, assert_equal\nfrom openff.toolkit import Molecule as OFFMol\nfrom openff.toolkit.utils.toolkit_registry import ToolkitRegistry\nfrom openff.toolkit.utils.toolkits import RDKitToolkitWrapper\nfrom openff.units import unit\nfrom openff.units.openmm import ensure_quantity, from_openmm, to_openmm\nfrom openmm import MonteCarloBarostat, MonteCarloMembraneBarostat, NonbondedForce, app\nfrom openmm import unit as ommunit\nfrom openmmtools import multistate\nfrom pymbar.utils import ParameterError\n\nimport openfe\nfrom openfe.data._registry import POOCH_CACHE\nfrom openfe.protocols.openmm_rfe.equil_rfe_settings import (\n    IntegratorSettings,\n    OpenMMSolvationSettings,\n)\nfrom openfe.protocols.openmm_utils import (\n    charge_generation,\n    multistate_analysis,\n    omm_settings,\n    settings_validation,\n    system_creation,\n    system_validation,\n)\nfrom openfe.protocols.openmm_utils.charge_generation import (\n    HAS_ESPALOMA_CHARGE,\n    HAS_NAGL,\n    HAS_OPENEYE,\n)\n\nfrom ..conftest import HAS_INTERNET\n\n\n@pytest.mark.parametrize(\n    \"padding, number_solv, box_vectors, box_size\",\n    [\n        [1.2 * unit.nanometer, 20, 20 * np.identity(3) * unit.angstrom, [2, 2, 2] * unit.angstrom],\n        [1.2 * unit.nanometer, None, None, [2, 2, 2] * unit.angstrom],\n        [1.2 * unit.nanometer, None, 20 * np.identity(3) * unit.angstrom, None],\n        [1.2 * unit.nanometer, 20, None, None],\n    ],\n)\ndef test_validate_ommsolvation_settings_unique_settings(\n    padding, number_solv, box_vectors, box_size\n):\n    settings = OpenMMSolvationSettings(\n        solvent_padding=padding,\n        number_of_solvent_molecules=number_solv,\n        box_vectors=box_vectors,\n        box_size=box_size,\n    )\n\n    errmsg = \"Only one of solvent_padding, number_of_solvent_molecules,\"\n    with pytest.raises(ValueError, match=errmsg):\n        settings_validation.validate_openmm_solvation_settings(settings)\n\n\n@pytest.mark.parametrize(\n    \"box_vectors, box_size\",\n    [\n        [20 * np.identity(3) * unit.angstrom, None],\n        [None, [2, 2, 2] * unit.angstrom],\n    ],\n)\ndef test_validate_ommsolvation_settings_shape_conflicts(\n    box_vectors,\n    box_size,\n):\n    settings = OpenMMSolvationSettings(\n        solvent_padding=None,\n        box_vectors=box_vectors,\n        box_size=box_size,\n        box_shape=\"cube\",\n    )\n\n    errmsg = \"box_shape cannot be defined alongside either box_size\"\n    with pytest.raises(ValueError, match=errmsg):\n        settings_validation.validate_openmm_solvation_settings(settings)\n\n\ndef test_validate_timestep():\n    with pytest.raises(ValueError, match=\"too large for hydrogen mass\"):\n        settings_validation.validate_timestep(2.0, 4.0 * unit.femtoseconds)\n\n\n@pytest.mark.parametrize(\n    \"s,ts,mc,es\",\n    [\n        [5 * unit.nanoseconds, 4 * unit.femtoseconds, 250, 1250000],\n        [1 * unit.nanoseconds, 4 * unit.femtoseconds, 250, 250000],\n        [1 * unit.picoseconds, 2 * unit.femtoseconds, 250, 500],\n    ],\n)\ndef test_get_simsteps(s, ts, mc, es):\n    sim_steps = settings_validation.get_simsteps(s, ts, mc)\n\n    assert sim_steps == es\n\n\ndef test_get_simsteps_indivisible_simtime():\n    errmsg = \"Simulation time not divisible by timestep\"\n    timelength = 1.003 * unit.picosecond\n    with pytest.raises(ValueError, match=errmsg):\n        settings_validation.get_simsteps(timelength, 2 * unit.femtoseconds, 100)\n\n\ndef test_mc_indivisible():\n    errmsg = \"Simulation time 1.0 ps should contain\"\n    timelength = 1 * unit.picoseconds\n    with pytest.raises(ValueError, match=errmsg):\n        settings_validation.get_simsteps(timelength, 2 * unit.femtoseconds, 1000)\n\n\ndef test_get_alchemical_components(benzene_modifications, T4_protein_component):\n    stateA = openfe.ChemicalSystem(\n        {\n            \"A\": benzene_modifications[\"benzene\"],\n            \"B\": benzene_modifications[\"toluene\"],\n            \"P\": T4_protein_component,\n            \"S\": openfe.SolventComponent(smiles=\"C\"),\n        }\n    )\n    stateB = openfe.ChemicalSystem(\n        {\n            \"A\": benzene_modifications[\"benzene\"],\n            \"B\": benzene_modifications[\"benzonitrile\"],\n            \"P\": T4_protein_component,\n            \"S\": openfe.SolventComponent(),\n        }\n    )\n\n    alchem_comps = system_validation.get_alchemical_components(stateA, stateB)\n\n    assert len(alchem_comps[\"stateA\"]) == 2\n    assert benzene_modifications[\"toluene\"] in alchem_comps[\"stateA\"]\n    assert openfe.SolventComponent(smiles=\"C\") in alchem_comps[\"stateA\"]\n    assert len(alchem_comps[\"stateB\"]) == 2\n    assert benzene_modifications[\"benzonitrile\"] in alchem_comps[\"stateB\"]\n    assert openfe.SolventComponent() in alchem_comps[\"stateB\"]\n\n\ndef test_duplicate_chemical_components(benzene_modifications):\n    stateA = openfe.ChemicalSystem(\n        {\n            \"A\": benzene_modifications[\"toluene\"],\n            \"B\": benzene_modifications[\"toluene\"],\n        }\n    )\n    stateB = openfe.ChemicalSystem({\"A\": benzene_modifications[\"toluene\"]})\n\n    errmsg = \"state A components B:\"\n\n    with pytest.raises(ValueError, match=errmsg):\n        system_validation.get_alchemical_components(stateA, stateB)\n\n\ndef test_validate_solvent_nocutoff(benzene_modifications):\n    state = openfe.ChemicalSystem(\n        {\"A\": benzene_modifications[\"toluene\"], \"S\": openfe.SolventComponent()}\n    )\n\n    with pytest.raises(ValueError, match=\"nocutoff cannot be used\"):\n        system_validation.validate_solvent(state, \"nocutoff\")\n\n\ndef test_validate_solvent_multiple_solvent(benzene_modifications):\n    state = openfe.ChemicalSystem(\n        {\n            \"A\": benzene_modifications[\"toluene\"],\n            \"S\": openfe.SolventComponent(),\n            \"S2\": openfe.SolventComponent(),\n        }\n    )\n\n    with pytest.raises(ValueError, match=\"Multiple SolventComponent\"):\n        system_validation.validate_solvent(state, \"pme\")\n\n\ndef test_validate_solvent_multiple_solvated(benzene_modifications, a2a_protein_membrane_component):\n    state = openfe.ChemicalSystem(\n        {\n            \"A\": benzene_modifications[\"toluene\"],\n            \"S\": a2a_protein_membrane_component,\n            \"S2\": a2a_protein_membrane_component,\n        }\n    )\n\n    with pytest.raises(ValueError, match=\"Multiple SolvatedPDBComponent\"):\n        system_validation.validate_solvent(state, \"pme\")\n\n\ndef test_not_water_solvent(benzene_modifications):\n    state = openfe.ChemicalSystem(\n        {\"A\": benzene_modifications[\"toluene\"], \"S\": openfe.SolventComponent(smiles=\"C\")}\n    )\n\n    with pytest.raises(ValueError, match=\"Non water solvent\"):\n        system_validation.validate_solvent(state, \"pme\")\n\n\ndef test_multiple_proteins(T4_protein_component):\n    state = openfe.ChemicalSystem({\"A\": T4_protein_component, \"B\": T4_protein_component})\n\n    with pytest.raises(ValueError, match=\"Multiple ProteinComponent\"):\n        system_validation.validate_protein(state)\n\n\ndef test_membrane_protein_warns_with_non_membrane_barostat(a2a_protein_membrane_component):\n    state = openfe.ChemicalSystem({\"A\": a2a_protein_membrane_component})\n    with pytest.warns(UserWarning, match=\"ProteinMembraneComponent\"):\n        system_validation.validate_barostat(\n            state,\n            barostat=\"MonteCarloBarostat\",\n        )\n\n\ndef test_non_membrane_protein_warns_with_membrane_barostat(T4_protein_component):\n    state = openfe.ChemicalSystem({\"A\": T4_protein_component})\n    with pytest.warns(UserWarning, match=\"MonteCarloMembraneBarostat\"):\n        system_validation.validate_barostat(\n            state,\n            barostat=\"MonteCarloMembraneBarostat\",\n        )\n\n\ndef test_get_components_gas(benzene_modifications):\n    state = openfe.ChemicalSystem(\n        {\n            \"A\": benzene_modifications[\"benzene\"],\n            \"B\": benzene_modifications[\"toluene\"],\n        }\n    )\n\n    s, p, mols = system_validation.get_components(state)\n\n    assert s is None\n    assert p is None\n    assert len(mols) == 2\n\n\ndef test_components_solvent(benzene_modifications):\n    state = openfe.ChemicalSystem(\n        {\n            \"S\": openfe.SolventComponent(),\n            \"A\": benzene_modifications[\"benzene\"],\n            \"B\": benzene_modifications[\"toluene\"],\n        }\n    )\n\n    s, p, mols = system_validation.get_components(state)\n\n    assert s == openfe.SolventComponent()\n    assert p is None\n    assert len(mols) == 2\n\n\ndef test_components_complex(T4_protein_component, benzene_modifications):\n    state = openfe.ChemicalSystem(\n        {\n            \"S\": openfe.SolventComponent(),\n            \"A\": benzene_modifications[\"benzene\"],\n            \"B\": benzene_modifications[\"toluene\"],\n            \"P\": T4_protein_component,\n        }\n    )\n\n    s, p, mols = system_validation.get_components(state)\n\n    assert s == openfe.SolventComponent()\n    assert p == T4_protein_component\n    assert len(mols) == 2\n\n\ndef test_validate_chemical_system(a2a_protein_membrane_pdb):\n    inflated_box_vectors = (\n        np.asarray(\n            [\n                [1000, 0, 0],\n                [0, 1000, 0],\n                [0, 0, 1000],\n            ]\n        )\n        * unit.nanometer\n    )\n\n    with gzip.open(a2a_protein_membrane_pdb, \"rb\") as f:\n        comp = openfe.ProteinMembraneComponent.from_pdb_file(\n            f, name=\"a2a\", box_vectors=inflated_box_vectors\n        )\n\n    chemical_system = openfe.ChemicalSystem({\"protein\": comp}, name=\"A\")\n\n    errmsg = \"Component protein from ChemicalSystem A failed validation\"\n    with pytest.raises(ComponentValidationError, match=errmsg):\n        system_validation.validate_chemical_system(chemical_system)\n\n\n@pytest.fixture(scope=\"module\")\ndef get_settings():\n    forcefield_settings = OpenMMSystemGeneratorFFSettings()\n    integrator_settings = IntegratorSettings()\n    thermo_settings = ThermoSettings(\n        temperature=298.15 * unit.kelvin,\n        pressure=1 * unit.bar,\n    )\n\n    return forcefield_settings, integrator_settings, thermo_settings\n\n\nclass TestFEAnalysis:\n    # Note: class scope _will_ cause this to segfault - the reporter has to close\n    @pytest.fixture(scope=\"function\")\n    def reporter(self):\n        with resources.as_file(resources.files(\"openfe.tests.data.openmm_rfe\")) as d:\n            ncfile = str(d / \"vacuum_nocoord.nc\")\n\n        with resources.as_file(resources.files(\"openfe.tests.data.openmm_rfe\")) as d:\n            chkfile = str(d / \"vacuum_nocoord_checkpoint.nc\")\n\n        r = multistate.MultiStateReporter(storage=ncfile, checkpoint_storage=chkfile)\n        try:\n            yield r\n        finally:\n            r.close()\n\n    @pytest.fixture()\n    def analyzer(self, reporter):\n        return multistate_analysis.MultistateEquilFEAnalysis(\n            reporter,\n            sampling_method=\"repex\",\n            result_units=unit.kilocalorie_per_mole,\n        )\n\n    def test_free_energies(self, analyzer):\n        ret_dict = analyzer.unit_results_dict\n        assert len(ret_dict.items()) == 7\n        assert pytest.approx(ret_dict[\"unit_estimate\"].m) == -47.9606\n        # more variation when using bootstrap errors so we need a loser tolerance\n        assert pytest.approx(ret_dict[\"unit_estimate_error\"].m, rel=1e4) == 0.0251\n        # forward and reverse (since we do this ourselves)\n        assert_allclose(\n            ret_dict['forward_and_reverse_energies']['fractions'],\n            np.array(\n                [\n                    0.08988764, 0.191011, 0.292135, 0.393258, 0.494382,\n                    0.595506, 0.696629, 0.797753, 0.898876, 1.0\n                ]\n            ),\n            rtol=1e-04,\n        )  # fmt: skip\n        assert_allclose(\n            ret_dict[\"forward_and_reverse_energies\"][\"forward_DGs\"].m,\n            np.array(\n                [\n                    -48.057326, -48.038367, -48.033994, -48.0228, -48.028532,\n                    -48.025258, -48.006349, -47.986304, -47.972138, -47.960623,\n                ]\n            ),\n            rtol=1e-04,\n        )  # fmt: skip\n        # results generated using pymbar3 with 1000 bootstrap iterations\n        assert_allclose(\n            ret_dict[\"forward_and_reverse_energies\"][\"forward_dDGs\"].m,\n            np.array(\n                [\n                    0.077645, 0.054695, 0.044680, 0.03947, 0.034822,\n                    0.033443, 0.030793, 0.028777, 0.026683, 0.026199,\n                ]\n            ),\n            rtol=5e-01,\n        )  # fmt: skip\n        assert_allclose(\n            ret_dict[\"forward_and_reverse_energies\"][\"reverse_DGs\"].m,\n            np.array(\n                [\n                    -47.823839, -47.833107, -47.845866, -47.858173, -47.883887,\n                    -47.915963, -47.93319, -47.939125, -47.949016, -47.960623,\n                ]\n            ),\n            rtol=1e-04,\n        )  # fmt: skip\n        # results generated using pymbar3 with 1000 bootstrap iterations\n        assert_allclose(\n            ret_dict[\"forward_and_reverse_energies\"][\"reverse_dDGs\"].m,\n            np.array(\n                [\n                    0.088335, 0.059483, 0.046254, 0.041504, 0.03877,\n                    0.035495, 0.031981, 0.029707, 0.027095, 0.026296,\n                ]\n            ),\n            rtol=5e-01,\n        )  # fmt: skip\n\n    def test_plots(self, analyzer, tmp_path):\n        analyzer.plot(filepath=Path(tmp_path), filename_prefix=\"\")\n        assert Path(tmp_path / \"forward_reverse_convergence.png\").is_file()\n        assert Path(tmp_path / \"mbar_overlap_matrix.png\").is_file()\n        assert Path(tmp_path / \"replica_exchange_matrix.png\").is_file()\n        assert Path(tmp_path / \"replica_state_timeseries.png\").is_file()\n\n    def test_plot_convergence_bad_units(self, analyzer):\n        with pytest.raises(ValueError, match=\"Unknown plotting units\"):\n            openfe.analysis.plotting.plot_convergence(\n                analyzer.forward_and_reverse_free_energies,\n                unit.nanometer,\n            )\n\n    def test_analyze_unknown_method_warning_and_error(self, reporter):\n        with pytest.warns(UserWarning, match=\"Unknown sampling method\"):\n            ana = multistate_analysis.MultistateEquilFEAnalysis(\n                reporter,\n                sampling_method=\"replex\",\n                result_units=unit.kilocalorie_per_mole,\n            )\n\n        with pytest.raises(ValueError, match=\"Exchange matrix\"):\n            ana.replica_exchange_statistics\n\n\nclass TestSystemCreation:\n    def test_system_generator_nosolv_nocache(self, get_settings):\n        ffsets, intsets, thermosets = get_settings\n        generator = system_creation.get_system_generator(ffsets, thermosets, intsets, None, False)\n        assert generator.barostat is None\n        assert generator.template_generator._cache is None\n        assert not generator.postprocess_system\n\n        forcefield_kwargs = {\n            \"constraints\": app.HBonds,\n            \"rigidWater\": True,\n            \"removeCMMotion\": False,\n            \"hydrogenMass\": 3.0 * ommunit.amu,\n        }\n        assert generator.forcefield_kwargs == forcefield_kwargs\n        periodic_kwargs = {\n            \"nonbondedMethod\": app.PME,\n            \"nonbondedCutoff\": 0.9 * ommunit.nanometer,\n        }\n        nonperiodic_kwargs = {\"nonbondedMethod\": app.NoCutoff}\n        assert generator.nonperiodic_forcefield_kwargs == nonperiodic_kwargs\n        assert generator.periodic_forcefield_kwargs == periodic_kwargs\n\n    def test_system_generator_solv_cache(self, get_settings):\n        ffsets, intsets, thermosets = get_settings\n\n        thermosets.temperature = 320 * unit.kelvin\n        thermosets.pressure = 1.25 * unit.bar\n        intsets.barostat_frequency = 200 * unit.timestep\n        generator = system_creation.get_system_generator(\n            ffsets, thermosets, intsets, Path(\"./db.json\"), True\n        )\n\n        # Check barostat conditions\n        assert isinstance(generator.barostat, MonteCarloBarostat)\n\n        pressure = ensure_quantity(generator.barostat.getDefaultPressure(), \"openff\")\n        temperature = ensure_quantity(generator.barostat.getDefaultTemperature(), \"openff\")\n        assert pressure.m == pytest.approx(1.25)\n        assert pressure.units == unit.bar\n        assert temperature.m == pytest.approx(320)\n        assert temperature.units == unit.kelvin\n        assert generator.barostat.getFrequency() == 200\n\n        # Check cache file\n        assert generator.template_generator._cache == \"db.json\"\n\n    def test_system_generator_membrane(self, get_settings):\n        ffsets, intsets, thermosets = get_settings\n\n        thermosets.temperature = 320 * unit.kelvin\n        thermosets.pressure = 1.25 * unit.bar\n        intsets.barostat = \"MonteCarloMembraneBarostat\"\n        intsets.barostat_frequency = 200 * unit.timestep\n        generator = system_creation.get_system_generator(\n            ffsets, thermosets, intsets, Path(\"./db.json\"), True\n        )\n\n        # Check barostat conditions\n        assert isinstance(generator.barostat, MonteCarloMembraneBarostat)\n\n        pressure = ensure_quantity(generator.barostat.getDefaultPressure(), \"openff\")\n        temperature = ensure_quantity(generator.barostat.getDefaultTemperature(), \"openff\")\n        assert pressure.m == pytest.approx(1.25)\n        assert pressure.units == unit.bar\n        assert temperature.m == pytest.approx(320)\n        assert temperature.units == unit.kelvin\n        assert generator.barostat.getFrequency() == 200\n\n    def test_get_omm_modeller_complex(\n        self,\n        T4_protein_component,\n        benzene_modifications,\n        get_settings,\n    ):\n        ffsets, intsets, thermosets = get_settings\n        generator = system_creation.get_system_generator(ffsets, thermosets, intsets, None, True)\n\n        smc = benzene_modifications[\"toluene\"]\n        mol = smc.to_openff()\n        generator.create_system(mol.to_topology().to_openmm(), molecules=[mol])\n\n        model, comp_resids = system_creation.get_omm_modeller(\n            T4_protein_component,\n            openfe.SolventComponent(),\n            {smc: mol},\n            generator.forcefield,\n            OpenMMSolvationSettings(),\n        )\n\n        resids = [r for r in model.topology.residues()]\n        assert resids[163].name == \"NME\"\n        assert resids[164].name == \"UNK\"\n        assert resids[165].name == \"HOH\"\n        assert_equal(comp_resids[T4_protein_component], np.linspace(0, 163, 164))\n        assert_equal(comp_resids[smc], np.array([164]))\n        assert_equal(\n            comp_resids[openfe.SolventComponent()],\n            np.linspace(165, len(resids) - 1, len(resids) - 165),\n        )\n\n    def test_get_omm_modeller_membrane_box(\n        self,\n        a2a_protein_membrane_component,\n        a2a_ligands,\n        get_settings,\n    ):\n        ffsets, intsets, thermosets = get_settings\n        intsets.barostat = \"MonteCarloMembraneBarostat\"\n        ffsets.forcefields = [\n            \"amber/ff14SB.xml\",\n            \"amber/tip3p_standard.xml\",\n            \"amber/tip3p_HFE_multivalent.xml\",\n            \"amber/lipid17_merged.xml\",\n            \"amber/phosaa10.xml\",\n        ]\n        generator = system_creation.get_system_generator(ffsets, thermosets, intsets, None, True)\n\n        smc = a2a_ligands[0]\n        mol = smc.to_openff()\n        generator.create_system(mol.to_topology().to_openmm(), molecules=[mol])\n\n        model, comp_resids = system_creation.get_omm_modeller(\n            a2a_protein_membrane_component,\n            a2a_protein_membrane_component,\n            {smc: mol},\n            generator.forcefield,\n            OpenMMSolvationSettings(),\n        )\n\n        # Check the number of particles hasn't changed\n        assert model.topology.getNumAtoms() == 39426\n\n        # check residue contents\n        residues = [r for r in model.topology.residues()]\n        # No waters should have been added / removed\n        # Note: waters are renamed to HOH\n        water_residues = [r for r in residues if r.name == \"HOH\"]\n        assert len(water_residues) == 7782\n\n        # Should be one ligand\n        ligand_residues = [r for r in residues if r.name == \"UNK\"]\n        assert len(ligand_residues) == 1\n\n        # Should be one sodium, no chloride\n        sodium_residues = [r for r in residues if r.name == \"NA\"]\n        assert len(sodium_residues) == 1\n        chloride_residues = [r for r in residues if r.name == \"CL\"]\n        assert len(chloride_residues) == 0\n\n        # Check the periodic box vectors are the same\n        box_modeller = model.topology.getPeriodicBoxVectors()\n        box_protein = a2a_protein_membrane_component.box_vectors\n\n        assert np.allclose(box_modeller, to_openmm(box_protein), atol=1e-6)\n\n    @pytest.fixture(scope=\"module\")\n    def ligand_mol_and_generator(self, get_settings):\n        # Create offmol\n        offmol = OFFMol.from_smiles(\"[O-]C=O\")\n        offmol.generate_conformers()\n        offmol.assign_partial_charges(partial_charge_method=\"am1bcc\")\n        smc = openfe.SmallMoleculeComponent.from_openff(offmol)\n\n        ffsets, intsets, thermosets = get_settings\n        generator = system_creation.get_system_generator(ffsets, thermosets, intsets, None, True)\n\n        # Register offmol in generator\n        generator.create_system(offmol.to_topology().to_openmm(), molecules=[offmol])\n\n        return (offmol, smc, generator)\n\n    def test_get_omm_modeller_ligand_no_neutralize(self, ligand_mol_and_generator):\n        offmol, smc, generator = ligand_mol_and_generator\n\n        model, comp_resids = system_creation.get_omm_modeller(\n            None,\n            openfe.SolventComponent(neutralize=False),\n            {smc: offmol},\n            generator.forcefield,\n            OpenMMSolvationSettings(),\n        )\n\n        system = generator.create_system(\n            model.topology,\n            molecules=[offmol],\n        )\n\n        # Now let's check the total charge\n        nonbonded = [f for f in system.getForces() if isinstance(f, NonbondedForce)][0]\n\n        charge = 0 * ommunit.elementary_charge\n\n        for i in range(system.getNumParticles()):\n            c, s, e = nonbonded.getParticleParameters(i)\n            charge += c\n\n        charge = ensure_quantity(charge, \"openff\")\n\n        assert pytest.approx(charge.m) == -1.0\n\n    @pytest.mark.parametrize(\n        \"n_expected, neutralize, shape\",\n        [[400, False, \"cube\"], [399, True, \"dodecahedron\"], [400, False, \"octahedron\"]],\n    )\n    def test_omm_modeller_ligand_n_solv(\n        self, ligand_mol_and_generator, n_expected, neutralize, shape\n    ):\n        offmol, smc, generator = ligand_mol_and_generator\n\n        solv_settings = OpenMMSolvationSettings(\n            solvent_padding=None,\n            number_of_solvent_molecules=400,\n            box_vectors=None,\n            box_size=None,\n            box_shape=shape,\n        )\n\n        model, comp_resids = system_creation.get_omm_modeller(\n            None,\n            openfe.SolventComponent(\n                neutralize=neutralize,\n                ion_concentration=0 * unit.molar,\n            ),\n            {smc: offmol},\n            generator.forcefield,\n            solv_settings,\n        )\n\n        waters = [r for r in model.topology.residues() if r.name == \"HOH\"]\n        assert len(waters) == n_expected\n\n    def test_omm_modeller_box_size(self, ligand_mol_and_generator):\n        offmol, smc, generator = ligand_mol_and_generator\n\n        solv_settings = OpenMMSolvationSettings(\n            solvent_padding=None,\n            number_of_solvent_molecules=None,\n            box_vectors=None,\n            box_size=[2, 2, 2] * unit.nanometer,\n            box_shape=None,\n        )\n\n        model, comp_resids = system_creation.get_omm_modeller(\n            None,\n            openfe.SolventComponent(),\n            {smc: offmol},\n            generator.forcefield,\n            solv_settings,\n        )\n\n        vectors = model.topology.getPeriodicBoxVectors()\n\n        assert_allclose(\n            from_openmm(vectors),\n            [[2, 0, 0], [0, 2, 0], [0, 0, 2]] * unit.nanometer,\n        )\n\n    def test_omm_modeller_box_vectors(self, ligand_mol_and_generator):\n        offmol, smc, generator = ligand_mol_and_generator\n\n        solv_settings = OpenMMSolvationSettings(\n            solvent_padding=None,\n            number_of_solvent_molecules=None,\n            box_vectors=[[2, 0, 0], [0, 2, 0], [0, 0, 5]] * unit.nanometer,\n            box_size=None,\n            box_shape=None,\n        )\n\n        model, comp_resids = system_creation.get_omm_modeller(\n            None,\n            openfe.SolventComponent(),\n            {smc: offmol},\n            generator.forcefield,\n            solv_settings,\n        )\n\n        vectors = model.topology.getPeriodicBoxVectors()\n\n        assert_allclose(\n            from_openmm(vectors),\n            [[2, 0, 0], [0, 2, 0], [0, 0, 5]] * unit.nanometer,\n        )\n\n\ndef test_convert_steps_per_iteration():\n    sim = omm_settings.MultiStateSimulationSettings(\n        equilibration_length=\"10 ps\",\n        production_length=\"10 ps\",\n        time_per_iteration=\"1.0 ps\",\n    )\n    inty = omm_settings.IntegratorSettings(timestep=\"4 fs\")\n\n    spi = settings_validation.convert_steps_per_iteration(sim, inty)\n\n    assert spi == 250\n\n\ndef test_convert_steps_per_iteration_failure():\n    sim = omm_settings.MultiStateSimulationSettings(\n        equilibration_length=\"10 ps\",\n        production_length=\"10 ps\",\n        time_per_iteration=\"1.0 ps\",\n    )\n    inty = omm_settings.IntegratorSettings(timestep=\"3 fs\")\n\n    with pytest.raises(ValueError, match=\"does not evenly divide\"):\n        settings_validation.convert_steps_per_iteration(sim, inty)\n\n\ndef test_convert_real_time_analysis_iterations():\n    sim = omm_settings.MultiStateSimulationSettings(\n        equilibration_length=\"10 ps\",\n        production_length=\"10 ps\",\n        time_per_iteration=\"1.0 ps\",\n        real_time_analysis_interval=\"250 ps\",\n        real_time_analysis_minimum_time=\"500 ps\",\n    )\n\n    rta_its, rta_min_its = settings_validation.convert_real_time_analysis_iterations(sim)\n\n    assert rta_its == 250, 500\n\n\ndef test_convert_real_time_analysis_iterations_interval_fail():\n    # shouldn't like 250.5 ps / 1.0 ps\n    sim = omm_settings.MultiStateSimulationSettings(\n        equilibration_length=\"10 ps\",\n        production_length=\"10 ps\",\n        time_per_iteration=\"1.0 ps\",\n        real_time_analysis_interval=\"250.5 ps\",\n        real_time_analysis_minimum_time=\"500 ps\",\n    )\n\n    with pytest.raises(ValueError, match=\"does not evenly divide\"):\n        settings_validation.convert_real_time_analysis_iterations(sim)\n\n\ndef test_convert_real_time_analysis_iterations_min_interval_fail():\n    # shouldn't like 500.5 ps / 1 ps\n    sim = omm_settings.MultiStateSimulationSettings(\n        equilibration_length=\"10 ps\",\n        production_length=\"10 ps\",\n        time_per_iteration=\"1.0 ps\",\n        real_time_analysis_interval=\"250 ps\",\n        real_time_analysis_minimum_time=\"500.5 ps\",\n    )\n\n    with pytest.raises(ValueError, match=\"does not evenly divide\"):\n        settings_validation.convert_real_time_analysis_iterations(sim)\n\n\ndef test_convert_real_time_analysis_iterations_None():\n    sim = omm_settings.MultiStateSimulationSettings(\n        equilibration_length=\"10 ps\",\n        production_length=\"10 ps\",\n        time_per_iteration=\"1.0 ps\",\n        real_time_analysis_interval=None,\n        real_time_analysis_minimum_time=\"500 ps\",\n    )\n\n    rta_its, rta_min_its = settings_validation.convert_real_time_analysis_iterations(sim)\n\n    assert rta_its is None\n    assert rta_min_its is None\n\n\ndef test_convert_target_error_from_kcal_per_mole_to_kT():\n    kT = settings_validation.convert_target_error_from_kcal_per_mole_to_kT(\n        temperature=298.15 * unit.kelvin,\n        target_error=0.12 * unit.kilocalorie_per_mole,\n    )\n\n    assert kT == pytest.approx(0.20253681663365392)\n\n\ndef test_convert_target_error_from_kcal_per_mole_to_kT_zero():\n    # special case, 0 input gives 0 output\n    kT = settings_validation.convert_target_error_from_kcal_per_mole_to_kT(\n        temperature=298.15 * unit.kelvin,\n        target_error=0.0 * unit.kilocalorie_per_mole,\n    )\n\n    assert kT == 0.0\n\n\nclass TestOFFPartialCharge:\n    @pytest.fixture(scope=\"function\")\n    def uncharged_mol(self, CN_molecule):\n        return CN_molecule.to_openff()\n\n    @pytest.mark.parametrize(\"overwrite\", [True, False])\n    def test_offmol_chg_gen_charged_overwrite(self, overwrite, uncharged_mol):\n        chg = [1 for _ in range(len(uncharged_mol.atoms))] * unit.elementary_charge\n\n        uncharged_mol.partial_charges = copy.deepcopy(chg)\n\n        charge_generation.assign_offmol_partial_charges(\n            uncharged_mol,\n            overwrite=overwrite,\n            method=\"am1bcc\",\n            toolkit_backend=\"ambertools\",\n            generate_n_conformers=None,\n            nagl_model=None,\n        )\n\n        assert np.allclose(uncharged_mol.partial_charges, chg) != overwrite\n\n    def test_unknown_method(self, uncharged_mol):\n        with pytest.raises(ValueError, match=\"Unknown partial charge method\"):\n            charge_generation.assign_offmol_partial_charges(\n                uncharged_mol,\n                overwrite=False,\n                method=\"foo\",\n                toolkit_backend=\"ambertools\",\n                generate_n_conformers=None,\n                nagl_model=None,\n            )\n\n    @pytest.mark.parametrize(\n        \"method, backend\",\n        [\n            [\"am1bcc\", \"rdkit\"],\n            [\"am1bccelf10\", \"ambertools\"],\n            [\"nagl\", \"bar\"],\n            [\"espaloma\", \"openeye\"],\n        ],\n    )\n    def test_incompatible_backend_am1bcc(self, method, backend, uncharged_mol):\n        with pytest.raises(ValueError, match=\"Selected toolkit_backend\"):\n            charge_generation.assign_offmol_partial_charges(\n                uncharged_mol,\n                overwrite=False,\n                method=method,\n                toolkit_backend=backend,\n                generate_n_conformers=None,\n                nagl_model=None,\n            )\n\n    def test_no_conformers(self, uncharged_mol):\n        uncharged_mol._conformers = None\n\n        with pytest.raises(ValueError, match=\"No conformers\"):\n            charge_generation.assign_offmol_partial_charges(\n                uncharged_mol,\n                overwrite=False,\n                method=\"am1bcc\",\n                toolkit_backend=\"ambertools\",\n                generate_n_conformers=None,\n                nagl_model=None,\n            )\n\n    def test_too_many_existing_conformers(self, uncharged_mol):\n        uncharged_mol.generate_conformers(\n            n_conformers=2,\n            rms_cutoff=0.001 * unit.angstrom,\n            toolkit_registry=RDKitToolkitWrapper(),\n        )\n\n        with pytest.raises(ValueError, match=\"too many conformers\"):\n            charge_generation.assign_offmol_partial_charges(\n                uncharged_mol,\n                overwrite=False,\n                method=\"am1bcc\",\n                toolkit_backend=\"ambertools\",\n                generate_n_conformers=None,\n                nagl_model=None,\n            )\n\n    def test_too_many_requested_conformers(self, uncharged_mol):\n        with pytest.raises(ValueError, match=\"5 conformers were requested\"):\n            charge_generation.assign_offmol_partial_charges(\n                uncharged_mol,\n                overwrite=False,\n                method=\"am1bcc\",\n                toolkit_backend=\"ambertools\",\n                generate_n_conformers=5,\n                nagl_model=None,\n            )\n\n    def test_am1bcc_no_conformer(self, uncharged_mol):\n        uncharged_mol._conformers = None\n\n        with pytest.raises(ValueError, match=\"at least one conformer\"):\n            charge_generation.assign_offmol_am1bcc_charges(\n                uncharged_mol,\n                partial_charge_method=\"am1bcc\",\n                toolkit_registry=ToolkitRegistry([RDKitToolkitWrapper()]),\n            )\n\n    @pytest.mark.slow\n    def test_am1bcc_conformer_nochange(self, eg5_ligands):\n        lig = eg5_ligands[0].to_openff()\n\n        conf = copy.deepcopy(lig.conformers)\n\n        # Get charges without conf generation\n        charge_generation.assign_offmol_partial_charges(\n            lig,\n            overwrite=False,\n            method=\"am1bcc\",\n            toolkit_backend=\"ambertools\",\n            generate_n_conformers=None,\n            nagl_model=None,\n        )\n\n        # check the conformation hasn't changed\n        assert_allclose(conf, lig.conformers)\n\n        # copy the charges to check that the conf gen will change things\n        charges = copy.deepcopy(lig.partial_charges)\n\n        # now with conformer generation\n        charge_generation.assign_offmol_partial_charges(\n            lig,\n            overwrite=True,\n            method=\"am1bcc\",\n            toolkit_backend=\"ambertools\",\n            generate_n_conformers=1,\n            nagl_model=None,\n        )\n\n        # conformer shouldn't have changed\n        assert_allclose(conf, lig.conformers)\n\n        # but the charges should have\n        assert not np.allclose(charges, lig.partial_charges)\n\n    @pytest.mark.skipif(\n        not HAS_NAGL or HAS_OPENEYE, reason=\"NAGL is not available or oechem is installed\"\n    )\n    def test_latest_production_nagl(self, uncharged_mol):\n        \"\"\"We expect to find a NAGL model and be able to generate partial charges with it.\"\"\"\n        charge_generation.assign_offmol_partial_charges(\n            uncharged_mol,\n            overwrite=False,\n            method=\"nagl\",\n            toolkit_backend=\"rdkit\",\n            generate_n_conformers=None,\n            nagl_model=None,\n        )\n        assert uncharged_mol.partial_charges.units == \"elementary_charge\"\n\n    @pytest.mark.skipif(\n        not HAS_NAGL or HAS_OPENEYE, reason=\"NAGL is not available or oechem is installed\"\n    )\n    def test_no_production_nagl(self, uncharged_mol):\n        \"\"\"Cleanly handle the case where a NAGL model isn't found.\"\"\"\n        with mock.patch(\n            \"openfe.protocols.openmm_utils.charge_generation.get_models_by_type\", return_value=[]\n        ):\n            with pytest.raises(ValueError, match=\"No production am1bcc NAGL\"):\n                charge_generation.assign_offmol_partial_charges(\n                    uncharged_mol,\n                    overwrite=False,\n                    method=\"nagl\",\n                    toolkit_backend=\"rdkit\",\n                    generate_n_conformers=None,\n                    nagl_model=None,\n                )\n\n    # Note: skipping nagl tests on macos/darwin due to known issues\n    # see: https://github.com/openforcefield/openff-nagl/issues/78\n    @pytest.mark.parametrize(\n        \"method, backend, ref_key, confs\",\n        [\n            (\"am1bcc\", \"ambertools\", \"ambertools\", None),\n            pytest.param(\n                \"am1bcc\",\n                \"openeye\",\n                \"openeye\",\n                None,\n                marks=pytest.mark.skipif(\n                    not HAS_OPENEYE,\n                    reason=\"needs oechem\",\n                ),\n            ),\n            pytest.param(\n                \"am1bccelf10\",\n                \"openeye\",\n                \"openeye\",\n                500,\n                marks=pytest.mark.skipif(\n                    not HAS_OPENEYE,\n                    reason=\"needs oechem\",\n                ),\n            ),\n            pytest.param(\n                \"nagl\",\n                \"rdkit\",\n                \"nagl\",\n                None,\n                marks=pytest.mark.skipif(\n                    not HAS_NAGL or HAS_OPENEYE or sys.platform.startswith(\"darwin\"),\n                    reason=\"needs NAGL (without oechem) and/or on macos\",\n                ),\n            ),\n            pytest.param(\n                \"nagl\",\n                \"ambertools\",\n                \"nagl\",\n                None,\n                marks=pytest.mark.skipif(\n                    not HAS_NAGL or HAS_OPENEYE or sys.platform.startswith(\"darwin\"),\n                    reason=\"needs NAGL (without oechem) and/or on macos\",\n                ),\n            ),\n            pytest.param(\n                \"nagl\",\n                \"openeye\",\n                \"nagl\",\n                None,\n                marks=pytest.mark.skipif(\n                    not HAS_NAGL or not HAS_OPENEYE or sys.platform.startswith(\"darwin\"),\n                    reason=\"needs NAGL and oechem and not on macos\",\n                ),\n            ),\n            pytest.param(\n                \"espaloma\",\n                \"rdkit\",\n                \"espaloma\",\n                None,\n                marks=pytest.mark.skipif(\n                    not HAS_ESPALOMA_CHARGE,\n                    reason=\"needs espaloma charge\",\n                ),\n            ),\n            pytest.param(\n                \"espaloma\",\n                \"ambertools\",\n                \"espaloma\",\n                None,\n                marks=pytest.mark.skipif(\n                    not HAS_ESPALOMA_CHARGE,\n                    reason=\"needs espaloma charge\",\n                ),\n            ),\n        ],\n    )\n    def test_am1bcc_reference(\n        self,\n        uncharged_mol,\n        method,\n        backend,\n        ref_key,\n        confs,\n        am1bcc_ref_charges,\n    ):\n        \"\"\"\n        Check partial charge generation using what would\n        be intended default settings for a CN molecule\n        \"\"\"\n        charge_generation.assign_offmol_partial_charges(\n            uncharged_mol,\n            overwrite=False,\n            method=method,\n            toolkit_backend=backend,\n            generate_n_conformers=None,\n            nagl_model=\"openff-gnn-am1bcc-0.1.0-rc.1.pt\",\n        )\n\n        assert_allclose(\n            am1bcc_ref_charges[ref_key],\n            uncharged_mol.partial_charges,\n            rtol=1e-4,\n        )\n\n    @pytest.mark.skipif(not HAS_OPENEYE, reason=\"OEToolkit is not available\")\n    def test_nagl_oechem_not_openeye_error(self, uncharged_mol):\n        errmsg = \"OpenEye toolkit is installed but not used in the OpenFF toolkit registry.\"\n        with pytest.raises(ValueError, match=errmsg):\n            charge_generation.assign_offmol_partial_charges(\n                uncharged_mol,\n                overwrite=False,\n                method=\"nagl\",\n                toolkit_backend=\"rdkit\",\n                generate_n_conformers=None,\n                nagl_model=None,\n            )\n\n    @pytest.mark.skipif(\n        HAS_OPENEYE, reason=\"NAGL does not work with OpenEye when using the rdkit backend\"\n    )\n    def test_nagl_import_error(self, monkeypatch, uncharged_mol):\n        monkeypatch.setattr(\n            sys.modules[\"openfe.protocols.openmm_utils.charge_generation\"],\n            \"HAS_NAGL\",\n            False,\n        )\n\n        with pytest.raises(ImportError, match=\"NAGL toolkit is not available\"):\n            charge_generation.assign_offmol_partial_charges(\n                uncharged_mol,\n                overwrite=False,\n                method=\"nagl\",\n                toolkit_backend=\"rdkit\",\n                generate_n_conformers=None,\n                nagl_model=None,\n            )\n\n    def test_espaloma_import_error(self, monkeypatch, uncharged_mol):\n        monkeypatch.setattr(\n            sys.modules[\"openfe.protocols.openmm_utils.charge_generation\"],\n            \"HAS_ESPALOMA_CHARGE\",\n            False,\n        )\n\n        with pytest.raises(ImportError, match=\"Espaloma\"):\n            charge_generation.assign_offmol_partial_charges(\n                uncharged_mol,\n                overwrite=False,\n                method=\"espaloma\",\n                toolkit_backend=\"rdkit\",\n                generate_n_conformers=None,\n                nagl_model=None,\n            )\n\n    def test_openeye_import_error(self, monkeypatch, uncharged_mol):\n        monkeypatch.setattr(\n            sys.modules[\"openfe.protocols.openmm_utils.charge_generation\"],\n            \"HAS_OPENEYE\",\n            False,\n        )\n\n        with pytest.raises(ImportError, match=\"OpenEye is not available\"):\n            charge_generation.assign_offmol_partial_charges(\n                uncharged_mol,\n                overwrite=False,\n                method=\"am1bcc\",\n                toolkit_backend=\"openeye\",\n                generate_n_conformers=None,\n                nagl_model=None,\n            )\n\n\n@pytest.mark.slow\n@pytest.mark.skipif(\n    not os.path.exists(POOCH_CACHE) and not HAS_INTERNET,\n    reason=\"Internet seems to be unavailable and test data is not cached locally.\",\n)\ndef test_forward_backwards_failure(simulation_nc):\n    rep = multistate.multistatereporter.MultiStateReporter(simulation_nc, open_mode=\"r\")\n    ana = multistate_analysis.MultistateEquilFEAnalysis(\n        rep,\n        sampling_method=\"repex\",\n        result_units=unit.kilocalorie_per_mole,\n    )\n\n    with mock.patch(\n        \"openfe.protocols.openmm_utils.multistate_analysis.MultistateEquilFEAnalysis._get_free_energy\",\n        side_effect=ParameterError,\n    ):\n        ret = ana.get_forward_and_reverse_analysis()\n\n    assert ret is None\n"
  },
  {
    "path": "src/openfe/tests/protocols/test_openmmutils_serialization.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\nimport bz2\nimport gzip\nimport pathlib\nfrom unittest import mock\n\nfrom openfe.protocols.openmm_utils.serialization import deserialize, serialize\n\n\ndef test_serialize_creates_parent_directory(tmp_path):\n    filename = tmp_path / \"file.xml\"\n    with mock.patch(\"openmm.XmlSerializer.serialize\", return_value=\"<xml></xml>\"):\n        serialize(object(), filename)\n\n    assert filename.exists()\n    assert filename.read_text() == \"<xml></xml>\"\n\n\ndef test_serialize_xml(tmp_path):\n    filename = tmp_path / \"file.xml\"\n    with mock.patch(\"openmm.XmlSerializer.serialize\", return_value=\"<data>\"):\n        serialize(object(), filename)\n\n    with open(filename, \"r\") as f:\n        assert f.read() == \"<data>\"\n\n\ndef test_serialize_bz2(tmp_path):\n    filename = pathlib.Path(tmp_path / \"file.xml.bz2\")\n    expected = \"<bz2_data>\"\n\n    with mock.patch(\"openmm.XmlSerializer.serialize\", return_value=expected):\n        serialize(object(), filename)\n\n    with bz2.open(filename, \"rb\") as f:\n        read_back = f.read().decode()\n    assert read_back == expected\n\n\ndef test_deserialize_xml(tmp_path):\n    filename = pathlib.Path(tmp_path / \"file.xml\")\n    filename.write_text(\"<xml>things</xml>\")\n\n    with mock.patch(\"openmm.XmlSerializer.deserialize\", return_value=\"DESERIALIZED\") as deser:\n        result = deserialize(filename)\n\n    deser.assert_called_once_with(\"<xml>things</xml>\")\n    assert result == \"DESERIALIZED\"\n\n\ndef test_deserialize_bz2(tmp_path):\n    filename = pathlib.Path(tmp_path / \"file.xml.bz2\")\n    expected_serialized = \"<xml>bz2</xml>\"\n    with bz2.open(filename, \"wb\") as f:\n        f.write(expected_serialized.encode())\n\n    with mock.patch(\"openmm.XmlSerializer.deserialize\", return_value=\"FROM_BZ2\") as deser:\n        result = deserialize(filename)\n\n    deser.assert_called_once_with(expected_serialized)\n    assert result == \"FROM_BZ2\"\n"
  },
  {
    "path": "src/openfe/tests/setup/__init__.py",
    "content": ""
  },
  {
    "path": "src/openfe/tests/setup/alchemical_network_planner/__init__.py",
    "content": ""
  },
  {
    "path": "src/openfe/tests/setup/alchemical_network_planner/edge_types.py",
    "content": "from gufe import Transformation\n\nfrom ..chemicalsystem_generator.component_checks import (\n    ligandC_in_chem_sys,\n    proteinC_in_chem_sys,\n    solventC_in_chem_sys,\n)\n\n\ndef both_states_proteinC_edge(edge: Transformation) -> bool:\n    return proteinC_in_chem_sys(edge.stateA) and proteinC_in_chem_sys(edge.stateB)\n\n\ndef both_states_solventC_edge(edge: Transformation) -> bool:\n    return solventC_in_chem_sys(edge.stateA) and solventC_in_chem_sys(edge.stateB)\n\n\ndef both_states_ligandC_edge(edge: Transformation) -> bool:\n    return ligandC_in_chem_sys(edge.stateA) and ligandC_in_chem_sys(edge.stateB)\n\n\ndef r_vacuum_edge(edge: Transformation) -> bool:\n    return (\n        both_states_ligandC_edge(edge)\n        and not both_states_solventC_edge(edge)\n        and not both_states_proteinC_edge(edge)\n    )\n\n\ndef r_solvent_edge(edge: Transformation) -> bool:\n    return (\n        both_states_ligandC_edge(edge)\n        and both_states_solventC_edge(edge)\n        and not both_states_proteinC_edge(edge)\n    )\n\n\ndef r_complex_edge(edge: Transformation) -> bool:\n    return (\n        both_states_ligandC_edge(edge)\n        and both_states_solventC_edge(edge)\n        and both_states_proteinC_edge(edge)\n    )\n"
  },
  {
    "path": "src/openfe/tests/setup/alchemical_network_planner/test_relative_alchemical_network_planner.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\nimport pytest\nfrom gufe import AlchemicalNetwork, SolventComponent\n\nimport openfe\nfrom openfe.setup.alchemical_network_planner import (\n    RBFEAlchemicalNetworkPlanner,\n    RHFEAlchemicalNetworkPlanner,\n)\n\nfrom .edge_types import r_complex_edge, r_solvent_edge, r_vacuum_edge\n\n\ndef test_rhfe_alchemical_network_planner_init():\n    alchem_planner = RHFEAlchemicalNetworkPlanner()\n    assert alchem_planner.name == \"rhfe\"\n\n\ndef test_rbfe_alchemical_network_planner_init():\n    alchem_planner = RBFEAlchemicalNetworkPlanner()\n    assert alchem_planner.name == \"rbfe\"\n\n\ndef test_rbfe_alchemical_network_planner_call(atom_mapping_basic_test_files, T4_protein_component):\n    alchem_planner = RBFEAlchemicalNetworkPlanner(\n        # these aren't default settings, but the test ligands aren't aligned\n        mappers=[\n            openfe.LomapAtomMapper(\n                time=20,\n                element_change=False,\n                max3d=1,\n                shift=True,\n            )\n        ]\n    )\n    alchem_network = alchem_planner(\n        ligands=atom_mapping_basic_test_files.values(),\n        solvent=SolventComponent(),\n        protein=T4_protein_component,\n    )\n    assert isinstance(alchem_network, AlchemicalNetwork)\n    edges = alchem_network.edges\n\n    assert len(edges) == 14  # we build 2envs * (8 ligands - 1) = 14 relative edges.\n    assert (\n        sum([r_complex_edge(e) for e in edges]) == 7\n    )  # half of the transformations should be complex (they always are)!\n    assert (\n        sum([r_solvent_edge(e) for e in edges]) == 7\n    )  # half of the transformations should be solvent!\n    assert sum([r_vacuum_edge(e) for e in edges]) == 0  # no vacuum here!\n\n    expected_names = {\n        \"rbfe_1,3,7-trimethylnaphthalene_solvent_1-butyl-4-methylbenzene_solvent\",\n        \"rbfe_2-methylnaphthalene_complex_methylcyclohexane_complex\",\n        \"rbfe_2,6-dimethylnaphthalene_solvent_2-methyl-6-propylnaphthalene_solvent\",\n        \"rbfe_2-methylnaphthalene_complex_toluene_complex\",\n        \"rbfe_2,6-dimethylnaphthalene_complex_2-methyl-6-propylnaphthalene_complex\",\n        \"rbfe_2,6-dimethylnaphthalene_solvent_toluene_solvent\",\n        \"rbfe_1,3,7-trimethylnaphthalene_complex_1-butyl-4-methylbenzene_complex\",\n        \"rbfe_1,3,7-trimethylnaphthalene_solvent_2,6-dimethylnaphthalene_solvent\",\n        \"rbfe_2,6-dimethylnaphthalene_complex_toluene_complex\",\n        \"rbfe_2-naftanol_solvent_toluene_solvent\",\n        \"rbfe_2-naftanol_complex_toluene_complex\",\n        \"rbfe_2-methylnaphthalene_solvent_toluene_solvent\",\n        \"rbfe_1,3,7-trimethylnaphthalene_complex_2,6-dimethylnaphthalene_complex\",\n        \"rbfe_2-methylnaphthalene_solvent_methylcyclohexane_solvent\",\n    }\n    result_names = {e.name for e in alchem_network.edges}\n    assert result_names == expected_names\n\n\ndef test_rhfe_alchemical_network_planner_call_multigraph(atom_mapping_basic_test_files):\n    alchem_planner = RHFEAlchemicalNetworkPlanner(\n        mappers=[\n            openfe.LomapAtomMapper(\n                time=20,\n                element_change=False,\n                max3d=1,\n                shift=True,\n            )\n        ]\n    )\n\n    ligand_network = alchem_planner._construct_ligand_network(atom_mapping_basic_test_files.values())  # fmt: skip\n    ligand_network_edges = list(ligand_network.edges)\n    ligand_network_edges.extend(list(ligand_network.edges))\n\n    chemical_system_generator = alchem_planner._chemical_system_generator_type(\n        solvent=SolventComponent()\n    )\n\n    with pytest.raises(\n        ValueError,\n        match=\"There were multiple transformations with the same edge label! This might lead to overwriting your files.\",\n    ):\n        _ = alchem_planner._build_transformations(\n            ligand_network_edges=ligand_network_edges,\n            protocol=alchem_planner.transformation_protocol,\n            chemical_system_generator=chemical_system_generator,\n        )\n\n\ndef test_rhfe_alchemical_network_planner_call(atom_mapping_basic_test_files):\n    alchem_planner = RHFEAlchemicalNetworkPlanner(\n        mappers=[openfe.LomapAtomMapper(time=20, element_change=False, max3d=1, shift=True)]\n    )\n    alchem_network = alchem_planner(\n        ligands=atom_mapping_basic_test_files.values(), solvent=SolventComponent()\n    )\n\n    assert isinstance(alchem_network, AlchemicalNetwork)\n\n    edges = alchem_network.edges\n\n    assert len(edges) == 14  # we build 2envs*(8 ligands - 1) = 14 relative edges.\n    expected_names = {\n        \"rhfe_2,6-dimethylnaphthalene_solvent_toluene_solvent\",\n        \"rhfe_1,3,7-trimethylnaphthalene_vacuum_2,6-dimethylnaphthalene_vacuum\",\n        \"rhfe_2-methylnaphthalene_vacuum_toluene_vacuum\",\n        \"rhfe_2-methylnaphthalene_vacuum_methylcyclohexane_vacuum\",\n        \"rhfe_2,6-dimethylnaphthalene_vacuum_2-methyl-6-propylnaphthalene_vacuum\",\n        \"rhfe_1,3,7-trimethylnaphthalene_vacuum_1-butyl-4-methylbenzene_vacuum\",\n        \"rhfe_1,3,7-trimethylnaphthalene_solvent_2,6-dimethylnaphthalene_solvent\",\n        \"rhfe_2-methylnaphthalene_solvent_methylcyclohexane_solvent\",\n        \"rhfe_2-naftanol_vacuum_toluene_vacuum\",\n        \"rhfe_2-naftanol_solvent_toluene_solvent\",\n        \"rhfe_2-methylnaphthalene_solvent_toluene_solvent\",\n        \"rhfe_1,3,7-trimethylnaphthalene_solvent_1-butyl-4-methylbenzene_solvent\",\n        \"rhfe_2,6-dimethylnaphthalene_vacuum_toluene_vacuum\",\n        \"rhfe_2,6-dimethylnaphthalene_solvent_2-methyl-6-propylnaphthalene_solvent\",\n    }\n    assert sum([r_complex_edge(e) for e in edges]) == 0  # no complex!\n    assert (\n        sum([r_solvent_edge(e) for e in edges]) == 7\n    )  # half of the transformations should be solvent!\n    assert (\n        sum([r_vacuum_edge(e) for e in edges]) == 7\n    )  # half of the transformations should be vacuum!\n\n    result_names = {e.name for e in alchem_network.edges}\n    assert result_names == expected_names\n"
  },
  {
    "path": "src/openfe/tests/setup/atom_mapping/__init__.py",
    "content": ""
  },
  {
    "path": "src/openfe/tests/setup/atom_mapping/conftest.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\n\nfrom typing import Dict, Tuple\n\nimport lomap\nimport pytest\nfrom gufe import SmallMoleculeComponent\nfrom rdkit import Chem\n\nfrom openfe import LigandAtomMapping\n\nfrom ...conftest import mol_from_smiles\n\n\ndef _translate_lomap_mapping(atom_mapping_str: str) -> Dict[int, int]:\n    mapped_atom_tuples = map(lambda x: tuple(map(int, x.split(\":\"))), atom_mapping_str.split(\",\"))\n    return {i: j for i, j in mapped_atom_tuples}\n\n\ndef _get_atom_mapping_dict(lomap_atom_mappings) -> Dict[Tuple[int, int], Dict[int, int]]:\n    return {\n        mol_pair: _translate_lomap_mapping(atom_mapping_str)\n        for mol_pair, atom_mapping_str in lomap_atom_mappings.mcs_map_store.items()\n    }\n\n\n@pytest.fixture()\ndef gufe_atom_mapping_matrix(\n    lomap_basic_test_files_dir, atom_mapping_basic_test_files\n) -> Dict[Tuple[int, int], LigandAtomMapping]:\n    dbmols = lomap.DBMolecules(lomap_basic_test_files_dir, verbose=\"off\")\n    _, _ = dbmols.build_matrices()\n    molecule_pair_atom_mappings = _get_atom_mapping_dict(dbmols)\n\n    ligand_atom_mappings = {}\n    for (i, j), val in molecule_pair_atom_mappings.items():\n        nm1 = dbmols[i].getName()[:-5]\n        nm2 = dbmols[j].getName()[:-5]\n        ligand_atom_mappings[(i, j)] = LigandAtomMapping(\n            componentA=atom_mapping_basic_test_files[nm1],\n            componentB=atom_mapping_basic_test_files[nm2],\n            componentA_to_componentB=val,\n        )\n\n    return ligand_atom_mappings\n\n\n@pytest.fixture()\ndef mol_pair_to_shock_perses_mapper() -> Tuple[SmallMoleculeComponent, SmallMoleculeComponent]:\n    \"\"\"\n    This pair of Molecules leads to an empty Atom mapping in\n    Perses Mapper with certain settings.\n\n    Returns:\n        Tuple[SmallMoleculeComponent]: two molecule objs for the test\n    \"\"\"\n    molA = SmallMoleculeComponent(mol_from_smiles(\"c1ccccc1\"), \"benzene\")\n    molB = SmallMoleculeComponent(mol_from_smiles(\"C1CCCCC1\"), \"cyclohexane\")\n    return molA, molB\n"
  },
  {
    "path": "src/openfe/tests/setup/atom_mapping/test_atommapper.py",
    "content": "import pytest\n\nfrom openfe.setup.atom_mapping.ligandatommapper import LigandAtomMapper\nfrom openfe.utils import ligand_utils\n\n\nclass TestAtomMapper:\n    def test_abstract_error(self, simple_mapping):\n        # suggest_mappings should fail with NotImplementedError if the user\n        # tries to directly user the abstract class\n        molA = simple_mapping.componentA\n        molB = simple_mapping.componentB\n        with pytest.raises(TypeError):\n            mapper = LigandAtomMapper()\n            list(mapper.suggest_mappings(molA, molB))\n\n    def test_concrete_mapper(self, simple_mapping, other_mapping):\n        # a correctly implemented concrete atom mapping should return the\n        # mappings generated by the _mappings_generator\n        molA = simple_mapping.componentA\n        molB = simple_mapping.componentB\n\n        class ConcreteLigandAtomMapper(LigandAtomMapper):\n            def __init__(self, mappings):\n                self.mappings = mappings\n\n            @classmethod\n            def _defaults(cls):\n                return {}\n\n            def _to_dict(self):\n                return {\"mappings\": self.mappings}\n\n            @classmethod\n            def _from_dict(cls, dct):\n                return cls(**dct)\n\n            def _mappings_generator(self, componentA, componentB):\n                for mapping in self.mappings:\n                    yield mapping.componentA_to_componentB\n\n        mapper = ConcreteLigandAtomMapper([simple_mapping, other_mapping])\n        results = list(mapper.suggest_mappings(molA, molB))\n        assert len(results) == 2\n        assert results == [simple_mapping, other_mapping]\n\n    def test_alchemical_charge_deprecation_warning(self, simple_mapping):\n        with pytest.warns(DeprecationWarning, match=r\"Use gufe\\.LigandAtomMapping\"):\n            ligand_utils.get_alchemical_charge_difference(simple_mapping)\n"
  },
  {
    "path": "src/openfe/tests/setup/atom_mapping/test_lomap_atommapper.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\nimport pytest\nfrom gufe import SmallMoleculeComponent\nfrom rdkit import Chem\nfrom rdkit.Chem import AllChem\n\nimport openfe\nfrom openfe.setup.atom_mapping import LomapAtomMapper\n\nfrom .conftest import mol_from_smiles\n\n\ndef test_simple(atom_mapping_basic_test_files, lomap_old_mapper):\n    # basic sanity check on the LigandAtomMapper\n    mol1 = atom_mapping_basic_test_files[\"methylcyclohexane\"]\n    mol2 = atom_mapping_basic_test_files[\"toluene\"]\n\n    mapper = lomap_old_mapper\n\n    mapping_gen = mapper.suggest_mappings(mol1, mol2)\n\n    mapping = next(mapping_gen)\n    assert isinstance(mapping, openfe.setup.atom_mapping.LigandAtomMapping)\n    # maps (CH3) off methyl and (6C + 5H) on ring\n    assert len(mapping.componentA_to_componentB) == 15\n\n\ndef test_distances(atom_mapping_basic_test_files, lomap_old_mapper):\n    # basic sanity check on the LigandAtomMapper\n    mol1 = atom_mapping_basic_test_files[\"methylcyclohexane\"]\n    mol2 = atom_mapping_basic_test_files[\"toluene\"]\n\n    mapper = lomap_old_mapper\n    mapping = next(mapper.suggest_mappings(mol1, mol2))\n\n    dists = mapping.get_distances()\n\n    assert len(dists) == len(mapping.componentA_to_componentB)\n    i, j = next(iter(mapping.componentA_to_componentB.items()))\n    ref_d = (\n        mol1.to_rdkit()\n        .GetConformer()\n        .GetAtomPosition(i)\n        .Distance(mol2.to_rdkit().GetConformer().GetAtomPosition(j))\n    )\n    assert pytest.approx(dists[0], rel=1e-5) == ref_d\n    assert pytest.approx(dists[0], rel=1e-5) == 0.07249779\n\n\ndef test_generator_length(atom_mapping_basic_test_files, lomap_old_mapper):\n    # check that we get one mapping back from Lomap LigandAtomMapper then the\n    # generator stops correctly\n    mol1 = atom_mapping_basic_test_files[\"methylcyclohexane\"]\n    mol2 = atom_mapping_basic_test_files[\"toluene\"]\n\n    mapper = lomap_old_mapper\n\n    mapping_gen = mapper.suggest_mappings(mol1, mol2)\n\n    _ = next(mapping_gen)\n    with pytest.raises(StopIteration):\n        next(mapping_gen)\n\n\ndef test_bad_mapping(atom_mapping_basic_test_files, lomap_old_mapper):\n    toluene = atom_mapping_basic_test_files[\"toluene\"]\n    NigelTheNitrogen = SmallMoleculeComponent(mol_from_smiles(\"N\"), name=\"Nigel\")\n\n    mapper = lomap_old_mapper\n\n    mapping_gen = mapper.suggest_mappings(toluene, NigelTheNitrogen)\n    with pytest.raises(StopIteration):\n        next(mapping_gen)\n\n\n# TODO: Remove these test when element changes are allowed - START\ndef test_simple_no_element_changes(atom_mapping_basic_test_files, lomap_old_mapper):\n    # basic sanity check on the LigandAtomMapper\n    mol1 = atom_mapping_basic_test_files[\"methylcyclohexane\"]\n    mol2 = atom_mapping_basic_test_files[\"toluene\"]\n\n    mapper = lomap_old_mapper\n    mapper._no_element_changes = True\n    mapping_gen = mapper.suggest_mappings(mol1, mol2)\n\n    mapping = next(mapping_gen)\n    assert isinstance(mapping, openfe.setup.atom_mapping.LigandAtomMapping)\n    # maps (CH3) off methyl and (6C + 5H) on ring\n    assert len(mapping.componentA_to_componentB) == 15\n\n\ndef test_bas_mapping_no_element_changes(atom_mapping_basic_test_files, lomap_old_mapper):\n    toluene = atom_mapping_basic_test_files[\"toluene\"]\n    NigelTheNitrogen = SmallMoleculeComponent(mol_from_smiles(\"N\"), name=\"Nigel\")\n\n    mapper = lomap_old_mapper\n    mapper._no_element_changes = True\n    mapping_gen = mapper.suggest_mappings(toluene, NigelTheNitrogen)\n    with pytest.raises(StopIteration):\n        next(mapping_gen)\n\n\n# TODO: Remove these test when element changes are allowed - END\n"
  },
  {
    "path": "src/openfe/tests/setup/atom_mapping/test_lomap_scorers.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\n\nimport itertools\nimport math\n\nimport lomap\nimport numpy as np\nimport pytest\nfrom numpy.testing import assert_allclose\nfrom rdkit import Chem\nfrom rdkit.Chem.AllChem import Compute2DCoords  # type: ignore[attr-defined]\n\nimport openfe\nfrom openfe.setup import LigandAtomMapping, lomap_scorers\n\nfrom .conftest import mol_from_smiles\n\n\n@pytest.fixture()\ndef toluene_to_cyclohexane(atom_mapping_basic_test_files):\n    meth = atom_mapping_basic_test_files[\"methylcyclohexane\"]\n    tolu = atom_mapping_basic_test_files[\"toluene\"]\n    mapping = [(0, 0), (1, 1), (2, 6), (3, 5), (4, 4), (5, 3), (6, 2)]\n\n    return LigandAtomMapping(tolu, meth, componentA_to_componentB=dict(mapping))\n\n\n@pytest.fixture()\ndef toluene_to_methylnaphthalene(atom_mapping_basic_test_files):\n    tolu = atom_mapping_basic_test_files[\"toluene\"]\n    naph = atom_mapping_basic_test_files[\"2-methylnaphthalene\"]\n    mapping = [(0, 0), (1, 1), (2, 2), (3, 3), (4, 8), (5, 9), (6, 10)]\n\n    return LigandAtomMapping(tolu, naph, componentA_to_componentB=dict(mapping))\n\n\n@pytest.fixture()\ndef toluene_to_heptane(atom_mapping_basic_test_files):\n    tolu = atom_mapping_basic_test_files[\"toluene\"]\n    hept = Chem.MolFromSmiles(\"CCCCCCC\")\n    Chem.rdDepictor.Compute2DCoords(hept)\n    hept = openfe.SmallMoleculeComponent(hept)\n\n    mapping = [(6, 0)]\n\n    return LigandAtomMapping(tolu, hept, componentA_to_componentB=dict(mapping))\n\n\n@pytest.fixture()\ndef methylnaphthalene_to_naphthol(atom_mapping_basic_test_files):\n    m1 = atom_mapping_basic_test_files[\"2-methylnaphthalene\"]\n    m2 = atom_mapping_basic_test_files[\"2-naftanol\"]\n    mapping = [\n        (0, 0),\n        (1, 1),\n        (2, 10),\n        (3, 9),\n        (4, 8),\n        (5, 7),\n        (6, 6),\n        (7, 5),\n        (8, 4),\n        (9, 3),\n        (10, 2),\n    ]\n\n    return LigandAtomMapping(m1, m2, componentA_to_componentB=dict(mapping))\n\n\ndef test_mcsr_zero(toluene_to_cyclohexane):\n    score = lomap_scorers.mcsr_score(toluene_to_cyclohexane)\n\n    # all atoms map, so perfect score\n    assert score == 1\n\n\ndef test_mcsr_nonzero(toluene_to_methylnaphthalene):\n    score = lomap_scorers.mcsr_score(toluene_to_methylnaphthalene)\n\n    assert score == pytest.approx(math.exp(-0.1 * 4))\n\n\ndef test_mcsr_custom_beta(toluene_to_methylnaphthalene):\n    score = lomap_scorers.mcsr_score(toluene_to_methylnaphthalene, beta=0.2)\n\n    assert score == pytest.approx(math.exp(-0.2 * 4))\n\n\ndef test_mcnar_score_pass(toluene_to_cyclohexane):\n    score = lomap_scorers.mncar_score(toluene_to_cyclohexane)\n\n    assert score == 1.0\n\n\ndef test_mcnar_score_fail(toluene_to_heptane):\n    score = lomap_scorers.mncar_score(toluene_to_heptane)\n\n    assert score == 0.0\n\n\ndef test_atomic_number_score_pass(toluene_to_cyclohexane):\n    score = lomap_scorers.atomic_number_score(toluene_to_cyclohexane)\n\n    assert score == 1.0\n\n\ndef test_atomic_number_score_fail(methylnaphthalene_to_naphthol):\n    score = lomap_scorers.atomic_number_score(methylnaphthalene_to_naphthol)\n\n    # single mismatch @ 0.5\n    assert score == pytest.approx(math.exp(-0.1 * 0.5))\n\n\ndef test_atomic_number_score_weights(methylnaphthalene_to_naphthol):\n    difficulty = {\n        8: {6: 0.75},  # oxygen to carbon @ 12\n    }\n\n    score = lomap_scorers.atomic_number_score(methylnaphthalene_to_naphthol, difficulty=difficulty)\n\n    # single mismatch @ (1 - 0.75)\n    assert score == pytest.approx(math.exp(-0.1 * 0.25))\n\n\nclass TestSulfonamideRule:\n    @staticmethod\n    @pytest.fixture\n    def ethylbenzene():\n        m = Chem.AddHs(mol_from_smiles(\"c1ccccc1CCC\"))\n\n        return openfe.SmallMoleculeComponent.from_rdkit(m)\n\n    @staticmethod\n    @pytest.fixture\n    def sulfonamide():\n        # technically 3-phenylbutane-1-sulfonamide\n        m = Chem.AddHs(mol_from_smiles(\"c1ccccc1C(C)CCS(=O)(=O)N\"))\n\n        return openfe.SmallMoleculeComponent.from_rdkit(m)\n\n    @staticmethod\n    @pytest.fixture\n    def from_sulf_mapping():\n        # this is the standard output from lomap_scorers\n        return {\n            0: 0,\n            1: 1,\n            2: 2,\n            3: 3,\n            4: 4,\n            5: 5,\n            6: 6,\n            7: 14,\n            8: 7,\n            9: 8,\n            10: 18,\n            14: 9,\n            15: 10,\n            16: 11,\n            17: 12,\n            18: 13,\n            19: 15,\n            23: 16,\n            24: 17,\n            25: 19,\n            26: 20,\n        }\n\n    @staticmethod\n    def test_sulfonamide_hit_backwards(ethylbenzene, sulfonamide, from_sulf_mapping):\n        # a sulfonamide completely disappears on the RHS, so should trigger\n        # the sulfonamide score to try and forbid this\n\n        mapping = LigandAtomMapping(\n            componentA=sulfonamide,\n            componentB=ethylbenzene,\n            componentA_to_componentB=from_sulf_mapping,\n        )\n        expected = math.exp(-1 * 0.4)\n        assert lomap_scorers.sulfonamides_score(mapping) == expected\n\n    @staticmethod\n    def test_sulfonamide_hit_forwards(ethylbenzene, sulfonamide, from_sulf_mapping):\n        AtoB = {v: k for k, v in from_sulf_mapping.items()}\n\n        # this is the standard output from lomap_scorers\n        mapping = LigandAtomMapping(\n            componentA=ethylbenzene, componentB=sulfonamide, componentA_to_componentB=AtoB\n        )\n\n        expected = math.exp(-1 * 0.4)\n        assert lomap_scorers.sulfonamides_score(mapping) == expected\n\n\n@pytest.mark.parametrize(\n    \"base,other,name,hit\",\n    [\n        (\"CCc1ccccc1\", \"CCc1ccc(-c2ccco2)cc1\", \"phenylfuran\", False),\n        (\"CCc1ccccc1\", \"CCc1ccc(-c2cnc[nH]2)cc1\", \"phenylimidazole\", True),\n        (\"CCc1ccccc1\", \"CCc1ccc(-c2ccno2)cc1\", \"phenylisoxazole\", True),\n        (\"CCc1ccccc1\", \"CCc1ccc(-c2cnco2)cc1\", \"phenyloxazole\", True),\n        (\"CCc1ccccc1\", \"CCc1ccc(-c2cccnc2)cc1\", \"phenylpyridine1\", True),\n        (\"CCc1ccccc1\", \"CCc1ccc(-c2ccccn2)cc1\", \"phenylpyridine2\", True),\n        (\"CCc1ccccc1\", \"CCc1ccc(-c2cncnc2)cc1\", \"phenylpyrimidine\", True),\n        (\"CCc1ccccc1\", \"CCc1ccc(-c2ccc[nH]2)cc1\", \"phenylpyrrole\", False),\n        (\"CCc1ccccc1\", \"CCc1ccc(-c2ccccc2)cc1\", \"phenylphenyl\", False),\n    ],\n)\ndef test_heterocycle_score(base, other, name, hit):\n    # base -> other transform, if *hit* a forbidden heterocycle is created\n    r1 = Chem.AddHs(mol_from_smiles(base))\n    r2 = Chem.AddHs(mol_from_smiles(other))\n    # add 2d coords to stop Lomap crashing for now\n    for r in [r1, r2]:\n        Compute2DCoords(r)\n    m1 = openfe.SmallMoleculeComponent.from_rdkit(r1)\n    m2 = openfe.SmallMoleculeComponent.from_rdkit(r2)\n\n    mapper = openfe.setup.atom_mapping.LomapAtomMapper(\n        time=20,\n        threed=False,\n        max3d=1000.0,\n        element_change=True,\n        seed=\"\",\n        shift=True,\n    )\n    mapping = next(mapper.suggest_mappings(m1, m2))\n    score = lomap_scorers.heterocycles_score(mapping)\n\n    assert score == 1.0 if not hit else score == math.exp(-0.4)\n\n\n# test individual scoring functions against lomap\nSCORE_NAMES = {\n    \"mcsr\": \"mcsr_score\",\n    \"mncar\": \"mncar_score\",\n    \"atomic_number_rule\": \"atomic_number_score\",\n    \"hybridization_rule\": \"hybridization_score\",\n    \"sulfonamides_rule\": \"sulfonamides_score\",\n    \"heterocycles_rule\": \"heterocycles_score\",\n    \"transmuting_methyl_into_ring_rule\": \"transmuting_methyl_into_ring_score\",\n    \"transmuting_ring_sizes_rule\": \"transmuting_ring_sizes_score\",\n}\nIX = itertools.combinations(range(8), 2)\n\n\n@pytest.mark.parametrize(\"params\", itertools.product(SCORE_NAMES, IX))\ndef test_lomap_individual_scores(params, atom_mapping_basic_test_files):\n    scorename, (i, j) = params\n    mols = sorted(atom_mapping_basic_test_files.items())\n    _, molA = mols[i]\n    _, molB = mols[j]\n\n    # reference value\n    lomap_version = getattr(lomap.MCS(molA.to_rdkit(), molB.to_rdkit()), scorename)()\n\n    # longer way\n    mapper = openfe.setup.atom_mapping.LomapAtomMapper(\n        time=20,\n        threed=False,\n        max3d=1000.0,\n        element_change=True,\n        seed=\"\",\n        shift=True,\n    )\n    mapping = next(mapper.suggest_mappings(molA, molB))\n    openfe_version = getattr(lomap_scorers, SCORE_NAMES[scorename])(mapping)\n\n    assert lomap_version == pytest.approx(openfe_version), f\"{molA.name} {molB.name} {scorename}\"\n\n\n# full back to back test again lomap\ndef test_lomap_regression(\n    lomap_basic_test_files_dir,  # in a dir for lomap\n    atom_mapping_basic_test_files,\n):\n    # run lomap\n    dbmols = lomap.DBMolecules(lomap_basic_test_files_dir)\n    matrix, _ = dbmols.build_matrices()\n    matrix = matrix.to_numpy_2D_array()\n\n    assert matrix.shape == (8, 8)\n\n    # now run the openfe equivalent\n    # first, get the order identical to lomap\n    smallmols = []\n    for i in range(matrix.shape[0]):\n        nm = dbmols[i].getName()\n        smallmols.append(atom_mapping_basic_test_files[nm[:-5]])  # - \".mol2\"\n\n    mapper = openfe.setup.atom_mapping.LomapAtomMapper(\n        time=20,\n        threed=False,\n        max3d=1000.0,\n        element_change=True,\n        seed=\"\",\n        shift=True,\n    )\n    scorer = lomap_scorers.default_lomap_score\n    scores = np.zeros_like(matrix)\n    for i, j in itertools.combinations(range(matrix.shape[0]), 2):\n        molA = smallmols[i]\n        molB = smallmols[j]\n\n        mapping = next(mapper.suggest_mappings(molA, molB))\n        score = scorer(mapping)\n\n        scores[i, j] = scores[j, i] = score\n    # fudge diagonal for comparison\n    for i in range(matrix.shape[0]):\n        scores[i, i] = 0\n\n    assert_allclose(matrix, scores)\n\n\ndef test_transmuting_methyl_into_ring_score():\n    \"\"\"\n    Sets up two mappings:\n      RC_to_RPh = [CCC]C -> [CCC]Ph\n      RH_to_RPh = [CCC]H -> [CCC]Ph\n    Where square brackets show mapped (core) region\n\n    The first mapping should trigger this rule, the second shouldn't\n    \"\"\"\n\n    def makemol(smi):\n        m = Chem.MolFromSmiles(smi)\n        m = Chem.AddHs(m)\n        m.Compute2DCoords()\n\n        return openfe.SmallMoleculeComponent(m)\n\n    core = \"CCC{}\"\n    RC = makemol(core.format(\"C\"))\n    RPh = makemol(core.format(\"c1ccccc1\"))\n    RH = makemol(core.format(\"[H]\"))\n\n    RC_to_RPh = openfe.LigandAtomMapping(RC, RPh, {i: i for i in range(3)})\n    RH_to_RPh = openfe.LigandAtomMapping(RH, RPh, {i: i for i in range(3)})\n\n    score1 = lomap_scorers.transmuting_methyl_into_ring_score(RC_to_RPh)\n    score2 = lomap_scorers.transmuting_methyl_into_ring_score(RH_to_RPh)\n\n    assert score1 == pytest.approx(math.exp(-0.1 * 6.0))\n    assert score2 == 1.0\n"
  },
  {
    "path": "src/openfe/tests/setup/atom_mapping/test_perses_atommapper.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\nimport pytest\nfrom openff.units import unit\nfrom openff.utilities.testing import skip_if_missing\n\nfrom openfe.setup.atom_mapping import LigandAtomMapping, PersesAtomMapper\n\n\n@skip_if_missing(\"openeye\")\n@skip_if_missing(\"perses\")\ndef test_simple(atom_mapping_basic_test_files):\n    # basic sanity check on the LigandAtomMapper\n    mol1 = atom_mapping_basic_test_files[\"methylcyclohexane\"]\n    mol2 = atom_mapping_basic_test_files[\"toluene\"]\n    with pytest.warns(DeprecationWarning, match=\"PersesAtomMapper\"):\n        mapper = PersesAtomMapper()\n\n    mapping_gen = mapper.suggest_mappings(mol1, mol2)\n\n    mapping = next(mapping_gen)\n    assert isinstance(mapping, LigandAtomMapping)\n    # maps (CH3) off methyl and (6C + 5H) on ring\n    assert len(mapping.componentA_to_componentB) == 4\n\n\n@skip_if_missing(\"openeye\")\n@skip_if_missing(\"perses\")\ndef test_generator_length(atom_mapping_basic_test_files):\n    # check that we get one mapping back from Lomap LigandAtomMapper then the\n    # generator stops correctly\n    mol1 = atom_mapping_basic_test_files[\"methylcyclohexane\"]\n    mol2 = atom_mapping_basic_test_files[\"toluene\"]\n    with pytest.warns(DeprecationWarning, match=\"PersesAtomMapper\"):\n        mapper = PersesAtomMapper()\n\n    mapping_gen = mapper.suggest_mappings(mol1, mol2)\n\n    _ = next(mapping_gen)\n    with pytest.raises(StopIteration):\n        next(mapping_gen)\n\n\n@skip_if_missing(\"openeye\")\n@skip_if_missing(\"perses\")\ndef test_empty_atommappings(mol_pair_to_shock_perses_mapper):\n    mol1, mol2 = mol_pair_to_shock_perses_mapper\n    with pytest.warns(DeprecationWarning, match=\"PersesAtomMapper\"):\n        mapper = PersesAtomMapper()\n\n    mapping_gen = mapper.suggest_mappings(mol1, mol2)\n\n    # The expected return is an empty mapping\n    assert len(list(mapping_gen)) == 0\n\n    with pytest.raises(StopIteration):\n        next(mapping_gen)\n\n\n@skip_if_missing(\"openeye\")\n@skip_if_missing(\"perses\")\ndef test_dict_round_trip():\n    with pytest.warns(DeprecationWarning, match=\"PersesAtomMapper\"):\n        # use some none defaults\n        mapper1 = PersesAtomMapper(\n            allow_ring_breaking=False,\n            preserve_chirality=False,\n            coordinate_tolerance=0.01 * unit.nanometer,\n        )\n        mapper2 = PersesAtomMapper.from_dict(mapper1.to_dict())\n    assert mapper2.to_dict() == mapper1.to_dict()\n"
  },
  {
    "path": "src/openfe/tests/setup/atom_mapping/test_perses_scorers.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\n\nimport numpy as np\nimport pytest\nfrom numpy.testing import assert_, assert_allclose\nfrom openff.utilities import skip_if_missing\n\nfrom openfe.setup import perses_scorers\n\nfrom ....utils.silence_root_logging import silence_root_logging\n\nUSING_OLD_OFF = False\n\n\n@skip_if_missing(\"openeye\")\n@skip_if_missing(\"perses\")\n@pytest.mark.xfail(not USING_OLD_OFF, reason=\"perses #1108\")\ndef test_perses_normalization_not_using_positions(gufe_atom_mapping_matrix):\n    # now run the openfe equivalent with the same ligand atom _mappings\n    with pytest.warns(DeprecationWarning, match=\"default_perses_scorer\"):\n        scorer = perses_scorers.default_perses_scorer\n    molecule_row = np.max(list(gufe_atom_mapping_matrix.keys())) + 1\n    norm_scores = np.zeros([molecule_row, molecule_row])\n\n    for (i, j), ligand_atom_mapping in gufe_atom_mapping_matrix.items():\n        norm_score = scorer(\n            ligand_atom_mapping,\n            use_positions=False,\n            normalize=True,\n        )\n        norm_scores[i, j] = norm_scores[j, i] = norm_score\n    assert norm_scores.shape == (8, 8)\n\n    assert_(\n        np.all((norm_scores <= 1) & (norm_scores >= 0.0)),\n        msg=\"OpenFE norm value larger than 1 or smaller than 0\",\n    )\n\n\n@skip_if_missing(\"openeye\")\n@skip_if_missing(\"perses\")\n@pytest.mark.xfail(not USING_OLD_OFF, reason=\"perses #1108\")\ndef test_perses_not_implemented_position_using(gufe_atom_mapping_matrix):\n    with pytest.warns(DeprecationWarning, match=\"default_perses_scorer\"):\n        scorer = perses_scorers.default_perses_scorer\n\n    first_key = list(gufe_atom_mapping_matrix.keys())[0]\n    match_re = \"normalizing using positions is not currently implemented\"\n    with pytest.raises(NotImplementedError, match=match_re):\n        norm_score = scorer(\n            gufe_atom_mapping_matrix[first_key],\n            use_positions=True,\n            normalize=True,\n        )\n\n\n@skip_if_missing(\"openeye\")\n@skip_if_missing(\"perses\")\n@pytest.mark.xfail(not USING_OLD_OFF, reason=\"perses #1108\")\ndef test_perses_regression(gufe_atom_mapping_matrix):\n    with silence_root_logging():\n        from perses.rjmc.atom_mapping import AtomMapper, AtomMapping\n    # This is the way how perses does scoring\n    molecule_row = np.max(list(gufe_atom_mapping_matrix.keys())) + 1\n    matrix = np.zeros([molecule_row, molecule_row])\n    for x in gufe_atom_mapping_matrix.items():\n        (i, j), ligand_atom_mapping = x\n        # Build Perses Mapping:\n        perses_atom_mapping = AtomMapping(\n            old_mol=ligand_atom_mapping.componentA.to_openff(),\n            new_mol=ligand_atom_mapping.componentB.to_openff(),\n            old_to_new_atom_map=ligand_atom_mapping.componentA_to_componentB,\n        )\n        # score Perses Mapping - Perses Style\n        matrix[i, j] = matrix[j, i] = AtomMapper().score_mapping(perses_atom_mapping)\n\n    assert matrix.shape == (8, 8)\n\n    # now run the openfe equivalent with the same ligand atom _mappings\n    with pytest.warns(DeprecationWarning, match=\"default_perses_scorer\"):\n        scorer = perses_scorers.default_perses_scorer\n    scores = np.zeros_like(matrix)\n    for (i, j), ligand_atom_mapping in gufe_atom_mapping_matrix.items():\n        score = scorer(\n            ligand_atom_mapping,\n            use_positions=True,\n            normalize=False,\n        )\n\n        scores[i, j] = scores[j, i] = score\n\n    assert_allclose(\n        actual=matrix,\n        desired=scores,\n        err_msg=\"openFE was not close to perses\",\n    )\n"
  },
  {
    "path": "src/openfe/tests/setup/chemicalsystem_generator/__init__.py",
    "content": ""
  },
  {
    "path": "src/openfe/tests/setup/chemicalsystem_generator/component_checks.py",
    "content": "from gufe import ChemicalSystem\n\nfrom openfe.setup.chemicalsystem_generator import RFEComponentLabels\n\n\n# Boolean Test logic lambdas:\ndef ligandC_in_chem_sys(chemical_system: ChemicalSystem) -> bool:\n    return RFEComponentLabels.LIGAND in chemical_system.components\n\n\ndef solventC_in_chem_sys(chemical_system: ChemicalSystem) -> bool:\n    return RFEComponentLabels.SOLVENT in chemical_system.components\n\n\ndef proteinC_in_chem_sys(chemical_system: ChemicalSystem) -> bool:\n    return RFEComponentLabels.PROTEIN in chemical_system.components\n\n\ndef cofactorC_in_chem_sys(chemical_system: ChemicalSystem) -> bool:\n    # cofactors are numbered from 1\n    return f\"{RFEComponentLabels.COFACTOR.value}1\" in chemical_system.components\n"
  },
  {
    "path": "src/openfe/tests/setup/chemicalsystem_generator/test_easy_chemicalsystem_generator.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\nimport pytest\nfrom gufe import ChemicalSystem, SolventComponent\nfrom rdkit import Chem\n\nfrom openfe.setup.chemicalsystem_generator.easy_chemicalsystem_generator import (\n    EasyChemicalSystemGenerator,\n)\n\nfrom ...conftest import T4_protein_component\nfrom .component_checks import (\n    cofactorC_in_chem_sys,\n    ligandC_in_chem_sys,\n    proteinC_in_chem_sys,\n    solventC_in_chem_sys,\n)\n\n\ndef test_easy_chemical_system_generator_init(T4_protein_component):\n    chem_sys_generator = EasyChemicalSystemGenerator(do_vacuum=True)\n\n    chem_sys_generator = EasyChemicalSystemGenerator(solvent=SolventComponent())\n\n    chem_sys_generator = EasyChemicalSystemGenerator(\n        solvent=SolventComponent(), protein=T4_protein_component\n    )\n\n    chem_sys_generator = EasyChemicalSystemGenerator(\n        solvent=SolventComponent(), protein=T4_protein_component, do_vacuum=True\n    )\n\n    with pytest.raises(\n        ValueError,\n        match=\"Chemical system generator is unable to generate any chemical systems with neither protein nor solvent nor do_vacuum\",\n    ):\n        chem_sys_generator = EasyChemicalSystemGenerator()\n\n\ndef test_build_vacuum_chemical_system(ethane):\n    chem_sys_generator = EasyChemicalSystemGenerator(do_vacuum=True)\n    chem_sys = next(chem_sys_generator(ethane))\n\n    assert chem_sys is not None\n    assert isinstance(chem_sys, ChemicalSystem)\n    assert not proteinC_in_chem_sys(chem_sys)\n    assert not solventC_in_chem_sys(chem_sys)\n    assert ligandC_in_chem_sys(chem_sys)\n\n\ndef test_build_solvent_chemical_system(ethane):\n    chem_sys_generator = EasyChemicalSystemGenerator(solvent=SolventComponent())\n    chem_sys = next(chem_sys_generator(ethane))\n\n    assert chem_sys is not None\n    assert isinstance(chem_sys, ChemicalSystem)\n    assert not proteinC_in_chem_sys(chem_sys)\n    assert solventC_in_chem_sys(chem_sys)\n    assert ligandC_in_chem_sys(chem_sys)\n\n\ndef test_build_protein_chemical_system(ethane, T4_protein_component):\n    chem_sys_generator = EasyChemicalSystemGenerator(\n        protein=T4_protein_component,\n    )\n    chem_sys = next(chem_sys_generator(ethane))\n\n    assert chem_sys is not None\n    assert isinstance(chem_sys, ChemicalSystem)\n    assert proteinC_in_chem_sys(chem_sys)\n    assert not solventC_in_chem_sys(chem_sys)\n    assert ligandC_in_chem_sys(chem_sys)\n    assert not cofactorC_in_chem_sys(chem_sys)\n\n\ndef test_build_cofactor_chemical_system(eg5_cofactor, eg5_ligands, eg5_protein):\n    chem_sys_generator = EasyChemicalSystemGenerator(cofactors=[eg5_cofactor], protein=eg5_protein)\n    chem_sys = next(chem_sys_generator(eg5_ligands[0]))\n\n    assert chem_sys is not None\n    assert isinstance(chem_sys, ChemicalSystem)\n    assert proteinC_in_chem_sys(chem_sys)\n    assert not solventC_in_chem_sys(chem_sys)\n    assert ligandC_in_chem_sys(chem_sys)\n    assert cofactorC_in_chem_sys(chem_sys)\n\n\ndef test_build_hydr_scenario_chemical_systems(ethane):\n    chem_sys_generator = EasyChemicalSystemGenerator(do_vacuum=True, solvent=SolventComponent())\n    chem_sys_gen = chem_sys_generator(ethane)\n    chem_syss = [chem_sys for chem_sys in chem_sys_gen]\n\n    assert len(chem_syss) == 2\n    assert all([isinstance(chem_sys, ChemicalSystem) for chem_sys in chem_syss])\n    assert [proteinC_in_chem_sys(chem_sys) for chem_sys in chem_syss] == [False, False]\n    assert [solventC_in_chem_sys(chem_sys) for chem_sys in chem_syss] == [False, True]\n    assert [ligandC_in_chem_sys(chem_sys) for chem_sys in chem_syss] == [True, True]\n\n\ndef test_build_binding_scenario_chemical_systems(ethane, T4_protein_component):\n    chem_sys_generator = EasyChemicalSystemGenerator(\n        solvent=SolventComponent(),\n        protein=T4_protein_component,\n    )\n    chem_sys_gen = chem_sys_generator(ethane)\n    chem_syss = [chem_sys for chem_sys in chem_sys_gen]\n\n    assert len(chem_syss) == 2\n    assert all([isinstance(chem_sys, ChemicalSystem) for chem_sys in chem_syss])\n    assert [proteinC_in_chem_sys(chem_sys) for chem_sys in chem_syss] == [False, True]\n    assert [solventC_in_chem_sys(chem_sys) for chem_sys in chem_syss] == [True, True]\n    assert [ligandC_in_chem_sys(chem_sys) for chem_sys in chem_syss] == [True, True]\n\n\ndef test_build_hbinding_scenario_chemical_systems(ethane, T4_protein_component):\n    chem_sys_generator = EasyChemicalSystemGenerator(\n        do_vacuum=True,\n        solvent=SolventComponent(),\n        protein=T4_protein_component,\n    )\n    chem_sys_gen = chem_sys_generator(ethane)\n    chem_syss = [chem_sys for chem_sys in chem_sys_gen]\n\n    assert len(chem_syss) == 3\n    assert all([isinstance(chem_sys, ChemicalSystem) for chem_sys in chem_syss])\n    assert [proteinC_in_chem_sys(chem_sys) for chem_sys in chem_syss] == [False, False, True]\n    assert [solventC_in_chem_sys(chem_sys) for chem_sys in chem_syss] == [False, True, True]\n    assert [ligandC_in_chem_sys(chem_sys) for chem_sys in chem_syss] == [True, True, True]\n"
  },
  {
    "path": "src/openfe/tests/setup/test_network_planning.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\n\nfrom typing import Callable\n\nimport pytest\n\nimport openfe\n\nfrom ..conftest import mol_from_smiles\n\n\nclass BadMapper(openfe.setup.atom_mapping.LigandAtomMapper):\n    @classmethod\n    def _defaults(cls):\n        return {}\n\n    def _to_dict(self):\n        return {}\n\n    @classmethod\n    def _from_dict(cls, d):\n        return cls()\n\n    def _mappings_generator(self, molA, molB):\n        yield {0: 0}\n\n\n@pytest.fixture()\ndef toluene_vs_others(atom_mapping_basic_test_files):\n    central_ligand_name = \"toluene\"\n    others = [\n        v for (k, v) in atom_mapping_basic_test_files.items()\n        if k != central_ligand_name\n    ]  # fmt: skip\n    toluene = atom_mapping_basic_test_files[central_ligand_name]\n    return toluene, others\n\n\n@pytest.fixture()\ndef simple_scorer() -> Callable:\n    def _scorer(mapping) -> float:\n        \"Returns a score proportional to the length of the mapping, normalized to be in [0,1]\"\n        return 1 - (1 / len(mapping.componentA_to_componentB))\n\n    return _scorer\n\n\n@pytest.fixture()\ndef deterministic_toluene_mst_scorer() -> Callable:\n    def _scorer(mapping) -> float:\n        \"\"\"These scores give the same mst or rmst every time for the toluene_vs_others dataset.\"\"\"\n        scores = {\n            # MST edges\n            (\"1,3,7-trimethylnaphthalene\", \"2,6-dimethylnaphthalene\"): 0.3,\n            (\"1-butyl-4-methylbenzene\", \"2-methyl-6-propylnaphthalene\"): 0.3,\n            (\"2,6-dimethylnaphthalene\", \"2-methyl-6-propylnaphthalene\"): 0.3,\n            (\"2,6-dimethylnaphthalene\", \"2-methylnaphthalene\"): 0.3,\n            (\"2,6-dimethylnaphthalene\", \"2-naftanol\"): 0.3,\n            (\"2,6-dimethylnaphthalene\", \"methylcyclohexane\"): 0.3,\n            (\"2,6-dimethylnaphthalene\", \"toluene\"): 0.3,\n            # MST redundant edges\n            (\"1,3,7-trimethylnaphthalene\", \"2-methyl-6-propylnaphthalene\"): 0.2,\n            (\"1-butyl-4-methylbenzene\", \"2,6-dimethylnaphthalene\"): 0.2,\n            (\"1-butyl-4-methylbenzene\", \"toluene\"): 0.2,\n            (\"2-methyl-6-propylnaphthalene\", \"2-methylnaphthalene\"): 0.2,\n            (\"2-methylnaphthalene\", \"2-naftanol\"): 0.2,\n            (\"2-methylnaphthalene\", \"methylcyclohexane\"): 0.2,\n            (\"2-methylnaphthalene\", \"toluene\"): 0.2,\n        }\n        return scores.get((mapping.componentA.name, mapping.componentB.name), 0.1)\n\n    return _scorer\n\n\n@pytest.fixture()\ndef deterministic_minimal_spanning_network(\n    toluene_vs_others, lomap_old_mapper, deterministic_toluene_mst_scorer\n):\n    # TODO: I'm not convinced this needs to be its own fixture\n    toluene, others = toluene_vs_others\n    scorer = deterministic_toluene_mst_scorer\n\n    network = openfe.setup.ligand_network_planning.generate_minimal_spanning_network(\n        ligands=others + [toluene],\n        mappers=lomap_old_mapper,\n        scorer=scorer,\n    )\n    return network\n\n\n@pytest.fixture()\ndef deterministic_minimal_redundant_network(\n    toluene_vs_others, lomap_old_mapper, deterministic_toluene_mst_scorer\n):\n    # TODO: I'm not convinced this needs to be its own fixture\n    toluene, others = toluene_vs_others\n    scorer = deterministic_toluene_mst_scorer\n\n    network = openfe.setup.ligand_network_planning.generate_minimal_redundant_network(\n        ligands=others + [toluene],\n        mappers=lomap_old_mapper,\n        scorer=scorer,\n        mst_num=2,\n    )\n    return network\n\n\nclass TestRadialNetworkGenerator:\n    @pytest.mark.parametrize(\"as_list\", [False, True])\n    def test_radial_network(\n        self,\n        toluene_vs_others,\n        as_list,\n        lomap_old_mapper,\n    ):\n        toluene, others = toluene_vs_others\n        central_ligand_name = \"toluene\"\n\n        mapper = lomap_old_mapper\n        if as_list:\n            mapper = [mapper]\n\n        network = openfe.setup.ligand_network_planning.generate_radial_network(\n            ligands=others,\n            central_ligand=toluene,\n            mappers=mapper,\n            scorer=None,\n        )\n\n        expected_names = set([c.name for c in others] + [central_ligand_name])\n\n        # couple sanity checks\n        assert len(network.nodes) == len(expected_names)\n        assert len(network.edges) == len(expected_names) - 1\n\n        # check that all ligands are present, i.e. we included everyone\n        ligands_in_network = {mol.name for mol in network.nodes}\n        assert ligands_in_network == expected_names\n\n        # check that every edge contains the central ligand as a node\n        assert all(\n            (central_ligand_name in {mapping.componentA.name, mapping.componentB.name})\n            for mapping in network.edges\n        )\n\n    @pytest.mark.parametrize(\"central_ligand_arg\", [0, \"toluene\"])\n    def test_radial_network_central_ligand_int_str(\n        self,\n        toluene_vs_others,\n        central_ligand_arg,\n        lomap_old_mapper,\n    ):\n        \"\"\"check that passing either an integer or string to indicate the central ligand works\"\"\"\n        toluene, others = toluene_vs_others\n        ligands = [toluene] + others\n\n        network = openfe.setup.ligand_network_planning.generate_radial_network(\n            ligands=ligands,\n            central_ligand=central_ligand_arg,\n            mappers=lomap_old_mapper,\n            scorer=None,\n        )\n\n        central_ligand_name = \"toluene\"\n        expected_names = set([c.name for c in others] + [central_ligand_name])\n\n        # couple sanity checks\n        assert len(network.nodes) == len(expected_names)\n        assert len(network.edges) == len(expected_names) - 1\n\n        # check that all ligands are present, i.e. we included everyone\n        ligands_in_network = {mol.name for mol in network.nodes}\n        assert ligands_in_network == expected_names\n\n        # check that every edge contains the central ligand as a node\n        assert all(\n            (central_ligand_name in {mapping.componentA.name, mapping.componentB.name})\n            for mapping in network.edges\n        )\n\n    def test_radial_network_bad_name(self, toluene_vs_others, lomap_old_mapper):\n        \"\"\"Error if the central ligand requested is not present.\"\"\"\n        toluene, others = toluene_vs_others\n        ligands = [toluene] + others\n\n        with pytest.raises(ValueError, match=\"No ligand called 'unobtainium\"):\n            _ = openfe.setup.ligand_network_planning.generate_radial_network(\n                ligands=ligands,\n                central_ligand=\"unobtainium\",\n                mappers=lomap_old_mapper,\n                scorer=None,\n            )\n\n    def test_radial_network_multiple_str(self, toluene_vs_others, lomap_old_mapper):\n        \"\"\"Error if more than one ligand has the name passed to 'central_ligand'.\"\"\"\n        toluene, others = toluene_vs_others\n        ligands = [toluene, toluene] + others\n\n        with pytest.raises(ValueError, match=\"Multiple ligands called\"):\n            _ = openfe.setup.ligand_network_planning.generate_radial_network(\n                ligands=ligands,\n                central_ligand=\"toluene\",\n                mappers=lomap_old_mapper,\n                scorer=None,\n            )\n\n    def test_radial_network_index_error(self, toluene_vs_others, lomap_old_mapper):\n        \"\"\"Throw a helpful error if the index value passed to 'central_ligand' is out-of-bounds.\"\"\"\n        toluene, others = toluene_vs_others\n        ligands = [toluene] + others\n\n        with pytest.raises(ValueError, match=\"index '2077' out of bounds, there are 8 ligands\"):\n            _ = openfe.setup.ligand_network_planning.generate_radial_network(\n                ligands=ligands,\n                central_ligand=2077,\n                mappers=lomap_old_mapper,\n                scorer=None,\n            )\n\n    def test_radial_network_self_central(self, toluene_vs_others, lomap_old_mapper):\n        \"\"\"(issue #544) If the central ligand is included in \"ligands\",\n        there shouldn't be a self-edge to the central ligand, and a warning should be raised.\n        \"\"\"\n        toluene, others = toluene_vs_others\n        ligands = [toluene] + others\n\n        with pytest.warns(\n            UserWarning,\n            match=\"The central component 'toluene' is present in the list of components\",\n        ):\n            network = openfe.setup.ligand_network_planning.generate_radial_network(\n                ligands=ligands,\n                central_ligand=toluene,\n                mappers=lomap_old_mapper,\n                scorer=None,\n            )\n\n        # make sure there's no self-edge for the central ligand (toluene)\n        assert (\"toluene\", \"toluene\") not in {\n            (e.componentA.name, e.componentB.name) for e in network.edges\n        }\n        assert len(network.edges) == len(ligands) - 1\n\n        # explicitly check to make sure there is no toluene self-edge\n        name_pairs = [(c.componentA, c.componentB) for c in network.edges]\n        assert (\"toluene\", \"toluene\") not in name_pairs\n\n    def test_radial_network_with_scorer(self, toluene_vs_others, lomap_old_mapper, simple_scorer):\n        \"\"\"Test that the scorer chooses the mapper with the best score (in this case, the LOMAP mapper).\"\"\"\n        toluene, others = toluene_vs_others\n\n        mappers = [BadMapper(), lomap_old_mapper]\n        scorer = simple_scorer\n\n        network = openfe.setup.ligand_network_planning.generate_radial_network(\n            ligands=others,\n            central_ligand=toluene,\n            mappers=mappers,\n            scorer=scorer,\n        )\n\n        expected_names = set([c.name for c in others] + [\"toluene\"])\n\n        # couple sanity checks\n        assert len(network.nodes) == len(expected_names)\n        assert len(network.edges) == len(expected_names) - 1\n\n        # check that all ligands are present, i.e. we included everyone\n        ligands_in_network = {mol.name for mol in network.nodes}\n        assert ligands_in_network == expected_names\n\n        for edge in network.edges:\n            # make sure we didn't take the bad mapper, which would always be a length of 1 ({0:0})\n            assert len(edge.componentA_to_componentB) > 1\n            assert \"score\" in edge.annotations\n            assert edge.annotations[\"score\"] == 1 - 1 / len(edge.componentA_to_componentB)\n\n    def test_radial_network_multiple_mappers_no_scorer(self, toluene_vs_others, lomap_old_mapper):\n        toluene, others = toluene_vs_others\n        mappers = [BadMapper(), lomap_old_mapper]\n\n        network = openfe.setup.ligand_network_planning.generate_radial_network(\n            ligands=others,\n            central_ligand=toluene,\n            mappers=mappers,\n        )\n\n        expected_names = set([c.name for c in others] + [\"toluene\"])\n\n        # couple sanity checks\n        assert len(network.nodes) == len(expected_names)\n        assert len(network.edges) == len(expected_names) - 1\n\n        # check that all ligands are present, i.e. we included everyone\n        ligands_in_network = {mol.name for mol in network.nodes}\n        assert ligands_in_network == expected_names\n\n        for edge in network.edges:\n            # we should always take the first valid mapper (BadMapper) when there is no scorer.\n            assert edge.componentA_to_componentB == {0: 0}\n            assert \"score\" not in edge.annotations\n\n    def test_radial_network_no_mapping_failure(self, toluene_vs_others, lomap_old_mapper):\n        \"\"\"Error if any node does not have a mapping to the central component.\"\"\"\n        toluene, others = toluene_vs_others\n        # lomap cannot make a mapping to nimrod, and will return nothing for the (toluene, nimrod) pair\n        nimrod = openfe.SmallMoleculeComponent(mol_from_smiles(\"N\"), name=\"nimrod\")\n\n        err_str = r\"No mapping found between the central ligand \\('toluene'\\) and the following node\\(s\\): \\['nimrod'\\]\"\n        with pytest.raises(RuntimeError, match=err_str):\n            _ = openfe.setup.ligand_network_planning.generate_radial_network(\n                ligands=others + [nimrod],\n                central_ligand=toluene,\n                mappers=[lomap_old_mapper],\n                scorer=None,\n            )\n\n\n@pytest.mark.parametrize(\"with_progress\", [True, False])\n@pytest.mark.parametrize(\"with_scorer\", [True, False])\n@pytest.mark.parametrize(\"extra_mapper\", [True, False])\ndef test_generate_maximal_network(\n    toluene_vs_others,\n    with_progress,\n    with_scorer,\n    extra_mapper,\n    lomap_old_mapper,\n    simple_scorer,\n):\n    toluene, others = toluene_vs_others\n\n    if extra_mapper:\n        mappers = [lomap_old_mapper, BadMapper()]\n    else:\n        mappers = lomap_old_mapper\n\n    scorer = simple_scorer if with_scorer else None\n\n    network = openfe.setup.ligand_network_planning.generate_maximal_network(\n        ligands=others + [toluene],\n        mappers=mappers,\n        scorer=scorer,\n        progress=with_progress,\n    )\n\n    expected_names = set([c.name for c in others] + [\"toluene\"])\n\n    assert len(network.nodes) == len(expected_names)\n\n    # check that all ligands are present, i.e. we included everyone\n    ligands_in_network = {mol.name for mol in network.nodes}\n    assert ligands_in_network == expected_names\n\n    edge_count = len(others) * (len(others) + 1) / 2\n\n    assert len(network.edges) == edge_count\n\n    if with_scorer:\n        for edge in network.edges:\n            score = edge.annotations[\"score\"]\n            assert score == 1 - 1 / len(edge.componentA_to_componentB)\n    else:\n        for edge in network.edges:\n            assert \"score\" not in edge.annotations\n            assert \"score\" not in edge.annotations\n\n\nclass TestMinimalSpanningNetworkGenerator:\n    @pytest.mark.parametrize(\"multi_mappers\", [False, True])\n    def test_minimal_spanning_network(\n        self, toluene_vs_others, multi_mappers, lomap_old_mapper, simple_scorer\n    ):\n        toluene, others = toluene_vs_others\n        ligands = [toluene] + others\n\n        if multi_mappers:\n            mappers = [BadMapper(), lomap_old_mapper]\n        else:\n            mappers = lomap_old_mapper\n\n        scorer = simple_scorer\n\n        network = openfe.ligand_network_planning.generate_minimal_spanning_network(\n            ligands=ligands,\n            mappers=mappers,\n            scorer=scorer,\n        )\n\n        expected_names = {c.name for c in ligands}\n\n        # couple sanity checks\n        assert len(network.nodes) == len(expected_names)\n        assert len(network.edges) == len(expected_names) - 1\n        assert network.is_connected()\n\n        # check that all ligands are present, i.e. we included everyone\n        ligands_in_network = {mol.name for mol in network.nodes}\n        assert ligands_in_network == expected_names\n\n        for edge in network.edges:\n            # make sure we didn't take the bad mapper, which would always be a length of 1 ({0:0})\n            assert len(edge.componentA_to_componentB) > 1\n            assert \"score\" in edge.annotations\n            assert edge.annotations[\"score\"] == 1 - 1 / len(edge.componentA_to_componentB)\n\n    def test_minimal_spanning_network_no_scorer_error(self, toluene_vs_others, lomap_old_mapper):\n        \"\"\"Expect a KeyError if no scorer is passed.\"\"\"\n        # NOTE: I'm not making this error handling prettier until the konnektor integration\n        toluene, others = toluene_vs_others\n        ligands = [toluene] + others\n\n        with pytest.raises(KeyError, match=\"score\"):\n            _ = openfe.ligand_network_planning.generate_minimal_spanning_network(\n                ligands=ligands,\n                mappers=lomap_old_mapper,\n                scorer=None,\n            )\n\n    def test_minimal_spanning_network_connectedness(self, deterministic_minimal_spanning_network):\n        # makes sure we don't have duplicate edges?\n        found_pairs = set()\n        for edge in deterministic_minimal_spanning_network.edges:\n            pair = frozenset([edge.componentA, edge.componentB])\n            assert pair not in found_pairs\n            found_pairs.add(pair)\n\n        assert deterministic_minimal_spanning_network.is_connected()\n\n    def test_minimal_spanning_network_regression(self, deterministic_minimal_spanning_network):\n        \"\"\"issue #244, this was previously giving non-reproducible (yet valid) networks when scores were tied.\"\"\"\n        edge_names = {\n            (e.componentA.name, e.componentB.name)\n            for e in deterministic_minimal_spanning_network.edges\n        }\n        expected_edge_names = {\n            (\"1,3,7-trimethylnaphthalene\", \"2,6-dimethylnaphthalene\"),\n            (\"1-butyl-4-methylbenzene\", \"2-methyl-6-propylnaphthalene\"),\n            (\"2,6-dimethylnaphthalene\", \"2-methyl-6-propylnaphthalene\"),\n            (\"2,6-dimethylnaphthalene\", \"2-methylnaphthalene\"),\n            (\"2,6-dimethylnaphthalene\", \"2-naftanol\"),\n            (\"2,6-dimethylnaphthalene\", \"methylcyclohexane\"),\n            (\"2,6-dimethylnaphthalene\", \"toluene\"),\n        }\n        assert len(deterministic_minimal_spanning_network.nodes) == 8\n        assert len(edge_names) == len(expected_edge_names)\n        assert edge_names == expected_edge_names\n\n    def test_minimal_spanning_network_unreachable(\n        self, toluene_vs_others, lomap_old_mapper, simple_scorer\n    ):\n        toluene, others = toluene_vs_others\n        nimrod = openfe.SmallMoleculeComponent(mol_from_smiles(\"N\"), name=\"nimrod\")\n\n        scorer = simple_scorer\n\n        with pytest.raises(\n            RuntimeError,\n            match=r\"Unable to create edges for the following nodes: \\[SmallMoleculeComponent\\(name=nimrod\\)\\]\",\n        ):\n            _ = openfe.setup.ligand_network_planning.generate_minimal_spanning_network(\n                ligands=others + [toluene, nimrod],\n                mappers=[lomap_old_mapper],\n                scorer=scorer,\n            )\n\n\nclass TestMinimalRedundantNetworkGenerator:\n    def test_minimal_redundant_network(\n        self, deterministic_minimal_redundant_network, toluene_vs_others\n    ):\n        toluene, others = toluene_vs_others\n        ligands = [toluene] + others\n        expected_names = {c.name for c in ligands}\n\n        # check that all ligands are present, i.e. we included everyone\n        assert len(deterministic_minimal_redundant_network.nodes) == len(ligands)\n        ligands_in_network = {mol.name for mol in deterministic_minimal_redundant_network.nodes}\n        assert ligands_in_network == expected_names\n\n        # we expect double the number of edges of an mst\n        assert len(deterministic_minimal_redundant_network.edges) == 2 * (len(ligands) - 1)\n\n        for edge in deterministic_minimal_redundant_network.edges:\n            # lomap should find something\n            assert edge.componentA_to_componentB != {0: 0}\n\n    def test_minimal_redundant_network_connectedness(self, deterministic_minimal_redundant_network):\n        # makes sure we don't have duplicate edges?\n\n        found_pairs = set()\n        for edge in deterministic_minimal_redundant_network.edges:\n            pair = frozenset([edge.componentA, edge.componentB])\n            assert pair not in found_pairs\n            found_pairs.add(pair)\n\n        assert deterministic_minimal_redundant_network.is_connected()\n\n    def test_redundant_vs_spanning_network(\n        self,\n        toluene_vs_others,\n        lomap_old_mapper,\n        deterministic_toluene_mst_scorer,\n        deterministic_minimal_spanning_network,\n    ):\n        \"\"\"when setting minimal redundant network to only take one MST, it should be equivalent to the base MST.\"\"\"\n\n        toluene, others = toluene_vs_others\n        scorer = deterministic_toluene_mst_scorer\n\n        minimal_redundant_network = (\n            openfe.setup.ligand_network_planning.generate_minimal_redundant_network(\n                ligands=others + [toluene],\n                mappers=lomap_old_mapper,\n                scorer=scorer,\n                mst_num=1,\n            )\n        )\n        assert deterministic_minimal_spanning_network.edges == minimal_redundant_network.edges\n\n    def test_minimal_redundant_network_edges(self, deterministic_minimal_redundant_network):\n        \"\"\"issue #244, this was previously giving non-reproducible (yet valid)\n        networks when scores were tied.\"\"\"\n        edge_names = {\n            (e.componentA.name, e.componentB.name)\n            for e in deterministic_minimal_redundant_network.edges\n        }\n        expected_names = {\n            (\"1,3,7-trimethylnaphthalene\", \"2,6-dimethylnaphthalene\"),\n            (\"1,3,7-trimethylnaphthalene\", \"2-methyl-6-propylnaphthalene\"),\n            (\"1-butyl-4-methylbenzene\", \"2,6-dimethylnaphthalene\"),\n            (\"1-butyl-4-methylbenzene\", \"2-methyl-6-propylnaphthalene\"),\n            (\"1-butyl-4-methylbenzene\", \"toluene\"),\n            (\"2,6-dimethylnaphthalene\", \"2-methyl-6-propylnaphthalene\"),\n            (\"2,6-dimethylnaphthalene\", \"2-methylnaphthalene\"),\n            (\"2,6-dimethylnaphthalene\", \"2-naftanol\"),\n            (\"2,6-dimethylnaphthalene\", \"methylcyclohexane\"),\n            (\"2,6-dimethylnaphthalene\", \"toluene\"),\n            (\"2-methyl-6-propylnaphthalene\", \"2-methylnaphthalene\"),\n            (\"2-methylnaphthalene\", \"2-naftanol\"),\n            (\"2-methylnaphthalene\", \"methylcyclohexane\"),\n            (\"2-methylnaphthalene\", \"toluene\"),\n        }\n\n        assert len(edge_names) == len(expected_names)\n        assert edge_names == expected_names\n\n    def test_minimal_redundant_network_redundant(self, deterministic_minimal_redundant_network):\n        \"\"\"test that each node is connected to 2 edges\"\"\"\n        network = deterministic_minimal_redundant_network\n        for node in network.nodes:\n            assert len(network.graph.in_edges(node)) + len(network.graph.out_edges(node)) >= 2\n\n    def test_minimal_redundant_network_unreachable(\n        self, toluene_vs_others, lomap_old_mapper, simple_scorer\n    ):\n        toluene, others = toluene_vs_others\n        nimrod = openfe.SmallMoleculeComponent(mol_from_smiles(\"N\"), name=\"nimrod\")\n\n        scorer = simple_scorer\n\n        err_str = r\"ERROR: Unable to create edges for the following nodes: \\[SmallMoleculeComponent\\(name=nimrod\\)\\]\"\n        with pytest.raises(RuntimeError, match=err_str):\n            _ = openfe.setup.ligand_network_planning.generate_minimal_spanning_network(\n                ligands=others + [toluene, nimrod],\n                mappers=[lomap_old_mapper],\n                scorer=scorer,\n            )\n\n\nclass TestGenerateNetworkFromNames:\n    def test_generate_network_from_names(self, atom_mapping_basic_test_files, lomap_old_mapper):\n        ligands = list(atom_mapping_basic_test_files.values())\n\n        requested_names = [\n            (\"toluene\", \"2-naftanol\"),\n            (\"2-methylnaphthalene\", \"2-naftanol\"),\n        ]\n\n        network = openfe.setup.ligand_network_planning.generate_network_from_names(\n            ligands=ligands,\n            names=requested_names,\n            mapper=lomap_old_mapper,\n        )\n\n        assert len(network.nodes) == len(ligands)\n        assert len(network.edges) == 2\n\n        expected_node_names = {c.name for c in ligands}\n        actual_node_names = {n.name for n in network.nodes}\n\n        assert actual_node_names == expected_node_names\n\n        actual_edges = {(e.componentA.name, e.componentB.name) for e in network.edges}\n        assert set(requested_names) == actual_edges\n\n    def test_generate_network_from_names_bad_name_error(\n        self, atom_mapping_basic_test_files, lomap_old_mapper\n    ):\n        ligands = list(atom_mapping_basic_test_files.values())\n\n        requested = [\n            (\"hank\", \"2-naftanol\"),\n            (\"2-methylnaphthalene\", \"2-naftanol\"),\n        ]\n\n        with pytest.raises(KeyError, match=r\"Invalid name\\(s\\) requested \\['hank'\\].\"):\n            _ = openfe.setup.ligand_network_planning.generate_network_from_names(\n                ligands=ligands,\n                names=requested,\n                mapper=lomap_old_mapper,\n            )\n\n    def test_generate_network_from_names_duplicate_name(\n        self, atom_mapping_basic_test_files, lomap_old_mapper\n    ):\n        ligands = list(atom_mapping_basic_test_files.values())\n        ligands = ligands + [ligands[0]]\n\n        requested = [\n            (\"toluene\", \"2-naftanol\"),\n            (\"2-methylnaphthalene\", \"2-naftanol\"),\n        ]\n\n        with pytest.raises(ValueError, match=r\"Duplicate names: \\['1,3,7-trimethylnaphthalene'\\]\"):\n            _ = openfe.setup.ligand_network_planning.generate_network_from_names(\n                ligands=ligands,\n                names=requested,\n                mapper=lomap_old_mapper,\n            )\n\n\nclass TestNetworkFromIndices:\n    def test_network_from_indices(self, atom_mapping_basic_test_files, lomap_old_mapper):\n        ligands = list(atom_mapping_basic_test_files.values())\n\n        requested = [(0, 1), (2, 3)]\n\n        network = openfe.setup.ligand_network_planning.generate_network_from_indices(\n            ligands=ligands,\n            indices=requested,\n            mapper=lomap_old_mapper,\n        )\n\n        assert len(network.nodes) == len(ligands)\n        assert len(network.edges) == 2\n\n        edges = list(network.edges)\n        expected_edges = {(ligands[0], ligands[1]), (ligands[2], ligands[3])}\n        actual_edges = {\n            (edges[0].componentA, edges[0].componentB),\n            (edges[1].componentA, edges[1].componentB),\n        }\n\n        assert actual_edges == expected_edges\n\n    def test_network_from_indices_indexerror(self, atom_mapping_basic_test_files, lomap_old_mapper):\n        ligands = list(atom_mapping_basic_test_files.values())\n\n        requested = [(20, 1), (2, 3)]\n\n        with pytest.raises(IndexError, match=\"Invalid ligand index\"):\n            _ = openfe.setup.ligand_network_planning.generate_network_from_indices(\n                ligands=ligands,\n                indices=requested,\n                mapper=lomap_old_mapper,\n            )\n\n    def test_network_from_indices_disconnected_warning(\n        self, atom_mapping_basic_test_files, lomap_old_mapper\n    ):\n        ligands = list(atom_mapping_basic_test_files.values())\n        requested = [(0, 1), (1, 2)]\n\n        with pytest.warns(UserWarning):\n            _ = openfe.setup.ligand_network_planning.generate_network_from_indices(\n                ligands=ligands,\n                indices=requested,\n                mapper=lomap_old_mapper,\n            )\n\n\n@pytest.mark.parametrize(\n    \"file_fixture, loader\",\n    [\n        [\"orion_network\", openfe.setup.ligand_network_planning.load_orion_network],\n        [\"fepplus_network\", openfe.setup.ligand_network_planning.load_fepplus_network],\n    ],\n)\ndef test_network_from_external(file_fixture, loader, request, benzene_modifications):\n    network_file = request.getfixturevalue(file_fixture)\n\n    network = loader(\n        ligands=[lig for lig in benzene_modifications.values()],\n        mapper=openfe.LomapAtomMapper(),\n        network_file=network_file,\n    )\n\n    expected_edges = {\n        (benzene_modifications[\"benzene\"], benzene_modifications[\"toluene\"]),\n        (benzene_modifications[\"benzene\"], benzene_modifications[\"phenol\"]),\n        (benzene_modifications[\"benzene\"], benzene_modifications[\"benzonitrile\"]),\n        (benzene_modifications[\"benzene\"], benzene_modifications[\"anisole\"]),\n        (benzene_modifications[\"benzene\"], benzene_modifications[\"styrene\"]),\n        (benzene_modifications[\"benzene\"], benzene_modifications[\"benzaldehyde\"]),\n    }\n\n    actual_edges = {(e.componentA, e.componentB) for e in list(network.edges)}\n\n    assert len(network.nodes) == 7\n    assert len(network.edges) == 6\n    assert actual_edges == expected_edges\n\n\n@pytest.mark.parametrize(\n    \"file_fixture, loader\",\n    [\n        [\"orion_network\", openfe.setup.ligand_network_planning.load_orion_network],\n        [\"fepplus_network\", openfe.setup.ligand_network_planning.load_fepplus_network],\n    ],\n)\ndef test_network_from_external_unknown_edge(file_fixture, loader, request, benzene_modifications):\n    network_file = request.getfixturevalue(file_fixture)\n    ligands = [lig for lig in benzene_modifications.values() if lig.name != \"phenol\"]\n\n    with pytest.raises(KeyError, match=\"Invalid name\"):\n        _ = loader(\n            ligands=ligands,\n            mapper=openfe.LomapAtomMapper(),\n            network_file=network_file,\n        )\n\n\nBAD_ORION_NETWORK = \"\"\"\\\n# Total number of edges: 6\n# ------------------------\nbenzene >>> toluene\nbenzene >> phenol\nbenzene >> benzonitrile\nbenzene >> anisole\nbenzene >> styrene\nbenzene >> benzaldehyde\n\"\"\"\n\n\ndef test_bad_orion_network(benzene_modifications, tmp_path):\n    with open(tmp_path / \"bad_orion_net.dat\", \"w\") as f:\n        f.write(BAD_ORION_NETWORK)\n\n    with pytest.raises(KeyError, match=\"line does not match\"):\n        _ = openfe.setup.ligand_network_planning.load_orion_network(\n            ligands=[lig for lig in benzene_modifications.values()],\n            mapper=openfe.LomapAtomMapper(),\n            network_file=tmp_path / \"bad_orion_net.dat\",\n        )\n\n\nBAD_EDGES = \"\"\"\\\n1c91235:9c91235 benzene -> toluene\n1c91235:7876633 benzene -> phenol\n1c91235:2a51f95 benzene -> benzonitrile\n1c91235:efja0bc benzene -> anisole\n1c91235:7877722 benzene -> styrene\n1c91235:99930cd benzene -> benzaldehyde\n\"\"\"\n\n\ndef test_bad_edges_network(benzene_modifications, tmp_path):\n    with open(tmp_path / \"bad_edges.edges\", \"w\") as f:\n        f.write(BAD_EDGES)\n\n    with pytest.raises(KeyError, match=\"line does not match\"):\n        _ = openfe.setup.ligand_network_planning.load_fepplus_network(\n            ligands=[lig for lig in benzene_modifications.values()],\n            mapper=openfe.LomapAtomMapper(),\n            network_file=tmp_path / \"bad_edges.edges\",\n        )\n"
  },
  {
    "path": "src/openfe/tests/storage/__init__.py",
    "content": ""
  },
  {
    "path": "src/openfe/tests/storage/conftest.py",
    "content": "import gufe\nimport pytest\nfrom gufe import ChemicalSystem, SolventComponent\nfrom gufe.tests.test_protocol import DummyProtocol\nfrom openff.units import unit\n\n\n@pytest.fixture\ndef solv_comp():\n    yield SolventComponent(positive_ion=\"K\", negative_ion=\"Cl\", ion_concentration=0.0 * unit.molar)\n\n\n@pytest.fixture\ndef solvated_complex(T4_protein_component, benzene_transforms, solv_comp):\n    return ChemicalSystem(\n        {\n            \"ligand\": benzene_transforms[\"toluene\"],\n            \"protein\": T4_protein_component,\n            \"solvent\": solv_comp,\n        }\n    )\n\n\n@pytest.fixture\ndef solvated_ligand(benzene_transforms, solv_comp):\n    return ChemicalSystem(\n        {\n            \"ligand\": benzene_transforms[\"toluene\"],\n            \"solvent\": solv_comp,\n        }\n    )\n\n\n@pytest.fixture\ndef absolute_transformation(solvated_ligand, solvated_complex):\n    return gufe.Transformation(\n        solvated_ligand,\n        solvated_complex,\n        protocol=DummyProtocol(settings=DummyProtocol.default_settings()),\n        mapping=None,\n    )\n\n\n@pytest.fixture\ndef complex_equilibrium(solvated_complex):\n    return gufe.NonTransformation(\n        solvated_complex,\n        protocol=DummyProtocol(settings=DummyProtocol.default_settings()),\n    )\n\n\n@pytest.fixture\ndef benzene_variants_star_map(benzene_transforms, solv_comp, T4_protein_component):\n    variants = [\"toluene\", \"phenol\", \"benzonitrile\", \"anisole\", \"benzaldehyde\", \"styrene\"]\n\n    # define the solvent chemical systems and transformations between\n    # benzene and the others\n    solvated_ligands = {}\n    solvated_ligand_transformations = {}\n\n    solvated_ligands[\"benzene\"] = ChemicalSystem(\n        {\n            \"solvent\": solv_comp,\n            \"ligand\": benzene_transforms[\"benzene\"],\n        },\n        name=\"benzene-solvent\",\n    )\n\n    for ligand in variants:\n        solvated_ligands[ligand] = ChemicalSystem(\n            {\n                \"solvent\": solv_comp,\n                \"ligand\": benzene_transforms[ligand],\n            },\n            name=f\"{ligand}-solvent\",\n        )\n\n        solvated_ligand_transformations[(\"benzene\", ligand)] = gufe.Transformation(\n            solvated_ligands[\"benzene\"],\n            solvated_ligands[ligand],\n            protocol=DummyProtocol(settings=DummyProtocol.default_settings()),\n            mapping=None,\n        )\n\n    # define the complex chemical systems and transformations between\n    # benzene and the others\n    solvated_complexes = {}\n    solvated_complex_transformations = {}\n\n    solvated_complexes[\"benzene\"] = gufe.ChemicalSystem(\n        {\n            \"protein\": T4_protein_component,\n            \"solvent\": solv_comp,\n            \"ligand\": benzene_transforms[\"benzene\"],\n        },\n        name=\"benzene-complex\",\n    )\n\n    for ligand in variants:\n        solvated_complexes[ligand] = gufe.ChemicalSystem(\n            {\n                \"protein\": T4_protein_component,\n                \"solvent\": solv_comp,\n                \"ligand\": benzene_transforms[ligand],\n            },\n            name=f\"{ligand}-complex\",\n        )\n        solvated_complex_transformations[(\"benzene\", ligand)] = gufe.Transformation(\n            solvated_complexes[\"benzene\"],\n            solvated_complexes[ligand],\n            protocol=DummyProtocol(settings=DummyProtocol.default_settings()),\n            mapping=None,\n        )\n\n    return gufe.AlchemicalNetwork(\n        list(solvated_ligand_transformations.values())\n        + list(solvated_complex_transformations.values())\n    )\n"
  },
  {
    "path": "src/openfe/tests/storage/test_metadatastore.py",
    "content": "import json\nimport pathlib\n\nimport pytest\nfrom gufe.storage.errors import ChangedExternalResourceError, MissingExternalResourceError\nfrom gufe.storage.externalresource import FileStorage\nfrom gufe.storage.externalresource.base import Metadata\n\nfrom openfe.storage.metadatastore import JSONMetadataStore, PerFileJSONMetadataStore\n\n\n@pytest.fixture\ndef json_metadata(tmp_path):\n    metadata_dict = {\"path/to/foo.txt\": {\"md5\": \"bar\"}}\n    external_store = FileStorage(tmp_path)\n    with open(tmp_path / \"metadata.json\", mode=\"wb\") as f:\n        f.write(json.dumps(metadata_dict).encode(\"utf-8\"))\n    json_metadata = JSONMetadataStore(external_store)\n    return json_metadata\n\n\n@pytest.fixture\ndef per_file_metadata(tmp_path):\n    metadata_dict = {\"path\": \"path/to/foo.txt\", \"metadata\": {\"md5\": \"bar\"}}\n    metadata_loc = \"metadata/path/to/foo.txt.json\"\n    external_store = FileStorage(tmp_path)\n    metadata_path = tmp_path / pathlib.Path(metadata_loc)\n    metadata_path.parent.mkdir(parents=True, exist_ok=True)\n    with open(metadata_path, mode=\"wb\") as f:\n        f.write(json.dumps(metadata_dict).encode(\"utf-8\"))\n\n    per_file_metadata = PerFileJSONMetadataStore(external_store)\n    return per_file_metadata\n\n\nclass MetadataTests:\n    \"\"\"Mixin with a few tests for any subclass of MetadataStore\"\"\"\n\n    def test_store_metadata(self, metadata):\n        raise NotImplementedError()\n\n    def test_load_all_metadata(self):\n        raise NotImplementedError(\"This should call self._test_load_all_metadata\")\n\n    def test_delete(self):\n        raise NotImplementedError(\"This should call self._test_delete\")\n\n    def _test_load_all_metadata(self, metadata):\n        expected = {\"path/to/foo.txt\": Metadata(md5=\"bar\")}\n        metadata._metadata_cache = {}\n        loaded = metadata.load_all_metadata()\n        assert loaded == expected\n\n    def _test_delete(self, metadata):\n        assert \"path/to/foo.txt\" in metadata\n        assert len(metadata) == 1\n        del metadata[\"path/to/foo.txt\"]\n        assert \"path/to/foo.txt\" not in metadata\n        assert len(metadata) == 0\n\n    def _test_iter(self, metadata):\n        assert list(metadata) == [\"path/to/foo.txt\"]\n\n    def _test_len(self, metadata):\n        assert len(metadata) == 1\n\n    def _test_getitem(self, metadata):\n        assert metadata[\"path/to/foo.txt\"] == Metadata(md5=\"bar\")\n\n\nclass TestJSONMetadataStore(MetadataTests):\n    def test_store_metadata(self, json_metadata):\n        meta = Metadata(md5=\"other\")\n        json_metadata.store_metadata(\"path/to/other.txt\", meta)\n        base_path = json_metadata.external_store.root_dir\n        metadata_json = base_path / \"metadata.json\"\n        assert metadata_json.exists()\n        with open(metadata_json, mode=\"r\") as f:\n            metadata_dict = json.load(f)\n\n        metadata = {key: Metadata(**val) for key, val in metadata_dict.items()}\n\n        assert metadata == json_metadata._metadata_cache\n        assert json_metadata[\"path/to/other.txt\"] == meta\n        assert len(metadata) == 2\n\n    def test_load_all_metadata(self, json_metadata):\n        self._test_load_all_metadata(json_metadata)\n\n    def test_load_all_metadata_nofile(self, tmp_path):\n        json_metadata = JSONMetadataStore(FileStorage(tmp_path))\n        # implicitly called on init anyway\n        assert json_metadata._metadata_cache == {}\n        # but we also call explicitly\n        assert json_metadata.load_all_metadata() == {}\n\n    def test_delete(self, json_metadata):\n        self._test_delete(json_metadata)\n\n    def test_iter(self, json_metadata):\n        self._test_iter(json_metadata)\n\n    def test_len(self, json_metadata):\n        self._test_len(json_metadata)\n\n    def test_getitem(self, json_metadata):\n        self._test_getitem(json_metadata)\n\n\nclass TestPerFileJSONMetadataStore(MetadataTests):\n    def test_store_metadata(self, per_file_metadata):\n        expected_loc = \"metadata/path/to/other.txt.json\"\n        root = per_file_metadata.external_store.root_dir\n        expected_path = root / expected_loc\n        assert not expected_path.exists()\n        meta = Metadata(md5=\"other\")\n        per_file_metadata.store_metadata(\"path/to/other.txt\", meta)\n        assert expected_path.exists()\n        expected = {\"path\": \"path/to/other.txt\", \"metadata\": {\"md5\": \"other\"}}\n        with open(expected_path, mode=\"r\") as f:\n            assert json.load(f) == expected\n\n    def test_load_all_metadata(self, per_file_metadata):\n        self._test_load_all_metadata(per_file_metadata)\n\n    def test_delete(self, per_file_metadata):\n        self._test_delete(per_file_metadata)\n        # TODO: add additional test that the file is gone\n\n    def test_iter(self, per_file_metadata):\n        self._test_iter(per_file_metadata)\n\n    def test_len(self, per_file_metadata):\n        self._test_len(per_file_metadata)\n\n    def test_getitem(self, per_file_metadata):\n        self._test_getitem(per_file_metadata)\n\n    def test_bad_metadata_contents(self, tmp_path):\n        loc = tmp_path / \"metadata/foo.txt.json\"\n        loc.parent.mkdir(parents=True, exist_ok=True)\n        bad_dict = {\"foo\": \"bar\"}\n        with open(loc, mode=\"wb\") as f:\n            f.write(json.dumps(bad_dict).encode(\"utf-8\"))\n\n        with pytest.raises(ChangedExternalResourceError, match=\"Bad metadata\"):\n            PerFileJSONMetadataStore(FileStorage(tmp_path))\n"
  },
  {
    "path": "src/openfe/tests/storage/test_resultclient.py",
    "content": "import os\nfrom unittest import mock\n\nimport pytest\nfrom gufe.storage.externalresource import MemoryStorage\nfrom gufe.tokenization import TOKENIZABLE_REGISTRY\n\nfrom openfe.storage.resultclient import (\n    CloneResult,\n    ExtensionResult,\n    ResultClient,\n    TransformationResult,\n)\n\n\n@pytest.fixture\ndef result_client():\n    external = MemoryStorage()\n    result_client = ResultClient(external)\n\n    # store one file with contents \"foo\"\n    result_client.result_server.store_bytes(\n        \"transformations/MAIN_TRANS/0/0/file.txt\",\n        \"foo\".encode(\"utf-8\"),\n    )\n\n    # create some empty files as well\n    empty_files = [\n        \"transformations/MAIN_TRANS/0/0/other.txt\",\n        \"transformations/MAIN_TRANS/0/1/file.txt\",\n        \"transformations/MAIN_TRANS/1/0/file.txt\",\n        \"transformations/OTHER_TRANS/0/0/file.txt\",\n        \"other_dir/file.txt\",\n    ]\n\n    for file in empty_files:\n        result_client.result_server.store_bytes(file, b\"\")  # empty\n\n    return result_client\n\n\ndef _make_mock_transformation(hash_str):\n    return mock.Mock(\n        # TODO: fill this in so that it mocks out the digest we use\n    )\n\n\ndef test_load_file(result_client):\n    file_handler = result_client / \"MAIN_TRANS\" / \"0\" / 0 / \"file.txt\"\n    with file_handler as f:\n        assert f.read().decode(\"utf-8\") == \"foo\"\n\n\nclass _ResultContainerTest:\n    @staticmethod\n    def get_container(result_client):\n        raise NotImplementedError()\n\n    def _getitem_object(self, container):\n        raise NotImplementedError()\n\n    def test_iter(self, result_client):\n        container = self.get_container(result_client)\n        assert set(container) == set(self.expected_files)\n\n    def _get_key(self, as_object, container):\n        # TODO: this isn't working yet -- need an interface that allows me\n        # to patch the hex digest that we'll be using\n        if as_object:\n            pytest.skip(\"Waiting on hex digest patching\")\n        obj = self._getitem_object(container)\n        # next line uses some internal implementation\n        key = obj if as_object else obj._path_component\n        return key, obj\n\n    @pytest.mark.parametrize(\"as_object\", [True, False])\n    def test_getitem(self, as_object, result_client):\n        container = self.get_container(result_client)\n        key, obj = self._get_key(as_object, container)\n        assert container[key] == obj\n\n    @pytest.mark.parametrize(\"as_object\", [True, False])\n    def test_div(self, as_object, result_client):\n        container = self.get_container(result_client)\n        key, obj = self._get_key(as_object, container)\n        assert container / key == obj\n\n    @pytest.mark.parametrize(\"load_with\", [\"div\", \"getitem\"])\n    def test_caching(self, result_client, load_with):\n        # used to test caching regardless of how first loaded was loaded\n        container = self.get_container(result_client)\n        key, obj = self._get_key(False, container)\n\n        if load_with == \"div\":\n            loaded = container / key\n        elif load_with == \"getitem\":\n            loaded = container[key]\n        else:  # -no-cov-\n            raise RuntimeError(f\"Bad input: can't load with '{load_with}'\")\n\n        assert loaded == obj\n        assert loaded is not obj\n        reloaded_div = container / key\n        reloaded_getitem = container[key]\n\n        assert loaded is reloaded_div\n        assert reloaded_div is reloaded_getitem\n\n    def test_load_stream(self, result_client):\n        container = self.get_container(result_client)\n        loc = \"transformations/MAIN_TRANS/0/0/file.txt\"\n        with container.load_stream(loc) as f:\n            assert f.read().decode(\"utf-8\") == \"foo\"\n\n    def test_load_bytes(self, result_client):\n        container = self.get_container(result_client)\n        loc = \"transformations/MAIN_TRANS/0/0/file.txt\"\n        assert container.load_bytes(loc).decode(\"utf-8\") == \"foo\"\n\n    def test_path(self, result_client):\n        container = self.get_container(result_client)\n        assert container.path == self.expected_path\n\n    def test_result_server(self, result_client):\n        container = self.get_container(result_client)\n        assert container.result_server == result_client.result_server\n\n\nclass TestResultClient(_ResultContainerTest):\n    expected_files = [\n        \"transformations/MAIN_TRANS/0/0/file.txt\",\n        \"transformations/MAIN_TRANS/0/0/other.txt\",\n        \"transformations/MAIN_TRANS/0/1/file.txt\",\n        \"transformations/MAIN_TRANS/1/0/file.txt\",\n        \"transformations/OTHER_TRANS/0/0/file.txt\",\n    ]\n    expected_path = \"transformations\"\n\n    @staticmethod\n    def get_container(result_client):\n        return result_client\n\n    def _getitem_object(self, container):\n        return TransformationResult(\n            parent=container,\n            transformation=_make_mock_transformation(\"MAIN_TRANS\"),\n        )\n\n    def test_store_protocol_dag_result(self):\n        pytest.skip(\"Not implemented yet\")\n\n    @staticmethod\n    def _test_store_load_same_process(obj, store_func_name, load_func_name):\n        store = MemoryStorage()\n        client = ResultClient(store)\n        store_func = getattr(client, store_func_name)\n        load_func = getattr(client, load_func_name)\n        assert store._data == {}\n        store_func(obj)\n        assert store._data != {}\n        reloaded = load_func(obj.key)\n        assert reloaded is obj\n\n    @staticmethod\n    def _test_store_load_different_process(obj, store_func_name, load_func_name):\n        store = MemoryStorage()\n        client = ResultClient(store)\n        store_func = getattr(client, store_func_name)\n        load_func = getattr(client, load_func_name)\n        assert store._data == {}\n        store_func(obj)\n        assert store._data != {}\n        # make it look like we have an empty cache, as if this was a\n        # different process\n        key = obj.key\n        registry_dict = \"gufe.tokenization.TOKENIZABLE_REGISTRY\"\n        with mock.patch.dict(registry_dict, {}, clear=True):\n            reload = load_func(key)\n            assert reload == obj\n            assert reload is not obj\n\n    @pytest.mark.parametrize(\n        \"fixture\",\n        [\"absolute_transformation\", \"complex_equilibrium\"],\n    )\n    def test_store_load_transformation_same_process(self, request, fixture):\n        transformation = request.getfixturevalue(fixture)\n        self._test_store_load_same_process(\n            transformation,\n            \"store_transformation\",\n            \"load_transformation\",\n        )\n\n    @pytest.mark.parametrize(\n        \"fixture\",\n        [\"absolute_transformation\", \"complex_equilibrium\"],\n    )\n    def test_store_load_transformation_different_process(self, request, fixture):\n        transformation = request.getfixturevalue(fixture)\n        self._test_store_load_different_process(\n            transformation,\n            \"store_transformation\",\n            \"load_transformation\",\n        )\n\n    @pytest.mark.parametrize(\"fixture\", [\"benzene_variants_star_map\"])\n    def test_store_load_network_same_process(self, request, fixture):\n        network = request.getfixturevalue(fixture)\n        self._test_store_load_same_process(network, \"store_network\", \"load_network\")\n\n    @pytest.mark.parametrize(\"fixture\", [\"benzene_variants_star_map\"])\n    def test_store_load_network_different_process(self, request, fixture):\n        network = request.getfixturevalue(fixture)\n        self._test_store_load_different_process(network, \"store_network\", \"load_network\")\n\n    def test_delete(self, result_client):\n        file_to_delete = self.expected_files[0]\n        storage = result_client.result_server.external_store\n        assert storage.exists(file_to_delete)\n        result_client.delete(file_to_delete)\n        assert not storage.exists(file_to_delete)\n\n\nclass TestTransformationResults(_ResultContainerTest):\n    expected_files = [\n        \"transformations/MAIN_TRANS/0/0/file.txt\",\n        \"transformations/MAIN_TRANS/0/0/other.txt\",\n        \"transformations/MAIN_TRANS/0/1/file.txt\",\n        \"transformations/MAIN_TRANS/1/0/file.txt\",\n    ]\n    expected_path = \"transformations/MAIN_TRANS\"\n\n    @staticmethod\n    def get_container(result_client):\n        container = TransformationResult(\n            parent=TestResultClient.get_container(result_client),\n            transformation=_make_mock_transformation(\"MAIN_TRANS\"),\n        )\n        container._path_component = \"MAIN_TRANS\"\n        return container\n\n    def _getitem_object(self, container):\n        return CloneResult(parent=container, clone=0)\n\n\nclass TestCloneResults(_ResultContainerTest):\n    expected_files = [\n        \"transformations/MAIN_TRANS/0/0/file.txt\",\n        \"transformations/MAIN_TRANS/0/0/other.txt\",\n        \"transformations/MAIN_TRANS/0/1/file.txt\",\n    ]\n    expected_path = \"transformations/MAIN_TRANS/0\"\n\n    @staticmethod\n    def get_container(result_client):\n        return CloneResult(\n            parent=TestTransformationResults.get_container(result_client),\n            clone=0,\n        )\n\n    def _getitem_object(self, container):\n        return ExtensionResult(parent=container, extension=0)\n\n\nclass TestExtensionResults(_ResultContainerTest):\n    expected_files = [\n        \"transformations/MAIN_TRANS/0/0/file.txt\",\n        \"transformations/MAIN_TRANS/0/0/other.txt\",\n    ]\n    expected_path = \"transformations/MAIN_TRANS/0/0\"\n\n    @staticmethod\n    def get_container(result_client):\n        return ExtensionResult(\n            parent=TestCloneResults.get_container(result_client),\n            extension=0,\n        )\n\n    def _get_key(self, as_object, container):\n        if self.as_object:  # -no-cov-\n            raise RuntimeError(\"TestExtensionResults does not support as_object=True\")\n        path = \"transformations/MAIN_TRANS/0/0/\"\n        fname = \"file.txt\"\n        return fname, container.result_server.load_stream(path + fname)\n\n    # things involving div and getitem need custom treatment\n    def test_div(self, result_client):\n        container = self.get_container(result_client)\n        with container / \"file.txt\" as f:\n            assert f.read().decode(\"utf-8\") == \"foo\"\n\n    def test_getitem(self, result_client):\n        container = self.get_container(result_client)\n        with container[\"file.txt\"] as f:\n            assert f.read().decode(\"utf-8\") == \"foo\"\n\n    def test_caching(self, result_client):\n        # this one does not cache results; the cache should remain empty\n        container = self.get_container(result_client)\n        assert container._cache == {}\n        from_div = container / \"file.txt\"\n        assert container._cache == {}\n        from_getitem = container[\"file.txt\"]\n        assert container._cache == {}\n"
  },
  {
    "path": "src/openfe/tests/storage/test_resultserver.py",
    "content": "import pathlib\nfrom unittest import mock\n\nimport pytest\nfrom gufe.storage.errors import ChangedExternalResourceError, MissingExternalResourceError\nfrom gufe.storage.externalresource import FileStorage\nfrom gufe.storage.externalresource.base import Metadata\n\nfrom openfe.storage.metadatastore import JSONMetadataStore\nfrom openfe.storage.resultserver import ResultServer\n\n\n@pytest.fixture\ndef result_server(tmp_path):\n    external = FileStorage(tmp_path)\n    metadata = JSONMetadataStore(external)\n    result_server = ResultServer(external, metadata)\n    result_server.store_bytes(\"path/to/foo.txt\", \"foo\".encode(\"utf-8\"))\n    return result_server\n\n\nclass TestResultServer:\n    def test_store_bytes(self, result_server):\n        # first check the thing stored during the fixture\n        metadata_store = result_server.metadata_store\n        foo_loc = \"path/to/foo.txt\"\n        assert len(metadata_store) == 1\n        assert foo_loc in metadata_store\n        assert result_server.external_store.exists(foo_loc)\n\n        # also explicitly test storing here\n        mock_hash = mock.Mock(\n            return_value=mock.Mock(\n                hexdigest=mock.Mock(return_value=\"deadbeef\"),\n            )\n        )\n        bar_loc = \"path/to/bar.txt\"\n        with mock.patch(\"hashlib.md5\", mock_hash):\n            result_server.store_bytes(bar_loc, \"bar\".encode(\"utf-8\"))\n\n        assert len(metadata_store) == 2\n        assert bar_loc in metadata_store\n        assert result_server.external_store.exists(bar_loc)\n        assert metadata_store[bar_loc].to_dict() == {\"md5\": \"deadbeef\"}\n        external = result_server.external_store\n        with external.load_stream(bar_loc) as f:\n            assert f.read().decode(\"utf-8\") == \"bar\"\n\n    def test_store_path(self, result_server, tmp_path):\n        orig_file = tmp_path / \".hidden\" / \"bar.txt\"\n        orig_file.parent.mkdir(parents=True, exist_ok=True)\n        with open(orig_file, mode=\"wb\") as f:\n            f.write(\"bar\".encode(\"utf-8\"))\n\n        mock_hash = mock.Mock(\n            return_value=mock.Mock(\n                hexdigest=mock.Mock(return_value=\"deadc0de\"),\n            )\n        )\n        bar_loc = \"path/to/bar.txt\"\n\n        assert len(result_server.metadata_store) == 1\n        assert bar_loc not in result_server.metadata_store\n\n        with mock.patch(\"hashlib.md5\", mock_hash):\n            result_server.store_path(bar_loc, orig_file)\n\n        assert len(result_server.metadata_store) == 2\n        assert bar_loc in result_server.metadata_store\n        metadata_dict = result_server.metadata_store[bar_loc].to_dict()\n        assert metadata_dict == {\"md5\": \"deadc0de\"}\n        external = result_server.external_store\n        with external.load_stream(bar_loc) as f:\n            assert f.read().decode(\"utf-8\") == \"bar\"\n\n    def test_iter(self, result_server):\n        assert list(result_server) == [\"path/to/foo.txt\"]\n\n    def test_find_missing_files(self, result_server):\n        meta = Metadata(md5=\"1badc0de\")\n        result_server.metadata_store.store_metadata(\"fake/file.txt\", meta)\n\n        assert result_server.find_missing_files() == [\"fake/file.txt\"]\n\n    def test_load_stream(self, result_server):\n        with result_server.load_stream(\"path/to/foo.txt\") as f:\n            contents = f.read()\n\n        assert contents.decode(\"utf-8\") == \"foo\"\n\n    def test_delete(self, result_server, tmp_path):\n        location = \"path/to/foo.txt\"\n        path = tmp_path / pathlib.Path(location)\n        assert path.exists()\n        assert location in result_server.metadata_store\n        result_server.delete(location)\n        assert not path.exists()\n        assert location not in result_server.metadata_store\n\n    def test_load_stream_missing(self, result_server):\n        with pytest.raises(MissingExternalResourceError, match=\"not found\"):\n            result_server.load_stream(\"path/does/not/exist.txt\")\n\n    def test_load_stream_error_bad_hash(self, result_server):\n        meta = Metadata(md5=\"1badc0de\")\n        result_server.metadata_store.store_metadata(\"path/to/foo.txt\", meta)\n        with pytest.raises(ChangedExternalResourceError):\n            result_server.load_stream(\"path/to/foo.txt\")\n\n    def test_load_stream_allow_bad_hash(self, result_server):\n        meta = Metadata(md5=\"1badc0de\")\n        result_server.metadata_store.store_metadata(\"path/to/foo.txt\", meta)\n        with pytest.warns(UserWarning, match=\"Metadata mismatch\"):\n            file = result_server.load_stream(\"path/to/foo.txt\", allow_changed=True)\n\n        with file as f:\n            assert f.read().decode(\"utf-8\") == \"foo\"\n"
  },
  {
    "path": "src/openfe/tests/utils/__init__.py",
    "content": ""
  },
  {
    "path": "src/openfe/tests/utils/conftest.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\nfrom importlib import resources\nfrom typing import Iterable, NamedTuple\n\nimport pytest\nfrom rdkit import Chem\n\nfrom openfe import LigandAtomMapping, LigandNetwork, SmallMoleculeComponent\n\nfrom ..conftest import mol_from_smiles\n\n\nclass _NetworkTestContainer(NamedTuple):\n    \"\"\"Container to facilitate network testing\"\"\"\n\n    network: LigandNetwork\n    nodes: Iterable[SmallMoleculeComponent]\n    edges: Iterable[LigandAtomMapping]\n    n_nodes: int\n    n_edges: int\n\n\n@pytest.fixture\ndef mols():\n    mol1 = SmallMoleculeComponent(mol_from_smiles(\"CCO\"))\n    mol2 = SmallMoleculeComponent(mol_from_smiles(\"CC\"))\n    mol3 = SmallMoleculeComponent(mol_from_smiles(\"CO\"))\n    return mol1, mol2, mol3\n\n\n@pytest.fixture\ndef std_edges(mols):\n    mol1, mol2, mol3 = mols\n    edge12 = LigandAtomMapping(mol1, mol2, {0: 0, 1: 1})\n    edge23 = LigandAtomMapping(mol2, mol3, {0: 0})\n    edge13 = LigandAtomMapping(mol1, mol3, {0: 0, 2: 1})\n    return edge12, edge23, edge13\n\n\n@pytest.fixture\ndef simple_network(mols, std_edges):\n    \"\"\"Network with no edges duplicated and all nodes in edges\"\"\"\n    network = LigandNetwork(std_edges)\n    return _NetworkTestContainer(\n        network=network,\n        nodes=mols,\n        edges=std_edges,\n        n_nodes=3,\n        n_edges=3,\n    )\n\n\n@pytest.fixture(scope=\"session\")\ndef benzene_transforms():\n    # a dict of Molecules for benzene transformations\n    mols = {}\n    with resources.as_file(resources.files(\"openfe.tests.data\")) as d:\n        fn = str(d / \"benzene_modifications.sdf\")\n        supplier = Chem.SDMolSupplier(fn, removeHs=False)\n        for mol in supplier:\n            mols[mol.GetProp(\"_Name\")] = SmallMoleculeComponent(mol)\n    return mols\n"
  },
  {
    "path": "src/openfe/tests/utils/test_atommapping_network_plotting.py",
    "content": "import importlib.resources\nimport inspect\nfrom unittest import mock\n\nimport matplotlib\nimport matplotlib.figure\nimport pytest\nfrom matplotlib import pyplot as plt\n\nfrom openfe.tests.utils.test_network_plotting import mock_event\nfrom openfe.utils.atommapping_network_plotting import (\n    AtomMappingNetworkDrawing,\n    LigandNode,\n    plot_atommapping_network,\n)\n\n\ndef bound_args(func, args, kwargs):\n    \"\"\"Return a dictionary mapping parameter name to value.\n\n    Parameters\n    ----------\n    func : Callable\n        this must be inspectable; mocks will require a spec\n    args : List\n        args list\n    kwargs : Dict\n        kwargs Dict\n\n    Returns\n    -------\n    Dict[str, Any] :\n        mapping of string name of function parameter to the value it would\n        be bound to\n    \"\"\"\n    sig = inspect.Signature.from_callable(func)\n    bound = sig.bind(*args, **kwargs)\n    return bound.arguments\n\n\n@pytest.fixture\ndef network_drawing(simple_network):\n    nx_graph = simple_network.network.graph\n    node_dict = {node.smiles: node for node in nx_graph.nodes}\n    positions = {\n        node_dict[\"CC\"]: (0.0, 0.0),\n        node_dict[\"CO\"]: (0.5, 0.0),\n        node_dict[\"CCO\"]: (0.25, 0.25),\n    }\n    graph = AtomMappingNetworkDrawing(nx_graph, positions)\n    graph.ax.set_xlim(0, 1)\n    graph.ax.set_ylim(0, 1)\n    yield graph\n    plt.close(graph.fig)\n\n\n@pytest.fixture\ndef default_edge(network_drawing):\n    node_dict = {node.smiles: node for node in network_drawing.graph.nodes}\n    yield network_drawing.edges[node_dict[\"CC\"], node_dict[\"CO\"]]\n\n\n@pytest.fixture\ndef default_node(network_drawing):\n    node_dict = {node.smiles: node for node in network_drawing.graph.nodes}\n    yield LigandNode(node_dict[\"CC\"], 0.5, 0.5, 0.1, 0.1)\n\n\nclass TestAtomMappingEdge:\n    def test_draw_mapped_molecule(self, default_edge):\n        assert len(default_edge.artist.axes.images) == 0\n        im = default_edge._draw_mapped_molecule(\n            (0.05, 0.45, 0.5, 0.9),\n            default_edge.node_artists[0].node,\n            default_edge.node_artists[1].node,\n            {0: 0},\n        )\n        # maybe add something about im itself? not sure what to test here\n        assert len(default_edge.artist.axes.images) == 1\n        assert default_edge.artist.axes.images[0] == im\n\n    def test_get_image_extents(self, default_edge):\n        left_extent, right_extent = default_edge._get_image_extents()\n        assert left_extent == (0.05, 0.45, 0.5, 0.9)\n        assert right_extent == (0.55, 0.95, 0.5, 0.9)\n\n    def test_select(self, default_edge, network_drawing):\n        assert not default_edge.picked\n        assert len(default_edge.artist.axes.images) == 0\n\n        event = mock_event(\"mouseup\", 0.25, 0.0, network_drawing.fig)\n        default_edge.select(event, network_drawing)\n\n        assert default_edge.picked\n        assert len(default_edge.artist.axes.images) == 2\n\n    @pytest.mark.parametrize(\n        \"edge_str,left_right,molA_to_molB\",\n        [\n            ((\"CCO\", \"CC\"), (\"CC\", \"CCO\"), {0: 0, 1: 1}),\n            ((\"CC\", \"CO\"), (\"CC\", \"CO\"), {0: 0}),\n            ((\"CCO\", \"CO\"), (\"CCO\", \"CO\"), {0: 0, 2: 1}),\n        ],\n    )\n    def test_select_mock_drawing(self, edge_str, left_right, molA_to_molB, network_drawing):\n        # this tests that we call _draw_mapped_molecule with the correct\n        # kwargs -- in particular, it ensures that we get the left and right\n        # molecules correctly\n        node_dict = {node.smiles: node for node in network_drawing.graph.nodes}\n        edge_tuple = tuple(node_dict[node] for node in edge_str)\n        edge = network_drawing.edges[edge_tuple]\n        left, right = [network_drawing.nodes[node_dict[node]] for node in left_right]\n        # ensure that we have them labelled correctly\n        assert left.xy[0] < right.xy[0]\n        func = edge._draw_mapped_molecule  # save for bound_args\n        edge._draw_mapped_molecule = mock.Mock()\n\n        event = mock_event(\"mouseup\", 0.25, 0.0, network_drawing.fig)\n        edge.select(event, network_drawing)\n\n        arg_dicts = [\n            bound_args(func, call.args, call.kwargs)\n            for call in edge._draw_mapped_molecule.mock_calls\n        ]\n        expected_left = {\n            \"extent\": (0.05, 0.45, 0.5, 0.9),\n            \"molA\": left.node,\n            \"molB\": right.node,\n            \"molA_to_molB\": molA_to_molB,\n        }\n        expected_right = {\n            \"extent\": (0.55, 0.95, 0.5, 0.9),\n            \"molA\": right.node,\n            \"molB\": left.node,\n            \"molA_to_molB\": {v: k for k, v in molA_to_molB.items()},\n        }\n        assert len(arg_dicts) == 2\n        assert expected_left in arg_dicts\n        assert expected_right in arg_dicts\n\n    def test_unselect(self, default_edge, network_drawing):\n        # start by selecting; hard to be sure we mocked all the side effects\n        # of select\n        event = mock_event(\"mouseup\", 0.25, 0.0, network_drawing.fig)\n        default_edge.select(event, network_drawing)\n        assert default_edge.picked\n        assert len(default_edge.artist.axes.images) == 2\n        assert default_edge.right_image is not None\n        assert default_edge.left_image is not None\n\n        default_edge.unselect()\n\n        assert not default_edge.picked\n        assert len(default_edge.artist.axes.images) == 0\n        assert default_edge.right_image is None\n        assert default_edge.left_image is None\n\n\nclass TestLigandNode:\n    def setup_method(self):\n        self.fig, self.ax = plt.subplots()\n\n    def teardown_method(self):\n        plt.close(self.fig)\n\n    def test_register_artist(self, default_node):\n        assert len(self.ax.texts) == 0\n        default_node.register_artist(self.ax)\n        assert len(self.ax.texts) == 1\n        assert self.ax.texts[0] == default_node.artist\n\n    def test_extent(self, default_node):\n        default_node.register_artist(self.ax)\n        xmin, xmax, ymin, ymax = default_node.extent\n        assert xmin == pytest.approx(0.5)\n        assert ymin == pytest.approx(0.5)\n        # can't do anything about upper bounds\n\n    def test_xy(self, default_node):\n        # default_node.register_artist(self.ax)\n        x, y = default_node.xy\n        assert x == pytest.approx(0.5)\n        assert y == pytest.approx(0.5)\n\n\ndef test_plot_atommapping_network(simple_network):\n    fig = plot_atommapping_network(simple_network.network)\n    assert isinstance(fig, matplotlib.figure.Figure)\n"
  },
  {
    "path": "src/openfe/tests/utils/test_duecredit.py",
    "content": "import importlib\nimport os\n\nimport pytest\nfrom openff.utilities.testing import skip_if_missing\n\nimport openfe\n\n\n@skip_if_missing(\"duecredit\")\n@pytest.mark.skipif(\n    (os.environ.get(\"DUECREDIT_ENABLE\", \"no\").lower() in (\"no\", \"0\", \"false\")),\n    reason=\"duecredit is disabled\",\n)\nclass TestDuecredit:\n    @pytest.mark.parametrize(\n        \"module, dois\",\n        [\n            [\n                \"openfe.protocols.openmm_afe.equil_solvation_afe_method\",\n                [\n                    \"10.5281/zenodo.596504\",\n                    \"10.48550/arxiv.2302.06758\",\n                    \"10.5281/zenodo.596622\",\n                    \"10.1371/journal.pcbi.1005659\",\n                ],\n            ],\n            [\n                \"openfe.protocols.openmm_afe.equil_binding_afe_method\",\n                [\n                    \"10.5281/zenodo.596504\",\n                    \"10.5281/zenodo.596622\",\n                    \"10.1371/journal.pcbi.1005659\",\n                ],\n            ],\n            [\n                \"openfe.protocols.openmm_rfe.hybridtop_protocols\",\n                [\"10.5281/zenodo.1297683\", \"10.5281/zenodo.596622\", \"10.1371/journal.pcbi.1005659\"],\n            ],\n            [\n                \"openfe.protocols.openmm_utils.multistate_analysis\",\n                [\n                    \"10.5281/zenodo.596622\",\n                    \"10.1063/1.2978177\",\n                    \"10.1021/ct0502864\",\n                    \"10.1021/acs.jctc.5b00784\",\n                    \"10.5281/zenodo.596220\",\n                ],\n            ],\n            [\n                \"openfe.protocols.openmm_septop.equil_septop_method\",\n                [\n                    \"10.1021/acs.jctc.3c00282\",\n                    \"10.5281/zenodo.596622\",\n                    \"10.1371/journal.pcbi.1005659\",\n                ],\n            ],\n        ],\n    )\n    def test_duecredit_protocol_collection(self, module, dois):\n        importlib.import_module(module)\n        for doi in dois:\n            assert openfe.due.due.citations[(module, doi)].cites_module\n\n    def test_duecredit_active(self):\n        assert openfe.due.due.active\n"
  },
  {
    "path": "src/openfe/tests/utils/test_log_control.py",
    "content": "import logging\n\nimport pytest\n\nfrom openfe.utils import logging_control\nfrom openfe.utils.logging_control import (\n    _AppendMsgFilter,\n    _BaseLogFilter,\n    _MsgIncludesStringFilter,\n)\n\n\n@pytest.fixture\ndef logger():\n    \"\"\"Create a test logger with a handler that captures log records.\"\"\"\n    test_logger = logging.getLogger(\"test_logger\")\n    test_logger.setLevel(logging.DEBUG)\n    test_logger.handlers = []  # Clear any existing handlers\n\n    # Create a handler that stores log records\n    class ListHandler(logging.Handler):\n        def __init__(self):\n            super().__init__()\n            self.records = []\n\n        def emit(self, record):\n            self.records.append(record)\n\n    handler = ListHandler()\n    test_logger.addHandler(handler)\n\n    yield test_logger, handler\n\n    # Cleanup\n    test_logger.handlers = []\n    test_logger.filters = []\n\n\nclass Test_MsgIncludesStringFilter:\n    \"\"\"Tests for _MsgIncludesStringFilter.\"\"\"\n\n    def test_single_string_blocks_matching_message(self):\n        \"\"\"Test that a single string blocks messages containing it.\"\"\"\n        filter_obj = _MsgIncludesStringFilter(\"block this\")\n        record = logging.LogRecord(\n            name=\"test\",\n            level=logging.INFO,\n            pathname=\"\",\n            lineno=0,\n            msg=\"Please block this message\",\n            args=(),\n            exc_info=None,\n        )\n        assert filter_obj.filter(record) is False\n\n    def test_single_string_allows_non_matching_message(self):\n        \"\"\"Test that messages not containing the string are allowed.\"\"\"\n        filter_obj = _MsgIncludesStringFilter(\"block this\")\n        record = logging.LogRecord(\n            name=\"test\",\n            level=logging.INFO,\n            pathname=\"\",\n            lineno=0,\n            msg=\"This is fine\",\n            args=(),\n            exc_info=None,\n        )\n        assert filter_obj.filter(record) is True\n\n    def test_list_of_strings_blocks_any_match(self):\n        \"\"\"Test that any string in the list blocks the message.\"\"\"\n        filter_obj = _MsgIncludesStringFilter([\"warning1\", \"warning2\", \"warning3\"])\n\n        record1 = logging.LogRecord(\n            name=\"test\",\n            level=logging.INFO,\n            pathname=\"\",\n            lineno=0,\n            msg=\"This has warning1 in it\",\n            args=(),\n            exc_info=None,\n        )\n        assert filter_obj.filter(record1) is False\n\n        record2 = logging.LogRecord(\n            name=\"test\",\n            level=logging.INFO,\n            pathname=\"\",\n            lineno=0,\n            msg=\"This has warning3 in it\",\n            args=(),\n            exc_info=None,\n        )\n        assert filter_obj.filter(record2) is False\n\n    def test_list_allows_non_matching_messages(self):\n        \"\"\"Test that messages not matching any string are allowed.\"\"\"\n        filter_obj = _MsgIncludesStringFilter([\"warning1\", \"warning2\"])\n        record = logging.LogRecord(\n            name=\"test\",\n            level=logging.INFO,\n            pathname=\"\",\n            lineno=0,\n            msg=\"This is completely different\",\n            args=(),\n            exc_info=None,\n        )\n        assert filter_obj.filter(record) is True\n\n    def test_substring_matching(self):\n        \"\"\"Test that substring matching works correctly.\"\"\"\n        filter_obj = _MsgIncludesStringFilter(\"JAX\")\n        record = logging.LogRecord(\n            name=\"test\",\n            level=logging.INFO,\n            pathname=\"\",\n            lineno=0,\n            msg=\"****** PyMBAR will use 64-bit JAX! *******\",\n            args=(),\n            exc_info=None,\n        )\n        assert filter_obj.filter(record) is False\n\n    def test_case_sensitive_matching(self):\n        \"\"\"Test that matching is case-sensitive.\"\"\"\n        filter_obj = _MsgIncludesStringFilter(\"Error\")\n\n        record1 = logging.LogRecord(\n            name=\"test\",\n            level=logging.INFO,\n            pathname=\"\",\n            lineno=0,\n            msg=\"This has Error in it\",\n            args=(),\n            exc_info=None,\n        )\n        assert filter_obj.filter(record1) is False\n\n        record2 = logging.LogRecord(\n            name=\"test\",\n            level=logging.INFO,\n            pathname=\"\",\n            lineno=0,\n            msg=\"This has error in it\",\n            args=(),\n            exc_info=None,\n        )\n        assert filter_obj.filter(record2) is True\n\n\nclass Test_AppendMsgFilter:\n    \"\"\"Tests for _AppendMsgFilter.\"\"\"\n\n    def test_single_suffix_appends(self):\n        \"\"\"Test that a single suffix is appended to the message.\"\"\"\n        filter_obj = _AppendMsgFilter(\" [DEPRECATED]\")\n        record = logging.LogRecord(\n            name=\"test\",\n            level=logging.INFO,\n            pathname=\"\",\n            lineno=0,\n            msg=\"Original message\",\n            args=(),\n            exc_info=None,\n        )\n        result = filter_obj.filter(record)\n        assert result is True\n        assert record.msg == \"Original message [DEPRECATED]\"\n\n    def test_multiple_suffixes_append_in_order(self):\n        \"\"\"Test that multiple suffixes are appended in order.\"\"\"\n        filter_obj = _AppendMsgFilter([\" [DEPRECATED]\", \" - see docs\"])\n        record = logging.LogRecord(\n            name=\"test\",\n            level=logging.INFO,\n            pathname=\"\",\n            lineno=0,\n            msg=\"Original message\",\n            args=(),\n            exc_info=None,\n        )\n        filter_obj.filter(record)\n        assert record.msg == \"Original message [DEPRECATED] - see docs\"\n\n    def test_idempotent_single_suffix(self):\n        \"\"\"Test that applying the same suffix twice is idempotent.\"\"\"\n        filter_obj = _AppendMsgFilter(\" [DEPRECATED]\")\n        record = logging.LogRecord(\n            name=\"test\",\n            level=logging.INFO,\n            pathname=\"\",\n            lineno=0,\n            msg=\"Original message [DEPRECATED]\",\n            args=(),\n            exc_info=None,\n        )\n        filter_obj.filter(record)\n        assert record.msg == \"Original message [DEPRECATED]\"\n\n    def test_idempotent_multiple_suffixes(self):\n        \"\"\"Test idempotency with multiple suffixes.\"\"\"\n        filter_obj = _AppendMsgFilter([\" [DEPRECATED] - see docs\", \" [DEPRECATED] - see docs\"])\n        record = logging.LogRecord(\n            name=\"test\",\n            level=logging.INFO,\n            pathname=\"\",\n            lineno=0,\n            msg=\"Original message [DEPRECATED] - see docs\",\n            args=(),\n            exc_info=None,\n        )\n        filter_obj.filter(record)\n        assert record.msg == \"Original message [DEPRECATED] - see docs\"\n\n    def test_always_returns_true(self):\n        \"\"\"Test that the filter always returns True to allow logging.\"\"\"\n        filter_obj = _AppendMsgFilter(\" [INFO]\")\n        record = logging.LogRecord(\n            name=\"test\",\n            level=logging.INFO,\n            pathname=\"\",\n            lineno=0,\n            msg=\"Message\",\n            args=(),\n            exc_info=None,\n        )\n        assert filter_obj.filter(record) is True\n\n\nclass Testlogging_control:\n    \"\"\"Tests for logging_control module.\"\"\"\n\n    def test__silence_message_single_string_single_logger(self, logger):\n        \"\"\"Test silencing a single message from a single logger.\"\"\"\n        test_logger, handler = logger\n\n        logging_control._silence_message(msg=\"block this\", logger_names=\"test_logger\")\n\n        test_logger.info(\"block this message\")\n        test_logger.info(\"allow this message\")\n\n        assert len(handler.records) == 1\n        assert handler.records[0].msg == \"allow this message\"\n\n    def test__silence_message_multiple_strings_single_logger(self, logger):\n        \"\"\"Test silencing multiple messages from a single logger.\"\"\"\n        test_logger, handler = logger\n\n        logging_control._silence_message(msg=[\"warning1\", \"warning2\"], logger_names=\"test_logger\")\n\n        test_logger.info(\"This has warning1\")\n        test_logger.info(\"This has warning2\")\n        test_logger.info(\"This is fine\")\n\n        assert len(handler.records) == 1\n        assert handler.records[0].msg == \"This is fine\"\n\n    def test__silence_message_single_string_multiple_loggers(self):\n        \"\"\"Test silencing a message from multiple loggers.\"\"\"\n        logger1 = logging.getLogger(\"test_logger1\")\n        logger2 = logging.getLogger(\"test_logger2\")\n\n        # Clear any existing filters\n        logger1.filters = []\n        logger2.filters = []\n\n        logging_control._silence_message(\n            msg=\"block this\", logger_names=[\"test_logger1\", \"test_logger2\"]\n        )\n\n        assert len(logger1.filters) == 1\n        assert len(logger2.filters) == 1\n\n        # Cleanup\n        logger1.filters = []\n        logger2.filters = []\n\n    def test__silence_message_multiple_strings_multiple_loggers(self):\n        \"\"\"Test silencing multiple messages from multiple loggers.\"\"\"\n        logger1 = logging.getLogger(\"test_logger1\")\n        logger2 = logging.getLogger(\"test_logger2\")\n\n        logger1.filters = []\n        logger2.filters = []\n\n        logging_control._silence_message(\n            msg=[\"warning1\", \"warning2\"], logger_names=[\"test_logger1\", \"test_logger2\"]\n        )\n\n        # Should have one filter per logger (not one per message)\n        assert len(logger1.filters) == 1\n        assert len(logger2.filters) == 1\n\n        # Cleanup\n        logger1.filters = []\n        logger2.filters = []\n\n    def test__silence_logger_single(self, logger):\n        \"\"\"Test completely silencing a single logger.\"\"\"\n        test_logger, handler = logger\n\n        logging_control._silence_logger(logger_names=\"test_logger\")\n\n        test_logger.debug(\"debug message\")\n        test_logger.info(\"info message\")\n        test_logger.warning(\"warning message\")\n        test_logger.error(\"error message\")\n\n        # All messages should be blocked\n        assert len(handler.records) == 0\n\n    def test__silence_logger_multiple(self):\n        \"\"\"Test silencing multiple loggers.\"\"\"\n        logger1 = logging.getLogger(\"test_logger1\")\n        logger2 = logging.getLogger(\"test_logger2\")\n\n        original_level1 = logger1.level\n        original_level2 = logger2.level\n\n        logging_control._silence_logger(logger_names=[\"test_logger1\", \"test_logger2\"])\n\n        assert logger1.level == logging.CRITICAL\n        assert logger2.level == logging.CRITICAL\n\n        # Cleanup\n        logger1.setLevel(original_level1)\n        logger2.setLevel(original_level2)\n\n    def test__silence_logger_custom_level(self, logger):\n        \"\"\"Test silencing logger with custom level.\"\"\"\n        test_logger, handler = logger\n\n        logging_control._silence_logger(logger_names=\"test_logger\", level=logging.ERROR)\n\n        test_logger.debug(\"debug message\")\n        test_logger.info(\"info message\")\n        test_logger.warning(\"warning message\")\n        test_logger.error(\"error message\")\n\n        # Only error and above should pass through\n        assert len(handler.records) == 1\n        assert handler.records[0].msg == \"error message\"\n\n    def test__append_logger_single_suffix_single_logger(self, logger):\n        \"\"\"Test appending a single suffix to a single logger.\"\"\"\n        test_logger, handler = logger\n\n        logging_control._append_logger(suffix=\" [DEPRECATED]\", logger_names=\"test_logger\")\n\n        test_logger.info(\"Original message\")\n\n        assert len(handler.records) == 1\n        assert handler.records[0].msg == \"Original message [DEPRECATED]\"\n\n    def test__append_logger_multiple_suffixes(self, logger):\n        \"\"\"Test appending multiple suffixes.\"\"\"\n        test_logger, handler = logger\n\n        logging_control._append_logger(\n            suffix=[\" [DEPRECATED]\", \" - see docs\"], logger_names=\"test_logger\"\n        )\n\n        test_logger.info(\"Original message\")\n\n        assert len(handler.records) == 1\n        assert handler.records[0].msg == \"Original message [DEPRECATED] - see docs\"\n\n    def test__append_logger_multiple_loggers(self):\n        \"\"\"Test appending to multiple loggers.\"\"\"\n        logger1 = logging.getLogger(\"test_logger1\")\n        logger2 = logging.getLogger(\"test_logger2\")\n\n        logger1.filters = []\n        logger2.filters = []\n\n        logging_control._append_logger(\n            suffix=\" [INFO]\", logger_names=[\"test_logger1\", \"test_logger2\"]\n        )\n\n        assert len(logger1.filters) == 1\n        assert len(logger2.filters) == 1\n\n        # Cleanup\n        logger1.filters = []\n        logger2.filters = []\n\n    def test_pymbar_example(self, logger):\n        \"\"\"Test the PyMBAR use case.\"\"\"\n        test_logger, handler = logger\n\n        logging_control._silence_message(\n            msg=\"****** PyMBAR will use 64-bit JAX! *******\", logger_names=\"test_logger\"\n        )\n\n        test_logger.info(\"****** PyMBAR will use 64-bit JAX! *******\")\n        test_logger.info(\"Other message\")\n\n        assert len(handler.records) == 1\n        assert handler.records[0].msg == \"Other message\"\n\n    def test_combining_multiple_controls(self, logger):\n        \"\"\"Test combining silence and append on the same logger.\"\"\"\n        test_logger, handler = logger\n\n        logging_control._silence_message(msg=\"block\", logger_names=\"test_logger\")\n        logging_control._append_logger(suffix=\" [INFO]\", logger_names=\"test_logger\")\n\n        test_logger.info(\"block this\")\n        test_logger.info(\"allow this\")\n\n        assert len(handler.records) == 1\n        assert handler.records[0].msg == \"allow this [INFO]\"\n\n\nclass TestBaseLogFilter:\n    \"\"\"Tests for _BaseLogFilter base class.\"\"\"\n\n    def test_cannot_instantiate_abstract_class(self):\n        \"\"\"Test that _BaseLogFilter cannot be instantiated directly.\"\"\"\n        with pytest.raises(TypeError):\n            _BaseLogFilter(\"test\")\n\n    def test_subclass_must_implement_filter(self):\n        \"\"\"Test that subclasses must implement the filter method.\"\"\"\n\n        class IncompleteFilter(_BaseLogFilter):\n            pass\n\n        with pytest.raises(TypeError):\n            IncompleteFilter(\"test\")\n\n    def test_subclass_with_filter_works(self):\n        \"\"\"Test that a proper subclass can be instantiated.\"\"\"\n\n        class CompleteFilter(_BaseLogFilter):\n            def filter(self, record):\n                return True\n\n        filter_obj = CompleteFilter(\"test\")\n        assert filter_obj.strings == [\"test\"]\n\n    def test_string_conversion_to_list(self):\n        \"\"\"Test that single strings are converted to lists.\"\"\"\n        filter_obj = _MsgIncludesStringFilter(\"single\")\n        assert isinstance(filter_obj.strings, list)\n        assert filter_obj.strings == [\"single\"]\n\n    def test_list_stays_as_list(self):\n        \"\"\"Test that lists remain as lists.\"\"\"\n        filter_obj = _MsgIncludesStringFilter([\"one\", \"two\", \"three\"])\n        assert isinstance(filter_obj.strings, list)\n        assert filter_obj.strings == [\"one\", \"two\", \"three\"]\n\n\nclass TestEdgeCases:\n    \"\"\"Tests for edge cases and error conditions.\"\"\"\n\n    def test_empty_string(self, logger):\n        \"\"\"Test behavior with empty string.\"\"\"\n        test_logger, handler = logger\n\n        logging_control._silence_message(msg=\"\", logger_names=\"test_logger\")\n\n        test_logger.info(\"message\")\n\n        # Empty string matches everything as substring\n        assert len(handler.records) == 0\n\n    def test_empty_list(self, logger):\n        \"\"\"Test behavior with empty list.\"\"\"\n        test_logger, handler = logger\n\n        logging_control._silence_message(msg=[], logger_names=\"test_logger\")\n\n        test_logger.info(\"message\")\n\n        # Empty list should not block anything\n        assert len(handler.records) == 1\n\n    def test_special_characters_in_message(self, logger):\n        \"\"\"Test that special characters are handled correctly.\"\"\"\n        test_logger, handler = logger\n\n        logging_control._silence_message(\n            msg=\"[WARNING] *special* $chars$\", logger_names=\"test_logger\"\n        )\n\n        test_logger.info(\"[WARNING] *special* $chars$ in message\")\n        test_logger.info(\"normal message\")\n\n        assert len(handler.records) == 1\n        assert handler.records[0].msg == \"normal message\"\n\n    def test_unicode_characters(self, logger):\n        \"\"\"Test that unicode characters work correctly.\"\"\"\n        test_logger, handler = logger\n\n        logging_control._silence_message(msg=\"🚫 blocked\", logger_names=\"test_logger\")\n        logging_control._append_logger(suffix=\" ✅\", logger_names=\"test_logger\")\n\n        test_logger.info(\"🚫 blocked message\")\n        test_logger.info(\"allowed message\")\n\n        assert len(handler.records) == 1\n        assert handler.records[0].msg == \"allowed message ✅\"\n\n    def test_very_long_message(self, logger):\n        \"\"\"Test handling of very long messages.\"\"\"\n        test_logger, handler = logger\n\n        long_msg = \"x\" * 10000\n        logging_control._silence_message(msg=\"needle\", logger_names=\"test_logger\")\n\n        test_logger.info(long_msg + \"needle\" + long_msg)\n        test_logger.info(\"short message\")\n\n        assert len(handler.records) == 1\n        assert handler.records[0].msg == \"short message\"\n"
  },
  {
    "path": "src/openfe/tests/utils/test_network_plotting.py",
    "content": "from unittest import mock\n\nimport networkx as nx\nimport pytest\nfrom matplotlib import pyplot as plt\nfrom matplotlib.backend_bases import MouseButton, MouseEvent\nfrom numpy import testing as npt\n\nfrom openfe.utils.network_plotting import Edge, EventHandler, GraphDrawing, Node\n\n\ndef _get_fig_ax(fig):\n    if fig is None:\n        fig, _ = plt.subplots()\n\n    if len(fig.axes) != 1:  # -no-cov-\n        raise RuntimeError(\n            \"Error in test setup: figure must have exactly one Axes object associated\"\n        )\n\n    return fig, fig.axes[0]\n\n\ndef mock_event(event_name, xdata, ydata, fig=None):\n    fig, ax = _get_fig_ax(fig)\n    name = {\n        \"mousedown\": \"button_press_event\",\n        \"mouseup\": \"button_release_event\",\n        \"drag\": \"motion_notify_event\",\n    }[event_name]\n\n    matplotlib_buttons = {\n        \"mousedown\": MouseButton.LEFT,\n        \"mouseup\": MouseButton.LEFT,\n        \"drag\": MouseButton.LEFT,\n    }\n    button = matplotlib_buttons.get(event_name, None)\n    x, y = ax.transData.transform((xdata, ydata))\n    return MouseEvent(name, fig.canvas, x, y, button)\n\n\ndef make_mock_graph(fig=None):\n    fig, ax = _get_fig_ax(fig)\n\n    def make_mock_node(node, x, y):\n        return mock.Mock(node=node, x=x, y=y)\n\n    def make_mock_edge(node1, node2, data):\n        return mock.Mock(node_artists=[node1, node2], data=data)\n\n    node_A = make_mock_node(\"A\", 0.0, 0.0)\n    node_B = make_mock_node(\"B\", 0.5, 0.0)\n    node_C = make_mock_node(\"C\", 0.5, 0.5)\n    node_D = make_mock_node(\"D\", 0.0, 0.5)\n    edge_AB = make_mock_edge(node_A, node_B, {\"data\": \"AB\"})\n    edge_BC = make_mock_edge(node_B, node_C, {\"data\": \"BC\"})\n    edge_BD = make_mock_edge(node_B, node_D, {\"data\": \"BD\"})\n\n    mock_graph = mock.Mock(\n        nodes={node.node: node for node in [node_A, node_B, node_C, node_D]},\n        edges={tuple(edge.node_artists): edge for edge in [edge_AB, edge_BC, edge_BD]},\n    )\n    return mock_graph\n\n\nclass TestNode:\n    def setup_method(self):\n        self.node = Node(\"B\", 0.5, 0.0)\n        self.fig, self.ax = plt.subplots()\n        self.node.register_artist(self.ax)\n\n    def teardown_method(self):\n        plt.close(self.fig)\n\n    def test_register_artist(self):\n        node = Node(\"B\", 0.6, 0.0)\n        fig, ax = plt.subplots()\n        assert len(ax.patches) == 0\n        node.register_artist(ax)\n        assert len(ax.patches) == 1\n        assert node.artist == ax.patches[0]\n        plt.close(fig)\n\n    def test_extent(self):\n        assert self.node.extent == (0.5, 0.6, 0.0, 0.1)\n\n    def test_xy(self):\n        assert self.node.xy == (0.5, 0.0)\n\n    def test_unselect(self):\n        # initially blue; turn it red; unselect should switch it back\n        assert self.node.artist.get_facecolor() == (0.0, 0.0, 1.0, 1.0)\n        self.node.artist.set(color=\"red\")\n        assert self.node.artist.get_facecolor() != (0.0, 0.0, 1.0, 1.0)\n        self.node.unselect()\n        assert self.node.artist.get_facecolor() == (0.0, 0.0, 1.0, 1.0)\n\n    def test_edge_select(self):\n        # initially blue; edge_select should turn it red\n        assert self.node.artist.get_facecolor() == (0.0, 0.0, 1.0, 1.0)\n        edge = mock.Mock()  # unused in this method\n        self.node.edge_select(edge)\n        assert self.node.artist.get_facecolor() == (1.0, 0.0, 0.0, 1.0)\n\n    def test_update_location(self):\n        assert self.node.artist.xy == (0.5, 0.0)\n        self.node.update_location(0.7, 0.5)\n        assert self.node.artist.xy == (0.7, 0.5)\n        assert self.node.xy == (0.7, 0.5)\n\n    @pytest.mark.parametrize(\n        \"point,expected\",\n        [\n            ((0.55, 0.05), True),\n            ((0.5, 0.5), False),\n            ((-10, -10), False),\n        ],\n    )\n    def test_contains(self, point, expected):\n        event = mock_event(\"drag\", *point, fig=self.fig)\n        assert self.node.contains(event) == expected\n\n    def test_on_mousedown_in_rect(self):\n        event = mock_event(\"mousedown\", 0.55, 0.05, self.fig)\n        drawing_graph = make_mock_graph(self.fig)\n        assert Node.lock is None\n        assert self.node.press is None\n\n        self.node.on_mousedown(event, drawing_graph)\n        assert Node.lock == self.node\n        assert self.node.press is not None\n        Node.lock = None\n\n    def test_on_mousedown_in_axes(self):\n        event = mock_event(\"mousedown\", 0.25, 0.25, self.fig)\n        drawing_graph = make_mock_graph(self.fig)\n\n        assert Node.lock is None\n        assert self.node.press is None\n        self.node.on_mousedown(event, drawing_graph)\n        assert Node.lock is None\n        assert self.node.press is None\n\n    def test_on_mousedown_out_axes(self):\n        node = Node(\"B\", 0.5, 0.6)\n        event = mock_event(\"mousedown\", 0.55, 0.05, self.fig)\n        drawing_graph = make_mock_graph(self.fig)\n\n        fig2, ax2 = plt.subplots()\n        node.register_artist(ax2)\n\n        assert Node.lock is None\n        assert node.press is None\n        node.on_mousedown(event, drawing_graph)\n        assert Node.lock is None\n        assert node.press is None\n        plt.close(fig2)\n\n    def test_on_drag(self):\n        event = mock_event(\"drag\", 0.7, 0.7, self.fig)\n        # this test some integration, so we need more than a mock\n        drawing_graph = GraphDrawing(\n            nx.MultiDiGraph(([(\"A\", \"B\"), (\"B\", \"C\"), (\"B\", \"D\")])),\n            positions={\n                \"A\": (0.0, 0.0), \"B\": (0.5, 0.0),\n                \"C\": (0.5, 0.5), \"D\": (0.0, 0.5)\n            }\n        )  # fmt: skip\n        # set up things that should happen on mousedown\n        Node.lock = self.node\n        self.node.press = (0.5, 0.0), (0.55, 0.05)\n\n        self.node.on_drag(event, drawing_graph)\n\n        npt.assert_allclose(self.node.xy, (0.65, 0.65))\n\n        # undo the lock; normally handled by mouseup\n        Node.lock = None\n\n    def test_on_drag_do_nothing(self):\n        event = mock_event(\"drag\", 0.7, 0.7, self.fig)\n        drawing_graph = make_mock_graph(self.fig)\n\n        # don't set lock -- early exit\n        original = self.node.xy\n        self.node.on_drag(event, drawing_graph)\n        assert self.node.xy == original\n\n    def test_on_drag_no_mousedown(self):\n        event = mock_event(\"drag\", 0.7, 0.7, self.fig)\n        drawing_graph = make_mock_graph(self.fig)\n        Node.lock = self.node\n\n        with pytest.raises(RuntimeError, match=\"drag until mouse down\"):\n            self.node.on_drag(event, drawing_graph)\n\n        Node.lock = None\n\n    def test_on_mouseup(self):\n        event = mock_event(\"drag\", 0.7, 0.7, self.fig)\n        drawing_graph = make_mock_graph(self.fig)\n        Node.lock = self.node\n        self.node.press = (0.5, 0.0), (0.55, 0.05)\n\n        self.node.on_mouseup(event, drawing_graph)\n        assert Node.lock is None\n        assert self.node.press is None\n\n    def test_blitting(self):\n        pytest.skip(\"Blitting hasn't been implemented yet\")\n\n\nclass TestEdge:\n    def setup_method(self):\n        self.nodes = [Node(\"A\", 0.0, 0.0), Node(\"B\", 0.5, 0.0)]\n        self.data = {\"data\": \"values\"}\n        self.edge = Edge(*self.nodes, self.data)\n        self.fig, self.ax = plt.subplots()\n        self.ax.set_xlim(-1, 1)\n        self.ax.set_ylim(-1, 1)\n        self.edge.register_artist(self.ax)\n\n    def teardown_method(self):\n        plt.close(self.fig)\n\n    def test_register_artist(self):\n        fig, ax = plt.subplots()\n        edge = Edge(*self.nodes, self.data)\n        assert len(ax.get_lines()) == 0\n        edge.register_artist(ax)\n        assert len(ax.get_lines()) == 1\n        assert ax.get_lines()[0] == edge.artist\n        plt.close(fig)\n\n    @pytest.mark.parametrize(\n        \"point,expected\",\n        [\n            ((0.25, 0.05), True),\n            ((0.6, 0.1), False),\n        ],\n    )\n    def test_contains(self, point, expected):\n        event = mock_event(\"drag\", *point, fig=self.fig)\n        assert self.edge.contains(event) == expected\n\n    def test_edge_xs_ys(self):\n        npt.assert_allclose(self.edge._edge_xs_ys(*self.nodes), ((0.05, 0.55), (0.05, 0.05)))\n\n    def _get_colors(self):\n        colors = {node: node.artist.get_facecolor() for node in self.nodes}\n        colors[self.edge] = self.edge.artist.get_color()\n        return colors\n\n    def test_unselect(self):\n        original = self._get_colors()\n\n        for node in self.nodes:\n            node.artist.set(color=\"red\")\n\n        self.edge.artist.set(color=\"red\")\n\n        # ensure that we have changed from the original values\n        changed = self._get_colors()\n        for key in original:\n            assert changed[key] != original[key]\n\n        self.edge.unselect()\n        after = self._get_colors()\n        assert after == original\n\n    def test_select(self):\n        event = mock_event(\"mouseup\", 0.25, 0.05, self.fig)\n        drawing_graph = make_mock_graph(self.fig)\n        original = self._get_colors()\n        self.edge.select(event, drawing_graph)\n        changed = self._get_colors()\n\n        for key in self.nodes:\n            assert changed[key] != original[key]\n            assert changed[key] == (1.0, 0.0, 0.0, 1.0)  # red\n\n        assert changed[self.edge] == \"red\"  # mpl doesn't convert to RGBA?!\n        # it might be better in the future to pass that through some MPL\n        # func that converts color string to RGBA; the fact that MPL keeps\n        # color name in line2d seems like an implementation detail\n\n    def test_update_locations(self):\n        for node in self.nodes:\n            x, y = node.xy\n            node.update_location(x + 0.2, y + 0.2)\n\n        self.edge.update_locations()\n        npt.assert_allclose(self.edge.artist.get_xdata(), [0.25, 0.75])\n        npt.assert_allclose(self.edge.artist.get_ydata(), [0.25, 0.25])\n\n\nclass TestEventHandler:\n    def setup_method(self):\n        self.fig, self.ax = plt.subplots()\n        self.event_handler = EventHandler(graph=make_mock_graph(self.fig))\n        graph = self.event_handler.graph\n        node = graph.nodes[\"C\"]\n        edge = graph.edges[graph.nodes[\"B\"], graph.nodes[\"C\"]]\n        self.setup_contains = {\n            \"node\": (node, [node]),\n            \"edge\": (edge, [edge]),\n            \"node+edge\": (node, [node, edge]),\n            \"miss\": (None, []),\n        }\n\n    def teardown_method(self):\n        plt.close(self.fig)\n\n    def _mock_for_connections(self):\n        self.event_handler.on_mousedown = mock.Mock()\n        self.event_handler.on_mouseup = mock.Mock()\n        self.event_handler.on_drag = mock.Mock()\n\n    @pytest.mark.parametrize(\"event_type\", [\"mousedown\", \"mouseup\", \"drag\"])\n    def test_connect(self, event_type):\n        self._mock_for_connections()\n        event = mock_event(event_type, 0.2, 0.2, self.fig)\n\n        methods = {\n            \"mousedown\": self.event_handler.on_mousedown,\n            \"mouseup\": self.event_handler.on_mouseup,\n            \"drag\": self.event_handler.on_drag,\n        }\n        should_call = methods[event_type]\n        should_not_call = set(methods.values()) - {should_call}\n        assert len(self.event_handler.connections) == 0\n\n        self.event_handler.connect(self.fig.canvas)\n        assert len(self.event_handler.connections) == 3\n\n        # check that the event is processed\n        self.fig.canvas.callbacks.process(event.name, event)\n        should_call.assert_called_once()\n        for method in should_not_call:\n            assert not method.called\n\n    @pytest.mark.parametrize(\"event_type\", [\"mousedown\", \"mouseup\", \"drag\"])\n    def test_disconnect(self, event_type):\n        self._mock_for_connections()\n        fig, _ = plt.subplots()\n        event = mock_event(event_type, 0.2, 0.2, fig)\n\n        self.event_handler.connect(fig.canvas)  # not quite full isolation\n        assert len(self.event_handler.connections) == 3\n\n        self.event_handler.disconnect(fig.canvas)\n        assert len(self.event_handler.connections) == 0\n        methods = [\n            self.event_handler.on_mousedown,\n            self.event_handler.on_mousedown,\n            self.event_handler.on_drag,\n        ]\n\n        fig.canvas.callbacks.process(event.name, event)\n        for method in methods:\n            assert not method.called\n\n        plt.close(fig)\n\n    def _mock_contains(self, mock_objs):\n        graph = self.event_handler.graph\n        objs = list(graph.nodes.values()) + list(graph.edges.values())\n        for obj in objs:\n            if obj in mock_objs:\n                obj.contains = mock.Mock(return_value=True)\n            else:\n                obj.contains = mock.Mock(return_value=False)\n\n    @pytest.mark.parametrize(\"hit\", [\"node\", \"edge\", \"node+edge\", \"miss\"])\n    def test_get_event_container_select_node(self, hit):\n        expected, contains_event = self.setup_contains[hit]\n        expected_count = {\n            \"node\": 3,  # nodes A, B, C\n            \"edge\": 6,  # nodes A, B, C, D; edges AB, BC\n            \"node+edge\": 3,  # nodes A, B, C\n            \"miss\": 7,  # nodes A, B, C, D; edges AB BC, BD\n        }[hit]\n        self._mock_contains(contains_event)\n        event = mock.Mock()\n        found = self.event_handler._get_event_container(event)\n        assert found is expected\n        for container in contains_event:\n            if container is not expected:\n                assert not container.called\n\n        graph = self.event_handler.graph\n        all_objs = list(graph.nodes.values()) + list(graph.edges.values())\n        contains_count = sum(obj.contains.called for obj in all_objs)\n        assert contains_count == expected_count\n\n    @pytest.mark.parametrize(\"hit\", [\"node\", \"edge\", \"node+edge\", \"miss\"])\n    def test_on_mousedown(self, hit):\n        expected, contains_event = self.setup_contains[hit]\n        self._mock_contains(contains_event)\n        event = mock_event(\"mousedown\", 0.5, 0.5)\n\n        assert self.event_handler.click_location is None\n        assert self.event_handler.active is None\n        self.event_handler.on_mousedown(event)\n        npt.assert_allclose(self.event_handler.click_location, (0.5, 0.5))\n        assert self.event_handler.active is expected\n        if expected is not None:\n            expected.on_mousedown.assert_called_once()\n\n        plt.close(event.canvas.figure)\n\n    @pytest.mark.parametrize(\"is_active\", [True, False])\n    def test_on_drag(self, is_active):\n        node = self.event_handler.graph.nodes[\"C\"]\n        node.artist.axes = self.ax\n        event = mock_event(\"drag\", 0.25, 0.25, self.fig)\n        if is_active:\n            self.event_handler.active = node\n\n        self.event_handler.on_drag(event)\n\n        if is_active:\n            node.on_drag.assert_called_once()\n        else:\n            assert not node.on_drag.called\n\n    @pytest.mark.parametrize(\"has_selected\", [True, False])\n    def test_on_mouseup_click_select(self, has_selected):\n        # start: mouse hasn't moved, and something is active\n        graph = self.event_handler.graph\n        edge = graph.edges[graph.nodes[\"B\"], graph.nodes[\"C\"]]\n        if has_selected:\n            old_selected = graph.edges[graph.nodes[\"A\"], graph.nodes[\"B\"]]\n            self.event_handler.selected = old_selected\n\n        self._mock_contains([edge])\n        event = mock_event(\"mouseup\", 0.25, 0.25)\n        self.event_handler.click_location = (event.xdata, event.ydata)\n        self.event_handler.active = edge\n\n        # this should select the active object\n        self.event_handler.on_mouseup(event)\n\n        if has_selected:\n            old_selected.unselect.assert_called_once()\n\n        edge.select.assert_called_once()\n        edge.on_mouseup.assert_called_once()\n        assert self.event_handler.selected is edge\n        assert self.event_handler.active is None\n        assert self.event_handler.click_location is None\n        graph.draw.assert_called_once()\n\n        plt.close(event.canvas.figure)\n\n    @pytest.mark.parametrize(\"has_selected\", [True, False])\n    def test_on_mouseup_click_not_select(self, has_selected):\n        # start: mouse hasn't moved, nothing is active\n        graph = self.event_handler.graph\n        if has_selected:\n            old_selected = graph.edges[graph.nodes[\"A\"], graph.nodes[\"B\"]]\n            self.event_handler.selected = old_selected\n\n        event = mock_event(\"mouseup\", 0.25, 0.25)\n        self.event_handler.click_location = (event.xdata, event.ydata)\n\n        self.event_handler.on_mouseup(event)\n\n        if has_selected:\n            old_selected.unselect.assert_called_once()\n\n        assert self.event_handler.selected is None\n        assert self.event_handler.active is None\n        assert self.event_handler.click_location is None\n        graph.draw.assert_called_once()\n        plt.close(event.canvas.figure)\n\n    @pytest.mark.parametrize(\"has_selected\", [True, False])\n    def test_on_mouseup_drag(self, has_selected):\n        # start: mouse has moved, something is active\n        graph = self.event_handler.graph\n        edge = graph.edges[graph.nodes[\"B\"], graph.nodes[\"C\"]]\n        if has_selected:\n            old_selected = graph.edges[graph.nodes[\"A\"], graph.nodes[\"B\"]]\n            self.event_handler.selected = old_selected\n\n        event = mock_event(\"mouseup\", 0.25, 0.25)\n        self.event_handler.click_location = (0.5, 0.5)\n        self.event_handler.active = edge\n\n        self.event_handler.on_mouseup(event)\n\n        if has_selected:\n            assert not old_selected.unselect.called\n\n        assert not edge.selected.called\n        edge.on_mouseup.assert_called_once()\n        assert self.event_handler.active is None\n        assert self.event_handler.click_location is None\n        graph.draw.assert_called_once()\n        plt.close(event.canvas.figure)\n\n\nclass TestGraphDrawing:\n    def setup_method(self):\n        self.nx_graph = nx.MultiDiGraph()\n        self.nx_graph.add_edges_from(\n            [\n                (\"A\", \"B\", {\"data\": \"AB\"}),\n                (\"B\", \"C\", {\"data\": \"BC\"}),\n                (\"B\", \"D\", {\"data\": \"BD\"}),\n            ]\n        )\n        self.positions = {\"A\": (0.0, 0.0), \"B\": (0.5, 0.0), \"C\": (0.5, 0.5), \"D\": (-0.1, 0.6)}\n        self.graph = GraphDrawing(self.nx_graph, positions=self.positions)\n\n    def test_init(self):\n        # this also tests _register_node, _register_edge\n        assert len(self.graph.nodes) == 4\n        assert len(self.graph.edges) == 3\n        assert len(self.graph.fig.axes) == 1\n        assert self.graph.fig.axes[0] is self.graph.ax\n        assert len(self.graph.ax.patches) == 4\n        assert len(self.graph.ax.lines) == 3\n\n    def test_init_custom_ax(self):\n        fig, ax = plt.subplots()\n        graph = GraphDrawing(self.nx_graph, positions=self.positions, ax=ax)\n        assert graph.fig is fig\n        assert graph.ax is ax\n        plt.close(fig)\n\n    def test_register_node_error(self):\n        with pytest.raises(RuntimeError, match=\"multiple times\"):\n            self.graph._register_node(\n                node=list(self.nx_graph.nodes)[0],\n                position=(0, 0),\n            )\n\n    @pytest.mark.parametrize(\n        \"node,edges\",\n        [\n            (\"A\", [(\"A\", \"B\")]),\n            (\"B\", [(\"A\", \"B\"), (\"B\", \"C\"), (\"B\", \"D\")]),\n            (\"C\", [(\"B\", \"C\")]),\n        ],\n    )\n    def test_edges_for_node(self, node, edges):\n        expected_edges = {self.graph.edges[n1, n2] for n1, n2 in edges}\n        assert set(self.graph.edges_for_node(node)) == expected_edges\n\n    def test_get_nodes_extent(self):\n        assert self.graph._get_nodes_extent() == (-0.1, 0.6, 0.0, 0.7)\n\n    def test_reset_bounds(self):\n        old_xlim = self.graph.ax.get_xlim()\n        old_ylim = self.graph.ax.get_ylim()\n        self.graph.ax.set_xlim(old_xlim[0] * 2, old_xlim[1] * 2)\n        self.graph.ax.set_ylim(old_ylim[0] * 2, old_ylim[1] * 2)\n        self.graph.reset_bounds()\n        assert self.graph.ax.get_xlim() == old_xlim\n        assert self.graph.ax.get_ylim() == old_ylim\n\n    def test_draw(self):\n        # just a smoke test; there's really nothing that we can test here\n        # other that integration\n        self.graph.draw()\n"
  },
  {
    "path": "src/openfe/tests/utils/test_optional_imports.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\n\nimport pytest\n\nfrom openfe.utils import requires_package\n\n\n@requires_package(\"no_such_package_hopefully\")\ndef the_answer():\n    return 42\n\n\ndef test_requires_decorator():\n    with pytest.raises(ImportError):\n        the_answer()\n"
  },
  {
    "path": "src/openfe/tests/utils/test_remove_oechem.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\nfrom openff.toolkit import GLOBAL_TOOLKIT_REGISTRY, OpenEyeToolkitWrapper\n\nfrom openfe.utils import without_oechem_backend\n\n\ndef test_remove_oechem():\n    original_tks = GLOBAL_TOOLKIT_REGISTRY.registered_toolkits\n    original_n_tks = len(GLOBAL_TOOLKIT_REGISTRY.registered_toolkits)\n\n    with without_oechem_backend():\n        for tk in GLOBAL_TOOLKIT_REGISTRY.registered_toolkits:\n            assert not isinstance(tk, OpenEyeToolkitWrapper)\n    assert len(GLOBAL_TOOLKIT_REGISTRY.registered_toolkits) == original_n_tks\n    for ref_tk, tk in zip(original_tks, GLOBAL_TOOLKIT_REGISTRY.registered_toolkits):\n        assert isinstance(tk, type(ref_tk))\n"
  },
  {
    "path": "src/openfe/tests/utils/test_system_probe.py",
    "content": "import contextlib\nimport logging\nimport pathlib\nimport subprocess\nimport sys\nfrom collections import namedtuple\nfrom unittest.mock import Mock, patch\n\nimport pytest\n\ntry:\n    from psutil._ntuples import sdiskusage\nexcept ImportError:\n    from psutil._common import sdiskusage\n\n\nfrom openfe.utils.system_probe import (\n    _get_disk_usage,\n    _get_gpu_info,\n    _get_hostname,\n    _get_psutil_info,\n    _probe_system,\n    log_system_probe,\n)\n\n# Named tuples from https://github.com/giampaolo/psutil/blob/master/psutil/_pslinux.py\nsvmem = namedtuple(\n    \"svmem\",\n    [\n        \"total\",\n        \"available\",\n        \"percent\",\n        \"used\",\n        \"free\",\n        \"active\",\n        \"inactive\",\n        \"buffers\",\n        \"cached\",\n        \"shared\",\n        \"slab\",\n    ],\n)\npfullmem = namedtuple(\n    \"pfullmem\",\n    [\"rss\", \"vms\", \"shared\", \"text\", \"lib\", \"data\", \"dirty\", \"uss\", \"pss\", \"swap\"],\n)\n\n\nEXPECTED_SYSTEM_INFO = {\n    \"system information\": {\n        \"hostname\": \"mock-hostname\",\n        \"gpu information\": {\n            \"GPU-UUID-1\": {\n                \"name\": \"NVIDIA GeForce RTX 2060\",\n                \"compute_mode\": \"Default\",\n                \"pstate\": \"P8\",\n                \"temperature.gpu\": \"47\",\n                \"utilization.memory [%]\": \"6 %\",\n                \"memory.total [MiB]\": \"6144 MiB\",\n                \"driver_version\": \"525.116.04\",\n            },\n            \"GPU-UUID-2\": {\n                \"name\": \"NVIDIA GeForce RTX 2060\",\n                \"compute_mode\": \"Default\",\n                \"pstate\": \"P8\",\n                \"temperature.gpu\": \"47\",\n                \"utilization.memory [%]\": \"6 %\",\n                \"memory.total [MiB]\": \"6144 MiB\",\n                \"driver_version\": \"525.116.04\",\n            },\n        },\n        \"psutil information\": {\n            \"pid\": 1590579,\n            \"status\": \"running\",\n            \"exe\": \"/home/winry/micromamba/envs/openfe/bin/python3.10\",\n            \"cpu_percent\": 0.0,\n            \"num_fds\": 4,\n            \"create_time\": 1690999298.62,\n            \"memory_percent\": 0.02006491389254216,\n            \"memory_full_info\": {\n                \"rss\": 13500416,\n                \"vms\": 31858688,\n                \"shared\": 6946816,\n                \"text\": 2121728,\n                \"lib\": 0,\n                \"data\": 7852032,\n                \"dirty\": 0,\n                \"uss\": 10764288,\n                \"pss\": 10777600,\n                \"swap\": 0,\n            },\n            \"RLIMIT_AS\": (-1, -1),\n            \"virtual_memory\": {\n                \"total\": 67283697664,\n                \"available\": 31731806208,\n                \"percent\": 52.8,\n                \"used\": 29899350016,\n                \"free\": 3136847872,\n                \"active\": 25971789824,\n                \"inactive\": 34514595840,\n                \"buffers\": 136404992,\n                \"cached\": 34111094784,\n                \"shared\": 1021571072,\n                \"slab\": 1518297088,\n            },\n        },\n        \"disk usage information\": {\n            \"/dev/mapper/data-root\": {\n                \"size\": \"1.8T\",\n                \"used\": \"626G\",\n                \"available\": \"1.1T\",\n                \"percent_used\": \"37%\",\n                \"mount_point\": \"/\",\n            },\n            \"/dev/dm-3\": {\n                \"size\": \"3.7T\",\n                \"used\": \"1.6T\",\n                \"available\": \"2.2T\",\n                \"percent_used\": \"42%\",\n                \"mount_point\": \"/mnt/data\",\n            },\n        },\n    }\n}\n\n\ndef fake_disk_usage(path):\n    if str(path) == \"/foo\":\n        return sdiskusage(total=1958854045696, used=1232985415680, free=626288726016, percent=66.3)\n    if str(path) == \"/bar\":\n        return sdiskusage(total=4000770252800, used=1678226952192, free=2322615496704, percent=41.9)\n\n\n@contextlib.contextmanager\ndef patch_system():\n    # single patch to fully patch the system\n    patch_hostname = patch(\"socket.gethostname\", Mock(return_value=\"mock-hostname\"))\n\n    patch_psutil_Process_as_dict = patch(\n        \"psutil.Process.as_dict\",\n        Mock(\n            return_value={\n                \"pid\": 1590579,\n                \"status\": \"running\",\n                \"exe\": \"/home/winry/micromamba/envs/openfe/bin/python3.10\",\n                \"cpu_percent\": 0.0,\n                \"num_fds\": 4,\n                \"create_time\": 1690999298.62,\n                \"memory_percent\": 0.02006491389254216,\n                \"memory_full_info\": pfullmem(\n                    rss=13500416,\n                    vms=31858688,\n                    shared=6946816,\n                    text=2121728,\n                    lib=0,\n                    data=7852032,\n                    dirty=0,\n                    uss=10764288,\n                    pss=10777600,\n                    swap=0,\n                ),\n            }\n        ),\n    )\n    # Since this attribute doesn't exist on OSX, we have to create it\n    patch_psutil_Process_rlimit = patch(\"psutil.Process.rlimit\", Mock(return_value=(-1, -1)))\n    patch_psutil_virtual_memory = patch(\n        \"psutil.virtual_memory\",\n        Mock(\n            return_value=svmem(\n                total=67283697664,\n                available=31731806208,\n                percent=52.8,\n                used=29899350016,\n                free=3136847872,\n                active=25971789824,\n                inactive=34514595840,\n                buffers=136404992,\n                cached=34111094784,\n                shared=1021571072,\n                slab=1518297088,\n            )\n        ),\n    )\n    patch_psutil_disk_usage = patch(\"psutil.disk_usage\", Mock(side_effect=fake_disk_usage))\n\n    # assumes that each shell command is called in only one way\n    cmd_to_output = {\n        \"nvidia-smi\": (\n            b\"uuid, name, compute_mode, pstate, temperature.gpu, utilization.memory [%], memory.total [MiB], driver_version\\n\"\n            b\"GPU-UUID-1, NVIDIA GeForce RTX 2060, Default, P8, 47, 6 %, 6144 MiB, 525.116.04\\n\"\n            b\"GPU-UUID-2, NVIDIA GeForce RTX 2060, Default, P8, 47, 6 %, 6144 MiB, 525.116.04\\n\"\n        ),\n        \"df\": (\n            b\"Filesystem             Size  Used Avail Use% Mounted on\\n\"\n            b\"/dev/mapper/data-root  1.8T  626G  1.1T  37% /\\n\"\n            b\"/dev/dm-3              3.7T  1.6T  2.2T  42% /mnt/data\\n\"\n        ),\n    }\n    patch_check_output = patch(\n        \"subprocess.check_output\",\n        Mock(side_effect=lambda args, **kwargs: cmd_to_output[args[0]]),\n    )\n    with contextlib.ExitStack() as stack:\n        for ctx in [\n            patch_check_output,\n            patch_hostname,\n            patch_psutil_Process_as_dict,\n            patch_psutil_Process_rlimit,\n            patch_psutil_disk_usage,\n            patch_psutil_virtual_memory,\n        ]:\n            stack.enter_context(ctx)\n\n        yield stack\n\n\n@pytest.mark.skipif(sys.platform == \"darwin\", reason=\"test requires psutil.Process.rlimit\")\ndef test_get_hostname():\n    with patch_system():\n        hostname = _get_hostname()\n        assert hostname == \"mock-hostname\"\n\n\n@pytest.mark.skipif(sys.platform == \"darwin\", reason=\"test requires psutil.Process.rlimit\")\ndef test_get_gpu_info():\n    with patch_system():\n        gpu_info = _get_gpu_info()\n        expected_gpu_info = {\n            \"GPU-UUID-1\": {\n                \"name\": \"NVIDIA GeForce RTX 2060\",\n                \"compute_mode\": \"Default\",\n                \"pstate\": \"P8\",\n                \"temperature.gpu\": \"47\",\n                \"utilization.memory [%]\": \"6 %\",\n                \"memory.total [MiB]\": \"6144 MiB\",\n                \"driver_version\": \"525.116.04\",\n            },\n            \"GPU-UUID-2\": {\n                \"name\": \"NVIDIA GeForce RTX 2060\",\n                \"compute_mode\": \"Default\",\n                \"pstate\": \"P8\",\n                \"temperature.gpu\": \"47\",\n                \"utilization.memory [%]\": \"6 %\",\n                \"memory.total [MiB]\": \"6144 MiB\",\n                \"driver_version\": \"525.116.04\",\n            },\n        }\n        assert gpu_info == expected_gpu_info\n\n\n@pytest.mark.skipif(sys.platform == \"darwin\", reason=\"test requires psutil.Process.rlimit\")\ndef test_get_psutil_info():\n    with patch_system():\n        psutil_info = _get_psutil_info()\n        expected_psutil_info = {\n            \"pid\": 1590579,\n            \"status\": \"running\",\n            \"exe\": \"/home/winry/micromamba/envs/openfe/bin/python3.10\",\n            \"cpu_percent\": 0.0,\n            \"num_fds\": 4,\n            \"create_time\": 1690999298.62,\n            \"memory_percent\": 0.02006491389254216,\n            \"memory_full_info\": {\n                \"rss\": 13500416,\n                \"vms\": 31858688,\n                \"shared\": 6946816,\n                \"text\": 2121728,\n                \"lib\": 0,\n                \"data\": 7852032,\n                \"dirty\": 0,\n                \"uss\": 10764288,\n                \"pss\": 10777600,\n                \"swap\": 0,\n            },\n            \"RLIMIT_AS\": (-1, -1),\n            \"virtual_memory\": {\n                \"total\": 67283697664,\n                \"available\": 31731806208,\n                \"percent\": 52.8,\n                \"used\": 29899350016,\n                \"free\": 3136847872,\n                \"active\": 25971789824,\n                \"inactive\": 34514595840,\n                \"buffers\": 136404992,\n                \"cached\": 34111094784,\n                \"shared\": 1021571072,\n                \"slab\": 1518297088,\n            },\n        }\n        assert psutil_info == expected_psutil_info\n\n\n@pytest.mark.skipif(sys.platform == \"darwin\", reason=\"test requires psutil.Process.rlimit\")\ndef test_get_disk_usage():\n    with patch_system():\n        disk_info = _get_disk_usage()\n        expected_disk_info = {\n            \"/dev/mapper/data-root\": {\n                \"size\": \"1.8T\",\n                \"used\": \"626G\",\n                \"available\": \"1.1T\",\n                \"percent_used\": \"37%\",\n                \"mount_point\": \"/\",\n            },\n            \"/dev/dm-3\": {\n                \"size\": \"3.7T\",\n                \"used\": \"1.6T\",\n                \"available\": \"2.2T\",\n                \"percent_used\": \"42%\",\n                \"mount_point\": \"/mnt/data\",\n            },\n        }\n        assert disk_info == expected_disk_info\n\n\n@pytest.mark.skipif(sys.platform == \"darwin\", reason=\"test requires psutil.Process.rlimit\")\ndef test_get_disk_usage_with_path():\n    with patch_system():\n        disk_info = _get_disk_usage(paths=[pathlib.Path(\"/foo\"), pathlib.Path(\"/bar\")])\n        expected_disk_info = {\n            \"/bar\": {\n                \"available\": \"2.1T\",\n                \"percent_used\": \"42%\",\n                \"size\": \"3.6T\",\n                \"used\": \"1.5T\",\n            },\n            \"/foo\": {\n                \"available\": \"583.3G\",\n                \"percent_used\": \"66%\",\n                \"size\": \"1.8T\",\n                \"used\": \"1.1T\",\n            },\n        }\n\n        assert disk_info == expected_disk_info\n\n\n@pytest.mark.skipif(sys.platform == \"darwin\", reason=\"test requires psutil.Process.rlimit\")\ndef test_probe_system():\n    with patch_system():\n        system_info = _probe_system()\n        expected_system_info = {\n            \"system information\": {\n                \"hostname\": \"mock-hostname\",\n                \"gpu information\": {\n                    \"GPU-UUID-1\": {\n                        \"name\": \"NVIDIA GeForce RTX 2060\",\n                        \"compute_mode\": \"Default\",\n                        \"pstate\": \"P8\",\n                        \"temperature.gpu\": \"47\",\n                        \"utilization.memory [%]\": \"6 %\",\n                        \"memory.total [MiB]\": \"6144 MiB\",\n                        \"driver_version\": \"525.116.04\",\n                    },\n                    \"GPU-UUID-2\": {\n                        \"name\": \"NVIDIA GeForce RTX 2060\",\n                        \"compute_mode\": \"Default\",\n                        \"pstate\": \"P8\",\n                        \"temperature.gpu\": \"47\",\n                        \"utilization.memory [%]\": \"6 %\",\n                        \"memory.total [MiB]\": \"6144 MiB\",\n                        \"driver_version\": \"525.116.04\",\n                    },\n                },\n                \"psutil information\": {\n                    \"pid\": 1590579,\n                    \"status\": \"running\",\n                    \"exe\": \"/home/winry/micromamba/envs/openfe/bin/python3.10\",\n                    \"cpu_percent\": 0.0,\n                    \"num_fds\": 4,\n                    \"create_time\": 1690999298.62,\n                    \"memory_percent\": 0.02006491389254216,\n                    \"memory_full_info\": {\n                        \"rss\": 13500416,\n                        \"vms\": 31858688,\n                        \"shared\": 6946816,\n                        \"text\": 2121728,\n                        \"lib\": 0,\n                        \"data\": 7852032,\n                        \"dirty\": 0,\n                        \"uss\": 10764288,\n                        \"pss\": 10777600,\n                        \"swap\": 0,\n                    },\n                    \"RLIMIT_AS\": (-1, -1),\n                    \"virtual_memory\": {\n                        \"total\": 67283697664,\n                        \"available\": 31731806208,\n                        \"percent\": 52.8,\n                        \"used\": 29899350016,\n                        \"free\": 3136847872,\n                        \"active\": 25971789824,\n                        \"inactive\": 34514595840,\n                        \"buffers\": 136404992,\n                        \"cached\": 34111094784,\n                        \"shared\": 1021571072,\n                        \"slab\": 1518297088,\n                    },\n                },\n                \"disk usage information\": {\n                    \"/dev/mapper/data-root\": {\n                        \"size\": \"1.8T\",\n                        \"used\": \"626G\",\n                        \"available\": \"1.1T\",\n                        \"percent_used\": \"37%\",\n                        \"mount_point\": \"/\",\n                    },\n                    \"/dev/dm-3\": {\n                        \"size\": \"3.7T\",\n                        \"used\": \"1.6T\",\n                        \"available\": \"2.2T\",\n                        \"percent_used\": \"42%\",\n                        \"mount_point\": \"/mnt/data\",\n                    },\n                },\n            }\n        }\n\n        assert system_info == expected_system_info\n\n\ndef test_probe_system_smoke_test():\n    _probe_system()\n    _probe_system(paths=[pathlib.Path(\"/\")])\n\n\ndef test_log_system_probe_unconfigured():\n    # if probe loggers aren't configured to run, then we shouldn't even call\n    # _probe_system()\n    logger_names = [\n        \"openfe.utils.system_probe.log\",\n        \"openfe.utils.system_probe.log.gpu\",\n        \"openfe.utils.system_probe.log.hostname\",\n    ]\n    # check that initial conditions are as expected\n    for logger_name in logger_names:\n        logger = logging.getLogger(logger_name)\n        assert not logger.isEnabledFor(logging.DEBUG)\n\n    sysprobe_mock = Mock(return_value=EXPECTED_SYSTEM_INFO)\n    with patch(\"openfe.utils.system_probe._probe_system\", sysprobe_mock):\n        log_system_probe(logging.DEBUG)\n        assert sysprobe_mock.call_count == 0\n\n    # now check that it does get called if we use a level that will emit\n    # (this is effectively tests that the previous assert isn't a false\n    # positive)\n    with patch(\"openfe.utils.system_probe._probe_system\", sysprobe_mock):\n        log_system_probe(logging.WARNING)\n        assert sysprobe_mock.call_count == 1\n\n\ndef test_log_system_probe(caplog):\n    # this checks that the expected contents show up in log_system_probe\n    sysprobe_mock = Mock(return_value=EXPECTED_SYSTEM_INFO)\n    with patch(\"openfe.utils.system_probe._probe_system\", sysprobe_mock):\n        with caplog.at_level(logging.DEBUG):\n            log_system_probe()\n\n    expected = [\n        \"hostname: 'mock-hostname'\",\n        \"GPU: uuid='GPU-UUID-1' NVIDIA GeForce RTX 2060 mode=Default\",\n        \"GPU: uuid='GPU-UUID-2' NVIDIA GeForce RTX 2060 mode=Default\",\n        \"Memory used: 27.8G (52.8%)\",\n        \"/dev/mapper/data-root: 37% full (1.1T free)\",\n        \"/dev/dm-3: 42% full (2.2T free)\",\n    ]\n    for line in expected:\n        assert line in caplog.text\n\n\n@pytest.mark.parametrize(\n    \"error_type,expected\",\n    [\n        (FileNotFoundError, \"nvidia-smi command not found\"),\n        (subprocess.CalledProcessError(returncode=6, cmd=\"foo\"), \"no GPU available\"),\n        (\n            subprocess.CalledProcessError(returncode=9, cmd=\"foo\"),\n            \"can't communicate with NVIDIA driver\",\n        ),\n        (\n            subprocess.CalledProcessError(returncode=42, cmd=\"foo\"),\n            \"command foo returned error code 42\",\n        ),\n    ],\n)\ndef test_nvidia_smi_error(error_type, expected, caplog):\n    with caplog.at_level(logging.DEBUG):\n        with patch(\"subprocess.check_output\", side_effect=error_type):\n            assert _get_gpu_info() == {}\n            assert expected in caplog.text\n"
  },
  {
    "path": "src/openfe/tests/utils/test_visualization_3D.py",
    "content": "import pytest\nfrom openff.utilities.testing import skip_if_missing\n\nfrom openfe.setup import LigandAtomMapping\nfrom openfe.utils.visualization_3D import view_components_3d, view_mapping_3d\n\n\n@pytest.fixture(scope=\"module\")\ndef maps():\n    MAPS = {\n        \"phenol\": {0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, 10: 12, 11: 11},\n        \"anisole\": {0: 5, 1: 6, 2: 7, 3: 8, 4: 9, 5: 10, 6: 11, 7: 12, 8: 13, 9: 14, 10: 2, 11: 15},\n    }\n    return MAPS\n\n\n@pytest.fixture(scope=\"module\")\ndef benzene_phenol_mapping(benzene_transforms, maps):\n    mol1 = benzene_transforms[\"benzene\"]\n    mol2 = benzene_transforms[\"phenol\"]\n    mapping = maps[\"phenol\"]\n    return LigandAtomMapping(mol1, mol2, mapping)\n\n\n@skip_if_missing(\"py3Dmol\")\ndef test_visualize_component_coords_give_iterable(benzene_transforms):\n    \"\"\"\n    smoke test just checking if nothing goes horribly wrong\n    \"\"\"\n    components = [benzene_transforms[\"benzene\"], benzene_transforms[\"phenol\"]]\n    view_components_3d(components, style=\"stick\")\n\n\n@skip_if_missing(\"py3Dmol\")\ndef test_visualize_component_coords_give_iterable_shift(benzene_transforms):\n    \"\"\"\n    smoke test just checking if nothing goes horribly wrong\n    \"\"\"\n    components = [benzene_transforms[\"benzene\"], benzene_transforms[\"phenol\"]]\n    view_components_3d(components, shift=(1, 1, 1))\n\n\n@skip_if_missing(\"py3Dmol\")\ndef test_visualize_component_coords_reuse_view(benzene_transforms):\n    \"\"\"\n    smoke test just checking if nothing goes horribly wrong\n    \"\"\"\n    components = [benzene_transforms[\"benzene\"], benzene_transforms[\"phenol\"]]\n    view = view_components_3d(components, shift=(1, 1, 1))\n    view_components_3d(components, view=view)\n\n\n@skip_if_missing(\"py3Dmol\")\ndef test_visualize_3D_mapping(benzene_phenol_mapping):\n    \"\"\"\n    smoke test just checking if nothing goes horribly wrong\n    \"\"\"\n    with pytest.warns(DeprecationWarning, match=r\"LigandAtomMapping\"):\n        view_mapping_3d(mapping=benzene_phenol_mapping)\n"
  },
  {
    "path": "src/openfe/utils/__init__.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\n\nfrom . import (\n    custom_typing,\n    logging_control,\n)\nfrom .optional_imports import requires_package\nfrom .remove_oechem import without_oechem_backend\nfrom .system_probe import log_system_probe\n"
  },
  {
    "path": "src/openfe/utils/atommapping_network_plotting.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\nimport io\nfrom typing import Dict, Tuple\n\nimport matplotlib\nfrom gufe.visualization.mapping_visualization import (\n    draw_one_molecule_mapping,\n)\nfrom rdkit import Chem\n\nfrom openfe import LigandNetwork, SmallMoleculeComponent\nfrom openfe.utils.custom_typing import MPL_MouseEvent\nfrom openfe.utils.network_plotting import Edge, GraphDrawing, Node\n\n\nclass AtomMappingEdge(Edge):\n    \"\"\"Edge to draw AtomMapping from a LigandNetwork.\n\n    The ``select`` and ``unselect`` methods are implemented here to force\n    the mapped molecule to be drawn/disappear.\n\n    Parameters\n    ----------\n    node_artist1, node_artist2 : :class:`.Node`\n        GraphDrawing nodes for this edge\n    data : Dict\n        Data dictionary for this edge. Must have key ``object``, which maps\n        to an :class:`.AtomMapping`.\n    \"\"\"\n\n    def __init__(self, node_artist1: Node, node_artist2: Node, data: Dict):\n        super().__init__(node_artist1, node_artist2, data)\n        self.left_image = None\n        self.right_image = None\n\n    def _draw_mapped_molecule(\n        self,\n        extent: Tuple[float, float, float, float],\n        molA: SmallMoleculeComponent,\n        molB: SmallMoleculeComponent,\n        molA_to_molB: Dict[int, int],\n    ):\n        # create the image in a format matplotlib can handle\n        d2d = Chem.Draw.rdMolDraw2D.MolDraw2DCairo(300, 300, 300, 300)  # type: ignore[attr-defined]\n        d2d.drawOptions().setBackgroundColour((1, 1, 1, 0.7))\n        # TODO: use a custom draw2d object; figure size from transforms\n        img_bytes = draw_one_molecule_mapping(\n            molA_to_molB,\n            molA.to_rdkit(),\n            molB.to_rdkit(),\n            d2d=d2d,\n        )\n        img_filelike = io.BytesIO(img_bytes)  # imread needs filelike\n        img_data = matplotlib.pyplot.imread(img_filelike)\n\n        ax = self.artist.axes\n        x0, x1, y0, y1 = extent\n\n        # version A: using AxesImage\n        im = matplotlib.image.AxesImage(ax, extent=extent, zorder=10)\n\n        # version B: using BboxImage\n        # keep this commented code around for later performance checks\n        # bounds = (x0, y0, x1 - x0, y1 - y0)\n        # bounds = (0.2, 0.2, 0.3, 0.3)\n        # bbox0 = matplotlib.transforms.Bbox.from_bounds(*bounds)\n        # bbox = matplotlib.transforms.TransformedBbox(bbox0, ax.transAxes)\n        # im = matplotlib.image.BboxImage(bbox)\n\n        # set image data and register\n        im.set_data(img_data)\n        ax.add_artist(im)\n        return im\n\n    def _get_image_extents(self):\n        # figure out the extent for left and right\n        x0, x1 = self.artist.axes.get_xlim()\n        dx = x1 - x0\n        left_x0, left_x1 = 0.05 * dx + x0, 0.45 * dx + x0\n        right_x0, right_x1 = 0.55 * dx + x0, 0.95 * dx + x0\n        y0, y1 = self.artist.axes.get_ylim()\n        dy = y1 - y0\n        y_bottom, y_top = 0.5 * dx + y0, 0.9 * dx + y0\n\n        left_extent = (left_x0, left_x1, y_bottom, y_top)\n        right_extent = (right_x0, right_x1, y_bottom, y_top)\n        return left_extent, right_extent\n\n    def select(self, event, graph):\n        super().select(event, graph)\n        mapping = self.data[\"object\"]\n\n        # figure out which node is to the left and which to the right\n        xs = [node.xy[0] for node in self.node_artists]\n        if xs[0] <= xs[1]:\n            left = mapping.componentA\n            right = mapping.componentB\n            left_to_right = mapping.componentA_to_componentB\n            right_to_left = mapping.componentB_to_componentA\n        else:\n            left = mapping.componentB\n            right = mapping.componentA\n            left_to_right = mapping.componentB_to_componentA\n            right_to_left = mapping.componentA_to_componentB\n\n        left_extent, right_extent = self._get_image_extents()\n\n        self.left_image = self._draw_mapped_molecule(left_extent, left, right, left_to_right)\n        self.right_image = self._draw_mapped_molecule(right_extent, right, left, right_to_left)\n        graph.fig.canvas.draw()\n\n    def unselect(self):\n        super().unselect()\n        for artist in [self.left_image, self.right_image]:\n            if artist is not None:\n                artist.remove()\n\n        self.left_image = None\n        self.right_image = None\n\n\nclass LigandNode(Node):\n    def _make_artist(self, x, y, dx, dy):\n        artist = matplotlib.text.Text(x, y, self.node.name, color=\"blue\", backgroundcolor=\"white\")\n        return artist\n\n    def register_artist(self, ax):\n        ax.add_artist(self.artist)\n\n    @property\n    def extent(self):\n        txt = self.artist\n        ext = txt.axes.transData.inverted().transform(txt.get_window_extent())\n        [[xmin, ymin], [xmax, ymax]] = ext\n        return xmin, xmax, ymin, ymax\n\n    @property\n    def xy(self):\n        return self.artist.get_position()\n\n\nclass AtomMappingNetworkDrawing(GraphDrawing):\n    \"\"\"\n    Class for drawing atom mappings from a provided ligand network.\n\n    Parameters\n    ----------\n    graph : nx.MultiDiGraph\n        NetworkX representation of the LigandNetwork\n    positions : Optional[Dict[SmallMoleculeComponent, Tuple[float, float]]]\n        mapping of node to position\n    \"\"\"\n\n    NodeCls = LigandNode\n    EdgeCls = AtomMappingEdge\n\n\ndef plot_atommapping_network(network: LigandNetwork):\n    \"\"\"Convenience method for plotting the atom mapping network\n\n    Parameters\n    ----------\n    network : :class:`.Network`\n        the network to plot\n\n    Returns\n    -------\n    :class:`matplotlib.figure.Figure` :\n        the matplotlib figure containing the interactive visualization\n    \"\"\"\n    fig = AtomMappingNetworkDrawing(network.graph).fig\n    axes = fig.axes\n    for ax in axes:\n        ax.set_frame_on(False)  # remove the black frame\n        for t in ax.texts:\n            t.set_clip_on(False)  # do not clip the label in the network plot\n    return fig\n"
  },
  {
    "path": "src/openfe/utils/custom_typing.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\n\nfrom typing import TypeVar\n\nimport matplotlib.axes\nimport matplotlib.backend_bases\nfrom rdkit import Chem\n\ntry:\n    from typing import TypeAlias\nexcept ImportError:\n    from typing_extensions import TypeAlias\n\nRDKitMol: TypeAlias = Chem.rdchem.Mol\n\nOEMol = TypeVar(\"OEMol\")\nMPL_FigureCanvasBase: TypeAlias = matplotlib.backend_bases.FigureCanvasBase\nMPL_MouseEvent: TypeAlias = matplotlib.backend_bases.MouseEvent\nMPL_Axes: TypeAlias = matplotlib.axes.Axes\n"
  },
  {
    "path": "src/openfe/utils/ligand_utils.py",
    "content": "import warnings\n\nfrom gufe import LigandAtomMapping\n\n\ndef get_alchemical_charge_difference(mapping: LigandAtomMapping) -> int:\n    \"\"\"\n    Return the difference in formal charge between stateA and stateB defined as (formal charge A - formal charge B)\n\n    Parameters\n    ----------\n    mapping: LigandAtomMapping\n        The mapping between the end states A and B.\n\n    Returns\n    -------\n    int:\n        The difference in formal charge between the end states.\n    \"\"\"\n    warnings.warn(\n        \"Use gufe.LigandAtomMapping.get_alchemical_charge_difference() instead.\", DeprecationWarning\n    )\n    return mapping.get_alchemical_charge_difference()\n"
  },
  {
    "path": "src/openfe/utils/logging_control.py",
    "content": "import logging\nfrom abc import ABC, abstractmethod\n\n\nclass _BaseLogFilter(ABC):\n    \"\"\"Base class for log filters that handle string or list of strings.\n\n    Parameters\n    ----------\n    strings : str or list of str\n        String(s) to use in the filter logic\n    \"\"\"\n\n    def __init__(self, strings: str | list[str]) -> None:\n        if isinstance(strings, str):\n            strings = [strings]\n        self.strings: list[str] = strings\n\n    @abstractmethod\n    def filter(self, record: logging.LogRecord) -> bool:\n        \"\"\"Filter method to be implemented by subclasses.\n\n        Parameters\n        ----------\n        record : logging.LogRecord\n            Log record to filter/modify\n\n        Returns\n        -------\n        bool\n            True to allow the record, False to block it\n        \"\"\"\n        ...\n\n\nclass _MsgIncludesStringFilter(_BaseLogFilter):\n    \"\"\"Logging filter to silence specific log messages.\n\n    See https://docs.python.org/3/library/logging.html#filter-objects\n\n    Parameters\n    ----------\n    strings : str or list of str\n        If string(s) match in log messages (substring match) then the log record\n        is suppressed\n    \"\"\"\n\n    def filter(self, record: logging.LogRecord) -> bool:\n        \"\"\"Filter log records that contain any of the specified strings.\n\n        Parameters\n        ----------\n        record : logging.LogRecord\n            Log record to filter\n\n        Returns\n        -------\n        bool\n            False if the record should be blocked, True if it should be logged\n        \"\"\"\n        for string in self.strings:\n            if string in record.msg:\n                return False\n        return True\n\n\nclass _AppendMsgFilter(_BaseLogFilter):\n    \"\"\"Logging filter to append a message to a specific log message.\n\n    See https://docs.python.org/3/library/logging.html#filter-objects\n\n    Parameters\n    ----------\n    strings : str or list of str\n        Suffix text(s) to append to log messages\n    \"\"\"\n\n    def __init__(self, strings: str | list[str]) -> None:\n        super().__init__(strings)\n        # Rename for clarity in this context\n        self.suffixes = self.strings\n\n    def filter(self, record: logging.LogRecord) -> bool:\n        \"\"\"Append suffix to log record message.\n\n        Parameters\n        ----------\n        record : logging.LogRecord\n            Log record to modify\n\n        Returns\n        -------\n        bool\n            Always True to allow the record to be logged\n        \"\"\"\n        for suffix in self.suffixes:\n            # Only modify if not already appended (idempotent)\n            if not record.msg.endswith(suffix):\n                record.msg = f\"{record.msg}{suffix}\"\n        return True\n\n\ndef _silence_message(msg: str | list[str], logger_names: str | list[str]) -> None:\n    \"\"\"Silence specific log messages from one or more loggers.\n\n    Parameters\n    ----------\n    msg : str or list of str\n        String(s) to match in log messages (substring match)\n    logger_names : str or list of str\n        Logger name(s) to apply the filter to\n\n    Examples\n    --------\n    >>> _silence_message(\n    ...     msg=\"****** PyMBAR will use 64-bit JAX! *******\",\n    ...     logger_names=[\"pymbar.timeseries\", \"pymbar.mbar_solvers\"],\n    ... )\n    \"\"\"\n    if isinstance(logger_names, str):\n        logger_names = [logger_names]\n\n    filter_obj = _MsgIncludesStringFilter(msg)\n    for name in logger_names:\n        logging.getLogger(name).addFilter(filter_obj)\n\n\ndef _silence_logger(logger_names: str | list[str], level: int = logging.CRITICAL) -> None:\n    \"\"\"Completely silence one or more loggers.\n\n    Parameters\n    ----------\n    logger_names : str or list of str\n        Logger name(s) to silence\n    level : int\n        Set logger level (default: CRITICAL to silence everything)\n\n    Examples\n    --------\n    >>> _silence_logger(logger_names=[\"urllib3\", \"requests\"])\n    \"\"\"\n    if isinstance(logger_names, str):\n        logger_names = [logger_names]\n\n    for name in logger_names:\n        logging.getLogger(name).setLevel(level)\n\n\ndef _append_logger(suffix: str | list[str], logger_names: str | list[str]) -> None:\n    \"\"\"Append text to logger messages.\n\n    Parameters\n    ----------\n    suffix : str or list of str\n        Suffix text to append to log messages\n    logger_names : str or list of str\n        Logger name(s) to modify\n\n    Examples\n    --------\n    >>> _append_logger(suffix=\" [DEPRECATED]\", logger_names=\"myapp\")\n    \"\"\"\n    if isinstance(logger_names, str):\n        logger_names = [logger_names]\n\n    filter_obj = _AppendMsgFilter(suffix)\n    for name in logger_names:\n        logging.getLogger(name).addFilter(filter_obj)\n"
  },
  {
    "path": "src/openfe/utils/network_plotting.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\n\n\"\"\"\nGeneric tools for plotting networks. Interfaces NetworkX and matplotlib.\n\nCreate subclasses of ``Node``, ``Edge``, and ``GraphDrawing`` to customize\nbehavior how the graph is visualized or what happens on interactive events.\n\"\"\"\n\nfrom __future__ import annotations\n\nimport itertools\nfrom typing import Any, Optional, Union, cast\n\nimport networkx as nx\nfrom matplotlib import pyplot as plt\nfrom matplotlib.lines import Line2D\nfrom matplotlib.patches import Rectangle\n\nfrom openfe.utils.custom_typing import MPL_Axes, MPL_FigureCanvasBase, MPL_MouseEvent, TypeAlias\n\nClickLocation: TypeAlias = tuple[tuple[float, float], tuple[Any, Any]]\n\n\nclass Node:\n    \"\"\"Node in the GraphDrawing network.\n\n    This connects a node in the NetworkX graph to the matplotlib artist.\n    This is the only object that should directly use the matplotlib artist\n    for this node. This acts as an adapter class, allowing different artists\n    to be used, as well as enabling different functionalities.\n    \"\"\"\n\n    # TODO: someday it might be good to separate the artist adapter from the\n    # functionality on select, etc.\n    draggable = True\n    pickable = False\n    lock = None  # lock used while dragging; only one Node dragged at a time\n\n    def __init__(self, node, x: float, y: float, dx=0.1, dy=0.1):\n        self.node = node\n        self.dx = dx\n        self.dy = dx\n        self.artist = self._make_artist(x, y, dx, dy)\n        self.picked = False\n        self.press: Optional[ClickLocation] = None\n\n    def _make_artist(self, x, y, dx, dy):\n        return Rectangle((x, y), dx, dy, color=\"blue\")\n\n    def register_artist(self, ax: MPL_Axes):\n        \"\"\"Register this node's artist with the matplotlib Axes\"\"\"\n        ax.add_patch(self.artist)\n\n    @property\n    def extent(self) -> tuple[float, float, float, float]:\n        \"\"\"extent of this node in matplotlib data coordinates\"\"\"\n        bounds = self.artist.get_bbox().bounds\n        return (bounds[0], bounds[0] + bounds[2], bounds[1], bounds[1] + bounds[3])\n\n    @property\n    def xy(self) -> tuple[float, float]:\n        \"\"\"lower left (matplotlib data coordinates) position of this node\"\"\"\n        return self.artist.xy\n\n    def select(self, event: MPL_MouseEvent, graph: GraphDrawing):  # -no-cov-\n        \"\"\"Set this node to its state when it is selected (clicked on)\"\"\"\n        return\n\n    def unselect(self):\n        \"\"\"Reset this node to its standard, unselected visualization\"\"\"\n        self.artist.set(color=\"blue\")\n\n    def edge_select(self, edge: Edge):\n        \"\"\"Change node visualization when one of its edges is selected\"\"\"\n        self.artist.set(color=\"red\")\n\n    def update_location(self, x: float, y: float):\n        \"\"\"Update the location of the underlying artist\"\"\"\n        self.artist.set(x=x, y=y)\n\n    # note: much the stuff below is based on the \"Draggable rectangle\"\n    # exercise at:\n    # https://matplotlib.org/stable/users/explain/event_handling.html#draggable-rectangle-exercise\n    def contains(self, event: MPL_MouseEvent) -> bool:\n        \"\"\"Report whether this object contains the given event\"\"\"\n        return self.artist.contains(event)[0]\n\n    def on_mousedown(self, event: MPL_MouseEvent, graph: GraphDrawing):\n        \"\"\"Handle mousedown event (button_press_event)\"\"\"\n        # these early returns probably won't be called in practice, since\n        # the event handler should only call this method when those\n        # conditions are met; still, defensive programming!\n        if event.inaxes != self.artist.axes:\n            return\n\n        if not self.contains(event):\n            return\n\n        # record the original click location; lock that we're the only\n        # object being dragged\n        self.press = self.xy, (event.xdata, event.ydata)\n        Node.lock = self\n        # TODO: blitting\n\n    def on_drag(self, event: MPL_MouseEvent, graph: GraphDrawing):\n        \"\"\"Handle dragging this node\"\"\"\n        if event.inaxes != self.artist.axes or Node.lock is not self:\n            return\n\n        if self.press:\n            (x0, y0), (xpress, ypress) = self.press\n        else:\n            # this should be impossible in practice, but mypy needed the\n            # explicit check so it didn't unpack None\n            raise RuntimeError(\"Can't drag until mouse down!\")\n\n        dx = event.xdata - xpress\n        dy = event.ydata - ypress\n        self.update_location(x0 + dx, y0 + dy)\n\n        # TODO: this might be cached on mousedown\n        edges = graph.edges_for_node(self.node)\n        for edge in edges:\n            edge.update_locations()\n\n        # TODO: blitting\n        self.artist.figure.canvas.draw()\n\n    def on_mouseup(self, event: MPL_MouseEvent, graph: GraphDrawing):\n        \"\"\"Handle mouseup event (button_release_event)\"\"\"\n        self.press = None\n        Node.lock = None\n        # TODO: blitting\n        self.artist.figure.canvas.draw()\n\n\nclass Edge:\n    \"\"\"Edge in the GraphDrawing network.\n\n    This connects an edge in the NetworkX graph to the matplotlib artist. In\n    addition to the edge data, this needs to know the two GraphDrawing\n    ``Node`` instances associated with this edge.\n\n    Parameters\n    ----------\n    node_artist1, node_artist2 : :class:`.Node`\n        GraphDrawing nodes for this edge\n    data : Dict\n        data dictionary for this edge\n    \"\"\"\n\n    pickable = True\n\n    def __init__(self, node_artist1: Node, node_artist2: Node, data: dict):\n        self.data = data\n        self.node_artists = [node_artist1, node_artist2]\n        self.artist = self._make_artist(node_artist1, node_artist2, data)\n        self.picked = False\n\n    def _make_artist(self, node_artist1: Node, node_artist2: Node, data: dict) -> Any:\n        xs, ys = self._edge_xs_ys(node_artist1, node_artist2)\n        return Line2D(xs, ys, color=\"black\", picker=True, zorder=-1)\n\n    def register_artist(self, ax: MPL_Axes):\n        \"\"\"Register this edge's artist with the matplotlib Axes\"\"\"\n        ax.add_line(self.artist)\n\n    def contains(self, event: MPL_MouseEvent) -> bool:\n        \"\"\"Report whether this object contains the given event\"\"\"\n        return self.artist.contains(event)[0]\n\n    @staticmethod\n    def _edge_xs_ys(node1: Node, node2: Node):\n        def get_midpoint(node):\n            x0, x1, y0, y1 = node.extent\n            return (0.5 * (x0 + x1), 0.5 * (y0 + y1))\n\n        midpt1 = get_midpoint(node1)\n        midpt2 = get_midpoint(node2)\n\n        xs, ys = list(zip(*[midpt1, midpt2]))\n        return xs, ys\n\n    def on_mousedown(self, event: MPL_MouseEvent, graph: GraphDrawing):\n        \"\"\"Handle mousedown event (button_press_event)\"\"\"\n        return  # -no-cov-\n\n    def on_drag(self, event: MPL_MouseEvent, graph: GraphDrawing):\n        \"\"\"Handle drag event\"\"\"\n        return  # -no-cov-\n\n    def on_mouseup(self, event: MPL_MouseEvent, graph: GraphDrawing):\n        \"\"\"Handle mouseup event (button_release_event)\"\"\"\n        return  # -no-cov-\n\n    def unselect(self):\n        \"\"\"Reset this edge to its standard, unselected visualization\"\"\"\n        self.artist.set(color=\"black\")\n        for node_artist in self.node_artists:\n            node_artist.unselect()\n        self.picked = False\n\n    def select(self, event: MPL_MouseEvent, graph: GraphDrawing):\n        \"\"\"Mark this edge as selected, update visualization\"\"\"\n        self.artist.set(color=\"red\")\n        for artist in self.node_artists:\n            artist.edge_select(self)\n        self.picked = True\n        return True\n\n    def update_locations(self):\n        \"\"\"Update the location of this edge based on node locations\"\"\"\n        xs, ys = self._edge_xs_ys(*self.node_artists)\n        self.artist.set(xdata=xs, ydata=ys)\n\n\nclass EventHandler:\n    \"\"\"Pass event information to nodes/edges.\n\n    This is the single place where we connect to the matplotlib event\n    system. This object receives matplotlib events and delegates to the\n    appropriate node or edge.\n\n    Parameters\n    ----------\n    graph : GraphDrawing\n        the graph drawing that we're handling events for\n\n    Attributes\n    ----------\n    active : Optional[Union[Node, Edge]]\n        Object activated by a mousedown event, or None if either no object\n        activated by mousedown or if mouse is not currently pressed. This is\n        primarily used to handle drag events.\n    selected : Optional[Union[Node, Edge]]\n        Object selected by a mouse click (after mouse is up), or None if no\n        object has been selected in the graph.\n    click_location : Optional[tuple[Optional[float], Optional[float]]]\n        Cached location of the mousedown event, or None if mouse is up\n    connections : List[int]\n        list of IDs for connections to matplotlib canvas\n    \"\"\"\n\n    def __init__(self, graph: GraphDrawing):\n        self.graph = graph\n        self.active: Optional[Union[Node, Edge]] = None\n        self.selected: Optional[Union[Node, Edge]] = None\n        self.click_location: Optional[tuple[Optional[float], Optional[float]]] = None\n        self.connections: list[int] = []\n\n    def connect(self, canvas: MPL_FigureCanvasBase):\n        \"\"\"Connect our methods to events in the matplotlib canvas\"\"\"\n        self.connections.extend(\n            [\n                canvas.mpl_connect(\"button_press_event\", self.on_mousedown),  # type: ignore\n                canvas.mpl_connect(\"motion_notify_event\", self.on_drag),  # type: ignore\n                canvas.mpl_connect(\"button_release_event\", self.on_mouseup),  # type: ignore\n            ]\n        )\n\n    def disconnect(self, canvas: MPL_FigureCanvasBase):\n        \"\"\"Disconnect all connections to the canvas.\"\"\"\n        for cid in self.connections:\n            canvas.mpl_disconnect(cid)\n        self.connections = []\n\n    def _get_event_container(self, event: MPL_MouseEvent):\n        \"\"\"Identify which object should process an event.\n\n        Note that we prefer nodes to edges: If you click somewhere that\n        could be a node or an edge, it is interpreted as clicking on the\n        node.\n        \"\"\"\n        containers = itertools.chain(self.graph.nodes.values(), self.graph.edges.values())\n        for container in containers:\n            if container.contains(event):\n                break\n        else:\n            container = None\n\n        return container\n\n    def on_mousedown(self, event: MPL_MouseEvent):\n        \"\"\"Handle mousedown event (button_press_event)\"\"\"\n        self.click_location = event.xdata, event.ydata\n        container = self._get_event_container(event)\n        if container is None:\n            return\n\n        # cast because mypy can't tell that we did early return if None\n        self.active = cast(Union[Node, Edge], container)\n        self.active.on_mousedown(event, self.graph)\n\n    def on_drag(self, event: MPL_MouseEvent):\n        \"\"\"Handle dragging\"\"\"\n        if not self.active or event.inaxes != self.active.artist.axes:\n            return\n\n        self.active.on_drag(event, self.graph)\n\n    def on_mouseup(self, event: MPL_MouseEvent):\n        \"\"\"Handle mouseup event (button_release_event)\"\"\"\n        if self.click_location == (event.xdata, event.ydata):\n            # mouse hasn't moved; call it a click\n            # first unselect whatever was previously selected\n            if self.selected:\n                self.selected.unselect()\n\n            # if it is a click and the active object contains it, select it;\n            # otherwise unset selection\n            if self.active and self.active.contains(event):\n                self.active.select(event, self.graph)\n                self.selected = self.active\n            else:\n                self.selected = None\n\n        if self.active:\n            self.active.on_mouseup(event, self.graph)\n\n        self.active = None\n        self.click_location = None\n        self.graph.draw()\n\n\nclass GraphDrawing:\n    \"\"\"\n    Base class for drawing networks with matplotlib.\n\n    Connects to the matplotlib figure and to the underlying NetworkX graph.\n\n    Typical use will require a subclass with custom values of ``NodeCls``\n    and ``EdgeCls`` to handle the specific visualization.\n\n    Parameters\n    ----------\n    graph : nx.MultiDiGraph\n        NetworkX graph with information in nodes and edges to be drawn\n    positions : Optional[Dict[Any, Tuple[float, float]]]\n        mapping of node to position\n    \"\"\"\n\n    NodeCls = Node\n    EdgeCls = Edge\n\n    def __init__(self, graph: nx.Graph, positions=None, ax=None):\n        # TODO: use scale to scale up the positions?\n        self.event_handler = EventHandler(self)\n        self.graph = graph\n        self.nodes: dict[Node, Any] = {}\n        self.edges: dict[tuple[Node, Node], Any] = {}\n\n        if positions is None:\n            positions = nx.nx_agraph.graphviz_layout(self.graph, prog=\"neato\")\n\n        was_interactive = plt.isinteractive()\n        plt.ioff()\n        if ax is None:\n            self.fig, self.ax = plt.subplots(figsize=(8, 8))\n        else:\n            self.fig, self.ax = ax.figure, ax\n\n        for node, pos in positions.items():\n            self._register_node(node, pos)\n\n        self.fig.canvas.draw()  # required to get renderer\n        for edge in graph.edges(data=True):\n            self._register_edge(edge)\n\n        self.reset_bounds()\n        self.ax.set_aspect(1)\n        self.ax.set_xticks([])\n        self.ax.set_yticks([])\n        if was_interactive:\n            plt.ion()  # -no-cov-\n\n        self.event_handler.connect(self.fig.canvas)\n\n    def _ipython_display_(self):  # -no-cov-\n        return self.fig\n\n    def edges_for_node(self, node: Node) -> list[Edge]:\n        \"\"\"List of edges for the given node\"\"\"\n        edges = list(self.graph.in_edges(node)) + list(self.graph.out_edges(node))\n        return [self.edges[edge] for edge in edges]\n\n    def _get_nodes_extent(self):\n        \"\"\"Find the extent of all nodes (used in setting bounds)\"\"\"\n        min_xs, max_xs, min_ys, max_ys = zip(*(node.extent for node in self.nodes.values()))\n        return min(min_xs), max(max_xs), min(min_ys), max(max_ys)\n\n    def reset_bounds(self):\n        \"\"\"Set the bounds of the matplotlib Axes to include all nodes\"\"\"\n        # I feel like the following should be a better approach, but it\n        # doesn't seem to work\n        # renderer = self.fig.canvas.get_renderer()\n        # bbox = self.ax.get_tightbbox(renderer)\n        # trans = self.ax.transData.inverted()\n        # [[min_x, min_y], [max_x, max_y]] = trans.transform(bbox)\n        min_x, max_x, min_y, max_y = self._get_nodes_extent()\n        pad_x = (max_x - min_x) * 0.05\n        pad_y = (max_y - min_y) * 0.05\n        self.ax.set_xlim(min_x - pad_x, max_x + pad_x)\n        self.ax.set_ylim(min_y - pad_y, max_y + pad_y)\n\n    def draw(self):\n        \"\"\"Draw the current canvas\"\"\"\n        self.fig.canvas.draw()\n        self.fig.canvas.flush_events()\n\n    def _register_node(self, node: Any, position: tuple[float, float]):\n        \"\"\"Create and register ``Node`` from NetworkX node and position\"\"\"\n        if node in self.nodes:\n            raise RuntimeError(\"node provided multiple times\")\n\n        draw_node = self.NodeCls(node, *position)\n        self.nodes[node] = draw_node\n        draw_node.register_artist(self.ax)\n\n    def _register_edge(self, edge: tuple[Node, Node, dict]):\n        \"\"\"Create and register ``Edge`` from NetworkX edge information\"\"\"\n        node1, node2, data = edge\n        draw_edge = self.EdgeCls(self.nodes[node1], self.nodes[node2], data)\n        self.edges[(node1, node2)] = draw_edge\n        draw_edge.register_artist(self.ax)\n"
  },
  {
    "path": "src/openfe/utils/optional_imports.py",
    "content": "\"\"\"\nTools for integration with miscellaneous non-required packages.\nshamelessly borrowed from openff.toolkit\n\"\"\"\n# don't format vendored code\n# fmt: off\n\nimport functools\nfrom typing import Callable\n\n\ndef requires_package(package_name: str) -> Callable:\n    \"\"\"\n    Helper function to denote that a function requires some optional\n    dependency. A function decorated with this decorator will raise\n    `MissingDependencyError` if the package is not found by\n    `importlib.import_module()`.\n    Parameters\n    ----------\n    package_name : str\n        The directory path to enter within the context\n    Raises\n    ------\n    MissingDependencyError\n    \"\"\"\n\n    def test_import_for_require_package(function: Callable) -> Callable:\n        @functools.wraps(function)\n        def wrapper(*args, **kwargs):\n            import importlib\n\n            try:\n                importlib.import_module(package_name)\n            except (ImportError, ModuleNotFoundError):\n                raise ImportError(function.__name__ + \" requires package: \" + package_name)\n            except Exception as e:\n                raise e\n\n            return function(*args, **kwargs)\n\n        return wrapper\n\n    return test_import_for_require_package\n"
  },
  {
    "path": "src/openfe/utils/remove_oechem.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\nfrom contextlib import contextmanager\n\nfrom openff.toolkit import GLOBAL_TOOLKIT_REGISTRY, OpenEyeToolkitWrapper\nfrom openff.toolkit.utils.toolkit_registry import ToolkitUnavailableException\n\n\n@contextmanager\ndef without_oechem_backend():\n    \"\"\"For temporarily removing oechem from openff's toolkit registry\"\"\"\n    current_toolkits = [type(tk) for tk in GLOBAL_TOOLKIT_REGISTRY.registered_toolkits]\n\n    try:\n        GLOBAL_TOOLKIT_REGISTRY.deregister_toolkit(OpenEyeToolkitWrapper())\n    except ToolkitUnavailableException:\n        pass\n\n    try:\n        yield None\n    finally:\n        # this is order dependent; we want to prepend OEChem back to first\n        while GLOBAL_TOOLKIT_REGISTRY.registered_toolkits:\n            GLOBAL_TOOLKIT_REGISTRY.deregister_toolkit(\n                GLOBAL_TOOLKIT_REGISTRY.registered_toolkits[0]\n            )\n        for tk in current_toolkits:\n            GLOBAL_TOOLKIT_REGISTRY.register_toolkit(tk)\n"
  },
  {
    "path": "src/openfe/utils/silence_root_logging.py",
    "content": "import contextlib\nimport logging\n\n\n@contextlib.contextmanager\ndef silence_root_logging():\n    \"\"\"Context manager to silence logging from root logging handlers.\n\n    a.k.a, \"Why are you using basicConfig during import -- or in library\n    code at all?\"\n    \"\"\"\n    root = logging.getLogger()\n    old_handlers = list(root.handlers)\n    for handler in old_handlers:\n        root.removeHandler(handler)\n\n    null = logging.NullHandler()\n    root.addHandler(null)\n    try:\n        yield\n    finally:\n        root.removeHandler(null)\n        for handler in old_handlers:\n            root.addHandler(handler)\n"
  },
  {
    "path": "src/openfe/utils/system_probe.py",
    "content": "import logging\nimport os\nimport pathlib\nimport socket\nimport subprocess\nimport sys\nfrom typing import Iterable, Optional\n\nimport psutil\nfrom psutil._common import bytes2human\n\n\ndef _get_disk_usage(\n    paths: Optional[Iterable[pathlib.Path]] = None,\n) -> dict[str, dict[str, str]]:\n    \"\"\"\n    Get disk usage information for all filesystems or specified paths.\n\n    Parameters\n    ----------\n    paths : Optional[Iterable[pathlib.Path]], default=None\n        An optional iterable of `pathlib.Path` objects representing specific paths for\n        which the disk usage information is required. If not provided (or set to None),\n        the function retrieves disk usage information for all filesystems mounted on\n        the system.\n\n    Returns\n    -------\n    dict[str, dict[str, str]]\n        A dictionary with filesystem names as keys and dictionaries containing disk\n        usage information as values.\n\n    Notes\n    -----\n    This function uses the 'df' command-line utility to gather disk usage information\n    for all filesystems mounted on the system. The output is then processed to extract\n    relevant information.\n\n    The returned dictionary has filesystem names (or paths) as keys, and each\n    corresponding value is a dictionary containing the following disk usage\n    information:\n    - 'size': The total size of the filesystem.\n    - 'used': The used space on the filesystem.\n    - 'available': The available space on the filesystem.\n    - 'percent_used': Percentage of the filesystem's space that is currently in use.\n    - 'mount_point': The mount point directory where the filesystem is mounted. This\n      key will not be present if the \"paths\" argument is used.\n\n    Note that the disk space values are represented as strings, which include units\n    (e.g., 'G' for gigabytes, 'M' for megabytes). The function decodes the 'df'\n    command's output using 'utf-8'.\n\n    Raises\n    ------\n    subprocess.CalledProcessError\n        If the 'df' command execution fails or returns a non-zero exit code.\n\n    OSError\n        If an operating system-related error occurs during the 'df' command execution.\n\n    Returns an empty dictionary if the 'df' command output is empty or cannot be\n    processed.\n\n    Examples\n    --------\n    >>> _get_disk_usage()\n    {\n        '/dev/sda1': {\n            'size': '30G',\n            'used': '15G',\n            'available': '14G',\n            'percent_used': '52%',\n            'mount_point': '/'\n        },\n        '/dev/sda2': {\n            'size': '100G',\n            'used': '20G',\n            'available': '80G',\n            'percent_used': '20%',\n            'mount_point': '/home'\n        },\n        ...\n    }\n    \"\"\"\n\n    disk_usage_dict: dict[str, dict[str, str]] = {}\n\n    if paths:\n        for path in paths:\n            usage_info = psutil.disk_usage(str(path))._asdict()\n            disk_usage_dict[str(path)] = {\n                \"available\": bytes2human(usage_info[\"free\"]),\n                \"percent_used\": f\"{round(usage_info['percent'])}%\",\n                \"size\": bytes2human(usage_info[\"total\"]),\n                \"used\": bytes2human(usage_info[\"used\"]),\n            }\n\n        return disk_usage_dict\n\n    else:\n        output = subprocess.check_output([\"df\", \"-h\"]).decode(\"utf-8\")\n\n        lines = output.strip().split(os.linesep)\n        lines = lines[1:]\n\n        for line in lines:\n            columns = line.split()\n\n            filesystem = columns[0]\n            size = columns[1]\n            used = columns[2]\n            available = columns[3]\n            percent_used = columns[4]\n            mount_point = columns[5]\n\n            disk_usage_dict[filesystem] = {\n                \"size\": size,\n                \"used\": used,\n                \"available\": available,\n                \"percent_used\": percent_used,\n                \"mount_point\": mount_point,\n            }\n\n        return disk_usage_dict\n\n\ndef _get_psutil_info() -> dict[str, dict[str, str]]:\n    \"\"\"\n    Get process information using the psutil library.\n\n    Returns\n    -------\n    dict[str, dict[str, str]]\n        A dictionary containing various process information.\n\n    Notes\n    -----\n    This function utilizes the psutil library to retrieve information about the current\n    process and system memory.\n\n    The returned dictionary includes the following process information:\n    - 'cpu_percent': The percentage of CPU usage by the current process.\n    - 'create_time': The timestamp indicating the process creation time.\n    - 'exe': The absolute path to the executable file associated with the process.\n    - 'memory_full_info': A dictionary containing detailed memory information about\n                          the process.\n    - 'memory_percent': The percentage of memory usage by the current process.\n    - 'num_fds': The number of file descriptors used by the process.\n    - 'pid': The Process ID (PID) of the current process.\n    - 'status': The current status of the process\n                (e.g., 'running', 'sleeping', 'stopped').\n\n    Additionally, the dictionary includes the following system memory information:\n    - 'RLIMIT_AS': The maximum size of the process's virtual memory.\n    - 'virtual_memory': A dictionary containing various virtual memory statistics for\n                        the system.\n\n    Note that the memory-related values are represented as strings, which include units\n    (e.g., 'MB', 'GB').\n\n    Note that RLIMIT_AS key will be missing when this function is executed on macOS\n    systems.\n\n    Raises\n    ------\n    NoSuchProcess\n        If the process with the specified PID (Process ID) does not exist or is not\n        running.\n\n    AccessDenied\n        If access to the process information is denied due to permission restrictions.\n\n    Examples\n    --------\n    >>> _get_psutil_info()\n    {\n        \"memory_percent\": 0.019870108903294176,\n        \"exe\": \"/usr/bin/python3.10\",\n        \"pid\": 1531909,\n        \"cpu_percent\": 0.0,\n        \"create_time\": 1690995569.42,\n        \"memory_full_info\": {\n            \"rss\": 13369344,\n            \"vms\": 31834112,\n            \"shared\": 6815744,\n            \"text\": 2121728,\n            \"lib\": 0,\n            \"data\": 7827456,\n            \"dirty\": 0,\n            \"uss\": 10633216,\n            \"pss\": 10646528,\n            \"swap\": 0,\n        },\n        \"status\": \"running\",\n        \"num_fds\": 4,\n        \"RLIMIT_AS\": (-1, -1),\n        \"virtual_memory\": {\n            \"total\": 67283697664,\n            \"available\": 32223358976,\n            \"percent\": 52.1,\n            \"used\": 29410000896,\n            \"free\": 3407593472,\n            \"active\": 33954336768,\n            \"inactive\": 26209050624,\n            \"buffers\": 144347136,\n            \"cached\": 34321756160,\n            \"shared\": 1021435904,\n            \"slab\": 1520009216,\n        },\n    }\n    \"\"\"\n\n    p = psutil.Process()\n\n    with p.oneshot():\n        info = p.as_dict(\n            attrs=[\n                \"cpu_percent\",\n                \"create_time\",\n                \"exe\",\n                \"memory_full_info\",\n                \"memory_percent\",\n                \"num_fds\",\n                \"pid\",\n                \"status\",\n            ]\n        )\n        # OSX doesn't have rlimit for Process\n        if sys.platform != \"darwin\":\n            RLIMIT_AS = p.rlimit(psutil.RLIMIT_AS)\n            info[\"RLIMIT_AS\"] = RLIMIT_AS\n\n        # The maximum size of the process's virtual memory\n        mem = psutil.virtual_memory()\n\n    # memory_full_info is a named tuple, and we need to dict-ify it\n    mem_full_info = info[\"memory_full_info\"]._asdict()\n    info[\"memory_full_info\"] = mem_full_info\n\n    info[\"virtual_memory\"] = mem._asdict()\n\n    return info\n\n\ndef _get_hostname() -> str:\n    \"\"\"\n    Get the hostname of the current system.\n\n    Returns\n    -------\n    str\n        The hostname of the system.\n\n    Notes\n    -----\n    This function uses the 'socket' library to retrieve the hostname of the current\n    system.\n\n    The returned hostname is a string representing the name of the system within a\n    network.\n\n    Raises\n    ------\n    socket.error\n        If an error occurs while trying to fetch the hostname.\n\n    Examples\n    --------\n    >>> _get_hostname()\n    'winry-comp'\n    \"\"\"\n\n    return socket.gethostname()\n\n\ndef _get_gpu_info() -> dict[str, dict[str, str]]:\n    \"\"\"\n    Get GPU information using the 'nvidia-smi' command-line utility.\n\n    Returns\n    -------\n    dict[str, dict[str, str]]\n        A dictionary with GPU UUIDs as keys and dictionaries containing GPU information\n        as values.\n\n    Notes\n    -----\n    This function queries the NVIDIA System Management Interface ('nvidia-smi') to\n    retrieve information about the available GPUs on the system.\n\n    The returned dictionary includes the following GPU information for each\n    detected GPU:\n    - 'gpu_name': The name of the GPU.\n    - 'compute_mode': The compute mode of the GPU.\n    - 'pstate': The current performance state of the GPU.\n    - 'temperature.gpu': The temperature of the GPU.\n    - 'utilization.memory': The memory utilization of the GPU.\n    - 'memory.total': The total memory available on the GPU.\n    - 'driver_version': The version of the installed NVIDIA GPU driver.\n\n    The GPU information is extracted from the output of the 'nvidia-smi' command, which\n    is invoked with specific query parameters. The output is then parsed as CSV, and\n    the relevant information is stored in the dictionary.\n\n    Note that the GPU information values are represented as strings.\n    Note that if no GPU is detected, an empty dictionary is returned.\n\n    Examples\n    --------\n    >>> _get_gpu_info()\n    {\n        'GPU-UUID-1': {\n            'name': 'NVIDIA GeForce RTX 3080',\n            'compute_mode': 'Default',\n            'pstate': 'P0',\n            'temperature.gpu': '78 C',\n            'utilization.memory [%]': '50 %',\n            'memory.total [MiB]': '10.7 GB',\n            'driver_version': '470.57.02',\n        },\n        'GPU-UUID-2': {\n            'name': 'NVIDIA GeForce GTX 1660 Ti',\n            'compute_mode': 'Default',\n            'pstate': 'P2',\n            'temperature.gpu': '65 C',\n            'utilization.memory [%]': '30 %',\n            'memory.total [MiB]': '5.8 GB',\n            'driver_version': '470.57.02',\n        },\n        ...\n    }\n    \"\"\"\n\n    GPU_QUERY = (\n        \"--query-gpu=gpu_uuid,gpu_name,compute_mode,pstate,temperature.gpu,\"\n        \"utilization.memory,memory.total,driver_version,\"\n    )\n\n    try:\n        nvidia_smi_output = subprocess.check_output(\n            [\"nvidia-smi\", GPU_QUERY, \"--format=csv\"]\n        ).decode(\"utf-8\")\n    except FileNotFoundError:\n        logging.debug(\n            \"Error: nvidia-smi command not found. Make sure NVIDIA drivers are\"\n            \" installed, this is expected if there is no GPU available\"\n        )\n        return {}\n\n    except subprocess.CalledProcessError as e:\n        match e.returncode:\n            case 6:\n                logging.debug(\"Error: no GPU available\")\n                return {}\n            case 9:\n                logging.debug(\"Error: can't communicate with NVIDIA driver\")\n                return {}\n            case _:\n                # New error code we haven't ran into before\n                # Dump full error to debug log\n                logging.debug(\n                    f\"command {e.cmd} returned error code {e.returncode} {e.output=} {e.stdout=} {e.stderr=}\"\n                )\n                return {}\n\n    nvidia_smi_output_lines = nvidia_smi_output.strip().split(os.linesep)\n\n    header = nvidia_smi_output_lines[0].split(\",\")\n\n    # Parse each line as CSV and build the dictionary\n    # Skip the header\n    gpu_info: dict[str, dict] = {}\n    for line in nvidia_smi_output_lines[1:]:\n        data = line.split(\",\")\n        # Get UUID of GPU\n        gpu_uuid = data[0].strip()\n        gpu_info[gpu_uuid] = {}\n\n        # Stuff info we asked for into dict with UUID as key\n        for i in range(1, len(header)):\n            field_name = header[i].strip()\n            gpu_info[gpu_uuid][field_name] = data[i].strip()\n\n    return gpu_info\n\n\ndef _probe_system(paths: Optional[Iterable[pathlib.Path]] = None) -> dict:\n    \"\"\"\n    Probe the system and gather various system information.\n\n    Returns\n    -------\n    dict\n        A dictionary containing system information.\n\n    Notes\n    -----\n    This function gathers information about the system by calling several internal\n    functions.\n\n    The returned dictionary contains the following system information:\n    - 'system information': A dictionary containing various system-related details.\n        - 'hostname': The hostname of the current system.\n        - 'gpu information': GPU information retrieved using the '_get_gpu_info'\n          function.\n        - 'psutil information': Process and memory-related information obtained using\n          the '_get_psutil_info' function.\n        - 'disk usage information': Disk usage details for all filesystems, obtained\n          through the '_get_disk_usage' function.\n\n    Each nested dictionary provides specific details about the corresponding system\n    component.\n\n    Examples\n    --------\n    >>> _probe_system()\n    {\n        \"system information\": {\n            \"hostname\": \"winry-comp\",\n            \"gpu information\": {\n                \"GPU-5b97c87b-4646-cfdd-efd6-3ee9bb3b371d\": {\n                    \"name\": \"NVIDIA GeForce RTX 2060\",\n                    \"compute_mode\": \"Default\",\n                    \"pstate\": \"P0\",\n                    \"temperature.gpu\": \"48\",\n                    \"utilization.memory [%]\": \"0 %\",\n                    \"memory.total [MiB]\": \"6144 MiB\",\n                    \"driver_version\": \"525.116.04\",\n                }\n            },\n            \"psutil information\": {\n                \"exe\": \"/home/winry/micromamba/envs/openfe/bin/python3.10\",\n                \"memory_percent\": 0.02006491389254216,\n                \"create_time\": 1690996699.21,\n                \"status\": \"running\",\n                \"pid\": 1549447,\n                \"num_fds\": 4,\n                \"memory_full_info\": {\n                    \"rss\": 13500416,\n                    \"vms\": 31850496,\n                    \"shared\": 6946816,\n                    \"text\": 2121728,\n                    \"lib\": 0,\n                    \"data\": 7843840,\n                    \"dirty\": 0,\n                    \"uss\": 10752000,\n                    \"pss\": 10765312,\n                    \"swap\": 0,\n                },\n                \"cpu_percent\": 0.0,\n                \"RLIMIT_AS\": (-1, -1),\n                \"virtual_memory\": {\n                    \"total\": 67283697664,\n                    \"available\": 31865221120,\n                    \"percent\": 52.6,\n                    \"used\": 29719117824,\n                    \"free\": 2608443392,\n                    \"active\": 34446774272,\n                    \"inactive\": 26320441344,\n                    \"buffers\": 168124416,\n                    \"cached\": 34788012032,\n                    \"shared\": 1069752320,\n                    \"slab\": 1520705536,\n                },\n            },\n            \"disk usage information\": {\n                \"/dev/mapper/data-root\": {\n                    \"size\": \"1.8T\",\n                    \"used\": \"626G\",\n                    \"available\": \"1.1T\",\n                    \"percent_used\": \"37%\",\n                    \"mount_point\": \"/\",\n                },\n                \"/dev/dm-3\": {\n                    \"size\": \"3.7T\",\n                    \"used\": \"1.6T\",\n                    \"available\": \"2.2T\",\n                    \"percent_used\": \"42%\",\n                    \"mount_point\": \"/mnt/data\",\n                },\n            },\n        }\n    }\n    \"\"\"\n\n    hostname = _get_hostname()\n    gpu_info = _get_gpu_info()\n    psutil_info = _get_psutil_info()\n    disk_usage_info = _get_disk_usage(paths)\n\n    return {\n        \"system information\": {\n            \"hostname\": hostname,\n            \"gpu information\": gpu_info,\n            \"psutil information\": psutil_info,\n            \"disk usage information\": disk_usage_info,\n        }\n    }\n\n\ndef log_system_probe(level=logging.DEBUG, paths: Optional[Iterable[os.PathLike]] = None):\n    \"\"\"Print the system information via configurable logging.\n\n    This creates a logger tree under \"{__name__}.log\", allowing one to turn\n    on/off logging of GPU info or hostname info the with\n    \"{__name__}.log.gpu\" and \"{__name__}.log.hostname\" loggers.\n    \"\"\"\n    if paths is None:\n        paths = []\n    pl_paths = (pathlib.Path(p) for p in paths)\n    basename = __name__ + \".log\"\n    base = logging.getLogger(basename)\n    gpu = logging.getLogger(basename + \".gpu\")\n    hostname = logging.getLogger(basename + \".hostname\")\n    loggers = [base, gpu, hostname]\n    if any(logger.isEnabledFor(level) for logger in loggers):\n        sysinfo = _probe_system(pl_paths)[\"system information\"]\n        base.log(level, \"SYSTEM CONFIG DETAILS:\")\n        hostname.log(level, f\"hostname: '{sysinfo['hostname']}'\")\n        if gpuinfo := sysinfo[\"gpu information\"]:\n            for uuid, gpu_card in gpuinfo.items():\n                gpu.log(\n                    level,\n                    f\"GPU: {uuid=} {gpu_card['name']} mode={gpu_card['compute_mode']}\",\n                )\n            # gpu.log(level, f\"CUDA driver: {...}\")\n            # gpu.log(level, f\"CUDA toolkit: {...}\")\n        else:  # -no-cov-\n            gpu.log(level, \"CUDA-based GPU not found\")\n\n        psutilinfo = sysinfo[\"psutil information\"]\n        memused = psutilinfo[\"virtual_memory\"][\"used\"]\n        mempct = psutilinfo[\"virtual_memory\"][\"percent\"]\n        base.log(level, f\"Memory used: {bytes2human(memused)} ({mempct}%)\")\n        for diskdev, disk in sysinfo[\"disk usage information\"].items():\n            base.log(\n                level,\n                f\"{diskdev}: {disk['percent_used']} full ({disk['available']} free)\",\n            )\n\n\nif __name__ == \"__main__\":\n    from pprint import pprint\n\n    pprint(_probe_system())\n"
  },
  {
    "path": "src/openfe/utils/visualization_3D.py",
    "content": "import warnings\nfrom typing import Dict, Iterable, Optional, Tuple, Union\n\nimport numpy as np\nfrom matplotlib import pyplot as plt\nfrom matplotlib.colors import rgb2hex\nfrom numpy.typing import NDArray\nfrom rdkit import Chem\nfrom rdkit.Geometry.rdGeometry import Point3D\n\ntry:\n    import py3Dmol\nexcept ImportError:\n    pass  # Don't throw  error, will happen later\n\nfrom gufe.components.explicitmoleculecomponent import ExplicitMoleculeComponent\nfrom gufe.mapping import AtomMapping\n\nfrom openfe.utils import requires_package\n\n\ndef _get_max_dist_in_x(atom_mapping: AtomMapping) -> float:\n    \"\"\"helper function\n        find the correct mol shift, so no overlap happens in vis\n\n    Returns\n    -------\n    float\n        maximal size of mol in x dimension\n    \"\"\"\n    posA = atom_mapping.componentA.to_rdkit().GetConformer().GetPositions()\n    posB = atom_mapping.componentB.to_rdkit().GetConformer().GetPositions()\n    max_d = []\n\n    for pos in [posA, posB]:\n        d = np.zeros(shape=(len(pos), len(pos)))\n        for i, pA in enumerate(pos):\n            for j, pB in enumerate(pos[i:], start=i):\n                d[i, j] = (pB - pA)[0]\n\n        max_d.append(np.max(d))\n\n    estm = float(np.round(max(max_d), 1))\n    return estm if (estm > 5) else 5\n\n\ndef _translate(mol, shift: Union[Tuple[float, float, float], NDArray[np.float64]]):\n    \"\"\"\n        shifts the molecule by the shift vector\n\n    Parameters\n    ----------\n    mol : Chem.Mol\n        rdkit mol that get shifted\n    shift : Tuple[float, float, float]\n        shift vector\n\n    Returns\n    -------\n    Chem.Mol\n        shifted Molecule (copy of original one)\n    \"\"\"\n    mol = Chem.Mol(mol)\n    conf = mol.GetConformer()\n    for i, atom in enumerate(mol.GetAtoms()):\n        x, y, z = conf.GetAtomPosition(i)\n        point = Point3D(x + shift[0], y + shift[1], z + shift[2])\n        conf.SetAtomPosition(i, point)\n    return mol\n\n\ndef _add_spheres(view: py3Dmol.view, mol1: Chem.Mol, mol2: Chem.Mol, mapping: Dict[int, int]):\n    \"\"\"\n        will add spheres according to mapping to the view. (inplace!)\n\n    Parameters\n    ----------\n    view : py3Dmol.view\n        view to be edited\n    mol1 : Chem.Mol\n        molecule 1 of the mapping\n    mol2 : Chem.Mol\n        molecule 2 of the mapping\n    mapping : Dict[int, int]\n        mapping of atoms from mol1 to mol2\n    \"\"\"\n    # Get colourmap of size mapping\n    cmap = plt.get_cmap(\"hsv\", len(mapping))\n    for i, pair in enumerate(mapping.items()):\n        p1 = mol1.GetConformer().GetAtomPosition(pair[0])\n        p2 = mol2.GetConformer().GetAtomPosition(pair[1])\n        color = rgb2hex(cmap(i))\n        view.addSphere(\n            {\n                \"center\": {\"x\": p1.x, \"y\": p1.y, \"z\": p1.z},\n                \"radius\": 0.6,\n                \"color\": color,\n                \"alpha\": 0.8,\n            }\n        )\n        view.addSphere(\n            {\n                \"center\": {\"x\": p2.x, \"y\": p2.y, \"z\": p2.z},\n                \"radius\": 0.6,\n                \"color\": color,\n                \"alpha\": 0.8,\n            }\n        )\n\n\n@requires_package(\"py3Dmol\")\ndef view_components_3d(\n    mols: Iterable[ExplicitMoleculeComponent],\n    style: Optional[str] = \"stick\",\n    shift: Optional[Tuple[float, float, float]] = None,\n    view: py3Dmol.view = None,\n) -> py3Dmol.view:\n    \"\"\"visualize multiple component coordinates in one interactive view.\n    It helps to understand how the components are aligned in the system to each other.\n\n    py3Dmol is an optional dependency, it can be installed with:\n        pip install py3Dmol\n\n    Parameters\n    ----------\n    mols : Iterable[ExplicitMoleculeComponent]\n        collection of components\n    style : Optional[str], optional\n        py3Dmol style, by default \"stick\"\n    shift : Tuple of floats, optional\n        Amount to i*shift each mols_i in order to allow inspection of them in heavy overlap cases.\n    view : py3Dmol, optional\n        Allows to pass an already existing view, by default None\n\n    Returns\n    -------\n    py3Dmol.view\n        view containing all component coordinates\n    \"\"\"\n\n    if view is None:\n        view = py3Dmol.view(width=600, height=600)\n\n    for i, component in enumerate(mols):\n        mol = Chem.Mol(component.to_rdkit())\n        if shift is not None:\n            tmp_shift = np.array(shift, dtype=np.float64) * i\n            mol = _translate(mol, tmp_shift)\n\n        view.addModel(Chem.MolToMolBlock(mol))\n\n    view.setStyle({style: {}})\n\n    view.zoomTo()\n    return view\n\n\n@requires_package(\"py3Dmol\")\ndef view_mapping_3d(\n    mapping: AtomMapping,\n    spheres: Optional[bool] = True,\n    show_atomIDs: Optional[bool] = False,\n    style: Optional[str] = \"stick\",\n    shift: Optional[Union[Tuple[float, float, float], NDArray[np.float64]]] = None,\n) -> py3Dmol.view:\n    \"\"\"\n    Render relative transformation edge in 3D using py3Dmol.\n\n    By default matching atoms will be annotated using colored spheres.\n\n    py3Dmol is an optional dependency, it can be installed with:\n        pip install py3Dmol\n\n    Parameters\n    ----------\n    mapping : LigandAtomMapping\n        The ligand transformation edge to visualize.\n    spheres : bool, optional\n        Whether or not to show matching atoms as spheres.\n    show_atomIDs: bool, optional\n        Whether or not to show atom ids in the mapping visualization\n    style : str, optional\n        Style in which to represent the molecules in py3Dmol.\n    shift : Tuple of floats, optional\n        Amount to shift molB by in order to visualize the two ligands.\n        If None, the default shift will be estimated as the largest\n        intraMol distance of both mols.\n\n    Returns\n    -------\n    view : py3Dmol.view\n        View of the system containing both molecules in the edge.\n    \"\"\"\n    warnings.warn(\n        \"view_mapping_3d is deprecated, please use the class method LigandAtomMapping.view_3d() instead.\",\n        DeprecationWarning,\n    )\n\n    if shift is None:\n        shift = np.array([_get_max_dist_in_x(mapping) * 1.5, 0, 0])\n    else:\n        shift = np.array(shift)\n\n    molA = mapping.componentA.to_rdkit()\n    molB = mapping.componentB.to_rdkit()\n\n    # 0 * shift is the centrepoint\n    # shift either side of the mapping +- a shift to clear the centre view\n    lmol = _translate(molA, -1 * shift)\n    rmol = _translate(molB, +1 * shift)\n\n    view = py3Dmol.view(width=600, height=600)\n    view.addModel(Chem.MolToMolBlock(lmol), \"molA\")\n    view.addModel(Chem.MolToMolBlock(rmol), \"molB\")\n\n    if spheres:\n        _add_spheres(view, lmol, rmol, mapping.componentA_to_componentB)\n\n    if show_atomIDs:\n        view.addPropertyLabels(\n            \"index\",\n            {\"not\": {\"resn\": [\"molA_overlay\", \"molA_overlay\"]}},\n            {\n                \"fontColor\": \"black\",\n                \"font\": \"sans-serif\",\n                \"fontSize\": \"10\",\n                \"showBackground\": \"false\",\n                \"alignment\": \"center\",\n            },\n        )\n\n    # middle fig\n    view.addModel(Chem.MolToMolBlock(molA), \"molA_overlay\")\n    view.addModel(Chem.MolToMolBlock(molB), \"molB_overlay\")\n\n    view.setStyle({style: {}})\n\n    view.zoomTo()\n    return view\n"
  },
  {
    "path": "src/openfecli/README.md",
    "content": "# Contributing CLI Subcommands\n\nAdding a new subcommand to the `openfe` CLI is pretty straightforward, but\nthere are some best practices that will make your contribution easier to\nmaintain.\n\n## How the CLI finds subcommands\n\nSubcommands are registered with the CLI based on the existence of an instance\nof `CommandPlugin` in modules located in particular directories or namespaces.\nThis means that after you create the command function, you need to wrap it in a\n`CommandPlugin`, which must be assigned to a variable name. The variable name\nitself is unimportant (I usually use `PLUGIN`). It's perfectly fine to include\nmore than one plugin in the same file, but the each must have a different\nvariable name.\n\nThe allowed locations for command plugins may change, but currently includes:\n\n* modules located in the namespace `openfecli.commands`\n\nWhen contributing to the core CLI, all you need to do is add your subcommand\nmodule to the `openfecli/commands/` directory, and the CLI should register it\nautomatically.\n\n## Best practices\n\n### The CLI should be a thin wrapper around the library\n\nThe intent of the CLI is to provide convenient ways of accomplishing things\nthat can also be accomplished with the core library. This means that CLI\ncommands should be thin wrappers that either just call a method from the core\nlibrary, or run a very simple workflow based on methods from the core library.\n\nIf you find that your CLI command starts to have some more complex logic, this\nprobably means that some of that logic would be beneficial to users of the\nlibrary as well. Consider moving that code into the core library.\n\nThis also implies that we can split any CLI subcommand into two stages:\n\n1. Convert from user input to objects that have meaning to the library.\n2. Run some code as if we were users of the library, with no reference to the\n   fact that the inputs came from the command line.\n\n### Divide the subcommand module into three components\n\nThe recommended way of structuring a subcommand module is to split it into\nthree parts (where `command` is replaced by the name of your subcommand):\n\n1. `command`: The command method, which is decorated by `@click.command`. The\n   purpose of this method is to convert user input to objects that can be used\n   by the core library. Then it calls the `command_main` method.\n2. `command_main`: The workflow method, which is written using code from the\n   underlying library, with no reference to the fact that this is part of the\n   CLI. This typically contains a very simple workflow script. Although the\n   output from this process is usually saved to some output file as part of the\n   script in `command_main`, the best practice is to also return the result of\n   this method. The `command` method will ignore this return value, but\n   returning it makes it so that the `command_main` method can be reused in\n   other CLI commands to create more complex workflows.\n3. `PLUGIN`: a `CommandPlugin` instance, which wraps the `command` object with\n   metadata about the subcommand, such as which help section to display it in,\n   and which versions of the library and CLI the plugin is compatible with.\n\nAs an example, here's a rough skeleton for a subcommand called `my_command`\n(imports excluded)\n\n```python\n@click.command(\"my_command\", short_help=\"This is my command\")\n...  # add decorators for arguments/options\ndef my_command(...):  # input params are based on arguments options\n    \"\"\"Docstring here is the help given by ``openfe my-command --help``\"\"\"\n    ...  # do whatever you need to convert the user input to library objects\n    my_command_main(...)  # takes library objects\n\ndef my_command_main(...):  # takes library objects\n    ...  # run some simple library code\n    return result\n\nPLUGIN = CommandPlugin(\n    command=my_command,\n    section=\"My Section\",\n    requires_lib=(1, 0),\n    requires_cli=(1, 0)\n)\n```\n\n### Use reusable subcommand arguments/options\n\nIn `click`, command-line arguments and options are declared by attaching\ndecorators for each option to a method. The method must then take parameters\nbased on the option name as specified by the decorator.\n\nBecause of this, it is straightforward to create an object associated with a\ngiven input option/argument, which contains details such as the help string and\neven a method to get a library object from the user input string.\n\nThe best practice is to create this object outside a given subcommand, and then\nreuse it between different subcommands. This ensures that the user sees\nconsistency in the interface and behavior between different CLI subcommands.\n\nDetails on how we'll do this in OpenFE are still being developed.\n\n### Delay slow imports\n\nUsually in Python, we put all imports at the top of a file. That is the best\npractice for libraries and scripts, because it makes it easy for a developer to\nfind dependencies, and helps prevent developers from repeating import\nstatements.\n\nHowever, when dealing with a CLI script like this, it's important to remember\nthat some user interactions, such as subcommand autocomplete or enquiring about the\nCLI with `--version` or `--help`, will also run any top-level imports. If\nimports are slow, then these user-facing interactions will be slow.\n\nBecause of this, the best practice when writing CLI subcommands is to move slow\nimports inside the method that needs them.\n\n### Testing your subcommand\n\nDividing the subcommand as recommended above facilitates testing. When testing\nthe `command` method itself, mock out the `command_main`, and use tools within\n`click` to mock the user command inputs. The purpose of testing the `command`\nmethod is to ensure that you correctly convert from user input to library object.\n\nThe purpose of testing the `command_main` method is to ensure that integration\nwith the library works. If this is truly a thin wrapper (and with the\nassumption that the core library is thoroughly tested), then a smoke test may\nbe sufficient for `command_main`.\n"
  },
  {
    "path": "src/openfecli/__init__.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\n\nfrom importlib.metadata import version\n\nfrom . import commands\nfrom .plugins import OFECommandPlugin\n\n__version__ = version(\"openfe\")\n"
  },
  {
    "path": "src/openfecli/cli.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\n\nimport logging.config\nimport pathlib\n\nimport click\nfrom plugcli.cli import CLI, CONTEXT_SETTINGS\nfrom plugcli.plugin_management import FilePluginLoader\n\nimport openfecli\nfrom openfecli.plugins import OFECommandPlugin\n\n\nclass OpenFECLI(CLI):\n    # COMMAND_SECTIONS = [\"Setup\", \"Simulation\", \"Orchestration\", \"Analysis\"]\n    COMMAND_SECTIONS = [\"Network Planning\", \"Quickrun Executor\", \"Miscellaneous\"]\n\n    def get_loaders(self):\n        commands = str(pathlib.Path(__file__).parent.resolve() / \"commands\")\n        loader = FilePluginLoader(commands, OFECommandPlugin)\n        return [loader]\n\n    def get_installed_plugins(self):\n        loader = self.get_loaders()[0]\n        return list(loader())\n\n\n_MAIN_HELP = \"\"\"\nA command line interface to provide access to basic\nfunctionality of the openfe Python library.\n\"\"\"\n\n\n@click.command(cls=OpenFECLI, name=\"openfe\", help=_MAIN_HELP, context_settings=CONTEXT_SETTINGS)\n@click.version_option(version=openfecli.__version__)\n@click.option(\n    \"--log\",\n    type=click.Path(exists=True, readable=True),\n    help=\"logging configuration file\",\n)\ndef main(log):\n    # Subcommand runs after this is processed.\n    # set logging if provided\n    if log:\n        logging.config.fileConfig(log, disable_existing_loggers=False)\n\n\nif __name__ == \"__main__\":  # -no-cov- (useful in debugging)\n    main()\n"
  },
  {
    "path": "src/openfecli/clicktypes/__init__.py",
    "content": "from .hyphenchoice import HyphenAwareChoice\n"
  },
  {
    "path": "src/openfecli/clicktypes/hyphenchoice.py",
    "content": "import click\n\n\ndef _normalize_to_hyphen(string):\n    return string.replace(\"_\", \"-\")\n\n\nclass HyphenAwareChoice(click.Choice):\n    def __init__(self, choices, case_sensitive=True):\n        choices = [_normalize_to_hyphen(choice) for choice in choices]\n        super().__init__(choices, case_sensitive)\n\n    def convert(self, value, param, ctx):\n        value = _normalize_to_hyphen(value)\n        return super().convert(value, param, ctx)\n"
  },
  {
    "path": "src/openfecli/commands/__init__.py",
    "content": ""
  },
  {
    "path": "src/openfecli/commands/atommapping.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\n\nimport click\n\nfrom openfecli import OFECommandPlugin\nfrom openfecli.parameters import MAPPER, MOL, OUTPUT_FILE_AND_EXT\n\n\ndef allow_two_molecules(ctx, param, value):\n    \"\"\"click callback to require that --mol is specified exactly twice\"\"\"\n    if len(value) != 2:\n        raise click.BadParameter(\"Must specify --mol exactly twice.\")\n    return value\n\n\n@click.command(\"atommapping\", short_help=\"Check the atom mapping of a given pair of ligands\")\n@MOL.parameter(\n    multiple=True,\n    callback=allow_two_molecules,\n    required=True,\n    help=MOL.kwargs[\"help\"] + \" Must be specified twice.\",\n)\n@MAPPER.parameter(required=True)\n@OUTPUT_FILE_AND_EXT.parameter(help=OUTPUT_FILE_AND_EXT.kwargs[\"help\"] + \" (PNG format)\")\ndef atommapping(mol, mapper, output):\n    \"\"\"\n    This provides tools for looking at a specific atommapping.\n    \"\"\"\n    # note that the text of the docstring will be the help when you run\n    # `openfe atommapping --help`.\n    molA_str, molB_str = mol\n    molA = MOL.get(molA_str)\n    molB = MOL.get(molB_str)\n    mapper_cls = MAPPER.get(mapper)\n    mapper_obj = mapper_cls()\n    file, ext = OUTPUT_FILE_AND_EXT.get(output)\n    if file:\n        atommapping_visualize_main(mapper_obj, molA, molB, file, ext)\n    else:\n        atommapping_print_dict_main(mapper_obj, molA, molB)\n\n\ndef generate_mapping(mapper, molA, molB):\n    \"\"\"Utility method to extract a single mapping from a mapper.\n\n    Parameters\n    ----------\n    mapper : :class:`.LigandAtomMapper`\n        the mapper to use to generate the mapping\n    molA, molB : :class:`.SmallMoleculeComponent`\n        molecules to map between\n\n    Returns\n    ------\n    :class:`.LigandAtomMapping` :\n        the mapping generated by the mapper; errors if there is not exactly\n        one mapping generated\n    \"\"\"\n    mappings = list(mapper.suggest_mappings(molA, molB))\n    if len(mappings) != 1:\n        raise click.UsageError(\n            f\"Found {len(mappings)} mappings; this command requires a mapper \"\n            \"to provide exactly 1 mapping\"\n        )\n    return mappings[0]\n\n\ndef atommapping_print_dict_main(mapper, molA, molB):\n    \"\"\"Main function for generating and printing out the mapping\"\"\"\n    mapping = generate_mapping(mapper, molA, molB)\n    print(mapping.componentA_to_componentB)\n\n\ndef atommapping_visualize_main(mapper, molA, molB, file, ext):\n    from gufe.visualization import mapping_visualization as vis\n    from rdkit.Chem import Draw\n\n    mapping = generate_mapping(mapper, molA, molB)\n    ext_to_artist = {\n        \"png\": Draw.rdMolDraw2D.MolDraw2DCairo(600, 300, 300, 300),\n    }\n    try:\n        artist = ext_to_artist[ext]\n    except KeyError:\n        raise click.BadParameter(\n            f\"Unknown file format: '{ext}'. The following formats are \"\n            \"supported: \" + \", \".join([f\"'{ext}'\" for ext in ext_to_artist])\n        )\n\n    contents = vis.draw_mapping(\n        mapping.componentA_to_componentB,\n        mapping.componentA.to_rdkit(),\n        mapping.componentB.to_rdkit(),\n        d2d=artist,\n    )\n\n    file.write(contents)\n\n\nPLUGIN = OFECommandPlugin(\n    command=atommapping,\n    section=\"hidden\",\n    requires_ofe=(0, 0, 1),\n)\n"
  },
  {
    "path": "src/openfecli/commands/fetch.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\n\n# MOVE SINGLEMODULEPLUGINLOADER UPSTREAM TO PLUGCLI\nimport importlib\nimport shutil\nimport urllib\n\nimport click\nfrom plugcli.cli import CLI, CONTEXT_SETTINGS\nfrom plugcli.plugin_management import CLIPluginLoader\n\nfrom openfecli import OFECommandPlugin\nfrom openfecli.fetching import FetchablePlugin\n\n\nclass SingleModulePluginLoader(CLIPluginLoader):\n    \"\"\"Load plugins from a specific module\"\"\"\n\n    def __init__(self, module_name, plugin_class):\n        super().__init__(\n            plugin_type=\"single_module\",\n            search_path=module_name,\n            plugin_class=plugin_class,\n        )\n\n    def _find_candidates(self):\n        return [importlib.import_module(self.search_path)]\n\n    @staticmethod\n    def _make_nsdict(candidate):\n        return vars(candidate)\n\n\nclass FetchCLI(CLI):\n    \"\"\"Custom command class for the Fetch subcommand.\n\n    This provides the command sections used in help and defines where\n    plugins should be kept.\n    \"\"\"\n\n    COMMAND_SECTIONS = [\"Tutorials\"]\n\n    def get_loaders(self):\n        return [SingleModulePluginLoader(\"openfecli.fetchables\", FetchablePlugin)]\n\n    def get_installed_plugins(self):\n        loader = self.get_loaders()[0]\n        return list(loader())\n\n\n@click.command(cls=FetchCLI, short_help=\"Fetch tutorial or other resource.\")\ndef fetch():\n    \"\"\"\n    Fetch the given resource. Some resources require internet; others are\n    built-in.\n    \"\"\"\n\n\nPLUGIN = OFECommandPlugin(\n    command=fetch,\n    section=\"Miscellaneous\",\n    requires_ofe=(0, 7),\n)\n\nif __name__ == \"__main__\":\n    # it's useful to keep a main here for debugging where problems happen in\n    # the command tree\n    fetch()\n"
  },
  {
    "path": "src/openfecli/commands/gather.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\n\nimport os\nimport pathlib\nimport sys\nfrom typing import List, Literal\n\nimport click\nimport pandas as pd\n\nfrom openfecli import OFECommandPlugin\nfrom openfecli.clicktypes import HyphenAwareChoice\n\nFAIL_STR = \"Error\"  # string used to indicate a failed run in output tables.\n\n\ndef _get_column(val: float | int) -> int:\n    \"\"\"Determine the index (where the 0th index is the decimal) at which the\n    first non-zero value occurs in a full-precision string representation of a value.\n\n    Parameters\n    ----------\n    val : float|int\n        The raw value.\n\n    Returns\n    -------\n    int\n        Column index\n    \"\"\"\n    import numpy as np\n\n    if val == 0:\n        return 0\n\n    log10 = np.log10(val)\n\n    if log10 >= 0.0:\n        col = np.floor(log10 + 1)\n    else:\n        col = np.floor(log10)\n    return int(col)\n\n\ndef format_estimate_uncertainty(\n    est: float,\n    unc: float,\n    unc_prec: int = 1,\n) -> tuple[str, str]:\n    \"\"\"\n    Round raw estimate and uncertainty values to the appropriate precision.\n\n    The premise here is that, if you're reporting your uncertainty to a certain number of significant figures, your estimate should be reported to the same precision.\n\n    As an example, assume your raw estimate is 12.34567 and your raw uncertainty is 0.0123.\n    Say you want to report your uncertainty to 2 significant figures.\n    So your rounded uncertainty is 0.012.\n    You should report your estimate to the same precision, so your rounded estimate should be 12.346.\n    On the other hand, if you wanted to report your uncertainty to the first significant figure (0.01), then you should report your estimate as 12.35.\n\n    You need to report these to the same precision (not the same number of significant figures) because the two numbers need to be added together.\n    If you report both to 2 significant figures, you'd have 12.0 +/- 0.0012, and your actual estimate falls way outside your error bars!\n    It has to be the uncertainty that determines the precision of the estimate, because if you said you had 3 significant figures in the estimate and used that to set the precision of the uncertainty, you'd have 12.3 +/- 0.0 -- no error at all!\n\n    We implement this by thinking of the decimal representation as \"columns\" centered on the decimal point.\n    We get the column index of the first non-zero number in the decimal representation of the uncertainty, and use the fact that ``np.round`` rounds to the number of decimal places you give it to report the estimate.\n    The uncertainty is rounded to the desired number of significant figures.\n\n    Parameters\n    ----------\n    est : float\n        Raw estimate value.\n    unc : float\n        Raw uncertainty value.\n    unc_prec : int, optional\n        Precision, by default 1\n\n    Returns\n    -------\n    tuple[str, str]\n        The truncated raw and uncertainty values.\n    \"\"\"\n\n    import numpy as np\n\n    # get the last column needed for uncertainty\n    unc_col = _get_column(unc) - (unc_prec - 1)\n\n    if unc_col < 0:\n        est_str = f\"{est:.{-unc_col}f}\"\n        unc_str = f\"{unc:.{-unc_col}f}\"\n    else:\n        est_str = f\"{np.round(est, -unc_col + 1)}\"\n        unc_str = f\"{np.round(unc, -unc_col + 1)}\"\n\n    return est_str, unc_str\n\n\ndef format_df_with_precision(\n    df: pd.DataFrame, est_col_name: str, unc_col_name: str, unc_prec: int = 1\n) -> pd.DataFrame:\n    \"\"\"\n    Returns a new DataFrame with the columns `est_col_name` and `unc_col_name` formatted as strings reported to `unc_prec` precision.\n\n    The uncertainty column will be rounded to `unc_prec` precision, then the estimate column will be reported to the same precision.\n    Any entries that are not floats (such as strings indicating errors), will not be modified.\n\n    Parameters\n    ----------\n    df : pd.DataFrame\n        DataFrame to format\n    est_col_name : str\n        Name of the column containing estimates to format.\n    unc_col_name : str\n        Name of the column containing uncertainties to format.\n\n    unc_prec : int, optional\n        Precision to round the uncertainty column to, by default 1.\n\n    Returns\n    -------\n    pd.DataFrame\n        DataFrame with formatted uncertainty and estimate columns.\n\n    Example\n    -------\n    >>> df\n            ligand_i    ligand_j DDG(i->j) (kcal/mol) uncertainty (kcal/mol)\n        0  lig_ejm_31  lig_ejm_42                Error                  Error\n        1  lig_ejm_31  lig_ejm_46            -0.891077               0.064825\n        2  lig_ejm_31  lig_ejm_47             0.023341               0.145625\n        3  lig_ejm_31  lig_ejm_48             0.614103               0.088704\n        4  lig_ejm_31  lig_ejm_50             0.999904               0.044457\n        5  lig_ejm_42  lig_ejm_43             1.354348               0.156009\n        6  lig_ejm_46  lig_jmc_23             0.294761               0.086632\n        7  lig_ejm_46  lig_jmc_27            -0.101737               0.100997\n        8  lig_ejm_46  lig_jmc_28                Error                  Error\n    >>> df_out = format_df_with_precision(df, \"DDG(i->j) (kcal/mol)\", \"uncertainty (kcal/mol)\")\n    >>> df_formatted\n            ligand_i    ligand_j DDG(i->j) (kcal/mol) uncertainty (kcal/mol)\n        0  lig_ejm_31  lig_ejm_42                Error                  Error\n        1  lig_ejm_31  lig_ejm_46                -0.89                   0.06\n        2  lig_ejm_31  lig_ejm_47                  0.0                    0.1\n        3  lig_ejm_31  lig_ejm_48                 0.61                   0.09\n        4  lig_ejm_31  lig_ejm_50                 1.00                   0.04\n        5  lig_ejm_42  lig_ejm_43                  1.4                    0.2\n        6  lig_ejm_46  lig_jmc_23                 0.29                   0.09\n        7  lig_ejm_46  lig_jmc_27                 -0.1                    0.1\n        8  lig_ejm_46  lig_jmc_28                Error                  Error\n\n    \"\"\"\n\n    # find all entries in both columns that contain strings:\n    df_is_string = df[[est_col_name, unc_col_name]].map(lambda x: isinstance(x, str))\n\n    # if either the estimate or uncertainty entries are strings, dont format\n    no_strings_mask = ~(df_is_string[est_col_name] | df_is_string[unc_col_name])\n\n    # skip rows that contain striangs and only round and format numerical vals\n    df_floats_formatted = df[no_strings_mask].apply(\n        lambda row: format_estimate_uncertainty(row[est_col_name], row[unc_col_name], unc_prec),\n        axis=1,\n        result_type=\"expand\",\n    )\n\n    # explicitly cast to string to make pandas happy\n    df[[est_col_name, unc_col_name]] = df[[est_col_name, unc_col_name]].astype(str)\n\n    # if there are no floats, assigning an empty array will break things\n    if df_floats_formatted.empty:\n        pass\n    else:\n        df.loc[no_strings_mask, [est_col_name, unc_col_name]] = df_floats_formatted.values\n\n    return df\n\n\ndef is_results_json(fpath: os.PathLike | str) -> bool:\n    \"\"\"Sanity check that file is a result json before we try to deserialize\"\"\"\n    return \"estimate\" in open(fpath, \"r\").read(20)\n\n\ndef load_json(fpath: os.PathLike | str) -> dict:\n    \"\"\"Load a JSON file containing a gufe object.\n\n    Parameters\n    ----------\n    fpath : os.PathLike | str\n        The path to a gufe-serialized JSON.\n\n\n    Returns\n    -------\n    dict\n        A dict containing data from the results JSON.\n\n    \"\"\"\n    # TODO: move this function to openfe/utils\n    import json\n\n    from gufe.tokenization import JSON_HANDLER\n\n    return json.load(open(fpath, \"r\"), cls=JSON_HANDLER.decoder)\n\n\ndef _get_names(result: dict) -> tuple[str, str]:\n    \"\"\"Get the ligand names from a unit's results data.\n\n    Parameters\n    ----------\n    result : dict\n        A results dict.\n\n    Returns\n    -------\n    tuple[str, str]\n        Ligand names corresponding to the results.\n    \"\"\"\n\n    # TODO: I don't like this [0][0] indexing, but I can't think of a better way currently\n    protocol_data = list(result[\"protocol_result\"][\"data\"].values())[0][0]\n    try:\n        name_A = protocol_data[\"inputs\"][\"setup_results\"][\"inputs\"][\"ligandmapping\"][\"componentA\"][\n            \"molprops\"\n        ][\"ofe-name\"]\n        name_B = protocol_data[\"inputs\"][\"setup_results\"][\"inputs\"][\"ligandmapping\"][\"componentB\"][\n            \"molprops\"\n        ][\"ofe-name\"]\n    except KeyError:\n        name_A = protocol_data[\"inputs\"][\"ligandmapping\"][\"componentA\"][\"molprops\"][\"ofe-name\"]\n        name_B = protocol_data[\"inputs\"][\"ligandmapping\"][\"componentB\"][\"molprops\"][\"ofe-name\"]\n\n    return str(name_A), str(name_B)\n\n\ndef _get_type(result: dict) -> Literal[\"vacuum\", \"solvent\", \"complex\"]:\n    \"\"\"Determine the simulation type based on the component types.\"\"\"\n\n    protocol_data = list(result[\"protocol_result\"][\"data\"].values())[0][0]\n    try:\n        component_types = [\n            x[\"__module__\"]\n            for x in protocol_data[\"inputs\"][\"setup_results\"][\"inputs\"][\"stateA\"][\n                \"components\"\n            ].values()\n        ]\n    except KeyError:\n        component_types = [\n            x[\"__module__\"] for x in protocol_data[\"inputs\"][\"stateA\"][\"components\"].values()\n        ]\n    if (\n        \"gufe.components.proteincomponent\" in component_types\n        or \"gufe.components.solvatedpdbcomponent\" in component_types\n        or \"gufe.components.proteinmembranecomponent\" in component_types\n    ):\n        return \"complex\"\n\n    elif \"gufe.components.solventcomponent\" in component_types:\n        return \"solvent\"\n\n    else:\n        return \"vacuum\"\n\n\ndef _legacy_get_type(res_fn: os.PathLike | str) -> Literal[\"vacuum\", \"solvent\", \"complex\"]:\n    # TODO: Deprecate this when we no longer rely on key names in `_get_type()`\n\n    if \"solvent\" in res_fn:\n        return \"solvent\"\n    elif \"vacuum\" in res_fn:\n        return \"vacuum\"\n    # TODO: if there is no identifier in the filename, do we really want to assume it's a complex?\n    else:\n        return \"complex\"\n\n\ndef _get_result_id(\n    result: dict, result_fn: os.PathLike | str\n) -> tuple[tuple[str, str], Literal[\"vacuum\", \"solvent\", \"complex\"]]:\n    \"\"\"Extract the name and simulation type from a results dict.\n\n    Parameters\n    ----------\n    result : dict\n        A result object\n    result_fn : os.PathLike | str\n        The path to deserialized results, only used if unable to extract from results dict.\n\n    Returns\n    -------\n    tuple\n        Identifying information (ligand names and simulation type) for the given results data.\n    \"\"\"\n    ligA, ligB = _get_names(result)\n\n    try:\n        simtype = _get_type(result)\n    except KeyError:\n        simtype = _legacy_get_type(result_fn)  # TODO: remove this and result_fn in 2.0\n\n    return (ligA, ligB), simtype\n\n\ndef _load_valid_result_json(fpath: os.PathLike | str) -> tuple[tuple | None, dict | None]:\n    \"\"\"Load the data from a results JSON into a dict.\n\n    Parameters\n    ----------\n    fpath : os.PathLike | str\n        The path to deserialized results.\n\n    Returns\n    -------\n    dict | None\n        A dict containing data from the results JSON,\n        or None if the JSON file is invalid or missing.\n\n    \"\"\"\n\n    # TODO: only load this once during collection, then pass namedtuple(fname, dict) into this function\n    # for now though, it's not the bottleneck on performance\n    result = load_json(fpath)\n    try:\n        result_id = _get_result_id(result, fpath)\n    except (ValueError, IndexError):\n        click.secho(f\"{fpath}: Missing ligand names and/or simulation type. Skipping.\",err=True, fg=\"yellow\")  # fmt: skip\n        return None, None\n    if result[\"estimate\"] is None:\n        click.secho(f\"{fpath}: No 'estimate' found, assuming to be a failed simulation.\",err=True, fg=\"yellow\")  # fmt: skip\n        return result_id, None\n    if result[\"uncertainty\"] is None:\n        click.secho(f\"{fpath}: No 'uncertainty' found, assuming to be a failed simulation.\",err=True, fg=\"yellow\")  # fmt: skip\n        return result_id, None\n    if result[\"unit_results\"] == {}:\n        click.secho(f\"{fpath}: No 'unit_results' found, assuming to be a failed simulation.\",err=True, fg=\"yellow\")  # fmt: skip\n        return result_id, None\n    if all(\"exception\" in u for u in result[\"unit_results\"].values()):\n        click.secho(f\"{fpath}: Exception found in all 'unit_results', assuming to be a failed simulation.\",err=True, fg=\"yellow\")  # fmt: skip\n        return result_id, None\n\n    return result_id, result\n\n\ndef _generate_bad_legs_error_message(bad_legs: list[tuple[set[str], tuple[str]]]) -> str:\n    \"\"\"Format output describing RBFE or RHFE legs that are missing runs.\n\n    Parameters\n    ----------\n    bad_legs : list[set[str], tuple[str]]]\n        A list of tuples of (leg_types, ligpair) pairs from failed edges/legs.\n\n    Returns\n    -------\n    str\n        An error message containing information on all failed legs.\n    \"\"\"\n    msg = (\n        \"\\nSome edge(s) are missing runs!\\n\"\n        \"The following edges were found but are missing one or more run types \"\n        \"('solvent', 'complex', or 'vacuum') to complete the calculation:\\n\\n\"\n        \"ligand_i\\tligand_j\\trun_type_found\\n\"\n    )\n    # TODO: format this better\n    for ligA, ligB, leg_types in bad_legs:\n        msg += f\"{ligA}\\t{ligB}\\t{','.join(leg_types)}\\n\"\n\n    return msg\n\n\ndef _get_ddgs(legs: dict, allow_partial=False) -> pd.DataFrame:\n    import numpy as np\n\n    from openfe.protocols.openmm_rfe.equil_rfe_methods import (\n        RelativeHybridTopologyProtocolResult as rfe_result,\n    )\n\n    # TODO: if there's a failed edge but other valid results in a leg, ddgs will be computed\n    # only fails if there are no valid results\n    DDGs = []\n    bad_legs = []\n    for ligpair, vals in sorted(legs.items()):\n        leg_types = set(vals)\n        # drop any leg types that have no values (these are failed runs)\n        valid_leg_types = {k for k in vals if vals[k]}\n\n        DDGbind = None\n        DDGhyd = None\n        bind_unc = None\n        hyd_unc = None\n\n        do_rbfe = len(valid_leg_types & {\"complex\", \"solvent\"}) == 2\n        do_rhfe = len(valid_leg_types & {\"vacuum\", \"solvent\"}) == 2\n\n        if do_rbfe:\n            DG1_mag = rfe_result.compute_mean_estimate(vals[\"complex\"])\n            DG1_unc = rfe_result.compute_uncertainty(vals[\"complex\"])\n            DG2_mag = rfe_result.compute_mean_estimate(vals[\"solvent\"])\n            DG2_unc = rfe_result.compute_uncertainty(vals[\"solvent\"])\n            if not ((DG1_mag is None) or (DG2_mag is None)):\n                # DDG(2,1)bind = DG(1->2)complex - DG(1->2)solvent\n                DDGbind = (DG1_mag - DG2_mag).m\n                bind_unc = np.sqrt(np.sum(np.square([DG1_unc.m, DG2_unc.m])))\n\n        if do_rhfe:\n            DG1_mag = rfe_result.compute_mean_estimate(vals[\"solvent\"])\n            DG1_unc = rfe_result.compute_uncertainty(vals[\"solvent\"])\n            DG2_mag = rfe_result.compute_mean_estimate(vals[\"vacuum\"])\n            DG2_unc = rfe_result.compute_uncertainty(vals[\"vacuum\"])\n            if not ((DG1_mag is None) or (DG2_mag is None)):\n                DDGhyd = (DG1_mag - DG2_mag).m\n                hyd_unc = np.sqrt(np.sum(np.square([DG1_unc.m, DG2_unc.m])))\n\n        if not do_rbfe and not do_rhfe:\n            bad_legs.append((*ligpair, leg_types))\n            DDGs.append((*ligpair, None, None, None, None))\n        else:\n            DDGs.append((*ligpair, DDGbind, bind_unc, DDGhyd, hyd_unc))\n\n    if bad_legs:\n        err_msg = _generate_bad_legs_error_message(bad_legs)\n        if allow_partial:\n            click.secho(err_msg, err=True, fg=\"yellow\")\n        else:\n            err_msg += (\n                \"\\nYou can force partial gathering of results, without \"\n                \"problematic edges, by using the --allow-partial flag of the gather \"\n                \"command.\\nNOTE: This may cause problems with predicting \"\n                \"absolute free energies from the relative free energies.\"\n            )\n            click.secho(err_msg, err=True, fg=\"red\")\n            sys.exit(1)\n    df_ddg = pd.DataFrame(\n        DDGs,\n        columns=[\"ligand_i\", \"ligand_j\", \"DDG_bind\", \"bind_unc\", \"DDG_hyd\", \"hyd_unc\"],\n    )\n    return df_ddg\n\n\ndef _generate_ddg(legs: dict, allow_partial: bool) -> pd.DataFrame:\n    \"\"\"Compute and write out DDG values for the given legs.\n\n    Parameters\n    ----------\n    legs : dict\n        Dict of legs to write out.\n    allow_partial : bool\n        If ``True``, no error will be thrown for incomplete or invalid results,\n        and DDGs will be reported for whatever valid results are found.\n    \"\"\"\n    DDGs = _get_ddgs(legs, allow_partial=allow_partial)\n    data = []\n    for _, row in DDGs.iterrows():\n        ligA, ligB, DDGbind, bind_unc, DDGhyd, hyd_unc = row.to_list()\n        if not pd.isna(DDGbind):\n            data.append((ligA, ligB, DDGbind, bind_unc))\n        if not pd.isna(DDGhyd):\n            data.append((ligA, ligB, DDGhyd, hyd_unc))\n        elif pd.isna(DDGbind) and pd.isna(DDGhyd):\n            data.append((ligA, ligB, FAIL_STR, FAIL_STR))\n    df = pd.DataFrame(\n        data,\n        columns=[\"ligand_i\", \"ligand_j\", \"DDG(i->j) (kcal/mol)\", \"uncertainty (kcal/mol)\"],\n    )\n    df_out = format_df_with_precision(df, \"DDG(i->j) (kcal/mol)\", \"uncertainty (kcal/mol)\")\n    return df_out\n\n\ndef _generate_raw(legs: dict, allow_partial=True) -> pd.DataFrame:\n    \"\"\"\n    Write out all legs found and their DG values, or indicate that they have failed.\n\n    Parameters\n    ----------\n    legs : dict\n        Dict of legs to write out.\n    allow_partial : bool, optional\n        Unused for this function, since all results will be included.\n    \"\"\"\n    data = []\n    for ligpair, results in sorted(legs.items()):\n        for simtype, repeats in sorted(results.items()):\n            for repeat in repeats:\n                for m, u in repeat:\n                    if m is None:\n                        m, u = FAIL_STR, FAIL_STR\n                    else:\n                        m, u = (m.m, u.m)\n                    data.append((simtype, ligpair[0], ligpair[1], m, u))\n\n    df = pd.DataFrame(\n        data,\n        columns=[\n            \"leg\",\n            \"ligand_i\",\n            \"ligand_j\",\n            \"DG(i->j) (kcal/mol)\",\n            \"MBAR uncertainty (kcal/mol)\",\n        ],\n    )\n    df_out = format_df_with_precision(df, \"DG(i->j) (kcal/mol)\", \"MBAR uncertainty (kcal/mol)\")\n\n    return df_out\n\n\ndef _check_legs_have_sufficient_repeats(legs):\n    \"\"\"Throw an error if all legs do not have 2 or more simulation repeat results\"\"\"\n\n    for leg in legs.values():\n        for run_type, sim_results in leg.items():\n            if len(sim_results) < 2:\n                msg = \"ERROR: Every edge must have at least two simulation repeats\"\n                click.secho(msg, err=True, fg=\"red\")\n                sys.exit(1)\n\n\ndef _generate_dg_mle(legs: dict, allow_partial: bool) -> pd.DataFrame:\n    \"\"\"Compute and write out DG values for the given legs.\n\n    Parameters\n    ----------\n    legs : dict\n        Dict of legs to write out.\n    allow_partial : bool\n        If ``True``, no error will be thrown for incomplete or invalid results,\n        and DGs will be reported for whatever valid results are found.\n    \"\"\"\n    import networkx as nx\n    import numpy as np\n    from cinnabar.stats import mle\n\n    _check_legs_have_sufficient_repeats(legs)\n\n    DDGs = _get_ddgs(legs, allow_partial=allow_partial)\n    MLEs = []\n    expected_ligs = []\n\n    # perform MLE\n    g = nx.DiGraph()\n    nm_to_idx = {}\n    DDGbind_count = 0\n    for _, row in DDGs.iterrows():\n        ligA, ligB, DDGbind, bind_unc, _, _ = row.to_list()\n        for lig in (ligA, ligB):\n            if lig not in expected_ligs:\n                expected_ligs.append(lig)\n\n        if pd.isna(DDGbind) or DDGbind == FAIL_STR:\n            continue\n        DDGbind_count += 1\n\n        # tl;dr this is super paranoid, but safer for now:\n        # cinnabar seems to rely on the ordering of values within the graph\n        # to correspond to the matrix that comes out from mle()\n        # internally they also convert the ligand names to ints, which I think\n        # has a side effect of giving the graph nodes a predictable order.\n        # fwiw this code didn't affect ordering locally\n        try:\n            idA = nm_to_idx[ligA]\n        except KeyError:\n            idA = len(nm_to_idx)\n            nm_to_idx[ligA] = idA\n        try:\n            idB = nm_to_idx[ligB]\n        except KeyError:\n            idB = len(nm_to_idx)\n            nm_to_idx[ligB] = idB\n\n        g.add_edge(idA, idB, calc_DDG=DDGbind, calc_dDDG=bind_unc)\n\n    if DDGbind_count > 2:\n        if not nx.is_weakly_connected(g):\n            # TODO: dump the network for debugging?\n            # TODO: use largest connected component when possible\n            msg = (\n                \"ERROR: The results network is disconnected due to failed or missing edges.\\n\"\n                \"Absolute free energies cannot be calculated in a disconnected network.\\n\"\n                \"Please either connect the network by addressing failed runs or adding edges.\\n\"\n                \"You can still compute relative free energies using the ``--report=ddg`` flag.\"\n            )\n            click.secho(msg, err=True, fg=\"red\")\n            sys.exit(1)\n        idx_to_nm = {v: k for k, v in nm_to_idx.items()}\n        f_i, df_i = mle(g, factor=\"calc_DDG\")\n        df_i = np.diagonal(df_i) ** 0.5\n\n        for node, f, df in zip(g.nodes, f_i, df_i):\n            ligname = idx_to_nm[node]\n            MLEs.append((ligname, f, df))\n    else:\n        click.secho(\n            f\"The results network has {DDGbind_count} edge(s), but 3 or more edges are required to calculate DG values.\",\n            err=True,\n            fg=\"red\",\n        )\n        sys.exit(1)\n\n    data = []\n    for ligA, DG, unc_DG in MLEs:\n        data.append({\"ligand\": ligA, \"DG(MLE) (kcal/mol)\": DG, \"uncertainty (kcal/mol)\": unc_DG})\n        expected_ligs.remove(ligA)\n\n    for ligA in expected_ligs:\n        data.append({\"ligand\": ligA, \"DG(MLE) (kcal/mol)\": FAIL_STR, \"uncertainty (kcal/mol)\": FAIL_STR})  # fmt: skip\n\n    df = pd.DataFrame(data)\n    df_out = format_df_with_precision(df, \"DG(MLE) (kcal/mol)\", \"uncertainty (kcal/mol)\")\n\n    return df_out\n\n\ndef _collect_result_jsons(results: List[os.PathLike | str]) -> List[pathlib.Path]:\n    \"\"\"Recursively collects all results JSONs from the paths in ``results``,\n    which can include directories and/or filepaths.\n    \"\"\"\n    import glob\n\n    def collect_jsons(results: List[os.PathLike]):\n        all_jsons = []\n        for p in results:\n            if str(p).endswith(\"json\"):\n                all_jsons.append(p)\n            elif p.is_dir():\n                all_jsons.extend(glob.glob(f\"{p}/**/*json\", recursive=True))\n\n        return all_jsons\n\n    def is_results_json(fpath: os.PathLike | str) -> bool:\n        \"\"\"Sanity check that file is a result json before we try to deserialize\"\"\"\n        return \"estimate\" in open(fpath, \"r\").read(20)\n\n    results = sorted(results)  # ensures reproducible output order regardless of input order\n\n    # 1) find all possible jsons\n    json_fns = collect_jsons(results)\n    # 2) filter only result jsons\n    result_fns = list(filter(is_results_json, json_fns))\n    return result_fns\n\n\ndef _get_legs_from_result_jsons(\n    result_fns: list[pathlib.Path], report: Literal[\"dg\", \"ddg\", \"raw\"]\n) -> dict[tuple[str, str], dict[str, list]]:\n    \"\"\"\n    Iterate over a list of result JSONs and populate a dict of dicts with all data needed\n    for results processing.\n\n\n    Parameters\n    ----------\n    result_fns : list[pathlib.Path]\n        List of filepaths containing results formatted as JSON.\n    report : Literal[\"dg\", \"ddg\", \"raw\"]\n        Type of report to generate.\n\n    Returns\n    -------\n    legs: dict[tuple[str,str],dict[str, list]]\n        Data extracted from the given result JSONs, organized by the leg's ligand names and simulation type.\n    \"\"\"\n    from collections import defaultdict\n\n    legs = defaultdict(lambda: defaultdict(list))\n\n    with click.progressbar(\n        result_fns,\n        label=\"Loading results:\",\n        fill_char=\"▇\",\n        empty_char=\" \",\n        bar_template=\"%(label)s  %(bar)s  %(info)s files\",\n        length=len(result_fns),\n        show_percent=False,\n        show_pos=True,\n        show_eta=False,\n    ) as bar:\n        for result_fn in bar:\n            result_info, result = _load_valid_result_json(result_fn)\n\n            if result_info is None:  # this means it couldn't find names and/or simtype\n                continue\n            names, simtype = result_info\n            if report.lower() == \"raw\":\n                if result is None:\n                    parsed_raw_data = [(None, None)]\n                else:\n                    parsed_raw_data = [\n                        (\n                            v[0][\"outputs\"][\"unit_estimate\"],\n                            v[0][\"outputs\"][\"unit_estimate_error\"],\n                        )\n                        for v in result[\"protocol_result\"][\"data\"].values()\n                    ]\n                legs[names][simtype].append(parsed_raw_data)\n            else:\n                if result is None:\n                    # we want the dict name/simtype entry to exist for error reporting, even if there's no valid data\n                    dGs = []\n                else:\n                    dGs = [\n                        v[0][\"outputs\"][\"unit_estimate\"]\n                        for v in result[\"protocol_result\"][\"data\"].values()\n                    ]\n                legs[names][simtype].extend(dGs)\n    return legs\n\n\ndef rich_print_to_stdout(df: pd.DataFrame) -> None:\n    \"\"\"Use rich to pretty print a table to stdout.\"\"\"\n\n    from rich import box\n    from rich.console import Console\n    from rich.table import Table\n\n    table = Table(box=box.SQUARE)\n\n    for col in df.columns:\n        table.add_column(col)\n\n    for row_values in df.values:\n        row = [str(val) for val in row_values]\n        table.add_row(*row)\n\n    console = Console()\n    console.print(table)\n\n\n@click.command(\n    \"gather\",\n    short_help=\"Gather result JSONs for network of RBFE results into a TSV file.\",\n)\n@click.argument(\n    \"results\",\n    nargs=-1,  # accept any number of results\n    type=click.Path(dir_okay=True, file_okay=True, path_type=pathlib.Path),\n    required=True,\n)\n@click.option(\n    \"--report\",\n    type=HyphenAwareChoice([\"dg\", \"ddg\", \"raw\"], case_sensitive=False),\n    default=\"dg\",\n    show_default=True,\n    help=(\n        \"What data to report. 'dg' gives maximum-likelihood estimate of \"\n        \"absolute deltaG, 'ddg' gives delta-delta-G, and 'raw' gives \"\n        \"the raw result of the deltaG for a leg.\"\n    ),\n)\n@click.option(\n    \"output\",\n    \"-o\",\n    type=click.File(mode=\"w\"),\n    default=\"-\",\n    help=\"Filepath at which to write the tsv report.\",\n)\n@click.option(\n    \"--tsv\",\n    is_flag=True,\n    default=False,\n    help=(\n        \"Results that are output to stdout will be formatted as tab-separated, \"\n        \"identical to the formatting used when writing to file.\"\n        \"By default, the output table will be formatted for human-readability.\"\n    ),\n)\n@click.option(\n    \"--allow-partial\",\n    is_flag=True,\n    default=False,\n    help=(\n        \"Do not raise errors if results are missing parts for some edges. \"\n        \"(Skip those edges and issue warning instead.)\"\n    ),\n)\ndef gather(\n    results: List[os.PathLike | str],\n    output: os.PathLike | str,\n    report: Literal[\"dg\", \"ddg\", \"raw\"],\n    tsv: bool,\n    allow_partial: bool,\n):\n    \"\"\"Gather simulation result JSON files from RBFE simulations and generate a report.\n\n    RESULTS is the path(s) to JSON files or directories of JSON files containing RBFE protocol results as generated by ``openfe quickrun``.\n\n    All directories will be walked recursively and any valid JSON results files will be gathered.\n    Files must end in .json to be collected, and invalid files will be ignored.\n\n    The results reported depends on ``--report`` flag:\n\n    \\b\n    * ``--report=dg`` (default) reports the ligand, its absolute free energy, and\n      the associated uncertainty as the maximum likelihood estimate obtained\n      from DDG replica averages and standard deviations.  These MLE estimates\n      are centred around 0.0, and when plotted can be shifted to match\n      experimental values.\n    * ``--report=ddg`` reports pairs of ligand_i and ligand_j, the calculated\n      relative free energy DDG(i->j) = DG(j) - DG(i) and its uncertainty.\n    * ``--report=raw`` reports the raw results, which each repeat simulation given\n      separately (i.e. no combining of redundant simulations is performed)\n\n    The output is a table of **tab** separated values. By default, this\n    outputs to stdout, use the -o option to specify an output filepath.\n    \"\"\"\n    # find and filter result jsons\n    result_fns = _collect_result_jsons(results)\n\n    # pair legs of simulations together into dict of dicts\n    legs = _get_legs_from_result_jsons(result_fns, report)\n\n    if legs == {}:\n        click.secho(\"No results JSON files found.\", err=True)\n        sys.exit(1)\n\n    # compute report\n    report_func = {\n        \"dg\": _generate_dg_mle,\n        \"ddg\": _generate_ddg,\n        \"raw\": _generate_raw,\n    }[report.lower()]\n    df = report_func(legs, allow_partial)\n\n    # write output\n    is_output_file = isinstance(output, click.utils.LazyFile)\n    if is_output_file:\n        click.echo(f\"writing {report} output to '{output.name}'\")\n    if is_output_file or tsv:\n        df.to_csv(output, sep=\"\\t\", lineterminator=\"\\n\", index=False)\n\n    # TODO: we can add a --pretty flag if we want this to be optional/preserve backwards compatibility\n    else:\n        rich_print_to_stdout(df)\n\n\nPLUGIN = OFECommandPlugin(\n    command=gather,\n    section=\"Quickrun Executor\",\n    requires_ofe=(0, 6),\n)\n\nif __name__ == \"__main__\":\n    gather()\n"
  },
  {
    "path": "src/openfecli/commands/gather_abfe.py",
    "content": "import os\nimport pathlib\nimport sys\nfrom typing import List, Literal\n\nimport click\nimport numpy as np\nimport pandas as pd\n\nfrom openfecli import OFECommandPlugin\nfrom openfecli.clicktypes import HyphenAwareChoice\nfrom openfecli.commands.gather import (\n    _collect_result_jsons,\n    format_df_with_precision,\n    load_json,\n    rich_print_to_stdout,\n)\n\n\ndef _get_name(result: dict) -> str:\n    \"\"\"Get the ligand name from a unit's results data.\n\n    Parameters\n    ----------\n    result : dict\n        A results dict.\n\n    Returns\n    -------\n    str\n        Ligand name corresponding to the results.\n    \"\"\"\n\n    solvent_data = list(result[\"protocol_result\"][\"data\"][\"solvent\"].values())[0][0]\n    try:\n        name = solvent_data[\"inputs\"][\"setup_results\"][\"inputs\"][\"alchemical_components\"][\"stateA\"][\n            0\n        ][\"molprops\"][\"ofe-name\"]\n    except KeyError:\n        name = solvent_data[\"inputs\"][\"alchemical_components\"][\"stateA\"][0][\"molprops\"][\"ofe-name\"]\n\n    return str(name)\n\n\ndef _load_valid_result_json(fpath: os.PathLike | str) -> tuple[tuple | None, dict | None]:\n    \"\"\"Load the data from a results JSON into a dict.\n\n    Parameters\n    ----------\n    fpath : os.PathLike | str\n        The path to deserialized results.\n\n    Returns\n    -------\n    dict | None\n        A dict containing data from the results JSON,\n        or None if the JSON file is invalid or missing.\n\n    Raises\n    ------\n    ValueError\n      If the JSON file contains an ``estimate`` or ``uncertainty`` key with the\n      value ``None``.\n      If\n    \"\"\"\n    # TODO: replace this with gather's _load_valid_result\n\n    # TODO: only load this once during collection, then pass namedtuple(fname, dict) into this function\n    # for now though, it's not the bottleneck on performance\n    result = load_json(fpath)\n    try:\n        names = _get_name(result)\n    except (ValueError, IndexError):\n        click.secho(f\"{fpath}: Missing ligand names and/or simulation type. Skipping.\",err=True, fg=\"yellow\")  # fmt: skip\n        return None, None\n    if result[\"estimate\"] is None:\n        click.secho(f\"{fpath}: No 'estimate' found, assuming to be a failed simulation.\",err=True, fg=\"yellow\")  # fmt: skip\n        return names, None\n    if result[\"uncertainty\"] is None:\n        click.secho(f\"{fpath}: No 'uncertainty' found, assuming to be a failed simulation.\",err=True, fg=\"yellow\")  # fmt: skip\n        return names, None\n    if all(\"exception\" in u for u in result[\"unit_results\"].values()):\n        click.secho(f\"{fpath}: Exception found in all 'unit_results', assuming to be a failed simulation.\",err=True, fg=\"yellow\")  # fmt: skip\n        return names, None\n    return names, result\n\n\ndef _get_legs_from_result_jsons(\n    result_fns: list[pathlib.Path],\n) -> dict[str, dict[str, list]]:\n    \"\"\"\n    Iterate over a list of result JSONs and populate a dict of dicts with all data needed\n    for results processing.\n\n\n    Parameters\n    ----------\n    result_fns : list[pathlib.Path]\n        List of filepaths containing results formatted as JSON.\n    report : Literal[\"dg\", \"raw\"]\n        Type of report to generate.\n\n    Returns\n    -------\n    legs: dict[str, dict[str, list]]\n        Data extracted from the given result JSONs, organized by the leg's ligand name and simulation type.\n    \"\"\"\n    from collections import defaultdict\n\n    from openff.units import unit\n\n    dgs = defaultdict(lambda: defaultdict(list))\n\n    for result_fn in result_fns:\n        name, result = _load_valid_result_json(result_fn)\n        if name is None:  # this means it couldn't find name and/or simtype\n            continue\n\n        dgs[name][\"overall\"].append([result[\"estimate\"], result[\"uncertainty\"]])\n        proto_key = [k for k in result[\"unit_results\"].keys() if k.startswith(\"ProtocolUnitResult\")]\n        for p in proto_key:\n            # In openfe v1.9+, we only want to pick up results from\n            # the Analysis Unit. To ensure backwards compatibility with\n            # prior releases of openfe v1.x, we exclude Setup and Simulation\n            if (\n                \"Setup\" in result[\"unit_results\"][p][\"source_key\"]\n                or \"Simulation\" in result[\"unit_results\"][p][\"source_key\"]\n            ):\n                continue\n            if \"unit_estimate\" in result[\"unit_results\"][p][\"outputs\"]:\n                simtype = result[\"unit_results\"][p][\"outputs\"][\"simtype\"]\n                dg = result[\"unit_results\"][p][\"outputs\"][\"unit_estimate\"]\n                dg_error = result[\"unit_results\"][p][\"outputs\"][\"unit_estimate_error\"]\n\n                dgs[name][simtype].append([dg, dg_error])\n            if \"standard_state_correction\" in result[\"unit_results\"][p][\"outputs\"]:\n                corr = result[\"unit_results\"][p][\"outputs\"][\"standard_state_correction\"]\n                # In openfe v1.9+, standard state corrections are set to 0 kcal/mol\n                # when no correction is being applied (e.g. no restraints).\n                # To make raw outputs similar to pre-v1.9, we exclude corrections\n                # if they are close to 0.\n                if not np.isclose(corr.m, 0):\n                    dgs[name][\"standard_state_correction\"].append(\n                        [corr, 0 * unit.kilocalorie_per_mole]\n                    )\n            else:\n                continue\n    return dgs\n\n\ndef _error_std(r):\n    \"\"\"\n    Calculate the error of the estimate as the std of the repeats\n    \"\"\"\n    return np.std([v[0].m for v in r[\"overall\"]])\n\n\ndef _error_mbar(r):\n    \"\"\"\n    Calculate the error of the estimate using the reported MBAR errors.\n\n    This also takes into account that repeats may have been run for this edge by using the average MBAR error\n    \"\"\"\n    complex_errors = np.array([x[1].m for x in r[\"complex\"]])\n    solvent_errors = np.array([x[1].m for x in r[\"solvent\"]])\n    return np.sqrt(np.mean(complex_errors**2) + np.mean(solvent_errors**2))\n\n\ndef _generate_dg(results_dict: dict[str, dict[str, list]], allow_partial: bool) -> pd.DataFrame:\n    \"\"\"Compute and write out DG values for the given results.\n\n    Parameters\n    ----------\n    results_dict : dict[str, dict[str, list]]\n        Dictionary of results created by ``_get_legs_from_result_jsons``.\n\n    Returns\n    -------\n    pd.DataFrame\n        A pandas DataFrame with the dG results for each ligand.\n    \"\"\"\n\n    # check the type of error which should be used based on the number of repeats\n    n_repeats = {len(v[\"overall\"]) for v in results_dict.values()}\n\n    if 1 in n_repeats:\n        error_func = _error_mbar\n        unc_col_name = \"MBAR uncertainty (kcal/mol)\"\n    else:\n        error_func = _error_std\n        unc_col_name = \"std dev uncertainty (kcal/mol)\"\n\n    data = []\n    for lig, results in sorted(results_dict.items()):\n        dg = np.mean([v[0].m for v in results[\"overall\"]])\n        error = error_func(results)\n        data.append((lig, dg, error))\n\n    df = pd.DataFrame(\n        data,\n        columns=[\n            \"ligand\",\n            \"DG (kcal/mol)\",\n            unc_col_name,\n        ],\n    )\n    df_out = format_df_with_precision(df, \"DG (kcal/mol)\", unc_col_name, unc_prec=2)\n    return df_out\n\n\ndef _generate_dg_raw(results_dict: dict[str, dict[str, list]], allow_partial: bool) -> pd.DataFrame:\n    \"\"\"\n    Get all the transformation cycle legs found and their DG values.\n\n    Parameters\n    ----------\n    results_dict : dict[str, dict[str, list]]\n        Dictionary of results created by ``_get_legs_from_result_jsons``.\n\n    Returns\n    -------\n    pd.DataFrame\n        A pandas DataFrame with the individual cycle leg dG results.\n    \"\"\"\n    data = []\n    for lig, results in sorted(results_dict.items()):\n        for simtype, repeats in sorted(results.items()):\n            if simtype != \"overall\":\n                for repeat in repeats:\n                    measurement, uncertainty = (repeat[0].m, repeat[1].m)\n                    data.append((simtype, lig, measurement, uncertainty))\n\n    df = pd.DataFrame(\n        data,\n        columns=[\n            \"leg\",\n            \"ligand\",\n            \"DG (kcal/mol)\",\n            \"MBAR uncertainty (kcal/mol)\",\n        ],\n    )\n    df_out = format_df_with_precision(\n        df, \"DG (kcal/mol)\", \"MBAR uncertainty (kcal/mol)\", unc_prec=2\n    )\n    return df_out\n\n\n@click.command(\n    \"gather-abfe\", short_help=\"Gather result JSONs for network of ABFE results into a TSV file.\"\n)\n@click.argument(\n    \"results\",\n    nargs=-1,  # accept any number of results\n    type=click.Path(dir_okay=True, file_okay=True, path_type=pathlib.Path),\n    required=True,\n)\n@click.option(\n    \"--report\",\n    type=HyphenAwareChoice([\"dg\", \"raw\"], case_sensitive=False),\n    default=\"dg\",\n    show_default=True,\n    help=(\n        \"What data to report. 'dg' computes the overall binding free energy of each ligand in the dataset (dG), and\"\n        \"'raw' outputs the raw dG values for each individual leg in the ABFE transformation cycles.\"\n    ),\n)\n@click.option(\n    \"output\",\n    \"-o\",\n    type=click.File(mode=\"w\"),\n    default=\"-\",\n    help=\"Filepath at which to write the tsv report.\",\n)\n@click.option(\n    \"--tsv\",\n    is_flag=True,\n    default=False,\n    help=(\n        \"Results that are output to stdout will be formatted as tab-separated, \"\n        \"identical to the formatting used when writing to file.\"\n        \"By default, the output table will be formatted for human-readability.\"\n    ),\n)\n@click.option(\n    \"--allow-partial\",\n    is_flag=True,\n    default=False,\n    help=(\n        \"Do not raise errors if results are missing parts for some edges. \"\n        \"(Skip those edges and issue warning instead.)\"\n    ),\n)\ndef gather_abfe(\n    results: List[os.PathLike | str],\n    output: os.PathLike | str,\n    report: Literal[\"dg\", \"raw\"],\n    tsv: bool,\n    allow_partial: bool,\n):\n    \"\"\"\n    .. warning::\n\n        Gathering of ABFE results with ``openfe gather-abfe`` is an experimental feature\n        and is subject to change in a future release of openfe!\n\n    Gather simulation result JSON files from ABFE simulations and generate a report.\n\n    RESULTS is the path(s) to JSON files or directories of JSON files containing ABFE protocol results as generated by ``openfe quickrun``.\n\n    All directories will be walked recursively and any valid JSON results files will be gathered.\n    Files must end in .json to be collected, and invalid files will be ignored.\n\n    Each JSON contains the results of a separate leg from an Absolute Binding Free Energy calculation.\n    See https://docs.openfree.energy/en/latest/tutorials/abfe_tutorial.html for details on running ABFE calculations.\n\n    The results reported depends on the ``--report`` flag:\n\n    \\b\n    * ``--report=dg`` (default) reports the ligand, its absolute free energy, and\n      the associated uncertainty obtained from DG replica averages and\n      standard deviations.\n    * ``--report=raw`` reports the raw results, which each repeat simulation given\n      separately (i.e. no combining of redundant simulations is performed)\n\n    The output is a table of **tab** separated values. By default, this\n    outputs to stdout, use the -o option to specify an output filepath.\n    \"\"\"\n    msg = \"WARNING! Gathering of ABFE results with `openfe gather-abfe` is an experimental feature and is subject to change in a future release of openfe.\"\n    click.secho(msg, err=True, fg=\"yellow\")  # fmt: skip\n\n    # find and filter result jsons\n    result_fns = _collect_result_jsons(results)\n\n    # pair legs of simulations together into dict of dicts\n    legs = _get_legs_from_result_jsons(result_fns)\n\n    if legs == {}:\n        click.secho(\"No results JSON files found.\", err=True)\n        sys.exit(1)\n\n    # compute report\n    report_func = {\n        \"dg\": _generate_dg,\n        \"raw\": _generate_dg_raw,\n    }[report.lower()]\n    df = report_func(legs, allow_partial)\n\n    # write output\n    is_output_file = isinstance(output, click.utils.LazyFile)\n    if is_output_file:\n        click.echo(f\"writing {report} output to '{output.name}'\")\n    if is_output_file or tsv:\n        df.to_csv(output, sep=\"\\t\", lineterminator=\"\\n\", index=False)\n\n    # TODO: we can add a --pretty flag if we want this to be optional/preserve backwards compatibility\n    else:\n        rich_print_to_stdout(df)\n\n\nPLUGIN = OFECommandPlugin(\n    command=gather_abfe,\n    section=\"Quickrun Executor\",\n    requires_ofe=(0, 6),\n)\n"
  },
  {
    "path": "src/openfecli/commands/gather_septop.py",
    "content": "import os\nimport pathlib\nimport sys\nfrom typing import List, Literal\n\nimport click\nimport numpy as np\nimport pandas as pd\n\nfrom openfecli import OFECommandPlugin\nfrom openfecli.clicktypes import HyphenAwareChoice\nfrom openfecli.commands.gather import (\n    _collect_result_jsons,\n    format_df_with_precision,\n    load_json,\n    rich_print_to_stdout,\n)\n\n\ndef _load_valid_result_json(fpath: os.PathLike | str) -> tuple[tuple | None, dict | None]:\n    \"\"\"Load the data from a results JSON into a dict.\n\n    Parameters\n    ----------\n    fpath : os.PathLike | str\n        The path to deserialized results.\n\n    Returns\n    -------\n    dict | None\n        A dict containing data from the results JSON,\n        or None if the JSON file is invalid or missing.\n\n    Raises\n    ------\n    ValueError\n      If the JSON file contains an ``estimate`` or ``uncertainty`` key with the\n      value ``None``.\n      If\n    \"\"\"\n    # TODO: replace this with gather's _load_valid_result\n\n    # TODO: only load this once during collection, then pass namedtuple(fname, dict) into this function\n    # for now though, it's not the bottleneck on performance\n    result = load_json(fpath)\n    try:\n        names = _get_names(result)\n    except (ValueError, IndexError):\n        click.secho(f\"{fpath}: Missing ligand names and/or simulation type. Skipping.\",err=True, fg=\"yellow\")  # fmt: skip\n        return None, None\n    if result[\"estimate\"] is None:\n        click.secho(f\"{fpath}: No 'estimate' found, assuming to be a failed simulation.\",err=True, fg=\"yellow\")  # fmt: skip\n        return names, None\n    if result[\"uncertainty\"] is None:\n        click.secho(f\"{fpath}: No 'uncertainty' found, assuming to be a failed simulation.\",err=True, fg=\"yellow\")  # fmt: skip\n        return names, None\n    if all(\"exception\" in u for u in result[\"unit_results\"].values()):\n        click.secho(f\"{fpath}: Exception found in all 'unit_results', assuming to be a failed simulation.\",err=True, fg=\"yellow\")  # fmt: skip\n        return names, None\n    return names, result\n\n\ndef _get_legs_from_result_jsons(\n    result_fns: list[pathlib.Path],\n) -> dict[str, dict[str, list]]:\n    \"\"\"\n    Iterate over a list of result JSONs and populate a dict of dicts with all data needed\n    for results processing.\n\n\n    Parameters\n    ----------\n    result_fns : list[pathlib.Path]\n        List of filepaths containing results formatted as JSON.\n    report : Literal[\"dg\", \"ddg\", \"raw\"]\n        Type of report to generate.\n\n    Returns\n    -------\n    legs: dict[str, dict[str, list]]\n        Data extracted from the given result JSONs, organized by the leg's ligand names and simulation type.\n    \"\"\"\n    from collections import defaultdict\n\n    from openff.units import unit\n\n    ddgs = defaultdict(lambda: defaultdict(list))\n\n    for result_fn in result_fns:\n        names, result = _load_valid_result_json(result_fn)\n        if names is None:  # this means it couldn't find names and/or simtype\n            continue\n\n        ddgs[names][\"overall\"].append([result[\"estimate\"], result[\"uncertainty\"]])\n        proto_key = [\n            k\n            for k in result[\"unit_results\"].keys()\n            if k.startswith(\"ProtocolUnitResult\")\n        ]  # fmt: skip\n\n        # In openfe v1.11+, we only want to pick up results from\n        # the Analysis Unit. To ensure backwards compatibility,\n        # we check if there are any analysis units. If so,\n        # we set a flag and later exclude Setup and Run.\n        has_analysis_units = any(\n            [\"Analysis\" in result[\"unit_results\"][p][\"source_key\"] for p in proto_key]\n        )\n\n        for p in proto_key:\n            # Skip non-analysis units if we have any\n            if has_analysis_units and (\n                \"Setup\" in result[\"unit_results\"][p][\"source_key\"]\n                or \"Run\" in result[\"unit_results\"][p][\"source_key\"]\n            ):\n                continue\n\n            if \"unit_estimate\" in result[\"unit_results\"][p][\"outputs\"]:\n                simtype = result[\"unit_results\"][p][\"outputs\"][\"simtype\"]\n                dg = result[\"unit_results\"][p][\"outputs\"][\"unit_estimate\"]\n                dg_error = result[\"unit_results\"][p][\"outputs\"][\"unit_estimate_error\"]\n\n                ddgs[names][simtype].append([dg, dg_error])\n\n            if \"standard_state_correction_A\" in result[\"unit_results\"][p][\"outputs\"]:\n                corr_A = result[\"unit_results\"][p][\"outputs\"][\"standard_state_correction_A\"]\n                corr_B = result[\"unit_results\"][p][\"outputs\"][\"standard_state_correction_B\"]\n                ddgs[names][\"standard_state_correction_A\"].append(\n                    [corr_A, 0 * unit.kilocalorie_per_mole]\n                )\n                ddgs[names][\"standard_state_correction_B\"].append(\n                    [corr_B, 0 * unit.kilocalorie_per_mole]\n                )\n\n    return ddgs\n\n\ndef _get_names(result: dict) -> tuple[str, str]:\n    \"\"\"Get the ligand names from a unit's results data.\n\n    Parameters\n    ----------\n    result : dict\n        A results dict.\n\n    Returns\n    -------\n    tuple[str, str]\n        Ligand names corresponding to the results.\n    \"\"\"\n\n    solvent_data = list(result[\"protocol_result\"][\"data\"][\"solvent\"].values())[0][0]\n\n    try:\n        setup_data = solvent_data[\"inputs\"][\"setup\"][\"inputs\"]\n    except KeyError:\n        setup_data = solvent_data[\"inputs\"]\n\n    name_A = setup_data[\"alchemical_components\"][\"stateA\"][0][\"molprops\"][\"ofe-name\"]\n    name_B = setup_data[\"alchemical_components\"][\"stateB\"][0][\"molprops\"][\"ofe-name\"]\n\n    return str(name_A), str(name_B)\n\n\ndef _error_std(r):\n    \"\"\"\n    Calculate the error of the estimate as the std of the repeats\n    \"\"\"\n    return np.std([v[0].m for v in r[\"overall\"]])\n\n\ndef _error_mbar(r):\n    \"\"\"\n    Calculate the error of the estimate using the reported MBAR errors.\n\n    This also takes into account that repeats may have been run for this edge by using the average MBAR error\n    \"\"\"\n    complex_errors = np.array([x[1].m for x in r[\"complex\"]])\n    solvent_errors = np.array([x[1].m for x in r[\"solvent\"]])\n    return np.sqrt(np.mean(complex_errors**2) + np.mean(solvent_errors**2))\n\n\ndef _get_ddgs(\n    results_dict: dict[str, dict[str, list]], allow_partial: bool = False\n) -> pd.DataFrame:\n    \"\"\"Compute and write out DDG values for the given results.\n\n    Parameters\n    ----------\n    results_dict : dict[str, dict[str, list]]\n        Dictionary of results created by ``_get_legs_from_result_jsons``.\n\n    Returns\n    -------\n    pd.DataFrame\n        A pandas DataFrame with the ddG results for each ligand pair.\n    \"\"\"\n\n    # check the type of error which should be used based on the number of repeats\n    n_repeats = {len(v[\"overall\"]) for v in results_dict.values()}\n\n    if 1 in n_repeats:\n        error_func = _error_mbar\n        unc_col_name = \"MBAR uncertainty (kcal/mol)\"\n    else:\n        error_func = _error_std\n        unc_col_name = \"std dev uncertainty (kcal/mol)\"\n\n    data = []\n    for ligpair, results in sorted(results_dict.items()):\n        ddg = np.mean([v[0].m for v in results[\"overall\"]])\n        error = error_func(results)\n        data.append((ligpair[0], ligpair[1], ddg, error))\n    df = pd.DataFrame(\n        data,\n        columns=[\n            \"ligand_i\",\n            \"ligand_j\",\n            \"DDG(i->j) (kcal/mol)\",\n            unc_col_name,\n        ],\n    )\n\n    return df\n\n\ndef _infer_unc_col_name(df: pd.DataFrame) -> str:\n    \"\"\"Return the full name of the first column name in df containing \"uncertainty\".\"\"\"\n\n    unc_col_name = df.filter(regex=\"uncertainty\").columns[0]\n    return unc_col_name\n\n\ndef _generate_ddg(results_dict, allow_partial: bool = False) -> pd.DataFrame:\n    df_ddgs = _get_ddgs(results_dict)\n    unc_col_name = _infer_unc_col_name(df_ddgs)\n\n    df_out = format_df_with_precision(df_ddgs, \"DDG(i->j) (kcal/mol)\", unc_col_name, unc_prec=2)\n    return df_out\n\n\ndef _generate_dg_mle(\n    results_dict: dict[str, dict[str, list]], allow_partial: bool = False\n) -> pd.DataFrame:\n    \"\"\"Compute and write out MLE-derived DG values for the given results.\n\n    Parameters\n    ----------\n    results_dict : dict[str, dict[str, list]]\n        Dictionary of results created by ``_get_legs_from_result_jsons``.\n\n    Returns\n    -------\n    pd.DataFrame\n        A pandas DataFrame with the dG results for each ligand pair.\n    \"\"\"\n    from cinnabar import FEMap, Measurement\n    from openff.units import unit\n\n    DDGs = _get_ddgs(results_dict)\n\n    fe_results = []\n    for inx, row in DDGs.iterrows():\n        ligA, ligB, DDGbind, bind_unc = row.tolist()\n        m = Measurement(\n            labelA=ligA,\n            labelB=ligB,\n            DG=DDGbind * unit.kilocalorie_per_mole,\n            uncertainty=bind_unc * unit.kilocalorie_per_mole,\n            computational=True,\n        )\n        fe_results.append(m)\n\n    # Feed into the FEMap object\n    femap = FEMap()\n\n    for entry in fe_results:\n        femap.add_measurement(entry)\n\n    femap.generate_absolute_values()\n\n    df = femap.get_absolute_dataframe()\n    df = df.iloc[:, :3]\n    unc_col_name = _infer_unc_col_name(DDGs)\n    df.rename(\n        {\"label\": \"ligand\", \"uncertainty (kcal/mol)\": unc_col_name}, axis=\"columns\", inplace=True\n    )\n    df_out = format_df_with_precision(df, \"DG (kcal/mol)\", unc_col_name, unc_prec=2)\n    return df_out\n\n\ndef _generate_raw(\n    results_dict: dict[str, dict[str, list]], allow_partial: bool = True\n) -> pd.DataFrame:\n    \"\"\"\n    Get all the transformation cycle legs found and their DG values.\n\n    Parameters\n    ----------\n    results_dict : dict[str, dict[str, list]]\n        Dictionary of results created by ``_get_legs_from_result_jsons``.\n\n    Returns\n    -------\n    pd.DataFrame\n        A pandas DataFrame with the individual cycle leg dG results.\n    \"\"\"\n    data = []\n    for ligpair, results in sorted(results_dict.items()):\n        for simtype, repeats in sorted(results.items()):\n            if simtype != \"overall\":\n                for repeat in repeats:\n                    m, u = (repeat[0].m, repeat[1].m)\n                    data.append((simtype, ligpair[0], ligpair[1], m, u))\n\n    df = pd.DataFrame(\n        data,\n        columns=[\n            \"leg\",\n            \"ligand_i\",\n            \"ligand_j\",\n            \"DG(i->j) (kcal/mol)\",\n            \"MBAR uncertainty (kcal/mol)\",\n        ],\n    )\n    df_out = format_df_with_precision(\n        df, \"DG(i->j) (kcal/mol)\", \"MBAR uncertainty (kcal/mol)\", unc_prec=2\n    )\n\n    return df_out\n\n\n@click.command(\n    \"gather-septop\",\n    short_help=\"Gather result JSONs for a network of SepTop results into a TSV file.\",\n)\n@click.argument(\n    \"results\",\n    nargs=-1,  # accept any number of results\n    type=click.Path(dir_okay=True, file_okay=True, path_type=pathlib.Path),\n    required=True,\n)\n@click.option(\n    \"--report\",\n    type=HyphenAwareChoice([\"dg\", \"ddg\", \"raw\"], case_sensitive=False),\n    default=\"dg\",\n    show_default=True,\n    help=(\n        \"What data to report. 'dg' gives the maximum-likelihood estimate derived \"\n        \"absolute deltaG value,  'ddg' gives delta-delta-G, and 'raw' gives \"\n        \"the raw result of the deltaG for a leg.\"\n    ),\n)\n@click.option(\n    \"output\",\n    \"-o\",\n    type=click.File(mode=\"w\"),\n    default=\"-\",\n    help=\"Filepath at which to write the tsv report.\",\n)\n@click.option(\n    \"--tsv\",\n    is_flag=True,\n    default=False,\n    help=(\n        \"Results that are output to stdout will be formatted as tab-separated, \"\n        \"identical to the formatting used when writing to file.\"\n        \"By default, the output table will be formatted for human-readability.\"\n    ),\n)\n@click.option(\n    \"--allow-partial\",\n    is_flag=True,\n    default=False,\n    help=(\n        \"Do not raise errors if results are missing parts for some edges. \"\n        \"(Skip those edges and issue warning instead.)\"\n    ),\n)\ndef gather_septop(\n    results: List[os.PathLike | str],\n    output: os.PathLike | str,\n    report: Literal[\"dg\", \"ddg\", \"raw\"],\n    tsv: bool,\n    allow_partial: bool,\n):\n    \"\"\"\n    .. warning::\n\n        Gathering of SepTop results with ``openfe gather-septop`` is an experimental feature\n        and is subject to change in a future release of openfe!\n\n    Gather simulation result JSON files from SepTop simulations and generate a report.\n\n    RESULTS is the path(s) to JSON files or directories of JSON files containing SepTop protocol results as generated by ``openfe quickrun``.\n\n    All directories will be walked recursively and any valid JSON results files will be gathered.\n    Files must end in .json to be collected, and invalid files will be ignored.\n\n    Each JSON contains the results of a separate leg from a Separated Topologies calculation.\n    See https://docs.openfree.energy/en/latest/tutorials/septop_tutorial.html for details on running SepTop calculations.\n\n    The results reported depends on ``--report`` flag:\n\n    \\b\n    * ``--report=dg`` (default) reports the ligand, its absolute free energy, and\n      the associated uncertainty as the maximum likelihood estimate obtained\n      from DDG replica averages and standard deviations.  These MLE estimates\n      are centred around 0.0, and when plotted can be shifted to match\n      experimental values.\n    * ``--report=ddg`` reports pairs of ligand_i and ligand_j, the calculated\n      relative free energy DDG(i->j) = DG(j) - DG(i) and its uncertainty.\n    * ``--report=raw`` reports the raw results, which each repeat simulation given\n      separately (i.e. no combining of redundant simulations is performed)\n\n    The output is a table of **tab** separated values. By default, this\n    outputs to stdout, use the -o option to specify an output filepath.\n    \"\"\"\n\n    msg = \"WARNING! Gathering of SepTop results with `openfe gather-septop` is an experimental feature and is subject to change in a future release of openfe.\"\n    click.secho(msg, err=True, fg=\"yellow\")  # fmt: skip\n    # find and filter result jsons\n    result_fns = _collect_result_jsons(results)\n\n    # pair legs of simulations together into dict of dicts\n    legs = _get_legs_from_result_jsons(result_fns)\n\n    if legs == {}:\n        click.secho(\"No results JSON files found.\", err=True)\n        sys.exit(1)\n\n    # compute report\n    report_func = {\n        \"dg\": _generate_dg_mle,\n        \"ddg\": _generate_ddg,\n        \"raw\": _generate_raw,\n    }[report.lower()]\n    df = report_func(legs, allow_partial)\n\n    # write output\n    is_output_file = isinstance(output, click.utils.LazyFile)\n    if is_output_file:\n        click.echo(f\"writing {report} output to '{output.name}'\")\n    if is_output_file or tsv:\n        df.to_csv(output, sep=\"\\t\", lineterminator=\"\\n\", index=False)\n\n    # TODO: we can add a --pretty flag if we want this to be optional/preserve backwards compatibility\n    else:\n        rich_print_to_stdout(df)\n\n\nPLUGIN = OFECommandPlugin(\n    command=gather_septop,\n    section=\"Quickrun Executor\",\n    requires_ofe=(0, 6),\n)\n"
  },
  {
    "path": "src/openfecli/commands/generate_partial_charges.py",
    "content": "import pathlib\n\nimport click\n\nfrom openfecli import OFECommandPlugin\nfrom openfecli.parameters import MOL_DIR, NCORES, OUTPUT_FILE_AND_EXT, OVERWRITE, YAML_OPTIONS\n\nYAML_HELP = \"\"\"\nPath to a YAML file specifying the method to use to charge the molecules\n(any atom mapper or network generation options will be ignored).\n\nSupported partial charge method choices are:\n    - ``am1bcc``\n    - ``am1bccelf10`` (only possible if ``off_toolkit_backend`` is ``openeye``)\n    - ``nagl`` (must have openff-nagl installed)\n    - ``espaloma`` (must have espaloma_charge installed)\n\n``settings`` allows for passing in any keyword arguments of the method's corresponding Python API.\n\nFor example:\n::\n\n  partial_charge:\n    method: am1bcc\n    settings:\n      off_toolkit_backend: ambertools\n\n\"\"\"\n\n\n@click.command(\"charge-molecules\", short_help=\"Generate partial charges for a set of molecules.\")\n@MOL_DIR.parameter(required=True, help=MOL_DIR.kwargs[\"help\"] + \" Any number of sdf paths.\")\n@YAML_OPTIONS.parameter(multiple=False, required=False, default=None, help=YAML_HELP)\n@OUTPUT_FILE_AND_EXT.parameter(\n    help=\"The name of the SDF file the charged ligands should be written to.\",\n    required=True,\n    type=click.Path(exists=False, path_type=pathlib.Path),\n)\n@NCORES.parameter(help=NCORES.kwargs[\"help\"], default=1)\n@OVERWRITE.parameter(help=OVERWRITE.kwargs[\"help\"], default=OVERWRITE.kwargs[\"default\"], is_flag=True)  # fmt: skip\ndef charge_molecules(molecules, yaml_settings, output, n_cores, overwrite_charges):\n    \"\"\"\n    Generate partial charges for the set of input molecules and write them to file.\n    \"\"\"\n    from openfecli.utils import write\n\n    if output.exists():\n        raise FileExistsError(\n            f\"The output file {output} already exists, choose a new file to write the charged ligands to\"\n        )\n\n    write(\"SMALL MOLECULE PARTIAL CHARGE GENERATOR\")\n    write(\"_________________________________________\")\n    write(\"\")\n\n    from openfe.protocols.openmm_utils.charge_generation import bulk_assign_partial_charges\n\n    write(\"Parsing in Files: \")\n\n    # INPUT\n    write(\"\\tGot input: \")\n\n    small_molecules = MOL_DIR.get(molecules)\n    write(\"\\t\\tSmall Molecules: \" + \" \".join([str(sm) for sm in small_molecules]))\n\n    yaml_options = YAML_OPTIONS.get(yaml_settings)\n    partial_charge = yaml_options.partial_charge\n\n    write(\"Using Options:\")\n    write(\"\\tPartial Charge Generation: \" + str(partial_charge.partial_charge_method))\n    if overwrite_charges:\n        write(\"\\tOverwriting partial charges\")\n    write(\"\")\n\n    charged_molecules = bulk_assign_partial_charges(\n        molecules=small_molecules,\n        overwrite=overwrite_charges,\n        method=partial_charge.partial_charge_method,\n        toolkit_backend=partial_charge.off_toolkit_backend,\n        generate_n_conformers=partial_charge.number_of_conformers,\n        nagl_model=partial_charge.nagl_model,\n        processors=n_cores,\n    )\n\n    write(\"\\tDone\")\n    write(\"\")\n\n    # OUTPUT\n    write(\"Output:\")\n    write(f\"\\tSaving to: {output}\")\n\n    with output.open(mode=\"w\") as output:\n        for mol in charged_molecules:\n            output.write(mol.to_sdf())\n\n\nPLUGIN = OFECommandPlugin(command=charge_molecules, section=\"Miscellaneous\", requires_ofe=(0, 3))\n"
  },
  {
    "path": "src/openfecli/commands/plan_rbfe_network.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\n\nimport click\n\nfrom openfecli import OFECommandPlugin\nfrom openfecli.parameters import (\n    COFACTORS,\n    MOL_DIR,\n    N_PROTOCOL_REPEATS,\n    NCORES,\n    OUTPUT_DIR,\n    OVERWRITE,\n    PROTEIN,\n    PROTEIN_MEMBRANE,\n    YAML_OPTIONS,\n)\nfrom openfecli.utils import print_duration, write\n\n\ndef plan_rbfe_network_main(\n    mapper,\n    mapping_scorer,\n    ligand_network_planner,\n    small_molecules,\n    solvent,\n    protein,\n    cofactors,\n    n_protocol_repeats,\n    partial_charge_settings,\n    processors,\n    overwrite_charges,\n):\n    \"\"\"Utility method to plan a relative binding free energy network.\n\n    Parameters\n    ----------\n    mapper : list[LigandAtomMapper]\n        list of mappers to use to generate the mapping\n    mapping_scorer : Callable\n        scorer, that evaluates the generated mappings\n    ligand_network_planner : Callable\n        function building the network from the ligands, mappers and mapping_scorer\n    small_molecules : Iterable[SmallMoleculeComponent]\n        ligands of the system\n    solvent : SolventComponent\n        Solvent component used for solvation\n    protein : ProteinComponent\n        ProteinComponent for complex simulations, to which the ligands are bound.\n    cofactors : Iterable[SmallMoleculeComponent]\n        any cofactors alongside the protein, can be empty list\n    n_protocol_repeats: int\n        number of completely independent repeats of the entire sampling process\n        any cofactors alongside the protein, can be empty list\n    partial_charge_settings : OpenFFPartialChargeSettings\n        how to assign partial charges to the input ligands\n        (if they don't already have partial charges).\n    processors: int\n        The number of processors that should be used when generating the charges\n    overwrite_charges: bool\n        If any partial charges already present on the small molecules should be overwritten\n\n    Returns\n    -------\n    Tuple[AlchemicalNetwork, LigandNetwork]\n        Alchemical network with protocol for executing simulations, and the\n        associated ligand network\n    \"\"\"\n\n    from openfe.protocols.openmm_utils.charge_generation import bulk_assign_partial_charges\n    from openfe.setup.alchemical_network_planner.relative_alchemical_network_planner import (\n        RBFEAlchemicalNetworkPlanner,\n        RelativeHybridTopologyProtocol,\n    )\n\n    protocol_settings = RelativeHybridTopologyProtocol.default_settings()\n    protocol_settings.protocol_repeats = n_protocol_repeats\n    protocol = RelativeHybridTopologyProtocol(protocol_settings)\n\n    write(\"assigning ligand partial charges -- this may be slow\")\n\n    charged_small_molecules = bulk_assign_partial_charges(\n        molecules=small_molecules,\n        overwrite=overwrite_charges,\n        method=partial_charge_settings.partial_charge_method,\n        toolkit_backend=partial_charge_settings.off_toolkit_backend,\n        generate_n_conformers=partial_charge_settings.number_of_conformers,\n        nagl_model=partial_charge_settings.nagl_model,\n        processors=processors,\n    )\n\n    if cofactors:\n        write(\"assigning cofactor partial charges -- this may be slow\")\n\n        cofactors = bulk_assign_partial_charges(\n            molecules=cofactors,\n            overwrite=overwrite_charges,\n            method=partial_charge_settings.partial_charge_method,\n            toolkit_backend=partial_charge_settings.off_toolkit_backend,\n            generate_n_conformers=partial_charge_settings.number_of_conformers,\n            nagl_model=partial_charge_settings.nagl_model,\n            processors=processors,\n        )\n\n    network_planner = RBFEAlchemicalNetworkPlanner(\n        mappers=mapper,\n        mapping_scorer=mapping_scorer,\n        ligand_network_planner=ligand_network_planner,\n        protocol=protocol,\n    )\n    alchemical_network = network_planner(\n        ligands=charged_small_molecules,\n        solvent=solvent,\n        protein=protein,\n        cofactors=cofactors,\n    )\n    return alchemical_network, network_planner._ligand_network\n\n\n@click.command(\n    \"plan-rbfe-network\",\n    short_help=(\n        \"Plan a relative binding free energy network, saved as JSON files for the quickrun command.\"\n    ),\n)\n@MOL_DIR.parameter(required=True, help=MOL_DIR.kwargs[\"help\"] + \" Any number of sdf paths.\")\n@PROTEIN.parameter(multiple=False, required=False, default=None, help=PROTEIN.kwargs[\"help\"])\n@PROTEIN_MEMBRANE.parameter(\n    multiple=False, required=False, default=None, help=PROTEIN_MEMBRANE.kwargs[\"help\"]\n)\n@COFACTORS.parameter(multiple=True, required=False, default=None, help=COFACTORS.kwargs[\"help\"])\n@YAML_OPTIONS.parameter(multiple=False, required=False, default=None, help=YAML_OPTIONS.kwargs[\"help\"])  # fmt: skip\n@OUTPUT_DIR.parameter(help=OUTPUT_DIR.kwargs[\"help\"] + \" Defaults to `./alchemicalNetwork`.\", default=\"alchemicalNetwork\")  # fmt: skip\n@N_PROTOCOL_REPEATS.parameter(multiple=False, required=False, default=3, help=N_PROTOCOL_REPEATS.kwargs[\"help\"])  # fmt: skip\n@NCORES.parameter(help=NCORES.kwargs[\"help\"], default=1)\n@OVERWRITE.parameter(help=OVERWRITE.kwargs[\"help\"], default=OVERWRITE.kwargs[\"default\"], is_flag=True)  # fmt: skip\n@print_duration\ndef plan_rbfe_network(\n    molecules: list[str],\n    protein: str | None,\n    protein_membrane: str | None,\n    cofactors: tuple[str],\n    yaml_settings: str,\n    output_dir: str,\n    n_protocol_repeats: int,\n    n_cores: int,\n    overwrite_charges: bool,\n):\n    \"\"\"\n    Plan a relative binding free energy AlchemicalNetwork, saved as JSON files for use by the quickrun command.\n\n    This tool is an easy way to set up a RBFE calculation campaign.\n\n    The generated AlchemicalNetwork will be stored in --output-directory along with JSON files for each alchemical transformation\n    that can be used to execute the campaign using ``openfe quickrun``.\n\n    .. note::\n\n       To ensure a consistent set of partial charges are used for each molecule across different transformations, this\n       tool will automatically generate charges ahead of planning the network. ``am1bcc`` charges will be generated via\n       ``ambertools``, this can also be customized using the settings yaml file.\n\n\n    By default, this tool makes the following choices:\n\n    * Atom mappings performed by KartografAtomMapper, with settings atom_max_distance=0.95, atom_map_hydrogens=True,\n      map_hydrogens_on_hydrogens_only=True,  map_exact_ring_matches_only=True, allow_partial_fused_rings=True, and\n      allow_bond_breaks=False.\n    * Minimal spanning network as the network planner, with LOMAP default\n      score as the weight function\n    * Water as solvent, with NaCl counter ions at 0.15 M concentration.\n    * Protocol is the OpenMM-based relative hybrid topology protocol, with\n      default settings.\n\n    These choices can be customized by creating a settings yaml file, which is passed in via the ``-s settings.yaml`` option.\n    For more advanced setups, please consider using the Python layer of openfe.\n    \"\"\"\n    write(\"RBFE-NETWORK PLANNER\")\n    write(\"______________________\")\n    write(\"\")\n\n    from openfecli.plan_alchemical_networks_utils import plan_alchemical_network_output\n\n    write(\"Parsing in Files: \")\n\n    # INPUT\n    write(\"\\tGot input: \")\n\n    small_molecules = MOL_DIR.get(molecules)\n    write(\"\\t\\tSmall Molecules: \" + \" \".join([str(sm) for sm in small_molecules]))\n    if protein and protein_membrane:\n        raise click.UsageError(\n            \"Only --protein (-p) or --protein-membrane may be provided, not both.\"\n        )\n    elif protein:\n        protein_component = PROTEIN.get(protein)\n        write(\"\\t\\tProteinComponent: \" + str(protein_component))\n    elif protein_membrane:\n        protein_component = PROTEIN_MEMBRANE.get(protein_membrane)\n        write(\"\\t\\tProteinMembraneComponent: \" + str(protein_component))\n    else:\n        raise click.UsageError(\"Either --protein or --protein-membrane must be provided.\")\n\n    if cofactors is not None:\n        cofactors = sum((COFACTORS.get(c) for c in cofactors), start=[])\n    else:\n        cofactors = []\n    write(\"\\t\\tCofactors: \" + str(cofactors))\n\n    yaml_options = YAML_OPTIONS.get(yaml_settings)\n    mapper_obj = yaml_options.mapper\n    mapping_scorer = yaml_options.scorer\n    ligand_network_planner = yaml_options.ligand_network_planner\n    solvent = yaml_options.solvent\n    partial_charge = yaml_options.partial_charge\n\n    write(\"\\t\\tSolvent: \" + str(solvent))\n    write(\"\")\n    write(\"Using Options:\")\n    write(\"\\tMapper: \" + str(mapper_obj))\n    write(\"\\tMapping Scorer: \" + str(mapping_scorer))\n    write(\"\\tNetwork Generation: \" + str(ligand_network_planner))\n    write(\"\\tPartial Charge Generation: \" + str(partial_charge.partial_charge_method))\n    if overwrite_charges:\n        write(\"\\tOverwriting partial charges\")\n    write(\"\")\n    write(f\"\\t{n_protocol_repeats=} ({n_protocol_repeats} simulation repeat(s) per transformation)\\n\")  # fmt: skip\n\n    # DO\n    write(\"Planning RBFE-Campaign:\")\n    alchemical_network, ligand_network = plan_rbfe_network_main(\n        mapper=[mapper_obj],\n        mapping_scorer=mapping_scorer,\n        ligand_network_planner=ligand_network_planner,\n        small_molecules=small_molecules,\n        solvent=solvent,\n        protein=protein_component,\n        cofactors=cofactors,\n        n_protocol_repeats=n_protocol_repeats,\n        partial_charge_settings=partial_charge,\n        processors=n_cores,\n        overwrite_charges=overwrite_charges,\n    )\n    write(\"\\tDone\")\n    write(\"\")\n\n    # OUTPUT\n    write(\"Output:\")\n    write(\"\\tSaving to: \" + str(output_dir))\n    plan_alchemical_network_output(\n        alchemical_network=alchemical_network,\n        ligand_network=ligand_network,\n        folder_path=OUTPUT_DIR.get(output_dir),\n    )\n\n\nPLUGIN = OFECommandPlugin(\n    command=plan_rbfe_network, section=\"Network Planning\", requires_ofe=(0, 3)\n)\n"
  },
  {
    "path": "src/openfecli/commands/plan_rhfe_network.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\n\n\nfrom typing import List\n\nimport click\n\nfrom openfecli import OFECommandPlugin\nfrom openfecli.parameters import (\n    MAPPER,\n    MOL_DIR,\n    N_PROTOCOL_REPEATS,\n    NCORES,\n    OUTPUT_DIR,\n    OVERWRITE,\n    YAML_OPTIONS,\n)\nfrom openfecli.utils import print_duration, write\n\n\ndef plan_rhfe_network_main(\n    mapper,\n    mapping_scorer,\n    ligand_network_planner,\n    small_molecules,\n    solvent,\n    n_protocol_repeats,\n    partial_charge_settings,\n    processors,\n    overwrite_charges,\n):\n    \"\"\"Utility method to plan a relative hydration free energy network.\n\n    Parameters\n    ----------\n    mapper : list[LigandAtomMapper]\n        list of mappers to use to generate the mapping\n    mapping_scorer : Callable\n        scorer, that evaluates the generated mappings\n    ligand_network_planner : Callable\n        function building the network from the ligands, mappers and mapping_scorer\n    small_molecules : Iterable[SmallMoleculeComponent]\n        molecules of the system\n    solvent : SolventComponent\n        Solvent component used for solvation\n    n_protocol_repeats: int\n        number of completely independent repeats of the entire sampling process\n    partial_charge_settings : OpenFFPartialChargeSettings\n        how to assign partial charges to the input ligands\n        (if they don't already have partial charges).\n    processors: int\n        The number of processors that should be used when generating the charges\n    overwrite_charges: bool\n        If any partial charges already present on the small molecules should be overwritten\n\n    Returns\n    -------\n    Tuple[AlchemicalNetwork, LigandNetwork]\n        Alchemical network with protocol for executing simulations, and the\n        associated ligand network\n    \"\"\"\n    from openfe.protocols.openmm_utils.charge_generation import bulk_assign_partial_charges\n    from openfe.setup.alchemical_network_planner.relative_alchemical_network_planner import (\n        RelativeHybridTopologyProtocol,\n        RHFEAlchemicalNetworkPlanner,\n    )\n\n    protocol_settings = RelativeHybridTopologyProtocol.default_settings()\n    protocol_settings.protocol_repeats = n_protocol_repeats\n    protocol = RelativeHybridTopologyProtocol(protocol_settings)\n\n    write(\"assigning ligand partial charges -- this may be slow\")\n\n    charged_small_molecules = bulk_assign_partial_charges(\n        molecules=small_molecules,\n        overwrite=overwrite_charges,\n        method=partial_charge_settings.partial_charge_method,\n        toolkit_backend=partial_charge_settings.off_toolkit_backend,\n        generate_n_conformers=partial_charge_settings.number_of_conformers,\n        nagl_model=partial_charge_settings.nagl_model,\n        processors=processors,\n    )\n\n    network_planner = RHFEAlchemicalNetworkPlanner(\n        mappers=mapper,\n        mapping_scorer=mapping_scorer,\n        ligand_network_planner=ligand_network_planner,\n        protocol=protocol,\n    )\n    alchemical_network = network_planner(ligands=charged_small_molecules, solvent=solvent)\n\n    return alchemical_network, network_planner._ligand_network\n\n\n@click.command(\n    \"plan-rhfe-network\",\n    short_help=(\n        \"Plan a relative hydration free energy network, saved as JSON files \"\n        \"for the quickrun command.\"\n    ),\n)\n@MOL_DIR.parameter(required=True, help=MOL_DIR.kwargs[\"help\"] + \" Any number of sdf paths.\")\n@YAML_OPTIONS.parameter(multiple=False, required=False, default=None, help=YAML_OPTIONS.kwargs[\"help\"])  # fmt: skip\n@OUTPUT_DIR.parameter(help=OUTPUT_DIR.kwargs[\"help\"] + \" Defaults to `./alchemicalNetwork`.\", default=\"alchemicalNetwork\")  # fmt: skip\n@N_PROTOCOL_REPEATS.parameter(multiple=False, required=False, default=3, help=N_PROTOCOL_REPEATS.kwargs[\"help\"])  # fmt: skip\n@NCORES.parameter(help=NCORES.kwargs[\"help\"], default=1)\n@OVERWRITE.parameter(help=OVERWRITE.kwargs[\"help\"], default=OVERWRITE.kwargs[\"default\"], is_flag=True)  # fmt: skip\n@print_duration\ndef plan_rhfe_network(\n    molecules: List[str],\n    yaml_settings: str,\n    output_dir: str,\n    n_cores: int,\n    overwrite_charges: bool,\n    n_protocol_repeats: int,\n):\n    # TODO: make this match the rbfe network docstring, or vice-versa?\n    \"\"\"\n    Plan a relative hydration free energy network, saved as JSON files for use by\n    the quickrun command.\n\n    This tool is an easy way to setup a RHFE calculation campaign.\n    This can  be useful for testing our tools.  Plan-rhfe-network finds a reasonable\n    network of transformations and adds the openfe rbfe protocol of year one\n    to the transformations.  The output of the command can be used, in order\n    to run the planned transformations with the quickrun tool.  For more\n    sophisticated setups, please consider using the python layer of openfe.\n\n    .. note::\n\n       To ensure a consistent set of partial charges are used for each molecule across different transformations, this\n       tool will automatically generate charges ahead of planning the network. ``am1bcc`` charges will be generated via\n       ``ambertools``, this can also be customized using the settings yaml file.\n\n\n    The tool will parse the input and run the rbfe network planner, which\n    executes following steps:\n\n    1. generate an atom mapping for all possible ligand pairs. (default:\n        Lomap)\n\n    2. score all atom mappings. (default: Lomap default score)\n\n    3. build network form all atom mapping scores (default: minimal\n        spanning graph)\n\n    The generated Network will be stored in a folder containing for each\n    transformation a JSON file, that can be run with quickrun (or other\n    future tools).\n    \"\"\"\n\n    write(\"RHFE-NETWORK PLANNER\")\n    write(\"______________________\")\n    write(\"\")\n\n    from openfecli.plan_alchemical_networks_utils import plan_alchemical_network_output\n\n    write(\"Parsing in Files: \")\n\n    # INPUT\n    write(\"\\tGot input: \")\n\n    small_molecules = MOL_DIR.get(molecules)\n    write(\"\\t\\tSmall Molecules: \" + \" \".join([str(sm) for sm in small_molecules]))\n\n    yaml_options = YAML_OPTIONS.get(yaml_settings)\n    mapper_obj = yaml_options.mapper\n    mapping_scorer = yaml_options.scorer\n    ligand_network_planner = yaml_options.ligand_network_planner\n    solvent = yaml_options.solvent\n    partial_charge = yaml_options.partial_charge\n\n    write(\"\\t\\tSolvent: \" + str(solvent))\n    write(\"\")\n\n    write(\"Using Options:\")\n    write(\"\\tMapper: \" + str(mapper_obj))\n\n    # TODO:  write nice parameter\n    write(\"\\tMapping Scorer: \" + str(mapping_scorer))\n\n    # TODO: write nice parameter\n    write(\"\\tNetworker: \" + str(ligand_network_planner))\n\n    write(\"\\tPartial Charge Generation: \" + str(partial_charge.partial_charge_method))\n    if overwrite_charges:\n        write(\"\\tOverwriting partial charges\")\n    write(\"\")\n    write(f\"\\t{n_protocol_repeats=} ({n_protocol_repeats} simulation repeat(s) per transformation)\\n\")  # fmt: skip\n\n    # DO\n    write(\"Planning RHFE-Campaign:\")\n    alchemical_network, ligand_network = plan_rhfe_network_main(\n        mapper=[mapper_obj],\n        mapping_scorer=mapping_scorer,\n        ligand_network_planner=ligand_network_planner,\n        small_molecules=small_molecules,\n        solvent=solvent,\n        n_protocol_repeats=n_protocol_repeats,\n        partial_charge_settings=partial_charge,\n        processors=n_cores,\n        overwrite_charges=overwrite_charges,\n    )\n    write(\"\\tDone\")\n    write(\"\")\n\n    # OUTPUT\n    write(\"Output:\")\n    write(\"\\tSaving to: \" + output_dir)\n    plan_alchemical_network_output(\n        alchemical_network=alchemical_network,\n        ligand_network=ligand_network,\n        folder_path=OUTPUT_DIR.get(output_dir),\n    )\n\n\nPLUGIN = OFECommandPlugin(\n    command=plan_rhfe_network, section=\"Network Planning\", requires_ofe=(0, 3)\n)\n"
  },
  {
    "path": "src/openfecli/commands/quickrun.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\n\nimport hashlib\nimport json\nimport pathlib\nimport warnings\n\nimport click\n\nfrom openfecli import OFECommandPlugin\nfrom openfecli.utils import configure_logger, print_duration, write\n\n\ndef _format_exception(exception) -> str:\n    \"\"\"Takes the exception as stored by Gufe and reformats it.\"\"\"\n    return f\"{exception[0]}: {exception[1][0]}\"\n\n\ndef _hash_quickrun_inputs(output, transformation):\n    string_rep = f\"{output.absolute()}{transformation.key}\"\n    hasher = hashlib.md5(string_rep.encode(), usedforsecurity=False)\n    return hasher.hexdigest()\n\n\n@click.command(\"quickrun\", short_help=\"Run a given transformation, saved as a JSON file\")\n@click.argument(\"transformation\", type=click.File(mode=\"r\"), required=True)\n@click.option(\n    \"--work-dir\", \"-d\", default=None,\n    type=click.Path(dir_okay=True, file_okay=False, writable=True, path_type=pathlib.Path),\n    help=(\n        \"Directory in which to store files in (defaults to current directory). \"\n        \"If the directory does not exist, it will be created at runtime.\"\n    ),\n)  # fmt: skip\n@click.option(\n    \"output\", \"-o\", default=None,\n    type=click.Path(dir_okay=False, file_okay=False, path_type=pathlib.Path),\n    help=\"Filepath at which to create and write the JSON-formatted results.\",\n)  # fmt: skip\n@click.option(\n    \"--resume\",\n    is_flag=True,\n    default=False,\n    help=(\"Attempt to resume this transformation's execution using the cache.\"),\n)\n@print_duration\ndef quickrun(transformation, work_dir, output, resume):\n    \"\"\"Run the transformation (edge) in the given JSON file.\n\n    Simulation JSON files can be created with the\n    :ref:`cli_plan-rbfe-network`\n    or from Python a :class:`.Transformation` can be saved using its to_json\n    method::\n\n        transformation.to_json(\"filename.json\")\n\n    That will save a JSON file suitable to be input for this command.\n\n    Running this command will execute the simulation defined in the JSON file,\n    creating a directory for each individual task (``Unit``) in the workflow.\n    For example, when running the OpenMM HREX Protocol a directory will be created\n    for each repeat of the sampling process (by default 3).\n    \"\"\"\n    import logging\n    import os\n    import sys\n    from json import JSONDecodeError\n\n    from gufe import ProtocolDAG\n    from gufe.protocols.protocoldag import execute_DAG\n    from gufe.tokenization import JSON_HANDLER\n    from gufe.transformations.transformation import Transformation\n\n    from openfe.utils import logging_control\n\n    # avoid problems with output not showing if queueing system kills a job\n    sys.stdout.reconfigure(line_buffering=True)\n\n    stdout_handler = logging.StreamHandler(sys.stdout)\n\n    configure_logger(\"gufekey\", handler=stdout_handler)\n    configure_logger(\"gufe\", handler=stdout_handler)\n    configure_logger(\"openfe\", handler=stdout_handler)\n\n    # silence the openmmtools.multistate API warning\n    logging_control._silence_message(\n        msg=[\n            \"The openmmtools.multistate API is experimental and may change in future releases\",\n        ],\n        logger_names=[\n            \"openmmtools.multistate.multistatereporter\",\n            \"openmmtools.multistate.multistateanalyzer\",\n            \"openmmtools.multistate.multistatesampler\",\n        ],\n    )\n    # turn warnings into log message (don't show stack trace)\n    logging.captureWarnings(True)\n\n    click.secho(f\"\\nCurrent directory: {os.getcwd()}/\")\n    if work_dir is None:\n        click.secho(f\"Creating working directory: {work_dir}/\")\n        work_dir = pathlib.Path(os.getcwd())\n    else:\n        click.secho(f\"Using existing working directory: {work_dir}/\")\n        work_dir.mkdir(exist_ok=True, parents=True)\n\n    trans = Transformation.from_json(transformation)\n\n    if output is None:\n        output = work_dir / (str(trans.key) + \"_results.json\")\n    else:\n        output.parent.mkdir(exist_ok=True, parents=True)\n\n    click.secho(f\"Loading transformation from: {transformation.name}\")\n    click.secho(f\"When simulation is complete, results will be written to: {output}\\n\")\n\n    resume_command = f\"openfe quickrun {transformation.name} -o {output} -d {work_dir} --resume\\n\"\n\n    click.secho(\n        \"If this simulation is interrupted or fails, you may attempt to resume execution using:\",\n        bold=True,\n    )\n    click.secho(resume_command)\n\n    # Attempt to either deserialize or freshly create DAG\n    cache_basedir = work_dir / \"quickrun_cache\"\n    hashed_key = _hash_quickrun_inputs(output, trans)\n    cached_dag_path = cache_basedir / f\"dag-cache-{hashed_key}.json\"\n\n    if cached_dag_path.is_file():\n        if resume:\n            write(f\"Attempting to resume execution using '{cached_dag_path}'\")\n            try:\n                dag = ProtocolDAG.from_json(cached_dag_path)\n            except JSONDecodeError:\n                # we can't tell the user which gufe-generated cache dir to delete, since we'd need to load the JSON to know the DAG's key\n                # however, just removing the cached_dag_path is sufficient to trigger a fresh DAG to be generated, and the gufe-generated cached dir will just be stale.\n                errmsg = f\"Recovery failed, please remove {cached_dag_path} before executing a new transformation simulation.\"\n                raise click.ClickException(errmsg)\n\n            write(\"Success. Resuming execution...\")\n        else:\n            errmsg = f\"Transformation has been started but is incomplete. Please remove {cached_dag_path} and rerun, or resume execution using the ``--resume`` flag.\"\n            raise click.ClickException(click.style(errmsg, fg=\"red\"))\n\n    else:\n        if resume:\n            write(\n                f\"openfe quickrun was run with --resume, but no cached results found at {cached_dag_path}. Starting new execution.\"\n            )\n\n        # Create the DAG instead and then serialize for later resuming\n        write(\"Planning simulations for this edge...\")\n        dag = trans.create()\n        cache_basedir.mkdir(exist_ok=True)\n        dag.to_json(cached_dag_path)\n\n    write(\"\\nStarting the simulations for this edge...\\n\")\n    dagresult = execute_DAG(\n        dag,\n        shared_basedir=work_dir,\n        scratch_basedir=work_dir,\n        cache_basedir=cache_basedir,\n        keep_shared=True,\n        raise_error=False,\n        n_retries=2,\n    )\n    write(\"Done with all simulations! Analyzing the results....\")\n    prot_result = trans.protocol.gather([dagresult])\n\n    if dagresult.ok():\n        estimate = prot_result.get_estimate()\n        uncertainty = prot_result.get_uncertainty()\n    else:\n        estimate = uncertainty = None  # for output file\n\n    out_dict = {\n        \"estimate\": estimate,\n        \"uncertainty\": uncertainty,\n        \"protocol_result\": prot_result.to_dict(),\n        \"unit_results\": {\n            unit.key: unit.to_keyed_dict() for unit in dagresult.protocol_unit_results\n        },\n    }\n\n    with open(output, mode=\"w\") as outf:\n        json.dump(out_dict, outf, cls=JSON_HANDLER.encoder)\n\n    # remove the cached dag since the job has completed\n    os.remove(cached_dag_path)\n\n    write(f\"Here is the result:\\n\\tdG = {estimate} ± {uncertainty}\\n\")\n    write(\"\")\n\n    if not dagresult.ok():\n        # there can be only one, MacCleod\n        failure = dagresult.protocol_unit_failures[-1]\n        raise click.ClickException(\n            f\"The protocol unit '{failure.name}' failed with the error \"\n            f\"message:\\n{_format_exception(failure.exception)}\\n\\n\"\n            \"Details provided in output.\"\n        )\n\n\nPLUGIN = OFECommandPlugin(command=quickrun, section=\"Quickrun Executor\", requires_ofe=(0, 3))\n\nif __name__ == \"__main__\":\n    quickrun()\n"
  },
  {
    "path": "src/openfecli/commands/test.py",
    "content": "import os\nimport sys\n\nimport click\nimport pytest\n\nfrom openfecli import OFECommandPlugin\nfrom openfecli.utils import write\n\n\n@click.command(\"test\", short_help=\"Run the OpenFE test suite\")\n@click.option('--long', is_flag=True, default=False, help=\"Run additional tests (takes much longer)\")  # fmt: skip\n@click.option(\n    \"--download-only\",\n    is_flag=True,\n    default=False,\n    help=\"Download data to the cache if not already present (this is helpful if internet is unreliable). If all data exists in the cache, only the cache location is shown.\",\n)\ndef test(long, download_only):\n    \"\"\"\n    Run the OpenFE test suite. This first checks that OpenFE is correctly\n    imported, and then runs the main test suite, which should take several\n    minutes. If given the ``--long`` flag, this will include several tests\n    that take significantly longer, but ensure that we're able to fully run\n    in your environment.\n\n    A successful run will include tests that pass, skip, or \"xfail\". In many\n    terminals, these show as green or yellow. Warnings are not a concern.\n    However, You should not see anything that fails or errors (red).\n    \"\"\"\n\n    if download_only:\n        from openfe.data import _downloader\n        from openfe.data._registry import zenodo_data_registry as api_test_data_registry\n        from openfecli.data._registry import POOCH_CACHE\n        from openfecli.data._registry import zenodo_data_registry as cli_test_data_registry\n\n        click.echo(f\"Checking for test data in cache location:\\n{POOCH_CACHE}\")\n\n        _downloader.retrieve_registry_data(\n            cli_test_data_registry + api_test_data_registry, POOCH_CACHE\n        )\n        sys.exit(0)\n\n    try:\n        old_env = dict(os.environ)\n        os.environ[\"OFE_SLOW_TESTS\"] = str(long)\n\n        write(\"Testing can import....\")\n        import openfe\n\n        write(\"Running the main package tests\")\n        return_value = pytest.main([\"-v\", \"--pyargs\", \"openfe\", \"--pyargs\", \"openfecli\"])\n    finally:\n        os.environ.clear()\n        os.environ.update(old_env)\n        sys.exit(return_value)\n\n\nPLUGIN = OFECommandPlugin(test, \"Miscellaneous\", requires_ofe=(0, 7, 5))\n"
  },
  {
    "path": "src/openfecli/commands/view_ligand_network.py",
    "content": "import os\n\nimport click\n\nfrom openfecli import OFECommandPlugin\n\n\n@click.command(\"view-ligand-network\", short_help=\"Visualize a ligand network from a .graphml file.\")\n@click.argument(\n    \"ligand-network\",\n    type=click.Path(exists=True, readable=True, dir_okay=False, file_okay=True),\n)\ndef view_ligand_network(ligand_network: os.PathLike):\n    \"\"\"\n    Visualize a ligand network from a .graphml file.\n\n    e.g. ``openfe view-ligand-network network_setup/ligand_network.graphml``\n\n    \"\"\"\n    import matplotlib\n\n    from openfe.setup import LigandNetwork\n    from openfe.utils.atommapping_network_plotting import plot_atommapping_network\n\n    matplotlib.use(\"TkAgg\")\n    with open(ligand_network) as f:\n        graphml = f.read()\n\n    network = LigandNetwork.from_graphml(graphml)\n    fig = plot_atommapping_network(network)\n    matplotlib.pyplot.show()\n\n\nPLUGIN = OFECommandPlugin(\n    command=view_ligand_network,\n    section=\"Network Planning\",\n    requires_ofe=(0, 7, 0),\n)\n"
  },
  {
    "path": "src/openfecli/data/__init__.py",
    "content": ""
  },
  {
    "path": "src/openfecli/data/_registry.py",
    "content": "\"\"\"Registry for all remotely-stored CLI test data.\"\"\"\n\nimport pooch\n\nPOOCH_CACHE = pooch.os_cache(\"openfe\")\nzenodo_cmet_data = dict(\n    base_url=\"doi:10.5281/zenodo.15200083/\",\n    fname=\"cmet_results.tar.gz\",\n    known_hash=\"md5:a4ca67a907f744c696b09660dc1eb8ec\",\n)\nzenodo_rbfe_serial_data = dict(\n    base_url=\"doi:10.5281/zenodo.15042470/\",\n    fname=\"rbfe_results_serial_repeats.tar.gz\",\n    known_hash=\"md5:2355ecc80e03242a4c7fcbf20cb45487\",\n)\nzenodo_rbfe_parallel_data = dict(\n    base_url=\"doi:10.5281/zenodo.15042470/\",\n    fname=\"rbfe_results_parallel_repeats.tar.gz\",\n    known_hash=\"md5:ff7313e14eb6f2940c6ffd50f2192181\",\n)\nzenodo_abfe_data = dict(\n    base_url=\"doi:10.5281/zenodo.19498687/\",\n    fname=\"abfe_results.zip\",\n    known_hash=\"md5:44db4ce8195f4fe99989f8f57e0d7081\",\n)\nzenodo_septop_data = dict(\n    base_url=\"doi:10.5281/zenodo.19805681/\",\n    fname=\"septop_results.zip\",\n    known_hash=\"md5:5de5cac5acdf195a13b0f1ce016a8660\",\n)\n\nzenodo_data_registry = [\n    zenodo_cmet_data,\n    zenodo_rbfe_serial_data,\n    zenodo_rbfe_parallel_data,\n    zenodo_abfe_data,\n    zenodo_septop_data,\n]\n"
  },
  {
    "path": "src/openfecli/fetchables.py",
    "content": "\"\"\"Plugins for the ``fetch`` command\"\"\"\n\nfrom openfecli.fetching import PkgResourceFetcher, URLFetcher\n\n_EXAMPLE_NB_BASE = \"https://raw.githubusercontent.com/OpenFreeEnergy/ExampleNotebooks/main/\"\n\nRBFE_TUTORIAL = URLFetcher(\n    resources=[\n        (_EXAMPLE_NB_BASE + \"rbfe_tutorial/\", \"tyk2_ligands.sdf\"),\n        (_EXAMPLE_NB_BASE + \"rbfe_tutorial/\", \"tyk2_protein.pdb\"),\n        (_EXAMPLE_NB_BASE + \"rbfe_tutorial/\", \"cli_tutorial.md\"),\n        (_EXAMPLE_NB_BASE + \"rbfe_tutorial/\", \"rbfe_python_tutorial.ipynb\"),\n    ],\n    short_name=\"rbfe-tutorial\",\n    short_help=\"CLI and Python tutorial on relative binding free energies\",\n    section=\"Tutorials\",\n    requires_ofe=(0, 7, 0),\n).plugin\n\nRBFE_TUTORIAL_RESULTS = PkgResourceFetcher(\n    resources=[\n        (\"openfecli.tests.data\", \"rbfe_results.tar.gz\"),\n    ],\n    short_name=\"rbfe-tutorial-results\",\n    short_help=\"Results package to follow-up the rbfe-tutorial\",\n    section=\"Tutorials\",\n    requires_ofe=(0, 7, 5),\n).plugin\n"
  },
  {
    "path": "src/openfecli/fetching.py",
    "content": "import importlib.resources\nimport pathlib\nimport shutil\nimport urllib.request\n\nimport click\nfrom plugcli.plugin_management import CommandPlugin\n\nfrom .utils import write\n\n\nclass _Fetcher:\n    \"\"\"Base class for fetchers. Defines the API and plugin creation.\n\n    Parameters\n    ----------\n    resources: Iterable[Tuple[str, str]]\n        resources to be downloaded, as (source, filename)\n    short_name: str\n        name of the command used after openfe fetch\n    short_help: str\n        short help shown in openfe fetch --help\n    long_help: str\n        help shown in openfe fetch short_name --help\n    requires_ofe: Tuple\n        minimum version of OpenFE required\n    \"\"\"\n\n    REQUIRES_INTERNET = None\n\n    def __init__(\n        self,\n        resources,\n        short_name,\n        short_help,\n        requires_ofe,\n        section=None,\n        long_help=None,\n    ):\n        self._resources = resources\n        self.short_name = short_name\n        self.short_help = short_help\n        self.requires_ofe = requires_ofe\n        self.section = section\n        self.long_help = long_help\n\n    @property\n    def resources(self):\n        yield from self._resources\n\n    def __call__(self, directory: pathlib.Path):\n        raise NotImplementedError()\n\n    @property\n    def plugin(self):\n        \"\"\"Plugin used by this fetcher\"\"\"\n        docs = self.long_help or \"\"\n        docs += \"\\n\\nThis will fetch the following files:\\n\\n\"\n        # if you're getting a problem with unpacking here, you probably\n        # forgot to make resources a list of tuple of (base, filename)\n        for _, filename in self.resources:\n            docs += f\"* {filename}\\n\"\n\n        if self.REQUIRES_INTERNET is True:\n            short_help = self.short_help + \" [requires internet]\"\n            section = \"Requires Internet\"\n        elif self.REQUIRES_INTERNET is False:\n            short_help = self.short_help\n            section = \"Built-in\"\n        else:  # -no-cov-\n            raise RuntimeError(\"Class must set boolean REQUIRES_INTERNET\")\n\n        @click.command(\n            self.short_name,\n            short_help=short_help,\n            help=docs,\n        )\n        @click.option(\n            '-d', '--directory', default='.',\n            help=\"output directory, defaults to current directory\",\n            type=click.Path(file_okay=False, dir_okay=True, writable=True),\n        )  # fmt: skip\n        def command(directory):\n            directory = pathlib.Path(directory)\n            directory.mkdir(parents=True, exist_ok=True)\n            self(directory)\n\n        return FetchablePlugin(\n            command,\n            section=self.section,\n            requires_ofe=self.requires_ofe,\n            fetcher=self,\n        )\n\n\nclass URLFetcher(_Fetcher):\n    \"\"\"Fetcher for URLs.\n\n    Resources should be (base, filename), e.g., (\"https://google.com/\",\n    \"index.html).\n    \"\"\"\n\n    REQUIRES_INTERNET = True\n\n    def __call__(self, dest_dir):\n        for base, filename in self.resources:\n            # let's just prevent one footgun here\n            if not base.endswith(\"/\"):\n                base += \"/\"\n\n            write(f\"Fetching {base}{filename}\")\n\n            with urllib.request.urlopen(base + filename) as resp:\n                contents = resp.read()\n\n            with open(dest_dir / filename, mode=\"wb\") as f:\n                f.write(contents)\n\n\nclass PkgResourceFetcher(_Fetcher):\n    \"\"\"Fetcher for data included with the package\n\n    Resources should be (package, filename), e.g., (\"openfecli\",\n    \"__init__.py\").\n    \"\"\"\n\n    REQUIRES_INTERNET = False\n\n    def __call__(self, dest_dir):\n        for package, filename in self.resources:\n            ref = importlib.resources.files(package) / filename\n            write(f\"Fetching {str(ref)}\")\n            with importlib.resources.as_file(ref) as f:\n                shutil.copyfile(ref, dest_dir / filename)\n\n\n# should work, but don't want to write tests yet or deal with typing\n# class MixedResourcesFetcher(_Fetcher):\n#     @property\n#     def REQUIRES_INTERNET(self):\n#         return any([fetcher.REQUIRES_INTERNET\n#                     for fetcher in self._resources])\n\n#     @property\n#     def resources(self):\n#         for resource in self._resources:\n#             yield from resource.resources\n\n#     def __call__(self):\n#         for fetcher in self._resources:\n#             fetcher()\n\n\nclass FetchablePlugin(CommandPlugin):\n    \"\"\"Plugin class for Fetchables.\n\n    This includes the fetcher to simplify testing and introspection.\n    \"\"\"\n\n    def __init__(self, command, section, requires_ofe, fetcher):\n        super().__init__(\n            command=command,\n            section=section,\n            requires_lib=requires_ofe,\n            requires_cli=requires_ofe,\n        )\n        self.fetcher = fetcher\n\n    @property\n    def filenames(self):\n        return [res[1] for res in self.fetcher.resources]\n"
  },
  {
    "path": "src/openfecli/parameters/__init__.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\n\nfrom .mapper import MAPPER\nfrom .misc import N_PROTOCOL_REPEATS, NCORES, OVERWRITE\nfrom .mol import MOL\nfrom .molecules import COFACTORS, MOL_DIR\nfrom .output import OUTPUT_FILE_AND_EXT\nfrom .output_dir import OUTPUT_DIR\nfrom .plan_network_options import YAML_OPTIONS\nfrom .protein import PROTEIN, PROTEIN_MEMBRANE\n"
  },
  {
    "path": "src/openfecli/parameters/mapper.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\n\nfrom plugcli.params import MultiStrategyGetter, Option\n\nfrom openfecli.parameters.utils import import_parameter\n\n\ndef _atommapper_from_openfe_setup(user_input, context):\n    return import_parameter(\"openfe.setup.\" + user_input)\n\n\ndef _atommapper_from_qualname(user_input, context):\n    return import_parameter(user_input)\n\n\nget_atommapper = MultiStrategyGetter(\n    strategies=[\n        _atommapper_from_qualname,\n        _atommapper_from_openfe_setup,\n    ],\n    error_message=(\n        \"Unable to create atom mapper from user input \"\n        \"'{user_input}'. Please check spelling and \"\n        \"capitalization.\"\n    ),\n)\n\nMAPPER = Option(\n    \"--mapper\",\n    getter=get_atommapper,\n    help=(\n        \"Atom mapper; can either be a name in the openfe.setup namespace \"\n        \"or a custom fully-qualified name.\"\n    ),\n)\n"
  },
  {
    "path": "src/openfecli/parameters/misc.py",
    "content": "import click\nfrom plugcli.params import Option\n\nN_PROTOCOL_REPEATS = Option(\n    \"--n-protocol-repeats\",\n    type=click.INT,\n    help=\"Number of independent repeat(s) to be run per execution of a transformation using the ``openfe quickrun`` command.\\n\\n\"\n    \"For example:\\n\\n  ``--n-protocol-repeats=3`` means ``openfe quickrun`` will execute 3 repeats in serial.\\n\\n\"\n    \"  ``--n-protocol-repeats=1`` means ``openfe quickrun`` will execute only 1 repeat per call, \"\n    \"which allows for individual repeats to be submitted in parallel by calling ``openfe quickrun`` on the same input JSON file multiple times.\",\n)\n\nNCORES = Option(\"-n\", \"--n-cores\", help=\"Number of cores to use for multiprocessing.\")\n\nOVERWRITE = Option(\n    \"--overwrite-charges\",\n    is_flag=True,\n    default=False,\n    help=\"Overwrite any partial charges present in the input molecules.\",\n)\n"
  },
  {
    "path": "src/openfecli/parameters/mol.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\n\nfrom plugcli.params import NOT_PARSED, MultiStrategyGetter, Option\n\n\ndef _load_molecule_from_smiles(user_input, context):\n    from rdkit import Chem\n\n    from openfe import SmallMoleculeComponent\n\n    # MolFromSmiles returns None if the string is not a molecule\n    # TODO: find some way to redirect the error messages? Messages stayed\n    # after either redirect_stdout or redirect_stderr.\n    mol = Chem.MolFromSmiles(user_input)\n    if mol is None:\n        return NOT_PARSED\n\n    # TODO: next is (temporary?) hack: see\n    # https://github.com/OpenFreeEnergy/Lomap/issues/4\n    Chem.rdDepictor.Compute2DCoords(mol)\n    return SmallMoleculeComponent(rdkit=mol)\n\n\ndef _load_molecule_from_sdf(user_input, context):\n    if \".sdf\" not in str(user_input):  # this silences some stderr spam\n        return NOT_PARSED\n\n    from openfe import SmallMoleculeComponent\n\n    try:\n        return SmallMoleculeComponent.from_sdf_file(user_input)\n    except ValueError:  # any exception should try other strategies\n        return NOT_PARSED\n\n\ndef _load_molecule_from_mol2(user_input, context):\n    if \".mol2\" not in str(user_input):\n        return NOT_PARSED\n\n    from rdkit import Chem\n\n    from openfe import SmallMoleculeComponent\n\n    m = Chem.MolFromMol2File(user_input)\n    if m is None:\n        return NOT_PARSED\n    else:\n        return SmallMoleculeComponent(m)\n\n\nget_molecule = MultiStrategyGetter(\n    strategies=[\n        _load_molecule_from_sdf,\n        _load_molecule_from_mol2,\n        # NOTE: I think loading from smiles must be last choice, because\n        # failure will give meaningless user-facing errors\n        _load_molecule_from_smiles,\n    ],\n    error_message=\"Unable to generate a molecule from '{user_input}'.\",\n)\n\nMOL = Option(\n    \"-m\",\n    \"--mol\",\n    help=(\"SmallMoleculeComponent. Can be provided as an SDF file or as a SMILES  string.\"),\n    getter=get_molecule,\n)\n"
  },
  {
    "path": "src/openfecli/parameters/molecules.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\nimport glob\nimport itertools\nimport pathlib\n\nimport click\nfrom plugcli.params import NOT_PARSED, MultiStrategyGetter, Option\n\n\n# MOVE TO GUFE ####################################################\ndef _smcs_from_sdf(sdf):\n    from rdkit import Chem\n\n    from openfe import SmallMoleculeComponent\n\n    supp = Chem.SDMolSupplier(str(sdf), removeHs=False)\n    mols = [SmallMoleculeComponent(mol) for mol in supp]\n    return mols\n\n\ndef _smcs_from_mol2(mol2):\n    from rdkit import Chem\n\n    from openfe import SmallMoleculeComponent\n\n    rdmol = Chem.MolFromMol2File(str(mol2), removeHs=False)\n    return [SmallMoleculeComponent.from_rdkit(rdmol)]\n\n\ndef load_molecules(file_or_directory):\n    \"\"\"\n    Load SmallMoleculeComponents in the given file or directory.\n\n    This always returns a list. The input can be a directory, in which all\n    files ending with .sdf are loaded as SDF and all files ending in .mol2\n    are loaded as MOL2.\n\n    Parameters\n    ----------\n    file_or_directory : pathlib.Path\n\n    Returns\n    -------\n    list[SmallMoleculeComponent]\n    \"\"\"\n    inp = pathlib.Path(file_or_directory)  # for shorter lines\n    if inp.is_dir():\n        sdf_files = [f for f in inp.iterdir() if f.suffix.lower() == \".sdf\"]\n        mol2_files = [f for f in inp.iterdir() if f.suffix.lower() == \".mol2\"]\n    else:\n        sdf_files = [inp] if inp.suffix.lower() == \".sdf\" else []\n        mol2_files = [inp] if inp.suffix.lower() == \".mol2\" else []\n\n    if not sdf_files + mol2_files:\n        raise ValueError(f\"Unable to find molecules in {file_or_directory}\")\n\n    sdf_mols = sum([_smcs_from_sdf(sdf) for sdf in sdf_files], [])\n    mol2_mols = sum([_smcs_from_mol2(mol2) for mol2 in mol2_files], [])\n\n    return sdf_mols + mol2_mols\n\n\n# END MOVE TO GUFE ################################################\n\n\ndef molecule_getter(user_input, context):\n    return load_molecules(user_input)\n\n\nMOL_DIR = Option(\n    \"-M\",\n    \"--molecules\",\n    type=click.Path(exists=True),\n    help=(\n        \"A directory or file containing all molecules to be loaded, either\"\n        \" as a single SDF or multiple MOL2/SDFs.\"\n    ),\n    getter=molecule_getter,\n)\n\nCOFACTORS = Option(\n    \"-C\",\n    \"--cofactors\",\n    type=click.Path(exists=True),\n    help=\"Path to cofactors sdf file.  This may contain multiple molecules\",\n    getter=molecule_getter,\n)\n"
  },
  {
    "path": "src/openfecli/parameters/output.py",
    "content": "import pathlib\n\nimport click\nfrom plugcli.params import NOT_PARSED, MultiStrategyGetter, Option\n\n\ndef get_file_and_extension(user_input, context):\n    file = user_input\n    ext = file.name.split(\".\")[-1] if file else None\n    return file, ext\n\n\nOUTPUT_FILE_AND_EXT = Option(\n    \"-o\",\n    \"--output\",\n    help=\"output file\",\n    getter=get_file_and_extension,\n    type=click.File(mode=\"wb\"),\n)\n"
  },
  {
    "path": "src/openfecli/parameters/output_dir.py",
    "content": "import os\nimport pathlib\n\nimport click\nfrom plugcli.params import NOT_PARSED, MultiStrategyGetter, Option\n\n\ndef get_dir(user_input, context):\n    dir_path = pathlib.Path(user_input)\n    return dir_path\n\n\nOUTPUT_DIR = Option(\n    \"-o\",\n    \"--output-dir\",\n    help=\"Path to the output directory. \",\n    getter=get_dir,\n    type=click.Path(file_okay=False, resolve_path=True),\n)\n"
  },
  {
    "path": "src/openfecli/parameters/plan_network_options.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\n\"\"\"Pydantic models for the definition of advanced CLI options\"\"\"\n\nimport warnings\nfrom collections import namedtuple\nfrom typing import Any, Optional\n\nimport click\nimport yaml\nfrom plugcli.params import Option\nfrom pydantic import BaseModel, ConfigDict\n\nPlanNetworkOptions = namedtuple(\n    \"PlanNetworkOptions\",\n    [\n        \"mapper\",\n        \"scorer\",\n        \"ligand_network_planner\",\n        \"solvent\",\n        \"partial_charge\",\n    ],\n)\n\n\nclass MapperSelection(BaseModel):\n    model_config = ConfigDict(extra=\"allow\", str_to_lower=True)\n\n    method: Optional[str] = None\n    settings: dict[str, Any] = {}\n\n\nclass NetworkSelection(BaseModel):\n    model_config = ConfigDict(extra=\"allow\", str_to_lower=True)\n\n    method: Optional[str] = None\n    settings: dict[str, Any] = {}\n\n\nclass PartialChargeSelection(BaseModel):\n    model_config = ConfigDict(extra=\"allow\", str_to_lower=True)\n\n    method: Optional[str] = \"am1bcc\"\n    settings: dict[str, Any] = {}\n\n\nclass CliYaml(BaseModel):\n    model_config = ConfigDict(extra=\"allow\")\n\n    mapper: Optional[MapperSelection] = None\n    network: Optional[NetworkSelection] = None\n    partial_charge: Optional[PartialChargeSelection] = None\n\n\ndef parse_yaml_planner_options(contents: str) -> CliYaml:\n    \"\"\"Parse and minimally validate a user provided yaml\n\n    Parameters\n    ----------\n    contents : str\n      raw yaml formatted input to parse\n\n    Returns\n    -------\n    options : CliOptions\n      will have keys for mapper, network topology, and partial charge choices\n\n    Raises\n    ------\n    ValueError\n      for any malformed inputs\n    \"\"\"\n    raw = yaml.safe_load(contents)\n\n    expected_fields = {\"mapper\", \"network\", \"partial_charge\"}\n    present_fields = set(raw.keys())\n    usable_fields = present_fields.intersection(expected_fields)\n    ignored_fields = present_fields.difference(expected_fields)\n\n    for field in ignored_fields:\n        warnings.warn(f\"Ignoring unexpected section: '{field}'\")\n\n    filtered = {k: raw[k] for k in usable_fields}\n\n    return CliYaml(**filtered)\n\n\ndef load_yaml_planner_options(path: Optional[str], context) -> PlanNetworkOptions:\n    \"\"\"Load cli options from yaml file path and resolve these to objects\n\n    Parameters\n    ----------\n    path : str\n      path to the yaml file\n    context\n      unused\n\n    Returns\n    -------\n    PlanNetworkOptions : namedtuple\n      a namedtuple with fields 'mapper', 'scorer', 'network_planning_algorithm',\n      and 'solvent' fields.\n      these fields each hold appropriate objects ready for use\n    \"\"\"\n    from functools import partial\n\n    from gufe import SolventComponent\n\n    from openfe.protocols.openmm_utils.omm_settings import OpenFFPartialChargeSettings\n    from openfe.setup import (\n        KartografAtomMapper,\n        LomapAtomMapper,\n    )\n    from openfe.setup.atom_mapping.lomap_scorers import (\n        default_lomap_score,\n    )\n    from openfe.setup.ligand_network_planning import (\n        generate_lomap_network,\n        generate_maximal_network,\n        generate_minimal_redundant_network,\n        generate_minimal_spanning_network,\n        generate_radial_network,\n    )\n\n    if path is not None:\n        with open(path, \"r\") as f:\n            raw = f.read()\n\n        # convert raw yaml to normalised pydantic model\n        opt = parse_yaml_planner_options(raw)\n    else:\n        opt = None\n\n    # convert normalised inputs to objects\n    if opt and opt.mapper:\n        mapper_choices = {\n            \"lomap\": LomapAtomMapper,\n            \"lomapatommapper\": LomapAtomMapper,\n            \"kartograf\": KartografAtomMapper,\n            \"kartografatommapper\": KartografAtomMapper,\n        }\n\n        try:\n            cls = mapper_choices[opt.mapper.method]\n        except KeyError:\n            raise KeyError(f\"Bad mapper choice: '{opt.mapper.method}'\")\n        mapper_obj = cls(**opt.mapper.settings)\n    else:\n        mapper_obj = KartografAtomMapper(\n            atom_max_distance=0.95,\n            atom_map_hydrogens=True,\n            # Non-default setting, as we remove these later anyway when correcting for constraints\n            map_hydrogens_on_hydrogens_only=True,\n            map_exact_ring_matches_only=True,\n            # Current default, but should be changed in future Kartograf releases\n            allow_partial_fused_rings=True,\n            allow_bond_breaks=False,\n        )\n\n    # todo: choice of scorer goes here\n    mapping_scorer = default_lomap_score\n\n    if opt and opt.network:\n        network_choices = {\n            \"generate_radial_network\": generate_radial_network,\n            \"radial\": generate_radial_network,\n            \"generate_minimal_spanning_network\": generate_minimal_spanning_network,\n            \"mst\": generate_minimal_spanning_network,\n            \"generate_minimal_redundant_network\": generate_minimal_redundant_network,\n            \"generate_maximal_network\": generate_maximal_network,\n            \"generate_lomap_network\": generate_lomap_network,\n        }\n\n        try:\n            func = network_choices[opt.network.method]\n        except KeyError:\n            raise KeyError(f\"Bad network algorithm choice: '{opt.network.method}'\")\n\n        ligand_network_planner = partial(func, **opt.network.settings)\n    else:\n        ligand_network_planner = generate_minimal_spanning_network\n\n    # We default to am1bcc on ambertools\n    partial_charge_settings = OpenFFPartialChargeSettings()\n    if opt and opt.partial_charge:\n        partial_charge_settings.partial_charge_method = opt.partial_charge.method\n        for setting in opt.partial_charge.settings:\n            setattr(\n                partial_charge_settings,\n                setting,\n                opt.partial_charge.settings[setting],\n            )\n\n    # todo: choice of solvent goes here\n    solvent = SolventComponent()\n\n    return PlanNetworkOptions(\n        mapper_obj,\n        mapping_scorer,\n        ligand_network_planner,\n        solvent,\n        partial_charge_settings,\n    )\n\n\n# TODO: do we want this in the docs anywhere?\nDEFAULT_YAML = \"\"\"\n    mapper: kartograf\n        settings:\n            atom_max_distance: 0.95\n            atom_map_hydrogens: true\n            map_hydrogens_on_hydrogens_only: true\n            map_exact_ring_matches_only: true\n            allow_partial_fused_rings: true\n            allow_bond_breaks: false\n\n    network:\n        method: generate_minimal_spanning_network\n\n    partial_charge:\n        method: am1bcc\n        settings:\n            off_toolkit_backend: ambertools\n            number_of_conformers: None\n            nagl_model: None\n\"\"\"\n\n_yaml_help = \"\"\"\nPath to a YAML file specifying the atom mapper (``mapper``), network planning algorithm (``network``),\nand/or partial charge method (``partial_charge``) to use.\n\n\\b\nSupported atom mapper choices are:\n    - ``KartografAtomMapper`` (default as of v1.7.0)\n    - ``LomapAtomMapper``\n\\b\nSupported network planning algorithms include (but are not limited to):\n    - ``generate_minimal_spanning_network`` (default)\n    - ``generate_minimal_redundant_network``\n    - ``generate_radial_network``\n    - ``generate_lomap_network``\n\\b\nSupported partial charge method choices are:\n    - ``am1bcc`` (default)\n    - ``am1bccelf10`` (only possible if ``off_toolkit_backend`` is ``openeye``)\n    - ``nagl`` (must have openff-nagl installed)\n    - ``espaloma`` (must have espaloma_charge installed)\n\n``settings:`` allows for passing in any keyword arguments of the method's corresponding Python API.\n\nFor example:\n::\n\n  mapper:\n    method: LomapAtomMapper\n    settings:\n      element_change: false\n\n  network:\n    method: generate_minimal_redundant_network\n    settings:\n      mst_num: 3\n\n  partial_charge:\n    method: am1bcc\n    settings:\n      off_toolkit_backend: ambertools\n\n\"\"\"\n\nYAML_OPTIONS = Option(\n    \"-s\",\n    \"--settings\",\n    \"yaml_settings\",\n    type=click.Path(exists=True, dir_okay=False),\n    help=_yaml_help,\n    getter=load_yaml_planner_options,\n)\n"
  },
  {
    "path": "src/openfecli/parameters/protein.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\n\nfrom typing import Iterable\n\nimport click\nfrom plugcli.params import Option\n\n_PDB_EXT = [\".pdb\"]\n_PDBX_EXT = [\".cif\", \".pdbx\"]\n\n\ndef _contains_any_substring(input: str, substrings: Iterable[str]) -> bool:\n    return any([substring in input for substring in substrings])\n\n\ndef _load_protein_from_file(input_file, protein_class):\n    valid_ext = _PDB_EXT + _PDBX_EXT\n    info_str = (\n        f\"Unable to load a {protein_class.__name__} from {click.format_filename(input_file)}: \"\n    )\n    if not _contains_any_substring(input_file, valid_ext):\n        raise click.BadParameter(info_str + f\"File extension must contain one of: {valid_ext}.\")\n    try:\n        if _contains_any_substring(input_file, _PDB_EXT):\n            return protein_class.from_pdb_file(input_file)\n        elif _contains_any_substring(input_file, _PDBX_EXT):\n            return protein_class.from_pdbx_file(input_file)\n    except ValueError as e:\n        raise click.BadParameter(info_str + f\"{e}\")\n\n\n# TODO: these functions are shims to work with plugcli. We should consider migrating to just click.\ndef _get_protein(user_input, context):\n    from openfe import ProteinComponent\n\n    return _load_protein_from_file(user_input, ProteinComponent)\n\n\ndef _get_protein_membrane(user_input, context):\n    from openfe import ProteinMembraneComponent\n\n    return _load_protein_from_file(user_input, ProteinMembraneComponent)\n\n\nPROTEIN = Option(\n    \"-p\",\n    \"--protein\",\n    help=(\n        \"Path to a PDB or PDBx/mmCIF file containing a protein. Mutually exclusive with --protein-membrane.\"\n    ),\n    getter=_get_protein,\n)\n\nPROTEIN_MEMBRANE = Option(\n    \"--protein-membrane\",\n    help=(\n        'Path to a PDB or PDBx/mmCIF file containing a fully solvated protein-membrane system. Mutually exclusive with --protein. See \"Combining System Components into a Single PDB File\"'\n    ),\n    getter=_get_protein_membrane,\n)\n"
  },
  {
    "path": "src/openfecli/parameters/utils.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\n\nfrom plugcli.params import NOT_PARSED\n\nfrom openfecli.utils import import_thing\n\n\ndef import_parameter(import_str: str):\n    \"\"\"Return object from a qualname, or NOT_PARSED if not valid.\n\n    This is used specifically for parameter instantiation strategies based\n    on importing an object given by the user on the command line. If the\n    user input cannot interpreted as a qualname, then NOT_PARSED is\n    returned.\n\n    Parameters\n    ----------\n    import_str : str\n        the qualname\n\n    Returns\n    -------\n    Any :\n        the desired object or NOT_PARSED if an error was encountered.\n    \"\"\"\n    try:\n        result = import_thing(import_str)\n    except (ImportError, AttributeError):\n        result = NOT_PARSED\n    return result\n"
  },
  {
    "path": "src/openfecli/plan_alchemical_networks_utils.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\nfrom __future__ import annotations\n\nimport pathlib\n\nfrom openfe import AlchemicalNetwork, LigandNetwork\nfrom openfecli.utils import write\n\n\ndef plan_alchemical_network_output(\n    alchemical_network: AlchemicalNetwork,\n    ligand_network: LigandNetwork,\n    folder_path: pathlib.Path,\n):\n    \"\"\"Write the contents of an alchemical network into the structure\"\"\"\n\n    base_name = folder_path.name\n    folder_path.mkdir(parents=True, exist_ok=True)\n\n    an_json = folder_path / f\"{base_name}.json\"\n    alchemical_network.to_json(an_json)\n    write(\"\\t\\t- \" + base_name + \".json\")\n\n    ln_fname = \"ligand_network.graphml\"\n    with open(folder_path / ln_fname, mode=\"w\") as f:\n        f.write(ligand_network.to_graphml())\n    write(f\"\\t\\t- {ln_fname}\")\n\n    transformations_dir = folder_path / \"transformations\"\n    transformations_dir.mkdir(parents=True, exist_ok=True)\n\n    for transformation in alchemical_network.edges:\n        transformation_name = transformation.name or transformation.key\n        filename = f\"{transformation_name}.json\"\n        transformation.to_json(transformations_dir / filename)\n        write(\"\\t\\t\\t\\t- \" + filename)\n"
  },
  {
    "path": "src/openfecli/plugins.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\n\nfrom plugcli.plugin_management import CommandPlugin\n\n\nclass OFECommandPlugin(CommandPlugin):\n    def __init__(self, command, section, requires_ofe):\n        super().__init__(\n            command=command,\n            section=section,\n            requires_lib=requires_ofe,\n            requires_cli=requires_ofe,\n        )\n"
  },
  {
    "path": "src/openfecli/tests/__init__.py",
    "content": ""
  },
  {
    "path": "src/openfecli/tests/clicktypes/test_hyphenchoice.py",
    "content": "import click\nimport pytest\n\nfrom openfecli.clicktypes.hyphenchoice import HyphenAwareChoice\n\n\nclass TestHyphenAwareChoice:\n    @pytest.mark.parametrize(\"value\", [\"foo_bar_baz\", \"foo_bar-baz\", \"foo-bar_baz\", \"foo-bar-baz\"])\n    def test_init(self, value):\n        ch = HyphenAwareChoice([value])\n        assert ch.choices == (\"foo-bar-baz\",)\n\n    @pytest.mark.parametrize(\"value\", [\"foo_bar_baz\", \"foo_bar-baz\", \"foo-bar_baz\", \"foo-bar-baz\"])\n    def test_convert(self, value):\n        ch = HyphenAwareChoice([\"foo-bar-baz\"])\n        # counting on __call__ to get to convert()\n        assert ch(value) == \"foo-bar-baz\"\n"
  },
  {
    "path": "src/openfecli/tests/commands/__init__.py",
    "content": ""
  },
  {
    "path": "src/openfecli/tests/commands/conftest.py",
    "content": "import pytest\n\n\n@pytest.fixture\ndef min_result_json():\n    \"\"\"The minimal information a results json must have to be loaded by `openfe gather`.\"\"\"\n    result = {\n        \"estimate\": {},\n        \"uncertainty\": {},\n        \"protocol_result\": {\n            \"data\": {\n                \"22940961\": [\n                    {\n                        \"name\": \"lig_ejm_31 to lig_ejm_42 repeat 0 generation 0\",\n                        \"inputs\": {\n                            \"stateA\": {\n                                \"components\": {\n                                    \"ligand\": {\n                                        \"atoms\": [\n                                            [1, 0, 0, False, 0, 0, {}],\n                                            [6, 0, 0, True, 0, 0, {}],\n                                            [6, 0, 0, True, 0, 0, {}],\n                                            [6, 0, 0, True, 0, 0, {}],\n                                            [6, 0, 0, True, 0, 0, {}],\n                                            [6, 0, 0, True, 0, 0, {}],\n                                            [6, 0, 0, True, 0, 0, {}],\n                                            [1, 0, 0, False, 0, 0, {}],\n                                            [17, 0, 0, False, 0, 0, {}],\n                                            [6, 0, 0, False, 0, 0, {}],\n                                            [8, 0, 0, False, 0, 0, {}],\n                                            [7, 0, 0, False, 0, 0, {}],\n                                            [1, 0, 0, False, 0, 0, {}],\n                                            [6, 0, 0, True, 0, 0, {}],\n                                            [6, 0, 0, True, 0, 0, {}],\n                                            [6, 0, 0, True, 0, 0, {}],\n                                            [7, 0, 0, True, 0, 0, {}],\n                                            [6, 0, 0, True, 0, 0, {}],\n                                            [6, 0, 0, True, 0, 0, {}],\n                                            [1, 0, 0, False, 0, 0, {}],\n                                            [7, 0, 0, False, 0, 0, {}],\n                                            [1, 0, 0, False, 0, 0, {}],\n                                            [6, 0, 0, False, 0, 0, {}],\n                                            [8, 0, 0, False, 0, 0, {}],\n                                            [6, 0, 0, False, 0, 0, {}],\n                                            [1, 0, 0, False, 0, 0, {}],\n                                            [1, 0, 0, False, 0, 0, {}],\n                                            [1, 0, 0, False, 0, 0, {}],\n                                            [1, 0, 0, False, 0, 0, {}],\n                                            [1, 0, 0, False, 0, 0, {}],\n                                            [17, 0, 0, False, 0, 0, {}],\n                                            [1, 0, 0, False, 0, 0, {}],\n                                        ],\n                                        \"bonds\": [\n                                            [0, 1, 1, 0, {}],\n                                            [1, 6, 12, 0, {}],\n                                            [1, 2, 12, 0, {}],\n                                            [2, 3, 12, 0, {}],\n                                            [2, 31, 1, 0, {}],\n                                            [3, 4, 12, 0, {}],\n                                            [3, 30, 1, 0, {}],\n                                            [4, 5, 12, 0, {}],\n                                            [4, 9, 1, 0, {}],\n                                            [5, 6, 12, 0, {}],\n                                            [5, 8, 1, 0, {}],\n                                            [6, 7, 1, 0, {}],\n                                            [9, 10, 2, 0, {}],\n                                            [9, 11, 1, 0, {}],\n                                            [11, 12, 1, 0, {}],\n                                            [11, 13, 1, 0, {}],\n                                            [13, 18, 12, 0, {}],\n                                            [13, 14, 12, 0, {}],\n                                            [14, 15, 12, 0, {}],\n                                            [14, 29, 1, 0, {}],\n                                            [15, 16, 12, 0, {}],\n                                            [15, 28, 1, 0, {}],\n                                            [16, 17, 12, 0, {}],\n                                            [17, 18, 12, 0, {}],\n                                            [17, 20, 1, 0, {}],\n                                            [18, 19, 1, 0, {}],\n                                            [20, 21, 1, 0, {}],\n                                            [20, 22, 1, 0, {}],\n                                            [22, 23, 2, 0, {}],\n                                            [22, 24, 1, 0, {}],\n                                            [24, 25, 1, 0, {}],\n                                            [24, 26, 1, 0, {}],\n                                            [24, 27, 1, 0, {}],\n                                        ],\n                                        \"conformer\": [\n                                            \"\\u0093NUMPY\\u0001\\u0000v\\u0000{'descr': '<f8', 'fortran_order': False, 'shape': (32, 3), }                                                         \\n\\u00f3\\u008eSt$\\u0017\\u0013\\u00c0W[\\u00b1\\u00bf\\u00ec\\u009e\\u0006\\u00c09\\u00b4\\u00c8v\\u00be\\u007f0\\u00c05\\u00ef8EGr\\u0015\\u00c0P\\u008d\\u0097n\\u0012\\u0083\\r\\u00c0b\\u00a1\\u00d64\\u00ef80\\u00c0\\u0095e\\u0088c]\\u001c\\u0013\\u00c0\\u0096!\\u008euq\\u00db\\u0013\\u00c0\\u00a5,C\\u001c\\u00eb20\\u00c0j\\u00deq\\u008a\\u008e$\\u0016\\u00c0\\u00b4\\u00c8v\\u00be\\u009fZ\\u0018\\u00c0+\\u00f6\\u0097\\u00dd\\u0093\\u00a7/\\u00c0_\\u0007\\u00ce\\u0019Q\\u009a\\u001b\\u00c0d\\u00cc]K\\u00c8\\u00c7\\u0017\\u00c0m\\u00c5\\u00fe\\u00b2{\\u00f2.\\u00c0\\u009e\\u00ef\\u00a7\\u00c6K\\u00f7\\u001d\\u00c0p\\u00ce\\u0088\\u00d2\\u00de\\u00a0\\u0012\\u00c0\\u00e7\\u00fb\\u00a9\\u00f1\\u00d2\\r/\\u00c0r\\u008a\\u008e\\u00e4\\u00f2\\u00df\\u001a\\u00c0\\u00e1\\u000b\\u0093\\u00a9\\u0082Q\\f\\u00c0\\t\\u001b\\u009e^)\\u00cb/\\u00c0\\u00f7\\u00e4a\\u00a1\\u00d6\\u00b4\\u001c\\u00c0\\u0017\\u00b7\\u00d1\\u0000\\u00de\\u0082\\u0004\\u00c0\\u00e2X\\u0017\\u00b7\\u00d1\\u00e0/\\u00c0)\\u00cb\\u0010\\u00c7\\u00baX\\\"\\u00c0a2U0*\\u00a9\\u0011\\u00c0V\\u009f\\u00ab\\u00ad\\u00d8_.\\u00c0C\\u001c\\u00eb\\u00e26\\u00da\\u001e\\u00c0\\u0083/L\\u00a6\\n\\u0086\\u001c\\u00c0\\u00de\\u0093\\u0087\\u0085Z\\u0013.\\u00c0\\u00d3\\u00bc\\u00e3\\u0014\\u001dI \\u00c0\\u00ec/\\u00bb'\\u000f\\u00cb\\u001c\\u00c0h\\\"lxz\\u00c5+\\u00c0\\u009f\\u00cd\\u00aa\\u00cf\\u00d5\\u0096\\u001f\\u00c0\\u0094\\u0087\\u0085Z\\u00d3\\u001c \\u00c0t$\\u0097\\u00ff\\u0090\\u00fe/\\u00c0r\\u00f9\\u000f\\u00e9\\u00b7\\u00af\\u001d\\u00c0Gr\\u00f9\\u000f\\u00e9w\\u001f\\u00c0Zd;\\u00dfO\\u00dd0\\u00c0p_\\u0007\\u00ce\\u0019q!\\u00c0!\\u00b0rh\\u0091m\\\"\\u00c0\\u008c\\u00dbh\\u0000o\\u00010\\u00c0H\\u00e1z\\u0014\\u00ae'#\\u00c0\\u008a\\u00b0\\u00e1\\u00e9\\u00952#\\u00c0\\u009e^)\\u00cb\\u0010\\u00e7-\\u00c0\\u0085\\u00ebQ\\u00b8\\u001e\\u00c5$\\u00c0I.\\u00ff!\\u00fdv%\\u00c0M\\u00f3\\u008eStD.\\u00c0\\\\\\u008f\\u00c2\\u00f5(\\u00bc$\\u00c0\\nh\\\"lx\\u00fa&\\u00c0\\u00ff\\u00b2{\\u00f2\\u00b0@0\\u00c0Nb\\u0010X9\\u0014#\\u00c0?5^\\u00baIL&\\u00c0i\\u0000o\\u0081\\u0004E1\\u00c0=\\u009bU\\u009f\\u00abm!\\u00c0\\u008euq\\u001b\\r\\u0000$\\u00c0[\\u00b1\\u00bf\\u00ec\\u009e,1\\u00c0%\\u0006\\u0081\\u0095C+ \\u00c0\\u0088\\u0085Z\\u00d3\\u00bcc#\\u00c0\\u0003x\\u000b$(\\u00fe1\\u00c0\\u0012\\u00a5\\u00bd\\u00c1\\u0017&#\\u00c0\\u00cb\\u00a1E\\u00b6\\u00f3\\u00dd'\\u00c0io\\u00f0\\u0085\\u00c9t2\\u00c0\\u00ea\\u0095\\u00b2\\fq\\u00cc$\\u00c0\\u0018\\u0095\\u00d4\\th\\u0002)\\u00c0vO\\u001e\\u0016j\\u008d2\\u00c0\\u00bb\\u00b8\\u008d\\u0006\\u00f0V!\\u00c0\\u00c1\\u00ca\\u00a1E\\u00b6\\u0013(\\u00c0\\u00deq\\u008a\\u008e\\u00e4r3\\u00c0\\u00c5 \\u00b0rhQ\\u001e\\u00c0\\u00c5\\u00fe\\u00b2{\\u00f2\\u00f0&\\u00c0\\u00d1\\u0091\\\\\\u00feCz3\\u00c0B>\\u00e8\\u00d9\\u00ac\\u001a\\\"\\u00c0\\u0080\\u00b7@\\u0082\\u00e2\\u00e7)\\u00c0\\b=\\u009bU\\u009f\\u009b4\\u00c0r\\u00f9\\u000f\\u00e9\\u00b7O\\\"\\u00c0\\u00de\\u0093\\u0087\\u0085Z\\u00f3+\\u00c0o\\u0012\\u0083\\u00c0\\u00caA4\\u00c0\\u008a\\u008e\\u00e4\\u00f2\\u001f\\u0092 \\u00c0\\u00aa`TR'\\u00e0)\\u00c0n4\\u0080\\u00b7@b5\\u00c0\\u00e8j+\\u00f6\\u0097\\u00fd#\\u00c0\\u00b3{\\u00f2\\u00b0PK)\\u00c0:#J{\\u0083\\u000f5\\u00c0\\u008c\\u00dbh\\u0000o!&\\u00c0\\u00d9=yX\\u00a8\\u0015&\\u00c0\\u0012\\u0014?\\u00c6\\u00dc\\u00b5,\\u00c0\\u00a5\\u00bd\\u00c1\\u0017&S#\\u00c0io\\u00f0\\u0085\\u00c9\\u0014\\\"\\u00c0\\u00ab\\u00cf\\u00d5V\\u00ec\\u000f,\\u00c0\\u00e0\\u009c\\u0011\\u00a5\\u00bd\\u0001\\u0013\\u00c0\\u00ad\\u00fa\\\\m\\u00c5~\\u001e\\u00c0L7\\u0089A`\\u00a5/\\u00c0\\u0002\\u009a\\b\\u001b\\u009e\\u00de\\r\\u00c0\\u00c8\\u0098\\u00bb\\u0096\\u0090O\\u0014\\u00c0N\\u00d1\\u0091\\\\\\u00fes0\\u00c0\",\n                                            {},\n                                        ],\n                                        \"molprops\": {\"ofe-name\": \"lig_ejm_31\"},\n                                        \"__qualname__\": \"SmallMoleculeComponent\",\n                                        \"__module__\": \"gufe.components.smallmoleculecomponent\",\n                                    },\n                                    \"solvent\": {\n                                        \"smiles\": \"O\",\n                                        \"positive_ion\": \"Na+\",\n                                        \"negative_ion\": \"Cl-\",\n                                        \"ion_concentration\": \"0.15 molar\",\n                                        \"neutralize\": True,\n                                        \"__qualname__\": \"SolventComponent\",\n                                        \"__module__\": \"gufe.components.solventcomponent\",\n                                    },\n                                },\n                                \"name\": \"lig_ejm_31_solvent\",\n                                \"__qualname__\": \"ChemicalSystem\",\n                                \"__module__\": \"gufe.chemicalsystem\",\n                            },\n                            \"stateB\": {\n                                \"components\": {\n                                    \"ligand\": {\n                                        \"atoms\": [\n                                            [1, 0, 0, False, 0, 0, {}],\n                                            [6, 0, 0, True, 0, 0, {}],\n                                            [6, 0, 0, True, 0, 0, {}],\n                                            [6, 0, 0, True, 0, 0, {}],\n                                            [6, 0, 0, True, 0, 0, {}],\n                                            [6, 0, 0, True, 0, 0, {}],\n                                            [6, 0, 0, True, 0, 0, {}],\n                                            [1, 0, 0, False, 0, 0, {}],\n                                            [17, 0, 0, False, 0, 0, {}],\n                                            [6, 0, 0, False, 0, 0, {}],\n                                            [8, 0, 0, False, 0, 0, {}],\n                                            [7, 0, 0, False, 0, 0, {}],\n                                            [1, 0, 0, False, 0, 0, {}],\n                                            [6, 0, 0, True, 0, 0, {}],\n                                            [6, 0, 0, True, 0, 0, {}],\n                                            [6, 0, 0, True, 0, 0, {}],\n                                            [7, 0, 0, True, 0, 0, {}],\n                                            [6, 0, 0, True, 0, 0, {}],\n                                            [6, 0, 0, True, 0, 0, {}],\n                                            [1, 0, 0, False, 0, 0, {}],\n                                            [7, 0, 0, False, 0, 0, {}],\n                                            [1, 0, 0, False, 0, 0, {}],\n                                            [6, 0, 0, False, 0, 0, {}],\n                                            [8, 0, 0, False, 0, 0, {}],\n                                            [6, 0, 0, False, 0, 0, {}],\n                                            [1, 0, 0, False, 0, 0, {}],\n                                            [1, 0, 0, False, 0, 0, {}],\n                                            [6, 0, 0, False, 0, 0, {}],\n                                            [1, 0, 0, False, 0, 0, {}],\n                                            [1, 0, 0, False, 0, 0, {}],\n                                            [1, 0, 0, False, 0, 0, {}],\n                                            [1, 0, 0, False, 0, 0, {}],\n                                            [1, 0, 0, False, 0, 0, {}],\n                                            [17, 0, 0, False, 0, 0, {}],\n                                            [1, 0, 0, False, 0, 0, {}],\n                                        ],\n                                        \"bonds\": [\n                                            [0, 1, 1, 0, {}],\n                                            [1, 6, 12, 0, {}],\n                                            [1, 2, 12, 0, {}],\n                                            [2, 3, 12, 0, {}],\n                                            [2, 34, 1, 0, {}],\n                                            [3, 4, 12, 0, {}],\n                                            [3, 33, 1, 0, {}],\n                                            [4, 5, 12, 0, {}],\n                                            [4, 9, 1, 0, {}],\n                                            [5, 6, 12, 0, {}],\n                                            [5, 8, 1, 0, {}],\n                                            [6, 7, 1, 0, {}],\n                                            [9, 10, 2, 0, {}],\n                                            [9, 11, 1, 0, {}],\n                                            [11, 12, 1, 0, {}],\n                                            [11, 13, 1, 0, {}],\n                                            [13, 18, 12, 0, {}],\n                                            [13, 14, 12, 0, {}],\n                                            [14, 15, 12, 0, {}],\n                                            [14, 32, 1, 0, {}],\n                                            [15, 16, 12, 0, {}],\n                                            [15, 31, 1, 0, {}],\n                                            [16, 17, 12, 0, {}],\n                                            [17, 18, 12, 0, {}],\n                                            [17, 20, 1, 0, {}],\n                                            [18, 19, 1, 0, {}],\n                                            [20, 21, 1, 0, {}],\n                                            [20, 22, 1, 0, {}],\n                                            [22, 23, 2, 0, {}],\n                                            [22, 24, 1, 0, {}],\n                                            [24, 25, 1, 0, {}],\n                                            [24, 26, 1, 0, {}],\n                                            [24, 27, 1, 0, {}],\n                                            [27, 28, 1, 0, {}],\n                                            [27, 29, 1, 0, {}],\n                                            [27, 30, 1, 0, {}],\n                                        ],\n                                        \"conformer\": [\n                                            \"\\u0093NUMPY\\u0001\\u0000v\\u0000{'descr': '<f8', 'fortran_order': False, 'shape': (35, 3), }                                                         \\n\\u00ac\\u00ad\\u00d8_v\\u000f\\u0013\\u00c0\\u009a\\b\\u001b\\u009e^\\u00a9\\u0006\\u00c0\\u0019\\u0004V\\u000e-\\u00820\\u00c0\\u00b0\\u0003\\u00e7\\u008c(m\\u0015\\u00c0]\\u00dcF\\u0003x\\u008b\\r\\u00c0C\\u001c\\u00eb\\u00e26:0\\u00c0io\\u00f0\\u0085\\u00c9\\u0014\\u0013\\u00c0\\u00c5\\u008f1w-\\u00e1\\u0013\\u00c03333330\\u00c0\\u0001\\u00de\\u0002\\t\\u008a\\u001f\\u0016\\u00c0\\u00fee\\u00f7\\u00e4aa\\u0018\\u00c0a2U0*\\u00a9/\\u00c0\\u00f8\\u00c2d\\u00aa`\\u0094\\u001b\\u00c0\\u0004\\u00e7\\u008c(\\u00ed\\u00cd\\u0017\\u00c0\\u00a85\\u00cd;N\\u00f1.\\u00c0\\u00db\\u00f9~j\\u00bc\\u00f4\\u001d\\u00c0e\\u00aa`TR\\u00a7\\u0012\\u00c0\\u0091~\\u00fb:p\\u000e/\\u00c0\\u00cc\\u007fH\\u00bf}\\u00dd\\u001a\\u00c0>\\u00e8\\u00d9\\u00ac\\u00fa\\\\\\f\\u00c0\\u00aeG\\u00e1z\\u0014\\u00ce/\\u00c0\\u0001M\\u0084\\rO\\u00af\\u001c\\u00c0\\u00d5x\\u00e9&1\\u0088\\u0004\\u00c0M\\u00f3\\u008eSt\\u00e4/\\u00c0\\u009c3\\u00a2\\u00b47X\\\"\\u00c0\\u0088\\u00f4\\u00db\\u00d7\\u0081\\u00b3\\u0011\\u00c0U\\u00c1\\u00a8\\u00a4N`.\\u00c0q\\u001b\\r\\u00e0-\\u00d0\\u001e\\u00c0\\u00af%\\u00e4\\u0083\\u009e\\u008d\\u001c\\u00c0\\u0002+\\u0087\\u0016\\u00d9\\u000e.\\u00c0-!\\u001f\\u00f4l6 \\u00c0\\u009bU\\u009f\\u00ab\\u00ad\\u00d8\\u001c\\u00c0xz\\u00a5,C\\u00bc+\\u00c0T\\u00e3\\u00a5\\u009b\\u00c4\\u00a0\\u001f\\u00c0\\u0099\\u00bb\\u0096\\u0090\\u000f\\u001a \\u00c09\\u00b4\\u00c8v\\u00be\\u00ff/\\u00c0:\\u0092\\u00cb\\u007fH\\u00bf\\u001d\\u00c0:#J{\\u0083o\\u001f\\u00c0\\u001f\\u0085\\u00ebQ\\u00b8\\u00de0\\u00c0\\u00f8\\u00c2d\\u00aa`t!\\u00c0\\t\\u001b\\u009e^)k\\\"\\u00c0\\u00fee\\u00f7\\u00e4a\\u00010\\u00c0b\\u0010X9\\u00b4(#\\u00c0\\u0006\\u0081\\u0095C\\u008b,#\\u00c0h\\\"lxz\\u00e5-\\u00c0\\u0016\\u00fb\\u00cb\\u00ee\\u00c9\\u00c3$\\u00c0\\u00c1\\u00ca\\u00a1E\\u00b6s%\\u00c0\\u00cd;N\\u00d1\\u0091<.\\u00c0\\u0093\\u00a9\\u0082QI\\u00bd$\\u00c0xz\\u00a5,C\\u00fc&\\u00c0\\u00ec/\\u00bb'\\u000f;0\\u00c0\\u00b6\\u0084|\\u00d0\\u00b3\\u0019#\\u00c0\\u0002+\\u0087\\u0016\\u00d9N&\\u00c0\\u008c\\u00dbh\\u0000oA1\\u00c0\\u00fc\\u0018s\\u00d7\\u0012r!\\u00c0R'\\u00a0\\u0089\\u00b0\\u0001$\\u00c0A\\u00f1c\\u00cc]+1\\u00c04\\u00116<\\u00bd2 \\u00c0\\u0010\\u00e9\\u00b7\\u00af\\u0003g#\\u00c0 c\\u00eeZB\\u00fe1\\u00c0\\u00b2\\u009d\\u00ef\\u00a7\\u00c6+#\\u00c0\\u00b8\\u00af\\u0003\\u00e7\\u008c\\u00e8'\\u00c0V\\u000e-\\u00b2\\u009do2\\u00c00\\u00bb'\\u000f\\u000b\\u00d5$\\u00c0\\u00e8\\u00d9\\u00ac\\u00fa\\\\\\r)\\u00c0+\\u00f6\\u0097\\u00dd\\u0093\\u00872\\u00c0\\u00ac\\u001cZd;_!\\u00c0\\u00b8\\u00af\\u0003\\u00e7\\u008c((\\u00c0X\\u00ca2\\u00c4\\u00b1n3\\u00c0\\u00deq\\u008a\\u008e\\u00e4r\\u001e\\u00c0\\u00a0\\u0089\\u00b0\\u00e1\\u00e9\\u00f5&\\u00c0\\\"\\u00fd\\u00f6u\\u00e0|3\\u00c0yX\\u00a85\\u00cd\\u001b\\\"\\u00c0(\\u000f\\u000b\\u00b5\\u00a6\\u0019*\\u00c0\\u00e3\\u00a5\\u009b\\u00c4 \\u00904\\u00c01\\b\\u00ac\\u001cZ\\u00e4\\\"\\u00c0Y\\u00868\\u00d6\\u00c5\\u00ed(\\u00c0\\u00a2E\\u00b6\\u00f3\\u00fdd5\\u00c0\\u00d5\\u00e7j+\\u00f6\\u00b7#\\u00c0\\u008cJ\\u00ea\\u00044q+\\u00c0\\u00e0\\u00be\\u000e\\u009c3B4\\u00c0\\u00b3{\\u00f2\\u00b0Pk\\u001f\\u00c0\\u00bb'\\u000f\\u000b\\u00b5\\u00c6+\\u00c0\\u00b6\\u00f3\\u00fd\\u00d4x\\t5\\u00c0vq\\u001b\\r\\u00e0M \\u00c0\\u008c\\u00dbh\\u0000o!-\\u00c0\\u00bc\\u0096\\u0090\\u000fz\\u00d65\\u00c0_\\u0098L\\u0015\\u008c\\u00ca\\u001d\\u00c0\\u00d1\\u0091\\\\\\u00feC\\u00fa,\\u00c0a\\u00c3\\u00d3+e94\\u00c0K\\u00ea\\u00044\\u00116\\u001c\\u00c0\\u00a2\\u00b47\\u00f8\\u00c2\\u0084*\\u00c0[\\u00b1\\u00bf\\u00ec\\u009el5\\u00c0X9\\u00b4\\u00c8v\\u001e&\\u00c0p_\\u0007\\u00ce\\u0019\\u0011&\\u00c0\\u00ce\\u0088\\u00d2\\u00de\\u00e0\\u00ab,\\u00c0\\u00d5\\u00e7j+\\u00f6W#\\u00c0^\\u00baI\\f\\u0002\\u000b\\\"\\u00c08gDio\\u0010,\\u00c0\\u00c6m4\\u0080\\u00b7\\u0000\\u0013\\u00c0\\\\ A\\u00f1c\\u008c\\u001e\\u00c0\\u009e^)\\u00cb\\u0010\\u00a7/\\u00c0\\u00e7\\u00fb\\u00a9\\u00f1\\u00d2\\u00cd\\r\\u00c0\\u009d\\u0011\\u00a5\\u00bd\\u00c1W\\u0014\\u00c0\\u00f7\\u00e4a\\u00a1\\u00d6t0\\u00c0\",\n                                            {},\n                                        ],\n                                        \"molprops\": {\"ofe-name\": \"lig_ejm_42\"},\n                                        \"__qualname__\": \"SmallMoleculeComponent\",\n                                        \"__module__\": \"gufe.components.smallmoleculecomponent\",\n                                    },\n                                    \"solvent\": {\n                                        \"smiles\": \"O\",\n                                        \"positive_ion\": \"Na+\",\n                                        \"negative_ion\": \"Cl-\",\n                                        \"ion_concentration\": \"0.15 molar\",\n                                        \"neutralize\": True,\n                                        \"__qualname__\": \"SolventComponent\",\n                                        \"__module__\": \"gufe.components.solventcomponent\",\n                                    },\n                                },\n                                \"name\": \"lig_ejm_42_solvent\",\n                                \"__qualname__\": \"ChemicalSystem\",\n                                \"__module__\": \"gufe.chemicalsystem\",\n                            },\n                            \"ligandmapping\": {\n                                \"componentA\": {\n                                    \"atoms\": [\n                                        [1, 0, 0, False, 0, 0, {}],\n                                        [6, 0, 0, True, 0, 0, {}],\n                                        [6, 0, 0, True, 0, 0, {}],\n                                        [6, 0, 0, True, 0, 0, {}],\n                                        [6, 0, 0, True, 0, 0, {}],\n                                        [6, 0, 0, True, 0, 0, {}],\n                                        [6, 0, 0, True, 0, 0, {}],\n                                        [1, 0, 0, False, 0, 0, {}],\n                                        [17, 0, 0, False, 0, 0, {}],\n                                        [6, 0, 0, False, 0, 0, {}],\n                                        [8, 0, 0, False, 0, 0, {}],\n                                        [7, 0, 0, False, 0, 0, {}],\n                                        [1, 0, 0, False, 0, 0, {}],\n                                        [6, 0, 0, True, 0, 0, {}],\n                                        [6, 0, 0, True, 0, 0, {}],\n                                        [6, 0, 0, True, 0, 0, {}],\n                                        [7, 0, 0, True, 0, 0, {}],\n                                        [6, 0, 0, True, 0, 0, {}],\n                                        [6, 0, 0, True, 0, 0, {}],\n                                        [1, 0, 0, False, 0, 0, {}],\n                                        [7, 0, 0, False, 0, 0, {}],\n                                        [1, 0, 0, False, 0, 0, {}],\n                                        [6, 0, 0, False, 0, 0, {}],\n                                        [8, 0, 0, False, 0, 0, {}],\n                                        [6, 0, 0, False, 0, 0, {}],\n                                        [1, 0, 0, False, 0, 0, {}],\n                                        [1, 0, 0, False, 0, 0, {}],\n                                        [1, 0, 0, False, 0, 0, {}],\n                                        [1, 0, 0, False, 0, 0, {}],\n                                        [1, 0, 0, False, 0, 0, {}],\n                                        [17, 0, 0, False, 0, 0, {}],\n                                        [1, 0, 0, False, 0, 0, {}],\n                                    ],\n                                    \"bonds\": [\n                                        [0, 1, 1, 0, {}],\n                                        [1, 6, 12, 0, {}],\n                                        [1, 2, 12, 0, {}],\n                                        [2, 3, 12, 0, {}],\n                                        [2, 31, 1, 0, {}],\n                                        [3, 4, 12, 0, {}],\n                                        [3, 30, 1, 0, {}],\n                                        [4, 5, 12, 0, {}],\n                                        [4, 9, 1, 0, {}],\n                                        [5, 6, 12, 0, {}],\n                                        [5, 8, 1, 0, {}],\n                                        [6, 7, 1, 0, {}],\n                                        [9, 10, 2, 0, {}],\n                                        [9, 11, 1, 0, {}],\n                                        [11, 12, 1, 0, {}],\n                                        [11, 13, 1, 0, {}],\n                                        [13, 18, 12, 0, {}],\n                                        [13, 14, 12, 0, {}],\n                                        [14, 15, 12, 0, {}],\n                                        [14, 29, 1, 0, {}],\n                                        [15, 16, 12, 0, {}],\n                                        [15, 28, 1, 0, {}],\n                                        [16, 17, 12, 0, {}],\n                                        [17, 18, 12, 0, {}],\n                                        [17, 20, 1, 0, {}],\n                                        [18, 19, 1, 0, {}],\n                                        [20, 21, 1, 0, {}],\n                                        [20, 22, 1, 0, {}],\n                                        [22, 23, 2, 0, {}],\n                                        [22, 24, 1, 0, {}],\n                                        [24, 25, 1, 0, {}],\n                                        [24, 26, 1, 0, {}],\n                                        [24, 27, 1, 0, {}],\n                                    ],\n                                    \"conformer\": [\n                                        \"\\u0093NUMPY\\u0001\\u0000v\\u0000{'descr': '<f8', 'fortran_order': False, 'shape': (32, 3), }                                                         \\n\\u00f3\\u008eSt$\\u0017\\u0013\\u00c0W[\\u00b1\\u00bf\\u00ec\\u009e\\u0006\\u00c09\\u00b4\\u00c8v\\u00be\\u007f0\\u00c05\\u00ef8EGr\\u0015\\u00c0P\\u008d\\u0097n\\u0012\\u0083\\r\\u00c0b\\u00a1\\u00d64\\u00ef80\\u00c0\\u0095e\\u0088c]\\u001c\\u0013\\u00c0\\u0096!\\u008euq\\u00db\\u0013\\u00c0\\u00a5,C\\u001c\\u00eb20\\u00c0j\\u00deq\\u008a\\u008e$\\u0016\\u00c0\\u00b4\\u00c8v\\u00be\\u009fZ\\u0018\\u00c0+\\u00f6\\u0097\\u00dd\\u0093\\u00a7/\\u00c0_\\u0007\\u00ce\\u0019Q\\u009a\\u001b\\u00c0d\\u00cc]K\\u00c8\\u00c7\\u0017\\u00c0m\\u00c5\\u00fe\\u00b2{\\u00f2.\\u00c0\\u009e\\u00ef\\u00a7\\u00c6K\\u00f7\\u001d\\u00c0p\\u00ce\\u0088\\u00d2\\u00de\\u00a0\\u0012\\u00c0\\u00e7\\u00fb\\u00a9\\u00f1\\u00d2\\r/\\u00c0r\\u008a\\u008e\\u00e4\\u00f2\\u00df\\u001a\\u00c0\\u00e1\\u000b\\u0093\\u00a9\\u0082Q\\f\\u00c0\\t\\u001b\\u009e^)\\u00cb/\\u00c0\\u00f7\\u00e4a\\u00a1\\u00d6\\u00b4\\u001c\\u00c0\\u0017\\u00b7\\u00d1\\u0000\\u00de\\u0082\\u0004\\u00c0\\u00e2X\\u0017\\u00b7\\u00d1\\u00e0/\\u00c0)\\u00cb\\u0010\\u00c7\\u00baX\\\"\\u00c0a2U0*\\u00a9\\u0011\\u00c0V\\u009f\\u00ab\\u00ad\\u00d8_.\\u00c0C\\u001c\\u00eb\\u00e26\\u00da\\u001e\\u00c0\\u0083/L\\u00a6\\n\\u0086\\u001c\\u00c0\\u00de\\u0093\\u0087\\u0085Z\\u0013.\\u00c0\\u00d3\\u00bc\\u00e3\\u0014\\u001dI \\u00c0\\u00ec/\\u00bb'\\u000f\\u00cb\\u001c\\u00c0h\\\"lxz\\u00c5+\\u00c0\\u009f\\u00cd\\u00aa\\u00cf\\u00d5\\u0096\\u001f\\u00c0\\u0094\\u0087\\u0085Z\\u00d3\\u001c \\u00c0t$\\u0097\\u00ff\\u0090\\u00fe/\\u00c0r\\u00f9\\u000f\\u00e9\\u00b7\\u00af\\u001d\\u00c0Gr\\u00f9\\u000f\\u00e9w\\u001f\\u00c0Zd;\\u00dfO\\u00dd0\\u00c0p_\\u0007\\u00ce\\u0019q!\\u00c0!\\u00b0rh\\u0091m\\\"\\u00c0\\u008c\\u00dbh\\u0000o\\u00010\\u00c0H\\u00e1z\\u0014\\u00ae'#\\u00c0\\u008a\\u00b0\\u00e1\\u00e9\\u00952#\\u00c0\\u009e^)\\u00cb\\u0010\\u00e7-\\u00c0\\u0085\\u00ebQ\\u00b8\\u001e\\u00c5$\\u00c0I.\\u00ff!\\u00fdv%\\u00c0M\\u00f3\\u008eStD.\\u00c0\\\\\\u008f\\u00c2\\u00f5(\\u00bc$\\u00c0\\nh\\\"lx\\u00fa&\\u00c0\\u00ff\\u00b2{\\u00f2\\u00b0@0\\u00c0Nb\\u0010X9\\u0014#\\u00c0?5^\\u00baIL&\\u00c0i\\u0000o\\u0081\\u0004E1\\u00c0=\\u009bU\\u009f\\u00abm!\\u00c0\\u008euq\\u001b\\r\\u0000$\\u00c0[\\u00b1\\u00bf\\u00ec\\u009e,1\\u00c0%\\u0006\\u0081\\u0095C+ \\u00c0\\u0088\\u0085Z\\u00d3\\u00bcc#\\u00c0\\u0003x\\u000b$(\\u00fe1\\u00c0\\u0012\\u00a5\\u00bd\\u00c1\\u0017&#\\u00c0\\u00cb\\u00a1E\\u00b6\\u00f3\\u00dd'\\u00c0io\\u00f0\\u0085\\u00c9t2\\u00c0\\u00ea\\u0095\\u00b2\\fq\\u00cc$\\u00c0\\u0018\\u0095\\u00d4\\th\\u0002)\\u00c0vO\\u001e\\u0016j\\u008d2\\u00c0\\u00bb\\u00b8\\u008d\\u0006\\u00f0V!\\u00c0\\u00c1\\u00ca\\u00a1E\\u00b6\\u0013(\\u00c0\\u00deq\\u008a\\u008e\\u00e4r3\\u00c0\\u00c5 \\u00b0rhQ\\u001e\\u00c0\\u00c5\\u00fe\\u00b2{\\u00f2\\u00f0&\\u00c0\\u00d1\\u0091\\\\\\u00feCz3\\u00c0B>\\u00e8\\u00d9\\u00ac\\u001a\\\"\\u00c0\\u0080\\u00b7@\\u0082\\u00e2\\u00e7)\\u00c0\\b=\\u009bU\\u009f\\u009b4\\u00c0r\\u00f9\\u000f\\u00e9\\u00b7O\\\"\\u00c0\\u00de\\u0093\\u0087\\u0085Z\\u00f3+\\u00c0o\\u0012\\u0083\\u00c0\\u00caA4\\u00c0\\u008a\\u008e\\u00e4\\u00f2\\u001f\\u0092 \\u00c0\\u00aa`TR'\\u00e0)\\u00c0n4\\u0080\\u00b7@b5\\u00c0\\u00e8j+\\u00f6\\u0097\\u00fd#\\u00c0\\u00b3{\\u00f2\\u00b0PK)\\u00c0:#J{\\u0083\\u000f5\\u00c0\\u008c\\u00dbh\\u0000o!&\\u00c0\\u00d9=yX\\u00a8\\u0015&\\u00c0\\u0012\\u0014?\\u00c6\\u00dc\\u00b5,\\u00c0\\u00a5\\u00bd\\u00c1\\u0017&S#\\u00c0io\\u00f0\\u0085\\u00c9\\u0014\\\"\\u00c0\\u00ab\\u00cf\\u00d5V\\u00ec\\u000f,\\u00c0\\u00e0\\u009c\\u0011\\u00a5\\u00bd\\u0001\\u0013\\u00c0\\u00ad\\u00fa\\\\m\\u00c5~\\u001e\\u00c0L7\\u0089A`\\u00a5/\\u00c0\\u0002\\u009a\\b\\u001b\\u009e\\u00de\\r\\u00c0\\u00c8\\u0098\\u00bb\\u0096\\u0090O\\u0014\\u00c0N\\u00d1\\u0091\\\\\\u00fes0\\u00c0\",\n                                        {},\n                                    ],\n                                    \"molprops\": {\"ofe-name\": \"lig_ejm_31\"},\n                                    \"__qualname__\": \"SmallMoleculeComponent\",\n                                    \"__module__\": \"gufe.components.smallmoleculecomponent\",\n                                },\n                                \"componentB\": {\n                                    \"atoms\": [\n                                        [1, 0, 0, False, 0, 0, {}],\n                                        [6, 0, 0, True, 0, 0, {}],\n                                        [6, 0, 0, True, 0, 0, {}],\n                                        [6, 0, 0, True, 0, 0, {}],\n                                        [6, 0, 0, True, 0, 0, {}],\n                                        [6, 0, 0, True, 0, 0, {}],\n                                        [6, 0, 0, True, 0, 0, {}],\n                                        [1, 0, 0, False, 0, 0, {}],\n                                        [17, 0, 0, False, 0, 0, {}],\n                                        [6, 0, 0, False, 0, 0, {}],\n                                        [8, 0, 0, False, 0, 0, {}],\n                                        [7, 0, 0, False, 0, 0, {}],\n                                        [1, 0, 0, False, 0, 0, {}],\n                                        [6, 0, 0, True, 0, 0, {}],\n                                        [6, 0, 0, True, 0, 0, {}],\n                                        [6, 0, 0, True, 0, 0, {}],\n                                        [7, 0, 0, True, 0, 0, {}],\n                                        [6, 0, 0, True, 0, 0, {}],\n                                        [6, 0, 0, True, 0, 0, {}],\n                                        [1, 0, 0, False, 0, 0, {}],\n                                        [7, 0, 0, False, 0, 0, {}],\n                                        [1, 0, 0, False, 0, 0, {}],\n                                        [6, 0, 0, False, 0, 0, {}],\n                                        [8, 0, 0, False, 0, 0, {}],\n                                        [6, 0, 0, False, 0, 0, {}],\n                                        [1, 0, 0, False, 0, 0, {}],\n                                        [1, 0, 0, False, 0, 0, {}],\n                                        [6, 0, 0, False, 0, 0, {}],\n                                        [1, 0, 0, False, 0, 0, {}],\n                                        [1, 0, 0, False, 0, 0, {}],\n                                        [1, 0, 0, False, 0, 0, {}],\n                                        [1, 0, 0, False, 0, 0, {}],\n                                        [1, 0, 0, False, 0, 0, {}],\n                                        [17, 0, 0, False, 0, 0, {}],\n                                        [1, 0, 0, False, 0, 0, {}],\n                                    ],\n                                    \"bonds\": [\n                                        [0, 1, 1, 0, {}],\n                                        [1, 6, 12, 0, {}],\n                                        [1, 2, 12, 0, {}],\n                                        [2, 3, 12, 0, {}],\n                                        [2, 34, 1, 0, {}],\n                                        [3, 4, 12, 0, {}],\n                                        [3, 33, 1, 0, {}],\n                                        [4, 5, 12, 0, {}],\n                                        [4, 9, 1, 0, {}],\n                                        [5, 6, 12, 0, {}],\n                                        [5, 8, 1, 0, {}],\n                                        [6, 7, 1, 0, {}],\n                                        [9, 10, 2, 0, {}],\n                                        [9, 11, 1, 0, {}],\n                                        [11, 12, 1, 0, {}],\n                                        [11, 13, 1, 0, {}],\n                                        [13, 18, 12, 0, {}],\n                                        [13, 14, 12, 0, {}],\n                                        [14, 15, 12, 0, {}],\n                                        [14, 32, 1, 0, {}],\n                                        [15, 16, 12, 0, {}],\n                                        [15, 31, 1, 0, {}],\n                                        [16, 17, 12, 0, {}],\n                                        [17, 18, 12, 0, {}],\n                                        [17, 20, 1, 0, {}],\n                                        [18, 19, 1, 0, {}],\n                                        [20, 21, 1, 0, {}],\n                                        [20, 22, 1, 0, {}],\n                                        [22, 23, 2, 0, {}],\n                                        [22, 24, 1, 0, {}],\n                                        [24, 25, 1, 0, {}],\n                                        [24, 26, 1, 0, {}],\n                                        [24, 27, 1, 0, {}],\n                                        [27, 28, 1, 0, {}],\n                                        [27, 29, 1, 0, {}],\n                                        [27, 30, 1, 0, {}],\n                                    ],\n                                    \"conformer\": [\n                                        \"\\u0093NUMPY\\u0001\\u0000v\\u0000{'descr': '<f8', 'fortran_order': False, 'shape': (35, 3), }                                                         \\n\\u00ac\\u00ad\\u00d8_v\\u000f\\u0013\\u00c0\\u009a\\b\\u001b\\u009e^\\u00a9\\u0006\\u00c0\\u0019\\u0004V\\u000e-\\u00820\\u00c0\\u00b0\\u0003\\u00e7\\u008c(m\\u0015\\u00c0]\\u00dcF\\u0003x\\u008b\\r\\u00c0C\\u001c\\u00eb\\u00e26:0\\u00c0io\\u00f0\\u0085\\u00c9\\u0014\\u0013\\u00c0\\u00c5\\u008f1w-\\u00e1\\u0013\\u00c03333330\\u00c0\\u0001\\u00de\\u0002\\t\\u008a\\u001f\\u0016\\u00c0\\u00fee\\u00f7\\u00e4aa\\u0018\\u00c0a2U0*\\u00a9/\\u00c0\\u00f8\\u00c2d\\u00aa`\\u0094\\u001b\\u00c0\\u0004\\u00e7\\u008c(\\u00ed\\u00cd\\u0017\\u00c0\\u00a85\\u00cd;N\\u00f1.\\u00c0\\u00db\\u00f9~j\\u00bc\\u00f4\\u001d\\u00c0e\\u00aa`TR\\u00a7\\u0012\\u00c0\\u0091~\\u00fb:p\\u000e/\\u00c0\\u00cc\\u007fH\\u00bf}\\u00dd\\u001a\\u00c0>\\u00e8\\u00d9\\u00ac\\u00fa\\\\\\f\\u00c0\\u00aeG\\u00e1z\\u0014\\u00ce/\\u00c0\\u0001M\\u0084\\rO\\u00af\\u001c\\u00c0\\u00d5x\\u00e9&1\\u0088\\u0004\\u00c0M\\u00f3\\u008eSt\\u00e4/\\u00c0\\u009c3\\u00a2\\u00b47X\\\"\\u00c0\\u0088\\u00f4\\u00db\\u00d7\\u0081\\u00b3\\u0011\\u00c0U\\u00c1\\u00a8\\u00a4N`.\\u00c0q\\u001b\\r\\u00e0-\\u00d0\\u001e\\u00c0\\u00af%\\u00e4\\u0083\\u009e\\u008d\\u001c\\u00c0\\u0002+\\u0087\\u0016\\u00d9\\u000e.\\u00c0-!\\u001f\\u00f4l6 \\u00c0\\u009bU\\u009f\\u00ab\\u00ad\\u00d8\\u001c\\u00c0xz\\u00a5,C\\u00bc+\\u00c0T\\u00e3\\u00a5\\u009b\\u00c4\\u00a0\\u001f\\u00c0\\u0099\\u00bb\\u0096\\u0090\\u000f\\u001a \\u00c09\\u00b4\\u00c8v\\u00be\\u00ff/\\u00c0:\\u0092\\u00cb\\u007fH\\u00bf\\u001d\\u00c0:#J{\\u0083o\\u001f\\u00c0\\u001f\\u0085\\u00ebQ\\u00b8\\u00de0\\u00c0\\u00f8\\u00c2d\\u00aa`t!\\u00c0\\t\\u001b\\u009e^)k\\\"\\u00c0\\u00fee\\u00f7\\u00e4a\\u00010\\u00c0b\\u0010X9\\u00b4(#\\u00c0\\u0006\\u0081\\u0095C\\u008b,#\\u00c0h\\\"lxz\\u00e5-\\u00c0\\u0016\\u00fb\\u00cb\\u00ee\\u00c9\\u00c3$\\u00c0\\u00c1\\u00ca\\u00a1E\\u00b6s%\\u00c0\\u00cd;N\\u00d1\\u0091<.\\u00c0\\u0093\\u00a9\\u0082QI\\u00bd$\\u00c0xz\\u00a5,C\\u00fc&\\u00c0\\u00ec/\\u00bb'\\u000f;0\\u00c0\\u00b6\\u0084|\\u00d0\\u00b3\\u0019#\\u00c0\\u0002+\\u0087\\u0016\\u00d9N&\\u00c0\\u008c\\u00dbh\\u0000oA1\\u00c0\\u00fc\\u0018s\\u00d7\\u0012r!\\u00c0R'\\u00a0\\u0089\\u00b0\\u0001$\\u00c0A\\u00f1c\\u00cc]+1\\u00c04\\u00116<\\u00bd2 \\u00c0\\u0010\\u00e9\\u00b7\\u00af\\u0003g#\\u00c0 c\\u00eeZB\\u00fe1\\u00c0\\u00b2\\u009d\\u00ef\\u00a7\\u00c6+#\\u00c0\\u00b8\\u00af\\u0003\\u00e7\\u008c\\u00e8'\\u00c0V\\u000e-\\u00b2\\u009do2\\u00c00\\u00bb'\\u000f\\u000b\\u00d5$\\u00c0\\u00e8\\u00d9\\u00ac\\u00fa\\\\\\r)\\u00c0+\\u00f6\\u0097\\u00dd\\u0093\\u00872\\u00c0\\u00ac\\u001cZd;_!\\u00c0\\u00b8\\u00af\\u0003\\u00e7\\u008c((\\u00c0X\\u00ca2\\u00c4\\u00b1n3\\u00c0\\u00deq\\u008a\\u008e\\u00e4r\\u001e\\u00c0\\u00a0\\u0089\\u00b0\\u00e1\\u00e9\\u00f5&\\u00c0\\\"\\u00fd\\u00f6u\\u00e0|3\\u00c0yX\\u00a85\\u00cd\\u001b\\\"\\u00c0(\\u000f\\u000b\\u00b5\\u00a6\\u0019*\\u00c0\\u00e3\\u00a5\\u009b\\u00c4 \\u00904\\u00c01\\b\\u00ac\\u001cZ\\u00e4\\\"\\u00c0Y\\u00868\\u00d6\\u00c5\\u00ed(\\u00c0\\u00a2E\\u00b6\\u00f3\\u00fdd5\\u00c0\\u00d5\\u00e7j+\\u00f6\\u00b7#\\u00c0\\u008cJ\\u00ea\\u00044q+\\u00c0\\u00e0\\u00be\\u000e\\u009c3B4\\u00c0\\u00b3{\\u00f2\\u00b0Pk\\u001f\\u00c0\\u00bb'\\u000f\\u000b\\u00b5\\u00c6+\\u00c0\\u00b6\\u00f3\\u00fd\\u00d4x\\t5\\u00c0vq\\u001b\\r\\u00e0M \\u00c0\\u008c\\u00dbh\\u0000o!-\\u00c0\\u00bc\\u0096\\u0090\\u000fz\\u00d65\\u00c0_\\u0098L\\u0015\\u008c\\u00ca\\u001d\\u00c0\\u00d1\\u0091\\\\\\u00feC\\u00fa,\\u00c0a\\u00c3\\u00d3+e94\\u00c0K\\u00ea\\u00044\\u00116\\u001c\\u00c0\\u00a2\\u00b47\\u00f8\\u00c2\\u0084*\\u00c0[\\u00b1\\u00bf\\u00ec\\u009el5\\u00c0X9\\u00b4\\u00c8v\\u001e&\\u00c0p_\\u0007\\u00ce\\u0019\\u0011&\\u00c0\\u00ce\\u0088\\u00d2\\u00de\\u00e0\\u00ab,\\u00c0\\u00d5\\u00e7j+\\u00f6W#\\u00c0^\\u00baI\\f\\u0002\\u000b\\\"\\u00c08gDio\\u0010,\\u00c0\\u00c6m4\\u0080\\u00b7\\u0000\\u0013\\u00c0\\\\ A\\u00f1c\\u008c\\u001e\\u00c0\\u009e^)\\u00cb\\u0010\\u00a7/\\u00c0\\u00e7\\u00fb\\u00a9\\u00f1\\u00d2\\u00cd\\r\\u00c0\\u009d\\u0011\\u00a5\\u00bd\\u00c1W\\u0014\\u00c0\\u00f7\\u00e4a\\u00a1\\u00d6t0\\u00c0\",\n                                        {},\n                                    ],\n                                    \"molprops\": {\"ofe-name\": \"lig_ejm_42\"},\n                                    \"__qualname__\": \"SmallMoleculeComponent\",\n                                    \"__module__\": \"gufe.components.smallmoleculecomponent\",\n                                },\n                                \"componentA_to_componentB\": {\n                                    \"0\": 0,\n                                    \"1\": 1,\n                                    \"2\": 2,\n                                    \"3\": 3,\n                                    \"4\": 4,\n                                    \"5\": 5,\n                                    \"6\": 6,\n                                    \"7\": 7,\n                                    \"8\": 8,\n                                    \"9\": 9,\n                                    \"10\": 10,\n                                    \"11\": 11,\n                                    \"12\": 12,\n                                    \"13\": 13,\n                                    \"14\": 14,\n                                    \"15\": 15,\n                                    \"16\": 16,\n                                    \"17\": 17,\n                                    \"18\": 18,\n                                    \"19\": 19,\n                                    \"20\": 20,\n                                    \"21\": 21,\n                                    \"22\": 22,\n                                    \"23\": 23,\n                                    \"24\": 24,\n                                    \"25\": 26,\n                                    \"27\": 25,\n                                    \"28\": 31,\n                                    \"29\": 32,\n                                    \"30\": 33,\n                                    \"31\": 34,\n                                },\n                                \"annotations\": '{\"score\": 0.09516258196404048}',\n                                \"__qualname__\": \"LigandAtomMapping\",\n                                \"__module__\": \"gufe.mapping.ligandatommapping\",\n                            },\n                        },\n                    }\n                ]\n            }\n        },\n        \"unit_results\": {\n            \"ProtocolUnitResult-e85\": {\"name\": \"lig_ejm_31 to lig_ejm_42 repeat 0 generation 0\"},\n            \"ProtocolUnitFailure-4c9\": {\n                \"name\": \"lig_ejm_31 to lig_ejm_42 repeat 0 generation 0\",\n                \"exception\": [\"Simulation_NanError\"],\n            },\n        },\n    }\n    return result\n"
  },
  {
    "path": "src/openfecli/tests/commands/test_atommapping.py",
    "content": "from unittest import mock\n\nimport click\nimport pytest\nfrom click.testing import CliRunner\n\nfrom openfe.setup import LigandAtomMapping, LomapAtomMapper\nfrom openfecli.commands.atommapping import (\n    atommapping,\n    atommapping_print_dict_main,\n    atommapping_visualize_main,\n    generate_mapping,\n)\nfrom openfecli.parameters import MOL\n\n\n@pytest.fixture\ndef molA_args():\n    return [\"--mol\", \"Cc1ccccc1\"]\n\n\n@pytest.fixture\ndef molB_args():\n    return [\"--mol\", \"CC1CCCCC1\"]\n\n\n@pytest.fixture\ndef mapper_args():\n    return [\"--mapper\", \"LomapAtomMapper\"]\n\n\n@pytest.fixture\ndef mols_AB(molA_args, molB_args):\n    return MOL.get(molA_args[1]), MOL.get(molB_args[1])\n\n\ndef print_test(mapper, molA, molB):\n    print(molA.smiles)\n    print(molB.smiles)\n    print(mapper.__class__.__name__)\n\n\ndef print_test_with_file(mapper, molA, molB, file, ext):\n    print_test(mapper, molA, molB)\n    print(file.name)\n    print(ext)\n\n\n@pytest.mark.parametrize(\"with_file\", [True, False])\ndef test_atommapping(molA_args, molB_args, mapper_args, with_file):\n    # Patch out the main function with a simple function to output\n    # information about the objects we pass to the main; test the output of\n    # that using tools from click. This tests the creation of objects from\n    # user input on the command line.\n    args = molA_args + molB_args + mapper_args\n    expected_output = f\"{molA_args[1]}\\n{molB_args[1]}\\n{mapper_args[1]}\\n\"\n    patch_base = \"openfecli.commands.atommapping.\"\n    if with_file:\n        args += [\"-o\", \"myfile.png\"]\n        expected_output += \"myfile.png\\npng\\n\"\n        patch_loc = patch_base + \"atommapping_visualize_main\"\n        patch_func = print_test_with_file\n    else:\n        patch_loc = patch_base + \"atommapping_print_dict_main\"\n        patch_func = print_test\n\n    runner = CliRunner()\n    with mock.patch(patch_loc, patch_func):\n        with runner.isolated_filesystem():\n            result = runner.invoke(atommapping, args)\n            assert result.exit_code == 0\n            assert result.output == expected_output\n\n\ndef test_atommapping_bad_number_of_mols(molA_args, mapper_args):\n    runner = CliRunner()\n    with runner.isolated_filesystem():\n        result = runner.invoke(atommapping, molA_args + mapper_args)\n        assert result.exit_code == click.BadParameter.exit_code\n        assert \"exactly twice\" in result.output\n\n\ndef test_atommapping_missing_mapper(molA_args, molB_args):\n    runner = CliRunner()\n    with runner.isolated_filesystem():\n        result = runner.invoke(atommapping, molA_args + molB_args)\n        assert result.exit_code == click.BadParameter.exit_code\n        assert \"Missing option '--mapper'\" in result.output\n\n\n@pytest.mark.parametrize(\"n_mappings\", [0, 1, 2])\ndef test_generate_mapping(n_mappings, mols_AB):\n    molA, molB = mols_AB\n    mappings = [\n        LigandAtomMapping(molA, molB, {i: i for i in range(7)}),\n        LigandAtomMapping(molA, molB, {i: (i + 1) % 7 for i in range(7)}),\n    ]\n    mapper = mock.Mock(suggest_mappings=mock.Mock(return_value=mappings[:n_mappings]))\n\n    if n_mappings == 1:\n        assert generate_mapping(mapper, molA, molB) == mappings[0]\n    else:\n        with pytest.raises(click.UsageError, match=\"exactly 1 mapping\"):\n            generate_mapping(mapper, molA, molB)\n\n\ndef test_atommapping_print_dict_main(capsys, mols_AB):\n    molA, molB = mols_AB\n    mapper = LomapAtomMapper\n    mapping = LigandAtomMapping(molA, molB, {i: i for i in range(7)})\n    with mock.patch(\"openfecli.commands.atommapping.generate_mapping\", mock.Mock(return_value=mapping)):  # fmt: skip\n        atommapping_print_dict_main(mapper, molA, molB)\n        captured = capsys.readouterr()\n        assert captured.out == str(mapping.componentA_to_componentB) + \"\\n\"\n\n\ndef test_atommapping_visualize_main(mols_AB):\n    molA, molB = mols_AB\n    mapper = LomapAtomMapper\n    pytest.skip()  # TODO: probably with a smoke test\n\n\ndef test_atommapping_visualize_main_bad_extension(mols_AB, tmp_path):\n    molA, molB = mols_AB\n    mapper = LomapAtomMapper\n    mapping = LigandAtomMapping(molA, molB, {i: i for i in range(7)})\n    with mock.patch(\"openfecli.commands.atommapping.generate_mapping\", mock.Mock(return_value=mapping)):  # fmt: skip\n        with open(tmp_path / \"foo.bar\", mode=\"w\") as f:\n            with pytest.raises(click.BadParameter, match=\"Unknown file format\"):\n                atommapping_visualize_main(mapper, molA, molB, f, \"bar\")\n"
  },
  {
    "path": "src/openfecli/tests/commands/test_charge_generation.py",
    "content": "import logging\n\nimport numpy as np\nimport pytest\nfrom click import ClickException\nfrom click.testing import CliRunner\nfrom gufe import SmallMoleculeComponent\nfrom openff.toolkit import Molecule\nfrom openff.units import unit\nfrom openff.utilities.testing import skip_if_missing\n\nfrom openfe.protocols.openmm_utils.charge_generation import (\n    HAS_NAGL,\n    HAS_OPENEYE,\n)\nfrom openfecli.commands.generate_partial_charges import charge_molecules\n\n\n@pytest.fixture\ndef yaml_nagl_settings():\n    return \"\"\"\\\npartial_charge:\n  method: nagl\n  settings:\n    nagl_model: openff-gnn-am1bcc-0.1.0-rc.3.pt\n\"\"\"\n\n\n@pytest.fixture\ndef methane() -> Molecule:\n    # ensure consistent atom ordering\n    methane = Molecule.from_mapped_smiles(\"[C:1]([H:2])([H:3])([H:4])[H:5]\")\n    methane.generate_conformers(n_conformers=1)\n    return methane\n\n\n@pytest.fixture\ndef methane_with_charges(methane) -> Molecule:\n    methane._partial_charges = [-1.0, 0.25, 0.25, 0.25, 0.25] * unit.elementary_charge\n    return methane\n\n\ndef test_missing_output(methane, tmp_path):\n    runner = CliRunner()\n    mol_path = tmp_path / \"methane.sdf\"\n    methane.to_file(str(mol_path), \"sdf\")\n\n    cli_result = runner.invoke(charge_molecules, [\"-M\", mol_path])\n    assert cli_result.exit_code == 2\n    assert \"Missing option '-o'\" in cli_result.output\n\n\ndef test_write_charges_to_input(methane, tmp_path):\n    runner = CliRunner()\n    mol_path = tmp_path / \"methane.sdf\"\n    methane.to_file(str(mol_path), \"sdf\")\n\n    with runner.isolated_filesystem():\n        # check an error is raised if we try to overwrite the input\n        with pytest.raises(FileExistsError, match=\"The output file \"):\n            _ = runner.invoke(\n                charge_molecules, [\"-M\", mol_path, \"-o\", mol_path], catch_exceptions=False\n            )\n\n\ndef test_charge_molecules_default(methane, tmp_path, caplog):\n    runner = CliRunner()\n    mol_path = tmp_path / \"methane.sdf\"\n    methane.to_file(str(mol_path), \"sdf\")\n    output_file = str(tmp_path / \"charged_methane.sdf\")\n    caplog.set_level(logging.INFO)\n    with runner.isolated_filesystem():\n        # make sure the charges are picked up\n        result = runner.invoke(charge_molecules, [\"-M\", mol_path, \"-o\", output_file])\n\n        assert result.exit_code == 0\n        assert \"Partial charges are present for\" in caplog.text\n        assert \"Partial Charge Generation: am1bcc\" in result.output\n        # make sure the charges have been saved\n        methane = SmallMoleculeComponent.from_sdf_file(filename=output_file)\n        off_methane = methane.to_openff()\n        assert off_methane.partial_charges is not None\n        assert len(off_methane.partial_charges) == 5\n\n\n@pytest.mark.parametrize(\n    \"overwrite, expected_charges\",\n    [\n        pytest.param(False, [-1.0, 0.25, 0.25, 0.25, 0.25], id=\"Don't overwrite\"),\n        pytest.param(True, [-0.1084, 0.0271, 0.0271, 0.0271, 0.0271], id=\"Overwrite\"),\n    ],\n)\ndef test_charge_molecules_overwrite(\n    overwrite, tmp_path, caplog, methane_with_charges, expected_charges\n):\n    runner = CliRunner()\n    mol_path = tmp_path / \"methane.sdf\"\n    methane_with_charges.to_file(str(mol_path), \"sdf\")\n    output_file = str(tmp_path / \"charged_methane.sdf\")\n\n    args = [\"-M\", mol_path, \"-o\", output_file]\n    if overwrite:\n        args.append(\"--overwrite-charges\")\n\n    with runner.isolated_filesystem():\n        # make sure the charges are picked up\n        caplog.set_level(logging.INFO)\n        result = runner.invoke(charge_molecules, args)\n        assert result.exit_code == 0\n\n        assert \"Partial charges are present for\" in caplog.text\n        assert \"Partial Charge Generation: am1bcc\" in result.output\n        if overwrite:\n            assert \"Overwriting partial charges\" in result.output\n\n        # make sure the charges have not changed from the inputs\n        methane = SmallMoleculeComponent.from_sdf_file(filename=output_file)\n        off_methane = methane.to_openff()\n        assert np.allclose(off_methane.partial_charges.m, expected_charges)\n\n\n@pytest.mark.parametrize(\n    \"ncores\",\n    [\n        pytest.param(1, id=\"1\"),\n        pytest.param(2, id=\"2\"),\n    ],\n)\n@pytest.mark.skipif(\n    not HAS_NAGL,\n    reason=\"needs NAGL\",\n)\n@pytest.mark.skipif(\n    HAS_OPENEYE, reason=\"cannot use NAGL with rdkit backend when OpenEye is installed\"\n)\ndef test_charge_settings(methane, tmp_path, caplog, yaml_nagl_settings, ncores):\n    runner = CliRunner()\n    mol_path = tmp_path / \"methane.sdf\"\n    methane.to_file(str(mol_path), \"sdf\")\n    output_file = str(tmp_path / \"charged_methane.sdf\")\n\n    # use nagl charges for CI speed!\n    settings_path = tmp_path / \"settings.yaml\"\n    with open(settings_path, \"w\") as f:\n        f.write(yaml_nagl_settings)\n\n    with runner.isolated_filesystem():\n        caplog.set_level(logging.INFO)\n        # make sure the charges are picked up\n        result = runner.invoke(\n            charge_molecules, [\"-M\", mol_path, \"-o\", output_file, \"-s\", settings_path, \"-n\", ncores]\n        )\n\n        assert result.exit_code == 0\n\n        assert \"Partial charges are present for\" in caplog.text\n        assert \"Partial Charge Generation: nagl\" in result.output\n        # make sure the charges have been saved\n        methane = SmallMoleculeComponent.from_sdf_file(filename=output_file)\n        off_methane = methane.to_openff()\n        assert off_methane.partial_charges is not None\n        assert len(off_methane.partial_charges) == 5\n"
  },
  {
    "path": "src/openfecli/tests/commands/test_gather/test_abfe_full_results_multiple_units_dg_.tsv",
    "content": "ligand\tDG (kcal/mol)\tstd dev uncertainty (kcal/mol)\n1\t-20.87\t0.47\n"
  },
  {
    "path": "src/openfecli/tests/commands/test_gather/test_abfe_full_results_multiple_units_raw_.tsv",
    "content": "leg\tligand\tDG (kcal/mol)\tMBAR uncertainty (kcal/mol)\ncomplex\t1\t34.77\t0.81\ncomplex\t1\t36.17\t0.80\ncomplex\t1\t36.34\t0.91\nsolvent\t1\t5.5\t1.4\nsolvent\t1\t5.4\t1.4\nsolvent\t1\t6.5\t1.4\nstandard_state_correction\t1\t-9.0\t0.0\nstandard_state_correction\t1\t-9.3\t0.0\nstandard_state_correction\t1\t-8.9\t0.0\n"
  },
  {
    "path": "src/openfecli/tests/commands/test_gather/test_abfe_full_results_single_unit_dg_.tsv",
    "content": "ligand\tDG (kcal/mol)\tstd dev uncertainty (kcal/mol)\n1\t-18.36\t0.98\n"
  },
  {
    "path": "src/openfecli/tests/commands/test_gather/test_abfe_full_results_single_unit_raw_.tsv",
    "content": "leg\tligand\tDG (kcal/mol)\tMBAR uncertainty (kcal/mol)\ncomplex\t1\t36.87\t0.36\ncomplex\t1\t39.24\t0.44\ncomplex\t1\t37.46\t0.48\nsolvent\t1\t10.57\t0.66\nsolvent\t1\t10.48\t0.65\nsolvent\t1\t10.41\t0.66\nstandard_state_correction\t1\t-8.9\t0.0\nstandard_state_correction\t1\t-9.1\t0.0\nstandard_state_correction\t1\t-9.0\t0.0\n"
  },
  {
    "path": "src/openfecli/tests/commands/test_gather/test_abfe_single_repeat_multiple_units_dg_.tsv",
    "content": "ligand\tDG (kcal/mol)\tMBAR uncertainty (kcal/mol)\n1\t-20.3\t1.6\n"
  },
  {
    "path": "src/openfecli/tests/commands/test_gather/test_abfe_single_repeat_multiple_units_raw_.tsv",
    "content": "leg\tligand\tDG (kcal/mol)\tMBAR uncertainty (kcal/mol)\ncomplex\t1\t34.77\t0.81\nsolvent\t1\t5.5\t1.4\nstandard_state_correction\t1\t-9.0\t0.0\n"
  },
  {
    "path": "src/openfecli/tests/commands/test_gather/test_abfe_single_repeat_single_unit_dg_.tsv",
    "content": "ligand\tDG (kcal/mol)\tMBAR uncertainty (kcal/mol)\n1\t-17.36\t0.75\n"
  },
  {
    "path": "src/openfecli/tests/commands/test_gather/test_abfe_single_repeat_single_unit_raw_.tsv",
    "content": "leg\tligand\tDG (kcal/mol)\tMBAR uncertainty (kcal/mol)\ncomplex\t1\t36.87\t0.36\nsolvent\t1\t10.57\t0.66\nstandard_state_correction\t1\t-8.9\t0.0\n"
  },
  {
    "path": "src/openfecli/tests/commands/test_gather/test_cmet_failed_edge_ddg_.tsv",
    "content": "Loading results:\nligand_i\tligand_j\tDDG(i->j) (kcal/mol)\tuncertainty (kcal/mol)\nlig_CHEMBL3402745_200_5\tlig_CHEMBL3402744_300_4\t1.1\t0.1\n"
  },
  {
    "path": "src/openfecli/tests/commands/test_gather/test_cmet_failed_edge_raw_.tsv",
    "content": "Loading results:\nleg\tligand_i\tligand_j\tDG(i->j) (kcal/mol)\tMBAR uncertainty (kcal/mol)\ncomplex\tlig_CHEMBL3402745_200_5\tlig_CHEMBL3402744_300_4\t-12.54\t0.06\ncomplex\tlig_CHEMBL3402745_200_5\tlig_CHEMBL3402744_300_4\t-12.31\t0.06\ncomplex\tlig_CHEMBL3402745_200_5\tlig_CHEMBL3402744_300_4\t-12.19\t0.07\nsolvent\tlig_CHEMBL3402745_200_5\tlig_CHEMBL3402744_300_4\tError\tError\nsolvent\tlig_CHEMBL3402745_200_5\tlig_CHEMBL3402744_300_4\t-13.48\t0.06\nsolvent\tlig_CHEMBL3402745_200_5\tlig_CHEMBL3402744_300_4\t-13.50\t0.05\n"
  },
  {
    "path": "src/openfecli/tests/commands/test_gather/test_cmet_full_results_ddg_.tsv",
    "content": "Loading results:\nligand_i\tligand_j\tDDG(i->j) (kcal/mol)\tuncertainty (kcal/mol)\nlig_CHEMBL3402745_200_5\tlig_CHEMBL3402744_300_4\t1.2\t0.1\nlig_CHEMBL3402745_200_5\tlig_CHEMBL3402749_500_9\t3.6\t0.2\nlig_CHEMBL3402745_200_5\tlig_CHEMBL3402754_40_14\t-1.2\t0.2\nlig_CHEMBL3402754_40_14\tlig_CHEMBL3402761_1_21\t-1.0\t0.4\n"
  },
  {
    "path": "src/openfecli/tests/commands/test_gather/test_cmet_full_results_dg_.tsv",
    "content": "Loading results:\nligand\tDG(MLE) (kcal/mol)\tuncertainty (kcal/mol)\nlig_CHEMBL3402745_200_5\t-0.3\t0.1\nlig_CHEMBL3402744_300_4\t0.9\t0.2\nlig_CHEMBL3402749_500_9\t3.4\t0.2\nlig_CHEMBL3402754_40_14\t-1.5\t0.2\nlig_CHEMBL3402761_1_21\t-2.5\t0.4\n"
  },
  {
    "path": "src/openfecli/tests/commands/test_gather/test_cmet_full_results_raw_.tsv",
    "content": "Loading results:\nleg\tligand_i\tligand_j\tDG(i->j) (kcal/mol)\tMBAR uncertainty (kcal/mol)\ncomplex\tlig_CHEMBL3402745_200_5\tlig_CHEMBL3402744_300_4\t-12.54\t0.06\ncomplex\tlig_CHEMBL3402745_200_5\tlig_CHEMBL3402744_300_4\t-12.31\t0.06\ncomplex\tlig_CHEMBL3402745_200_5\tlig_CHEMBL3402744_300_4\t-12.19\t0.07\nsolvent\tlig_CHEMBL3402745_200_5\tlig_CHEMBL3402744_300_4\t-13.51\t0.05\nsolvent\tlig_CHEMBL3402745_200_5\tlig_CHEMBL3402744_300_4\t-13.48\t0.06\nsolvent\tlig_CHEMBL3402745_200_5\tlig_CHEMBL3402744_300_4\t-13.50\t0.05\ncomplex\tlig_CHEMBL3402745_200_5\tlig_CHEMBL3402749_500_9\t-51.37\t0.10\ncomplex\tlig_CHEMBL3402745_200_5\tlig_CHEMBL3402749_500_9\t-51.5\t0.1\ncomplex\tlig_CHEMBL3402745_200_5\tlig_CHEMBL3402749_500_9\t-51.6\t0.1\nsolvent\tlig_CHEMBL3402745_200_5\tlig_CHEMBL3402749_500_9\t-55.13\t0.08\nsolvent\tlig_CHEMBL3402745_200_5\tlig_CHEMBL3402749_500_9\t-54.98\t0.09\nsolvent\tlig_CHEMBL3402745_200_5\tlig_CHEMBL3402749_500_9\t-55.30\t0.08\ncomplex\tlig_CHEMBL3402745_200_5\tlig_CHEMBL3402754_40_14\t-70.55\t0.10\ncomplex\tlig_CHEMBL3402745_200_5\tlig_CHEMBL3402754_40_14\t-70.9\t0.1\ncomplex\tlig_CHEMBL3402745_200_5\tlig_CHEMBL3402754_40_14\t-70.3\t0.1\nsolvent\tlig_CHEMBL3402745_200_5\tlig_CHEMBL3402754_40_14\t-69.31\t0.09\nsolvent\tlig_CHEMBL3402745_200_5\tlig_CHEMBL3402754_40_14\t-69.38\t0.09\nsolvent\tlig_CHEMBL3402745_200_5\tlig_CHEMBL3402754_40_14\t-69.45\t0.09\ncomplex\tlig_CHEMBL3402754_40_14\tlig_CHEMBL3402761_1_21\t35.6\t0.2\ncomplex\tlig_CHEMBL3402754_40_14\tlig_CHEMBL3402761_1_21\t36.5\t0.3\ncomplex\tlig_CHEMBL3402754_40_14\tlig_CHEMBL3402761_1_21\t36.4\t0.2\nsolvent\tlig_CHEMBL3402754_40_14\tlig_CHEMBL3402761_1_21\t37.2\t0.1\nsolvent\tlig_CHEMBL3402754_40_14\tlig_CHEMBL3402761_1_21\t37.3\t0.2\nsolvent\tlig_CHEMBL3402754_40_14\tlig_CHEMBL3402761_1_21\t37.0\t0.1\n"
  },
  {
    "path": "src/openfecli/tests/commands/test_gather/test_cmet_missing_all_complex_legs_allow_partial_ddg_.tsv",
    "content": "Loading results:\nligand_i\tligand_j\tDDG(i->j) (kcal/mol)\tuncertainty (kcal/mol)\nlig_CHEMBL3402745_200_5\tlig_CHEMBL3402744_300_4\tError\tError\nlig_CHEMBL3402745_200_5\tlig_CHEMBL3402749_500_9\tError\tError\nlig_CHEMBL3402745_200_5\tlig_CHEMBL3402754_40_14\tError\tError\nlig_CHEMBL3402754_40_14\tlig_CHEMBL3402761_1_21\tError\tError\n"
  },
  {
    "path": "src/openfecli/tests/commands/test_gather/test_cmet_missing_all_complex_legs_fail_ddg_.tsv",
    "content": "Loading results:\n"
  },
  {
    "path": "src/openfecli/tests/commands/test_gather/test_cmet_missing_all_complex_legs_fail_dg_.tsv",
    "content": "Loading results:\n"
  },
  {
    "path": "src/openfecli/tests/commands/test_gather/test_cmet_missing_complex_leg_ddg_.tsv",
    "content": "Loading results:\nligand_i\tligand_j\tDDG(i->j) (kcal/mol)\tuncertainty (kcal/mol)\nlig_CHEMBL3402745_200_5\tlig_CHEMBL3402744_300_4\t1.2\t0.1\nlig_CHEMBL3402745_200_5\tlig_CHEMBL3402749_500_9\t3.6\t0.2\nlig_CHEMBL3402745_200_5\tlig_CHEMBL3402754_40_14\t-1.2\t0.2\nlig_CHEMBL3402754_40_14\tlig_CHEMBL3402761_1_21\t-0.7\t0.1\n"
  },
  {
    "path": "src/openfecli/tests/commands/test_gather/test_cmet_missing_complex_leg_dg_.tsv",
    "content": "Loading results:\nligand\tDG(MLE) (kcal/mol)\tuncertainty (kcal/mol)\nlig_CHEMBL3402745_200_5\t-0.3\t0.1\nlig_CHEMBL3402744_300_4\t0.8\t0.2\nlig_CHEMBL3402749_500_9\t3.3\t0.2\nlig_CHEMBL3402754_40_14\t-1.5\t0.2\nlig_CHEMBL3402761_1_21\t-2.2\t0.2\n"
  },
  {
    "path": "src/openfecli/tests/commands/test_gather/test_cmet_missing_complex_leg_raw_.tsv",
    "content": "Loading results:\nleg\tligand_i\tligand_j\tDG(i->j) (kcal/mol)\tMBAR uncertainty (kcal/mol)\ncomplex\tlig_CHEMBL3402745_200_5\tlig_CHEMBL3402744_300_4\t-12.54\t0.06\ncomplex\tlig_CHEMBL3402745_200_5\tlig_CHEMBL3402744_300_4\t-12.31\t0.06\ncomplex\tlig_CHEMBL3402745_200_5\tlig_CHEMBL3402744_300_4\t-12.19\t0.07\nsolvent\tlig_CHEMBL3402745_200_5\tlig_CHEMBL3402744_300_4\t-13.51\t0.05\nsolvent\tlig_CHEMBL3402745_200_5\tlig_CHEMBL3402744_300_4\t-13.48\t0.06\nsolvent\tlig_CHEMBL3402745_200_5\tlig_CHEMBL3402744_300_4\t-13.50\t0.05\ncomplex\tlig_CHEMBL3402745_200_5\tlig_CHEMBL3402749_500_9\t-51.37\t0.10\ncomplex\tlig_CHEMBL3402745_200_5\tlig_CHEMBL3402749_500_9\t-51.5\t0.1\ncomplex\tlig_CHEMBL3402745_200_5\tlig_CHEMBL3402749_500_9\t-51.6\t0.1\nsolvent\tlig_CHEMBL3402745_200_5\tlig_CHEMBL3402749_500_9\t-55.13\t0.08\nsolvent\tlig_CHEMBL3402745_200_5\tlig_CHEMBL3402749_500_9\t-54.98\t0.09\nsolvent\tlig_CHEMBL3402745_200_5\tlig_CHEMBL3402749_500_9\t-55.30\t0.08\ncomplex\tlig_CHEMBL3402745_200_5\tlig_CHEMBL3402754_40_14\t-70.55\t0.10\ncomplex\tlig_CHEMBL3402745_200_5\tlig_CHEMBL3402754_40_14\t-70.9\t0.1\ncomplex\tlig_CHEMBL3402745_200_5\tlig_CHEMBL3402754_40_14\t-70.3\t0.1\nsolvent\tlig_CHEMBL3402745_200_5\tlig_CHEMBL3402754_40_14\t-69.31\t0.09\nsolvent\tlig_CHEMBL3402745_200_5\tlig_CHEMBL3402754_40_14\t-69.38\t0.09\nsolvent\tlig_CHEMBL3402745_200_5\tlig_CHEMBL3402754_40_14\t-69.45\t0.09\ncomplex\tlig_CHEMBL3402754_40_14\tlig_CHEMBL3402761_1_21\t36.5\t0.3\ncomplex\tlig_CHEMBL3402754_40_14\tlig_CHEMBL3402761_1_21\t36.4\t0.2\nsolvent\tlig_CHEMBL3402754_40_14\tlig_CHEMBL3402761_1_21\t37.2\t0.1\nsolvent\tlig_CHEMBL3402754_40_14\tlig_CHEMBL3402761_1_21\t37.3\t0.2\nsolvent\tlig_CHEMBL3402754_40_14\tlig_CHEMBL3402761_1_21\t37.0\t0.1\n"
  },
  {
    "path": "src/openfecli/tests/commands/test_gather/test_cmet_missing_edge_ddg_.tsv",
    "content": "Loading results:\nligand_i\tligand_j\tDDG(i->j) (kcal/mol)\tuncertainty (kcal/mol)\nlig_CHEMBL3402745_200_5\tlig_CHEMBL3402744_300_4\t1.2\t0.1\nlig_CHEMBL3402745_200_5\tlig_CHEMBL3402749_500_9\t3.6\t0.2\nlig_CHEMBL3402745_200_5\tlig_CHEMBL3402754_40_14\t-1.2\t0.2\n"
  },
  {
    "path": "src/openfecli/tests/commands/test_gather/test_cmet_missing_edge_dg_.tsv",
    "content": "Loading results:\nligand\tDG(MLE) (kcal/mol)\tuncertainty (kcal/mol)\nlig_CHEMBL3402745_200_5\t-0.90\t0.08\nlig_CHEMBL3402744_300_4\t0.3\t0.1\nlig_CHEMBL3402749_500_9\t2.8\t0.1\nlig_CHEMBL3402754_40_14\t-2.1\t0.2\n"
  },
  {
    "path": "src/openfecli/tests/commands/test_gather/test_cmet_missing_edge_raw_.tsv",
    "content": "Loading results:\nleg\tligand_i\tligand_j\tDG(i->j) (kcal/mol)\tMBAR uncertainty (kcal/mol)\ncomplex\tlig_CHEMBL3402745_200_5\tlig_CHEMBL3402744_300_4\t-12.54\t0.06\ncomplex\tlig_CHEMBL3402745_200_5\tlig_CHEMBL3402744_300_4\t-12.31\t0.06\ncomplex\tlig_CHEMBL3402745_200_5\tlig_CHEMBL3402744_300_4\t-12.19\t0.07\nsolvent\tlig_CHEMBL3402745_200_5\tlig_CHEMBL3402744_300_4\t-13.51\t0.05\nsolvent\tlig_CHEMBL3402745_200_5\tlig_CHEMBL3402744_300_4\t-13.48\t0.06\nsolvent\tlig_CHEMBL3402745_200_5\tlig_CHEMBL3402744_300_4\t-13.50\t0.05\ncomplex\tlig_CHEMBL3402745_200_5\tlig_CHEMBL3402749_500_9\t-51.37\t0.10\ncomplex\tlig_CHEMBL3402745_200_5\tlig_CHEMBL3402749_500_9\t-51.5\t0.1\ncomplex\tlig_CHEMBL3402745_200_5\tlig_CHEMBL3402749_500_9\t-51.6\t0.1\nsolvent\tlig_CHEMBL3402745_200_5\tlig_CHEMBL3402749_500_9\t-55.13\t0.08\nsolvent\tlig_CHEMBL3402745_200_5\tlig_CHEMBL3402749_500_9\t-54.98\t0.09\nsolvent\tlig_CHEMBL3402745_200_5\tlig_CHEMBL3402749_500_9\t-55.30\t0.08\ncomplex\tlig_CHEMBL3402745_200_5\tlig_CHEMBL3402754_40_14\t-70.55\t0.10\ncomplex\tlig_CHEMBL3402745_200_5\tlig_CHEMBL3402754_40_14\t-70.9\t0.1\ncomplex\tlig_CHEMBL3402745_200_5\tlig_CHEMBL3402754_40_14\t-70.3\t0.1\nsolvent\tlig_CHEMBL3402745_200_5\tlig_CHEMBL3402754_40_14\t-69.31\t0.09\nsolvent\tlig_CHEMBL3402745_200_5\tlig_CHEMBL3402754_40_14\t-69.38\t0.09\nsolvent\tlig_CHEMBL3402745_200_5\tlig_CHEMBL3402754_40_14\t-69.45\t0.09\n"
  },
  {
    "path": "src/openfecli/tests/commands/test_gather/test_septop_full_results_ddg_current_.tsv",
    "content": "ligand_i\tligand_j\tDDG(i->j) (kcal/mol)\tMBAR uncertainty (kcal/mol)\n1\t25\t0.2\t1.4\n1\t7a\t1.3\t1.6\n1\t7b\t1.7\t1.6\n7a\t7b\t1.8\t1.6\n"
  },
  {
    "path": "src/openfecli/tests/commands/test_gather/test_septop_full_results_ddg_pre_openfe_v1_11_.tsv",
    "content": "ligand_i\tligand_j\tDDG(i->j) (kcal/mol)\tMBAR uncertainty (kcal/mol)\n1\t25\t2.0\t1.6\n1\t7a\t0.6\t1.5\n1\t7b\t0.1\t1.5\n7a\t7b\t1.9\t1.5\n"
  },
  {
    "path": "src/openfecli/tests/commands/test_gather/test_septop_full_results_dg_current_.tsv",
    "content": "ligand\tDG (kcal/mol)\tMBAR uncertainty (kcal/mol)\n1\t-0.78\t0.67\n25\t-0.6\t1.2\n7a\t0.04\t0.93\n7b\t1.34\t0.92\n"
  },
  {
    "path": "src/openfecli/tests/commands/test_gather/test_septop_full_results_dg_pre_openfe_v1_11_.tsv",
    "content": "ligand\tDG (kcal/mol)\tMBAR uncertainty (kcal/mol)\n1\t-0.72\t0.66\n25\t1.3\t1.3\n7a\t-0.89\t0.89\n7b\t0.28\t0.90\n"
  },
  {
    "path": "src/openfecli/tests/commands/test_gather/test_septop_full_results_raw_current_.tsv",
    "content": "leg\tligand_i\tligand_j\tDG(i->j) (kcal/mol)\tMBAR uncertainty (kcal/mol)\ncomplex\t1\t25\t42.66\t0.73\nsolvent\t1\t25\t42.4\t1.2\nstandard_state_correction_A\t1\t25\t-9.2\t0.0\nstandard_state_correction_B\t1\t25\t9.0\t0.0\ncomplex\t1\t7a\t0.59\t0.69\ncomplex\t1\t7a\t0.32\t0.89\ncomplex\t1\t7a\t0.82\t0.84\nsolvent\t1\t7a\t-0.8\t1.4\nsolvent\t1\t7a\t-0.7\t1.4\nsolvent\t1\t7a\t-1.1\t1.4\nstandard_state_correction_A\t1\t7a\t-9.1\t0.0\nstandard_state_correction_A\t1\t7a\t-9.2\t0.0\nstandard_state_correction_A\t1\t7a\t-9.1\t0.0\nstandard_state_correction_B\t1\t7a\t9.0\t0.0\nstandard_state_correction_B\t1\t7a\t9.0\t0.0\nstandard_state_correction_B\t1\t7a\t9.0\t0.0\ncomplex\t1\t7b\t0.82\t0.78\ncomplex\t1\t7b\t0.39\t0.73\nsolvent\t1\t7b\t-0.8\t1.4\nsolvent\t1\t7b\t-1.3\t1.3\nstandard_state_correction_A\t1\t7b\t-9.3\t0.0\nstandard_state_correction_A\t1\t7b\t-9.3\t0.0\nstandard_state_correction_B\t1\t7b\t9.3\t0.0\nstandard_state_correction_B\t1\t7b\t9.4\t0.0\ncomplex\t7a\t7b\t3.74\t0.63\ncomplex\t7a\t7b\t-1.53\t0.78\ncomplex\t7a\t7b\t-0.64\t0.53\nsolvent\t7a\t7b\t-1.2\t1.4\nsolvent\t7a\t7b\t-1.3\t1.5\nsolvent\t7a\t7b\t-1.0\t1.4\nstandard_state_correction_A\t7a\t7b\t-9.2\t0.0\nstandard_state_correction_A\t7a\t7b\t-9.1\t0.0\nstandard_state_correction_A\t7a\t7b\t-9.0\t0.0\nstandard_state_correction_B\t7a\t7b\t9.2\t0.0\nstandard_state_correction_B\t7a\t7b\t8.9\t0.0\nstandard_state_correction_B\t7a\t7b\t9.4\t0.0\n"
  },
  {
    "path": "src/openfecli/tests/commands/test_gather/test_septop_full_results_raw_pre_openfe_v1_11_.tsv",
    "content": "leg\tligand_i\tligand_j\tDG(i->j) (kcal/mol)\tMBAR uncertainty (kcal/mol)\ncomplex\t1\t25\t39.88\t0.61\nsolvent\t1\t25\t37.9\t1.4\nstandard_state_correction_A\t1\t25\t-9.2\t0.0\nstandard_state_correction_B\t1\t25\t9.3\t0.0\ncomplex\t1\t7a\t-0.82\t0.71\ncomplex\t1\t7a\t-0.35\t0.69\ncomplex\t1\t7a\t-2.10\t0.62\nsolvent\t1\t7a\t-1.9\t1.2\nsolvent\t1\t7a\t-1.5\t1.4\nsolvent\t1\t7a\t-1.6\t1.4\nstandard_state_correction_A\t1\t7a\t-8.8\t0.0\nstandard_state_correction_A\t1\t7a\t-9.0\t0.0\nstandard_state_correction_A\t1\t7a\t-9.1\t0.0\nstandard_state_correction_B\t1\t7a\t9.1\t0.0\nstandard_state_correction_B\t1\t7a\t9.1\t0.0\nstandard_state_correction_B\t1\t7a\t9.0\t0.0\ncomplex\t1\t7b\t2.48\t0.84\ncomplex\t1\t7b\t3.63\t0.74\nsolvent\t1\t7b\t2.8\t1.3\nsolvent\t1\t7b\t3.1\t1.3\nstandard_state_correction_A\t1\t7b\t-9.0\t0.0\nstandard_state_correction_A\t1\t7b\t-9.3\t0.0\nstandard_state_correction_B\t1\t7b\t9.1\t0.0\nstandard_state_correction_B\t1\t7b\t9.3\t0.0\ncomplex\t7a\t7b\t3.17\t0.80\ncomplex\t7a\t7b\t1.65\t0.68\ncomplex\t7a\t7b\t-2.06\t0.58\nsolvent\t7a\t7b\t-1.2\t1.3\nsolvent\t7a\t7b\t-0.9\t1.3\nsolvent\t7a\t7b\t-1.1\t1.2\nstandard_state_correction_A\t7a\t7b\t-9.0\t0.0\nstandard_state_correction_A\t7a\t7b\t-9.4\t0.0\nstandard_state_correction_A\t7a\t7b\t-9.0\t0.0\nstandard_state_correction_B\t7a\t7b\t8.9\t0.0\nstandard_state_correction_B\t7a\t7b\t9.3\t0.0\nstandard_state_correction_B\t7a\t7b\t9.0\t0.0\n"
  },
  {
    "path": "src/openfecli/tests/commands/test_gather/test_septop_single_repeat_ddg_current_.tsv",
    "content": "ligand_i\tligand_j\tDDG(i->j) (kcal/mol)\tMBAR uncertainty (kcal/mol)\n1\t25\t0.2\t1.4\n1\t7a\t1.3\t1.5\n1\t7b\t1.6\t1.6\n7a\t7b\t5.0\t1.5\n"
  },
  {
    "path": "src/openfecli/tests/commands/test_gather/test_septop_single_repeat_ddg_pre_openfe_v1_11_.tsv",
    "content": "ligand_i\tligand_j\tDDG(i->j) (kcal/mol)\tMBAR uncertainty (kcal/mol)\n1\t25\t2.0\t1.6\n1\t7a\t1.2\t1.4\n1\t7b\t-0.3\t1.5\n7a\t7b\t4.2\t1.5\n"
  },
  {
    "path": "src/openfecli/tests/commands/test_gather/test_septop_single_repeat_dg_current_.tsv",
    "content": "ligand\tDG (kcal/mol)\tMBAR uncertainty (kcal/mol)\n1\t-0.82\t0.66\n25\t-0.6\t1.2\n7a\t-1.02\t0.89\n7b\t2.49\t0.92\n"
  },
  {
    "path": "src/openfecli/tests/commands/test_gather/test_septop_single_repeat_dg_pre_openfe_v1_11_.tsv",
    "content": "ligand\tDG (kcal/mol)\tMBAR uncertainty (kcal/mol)\n1\t-0.84\t0.65\n25\t1.2\t1.3\n7a\t-1.31\t0.87\n7b\t0.95\t0.91\n"
  },
  {
    "path": "src/openfecli/tests/commands/test_gather/test_septop_single_repeat_raw_current_.tsv",
    "content": "leg\tligand_i\tligand_j\tDG(i->j) (kcal/mol)\tMBAR uncertainty (kcal/mol)\ncomplex\t1\t25\t42.66\t0.73\nsolvent\t1\t25\t42.4\t1.2\nstandard_state_correction_A\t1\t25\t-9.2\t0.0\nstandard_state_correction_B\t1\t25\t9.0\t0.0\ncomplex\t1\t7a\t0.59\t0.69\nsolvent\t1\t7a\t-0.8\t1.4\nstandard_state_correction_A\t1\t7a\t-9.1\t0.0\nstandard_state_correction_B\t1\t7a\t9.0\t0.0\ncomplex\t1\t7b\t0.82\t0.78\nsolvent\t1\t7b\t-0.8\t1.4\nstandard_state_correction_A\t1\t7b\t-9.3\t0.0\nstandard_state_correction_B\t1\t7b\t9.3\t0.0\ncomplex\t7a\t7b\t3.74\t0.63\nsolvent\t7a\t7b\t-1.2\t1.4\nstandard_state_correction_A\t7a\t7b\t-9.2\t0.0\nstandard_state_correction_B\t7a\t7b\t9.2\t0.0\n"
  },
  {
    "path": "src/openfecli/tests/commands/test_gather/test_septop_single_repeat_raw_pre_openfe_v1_11_.tsv",
    "content": "leg\tligand_i\tligand_j\tDG(i->j) (kcal/mol)\tMBAR uncertainty (kcal/mol)\ncomplex\t1\t25\t39.88\t0.61\nsolvent\t1\t25\t37.9\t1.4\nstandard_state_correction_A\t1\t25\t-9.2\t0.0\nstandard_state_correction_B\t1\t25\t9.3\t0.0\ncomplex\t1\t7a\t-0.82\t0.71\nsolvent\t1\t7a\t-1.9\t1.2\nstandard_state_correction_A\t1\t7a\t-8.8\t0.0\nstandard_state_correction_B\t1\t7a\t9.1\t0.0\ncomplex\t1\t7b\t2.48\t0.84\nsolvent\t1\t7b\t2.8\t1.3\nstandard_state_correction_A\t1\t7b\t-9.0\t0.0\nstandard_state_correction_B\t1\t7b\t9.1\t0.0\ncomplex\t7a\t7b\t3.17\t0.80\nsolvent\t7a\t7b\t-1.2\t1.3\nstandard_state_correction_A\t7a\t7b\t-9.0\t0.0\nstandard_state_correction_B\t7a\t7b\t8.9\t0.0\n"
  },
  {
    "path": "src/openfecli/tests/commands/test_gather.py",
    "content": "import glob\nimport os\nimport pathlib\nfrom unittest import mock\n\nimport pandas as pd\nimport pooch\nimport pytest\nfrom click.testing import CliRunner\n\nfrom openfecli.commands.gather import (\n    _get_column,\n    _get_legs_from_result_jsons,\n    _load_valid_result_json,\n    format_estimate_uncertainty,\n    gather,\n)\nfrom openfecli.commands.gather_abfe import gather_abfe\nfrom openfecli.commands.gather_septop import gather_septop\nfrom openfecli.data._registry import (\n    POOCH_CACHE,\n    zenodo_abfe_data,\n    zenodo_cmet_data,\n    zenodo_rbfe_parallel_data,\n    zenodo_rbfe_serial_data,\n    zenodo_septop_data,\n)\n\nfrom ..conftest import HAS_INTERNET\nfrom ..utils import assert_click_success\n\npooch_rbfe_serial = pooch.create(\n    path=POOCH_CACHE,\n    base_url=zenodo_rbfe_serial_data[\"base_url\"],\n    registry={zenodo_rbfe_serial_data[\"fname\"]: zenodo_rbfe_serial_data[\"known_hash\"]},\n)\n\npooch_rbfe_parallel = pooch.create(\n    path=POOCH_CACHE,\n    base_url=zenodo_rbfe_parallel_data[\"base_url\"],\n    registry={zenodo_rbfe_parallel_data[\"fname\"]: zenodo_rbfe_parallel_data[\"known_hash\"]},\n)\n\npooch_cmet = pooch.create(\n    path=POOCH_CACHE,\n    base_url=zenodo_cmet_data[\"base_url\"],\n    registry={zenodo_cmet_data[\"fname\"]: zenodo_cmet_data[\"known_hash\"]},\n)\n\n\n@pytest.mark.parametrize(\n    \"est,unc,unc_prec,est_str,unc_str\",\n    [\n        (12.432, 0.111, 2, \"12.43\", \"0.11\"),\n        (0.9999, 0.01, 2, \"1.000\", \"0.010\"),\n        (1234, 100, 2, \"1230\", \"100\"),\n    ],\n)\ndef test_format_estimate_uncertainty(est, unc, unc_prec, est_str, unc_str):\n    assert format_estimate_uncertainty(est, unc, unc_prec) == (est_str, unc_str)\n\n\n@pytest.mark.parametrize(\n    \"val, col\",\n    [\n        (1.0, 1),\n        (0.1, -1),\n        (-0.0, 0),\n        (0.0, 0),\n        (0.2, -1),\n        (0.9, -1),\n        (0.011, -2),\n        (9, 1),\n        (10, 2),\n        (15, 2),\n    ],\n)\ndef test_get_column(val, col):\n    assert _get_column(val) == col\n\n\nclass TestResultLoading:\n    def test_minimal_valid_results(self, capsys, min_result_json):\n        with mock.patch(\"openfecli.commands.gather.load_json\", return_value=min_result_json):\n            result = _load_valid_result_json(fpath=\"\")\n            captured = capsys.readouterr()\n            assert result == (((\"lig_ejm_31\", \"lig_ejm_42\"), \"solvent\"), min_result_json)\n            assert captured.err == \"\"\n\n    def test_skip_missing_unit_result(self, capsys, min_result_json):\n        min_result_json[\"unit_results\"] = {}\n\n        with mock.patch(\"openfecli.commands.gather.load_json\", return_value=min_result_json):\n            result = _load_valid_result_json(fpath=\"\")\n            captured = capsys.readouterr()\n            assert result == (((\"lig_ejm_31\", \"lig_ejm_42\"), \"solvent\"), None)\n            assert \"No 'unit_results' found\" in captured.err\n\n    def test_skip_missing_estimate(self, capsys, min_result_json):\n        min_result_json[\"estimate\"] = None\n\n        with mock.patch(\"openfecli.commands.gather.load_json\", return_value=min_result_json):\n            result = _load_valid_result_json(fpath=\"\")\n            captured = capsys.readouterr()\n            assert result == (((\"lig_ejm_31\", \"lig_ejm_42\"), \"solvent\"), None)\n            assert \"No 'estimate' found\" in captured.err\n\n    def test_skip_missing_uncertainty(self, capsys, min_result_json):\n        min_result_json[\"uncertainty\"] = None\n\n        with mock.patch(\"openfecli.commands.gather.load_json\", return_value=min_result_json):\n            result = _load_valid_result_json(fpath=\"\")\n            captured = capsys.readouterr()\n            assert result == (((\"lig_ejm_31\", \"lig_ejm_42\"), \"solvent\"), None)\n            assert \"No 'uncertainty' found\" in captured.err\n\n    def test_skip_all_failed_runs(self, capsys, min_result_json):\n        del min_result_json[\"unit_results\"][\"ProtocolUnitResult-e85\"]\n        with mock.patch(\"openfecli.commands.gather.load_json\", return_value=min_result_json):\n            result = _load_valid_result_json(fpath=\"\")\n            captured = capsys.readouterr()\n            assert result == (((\"lig_ejm_31\", \"lig_ejm_42\"), \"solvent\"), None)\n            assert \"Exception found in all\" in captured.err\n\n    def test_missing_pr_data(self, capsys, min_result_json):\n        min_result_json[\"protocol_result\"][\"data\"] = {}\n        with mock.patch(\"openfecli.commands.gather.load_json\", return_value=min_result_json):\n            result = _load_valid_result_json(fpath=\"\")\n            captured = capsys.readouterr()\n            assert result == (None, None)\n            assert \"Missing ligand names and/or simulation type. Skipping\" in captured.err\n\n    def test_get_legs_from_result_jsons(self, capsys, min_result_json):\n        \"\"\"Test that exceptions are handled correctly at the _get_legs_from_results_json level.\"\"\"\n        min_result_json[\"protocol_result\"][\"data\"] = {}\n\n        with mock.patch(\"openfecli.commands.gather.load_json\", return_value=min_result_json):\n            result = _get_legs_from_result_jsons(result_fns=[\"\"], report=\"dg\")\n            captured = capsys.readouterr()\n            assert result == {}\n            assert \"Missing ligand names and/or simulation type. Skipping\" in captured.err\n\n\ndef test_no_results_found():\n    runner = CliRunner()\n    cli_result = runner.invoke(gather, \"not_a_file.txt\")\n    assert cli_result.exit_code == 1\n    assert \"No results JSON files found\" in str(cli_result.stderr)\n\n\n_RBFE_EXPECTED_DG = b\"\"\"\nLoading results:\nligand\tDG(MLE) (kcal/mol)\tuncertainty (kcal/mol)\nlig_ejm_31\t-0.09\t0.05\nlig_ejm_42\t0.7\t0.1\nlig_ejm_46\t-0.98\t0.05\nlig_ejm_47\t-0.1\t0.1\nlig_ejm_48\t0.53\t0.09\nlig_ejm_50\t0.91\t0.06\nlig_ejm_43\t2.0\t0.2\nlig_jmc_23\t-0.68\t0.09\nlig_jmc_27\t-1.1\t0.1\nlig_jmc_28\t-1.25\t0.08\n\"\"\"\n\n_RBFE_EXPECTED_DDG = b\"\"\"\nLoading results:\nligand_i\tligand_j\tDDG(i->j) (kcal/mol)\tuncertainty (kcal/mol)\nlig_ejm_31\tlig_ejm_42\t0.8\t0.1\nlig_ejm_31\tlig_ejm_46\t-0.89\t0.06\nlig_ejm_31\tlig_ejm_47\t0.0\t0.1\nlig_ejm_31\tlig_ejm_48\t0.61\t0.09\nlig_ejm_31\tlig_ejm_50\t1.00\t0.04\nlig_ejm_42\tlig_ejm_43\t1.4\t0.2\nlig_ejm_46\tlig_jmc_23\t0.29\t0.09\nlig_ejm_46\tlig_jmc_27\t-0.1\t0.1\nlig_ejm_46\tlig_jmc_28\t-0.27\t0.06\n\"\"\"\n\n_RBFE_EXPECTED_RAW = b\"\"\"\\\nLoading results:\nleg\tligand_i\tligand_j\tDG(i->j) (kcal/mol)\tMBAR uncertainty (kcal/mol)\ncomplex\tlig_ejm_31\tlig_ejm_42\t-14.9\t0.8\ncomplex\tlig_ejm_31\tlig_ejm_42\t-14.8\t0.8\ncomplex\tlig_ejm_31\tlig_ejm_42\t-15.1\t0.8\nsolvent\tlig_ejm_31\tlig_ejm_42\t-15.7\t0.8\nsolvent\tlig_ejm_31\tlig_ejm_42\t-15.7\t0.8\nsolvent\tlig_ejm_31\tlig_ejm_42\t-15.7\t0.8\ncomplex\tlig_ejm_31\tlig_ejm_46\t-40.7\t0.8\ncomplex\tlig_ejm_31\tlig_ejm_46\t-40.7\t0.8\ncomplex\tlig_ejm_31\tlig_ejm_46\t-40.8\t0.8\nsolvent\tlig_ejm_31\tlig_ejm_46\t-39.8\t0.8\nsolvent\tlig_ejm_31\tlig_ejm_46\t-39.9\t0.8\nsolvent\tlig_ejm_31\tlig_ejm_46\t-39.8\t0.8\ncomplex\tlig_ejm_31\tlig_ejm_47\t-27.8\t0.8\ncomplex\tlig_ejm_31\tlig_ejm_47\t-28.0\t0.8\ncomplex\tlig_ejm_31\tlig_ejm_47\t-27.7\t0.8\nsolvent\tlig_ejm_31\tlig_ejm_47\t-27.8\t0.8\nsolvent\tlig_ejm_31\tlig_ejm_47\t-27.8\t0.8\nsolvent\tlig_ejm_31\tlig_ejm_47\t-27.9\t0.8\ncomplex\tlig_ejm_31\tlig_ejm_48\t-16.2\t0.8\ncomplex\tlig_ejm_31\tlig_ejm_48\t-16.2\t0.8\ncomplex\tlig_ejm_31\tlig_ejm_48\t-16.0\t0.8\nsolvent\tlig_ejm_31\tlig_ejm_48\t-16.8\t0.8\nsolvent\tlig_ejm_31\tlig_ejm_48\t-16.7\t0.8\nsolvent\tlig_ejm_31\tlig_ejm_48\t-16.8\t0.8\ncomplex\tlig_ejm_31\tlig_ejm_50\t-57.3\t0.8\ncomplex\tlig_ejm_31\tlig_ejm_50\t-57.3\t0.8\ncomplex\tlig_ejm_31\tlig_ejm_50\t-57.4\t0.8\nsolvent\tlig_ejm_31\tlig_ejm_50\t-58.3\t0.8\nsolvent\tlig_ejm_31\tlig_ejm_50\t-58.4\t0.8\nsolvent\tlig_ejm_31\tlig_ejm_50\t-58.3\t0.8\ncomplex\tlig_ejm_42\tlig_ejm_43\t-19.0\t0.8\ncomplex\tlig_ejm_42\tlig_ejm_43\t-18.7\t0.8\ncomplex\tlig_ejm_42\tlig_ejm_43\t-19.0\t0.8\nsolvent\tlig_ejm_42\tlig_ejm_43\t-20.3\t0.8\nsolvent\tlig_ejm_42\tlig_ejm_43\t-20.3\t0.8\nsolvent\tlig_ejm_42\tlig_ejm_43\t-20.3\t0.8\ncomplex\tlig_ejm_46\tlig_jmc_23\t17.3\t0.8\ncomplex\tlig_ejm_46\tlig_jmc_23\t17.4\t0.8\ncomplex\tlig_ejm_46\tlig_jmc_23\t17.5\t0.8\nsolvent\tlig_ejm_46\tlig_jmc_23\t17.2\t0.8\nsolvent\tlig_ejm_46\tlig_jmc_23\t17.1\t0.8\nsolvent\tlig_ejm_46\tlig_jmc_23\t17.1\t0.8\ncomplex\tlig_ejm_46\tlig_jmc_27\t15.9\t0.8\ncomplex\tlig_ejm_46\tlig_jmc_27\t15.8\t0.8\ncomplex\tlig_ejm_46\tlig_jmc_27\t15.7\t0.8\nsolvent\tlig_ejm_46\tlig_jmc_27\t16.0\t0.8\nsolvent\tlig_ejm_46\tlig_jmc_27\t15.9\t0.8\nsolvent\tlig_ejm_46\tlig_jmc_27\t15.9\t0.8\ncomplex\tlig_ejm_46\tlig_jmc_28\t23.1\t0.8\ncomplex\tlig_ejm_46\tlig_jmc_28\t23.2\t0.8\ncomplex\tlig_ejm_46\tlig_jmc_28\t23.1\t0.8\nsolvent\tlig_ejm_46\tlig_jmc_28\t23.5\t0.8\nsolvent\tlig_ejm_46\tlig_jmc_28\t23.3\t0.8\nsolvent\tlig_ejm_46\tlig_jmc_28\t23.4\t0.8\n\"\"\"\n\n\n@pytest.fixture\ndef cmet_result_dir() -> pathlib.Path:\n    pooch_cmet.fetch(\"cmet_results.tar.gz\", processor=pooch.Untar())\n    result_dir = pathlib.Path(POOCH_CACHE) / \"cmet_results.tar.gz.untar/cmet_results/\"\n\n    return result_dir\n\n\nclass TestGatherCMET:\n    @pytest.mark.parametrize(\"report\", [\"dg\", \"ddg\", \"raw\"])\n    def test_cmet_full_results(self, cmet_result_dir, report, file_regression):\n        results = [str(cmet_result_dir / f\"results_{i}\") for i in range(3)]\n        args = [\"--report\", report]\n        runner = CliRunner()\n        cli_result = runner.invoke(gather, results + args + [\"--tsv\"])\n\n        assert_click_success(cli_result)\n        file_regression.check(cli_result.stdout, extension=\".tsv\")\n\n    # TODO: add --allow-partial behavior checks\n    @pytest.mark.parametrize(\"report\", [\"dg\", \"ddg\", \"raw\"])\n    def test_cmet_missing_complex_leg(self, cmet_result_dir, report, file_regression):\n        \"\"\"Missing one complex replicate from one leg.\"\"\"\n        results = [\n            str(cmet_result_dir / d) for d in [\"results_0_partial\", \"results_1\", \"results_2\"]\n        ]\n        args = [\"--report\", report]\n        runner = CliRunner()\n        cli_result = runner.invoke(gather, results + args + [\"--tsv\"])\n\n        assert_click_success(cli_result)\n        file_regression.check(cli_result.stdout, extension=\".tsv\")\n\n    @pytest.mark.parametrize(\"report\", [\"dg\", \"ddg\", \"raw\"])\n    def test_cmet_missing_edge(self, cmet_result_dir, report, file_regression):\n        results = [str(cmet_result_dir / f\"results_{i}_remove_edge\") for i in range(3)]\n        args = [\"--report\", report]\n        runner = CliRunner()\n        cli_result = runner.invoke(gather, results + args + [\"--tsv\"])\n        file_regression.check(cli_result.stdout, extension=\".tsv\")\n\n        assert_click_success(cli_result)\n        file_regression.check(cli_result.stdout, extension=\".tsv\")\n\n    @pytest.mark.parametrize(\"report\", [\"ddg\", \"raw\"])\n    def test_cmet_failed_edge(self, cmet_result_dir, report, file_regression):\n        results = [str(cmet_result_dir / f\"results_{i}_failed_edge\") for i in range(3)]\n        args = [\"--report\", report]\n        runner = CliRunner()\n        cli_result = runner.invoke(gather, results + args + [\"--tsv\"])\n\n        assert_click_success(cli_result)\n        file_regression.check(cli_result.stdout, extension=\".tsv\")\n\n    @pytest.mark.parametrize(\"allow_partial\", [True, False])\n    def test_cmet_too_few_edges_error(self, cmet_result_dir, allow_partial):\n        results = [str(cmet_result_dir / f\"results_{i}_failed_edge\") for i in range(3)]\n        args = [\"--report\", \"dg\"]\n        runner = CliRunner()\n        if allow_partial:\n            args += [\"--allow-partial\"]\n\n        cli_result = runner.invoke(gather, results + args + [\"--tsv\"])\n        assert cli_result.exit_code == 1\n        assert \"The results network has 1 edge(s), but 3 or more edges are required\" in str(\n            cli_result.stderr\n        )\n\n    @pytest.mark.parametrize(\"report\", [\"dg\", \"ddg\"])\n    def test_cmet_missing_all_complex_legs_fail(self, cmet_result_dir, report, file_regression):\n        \"\"\"Missing one complex replicate from one leg.\"\"\"\n        results = glob.glob(f\"{cmet_result_dir}/results_*/*solvent*\", recursive=True)\n        args = [\"--report\", report]\n        runner = CliRunner()\n        cli_result = runner.invoke(gather, results + args + [\"-o\", \"-\"])\n\n        cli_result.exit_code == 1\n        file_regression.check(cli_result.stdout, extension=\".tsv\")\n\n    @pytest.mark.parametrize(\"report\", [\"ddg\"])\n    def test_cmet_missing_all_complex_legs_allow_partial(self, cmet_result_dir, report, file_regression):  # fmt: skip\n        \"\"\"Missing one complex replicate from one leg.\"\"\"\n        results = glob.glob(f\"{cmet_result_dir}/results_*/*solvent*\", recursive=True)\n        args = [\"--report\", report, \"--allow-partial\"]\n        runner = CliRunner()\n        cli_result = runner.invoke(gather, results + args + [\"--tsv\"])\n\n        assert_click_success(cli_result)\n        file_regression.check(cli_result.stdout, extension=\".tsv\")\n\n    @pytest.mark.parametrize(\"report\", [\"dg\", \"ddg\", \"raw\"])\n    def test_pretty_print(self, cmet_result_dir, report, file_regression):\n        results = [str(cmet_result_dir / f\"results_{i}\") for i in range(3)]\n        args = [\"--report\", report]\n        runner = CliRunner()\n        cli_result = runner.invoke(gather, results + args)\n        assert_click_success(cli_result)\n        # TODO: figure out how to mock terminal size, since it affects the table wrapping\n        # file_regression.check(cli_result.stdout, extension='.txt')\n\n    def test_write_to_file(self, cmet_result_dir):\n        runner = CliRunner()\n        with runner.isolated_filesystem():\n            results = [str(cmet_result_dir / f\"results_{i}\") for i in range(3)]\n            fname = \"output.tsv\"\n            args = [\"--report\", \"raw\", \"-o\", fname]\n            cli_result = runner.invoke(gather, results + args)\n            assert \"writing raw output to 'output.tsv'\" in cli_result.stdout\n            assert pathlib.Path(fname).is_file()\n\n\n@pytest.fixture\ndef rbfe_results_serial_dir() -> pathlib.Path:\n    pooch_rbfe_serial.fetch(\"rbfe_results_serial_repeats.tar.gz\", processor=pooch.Untar())\n    result_dir = (\n        pathlib.Path(POOCH_CACHE)\n        / \"rbfe_results_serial_repeats.tar.gz.untar/rbfe_results_serial_repeats/\"\n    )\n    return result_dir\n\n\n@pytest.fixture\ndef rbfe_results_parallel_dir() -> pathlib.Path:\n    pooch_rbfe_parallel.fetch(\"rbfe_results_parallel_repeats.tar.gz\", processor=pooch.Untar())\n    result_dir = (\n        pathlib.Path(POOCH_CACHE)\n        / \"rbfe_results_parallel_repeats.tar.gz.untar/rbfe_results_parallel_repeats/\"\n    )\n    return result_dir\n\n\n@pytest.mark.skipif(\n    not os.path.exists(POOCH_CACHE) and not HAS_INTERNET,\n    reason=\"Internet seems to be unavailable and test data is not cached locally.\",\n)\n@pytest.mark.parametrize(\"dataset\", [\"rbfe_results_serial_dir\", \"rbfe_results_parallel_dir\"])  # fmt: skip\n@pytest.mark.parametrize(\"report\", [\"\", \"dg\", \"ddg\", \"raw\"])\n@pytest.mark.parametrize(\"input_mode\", [\"directory\", \"filepaths\"])\ndef test_rbfe_gather(request, dataset, report, input_mode):\n    expected = {\n        \"\": _RBFE_EXPECTED_DG,\n        \"dg\": _RBFE_EXPECTED_DG,\n        \"ddg\": _RBFE_EXPECTED_DDG,\n        \"raw\": _RBFE_EXPECTED_RAW,\n    }[report]\n    runner = CliRunner()\n\n    if report:\n        args = [\"--report\", report]\n    else:\n        args = []\n\n    results = request.getfixturevalue(dataset)\n    if input_mode == \"directory\":\n        results = [str(results)]\n    elif input_mode == \"filepaths\":\n        results = glob.glob(f\"{results}/*\", recursive=True)\n        assert len(results) > 1  # sanity check to make sure we're passing in multiple paths\n\n    cli_result = runner.invoke(gather, results + args + [\"--tsv\"])\n\n    assert_click_success(cli_result)\n\n    actual_lines = set(cli_result.stdout_bytes.split(b\"\\n\"))\n    assert set(expected.split(b\"\\n\")) == actual_lines\n\n\ndef test_rbfe_gather_single_repeats_dg_error(rbfe_results_parallel_dir):\n    \"\"\"A single repeat is insufficient for a dg calculation - should fail cleanly.\"\"\"\n\n    runner = CliRunner()\n    results = rbfe_results_parallel_dir\n    args = [\"report\", \"dg\"]\n    cli_result = runner.invoke(gather, [f\"{results}/replicate_0\"] + args + [\"--tsv\"])\n    assert cli_result.exit_code == 1\n\n\n@pytest.mark.skipif(\n    not os.path.exists(POOCH_CACHE) and not HAS_INTERNET,\n    reason=\"Internet seems to be unavailable and test data is not cached locally.\",\n)\nclass TestRBFEGatherFailedEdges:\n    @pytest.fixture()\n    def results_paths_serial_missing_legs(self, rbfe_results_serial_dir) -> str:\n        \"\"\"Example output data, with replicates run in serial and two missing results JSONs.\"\"\"\n        result_dir = rbfe_results_serial_dir\n        results = glob.glob(f\"{result_dir}/*\", recursive=True)\n\n        files_to_skip = [\n            \"rbfe_lig_ejm_31_complex_lig_ejm_42_complex.json\",\n            \"rbfe_lig_ejm_46_solvent_lig_jmc_28_solvent.json\",\n        ]\n\n        results_filtered = [f for f in results if os.path.basename(f) not in files_to_skip]\n\n        return results_filtered\n\n    def test_missing_leg_error(self, results_paths_serial_missing_legs: str):\n        runner = CliRunner()\n        result = runner.invoke(gather, results_paths_serial_missing_legs + [\"--report\", \"dg\"])\n\n        assert result.exit_code == 1\n        assert \"Some edge(s) are missing runs\" in str(result.stderr)\n        assert \"lig_ejm_31\\tlig_ejm_42\\tsolvent\" in str(result.stderr)\n        assert \"lig_ejm_46\\tlig_jmc_28\\tcomplex\" in str(result.stderr)\n        assert \"using the --allow-partial flag\" in str(result.stderr)\n\n    def test_missing_leg_allow_partial_disconnected(self, results_paths_serial_missing_legs: str):\n        runner = CliRunner()\n        with pytest.warns():\n            args = [\"--report\", \"dg\", \"--allow-partial\"]\n            result = runner.invoke(gather, results_paths_serial_missing_legs + args + [\"--tsv\"])\n            assert result.exit_code == 1\n            assert \"The results network is disconnected\" in str(result.stderr)\n\n    def test_allow_partial_msg_not_printed(self, results_paths_serial_missing_legs: str):\n        # we *dont* want the suggestion to use --allow-partial if the user already used it!\n        runner = CliRunner()\n        args = [\"--report\", \"ddg\", \"--allow-partial\"]\n        result = runner.invoke(gather, results_paths_serial_missing_legs + args + [\"--tsv\"])\n        assert_click_success(result)\n        assert \"--allow-partial\" not in result.output\n\n\nZENODO_ABFE_DATA = pooch.create(\n    path=POOCH_CACHE,\n    base_url=zenodo_abfe_data[\"base_url\"],\n    registry={zenodo_abfe_data[\"fname\"]: zenodo_abfe_data[\"known_hash\"]},\n)\nZENODO_SEPTOP_DATA = pooch.create(\n    path=POOCH_CACHE,\n    base_url=zenodo_septop_data[\"base_url\"],\n    registry={zenodo_septop_data[\"fname\"]: zenodo_septop_data[\"known_hash\"]},\n)\n\n\n@pytest.fixture\ndef abfe_result_dir() -> pathlib.Path:\n    \"\"\"for pre-PR #1776 backwards compatability\"\"\"\n    ZENODO_ABFE_DATA.fetch(\"abfe_results.zip\", processor=pooch.Unzip())\n    result_dir = pathlib.Path(POOCH_CACHE) / \"abfe_results.zip.unzip/abfe_results/\"\n    return result_dir\n\n\nclass TestGatherABFE:\n    @pytest.mark.parametrize(\"report\", [\"raw\", \"dg\"])\n    @pytest.mark.parametrize(\"protocol_type\", [\"single_unit\", \"multiple_units\"])\n    def test_abfe_full_results(self, abfe_result_dir, report, protocol_type, file_regression):\n        results_dir = abfe_result_dir / f\"abfe_results_{protocol_type}\"\n        results = [str(results_dir / f\"results_{i}\") for i in range(3)]\n        args = [\"--report\", report]\n        runner = CliRunner()\n        cli_result = runner.invoke(gather_abfe, results + args + [\"--tsv\"])\n\n        assert_click_success(cli_result)\n        assert \"WARNING! Gathering of ABFE results\" in cli_result.stderr\n\n        file_regression.check(cli_result.stdout, extension=\".tsv\")\n\n    @pytest.mark.parametrize(\"report\", [\"raw\", \"dg\"])\n    @pytest.mark.parametrize(\"protocol_type\", [\"single_unit\", \"multiple_units\"])\n    def test_abfe_single_repeat(self, abfe_result_dir, report, protocol_type, file_regression):\n        results_dir = str(abfe_result_dir / f\"abfe_results_{protocol_type}\" / \"results_0\")\n        args = [\"--report\", report]\n        runner = CliRunner()\n        cli_result = runner.invoke(gather_abfe, [results_dir] + args + [\"--tsv\"])\n\n        assert_click_success(cli_result)\n        assert \"WARNING! Gathering of ABFE results\" in cli_result.stderr\n\n        file_regression.check(cli_result.stdout, extension=\".tsv\")\n\n\n@pytest.fixture\ndef septop_result_dir() -> pathlib.Path:\n    ZENODO_SEPTOP_DATA.fetch(\"septop_results.zip\", processor=pooch.Unzip())\n    result_dir = pathlib.Path(POOCH_CACHE) / \"septop_results.zip.unzip/septop_results/\"\n\n    return result_dir\n\n\nclass TestGatherSepTop:\n    \"\"\"\n    Test SepTop gathering.\n\n    Notes\n    -----\n    * Version parameterize option allows for testing of backwards\n      reproducible gathering behaviour as the ProtocolUnit behaviour\n      was changed in openfe v1.11\n    \"\"\"\n\n    @pytest.mark.parametrize(\"version\", [\"current\", \"pre_openfe_v1.11\"])\n    @pytest.mark.parametrize(\"report\", [\"raw\", \"ddg\", \"dg\"])\n    def test_septop_full_results(self, version, septop_result_dir, report, file_regression):\n        results = [str(septop_result_dir / version / f\"results_{i}\") for i in range(3)]\n        args = [\"--report\", report]\n        runner = CliRunner()\n        cli_result = runner.invoke(gather_septop, results + args + [\"--tsv\"])\n\n        assert_click_success(cli_result)\n        assert \"WARNING! Gathering of SepTop results\" in cli_result.stderr\n\n        file_regression.check(cli_result.stdout, extension=\".tsv\")\n\n    @pytest.mark.parametrize(\"version\", [\"current\", \"pre_openfe_v1.11\"])\n    @pytest.mark.parametrize(\"report\", [\"raw\", \"ddg\", \"dg\"])\n    def test_septop_single_repeat(self, version, septop_result_dir, report, file_regression):\n        results = [str(septop_result_dir / version / \"results_0\")]\n        args = [\"--report\", report]\n        runner = CliRunner()\n        cli_result = runner.invoke(gather_septop, results + args + [\"--tsv\"])\n\n        assert_click_success(cli_result)\n        assert \"WARNING! Gathering of SepTop results\" in cli_result.stderr\n\n        file_regression.check(cli_result.stdout, extension=\".tsv\")\n"
  },
  {
    "path": "src/openfecli/tests/commands/test_ligand_network_viewer.py",
    "content": "import importlib.resources\nfrom unittest import mock\n\nimport matplotlib\nimport pytest\nfrom click.testing import CliRunner\n\nfrom openfecli.commands.view_ligand_network import view_ligand_network\n\n\n@pytest.mark.filterwarnings(\"ignore:.*non-GUI backend\")\ndef test_view_ligand_network():\n    # smoke test\n    resource = importlib.resources.files(\"openfe.tests.data.serialization\")\n    ref = resource / \"network_template.graphml\"\n    runner = CliRunner()\n\n    backend = matplotlib.get_backend()\n    matplotlib.use(\"ps\")\n    loc = \"openfe.utils.atommapping_network_plotting.matplotlib.use\"\n    with runner.isolated_filesystem():\n        with mock.patch(loc, mock.Mock()):\n            result = runner.invoke(view_ligand_network, [str(ref)])\n            assert result.exit_code == 0\n\n    matplotlib.use(backend)\n"
  },
  {
    "path": "src/openfecli/tests/commands/test_plan_rbfe_network.py",
    "content": "import shutil\nfrom importlib import resources\nfrom unittest import mock\n\nimport gufe\nimport numpy as np\nimport pytest\nfrom click.testing import CliRunner\nfrom openff.units import unit\n\nfrom openfe import (\n    AlchemicalNetwork,\n    ProteinMembraneComponent,\n    SmallMoleculeComponent,\n    SolventComponent,\n)\nfrom openfe.protocols.openmm_utils.charge_generation import HAS_NAGL, HAS_OPENEYE\nfrom openfe.protocols.openmm_utils.omm_settings import OpenFFPartialChargeSettings\nfrom openfe.setup import (\n    LomapAtomMapper,\n    ligand_network_planning,\n    lomap_scorers,\n)\nfrom openfe.tests.conftest import (\n    T4_protein_component,\n    T4_protein_component_pdb,\n    a2a_protein_membrane_component,\n    a2a_protein_membrane_pdb,\n)\nfrom openfecli.commands.plan_rbfe_network import plan_rbfe_network, plan_rbfe_network_main\n\nfrom ..utils import assert_click_success\n\n\n@pytest.fixture(scope=\"session\")\ndef mol_dir_args(tmp_path_factory):\n    ofe_dir_path = tmp_path_factory.mktemp(\"moldir\")\n\n    with resources.as_file(resources.files(\"openfe.tests.data.openmm_rfe\")) as d:\n        for f in [\"ligand_23.sdf\", \"ligand_55.sdf\"]:\n            shutil.copyfile(d / f, ofe_dir_path / f)\n\n    return [\"--molecules\", ofe_dir_path]\n\n\n@pytest.fixture(scope=\"session\")\ndef dummy_charge_dir_args(tmp_path_factory):\n    ofe_dir_path = tmp_path_factory.mktemp(\"charge_moldir\")\n\n    with resources.as_file(resources.files(\"openfe.tests.data.openmm_rfe\")) as d:\n        for f in [\"dummy_charge_ligand_23.sdf\", \"dummy_charge_ligand_55.sdf\"]:\n            shutil.copyfile(d / f, ofe_dir_path / f)\n\n    return [\"--molecules\", ofe_dir_path]\n\n\n@pytest.fixture\ndef protein_args(T4_protein_component_pdb):\n    with resources.as_file(resources.files(\"openfe.tests.data\")) as d:\n        return [\"--protein\", T4_protein_component_pdb]\n\n\n@pytest.fixture\ndef protein_membrane_args(a2a_protein_membrane_pdb):\n    return [\"--protein-membrane\", a2a_protein_membrane_pdb]\n\n\ndef print_test_with_file(\n    mapping_scorer,\n    ligand_network_planner,\n    small_molecules,\n    solvent,\n    protein,\n):\n    print(mapping_scorer)\n    print(ligand_network_planner)\n    print(small_molecules)\n    print(solvent)\n    print(protein)\n\n\ndef validate_charges(smc):\n    \"\"\"\n    Validate that the SmallMoleculeComponent has partial charges assigned.\n    \"\"\"\n    off_mol = smc.to_openff()\n    assert off_mol.partial_charges is not None\n    assert len(off_mol.partial_charges) == off_mol.n_atoms\n\n\n@pytest.fixture\ndef ligs_23_55() -> list[SmallMoleculeComponent]:\n    with resources.as_file(resources.files(\"openfe.tests.data.openmm_rfe\")) as d:\n        return [\n            SmallMoleculeComponent.from_sdf_file(d / f) for f in [\"ligand_23.sdf\", \"ligand_55.sdf\"]\n        ]\n\n\n@pytest.mark.skipif(not HAS_NAGL, reason=\"needs NAGL\")\n@pytest.mark.skipif(\n    HAS_OPENEYE, reason=\"cannot use NAGL with rdkit backend when OpenEye is installed\"\n)\n@pytest.mark.parametrize(\n    \"protein_fixture\", [\"T4_protein_component\", \"a2a_protein_membrane_component\"]\n)\ndef test_plan_rbfe_network_main(request, protein_fixture, ligs_23_55):\n    smallM_components = ligs_23_55\n    protein_component = request.getfixturevalue(protein_fixture)\n    solvent_component = SolventComponent()\n\n    alchemical_network, _ = plan_rbfe_network_main(\n        mapper=[LomapAtomMapper()],\n        mapping_scorer=lomap_scorers.default_lomap_score,\n        ligand_network_planner=ligand_network_planning.generate_minimal_spanning_network,\n        small_molecules=smallM_components,\n        solvent=solvent_component,\n        protein=protein_component,\n        cofactors=[],\n        n_protocol_repeats=3,\n        # use nagl to keep testing fast\n        partial_charge_settings=OpenFFPartialChargeSettings(\n            partial_charge_method=\"nagl\", nagl_model=\"openff-gnn-am1bcc-0.1.0-rc.3.pt\"\n        ),\n        processors=1,\n        overwrite_charges=False,\n    )\n    # check the ligands have charges assigned\n    for node in alchemical_network.nodes:\n        validate_charges(node.components[\"ligand\"])\n\n    for edge in alchemical_network.edges:\n        settings = edge.protocol.settings\n        expected_barostat = \"MonteCarloBarostat\"\n        if \"complex\" in edge.name:\n            padding = 1.0  # nm\n            if isinstance(protein_component, ProteinMembraneComponent):\n                expected_barostat = \"MonteCarloMembraneBarostat\"\n        else:\n            padding = 1.5  # nm\n        assert settings.solvation_settings.solvent_padding == padding * unit.nanometer\n        assert settings.forcefield_settings.nonbonded_cutoff == 0.9 * unit.nanometer\n        assert settings.solvation_settings.box_shape == \"dodecahedron\"\n        assert settings.simulation_settings.time_per_iteration == 2.5 * unit.picosecond\n        assert settings.integrator_settings.barostat == expected_barostat\n\n\n@pytest.fixture\ndef yaml_nagl_settings():\n    return \"\"\"\\\npartial_charge:\n  method: nagl\n  settings:\n    nagl_model: openff-gnn-am1bcc-0.1.0-rc.3.pt\n\"\"\"\n\n\n@pytest.mark.skipif(not HAS_NAGL, reason=\"needs NAGL\")\n@pytest.mark.skipif(\n    HAS_OPENEYE, reason=\"cannot use NAGL with rdkit backend when OpenEye is installed\"\n)\n@pytest.mark.parametrize(\"protein_fixture\", [\"protein_args\", \"protein_membrane_args\"])\ndef test_plan_rbfe_network(mol_dir_args, request, protein_fixture, tmp_path, yaml_nagl_settings):\n    \"\"\"\n    smoke test\n    \"\"\"\n    # use nagl charges for CI speed!\n    settings_path = tmp_path / \"settings.yaml\"\n    with open(settings_path, \"w\") as f:\n        f.write(yaml_nagl_settings)\n\n    args = mol_dir_args + request.getfixturevalue(protein_fixture)\n\n    # TODO: this depends on the fixture name, which I do not like\n    expected_protein_type = (\n        \"ProteinMembraneComponent\" if \"membrane\" in protein_fixture else \"ProteinComponent\"\n    )\n\n    expected_output_always = [\n        \"RBFE-NETWORK PLANNER\",\n        f\"{expected_protein_type}: {expected_protein_type}(name=)\",\n        \"Solvent: SolventComponent(name=O, Na+, Cl-)\",\n        \"- tmp_network.json\",\n        # make sure the partial charge settings are picked up\n        \"Partial Charge Generation: nagl\",\n        \"assigning ligand partial charges -- this may be slow\",\n    ]\n    # we can get these in either order: 22 first or 55 first\n    expected_output_1 = [\n        \"Small Molecules: SmallMoleculeComponent(name=ligand_23) SmallMoleculeComponent(name=ligand_55)\",\n        \"- rbfe_ligand_23_complex_ligand_55_complex.json\",\n        \"- rbfe_ligand_23_solvent_ligand_55_solvent.json\",\n    ]\n    expected_output_2 = [\n        \"Small Molecules: SmallMoleculeComponent(name=ligand_55) SmallMoleculeComponent(name=ligand_23)\",\n        \"- rbfe_ligand_55_complex_ligand_23_complex.json\",\n        \"- rbfe_ligand_55_solvent_ligand_23_solvent.json\",\n    ]\n\n    patch_base = \"openfecli.commands.plan_rbfe_network.\"\n    args += [\"-o\", \"tmp_network\"]\n    args += [\"-s\", settings_path]\n\n    patch_loc = patch_base + \"plan_rbfe_network\"\n    patch_func = print_test_with_file\n\n    runner = CliRunner()\n    with mock.patch(patch_loc, patch_func):\n        with runner.isolated_filesystem():\n            result = runner.invoke(plan_rbfe_network, args)\n            assert result.exit_code == 0\n            for line in expected_output_always:\n                assert line in result.output\n\n            for l1, l2 in zip(expected_output_1, expected_output_2):\n                assert l1 in result.output or l2 in result.output\n\n\n@pytest.mark.parametrize(\n    [\"input_n_repeat\", \"expected_n_repeat\"],\n    [\n        ([], 3),\n        ([\"--n-protocol-repeats\", \"1\"], 1),\n    ],\n)\ndef test_plan_rbfe_network_n_repeats(mol_dir_args, protein_args, input_n_repeat, expected_n_repeat):\n    runner = CliRunner()\n\n    args = mol_dir_args + protein_args + input_n_repeat\n\n    with runner.isolated_filesystem():\n        result = runner.invoke(plan_rbfe_network, args)\n        assert_click_success(result)\n\n        # make sure the number of repeats is correct\n        network = AlchemicalNetwork.from_json(\"alchemicalNetwork/alchemicalNetwork.json\")\n        for edge in network.edges:\n            assert edge.protocol.settings.protocol_repeats == expected_n_repeat\n\n\n@pytest.mark.parametrize(\n    \"overwrite\",\n    [\n        pytest.param(True, id=\"Overwrite\"),\n        pytest.param(False, id=\"No overwrite\"),\n    ],\n)\n@pytest.mark.skipif(not HAS_NAGL, reason=\"needs NAGL\")\n@pytest.mark.skipif(\n    HAS_OPENEYE, reason=\"cannot use NAGL with rdkit backend when OpenEye is installed\"\n)\ndef test_plan_rbfe_network_charge_overwrite(dummy_charge_dir_args, protein_args, tmp_path, yaml_nagl_settings, overwrite):  # fmt: skip\n    # make sure the dummy charges are overwritten when requested\n\n    # use nagl charges for CI speed!\n    settings_path = tmp_path / \"settings.yaml\"\n    with open(settings_path, \"w\") as f:\n        f.write(yaml_nagl_settings)\n\n    args = dummy_charge_dir_args + protein_args + [\"-s\", settings_path]\n\n    # get the input charges for the molecules to check they have been overwritten\n    charges_by_name = {}\n    for f in [\"dummy_charge_ligand_23.sdf\", \"dummy_charge_ligand_55.sdf\"]:\n        smc = SmallMoleculeComponent.from_sdf_file(dummy_charge_dir_args[1] / f)\n        charges_by_name[smc.name] = smc.to_openff().partial_charges.m\n\n    if overwrite:\n        args.append(\"--overwrite-charges\")\n\n    runner = CliRunner()\n    with runner.isolated_filesystem():\n        result = runner.invoke(plan_rbfe_network, args)\n\n        assert result.exit_code == 0\n        if overwrite:\n            assert \"Overwriting partial charges\" in result.output\n\n        network = AlchemicalNetwork.from_json(\"alchemicalNetwork/alchemicalNetwork.json\")\n        # make sure the ligands don't have dummy charges\n        for node in network.nodes:\n            off_mol = node.components[\"ligand\"].to_openff()\n\n            if overwrite:\n                assert not np.allclose(off_mol.partial_charges.m, charges_by_name[off_mol.name])\n            else:\n                assert np.allclose(off_mol.partial_charges.m, charges_by_name[off_mol.name])\n\n\n@pytest.fixture\ndef eg5_files():\n    with resources.as_file(resources.files(\"openfe.tests.data.eg5\")) as p:\n        pdb_path = str(p.joinpath(\"eg5_protein.pdb\"))\n        lig_path = str(p.joinpath(\"eg5_ligands.sdf\"))\n        cof_path = str(p.joinpath(\"eg5_cofactor.sdf\"))\n\n        yield pdb_path, lig_path, cof_path\n\n\n@pytest.mark.skipif(not HAS_NAGL, reason=\"needs NAGL\")\n@pytest.mark.skipif(\n    HAS_OPENEYE, reason=\"cannot use NAGL with rdkit backend when OpenEye is installed\"\n)\ndef test_plan_rbfe_network_cofactors(eg5_files, tmp_path, yaml_nagl_settings):\n    # use nagl charges for CI speed!\n    settings_path = tmp_path / \"settings.yaml\"\n    with open(settings_path, \"w\") as f:\n        f.write(yaml_nagl_settings)\n\n    runner = CliRunner()\n\n    args = [\"-p\", eg5_files[0], \"-M\", eg5_files[1], \"-C\", eg5_files[2], \"-s\", settings_path]\n\n    with runner.isolated_filesystem():\n        result = runner.invoke(plan_rbfe_network, args)\n\n        assert result.exit_code == 0\n        # check charges are assigned\n        assert \"Partial Charge Generation: nagl\" in result.output\n        assert \"assigning ligand partial charges -- this may be slow\" in result.output\n        assert \"assigning cofactor partial charges -- this may be slow\"\n\n        # make sure the cofactor is in the transformations\n        network = AlchemicalNetwork.from_json(\"alchemicalNetwork/alchemicalNetwork.json\")\n        for edge in network.edges:\n            if \"protein\" in edge.stateA.components:\n                assert \"cofactor1\" in edge.stateA.components\n                assert \"cofactor1\" in edge.stateB.components\n            else:\n                assert \"cofactor1\" not in edge.stateA.components\n                assert \"cofactor1\" not in edge.stateB.components\n        # make sure the ligands and cofactors have charges\n        for node in network.nodes:\n            validate_charges(node.components[\"ligand\"])\n            if \"cofactor1\" in node.components:\n                validate_charges(node.components[\"cofactor1\"])\n\n\n@pytest.fixture\ndef cdk8_files():\n    with resources.as_file(resources.files(\"openfe.tests.data.cdk8\")) as p:\n        pdb_path = str(p.joinpath(\"cdk8_protein.pdb\"))\n        lig_path = str(p.joinpath(\"cdk8_ligands.sdf\"))\n\n        yield pdb_path, lig_path\n\n\ndef test_plan_rbfe_network_charge_changes(cdk8_files, caplog):\n    \"\"\"\n    Make sure the protocol settings are changed and a warning is printed when we plan a network\n    with a net charge change.\n    \"\"\"\n\n    runner = CliRunner()\n\n    args = [\"-p\", cdk8_files[0], \"-M\", cdk8_files[1]]\n\n    with runner.isolated_filesystem():\n        result = runner.invoke(plan_rbfe_network, args)\n\n        assert result.exit_code == 0\n        # load the transformations and check the settings\n        network = AlchemicalNetwork.from_json(\"alchemicalNetwork/alchemicalNetwork.json\")\n        for edge in network.edges:\n            settings = edge.protocol.settings\n            # check the charged transform\n            if (\n                edge.stateA.components[\"ligand\"].name == \"lig_40\"\n                and edge.stateB.components[\"ligand\"].name == \"lig_41\"\n            ):\n                assert settings.alchemical_settings.explicit_charge_correction is True\n                assert settings.simulation_settings.production_length.m == 20.0\n                assert settings.simulation_settings.n_replicas == 22\n                assert settings.lambda_settings.lambda_windows == 22\n            else:\n                assert settings.alchemical_settings.explicit_charge_correction is False\n                assert settings.simulation_settings.production_length.m == 5.0\n                assert settings.simulation_settings.n_replicas == 11\n                assert settings.lambda_settings.lambda_windows == 11\n\n    assert \"Charge changing transformation between ligands lig_40 and lig_41\" in caplog.text\n\n\n@pytest.fixture\ndef lomap_yaml_settings():\n    return \"\"\"\\\nnetwork:\n  method: generate_lomap_network\n  settings:\n    max_path_length: 6\n\nmapper:\n  method: LomapAtomMapper\n  settings:\n    time: 45\n    element_change: True\n\npartial_charge:\n  method: nagl\n  settings:\n    nagl_model: openff-gnn-am1bcc-0.1.0-rc.3.pt\n\"\"\"\n\n\n@pytest.mark.skipif(not HAS_NAGL, reason=\"needs NAGL\")\n@pytest.mark.skipif(\n    HAS_OPENEYE, reason=\"cannot use NAGL with rdkit backend when OpenEye is installed\"\n)\ndef test_lomap_yaml_plan_rbfe_smoke_test(lomap_yaml_settings, cdk8_files, tmp_path):\n    protein, ligand = cdk8_files\n    settings_path = tmp_path / \"settings.yaml\"\n    with open(settings_path, \"w\") as f:\n        f.write(lomap_yaml_settings)\n\n    assert settings_path.exists()\n\n    args = [\"-p\", protein, \"-M\", ligand, \"-s\", settings_path]\n\n    runner = CliRunner()\n\n    with runner.isolated_filesystem():\n        result = runner.invoke(plan_rbfe_network, args)\n\n        assert result.exit_code == 0\n\n\n@pytest.fixture\ndef custom_yaml_radial():\n    return \"\"\"\\\nnetwork:\n  method: generate_radial_network\n  settings:\n    central_ligand: lig_CHEMBL1078774\n\nmapper:\n  method: LomapAtomMapper\n  settings:\n    time: 45\n    element_change: True\n\npartial_charge:\n  method: nagl\n  settings:\n    nagl_model: openff-gnn-am1bcc-0.1.0-rc.3.pt\n\"\"\"\n\n\n@pytest.mark.skipif(not HAS_NAGL, reason=\"needs NAGL\")\n@pytest.mark.skipif(\n    HAS_OPENEYE, reason=\"cannot use NAGL with rdkit backend when OpenEye is installed\"\n)\ndef test_custom_yaml_plan_radial_smoke_test(custom_yaml_radial, eg5_files, tmp_path):\n    protein, ligand, cofactor = eg5_files\n    settings_path = tmp_path / \"settings.yaml\"\n    with open(settings_path, \"w\") as f:\n        f.write(custom_yaml_radial)\n\n    assert settings_path.exists()\n\n    args = [\"-p\", protein, \"-M\", ligand, \"-C\", cofactor, \"-s\", settings_path]\n\n    runner = CliRunner()\n\n    with runner.isolated_filesystem():\n        result = runner.invoke(plan_rbfe_network, args)\n\n        assert result.exit_code == 0\n\n\ndef test_plan_rbfe_invalid_membrane(eg5_files):\n    \"\"\"eg5_protein has box vectors but no membrane. ProteinMembraneComponent validation should catch this.\"\"\"\n\n    args = [\"--protein-membrane\", eg5_files[0], \"-M\", eg5_files[1]]\n    runner = CliRunner()\n    with pytest.raises(\n        gufe.components.errors.ComponentValidationError,\n        match=\"This usually indicates missing solvent or incorrect box vectors\",\n    ):\n        _ = runner.invoke(plan_rbfe_network, args, catch_exceptions=False)\n\n\ndef test_plan_rbfe_missing_protein_args(eg5_files):\n    args = [\"-M\", eg5_files[1]]\n\n    runner = CliRunner(catch_exceptions=False)\n    result = runner.invoke(plan_rbfe_network, args)\n    assert result.exit_code == 2\n    assert \"Either --protein or --protein-membrane must be provided.\" in result.stderr\n\n\ndef test_plan_rbfe_too_many_protein_error(eg5_files):\n    args = [\"-M\", eg5_files[1], \"--protein-membrane\", eg5_files[0], \"-p\", eg5_files[0]]\n\n    runner = CliRunner(catch_exceptions=False)\n    result = runner.invoke(plan_rbfe_network, args)\n    assert \"Only --protein (-p) or --protein-membrane may be provided, not both.\" in result.stderr\n"
  },
  {
    "path": "src/openfecli/tests/commands/test_plan_rhfe_network.py",
    "content": "import json\nimport shutil\nfrom importlib import resources\nfrom unittest import mock\n\nimport numpy as np\nimport pytest\nfrom click.testing import CliRunner\nfrom gufe import AlchemicalNetwork, SmallMoleculeComponent, SolventComponent\nfrom gufe.tokenization import JSON_HANDLER\nfrom openff.utilities.testing import skip_if_missing\n\nfrom openfe.protocols.openmm_utils.charge_generation import (\n    HAS_NAGL,\n    HAS_OPENEYE,\n)\nfrom openfecli.commands.plan_rhfe_network import (\n    plan_rhfe_network,\n    plan_rhfe_network_main,\n)\n\n\n@pytest.fixture(scope=\"session\")\ndef mol_dir_args(tmp_path_factory):\n    ofe_dir_path = tmp_path_factory.mktemp(\"moldir\")\n\n    with resources.as_file(resources.files(\"openfe.tests.data.openmm_rfe\")) as d:\n        for f in [\"ligand_23.sdf\", \"ligand_55.sdf\"]:\n            shutil.copyfile(d / f, ofe_dir_path / f)\n\n    return [\"--molecules\", ofe_dir_path]\n\n\n@pytest.fixture(scope=\"session\")\ndef dummy_charge_dir_args(tmp_path_factory):\n    ofe_dir_path = tmp_path_factory.mktemp(\"charge_moldir\")\n\n    with resources.as_file(resources.files(\"openfe.tests.data.openmm_rfe\")) as d:\n        for f in [\"dummy_charge_ligand_23.sdf\", \"dummy_charge_ligand_55.sdf\"]:\n            shutil.copyfile(d / f, ofe_dir_path / f)\n\n    return [\"--molecules\", ofe_dir_path]\n\n\ndef print_test_with_file(mapping_scorer, ligand_network_planner, small_molecules, solvent):\n    print(mapping_scorer)\n    print(ligand_network_planner)\n    print(small_molecules)\n    print(solvent)\n\n\ndef validate_charges(smc):\n    \"\"\"\n    Validate that the SmallMoleculeComponent has partial charges assigned.\n    \"\"\"\n    off_mol = smc.to_openff()\n    assert off_mol.partial_charges is not None\n    assert len(off_mol.partial_charges) == off_mol.n_atoms\n\n\n@pytest.mark.skipif(\n    not HAS_NAGL,\n    reason=\"needs NAGL\",\n)\n@pytest.mark.skipif(\n    HAS_OPENEYE, reason=\"cannot use NAGL with rdkit backend when OpenEye is installed\"\n)\ndef test_plan_rhfe_network_main():\n    from openfe.protocols.openmm_utils.omm_settings import OpenFFPartialChargeSettings\n    from openfe.setup import (\n        LomapAtomMapper,\n        ligand_network_planning,\n        lomap_scorers,\n    )\n\n    with resources.as_file(resources.files(\"openfe.tests.data.openmm_rfe\")) as d:\n        smallM_components = [\n            SmallMoleculeComponent.from_sdf_file(d / f) for f in [\"ligand_23.sdf\", \"ligand_55.sdf\"]\n        ]\n\n    solvent_component = SolventComponent()\n    alchemical_network, ligand_network = plan_rhfe_network_main(\n        mapper=[LomapAtomMapper()],\n        mapping_scorer=lomap_scorers.default_lomap_score,\n        ligand_network_planner=ligand_network_planning.generate_minimal_spanning_network,\n        small_molecules=smallM_components,\n        solvent=solvent_component,\n        n_protocol_repeats=3,\n        partial_charge_settings=OpenFFPartialChargeSettings(\n            partial_charge_method=\"nagl\", nagl_model=\"openff-gnn-am1bcc-0.1.0-rc.3.pt\"\n        ),\n        processors=1,\n        overwrite_charges=False,\n    )\n\n    assert alchemical_network\n    assert ligand_network\n\n    # check the ligands have charges\n    for node in alchemical_network.nodes:\n        validate_charges(node.components[\"ligand\"])\n\n\n@pytest.fixture\ndef yaml_nagl_settings():\n    return \"\"\"\\\npartial_charge:\n  method: nagl\n  settings:\n    nagl_model: openff-gnn-am1bcc-0.1.0-rc.3.pt\n\"\"\"\n\n\n@pytest.mark.skipif(\n    not HAS_NAGL,\n    reason=\"needs NAGL\",\n)\n@pytest.mark.skipif(\n    HAS_OPENEYE, reason=\"cannot use NAGL with rdkit backend when OpenEye is installed\"\n)\ndef test_plan_rhfe_network(mol_dir_args, tmp_path, yaml_nagl_settings):\n    \"\"\"\n    smoke test\n    \"\"\"\n    # use nagl charges for CI speed!\n    settings_path = tmp_path / \"settings.yaml\"\n    with open(settings_path, \"w\") as f:\n        f.write(yaml_nagl_settings)\n\n    args = mol_dir_args\n    expected_output_always = [\n        \"RHFE-NETWORK PLANNER\",\n        \"Solvent: SolventComponent(name=O, Na+, Cl-)\",\n        \"- tmp_network.json\",\n        # make sure the partial charge settings are picked up\n        \"Partial Charge Generation: nagl\",\n        \"assigning ligand partial charges -- this may be slow\",\n    ]\n    # we can get these in either order: 22 then 55 or 55 then 22\n    expected_output_1 = [\n        \"Small Molecules: SmallMoleculeComponent(name=ligand_23) SmallMoleculeComponent(name=ligand_55)\",\n        \"- rhfe_ligand_23_vacuum_ligand_55_vacuum.json\",\n        \"- rhfe_ligand_23_solvent_ligand_55_solvent.json\",\n    ]\n    expected_output_2 = [\n        \"Small Molecules: SmallMoleculeComponent(name=ligand_55) SmallMoleculeComponent(name=ligand_23)\",\n        \"- rhfe_ligand_55_vacuum_ligand_23_vacuum.json\",\n        \"- rhfe_ligand_55_solvent_ligand_23_solvent.json\",\n    ]\n\n    patch_base = \"openfecli.commands.plan_rhfe_network.\"\n    args += [\"-o\", \"tmp_network\"]\n    args += [\"-s\", settings_path]\n\n    patch_loc = patch_base + \"plan_rhfe_network\"\n    patch_func = print_test_with_file\n\n    runner = CliRunner()\n    with mock.patch(patch_loc, patch_func):\n        with runner.isolated_filesystem():\n            result = runner.invoke(plan_rhfe_network, args)\n            print(result.output)\n            assert result.exit_code == 0\n            for line in expected_output_always:\n                assert line in result.output\n\n            for l1, l2 in zip(expected_output_1, expected_output_2):\n                assert l1 in result.output or l2 in result.output\n\n\n@pytest.fixture\ndef custom_yaml_settings():\n    return \"\"\"\\\nnetwork:\n  method: generate_minimal_redundant_network\n  settings:\n    mst_num: 2\n\nmapper:\n  method: LomapAtomMapper\n  settings:\n    time: 45\n    element_change: True\n\npartial_charge:\n  method: nagl\n  settings:\n    nagl_model: openff-gnn-am1bcc-0.1.0-rc.3.pt\n\"\"\"\n\n\n@pytest.mark.skipif(\n    not HAS_NAGL,\n    reason=\"needs NAGL\",\n)\n@pytest.mark.skipif(\n    HAS_OPENEYE, reason=\"cannot use NAGL with rdkit backend when OpenEye is installed\"\n)\ndef test_custom_yaml_plan_rhfe_smoke_test(custom_yaml_settings, mol_dir_args, tmp_path):\n    settings_path = tmp_path / \"settings.yaml\"\n    with open(settings_path, \"w\") as f:\n        f.write(custom_yaml_settings)\n\n    assert settings_path.exists()\n\n    args = mol_dir_args + [\"-s\", settings_path]\n\n    runner = CliRunner()\n\n    with runner.isolated_filesystem():\n        result = runner.invoke(plan_rhfe_network, args)\n\n        assert result.exit_code == 0\n\n\n@pytest.mark.parametrize(\n    \"overwrite\",\n    [\n        pytest.param(True, id=\"Overwrite\"),\n        pytest.param(False, id=\"No overwrite\"),\n    ],\n)\n@pytest.mark.skipif(\n    not HAS_NAGL,\n    reason=\"needs NAGL\",\n)\n@pytest.mark.skipif(\n    HAS_OPENEYE, reason=\"cannot use NAGL with rdkit backend when OpenEye is installed\"\n)\ndef test_plan_rhfe_network_charge_overwrite(dummy_charge_dir_args, tmp_path, yaml_nagl_settings, overwrite):  # fmt: skip\n    # make sure the dummy charges are overwritten when requested\n\n    # use nagl charges for CI speed!\n    settings_path = tmp_path / \"settings.yaml\"\n    with open(settings_path, \"w\") as f:\n        f.write(yaml_nagl_settings)\n\n    args = dummy_charge_dir_args + [\"-s\", settings_path]\n\n    # get the input charges for the molecules to check they have been overwritten\n    charges_by_name = {}\n    for f in [\"dummy_charge_ligand_23.sdf\", \"dummy_charge_ligand_55.sdf\"]:\n        smc = SmallMoleculeComponent.from_sdf_file(dummy_charge_dir_args[1] / f)\n        charges_by_name[smc.name] = smc.to_openff().partial_charges.m\n\n    if overwrite:\n        args.append(\"--overwrite-charges\")\n\n    runner = CliRunner()\n    with runner.isolated_filesystem():\n        result = runner.invoke(plan_rhfe_network, args)\n\n        assert result.exit_code == 0\n        if overwrite:\n            assert \"Overwriting partial charges\" in result.output\n\n        network = AlchemicalNetwork.from_json(\"alchemicalNetwork/alchemicalNetwork.json\")\n        # make sure the ligands don't have dummy charges\n        for node in network.nodes:\n            off_mol = node.components[\"ligand\"].to_openff()\n\n            if overwrite:\n                assert not np.allclose(off_mol.partial_charges.m, charges_by_name[off_mol.name])\n            else:\n                assert np.allclose(off_mol.partial_charges.m, charges_by_name[off_mol.name])\n"
  },
  {
    "path": "src/openfecli/tests/commands/test_quickrun.py",
    "content": "import json\nimport os\nimport pathlib\nfrom importlib import resources\nfrom unittest import mock\n\nimport pytest\nfrom click.testing import CliRunner\nfrom gufe import Transformation\nfrom gufe.tokenization import JSON_HANDLER\n\nfrom openfecli.commands.quickrun import _hash_quickrun_inputs, quickrun\n\nfrom ..utils import assert_click_success\n\n\n@pytest.fixture\ndef json_file():\n    with resources.as_file(resources.files(\"openfecli.tests.data\")) as d:\n        json_file = str(d / \"transformation.json\")\n\n    return json_file\n\n\n@pytest.mark.parametrize(\"extra_args\", [{}, {\"-d\": \"foo_dir\", \"-o\": \"foo.json\"}])\ndef test_quickrun(extra_args, json_file):\n    extras = sum([list(kv) for kv in extra_args.items()], [])\n\n    runner = CliRunner()\n    with runner.isolated_filesystem():\n        # figure out what cached json should be\n        trans = Transformation.from_json(json_file)\n        work_dir = extra_args.get(\"-d\", \".\")\n        outfile = pathlib.Path(extra_args.get(\"-o\", f\"{trans.key}_results.json\"))\n        hashed_key = _hash_quickrun_inputs(outfile, trans)\n\n        # output json shouldn't be created before quickrun is executed\n        assert not pathlib.Path(outfile).exists()\n        result = runner.invoke(quickrun, [json_file] + extras)\n\n        assert_click_success(result)\n        assert \"Here is the result\" in result.output\n\n        # cache should be deleted when job is complete\n        assert not pathlib.Path(work_dir, \"quickrun_cache\", f\"dag-cache-{hashed_key}.json\").exists()\n\n        # output json should exist with data when job is complete\n        assert pathlib.Path(outfile).exists()\n        with open(outfile, mode=\"r\") as outf:\n            dct = json.load(outf, cls=JSON_HANDLER.decoder)\n\n        assert set(dct) == {\"estimate\", \"uncertainty\", \"protocol_result\", \"unit_results\"}\n        # TODO: need a protocol that drops files to actually do this!\n        # if directory := extra_args.get('-d'):\n        #     dirpath = pathlib.Path(directory)\n        #     assert dirpath.exists()\n        #     assert dirpath.is_dir()\n        #     assert len(list(dirpath.iterdir())) > 0\n\n\n@pytest.mark.parametrize(\"extra_args\", [{}, {\"-d\": \"foo_dir\", \"-o\": \"foo.json\"}])\ndef test_quickrun_interrupted(extra_args, json_file):\n    \"\"\"If quickrun starts but is unable to complete, the cached DAG should exist.\"\"\"\n    extras = sum([list(kv) for kv in extra_args.items()], [])\n\n    runner = CliRunner()\n    with runner.isolated_filesystem():\n        # figure out what cached json should be\n        trans = Transformation.from_json(json_file)\n        work_dir = pathlib.Path(extra_args.get(\"-d\", \".\")).absolute()\n        outfile = pathlib.Path(extra_args.get(\"-o\", f\"{trans.key}_results.json\"))\n        hashed_key = _hash_quickrun_inputs(outfile, trans)\n\n        with mock.patch(\"gufe.protocols.protocoldag.execute_DAG\", side_effect=RuntimeError):\n            result = runner.invoke(quickrun, [json_file] + extras)\n\n        assert \"Here is the result\" not in result.output\n        assert pathlib.Path(work_dir, \"quickrun_cache\", f\"dag-cache-{hashed_key}.json\").exists()\n\n\ndef test_quickrun_output_file_exists(json_file):\n    \"\"\"Fail if the output file already exists.\"\"\"\n    runner = CliRunner()\n    with runner.isolated_filesystem():\n        pathlib.Path(\"foo.json\").touch()\n        result = runner.invoke(quickrun, [json_file, \"-o\", \"foo.json\"])\n        assert result.exit_code == 2  # usage error\n        assert \"is a file.\" in result.output\n\n\ndef test_quickrun_output_file_in_nonexistent_directory(json_file):\n    \"\"\"Should create the parent directory for output file if it doesn't exist.\"\"\"\n    runner = CliRunner()\n    with runner.isolated_filesystem():\n        outfile = pathlib.Path(\"not_dir/foo.json\")\n        result = runner.invoke(quickrun, [json_file, \"-o\", outfile])\n        assert_click_success(result)\n        assert outfile.parent.is_dir()\n\n\ndef test_quickrun_dir_created_at_runtime(json_file):\n    \"\"\"It should be valid to have a new directory created by the -d flag.\"\"\"\n    runner = CliRunner()\n    with runner.isolated_filesystem():\n        outdir = \"not_dir\"\n        outfile = outdir + \"foo.json\"\n        result = runner.invoke(quickrun, [json_file, \"-d\", outdir, \"-o\", outfile])\n        assert_click_success(result)\n\n\ndef test_quickrun_unit_error():\n    with resources.as_file(resources.files(\"openfecli.tests.data\")) as d:\n        json_file = str(d / \"bad_transformation.json\")\n\n    runner = CliRunner()\n    with runner.isolated_filesystem():\n        result = runner.invoke(quickrun, [json_file, \"-o\", \"foo.json\"])\n        assert result.exit_code == 1\n        assert pathlib.Path(\"foo.json\").exists()\n        # TODO: I'm still not happy with this... failure result does not see\n        # to be stored in JSON\n        # not sure whether that means we should always be storing all\n        # protocol dag results maybe?\n\n\ndef test_quickrun_existing_cache_error(json_file):\n    \"\"\"In the default case where resume=False, if the cache exists, quickrun should error out and not attempt to execute.\"\"\"\n    trans = Transformation.from_json(json_file)\n    dag = trans.create()\n\n    runner = CliRunner()\n    with runner.isolated_filesystem():\n        outfile = pathlib.Path(f\"{trans.key}_results.json\")\n        hashed_key = _hash_quickrun_inputs(outfile, trans)\n        pathlib.Path(\"quickrun_cache\").mkdir()\n        dag.to_json(pathlib.Path(\"quickrun_cache\", f\"dag-cache-{hashed_key}.json\"))\n        result = runner.invoke(quickrun, [json_file])\n        assert result.exit_code == 1\n        assert \"Attempting to resume\" not in result.output\n        assert \"Transformation has been started but is incomplete.\" in result.stderr\n\n\ndef test_quickrun_resume_from_cache(json_file):\n    trans = Transformation.from_json(json_file)\n    dag = trans.create()\n\n    runner = CliRunner()\n    with runner.isolated_filesystem():\n        outfile = pathlib.Path(f\"{trans.key}_results.json\")\n        hashed_key = _hash_quickrun_inputs(outfile, trans)\n        pathlib.Path(\"quickrun_cache\").mkdir()\n        dag_cache = pathlib.Path(\"quickrun_cache\", f\"dag-cache-{hashed_key}.json\")\n        dag.to_json(dag_cache)\n        result = runner.invoke(quickrun, [json_file, \"--resume\"])\n\n        assert_click_success(result)\n        assert f\"resume execution using '{dag_cache.absolute()}\" in result.output\n        assert \"Success\" in result.output\n\n\ndef test_quickrun_resume_invalid_cache(json_file):\n    \"\"\"Fail if the output file doesn't load properly.\"\"\"\n    trans = Transformation.from_json(json_file)\n\n    runner = CliRunner()\n    with runner.isolated_filesystem():\n        outfile = pathlib.Path(f\"{trans.key}_results.json\")\n        hashed_key = _hash_quickrun_inputs(outfile, trans)\n        pathlib.Path(\"quickrun_cache\").mkdir()\n        dag_cache = pathlib.Path(\"quickrun_cache\", f\"dag-cache-{hashed_key}.json\")\n        dag_cache.touch()\n        result = runner.invoke(quickrun, [json_file, \"--resume\"])\n\n        assert result.exit_code == 1\n        assert f\"resume execution using '{dag_cache.absolute()}\" in result.output\n        assert \"Recovery failed\" in result.stderr\n\n\ndef test_quickrun_resume_missing_cache(json_file):\n    \"\"\"If --resume is passed but there's no cache, just echo a message and start from scratch.\"\"\"\n    runner = CliRunner()\n    with runner.isolated_filesystem():\n        # determine what the cache to be looked for should be named\n        trans = Transformation.from_json(json_file)\n        outfile = pathlib.Path(f\"{trans.key}_results.json\")\n        hashed_key = _hash_quickrun_inputs(outfile, trans)\n        dag_cache = pathlib.Path(\"quickrun_cache\", f\"dag-cache-{hashed_key}.json\")\n\n        result = runner.invoke(quickrun, [json_file, \"--resume\"])\n        assert_click_success(result)\n        assert (\n            f\"openfe quickrun was run with --resume, but no cached results found at {dag_cache.absolute()}\"\n            in result.output\n        )\n"
  },
  {
    "path": "src/openfecli/tests/commands/test_test.py",
    "content": "import os\nfrom unittest import mock\n\nimport pytest\nfrom click.testing import CliRunner\n\nfrom openfecli.commands.test import test\n\n\ndef mock_func(args):\n    print(os.environ.get(\"OFE_SLOW_TESTS\"))\n\n\n@pytest.mark.parametrize(\"slow\", [True, False])\ndef test_test(slow):\n    runner = CliRunner()\n    args = [\"--long\"] if slow else []\n    patchloc = \"openfecli.commands.test.pytest.main\"\n    ofe_slow_tests = os.environ.get(\"OFE_SLOW_TESTS\")\n    with mock.patch(patchloc, mock_func):\n        with runner.isolated_filesystem():\n            result = runner.invoke(test, args)\n            assert result.exit_code == 0\n            l1, l2, l3, _ = result.output.split(\"\\n\")\n            assert l1 == \"Testing can import....\"\n            assert l2 == \"Running the main package tests\"\n            assert l3 == str(slow)\n\n    assert ofe_slow_tests == os.environ.get(\"OFE_SLOW_TESTS\")\n"
  },
  {
    "path": "src/openfecli/tests/conftest.py",
    "content": "import urllib.error\nimport urllib.request\n\ntry:\n    urllib.request.urlopen(\"https://www.google.com\")\nexcept urllib.error.URLError:  # -no-cov-\n    HAS_INTERNET = False\nelse:\n    HAS_INTERNET = True\n"
  },
  {
    "path": "src/openfecli/tests/data/__init__.py",
    "content": ""
  },
  {
    "path": "src/openfecli/tests/data/bad_transformation.json",
    "content": "{\":version:\": 1, \"__module__\": \"gufe.transformations.transformation\", \"__qualname__\": \"Transformation\", \"mapping\": {\":version:\": 1, \"__module__\": \"gufe.mapping.ligandatommapping\", \"__qualname__\": \"LigandAtomMapping\", \"annotations\": \"{}\", \"componentA\": {\":version:\": 1, \"__module__\": \"gufe.components.smallmoleculecomponent\", \"__qualname__\": \"SmallMoleculeComponent\", \"atoms\": [[6, 0, 0, true, 0, 0, {}], [6, 0, 0, true, 0, 0, {}], [6, 0, 0, true, 0, 0, {}], [6, 0, 0, true, 0, 0, {}], [6, 0, 0, true, 0, 0, {}], [6, 0, 0, true, 0, 0, {}], [1, 0, 0, false, 0, 0, {}], [1, 0, 0, false, 0, 0, {}], [1, 0, 0, false, 0, 0, {}], [1, 0, 0, false, 0, 0, {}], [1, 0, 0, false, 0, 0, {}], [1, 0, 0, false, 0, 0, {}]], \"bonds\": [[0, 1, 12, 0, {}], [0, 5, 12, 0, {}], [0, 6, 1, 0, {}], [1, 2, 12, 0, {}], [1, 7, 1, 0, {}], [2, 3, 12, 0, {}], [2, 8, 1, 0, {}], [3, 4, 12, 0, {}], [3, 9, 1, 0, {}], [4, 5, 12, 0, {}], [4, 10, 1, 0, {}], [5, 11, 1, 0, {}]], \"conformer\": [\"\\u0093NUMPY\\u0001\\u0000v\\u0000{'descr': '<f8', 'fortran_order': False, 'shape': (12, 3), }                                                         \\n\\u00ee|?5^\\u00fa9@\\u0002+\\u0087\\u0016\\u00d9N\\u0015@\\u0004V\\u000e-\\u00b2\\u001d\\u0013@\\u0085\\u00ebQ\\u00b8\\u001ee:@\\u00b2\\u009d\\u00ef\\u00a7\\u00c6K\\u0014@\\u00cb\\u00a1E\\u00b6\\u00f3\\u00fd\\u000b@\\u00d7\\u00a3p=\\nW;@q=\\n\\u00d7\\u00a3p\\u0017@\\u009e\\u00ef\\u00a7\\u00c6K7\\u0007@\\u0083\\u00c0\\u00ca\\u00a1E\\u00d6;@\\u00c9v\\u00be\\u009f\\u001a\\u00af\\u001b@Zd;\\u00dfO\\u008d\\f@\\u00ecQ\\u00b8\\u001e\\u0085k;@b\\u0010X9\\u00b4\\u00c8\\u001c@\\u0006\\u0081\\u0095C\\u008bl\\u0013@sh\\u0091\\u00ed|\\u007f:@j\\u00bct\\u0093\\u0018\\u0084\\u0019@\\u00c7K7\\u0089A\\u00e0\\u0015@\\u00ed\\u009e<,\\u00d4:9@<N\\u00d1\\u0091\\\\\\u00be\\u0012@\\u0097\\u00ff\\u0090~\\u00fb\\u00fa\\u0014@\\u000f\\u009c3\\u00a2\\u00b4\\u00f79@\\u008d(\\u00ed\\r\\u00be\\u00f0\\u0010@\\u00f0\\u0016HP\\u00fc\\u0098\\u0007@\\u00aa\\u00f1\\u00d2Mb\\u00b0;@\\u00bc\\u0005\\u0012\\u0014?\\u0086\\u0016@\\u00c3d\\u00aa`TR\\u00fe?\\u00a6\\u009b\\u00c4 \\u00b0\\u0092<@\\u00dd$\\u0006\\u0081\\u0095C\\u001e@K\\u00ea\\u00044\\u0011\\u00b6\\b@RI\\u009d\\u0080&\\u00d2;@\\u0002\\u009a\\b\\u001b\\u009e\\u001e @z\\u00c7):\\u0092\\u008b\\u0015@9EGr\\u00f9/:@}?5^\\u00baI\\u001a@]m\\u00c5\\u00fe\\u00b2\\u00fb\\u0019@\", {}], \"molprops\": {\"ofe-name\": \"benzene\"}}, \"componentA_to_componentB\": {\"0\": 4, \"1\": 5, \"2\": 6, \"3\": 7, \"4\": 8, \"5\": 9, \"6\": 10, \"7\": 11, \"8\": 12, \"9\": 13, \"10\": 2, \"11\": 14}, \"componentB\": {\":version:\": 1, \"__module__\": \"gufe.components.smallmoleculecomponent\", \"__qualname__\": \"SmallMoleculeComponent\", \"atoms\": [[1, 0, 0, false, 0, 0, {}], [1, 0, 0, false, 0, 0, {}], [6, 0, 0, false, 0, 0, {}], [1, 0, 0, false, 0, 0, {}], [6, 0, 0, true, 0, 0, {}], [6, 0, 0, true, 0, 0, {}], [6, 0, 0, true, 0, 0, {}], [6, 0, 0, true, 0, 0, {}], [6, 0, 0, true, 0, 0, {}], [6, 0, 0, true, 0, 0, {}], [1, 0, 0, false, 0, 0, {}], [1, 0, 0, false, 0, 0, {}], [1, 0, 0, false, 0, 0, {}], [1, 0, 0, false, 0, 0, {}], [1, 0, 0, false, 0, 0, {}]], \"bonds\": [[0, 2, 1, 0, {}], [1, 2, 1, 0, {}], [2, 3, 1, 0, {}], [4, 5, 12, 0, {}], [4, 9, 12, 0, {}], [4, 10, 1, 0, {}], [5, 6, 12, 0, {}], [5, 11, 1, 0, {}], [6, 7, 12, 0, {}], [6, 12, 1, 0, {}], [7, 8, 12, 0, {}], [7, 13, 1, 0, {}], [2, 8, 1, 0, {}], [8, 9, 12, 0, {}], [9, 14, 1, 0, {}]], \"conformer\": [\"\\u0093NUMPY\\u0001\\u0000v\\u0000{'descr': '<f8', 'fortran_order': False, 'shape': (15, 3), }                                                         \\nc\\u00eeZB>\\u00e8<@[\\u00b1\\u00bf\\u00ec\\u009e|!@\\u00b0rh\\u0091\\u00ed|\\u0014@\\u00c3d\\u00aa`T2<@\\u009a\\b\\u001b\\u009e^I @\\u00caT\\u00c1\\u00a8\\u00a4\\u008e\\u001a@?\\u00c6\\u00dc\\u00b5\\u0084\\u00fc;@\\u00da\\u001b|a2\\u00d5 @$(~\\u008c\\u00b9k\\u0016@n\\u00a3\\u0001\\u00bc\\u0005B;@\\u00c0\\u00ec\\u009e<,t\\\"@\\u0084\\u009e\\u00cd\\u00aa\\u00cfU\\u0016@\\u00ee|?5^\\u00fa9@\\u0002+\\u0087\\u0016\\u00d9N\\u0015@\\u0004V\\u000e-\\u00b2\\u001d\\u0013@\\u0085\\u00ebQ\\u00b8\\u001ee:@\\u00b2\\u009d\\u00ef\\u00a7\\u00c6K\\u0014@\\u00cb\\u00a1E\\u00b6\\u00f3\\u00fd\\u000b@\\u00d7\\u00a3p=\\nW;@q=\\n\\u00d7\\u00a3p\\u0017@\\u009e\\u00ef\\u00a7\\u00c6K7\\u0007@\\u0083\\u00c0\\u00ca\\u00a1E\\u00d6;@\\u00c9v\\u00be\\u009f\\u001a\\u00af\\u001b@Zd;\\u00dfO\\u008d\\f@\\u00ecQ\\u00b8\\u001e\\u0085k;@b\\u0010X9\\u00b4\\u00c8\\u001c@\\u0006\\u0081\\u0095C\\u008bl\\u0013@sh\\u0091\\u00ed|\\u007f:@j\\u00bct\\u0093\\u0018\\u0084\\u0019@\\u00c7K7\\u0089A\\u00e0\\u0015@\\u00ed\\u009e<,\\u00d4:9@<N\\u00d1\\u0091\\\\\\u00be\\u0012@\\u0097\\u00ff\\u0090~\\u00fb\\u00fa\\u0014@\\u000f\\u009c3\\u00a2\\u00b4\\u00f79@\\u008d(\\u00ed\\r\\u00be\\u00f0\\u0010@\\u00f0\\u0016HP\\u00fc\\u0098\\u0007@\\u00aa\\u00f1\\u00d2Mb\\u00b0;@\\u00bc\\u0005\\u0012\\u0014?\\u0086\\u0016@\\u00c3d\\u00aa`TR\\u00fe?\\u00a6\\u009b\\u00c4 \\u00b0\\u0092<@\\u00dd$\\u0006\\u0081\\u0095C\\u001e@K\\u00ea\\u00044\\u0011\\u00b6\\b@9EGr\\u00f9/:@}?5^\\u00baI\\u001a@]m\\u00c5\\u00fe\\u00b2\\u00fb\\u0019@\", {}], \"molprops\": {\"ofe-name\": \"toluene\"}}}, \"name\": null, \"protocol\": {\":version:\": 1, \"__module__\": \"gufe.tests.test_protocol\", \"__qualname__\": \"BrokenProtocol\", \"settings\": {\":is_custom:\": true, \"__class__\": \"DummySpecificSettings\", \"__module__\": \"gufe.tests.test_protocol\", \"forcefield_settings\": {\":is_custom:\": true, \"__class__\": \"OpenMMSystemGeneratorFFSettings\", \"__module__\": \"gufe.settings.models\", \"constraints\": \"hbonds\", \"forcefields\": [\"amber/ff14SB.xml\", \"amber/tip3p_standard.xml\", \"amber/tip3p_HFE_multivalent.xml\", \"amber/phosaa10.xml\"], \"hydrogen_mass\": 3.0, \"nonbonded_cutoff\": {\":is_custom:\": true, \"magnitude\": 1.0, \"pint_unit_registry\": \"openff_units\", \"unit\": \"nanometer\"}, \"nonbonded_method\": \"PME\", \"rigid_water\": true, \"small_molecule_forcefield\": \"openff-2.0.0\"}, \"n_repeats\": 21, \"thermo_settings\": {\":is_custom:\": true, \"__class__\": \"ThermoSettings\", \"__module__\": \"gufe.settings.models\", \"ph\": null, \"pressure\": null, \"redox_potential\": null, \"temperature\": {\":is_custom:\": true, \"magnitude\": 298.0, \"pint_unit_registry\": \"openff_units\", \"unit\": \"kelvin\"}}}}, \"stateA\": {\":version:\": 1, \"__module__\": \"gufe.chemicalsystem\", \"__qualname__\": \"ChemicalSystem\", \"components\": {\"ligand\": {\":version:\": 1, \"__module__\": \"gufe.components.smallmoleculecomponent\", \"__qualname__\": \"SmallMoleculeComponent\", \"atoms\": [[6, 0, 0, true, 0, 0, {}], [6, 0, 0, true, 0, 0, {}], [6, 0, 0, true, 0, 0, {}], [6, 0, 0, true, 0, 0, {}], [6, 0, 0, true, 0, 0, {}], [6, 0, 0, true, 0, 0, {}], [1, 0, 0, false, 0, 0, {}], [1, 0, 0, false, 0, 0, {}], [1, 0, 0, false, 0, 0, {}], [1, 0, 0, false, 0, 0, {}], [1, 0, 0, false, 0, 0, {}], [1, 0, 0, false, 0, 0, {}]], \"bonds\": [[0, 1, 12, 0, {}], [0, 5, 12, 0, {}], [0, 6, 1, 0, {}], [1, 2, 12, 0, {}], [1, 7, 1, 0, {}], [2, 3, 12, 0, {}], [2, 8, 1, 0, {}], [3, 4, 12, 0, {}], [3, 9, 1, 0, {}], [4, 5, 12, 0, {}], [4, 10, 1, 0, {}], [5, 11, 1, 0, {}]], \"conformer\": [\"\\u0093NUMPY\\u0001\\u0000v\\u0000{'descr': '<f8', 'fortran_order': False, 'shape': (12, 3), }                                                         \\n\\u00ee|?5^\\u00fa9@\\u0002+\\u0087\\u0016\\u00d9N\\u0015@\\u0004V\\u000e-\\u00b2\\u001d\\u0013@\\u0085\\u00ebQ\\u00b8\\u001ee:@\\u00b2\\u009d\\u00ef\\u00a7\\u00c6K\\u0014@\\u00cb\\u00a1E\\u00b6\\u00f3\\u00fd\\u000b@\\u00d7\\u00a3p=\\nW;@q=\\n\\u00d7\\u00a3p\\u0017@\\u009e\\u00ef\\u00a7\\u00c6K7\\u0007@\\u0083\\u00c0\\u00ca\\u00a1E\\u00d6;@\\u00c9v\\u00be\\u009f\\u001a\\u00af\\u001b@Zd;\\u00dfO\\u008d\\f@\\u00ecQ\\u00b8\\u001e\\u0085k;@b\\u0010X9\\u00b4\\u00c8\\u001c@\\u0006\\u0081\\u0095C\\u008bl\\u0013@sh\\u0091\\u00ed|\\u007f:@j\\u00bct\\u0093\\u0018\\u0084\\u0019@\\u00c7K7\\u0089A\\u00e0\\u0015@\\u00ed\\u009e<,\\u00d4:9@<N\\u00d1\\u0091\\\\\\u00be\\u0012@\\u0097\\u00ff\\u0090~\\u00fb\\u00fa\\u0014@\\u000f\\u009c3\\u00a2\\u00b4\\u00f79@\\u008d(\\u00ed\\r\\u00be\\u00f0\\u0010@\\u00f0\\u0016HP\\u00fc\\u0098\\u0007@\\u00aa\\u00f1\\u00d2Mb\\u00b0;@\\u00bc\\u0005\\u0012\\u0014?\\u0086\\u0016@\\u00c3d\\u00aa`TR\\u00fe?\\u00a6\\u009b\\u00c4 \\u00b0\\u0092<@\\u00dd$\\u0006\\u0081\\u0095C\\u001e@K\\u00ea\\u00044\\u0011\\u00b6\\b@RI\\u009d\\u0080&\\u00d2;@\\u0002\\u009a\\b\\u001b\\u009e\\u001e @z\\u00c7):\\u0092\\u008b\\u0015@9EGr\\u00f9/:@}?5^\\u00baI\\u001a@]m\\u00c5\\u00fe\\u00b2\\u00fb\\u0019@\", {}], \"molprops\": {\"ofe-name\": \"benzene\"}}, \"solvent\": {\":version:\": 1, \"__module__\": \"gufe.components.solventcomponent\", \"__qualname__\": \"SolventComponent\", \"ion_concentration\": \"0.15 molar\", \"negative_ion\": \"Cl-\", \"neutralize\": true, \"positive_ion\": \"K+\", \"smiles\": \"O\"}}, \"name\": \"\"}, \"stateB\": {\":version:\": 1, \"__module__\": \"gufe.chemicalsystem\", \"__qualname__\": \"ChemicalSystem\", \"components\": {\"ligand\": {\":version:\": 1, \"__module__\": \"gufe.components.smallmoleculecomponent\", \"__qualname__\": \"SmallMoleculeComponent\", \"atoms\": [[1, 0, 0, false, 0, 0, {}], [1, 0, 0, false, 0, 0, {}], [6, 0, 0, false, 0, 0, {}], [1, 0, 0, false, 0, 0, {}], [6, 0, 0, true, 0, 0, {}], [6, 0, 0, true, 0, 0, {}], [6, 0, 0, true, 0, 0, {}], [6, 0, 0, true, 0, 0, {}], [6, 0, 0, true, 0, 0, {}], [6, 0, 0, true, 0, 0, {}], [1, 0, 0, false, 0, 0, {}], [1, 0, 0, false, 0, 0, {}], [1, 0, 0, false, 0, 0, {}], [1, 0, 0, false, 0, 0, {}], [1, 0, 0, false, 0, 0, {}]], \"bonds\": [[0, 2, 1, 0, {}], [1, 2, 1, 0, {}], [2, 3, 1, 0, {}], [4, 5, 12, 0, {}], [4, 9, 12, 0, {}], [4, 10, 1, 0, {}], [5, 6, 12, 0, {}], [5, 11, 1, 0, {}], [6, 7, 12, 0, {}], [6, 12, 1, 0, {}], [7, 8, 12, 0, {}], [7, 13, 1, 0, {}], [2, 8, 1, 0, {}], [8, 9, 12, 0, {}], [9, 14, 1, 0, {}]], \"conformer\": [\"\\u0093NUMPY\\u0001\\u0000v\\u0000{'descr': '<f8', 'fortran_order': False, 'shape': (15, 3), }                                                         \\nc\\u00eeZB>\\u00e8<@[\\u00b1\\u00bf\\u00ec\\u009e|!@\\u00b0rh\\u0091\\u00ed|\\u0014@\\u00c3d\\u00aa`T2<@\\u009a\\b\\u001b\\u009e^I @\\u00caT\\u00c1\\u00a8\\u00a4\\u008e\\u001a@?\\u00c6\\u00dc\\u00b5\\u0084\\u00fc;@\\u00da\\u001b|a2\\u00d5 @$(~\\u008c\\u00b9k\\u0016@n\\u00a3\\u0001\\u00bc\\u0005B;@\\u00c0\\u00ec\\u009e<,t\\\"@\\u0084\\u009e\\u00cd\\u00aa\\u00cfU\\u0016@\\u00ee|?5^\\u00fa9@\\u0002+\\u0087\\u0016\\u00d9N\\u0015@\\u0004V\\u000e-\\u00b2\\u001d\\u0013@\\u0085\\u00ebQ\\u00b8\\u001ee:@\\u00b2\\u009d\\u00ef\\u00a7\\u00c6K\\u0014@\\u00cb\\u00a1E\\u00b6\\u00f3\\u00fd\\u000b@\\u00d7\\u00a3p=\\nW;@q=\\n\\u00d7\\u00a3p\\u0017@\\u009e\\u00ef\\u00a7\\u00c6K7\\u0007@\\u0083\\u00c0\\u00ca\\u00a1E\\u00d6;@\\u00c9v\\u00be\\u009f\\u001a\\u00af\\u001b@Zd;\\u00dfO\\u008d\\f@\\u00ecQ\\u00b8\\u001e\\u0085k;@b\\u0010X9\\u00b4\\u00c8\\u001c@\\u0006\\u0081\\u0095C\\u008bl\\u0013@sh\\u0091\\u00ed|\\u007f:@j\\u00bct\\u0093\\u0018\\u0084\\u0019@\\u00c7K7\\u0089A\\u00e0\\u0015@\\u00ed\\u009e<,\\u00d4:9@<N\\u00d1\\u0091\\\\\\u00be\\u0012@\\u0097\\u00ff\\u0090~\\u00fb\\u00fa\\u0014@\\u000f\\u009c3\\u00a2\\u00b4\\u00f79@\\u008d(\\u00ed\\r\\u00be\\u00f0\\u0010@\\u00f0\\u0016HP\\u00fc\\u0098\\u0007@\\u00aa\\u00f1\\u00d2Mb\\u00b0;@\\u00bc\\u0005\\u0012\\u0014?\\u0086\\u0016@\\u00c3d\\u00aa`TR\\u00fe?\\u00a6\\u009b\\u00c4 \\u00b0\\u0092<@\\u00dd$\\u0006\\u0081\\u0095C\\u001e@K\\u00ea\\u00044\\u0011\\u00b6\\b@9EGr\\u00f9/:@}?5^\\u00baI\\u001a@]m\\u00c5\\u00fe\\u00b2\\u00fb\\u0019@\", {}], \"molprops\": {\"ofe-name\": \"toluene\"}}, \"solvent\": {\":version:\": 1, \"__module__\": \"gufe.components.solventcomponent\", \"__qualname__\": \"SolventComponent\", \"ion_concentration\": \"0.15 molar\", \"negative_ion\": \"Cl-\", \"neutralize\": true, \"positive_ion\": \"K+\", \"smiles\": \"O\"}}, \"name\": \"\"}}"
  },
  {
    "path": "src/openfecli/tests/data/rbfe_tutorial/__init__.py",
    "content": ""
  },
  {
    "path": "src/openfecli/tests/data/rbfe_tutorial/tyk2_ligands.sdf",
    "content": "lig_ejm_31\n     RDKit          3D\n\n 32 33  0  0  0  0  0  0  0  0999 V2000\n   -4.7726   -2.8276  -16.4990 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -5.3616   -3.6890  -16.2224 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -4.7777   -4.9643  -16.1989 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -5.5357   -6.0885  -15.8273 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -6.9007   -5.9451  -15.4736 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.4915   -4.6571  -15.5270 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -6.7187   -3.5398  -15.8968 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.1766   -2.5639  -15.9391 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -9.1733   -4.4152  -15.1872 Cl  0  0  0  0  0  0  0  0  0  0  0  0\n   -7.7131   -7.1309  -15.0378 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.1428   -7.1983  -13.8857 O   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.8973   -8.0563  -15.9972 N   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.4216   -7.8671  -16.8645 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.7209   -9.2140  -16.0056 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -9.5775   -9.5988  -14.9513 C   0  0  0  0  0  0  0  0  0  0  0  0\n  -10.3850  -10.7324  -15.1337 C   0  0  0  0  0  0  0  0  0  0  0  0\n  -10.3675  -11.4892  -16.2527 N   0  0  0  0  0  0  0  0  0  0  0  0\n   -9.5395  -11.1490  -17.2696 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.7142  -10.0001  -17.1743 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.0845   -9.6948  -17.9928 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -9.5744  -11.9335  -18.4562 N   0  0  0  0  0  0  0  0  0  0  0  0\n  -10.3993  -12.5047  -18.5524 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.6698  -12.0385  -19.4488 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.5795  -11.4706  -19.4776 O   0  0  0  0  0  0  0  0  0  0  0  0\n   -9.0521  -12.9529  -20.6079 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -9.1557  -13.9753  -20.2570 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.2854  -12.9378  -21.3838 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -9.9953  -12.6471  -21.0606 H   0  0  0  0  0  0  0  0  0  0  0  0\n  -11.0653  -11.0423  -14.3552 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -9.6624   -9.0406  -14.0311 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -4.7517   -7.6238  -15.8230 Cl  0  0  0  0  0  0  0  0  0  0  0  0\n   -3.7337   -5.0777  -16.4531 H   0  0  0  0  0  0  0  0  0  0  0  0\n  1  2  1  0\n  2  7  2  0\n  2  3  1  0\n  3  4  2  0\n  3 32  1  0\n  4  5  1  0\n  4 31  1  0\n  5  6  2  0\n  5 10  1  0\n  6  7  1  0\n  6  9  1  0\n  7  8  1  0\n 10 11  2  0\n 10 12  1  0\n 12 13  1  0\n 12 14  1  0\n 14 19  1  0\n 14 15  2  0\n 15 16  1  0\n 15 30  1  0\n 16 17  2  0\n 16 29  1  0\n 17 18  1  0\n 18 19  2  0\n 18 21  1  0\n 19 20  1  0\n 21 22  1  0\n 21 23  1  0\n 23 24  2  0\n 23 25  1  0\n 25 26  1  0\n 25 27  1  0\n 25 28  1  0\nM  END\n\n>  <ofe-name>\nlig_ejm_31\n\n>  <atom.dprop.PartialCharge>\n0.14809375 -0.095906249999999998 -0.12890625 0.052493750000000006 -0.14350625 0.052493750000000006 -0.12890625 0.15709375 -0.060306249999999999 0.69179374999999999 -0.55000625000000003\n-0.46000625000000001 0.33059375000000002 0.12769374999999999 -0.30420625000000001 0.44529374999999999 -0.73790624999999999 0.55129375000000003 -0.32320624999999997 0.18009375 -0.55330625\n0.33159375000000002 0.67119375000000003 -0.59300624999999996 -0.17800625 0.070793750000000003 0.070793750000000003 0.070793750000000003 0.025193750000000004 0.18309375\n-0.060306249999999999 0.15709375\n\n$$$$\nlig_ejm_42\n     RDKit          3D\n\n 35 36  0  0  0  0  0  0  0  0999 V2000\n   -4.7651   -2.8327  -16.5085 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -5.3566   -3.6931  -16.2274 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -4.7703   -4.9699  -16.2000 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -5.5308   -6.0951  -15.8304 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -6.8949   -5.9511  -15.4713 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.4890   -4.6634  -15.5282 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -6.7163   -3.5454  -15.9025 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.1712   -2.5665  -15.9462 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -9.1723   -4.4253  -15.1881 Cl  0  0  0  0  0  0  0  0  0  0  0  0\n   -7.7033   -7.1383  -15.0290 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.1063   -7.2116  -13.8677 O   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.9070   -8.0509  -15.9995 N   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.4368   -7.8589  -16.8700 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.7273   -9.2093  -16.0054 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -9.5795   -9.5870  -14.9482 C   0  0  0  0  0  0  0  0  0  0  0  0\n  -10.3824  -10.7260  -15.1183 C   0  0  0  0  0  0  0  0  0  0  0  0\n  -10.3697  -11.4927  -16.2307 N   0  0  0  0  0  0  0  0  0  0  0  0\n   -9.5502  -11.1540  -17.2556 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.7228  -10.0033  -17.1694 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.0991   -9.7012  -17.9932 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -9.5855  -11.9542  -18.4360 N   0  0  0  0  0  0  0  0  0  0  0  0\n  -10.4161  -12.5261  -18.5296 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.6860  -12.0792  -19.4324 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.6122  -11.4803  -19.4878 O   0  0  0  0  0  0  0  0  0  0  0  0\n   -9.0543  -13.0501  -20.5630 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -9.4460  -12.4644  -21.3945 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -9.8593  -13.7211  -20.2586 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.8548  -13.8881  -21.0370 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.1521  -14.5653  -21.8378 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.4478  -14.4888  -20.2242 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.0528  -13.2593  -21.4243 H   0  0  0  0  0  0  0  0  0  0  0  0\n  -11.0595  -11.0334  -14.3357 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -9.6718   -9.0215  -14.0321 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -4.7507   -7.6371  -15.8263 Cl  0  0  0  0  0  0  0  0  0  0  0  0\n   -3.7255   -5.0857  -16.4564 H   0  0  0  0  0  0  0  0  0  0  0  0\n  1  2  1  0\n  2  7  2  0\n  2  3  1  0\n  3  4  2  0\n  3 35  1  0\n  4  5  1  0\n  4 34  1  0\n  5  6  2  0\n  5 10  1  0\n  6  7  1  0\n  6  9  1  0\n  7  8  1  0\n 10 11  2  0\n 10 12  1  0\n 12 13  1  0\n 12 14  1  0\n 14 19  1  0\n 14 15  2  0\n 15 16  1  0\n 15 33  1  0\n 16 17  2  0\n 16 32  1  0\n 17 18  1  0\n 18 19  2  0\n 18 21  1  0\n 19 20  1  0\n 21 22  1  0\n 21 23  1  0\n 23 24  2  0\n 23 25  1  0\n 25 26  1  0\n 25 27  1  0\n 25 28  1  0\n 28 29  1  0\n 28 30  1  0\n 28 31  1  0\nM  END\n\n>  <ofe-name>\nlig_ejm_42\n\n>  <atom.dprop.PartialCharge>\n0.14794282857142857 -0.096057171428571425 -0.12905717142857143 0.052342828571428572 -0.14365717142857143 0.052342828571428572 -0.12905717142857143 0.15694282857142858 -0.059957171428571432\n0.69164282857142856 -0.55015717142857146 -0.46015717142857143 0.33044282857142859 0.12754282857142857 -0.30335717142857144 0.44414282857142856 -0.73705717142857141 0.5501428285714286\n-0.3203571714285714 0.17894282857142857 -0.54945717142857142 0.33144282857142859 0.6690428285714286 -0.59315717142857138 -0.15645717142857143 0.07564282857142858 0.07564282857142858\n-0.097157171428571429 0.045309828571428568 0.045309828571428568 0.045309828571428568 0.025042828571428571 0.18294282857142857 -0.059957171428571432 0.15694282857142858\n\n$$$$\nlig_ejm_43\n     RDKit          3D\n\n 38 39  0  0  0  0  0  0  0  0999 V2000\n   -4.7758   -2.7864  -16.4082 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -5.3657   -3.6568  -16.1610 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -4.7770   -4.9320  -16.1583 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -5.5388   -6.0668  -15.8207 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -6.9087   -5.9356  -15.4763 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.4997   -4.6467  -15.5030 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -6.7268   -3.5203  -15.8414 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.1830   -2.5426  -15.8586 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -9.1769   -4.4070  -15.1619 Cl  0  0  0  0  0  0  0  0  0  0  0  0\n   -7.7202   -7.1315  -15.0648 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.1427   -7.2196  -13.9119 O   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.9075   -8.0393  -16.0420 N   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.4294   -7.8412  -16.9085 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.7331   -9.1970  -16.0628 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -9.5813   -9.5943  -15.0077 C   0  0  0  0  0  0  0  0  0  0  0  0\n  -10.3875  -10.7275  -15.1925 C   0  0  0  0  0  0  0  0  0  0  0  0\n  -10.3747  -11.4776  -16.3137 N   0  0  0  0  0  0  0  0  0  0  0  0\n   -9.5525  -11.1298  -17.3300 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.7317   -9.9757  -17.2380 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.1078   -9.6660  -18.0619 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -9.5769  -11.9365  -18.5018 N   0  0  0  0  0  0  0  0  0  0  0  0\n  -10.4090  -12.5045  -18.5971 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.6442  -12.0954  -19.4628 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.5769  -11.4851  -19.5059 O   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.9538  -13.1242  -20.5645 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -9.8786  -13.6562  -20.3326 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.8024  -14.1443  -20.7182 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.5769  -14.7000  -19.8218 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -6.8777  -13.6545  -21.0281 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.0460  -14.8838  -21.4813 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -9.0660  -12.4773  -21.9486 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -9.9769  -11.9211  -22.0282 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.2320  -11.8090  -22.1675 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -9.1067  -13.2257  -22.7407 H   0  0  0  0  0  0  0  0  0  0  0  0\n  -11.0613  -11.0504  -14.4126 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -9.6587   -9.0508  -14.0795 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -4.7498   -7.6003  -15.8230 Cl  0  0  0  0  0  0  0  0  0  0  0  0\n   -3.7302   -5.0379  -16.4049 H   0  0  0  0  0  0  0  0  0  0  0  0\n  1  2  1  0\n  2  7  2  0\n  2  3  1  0\n  3  4  2  0\n  3 38  1  0\n  4  5  1  0\n  4 37  1  0\n  5  6  2  0\n  5 10  1  0\n  6  7  1  0\n  6  9  1  0\n  7  8  1  0\n 10 11  2  0\n 10 12  1  0\n 12 13  1  0\n 12 14  1  0\n 14 19  1  0\n 14 15  2  0\n 15 16  1  0\n 15 36  1  0\n 16 17  2  0\n 16 35  1  0\n 17 18  1  0\n 18 19  2  0\n 18 21  1  0\n 19 20  1  0\n 21 22  1  0\n 21 23  1  0\n 23 24  2  0\n 23 25  1  0\n 25 26  1  0\n 25 27  1  0\n 25 31  1  0\n 27 28  1  0\n 27 29  1  0\n 27 30  1  0\n 31 32  1  0\n 31 33  1  0\n 31 34  1  0\nM  END\n\n>  <ofe-name>\nlig_ejm_43\n\n>  <atom.dprop.PartialCharge>\n0.14792105263157893 -0.096078947368421055 -0.12907894736842107 0.052321052631578949 -0.14367894736842107 0.052321052631578949 -0.12907894736842107 0.15692105263157893 -0.059978947368421055\n0.69162105263157891 -0.5501789473684211 -0.46017894736842108 0.33042105263157895 0.12752105263157892 -0.30337894736842108 0.44412105263157892 -0.73707894736842106 0.55012105263157896\n-0.32037894736842104 0.17792105263157892 -0.55147894736842107 0.33042105263157895 0.66902105263157896 -0.58917894736842102 -0.13277894736842108 0.066621052631578942 -0.091178947368421054\n0.047121052631578945 0.047121052631578945 0.047121052631578945 -0.091178947368421054 0.047121052631578945 0.047121052631578945 0.047121052631578945 0.025021052631578947 0.18292105263157893\n-0.059978947368421055 0.15692105263157893\n\n$$$$\nlig_ejm_46\n     RDKit          3D\n\n 36 38  0  0  0  0  0  0  0  0999 V2000\n   -4.7642   -2.8405  -16.5095 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -5.3549   -3.7036  -16.2280 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -4.7655   -4.9789  -16.1978 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -5.5250   -6.1059  -15.8276 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -6.8908   -5.9630  -15.4706 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.4868   -4.6765  -15.5285 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -6.7155   -3.5576  -15.9050 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.1711   -2.5800  -15.9497 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -9.1671   -4.4347  -15.1879 Cl  0  0  0  0  0  0  0  0  0  0  0  0\n   -7.7019   -7.1485  -15.0306 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.1203   -7.2180  -13.8734 O   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.9020   -8.0626  -15.9990 N   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.4296   -7.8726  -16.8697 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.7245   -9.2193  -16.0067 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -9.5810   -9.6038  -14.9544 C   0  0  0  0  0  0  0  0  0  0  0  0\n  -10.3869  -10.7402  -15.1394 C   0  0  0  0  0  0  0  0  0  0  0  0\n  -10.3684  -11.4988  -16.2561 N   0  0  0  0  0  0  0  0  0  0  0  0\n   -9.5411  -11.1531  -17.2713 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.7144  -10.0045  -17.1736 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.0887   -9.6938  -17.9918 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -9.5589  -11.9408  -18.4576 N   0  0  0  0  0  0  0  0  0  0  0  0\n  -10.3650  -12.5441  -18.5562 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.6360  -12.0467  -19.4396 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.5689  -11.4309  -19.4796 O   0  0  0  0  0  0  0  0  0  0  0  0\n   -9.0181  -13.0160  -20.5102 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.6057  -12.7169  -21.9357 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.9060  -13.8101  -21.1676 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.1255  -14.8406  -21.4327 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -6.8762  -13.6193  -20.8697 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.0355  -11.8125  -22.1402 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -9.3172  -12.9932  -22.7102 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -9.9736  -13.5213  -20.3895 H   0  0  0  0  0  0  0  0  0  0  0  0\n  -11.0748  -11.0441  -14.3639 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -9.6684   -9.0431  -14.0367 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -4.7380   -7.6418  -15.8227 Cl  0  0  0  0  0  0  0  0  0  0  0  0\n   -3.7213   -5.0916  -16.4542 H   0  0  0  0  0  0  0  0  0  0  0  0\n  1  2  1  0\n  2  7  2  0\n  2  3  1  0\n  3  4  2  0\n  3 36  1  0\n  4  5  1  0\n  4 35  1  0\n  5  6  2  0\n  5 10  1  0\n  6  7  1  0\n  6  9  1  0\n  7  8  1  0\n 10 11  2  0\n 10 12  1  0\n 12 13  1  0\n 12 14  1  0\n 14 19  1  0\n 14 15  2  0\n 15 16  1  0\n 15 34  1  0\n 16 17  2  0\n 16 33  1  0\n 17 18  1  0\n 18 19  2  0\n 18 21  1  0\n 19 20  1  0\n 21 22  1  0\n 21 23  1  0\n 23 24  2  0\n 23 25  1  0\n 25 27  1  0\n 25 26  1  0\n 25 32  1  0\n 26 27  1  0\n 26 30  1  0\n 26 31  1  0\n 27 28  1  0\n 27 29  1  0\nM  END\n\n>  <ofe-name>\nlig_ejm_46\n\n>  <atom.dprop.PartialCharge>\n0.14799999999999999 -0.096000000000000002 -0.129 0.052400000000000002 -0.14360000000000001 0.052400000000000002 -0.129 0.157 -0.059900000000000002 0.69169999999999998 -0.55010000000000003\n-0.46010000000000001 0.33050000000000002 0.12659999999999999 -0.30330000000000001 0.44419999999999998 -0.73599999999999999 0.55020000000000002 -0.32029999999999997 0.17799999999999999\n-0.5474 0.33350000000000002 0.70009999999999994 -0.59309999999999996 -0.22969999999999999 -0.10390000000000001 -0.10390000000000001 0.084199999999999997 0.084199999999999997\n0.084199999999999997 0.084199999999999997 0.098699999999999996 0.025100000000000001 0.183 -0.059900000000000002 0.157\n\n$$$$\nlig_ejm_47\n     RDKit          3D\n\n 39 41  0  0  0  0  0  0  0  0999 V2000\n   -4.7710   -2.7958  -16.4978 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -5.3622   -3.6601  -16.2251 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -6.7228   -3.5154  -15.9047 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.4990   -4.6316  -15.5395 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -6.9098   -5.9210  -15.4840 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -5.5411   -6.0619  -15.8372 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -4.7773   -4.9364  -16.1997 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -3.7298   -5.0464  -16.4444 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -4.7493   -7.5935  -15.8222 Cl  0  0  0  0  0  0  0  0  0  0  0  0\n   -7.7221   -7.1086  -15.0399 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.1200   -7.1967  -13.8766 O   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.9177   -8.0239  -16.0075 N   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.4448   -7.8335  -16.8781 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.7460   -9.1777  -16.0235 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -9.5772   -9.5870  -14.9614 C   0  0  0  0  0  0  0  0  0  0  0  0\n  -10.3788  -10.7255  -15.1522 C   0  0  0  0  0  0  0  0  0  0  0  0\n  -10.3750  -11.4658  -16.2840 N   0  0  0  0  0  0  0  0  0  0  0  0\n   -9.5645  -11.1035  -17.3073 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.7559   -9.9418  -17.2069 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.1406   -9.6119  -18.0290 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -9.5782  -11.8937  -18.4963 N   0  0  0  0  0  0  0  0  0  0  0  0\n  -10.4038  -12.4664  -18.6054 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.6353  -12.0193  -19.4573 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.5764  -11.3926  -19.4774 O   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.9229  -13.0284  -20.5859 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.6756  -12.5134  -22.0198 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.0186  -13.8555  -22.3469 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.7694  -14.0202  -20.8465 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.9493  -15.0312  -20.4860 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -6.7826  -13.6664  -20.5416 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.1203  -13.7980  -22.9633 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.7315  -14.5837  -22.7394 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.9803  -11.6755  -22.0897 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -9.5770  -12.3187  -22.5983 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -9.8902  -13.5295  -20.4978 H   0  0  0  0  0  0  0  0  0  0  0  0\n  -11.0408  -11.0611  -14.3663 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -9.6397   -9.0467  -14.0281 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -9.1773   -4.3783  -15.2060 Cl  0  0  0  0  0  0  0  0  0  0  0  0\n   -7.1757   -2.5362  -15.9443 H   0  0  0  0  0  0  0  0  0  0  0  0\n  1  2  1  0\n  2  7  2  0\n  2  3  1  0\n  3  4  2  0\n  3 39  1  0\n  4  5  1  0\n  4 38  1  0\n  5  6  2  0\n  5 10  1  0\n  6  7  1  0\n  6  9  1  0\n  7  8  1  0\n 10 11  2  0\n 10 12  1  0\n 12 13  1  0\n 12 14  1  0\n 14 19  1  0\n 14 15  2  0\n 15 16  1  0\n 15 37  1  0\n 16 17  2  0\n 16 36  1  0\n 17 18  1  0\n 18 19  2  0\n 18 21  1  0\n 19 20  1  0\n 21 22  1  0\n 21 23  1  0\n 23 24  2  0\n 23 25  1  0\n 25 28  1  0\n 25 26  1  0\n 25 35  1  0\n 26 27  1  0\n 26 33  1  0\n 26 34  1  0\n 27 28  1  0\n 27 31  1  0\n 27 32  1  0\n 28 29  1  0\n 28 30  1  0\nM  END\n\n>  <ofe-name>\nlig_ejm_47\n\n>  <atom.dprop.PartialCharge>\n0.14797435897435895 -0.096025641025641026 -0.12902564102564104 0.052374358974358971 -0.14362564102564104 0.052374358974358971 -0.12902564102564104 0.15697435897435896 -0.059925641025641033\n0.69167435897435892 -0.5501256410256411 -0.46012564102564102 0.33047435897435901 0.12757435897435895 -0.30332564102564102 0.44417435897435897 -0.73702564102564105 0.55017435897435896\n-0.32032564102564098 0.17797435897435895 -0.55142564102564107 0.33147435897435901 0.68207435897435897 -0.59112564102564102 -0.16772564102564103 -0.082425641025641025 -0.094425641025641022\n-0.082425641025641025 0.062924358974358982 0.062924358974358982 0.055674358974358969 0.055674358974358969 0.062924358974358982 0.062924358974358982 0.085674358974358975\n0.025074358974358973 0.18197435897435896 -0.059925641025641033 0.15697435897435896\n\n$$$$\nlig_ejm_48\n     RDKit          3D\n\n 42 44  0  0  0  0  0  0  0  0999 V2000\n   -4.7806   -2.7772  -16.4434 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -5.3676   -3.6465  -16.1852 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -4.7769   -4.9205  -16.1714 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -5.5376   -6.0528  -15.8227 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -6.9070   -5.9191  -15.4756 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.4992   -4.6314  -15.5128 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -6.7276   -3.5087  -15.8630 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.1848   -2.5317  -15.8892 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -9.1769   -4.3893  -15.1746 Cl  0  0  0  0  0  0  0  0  0  0  0  0\n   -7.7212   -7.1103  -15.0571 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.1393   -7.1981  -13.9030 O   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.9218   -8.0129  -16.0346 N   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.4512   -7.8119  -16.9045 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.7481   -9.1686  -16.0525 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -9.5798   -9.5825  -14.9913 C   0  0  0  0  0  0  0  0  0  0  0  0\n  -10.3775  -10.7221  -15.1791 C   0  0  0  0  0  0  0  0  0  0  0  0\n  -10.3682  -11.4628  -16.3069 N   0  0  0  0  0  0  0  0  0  0  0  0\n   -9.5623  -11.0966  -17.3301 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.7569   -9.9317  -17.2354 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.1457   -9.5990  -18.0592 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -9.5769  -11.9004  -18.5054 N   0  0  0  0  0  0  0  0  0  0  0  0\n  -10.3792  -12.5129  -18.5798 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.6637  -12.0054  -19.4887 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.6404  -11.3231  -19.5605 O   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.9216  -13.0751  -20.5678 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.9524  -12.4999  -21.9980 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.2926  -13.5073  -22.9488 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.7436  -14.6222  -22.0660 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.6746  -13.9986  -20.6761 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.5769  -14.7512  -19.8963 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -6.7547  -13.4133  -20.6284 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -6.7769  -14.9877  -22.4122 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.4370  -15.4622  -22.0644 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.4882  -13.0244  -23.5058 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -9.0044  -13.8985  -23.6767 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.4190  -11.5446  -22.0668 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -9.9768  -12.3220  -22.3078 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -9.8199  -13.6608  -20.3658 H   0  0  0  0  0  0  0  0  0  0  0  0\n  -11.0370  -11.0599  -14.3932 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -9.6473   -9.0490  -14.0569 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -4.7462   -7.5852  -15.8223 Cl  0  0  0  0  0  0  0  0  0  0  0  0\n   -3.7312   -5.0277  -16.4208 H   0  0  0  0  0  0  0  0  0  0  0  0\n  1  2  1  0\n  2  7  2  0\n  2  3  1  0\n  3  4  2  0\n  3 42  1  0\n  4  5  1  0\n  4 41  1  0\n  5  6  2  0\n  5 10  1  0\n  6  7  1  0\n  6  9  1  0\n  7  8  1  0\n 10 11  2  0\n 10 12  1  0\n 12 13  1  0\n 12 14  1  0\n 14 19  1  0\n 14 15  2  0\n 15 16  1  0\n 15 40  1  0\n 16 17  2  0\n 16 39  1  0\n 17 18  1  0\n 18 19  2  0\n 18 21  1  0\n 19 20  1  0\n 21 22  1  0\n 21 23  1  0\n 23 24  2  0\n 23 25  1  0\n 25 29  1  0\n 25 26  1  0\n 25 38  1  0\n 26 27  1  0\n 26 36  1  0\n 26 37  1  0\n 27 28  1  0\n 27 34  1  0\n 27 35  1  0\n 28 29  1  0\n 28 32  1  0\n 28 33  1  0\n 29 30  1  0\n 29 31  1  0\nM  END\n\n>  <ofe-name>\nlig_ejm_48\n\n>  <atom.dprop.PartialCharge>\n0.14797619047619048 -0.096023809523809525 -0.12902380952380951 0.052376190476190479 -0.14362380952380951 0.052376190476190479 -0.12902380952380951 0.15697619047619049 -0.059923809523809525\n0.69167619047619044 -0.55012380952380957 -0.46012380952380955 0.33047619047619048 0.12657619047619048 -0.30332380952380955 0.44417619047619045 -0.73702380952380953 0.54917619047619048\n-0.31932380952380951 0.17797619047619048 -0.55142380952380954 0.33147619047619048 0.6740761904761905 -0.5911238095238095 -0.1387238095238095 -0.076423809523809519 -0.079423809523809522\n-0.079423809523809522 -0.076423809523809519 0.055926190476190477 0.055926190476190477 0.045426190476190474 0.045426190476190474 0.045426190476190474 0.045426190476190474\n0.055926190476190477 0.055926190476190477 0.074676190476190479 0.025076190476190481 0.18297619047619049 -0.059923809523809525 0.15697619047619049\n\n$$$$\nlig_ejm_50\n     RDKit          3D\n\n 33 34  0  0  0  0  0  0  0  0999 V2000\n   -4.7971   -2.7828  -16.4669 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -5.3788   -3.6540  -16.2032 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -4.7842   -4.9254  -16.1895 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -5.5365   -6.0583  -15.8239 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -6.9024   -5.9288  -15.4613 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.4999   -4.6438  -15.5003 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -6.7356   -3.5208  -15.8669 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.1930   -2.5443  -15.8928 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -9.1769   -4.4052  -15.1506 Cl  0  0  0  0  0  0  0  0  0  0  0  0\n   -7.7083   -7.1203  -15.0262 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.1436   -7.1856  -13.8767 O   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.8838   -8.0479  -15.9847 N   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.4002   -7.8655  -16.8511 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.7100   -9.2031  -15.9928 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -9.5717   -9.5861  -14.9420 C   0  0  0  0  0  0  0  0  0  0  0  0\n  -10.3774  -10.7205  -15.1209 C   0  0  0  0  0  0  0  0  0  0  0  0\n  -10.3600  -11.4760  -16.2385 N   0  0  0  0  0  0  0  0  0  0  0  0\n   -9.5290  -11.1353  -17.2521 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.6974   -9.9916  -17.1601 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.0618   -9.6948  -17.9809 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -9.5770  -11.9206  -18.4322 N   0  0  0  0  0  0  0  0  0  0  0  0\n  -10.4274  -12.4608  -18.5322 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.6810  -12.0611  -19.4286 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.5776  -11.5115  -19.4762 O   0  0  0  0  0  0  0  0  0  0  0  0\n   -9.1224  -12.9805  -20.5744 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -9.3530  -12.3758  -21.4514 H   0  0  0  0  0  0  0  0  0  0  0  0\n  -10.0327  -13.5198  -20.3069 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.1134  -13.9200  -20.8980 O   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.4590  -14.4776  -21.5795 H   0  0  0  0  0  0  0  0  0  0  0  0\n  -11.0554  -11.0362  -14.3423 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -9.6558   -9.0323  -14.0202 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -4.7358   -7.5856  -15.8221 Cl  0  0  0  0  0  0  0  0  0  0  0  0\n   -3.7408   -5.0305  -16.4513 H   0  0  0  0  0  0  0  0  0  0  0  0\n  1  2  1  0\n  2  7  2  0\n  2  3  1  0\n  3  4  2  0\n  3 33  1  0\n  4  5  1  0\n  4 32  1  0\n  5  6  2  0\n  5 10  1  0\n  6  7  1  0\n  6  9  1  0\n  7  8  1  0\n 10 11  2  0\n 10 12  1  0\n 12 13  1  0\n 12 14  1  0\n 14 19  1  0\n 14 15  2  0\n 15 16  1  0\n 15 31  1  0\n 16 17  2  0\n 16 30  1  0\n 17 18  1  0\n 18 19  2  0\n 18 21  1  0\n 19 20  1  0\n 21 22  1  0\n 21 23  1  0\n 23 24  2  0\n 23 25  1  0\n 25 26  1  0\n 25 27  1  0\n 25 28  1  0\n 28 29  1  0\nM  END\n\n>  <ofe-name>\nlig_ejm_50\n\n>  <atom.dprop.PartialCharge>\n0.14796969696969697 -0.096030303030303021 -0.12853030303030302 0.052369696969696976 -0.14363030303030302 0.052369696969696976 -0.12853030303030302 0.15696969696969698 -0.060430303030303029\n0.69166969696969693 -0.54913030303030308 -0.46113030303030306 0.33046969696969697 0.12756969696969697 -0.30133030303030306 0.44416969696969694 -0.73103030303030303 0.54716969696969697\n-0.32033030303030302 0.17796969696969697 -0.54143030303030304 0.34646969696969693 0.62606969696969694 -0.59413030303030301 0.055369696969696972 0.084669696969696978 0.084669696969696978\n-0.58783030303030304 0.41096969696969693 0.027069696969696973 0.18296969696969698 -0.060430303030303029 0.15696969696969698\n\n$$$$\nlig_jmc_23\n     RDKit          3D\n\n 36 38  0  0  0  0  0  0  0  0999 V2000\n   -4.7871   -2.7885  -16.4970 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -5.3697   -3.6577  -16.2217 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -4.7769   -4.9309  -16.1922 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -5.5340   -6.0593  -15.8230 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -6.9023   -5.9231  -15.4705 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.4977   -4.6364  -15.5270 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -6.7277   -3.5164  -15.8967 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.1783   -2.5375  -15.9389 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -9.1769   -4.3939  -15.1975 Cl  0  0  0  0  0  0  0  0  0  0  0  0\n   -7.7122   -7.1118  -15.0366 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.1396   -7.1851  -13.8839 O   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.9032   -8.0308  -15.9995 N   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.4257   -7.8484  -16.8690 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.7261   -9.1875  -16.0036 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -9.5483   -9.5964  -14.9328 C   0  0  0  0  0  0  0  0  0  0  0  0\n  -10.3511  -10.7349  -15.1078 C   0  0  0  0  0  0  0  0  0  0  0  0\n  -10.3507  -11.4835  -16.2324 N   0  0  0  0  0  0  0  0  0  0  0  0\n   -9.5485  -11.1226  -17.2638 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.7412   -9.9596  -17.1804 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.1391   -9.6368  -18.0149 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -9.5669  -11.9191  -18.4439 N   0  0  0  0  0  0  0  0  0  0  0  0\n  -10.3812  -12.5111  -18.5394 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.6403  -12.0386  -19.4227 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.5787  -11.4151  -19.4628 O   0  0  0  0  0  0  0  0  0  0  0  0\n   -9.0326  -13.0172  -20.4895 C   0  0  2  0  0  0  0  0  0  0  0  0\n   -7.9828  -13.8780  -21.1725 C   0  0  1  0  0  0  0  0  0  0  0  0\n   -8.5985  -12.7210  -21.9125 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.9711  -11.8488  -22.0970 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -9.3252  -12.9339  -22.6915 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.2299  -14.9031  -21.4408 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -6.6531  -13.7447  -20.8110 F   0  0  0  0  0  0  0  0  0  0  0  0\n  -10.0144  -13.4741  -20.3734 H   0  0  0  0  0  0  0  0  0  0  0  0\n  -11.0124  -11.0557  -14.3155 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -9.6070   -9.0544  -14.0007 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -4.7367   -7.5877  -15.8252 Cl  0  0  0  0  0  0  0  0  0  0  0  0\n   -3.7329   -5.0446  -16.4497 H   0  0  0  0  0  0  0  0  0  0  0  0\n  1  2  1  0\n  2  7  2  0\n  2  3  1  0\n  3  4  2  0\n  3 36  1  0\n  4  5  1  0\n  4 35  1  0\n  5  6  2  0\n  5 10  1  0\n  6  7  1  0\n  6  9  1  0\n  7  8  1  0\n 10 11  2  0\n 10 12  1  0\n 12 13  1  0\n 12 14  1  0\n 14 19  1  0\n 14 15  2  0\n 15 16  1  0\n 15 34  1  0\n 16 17  2  0\n 16 33  1  0\n 17 18  1  0\n 18 19  2  0\n 18 21  1  0\n 19 20  1  0\n 21 22  1  0\n 21 23  1  0\n 23 24  2  0\n 23 25  1  0\n 25 27  1  0\n 25 26  1  0\n 25 32  1  6\n 26 27  1  0\n 26 30  1  6\n 26 31  1  0\n 27 28  1  0\n 27 29  1  0\nM  END\n\n>  <ofe-name>\nlig_jmc_23\n\n>  <atom.dprop.PartialCharge>\n0.14802777777777779 -0.095972222222222223 -0.12897222222222221 0.052427777777777781 -0.14357222222222221 0.052427777777777781 -0.12897222222222221 0.15702777777777779 -0.060372222222222223\n0.69172777777777772 -0.5500722222222223 -0.46107222222222222 0.33052777777777781 0.12662777777777778 -0.30127222222222222 0.44422777777777778 -0.72997222222222224 0.54722777777777776\n-0.31927222222222218 0.17702777777777778 -0.54137222222222225 0.34252777777777782 0.70112777777777768 -0.58607222222222222 -0.2336722222222222 0.12062777777777778 -0.12037222222222221\n0.095227777777777786 0.095227777777777786 0.099727777777777776 -0.20527222222222222 0.11872777777777778 0.026127777777777781 0.18302777777777779 -0.060372222222222223 0.15702777777777779\n\n$$$$\nlig_jmc_27\n     RDKit          3D\n\n 36 38  0  0  0  0  0  0  0  0999 V2000\n   -4.7850   -2.7769  -16.4290 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -5.3697   -3.6480  -16.1728 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -4.7769   -4.9212  -16.1644 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -5.5349   -6.0557  -15.8170 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -6.9040   -5.9250  -15.4663 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.4991   -4.6383  -15.5006 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -6.7300   -3.5136  -15.8503 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.1893   -2.5374  -15.8751 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -9.1768   -4.3997  -15.1586 Cl  0  0  0  0  0  0  0  0  0  0  0  0\n   -7.7148   -7.1180  -15.0457 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.1389   -7.1991  -13.8934 O   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.9049   -8.0287  -16.0180 N   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.4294   -7.8335  -16.8865 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.7326   -9.1839  -16.0340 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -9.5767   -9.5845  -14.9768 C   0  0  0  0  0  0  0  0  0  0  0  0\n  -10.3787  -10.7211  -15.1617 C   0  0  0  0  0  0  0  0  0  0  0  0\n  -10.3684  -11.4682  -16.2855 N   0  0  0  0  0  0  0  0  0  0  0  0\n   -9.5511  -11.1143  -17.3033 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.7345   -9.9579  -17.2108 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.1156   -9.6410  -18.0354 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -9.5769  -11.9102  -18.4820 N   0  0  0  0  0  0  0  0  0  0  0  0\n  -10.4125  -12.4719  -18.5849 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.6418  -12.0583  -19.4429 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.5768  -11.4445  -19.4773 O   0  0  0  0  0  0  0  0  0  0  0  0\n   -9.0300  -13.0424  -20.5007 C   0  0  2  0  0  0  0  0  0  0  0  0\n   -7.9790  -13.8599  -21.2474 C   0  0  1  0  0  0  0  0  0  0  0  0\n   -8.6725  -12.7173  -21.9374 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.0920  -11.8168  -22.1314 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -9.4254  -12.9488  -22.6885 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.2615  -14.8677  -21.5420 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -6.2468  -13.7466  -21.0219 Cl  0  0  0  0  0  0  0  0  0  0  0  0\n   -9.9956  -13.5261  -20.3580 H   0  0  0  0  0  0  0  0  0  0  0  0\n  -11.0483  -11.0477  -14.3796 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -9.6507   -9.0421  -14.0475 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -4.7400   -7.5863  -15.8220 Cl  0  0  0  0  0  0  0  0  0  0  0  0\n   -3.7318   -5.0262  -16.4169 H   0  0  0  0  0  0  0  0  0  0  0  0\n  1  2  1  0\n  2  7  2  0\n  2  3  1  0\n  3  4  2  0\n  3 36  1  0\n  4  5  1  0\n  4 35  1  0\n  5  6  2  0\n  5 10  1  0\n  6  7  1  0\n  6  9  1  0\n  7  8  1  0\n 10 11  2  0\n 10 12  1  0\n 12 13  1  0\n 12 14  1  0\n 14 19  1  0\n 14 15  2  0\n 15 16  1  0\n 15 34  1  0\n 16 17  2  0\n 16 33  1  0\n 17 18  1  0\n 18 19  2  0\n 18 21  1  0\n 19 20  1  0\n 21 22  1  0\n 21 23  1  0\n 23 24  2  0\n 23 25  1  0\n 25 27  1  0\n 25 26  1  0\n 25 32  1  6\n 26 27  1  0\n 26 30  1  6\n 26 31  1  0\n 27 28  1  0\n 27 29  1  0\nM  END\n\n>  <ofe-name>\nlig_jmc_27\n\n>  <atom.dprop.PartialCharge>\n0.14802777777777779 -0.095972222222222223 -0.12897222222222221 0.052427777777777781 -0.14357222222222221 0.052427777777777781 -0.12897222222222221 0.15702777777777779 -0.060372222222222223\n0.69172777777777772 -0.5500722222222223 -0.46107222222222222 0.33052777777777781 0.12662777777777778 -0.30227222222222222 0.44422777777777778 -0.73097222222222225 0.54822777777777776\n-0.31927222222222218 0.17702777777777778 -0.53937222222222225 0.33852777777777782 0.70012777777777768 -0.58207222222222221 -0.21167222222222221 -0.024272222222222219 -0.092372222222222217\n0.095727777777777773 0.095727777777777773 0.10972777777777779 -0.11737222222222223 0.11472777777777778 0.026127777777777781 0.18302777777777779 -0.060372222222222223 0.15702777777777779\n\n$$$$\nlig_jmc_28\n     RDKit          3D\n\n 39 41  0  0  0  0  0  0  0  0999 V2000\n   -4.7734   -2.7882  -16.4516 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -5.3693   -3.6534  -16.1928 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -4.7771   -4.9295  -16.1748 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -5.5384   -6.0580  -15.8222 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -6.9079   -5.9170  -15.4723 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.5021   -4.6266  -15.5098 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -6.7258   -3.5070  -15.8679 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.1773   -2.5281  -15.8986 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -9.1766   -4.3876  -15.1626 Cl  0  0  0  0  0  0  0  0  0  0  0  0\n   -7.7200   -7.1066  -15.0434 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.1390   -7.1894  -13.8908 O   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.9167   -8.0154  -16.0156 N   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.4475   -7.8102  -16.8862 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.7431   -9.1695  -16.0273 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -9.5769   -9.5853  -14.9643 C   0  0  0  0  0  0  0  0  0  0  0  0\n  -10.3771  -10.7245  -15.1583 C   0  0  0  0  0  0  0  0  0  0  0  0\n  -10.3740  -11.4620  -16.2885 N   0  0  0  0  0  0  0  0  0  0  0  0\n   -9.5582  -11.0924  -17.3052 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.7548   -9.9313  -17.2084 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.1464   -9.5935  -18.0346 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -9.5735  -11.8790  -18.4906 N   0  0  0  0  0  0  0  0  0  0  0  0\n  -10.4150  -12.4196  -18.6299 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.6246  -12.0098  -19.4382 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.5447  -11.4192  -19.4291 O   0  0  0  0  0  0  0  0  0  0  0  0\n   -9.0144  -12.9414  -20.5374 C   0  0  2  0  0  0  0  0  0  0  0  0\n   -7.9968  -13.8618  -21.2117 C   0  0  1  0  0  0  0  0  0  0  0  0\n   -8.4999  -12.6404  -21.9316 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -7.8110  -11.8050  -22.0554 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -9.1848  -12.7929  -22.7629 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -8.4286  -14.8054  -21.5270 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -6.5243  -14.0038  -20.8986 C   0  0  0  0  0  0  0  0  0  0  0  0\n   -6.0378  -13.0412  -20.7510 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -6.0098  -14.5270  -21.7113 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -6.4164  -14.5984  -19.9932 H   0  0  0  0  0  0  0  0  0  0  0  0\n  -10.0347  -13.3181  -20.4861 H   0  0  0  0  0  0  0  0  0  0  0  0\n  -11.0392  -11.0690  -14.3787 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -9.6406   -9.0508  -14.0279 H   0  0  0  0  0  0  0  0  0  0  0  0\n   -4.7554   -7.5923  -15.8220 Cl  0  0  0  0  0  0  0  0  0  0  0  0\n   -3.7300   -5.0400  -16.4263 H   0  0  0  0  0  0  0  0  0  0  0  0\n  1  2  1  0\n  2  7  2  0\n  2  3  1  0\n  3  4  2  0\n  3 39  1  0\n  4  5  1  0\n  4 38  1  0\n  5  6  2  0\n  5 10  1  0\n  6  7  1  0\n  6  9  1  0\n  7  8  1  0\n 10 11  2  0\n 10 12  1  0\n 12 13  1  0\n 12 14  1  0\n 14 19  1  0\n 14 15  2  0\n 15 16  1  0\n 15 37  1  0\n 16 17  2  0\n 16 36  1  0\n 17 18  1  0\n 18 19  2  0\n 18 21  1  0\n 19 20  1  0\n 21 22  1  0\n 21 23  1  0\n 23 24  2  0\n 23 25  1  0\n 25 27  1  0\n 25 26  1  0\n 25 35  1  6\n 26 27  1  0\n 26 30  1  6\n 26 31  1  0\n 27 28  1  0\n 27 29  1  0\n 31 32  1  0\n 31 33  1  0\n 31 34  1  0\nM  END\n\n>  <ofe-name>\nlig_jmc_28\n\n>  <atom.dprop.PartialCharge>\n0.14807692307692308 -0.095923076923076916 -0.12892307692307692 0.051976923076923087 -0.14352307692307692 0.051976923076923087 -0.12892307692307692 0.15707692307692309 -0.059823076923076916\n0.69177692307692307 -0.55002307692307695 -0.46002307692307692 0.3305769230769231 0.12667692307692308 -0.30322307692307693 0.44427692307692307 -0.7359230769230769 0.54927692307692311\n-0.31922307692307689 0.17807692307692308 -0.54732307692307691 0.3325769230769231 0.70317692307692303 -0.59502307692307688 -0.2286230769230769 -0.089623076923076916 -0.099323076923076917\n0.087276923076923085 0.087276923076923085 0.08177692307692308 -0.084023076923076909 0.048776923076923086 0.048776923076923086 0.048776923076923086 0.09677692307692308 0.025176923076923083\n0.18207692307692308 -0.059823076923076916 0.15707692307692309\n\n$$$$\n"
  },
  {
    "path": "src/openfecli/tests/data/rbfe_tutorial/tyk2_protein.pdb",
    "content": "HEADER    TRANSFERASE/TRANSFERASE INHIBITOR       08-AUG-12   4GIH\nTITLE     TYK2 (JH1) IN COMPLEX WITH\nTITLE    2 2,6-DICHLORO-N-{2-[(CYCLOPROPYLCARBONYL)\nTITLE    3 AMINO]PYRIDIN-4-YL}BENZAMIDE\nEXPDTA    X-RAY DIFFRACTION\nREMARK   2 RESOLUTION.    2.00 ANGSTROMS\nREMARK   3  R VALUE : 0.188000\nREMARK   3  FREE R VALUE : 0.217000\nREMARK   4 4GIH COMPLIES WITH FORMAT V. 3.30,\nREMARK 200  TEMPERATURE           (KELVIN) : 173.00\nREMARK 200  PH                             : 6.50\nREMARK 350 BIOMOLECULE: 1\nREMARK 350 APPLY THE FOLLOWING TO CHAINS: A\nREMARK 350   BIOMT1  1   1.000000 0.000000 0.000000   0.000000\nREMARK 350   BIOMT2  1   0.000000 1.000000 0.000000   0.000000\nREMARK 350   BIOMT3  1   0.000000 0.000000 1.000000   0.000000\nREMARK 888\nREMARK 888 WRITTEN BY MAESTRO (A PRODUCT OF SCHRODINGER, LLC)\nSEQRES   1 A  290  ACE THR VAL PHE HIS LYS ARG TYR LEU LYS LYS ILE ARG\nSEQRES   2 A  290  ASP LEU GLY GLU GLY HIS PHE GLY LYS VAL SER LEU TYR\nSEQRES   3 A  290  CYS TYR ASP PRO THR ASN ASP GLY THR GLY GLU MET VAL\nSEQRES   4 A  290  ALA VAL LYS ALA LEU LYS ALA ASP ALA GLY PRO GLN HIS\nSEQRES   5 A  290  ARG SER GLY TRP LYS GLN GLU ILE ASP ILE LEU ARG THR\nSEQRES   6 A  290  LEU TYR HIS GLU HIS ILE ILE LYS TYR LYS GLY CYS CYS\nSEQRES   7 A  290  GLU ASP ALA GLY ALA ALA SER LEU GLN LEU VAL MET GLU\nSEQRES   8 A  290  TYR VAL PRO LEU GLY SER LEU ARG ASP TYR LEU PRO ARG\nSEQRES   9 A  290  HIS SER ILE GLY LEU ALA GLN LEU LEU LEU PHE ALA GLN\nSEQRES  10 A  290  GLN ILE CYS GLU GLY MET ALA TYR LEU HIS ALA GLN HIS\nSEQRES  11 A  290  TYR ILE HIS ARG ASN LEU ALA ALA ARG ASN VAL LEU LEU\nSEQRES  12 A  290  ASP ASN ASP ARG LEU VAL LYS ILE GLY ASP PHE GLY LEU\nSEQRES  13 A  290  ALA LYS ALA VAL PRO GLU GLY HIS GLU TYR TYR ARG VAL\nSEQRES  14 A  290  ARG GLU ASP GLY ASP SER PRO VAL PHE TRP TYR ALA PRO\nSEQRES  15 A  290  GLU CYS LEU LYS GLU TYR LYS PHE TYR TYR ALA SER ASP\nSEQRES  16 A  290  VAL TRP SER PHE GLY VAL THR LEU TYR GLU LEU LEU THR\nSEQRES  17 A  290  HIS CYS ASP SER SER GLN SER PRO PRO THR LYS PHE LEU\nSEQRES  18 A  290  GLU LEU ILE GLY ILE ALA GLN GLY GLN MET THR VAL LEU\nSEQRES  19 A  290  ARG LEU THR GLU LEU LEU GLU ARG GLY GLU ARG LEU PRO\nSEQRES  20 A  290  ARG PRO ASP LYS CYS PRO ALA GLU VAL TYR HIS LEU MET\nSEQRES  21 A  290  LYS ASN CYS TRP GLU THR GLU ALA SER PHE ARG PRO THR\nSEQRES  22 A  290  PHE GLU ASN LEU ILE PRO ILE LEU LYS THR VAL HIS GLU\nSEQRES  23 A  290  LYS TYR ARG NME\nFORMUL   2  HOH   *46(H2 0)\nHELIX    1   1 HIS A  940  HIS A  940  1\nHELIX    2   2 ARG A  941  ARG A  941  1\nHELIX    3   3 SER A  942  SER A  942  1\nHELIX    4   4 GLY A  943  GLY A  943  1\nHELIX    5   5 TRP A  944  TRP A  944  1\nHELIX    6   6 LYS A  945  LYS A  945  1\nHELIX    7   7 GLN A  946  GLN A  946  1\nHELIX    8   8 GLU A  947  GLU A  947  1\nHELIX    9   9 ILE A  948  ILE A  948  1\nHELIX   10  10 ASP A  949  ASP A  949  1\nHELIX   11  11 ILE A  950  ILE A  950  1\nHELIX   12  12 LEU A  951  LEU A  951  1\nHELIX   13  13 ARG A  952  ARG A  952  1\nHELIX   14  14 THR A  953  THR A  953  1\nHELIX   15  15 LEU A  986  LEU A  986  1\nHELIX   16  16 ARG A  987  ARG A  987  1\nHELIX   17  17 ASP A  988  ASP A  988  1\nHELIX   18  18 TYR A  989  TYR A  989  1\nHELIX   19  19 LEU A  997  LEU A  997  1\nHELIX   20  20 ALA A  998  ALA A  998  1\nHELIX   21  21 GLN A  999  GLN A  999  1\nHELIX   22  22 LEU A 1000  LEU A 1000  1\nHELIX   23  23 LEU A 1001  LEU A 1001  1\nHELIX   24  24 LEU A 1002  LEU A 1002  1\nHELIX   25  25 PHE A 1003  PHE A 1003  1\nHELIX   26  26 ALA A 1004  ALA A 1004  1\nHELIX   27  27 GLN A 1005  GLN A 1005  1\nHELIX   28  28 GLN A 1006  GLN A 1006  1\nHELIX   29  29 ILE A 1007  ILE A 1007  1\nHELIX   30  30 CYS A 1008  CYS A 1008  1\nHELIX   31  31 GLU A 1009  GLU A 1009  1\nHELIX   32  32 GLY A 1010  GLY A 1010  1\nHELIX   33  33 MET A 1011  MET A 1011  1\nHELIX   34  34 ALA A 1012  ALA A 1012  1\nHELIX   35  35 TYR A 1013  TYR A 1013  1\nHELIX   36  36 LEU A 1014  LEU A 1014  1\nHELIX   37  37 HIS A 1015  HIS A 1015  1\nHELIX   38  38 ALA A 1016  ALA A 1016  1\nHELIX   39  39 TYR A 1080  TYR A 1080  1\nHELIX   40  40 ALA A 1081  ALA A 1081  1\nHELIX   41  41 SER A 1082  SER A 1082  1\nHELIX   42  42 ASP A 1083  ASP A 1083  1\nHELIX   43  43 VAL A 1084  VAL A 1084  1\nHELIX   44  44 TRP A 1085  TRP A 1085  1\nHELIX   45  45 SER A 1086  SER A 1086  1\nHELIX   46  46 PHE A 1087  PHE A 1087  1\nHELIX   47  47 GLY A 1088  GLY A 1088  1\nHELIX   48  48 VAL A 1089  VAL A 1089  1\nHELIX   49  49 THR A 1090  THR A 1090  1\nHELIX   50  50 LEU A 1091  LEU A 1091  1\nHELIX   51  51 TYR A 1092  TYR A 1092  1\nHELIX   52  52 GLU A 1093  GLU A 1093  1\nHELIX   53  53 LEU A 1094  LEU A 1094  1\nHELIX   54  54 LEU A 1095  LEU A 1095  1\nHELIX   55  55 LYS A 1107  LYS A 1107  1\nHELIX   56  56 PHE A 1108  PHE A 1108  1\nHELIX   57  57 LEU A 1109  LEU A 1109  1\nHELIX   58  58 GLU A 1110  GLU A 1110  1\nHELIX   59  59 LEU A 1111  LEU A 1111  1\nHELIX   60  60 ILE A 1112  ILE A 1112  1\nHELIX   61  61 THR A 1120  THR A 1120  1\nHELIX   62  62 VAL A 1121  VAL A 1121  1\nHELIX   63  63 LEU A 1122  LEU A 1122  1\nHELIX   64  64 ARG A 1123  ARG A 1123  1\nHELIX   65  65 LEU A 1124  LEU A 1124  1\nHELIX   66  66 THR A 1125  THR A 1125  1\nHELIX   67  67 GLU A 1126  GLU A 1126  1\nHELIX   68  68 LEU A 1127  LEU A 1127  1\nHELIX   69  69 LEU A 1128  LEU A 1128  1\nHELIX   70  70 GLU A 1129  GLU A 1129  1\nHELIX   71  71 GLU A 1143  GLU A 1143  1\nHELIX   72  72 VAL A 1144  VAL A 1144  1\nHELIX   73  73 TYR A 1145  TYR A 1145  1\nHELIX   74  74 HIS A 1146  HIS A 1146  1\nHELIX   75  75 LEU A 1147  LEU A 1147  1\nHELIX   76  76 MET A 1148  MET A 1148  1\nHELIX   77  77 LYS A 1149  LYS A 1149  1\nHELIX   78  78 ASN A 1150  ASN A 1150  1\nHELIX   79  79 CYS A 1151  CYS A 1151  1\nHELIX   80  80 PHE A 1162  PHE A 1162  1\nHELIX   81  81 GLU A 1163  GLU A 1163  1\nHELIX   82  82 ASN A 1164  ASN A 1164  1\nHELIX   83  83 LEU A 1165  LEU A 1165  1\nHELIX   84  84 ILE A 1166  ILE A 1166  1\nHELIX   85  85 PRO A 1167  PRO A 1167  1\nHELIX   86  86 ILE A 1168  ILE A 1168  1\nHELIX   87  87 LEU A 1169  LEU A 1169  1\nHELIX   88  88 LYS A 1170  LYS A 1170  1\nHELIX   89  89 THR A 1171  THR A 1171  1\nHELIX   90  90 VAL A 1172  VAL A 1172  1\nHELIX   91  91 HIS A 1173  HIS A 1173  1\nHELIX   92  92 GLU A 1174  GLU A 1174  1\nHELIX   93  93 LYS A 1175  LYS A 1175  1\nHELIX   94  94 TYR A 1176  TYR A 1176  1\nTURN     1   1 THR A 890  THR A 890\nTURN     2   2 VAL A 891  VAL A 891\nTURN     3   3 HIS A 893  HIS A 893\nTURN     4   4 LYS A 894  LYS A 894\nTURN     5   5 ARG A 895  ARG A 895\nTURN     6   6 TYR A 896  TYR A 896\nTURN     7   7 GLY A 906  GLY A 906\nTURN     8   8 HIS A 907  HIS A 907\nTURN     9   9 PHE A 908  PHE A 908\nTURN    10  10 GLY A 909  GLY A 909\nTURN    11  11 ASP A 917  ASP A 917\nTURN    12  12 PRO A 918  PRO A 918\nTURN    13  13 THR A 919  THR A 919\nTURN    14  14 ASN A 920  ASN A 920\nTURN    15  15 ASP A 921  ASP A 921\nTURN    16  16 GLY A 922  GLY A 922\nTURN    17  17 THR A 923  THR A 923\nTURN    18  18 GLY A 924  GLY A 924\nTURN    19  19 ALA A 931  ALA A 931\nTURN    20  20 LEU A 932  LEU A 932\nTURN    21  21 LYS A 933  LYS A 933\nTURN    22  22 ALA A 934  ALA A 934\nTURN    23  23 ASP A 935  ASP A 935\nTURN    24  24 ALA A 936  ALA A 936\nTURN    25  25 GLY A 937  GLY A 937\nTURN    26  26 PRO A 938  PRO A 938\nTURN    27  27 GLN A 939  GLN A 939\nTURN    28  28 LEU A 954  LEU A 954\nTURN    29  29 TYR A 955  TYR A 955\nTURN    30  30 HIS A 956  HIS A 956\nTURN    31  31 GLU A 957  GLU A 957\nTURN    32  32 HIS A 958  HIS A 958\nTURN    33  33 ILE A 959  ILE A 959\nTURN    34  34 ILE A 960  ILE A 960\nTURN    35  35 LYS A 961  LYS A 961\nTURN    36  36 ALA A 969  ALA A 969\nTURN    37  37 GLY A 970  GLY A 970\nTURN    38  38 ALA A 971  ALA A 971\nTURN    39  39 ALA A 972  ALA A 972\nTURN    40  40 TYR A 980  TYR A 980\nTURN    41  41 VAL A 981  VAL A 981\nTURN    42  42 PRO A 982  PRO A 982\nTURN    43  43 LEU A 983  LEU A 983\nTURN    44  44 LEU A 990  LEU A 990\nTURN    45  45 PRO A 991  PRO A 991\nTURN    46  46 ARG A 992  ARG A 992\nTURN    47  47 HIS A 993  HIS A 993\nTURN    48  48 SER A 994  SER A 994\nTURN    49  49 ILE A 995  ILE A 995\nTURN    50  50 GLY A 996  GLY A 996\nTURN    51  51 GLN A1017  GLN A1017\nTURN    52  52 HIS A1018  HIS A1018\nTURN    53  53 HIS A1021  HIS A1021\nTURN    54  54 ARG A1022  ARG A1022\nTURN    55  55 ASN A1023  ASN A1023\nTURN    56  56 LEU A1024  LEU A1024\nTURN    57  57 ALA A1025  ALA A1025\nTURN    58  58 ALA A1026  ALA A1026\nTURN    59  59 ARG A1027  ARG A1027\nTURN    60  60 ASN A1028  ASN A1028\nTURN    61  61 ASP A1034  ASP A1034\nTURN    62  62 ARG A1035  ARG A1035\nTURN    63  63 GLY A1040  GLY A1040\nTURN    64  64 ASP A1041  ASP A1041\nTURN    65  65 PHE A1042  PHE A1042\nTURN    66  66 GLY A1043  GLY A1043\nTURN    67  67 LEU A1044  LEU A1044\nTURN    68  68 ALA A1045  ALA A1045\nTURN    69  69 VAL A1048  VAL A1048\nTURN    70  70 PRO A1049  PRO A1049\nTURN    71  71 GLU A1050  GLU A1050\nTURN    72  72 GLY A1051  GLY A1051\nTURN    73  73 HIS A1052  HIS A1052\nTURN    74  74 GLU A1053  GLU A1053\nTURN    75  75 VAL A1057  VAL A1057\nTURN    76  76 ARG A1058  ARG A1058\nTURN    77  77 GLU A1059  GLU A1059\nTURN    78  78 ASP A1060  ASP A1060\nTURN    79  79 GLY A1061  GLY A1061\nTURN    80  80 ASP A1062  ASP A1062\nTURN    81  81 SER A1063  SER A1063\nTURN    82  82 PRO A1064  PRO A1064\nTURN    83  83 VAL A1065  VAL A1065\nTURN    84  84 PHE A1066  PHE A1066\nTURN    85  85 TRP A1067  TRP A1067\nTURN    86  86 TYR A1068  TYR A1068\nTURN    87  87 ALA A1069  ALA A1069\nTURN    88  88 PRO A1070  PRO A1070\nTURN    89  89 GLU A1071  GLU A1071\nTURN    90  90 CYS A1072  CYS A1072\nTURN    91  91 LEU A1073  LEU A1073\nTURN    92  92 LYS A1074  LYS A1074\nTURN    93  93 GLU A1075  GLU A1075\nTURN    94  94 TYR A1076  TYR A1076\nTURN    95  95 THR A1096  THR A1096\nTURN    96  96 HIS A1097  HIS A1097\nTURN    97  97 CYS A1098  CYS A1098\nTURN    98  98 ASP A1099  ASP A1099\nTURN    99  99 SER A1100  SER A1100\nTURN   100 100 SER A1101  SER A1101\nTURN   101 101 GLN A1102  GLN A1102\nTURN   102 102 SER A1103  SER A1103\nTURN   103 103 PRO A1104  PRO A1104\nTURN   104 104 PRO A1105  PRO A1105\nTURN   105 105 THR A1106  THR A1106\nTURN   106 106 GLY A1113  GLY A1113\nTURN   107 107 ILE A1114  ILE A1114\nTURN   108 108 ALA A1115  ALA A1115\nTURN   109 109 GLN A1116  GLN A1116\nTURN   110 110 GLY A1117  GLY A1117\nTURN   111 111 GLN A1118  GLN A1118\nTURN   112 112 MET A1119  MET A1119\nTURN   113 113 ARG A1130  ARG A1130\nTURN   114 114 GLY A1131  GLY A1131\nTURN   115 115 GLU A1132  GLU A1132\nTURN   116 116 ARG A1133  ARG A1133\nTURN   117 117 LEU A1134  LEU A1134\nTURN   118 118 PRO A1135  PRO A1135\nTURN   119 119 ARG A1136  ARG A1136\nTURN   120 120 PRO A1137  PRO A1137\nTURN   121 121 ASP A1138  ASP A1138\nTURN   122 122 LYS A1139  LYS A1139\nTURN   123 123 CYS A1140  CYS A1140\nTURN   124 124 PRO A1141  PRO A1141\nTURN   125 125 ALA A1142  ALA A1142\nTURN   126 126 TRP A1152  TRP A1152\nTURN   127 127 GLU A1153  GLU A1153\nTURN   128 128 THR A1154  THR A1154\nTURN   129 129 GLU A1155  GLU A1155\nTURN   130 130 ALA A1156  ALA A1156\nTURN   131 131 SER A1157  SER A1157\nTURN   132 132 PHE A1158  PHE A1158\nTURN   133 133 ARG A1159  ARG A1159\nTURN   134 134 PRO A1160  PRO A1160\nTURN   135 135 THR A1161  THR A1161\nTURN   136 136 ARG A1177  ARG A1177\nSHEET    1   1 1 PHE A 892  PHE A 892  0\nSHEET    1   2 1 LEU A 897  LEU A 897  0\nSHEET    1   3 1 LYS A 898  LYS A 898  0\nSHEET    1   4 1 LYS A 899  LYS A 899  0\nSHEET    1   5 1 ILE A 900  ILE A 900  0\nSHEET    1   6 1 ARG A 901  ARG A 901  0\nSHEET    1   7 1 ASP A 902  ASP A 902  0\nSHEET    1   8 1 LEU A 903  LEU A 903  0\nSHEET    1   9 1 GLY A 904  GLY A 904  0\nSHEET    1  10 1 GLU A 905  GLU A 905  0\nSHEET    1  11 1 LYS A 910  LYS A 910  0\nSHEET    1  12 1 VAL A 911  VAL A 911  0\nSHEET    1  13 1 SER A 912  SER A 912  0\nSHEET    1  14 1 LEU A 913  LEU A 913  0\nSHEET    1  15 1 TYR A 914  TYR A 914  0\nSHEET    1  16 1 CYS A 915  CYS A 915  0\nSHEET    1  17 1 TYR A 916  TYR A 916  0\nSHEET    1  18 1 GLU A 925  GLU A 925  0\nSHEET    1  19 1 MET A 926  MET A 926  0\nSHEET    1  20 1 VAL A 927  VAL A 927  0\nSHEET    1  21 1 ALA A 928  ALA A 928  0\nSHEET    1  22 1 VAL A 929  VAL A 929  0\nSHEET    1  23 1 LYS A 930  LYS A 930  0\nSHEET    1  24 1 TYR A 962  TYR A 962  0\nSHEET    1  25 1 LYS A 963  LYS A 963  0\nSHEET    1  26 1 GLY A 964  GLY A 964  0\nSHEET    1  27 1 CYS A 965  CYS A 965  0\nSHEET    1  28 1 CYS A 966  CYS A 966  0\nSHEET    1  29 1 GLU A 967  GLU A 967  0\nSHEET    1  30 1 ASP A 968  ASP A 968  0\nSHEET    1  31 1 SER A 973  SER A 973  0\nSHEET    1  32 1 LEU A 974  LEU A 974  0\nSHEET    1  33 1 GLN A 975  GLN A 975  0\nSHEET    1  34 1 LEU A 976  LEU A 976  0\nSHEET    1  35 1 VAL A 977  VAL A 977  0\nSHEET    1  36 1 MET A 978  MET A 978  0\nSHEET    1  37 1 GLU A 979  GLU A 979  0\nSHEET    1  38 1 GLY A 984  GLY A 984  0\nSHEET    1  39 1 SER A 985  SER A 985  0\nSHEET    1  40 1 TYR A1019  TYR A1019  0\nSHEET    1  41 1 ILE A1020  ILE A1020  0\nSHEET    1  42 1 VAL A1029  VAL A1029  0\nSHEET    1  43 1 LEU A1030  LEU A1030  0\nSHEET    1  44 1 LEU A1031  LEU A1031  0\nSHEET    1  45 1 ASP A1032  ASP A1032  0\nSHEET    1  46 1 ASN A1033  ASN A1033  0\nSHEET    1  47 1 LEU A1036  LEU A1036  0\nSHEET    1  48 1 VAL A1037  VAL A1037  0\nSHEET    1  49 1 LYS A1038  LYS A1038  0\nSHEET    1  50 1 ILE A1039  ILE A1039  0\nSHEET    1  51 1 LYS A1046  LYS A1046  0\nSHEET    1  52 1 ALA A1047  ALA A1047  0\nSHEET    1  53 1 TYR A1054  TYR A1054  0\nSHEET    1  54 1 TYR A1055  TYR A1055  0\nSHEET    1  55 1 ARG A1056  ARG A1056  0\nSHEET    1  56 1 LYS A1077  LYS A1077  0\nSHEET    1  57 1 PHE A1078  PHE A1078  0\nSHEET    1  58 1 TYR A1079  TYR A1079  0\nCRYST1   36.165   74.378  105.855  90.00  90.00  90.00 P 21 21 21    4\nHETATM    1  CH3 ACE A 889     -15.732 -12.864   4.220  1.00  0.00           C  \nHETATM    2  C   ACE A 889     -15.275 -14.196   3.637  1.00  0.00           C  \nHETATM    3  O   ACE A 889     -14.652 -14.991   4.340  1.00  0.00           O  \nHETATM    4  H1  ACE A 889     -16.002 -12.982   5.270  1.00  0.00           H  \nHETATM    5  H2  ACE A 889     -14.929 -12.130   4.152  1.00  0.00           H  \nHETATM    6  H3  ACE A 889     -16.601 -12.476   3.688  1.00  0.00           H  \nATOM      7  N   THR A 890     -15.598 -14.429   2.353  1.00 62.43           N  \nATOM      8  CA  THR A 890     -15.253 -15.636   1.596  1.00 60.76           C  \nATOM      9  C   THR A 890     -13.728 -15.808   1.437  1.00 61.63           C  \nATOM     10  O   THR A 890     -13.057 -14.865   1.010  1.00 59.62           O  \nATOM     11  CB  THR A 890     -15.878 -15.600   0.175  1.00 68.55           C  \nATOM     12  OG1 THR A 890     -17.275 -15.404   0.279  1.00 68.98           O  \nATOM     13  CG2 THR A 890     -15.641 -16.864  -0.673  1.00 67.10           C  \nATOM     14  H   THR A 890     -16.131 -13.741   1.843  1.00 62.43           H  \nATOM     15  HA  THR A 890     -15.657 -16.495   2.138  1.00 60.76           H  \nATOM     16  HB  THR A 890     -15.486 -14.740  -0.370  1.00 68.55           H  \nATOM     17  HG1 THR A 890     -17.660 -15.485  -0.597  1.00 68.98           H  \nATOM     18 HG21 THR A 890     -16.174 -16.811  -1.622  1.00 67.10           H  \nATOM     19 HG22 THR A 890     -14.586 -17.003  -0.909  1.00 67.10           H  \nATOM     20 HG23 THR A 890     -15.983 -17.757  -0.151  1.00 67.10           H  \nATOM     21  N   VAL A 891     -13.227 -17.004   1.789  1.00 57.37           N  \nATOM     22  CA  VAL A 891     -11.803 -17.336   1.789  1.00 55.39           C  \nATOM     23  C   VAL A 891     -11.483 -18.439   0.760  1.00 56.21           C  \nATOM     24  O   VAL A 891     -12.250 -19.389   0.602  1.00 57.24           O  \nATOM     25  CB  VAL A 891     -11.320 -17.758   3.209  1.00 60.85           C  \nATOM     26  CG1 VAL A 891     -11.950 -19.060   3.745  1.00 62.96           C  \nATOM     27  CG2 VAL A 891      -9.784 -17.834   3.316  1.00 59.88           C  \nATOM     28  H   VAL A 891     -13.847 -17.732   2.112  1.00 57.37           H  \nATOM     29  HA  VAL A 891     -11.234 -16.448   1.521  1.00 55.39           H  \nATOM     30  HB  VAL A 891     -11.634 -16.961   3.885  1.00 60.85           H  \nATOM     31 HG11 VAL A 891     -11.669 -19.225   4.785  1.00 62.96           H  \nATOM     32 HG12 VAL A 891     -13.039 -19.021   3.707  1.00 62.96           H  \nATOM     33 HG13 VAL A 891     -11.625 -19.935   3.183  1.00 62.96           H  \nATOM     34 HG21 VAL A 891      -9.472 -17.993   4.349  1.00 59.88           H  \nATOM     35 HG22 VAL A 891      -9.371 -18.651   2.725  1.00 59.88           H  \nATOM     36 HG23 VAL A 891      -9.317 -16.908   2.976  1.00 59.88           H  \nATOM     37  N   PHE A 892     -10.332 -18.268   0.093  1.00 49.19           N  \nATOM     38  CA  PHE A 892      -9.736 -19.179  -0.880  1.00 47.07           C  \nATOM     39  C   PHE A 892      -8.379 -19.653  -0.337  1.00 52.74           C  \nATOM     40  O   PHE A 892      -7.608 -18.826   0.150  1.00 53.11           O  \nATOM     41  CB  PHE A 892      -9.546 -18.424  -2.216  1.00 45.10           C  \nATOM     42  CG  PHE A 892     -10.806 -18.200  -3.035  1.00 44.18           C  \nATOM     43  CD1 PHE A 892     -11.099 -19.048  -4.122  1.00 44.87           C  \nATOM     44  CD2 PHE A 892     -11.756 -17.229  -2.654  1.00 45.07           C  \nATOM     45  CE1 PHE A 892     -12.289 -18.908  -4.823  1.00 45.27           C  \nATOM     46  CE2 PHE A 892     -12.944 -17.110  -3.362  1.00 46.87           C  \nATOM     47  CZ  PHE A 892     -13.211 -17.944  -4.440  1.00 44.38           C  \nATOM     48  H   PHE A 892      -9.787 -17.438   0.287  1.00 49.19           H  \nATOM     49  HA  PHE A 892     -10.371 -20.052  -1.044  1.00 47.07           H  \nATOM     50  HB3 PHE A 892      -8.819 -18.942  -2.845  1.00 45.10           H  \nATOM     51  HB2 PHE A 892      -9.116 -17.444  -2.011  1.00 45.10           H  \nATOM     52  HD1 PHE A 892     -10.391 -19.801  -4.420  1.00 44.87           H  \nATOM     53  HD2 PHE A 892     -11.569 -16.581  -1.809  1.00 45.07           H  \nATOM     54  HE1 PHE A 892     -12.501 -19.556  -5.660  1.00 45.27           H  \nATOM     55  HE2 PHE A 892     -13.672 -16.374  -3.064  1.00 46.87           H  \nATOM     56  HZ  PHE A 892     -14.142 -17.847  -4.977  1.00 44.38           H  \nATOM     57  N   HIS A 893      -8.096 -20.961  -0.436  1.00 50.80           N  \nATOM     58  CA  HIS A 893      -6.829 -21.549   0.015  1.00 51.86           C  \nATOM     59  C   HIS A 893      -5.854 -21.664  -1.167  1.00 53.50           C  \nATOM     60  O   HIS A 893      -6.229 -22.208  -2.207  1.00 52.26           O  \nATOM     61  CB  HIS A 893      -7.080 -22.921   0.672  1.00 55.68           C  \nATOM     62  CG  HIS A 893      -8.193 -22.954   1.691  1.00 61.81           C  \nATOM     63  ND1 HIS A 893      -9.452 -23.496   1.413  1.00 65.50           N  \nATOM     64  CD2 HIS A 893      -8.184 -22.495   2.993  1.00 65.19           C  \nATOM     65  CE1 HIS A 893     -10.148 -23.333   2.531  1.00 67.02           C  \nATOM     66  NE2 HIS A 893      -9.446 -22.747   3.501  1.00 67.16           N  \nATOM     67  H   HIS A 893      -8.769 -21.596  -0.844  1.00 50.80           H  \nATOM     68  HA  HIS A 893      -6.383 -20.908   0.779  1.00 51.86           H  \nATOM     69  HB3 HIS A 893      -6.171 -23.242   1.179  1.00 55.68           H  \nATOM     70  HB2 HIS A 893      -7.292 -23.675  -0.087  1.00 55.68           H  \nATOM     71  HD2 HIS A 893      -7.410 -22.016   3.574  1.00 65.19           H  \nATOM     72  HE1 HIS A 893     -11.176 -23.645   2.643  1.00 67.02           H  \nATOM     73  HE2 HIS A 893      -9.776 -22.523   4.430  1.00 67.16           H  \nATOM     74  N   LYS A 894      -4.615 -21.166  -0.990  1.00 50.22           N  \nATOM     75  CA  LYS A 894      -3.603 -21.102  -2.055  1.00 49.02           C  \nATOM     76  C   LYS A 894      -3.093 -22.481  -2.531  1.00 53.09           C  \nATOM     77  O   LYS A 894      -2.649 -22.591  -3.672  1.00 51.68           O  \nATOM     78  CB  LYS A 894      -2.443 -20.167  -1.638  1.00 52.12           C  \nATOM     79  CG  LYS A 894      -1.600 -19.701  -2.841  1.00 67.25           C  \nATOM     80  CD  LYS A 894      -0.571 -18.609  -2.518  1.00 79.06           C  \nATOM     81  CE  LYS A 894       0.105 -18.102  -3.806  1.00 86.18           C  \nATOM     82  NZ  LYS A 894       1.179 -17.132  -3.537  1.00 95.28           N1+\nATOM     83  H   LYS A 894      -4.367 -20.734  -0.111  1.00 50.22           H  \nATOM     84  HA  LYS A 894      -4.096 -20.649  -2.916  1.00 49.02           H  \nATOM     85  HB3 LYS A 894      -1.815 -20.639  -0.881  1.00 52.12           H  \nATOM     86  HB2 LYS A 894      -2.857 -19.278  -1.165  1.00 52.12           H  \nATOM     87  HG3 LYS A 894      -2.267 -19.334  -3.621  1.00 67.25           H  \nATOM     88  HG2 LYS A 894      -1.071 -20.551  -3.272  1.00 67.25           H  \nATOM     89  HD3 LYS A 894       0.177 -19.010  -1.831  1.00 79.06           H  \nATOM     90  HD2 LYS A 894      -1.058 -17.783  -1.996  1.00 79.06           H  \nATOM     91  HE3 LYS A 894      -0.633 -17.631  -4.457  1.00 86.18           H  \nATOM     92  HE2 LYS A 894       0.534 -18.936  -4.361  1.00 86.18           H  \nATOM     93  HZ1 LYS A 894       1.906 -17.573  -2.992  1.00 95.28           H  \nATOM     94  HZ2 LYS A 894       1.567 -16.796  -4.406  1.00 95.28           H  \nATOM     95  HZ3 LYS A 894       0.818 -16.346  -3.009  1.00 95.28           H  \nATOM     96  N   ARG A 895      -3.219 -23.513  -1.678  1.00 51.74           N  \nATOM     97  CA  ARG A 895      -2.936 -24.922  -1.981  1.00 52.94           C  \nATOM     98  C   ARG A 895      -3.820 -25.522  -3.099  1.00 55.31           C  \nATOM     99  O   ARG A 895      -3.417 -26.518  -3.700  1.00 55.61           O  \nATOM    100  CB  ARG A 895      -3.055 -25.742  -0.675  1.00 57.62           C  \nATOM    101  CG  ARG A 895      -4.449 -25.700  -0.018  1.00 70.70           C  \nATOM    102  CD  ARG A 895      -4.551 -26.532   1.269  1.00 85.20           C  \nATOM    103  NE  ARG A 895      -5.826 -26.282   1.965  1.00 97.62           N  \nATOM    104  CZ  ARG A 895      -6.474 -27.088   2.829  1.00116.87           C  \nATOM    105  NH1 ARG A 895      -6.007 -28.297   3.178  1.00109.22           N  \nATOM    106  NH2 ARG A 895      -7.629 -26.662   3.356  1.00103.80           N1+\nATOM    107  H   ARG A 895      -3.593 -23.332  -0.758  1.00 51.74           H  \nATOM    108  HA  ARG A 895      -1.902 -24.980  -2.325  1.00 52.94           H  \nATOM    109  HB3 ARG A 895      -2.322 -25.366   0.041  1.00 57.62           H  \nATOM    110  HB2 ARG A 895      -2.772 -26.779  -0.866  1.00 57.62           H  \nATOM    111  HG3 ARG A 895      -5.142 -26.145  -0.732  1.00 70.70           H  \nATOM    112  HG2 ARG A 895      -4.799 -24.681   0.135  1.00 70.70           H  \nATOM    113  HD3 ARG A 895      -3.681 -26.417   1.916  1.00 85.20           H  \nATOM    114  HD2 ARG A 895      -4.581 -27.578   0.965  1.00 85.20           H  \nATOM    115  HE  ARG A 895      -6.255 -25.393   1.754  1.00 97.62           H  \nATOM    116 HH12 ARG A 895      -6.515 -28.879   3.827  1.00109.22           H  \nATOM    117 HH11 ARG A 895      -5.149 -28.646   2.769  1.00109.22           H  \nATOM    118 HH22 ARG A 895      -8.146 -27.249   3.995  1.00103.80           H  \nATOM    119 HH21 ARG A 895      -8.011 -25.764   3.096  1.00103.80           H  \nATOM    120  N   TYR A 896      -4.993 -24.917  -3.353  1.00 49.98           N  \nATOM    121  CA  TYR A 896      -5.948 -25.341  -4.378  1.00 49.28           C  \nATOM    122  C   TYR A 896      -5.900 -24.464  -5.642  1.00 50.16           C  \nATOM    123  O   TYR A 896      -6.491 -24.862  -6.644  1.00 48.17           O  \nATOM    124  CB  TYR A 896      -7.364 -25.348  -3.770  1.00 51.36           C  \nATOM    125  CG  TYR A 896      -7.587 -26.246  -2.560  1.00 55.87           C  \nATOM    126  CD1 TYR A 896      -6.988 -27.524  -2.475  1.00 59.63           C  \nATOM    127  CD2 TYR A 896      -8.449 -25.818  -1.529  1.00 57.59           C  \nATOM    128  CE1 TYR A 896      -7.261 -28.365  -1.380  1.00 63.33           C  \nATOM    129  CE2 TYR A 896      -8.717 -26.657  -0.430  1.00 61.39           C  \nATOM    130  CZ  TYR A 896      -8.130 -27.935  -0.360  1.00 71.07           C  \nATOM    131  OH  TYR A 896      -8.409 -28.757   0.692  1.00 74.22           O  \nATOM    132  H   TYR A 896      -5.258 -24.104  -2.814  1.00 49.98           H  \nATOM    133  HA  TYR A 896      -5.716 -26.351  -4.712  1.00 49.28           H  \nATOM    134  HB3 TYR A 896      -8.095 -25.639  -4.525  1.00 51.36           H  \nATOM    135  HB2 TYR A 896      -7.618 -24.330  -3.482  1.00 51.36           H  \nATOM    136  HD1 TYR A 896      -6.338 -27.885  -3.257  1.00 59.63           H  \nATOM    137  HD2 TYR A 896      -8.922 -24.848  -1.582  1.00 57.59           H  \nATOM    138  HE1 TYR A 896      -6.810 -29.346  -1.334  1.00 63.33           H  \nATOM    139  HE2 TYR A 896      -9.385 -26.322   0.350  1.00 61.39           H  \nATOM    140  HH  TYR A 896      -7.997 -29.621   0.612  1.00 74.22           H  \nATOM    141  N   LEU A 897      -5.197 -23.318  -5.597  1.00 46.72           N  \nATOM    142  CA  LEU A 897      -5.001 -22.416  -6.732  1.00 44.74           C  \nATOM    143  C   LEU A 897      -3.851 -22.919  -7.625  1.00 48.16           C  \nATOM    144  O   LEU A 897      -2.685 -22.753  -7.264  1.00 48.59           O  \nATOM    145  CB  LEU A 897      -4.714 -20.987  -6.202  1.00 44.20           C  \nATOM    146  CG  LEU A 897      -5.924 -20.222  -5.622  1.00 48.88           C  \nATOM    147  CD1 LEU A 897      -5.488 -18.979  -4.825  1.00 51.85           C  \nATOM    148  CD2 LEU A 897      -6.961 -19.837  -6.697  1.00 47.58           C  \nATOM    149  H   LEU A 897      -4.710 -23.068  -4.748  1.00 46.72           H  \nATOM    150  HA  LEU A 897      -5.907 -22.403  -7.338  1.00 44.74           H  \nATOM    151  HB3 LEU A 897      -4.297 -20.372  -6.995  1.00 44.20           H  \nATOM    152  HB2 LEU A 897      -3.930 -21.049  -5.447  1.00 44.20           H  \nATOM    153  HG  LEU A 897      -6.405 -20.889  -4.908  1.00 48.88           H  \nATOM    154 HD11 LEU A 897      -5.824 -19.067  -3.792  1.00 51.85           H  \nATOM    155 HD12 LEU A 897      -4.406 -18.850  -4.810  1.00 51.85           H  \nATOM    156 HD13 LEU A 897      -5.915 -18.056  -5.220  1.00 51.85           H  \nATOM    157 HD21 LEU A 897      -7.934 -19.654  -6.242  1.00 47.58           H  \nATOM    158 HD22 LEU A 897      -6.673 -18.927  -7.224  1.00 47.58           H  \nATOM    159 HD23 LEU A 897      -7.099 -20.607  -7.454  1.00 47.58           H  \nATOM    160  N   LYS A 898      -4.206 -23.500  -8.784  1.00 44.15           N  \nATOM    161  CA  LYS A 898      -3.275 -23.916  -9.836  1.00 44.11           C  \nATOM    162  C   LYS A 898      -3.159 -22.787 -10.871  1.00 46.50           C  \nATOM    163  O   LYS A 898      -4.147 -22.500 -11.546  1.00 45.72           O  \nATOM    164  CB  LYS A 898      -3.788 -25.205 -10.521  1.00 48.28           C  \nATOM    165  CG  LYS A 898      -3.559 -26.517  -9.749  1.00 70.59           C  \nATOM    166  CD  LYS A 898      -4.421 -26.693  -8.490  1.00 82.83           C  \nATOM    167  CE  LYS A 898      -4.393 -28.144  -7.981  1.00 97.68           C  \nATOM    168  NZ  LYS A 898      -5.185 -28.320  -6.753  1.00107.26           N1+\nATOM    169  H   LYS A 898      -5.188 -23.612  -9.002  1.00 44.15           H  \nATOM    170  HA  LYS A 898      -2.289 -24.117  -9.411  1.00 44.11           H  \nATOM    171  HB3 LYS A 898      -3.252 -25.321 -11.464  1.00 48.28           H  \nATOM    172  HB2 LYS A 898      -4.839 -25.106 -10.797  1.00 48.28           H  \nATOM    173  HG3 LYS A 898      -2.505 -26.604  -9.484  1.00 70.59           H  \nATOM    174  HG2 LYS A 898      -3.761 -27.344 -10.431  1.00 70.59           H  \nATOM    175  HD3 LYS A 898      -5.444 -26.381  -8.702  1.00 82.83           H  \nATOM    176  HD2 LYS A 898      -4.049 -26.031  -7.707  1.00 82.83           H  \nATOM    177  HE3 LYS A 898      -3.368 -28.453  -7.777  1.00 97.68           H  \nATOM    178  HE2 LYS A 898      -4.788 -28.816  -8.743  1.00 97.68           H  \nATOM    179  HZ1 LYS A 898      -4.817 -27.724  -6.025  1.00107.26           H  \nATOM    180  HZ2 LYS A 898      -6.153 -28.082  -6.930  1.00107.26           H  \nATOM    181  HZ3 LYS A 898      -5.133 -29.284  -6.455  1.00107.26           H  \nATOM    182  N   LYS A 899      -1.972 -22.166 -10.979  1.00 42.86           N  \nATOM    183  CA  LYS A 899      -1.712 -21.052 -11.897  1.00 42.35           C  \nATOM    184  C   LYS A 899      -1.708 -21.508 -13.365  1.00 45.75           C  \nATOM    185  O   LYS A 899      -1.008 -22.465 -13.695  1.00 46.24           O  \nATOM    186  CB  LYS A 899      -0.382 -20.375 -11.512  1.00 45.46           C  \nATOM    187  CG  LYS A 899      -0.117 -19.063 -12.271  1.00 54.73           C  \nATOM    188  CD  LYS A 899       1.114 -18.319 -11.740  1.00 64.90           C  \nATOM    189  CE  LYS A 899       1.426 -17.068 -12.571  1.00 74.92           C  \nATOM    190  NZ  LYS A 899       2.594 -16.337 -12.051  1.00 84.51           N1+\nATOM    191  H   LYS A 899      -1.198 -22.461 -10.402  1.00 42.86           H  \nATOM    192  HA  LYS A 899      -2.511 -20.319 -11.766  1.00 42.35           H  \nATOM    193  HB3 LYS A 899       0.450 -21.065 -11.661  1.00 45.46           H  \nATOM    194  HB2 LYS A 899      -0.393 -20.156 -10.446  1.00 45.46           H  \nATOM    195  HG3 LYS A 899      -0.991 -18.414 -12.196  1.00 54.73           H  \nATOM    196  HG2 LYS A 899       0.021 -19.269 -13.333  1.00 54.73           H  \nATOM    197  HD3 LYS A 899       1.973 -18.993 -11.741  1.00 64.90           H  \nATOM    198  HD2 LYS A 899       0.939 -18.039 -10.700  1.00 64.90           H  \nATOM    199  HE3 LYS A 899       0.570 -16.395 -12.579  1.00 74.92           H  \nATOM    200  HE2 LYS A 899       1.622 -17.344 -13.608  1.00 74.92           H  \nATOM    201  HZ1 LYS A 899       2.755 -15.539 -12.651  1.00 84.51           H  \nATOM    202  HZ2 LYS A 899       2.411 -16.027 -11.108  1.00 84.51           H  \nATOM    203  HZ3 LYS A 899       3.406 -16.938 -12.065  1.00 84.51           H  \nATOM    204  N   ILE A 900      -2.473 -20.796 -14.207  1.00 41.32           N  \nATOM    205  CA  ILE A 900      -2.604 -21.076 -15.636  1.00 41.22           C  \nATOM    206  C   ILE A 900      -1.686 -20.142 -16.451  1.00 44.92           C  \nATOM    207  O   ILE A 900      -0.918 -20.640 -17.272  1.00 45.41           O  \nATOM    208  CB  ILE A 900      -4.078 -20.931 -16.133  1.00 44.36           C  \nATOM    209  CG1 ILE A 900      -5.025 -21.868 -15.338  1.00 45.50           C  \nATOM    210  CG2 ILE A 900      -4.224 -21.186 -17.654  1.00 46.17           C  \nATOM    211  CD1 ILE A 900      -6.527 -21.664 -15.604  1.00 56.14           C  \nATOM    212  H   ILE A 900      -3.010 -20.012 -13.856  1.00 41.32           H  \nATOM    213  HA  ILE A 900      -2.293 -22.103 -15.839  1.00 41.22           H  \nATOM    214  HB  ILE A 900      -4.399 -19.906 -15.939  1.00 44.36           H  \nATOM    215 HG13 ILE A 900      -4.869 -21.739 -14.267  1.00 45.50           H  \nATOM    216 HG12 ILE A 900      -4.762 -22.906 -15.546  1.00 45.50           H  \nATOM    217 HG21 ILE A 900      -5.257 -21.102 -17.988  1.00 46.17           H  \nATOM    218 HG22 ILE A 900      -3.655 -20.476 -18.252  1.00 46.17           H  \nATOM    219 HG23 ILE A 900      -3.880 -22.187 -17.914  1.00 46.17           H  \nATOM    220 HD11 ILE A 900      -6.981 -22.574 -15.996  1.00 56.14           H  \nATOM    221 HD12 ILE A 900      -7.057 -21.403 -14.689  1.00 56.14           H  \nATOM    222 HD13 ILE A 900      -6.724 -20.869 -16.318  1.00 56.14           H  \nATOM    223  N   ARG A 901      -1.769 -18.822 -16.202  1.00 40.97           N  \nATOM    224  CA  ARG A 901      -0.997 -17.785 -16.899  1.00 41.13           C  \nATOM    225  C   ARG A 901      -1.153 -16.426 -16.197  1.00 44.46           C  \nATOM    226  O   ARG A 901      -2.028 -16.266 -15.349  1.00 43.07           O  \nATOM    227  CB  ARG A 901      -1.415 -17.689 -18.393  1.00 41.29           C  \nATOM    228  CG  ARG A 901      -2.893 -17.330 -18.655  1.00 52.38           C  \nATOM    229  CD  ARG A 901      -3.184 -17.151 -20.154  1.00 59.92           C  \nATOM    230  NE  ARG A 901      -4.626 -17.047 -20.439  1.00 68.07           N  \nATOM    231  CZ  ARG A 901      -5.470 -18.056 -20.731  1.00 83.41           C  \nATOM    232  NH1 ARG A 901      -5.064 -19.333 -20.802  1.00 64.57           N  \nATOM    233  NH2 ARG A 901      -6.760 -17.779 -20.958  1.00 77.22           N1+\nATOM    234  H   ARG A 901      -2.406 -18.484 -15.493  1.00 40.97           H  \nATOM    235  HA  ARG A 901       0.058 -18.059 -16.843  1.00 41.13           H  \nATOM    236  HB3 ARG A 901      -1.194 -18.631 -18.895  1.00 41.29           H  \nATOM    237  HB2 ARG A 901      -0.782 -16.954 -18.894  1.00 41.29           H  \nATOM    238  HG3 ARG A 901      -3.069 -16.365 -18.179  1.00 52.38           H  \nATOM    239  HG2 ARG A 901      -3.588 -18.026 -18.182  1.00 52.38           H  \nATOM    240  HD3 ARG A 901      -2.658 -17.871 -20.782  1.00 59.92           H  \nATOM    241  HD2 ARG A 901      -2.800 -16.172 -20.446  1.00 59.92           H  \nATOM    242  HE  ARG A 901      -5.007 -16.113 -20.381  1.00 68.07           H  \nATOM    243 HH12 ARG A 901      -5.714 -20.071 -21.028  1.00 64.57           H  \nATOM    244 HH11 ARG A 901      -4.093 -19.560 -20.642  1.00 64.57           H  \nATOM    245 HH22 ARG A 901      -7.411 -18.517 -21.182  1.00 77.22           H  \nATOM    246 HH21 ARG A 901      -7.103 -16.830 -20.897  1.00 77.22           H  \nATOM    247  N   ASP A 902      -0.327 -15.455 -16.617  1.00 41.92           N  \nATOM    248  CA  ASP A 902      -0.466 -14.033 -16.281  1.00 41.86           C  \nATOM    249  C   ASP A 902      -1.534 -13.379 -17.179  1.00 43.46           C  \nATOM    250  O   ASP A 902      -1.649 -13.756 -18.347  1.00 42.68           O  \nATOM    251  CB  ASP A 902       0.870 -13.255 -16.417  1.00 46.10           C  \nATOM    252  CG  ASP A 902       2.075 -13.816 -15.638  1.00 63.12           C  \nATOM    253  OD1 ASP A 902       1.868 -14.510 -14.618  1.00 62.46           O  \nATOM    254  OD2 ASP A 902       3.207 -13.412 -15.980  1.00 75.36           O1-\nATOM    255  H   ASP A 902       0.372 -15.668 -17.314  1.00 41.92           H  \nATOM    256  HA  ASP A 902      -0.795 -13.952 -15.245  1.00 41.86           H  \nATOM    257  HB3 ASP A 902       0.722 -12.227 -16.081  1.00 46.10           H  \nATOM    258  HB2 ASP A 902       1.153 -13.205 -17.470  1.00 46.10           H  \nATOM    259  N   LEU A 903      -2.271 -12.398 -16.628  1.00 39.42           N  \nATOM    260  CA  LEU A 903      -3.273 -11.609 -17.359  1.00 38.97           C  \nATOM    261  C   LEU A 903      -2.810 -10.164 -17.625  1.00 45.51           C  \nATOM    262  O   LEU A 903      -3.374  -9.534 -18.520  1.00 47.25           O  \nATOM    263  CB  LEU A 903      -4.619 -11.607 -16.593  1.00 37.74           C  \nATOM    264  CG  LEU A 903      -5.296 -12.990 -16.448  1.00 40.14           C  \nATOM    265  CD1 LEU A 903      -6.586 -12.886 -15.603  1.00 39.42           C  \nATOM    266  CD2 LEU A 903      -5.545 -13.682 -17.807  1.00 39.39           C  \nATOM    267  H   LEU A 903      -2.124 -12.142 -15.660  1.00 39.42           H  \nATOM    268  HA  LEU A 903      -3.440 -12.040 -18.346  1.00 38.97           H  \nATOM    269  HB3 LEU A 903      -5.320 -10.938 -17.097  1.00 37.74           H  \nATOM    270  HB2 LEU A 903      -4.461 -11.178 -15.603  1.00 37.74           H  \nATOM    271  HG  LEU A 903      -4.609 -13.626 -15.891  1.00 40.14           H  \nATOM    272 HD11 LEU A 903      -7.473 -13.231 -16.134  1.00 39.42           H  \nATOM    273 HD12 LEU A 903      -6.505 -13.482 -14.694  1.00 39.42           H  \nATOM    274 HD13 LEU A 903      -6.792 -11.860 -15.296  1.00 39.42           H  \nATOM    275 HD21 LEU A 903      -6.525 -14.154 -17.871  1.00 39.39           H  \nATOM    276 HD22 LEU A 903      -5.480 -12.984 -18.642  1.00 39.39           H  \nATOM    277 HD23 LEU A 903      -4.806 -14.466 -17.979  1.00 39.39           H  \nATOM    278  N   GLY A 904      -1.802  -9.669 -16.884  1.00 41.87           N  \nATOM    279  CA  GLY A 904      -1.253  -8.324 -17.054  1.00 43.49           C  \nATOM    280  C   GLY A 904      -1.005  -7.670 -15.690  1.00 48.38           C  \nATOM    281  O   GLY A 904      -1.010  -8.335 -14.653  1.00 47.59           O  \nATOM    282  H   GLY A 904      -1.396 -10.235 -16.152  1.00 41.87           H  \nATOM    283  HA3 GLY A 904      -1.915  -7.681 -17.638  1.00 43.49           H  \nATOM    284  HA2 GLY A 904      -0.308  -8.393 -17.594  1.00 43.49           H  \nATOM    285  N   GLU A 905      -0.757  -6.351 -15.724  1.00 46.73           N  \nATOM    286  CA  GLU A 905      -0.417  -5.520 -14.569  1.00 47.46           C  \nATOM    287  C   GLU A 905      -1.527  -4.496 -14.305  1.00 51.67           C  \nATOM    288  O   GLU A 905      -1.856  -3.713 -15.197  1.00 51.35           O  \nATOM    289  CB  GLU A 905       0.926  -4.797 -14.834  1.00 51.27           C  \nATOM    290  CG  GLU A 905       2.146  -5.732 -15.018  1.00 66.56           C  \nATOM    291  CD  GLU A 905       2.576  -6.520 -13.769  1.00 94.70           C  \nATOM    292  OE1 GLU A 905       2.395  -6.005 -12.643  1.00 96.75           O  \nATOM    293  OE2 GLU A 905       3.103  -7.639 -13.964  1.00 86.75           O1-\nATOM    294  H   GLU A 905      -0.773  -5.869 -16.611  1.00 46.73           H  \nATOM    295  HA  GLU A 905      -0.307  -6.133 -13.677  1.00 47.46           H  \nATOM    296  HB3 GLU A 905       1.125  -4.080 -14.036  1.00 51.27           H  \nATOM    297  HB2 GLU A 905       0.832  -4.191 -15.737  1.00 51.27           H  \nATOM    298  HG3 GLU A 905       3.002  -5.131 -15.326  1.00 66.56           H  \nATOM    299  HG2 GLU A 905       1.960  -6.422 -15.843  1.00 66.56           H  \nATOM    300  N   GLY A 906      -2.038  -4.492 -13.063  1.00 48.81           N  \nATOM    301  CA  GLY A 906      -2.898  -3.437 -12.529  1.00 50.44           C  \nATOM    302  C   GLY A 906      -2.033  -2.425 -11.758  1.00 59.13           C  \nATOM    303  O   GLY A 906      -0.802  -2.468 -11.826  1.00 59.62           O  \nATOM    304  H   GLY A 906      -1.693  -5.164 -12.391  1.00 48.81           H  \nATOM    305  HA3 GLY A 906      -3.632  -3.885 -11.863  1.00 50.44           H  \nATOM    306  HA2 GLY A 906      -3.453  -2.925 -13.317  1.00 50.44           H  \nATOM    307  N   HIS A 907      -2.685  -1.495 -11.037  1.00 58.87           N  \nATOM    308  CA  HIS A 907      -2.024  -0.392 -10.326  1.00 61.58           C  \nATOM    309  C   HIS A 907      -1.031  -0.830  -9.225  1.00 65.75           C  \nATOM    310  O   HIS A 907       0.140  -0.461  -9.313  1.00 67.01           O  \nATOM    311  CB  HIS A 907      -3.071   0.615  -9.806  1.00 64.07           C  \nATOM    312  CG  HIS A 907      -2.464   1.855  -9.191  1.00 71.10           C  \nATOM    313  ND1 HIS A 907      -2.421   2.072  -7.824  1.00 74.01           N  \nATOM    314  CD2 HIS A 907      -1.844   2.946  -9.759  1.00 75.68           C  \nATOM    315  CE1 HIS A 907      -1.781   3.227  -7.629  1.00 76.67           C  \nATOM    316  NE2 HIS A 907      -1.401   3.813  -8.758  1.00 78.22           N  \nATOM    317  H   HIS A 907      -3.695  -1.465 -11.060  1.00 58.87           H  \nATOM    318  HA  HIS A 907      -1.436   0.136 -11.080  1.00 61.58           H  \nATOM    319  HB3 HIS A 907      -3.722   0.137  -9.074  1.00 64.07           H  \nATOM    320  HB2 HIS A 907      -3.717   0.935 -10.625  1.00 64.07           H  \nATOM    321  HD1 HIS A 907      -2.801   1.473  -7.103  1.00 74.01           H  \nATOM    322  HD2 HIS A 907      -1.664   3.165 -10.801  1.00 75.68           H  \nATOM    323  HE1 HIS A 907      -1.598   3.647  -6.651  1.00 76.67           H  \nATOM    324  N   PHE A 908      -1.500  -1.593  -8.220  1.00 61.05           N  \nATOM    325  CA  PHE A 908      -0.670  -2.041  -7.090  1.00 61.65           C  \nATOM    326  C   PHE A 908       0.158  -3.312  -7.352  1.00 63.63           C  \nATOM    327  O   PHE A 908       1.051  -3.603  -6.555  1.00 65.29           O  \nATOM    328  CB  PHE A 908      -1.529  -2.186  -5.816  1.00 63.30           C  \nATOM    329  CG  PHE A 908      -2.026  -0.870  -5.245  1.00 67.27           C  \nATOM    330  CD1 PHE A 908      -1.113   0.118  -4.816  1.00 73.63           C  \nATOM    331  CD2 PHE A 908      -3.407  -0.616  -5.143  1.00 68.80           C  \nATOM    332  CE1 PHE A 908      -1.582   1.333  -4.333  1.00 76.93           C  \nATOM    333  CE2 PHE A 908      -3.854   0.595  -4.639  1.00 73.69           C  \nATOM    334  CZ  PHE A 908      -2.947   1.573  -4.254  1.00 75.01           C  \nATOM    335  H   PHE A 908      -2.475  -1.851  -8.194  1.00 61.05           H  \nATOM    336  HA  PHE A 908       0.075  -1.268  -6.889  1.00 61.65           H  \nATOM    337  HB3 PHE A 908      -0.967  -2.687  -5.026  1.00 63.30           H  \nATOM    338  HB2 PHE A 908      -2.382  -2.833  -6.027  1.00 63.30           H  \nATOM    339  HD1 PHE A 908      -0.050  -0.062  -4.872  1.00 73.63           H  \nATOM    340  HD2 PHE A 908      -4.123  -1.361  -5.449  1.00 68.80           H  \nATOM    341  HE1 PHE A 908      -0.886   2.096  -4.018  1.00 76.93           H  \nATOM    342  HE2 PHE A 908      -4.914   0.778  -4.550  1.00 73.69           H  \nATOM    343  HZ  PHE A 908      -3.306   2.520  -3.880  1.00 75.01           H  \nATOM    344  N   GLY A 909      -0.118  -4.030  -8.451  1.00 56.05           N  \nATOM    345  CA  GLY A 909       0.641  -5.220  -8.813  1.00 53.59           C  \nATOM    346  C   GLY A 909      -0.135  -6.069  -9.822  1.00 52.99           C  \nATOM    347  O   GLY A 909      -1.181  -5.674 -10.342  1.00 51.95           O  \nATOM    348  H   GLY A 909      -0.847  -3.737  -9.086  1.00 56.05           H  \nATOM    349  HA3 GLY A 909       0.870  -5.821  -7.931  1.00 53.59           H  \nATOM    350  HA2 GLY A 909       1.590  -4.917  -9.258  1.00 53.59           H  \nATOM    351  N   LYS A 910       0.446  -7.242 -10.114  1.00 47.39           N  \nATOM    352  CA  LYS A 910       0.039  -8.174 -11.161  1.00 44.86           C  \nATOM    353  C   LYS A 910      -1.302  -8.879 -10.907  1.00 43.37           C  \nATOM    354  O   LYS A 910      -1.655  -9.140  -9.759  1.00 42.02           O  \nATOM    355  CB  LYS A 910       1.174  -9.198 -11.371  1.00 48.19           C  \nATOM    356  CG  LYS A 910       1.463 -10.135 -10.177  1.00 70.18           C  \nATOM    357  CD  LYS A 910       2.696 -11.044 -10.355  1.00 80.07           C  \nATOM    358  CE  LYS A 910       2.500 -12.254 -11.290  1.00 90.27           C  \nATOM    359  NZ  LYS A 910       2.509 -11.895 -12.720  1.00 99.37           N1+\nATOM    360  H   LYS A 910       1.299  -7.487  -9.634  1.00 47.39           H  \nATOM    361  HA  LYS A 910      -0.058  -7.598 -12.079  1.00 44.86           H  \nATOM    362  HB3 LYS A 910       2.088  -8.663 -11.624  1.00 48.19           H  \nATOM    363  HB2 LYS A 910       0.918  -9.787 -12.250  1.00 48.19           H  \nATOM    364  HG3 LYS A 910       0.595 -10.759  -9.970  1.00 70.18           H  \nATOM    365  HG2 LYS A 910       1.611  -9.535  -9.280  1.00 70.18           H  \nATOM    366  HD3 LYS A 910       2.986 -11.415  -9.371  1.00 80.07           H  \nATOM    367  HD2 LYS A 910       3.543 -10.445 -10.692  1.00 80.07           H  \nATOM    368  HE3 LYS A 910       1.575 -12.777 -11.046  1.00 90.27           H  \nATOM    369  HE2 LYS A 910       3.311 -12.965 -11.133  1.00 90.27           H  \nATOM    370  HZ1 LYS A 910       1.759 -11.248 -12.914  1.00 99.37           H  \nATOM    371  HZ2 LYS A 910       3.388 -11.459 -12.961  1.00 99.37           H  \nATOM    372  HZ3 LYS A 910       2.383 -12.725 -13.287  1.00 99.37           H  \nATOM    373  N   VAL A 911      -1.971  -9.225 -12.016  1.00 37.15           N  \nATOM    374  CA  VAL A 911      -3.138 -10.101 -12.065  1.00 34.94           C  \nATOM    375  C   VAL A 911      -2.732 -11.374 -12.827  1.00 36.97           C  \nATOM    376  O   VAL A 911      -2.030 -11.287 -13.838  1.00 35.74           O  \nATOM    377  CB  VAL A 911      -4.323  -9.449 -12.832  1.00 38.64           C  \nATOM    378  CG1 VAL A 911      -5.604 -10.312 -12.836  1.00 37.50           C  \nATOM    379  CG2 VAL A 911      -4.665  -8.046 -12.301  1.00 39.45           C  \nATOM    380  H   VAL A 911      -1.594  -8.964 -12.919  1.00 37.15           H  \nATOM    381  HA  VAL A 911      -3.461 -10.380 -11.067  1.00 34.94           H  \nATOM    382  HB  VAL A 911      -4.013  -9.331 -13.869  1.00 38.64           H  \nATOM    383 HG11 VAL A 911      -6.413  -9.808 -13.365  1.00 37.50           H  \nATOM    384 HG12 VAL A 911      -5.459 -11.273 -13.327  1.00 37.50           H  \nATOM    385 HG13 VAL A 911      -5.949 -10.509 -11.820  1.00 37.50           H  \nATOM    386 HG21 VAL A 911      -5.489  -7.603 -12.859  1.00 39.45           H  \nATOM    387 HG22 VAL A 911      -4.967  -8.091 -11.259  1.00 39.45           H  \nATOM    388 HG23 VAL A 911      -3.822  -7.359 -12.381  1.00 39.45           H  \nATOM    389  N   SER A 912      -3.188 -12.530 -12.325  1.00 32.82           N  \nATOM    390  CA  SER A 912      -2.920 -13.839 -12.909  1.00 32.44           C  \nATOM    391  C   SER A 912      -4.187 -14.693 -12.861  1.00 36.01           C  \nATOM    392  O   SER A 912      -4.950 -14.617 -11.899  1.00 34.87           O  \nATOM    393  CB  SER A 912      -1.780 -14.527 -12.136  1.00 36.04           C  \nATOM    394  OG  SER A 912      -0.549 -13.884 -12.379  1.00 45.71           O  \nATOM    395  H   SER A 912      -3.765 -12.527 -11.494  1.00 32.82           H  \nATOM    396  HA  SER A 912      -2.642 -13.737 -13.958  1.00 32.44           H  \nATOM    397  HB3 SER A 912      -1.683 -15.572 -12.436  1.00 36.04           H  \nATOM    398  HB2 SER A 912      -1.975 -14.516 -11.066  1.00 36.04           H  \nATOM    399  HG  SER A 912      -0.594 -13.012 -11.977  1.00 45.71           H  \nATOM    400  N   LEU A 913      -4.360 -15.518 -13.900  1.00 32.94           N  \nATOM    401  CA  LEU A 913      -5.421 -16.505 -14.016  1.00 32.73           C  \nATOM    402  C   LEU A 913      -5.002 -17.794 -13.295  1.00 36.98           C  \nATOM    403  O   LEU A 913      -3.924 -18.324 -13.568  1.00 35.71           O  \nATOM    404  CB  LEU A 913      -5.708 -16.725 -15.517  1.00 33.31           C  \nATOM    405  CG  LEU A 913      -6.770 -17.793 -15.857  1.00 38.67           C  \nATOM    406  CD1 LEU A 913      -8.125 -17.524 -15.168  1.00 39.26           C  \nATOM    407  CD2 LEU A 913      -6.897 -17.945 -17.387  1.00 40.96           C  \nATOM    408  H   LEU A 913      -3.653 -15.554 -14.623  1.00 32.94           H  \nATOM    409  HA  LEU A 913      -6.319 -16.103 -13.545  1.00 32.73           H  \nATOM    410  HB3 LEU A 913      -4.776 -16.989 -16.019  1.00 33.31           H  \nATOM    411  HB2 LEU A 913      -6.024 -15.778 -15.951  1.00 33.31           H  \nATOM    412  HG  LEU A 913      -6.411 -18.748 -15.479  1.00 38.67           H  \nATOM    413 HD11 LEU A 913      -8.969 -17.675 -15.835  1.00 39.26           H  \nATOM    414 HD12 LEU A 913      -8.270 -18.198 -14.324  1.00 39.26           H  \nATOM    415 HD13 LEU A 913      -8.203 -16.505 -14.788  1.00 39.26           H  \nATOM    416 HD21 LEU A 913      -6.656 -18.960 -17.702  1.00 40.96           H  \nATOM    417 HD22 LEU A 913      -7.896 -17.721 -17.755  1.00 40.96           H  \nATOM    418 HD23 LEU A 913      -6.216 -17.279 -17.917  1.00 40.96           H  \nATOM    419  N   TYR A 914      -5.887 -18.270 -12.410  1.00 34.34           N  \nATOM    420  CA  TYR A 914      -5.761 -19.522 -11.672  1.00 35.26           C  \nATOM    421  C   TYR A 914      -7.035 -20.352 -11.864  1.00 40.97           C  \nATOM    422  O   TYR A 914      -8.122 -19.790 -11.984  1.00 41.41           O  \nATOM    423  CB  TYR A 914      -5.585 -19.230 -10.167  1.00 36.25           C  \nATOM    424  CG  TYR A 914      -4.258 -18.632  -9.738  1.00 37.55           C  \nATOM    425  CD1 TYR A 914      -3.251 -19.461  -9.207  1.00 41.10           C  \nATOM    426  CD2 TYR A 914      -4.046 -17.242  -9.800  1.00 37.73           C  \nATOM    427  CE1 TYR A 914      -2.054 -18.909  -8.717  1.00 42.72           C  \nATOM    428  CE2 TYR A 914      -2.845 -16.686  -9.315  1.00 39.24           C  \nATOM    429  CZ  TYR A 914      -1.847 -17.519  -8.776  1.00 49.59           C  \nATOM    430  OH  TYR A 914      -0.685 -16.979  -8.308  1.00 54.45           O  \nATOM    431  H   TYR A 914      -6.749 -17.762 -12.251  1.00 34.34           H  \nATOM    432  HA  TYR A 914      -4.909 -20.094 -12.040  1.00 35.26           H  \nATOM    433  HB3 TYR A 914      -5.705 -20.158  -9.605  1.00 36.25           H  \nATOM    434  HB2 TYR A 914      -6.386 -18.578  -9.817  1.00 36.25           H  \nATOM    435  HD1 TYR A 914      -3.405 -20.526  -9.149  1.00 41.10           H  \nATOM    436  HD2 TYR A 914      -4.816 -16.599 -10.198  1.00 37.73           H  \nATOM    437  HE1 TYR A 914      -1.299 -19.558  -8.297  1.00 42.72           H  \nATOM    438  HE2 TYR A 914      -2.701 -15.617  -9.335  1.00 39.24           H  \nATOM    439  HH  TYR A 914      -0.088 -17.635  -7.941  1.00 54.45           H  \nATOM    440  N   CYS A 915      -6.871 -21.680 -11.807  1.00 39.05           N  \nATOM    441  CA  CYS A 915      -7.950 -22.649 -11.663  1.00 40.20           C  \nATOM    442  C   CYS A 915      -7.988 -23.052 -10.181  1.00 43.77           C  \nATOM    443  O   CYS A 915      -7.093 -23.769  -9.728  1.00 43.29           O  \nATOM    444  CB  CYS A 915      -7.745 -23.856 -12.604  1.00 41.99           C  \nATOM    445  SG  CYS A 915      -9.062 -25.098 -12.432  1.00 48.59           S  \nATOM    446  H   CYS A 915      -5.935 -22.054 -11.712  1.00 39.05           H  \nATOM    447  HA  CYS A 915      -8.905 -22.191 -11.927  1.00 40.20           H  \nATOM    448  HB3 CYS A 915      -6.786 -24.339 -12.412  1.00 41.99           H  \nATOM    449  HB2 CYS A 915      -7.727 -23.525 -13.642  1.00 41.99           H  \nATOM    450  HG  CYS A 915     -10.049 -24.342 -12.923  1.00 48.59           H  \nATOM    451  N   TYR A 916      -9.007 -22.565  -9.452  1.00 39.62           N  \nATOM    452  CA  TYR A 916      -9.266 -22.950  -8.066  1.00 39.96           C  \nATOM    453  C   TYR A 916      -9.955 -24.317  -8.054  1.00 45.20           C  \nATOM    454  O   TYR A 916     -11.103 -24.411  -8.485  1.00 45.42           O  \nATOM    455  CB  TYR A 916     -10.123 -21.883  -7.362  1.00 40.18           C  \nATOM    456  CG  TYR A 916     -10.338 -22.159  -5.882  1.00 41.11           C  \nATOM    457  CD1 TYR A 916      -9.235 -22.141  -5.005  1.00 41.72           C  \nATOM    458  CD2 TYR A 916     -11.625 -22.431  -5.372  1.00 43.06           C  \nATOM    459  CE1 TYR A 916      -9.421 -22.339  -3.626  1.00 42.69           C  \nATOM    460  CE2 TYR A 916     -11.807 -22.654  -3.991  1.00 44.62           C  \nATOM    461  CZ  TYR A 916     -10.704 -22.596  -3.116  1.00 47.56           C  \nATOM    462  OH  TYR A 916     -10.866 -22.784  -1.774  1.00 49.11           O  \nATOM    463  H   TYR A 916      -9.717 -21.999  -9.899  1.00 39.62           H  \nATOM    464  HA  TYR A 916      -8.313 -23.020  -7.541  1.00 39.96           H  \nATOM    465  HB3 TYR A 916     -11.089 -21.777  -7.861  1.00 40.18           H  \nATOM    466  HB2 TYR A 916      -9.641 -20.909  -7.450  1.00 40.18           H  \nATOM    467  HD1 TYR A 916      -8.244 -21.965  -5.390  1.00 41.72           H  \nATOM    468  HD2 TYR A 916     -12.478 -22.459  -6.035  1.00 43.06           H  \nATOM    469  HE1 TYR A 916      -8.578 -22.297  -2.958  1.00 42.69           H  \nATOM    470  HE2 TYR A 916     -12.797 -22.853  -3.609  1.00 44.62           H  \nATOM    471  HH  TYR A 916     -11.780 -22.931  -1.519  1.00 49.11           H  \nATOM    472  N   ASP A 917      -9.224 -25.343  -7.600  1.00 46.60           N  \nATOM    473  CA  ASP A 917      -9.548 -26.742  -7.857  1.00 48.33           C  \nATOM    474  C   ASP A 917      -9.310 -27.589  -6.586  1.00 54.57           C  \nATOM    475  O   ASP A 917      -8.280 -28.261  -6.507  1.00 54.85           O  \nATOM    476  CB  ASP A 917      -8.720 -27.202  -9.088  1.00 50.11           C  \nATOM    477  CG  ASP A 917      -8.948 -28.619  -9.626  1.00 62.07           C  \nATOM    478  OD1 ASP A 917     -10.074 -29.144  -9.481  1.00 63.23           O  \nATOM    479  OD2 ASP A 917      -8.018 -29.099 -10.308  1.00 69.60           O1-\nATOM    480  H   ASP A 917      -8.291 -25.168  -7.248  1.00 46.60           H  \nATOM    481  HA  ASP A 917     -10.604 -26.840  -8.110  1.00 48.33           H  \nATOM    482  HB3 ASP A 917      -7.660 -27.061  -8.876  1.00 50.11           H  \nATOM    483  HB2 ASP A 917      -8.925 -26.518  -9.911  1.00 50.11           H  \nATOM    484  N   PRO A 918     -10.233 -27.531  -5.592  1.00 52.47           N  \nATOM    485  CA  PRO A 918     -10.097 -28.298  -4.337  1.00 54.47           C  \nATOM    486  C   PRO A 918     -10.108 -29.832  -4.468  1.00 61.35           C  \nATOM    487  O   PRO A 918      -9.390 -30.493  -3.718  1.00 62.40           O  \nATOM    488  CB  PRO A 918     -11.249 -27.795  -3.449  1.00 56.45           C  \nATOM    489  CG  PRO A 918     -11.619 -26.442  -4.028  1.00 58.90           C  \nATOM    490  CD  PRO A 918     -11.398 -26.646  -5.519  1.00 53.43           C  \nATOM    491  HA  PRO A 918      -9.154 -28.002  -3.890  1.00 54.47           H  \nATOM    492  HB3 PRO A 918     -10.970 -27.730  -2.397  1.00 56.45           H  \nATOM    493  HB2 PRO A 918     -12.112 -28.460  -3.518  1.00 56.45           H  \nATOM    494  HG3 PRO A 918     -10.924 -25.686  -3.658  1.00 58.90           H  \nATOM    495  HG2 PRO A 918     -12.631 -26.122  -3.778  1.00 58.90           H  \nATOM    496  HD2 PRO A 918     -12.253 -27.150  -5.969  1.00 53.43           H  \nATOM    497  HD3 PRO A 918     -11.278 -25.684  -6.008  1.00 53.43           H  \nATOM    498  N   THR A 919     -10.909 -30.361  -5.407  1.00 59.02           N  \nATOM    499  CA  THR A 919     -11.072 -31.799  -5.649  1.00 61.06           C  \nATOM    500  C   THR A 919      -9.985 -32.394  -6.578  1.00 66.39           C  \nATOM    501  O   THR A 919      -9.864 -33.618  -6.624  1.00 67.71           O  \nATOM    502  CB  THR A 919     -12.460 -32.093  -6.275  1.00 69.24           C  \nATOM    503  OG1 THR A 919     -12.585 -31.469  -7.533  1.00 68.64           O  \nATOM    504  CG2 THR A 919     -13.638 -31.637  -5.400  1.00 68.24           C  \nATOM    505  H   THR A 919     -11.466 -29.756  -5.994  1.00 59.02           H  \nATOM    506  HA  THR A 919     -11.011 -32.326  -4.695  1.00 61.06           H  \nATOM    507  HB  THR A 919     -12.561 -33.168  -6.437  1.00 69.24           H  \nATOM    508  HG1 THR A 919     -13.251 -31.932  -8.052  1.00 68.64           H  \nATOM    509 HG21 THR A 919     -14.591 -31.908  -5.855  1.00 68.24           H  \nATOM    510 HG22 THR A 919     -13.598 -32.106  -4.417  1.00 68.24           H  \nATOM    511 HG23 THR A 919     -13.640 -30.556  -5.253  1.00 68.24           H  \nATOM    512  N   ASN A 920      -9.199 -31.539  -7.261  1.00 62.42           N  \nATOM    513  CA  ASN A 920      -8.037 -31.885  -8.094  1.00 62.48           C  \nATOM    514  C   ASN A 920      -8.379 -32.616  -9.418  1.00 68.30           C  \nATOM    515  O   ASN A 920      -7.483 -33.225 -10.005  1.00 68.75           O  \nATOM    516  CB  ASN A 920      -6.961 -32.649  -7.260  1.00 64.50           C  \nATOM    517  CG  ASN A 920      -5.483 -32.372  -7.591  1.00 90.28           C  \nATOM    518  OD1 ASN A 920      -4.611 -32.755  -6.815  1.00 80.74           O  \nATOM    519  ND2 ASN A 920      -5.167 -31.729  -8.718  1.00 86.67           N  \nATOM    520  H   ASN A 920      -9.390 -30.550  -7.183  1.00 62.42           H  \nATOM    521  HA  ASN A 920      -7.608 -30.945  -8.433  1.00 62.48           H  \nATOM    522  HB3 ASN A 920      -7.149 -33.724  -7.262  1.00 64.50           H  \nATOM    523  HB2 ASN A 920      -7.058 -32.342  -6.217  1.00 64.50           H  \nATOM    524 HD22 ASN A 920      -4.198 -31.571  -8.954  1.00 86.67           H  \nATOM    525 HD21 ASN A 920      -5.888 -31.454  -9.372  1.00 86.67           H  \nATOM    526  N   ASP A 921      -9.638 -32.539  -9.885  1.00 65.11           N  \nATOM    527  CA  ASP A 921     -10.110 -33.196 -11.116  1.00 65.45           C  \nATOM    528  C   ASP A 921      -9.985 -32.313 -12.380  1.00 68.10           C  \nATOM    529  O   ASP A 921     -10.142 -32.837 -13.482  1.00 68.54           O  \nATOM    530  CB  ASP A 921     -11.542 -33.785 -10.972  1.00 68.72           C  \nATOM    531  CG  ASP A 921     -12.662 -32.858 -10.464  1.00 75.04           C  \nATOM    532  OD1 ASP A 921     -12.517 -31.619 -10.549  1.00 72.94           O  \nATOM    533  OD2 ASP A 921     -13.716 -33.411 -10.080  1.00 81.22           O1-\nATOM    534  H   ASP A 921     -10.326 -31.995  -9.382  1.00 65.11           H  \nATOM    535  HA  ASP A 921      -9.464 -34.056 -11.306  1.00 65.45           H  \nATOM    536  HB3 ASP A 921     -11.484 -34.629 -10.282  1.00 68.72           H  \nATOM    537  HB2 ASP A 921     -11.865 -34.214 -11.922  1.00 68.72           H  \nATOM    538  N   GLY A 922      -9.711 -31.008 -12.210  1.00 62.38           N  \nATOM    539  CA  GLY A 922      -9.551 -30.041 -13.297  1.00 60.09           C  \nATOM    540  C   GLY A 922     -10.863 -29.330 -13.668  1.00 63.42           C  \nATOM    541  O   GLY A 922     -10.834 -28.480 -14.557  1.00 62.74           O  \nATOM    542  H   GLY A 922      -9.599 -30.648 -11.270  1.00 62.38           H  \nATOM    543  HA3 GLY A 922      -9.136 -30.518 -14.186  1.00 60.09           H  \nATOM    544  HA2 GLY A 922      -8.828 -29.287 -12.986  1.00 60.09           H  \nATOM    545  N   THR A 923     -11.995 -29.645 -13.011  1.00 59.47           N  \nATOM    546  CA  THR A 923     -13.310 -29.037 -13.264  1.00 58.79           C  \nATOM    547  C   THR A 923     -13.573 -27.766 -12.417  1.00 58.95           C  \nATOM    548  O   THR A 923     -14.667 -27.206 -12.506  1.00 58.00           O  \nATOM    549  CB  THR A 923     -14.472 -30.055 -13.053  1.00 71.45           C  \nATOM    550  OG1 THR A 923     -14.846 -30.240 -11.699  1.00 74.26           O  \nATOM    551  CG2 THR A 923     -14.234 -31.420 -13.720  1.00 71.82           C  \nATOM    552  H   THR A 923     -11.966 -30.341 -12.275  1.00 59.47           H  \nATOM    553  HA  THR A 923     -13.355 -28.722 -14.308  1.00 58.79           H  \nATOM    554  HB  THR A 923     -15.355 -29.634 -13.535  1.00 71.45           H  \nATOM    555  HG1 THR A 923     -14.145 -30.727 -11.249  1.00 74.26           H  \nATOM    556 HG21 THR A 923     -15.102 -32.069 -13.603  1.00 71.82           H  \nATOM    557 HG22 THR A 923     -14.051 -31.305 -14.788  1.00 71.82           H  \nATOM    558 HG23 THR A 923     -13.377 -31.943 -13.294  1.00 71.82           H  \nATOM    559  N   GLY A 924     -12.571 -27.323 -11.637  1.00 53.95           N  \nATOM    560  CA  GLY A 924     -12.623 -26.151 -10.763  1.00 52.08           C  \nATOM    561  C   GLY A 924     -12.788 -24.830 -11.535  1.00 53.45           C  \nATOM    562  O   GLY A 924     -12.426 -24.728 -12.708  1.00 52.18           O  \nATOM    563  H   GLY A 924     -11.706 -27.844 -11.632  1.00 53.95           H  \nATOM    564  HA3 GLY A 924     -11.683 -26.125 -10.215  1.00 52.08           H  \nATOM    565  HA2 GLY A 924     -13.425 -26.270 -10.033  1.00 52.08           H  \nATOM    566  N   GLU A 925     -13.324 -23.810 -10.844  1.00 49.00           N  \nATOM    567  CA  GLU A 925     -13.602 -22.474 -11.376  1.00 47.60           C  \nATOM    568  C   GLU A 925     -12.333 -21.684 -11.730  1.00 48.02           C  \nATOM    569  O   GLU A 925     -11.391 -21.647 -10.938  1.00 45.98           O  \nATOM    570  CB  GLU A 925     -14.441 -21.680 -10.347  1.00 49.51           C  \nATOM    571  CG  GLU A 925     -15.856 -22.247 -10.096  1.00 66.63           C  \nATOM    572  CD  GLU A 925     -16.796 -22.122 -11.304  1.00 94.52           C  \nATOM    573  OE1 GLU A 925     -16.972 -20.979 -11.784  1.00 89.72           O  \nATOM    574  OE2 GLU A 925     -17.331 -23.170 -11.725  1.00 93.17           O1-\nATOM    575  H   GLU A 925     -13.590 -23.957  -9.880  1.00 49.00           H  \nATOM    576  HA  GLU A 925     -14.185 -22.600 -12.290  1.00 47.60           H  \nATOM    577  HB3 GLU A 925     -14.507 -20.633 -10.646  1.00 49.51           H  \nATOM    578  HB2 GLU A 925     -13.910 -21.669  -9.394  1.00 49.51           H  \nATOM    579  HG3 GLU A 925     -16.312 -21.709  -9.264  1.00 66.63           H  \nATOM    580  HG2 GLU A 925     -15.791 -23.287  -9.773  1.00 66.63           H  \nATOM    581  N   MET A 926     -12.376 -21.016 -12.893  1.00 43.85           N  \nATOM    582  CA  MET A 926     -11.372 -20.052 -13.336  1.00 42.46           C  \nATOM    583  C   MET A 926     -11.611 -18.704 -12.636  1.00 43.50           C  \nATOM    584  O   MET A 926     -12.731 -18.192 -12.664  1.00 43.72           O  \nATOM    585  CB  MET A 926     -11.429 -19.907 -14.871  1.00 44.66           C  \nATOM    586  CG  MET A 926     -11.085 -21.206 -15.622  1.00 50.18           C  \nATOM    587  SD  MET A 926     -11.210 -21.107 -17.430  1.00 55.18           S  \nATOM    588  CE  MET A 926      -9.740 -20.126 -17.815  1.00 50.66           C  \nATOM    589  H   MET A 926     -13.209 -21.073 -13.464  1.00 43.85           H  \nATOM    590  HA  MET A 926     -10.384 -20.428 -13.070  1.00 42.46           H  \nATOM    591  HB3 MET A 926     -10.737 -19.124 -15.180  1.00 44.66           H  \nATOM    592  HB2 MET A 926     -12.419 -19.565 -15.178  1.00 44.66           H  \nATOM    593  HG3 MET A 926     -11.755 -22.005 -15.304  1.00 50.18           H  \nATOM    594  HG2 MET A 926     -10.078 -21.532 -15.362  1.00 50.18           H  \nATOM    595  HE1 MET A 926      -9.634 -20.012 -18.894  1.00 50.66           H  \nATOM    596  HE2 MET A 926      -9.824 -19.135 -17.376  1.00 50.66           H  \nATOM    597  HE3 MET A 926      -8.844 -20.609 -17.427  1.00 50.66           H  \nATOM    598  N   VAL A 927     -10.551 -18.168 -12.017  1.00 36.95           N  \nATOM    599  CA  VAL A 927     -10.570 -16.927 -11.247  1.00 34.96           C  \nATOM    600  C   VAL A 927      -9.331 -16.077 -11.575  1.00 36.30           C  \nATOM    601  O   VAL A 927      -8.232 -16.612 -11.722  1.00 35.86           O  \nATOM    602  CB  VAL A 927     -10.610 -17.194  -9.711  1.00 39.31           C  \nATOM    603  CG1 VAL A 927     -11.992 -17.683  -9.251  1.00 40.52           C  \nATOM    604  CG2 VAL A 927      -9.507 -18.134  -9.180  1.00 39.38           C  \nATOM    605  H   VAL A 927      -9.662 -18.654 -12.039  1.00 36.95           H  \nATOM    606  HA  VAL A 927     -11.448 -16.339 -11.522  1.00 34.96           H  \nATOM    607  HB  VAL A 927     -10.456 -16.236  -9.212  1.00 39.31           H  \nATOM    608 HG11 VAL A 927     -12.038 -17.771  -8.165  1.00 40.52           H  \nATOM    609 HG12 VAL A 927     -12.769 -16.982  -9.554  1.00 40.52           H  \nATOM    610 HG13 VAL A 927     -12.235 -18.658  -9.674  1.00 40.52           H  \nATOM    611 HG21 VAL A 927      -9.586 -18.255  -8.099  1.00 39.38           H  \nATOM    612 HG22 VAL A 927      -9.578 -19.128  -9.623  1.00 39.38           H  \nATOM    613 HG23 VAL A 927      -8.510 -17.750  -9.382  1.00 39.38           H  \nATOM    614  N   ALA A 928      -9.546 -14.756 -11.667  1.00 33.12           N  \nATOM    615  CA  ALA A 928      -8.506 -13.752 -11.857  1.00 33.29           C  \nATOM    616  C   ALA A 928      -8.086 -13.216 -10.483  1.00 37.02           C  \nATOM    617  O   ALA A 928      -8.817 -12.428  -9.884  1.00 37.68           O  \nATOM    618  CB  ALA A 928      -9.054 -12.636 -12.757  1.00 33.26           C  \nATOM    619  H   ALA A 928     -10.476 -14.395 -11.503  1.00 33.12           H  \nATOM    620  HA  ALA A 928      -7.640 -14.190 -12.357  1.00 33.29           H  \nATOM    621  HB1 ALA A 928      -8.316 -11.845 -12.901  1.00 33.26           H  \nATOM    622  HB2 ALA A 928      -9.308 -13.028 -13.742  1.00 33.26           H  \nATOM    623  HB3 ALA A 928      -9.953 -12.181 -12.339  1.00 33.26           H  \nATOM    624  N   VAL A 929      -6.929 -13.685  -9.998  1.00 32.01           N  \nATOM    625  CA  VAL A 929      -6.385 -13.331  -8.692  1.00 31.43           C  \nATOM    626  C   VAL A 929      -5.339 -12.221  -8.875  1.00 34.06           C  \nATOM    627  O   VAL A 929      -4.322 -12.445  -9.535  1.00 33.04           O  \nATOM    628  CB  VAL A 929      -5.698 -14.547  -8.012  1.00 35.67           C  \nATOM    629  CG1 VAL A 929      -5.130 -14.225  -6.617  1.00 35.66           C  \nATOM    630  CG2 VAL A 929      -6.643 -15.756  -7.910  1.00 35.86           C  \nATOM    631  H   VAL A 929      -6.365 -14.309 -10.561  1.00 32.01           H  \nATOM    632  HA  VAL A 929      -7.179 -12.977  -8.034  1.00 31.43           H  \nATOM    633  HB  VAL A 929      -4.857 -14.854  -8.629  1.00 35.67           H  \nATOM    634 HG11 VAL A 929      -4.714 -15.115  -6.143  1.00 35.66           H  \nATOM    635 HG12 VAL A 929      -4.328 -13.487  -6.657  1.00 35.66           H  \nATOM    636 HG13 VAL A 929      -5.914 -13.838  -5.965  1.00 35.66           H  \nATOM    637 HG21 VAL A 929      -6.160 -16.590  -7.401  1.00 35.86           H  \nATOM    638 HG22 VAL A 929      -7.545 -15.504  -7.357  1.00 35.86           H  \nATOM    639 HG23 VAL A 929      -6.942 -16.112  -8.895  1.00 35.86           H  \nATOM    640  N   LYS A 930      -5.610 -11.055  -8.273  1.00 30.97           N  \nATOM    641  CA  LYS A 930      -4.688  -9.925  -8.224  1.00 30.96           C  \nATOM    642  C   LYS A 930      -3.874  -9.976  -6.925  1.00 37.68           C  \nATOM    643  O   LYS A 930      -4.421 -10.310  -5.875  1.00 36.55           O  \nATOM    644  CB  LYS A 930      -5.482  -8.618  -8.397  1.00 33.16           C  \nATOM    645  CG  LYS A 930      -4.599  -7.367  -8.542  1.00 48.15           C  \nATOM    646  CD  LYS A 930      -5.416  -6.121  -8.900  1.00 51.77           C  \nATOM    647  CE  LYS A 930      -4.523  -4.890  -9.108  1.00 60.76           C  \nATOM    648  NZ  LYS A 930      -5.318  -3.714  -9.493  1.00 63.79           N1+\nATOM    649  H   LYS A 930      -6.465 -10.954  -7.740  1.00 30.97           H  \nATOM    650  HA  LYS A 930      -3.992  -9.993  -9.053  1.00 30.96           H  \nATOM    651  HB3 LYS A 930      -6.191  -8.486  -7.580  1.00 33.16           H  \nATOM    652  HB2 LYS A 930      -6.087  -8.710  -9.299  1.00 33.16           H  \nATOM    653  HG3 LYS A 930      -3.847  -7.538  -9.312  1.00 48.15           H  \nATOM    654  HG2 LYS A 930      -4.040  -7.183  -7.626  1.00 48.15           H  \nATOM    655  HD3 LYS A 930      -6.143  -5.928  -8.109  1.00 51.77           H  \nATOM    656  HD2 LYS A 930      -5.995  -6.317  -9.804  1.00 51.77           H  \nATOM    657  HE3 LYS A 930      -3.789  -5.088  -9.888  1.00 60.76           H  \nATOM    658  HE2 LYS A 930      -3.969  -4.658  -8.199  1.00 60.76           H  \nATOM    659  HZ1 LYS A 930      -5.988  -3.511  -8.759  1.00 63.79           H  \nATOM    660  HZ2 LYS A 930      -4.721  -2.911  -9.618  1.00 63.79           H  \nATOM    661  HZ3 LYS A 930      -5.818  -3.896 -10.350  1.00 63.79           H  \nATOM    662  N   ALA A 931      -2.580  -9.642  -7.031  1.00 37.96           N  \nATOM    663  CA  ALA A 931      -1.623  -9.687  -5.933  1.00 40.37           C  \nATOM    664  C   ALA A 931      -0.830  -8.379  -5.859  1.00 49.88           C  \nATOM    665  O   ALA A 931      -0.449  -7.826  -6.890  1.00 48.28           O  \nATOM    666  CB  ALA A 931      -0.678 -10.880  -6.150  1.00 41.64           C  \nATOM    667  H   ALA A 931      -2.209  -9.351  -7.928  1.00 37.96           H  \nATOM    668  HA  ALA A 931      -2.145  -9.825  -4.984  1.00 40.37           H  \nATOM    669  HB1 ALA A 931       0.015 -10.988  -5.314  1.00 41.64           H  \nATOM    670  HB2 ALA A 931      -1.235 -11.814  -6.232  1.00 41.64           H  \nATOM    671  HB3 ALA A 931      -0.088 -10.766  -7.060  1.00 41.64           H  \nATOM    672  N   LEU A 932      -0.559  -7.956  -4.618  1.00 51.32           N  \nATOM    673  CA  LEU A 932       0.354  -6.877  -4.255  1.00 53.72           C  \nATOM    674  C   LEU A 932       1.768  -7.462  -4.129  1.00 62.30           C  \nATOM    675  O   LEU A 932       1.938  -8.492  -3.473  1.00 63.20           O  \nATOM    676  CB  LEU A 932      -0.203  -6.237  -2.959  1.00 54.88           C  \nATOM    677  CG  LEU A 932       0.643  -5.234  -2.140  1.00 61.02           C  \nATOM    678  CD1 LEU A 932       1.578  -5.910  -1.118  1.00 63.21           C  \nATOM    679  CD2 LEU A 932       1.333  -4.164  -3.002  1.00 63.43           C  \nATOM    680  H   LEU A 932      -0.898  -8.507  -3.839  1.00 51.32           H  \nATOM    681  HA  LEU A 932       0.353  -6.121  -5.044  1.00 53.72           H  \nATOM    682  HB3 LEU A 932      -0.550  -7.017  -2.280  1.00 54.88           H  \nATOM    683  HB2 LEU A 932      -1.098  -5.708  -3.275  1.00 54.88           H  \nATOM    684  HG  LEU A 932      -0.082  -4.685  -1.537  1.00 61.02           H  \nATOM    685 HD11 LEU A 932       2.578  -5.486  -1.128  1.00 63.21           H  \nATOM    686 HD12 LEU A 932       1.192  -5.785  -0.107  1.00 63.21           H  \nATOM    687 HD13 LEU A 932       1.671  -6.983  -1.281  1.00 63.21           H  \nATOM    688 HD21 LEU A 932       1.351  -3.201  -2.490  1.00 63.43           H  \nATOM    689 HD22 LEU A 932       2.361  -4.440  -3.233  1.00 63.43           H  \nATOM    690 HD23 LEU A 932       0.815  -4.017  -3.948  1.00 63.43           H  \nATOM    691  N   LYS A 933       2.746  -6.805  -4.775  1.00 61.35           N  \nATOM    692  CA  LYS A 933       4.151  -7.223  -4.806  1.00 63.52           C  \nATOM    693  C   LYS A 933       4.791  -7.220  -3.401  1.00 70.14           C  \nATOM    694  O   LYS A 933       4.505  -6.330  -2.602  1.00 70.50           O  \nATOM    695  CB  LYS A 933       4.920  -6.342  -5.819  1.00 66.45           C  \nATOM    696  CG  LYS A 933       5.118  -4.872  -5.401  1.00 83.56           C  \nATOM    697  CD  LYS A 933       5.932  -4.051  -6.408  1.00 96.14           C  \nATOM    698  CE  LYS A 933       6.299  -2.668  -5.844  1.00107.75           C  \nATOM    699  NZ  LYS A 933       7.319  -1.991  -6.663  1.00116.59           N1+\nATOM    700  H   LYS A 933       2.523  -5.965  -5.289  1.00 61.35           H  \nATOM    701  HA  LYS A 933       4.168  -8.249  -5.180  1.00 63.52           H  \nATOM    702  HB3 LYS A 933       4.426  -6.386  -6.790  1.00 66.45           H  \nATOM    703  HB2 LYS A 933       5.906  -6.784  -5.971  1.00 66.45           H  \nATOM    704  HG3 LYS A 933       5.647  -4.840  -4.451  1.00 83.56           H  \nATOM    705  HG2 LYS A 933       4.149  -4.396  -5.240  1.00 83.56           H  \nATOM    706  HD3 LYS A 933       5.354  -3.933  -7.326  1.00 96.14           H  \nATOM    707  HD2 LYS A 933       6.830  -4.606  -6.684  1.00 96.14           H  \nATOM    708  HE3 LYS A 933       6.712  -2.771  -4.840  1.00107.75           H  \nATOM    709  HE2 LYS A 933       5.413  -2.038  -5.765  1.00107.75           H  \nATOM    710  HZ1 LYS A 933       8.154  -2.563  -6.671  1.00116.59           H  \nATOM    711  HZ2 LYS A 933       6.989  -1.866  -7.610  1.00116.59           H  \nATOM    712  HZ3 LYS A 933       7.539  -1.092  -6.261  1.00116.59           H  \nATOM    713  N   ALA A 934       5.650  -8.217  -3.131  1.00 68.33           N  \nATOM    714  CA  ALA A 934       6.298  -8.425  -1.831  1.00 69.84           C  \nATOM    715  C   ALA A 934       7.265  -7.306  -1.401  1.00 75.29           C  \nATOM    716  O   ALA A 934       7.435  -7.096  -0.201  1.00 75.68           O  \nATOM    717  CB  ALA A 934       7.019  -9.781  -1.846  1.00 71.23           C  \nATOM    718  H   ALA A 934       5.847  -8.909  -3.840  1.00 68.33           H  \nATOM    719  HA  ALA A 934       5.511  -8.468  -1.076  1.00 69.84           H  \nATOM    720  HB1 ALA A 934       7.460 -10.006  -0.874  1.00 71.23           H  \nATOM    721  HB2 ALA A 934       6.330 -10.591  -2.085  1.00 71.23           H  \nATOM    722  HB3 ALA A 934       7.820  -9.799  -2.587  1.00 71.23           H  \nATOM    723  N   ASP A 935       7.863  -6.609  -2.380  1.00 72.17           N  \nATOM    724  CA  ASP A 935       8.836  -5.527  -2.197  1.00 73.50           C  \nATOM    725  C   ASP A 935       8.185  -4.144  -1.962  1.00 75.83           C  \nATOM    726  O   ASP A 935       8.922  -3.179  -1.754  1.00 76.32           O  \nATOM    727  CB  ASP A 935       9.864  -5.475  -3.361  1.00 76.23           C  \nATOM    728  CG  ASP A 935       9.276  -5.328  -4.776  1.00 89.05           C  \nATOM    729  OD1 ASP A 935       8.665  -6.306  -5.264  1.00 88.80           O  \nATOM    730  OD2 ASP A 935       9.356  -4.200  -5.311  1.00 97.21           O1-\nATOM    731  H   ASP A 935       7.672  -6.851  -3.344  1.00 72.17           H  \nATOM    732  HA  ASP A 935       9.406  -5.746  -1.292  1.00 73.50           H  \nATOM    733  HB3 ASP A 935      10.432  -6.406  -3.352  1.00 76.23           H  \nATOM    734  HB2 ASP A 935      10.609  -4.697  -3.179  1.00 76.23           H  \nATOM    735  N   ALA A 936       6.842  -4.054  -1.996  1.00 70.25           N  \nATOM    736  CA  ALA A 936       6.074  -2.822  -1.798  1.00 69.55           C  \nATOM    737  C   ALA A 936       6.250  -2.196  -0.405  1.00 73.05           C  \nATOM    738  O   ALA A 936       6.327  -2.920   0.589  1.00 73.05           O  \nATOM    739  CB  ALA A 936       4.591  -3.122  -2.034  1.00 68.72           C  \nATOM    740  H   ALA A 936       6.301  -4.891  -2.162  1.00 70.25           H  \nATOM    741  HA  ALA A 936       6.404  -2.099  -2.546  1.00 69.55           H  \nATOM    742  HB1 ALA A 936       3.968  -2.252  -1.839  1.00 68.72           H  \nATOM    743  HB2 ALA A 936       4.413  -3.419  -3.064  1.00 68.72           H  \nATOM    744  HB3 ALA A 936       4.241  -3.921  -1.381  1.00 68.72           H  \nATOM    745  N   GLY A 937       6.263  -0.854  -0.374  1.00 68.94           N  \nATOM    746  CA  GLY A 937       6.335  -0.057   0.850  1.00 69.45           C  \nATOM    747  C   GLY A 937       4.933   0.143   1.460  1.00 71.44           C  \nATOM    748  O   GLY A 937       3.934  -0.265   0.865  1.00 69.33           O  \nATOM    749  H   GLY A 937       6.175  -0.344  -1.241  1.00 68.94           H  \nATOM    750  HA3 GLY A 937       6.771   0.911   0.607  1.00 69.45           H  \nATOM    751  HA2 GLY A 937       6.996  -0.534   1.576  1.00 69.45           H  \nATOM    752  N   PRO A 938       4.847   0.779   2.651  1.00 68.74           N  \nATOM    753  CA  PRO A 938       3.589   0.933   3.409  1.00 68.21           C  \nATOM    754  C   PRO A 938       2.501   1.788   2.729  1.00 71.10           C  \nATOM    755  O   PRO A 938       1.321   1.556   2.990  1.00 70.04           O  \nATOM    756  CB  PRO A 938       4.043   1.532   4.751  1.00 71.88           C  \nATOM    757  CG  PRO A 938       5.339   2.259   4.429  1.00 77.34           C  \nATOM    758  CD  PRO A 938       5.977   1.366   3.372  1.00 72.04           C  \nATOM    759  HA  PRO A 938       3.163  -0.053   3.593  1.00 68.21           H  \nATOM    760  HB3 PRO A 938       4.244   0.723   5.455  1.00 71.88           H  \nATOM    761  HB2 PRO A 938       3.305   2.188   5.216  1.00 71.88           H  \nATOM    762  HG3 PRO A 938       5.975   2.421   5.300  1.00 77.34           H  \nATOM    763  HG2 PRO A 938       5.111   3.233   3.994  1.00 77.34           H  \nATOM    764  HD2 PRO A 938       6.648   1.939   2.732  1.00 72.04           H  \nATOM    765  HD3 PRO A 938       6.549   0.565   3.842  1.00 72.04           H  \nATOM    766  N   GLN A 939       2.905   2.724   1.853  1.00 67.61           N  \nATOM    767  CA  GLN A 939       2.021   3.560   1.038  1.00 66.36           C  \nATOM    768  C   GLN A 939       1.200   2.757   0.008  1.00 68.88           C  \nATOM    769  O   GLN A 939       0.018   3.051  -0.168  1.00 67.37           O  \nATOM    770  CB  GLN A 939       2.817   4.723   0.389  1.00 68.30           C  \nATOM    771  CG  GLN A 939       3.855   4.379  -0.712  1.00 77.62           C  \nATOM    772  CD  GLN A 939       5.122   3.666  -0.222  1.00 79.26           C  \nATOM    773  OE1 GLN A 939       5.529   3.809   0.929  1.00 70.91           O  \nATOM    774  NE2 GLN A 939       5.769   2.907  -1.106  1.00 67.19           N  \nATOM    775  H   GLN A 939       3.896   2.872   1.712  1.00 67.61           H  \nATOM    776  HA  GLN A 939       1.304   4.015   1.725  1.00 66.36           H  \nATOM    777  HB3 GLN A 939       3.296   5.311   1.174  1.00 68.30           H  \nATOM    778  HB2 GLN A 939       2.092   5.403  -0.059  1.00 68.30           H  \nATOM    779  HG3 GLN A 939       4.183   5.309  -1.175  1.00 77.62           H  \nATOM    780  HG2 GLN A 939       3.393   3.803  -1.513  1.00 77.62           H  \nATOM    781 HE22 GLN A 939       6.630   2.450  -0.845  1.00 67.19           H  \nATOM    782 HE21 GLN A 939       5.407   2.784  -2.042  1.00 67.19           H  \nATOM    783  N   HIS A 940       1.825   1.743  -0.617  1.00 64.95           N  \nATOM    784  CA  HIS A 940       1.173   0.836  -1.562  1.00 63.06           C  \nATOM    785  C   HIS A 940       0.336  -0.247  -0.865  1.00 62.55           C  \nATOM    786  O   HIS A 940      -0.666  -0.669  -1.435  1.00 60.85           O  \nATOM    787  CB  HIS A 940       2.221   0.189  -2.485  1.00 64.66           C  \nATOM    788  CG  HIS A 940       2.915   1.133  -3.435  1.00 69.42           C  \nATOM    789  ND1 HIS A 940       4.296   1.361  -3.394  1.00 71.01           N  \nATOM    790  CD2 HIS A 940       2.373   1.877  -4.463  1.00 73.12           C  \nATOM    791  CE1 HIS A 940       4.528   2.217  -4.381  1.00 71.34           C  \nATOM    792  NE2 HIS A 940       3.425   2.560  -5.046  1.00 72.94           N  \nATOM    793  H   HIS A 940       2.793   1.547  -0.404  1.00 64.95           H  \nATOM    794  HA  HIS A 940       0.488   1.415  -2.185  1.00 63.06           H  \nATOM    795  HB3 HIS A 940       1.764  -0.598  -3.086  1.00 64.66           H  \nATOM    796  HB2 HIS A 940       2.982  -0.293  -1.874  1.00 64.66           H  \nATOM    797  HD2 HIS A 940       1.359   1.973  -4.821  1.00 73.12           H  \nATOM    798  HE1 HIS A 940       5.511   2.597  -4.622  1.00 71.34           H  \nATOM    799  HE2 HIS A 940       3.370   3.192  -5.834  1.00 72.94           H  \nATOM    800  N   ARG A 941       0.746  -0.666   0.344  1.00 57.11           N  \nATOM    801  CA  ARG A 941       0.052  -1.670   1.157  1.00 55.94           C  \nATOM    802  C   ARG A 941      -1.244  -1.135   1.786  1.00 58.15           C  \nATOM    803  O   ARG A 941      -2.224  -1.878   1.834  1.00 56.90           O  \nATOM    804  CB  ARG A 941       1.002  -2.196   2.248  1.00 56.27           C  \nATOM    805  CG  ARG A 941       2.156  -3.035   1.684  1.00 60.46           C  \nATOM    806  CD  ARG A 941       3.217  -3.361   2.743  1.00 68.18           C  \nATOM    807  NE  ARG A 941       4.165  -4.372   2.252  1.00 73.45           N  \nATOM    808  CZ  ARG A 941       4.018  -5.707   2.308  1.00 81.37           C  \nATOM    809  NH1 ARG A 941       2.961  -6.288   2.896  1.00 62.04           N  \nATOM    810  NH2 ARG A 941       4.956  -6.483   1.753  1.00 66.65           N1+\nATOM    811  H   ARG A 941       1.591  -0.278   0.739  1.00 57.11           H  \nATOM    812  HA  ARG A 941      -0.219  -2.508   0.511  1.00 55.94           H  \nATOM    813  HB3 ARG A 941       0.446  -2.825   2.943  1.00 56.27           H  \nATOM    814  HB2 ARG A 941       1.388  -1.363   2.836  1.00 56.27           H  \nATOM    815  HG3 ARG A 941       2.640  -2.439   0.911  1.00 60.46           H  \nATOM    816  HG2 ARG A 941       1.797  -3.928   1.174  1.00 60.46           H  \nATOM    817  HD3 ARG A 941       2.794  -3.586   3.722  1.00 68.18           H  \nATOM    818  HD2 ARG A 941       3.836  -2.474   2.881  1.00 68.18           H  \nATOM    819  HE  ARG A 941       4.974  -4.003   1.765  1.00 73.45           H  \nATOM    820 HH12 ARG A 941       2.887  -7.298   2.921  1.00 62.04           H  \nATOM    821 HH11 ARG A 941       2.246  -5.725   3.329  1.00 62.04           H  \nATOM    822 HH22 ARG A 941       4.856  -7.489   1.785  1.00 66.65           H  \nATOM    823 HH21 ARG A 941       5.763  -6.083   1.293  1.00 66.65           H  \nATOM    824  N   SER A 942      -1.239   0.131   2.236  1.00 54.55           N  \nATOM    825  CA  SER A 942      -2.417   0.822   2.767  1.00 53.96           C  \nATOM    826  C   SER A 942      -3.462   1.145   1.681  1.00 53.99           C  \nATOM    827  O   SER A 942      -4.658   1.084   1.968  1.00 53.04           O  \nATOM    828  CB  SER A 942      -1.974   2.067   3.564  1.00 59.58           C  \nATOM    829  OG  SER A 942      -1.436   3.085   2.742  1.00 72.10           O  \nATOM    830  H   SER A 942      -0.386   0.673   2.189  1.00 54.55           H  \nATOM    831  HA  SER A 942      -2.895   0.143   3.476  1.00 53.96           H  \nATOM    832  HB3 SER A 942      -1.237   1.795   4.320  1.00 59.58           H  \nATOM    833  HB2 SER A 942      -2.827   2.484   4.101  1.00 59.58           H  \nATOM    834  HG  SER A 942      -0.537   2.843   2.506  1.00 72.10           H  \nATOM    835  N   GLY A 943      -2.996   1.435   0.454  1.00 48.43           N  \nATOM    836  CA  GLY A 943      -3.852   1.679  -0.702  1.00 46.49           C  \nATOM    837  C   GLY A 943      -4.391   0.364  -1.290  1.00 48.75           C  \nATOM    838  O   GLY A 943      -5.500   0.360  -1.821  1.00 47.89           O  \nATOM    839  H   GLY A 943      -1.998   1.478   0.302  1.00 48.43           H  \nATOM    840  HA3 GLY A 943      -3.269   2.198  -1.462  1.00 46.49           H  \nATOM    841  HA2 GLY A 943      -4.681   2.335  -0.430  1.00 46.49           H  \nATOM    842  N   TRP A 944      -3.627  -0.738  -1.184  1.00 44.46           N  \nATOM    843  CA  TRP A 944      -4.021  -2.081  -1.615  1.00 42.89           C  \nATOM    844  C   TRP A 944      -5.169  -2.670  -0.781  1.00 46.22           C  \nATOM    845  O   TRP A 944      -6.091  -3.245  -1.358  1.00 45.15           O  \nATOM    846  CB  TRP A 944      -2.793  -3.010  -1.631  1.00 42.12           C  \nATOM    847  CG  TRP A 944      -3.080  -4.467  -1.824  1.00 42.65           C  \nATOM    848  CD1 TRP A 944      -2.885  -5.439  -0.904  1.00 46.33           C  \nATOM    849  CD2 TRP A 944      -3.681  -5.119  -2.981  1.00 41.21           C  \nATOM    850  NE1 TRP A 944      -3.284  -6.649  -1.429  1.00 45.34           N  \nATOM    851  CE2 TRP A 944      -3.782  -6.515  -2.707  1.00 45.67           C  \nATOM    852  CE3 TRP A 944      -4.149  -4.674  -4.238  1.00 41.70           C  \nATOM    853  CZ2 TRP A 944      -4.298  -7.428  -3.640  1.00 44.10           C  \nATOM    854  CZ3 TRP A 944      -4.676  -5.579  -5.179  1.00 42.27           C  \nATOM    855  CH2 TRP A 944      -4.740  -6.953  -4.884  1.00 43.10           C  \nATOM    856  H   TRP A 944      -2.705  -0.662  -0.777  1.00 44.46           H  \nATOM    857  HA  TRP A 944      -4.393  -2.009  -2.639  1.00 42.89           H  \nATOM    858  HB3 TRP A 944      -2.239  -2.906  -0.699  1.00 42.12           H  \nATOM    859  HB2 TRP A 944      -2.112  -2.699  -2.425  1.00 42.12           H  \nATOM    860  HD1 TRP A 944      -2.471  -5.278   0.081  1.00 46.33           H  \nATOM    861  HE1 TRP A 944      -3.228  -7.524  -0.922  1.00 45.34           H  \nATOM    862  HE3 TRP A 944      -4.103  -3.624  -4.481  1.00 41.70           H  \nATOM    863  HZ2 TRP A 944      -4.352  -8.480  -3.407  1.00 44.10           H  \nATOM    864  HZ3 TRP A 944      -5.029  -5.218  -6.131  1.00 42.27           H  \nATOM    865  HH2 TRP A 944      -5.129  -7.641  -5.615  1.00 43.10           H  \nATOM    866  N   LYS A 945      -5.105  -2.485   0.550  1.00 43.92           N  \nATOM    867  CA  LYS A 945      -6.191  -2.822   1.471  1.00 44.34           C  \nATOM    868  C   LYS A 945      -7.476  -2.042   1.160  1.00 46.56           C  \nATOM    869  O   LYS A 945      -8.554  -2.623   1.243  1.00 45.36           O  \nATOM    870  CB  LYS A 945      -5.751  -2.571   2.926  1.00 49.05           C  \nATOM    871  CG  LYS A 945      -4.726  -3.589   3.445  1.00 67.10           C  \nATOM    872  CD  LYS A 945      -4.305  -3.287   4.894  1.00 82.17           C  \nATOM    873  CE  LYS A 945      -3.208  -4.218   5.438  1.00 95.75           C  \nATOM    874  NZ  LYS A 945      -1.895  -3.952   4.822  1.00106.63           N1+\nATOM    875  H   LYS A 945      -4.304  -2.017   0.951  1.00 43.92           H  \nATOM    876  HA  LYS A 945      -6.411  -3.885   1.350  1.00 44.34           H  \nATOM    877  HB3 LYS A 945      -6.625  -2.624   3.579  1.00 49.05           H  \nATOM    878  HB2 LYS A 945      -5.361  -1.556   3.025  1.00 49.05           H  \nATOM    879  HG3 LYS A 945      -3.858  -3.605   2.789  1.00 67.10           H  \nATOM    880  HG2 LYS A 945      -5.156  -4.590   3.397  1.00 67.10           H  \nATOM    881  HD3 LYS A 945      -5.182  -3.377   5.537  1.00 82.17           H  \nATOM    882  HD2 LYS A 945      -3.988  -2.245   4.978  1.00 82.17           H  \nATOM    883  HE3 LYS A 945      -3.481  -5.262   5.281  1.00 95.75           H  \nATOM    884  HE2 LYS A 945      -3.108  -4.074   6.514  1.00 95.75           H  \nATOM    885  HZ1 LYS A 945      -1.958  -4.096   3.824  1.00106.63           H  \nATOM    886  HZ2 LYS A 945      -1.626  -2.996   5.006  1.00106.63           H  \nATOM    887  HZ3 LYS A 945      -1.206  -4.578   5.214  1.00106.63           H  \nATOM    888  N   GLN A 946      -7.327  -0.768   0.757  1.00 43.11           N  \nATOM    889  CA  GLN A 946      -8.435   0.101   0.379  1.00 42.59           C  \nATOM    890  C   GLN A 946      -9.104  -0.329  -0.944  1.00 44.21           C  \nATOM    891  O   GLN A 946     -10.323  -0.212  -1.029  1.00 44.62           O  \nATOM    892  CB  GLN A 946      -7.949   1.562   0.342  1.00 44.07           C  \nATOM    893  CG  GLN A 946      -9.112   2.570   0.435  1.00 72.22           C  \nATOM    894  CD  GLN A 946      -8.722   4.039   0.262  1.00 92.80           C  \nATOM    895  OE1 GLN A 946      -9.605   4.886   0.154  1.00 86.97           O  \nATOM    896  NE2 GLN A 946      -7.426   4.364   0.235  1.00 85.94           N  \nATOM    897  H   GLN A 946      -6.402  -0.366   0.700  1.00 43.11           H  \nATOM    898  HA  GLN A 946      -9.185   0.018   1.169  1.00 42.59           H  \nATOM    899  HB3 GLN A 946      -7.370   1.733  -0.566  1.00 44.07           H  \nATOM    900  HB2 GLN A 946      -7.272   1.737   1.180  1.00 44.07           H  \nATOM    901  HG3 GLN A 946      -9.613   2.463   1.399  1.00 72.22           H  \nATOM    902  HG2 GLN A 946      -9.861   2.347  -0.322  1.00 72.22           H  \nATOM    903 HE22 GLN A 946      -7.136   5.321   0.106  1.00 85.94           H  \nATOM    904 HE21 GLN A 946      -6.724   3.644   0.323  1.00 85.94           H  \nATOM    905  N   GLU A 947      -8.341  -0.874  -1.917  1.00 38.42           N  \nATOM    906  CA  GLU A 947      -8.896  -1.497  -3.128  1.00 36.42           C  \nATOM    907  C   GLU A 947      -9.773  -2.720  -2.812  1.00 41.24           C  \nATOM    908  O   GLU A 947     -10.865  -2.832  -3.369  1.00 41.44           O  \nATOM    909  CB  GLU A 947      -7.793  -1.835  -4.165  1.00 36.47           C  \nATOM    910  CG  GLU A 947      -8.321  -2.647  -5.383  1.00 37.83           C  \nATOM    911  CD  GLU A 947      -7.332  -2.963  -6.510  1.00 51.81           C  \nATOM    912  OE1 GLU A 947      -6.118  -2.704  -6.360  1.00 50.51           O  \nATOM    913  OE2 GLU A 947      -7.819  -3.483  -7.537  1.00 44.67           O1-\nATOM    914  H   GLU A 947      -7.338  -0.927  -1.800  1.00 38.42           H  \nATOM    915  HA  GLU A 947      -9.549  -0.755  -3.593  1.00 36.42           H  \nATOM    916  HB3 GLU A 947      -6.983  -2.382  -3.682  1.00 36.47           H  \nATOM    917  HB2 GLU A 947      -7.355  -0.901  -4.515  1.00 36.47           H  \nATOM    918  HG3 GLU A 947      -9.177  -2.127  -5.813  1.00 37.83           H  \nATOM    919  HG2 GLU A 947      -8.692  -3.617  -5.051  1.00 37.83           H  \nATOM    920  N   ILE A 948      -9.272  -3.599  -1.926  1.00 37.07           N  \nATOM    921  CA  ILE A 948      -9.967  -4.801  -1.461  1.00 37.44           C  \nATOM    922  C   ILE A 948     -11.283  -4.464  -0.730  1.00 42.50           C  \nATOM    923  O   ILE A 948     -12.288  -5.117  -1.003  1.00 40.78           O  \nATOM    924  CB  ILE A 948      -9.054  -5.688  -0.558  1.00 40.85           C  \nATOM    925  CG1 ILE A 948      -7.887  -6.291  -1.375  1.00 40.33           C  \nATOM    926  CG2 ILE A 948      -9.796  -6.814   0.199  1.00 41.59           C  \nATOM    927  CD1 ILE A 948      -6.671  -6.699  -0.527  1.00 45.34           C  \nATOM    928  H   ILE A 948      -8.358  -3.431  -1.528  1.00 37.07           H  \nATOM    929  HA  ILE A 948     -10.228  -5.382  -2.348  1.00 37.44           H  \nATOM    930  HB  ILE A 948      -8.610  -5.037   0.195  1.00 40.85           H  \nATOM    931 HG13 ILE A 948      -7.538  -5.577  -2.122  1.00 40.33           H  \nATOM    932 HG12 ILE A 948      -8.245  -7.151  -1.939  1.00 40.33           H  \nATOM    933 HG21 ILE A 948      -9.110  -7.460   0.744  1.00 41.59           H  \nATOM    934 HG22 ILE A 948     -10.494  -6.421   0.937  1.00 41.59           H  \nATOM    935 HG23 ILE A 948     -10.361  -7.442  -0.491  1.00 41.59           H  \nATOM    936 HD11 ILE A 948      -6.199  -7.594  -0.931  1.00 45.34           H  \nATOM    937 HD12 ILE A 948      -5.924  -5.906  -0.520  1.00 45.34           H  \nATOM    938 HD13 ILE A 948      -6.932  -6.902   0.510  1.00 45.34           H  \nATOM    939  N   ASP A 949     -11.260  -3.427   0.129  1.00 41.37           N  \nATOM    940  CA  ASP A 949     -12.433  -2.867   0.812  1.00 43.58           C  \nATOM    941  C   ASP A 949     -13.472  -2.293  -0.166  1.00 46.27           C  \nATOM    942  O   ASP A 949     -14.650  -2.611  -0.023  1.00 45.58           O  \nATOM    943  CB  ASP A 949     -12.082  -1.793   1.877  1.00 47.36           C  \nATOM    944  CG  ASP A 949     -11.137  -2.216   3.016  1.00 66.46           C  \nATOM    945  OD1 ASP A 949     -11.033  -3.431   3.296  1.00 66.64           O  \nATOM    946  OD2 ASP A 949     -10.616  -1.293   3.681  1.00 76.34           O1-\nATOM    947  H   ASP A 949     -10.380  -2.965   0.319  1.00 41.37           H  \nATOM    948  HA  ASP A 949     -12.919  -3.699   1.326  1.00 43.58           H  \nATOM    949  HB3 ASP A 949     -13.001  -1.432   2.342  1.00 47.36           H  \nATOM    950  HB2 ASP A 949     -11.627  -0.936   1.377  1.00 47.36           H  \nATOM    951  N   ILE A 950     -13.021  -1.484  -1.143  1.00 42.07           N  \nATOM    952  CA  ILE A 950     -13.865  -0.856  -2.165  1.00 41.21           C  \nATOM    953  C   ILE A 950     -14.584  -1.879  -3.065  1.00 44.57           C  \nATOM    954  O   ILE A 950     -15.796  -1.776  -3.223  1.00 44.89           O  \nATOM    955  CB  ILE A 950     -13.074   0.179  -3.030  1.00 43.50           C  \nATOM    956  CG1 ILE A 950     -12.772   1.447  -2.199  1.00 44.25           C  \nATOM    957  CG2 ILE A 950     -13.743   0.588  -4.366  1.00 43.82           C  \nATOM    958  CD1 ILE A 950     -11.740   2.389  -2.835  1.00 47.81           C  \nATOM    959  H   ILE A 950     -12.034  -1.263  -1.187  1.00 42.07           H  \nATOM    960  HA  ILE A 950     -14.646  -0.310  -1.630  1.00 41.21           H  \nATOM    961  HB  ILE A 950     -12.115  -0.277  -3.283  1.00 43.50           H  \nATOM    962 HG13 ILE A 950     -12.436   1.183  -1.197  1.00 44.25           H  \nATOM    963 HG12 ILE A 950     -13.700   1.993  -2.049  1.00 44.25           H  \nATOM    964 HG21 ILE A 950     -13.176   1.363  -4.881  1.00 43.82           H  \nATOM    965 HG22 ILE A 950     -13.808  -0.244  -5.066  1.00 43.82           H  \nATOM    966 HG23 ILE A 950     -14.750   0.974  -4.203  1.00 43.82           H  \nATOM    967 HD11 ILE A 950     -11.203   2.958  -2.077  1.00 47.81           H  \nATOM    968 HD12 ILE A 950     -11.002   1.842  -3.421  1.00 47.81           H  \nATOM    969 HD13 ILE A 950     -12.224   3.110  -3.494  1.00 47.81           H  \nATOM    970  N   LEU A 951     -13.844  -2.860  -3.609  1.00 41.27           N  \nATOM    971  CA  LEU A 951     -14.394  -3.889  -4.496  1.00 41.85           C  \nATOM    972  C   LEU A 951     -15.322  -4.889  -3.774  1.00 47.62           C  \nATOM    973  O   LEU A 951     -16.249  -5.398  -4.403  1.00 47.54           O  \nATOM    974  CB  LEU A 951     -13.231  -4.574  -5.249  1.00 41.42           C  \nATOM    975  CG  LEU A 951     -13.649  -5.508  -6.410  1.00 46.53           C  \nATOM    976  CD1 LEU A 951     -14.414  -4.752  -7.521  1.00 46.18           C  \nATOM    977  CD2 LEU A 951     -12.432  -6.278  -6.956  1.00 49.35           C  \nATOM    978  H   LEU A 951     -12.847  -2.896  -3.436  1.00 41.27           H  \nATOM    979  HA  LEU A 951     -15.012  -3.367  -5.227  1.00 41.85           H  \nATOM    980  HB3 LEU A 951     -12.633  -5.137  -4.530  1.00 41.42           H  \nATOM    981  HB2 LEU A 951     -12.564  -3.808  -5.649  1.00 41.42           H  \nATOM    982  HG  LEU A 951     -14.325  -6.266  -6.019  1.00 46.53           H  \nATOM    983 HD11 LEU A 951     -14.019  -4.940  -8.518  1.00 46.18           H  \nATOM    984 HD12 LEU A 951     -15.464  -5.047  -7.534  1.00 46.18           H  \nATOM    985 HD13 LEU A 951     -14.385  -3.672  -7.381  1.00 46.18           H  \nATOM    986 HD21 LEU A 951     -12.413  -6.333  -8.044  1.00 49.35           H  \nATOM    987 HD22 LEU A 951     -11.496  -5.819  -6.643  1.00 49.35           H  \nATOM    988 HD23 LEU A 951     -12.429  -7.303  -6.584  1.00 49.35           H  \nATOM    989  N   ARG A 952     -15.086  -5.118  -2.470  1.00 45.43           N  \nATOM    990  CA  ARG A 952     -15.912  -5.959  -1.601  1.00 47.25           C  \nATOM    991  C   ARG A 952     -17.298  -5.357  -1.286  1.00 52.09           C  \nATOM    992  O   ARG A 952     -18.247  -6.129  -1.145  1.00 53.68           O  \nATOM    993  CB  ARG A 952     -15.091  -6.318  -0.340  1.00 49.60           C  \nATOM    994  CG  ARG A 952     -15.843  -7.068   0.779  1.00 64.86           C  \nATOM    995  CD  ARG A 952     -14.937  -7.823   1.770  1.00 76.56           C  \nATOM    996  NE  ARG A 952     -13.881  -6.986   2.376  1.00 87.65           N  \nATOM    997  CZ  ARG A 952     -12.715  -7.407   2.908  1.00104.51           C  \nATOM    998  NH1 ARG A 952     -12.352  -8.699   2.914  1.00 93.37           N  \nATOM    999  NH2 ARG A 952     -11.884  -6.512   3.453  1.00 92.17           N1+\nATOM   1000  H   ARG A 952     -14.301  -4.663  -2.025  1.00 45.43           H  \nATOM   1001  HA  ARG A 952     -16.101  -6.892  -2.134  1.00 47.25           H  \nATOM   1002  HB3 ARG A 952     -14.697  -5.398   0.092  1.00 49.60           H  \nATOM   1003  HB2 ARG A 952     -14.226  -6.906  -0.649  1.00 49.60           H  \nATOM   1004  HG3 ARG A 952     -16.421  -7.837   0.264  1.00 64.86           H  \nATOM   1005  HG2 ARG A 952     -16.577  -6.448   1.297  1.00 64.86           H  \nATOM   1006  HD3 ARG A 952     -14.592  -8.768   1.357  1.00 76.56           H  \nATOM   1007  HD2 ARG A 952     -15.557  -8.089   2.626  1.00 76.56           H  \nATOM   1008  HE  ARG A 952     -14.078  -5.996   2.402  1.00 87.65           H  \nATOM   1009 HH12 ARG A 952     -11.476  -8.988   3.325  1.00 93.37           H  \nATOM   1010 HH11 ARG A 952     -12.951  -9.389   2.485  1.00 93.37           H  \nATOM   1011 HH22 ARG A 952     -12.087  -5.519   3.426  1.00 92.17           H  \nATOM   1012 HH21 ARG A 952     -11.009  -6.805   3.861  1.00 92.17           H  \nATOM   1013  N   THR A 953     -17.407  -4.018  -1.203  1.00 47.85           N  \nATOM   1014  CA  THR A 953     -18.679  -3.317  -0.978  1.00 48.24           C  \nATOM   1015  C   THR A 953     -19.466  -3.052  -2.282  1.00 50.96           C  \nATOM   1016  O   THR A 953     -20.681  -2.871  -2.196  1.00 52.21           O  \nATOM   1017  CB  THR A 953     -18.474  -1.955  -0.257  1.00 56.81           C  \nATOM   1018  OG1 THR A 953     -17.729  -1.035  -1.034  1.00 60.06           O  \nATOM   1019  CG2 THR A 953     -17.848  -2.087   1.139  1.00 56.45           C  \nATOM   1020  H   THR A 953     -16.592  -3.432  -1.323  1.00 47.85           H  \nATOM   1021  HA  THR A 953     -19.313  -3.933  -0.338  1.00 48.24           H  \nATOM   1022  HB  THR A 953     -19.453  -1.494  -0.115  1.00 56.81           H  \nATOM   1023  HG1 THR A 953     -17.579  -0.237  -0.518  1.00 60.06           H  \nATOM   1024 HG21 THR A 953     -17.701  -1.110   1.601  1.00 56.45           H  \nATOM   1025 HG22 THR A 953     -18.495  -2.666   1.798  1.00 56.45           H  \nATOM   1026 HG23 THR A 953     -16.885  -2.591   1.111  1.00 56.45           H  \nATOM   1027  N   LEU A 954     -18.797  -3.053  -3.450  1.00 45.03           N  \nATOM   1028  CA  LEU A 954     -19.441  -2.879  -4.754  1.00 43.59           C  \nATOM   1029  C   LEU A 954     -20.046  -4.200  -5.254  1.00 47.51           C  \nATOM   1030  O   LEU A 954     -19.407  -5.248  -5.151  1.00 46.90           O  \nATOM   1031  CB  LEU A 954     -18.416  -2.343  -5.779  1.00 41.91           C  \nATOM   1032  CG  LEU A 954     -17.939  -0.893  -5.544  1.00 44.98           C  \nATOM   1033  CD1 LEU A 954     -16.672  -0.604  -6.360  1.00 43.77           C  \nATOM   1034  CD2 LEU A 954     -19.026   0.163  -5.817  1.00 45.62           C  \nATOM   1035  H   LEU A 954     -17.798  -3.203  -3.455  1.00 45.03           H  \nATOM   1036  HA  LEU A 954     -20.251  -2.157  -4.649  1.00 43.59           H  \nATOM   1037  HB3 LEU A 954     -18.832  -2.405  -6.787  1.00 41.91           H  \nATOM   1038  HB2 LEU A 954     -17.551  -3.010  -5.778  1.00 41.91           H  \nATOM   1039  HG  LEU A 954     -17.680  -0.790  -4.492  1.00 44.98           H  \nATOM   1040 HD11 LEU A 954     -16.372   0.440  -6.268  1.00 43.77           H  \nATOM   1041 HD12 LEU A 954     -15.835  -1.211  -6.014  1.00 43.77           H  \nATOM   1042 HD13 LEU A 954     -16.821  -0.822  -7.417  1.00 43.77           H  \nATOM   1043 HD21 LEU A 954     -18.846   1.060  -5.227  1.00 45.62           H  \nATOM   1044 HD22 LEU A 954     -19.047   0.454  -6.867  1.00 45.62           H  \nATOM   1045 HD23 LEU A 954     -20.022  -0.184  -5.556  1.00 45.62           H  \nATOM   1046  N   TYR A 955     -21.260  -4.105  -5.819  1.00 44.63           N  \nATOM   1047  CA  TYR A 955     -21.983  -5.219  -6.422  1.00 45.07           C  \nATOM   1048  C   TYR A 955     -22.881  -4.667  -7.538  1.00 45.96           C  \nATOM   1049  O   TYR A 955     -23.879  -4.007  -7.245  1.00 46.41           O  \nATOM   1050  CB  TYR A 955     -22.766  -5.994  -5.338  1.00 49.65           C  \nATOM   1051  CG  TYR A 955     -23.413  -7.280  -5.825  1.00 54.91           C  \nATOM   1052  CD1 TYR A 955     -22.690  -8.491  -5.774  1.00 57.41           C  \nATOM   1053  CD2 TYR A 955     -24.729  -7.275  -6.334  1.00 57.57           C  \nATOM   1054  CE1 TYR A 955     -23.279  -9.687  -6.228  1.00 59.75           C  \nATOM   1055  CE2 TYR A 955     -25.314  -8.469  -6.797  1.00 60.10           C  \nATOM   1056  CZ  TYR A 955     -24.590  -9.676  -6.742  1.00 68.68           C  \nATOM   1057  OH  TYR A 955     -25.161 -10.833  -7.187  1.00 72.06           O  \nATOM   1058  H   TYR A 955     -21.733  -3.211  -5.844  1.00 44.63           H  \nATOM   1059  HA  TYR A 955     -21.264  -5.905  -6.873  1.00 45.07           H  \nATOM   1060  HB3 TYR A 955     -23.529  -5.356  -4.888  1.00 49.65           H  \nATOM   1061  HB2 TYR A 955     -22.091  -6.258  -4.522  1.00 49.65           H  \nATOM   1062  HD1 TYR A 955     -21.681  -8.504  -5.389  1.00 57.41           H  \nATOM   1063  HD2 TYR A 955     -25.291  -6.353  -6.378  1.00 57.57           H  \nATOM   1064  HE1 TYR A 955     -22.717 -10.608  -6.181  1.00 59.75           H  \nATOM   1065  HE2 TYR A 955     -26.320  -8.458  -7.190  1.00 60.10           H  \nATOM   1066  HH  TYR A 955     -24.592 -11.599  -7.087  1.00 72.06           H  \nATOM   1067  N   HIS A 956     -22.500  -4.944  -8.794  1.00 39.68           N  \nATOM   1068  CA  HIS A 956     -23.212  -4.512  -9.996  1.00 38.26           C  \nATOM   1069  C   HIS A 956     -22.866  -5.445 -11.162  1.00 41.07           C  \nATOM   1070  O   HIS A 956     -21.760  -5.986 -11.208  1.00 39.48           O  \nATOM   1071  CB  HIS A 956     -22.844  -3.047 -10.318  1.00 37.69           C  \nATOM   1072  CG  HIS A 956     -23.836  -2.324 -11.193  1.00 40.30           C  \nATOM   1073  ND1 HIS A 956     -23.676  -2.210 -12.577  1.00 40.74           N  \nATOM   1074  CD2 HIS A 956     -25.002  -1.686 -10.825  1.00 42.24           C  \nATOM   1075  CE1 HIS A 956     -24.733  -1.519 -12.984  1.00 40.29           C  \nATOM   1076  NE2 HIS A 956     -25.550  -1.179 -11.989  1.00 41.53           N  \nATOM   1077  H   HIS A 956     -21.665  -5.494  -8.953  1.00 39.68           H  \nATOM   1078  HA  HIS A 956     -24.284  -4.585  -9.796  1.00 38.26           H  \nATOM   1079  HB3 HIS A 956     -21.857  -2.986 -10.778  1.00 37.69           H  \nATOM   1080  HB2 HIS A 956     -22.772  -2.476  -9.395  1.00 37.69           H  \nATOM   1081  HD2 HIS A 956     -25.467  -1.557  -9.859  1.00 42.24           H  \nATOM   1082  HE1 HIS A 956     -24.909  -1.252 -14.014  1.00 40.29           H  \nATOM   1083  HE2 HIS A 956     -26.411  -0.655 -12.072  1.00 41.53           H  \nATOM   1084  N   GLU A 957     -23.808  -5.580 -12.110  1.00 37.79           N  \nATOM   1085  CA  GLU A 957     -23.646  -6.366 -13.338  1.00 37.07           C  \nATOM   1086  C   GLU A 957     -22.581  -5.811 -14.309  1.00 38.36           C  \nATOM   1087  O   GLU A 957     -22.069  -6.584 -15.119  1.00 38.29           O  \nATOM   1088  CB  GLU A 957     -25.017  -6.521 -14.032  1.00 39.83           C  \nATOM   1089  CG  GLU A 957     -25.639  -5.202 -14.545  1.00 51.33           C  \nATOM   1090  CD  GLU A 957     -26.973  -5.377 -15.283  1.00 75.08           C  \nATOM   1091  OE1 GLU A 957     -27.876  -4.551 -15.023  1.00 76.02           O  \nATOM   1092  OE2 GLU A 957     -27.077  -6.311 -16.109  1.00 61.54           O1-\nATOM   1093  H   GLU A 957     -24.697  -5.109 -11.999  1.00 37.79           H  \nATOM   1094  HA  GLU A 957     -23.315  -7.363 -13.038  1.00 37.07           H  \nATOM   1095  HB3 GLU A 957     -25.713  -7.007 -13.347  1.00 39.83           H  \nATOM   1096  HB2 GLU A 957     -24.898  -7.214 -14.866  1.00 39.83           H  \nATOM   1097  HG3 GLU A 957     -24.955  -4.731 -15.244  1.00 51.33           H  \nATOM   1098  HG2 GLU A 957     -25.753  -4.493 -13.725  1.00 51.33           H  \nATOM   1099  N   HIS A 958     -22.266  -4.507 -14.202  1.00 33.06           N  \nATOM   1100  CA  HIS A 958     -21.263  -3.805 -15.008  1.00 30.23           C  \nATOM   1101  C   HIS A 958     -20.045  -3.370 -14.175  1.00 34.52           C  \nATOM   1102  O   HIS A 958     -19.363  -2.415 -14.546  1.00 33.24           O  \nATOM   1103  CB  HIS A 958     -21.913  -2.635 -15.775  1.00 29.49           C  \nATOM   1104  CG  HIS A 958     -23.094  -3.030 -16.626  1.00 32.84           C  \nATOM   1105  ND1 HIS A 958     -23.069  -4.116 -17.483  1.00 34.50           N  \nATOM   1106  CD2 HIS A 958     -24.367  -2.515 -16.722  1.00 35.61           C  \nATOM   1107  CE1 HIS A 958     -24.286  -4.227 -18.018  1.00 34.74           C  \nATOM   1108  NE2 HIS A 958     -25.123  -3.285 -17.606  1.00 35.88           N  \nATOM   1109  H   HIS A 958     -22.751  -3.939 -13.519  1.00 33.06           H  \nATOM   1110  HA  HIS A 958     -20.862  -4.495 -15.749  1.00 30.23           H  \nATOM   1111  HB3 HIS A 958     -21.178  -2.172 -16.435  1.00 29.49           H  \nATOM   1112  HB2 HIS A 958     -22.237  -1.860 -15.079  1.00 29.49           H  \nATOM   1113  HD1 HIS A 958     -22.273  -4.714 -17.661  1.00 34.50           H  \nATOM   1114  HD2 HIS A 958     -24.807  -1.676 -16.210  1.00 35.61           H  \nATOM   1115  HE1 HIS A 958     -24.562  -4.994 -18.726  1.00 34.74           H  \nATOM   1116  N   ILE A 959     -19.758  -4.122 -13.102  1.00 33.55           N  \nATOM   1117  CA  ILE A 959     -18.513  -4.085 -12.339  1.00 33.44           C  \nATOM   1118  C   ILE A 959     -18.048  -5.543 -12.152  1.00 38.25           C  \nATOM   1119  O   ILE A 959     -18.891  -6.426 -11.973  1.00 38.75           O  \nATOM   1120  CB  ILE A 959     -18.700  -3.369 -10.959  1.00 37.20           C  \nATOM   1121  CG1 ILE A 959     -18.910  -1.848 -11.173  1.00 36.98           C  \nATOM   1122  CG2 ILE A 959     -17.554  -3.612  -9.949  1.00 38.30           C  \nATOM   1123  CD1 ILE A 959     -19.229  -1.049  -9.902  1.00 43.20           C  \nATOM   1124  H   ILE A 959     -20.381  -4.880 -12.858  1.00 33.55           H  \nATOM   1125  HA  ILE A 959     -17.747  -3.561 -12.911  1.00 33.44           H  \nATOM   1126  HB  ILE A 959     -19.610  -3.762 -10.502  1.00 37.20           H  \nATOM   1127 HG13 ILE A 959     -19.722  -1.677 -11.879  1.00 36.98           H  \nATOM   1128 HG12 ILE A 959     -18.021  -1.424 -11.638  1.00 36.98           H  \nATOM   1129 HG21 ILE A 959     -17.680  -3.036  -9.034  1.00 38.30           H  \nATOM   1130 HG22 ILE A 959     -17.504  -4.652  -9.633  1.00 38.30           H  \nATOM   1131 HG23 ILE A 959     -16.590  -3.347 -10.379  1.00 38.30           H  \nATOM   1132 HD11 ILE A 959     -19.719  -0.110 -10.158  1.00 43.20           H  \nATOM   1133 HD12 ILE A 959     -19.889  -1.604  -9.235  1.00 43.20           H  \nATOM   1134 HD13 ILE A 959     -18.323  -0.797  -9.352  1.00 43.20           H  \nATOM   1135  N   ILE A 960     -16.722  -5.778 -12.199  1.00 34.04           N  \nATOM   1136  CA  ILE A 960     -16.103  -7.089 -11.969  1.00 34.30           C  \nATOM   1137  C   ILE A 960     -16.404  -7.598 -10.542  1.00 39.83           C  \nATOM   1138  O   ILE A 960     -16.171  -6.877  -9.571  1.00 39.81           O  \nATOM   1139  CB  ILE A 960     -14.562  -7.077 -12.223  1.00 35.69           C  \nATOM   1140  CG1 ILE A 960     -13.980  -8.512 -12.252  1.00 36.05           C  \nATOM   1141  CG2 ILE A 960     -13.761  -6.184 -11.246  1.00 35.48           C  \nATOM   1142  CD1 ILE A 960     -12.566  -8.631 -12.844  1.00 37.96           C  \nATOM   1143  H   ILE A 960     -16.085  -5.009 -12.369  1.00 34.04           H  \nATOM   1144  HA  ILE A 960     -16.557  -7.774 -12.688  1.00 34.30           H  \nATOM   1145  HB  ILE A 960     -14.424  -6.656 -13.220  1.00 35.69           H  \nATOM   1146 HG13 ILE A 960     -14.642  -9.150 -12.839  1.00 36.05           H  \nATOM   1147 HG12 ILE A 960     -13.984  -8.936 -11.247  1.00 36.05           H  \nATOM   1148 HG21 ILE A 960     -12.742  -6.020 -11.594  1.00 35.48           H  \nATOM   1149 HG22 ILE A 960     -14.222  -5.203 -11.131  1.00 35.48           H  \nATOM   1150 HG23 ILE A 960     -13.683  -6.633 -10.257  1.00 35.48           H  \nATOM   1151 HD11 ILE A 960     -11.934  -9.264 -12.221  1.00 37.96           H  \nATOM   1152 HD12 ILE A 960     -12.597  -9.084 -13.834  1.00 37.96           H  \nATOM   1153 HD13 ILE A 960     -12.065  -7.670 -12.948  1.00 37.96           H  \nATOM   1154  N   LYS A 961     -16.984  -8.804 -10.450  1.00 38.47           N  \nATOM   1155  CA  LYS A 961     -17.508  -9.334  -9.197  1.00 40.15           C  \nATOM   1156  C   LYS A 961     -16.382  -9.870  -8.302  1.00 44.21           C  \nATOM   1157  O   LYS A 961     -15.549 -10.660  -8.753  1.00 42.58           O  \nATOM   1158  CB  LYS A 961     -18.572 -10.416  -9.471  1.00 43.99           C  \nATOM   1159  CG  LYS A 961     -19.531 -10.611  -8.279  1.00 65.82           C  \nATOM   1160  CD  LYS A 961     -20.376 -11.889  -8.358  1.00 82.27           C  \nATOM   1161  CE  LYS A 961     -19.590 -13.141  -7.933  1.00 98.09           C  \nATOM   1162  NZ  LYS A 961     -20.439 -14.344  -7.951  1.00108.33           N1+\nATOM   1163  H   LYS A 961     -17.162  -9.351 -11.285  1.00 38.47           H  \nATOM   1164  HA  LYS A 961     -18.005  -8.516  -8.672  1.00 40.15           H  \nATOM   1165  HB3 LYS A 961     -18.087 -11.352  -9.750  1.00 43.99           H  \nATOM   1166  HB2 LYS A 961     -19.179 -10.126 -10.330  1.00 43.99           H  \nATOM   1167  HG3 LYS A 961     -20.200  -9.751  -8.233  1.00 65.82           H  \nATOM   1168  HG2 LYS A 961     -18.986 -10.605  -7.335  1.00 65.82           H  \nATOM   1169  HD3 LYS A 961     -20.746 -12.012  -9.378  1.00 82.27           H  \nATOM   1170  HD2 LYS A 961     -21.259 -11.767  -7.729  1.00 82.27           H  \nATOM   1171  HE3 LYS A 961     -19.197 -13.012  -6.923  1.00 98.09           H  \nATOM   1172  HE2 LYS A 961     -18.735 -13.304  -8.589  1.00 98.09           H  \nATOM   1173  HZ1 LYS A 961     -20.777 -14.500  -8.890  1.00108.33           H  \nATOM   1174  HZ2 LYS A 961     -19.902 -15.143  -7.647  1.00108.33           H  \nATOM   1175  HZ3 LYS A 961     -21.224 -14.213  -7.329  1.00108.33           H  \nATOM   1176  N   TYR A 962     -16.430  -9.444  -7.032  1.00 42.43           N  \nATOM   1177  CA  TYR A 962     -15.610  -9.940  -5.935  1.00 43.53           C  \nATOM   1178  C   TYR A 962     -16.001 -11.390  -5.592  1.00 47.09           C  \nATOM   1179  O   TYR A 962     -17.139 -11.625  -5.182  1.00 48.07           O  \nATOM   1180  CB  TYR A 962     -15.807  -8.977  -4.743  1.00 46.00           C  \nATOM   1181  CG  TYR A 962     -15.052  -9.322  -3.473  1.00 48.99           C  \nATOM   1182  CD1 TYR A 962     -13.693  -8.973  -3.349  1.00 50.72           C  \nATOM   1183  CD2 TYR A 962     -15.708  -9.972  -2.407  1.00 51.43           C  \nATOM   1184  CE1 TYR A 962     -12.986  -9.292  -2.173  1.00 52.08           C  \nATOM   1185  CE2 TYR A 962     -15.003 -10.287  -1.231  1.00 53.15           C  \nATOM   1186  CZ  TYR A 962     -13.638  -9.957  -1.118  1.00 59.98           C  \nATOM   1187  OH  TYR A 962     -12.946 -10.296   0.007  1.00 63.78           O  \nATOM   1188  H   TYR A 962     -17.144  -8.781  -6.769  1.00 42.43           H  \nATOM   1189  HA  TYR A 962     -14.562  -9.907  -6.242  1.00 43.53           H  \nATOM   1190  HB3 TYR A 962     -16.868  -8.902  -4.498  1.00 46.00           H  \nATOM   1191  HB2 TYR A 962     -15.510  -7.972  -5.041  1.00 46.00           H  \nATOM   1192  HD1 TYR A 962     -13.193  -8.463  -4.159  1.00 50.72           H  \nATOM   1193  HD2 TYR A 962     -16.752 -10.238  -2.492  1.00 51.43           H  \nATOM   1194  HE1 TYR A 962     -11.942  -9.032  -2.085  1.00 52.08           H  \nATOM   1195  HE2 TYR A 962     -15.506 -10.796  -0.421  1.00 53.15           H  \nATOM   1196  HH  TYR A 962     -12.006 -10.107  -0.068  1.00 63.78           H  \nATOM   1197  N   LYS A 963     -15.056 -12.326  -5.771  1.00 42.37           N  \nATOM   1198  CA  LYS A 963     -15.203 -13.726  -5.366  1.00 42.56           C  \nATOM   1199  C   LYS A 963     -14.894 -13.913  -3.870  1.00 48.47           C  \nATOM   1200  O   LYS A 963     -15.618 -14.649  -3.202  1.00 50.00           O  \nATOM   1201  CB  LYS A 963     -14.273 -14.612  -6.220  1.00 43.06           C  \nATOM   1202  CG  LYS A 963     -14.767 -14.929  -7.644  1.00 48.30           C  \nATOM   1203  CD  LYS A 963     -15.641 -16.192  -7.735  1.00 61.25           C  \nATOM   1204  CE  LYS A 963     -15.976 -16.567  -9.192  1.00 72.82           C  \nATOM   1205  NZ  LYS A 963     -16.598 -17.901  -9.298  1.00 84.70           N1+\nATOM   1206  H   LYS A 963     -14.146 -12.058  -6.119  1.00 42.37           H  \nATOM   1207  HA  LYS A 963     -16.234 -14.043  -5.540  1.00 42.56           H  \nATOM   1208  HB3 LYS A 963     -14.079 -15.557  -5.715  1.00 43.06           H  \nATOM   1209  HB2 LYS A 963     -13.305 -14.125  -6.282  1.00 43.06           H  \nATOM   1210  HG3 LYS A 963     -13.891 -15.083  -8.273  1.00 48.30           H  \nATOM   1211  HG2 LYS A 963     -15.294 -14.072  -8.064  1.00 48.30           H  \nATOM   1212  HD3 LYS A 963     -16.561 -16.038  -7.170  1.00 61.25           H  \nATOM   1213  HD2 LYS A 963     -15.118 -17.020  -7.253  1.00 61.25           H  \nATOM   1214  HE3 LYS A 963     -15.071 -16.580  -9.798  1.00 72.82           H  \nATOM   1215  HE2 LYS A 963     -16.640 -15.822  -9.633  1.00 72.82           H  \nATOM   1216  HZ1 LYS A 963     -17.463 -17.922  -8.778  1.00 84.70           H  \nATOM   1217  HZ2 LYS A 963     -16.786 -18.114 -10.268  1.00 84.70           H  \nATOM   1218  HZ3 LYS A 963     -15.968 -18.599  -8.928  1.00 84.70           H  \nATOM   1219  N   GLY A 964     -13.828 -13.257  -3.383  1.00 44.37           N  \nATOM   1220  CA  GLY A 964     -13.322 -13.425  -2.026  1.00 45.35           C  \nATOM   1221  C   GLY A 964     -11.876 -12.923  -1.976  1.00 49.58           C  \nATOM   1222  O   GLY A 964     -11.436 -12.157  -2.835  1.00 45.71           O  \nATOM   1223  H   GLY A 964     -13.284 -12.660  -3.993  1.00 44.37           H  \nATOM   1224  HA3 GLY A 964     -13.348 -14.475  -1.734  1.00 45.35           H  \nATOM   1225  HA2 GLY A 964     -13.937 -12.871  -1.318  1.00 45.35           H  \nATOM   1226  N   CYS A 965     -11.142 -13.356  -0.943  1.00 49.54           N  \nATOM   1227  CA  CYS A 965      -9.711 -13.105  -0.776  1.00 51.02           C  \nATOM   1228  C   CYS A 965      -8.996 -14.425  -0.468  1.00 57.60           C  \nATOM   1229  O   CYS A 965      -9.612 -15.360   0.039  1.00 57.77           O  \nATOM   1230  CB  CYS A 965      -9.421 -12.070   0.332  1.00 52.68           C  \nATOM   1231  SG  CYS A 965      -9.626 -10.388  -0.314  1.00 55.96           S  \nATOM   1232  H   CYS A 965     -11.563 -13.969  -0.256  1.00 49.54           H  \nATOM   1233  HA  CYS A 965      -9.296 -12.749  -1.718  1.00 51.02           H  \nATOM   1234  HB3 CYS A 965      -8.393 -12.146   0.688  1.00 52.68           H  \nATOM   1235  HB2 CYS A 965     -10.070 -12.219   1.196  1.00 52.68           H  \nATOM   1236  HG  CYS A 965      -8.572 -10.428  -1.135  1.00 55.96           H  \nATOM   1237  N   CYS A 966      -7.692 -14.458  -0.772  1.00 56.83           N  \nATOM   1238  CA  CYS A 966      -6.805 -15.582  -0.501  1.00 59.37           C  \nATOM   1239  C   CYS A 966      -5.684 -15.111   0.433  1.00 64.61           C  \nATOM   1240  O   CYS A 966      -5.062 -14.084   0.157  1.00 62.66           O  \nATOM   1241  CB  CYS A 966      -6.273 -16.194  -1.818  1.00 59.95           C  \nATOM   1242  SG  CYS A 966      -5.028 -17.487  -1.549  1.00 65.77           S  \nATOM   1243  H   CYS A 966      -7.257 -13.642  -1.183  1.00 56.83           H  \nATOM   1244  HA  CYS A 966      -7.354 -16.359   0.028  1.00 59.37           H  \nATOM   1245  HB3 CYS A 966      -5.833 -15.427  -2.450  1.00 59.95           H  \nATOM   1246  HB2 CYS A 966      -7.087 -16.624  -2.397  1.00 59.95           H  \nATOM   1247  HG  CYS A 966      -5.856 -18.347  -0.947  1.00 65.77           H  \nATOM   1248  N   GLU A 967      -5.426 -15.894   1.495  1.00 64.28           N  \nATOM   1249  CA  GLU A 967      -4.285 -15.722   2.393  1.00 65.86           C  \nATOM   1250  C   GLU A 967      -2.977 -16.001   1.633  1.00 70.57           C  \nATOM   1251  O   GLU A 967      -2.751 -17.140   1.218  1.00 70.73           O  \nATOM   1252  CB  GLU A 967      -4.432 -16.675   3.601  1.00 69.10           C  \nATOM   1253  CG  GLU A 967      -3.299 -16.537   4.661  1.00 81.26           C  \nATOM   1254  CD  GLU A 967      -2.819 -17.832   5.345  1.00 98.19           C  \nATOM   1255  OE1 GLU A 967      -1.791 -17.730   6.051  1.00 78.88           O  \nATOM   1256  OE2 GLU A 967      -3.452 -18.898   5.170  1.00 93.22           O1-\nATOM   1257  H   GLU A 967      -5.983 -16.723   1.647  1.00 64.28           H  \nATOM   1258  HA  GLU A 967      -4.285 -14.693   2.759  1.00 65.86           H  \nATOM   1259  HB3 GLU A 967      -4.506 -17.692   3.214  1.00 69.10           H  \nATOM   1260  HB2 GLU A 967      -5.388 -16.487   4.092  1.00 69.10           H  \nATOM   1261  HG3 GLU A 967      -3.640 -15.856   5.442  1.00 81.26           H  \nATOM   1262  HG2 GLU A 967      -2.419 -16.055   4.236  1.00 81.26           H  \nATOM   1263  N   ASP A 968      -2.146 -14.959   1.486  1.00 66.99           N  \nATOM   1264  CA  ASP A 968      -0.819 -15.061   0.893  1.00 67.07           C  \nATOM   1265  C   ASP A 968       0.183 -15.084   2.058  1.00 72.70           C  \nATOM   1266  O   ASP A 968       0.385 -14.059   2.713  1.00 72.95           O  \nATOM   1267  CB  ASP A 968      -0.562 -13.898  -0.102  1.00 67.90           C  \nATOM   1268  CG  ASP A 968       0.531 -14.115  -1.163  1.00 83.41           C  \nATOM   1269  OD1 ASP A 968       1.212 -15.166  -1.136  1.00 85.94           O  \nATOM   1270  OD2 ASP A 968       0.684 -13.199  -2.001  1.00 90.83           O1-\nATOM   1271  H   ASP A 968      -2.394 -14.052   1.856  1.00 66.99           H  \nATOM   1272  HA  ASP A 968      -0.742 -16.003   0.347  1.00 67.07           H  \nATOM   1273  HB3 ASP A 968      -0.318 -12.982   0.436  1.00 67.90           H  \nATOM   1274  HB2 ASP A 968      -1.498 -13.674  -0.611  1.00 67.90           H  \nATOM   1275  N   ALA A 969       0.769 -16.269   2.300  1.00 69.93           N  \nATOM   1276  CA  ALA A 969       1.803 -16.496   3.313  1.00 70.98           C  \nATOM   1277  C   ALA A 969       3.133 -15.800   2.972  1.00 74.28           C  \nATOM   1278  O   ALA A 969       3.798 -15.301   3.880  1.00 74.55           O  \nATOM   1279  CB  ALA A 969       1.999 -18.007   3.503  1.00 72.54           C  \nATOM   1280  H   ALA A 969       0.520 -17.067   1.734  1.00 69.93           H  \nATOM   1281  HA  ALA A 969       1.442 -16.082   4.258  1.00 70.98           H  \nATOM   1282  HB1 ALA A 969       2.753 -18.215   4.264  1.00 72.54           H  \nATOM   1283  HB2 ALA A 969       1.072 -18.482   3.826  1.00 72.54           H  \nATOM   1284  HB3 ALA A 969       2.317 -18.490   2.579  1.00 72.54           H  \nATOM   1285  N   GLY A 970       3.455 -15.723   1.668  1.00 69.45           N  \nATOM   1286  CA  GLY A 970       4.486 -14.840   1.127  1.00 69.02           C  \nATOM   1287  C   GLY A 970       3.895 -13.429   0.997  1.00 72.14           C  \nATOM   1288  O   GLY A 970       2.682 -13.266   0.899  1.00 71.87           O  \nATOM   1289  H   GLY A 970       2.832 -16.144   0.993  1.00 69.45           H  \nATOM   1290  HA3 GLY A 970       4.784 -15.198   0.141  1.00 69.02           H  \nATOM   1291  HA2 GLY A 970       5.374 -14.835   1.761  1.00 69.02           H  \nATOM   1292  N   ALA A 971       4.753 -12.396   1.021  1.00 67.87           N  \nATOM   1293  CA  ALA A 971       4.399 -10.968   0.975  1.00 66.36           C  \nATOM   1294  C   ALA A 971       3.642 -10.423   2.209  1.00 68.68           C  \nATOM   1295  O   ALA A 971       3.602  -9.204   2.353  1.00 67.93           O  \nATOM   1296  CB  ALA A 971       3.635 -10.620  -0.324  1.00 65.39           C  \nATOM   1297  H   ALA A 971       5.740 -12.592   1.108  1.00 67.87           H  \nATOM   1298  HA  ALA A 971       5.351 -10.437   0.943  1.00 66.36           H  \nATOM   1299  HB1 ALA A 971       3.520  -9.542  -0.439  1.00 65.39           H  \nATOM   1300  HB2 ALA A 971       4.163 -10.985  -1.204  1.00 65.39           H  \nATOM   1301  HB3 ALA A 971       2.631 -11.045  -0.345  1.00 65.39           H  \nATOM   1302  N   ALA A 972       3.071 -11.293   3.066  1.00 64.62           N  \nATOM   1303  CA  ALA A 972       2.294 -10.981   4.274  1.00 64.42           C  \nATOM   1304  C   ALA A 972       1.103 -10.047   3.984  1.00 65.37           C  \nATOM   1305  O   ALA A 972       1.060  -8.921   4.484  1.00 65.17           O  \nATOM   1306  CB  ALA A 972       3.227 -10.442   5.377  1.00 66.93           C  \nATOM   1307  H   ALA A 972       3.134 -12.278   2.848  1.00 64.62           H  \nATOM   1308  HA  ALA A 972       1.876 -11.926   4.624  1.00 64.42           H  \nATOM   1309  HB1 ALA A 972       2.682 -10.275   6.307  1.00 66.93           H  \nATOM   1310  HB2 ALA A 972       4.025 -11.154   5.594  1.00 66.93           H  \nATOM   1311  HB3 ALA A 972       3.695  -9.499   5.094  1.00 66.93           H  \nATOM   1312  N   SER A 973       0.184 -10.522   3.129  1.00 59.44           N  \nATOM   1313  CA  SER A 973      -0.932  -9.741   2.593  1.00 57.90           C  \nATOM   1314  C   SER A 973      -2.075 -10.655   2.119  1.00 59.01           C  \nATOM   1315  O   SER A 973      -1.921 -11.876   2.086  1.00 59.49           O  \nATOM   1316  CB  SER A 973      -0.403  -8.798   1.481  1.00 60.76           C  \nATOM   1317  OG  SER A 973       0.026  -9.508   0.334  1.00 68.97           O  \nATOM   1318  H   SER A 973       0.267 -11.466   2.774  1.00 59.44           H  \nATOM   1319  HA  SER A 973      -1.339  -9.130   3.402  1.00 57.90           H  \nATOM   1320  HB3 SER A 973       0.421  -8.183   1.842  1.00 60.76           H  \nATOM   1321  HB2 SER A 973      -1.186  -8.105   1.171  1.00 60.76           H  \nATOM   1322  HG  SER A 973       0.794 -10.035   0.572  1.00 68.97           H  \nATOM   1323  N   LEU A 974      -3.205 -10.033   1.747  1.00 52.28           N  \nATOM   1324  CA  LEU A 974      -4.302 -10.697   1.044  1.00 50.34           C  \nATOM   1325  C   LEU A 974      -4.106 -10.533  -0.466  1.00 50.70           C  \nATOM   1326  O   LEU A 974      -3.776  -9.438  -0.918  1.00 49.90           O  \nATOM   1327  CB  LEU A 974      -5.652 -10.057   1.444  1.00 50.33           C  \nATOM   1328  CG  LEU A 974      -6.133 -10.385   2.872  1.00 55.89           C  \nATOM   1329  CD1 LEU A 974      -7.390  -9.560   3.225  1.00 55.99           C  \nATOM   1330  CD2 LEU A 974      -6.349 -11.900   3.087  1.00 57.89           C  \nATOM   1331  H   LEU A 974      -3.270  -9.028   1.815  1.00 52.28           H  \nATOM   1332  HA  LEU A 974      -4.317 -11.761   1.282  1.00 50.34           H  \nATOM   1333  HB3 LEU A 974      -6.429 -10.378   0.746  1.00 50.33           H  \nATOM   1334  HB2 LEU A 974      -5.580  -8.974   1.322  1.00 50.33           H  \nATOM   1335  HG  LEU A 974      -5.348 -10.068   3.560  1.00 55.89           H  \nATOM   1336 HD11 LEU A 974      -7.239  -9.004   4.151  1.00 55.99           H  \nATOM   1337 HD12 LEU A 974      -7.635  -8.832   2.451  1.00 55.99           H  \nATOM   1338 HD13 LEU A 974      -8.277 -10.179   3.359  1.00 55.99           H  \nATOM   1339 HD21 LEU A 974      -7.274 -12.124   3.617  1.00 57.89           H  \nATOM   1340 HD22 LEU A 974      -6.384 -12.447   2.144  1.00 57.89           H  \nATOM   1341 HD23 LEU A 974      -5.535 -12.324   3.676  1.00 57.89           H  \nATOM   1342  N   GLN A 975      -4.395 -11.603  -1.216  1.00 44.54           N  \nATOM   1343  CA  GLN A 975      -4.655 -11.549  -2.651  1.00 42.17           C  \nATOM   1344  C   GLN A 975      -6.158 -11.329  -2.878  1.00 43.56           C  \nATOM   1345  O   GLN A 975      -6.971 -11.919  -2.168  1.00 42.93           O  \nATOM   1346  CB  GLN A 975      -4.191 -12.855  -3.311  1.00 43.83           C  \nATOM   1347  CG  GLN A 975      -2.665 -12.973  -3.441  1.00 59.19           C  \nATOM   1348  CD  GLN A 975      -2.252 -14.354  -3.950  1.00 77.91           C  \nATOM   1349  OE1 GLN A 975      -1.888 -14.512  -5.113  1.00 74.64           O  \nATOM   1350  NE2 GLN A 975      -2.324 -15.365  -3.082  1.00 71.32           N  \nATOM   1351  H   GLN A 975      -4.643 -12.473  -0.760  1.00 44.54           H  \nATOM   1352  HA  GLN A 975      -4.101 -10.725  -3.104  1.00 42.17           H  \nATOM   1353  HB3 GLN A 975      -4.625 -12.926  -4.306  1.00 43.83           H  \nATOM   1354  HB2 GLN A 975      -4.582 -13.695  -2.742  1.00 43.83           H  \nATOM   1355  HG3 GLN A 975      -2.186 -12.784  -2.484  1.00 59.19           H  \nATOM   1356  HG2 GLN A 975      -2.291 -12.209  -4.121  1.00 59.19           H  \nATOM   1357 HE22 GLN A 975      -2.096 -16.302  -3.374  1.00 71.32           H  \nATOM   1358 HE21 GLN A 975      -2.627 -15.202  -2.132  1.00 71.32           H  \nATOM   1359  N   LEU A 976      -6.488 -10.492  -3.868  1.00 37.72           N  \nATOM   1360  CA  LEU A 976      -7.847 -10.131  -4.255  1.00 36.76           C  \nATOM   1361  C   LEU A 976      -8.327 -11.093  -5.350  1.00 38.66           C  \nATOM   1362  O   LEU A 976      -7.956 -10.919  -6.512  1.00 37.25           O  \nATOM   1363  CB  LEU A 976      -7.819  -8.656  -4.717  1.00 36.56           C  \nATOM   1364  CG  LEU A 976      -9.143  -8.055  -5.237  1.00 41.61           C  \nATOM   1365  CD1 LEU A 976     -10.288  -8.184  -4.216  1.00 43.42           C  \nATOM   1366  CD2 LEU A 976      -8.926  -6.598  -5.699  1.00 42.85           C  \nATOM   1367  H   LEU A 976      -5.752 -10.099  -4.441  1.00 37.72           H  \nATOM   1368  HA  LEU A 976      -8.510 -10.216  -3.392  1.00 36.76           H  \nATOM   1369  HB3 LEU A 976      -7.085  -8.565  -5.513  1.00 36.56           H  \nATOM   1370  HB2 LEU A 976      -7.445  -8.039  -3.900  1.00 36.56           H  \nATOM   1371  HG  LEU A 976      -9.442  -8.613  -6.124  1.00 41.61           H  \nATOM   1372 HD11 LEU A 976     -10.930  -7.303  -4.187  1.00 43.42           H  \nATOM   1373 HD12 LEU A 976     -10.920  -9.035  -4.469  1.00 43.42           H  \nATOM   1374 HD13 LEU A 976      -9.917  -8.343  -3.204  1.00 43.42           H  \nATOM   1375 HD21 LEU A 976      -9.526  -5.885  -5.134  1.00 42.85           H  \nATOM   1376 HD22 LEU A 976      -7.888  -6.282  -5.594  1.00 42.85           H  \nATOM   1377 HD23 LEU A 976      -9.185  -6.482  -6.752  1.00 42.85           H  \nATOM   1378  N   VAL A 977      -9.134 -12.091  -4.958  1.00 35.03           N  \nATOM   1379  CA  VAL A 977      -9.722 -13.059  -5.882  1.00 34.91           C  \nATOM   1380  C   VAL A 977     -10.993 -12.447  -6.502  1.00 38.85           C  \nATOM   1381  O   VAL A 977     -11.896 -12.025  -5.778  1.00 39.08           O  \nATOM   1382  CB  VAL A 977     -10.085 -14.406  -5.191  1.00 39.71           C  \nATOM   1383  CG1 VAL A 977     -10.564 -15.484  -6.188  1.00 39.45           C  \nATOM   1384  CG2 VAL A 977      -8.900 -14.967  -4.381  1.00 39.89           C  \nATOM   1385  H   VAL A 977      -9.424 -12.162  -3.993  1.00 35.03           H  \nATOM   1386  HA  VAL A 977      -9.005 -13.279  -6.676  1.00 34.91           H  \nATOM   1387  HB  VAL A 977     -10.902 -14.237  -4.489  1.00 39.71           H  \nATOM   1388 HG11 VAL A 977     -10.841 -16.401  -5.668  1.00 39.45           H  \nATOM   1389 HG12 VAL A 977     -11.429 -15.174  -6.770  1.00 39.45           H  \nATOM   1390 HG13 VAL A 977      -9.779 -15.739  -6.898  1.00 39.45           H  \nATOM   1391 HG21 VAL A 977      -9.153 -15.924  -3.927  1.00 39.89           H  \nATOM   1392 HG22 VAL A 977      -8.024 -15.122  -5.011  1.00 39.89           H  \nATOM   1393 HG23 VAL A 977      -8.610 -14.298  -3.573  1.00 39.89           H  \nATOM   1394  N   MET A 978     -11.015 -12.404  -7.839  1.00 34.03           N  \nATOM   1395  CA  MET A 978     -12.113 -11.896  -8.660  1.00 34.32           C  \nATOM   1396  C   MET A 978     -12.538 -12.993  -9.643  1.00 36.69           C  \nATOM   1397  O   MET A 978     -11.818 -13.978  -9.822  1.00 35.63           O  \nATOM   1398  CB  MET A 978     -11.644 -10.647  -9.443  1.00 36.81           C  \nATOM   1399  CG  MET A 978     -10.999  -9.544  -8.586  1.00 41.50           C  \nATOM   1400  SD  MET A 978     -10.358  -8.128  -9.522  1.00 45.78           S  \nATOM   1401  CE  MET A 978      -8.942  -8.902 -10.352  1.00 42.96           C  \nATOM   1402  H   MET A 978     -10.221 -12.753  -8.360  1.00 34.03           H  \nATOM   1403  HA  MET A 978     -12.972 -11.635  -8.040  1.00 34.32           H  \nATOM   1404  HB3 MET A 978     -12.500 -10.218  -9.964  1.00 36.81           H  \nATOM   1405  HB2 MET A 978     -10.949 -10.945 -10.226  1.00 36.81           H  \nATOM   1406  HG3 MET A 978     -10.167  -9.942  -8.007  1.00 41.50           H  \nATOM   1407  HG2 MET A 978     -11.729  -9.178  -7.865  1.00 41.50           H  \nATOM   1408  HE1 MET A 978      -8.326  -8.141 -10.832  1.00 42.96           H  \nATOM   1409  HE2 MET A 978      -8.328  -9.444  -9.634  1.00 42.96           H  \nATOM   1410  HE3 MET A 978      -9.276  -9.600 -11.120  1.00 42.96           H  \nATOM   1411  N   GLU A 979     -13.692 -12.793 -10.297  1.00 33.63           N  \nATOM   1412  CA  GLU A 979     -14.132 -13.639 -11.407  1.00 33.95           C  \nATOM   1413  C   GLU A 979     -13.224 -13.450 -12.637  1.00 35.56           C  \nATOM   1414  O   GLU A 979     -12.741 -12.343 -12.884  1.00 32.73           O  \nATOM   1415  CB  GLU A 979     -15.611 -13.341 -11.735  1.00 36.17           C  \nATOM   1416  CG  GLU A 979     -15.895 -11.927 -12.301  1.00 42.68           C  \nATOM   1417  CD  GLU A 979     -17.362 -11.631 -12.644  1.00 58.73           C  \nATOM   1418  OE1 GLU A 979     -18.206 -12.554 -12.607  1.00 57.48           O  \nATOM   1419  OE2 GLU A 979     -17.624 -10.444 -12.930  1.00 43.43           O1-\nATOM   1420  H   GLU A 979     -14.250 -11.971 -10.107  1.00 33.63           H  \nATOM   1421  HA  GLU A 979     -14.064 -14.680 -11.082  1.00 33.95           H  \nATOM   1422  HB3 GLU A 979     -16.208 -13.495 -10.835  1.00 36.17           H  \nATOM   1423  HB2 GLU A 979     -15.958 -14.090 -12.449  1.00 36.17           H  \nATOM   1424  HG3 GLU A 979     -15.329 -11.770 -13.218  1.00 42.68           H  \nATOM   1425  HG2 GLU A 979     -15.547 -11.175 -11.591  1.00 42.68           H  \nATOM   1426  N   TYR A 980     -13.046 -14.537 -13.401  1.00 33.04           N  \nATOM   1427  CA  TYR A 980     -12.435 -14.501 -14.725  1.00 34.05           C  \nATOM   1428  C   TYR A 980     -13.483 -14.026 -15.745  1.00 39.90           C  \nATOM   1429  O   TYR A 980     -14.472 -14.726 -15.958  1.00 41.17           O  \nATOM   1430  CB  TYR A 980     -11.868 -15.895 -15.054  1.00 36.60           C  \nATOM   1431  CG  TYR A 980     -11.332 -16.062 -16.464  1.00 38.89           C  \nATOM   1432  CD1 TYR A 980     -10.181 -15.355 -16.870  1.00 40.20           C  \nATOM   1433  CD2 TYR A 980     -11.982 -16.925 -17.372  1.00 40.57           C  \nATOM   1434  CE1 TYR A 980      -9.674 -15.525 -18.172  1.00 41.79           C  \nATOM   1435  CE2 TYR A 980     -11.480 -17.085 -18.677  1.00 41.35           C  \nATOM   1436  CZ  TYR A 980     -10.325 -16.386 -19.077  1.00 46.65           C  \nATOM   1437  OH  TYR A 980      -9.838 -16.543 -20.341  1.00 46.21           O  \nATOM   1438  H   TYR A 980     -13.471 -15.414 -13.135  1.00 33.04           H  \nATOM   1439  HA  TYR A 980     -11.599 -13.798 -14.714  1.00 34.05           H  \nATOM   1440  HB3 TYR A 980     -12.642 -16.648 -14.893  1.00 36.60           H  \nATOM   1441  HB2 TYR A 980     -11.066 -16.137 -14.355  1.00 36.60           H  \nATOM   1442  HD1 TYR A 980      -9.678 -14.693 -16.181  1.00 40.20           H  \nATOM   1443  HD2 TYR A 980     -12.868 -17.466 -17.073  1.00 40.57           H  \nATOM   1444  HE1 TYR A 980      -8.783 -14.995 -18.472  1.00 41.79           H  \nATOM   1445  HE2 TYR A 980     -11.986 -17.745 -19.366  1.00 41.35           H  \nATOM   1446  HH  TYR A 980     -10.419 -17.063 -20.902  1.00 46.21           H  \nATOM   1447  N   VAL A 981     -13.243 -12.844 -16.331  1.00 35.70           N  \nATOM   1448  CA  VAL A 981     -14.105 -12.203 -17.322  1.00 35.13           C  \nATOM   1449  C   VAL A 981     -13.580 -12.610 -18.729  1.00 39.95           C  \nATOM   1450  O   VAL A 981     -12.511 -12.123 -19.104  1.00 40.49           O  \nATOM   1451  CB  VAL A 981     -14.061 -10.658 -17.131  1.00 37.53           C  \nATOM   1452  CG1 VAL A 981     -14.865  -9.900 -18.194  1.00 37.76           C  \nATOM   1453  CG2 VAL A 981     -14.577 -10.251 -15.736  1.00 36.89           C  \nATOM   1454  H   VAL A 981     -12.403 -12.336 -16.094  1.00 35.70           H  \nATOM   1455  HA  VAL A 981     -15.141 -12.487 -17.157  1.00 35.13           H  \nATOM   1456  HB  VAL A 981     -13.027 -10.316 -17.194  1.00 37.53           H  \nATOM   1457 HG11 VAL A 981     -15.030  -8.860 -17.916  1.00 37.76           H  \nATOM   1458 HG12 VAL A 981     -14.337  -9.900 -19.144  1.00 37.76           H  \nATOM   1459 HG13 VAL A 981     -15.848 -10.347 -18.332  1.00 37.76           H  \nATOM   1460 HG21 VAL A 981     -14.545  -9.169 -15.601  1.00 36.89           H  \nATOM   1461 HG22 VAL A 981     -15.608 -10.571 -15.585  1.00 36.89           H  \nATOM   1462 HG23 VAL A 981     -13.974 -10.689 -14.942  1.00 36.89           H  \nATOM   1463  N   PRO A 982     -14.241 -13.581 -19.416  1.00 37.29           N  \nATOM   1464  CA  PRO A 982     -13.592 -14.428 -20.446  1.00 36.67           C  \nATOM   1465  C   PRO A 982     -12.871 -13.788 -21.645  1.00 38.06           C  \nATOM   1466  O   PRO A 982     -11.842 -14.330 -22.047  1.00 37.41           O  \nATOM   1467  CB  PRO A 982     -14.705 -15.369 -20.926  1.00 39.18           C  \nATOM   1468  CG  PRO A 982     -15.606 -15.513 -19.720  1.00 44.96           C  \nATOM   1469  CD  PRO A 982     -15.576 -14.120 -19.111  1.00 40.09           C  \nATOM   1470  HA  PRO A 982     -12.855 -15.022 -19.904  1.00 36.67           H  \nATOM   1471  HB3 PRO A 982     -14.326 -16.330 -21.276  1.00 39.18           H  \nATOM   1472  HB2 PRO A 982     -15.269 -14.915 -21.745  1.00 39.18           H  \nATOM   1473  HG3 PRO A 982     -15.167 -16.226 -19.021  1.00 44.96           H  \nATOM   1474  HG2 PRO A 982     -16.612 -15.855 -19.966  1.00 44.96           H  \nATOM   1475  HD2 PRO A 982     -16.322 -13.488 -19.589  1.00 40.09           H  \nATOM   1476  HD3 PRO A 982     -15.833 -14.200 -18.058  1.00 40.09           H  \nATOM   1477  N   LEU A 983     -13.410 -12.695 -22.212  1.00 33.36           N  \nATOM   1478  CA  LEU A 983     -12.867 -12.076 -23.431  1.00 31.91           C  \nATOM   1479  C   LEU A 983     -11.838 -10.960 -23.155  1.00 34.62           C  \nATOM   1480  O   LEU A 983     -11.266 -10.441 -24.114  1.00 34.03           O  \nATOM   1481  CB  LEU A 983     -14.023 -11.600 -24.346  1.00 31.79           C  \nATOM   1482  CG  LEU A 983     -14.935 -12.735 -24.868  1.00 36.75           C  \nATOM   1483  CD1 LEU A 983     -16.149 -12.165 -25.617  1.00 37.07           C  \nATOM   1484  CD2 LEU A 983     -14.182 -13.760 -25.739  1.00 39.07           C  \nATOM   1485  H   LEU A 983     -14.253 -12.283 -21.835  1.00 33.36           H  \nATOM   1486  HA  LEU A 983     -12.308 -12.827 -23.990  1.00 31.91           H  \nATOM   1487  HB3 LEU A 983     -13.617 -11.066 -25.205  1.00 31.79           H  \nATOM   1488  HB2 LEU A 983     -14.631 -10.871 -23.818  1.00 31.79           H  \nATOM   1489  HG  LEU A 983     -15.336 -13.264 -24.002  1.00 36.75           H  \nATOM   1490 HD11 LEU A 983     -16.944 -12.908 -25.684  1.00 37.07           H  \nATOM   1491 HD12 LEU A 983     -16.559 -11.295 -25.106  1.00 37.07           H  \nATOM   1492 HD13 LEU A 983     -15.890 -11.865 -26.633  1.00 37.07           H  \nATOM   1493 HD21 LEU A 983     -14.730 -14.004 -26.649  1.00 39.07           H  \nATOM   1494 HD22 LEU A 983     -13.202 -13.396 -26.048  1.00 39.07           H  \nATOM   1495 HD23 LEU A 983     -14.030 -14.692 -25.194  1.00 39.07           H  \nATOM   1496  N   GLY A 984     -11.577 -10.645 -21.872  1.00 30.54           N  \nATOM   1497  CA  GLY A 984     -10.542  -9.702 -21.438  1.00 29.44           C  \nATOM   1498  C   GLY A 984     -10.893  -8.247 -21.772  1.00 30.46           C  \nATOM   1499  O   GLY A 984     -12.035  -7.935 -22.104  1.00 29.51           O  \nATOM   1500  H   GLY A 984     -12.090 -11.120 -21.142  1.00 30.54           H  \nATOM   1501  HA3 GLY A 984      -9.590  -9.962 -21.901  1.00 29.44           H  \nATOM   1502  HA2 GLY A 984     -10.415  -9.792 -20.359  1.00 29.44           H  \nATOM   1503  N   SER A 985      -9.900  -7.349 -21.647  1.00 25.72           N  \nATOM   1504  CA  SER A 985     -10.058  -5.906 -21.855  1.00 25.55           C  \nATOM   1505  C   SER A 985     -10.449  -5.533 -23.295  1.00 28.85           C  \nATOM   1506  O   SER A 985     -10.017  -6.199 -24.235  1.00 26.31           O  \nATOM   1507  CB  SER A 985      -8.804  -5.158 -21.361  1.00 29.24           C  \nATOM   1508  OG  SER A 985      -7.724  -5.184 -22.273  1.00 35.45           O  \nATOM   1509  H   SER A 985      -8.976  -7.668 -21.385  1.00 25.72           H  \nATOM   1510  HA  SER A 985     -10.867  -5.593 -21.205  1.00 25.55           H  \nATOM   1511  HB3 SER A 985      -8.479  -5.544 -20.395  1.00 29.24           H  \nATOM   1512  HB2 SER A 985      -9.060  -4.111 -21.202  1.00 29.24           H  \nATOM   1513  HG  SER A 985      -7.369  -6.078 -22.315  1.00 35.45           H  \nATOM   1514  N   LEU A 986     -11.219  -4.440 -23.432  1.00 27.52           N  \nATOM   1515  CA  LEU A 986     -11.584  -3.835 -24.717  1.00 27.90           C  \nATOM   1516  C   LEU A 986     -10.369  -3.303 -25.499  1.00 31.20           C  \nATOM   1517  O   LEU A 986     -10.426  -3.281 -26.727  1.00 30.54           O  \nATOM   1518  CB  LEU A 986     -12.621  -2.712 -24.492  1.00 27.75           C  \nATOM   1519  CG  LEU A 986     -14.045  -3.208 -24.157  1.00 32.92           C  \nATOM   1520  CD1 LEU A 986     -14.956  -2.019 -23.808  1.00 33.36           C  \nATOM   1521  CD2 LEU A 986     -14.667  -4.058 -25.284  1.00 36.70           C  \nATOM   1522  H   LEU A 986     -11.542  -3.953 -22.605  1.00 27.52           H  \nATOM   1523  HA  LEU A 986     -12.030  -4.614 -25.334  1.00 27.90           H  \nATOM   1524  HB3 LEU A 986     -12.688  -2.084 -25.381  1.00 27.75           H  \nATOM   1525  HB2 LEU A 986     -12.263  -2.052 -23.700  1.00 27.75           H  \nATOM   1526  HG  LEU A 986     -13.980  -3.829 -23.262  1.00 32.92           H  \nATOM   1527 HD11 LEU A 986     -15.724  -2.314 -23.100  1.00 33.36           H  \nATOM   1528 HD12 LEU A 986     -14.399  -1.202 -23.350  1.00 33.36           H  \nATOM   1529 HD13 LEU A 986     -15.463  -1.625 -24.690  1.00 33.36           H  \nATOM   1530 HD21 LEU A 986     -15.731  -3.859 -25.406  1.00 36.70           H  \nATOM   1531 HD22 LEU A 986     -14.192  -3.868 -26.245  1.00 36.70           H  \nATOM   1532 HD23 LEU A 986     -14.561  -5.121 -25.075  1.00 36.70           H  \nATOM   1533  N   ARG A 987      -9.286  -2.929 -24.793  1.00 29.06           N  \nATOM   1534  CA  ARG A 987      -8.017  -2.516 -25.394  1.00 29.96           C  \nATOM   1535  C   ARG A 987      -7.291  -3.652 -26.137  1.00 34.81           C  \nATOM   1536  O   ARG A 987      -6.680  -3.387 -27.172  1.00 34.10           O  \nATOM   1537  CB  ARG A 987      -7.130  -1.836 -24.336  1.00 32.11           C  \nATOM   1538  CG  ARG A 987      -5.888  -1.139 -24.920  1.00 46.98           C  \nATOM   1539  CD  ARG A 987      -5.085  -0.392 -23.849  1.00 59.29           C  \nATOM   1540  NE  ARG A 987      -3.827   0.162 -24.375  1.00 65.62           N  \nATOM   1541  CZ  ARG A 987      -2.647  -0.473 -24.496  1.00 80.85           C  \nATOM   1542  NH1 ARG A 987      -1.601   0.204 -24.984  1.00 71.30           N  \nATOM   1543  NH2 ARG A 987      -2.483  -1.757 -24.139  1.00 64.23           N1+\nATOM   1544  H   ARG A 987      -9.312  -2.973 -23.784  1.00 29.06           H  \nATOM   1545  HA  ARG A 987      -8.262  -1.763 -26.133  1.00 29.96           H  \nATOM   1546  HB3 ARG A 987      -6.823  -2.568 -23.588  1.00 32.11           H  \nATOM   1547  HB2 ARG A 987      -7.722  -1.088 -23.808  1.00 32.11           H  \nATOM   1548  HG3 ARG A 987      -6.268  -0.398 -25.626  1.00 46.98           H  \nATOM   1549  HG2 ARG A 987      -5.251  -1.807 -25.500  1.00 46.98           H  \nATOM   1550  HD3 ARG A 987      -4.953  -0.979 -22.940  1.00 59.29           H  \nATOM   1551  HD2 ARG A 987      -5.653   0.492 -23.566  1.00 59.29           H  \nATOM   1552  HE  ARG A 987      -3.886   1.115 -24.706  1.00 65.62           H  \nATOM   1553 HH12 ARG A 987      -0.701  -0.246 -25.082  1.00 71.30           H  \nATOM   1554 HH11 ARG A 987      -1.705   1.173 -25.259  1.00 71.30           H  \nATOM   1555 HH22 ARG A 987      -1.576  -2.198 -24.220  1.00 64.23           H  \nATOM   1556 HH21 ARG A 987      -3.272  -2.303 -23.824  1.00 64.23           H  \nATOM   1557  N   ASP A 988      -7.393  -4.883 -25.612  1.00 32.33           N  \nATOM   1558  CA  ASP A 988      -6.818  -6.091 -26.208  1.00 32.03           C  \nATOM   1559  C   ASP A 988      -7.773  -6.753 -27.216  1.00 34.79           C  \nATOM   1560  O   ASP A 988      -7.292  -7.360 -28.172  1.00 33.45           O  \nATOM   1561  CB  ASP A 988      -6.383  -7.129 -25.141  1.00 34.09           C  \nATOM   1562  CG  ASP A 988      -5.386  -6.633 -24.076  1.00 50.64           C  \nATOM   1563  OD1 ASP A 988      -4.621  -5.682 -24.352  1.00 52.94           O  \nATOM   1564  OD2 ASP A 988      -5.324  -7.306 -23.023  1.00 55.56           O1-\nATOM   1565  H   ASP A 988      -7.905  -5.013 -24.750  1.00 32.33           H  \nATOM   1566  HA  ASP A 988      -5.926  -5.807 -26.770  1.00 32.03           H  \nATOM   1567  HB3 ASP A 988      -5.929  -7.992 -25.631  1.00 34.09           H  \nATOM   1568  HB2 ASP A 988      -7.271  -7.493 -24.620  1.00 34.09           H  \nATOM   1569  N   TYR A 989      -9.092  -6.640 -26.993  1.00 30.87           N  \nATOM   1570  CA  TYR A 989     -10.115  -7.301 -27.799  1.00 30.93           C  \nATOM   1571  C   TYR A 989     -10.388  -6.577 -29.130  1.00 31.61           C  \nATOM   1572  O   TYR A 989     -10.312  -7.223 -30.174  1.00 30.88           O  \nATOM   1573  CB  TYR A 989     -11.391  -7.498 -26.954  1.00 32.58           C  \nATOM   1574  CG  TYR A 989     -12.492  -8.296 -27.630  1.00 35.88           C  \nATOM   1575  CD1 TYR A 989     -12.518  -9.702 -27.516  1.00 38.76           C  \nATOM   1576  CD2 TYR A 989     -13.493  -7.638 -28.372  1.00 37.33           C  \nATOM   1577  CE1 TYR A 989     -13.542 -10.443 -28.137  1.00 41.81           C  \nATOM   1578  CE2 TYR A 989     -14.514  -8.378 -28.996  1.00 39.43           C  \nATOM   1579  CZ  TYR A 989     -14.541  -9.782 -28.878  1.00 47.08           C  \nATOM   1580  OH  TYR A 989     -15.532 -10.501 -29.479  1.00 54.57           O  \nATOM   1581  H   TYR A 989      -9.417  -6.150 -26.170  1.00 30.87           H  \nATOM   1582  HA  TYR A 989      -9.748  -8.300 -28.046  1.00 30.93           H  \nATOM   1583  HB3 TYR A 989     -11.794  -6.531 -26.652  1.00 32.58           H  \nATOM   1584  HB2 TYR A 989     -11.134  -8.012 -26.026  1.00 32.58           H  \nATOM   1585  HD1 TYR A 989     -11.755 -10.216 -26.949  1.00 38.76           H  \nATOM   1586  HD2 TYR A 989     -13.476  -6.563 -28.464  1.00 37.33           H  \nATOM   1587  HE1 TYR A 989     -13.559 -11.519 -28.045  1.00 41.81           H  \nATOM   1588  HE2 TYR A 989     -15.272  -7.863 -29.563  1.00 39.43           H  \nATOM   1589  HH  TYR A 989     -16.158  -9.956 -29.961  1.00 54.57           H  \nATOM   1590  N   LEU A 990     -10.706  -5.269 -29.079  1.00 26.64           N  \nATOM   1591  CA  LEU A 990     -11.169  -4.493 -30.238  1.00 26.55           C  \nATOM   1592  C   LEU A 990     -10.208  -4.338 -31.443  1.00 32.26           C  \nATOM   1593  O   LEU A 990     -10.730  -4.254 -32.554  1.00 32.40           O  \nATOM   1594  CB  LEU A 990     -11.721  -3.111 -29.816  1.00 25.29           C  \nATOM   1595  CG  LEU A 990     -12.967  -3.137 -28.906  1.00 28.64           C  \nATOM   1596  CD1 LEU A 990     -13.282  -1.724 -28.386  1.00 28.39           C  \nATOM   1597  CD2 LEU A 990     -14.197  -3.752 -29.604  1.00 27.70           C  \nATOM   1598  H   LEU A 990     -10.708  -4.785 -28.191  1.00 26.64           H  \nATOM   1599  HA  LEU A 990     -12.009  -5.067 -30.634  1.00 26.55           H  \nATOM   1600  HB3 LEU A 990     -11.971  -2.532 -30.706  1.00 25.29           H  \nATOM   1601  HB2 LEU A 990     -10.926  -2.554 -29.318  1.00 25.29           H  \nATOM   1602  HG  LEU A 990     -12.740  -3.756 -28.038  1.00 28.64           H  \nATOM   1603 HD11 LEU A 990     -14.289  -1.658 -27.974  1.00 28.39           H  \nATOM   1604 HD12 LEU A 990     -12.591  -1.441 -27.593  1.00 28.39           H  \nATOM   1605 HD13 LEU A 990     -13.197  -0.978 -29.176  1.00 28.39           H  \nATOM   1606 HD21 LEU A 990     -15.056  -3.083 -29.591  1.00 27.70           H  \nATOM   1607 HD22 LEU A 990     -14.006  -3.989 -30.651  1.00 27.70           H  \nATOM   1608 HD23 LEU A 990     -14.506  -4.670 -29.108  1.00 27.70           H  \nATOM   1609  N   PRO A 991      -8.862  -4.368 -31.272  1.00 29.17           N  \nATOM   1610  CA  PRO A 991      -7.934  -4.390 -32.422  1.00 30.32           C  \nATOM   1611  C   PRO A 991      -7.982  -5.660 -33.292  1.00 37.04           C  \nATOM   1612  O   PRO A 991      -7.685  -5.568 -34.482  1.00 39.83           O  \nATOM   1613  CB  PRO A 991      -6.545  -4.175 -31.796  1.00 31.53           C  \nATOM   1614  CG  PRO A 991      -6.828  -3.468 -30.483  1.00 34.07           C  \nATOM   1615  CD  PRO A 991      -8.127  -4.120 -30.032  1.00 29.12           C  \nATOM   1616  HA  PRO A 991      -8.172  -3.530 -33.048  1.00 30.32           H  \nATOM   1617  HB3 PRO A 991      -5.880  -3.597 -32.438  1.00 31.53           H  \nATOM   1618  HB2 PRO A 991      -6.059  -5.130 -31.592  1.00 31.53           H  \nATOM   1619  HG3 PRO A 991      -6.998  -2.407 -30.671  1.00 34.07           H  \nATOM   1620  HG2 PRO A 991      -6.017  -3.559 -29.761  1.00 34.07           H  \nATOM   1621  HD2 PRO A 991      -7.914  -5.074 -29.554  1.00 29.12           H  \nATOM   1622  HD3 PRO A 991      -8.663  -3.490 -29.323  1.00 29.12           H  \nATOM   1623  N   ARG A 992      -8.364  -6.801 -32.693  1.00 33.12           N  \nATOM   1624  CA  ARG A 992      -8.473  -8.101 -33.362  1.00 35.22           C  \nATOM   1625  C   ARG A 992      -9.923  -8.477 -33.721  1.00 42.35           C  \nATOM   1626  O   ARG A 992     -10.101  -9.442 -34.464  1.00 43.35           O  \nATOM   1627  CB  ARG A 992      -7.847  -9.181 -32.452  1.00 36.79           C  \nATOM   1628  CG  ARG A 992      -6.321  -9.042 -32.266  1.00 49.00           C  \nATOM   1629  CD  ARG A 992      -5.895  -8.581 -30.862  1.00 65.39           C  \nATOM   1630  NE  ARG A 992      -4.429  -8.630 -30.709  1.00 83.52           N  \nATOM   1631  CZ  ARG A 992      -3.697  -8.245 -29.646  1.00101.34           C  \nATOM   1632  NH1 ARG A 992      -4.252  -7.730 -28.539  1.00 87.97           N  \nATOM   1633  NH2 ARG A 992      -2.366  -8.382 -29.694  1.00 90.05           N1+\nATOM   1634  H   ARG A 992      -8.610  -6.788 -31.713  1.00 33.12           H  \nATOM   1635  HA  ARG A 992      -7.920  -8.089 -34.303  1.00 35.22           H  \nATOM   1636  HB3 ARG A 992      -8.028 -10.163 -32.891  1.00 36.79           H  \nATOM   1637  HB2 ARG A 992      -8.353  -9.200 -31.486  1.00 36.79           H  \nATOM   1638  HG3 ARG A 992      -5.962  -8.307 -32.988  1.00 49.00           H  \nATOM   1639  HG2 ARG A 992      -5.815  -9.970 -32.534  1.00 49.00           H  \nATOM   1640  HD3 ARG A 992      -6.407  -9.141 -30.079  1.00 65.39           H  \nATOM   1641  HD2 ARG A 992      -6.177  -7.534 -30.743  1.00 65.39           H  \nATOM   1642  HE  ARG A 992      -3.934  -9.003 -31.505  1.00 83.52           H  \nATOM   1643 HH12 ARG A 992      -3.684  -7.448 -27.753  1.00 87.97           H  \nATOM   1644 HH11 ARG A 992      -5.259  -7.626 -28.485  1.00 87.97           H  \nATOM   1645 HH22 ARG A 992      -1.795  -8.104 -28.909  1.00 90.05           H  \nATOM   1646 HH21 ARG A 992      -1.920  -8.767 -30.514  1.00 90.05           H  \nATOM   1647  N   HIS A 993     -10.920  -7.742 -33.199  1.00 39.31           N  \nATOM   1648  CA  HIS A 993     -12.343  -8.029 -33.380  1.00 40.02           C  \nATOM   1649  C   HIS A 993     -13.064  -6.735 -33.771  1.00 44.39           C  \nATOM   1650  O   HIS A 993     -13.235  -5.856 -32.926  1.00 42.90           O  \nATOM   1651  CB  HIS A 993     -12.933  -8.636 -32.087  1.00 40.24           C  \nATOM   1652  CG  HIS A 993     -12.280  -9.913 -31.615  1.00 43.95           C  \nATOM   1653  ND1 HIS A 993     -11.178  -9.921 -30.777  1.00 44.82           N  \nATOM   1654  CD2 HIS A 993     -12.584 -11.239 -31.832  1.00 46.86           C  \nATOM   1655  CE1 HIS A 993     -10.862 -11.196 -30.543  1.00 45.15           C  \nATOM   1656  NE2 HIS A 993     -11.674 -12.053 -31.151  1.00 46.64           N  \nATOM   1657  H   HIS A 993     -10.700  -6.953 -32.607  1.00 39.31           H  \nATOM   1658  HA  HIS A 993     -12.488  -8.755 -34.182  1.00 40.02           H  \nATOM   1659  HB3 HIS A 993     -13.998  -8.834 -32.223  1.00 40.24           H  \nATOM   1660  HB2 HIS A 993     -12.864  -7.911 -31.275  1.00 40.24           H  \nATOM   1661  HD1 HIS A 993     -10.706  -9.101 -30.417  1.00 44.82           H  \nATOM   1662  HD2 HIS A 993     -13.381 -11.668 -32.421  1.00 46.86           H  \nATOM   1663  HE1 HIS A 993     -10.035 -11.499 -29.918  1.00 45.15           H  \nATOM   1664  N   SER A 994     -13.470  -6.644 -35.048  1.00 43.61           N  \nATOM   1665  CA  SER A 994     -14.209  -5.516 -35.617  1.00 44.09           C  \nATOM   1666  C   SER A 994     -15.687  -5.527 -35.171  1.00 48.55           C  \nATOM   1667  O   SER A 994     -16.525  -6.165 -35.809  1.00 49.91           O  \nATOM   1668  CB  SER A 994     -14.007  -5.502 -37.150  1.00 50.40           C  \nATOM   1669  OG  SER A 994     -14.571  -6.626 -37.802  1.00 64.99           O  \nATOM   1670  H   SER A 994     -13.279  -7.408 -35.685  1.00 43.61           H  \nATOM   1671  HA  SER A 994     -13.757  -4.597 -35.238  1.00 44.09           H  \nATOM   1672  HB3 SER A 994     -12.944  -5.455 -37.390  1.00 50.40           H  \nATOM   1673  HB2 SER A 994     -14.458  -4.603 -37.573  1.00 50.40           H  \nATOM   1674  HG  SER A 994     -15.515  -6.632 -37.619  1.00 64.99           H  \nATOM   1675  N   ILE A 995     -15.965  -4.828 -34.059  1.00 42.04           N  \nATOM   1676  CA  ILE A 995     -17.296  -4.714 -33.464  1.00 40.91           C  \nATOM   1677  C   ILE A 995     -18.064  -3.520 -34.068  1.00 43.90           C  \nATOM   1678  O   ILE A 995     -17.480  -2.455 -34.267  1.00 43.46           O  \nATOM   1679  CB  ILE A 995     -17.192  -4.556 -31.916  1.00 42.36           C  \nATOM   1680  CG1 ILE A 995     -16.536  -5.790 -31.248  1.00 42.65           C  \nATOM   1681  CG2 ILE A 995     -18.529  -4.242 -31.218  1.00 41.71           C  \nATOM   1682  CD1 ILE A 995     -17.228  -7.139 -31.513  1.00 43.19           C  \nATOM   1683  H   ILE A 995     -15.219  -4.349 -33.575  1.00 42.04           H  \nATOM   1684  HA  ILE A 995     -17.863  -5.619 -33.689  1.00 40.91           H  \nATOM   1685  HB  ILE A 995     -16.532  -3.711 -31.714  1.00 42.36           H  \nATOM   1686 HG13 ILE A 995     -16.475  -5.629 -30.172  1.00 42.65           H  \nATOM   1687 HG12 ILE A 995     -15.501  -5.868 -31.578  1.00 42.65           H  \nATOM   1688 HG21 ILE A 995     -18.434  -4.276 -30.134  1.00 41.71           H  \nATOM   1689 HG22 ILE A 995     -18.899  -3.250 -31.464  1.00 41.71           H  \nATOM   1690 HG23 ILE A 995     -19.292  -4.958 -31.512  1.00 41.71           H  \nATOM   1691 HD11 ILE A 995     -16.639  -7.748 -32.199  1.00 43.19           H  \nATOM   1692 HD12 ILE A 995     -17.348  -7.704 -30.589  1.00 43.19           H  \nATOM   1693 HD13 ILE A 995     -18.221  -7.025 -31.946  1.00 43.19           H  \nATOM   1694  N   GLY A 996     -19.363  -3.733 -34.347  1.00 39.60           N  \nATOM   1695  CA  GLY A 996     -20.252  -2.755 -34.979  1.00 39.64           C  \nATOM   1696  C   GLY A 996     -20.596  -1.588 -34.040  1.00 40.81           C  \nATOM   1697  O   GLY A 996     -20.520  -1.711 -32.818  1.00 40.20           O  \nATOM   1698  H   GLY A 996     -19.764  -4.635 -34.139  1.00 39.60           H  \nATOM   1699  HA3 GLY A 996     -21.173  -3.256 -35.273  1.00 39.64           H  \nATOM   1700  HA2 GLY A 996     -19.788  -2.377 -35.892  1.00 39.64           H  \nATOM   1701  N   LEU A 997     -20.997  -0.458 -34.647  1.00 36.29           N  \nATOM   1702  CA  LEU A 997     -21.277   0.836 -34.014  1.00 34.21           C  \nATOM   1703  C   LEU A 997     -22.273   0.785 -32.840  1.00 36.59           C  \nATOM   1704  O   LEU A 997     -21.980   1.361 -31.794  1.00 34.53           O  \nATOM   1705  CB  LEU A 997     -21.711   1.829 -35.121  1.00 34.53           C  \nATOM   1706  CG  LEU A 997     -22.124   3.249 -34.665  1.00 38.00           C  \nATOM   1707  CD1 LEU A 997     -21.037   3.947 -33.824  1.00 36.32           C  \nATOM   1708  CD2 LEU A 997     -22.558   4.106 -35.869  1.00 39.98           C  \nATOM   1709  H   LEU A 997     -21.051  -0.455 -35.657  1.00 36.29           H  \nATOM   1710  HA  LEU A 997     -20.326   1.179 -33.603  1.00 34.21           H  \nATOM   1711  HB3 LEU A 997     -22.545   1.391 -35.671  1.00 34.53           H  \nATOM   1712  HB2 LEU A 997     -20.897   1.921 -35.842  1.00 34.53           H  \nATOM   1713  HG  LEU A 997     -23.015   3.149 -34.047  1.00 38.00           H  \nATOM   1714 HD11 LEU A 997     -20.949   5.005 -34.060  1.00 36.32           H  \nATOM   1715 HD12 LEU A 997     -21.263   3.882 -32.760  1.00 36.32           H  \nATOM   1716 HD13 LEU A 997     -20.056   3.499 -33.980  1.00 36.32           H  \nATOM   1717 HD21 LEU A 997     -23.419   4.725 -35.614  1.00 39.98           H  \nATOM   1718 HD22 LEU A 997     -21.763   4.769 -36.208  1.00 39.98           H  \nATOM   1719 HD23 LEU A 997     -22.845   3.494 -36.724  1.00 39.98           H  \nATOM   1720  N   ALA A 998     -23.409   0.089 -33.016  1.00 34.25           N  \nATOM   1721  CA  ALA A 998     -24.444  -0.055 -31.989  1.00 34.26           C  \nATOM   1722  C   ALA A 998     -23.979  -0.830 -30.750  1.00 36.18           C  \nATOM   1723  O   ALA A 998     -24.385  -0.484 -29.643  1.00 35.22           O  \nATOM   1724  CB  ALA A 998     -25.666  -0.747 -32.595  1.00 36.52           C  \nATOM   1725  H   ALA A 998     -23.583  -0.370 -33.900  1.00 34.25           H  \nATOM   1726  HA  ALA A 998     -24.741   0.949 -31.677  1.00 34.26           H  \nATOM   1727  HB1 ALA A 998     -26.532  -0.659 -31.938  1.00 36.52           H  \nATOM   1728  HB2 ALA A 998     -25.920  -0.291 -33.546  1.00 36.52           H  \nATOM   1729  HB3 ALA A 998     -25.492  -1.807 -32.778  1.00 36.52           H  \nATOM   1730  N   GLN A 999     -23.130  -1.847 -30.960  1.00 32.90           N  \nATOM   1731  CA  GLN A 999     -22.559  -2.689 -29.914  1.00 31.66           C  \nATOM   1732  C   GLN A 999     -21.446  -1.975 -29.116  1.00 31.83           C  \nATOM   1733  O   GLN A 999     -21.293  -2.274 -27.934  1.00 31.42           O  \nATOM   1734  CB  GLN A 999     -22.134  -4.016 -30.571  1.00 33.78           C  \nATOM   1735  CG  GLN A 999     -21.621  -5.106 -29.611  1.00 53.37           C  \nATOM   1736  CD  GLN A 999     -21.398  -6.443 -30.329  1.00 79.04           C  \nATOM   1737  OE1 GLN A 999     -22.211  -6.864 -31.150  1.00 77.41           O  \nATOM   1738  NE2 GLN A 999     -20.304  -7.132 -30.005  1.00 70.04           N  \nATOM   1739  H   GLN A 999     -22.847  -2.066 -31.906  1.00 32.90           H  \nATOM   1740  HA  GLN A 999     -23.358  -2.921 -29.208  1.00 31.66           H  \nATOM   1741  HB3 GLN A 999     -21.389  -3.822 -31.342  1.00 33.78           H  \nATOM   1742  HB2 GLN A 999     -23.006  -4.407 -31.098  1.00 33.78           H  \nATOM   1743  HG3 GLN A 999     -22.345  -5.266 -28.811  1.00 53.37           H  \nATOM   1744  HG2 GLN A 999     -20.695  -4.784 -29.133  1.00 53.37           H  \nATOM   1745 HE22 GLN A 999     -20.123  -8.026 -30.439  1.00 70.04           H  \nATOM   1746 HE21 GLN A 999     -19.667  -6.780 -29.305  1.00 70.04           H  \nATOM   1747  N   LEU A1000     -20.751  -0.997 -29.732  1.00 27.73           N  \nATOM   1748  CA  LEU A1000     -19.837  -0.069 -29.050  1.00 27.15           C  \nATOM   1749  C   LEU A1000     -20.595   0.953 -28.181  1.00 30.03           C  \nATOM   1750  O   LEU A1000     -20.124   1.276 -27.092  1.00 28.40           O  \nATOM   1751  CB  LEU A1000     -18.945   0.674 -30.074  1.00 27.39           C  \nATOM   1752  CG  LEU A1000     -17.991  -0.227 -30.886  1.00 31.72           C  \nATOM   1753  CD1 LEU A1000     -17.371   0.546 -32.070  1.00 31.24           C  \nATOM   1754  CD2 LEU A1000     -16.934  -0.917 -29.997  1.00 32.46           C  \nATOM   1755  H   LEU A1000     -20.916  -0.817 -30.713  1.00 27.73           H  \nATOM   1756  HA  LEU A1000     -19.200  -0.650 -28.383  1.00 27.15           H  \nATOM   1757  HB3 LEU A1000     -18.351   1.434 -29.562  1.00 27.39           H  \nATOM   1758  HB2 LEU A1000     -19.586   1.222 -30.765  1.00 27.39           H  \nATOM   1759  HG  LEU A1000     -18.585  -1.019 -31.332  1.00 31.72           H  \nATOM   1760 HD11 LEU A1000     -16.292   0.426 -32.140  1.00 31.24           H  \nATOM   1761 HD12 LEU A1000     -17.786   0.194 -33.015  1.00 31.24           H  \nATOM   1762 HD13 LEU A1000     -17.569   1.617 -32.011  1.00 31.24           H  \nATOM   1763 HD21 LEU A1000     -15.920  -0.822 -30.385  1.00 32.46           H  \nATOM   1764 HD22 LEU A1000     -16.925  -0.518 -28.983  1.00 32.46           H  \nATOM   1765 HD23 LEU A1000     -17.146  -1.982 -29.914  1.00 32.46           H  \nATOM   1766  N   LEU A1001     -21.763   1.420 -28.659  1.00 27.18           N  \nATOM   1767  CA  LEU A1001     -22.668   2.317 -27.931  1.00 26.38           C  \nATOM   1768  C   LEU A1001     -23.415   1.608 -26.786  1.00 30.80           C  \nATOM   1769  O   LEU A1001     -23.803   2.280 -25.831  1.00 31.19           O  \nATOM   1770  CB  LEU A1001     -23.664   2.964 -28.916  1.00 26.55           C  \nATOM   1771  CG  LEU A1001     -23.009   3.940 -29.919  1.00 30.43           C  \nATOM   1772  CD1 LEU A1001     -23.960   4.224 -31.098  1.00 31.54           C  \nATOM   1773  CD2 LEU A1001     -22.500   5.228 -29.235  1.00 29.53           C  \nATOM   1774  H   LEU A1001     -22.074   1.125 -29.576  1.00 27.18           H  \nATOM   1775  HA  LEU A1001     -22.066   3.104 -27.475  1.00 26.38           H  \nATOM   1776  HB3 LEU A1001     -24.448   3.493 -28.371  1.00 26.55           H  \nATOM   1777  HB2 LEU A1001     -24.174   2.171 -29.464  1.00 26.55           H  \nATOM   1778  HG  LEU A1001     -22.132   3.458 -30.347  1.00 30.43           H  \nATOM   1779 HD11 LEU A1001     -23.986   5.276 -31.382  1.00 31.54           H  \nATOM   1780 HD12 LEU A1001     -23.649   3.668 -31.980  1.00 31.54           H  \nATOM   1781 HD13 LEU A1001     -24.984   3.918 -30.880  1.00 31.54           H  \nATOM   1782 HD21 LEU A1001     -22.846   6.137 -29.725  1.00 29.53           H  \nATOM   1783 HD22 LEU A1001     -22.816   5.291 -28.193  1.00 29.53           H  \nATOM   1784 HD23 LEU A1001     -21.410   5.261 -29.241  1.00 29.53           H  \nATOM   1785  N   LEU A1002     -23.566   0.274 -26.876  1.00 28.48           N  \nATOM   1786  CA  LEU A1002     -24.071  -0.573 -25.798  1.00 29.15           C  \nATOM   1787  C   LEU A1002     -23.034  -0.720 -24.674  1.00 32.78           C  \nATOM   1788  O   LEU A1002     -23.419  -0.645 -23.512  1.00 33.09           O  \nATOM   1789  CB  LEU A1002     -24.495  -1.945 -26.361  1.00 30.13           C  \nATOM   1790  CG  LEU A1002     -25.243  -2.859 -25.364  1.00 35.32           C  \nATOM   1791  CD1 LEU A1002     -26.559  -2.231 -24.853  1.00 35.94           C  \nATOM   1792  CD2 LEU A1002     -25.461  -4.257 -25.970  1.00 37.39           C  \nATOM   1793  H   LEU A1002     -23.251  -0.204 -27.709  1.00 28.48           H  \nATOM   1794  HA  LEU A1002     -24.950  -0.077 -25.383  1.00 29.15           H  \nATOM   1795  HB3 LEU A1002     -23.607  -2.464 -26.722  1.00 30.13           H  \nATOM   1796  HB2 LEU A1002     -25.123  -1.797 -27.238  1.00 30.13           H  \nATOM   1797  HG  LEU A1002     -24.597  -3.010 -24.498  1.00 35.32           H  \nATOM   1798 HD11 LEU A1002     -27.382  -2.945 -24.829  1.00 35.94           H  \nATOM   1799 HD12 LEU A1002     -26.434  -1.855 -23.837  1.00 35.94           H  \nATOM   1800 HD13 LEU A1002     -26.882  -1.394 -25.473  1.00 35.94           H  \nATOM   1801 HD21 LEU A1002     -25.178  -5.038 -25.263  1.00 37.39           H  \nATOM   1802 HD22 LEU A1002     -26.499  -4.429 -26.254  1.00 37.39           H  \nATOM   1803 HD23 LEU A1002     -24.861  -4.403 -26.868  1.00 37.39           H  \nATOM   1804  N   PHE A1003     -21.743  -0.871 -25.023  1.00 28.23           N  \nATOM   1805  CA  PHE A1003     -20.641  -0.882 -24.054  1.00 28.18           C  \nATOM   1806  C   PHE A1003     -20.492   0.469 -23.336  1.00 29.97           C  \nATOM   1807  O   PHE A1003     -20.248   0.473 -22.133  1.00 28.15           O  \nATOM   1808  CB  PHE A1003     -19.312  -1.272 -24.735  1.00 29.26           C  \nATOM   1809  CG  PHE A1003     -19.273  -2.605 -25.466  1.00 30.64           C  \nATOM   1810  CD1 PHE A1003     -20.024  -3.718 -25.024  1.00 35.83           C  \nATOM   1811  CD2 PHE A1003     -18.349  -2.783 -26.518  1.00 32.41           C  \nATOM   1812  CE1 PHE A1003     -19.919  -4.932 -25.687  1.00 37.36           C  \nATOM   1813  CE2 PHE A1003     -18.254  -4.007 -27.165  1.00 35.63           C  \nATOM   1814  CZ  PHE A1003     -19.051  -5.071 -26.763  1.00 35.58           C  \nATOM   1815  H   PHE A1003     -21.488  -0.949 -25.998  1.00 28.23           H  \nATOM   1816  HA  PHE A1003     -20.872  -1.624 -23.287  1.00 28.18           H  \nATOM   1817  HB3 PHE A1003     -18.513  -1.280 -23.993  1.00 29.26           H  \nATOM   1818  HB2 PHE A1003     -19.040  -0.498 -25.453  1.00 29.26           H  \nATOM   1819  HD1 PHE A1003     -20.697  -3.642 -24.184  1.00 35.83           H  \nATOM   1820  HD2 PHE A1003     -17.720  -1.964 -26.835  1.00 32.41           H  \nATOM   1821  HE1 PHE A1003     -20.509  -5.774 -25.354  1.00 37.36           H  \nATOM   1822  HE2 PHE A1003     -17.555  -4.132 -27.978  1.00 35.63           H  \nATOM   1823  HZ  PHE A1003     -18.975  -6.020 -27.272  1.00 35.58           H  \nATOM   1824  N   ALA A1004     -20.705   1.578 -24.067  1.00 26.49           N  \nATOM   1825  CA  ALA A1004     -20.726   2.944 -23.542  1.00 26.36           C  \nATOM   1826  C   ALA A1004     -21.860   3.187 -22.532  1.00 28.13           C  \nATOM   1827  O   ALA A1004     -21.618   3.810 -21.500  1.00 27.39           O  \nATOM   1828  CB  ALA A1004     -20.837   3.926 -24.715  1.00 27.23           C  \nATOM   1829  H   ALA A1004     -20.890   1.484 -25.057  1.00 26.49           H  \nATOM   1830  HA  ALA A1004     -19.773   3.115 -23.041  1.00 26.36           H  \nATOM   1831  HB1 ALA A1004     -20.637   4.947 -24.390  1.00 27.23           H  \nATOM   1832  HB2 ALA A1004     -20.122   3.678 -25.500  1.00 27.23           H  \nATOM   1833  HB3 ALA A1004     -21.829   3.918 -25.164  1.00 27.23           H  \nATOM   1834  N   GLN A1005     -23.060   2.661 -22.839  1.00 24.98           N  \nATOM   1835  CA  GLN A1005     -24.241   2.670 -21.976  1.00 26.13           C  \nATOM   1836  C   GLN A1005     -24.005   1.880 -20.676  1.00 30.14           C  \nATOM   1837  O   GLN A1005     -24.287   2.400 -19.601  1.00 29.23           O  \nATOM   1838  CB  GLN A1005     -25.433   2.097 -22.770  1.00 27.37           C  \nATOM   1839  CG  GLN A1005     -26.787   2.123 -22.034  1.00 34.59           C  \nATOM   1840  CD  GLN A1005     -27.753   1.102 -22.634  1.00 45.52           C  \nATOM   1841  OE1 GLN A1005     -28.014   1.121 -23.835  1.00 37.97           O  \nATOM   1842  NE2 GLN A1005     -28.296   0.216 -21.798  1.00 40.39           N  \nATOM   1843  H   GLN A1005     -23.170   2.180 -23.722  1.00 24.98           H  \nATOM   1844  HA  GLN A1005     -24.463   3.706 -21.713  1.00 26.13           H  \nATOM   1845  HB3 GLN A1005     -25.200   1.069 -23.046  1.00 27.37           H  \nATOM   1846  HB2 GLN A1005     -25.542   2.624 -23.717  1.00 27.37           H  \nATOM   1847  HG3 GLN A1005     -27.223   3.120 -22.095  1.00 34.59           H  \nATOM   1848  HG2 GLN A1005     -26.674   1.906 -20.973  1.00 34.59           H  \nATOM   1849 HE22 GLN A1005     -28.941  -0.481 -22.142  1.00 40.39           H  \nATOM   1850 HE21 GLN A1005     -28.027   0.204 -20.821  1.00 40.39           H  \nATOM   1851  N   GLN A1006     -23.477   0.652 -20.811  1.00 27.56           N  \nATOM   1852  CA  GLN A1006     -23.173  -0.270 -19.716  1.00 27.14           C  \nATOM   1853  C   GLN A1006     -22.072   0.236 -18.768  1.00 28.50           C  \nATOM   1854  O   GLN A1006     -22.194   0.035 -17.560  1.00 29.35           O  \nATOM   1855  CB  GLN A1006     -22.838  -1.652 -20.304  1.00 28.20           C  \nATOM   1856  CG  GLN A1006     -24.071  -2.360 -20.908  1.00 30.44           C  \nATOM   1857  CD  GLN A1006     -23.732  -3.689 -21.587  1.00 43.69           C  \nATOM   1858  OE1 GLN A1006     -22.570  -4.021 -21.806  1.00 40.01           O  \nATOM   1859  NE2 GLN A1006     -24.762  -4.459 -21.939  1.00 39.19           N  \nATOM   1860  H   GLN A1006     -23.289   0.300 -21.741  1.00 27.56           H  \nATOM   1861  HA  GLN A1006     -24.079  -0.372 -19.117  1.00 27.14           H  \nATOM   1862  HB3 GLN A1006     -22.408  -2.289 -19.530  1.00 28.20           H  \nATOM   1863  HB2 GLN A1006     -22.063  -1.537 -21.063  1.00 28.20           H  \nATOM   1864  HG3 GLN A1006     -24.572  -1.725 -21.635  1.00 30.44           H  \nATOM   1865  HG2 GLN A1006     -24.815  -2.535 -20.135  1.00 30.44           H  \nATOM   1866 HE22 GLN A1006     -24.602  -5.353 -22.387  1.00 39.19           H  \nATOM   1867 HE21 GLN A1006     -25.716  -4.155 -21.777  1.00 39.19           H  \nATOM   1868  N   ILE A1007     -21.062   0.943 -19.312  1.00 24.53           N  \nATOM   1869  CA  ILE A1007     -20.069   1.692 -18.536  1.00 23.52           C  \nATOM   1870  C   ILE A1007     -20.727   2.816 -17.713  1.00 26.94           C  \nATOM   1871  O   ILE A1007     -20.405   2.941 -16.536  1.00 25.88           O  \nATOM   1872  CB  ILE A1007     -18.931   2.286 -19.427  1.00 26.23           C  \nATOM   1873  CG1 ILE A1007     -18.024   1.167 -19.988  1.00 26.44           C  \nATOM   1874  CG2 ILE A1007     -18.040   3.356 -18.749  1.00 26.63           C  \nATOM   1875  CD1 ILE A1007     -17.291   1.555 -21.285  1.00 29.19           C  \nATOM   1876  H   ILE A1007     -21.013   1.046 -20.317  1.00 24.53           H  \nATOM   1877  HA  ILE A1007     -19.614   0.992 -17.831  1.00 23.52           H  \nATOM   1878  HB  ILE A1007     -19.417   2.769 -20.276  1.00 26.23           H  \nATOM   1879 HG13 ILE A1007     -18.608   0.270 -20.180  1.00 26.44           H  \nATOM   1880 HG12 ILE A1007     -17.298   0.870 -19.230  1.00 26.44           H  \nATOM   1881 HG21 ILE A1007     -17.216   3.653 -19.397  1.00 26.63           H  \nATOM   1882 HG22 ILE A1007     -18.590   4.267 -18.511  1.00 26.63           H  \nATOM   1883 HG23 ILE A1007     -17.606   2.974 -17.825  1.00 26.63           H  \nATOM   1884 HD11 ILE A1007     -17.143   0.685 -21.925  1.00 29.19           H  \nATOM   1885 HD12 ILE A1007     -17.847   2.290 -21.866  1.00 29.19           H  \nATOM   1886 HD13 ILE A1007     -16.313   1.980 -21.071  1.00 29.19           H  \nATOM   1887  N   CYS A1008     -21.665   3.570 -18.316  1.00 24.96           N  \nATOM   1888  CA  CYS A1008     -22.405   4.643 -17.644  1.00 26.23           C  \nATOM   1889  C   CYS A1008     -23.328   4.144 -16.518  1.00 28.78           C  \nATOM   1890  O   CYS A1008     -23.468   4.853 -15.526  1.00 27.82           O  \nATOM   1891  CB  CYS A1008     -23.199   5.533 -18.619  1.00 27.44           C  \nATOM   1892  SG  CYS A1008     -22.060   6.457 -19.678  1.00 31.30           S  \nATOM   1893  H   CYS A1008     -21.894   3.406 -19.288  1.00 24.96           H  \nATOM   1894  HA  CYS A1008     -21.653   5.263 -17.158  1.00 26.23           H  \nATOM   1895  HB3 CYS A1008     -23.802   6.261 -18.076  1.00 27.44           H  \nATOM   1896  HB2 CYS A1008     -23.879   4.950 -19.240  1.00 27.44           H  \nATOM   1897  HG  CYS A1008     -21.658   5.407 -20.404  1.00 31.30           H  \nATOM   1898  N   GLU A1009     -23.905   2.938 -16.664  1.00 27.13           N  \nATOM   1899  CA  GLU A1009     -24.712   2.274 -15.636  1.00 27.79           C  \nATOM   1900  C   GLU A1009     -23.884   1.789 -14.430  1.00 31.65           C  \nATOM   1901  O   GLU A1009     -24.361   1.902 -13.301  1.00 32.67           O  \nATOM   1902  CB  GLU A1009     -25.530   1.130 -16.269  1.00 29.33           C  \nATOM   1903  CG  GLU A1009     -26.650   1.632 -17.202  1.00 35.16           C  \nATOM   1904  CD  GLU A1009     -27.432   0.501 -17.874  1.00 58.21           C  \nATOM   1905  OE1 GLU A1009     -26.942  -0.003 -18.909  1.00 48.70           O  \nATOM   1906  OE2 GLU A1009     -28.529   0.175 -17.369  1.00 60.77           O1-\nATOM   1907  H   GLU A1009     -23.769   2.425 -17.524  1.00 27.13           H  \nATOM   1908  HA  GLU A1009     -25.420   3.006 -15.244  1.00 27.79           H  \nATOM   1909  HB3 GLU A1009     -25.961   0.497 -15.492  1.00 29.33           H  \nATOM   1910  HB2 GLU A1009     -24.857   0.492 -16.843  1.00 29.33           H  \nATOM   1911  HG3 GLU A1009     -26.235   2.264 -17.984  1.00 35.16           H  \nATOM   1912  HG2 GLU A1009     -27.341   2.262 -16.641  1.00 35.16           H  \nATOM   1913  N   GLY A1010     -22.657   1.295 -14.679  1.00 27.84           N  \nATOM   1914  CA  GLY A1010     -21.732   0.852 -13.634  1.00 27.29           C  \nATOM   1915  C   GLY A1010     -21.077   2.043 -12.915  1.00 30.56           C  \nATOM   1916  O   GLY A1010     -20.854   1.969 -11.707  1.00 30.70           O  \nATOM   1917  H   GLY A1010     -22.337   1.226 -15.636  1.00 27.84           H  \nATOM   1918  HA3 GLY A1010     -20.956   0.239 -14.093  1.00 27.29           H  \nATOM   1919  HA2 GLY A1010     -22.247   0.220 -12.909  1.00 27.29           H  \nATOM   1920  N   MET A1011     -20.798   3.140 -13.643  1.00 27.80           N  \nATOM   1921  CA  MET A1011     -20.230   4.381 -13.113  1.00 26.42           C  \nATOM   1922  C   MET A1011     -21.251   5.243 -12.348  1.00 31.30           C  \nATOM   1923  O   MET A1011     -20.854   5.901 -11.387  1.00 31.07           O  \nATOM   1924  CB  MET A1011     -19.591   5.196 -14.253  1.00 27.40           C  \nATOM   1925  CG  MET A1011     -18.266   4.634 -14.804  1.00 29.13           C  \nATOM   1926  SD  MET A1011     -16.888   4.453 -13.634  1.00 32.16           S  \nATOM   1927  CE  MET A1011     -16.919   6.084 -12.860  1.00 29.76           C  \nATOM   1928  H   MET A1011     -20.981   3.129 -14.638  1.00 27.80           H  \nATOM   1929  HA  MET A1011     -19.451   4.119 -12.397  1.00 26.42           H  \nATOM   1930  HB3 MET A1011     -19.416   6.218 -13.918  1.00 27.40           H  \nATOM   1931  HB2 MET A1011     -20.304   5.291 -15.073  1.00 27.40           H  \nATOM   1932  HG3 MET A1011     -17.929   5.278 -15.615  1.00 29.13           H  \nATOM   1933  HG2 MET A1011     -18.424   3.657 -15.250  1.00 29.13           H  \nATOM   1934  HE1 MET A1011     -15.990   6.273 -12.328  1.00 29.76           H  \nATOM   1935  HE2 MET A1011     -17.055   6.852 -13.618  1.00 29.76           H  \nATOM   1936  HE3 MET A1011     -17.742   6.148 -12.148  1.00 29.76           H  \nATOM   1937  N   ALA A1012     -22.535   5.211 -12.749  1.00 27.75           N  \nATOM   1938  CA  ALA A1012     -23.634   5.849 -12.016  1.00 28.69           C  \nATOM   1939  C   ALA A1012     -23.888   5.180 -10.659  1.00 34.11           C  \nATOM   1940  O   ALA A1012     -24.101   5.891  -9.678  1.00 34.50           O  \nATOM   1941  CB  ALA A1012     -24.917   5.843 -12.856  1.00 29.26           C  \nATOM   1942  H   ALA A1012     -22.793   4.685 -13.573  1.00 27.75           H  \nATOM   1943  HA  ALA A1012     -23.360   6.890 -11.829  1.00 28.69           H  \nATOM   1944  HB1 ALA A1012     -25.767   6.222 -12.287  1.00 29.26           H  \nATOM   1945  HB2 ALA A1012     -24.815   6.478 -13.734  1.00 29.26           H  \nATOM   1946  HB3 ALA A1012     -25.167   4.837 -13.194  1.00 29.26           H  \nATOM   1947  N   TYR A1013     -23.802   3.837 -10.621  1.00 31.58           N  \nATOM   1948  CA  TYR A1013     -23.833   3.052  -9.389  1.00 32.97           C  \nATOM   1949  C   TYR A1013     -22.647   3.367  -8.458  1.00 36.19           C  \nATOM   1950  O   TYR A1013     -22.873   3.547  -7.265  1.00 37.27           O  \nATOM   1951  CB  TYR A1013     -23.952   1.546  -9.717  1.00 34.46           C  \nATOM   1952  CG  TYR A1013     -23.724   0.624  -8.528  1.00 37.28           C  \nATOM   1953  CD1 TYR A1013     -24.733   0.447  -7.560  1.00 41.29           C  \nATOM   1954  CD2 TYR A1013     -22.475  -0.004  -8.357  1.00 37.10           C  \nATOM   1955  CE1 TYR A1013     -24.484  -0.335  -6.415  1.00 41.87           C  \nATOM   1956  CE2 TYR A1013     -22.228  -0.795  -7.220  1.00 38.57           C  \nATOM   1957  CZ  TYR A1013     -23.227  -0.947  -6.240  1.00 45.11           C  \nATOM   1958  OH  TYR A1013     -22.971  -1.682  -5.119  1.00 46.37           O  \nATOM   1959  H   TYR A1013     -23.632   3.324 -11.475  1.00 31.58           H  \nATOM   1960  HA  TYR A1013     -24.744   3.336  -8.858  1.00 32.97           H  \nATOM   1961  HB3 TYR A1013     -23.229   1.281 -10.489  1.00 34.46           H  \nATOM   1962  HB2 TYR A1013     -24.932   1.339 -10.149  1.00 34.46           H  \nATOM   1963  HD1 TYR A1013     -25.691   0.933  -7.679  1.00 41.29           H  \nATOM   1964  HD2 TYR A1013     -21.699   0.134  -9.093  1.00 37.10           H  \nATOM   1965  HE1 TYR A1013     -25.254  -0.453  -5.668  1.00 41.87           H  \nATOM   1966  HE2 TYR A1013     -21.271  -1.279  -7.103  1.00 38.57           H  \nATOM   1967  HH  TYR A1013     -23.715  -1.718  -4.512  1.00 46.37           H  \nATOM   1968  N   LEU A1014     -21.426   3.458  -9.016  1.00 29.93           N  \nATOM   1969  CA  LEU A1014     -20.195   3.785  -8.288  1.00 29.88           C  \nATOM   1970  C   LEU A1014     -20.270   5.149  -7.570  1.00 33.60           C  \nATOM   1971  O   LEU A1014     -19.846   5.249  -6.419  1.00 34.49           O  \nATOM   1972  CB  LEU A1014     -19.001   3.715  -9.269  1.00 29.28           C  \nATOM   1973  CG  LEU A1014     -17.604   3.885  -8.634  1.00 33.67           C  \nATOM   1974  CD1 LEU A1014     -17.247   2.688  -7.739  1.00 34.68           C  \nATOM   1975  CD2 LEU A1014     -16.526   4.121  -9.705  1.00 34.91           C  \nATOM   1976  H   LEU A1014     -21.321   3.285 -10.007  1.00 29.93           H  \nATOM   1977  HA  LEU A1014     -20.068   3.014  -7.526  1.00 29.88           H  \nATOM   1978  HB3 LEU A1014     -19.131   4.492 -10.023  1.00 29.28           H  \nATOM   1979  HB2 LEU A1014     -19.028   2.770  -9.814  1.00 29.28           H  \nATOM   1980  HG  LEU A1014     -17.600   4.778  -8.012  1.00 33.67           H  \nATOM   1981 HD11 LEU A1014     -16.188   2.679  -7.476  1.00 34.68           H  \nATOM   1982 HD12 LEU A1014     -17.808   2.711  -6.806  1.00 34.68           H  \nATOM   1983 HD13 LEU A1014     -17.477   1.744  -8.233  1.00 34.68           H  \nATOM   1984 HD21 LEU A1014     -15.644   3.497  -9.557  1.00 34.91           H  \nATOM   1985 HD22 LEU A1014     -16.898   3.915 -10.707  1.00 34.91           H  \nATOM   1986 HD23 LEU A1014     -16.193   5.159  -9.688  1.00 34.91           H  \nATOM   1987  N   HIS A1015     -20.849   6.150  -8.253  1.00 30.39           N  \nATOM   1988  CA  HIS A1015     -21.057   7.508  -7.748  1.00 30.40           C  \nATOM   1989  C   HIS A1015     -22.203   7.615  -6.730  1.00 37.10           C  \nATOM   1990  O   HIS A1015     -22.134   8.480  -5.858  1.00 37.94           O  \nATOM   1991  CB  HIS A1015     -21.294   8.459  -8.934  1.00 29.83           C  \nATOM   1992  CG  HIS A1015     -20.101   8.684  -9.828  1.00 31.72           C  \nATOM   1993  ND1 HIS A1015     -20.082   9.715 -10.769  1.00 32.83           N  \nATOM   1994  CD2 HIS A1015     -18.898   8.007  -9.891  1.00 32.40           C  \nATOM   1995  CE1 HIS A1015     -18.890   9.629 -11.339  1.00 31.99           C  \nATOM   1996  NE2 HIS A1015     -18.143   8.644 -10.852  1.00 31.94           N  \nATOM   1997  H   HIS A1015     -21.169   5.978  -9.197  1.00 30.39           H  \nATOM   1998  HA  HIS A1015     -20.152   7.828  -7.229  1.00 30.40           H  \nATOM   1999  HB3 HIS A1015     -21.608   9.438  -8.569  1.00 29.83           H  \nATOM   2000  HB2 HIS A1015     -22.112   8.089  -9.554  1.00 29.83           H  \nATOM   2001  HD2 HIS A1015     -18.524   7.155  -9.345  1.00 32.40           H  \nATOM   2002  HE1 HIS A1015     -18.573  10.275 -12.138  1.00 31.99           H  \nATOM   2003  HE2 HIS A1015     -17.190   8.424 -11.119  1.00 31.94           H  \nATOM   2004  N   ALA A1016     -23.211   6.730  -6.834  1.00 34.33           N  \nATOM   2005  CA  ALA A1016     -24.292   6.585  -5.856  1.00 35.70           C  \nATOM   2006  C   ALA A1016     -23.821   5.922  -4.546  1.00 40.39           C  \nATOM   2007  O   ALA A1016     -24.360   6.244  -3.489  1.00 42.00           O  \nATOM   2008  CB  ALA A1016     -25.451   5.800  -6.489  1.00 36.70           C  \nATOM   2009  H   ALA A1016     -23.210   6.064  -7.594  1.00 34.33           H  \nATOM   2010  HA  ALA A1016     -24.662   7.581  -5.608  1.00 35.70           H  \nATOM   2011  HB1 ALA A1016     -26.291   5.712  -5.799  1.00 36.70           H  \nATOM   2012  HB2 ALA A1016     -25.818   6.300  -7.386  1.00 36.70           H  \nATOM   2013  HB3 ALA A1016     -25.152   4.791  -6.772  1.00 36.70           H  \nATOM   2014  N   GLN A1017     -22.787   5.064  -4.635  1.00 37.13           N  \nATOM   2015  CA  GLN A1017     -22.036   4.512  -3.502  1.00 37.34           C  \nATOM   2016  C   GLN A1017     -20.962   5.483  -2.955  1.00 40.83           C  \nATOM   2017  O   GLN A1017     -20.257   5.120  -2.013  1.00 41.85           O  \nATOM   2018  CB  GLN A1017     -21.413   3.155  -3.915  1.00 37.57           C  \nATOM   2019  CG  GLN A1017     -22.410   2.027  -4.261  1.00 50.69           C  \nATOM   2020  CD  GLN A1017     -23.428   1.735  -3.159  1.00 63.42           C  \nATOM   2021  OE1 GLN A1017     -23.055   1.428  -2.030  1.00 61.45           O  \nATOM   2022  NE2 GLN A1017     -24.719   1.815  -3.487  1.00 53.50           N  \nATOM   2023  H   GLN A1017     -22.426   4.834  -5.551  1.00 37.13           H  \nATOM   2024  HA  GLN A1017     -22.727   4.347  -2.674  1.00 37.34           H  \nATOM   2025  HB3 GLN A1017     -20.770   2.791  -3.113  1.00 37.57           H  \nATOM   2026  HB2 GLN A1017     -20.758   3.304  -4.773  1.00 37.57           H  \nATOM   2027  HG3 GLN A1017     -21.859   1.109  -4.466  1.00 50.69           H  \nATOM   2028  HG2 GLN A1017     -22.944   2.264  -5.177  1.00 50.69           H  \nATOM   2029 HE22 GLN A1017     -25.427   1.631  -2.791  1.00 53.50           H  \nATOM   2030 HE21 GLN A1017     -24.995   2.075  -4.422  1.00 53.50           H  \nATOM   2031  N   HIS A1018     -20.868   6.694  -3.535  1.00 43.65           N  \nATOM   2032  CA  HIS A1018     -19.987   7.804  -3.159  1.00 42.72           C  \nATOM   2033  C   HIS A1018     -18.485   7.544  -3.385  1.00 42.39           C  \nATOM   2034  O   HIS A1018     -17.658   8.063  -2.636  1.00 42.28           O  \nATOM   2035  CB  HIS A1018     -20.325   8.353  -1.751  1.00 46.64           C  \nATOM   2036  CG  HIS A1018     -21.690   8.984  -1.654  1.00 52.37           C  \nATOM   2037  ND1 HIS A1018     -21.945  10.278  -2.076  1.00 54.35           N  \nATOM   2038  CD2 HIS A1018     -22.888   8.509  -1.166  1.00 56.51           C  \nATOM   2039  CE1 HIS A1018     -23.236  10.521  -1.839  1.00 55.92           C  \nATOM   2040  NE2 HIS A1018     -23.871   9.493  -1.289  1.00 57.64           N  \nATOM   2041  H   HIS A1018     -21.499   6.901  -4.297  1.00 43.65           H  \nATOM   2042  HA  HIS A1018     -20.228   8.589  -3.873  1.00 42.72           H  \nATOM   2043  HB3 HIS A1018     -19.613   9.122  -1.457  1.00 46.64           H  \nATOM   2044  HB2 HIS A1018     -20.245   7.572  -0.994  1.00 46.64           H  \nATOM   2045  HD1 HIS A1018     -21.281  10.930  -2.475  1.00 54.35           H  \nATOM   2046  HD2 HIS A1018     -23.116   7.542  -0.744  1.00 56.51           H  \nATOM   2047  HE1 HIS A1018     -23.715  11.462  -2.067  1.00 55.92           H  \nATOM   2048  N   TYR A1019     -18.162   6.786  -4.443  1.00 35.47           N  \nATOM   2049  CA  TYR A1019     -16.796   6.540  -4.899  1.00 33.30           C  \nATOM   2050  C   TYR A1019     -16.560   7.203  -6.265  1.00 34.14           C  \nATOM   2051  O   TYR A1019     -17.489   7.334  -7.060  1.00 33.14           O  \nATOM   2052  CB  TYR A1019     -16.557   5.022  -5.022  1.00 34.28           C  \nATOM   2053  CG  TYR A1019     -16.661   4.215  -3.739  1.00 38.78           C  \nATOM   2054  CD1 TYR A1019     -15.668   4.330  -2.746  1.00 41.85           C  \nATOM   2055  CD2 TYR A1019     -17.732   3.318  -3.549  1.00 40.74           C  \nATOM   2056  CE1 TYR A1019     -15.753   3.568  -1.566  1.00 44.99           C  \nATOM   2057  CE2 TYR A1019     -17.808   2.539  -2.378  1.00 43.80           C  \nATOM   2058  CZ  TYR A1019     -16.817   2.663  -1.385  1.00 51.67           C  \nATOM   2059  OH  TYR A1019     -16.885   1.906  -0.251  1.00 54.79           O  \nATOM   2060  H   TYR A1019     -18.894   6.392  -5.020  1.00 35.47           H  \nATOM   2061  HA  TYR A1019     -16.081   6.951  -4.188  1.00 33.30           H  \nATOM   2062  HB3 TYR A1019     -15.565   4.835  -5.438  1.00 34.28           H  \nATOM   2063  HB2 TYR A1019     -17.263   4.613  -5.740  1.00 34.28           H  \nATOM   2064  HD1 TYR A1019     -14.835   4.996  -2.893  1.00 41.85           H  \nATOM   2065  HD2 TYR A1019     -18.492   3.220  -4.308  1.00 40.74           H  \nATOM   2066  HE1 TYR A1019     -14.987   3.663  -0.812  1.00 44.99           H  \nATOM   2067  HE2 TYR A1019     -18.625   1.845  -2.245  1.00 43.80           H  \nATOM   2068  HH  TYR A1019     -16.158   2.067   0.354  1.00 54.79           H  \nATOM   2069  N   ILE A1020     -15.289   7.536  -6.521  1.00 29.77           N  \nATOM   2070  CA  ILE A1020     -14.732   7.899  -7.826  1.00 28.07           C  \nATOM   2071  C   ILE A1020     -13.745   6.798  -8.262  1.00 32.77           C  \nATOM   2072  O   ILE A1020     -13.145   6.156  -7.399  1.00 34.18           O  \nATOM   2073  CB  ILE A1020     -13.975   9.261  -7.762  1.00 30.74           C  \nATOM   2074  CG1 ILE A1020     -12.981   9.361  -6.573  1.00 31.83           C  \nATOM   2075  CG2 ILE A1020     -14.990  10.419  -7.776  1.00 31.74           C  \nATOM   2076  CD1 ILE A1020     -12.103  10.614  -6.545  1.00 34.37           C  \nATOM   2077  H   ILE A1020     -14.600   7.396  -5.793  1.00 29.77           H  \nATOM   2078  HA  ILE A1020     -15.529   7.954  -8.569  1.00 28.07           H  \nATOM   2079  HB  ILE A1020     -13.387   9.362  -8.676  1.00 30.74           H  \nATOM   2080 HG13 ILE A1020     -12.317   8.498  -6.563  1.00 31.83           H  \nATOM   2081 HG12 ILE A1020     -13.528   9.323  -5.635  1.00 31.83           H  \nATOM   2082 HG21 ILE A1020     -14.504  11.393  -7.804  1.00 31.74           H  \nATOM   2083 HG22 ILE A1020     -15.631  10.362  -8.656  1.00 31.74           H  \nATOM   2084 HG23 ILE A1020     -15.638  10.391  -6.901  1.00 31.74           H  \nATOM   2085 HD11 ILE A1020     -11.396  10.561  -5.718  1.00 34.37           H  \nATOM   2086 HD12 ILE A1020     -11.523  10.701  -7.459  1.00 34.37           H  \nATOM   2087 HD13 ILE A1020     -12.688  11.525  -6.418  1.00 34.37           H  \nATOM   2088  N   HIS A1021     -13.614   6.578  -9.582  1.00 29.57           N  \nATOM   2089  CA  HIS A1021     -12.786   5.511 -10.155  1.00 28.01           C  \nATOM   2090  C   HIS A1021     -11.322   5.937 -10.347  1.00 30.31           C  \nATOM   2091  O   HIS A1021     -10.436   5.175  -9.969  1.00 28.41           O  \nATOM   2092  CB  HIS A1021     -13.403   5.013 -11.479  1.00 27.19           C  \nATOM   2093  CG  HIS A1021     -12.853   3.693 -11.959  1.00 29.30           C  \nATOM   2094  ND1 HIS A1021     -11.667   3.594 -12.689  1.00 30.35           N  \nATOM   2095  CD2 HIS A1021     -13.363   2.425 -11.774  1.00 30.30           C  \nATOM   2096  CE1 HIS A1021     -11.504   2.297 -12.912  1.00 29.49           C  \nATOM   2097  NE2 HIS A1021     -12.474   1.556 -12.382  1.00 29.77           N  \nATOM   2098  H   HIS A1021     -14.123   7.159 -10.238  1.00 29.57           H  \nATOM   2099  HA  HIS A1021     -12.801   4.668  -9.461  1.00 28.01           H  \nATOM   2100  HB3 HIS A1021     -13.282   5.753 -12.271  1.00 27.19           H  \nATOM   2101  HB2 HIS A1021     -14.474   4.880 -11.356  1.00 27.19           H  \nATOM   2102  HD2 HIS A1021     -14.255   2.085 -11.273  1.00 30.30           H  \nATOM   2103  HE1 HIS A1021     -10.667   1.883 -13.456  1.00 29.49           H  \nATOM   2104  HE2 HIS A1021     -12.538   0.547 -12.425  1.00 29.77           H  \nATOM   2105  N   ARG A1022     -11.096   7.121 -10.943  1.00 26.88           N  \nATOM   2106  CA  ARG A1022      -9.784   7.722 -11.235  1.00 26.62           C  \nATOM   2107  C   ARG A1022      -8.908   6.986 -12.278  1.00 29.84           C  \nATOM   2108  O   ARG A1022      -7.774   7.416 -12.489  1.00 30.79           O  \nATOM   2109  CB  ARG A1022      -8.980   7.994  -9.941  1.00 26.30           C  \nATOM   2110  CG  ARG A1022      -9.678   8.917  -8.919  1.00 34.16           C  \nATOM   2111  CD  ARG A1022      -8.867   9.205  -7.638  1.00 40.37           C  \nATOM   2112  NE  ARG A1022      -7.494   9.662  -7.927  1.00 53.37           N  \nATOM   2113  CZ  ARG A1022      -6.339   9.249  -7.370  1.00 66.01           C  \nATOM   2114  NH1 ARG A1022      -6.301   8.376  -6.352  1.00 50.08           N  \nATOM   2115  NH2 ARG A1022      -5.186   9.718  -7.861  1.00 58.24           N1+\nATOM   2116  H   ARG A1022     -11.894   7.664 -11.248  1.00 26.88           H  \nATOM   2117  HA  ARG A1022     -10.003   8.685 -11.691  1.00 26.62           H  \nATOM   2118  HB3 ARG A1022      -8.038   8.461 -10.224  1.00 26.30           H  \nATOM   2119  HB2 ARG A1022      -8.703   7.055  -9.468  1.00 26.30           H  \nATOM   2120  HG3 ARG A1022     -10.571   8.380  -8.599  1.00 34.16           H  \nATOM   2121  HG2 ARG A1022     -10.035   9.838  -9.374  1.00 34.16           H  \nATOM   2122  HD3 ARG A1022      -8.962   8.416  -6.896  1.00 40.37           H  \nATOM   2123  HD2 ARG A1022      -9.304  10.086  -7.170  1.00 40.37           H  \nATOM   2124  HE  ARG A1022      -7.428  10.323  -8.688  1.00 53.37           H  \nATOM   2125 HH12 ARG A1022      -5.420   8.065  -5.971  1.00 50.08           H  \nATOM   2126 HH11 ARG A1022      -7.160   7.948  -6.033  1.00 50.08           H  \nATOM   2127 HH22 ARG A1022      -4.301   9.402  -7.489  1.00 58.24           H  \nATOM   2128 HH21 ARG A1022      -5.185  10.345  -8.654  1.00 58.24           H  \nATOM   2129  N   ASN A1023      -9.418   5.931 -12.935  1.00 25.28           N  \nATOM   2130  CA  ASN A1023      -8.672   5.162 -13.934  1.00 24.95           C  \nATOM   2131  C   ASN A1023      -9.615   4.581 -15.005  1.00 27.49           C  \nATOM   2132  O   ASN A1023      -9.413   3.447 -15.436  1.00 27.32           O  \nATOM   2133  CB  ASN A1023      -7.816   4.068 -13.232  1.00 27.86           C  \nATOM   2134  CG  ASN A1023      -6.588   3.573 -14.014  1.00 46.94           C  \nATOM   2135  OD1 ASN A1023      -6.243   4.089 -15.076  1.00 37.71           O  \nATOM   2136  ND2 ASN A1023      -5.925   2.544 -13.483  1.00 47.99           N  \nATOM   2137  H   ASN A1023     -10.358   5.614 -12.735  1.00 25.28           H  \nATOM   2138  HA  ASN A1023      -8.030   5.821 -14.520  1.00 24.95           H  \nATOM   2139  HB3 ASN A1023      -8.437   3.219 -12.941  1.00 27.86           H  \nATOM   2140  HB2 ASN A1023      -7.417   4.470 -12.303  1.00 27.86           H  \nATOM   2141 HD22 ASN A1023      -5.119   2.161 -13.957  1.00 47.99           H  \nATOM   2142 HD21 ASN A1023      -6.237   2.118 -12.622  1.00 47.99           H  \nATOM   2143  N   LEU A1024     -10.648   5.336 -15.411  1.00 23.70           N  \nATOM   2144  CA  LEU A1024     -11.619   4.879 -16.405  1.00 23.85           C  \nATOM   2145  C   LEU A1024     -11.026   4.992 -17.823  1.00 29.77           C  \nATOM   2146  O   LEU A1024     -10.781   6.099 -18.301  1.00 30.30           O  \nATOM   2147  CB  LEU A1024     -12.947   5.643 -16.212  1.00 23.60           C  \nATOM   2148  CG  LEU A1024     -14.133   5.123 -17.053  1.00 28.86           C  \nATOM   2149  CD1 LEU A1024     -14.514   3.664 -16.722  1.00 29.18           C  \nATOM   2150  CD2 LEU A1024     -15.338   6.057 -16.884  1.00 32.57           C  \nATOM   2151  H   LEU A1024     -10.782   6.267 -15.035  1.00 23.70           H  \nATOM   2152  HA  LEU A1024     -11.821   3.825 -16.203  1.00 23.85           H  \nATOM   2153  HB3 LEU A1024     -12.786   6.698 -16.431  1.00 23.60           H  \nATOM   2154  HB2 LEU A1024     -13.227   5.603 -15.157  1.00 23.60           H  \nATOM   2155  HG  LEU A1024     -13.855   5.162 -18.107  1.00 28.86           H  \nATOM   2156 HD11 LEU A1024     -15.581   3.551 -16.533  1.00 29.18           H  \nATOM   2157 HD12 LEU A1024     -14.259   2.998 -17.547  1.00 29.18           H  \nATOM   2158 HD13 LEU A1024     -14.004   3.295 -15.832  1.00 29.18           H  \nATOM   2159 HD21 LEU A1024     -16.218   5.670 -17.397  1.00 32.57           H  \nATOM   2160 HD22 LEU A1024     -15.592   6.194 -15.833  1.00 32.57           H  \nATOM   2161 HD23 LEU A1024     -15.118   7.041 -17.292  1.00 32.57           H  \nATOM   2162  N   ALA A1025     -10.781   3.825 -18.437  1.00 25.59           N  \nATOM   2163  CA  ALA A1025     -10.140   3.647 -19.741  1.00 24.45           C  \nATOM   2164  C   ALA A1025     -10.518   2.265 -20.300  1.00 24.35           C  \nATOM   2165  O   ALA A1025     -10.969   1.410 -19.538  1.00 23.60           O  \nATOM   2166  CB  ALA A1025      -8.617   3.790 -19.578  1.00 25.60           C  \nATOM   2167  H   ALA A1025     -11.033   2.965 -17.971  1.00 25.59           H  \nATOM   2168  HA  ALA A1025     -10.493   4.413 -20.432  1.00 24.45           H  \nATOM   2169  HB1 ALA A1025      -8.133   3.871 -20.549  1.00 25.60           H  \nATOM   2170  HB2 ALA A1025      -8.354   4.689 -19.019  1.00 25.60           H  \nATOM   2171  HB3 ALA A1025      -8.180   2.936 -19.064  1.00 25.60           H  \nATOM   2172  N   ALA A1026     -10.313   2.052 -21.613  1.00 21.93           N  \nATOM   2173  CA  ALA A1026     -10.616   0.790 -22.307  1.00 22.59           C  \nATOM   2174  C   ALA A1026      -9.798  -0.431 -21.830  1.00 27.08           C  \nATOM   2175  O   ALA A1026     -10.290  -1.554 -21.927  1.00 26.36           O  \nATOM   2176  CB  ALA A1026     -10.453   0.991 -23.819  1.00 24.44           C  \nATOM   2177  H   ALA A1026      -9.928   2.793 -22.186  1.00 21.93           H  \nATOM   2178  HA  ALA A1026     -11.668   0.563 -22.117  1.00 22.59           H  \nATOM   2179  HB1 ALA A1026     -10.733   0.090 -24.365  1.00 24.44           H  \nATOM   2180  HB2 ALA A1026     -11.089   1.800 -24.179  1.00 24.44           H  \nATOM   2181  HB3 ALA A1026      -9.423   1.233 -24.083  1.00 24.44           H  \nATOM   2182  N   ARG A1027      -8.591  -0.185 -21.289  1.00 25.25           N  \nATOM   2183  CA  ARG A1027      -7.742  -1.139 -20.565  1.00 25.45           C  \nATOM   2184  C   ARG A1027      -8.425  -1.710 -19.307  1.00 28.29           C  \nATOM   2185  O   ARG A1027      -8.223  -2.878 -18.976  1.00 27.42           O  \nATOM   2186  CB  ARG A1027      -6.432  -0.403 -20.184  1.00 27.95           C  \nATOM   2187  CG  ARG A1027      -5.435  -1.193 -19.307  1.00 42.70           C  \nATOM   2188  CD  ARG A1027      -4.162  -0.408 -18.947  1.00 56.67           C  \nATOM   2189  NE  ARG A1027      -3.234  -0.266 -20.085  1.00 69.04           N  \nATOM   2190  CZ  ARG A1027      -2.191   0.580 -20.180  1.00 82.45           C  \nATOM   2191  NH1 ARG A1027      -1.417   0.527 -21.271  1.00 58.12           N  \nATOM   2192  NH2 ARG A1027      -1.893   1.468 -19.218  1.00 78.84           N1+\nATOM   2193  H   ARG A1027      -8.243   0.766 -21.316  1.00 25.25           H  \nATOM   2194  HA  ARG A1027      -7.506  -1.970 -21.231  1.00 25.45           H  \nATOM   2195  HB3 ARG A1027      -6.693   0.509 -19.645  1.00 27.95           H  \nATOM   2196  HB2 ARG A1027      -5.932  -0.070 -21.091  1.00 27.95           H  \nATOM   2197  HG3 ARG A1027      -5.149  -2.068 -19.890  1.00 42.70           H  \nATOM   2198  HG2 ARG A1027      -5.880  -1.580 -18.390  1.00 42.70           H  \nATOM   2199  HD3 ARG A1027      -3.675  -0.813 -18.060  1.00 56.67           H  \nATOM   2200  HD2 ARG A1027      -4.467   0.608 -18.695  1.00 56.67           H  \nATOM   2201  HE  ARG A1027      -3.396  -0.904 -20.850  1.00 69.04           H  \nATOM   2202 HH12 ARG A1027      -0.649   1.172 -21.381  1.00 58.12           H  \nATOM   2203 HH11 ARG A1027      -1.615  -0.134 -22.007  1.00 58.12           H  \nATOM   2204 HH22 ARG A1027      -1.107   2.094 -19.316  1.00 78.84           H  \nATOM   2205 HH21 ARG A1027      -2.462   1.513 -18.385  1.00 78.84           H  \nATOM   2206  N   ASN A1028      -9.194  -0.846 -18.632  1.00 25.48           N  \nATOM   2207  CA  ASN A1028      -9.823  -1.077 -17.334  1.00 25.69           C  \nATOM   2208  C   ASN A1028     -11.317  -1.429 -17.473  1.00 31.11           C  \nATOM   2209  O   ASN A1028     -11.999  -1.498 -16.454  1.00 31.65           O  \nATOM   2210  CB  ASN A1028      -9.602   0.176 -16.449  1.00 25.12           C  \nATOM   2211  CG  ASN A1028      -8.115   0.495 -16.245  1.00 40.47           C  \nATOM   2212  OD1 ASN A1028      -7.402  -0.253 -15.588  1.00 35.79           O  \nATOM   2213  ND2 ASN A1028      -7.627   1.597 -16.814  1.00 30.20           N  \nATOM   2214  H   ASN A1028      -9.333   0.079 -19.016  1.00 25.48           H  \nATOM   2215  HA  ASN A1028      -9.355  -1.930 -16.841  1.00 25.69           H  \nATOM   2216  HB3 ASN A1028     -10.038   0.026 -15.461  1.00 25.12           H  \nATOM   2217  HB2 ASN A1028     -10.111   1.042 -16.878  1.00 25.12           H  \nATOM   2218 HD22 ASN A1028      -6.658   1.847 -16.685  1.00 30.20           H  \nATOM   2219 HD21 ASN A1028      -8.239   2.229 -17.310  1.00 30.20           H  \nATOM   2220  N   VAL A1029     -11.798  -1.668 -18.706  1.00 26.95           N  \nATOM   2221  CA  VAL A1029     -13.139  -2.175 -18.986  1.00 26.70           C  \nATOM   2222  C   VAL A1029     -12.988  -3.520 -19.714  1.00 31.33           C  \nATOM   2223  O   VAL A1029     -12.373  -3.583 -20.778  1.00 31.48           O  \nATOM   2224  CB  VAL A1029     -13.976  -1.193 -19.852  1.00 30.65           C  \nATOM   2225  CG1 VAL A1029     -15.338  -1.776 -20.277  1.00 31.45           C  \nATOM   2226  CG2 VAL A1029     -14.220   0.131 -19.105  1.00 29.49           C  \nATOM   2227  H   VAL A1029     -11.183  -1.583 -19.503  1.00 26.95           H  \nATOM   2228  HA  VAL A1029     -13.684  -2.346 -18.056  1.00 26.70           H  \nATOM   2229  HB  VAL A1029     -13.412  -0.960 -20.757  1.00 30.65           H  \nATOM   2230 HG11 VAL A1029     -15.924  -1.049 -20.837  1.00 31.45           H  \nATOM   2231 HG12 VAL A1029     -15.230  -2.654 -20.910  1.00 31.45           H  \nATOM   2232 HG13 VAL A1029     -15.921  -2.070 -19.403  1.00 31.45           H  \nATOM   2233 HG21 VAL A1029     -14.744   0.849 -19.734  1.00 29.49           H  \nATOM   2234 HG22 VAL A1029     -14.822  -0.027 -18.209  1.00 29.49           H  \nATOM   2235 HG23 VAL A1029     -13.291   0.602 -18.790  1.00 29.49           H  \nATOM   2236  N   LEU A1030     -13.548  -4.562 -19.088  1.00 29.26           N  \nATOM   2237  CA  LEU A1030     -13.434  -5.968 -19.450  1.00 29.87           C  \nATOM   2238  C   LEU A1030     -14.733  -6.447 -20.113  1.00 34.28           C  \nATOM   2239  O   LEU A1030     -15.816  -6.037 -19.705  1.00 33.78           O  \nATOM   2240  CB  LEU A1030     -13.138  -6.783 -18.169  1.00 30.51           C  \nATOM   2241  CG  LEU A1030     -11.936  -6.290 -17.328  1.00 34.35           C  \nATOM   2242  CD1 LEU A1030     -11.856  -7.064 -16.001  1.00 34.54           C  \nATOM   2243  CD2 LEU A1030     -10.610  -6.344 -18.112  1.00 35.67           C  \nATOM   2244  H   LEU A1030     -14.085  -4.388 -18.246  1.00 29.26           H  \nATOM   2245  HA  LEU A1030     -12.621  -6.109 -20.154  1.00 29.87           H  \nATOM   2246  HB3 LEU A1030     -12.970  -7.825 -18.443  1.00 30.51           H  \nATOM   2247  HB2 LEU A1030     -14.023  -6.771 -17.529  1.00 30.51           H  \nATOM   2248  HG  LEU A1030     -12.099  -5.248 -17.048  1.00 34.35           H  \nATOM   2249 HD11 LEU A1030     -10.853  -7.056 -15.576  1.00 34.54           H  \nATOM   2250 HD12 LEU A1030     -12.517  -6.617 -15.257  1.00 34.54           H  \nATOM   2251 HD13 LEU A1030     -12.155  -8.106 -16.124  1.00 34.54           H  \nATOM   2252 HD21 LEU A1030      -9.796  -6.774 -17.533  1.00 35.67           H  \nATOM   2253 HD22 LEU A1030     -10.700  -6.943 -19.016  1.00 35.67           H  \nATOM   2254 HD23 LEU A1030     -10.295  -5.343 -18.409  1.00 35.67           H  \nATOM   2255  N   LEU A1031     -14.593  -7.319 -21.118  1.00 30.49           N  \nATOM   2256  CA  LEU A1031     -15.677  -7.865 -21.925  1.00 32.51           C  \nATOM   2257  C   LEU A1031     -15.990  -9.291 -21.448  1.00 35.33           C  \nATOM   2258  O   LEU A1031     -15.113 -10.153 -21.506  1.00 35.33           O  \nATOM   2259  CB  LEU A1031     -15.209  -7.845 -23.396  1.00 33.91           C  \nATOM   2260  CG  LEU A1031     -16.302  -8.174 -24.433  1.00 41.72           C  \nATOM   2261  CD1 LEU A1031     -17.357  -7.065 -24.522  1.00 42.04           C  \nATOM   2262  CD2 LEU A1031     -15.696  -8.439 -25.818  1.00 45.52           C  \nATOM   2263  H   LEU A1031     -13.662  -7.617 -21.389  1.00 30.49           H  \nATOM   2264  HA  LEU A1031     -16.567  -7.241 -21.825  1.00 32.51           H  \nATOM   2265  HB3 LEU A1031     -14.375  -8.541 -23.507  1.00 33.91           H  \nATOM   2266  HB2 LEU A1031     -14.790  -6.866 -23.627  1.00 33.91           H  \nATOM   2267  HG  LEU A1031     -16.801  -9.093 -24.128  1.00 41.72           H  \nATOM   2268 HD11 LEU A1031     -17.957  -7.181 -25.423  1.00 42.04           H  \nATOM   2269 HD12 LEU A1031     -18.043  -7.102 -23.679  1.00 42.04           H  \nATOM   2270 HD13 LEU A1031     -16.903  -6.074 -24.546  1.00 42.04           H  \nATOM   2271 HD21 LEU A1031     -16.156  -9.306 -26.290  1.00 45.52           H  \nATOM   2272 HD22 LEU A1031     -15.839  -7.592 -26.491  1.00 45.52           H  \nATOM   2273 HD23 LEU A1031     -14.625  -8.629 -25.764  1.00 45.52           H  \nATOM   2274  N   ASP A1032     -17.230  -9.515 -20.985  1.00 33.70           N  \nATOM   2275  CA  ASP A1032     -17.712 -10.827 -20.543  1.00 35.49           C  \nATOM   2276  C   ASP A1032     -18.166 -11.661 -21.755  1.00 42.98           C  \nATOM   2277  O   ASP A1032     -17.727 -12.798 -21.921  1.00 43.01           O  \nATOM   2278  CB  ASP A1032     -18.822 -10.678 -19.476  1.00 38.24           C  \nATOM   2279  CG  ASP A1032     -19.218 -11.987 -18.779  1.00 57.45           C  \nATOM   2280  OD1 ASP A1032     -20.169 -12.639 -19.268  1.00 62.50           O  \nATOM   2281  OD2 ASP A1032     -18.465 -12.387 -17.864  1.00 62.05           O1-\nATOM   2282  H   ASP A1032     -17.907  -8.764 -20.978  1.00 33.70           H  \nATOM   2283  HA  ASP A1032     -16.879 -11.358 -20.082  1.00 35.49           H  \nATOM   2284  HB3 ASP A1032     -19.703 -10.217 -19.924  1.00 38.24           H  \nATOM   2285  HB2 ASP A1032     -18.498  -9.962 -18.720  1.00 38.24           H  \nATOM   2286  N   ASN A1033     -19.010 -11.038 -22.589  1.00 43.24           N  \nATOM   2287  CA  ASN A1033     -19.496 -11.544 -23.869  1.00 46.44           C  \nATOM   2288  C   ASN A1033     -19.762 -10.349 -24.801  1.00 51.69           C  \nATOM   2289  O   ASN A1033     -19.561  -9.203 -24.398  1.00 49.09           O  \nATOM   2290  CB  ASN A1033     -20.703 -12.502 -23.675  1.00 48.31           C  \nATOM   2291  CG  ASN A1033     -21.947 -11.875 -23.033  1.00 66.28           C  \nATOM   2292  OD1 ASN A1033     -22.671 -11.117 -23.674  1.00 59.86           O  \nATOM   2293  ND2 ASN A1033     -22.211 -12.205 -21.767  1.00 59.92           N  \nATOM   2294  H   ASN A1033     -19.289 -10.090 -22.377  1.00 43.24           H  \nATOM   2295  HA  ASN A1033     -18.694 -12.117 -24.331  1.00 46.44           H  \nATOM   2296  HB3 ASN A1033     -20.389 -13.358 -23.076  1.00 48.31           H  \nATOM   2297  HB2 ASN A1033     -21.002 -12.918 -24.638  1.00 48.31           H  \nATOM   2298 HD22 ASN A1033     -23.026 -11.828 -21.307  1.00 59.92           H  \nATOM   2299 HD21 ASN A1033     -21.579 -12.797 -21.242  1.00 59.92           H  \nATOM   2300  N   ASP A1034     -20.218 -10.631 -26.032  1.00 52.34           N  \nATOM   2301  CA  ASP A1034     -20.535  -9.640 -27.073  1.00 53.71           C  \nATOM   2302  C   ASP A1034     -21.507  -8.516 -26.646  1.00 56.50           C  \nATOM   2303  O   ASP A1034     -21.409  -7.420 -27.190  1.00 55.06           O  \nATOM   2304  CB  ASP A1034     -20.990 -10.266 -28.427  1.00 59.25           C  \nATOM   2305  CG  ASP A1034     -21.924 -11.494 -28.402  1.00 77.62           C  \nATOM   2306  OD1 ASP A1034     -22.639 -11.706 -27.397  1.00 79.51           O  \nATOM   2307  OD2 ASP A1034     -22.007 -12.140 -29.469  1.00 88.40           O1-\nATOM   2308  H   ASP A1034     -20.398 -11.592 -26.284  1.00 52.34           H  \nATOM   2309  HA  ASP A1034     -19.585  -9.140 -27.273  1.00 53.71           H  \nATOM   2310  HB3 ASP A1034     -20.095 -10.532 -28.993  1.00 59.25           H  \nATOM   2311  HB2 ASP A1034     -21.495  -9.512 -29.032  1.00 59.25           H  \nATOM   2312  N   ARG A1035     -22.406  -8.796 -25.687  1.00 52.42           N  \nATOM   2313  CA  ARG A1035     -23.448  -7.882 -25.216  1.00 52.12           C  \nATOM   2314  C   ARG A1035     -23.343  -7.580 -23.704  1.00 53.91           C  \nATOM   2315  O   ARG A1035     -24.336  -7.124 -23.136  1.00 54.42           O  \nATOM   2316  CB  ARG A1035     -24.835  -8.467 -25.595  1.00 56.06           C  \nATOM   2317  CG  ARG A1035     -25.086  -8.703 -27.101  1.00 68.03           C  \nATOM   2318  CD  ARG A1035     -24.897  -7.444 -27.966  1.00 74.26           C  \nATOM   2319  NE  ARG A1035     -25.309  -7.644 -29.365  1.00 83.22           N  \nATOM   2320  CZ  ARG A1035     -26.494  -7.332 -29.925  1.00103.41           C  \nATOM   2321  NH1 ARG A1035     -27.506  -6.799 -29.222  1.00 95.23           N  \nATOM   2322  NH2 ARG A1035     -26.668  -7.561 -31.233  1.00 92.56           N1+\nATOM   2323  H   ARG A1035     -22.419  -9.724 -25.282  1.00 52.42           H  \nATOM   2324  HA  ARG A1035     -23.344  -6.910 -25.700  1.00 52.12           H  \nATOM   2325  HB3 ARG A1035     -25.620  -7.801 -25.237  1.00 56.06           H  \nATOM   2326  HB2 ARG A1035     -24.983  -9.410 -25.066  1.00 56.06           H  \nATOM   2327  HG3 ARG A1035     -26.057  -9.166 -27.280  1.00 68.03           H  \nATOM   2328  HG2 ARG A1035     -24.352  -9.442 -27.423  1.00 68.03           H  \nATOM   2329  HD3 ARG A1035     -23.832  -7.242 -28.056  1.00 74.26           H  \nATOM   2330  HD2 ARG A1035     -25.331  -6.559 -27.506  1.00 74.26           H  \nATOM   2331  HE  ARG A1035     -24.607  -8.071 -29.954  1.00 83.22           H  \nATOM   2332 HH12 ARG A1035     -28.382  -6.569 -29.667  1.00 95.23           H  \nATOM   2333 HH11 ARG A1035     -27.412  -6.662 -28.223  1.00 95.23           H  \nATOM   2334 HH22 ARG A1035     -27.544  -7.335 -31.681  1.00 92.56           H  \nATOM   2335 HH21 ARG A1035     -25.921  -7.962 -31.782  1.00 92.56           H  \nATOM   2336  N   LEU A1036     -22.174  -7.803 -23.070  1.00 47.46           N  \nATOM   2337  CA  LEU A1036     -21.967  -7.538 -21.640  1.00 44.95           C  \nATOM   2338  C   LEU A1036     -20.533  -7.065 -21.368  1.00 44.87           C  \nATOM   2339  O   LEU A1036     -19.582  -7.752 -21.739  1.00 44.01           O  \nATOM   2340  CB  LEU A1036     -22.340  -8.791 -20.812  1.00 46.48           C  \nATOM   2341  CG  LEU A1036     -22.180  -8.679 -19.274  1.00 50.35           C  \nATOM   2342  CD1 LEU A1036     -22.973  -7.502 -18.671  1.00 50.69           C  \nATOM   2343  CD2 LEU A1036     -22.529 -10.018 -18.591  1.00 54.50           C  \nATOM   2344  H   LEU A1036     -21.382  -8.171 -23.579  1.00 47.46           H  \nATOM   2345  HA  LEU A1036     -22.630  -6.724 -21.343  1.00 44.95           H  \nATOM   2346  HB3 LEU A1036     -21.719  -9.617 -21.159  1.00 46.48           H  \nATOM   2347  HB2 LEU A1036     -23.369  -9.073 -21.040  1.00 46.48           H  \nATOM   2348  HG  LEU A1036     -21.127  -8.494 -19.056  1.00 50.35           H  \nATOM   2349 HD11 LEU A1036     -23.473  -7.760 -17.737  1.00 50.69           H  \nATOM   2350 HD12 LEU A1036     -22.306  -6.670 -18.448  1.00 50.69           H  \nATOM   2351 HD13 LEU A1036     -23.741  -7.137 -19.353  1.00 50.69           H  \nATOM   2352 HD21 LEU A1036     -21.721 -10.346 -17.938  1.00 54.50           H  \nATOM   2353 HD22 LEU A1036     -23.433  -9.959 -17.986  1.00 54.50           H  \nATOM   2354 HD23 LEU A1036     -22.691 -10.816 -19.315  1.00 54.50           H  \nATOM   2355  N   VAL A1037     -20.428  -5.918 -20.680  1.00 38.25           N  \nATOM   2356  CA  VAL A1037     -19.183  -5.244 -20.316  1.00 36.27           C  \nATOM   2357  C   VAL A1037     -19.170  -4.944 -18.803  1.00 39.75           C  \nATOM   2358  O   VAL A1037     -20.229  -4.712 -18.218  1.00 42.27           O  \nATOM   2359  CB  VAL A1037     -19.016  -3.946 -21.177  1.00 39.78           C  \nATOM   2360  CG1 VAL A1037     -19.009  -2.583 -20.456  1.00 38.54           C  \nATOM   2361  CG2 VAL A1037     -17.802  -4.070 -22.103  1.00 38.84           C  \nATOM   2362  H   VAL A1037     -21.272  -5.428 -20.415  1.00 38.25           H  \nATOM   2363  HA  VAL A1037     -18.349  -5.920 -20.508  1.00 36.27           H  \nATOM   2364  HB  VAL A1037     -19.873  -3.887 -21.850  1.00 39.78           H  \nATOM   2365 HG11 VAL A1037     -18.916  -1.774 -21.181  1.00 38.54           H  \nATOM   2366 HG12 VAL A1037     -19.935  -2.413 -19.907  1.00 38.54           H  \nATOM   2367 HG13 VAL A1037     -18.179  -2.490 -19.757  1.00 38.54           H  \nATOM   2368 HG21 VAL A1037     -17.730  -3.211 -22.767  1.00 38.84           H  \nATOM   2369 HG22 VAL A1037     -16.873  -4.154 -21.540  1.00 38.84           H  \nATOM   2370 HG23 VAL A1037     -17.890  -4.953 -22.732  1.00 38.84           H  \nATOM   2371  N   LYS A1038     -17.968  -4.982 -18.204  1.00 33.36           N  \nATOM   2372  CA  LYS A1038     -17.714  -4.878 -16.766  1.00 33.06           C  \nATOM   2373  C   LYS A1038     -16.485  -4.002 -16.491  1.00 35.92           C  \nATOM   2374  O   LYS A1038     -15.436  -4.235 -17.082  1.00 35.20           O  \nATOM   2375  CB  LYS A1038     -17.479  -6.290 -16.190  1.00 36.83           C  \nATOM   2376  CG  LYS A1038     -18.749  -7.145 -16.080  1.00 43.54           C  \nATOM   2377  CD  LYS A1038     -18.421  -8.608 -15.749  1.00 43.25           C  \nATOM   2378  CE  LYS A1038     -19.663  -9.482 -15.509  1.00 48.33           C  \nATOM   2379  NZ  LYS A1038     -20.306  -9.193 -14.214  1.00 58.37           N1+\nATOM   2380  H   LYS A1038     -17.149  -5.184 -18.767  1.00 33.36           H  \nATOM   2381  HA  LYS A1038     -18.574  -4.425 -16.277  1.00 33.06           H  \nATOM   2382  HB3 LYS A1038     -17.052  -6.212 -15.188  1.00 36.83           H  \nATOM   2383  HB2 LYS A1038     -16.730  -6.807 -16.793  1.00 36.83           H  \nATOM   2384  HG3 LYS A1038     -19.317  -7.118 -17.009  1.00 43.54           H  \nATOM   2385  HG2 LYS A1038     -19.391  -6.713 -15.312  1.00 43.54           H  \nATOM   2386  HD3 LYS A1038     -17.751  -8.642 -14.891  1.00 43.25           H  \nATOM   2387  HD2 LYS A1038     -17.852  -9.036 -16.575  1.00 43.25           H  \nATOM   2388  HE3 LYS A1038     -19.380 -10.535 -15.514  1.00 48.33           H  \nATOM   2389  HE2 LYS A1038     -20.386  -9.341 -16.312  1.00 48.33           H  \nATOM   2390  HZ1 LYS A1038     -20.568  -8.218 -14.175  1.00 58.37           H  \nATOM   2391  HZ2 LYS A1038     -21.132  -9.766 -14.115  1.00 58.37           H  \nATOM   2392  HZ3 LYS A1038     -19.651  -9.405 -13.472  1.00 58.37           H  \nATOM   2393  N   ILE A1039     -16.614  -3.050 -15.556  1.00 32.33           N  \nATOM   2394  CA  ILE A1039     -15.529  -2.171 -15.108  1.00 30.26           C  \nATOM   2395  C   ILE A1039     -14.627  -2.911 -14.094  1.00 36.96           C  \nATOM   2396  O   ILE A1039     -15.145  -3.519 -13.160  1.00 36.41           O  \nATOM   2397  CB  ILE A1039     -16.108  -0.894 -14.429  1.00 32.08           C  \nATOM   2398  CG1 ILE A1039     -17.001  -0.080 -15.398  1.00 32.40           C  \nATOM   2399  CG2 ILE A1039     -15.044   0.034 -13.803  1.00 30.46           C  \nATOM   2400  CD1 ILE A1039     -18.035   0.790 -14.673  1.00 32.90           C  \nATOM   2401  H   ILE A1039     -17.509  -2.910 -15.106  1.00 32.33           H  \nATOM   2402  HA  ILE A1039     -14.934  -1.867 -15.971  1.00 30.26           H  \nATOM   2403  HB  ILE A1039     -16.746  -1.235 -13.613  1.00 32.08           H  \nATOM   2404 HG13 ILE A1039     -17.551  -0.733 -16.075  1.00 32.40           H  \nATOM   2405 HG12 ILE A1039     -16.380   0.544 -16.043  1.00 32.40           H  \nATOM   2406 HG21 ILE A1039     -15.498   0.926 -13.372  1.00 30.46           H  \nATOM   2407 HG22 ILE A1039     -14.493  -0.448 -12.997  1.00 30.46           H  \nATOM   2408 HG23 ILE A1039     -14.320   0.364 -14.550  1.00 30.46           H  \nATOM   2409 HD11 ILE A1039     -18.793   1.149 -15.368  1.00 32.90           H  \nATOM   2410 HD12 ILE A1039     -18.548   0.231 -13.890  1.00 32.90           H  \nATOM   2411 HD13 ILE A1039     -17.570   1.656 -14.208  1.00 32.90           H  \nATOM   2412  N   GLY A1040     -13.302  -2.826 -14.292  1.00 34.99           N  \nATOM   2413  CA  GLY A1040     -12.289  -3.434 -13.430  1.00 35.46           C  \nATOM   2414  C   GLY A1040     -11.231  -2.398 -13.023  1.00 40.57           C  \nATOM   2415  O   GLY A1040     -11.286  -1.237 -13.431  1.00 40.24           O  \nATOM   2416  H   GLY A1040     -12.951  -2.287 -15.075  1.00 34.99           H  \nATOM   2417  HA3 GLY A1040     -11.814  -4.254 -13.968  1.00 35.46           H  \nATOM   2418  HA2 GLY A1040     -12.724  -3.850 -12.522  1.00 35.46           H  \nATOM   2419  N   ASP A1041     -10.271  -2.859 -12.199  1.00 37.60           N  \nATOM   2420  CA  ASP A1041      -9.139  -2.132 -11.605  1.00 37.19           C  \nATOM   2421  C   ASP A1041      -9.620  -0.924 -10.778  1.00 39.90           C  \nATOM   2422  O   ASP A1041      -9.731   0.180 -11.309  1.00 40.83           O  \nATOM   2423  CB  ASP A1041      -8.025  -1.778 -12.635  1.00 38.16           C  \nATOM   2424  CG  ASP A1041      -6.667  -1.263 -12.095  1.00 45.68           C  \nATOM   2425  OD1 ASP A1041      -5.762  -1.083 -12.938  1.00 47.53           O  \nATOM   2426  OD2 ASP A1041      -6.511  -1.058 -10.870  1.00 46.86           O1-\nATOM   2427  H   ASP A1041     -10.325  -3.828 -11.918  1.00 37.60           H  \nATOM   2428  HA  ASP A1041      -8.695  -2.841 -10.905  1.00 37.19           H  \nATOM   2429  HB3 ASP A1041      -8.418  -1.044 -13.339  1.00 38.16           H  \nATOM   2430  HB2 ASP A1041      -7.825  -2.662 -13.241  1.00 38.16           H  \nATOM   2431  N   PHE A1042      -9.874  -1.177  -9.486  1.00 32.99           N  \nATOM   2432  CA  PHE A1042     -10.252  -0.180  -8.482  1.00 32.48           C  \nATOM   2433  C   PHE A1042      -9.048   0.246  -7.614  1.00 35.62           C  \nATOM   2434  O   PHE A1042      -9.241   0.681  -6.480  1.00 35.44           O  \nATOM   2435  CB  PHE A1042     -11.446  -0.723  -7.659  1.00 35.36           C  \nATOM   2436  CG  PHE A1042     -12.746  -0.802  -8.444  1.00 36.03           C  \nATOM   2437  CD1 PHE A1042     -13.628   0.299  -8.473  1.00 39.47           C  \nATOM   2438  CD2 PHE A1042     -12.997  -1.898  -9.298  1.00 37.32           C  \nATOM   2439  CE1 PHE A1042     -14.757   0.263  -9.281  1.00 39.56           C  \nATOM   2440  CE2 PHE A1042     -14.124  -1.908 -10.107  1.00 40.21           C  \nATOM   2441  CZ  PHE A1042     -15.004  -0.835 -10.094  1.00 38.02           C  \nATOM   2442  H   PHE A1042      -9.761  -2.121  -9.143  1.00 32.99           H  \nATOM   2443  HA  PHE A1042     -10.592   0.732  -8.974  1.00 32.48           H  \nATOM   2444  HB3 PHE A1042     -11.630  -0.106  -6.779  1.00 35.36           H  \nATOM   2445  HB2 PHE A1042     -11.210  -1.720  -7.281  1.00 35.36           H  \nATOM   2446  HD1 PHE A1042     -13.434   1.171  -7.865  1.00 39.47           H  \nATOM   2447  HD2 PHE A1042     -12.311  -2.731  -9.331  1.00 37.32           H  \nATOM   2448  HE1 PHE A1042     -15.438   1.099  -9.293  1.00 39.56           H  \nATOM   2449  HE2 PHE A1042     -14.309  -2.752 -10.753  1.00 40.21           H  \nATOM   2450  HZ  PHE A1042     -15.878  -0.849 -10.728  1.00 38.02           H  \nATOM   2451  N   GLY A1043      -7.822   0.119  -8.156  1.00 33.72           N  \nATOM   2452  CA  GLY A1043      -6.562   0.403  -7.464  1.00 35.61           C  \nATOM   2453  C   GLY A1043      -6.236   1.898  -7.376  1.00 40.83           C  \nATOM   2454  O   GLY A1043      -5.336   2.268  -6.627  1.00 42.94           O  \nATOM   2455  H   GLY A1043      -7.738  -0.245  -9.097  1.00 33.72           H  \nATOM   2456  HA3 GLY A1043      -5.756  -0.110  -7.987  1.00 35.61           H  \nATOM   2457  HA2 GLY A1043      -6.588  -0.000  -6.454  1.00 35.61           H  \nATOM   2458  N   LEU A1044      -6.964   2.757  -8.101  1.00 35.95           N  \nATOM   2459  CA  LEU A1044      -6.868   4.212  -8.002  1.00 35.55           C  \nATOM   2460  C   LEU A1044      -8.174   4.815  -7.450  1.00 38.20           C  \nATOM   2461  O   LEU A1044      -8.207   6.019  -7.209  1.00 37.43           O  \nATOM   2462  CB  LEU A1044      -6.463   4.769  -9.392  1.00 34.71           C  \nATOM   2463  CG  LEU A1044      -5.546   6.012  -9.370  1.00 41.15           C  \nATOM   2464  CD1 LEU A1044      -4.267   5.793  -8.534  1.00 45.80           C  \nATOM   2465  CD2 LEU A1044      -5.202   6.468 -10.803  1.00 40.55           C  \nATOM   2466  H   LEU A1044      -7.669   2.407  -8.738  1.00 35.95           H  \nATOM   2467  HA  LEU A1044      -6.111   4.481  -7.266  1.00 35.55           H  \nATOM   2468  HB3 LEU A1044      -7.359   4.978  -9.980  1.00 34.71           H  \nATOM   2469  HB2 LEU A1044      -5.931   3.993  -9.948  1.00 34.71           H  \nATOM   2470  HG  LEU A1044      -6.111   6.821  -8.906  1.00 41.15           H  \nATOM   2471 HD11 LEU A1044      -3.368   6.181  -9.013  1.00 45.80           H  \nATOM   2472 HD12 LEU A1044      -4.346   6.292  -7.569  1.00 45.80           H  \nATOM   2473 HD13 LEU A1044      -4.091   4.735  -8.341  1.00 45.80           H  \nATOM   2474 HD21 LEU A1044      -5.457   7.516 -10.941  1.00 40.55           H  \nATOM   2475 HD22 LEU A1044      -4.144   6.362 -11.044  1.00 40.55           H  \nATOM   2476 HD23 LEU A1044      -5.746   5.901 -11.558  1.00 40.55           H  \nATOM   2477  N   ALA A1045      -9.209   3.982  -7.223  1.00 34.45           N  \nATOM   2478  CA  ALA A1045     -10.511   4.387  -6.698  1.00 35.33           C  \nATOM   2479  C   ALA A1045     -10.439   4.900  -5.252  1.00 41.48           C  \nATOM   2480  O   ALA A1045      -9.613   4.431  -4.467  1.00 41.92           O  \nATOM   2481  CB  ALA A1045     -11.497   3.216  -6.820  1.00 35.84           C  \nATOM   2482  H   ALA A1045      -9.099   2.998  -7.419  1.00 34.45           H  \nATOM   2483  HA  ALA A1045     -10.854   5.202  -7.333  1.00 35.33           H  \nATOM   2484  HB1 ALA A1045     -12.507   3.520  -6.545  1.00 35.84           H  \nATOM   2485  HB2 ALA A1045     -11.536   2.843  -7.844  1.00 35.84           H  \nATOM   2486  HB3 ALA A1045     -11.218   2.387  -6.170  1.00 35.84           H  \nATOM   2487  N   LYS A1046     -11.313   5.867  -4.943  1.00 39.67           N  \nATOM   2488  CA  LYS A1046     -11.335   6.594  -3.679  1.00 41.51           C  \nATOM   2489  C   LYS A1046     -12.769   6.933  -3.274  1.00 46.70           C  \nATOM   2490  O   LYS A1046     -13.584   7.254  -4.135  1.00 45.21           O  \nATOM   2491  CB  LYS A1046     -10.496   7.886  -3.832  1.00 43.95           C  \nATOM   2492  CG  LYS A1046      -9.006   7.725  -3.484  1.00 52.94           C  \nATOM   2493  CD  LYS A1046      -8.701   7.356  -2.018  1.00 61.30           C  \nATOM   2494  CE  LYS A1046      -9.532   8.134  -0.976  1.00 72.46           C  \nATOM   2495  NZ  LYS A1046      -9.060   7.912   0.401  1.00 80.50           N1+\nATOM   2496  H   LYS A1046     -11.985   6.167  -5.638  1.00 39.67           H  \nATOM   2497  HA  LYS A1046     -10.921   5.960  -2.893  1.00 41.51           H  \nATOM   2498  HB3 LYS A1046     -10.898   8.679  -3.200  1.00 43.95           H  \nATOM   2499  HB2 LYS A1046     -10.597   8.276  -4.845  1.00 43.95           H  \nATOM   2500  HG3 LYS A1046      -8.499   8.654  -3.726  1.00 52.94           H  \nATOM   2501  HG2 LYS A1046      -8.557   6.980  -4.141  1.00 52.94           H  \nATOM   2502  HD3 LYS A1046      -7.640   7.539  -1.844  1.00 61.30           H  \nATOM   2503  HD2 LYS A1046      -8.836   6.282  -1.891  1.00 61.30           H  \nATOM   2504  HE3 LYS A1046     -10.578   7.837  -1.019  1.00 72.46           H  \nATOM   2505  HE2 LYS A1046      -9.499   9.201  -1.183  1.00 72.46           H  \nATOM   2506  HZ1 LYS A1046      -8.099   8.211   0.485  1.00 80.50           H  \nATOM   2507  HZ2 LYS A1046      -9.635   8.436   1.044  1.00 80.50           H  \nATOM   2508  HZ3 LYS A1046      -9.132   6.925   0.616  1.00 80.50           H  \nATOM   2509  N   ALA A1047     -13.023   6.914  -1.956  1.00 45.97           N  \nATOM   2510  CA  ALA A1047     -14.239   7.449  -1.350  1.00 47.89           C  \nATOM   2511  C   ALA A1047     -14.187   8.983  -1.308  1.00 53.43           C  \nATOM   2512  O   ALA A1047     -13.174   9.547  -0.891  1.00 53.75           O  \nATOM   2513  CB  ALA A1047     -14.388   6.876   0.067  1.00 51.21           C  \nATOM   2514  H   ALA A1047     -12.304   6.619  -1.313  1.00 45.97           H  \nATOM   2515  HA  ALA A1047     -15.102   7.133  -1.938  1.00 47.89           H  \nATOM   2516  HB1 ALA A1047     -15.310   7.226   0.534  1.00 51.21           H  \nATOM   2517  HB2 ALA A1047     -14.428   5.787   0.048  1.00 51.21           H  \nATOM   2518  HB3 ALA A1047     -13.557   7.165   0.711  1.00 51.21           H  \nATOM   2519  N   VAL A1048     -15.298   9.611  -1.716  1.00 51.14           N  \nATOM   2520  CA  VAL A1048     -15.535  11.047  -1.614  1.00 52.52           C  \nATOM   2521  C   VAL A1048     -16.597  11.229  -0.503  1.00 61.61           C  \nATOM   2522  O   VAL A1048     -17.722  10.765  -0.700  1.00 62.08           O  \nATOM   2523  CB  VAL A1048     -16.114  11.607  -2.948  1.00 54.59           C  \nATOM   2524  CG1 VAL A1048     -16.530  13.092  -2.876  1.00 55.28           C  \nATOM   2525  CG2 VAL A1048     -15.135  11.410  -4.114  1.00 51.78           C  \nATOM   2526  H   VAL A1048     -16.088   9.063  -2.035  1.00 51.14           H  \nATOM   2527  HA  VAL A1048     -14.610  11.585  -1.415  1.00 52.52           H  \nATOM   2528  HB  VAL A1048     -17.003  11.032  -3.204  1.00 54.59           H  \nATOM   2529 HG11 VAL A1048     -16.861  13.457  -3.849  1.00 55.28           H  \nATOM   2530 HG12 VAL A1048     -17.357  13.256  -2.187  1.00 55.28           H  \nATOM   2531 HG13 VAL A1048     -15.699  13.722  -2.555  1.00 55.28           H  \nATOM   2532 HG21 VAL A1048     -15.521  11.853  -5.033  1.00 51.78           H  \nATOM   2533 HG22 VAL A1048     -14.167  11.868  -3.908  1.00 51.78           H  \nATOM   2534 HG23 VAL A1048     -14.975  10.351  -4.307  1.00 51.78           H  \nATOM   2535  N   PRO A1049     -16.236  11.864   0.641  1.00 62.00           N  \nATOM   2536  CA  PRO A1049     -17.184  12.176   1.737  1.00 66.09           C  \nATOM   2537  C   PRO A1049     -18.459  12.905   1.278  1.00 73.83           C  \nATOM   2538  O   PRO A1049     -18.379  13.730   0.371  1.00 71.64           O  \nATOM   2539  CB  PRO A1049     -16.360  13.056   2.691  1.00 69.51           C  \nATOM   2540  CG  PRO A1049     -14.922  12.638   2.458  1.00 71.48           C  \nATOM   2541  CD  PRO A1049     -14.889  12.341   0.967  1.00 63.48           C  \nATOM   2542  HA  PRO A1049     -17.442  11.236   2.228  1.00 66.09           H  \nATOM   2543  HB3 PRO A1049     -16.661  12.943   3.733  1.00 69.51           H  \nATOM   2544  HB2 PRO A1049     -16.469  14.109   2.431  1.00 69.51           H  \nATOM   2545  HG3 PRO A1049     -14.718  11.723   3.016  1.00 71.48           H  \nATOM   2546  HG2 PRO A1049     -14.195  13.390   2.766  1.00 71.48           H  \nATOM   2547  HD2 PRO A1049     -14.690  13.250   0.396  1.00 63.48           H  \nATOM   2548  HD3 PRO A1049     -14.110  11.611   0.746  1.00 63.48           H  \nATOM   2549  N   GLU A1050     -19.602  12.569   1.895  1.00 75.69           N  \nATOM   2550  CA  GLU A1050     -20.946  13.047   1.546  1.00 77.51           C  \nATOM   2551  C   GLU A1050     -21.137  14.581   1.530  1.00 84.15           C  \nATOM   2552  O   GLU A1050     -21.986  15.059   0.779  1.00 83.15           O  \nATOM   2553  CB  GLU A1050     -22.008  12.341   2.426  1.00 82.22           C  \nATOM   2554  CG  GLU A1050     -21.885  12.532   3.963  1.00 97.93           C  \nATOM   2555  CD  GLU A1050     -20.916  11.603   4.721  1.00120.70           C  \nATOM   2556  OE1 GLU A1050     -20.359  10.662   4.111  1.00108.26           O  \nATOM   2557  OE2 GLU A1050     -20.744  11.858   5.932  1.00119.67           O1-\nATOM   2558  H   GLU A1050     -19.579  11.872   2.631  1.00 75.69           H  \nATOM   2559  HA  GLU A1050     -21.125  12.712   0.524  1.00 77.51           H  \nATOM   2560  HB3 GLU A1050     -22.050  11.282   2.167  1.00 82.22           H  \nATOM   2561  HB2 GLU A1050     -22.989  12.719   2.132  1.00 82.22           H  \nATOM   2562  HG3 GLU A1050     -22.872  12.366   4.398  1.00 97.93           H  \nATOM   2563  HG2 GLU A1050     -21.638  13.568   4.194  1.00 97.93           H  \nATOM   2564  N   GLY A1051     -20.338  15.319   2.321  1.00 83.36           N  \nATOM   2565  CA  GLY A1051     -20.349  16.784   2.369  1.00 84.58           C  \nATOM   2566  C   GLY A1051     -19.399  17.422   1.337  1.00 86.36           C  \nATOM   2567  O   GLY A1051     -19.389  18.646   1.220  1.00 86.86           O  \nATOM   2568  H   GLY A1051     -19.670  14.844   2.911  1.00 83.36           H  \nATOM   2569  HA3 GLY A1051     -20.033  17.094   3.366  1.00 84.58           H  \nATOM   2570  HA2 GLY A1051     -21.358  17.172   2.226  1.00 84.58           H  \nATOM   2571  N   HIS A1052     -18.603  16.617   0.612  1.00 79.97           N  \nATOM   2572  CA  HIS A1052     -17.629  17.044  -0.396  1.00 76.91           C  \nATOM   2573  C   HIS A1052     -18.094  16.595  -1.790  1.00 76.64           C  \nATOM   2574  O   HIS A1052     -18.787  15.585  -1.914  1.00 75.70           O  \nATOM   2575  CB  HIS A1052     -16.251  16.409  -0.088  1.00 77.26           C  \nATOM   2576  CG  HIS A1052     -15.567  16.850   1.187  1.00 83.91           C  \nATOM   2577  ND1 HIS A1052     -16.152  16.768   2.440  1.00 88.78           N  \nATOM   2578  CD2 HIS A1052     -14.313  17.378   1.406  1.00 86.52           C  \nATOM   2579  CE1 HIS A1052     -15.265  17.223   3.327  1.00 90.57           C  \nATOM   2580  NE2 HIS A1052     -14.124  17.610   2.771  1.00 89.68           N  \nATOM   2581  H   HIS A1052     -18.692  15.614   0.718  1.00 79.97           H  \nATOM   2582  HA  HIS A1052     -17.523  18.131  -0.401  1.00 76.91           H  \nATOM   2583  HB3 HIS A1052     -15.563  16.629  -0.906  1.00 77.26           H  \nATOM   2584  HB2 HIS A1052     -16.332  15.322  -0.062  1.00 77.26           H  \nATOM   2585  HD1 HIS A1052     -17.082  16.431   2.642  1.00 88.78           H  \nATOM   2586  HD2 HIS A1052     -13.535  17.600   0.692  1.00 86.52           H  \nATOM   2587  HE1 HIS A1052     -15.456  17.273   4.389  1.00 90.57           H  \nATOM   2588  N   GLU A1053     -17.659  17.337  -2.818  1.00 70.38           N  \nATOM   2589  CA  GLU A1053     -17.883  17.022  -4.230  1.00 67.41           C  \nATOM   2590  C   GLU A1053     -16.584  16.601  -4.949  1.00 65.39           C  \nATOM   2591  O   GLU A1053     -16.664  16.257  -6.128  1.00 62.86           O  \nATOM   2592  CB  GLU A1053     -18.593  18.212  -4.927  1.00 69.51           C  \nATOM   2593  CG  GLU A1053     -17.779  19.512  -5.135  1.00 81.78           C  \nATOM   2594  CD  GLU A1053     -17.774  20.453  -3.921  1.00109.48           C  \nATOM   2595  OE1 GLU A1053     -16.893  20.272  -3.050  1.00107.26           O  \nATOM   2596  OE2 GLU A1053     -18.640  21.354  -3.893  1.00107.68           O1-\nATOM   2597  H   GLU A1053     -17.139  18.188  -2.639  1.00 70.38           H  \nATOM   2598  HA  GLU A1053     -18.554  16.164  -4.313  1.00 67.41           H  \nATOM   2599  HB3 GLU A1053     -19.513  18.442  -4.385  1.00 69.51           H  \nATOM   2600  HB2 GLU A1053     -18.934  17.872  -5.906  1.00 69.51           H  \nATOM   2601  HG3 GLU A1053     -18.205  20.053  -5.981  1.00 81.78           H  \nATOM   2602  HG2 GLU A1053     -16.758  19.288  -5.435  1.00 81.78           H  \nATOM   2603  N   TYR A1054     -15.432  16.620  -4.250  1.00 59.91           N  \nATOM   2604  CA  TYR A1054     -14.128  16.231  -4.792  1.00 57.06           C  \nATOM   2605  C   TYR A1054     -13.225  15.603  -3.718  1.00 59.88           C  \nATOM   2606  O   TYR A1054     -13.480  15.733  -2.520  1.00 61.73           O  \nATOM   2607  CB  TYR A1054     -13.443  17.442  -5.481  1.00 57.75           C  \nATOM   2608  CG  TYR A1054     -12.910  18.540  -4.568  1.00 61.72           C  \nATOM   2609  CD1 TYR A1054     -13.741  19.618  -4.206  1.00 65.51           C  \nATOM   2610  CD2 TYR A1054     -11.587  18.494  -4.077  1.00 63.03           C  \nATOM   2611  CE1 TYR A1054     -13.273  20.625  -3.342  1.00 68.28           C  \nATOM   2612  CE2 TYR A1054     -11.118  19.497  -3.207  1.00 66.37           C  \nATOM   2613  CZ  TYR A1054     -11.960  20.564  -2.838  1.00 76.35           C  \nATOM   2614  OH  TYR A1054     -11.500  21.539  -2.001  1.00 81.80           O  \nATOM   2615  H   TYR A1054     -15.438  16.902  -3.281  1.00 59.91           H  \nATOM   2616  HA  TYR A1054     -14.295  15.452  -5.536  1.00 57.06           H  \nATOM   2617  HB3 TYR A1054     -14.127  17.883  -6.202  1.00 57.75           H  \nATOM   2618  HB2 TYR A1054     -12.603  17.084  -6.077  1.00 57.75           H  \nATOM   2619  HD1 TYR A1054     -14.747  19.671  -4.589  1.00 65.51           H  \nATOM   2620  HD2 TYR A1054     -10.931  17.684  -4.358  1.00 63.03           H  \nATOM   2621  HE1 TYR A1054     -13.928  21.440  -3.069  1.00 68.28           H  \nATOM   2622  HE2 TYR A1054     -10.112  19.450  -2.823  1.00 66.37           H  \nATOM   2623  HH  TYR A1054     -12.176  22.187  -1.785  1.00 81.80           H  \nATOM   2624  N   TYR A1055     -12.149  14.975  -4.212  1.00 53.09           N  \nATOM   2625  CA  TYR A1055     -11.007  14.471  -3.457  1.00 53.10           C  \nATOM   2626  C   TYR A1055      -9.726  15.055  -4.077  1.00 56.32           C  \nATOM   2627  O   TYR A1055      -9.573  14.988  -5.298  1.00 53.18           O  \nATOM   2628  CB  TYR A1055     -11.033  12.925  -3.512  1.00 53.04           C  \nATOM   2629  CG  TYR A1055      -9.744  12.229  -3.105  1.00 55.26           C  \nATOM   2630  CD1 TYR A1055      -9.403  12.116  -1.742  1.00 59.33           C  \nATOM   2631  CD2 TYR A1055      -8.864  11.731  -4.090  1.00 54.82           C  \nATOM   2632  CE1 TYR A1055      -8.189  11.509  -1.366  1.00 60.69           C  \nATOM   2633  CE2 TYR A1055      -7.648  11.129  -3.714  1.00 56.92           C  \nATOM   2634  CZ  TYR A1055      -7.317  11.005  -2.350  1.00 68.28           C  \nATOM   2635  OH  TYR A1055      -6.152  10.396  -1.981  1.00 72.13           O  \nATOM   2636  H   TYR A1055     -12.056  14.902  -5.217  1.00 53.09           H  \nATOM   2637  HA  TYR A1055     -11.071  14.792  -2.416  1.00 53.10           H  \nATOM   2638  HB3 TYR A1055     -11.259  12.613  -4.532  1.00 53.04           H  \nATOM   2639  HB2 TYR A1055     -11.853  12.545  -2.902  1.00 53.04           H  \nATOM   2640  HD1 TYR A1055     -10.066  12.505  -0.983  1.00 59.33           H  \nATOM   2641  HD2 TYR A1055      -9.109  11.827  -5.138  1.00 54.82           H  \nATOM   2642  HE1 TYR A1055      -7.931  11.427  -0.320  1.00 60.69           H  \nATOM   2643  HE2 TYR A1055      -6.979  10.757  -4.475  1.00 56.92           H  \nATOM   2644  HH  TYR A1055      -5.609  10.143  -2.731  1.00 72.13           H  \nATOM   2645  N   ARG A1056      -8.817  15.579  -3.235  1.00 56.46           N  \nATOM   2646  CA  ARG A1056      -7.489  16.027  -3.666  1.00 57.19           C  \nATOM   2647  C   ARG A1056      -6.566  14.824  -3.911  1.00 61.89           C  \nATOM   2648  O   ARG A1056      -6.398  13.993  -3.019  1.00 62.29           O  \nATOM   2649  CB  ARG A1056      -6.850  16.976  -2.627  1.00 60.29           C  \nATOM   2650  CG  ARG A1056      -6.976  18.462  -2.999  1.00 71.82           C  \nATOM   2651  CD  ARG A1056      -6.155  19.357  -2.056  1.00 85.08           C  \nATOM   2652  NE  ARG A1056      -6.336  20.793  -2.326  1.00 93.43           N  \nATOM   2653  CZ  ARG A1056      -7.282  21.607  -1.821  1.00108.81           C  \nATOM   2654  NH1 ARG A1056      -8.250  21.157  -1.008  1.00 96.57           N  \nATOM   2655  NH2 ARG A1056      -7.252  22.907  -2.136  1.00 96.30           N1+\nATOM   2656  H   ARG A1056      -8.994  15.588  -2.241  1.00 56.46           H  \nATOM   2657  HA  ARG A1056      -7.612  16.564  -4.604  1.00 57.19           H  \nATOM   2658  HB3 ARG A1056      -5.781  16.771  -2.542  1.00 60.29           H  \nATOM   2659  HB2 ARG A1056      -7.256  16.789  -1.632  1.00 60.29           H  \nATOM   2660  HG3 ARG A1056      -8.009  18.791  -3.096  1.00 71.82           H  \nATOM   2661  HG2 ARG A1056      -6.539  18.558  -3.995  1.00 71.82           H  \nATOM   2662  HD3 ARG A1056      -5.101  19.189  -2.278  1.00 85.08           H  \nATOM   2663  HD2 ARG A1056      -6.280  19.090  -1.006  1.00 85.08           H  \nATOM   2664  HE  ARG A1056      -5.661  21.191  -2.965  1.00 93.43           H  \nATOM   2665 HH12 ARG A1056      -8.966  21.778  -0.657  1.00 96.57           H  \nATOM   2666 HH11 ARG A1056      -8.277  20.181  -0.750  1.00 96.57           H  \nATOM   2667 HH22 ARG A1056      -7.936  23.542  -1.749  1.00 96.30           H  \nATOM   2668 HH21 ARG A1056      -6.504  23.276  -2.706  1.00 96.30           H  \nATOM   2669  N   VAL A1057      -5.959  14.797  -5.106  1.00 58.85           N  \nATOM   2670  CA  VAL A1057      -5.003  13.780  -5.542  1.00 59.44           C  \nATOM   2671  C   VAL A1057      -3.557  14.281  -5.359  1.00 68.20           C  \nATOM   2672  O   VAL A1057      -3.329  15.483  -5.206  1.00 69.34           O  \nATOM   2673  CB  VAL A1057      -5.225  13.404  -7.038  1.00 60.80           C  \nATOM   2674  CG1 VAL A1057      -6.682  12.977  -7.283  1.00 59.13           C  \nATOM   2675  CG2 VAL A1057      -4.790  14.446  -8.089  1.00 60.31           C  \nATOM   2676  H   VAL A1057      -6.124  15.552  -5.759  1.00 58.85           H  \nATOM   2677  HA  VAL A1057      -5.125  12.877  -4.941  1.00 59.44           H  \nATOM   2678  HB  VAL A1057      -4.617  12.519  -7.229  1.00 60.80           H  \nATOM   2679 HG11 VAL A1057      -6.821  12.608  -8.299  1.00 59.13           H  \nATOM   2680 HG12 VAL A1057      -6.979  12.188  -6.594  1.00 59.13           H  \nATOM   2681 HG13 VAL A1057      -7.368  13.812  -7.139  1.00 59.13           H  \nATOM   2682 HG21 VAL A1057      -4.998  14.090  -9.099  1.00 60.31           H  \nATOM   2683 HG22 VAL A1057      -5.330  15.380  -7.961  1.00 60.31           H  \nATOM   2684 HG23 VAL A1057      -3.723  14.663  -8.049  1.00 60.31           H  \nATOM   2685  N   ARG A1058      -2.607  13.334  -5.385  1.00 67.56           N  \nATOM   2686  CA  ARG A1058      -1.172  13.599  -5.282  1.00 70.37           C  \nATOM   2687  C   ARG A1058      -0.536  13.789  -6.667  1.00 74.80           C  \nATOM   2688  O   ARG A1058      -1.065  13.300  -7.667  1.00 72.29           O  \nATOM   2689  CB  ARG A1058      -0.482  12.425  -4.555  1.00 73.21           C  \nATOM   2690  CG  ARG A1058      -1.096  12.069  -3.190  1.00 89.24           C  \nATOM   2691  CD  ARG A1058      -0.267  11.012  -2.441  1.00105.70           C  \nATOM   2692  NE  ARG A1058      -0.997  10.452  -1.291  1.00119.40           N  \nATOM   2693  CZ  ARG A1058      -1.790   9.362  -1.293  1.00134.49           C  \nATOM   2694  NH1 ARG A1058      -1.990   8.620  -2.394  1.00120.12           N  \nATOM   2695  NH2 ARG A1058      -2.400   9.001  -0.157  1.00122.85           N1+\nATOM   2696  H   ARG A1058      -2.868  12.371  -5.537  1.00 67.56           H  \nATOM   2697  HA  ARG A1058      -1.012  14.506  -4.696  1.00 70.37           H  \nATOM   2698  HB3 ARG A1058       0.576  12.656  -4.421  1.00 73.21           H  \nATOM   2699  HB2 ARG A1058      -0.516  11.536  -5.188  1.00 73.21           H  \nATOM   2700  HG3 ARG A1058      -2.147  11.782  -3.259  1.00 89.24           H  \nATOM   2701  HG2 ARG A1058      -1.072  12.989  -2.605  1.00 89.24           H  \nATOM   2702  HD3 ARG A1058       0.578  11.523  -1.980  1.00105.70           H  \nATOM   2703  HD2 ARG A1058       0.168  10.261  -3.102  1.00105.70           H  \nATOM   2704  HE  ARG A1058      -0.910  10.974  -0.431  1.00119.40           H  \nATOM   2705 HH12 ARG A1058      -2.574   7.793  -2.360  1.00120.12           H  \nATOM   2706 HH11 ARG A1058      -1.525   8.863  -3.256  1.00120.12           H  \nATOM   2707 HH22 ARG A1058      -2.991   8.183  -0.135  1.00122.85           H  \nATOM   2708 HH21 ARG A1058      -2.266   9.536   0.689  1.00122.85           H  \nATOM   2709  N   GLU A1059       0.632  14.450  -6.673  1.00 74.50           N  \nATOM   2710  CA  GLU A1059       1.553  14.525  -7.807  1.00 74.23           C  \nATOM   2711  C   GLU A1059       2.254  13.163  -7.955  1.00 77.46           C  \nATOM   2712  O   GLU A1059       3.042  12.795  -7.083  1.00 79.77           O  \nATOM   2713  CB  GLU A1059       2.560  15.668  -7.559  1.00 78.25           C  \nATOM   2714  CG  GLU A1059       1.890  17.055  -7.402  1.00 89.76           C  \nATOM   2715  CD  GLU A1059       2.828  18.212  -7.020  1.00113.50           C  \nATOM   2716  OE1 GLU A1059       4.065  18.018  -7.008  1.00107.60           O  \nATOM   2717  OE2 GLU A1059       2.274  19.295  -6.731  1.00107.56           O1-\nATOM   2718  H   GLU A1059       0.989  14.826  -5.807  1.00 74.50           H  \nATOM   2719  HA  GLU A1059       0.987  14.746  -8.714  1.00 74.23           H  \nATOM   2720  HB3 GLU A1059       3.270  15.702  -8.387  1.00 78.25           H  \nATOM   2721  HB2 GLU A1059       3.147  15.447  -6.666  1.00 78.25           H  \nATOM   2722  HG3 GLU A1059       1.105  17.011  -6.647  1.00 89.76           H  \nATOM   2723  HG2 GLU A1059       1.396  17.315  -8.337  1.00 89.76           H  \nATOM   2724  N   ASP A1060       1.895  12.418  -9.011  1.00 70.23           N  \nATOM   2725  CA  ASP A1060       2.226  11.001  -9.159  1.00 68.85           C  \nATOM   2726  C   ASP A1060       2.470  10.671 -10.644  1.00 68.50           C  \nATOM   2727  O   ASP A1060       1.778  11.208 -11.510  1.00 66.16           O  \nATOM   2728  CB  ASP A1060       1.134  10.133  -8.477  1.00 69.42           C  \nATOM   2729  CG  ASP A1060       1.308   8.615  -8.603  1.00 81.45           C  \nATOM   2730  OD1 ASP A1060       0.565   8.022  -9.413  1.00 81.04           O  \nATOM   2731  OD2 ASP A1060       2.259   8.097  -7.975  1.00 89.83           O1-\nATOM   2732  H   ASP A1060       1.248  12.789  -9.693  1.00 70.23           H  \nATOM   2733  HA  ASP A1060       3.171  10.811  -8.645  1.00 68.85           H  \nATOM   2734  HB3 ASP A1060       0.147  10.430  -8.837  1.00 69.42           H  \nATOM   2735  HB2 ASP A1060       1.112  10.376  -7.413  1.00 69.42           H  \nATOM   2736  N   GLY A1061       3.463   9.803 -10.905  1.00 63.47           N  \nATOM   2737  CA  GLY A1061       3.919   9.458 -12.253  1.00 61.92           C  \nATOM   2738  C   GLY A1061       3.025   8.411 -12.936  1.00 61.80           C  \nATOM   2739  O   GLY A1061       2.926   8.424 -14.163  1.00 61.49           O  \nATOM   2740  H   GLY A1061       3.960   9.380 -10.133  1.00 63.47           H  \nATOM   2741  HA3 GLY A1061       4.930   9.056 -12.184  1.00 61.92           H  \nATOM   2742  HA2 GLY A1061       3.980  10.354 -12.873  1.00 61.92           H  \nATOM   2743  N   ASP A1062       2.365   7.532 -12.159  1.00 55.28           N  \nATOM   2744  CA  ASP A1062       1.462   6.477 -12.645  1.00 52.23           C  \nATOM   2745  C   ASP A1062       0.018   6.962 -12.892  1.00 50.35           C  \nATOM   2746  O   ASP A1062      -0.809   6.161 -13.330  1.00 49.00           O  \nATOM   2747  CB  ASP A1062       1.471   5.215 -11.744  1.00 54.90           C  \nATOM   2748  CG  ASP A1062       2.871   4.616 -11.542  1.00 73.36           C  \nATOM   2749  OD1 ASP A1062       3.348   3.959 -12.494  1.00 75.14           O  \nATOM   2750  OD2 ASP A1062       3.499   4.932 -10.507  1.00 82.10           O1-\nATOM   2751  H   ASP A1062       2.477   7.575 -11.155  1.00 55.28           H  \nATOM   2752  HA  ASP A1062       1.824   6.157 -13.624  1.00 52.23           H  \nATOM   2753  HB3 ASP A1062       0.835   4.437 -12.171  1.00 54.90           H  \nATOM   2754  HB2 ASP A1062       1.050   5.454 -10.766  1.00 54.90           H  \nATOM   2755  N   SER A1063      -0.262   8.254 -12.645  1.00 43.08           N  \nATOM   2756  CA  SER A1063      -1.541   8.912 -12.926  1.00 39.71           C  \nATOM   2757  C   SER A1063      -1.834   8.917 -14.445  1.00 36.74           C  \nATOM   2758  O   SER A1063      -0.950   9.325 -15.200  1.00 35.65           O  \nATOM   2759  CB  SER A1063      -1.451  10.363 -12.416  1.00 44.05           C  \nATOM   2760  OG  SER A1063      -1.561  10.394 -11.008  1.00 56.19           O  \nATOM   2761  H   SER A1063       0.470   8.845 -12.278  1.00 43.08           H  \nATOM   2762  HA  SER A1063      -2.308   8.385 -12.360  1.00 39.71           H  \nATOM   2763  HB3 SER A1063      -2.274  10.959 -12.814  1.00 44.05           H  \nATOM   2764  HB2 SER A1063      -0.529  10.848 -12.736  1.00 44.05           H  \nATOM   2765  HG  SER A1063      -0.820   9.909 -10.633  1.00 56.19           H  \nATOM   2766  N   PRO A1064      -3.031   8.450 -14.878  1.00 30.99           N  \nATOM   2767  CA  PRO A1064      -3.409   8.434 -16.303  1.00 29.59           C  \nATOM   2768  C   PRO A1064      -3.804   9.836 -16.823  1.00 32.01           C  \nATOM   2769  O   PRO A1064      -4.987  10.123 -17.008  1.00 29.67           O  \nATOM   2770  CB  PRO A1064      -4.545   7.398 -16.344  1.00 29.56           C  \nATOM   2771  CG  PRO A1064      -5.231   7.543 -14.998  1.00 33.51           C  \nATOM   2772  CD  PRO A1064      -4.076   7.842 -14.049  1.00 30.17           C  \nATOM   2773  HA  PRO A1064      -2.580   8.066 -16.908  1.00 29.59           H  \nATOM   2774  HB3 PRO A1064      -4.115   6.399 -16.418  1.00 29.56           H  \nATOM   2775  HB2 PRO A1064      -5.230   7.518 -17.184  1.00 29.56           H  \nATOM   2776  HG3 PRO A1064      -5.811   6.671 -14.703  1.00 33.51           H  \nATOM   2777  HG2 PRO A1064      -5.910   8.392 -15.038  1.00 33.51           H  \nATOM   2778  HD2 PRO A1064      -4.396   8.489 -13.233  1.00 30.17           H  \nATOM   2779  HD3 PRO A1064      -3.692   6.913 -13.624  1.00 30.17           H  \nATOM   2780  N   VAL A1065      -2.786  10.690 -17.026  1.00 29.66           N  \nATOM   2781  CA  VAL A1065      -2.902  12.106 -17.382  1.00 29.04           C  \nATOM   2782  C   VAL A1065      -3.565  12.389 -18.746  1.00 30.30           C  \nATOM   2783  O   VAL A1065      -4.209  13.429 -18.873  1.00 30.19           O  \nATOM   2784  CB  VAL A1065      -1.522  12.819 -17.348  1.00 34.62           C  \nATOM   2785  CG1 VAL A1065      -0.968  12.886 -15.914  1.00 34.92           C  \nATOM   2786  CG2 VAL A1065      -0.478  12.246 -18.328  1.00 35.44           C  \nATOM   2787  H   VAL A1065      -1.845  10.366 -16.844  1.00 29.66           H  \nATOM   2788  HA  VAL A1065      -3.532  12.562 -16.618  1.00 29.04           H  \nATOM   2789  HB  VAL A1065      -1.673  13.855 -17.651  1.00 34.62           H  \nATOM   2790 HG11 VAL A1065      -0.022  13.424 -15.880  1.00 34.92           H  \nATOM   2791 HG12 VAL A1065      -1.661  13.400 -15.247  1.00 34.92           H  \nATOM   2792 HG13 VAL A1065      -0.786  11.895 -15.503  1.00 34.92           H  \nATOM   2793 HG21 VAL A1065       0.477  12.764 -18.227  1.00 35.44           H  \nATOM   2794 HG22 VAL A1065      -0.296  11.188 -18.145  1.00 35.44           H  \nATOM   2795 HG23 VAL A1065      -0.788  12.357 -19.367  1.00 35.44           H  \nATOM   2796  N   PHE A1066      -3.447  11.462 -19.715  1.00 25.62           N  \nATOM   2797  CA  PHE A1066      -4.084  11.560 -21.034  1.00 24.82           C  \nATOM   2798  C   PHE A1066      -5.578  11.163 -21.042  1.00 26.45           C  \nATOM   2799  O   PHE A1066      -6.220  11.285 -22.086  1.00 25.78           O  \nATOM   2800  CB  PHE A1066      -3.251  10.779 -22.074  1.00 26.47           C  \nATOM   2801  CG  PHE A1066      -1.844  11.322 -22.286  1.00 27.98           C  \nATOM   2802  CD1 PHE A1066      -1.649  12.632 -22.772  1.00 31.46           C  \nATOM   2803  CD2 PHE A1066      -0.713  10.538 -21.974  1.00 29.97           C  \nATOM   2804  CE1 PHE A1066      -0.365  13.135 -22.936  1.00 33.77           C  \nATOM   2805  CE2 PHE A1066       0.563  11.055 -22.150  1.00 33.43           C  \nATOM   2806  CZ  PHE A1066       0.737  12.349 -22.625  1.00 32.31           C  \nATOM   2807  H   PHE A1066      -2.904  10.626 -19.541  1.00 25.62           H  \nATOM   2808  HA  PHE A1066      -4.075  12.609 -21.337  1.00 24.82           H  \nATOM   2809  HB3 PHE A1066      -3.756  10.782 -23.040  1.00 26.47           H  \nATOM   2810  HB2 PHE A1066      -3.184   9.732 -21.779  1.00 26.47           H  \nATOM   2811  HD1 PHE A1066      -2.496  13.256 -23.012  1.00 31.46           H  \nATOM   2812  HD2 PHE A1066      -0.829   9.530 -21.608  1.00 29.97           H  \nATOM   2813  HE1 PHE A1066      -0.222  14.140 -23.303  1.00 33.77           H  \nATOM   2814  HE2 PHE A1066       1.426  10.449 -21.914  1.00 33.43           H  \nATOM   2815  HZ  PHE A1066       1.733  12.745 -22.753  1.00 32.31           H  \nATOM   2816  N   TRP A1067      -6.110  10.745 -19.880  1.00 22.72           N  \nATOM   2817  CA  TRP A1067      -7.531  10.523 -19.603  1.00 23.65           C  \nATOM   2818  C   TRP A1067      -8.099  11.559 -18.615  1.00 26.48           C  \nATOM   2819  O   TRP A1067      -9.285  11.467 -18.304  1.00 25.01           O  \nATOM   2820  CB  TRP A1067      -7.743   9.090 -19.059  1.00 21.85           C  \nATOM   2821  CG  TRP A1067      -7.607   7.990 -20.066  1.00 23.25           C  \nATOM   2822  CD1 TRP A1067      -8.642   7.341 -20.645  1.00 25.76           C  \nATOM   2823  CD2 TRP A1067      -6.398   7.444 -20.678  1.00 23.75           C  \nATOM   2824  NE1 TRP A1067      -8.162   6.446 -21.576  1.00 25.21           N  \nATOM   2825  CE2 TRP A1067      -6.788   6.472 -21.648  1.00 27.61           C  \nATOM   2826  CE3 TRP A1067      -5.010   7.675 -20.529  1.00 25.53           C  \nATOM   2827  CZ2 TRP A1067      -5.855   5.779 -22.436  1.00 27.61           C  \nATOM   2828  CZ3 TRP A1067      -4.067   6.991 -21.323  1.00 27.51           C  \nATOM   2829  CH2 TRP A1067      -4.488   6.046 -22.275  1.00 28.26           C  \nATOM   2830  H   TRP A1067      -5.501  10.650 -19.078  1.00 22.72           H  \nATOM   2831  HA  TRP A1067      -8.122  10.631 -20.512  1.00 23.65           H  \nATOM   2832  HB3 TRP A1067      -8.742   8.988 -18.631  1.00 21.85           H  \nATOM   2833  HB2 TRP A1067      -7.054   8.892 -18.237  1.00 21.85           H  \nATOM   2834  HD1 TRP A1067      -9.684   7.521 -20.419  1.00 25.76           H  \nATOM   2835  HE1 TRP A1067      -8.763   5.856 -22.143  1.00 25.21           H  \nATOM   2836  HE3 TRP A1067      -4.665   8.393 -19.801  1.00 25.53           H  \nATOM   2837  HZ2 TRP A1067      -6.179   5.054 -23.162  1.00 27.61           H  \nATOM   2838  HZ3 TRP A1067      -3.015   7.191 -21.200  1.00 27.51           H  \nATOM   2839  HH2 TRP A1067      -3.763   5.530 -22.885  1.00 28.26           H  \nATOM   2840  N   TYR A1068      -7.272  12.497 -18.115  1.00 25.06           N  \nATOM   2841  CA  TYR A1068      -7.642  13.429 -17.048  1.00 24.40           C  \nATOM   2842  C   TYR A1068      -8.088  14.804 -17.559  1.00 29.09           C  \nATOM   2843  O   TYR A1068      -7.539  15.325 -18.530  1.00 29.03           O  \nATOM   2844  CB  TYR A1068      -6.472  13.562 -16.048  1.00 25.40           C  \nATOM   2845  CG  TYR A1068      -6.380  12.528 -14.932  1.00 26.29           C  \nATOM   2846  CD1 TYR A1068      -7.163  11.349 -14.925  1.00 27.65           C  \nATOM   2847  CD2 TYR A1068      -5.512  12.778 -13.847  1.00 27.90           C  \nATOM   2848  CE1 TYR A1068      -7.106  10.464 -13.835  1.00 28.32           C  \nATOM   2849  CE2 TYR A1068      -5.448  11.886 -12.759  1.00 27.93           C  \nATOM   2850  CZ  TYR A1068      -6.256  10.733 -12.747  1.00 32.15           C  \nATOM   2851  OH  TYR A1068      -6.220   9.881 -11.685  1.00 34.10           O  \nATOM   2852  H   TYR A1068      -6.314  12.541 -18.432  1.00 25.06           H  \nATOM   2853  HA  TYR A1068      -8.495  13.017 -16.518  1.00 24.40           H  \nATOM   2854  HB3 TYR A1068      -6.558  14.518 -15.532  1.00 25.40           H  \nATOM   2855  HB2 TYR A1068      -5.525  13.618 -16.580  1.00 25.40           H  \nATOM   2856  HD1 TYR A1068      -7.828  11.106 -15.737  1.00 27.65           H  \nATOM   2857  HD2 TYR A1068      -4.905  13.672 -13.836  1.00 27.90           H  \nATOM   2858  HE1 TYR A1068      -7.730   9.583 -13.840  1.00 28.32           H  \nATOM   2859  HE2 TYR A1068      -4.789  12.095 -11.929  1.00 27.93           H  \nATOM   2860  HH  TYR A1068      -6.736   9.083 -11.841  1.00 34.10           H  \nATOM   2861  N   ALA A1069      -9.063  15.368 -16.828  1.00 26.27           N  \nATOM   2862  CA  ALA A1069      -9.621  16.707 -17.003  1.00 27.33           C  \nATOM   2863  C   ALA A1069      -8.659  17.817 -16.518  1.00 31.87           C  \nATOM   2864  O   ALA A1069      -7.763  17.513 -15.730  1.00 30.37           O  \nATOM   2865  CB  ALA A1069     -10.947  16.754 -16.231  1.00 27.85           C  \nATOM   2866  H   ALA A1069      -9.448  14.841 -16.054  1.00 26.27           H  \nATOM   2867  HA  ALA A1069      -9.810  16.823 -18.066  1.00 27.33           H  \nATOM   2868  HB1 ALA A1069     -11.438  17.722 -16.320  1.00 27.85           H  \nATOM   2869  HB2 ALA A1069     -11.646  16.004 -16.594  1.00 27.85           H  \nATOM   2870  HB3 ALA A1069     -10.785  16.554 -15.172  1.00 27.85           H  \nATOM   2871  N   PRO A1070      -8.853  19.082 -16.970  1.00 28.98           N  \nATOM   2872  CA  PRO A1070      -7.923  20.191 -16.665  1.00 30.25           C  \nATOM   2873  C   PRO A1070      -7.700  20.518 -15.175  1.00 34.14           C  \nATOM   2874  O   PRO A1070      -6.573  20.852 -14.818  1.00 33.30           O  \nATOM   2875  CB  PRO A1070      -8.493  21.396 -17.433  1.00 33.24           C  \nATOM   2876  CG  PRO A1070      -9.331  20.784 -18.540  1.00 37.12           C  \nATOM   2877  CD  PRO A1070      -9.901  19.534 -17.888  1.00 31.16           C  \nATOM   2878  HA  PRO A1070      -6.962  19.920 -17.107  1.00 30.25           H  \nATOM   2879  HB3 PRO A1070      -7.714  22.051 -17.825  1.00 33.24           H  \nATOM   2880  HB2 PRO A1070      -9.134  22.001 -16.791  1.00 33.24           H  \nATOM   2881  HG3 PRO A1070      -8.680  20.494 -19.364  1.00 37.12           H  \nATOM   2882  HG2 PRO A1070     -10.095  21.455 -18.934  1.00 37.12           H  \nATOM   2883  HD2 PRO A1070     -10.795  19.780 -17.314  1.00 31.16           H  \nATOM   2884  HD3 PRO A1070     -10.174  18.813 -18.654  1.00 31.16           H  \nATOM   2885  N   GLU A1071      -8.744  20.397 -14.334  1.00 30.48           N  \nATOM   2886  CA  GLU A1071      -8.670  20.632 -12.886  1.00 31.43           C  \nATOM   2887  C   GLU A1071      -8.015  19.474 -12.104  1.00 36.54           C  \nATOM   2888  O   GLU A1071      -7.610  19.696 -10.965  1.00 37.63           O  \nATOM   2889  CB  GLU A1071     -10.061  21.021 -12.323  1.00 32.56           C  \nATOM   2890  CG  GLU A1071     -11.111  19.899 -12.136  1.00 35.76           C  \nATOM   2891  CD  GLU A1071     -11.663  19.243 -13.409  1.00 37.74           C  \nATOM   2892  OE1 GLU A1071     -11.773  19.921 -14.455  1.00 31.58           O  \nATOM   2893  OE2 GLU A1071     -12.001  18.047 -13.308  1.00 25.56           O1-\nATOM   2894  H   GLU A1071      -9.652  20.128 -14.691  1.00 30.48           H  \nATOM   2895  HA  GLU A1071      -8.027  21.502 -12.737  1.00 31.43           H  \nATOM   2896  HB3 GLU A1071     -10.485  21.824 -12.925  1.00 32.56           H  \nATOM   2897  HB2 GLU A1071      -9.904  21.480 -11.346  1.00 32.56           H  \nATOM   2898  HG3 GLU A1071     -11.971  20.327 -11.620  1.00 35.76           H  \nATOM   2899  HG2 GLU A1071     -10.723  19.135 -11.462  1.00 35.76           H  \nATOM   2900  N   CYS A1072      -7.886  18.284 -12.717  1.00 32.49           N  \nATOM   2901  CA  CYS A1072      -7.132  17.152 -12.167  1.00 32.58           C  \nATOM   2902  C   CYS A1072      -5.622  17.310 -12.419  1.00 37.39           C  \nATOM   2903  O   CYS A1072      -4.826  16.835 -11.611  1.00 38.08           O  \nATOM   2904  CB  CYS A1072      -7.587  15.806 -12.759  1.00 31.25           C  \nATOM   2905  SG  CYS A1072      -9.352  15.554 -12.470  1.00 34.42           S  \nATOM   2906  H   CYS A1072      -8.257  18.161 -13.649  1.00 32.49           H  \nATOM   2907  HA  CYS A1072      -7.287  17.115 -11.087  1.00 32.58           H  \nATOM   2908  HB3 CYS A1072      -7.039  14.977 -12.309  1.00 31.25           H  \nATOM   2909  HB2 CYS A1072      -7.406  15.766 -13.832  1.00 31.25           H  \nATOM   2910  HG  CYS A1072      -9.290  15.627 -11.137  1.00 34.42           H  \nATOM   2911  N   LEU A1073      -5.266  17.967 -13.536  1.00 33.94           N  \nATOM   2912  CA  LEU A1073      -3.891  18.219 -13.963  1.00 35.43           C  \nATOM   2913  C   LEU A1073      -3.294  19.478 -13.307  1.00 43.48           C  \nATOM   2914  O   LEU A1073      -2.085  19.509 -13.081  1.00 44.33           O  \nATOM   2915  CB  LEU A1073      -3.869  18.390 -15.499  1.00 35.06           C  \nATOM   2916  CG  LEU A1073      -4.341  17.170 -16.321  1.00 37.87           C  \nATOM   2917  CD1 LEU A1073      -4.517  17.552 -17.804  1.00 38.52           C  \nATOM   2918  CD2 LEU A1073      -3.436  15.937 -16.139  1.00 39.19           C  \nATOM   2919  H   LEU A1073      -5.988  18.313 -14.153  1.00 33.94           H  \nATOM   2920  HA  LEU A1073      -3.265  17.368 -13.686  1.00 35.43           H  \nATOM   2921  HB3 LEU A1073      -2.858  18.647 -15.817  1.00 35.06           H  \nATOM   2922  HB2 LEU A1073      -4.489  19.252 -15.755  1.00 35.06           H  \nATOM   2923  HG  LEU A1073      -5.329  16.889 -15.963  1.00 37.87           H  \nATOM   2924 HD11 LEU A1073      -5.382  17.049 -18.237  1.00 38.52           H  \nATOM   2925 HD12 LEU A1073      -4.671  18.624 -17.940  1.00 38.52           H  \nATOM   2926 HD13 LEU A1073      -3.644  17.286 -18.396  1.00 38.52           H  \nATOM   2927 HD21 LEU A1073      -3.149  15.499 -17.094  1.00 39.19           H  \nATOM   2928 HD22 LEU A1073      -2.519  16.169 -15.600  1.00 39.19           H  \nATOM   2929 HD23 LEU A1073      -3.949  15.160 -15.574  1.00 39.19           H  \nATOM   2930  N   LYS A1074      -4.137  20.497 -13.064  1.00 42.49           N  \nATOM   2931  CA  LYS A1074      -3.729  21.836 -12.643  1.00 45.58           C  \nATOM   2932  C   LYS A1074      -3.934  22.044 -11.135  1.00 51.72           C  \nATOM   2933  O   LYS A1074      -2.973  22.372 -10.442  1.00 52.85           O  \nATOM   2934  CB  LYS A1074      -4.514  22.869 -13.483  1.00 49.18           C  \nATOM   2935  CG  LYS A1074      -4.055  24.328 -13.301  1.00 71.38           C  \nATOM   2936  CD  LYS A1074      -4.725  25.346 -14.249  1.00 85.44           C  \nATOM   2937  CE  LYS A1074      -6.183  25.718 -13.902  1.00 97.19           C  \nATOM   2938  NZ  LYS A1074      -7.173  24.740 -14.390  1.00104.18           N1+\nATOM   2939  H   LYS A1074      -5.112  20.390 -13.308  1.00 42.49           H  \nATOM   2940  HA  LYS A1074      -2.667  21.980 -12.852  1.00 45.58           H  \nATOM   2941  HB3 LYS A1074      -5.576  22.781 -13.261  1.00 49.18           H  \nATOM   2942  HB2 LYS A1074      -4.402  22.609 -14.535  1.00 49.18           H  \nATOM   2943  HG3 LYS A1074      -2.977  24.371 -13.462  1.00 71.38           H  \nATOM   2944  HG2 LYS A1074      -4.211  24.646 -12.269  1.00 71.38           H  \nATOM   2945  HD3 LYS A1074      -4.664  24.985 -15.278  1.00 85.44           H  \nATOM   2946  HD2 LYS A1074      -4.129  26.259 -14.237  1.00 85.44           H  \nATOM   2947  HE3 LYS A1074      -6.429  26.674 -14.365  1.00 97.19           H  \nATOM   2948  HE2 LYS A1074      -6.297  25.853 -12.826  1.00 97.19           H  \nATOM   2949  HZ1 LYS A1074      -7.139  24.699 -15.403  1.00104.18           H  \nATOM   2950  HZ2 LYS A1074      -6.976  23.827 -14.010  1.00104.18           H  \nATOM   2951  HZ3 LYS A1074      -8.101  25.030 -14.113  1.00104.18           H  \nATOM   2952  N   GLU A1075      -5.180  21.863 -10.665  1.00 48.00           N  \nATOM   2953  CA  GLU A1075      -5.585  22.077  -9.272  1.00 49.76           C  \nATOM   2954  C   GLU A1075      -5.469  20.825  -8.390  1.00 53.28           C  \nATOM   2955  O   GLU A1075      -5.564  20.955  -7.169  1.00 53.10           O  \nATOM   2956  CB  GLU A1075      -7.027  22.637  -9.249  1.00 51.48           C  \nATOM   2957  CG  GLU A1075      -7.124  24.120  -9.674  1.00 66.34           C  \nATOM   2958  CD  GLU A1075      -6.547  25.137  -8.670  1.00 98.88           C  \nATOM   2959  OE1 GLU A1075      -6.396  24.794  -7.475  1.00 95.63           O  \nATOM   2960  OE2 GLU A1075      -6.278  26.270  -9.122  1.00 98.68           O1-\nATOM   2961  H   GLU A1075      -5.913  21.578 -11.297  1.00 48.00           H  \nATOM   2962  HA  GLU A1075      -4.918  22.813  -8.819  1.00 49.76           H  \nATOM   2963  HB3 GLU A1075      -7.494  22.492  -8.274  1.00 51.48           H  \nATOM   2964  HB2 GLU A1075      -7.647  22.060  -9.934  1.00 51.48           H  \nATOM   2965  HG3 GLU A1075      -8.175  24.373  -9.823  1.00 66.34           H  \nATOM   2966  HG2 GLU A1075      -6.644  24.255 -10.644  1.00 66.34           H  \nATOM   2967  N   TYR A1076      -5.279  19.648  -9.014  1.00 50.13           N  \nATOM   2968  CA  TYR A1076      -5.184  18.331  -8.378  1.00 50.19           C  \nATOM   2969  C   TYR A1076      -6.446  17.957  -7.577  1.00 52.11           C  \nATOM   2970  O   TYR A1076      -6.327  17.366  -6.507  1.00 53.52           O  \nATOM   2971  CB  TYR A1076      -3.875  18.202  -7.561  1.00 54.13           C  \nATOM   2972  CG  TYR A1076      -2.614  18.454  -8.368  1.00 57.78           C  \nATOM   2973  CD1 TYR A1076      -1.910  19.668  -8.226  1.00 62.12           C  \nATOM   2974  CD2 TYR A1076      -2.156  17.481  -9.280  1.00 57.80           C  \nATOM   2975  CE1 TYR A1076      -0.757  19.910  -8.998  1.00 64.82           C  \nATOM   2976  CE2 TYR A1076      -1.005  17.725 -10.054  1.00 59.85           C  \nATOM   2977  CZ  TYR A1076      -0.305  18.940  -9.913  1.00 71.28           C  \nATOM   2978  OH  TYR A1076       0.811  19.178 -10.660  1.00 75.29           O  \nATOM   2979  H   TYR A1076      -5.206  19.646 -10.021  1.00 50.13           H  \nATOM   2980  HA  TYR A1076      -5.136  17.606  -9.189  1.00 50.19           H  \nATOM   2981  HB3 TYR A1076      -3.793  17.199  -7.144  1.00 54.13           H  \nATOM   2982  HB2 TYR A1076      -3.889  18.877  -6.704  1.00 54.13           H  \nATOM   2983  HD1 TYR A1076      -2.257  20.423  -7.536  1.00 62.12           H  \nATOM   2984  HD2 TYR A1076      -2.693  16.552  -9.399  1.00 57.80           H  \nATOM   2985  HE1 TYR A1076      -0.223  20.842  -8.889  1.00 64.82           H  \nATOM   2986  HE2 TYR A1076      -0.665  16.978 -10.756  1.00 59.85           H  \nATOM   2987  HH  TYR A1076       1.035  18.453 -11.248  1.00 75.29           H  \nATOM   2988  N   LYS A1077      -7.625  18.303  -8.117  1.00 44.81           N  \nATOM   2989  CA  LYS A1077      -8.935  17.968  -7.561  1.00 43.60           C  \nATOM   2990  C   LYS A1077      -9.643  17.020  -8.530  1.00 41.76           C  \nATOM   2991  O   LYS A1077      -9.712  17.322  -9.722  1.00 38.21           O  \nATOM   2992  CB  LYS A1077      -9.773  19.248  -7.392  1.00 46.62           C  \nATOM   2993  CG  LYS A1077      -9.225  20.227  -6.347  1.00 58.33           C  \nATOM   2994  CD  LYS A1077     -10.181  21.413  -6.133  1.00 67.59           C  \nATOM   2995  CE  LYS A1077      -9.692  22.437  -5.097  1.00 79.50           C  \nATOM   2996  NZ  LYS A1077      -8.547  23.225  -5.587  1.00 87.69           N1+\nATOM   2997  H   LYS A1077      -7.639  18.785  -9.007  1.00 44.81           H  \nATOM   2998  HA  LYS A1077      -8.838  17.480  -6.589  1.00 43.60           H  \nATOM   2999  HB3 LYS A1077     -10.784  18.965  -7.093  1.00 46.62           H  \nATOM   3000  HB2 LYS A1077      -9.869  19.760  -8.351  1.00 46.62           H  \nATOM   3001  HG3 LYS A1077      -8.247  20.587  -6.666  1.00 58.33           H  \nATOM   3002  HG2 LYS A1077      -9.067  19.705  -5.403  1.00 58.33           H  \nATOM   3003  HD3 LYS A1077     -11.151  21.030  -5.811  1.00 67.59           H  \nATOM   3004  HD2 LYS A1077     -10.370  21.908  -7.087  1.00 67.59           H  \nATOM   3005  HE3 LYS A1077      -9.420  21.938  -4.166  1.00 79.50           H  \nATOM   3006  HE2 LYS A1077     -10.500  23.130  -4.860  1.00 79.50           H  \nATOM   3007  HZ1 LYS A1077      -8.803  23.715  -6.432  1.00 87.69           H  \nATOM   3008  HZ2 LYS A1077      -8.267  23.900  -4.892  1.00 87.69           H  \nATOM   3009  HZ3 LYS A1077      -7.769  22.614  -5.792  1.00 87.69           H  \nATOM   3010  N   PHE A1078     -10.177  15.913  -7.995  1.00 36.93           N  \nATOM   3011  CA  PHE A1078     -10.895  14.905  -8.764  1.00 34.49           C  \nATOM   3012  C   PHE A1078     -12.338  14.858  -8.243  1.00 39.60           C  \nATOM   3013  O   PHE A1078     -12.585  14.362  -7.144  1.00 40.48           O  \nATOM   3014  CB  PHE A1078     -10.163  13.553  -8.631  1.00 35.26           C  \nATOM   3015  CG  PHE A1078     -10.493  12.591  -9.753  1.00 34.98           C  \nATOM   3016  CD1 PHE A1078      -9.616  12.456 -10.849  1.00 36.30           C  \nATOM   3017  CD2 PHE A1078     -11.752  11.962  -9.802  1.00 35.94           C  \nATOM   3018  CE1 PHE A1078      -9.990  11.692 -11.946  1.00 35.94           C  \nATOM   3019  CE2 PHE A1078     -12.103  11.200 -10.902  1.00 37.30           C  \nATOM   3020  CZ  PHE A1078     -11.232  11.074 -11.975  1.00 34.53           C  \nATOM   3021  H   PHE A1078     -10.074  15.726  -7.005  1.00 36.93           H  \nATOM   3022  HA  PHE A1078     -10.911  15.172  -9.822  1.00 34.49           H  \nATOM   3023  HB3 PHE A1078     -10.381  13.079  -7.673  1.00 35.26           H  \nATOM   3024  HB2 PHE A1078      -9.086  13.717  -8.642  1.00 35.26           H  \nATOM   3025  HD1 PHE A1078      -8.660  12.960 -10.852  1.00 36.30           H  \nATOM   3026  HD2 PHE A1078     -12.462  12.090  -8.999  1.00 35.94           H  \nATOM   3027  HE1 PHE A1078      -9.324  11.597 -12.788  1.00 35.94           H  \nATOM   3028  HE2 PHE A1078     -13.078  10.743 -10.924  1.00 37.30           H  \nATOM   3029  HZ  PHE A1078     -11.523  10.502 -12.843  1.00 34.53           H  \nATOM   3030  N   TYR A1079     -13.251  15.383  -9.069  1.00 35.49           N  \nATOM   3031  CA  TYR A1079     -14.699  15.432  -8.867  1.00 35.71           C  \nATOM   3032  C   TYR A1079     -15.372  14.145  -9.384  1.00 36.13           C  \nATOM   3033  O   TYR A1079     -14.705  13.288  -9.964  1.00 33.76           O  \nATOM   3034  CB  TYR A1079     -15.243  16.673  -9.619  1.00 37.14           C  \nATOM   3035  CG  TYR A1079     -14.753  18.019  -9.104  1.00 41.82           C  \nATOM   3036  CD1 TYR A1079     -15.584  18.803  -8.276  1.00 45.55           C  \nATOM   3037  CD2 TYR A1079     -13.470  18.498  -9.452  1.00 42.95           C  \nATOM   3038  CE1 TYR A1079     -15.127  20.039  -7.777  1.00 48.19           C  \nATOM   3039  CE2 TYR A1079     -13.011  19.728  -8.945  1.00 44.97           C  \nATOM   3040  CZ  TYR A1079     -13.835  20.496  -8.101  1.00 54.63           C  \nATOM   3041  OH  TYR A1079     -13.381  21.681  -7.599  1.00 58.40           O  \nATOM   3042  H   TYR A1079     -12.940  15.728  -9.968  1.00 35.49           H  \nATOM   3043  HA  TYR A1079     -14.910  15.528  -7.804  1.00 35.71           H  \nATOM   3044  HB3 TYR A1079     -16.331  16.687  -9.569  1.00 37.14           H  \nATOM   3045  HB2 TYR A1079     -15.004  16.605 -10.682  1.00 37.14           H  \nATOM   3046  HD1 TYR A1079     -16.571  18.454  -8.007  1.00 45.55           H  \nATOM   3047  HD2 TYR A1079     -12.828  17.919 -10.099  1.00 42.95           H  \nATOM   3048  HE1 TYR A1079     -15.767  20.629  -7.137  1.00 48.19           H  \nATOM   3049  HE2 TYR A1079     -12.025  20.081  -9.205  1.00 44.97           H  \nATOM   3050  HH  TYR A1079     -14.028  22.123  -7.043  1.00 58.40           H  \nATOM   3051  N   TYR A1080     -16.702  14.042  -9.223  1.00 32.40           N  \nATOM   3052  CA  TYR A1080     -17.512  13.046  -9.939  1.00 30.87           C  \nATOM   3053  C   TYR A1080     -17.542  13.317 -11.455  1.00 32.51           C  \nATOM   3054  O   TYR A1080     -17.430  12.377 -12.238  1.00 30.72           O  \nATOM   3055  CB  TYR A1080     -18.938  12.999  -9.362  1.00 32.98           C  \nATOM   3056  CG  TYR A1080     -19.032  12.486  -7.936  1.00 35.85           C  \nATOM   3057  CD1 TYR A1080     -18.695  11.147  -7.644  1.00 37.45           C  \nATOM   3058  CD2 TYR A1080     -19.477  13.336  -6.902  1.00 38.07           C  \nATOM   3059  CE1 TYR A1080     -18.818  10.655  -6.331  1.00 40.49           C  \nATOM   3060  CE2 TYR A1080     -19.600  12.844  -5.588  1.00 40.41           C  \nATOM   3061  CZ  TYR A1080     -19.277  11.503  -5.305  1.00 44.30           C  \nATOM   3062  OH  TYR A1080     -19.410  11.026  -4.036  1.00 44.69           O  \nATOM   3063  H   TYR A1080     -17.208  14.750  -8.710  1.00 32.40           H  \nATOM   3064  HA  TYR A1080     -17.052  12.066  -9.794  1.00 30.87           H  \nATOM   3065  HB3 TYR A1080     -19.560  12.345  -9.974  1.00 32.98           H  \nATOM   3066  HB2 TYR A1080     -19.400  13.985  -9.425  1.00 32.98           H  \nATOM   3067  HD1 TYR A1080     -18.346  10.490  -8.426  1.00 37.45           H  \nATOM   3068  HD2 TYR A1080     -19.735  14.363  -7.111  1.00 38.07           H  \nATOM   3069  HE1 TYR A1080     -18.566   9.627  -6.116  1.00 40.49           H  \nATOM   3070  HE2 TYR A1080     -19.946  13.496  -4.799  1.00 40.41           H  \nATOM   3071  HH  TYR A1080     -19.090  10.127  -3.938  1.00 44.69           H  \nATOM   3072  N   ALA A1081     -17.605  14.604 -11.842  1.00 29.56           N  \nATOM   3073  CA  ALA A1081     -17.512  15.064 -13.228  1.00 27.95           C  \nATOM   3074  C   ALA A1081     -16.170  14.748 -13.915  1.00 27.99           C  \nATOM   3075  O   ALA A1081     -16.124  14.729 -15.142  1.00 26.14           O  \nATOM   3076  CB  ALA A1081     -17.798  16.573 -13.264  1.00 28.95           C  \nATOM   3077  H   ALA A1081     -17.713  15.325 -11.141  1.00 29.56           H  \nATOM   3078  HA  ALA A1081     -18.290  14.551 -13.796  1.00 27.95           H  \nATOM   3079  HB1 ALA A1081     -17.793  16.956 -14.285  1.00 28.95           H  \nATOM   3080  HB2 ALA A1081     -18.781  16.794 -12.847  1.00 28.95           H  \nATOM   3081  HB3 ALA A1081     -17.061  17.135 -12.690  1.00 28.95           H  \nATOM   3082  N   SER A1082     -15.102  14.505 -13.138  1.00 25.39           N  \nATOM   3083  CA  SER A1082     -13.776  14.151 -13.646  1.00 24.95           C  \nATOM   3084  C   SER A1082     -13.745  12.745 -14.282  1.00 27.35           C  \nATOM   3085  O   SER A1082     -13.055  12.563 -15.284  1.00 26.99           O  \nATOM   3086  CB  SER A1082     -12.763  14.260 -12.500  1.00 28.68           C  \nATOM   3087  OG  SER A1082     -12.732  15.566 -11.967  1.00 33.92           O  \nATOM   3088  H   SER A1082     -15.195  14.533 -12.132  1.00 25.39           H  \nATOM   3089  HA  SER A1082     -13.498  14.869 -14.420  1.00 24.95           H  \nATOM   3090  HB3 SER A1082     -11.764  14.000 -12.839  1.00 28.68           H  \nATOM   3091  HB2 SER A1082     -13.008  13.569 -11.703  1.00 28.68           H  \nATOM   3092  HG  SER A1082     -12.333  16.169 -12.606  1.00 33.92           H  \nATOM   3093  N   ASP A1083     -14.537  11.799 -13.743  1.00 23.13           N  \nATOM   3094  CA  ASP A1083     -14.788  10.488 -14.354  1.00 22.18           C  \nATOM   3095  C   ASP A1083     -15.611  10.564 -15.651  1.00 25.02           C  \nATOM   3096  O   ASP A1083     -15.428   9.691 -16.496  1.00 23.63           O  \nATOM   3097  CB  ASP A1083     -15.474   9.498 -13.386  1.00 24.19           C  \nATOM   3098  CG  ASP A1083     -14.601   8.937 -12.259  1.00 28.00           C  \nATOM   3099  OD1 ASP A1083     -13.433   8.581 -12.529  1.00 27.87           O  \nATOM   3100  OD2 ASP A1083     -15.162   8.716 -11.167  1.00 31.18           O1-\nATOM   3101  H   ASP A1083     -15.083  12.016 -12.921  1.00 23.13           H  \nATOM   3102  HA  ASP A1083     -13.818  10.082 -14.642  1.00 22.18           H  \nATOM   3103  HB3 ASP A1083     -15.865   8.648 -13.943  1.00 24.19           H  \nATOM   3104  HB2 ASP A1083     -16.333   9.997 -12.937  1.00 24.19           H  \nATOM   3105  N   VAL A1084     -16.478  11.581 -15.808  1.00 23.20           N  \nATOM   3106  CA  VAL A1084     -17.237  11.816 -17.043  1.00 22.46           C  \nATOM   3107  C   VAL A1084     -16.326  12.236 -18.215  1.00 25.25           C  \nATOM   3108  O   VAL A1084     -16.560  11.779 -19.334  1.00 23.49           O  \nATOM   3109  CB  VAL A1084     -18.378  12.855 -16.849  1.00 25.40           C  \nATOM   3110  CG1 VAL A1084     -19.004  13.409 -18.149  1.00 24.52           C  \nATOM   3111  CG2 VAL A1084     -19.467  12.272 -15.928  1.00 25.38           C  \nATOM   3112  H   VAL A1084     -16.590  12.265 -15.073  1.00 23.20           H  \nATOM   3113  HA  VAL A1084     -17.704  10.870 -17.322  1.00 22.46           H  \nATOM   3114  HB  VAL A1084     -17.970  13.719 -16.335  1.00 25.40           H  \nATOM   3115 HG11 VAL A1084     -19.744  14.170 -17.923  1.00 24.52           H  \nATOM   3116 HG12 VAL A1084     -18.280  13.911 -18.790  1.00 24.52           H  \nATOM   3117 HG13 VAL A1084     -19.487  12.624 -18.732  1.00 24.52           H  \nATOM   3118 HG21 VAL A1084     -20.235  13.007 -15.704  1.00 25.38           H  \nATOM   3119 HG22 VAL A1084     -19.957  11.412 -16.385  1.00 25.38           H  \nATOM   3120 HG23 VAL A1084     -19.053  11.952 -14.972  1.00 25.38           H  \nATOM   3121  N   TRP A1085     -15.279  13.034 -17.932  1.00 23.54           N  \nATOM   3122  CA  TRP A1085     -14.206  13.342 -18.882  1.00 23.20           C  \nATOM   3123  C   TRP A1085     -13.454  12.077 -19.319  1.00 25.99           C  \nATOM   3124  O   TRP A1085     -13.253  11.889 -20.518  1.00 26.38           O  \nATOM   3125  CB  TRP A1085     -13.269  14.426 -18.303  1.00 22.62           C  \nATOM   3126  CG  TRP A1085     -12.128  14.881 -19.175  1.00 22.84           C  \nATOM   3127  CD1 TRP A1085     -11.055  14.132 -19.515  1.00 25.30           C  \nATOM   3128  CD2 TRP A1085     -11.921  16.174 -19.828  1.00 22.79           C  \nATOM   3129  NE1 TRP A1085     -10.233  14.839 -20.359  1.00 24.54           N  \nATOM   3130  CE2 TRP A1085     -10.718  16.104 -20.594  1.00 26.50           C  \nATOM   3131  CE3 TRP A1085     -12.618  17.404 -19.853  1.00 24.28           C  \nATOM   3132  CZ2 TRP A1085     -10.252  17.180 -21.365  1.00 26.19           C  \nATOM   3133  CZ3 TRP A1085     -12.152  18.496 -20.615  1.00 25.94           C  \nATOM   3134  CH2 TRP A1085     -10.975  18.384 -21.378  1.00 26.22           C  \nATOM   3135  H   TRP A1085     -15.153  13.373 -16.988  1.00 23.54           H  \nATOM   3136  HA  TRP A1085     -14.660  13.744 -19.784  1.00 23.20           H  \nATOM   3137  HB3 TRP A1085     -12.840  14.080 -17.363  1.00 22.62           H  \nATOM   3138  HB2 TRP A1085     -13.860  15.308 -18.052  1.00 22.62           H  \nATOM   3139  HD1 TRP A1085     -10.890  13.120 -19.184  1.00 25.30           H  \nATOM   3140  HE1 TRP A1085      -9.371  14.455 -20.731  1.00 24.54           H  \nATOM   3141  HE3 TRP A1085     -13.527  17.507 -19.285  1.00 24.28           H  \nATOM   3142  HZ2 TRP A1085      -9.346  17.075 -21.938  1.00 26.19           H  \nATOM   3143  HZ3 TRP A1085     -12.701  19.424 -20.620  1.00 25.94           H  \nATOM   3144  HH2 TRP A1085     -10.626  19.223 -21.962  1.00 26.22           H  \nATOM   3145  N   SER A1086     -13.092  11.228 -18.343  1.00 23.27           N  \nATOM   3146  CA  SER A1086     -12.412   9.953 -18.565  1.00 22.29           C  \nATOM   3147  C   SER A1086     -13.274   8.947 -19.353  1.00 25.76           C  \nATOM   3148  O   SER A1086     -12.707   8.181 -20.130  1.00 25.35           O  \nATOM   3149  CB  SER A1086     -11.978   9.362 -17.215  1.00 24.31           C  \nATOM   3150  OG  SER A1086     -11.144  10.256 -16.504  1.00 27.11           O  \nATOM   3151  H   SER A1086     -13.281  11.465 -17.378  1.00 23.27           H  \nATOM   3152  HA  SER A1086     -11.518  10.152 -19.159  1.00 22.29           H  \nATOM   3153  HB3 SER A1086     -11.420   8.439 -17.370  1.00 24.31           H  \nATOM   3154  HB2 SER A1086     -12.840   9.115 -16.597  1.00 24.31           H  \nATOM   3155  HG  SER A1086     -10.415  10.519 -17.077  1.00 27.11           H  \nATOM   3156  N   PHE A1087     -14.612   9.007 -19.195  1.00 22.49           N  \nATOM   3157  CA  PHE A1087     -15.589   8.295 -20.022  1.00 21.87           C  \nATOM   3158  C   PHE A1087     -15.618   8.765 -21.483  1.00 26.76           C  \nATOM   3159  O   PHE A1087     -15.773   7.924 -22.363  1.00 27.22           O  \nATOM   3160  CB  PHE A1087     -16.998   8.282 -19.373  1.00 24.21           C  \nATOM   3161  CG  PHE A1087     -18.139   7.909 -20.310  1.00 25.86           C  \nATOM   3162  CD1 PHE A1087     -18.280   6.574 -20.745  1.00 28.01           C  \nATOM   3163  CD2 PHE A1087     -18.909   8.917 -20.932  1.00 26.70           C  \nATOM   3164  CE1 PHE A1087     -19.174   6.264 -21.760  1.00 28.28           C  \nATOM   3165  CE2 PHE A1087     -19.803   8.585 -21.941  1.00 28.37           C  \nATOM   3166  CZ  PHE A1087     -19.928   7.266 -22.358  1.00 26.26           C  \nATOM   3167  H   PHE A1087     -14.996   9.642 -18.508  1.00 22.49           H  \nATOM   3168  HA  PHE A1087     -15.264   7.254 -20.052  1.00 21.87           H  \nATOM   3169  HB3 PHE A1087     -17.220   9.244 -18.916  1.00 24.21           H  \nATOM   3170  HB2 PHE A1087     -17.001   7.559 -18.562  1.00 24.21           H  \nATOM   3171  HD1 PHE A1087     -17.662   5.798 -20.320  1.00 28.01           H  \nATOM   3172  HD2 PHE A1087     -18.781   9.951 -20.647  1.00 26.70           H  \nATOM   3173  HE1 PHE A1087     -19.270   5.244 -22.097  1.00 28.28           H  \nATOM   3174  HE2 PHE A1087     -20.388   9.359 -22.416  1.00 28.37           H  \nATOM   3175  HZ  PHE A1087     -20.613   7.022 -23.156  1.00 26.26           H  \nATOM   3176  N   GLY A1088     -15.463  10.078 -21.725  1.00 25.20           N  \nATOM   3177  CA  GLY A1088     -15.397  10.647 -23.072  1.00 24.53           C  \nATOM   3178  C   GLY A1088     -14.144  10.153 -23.812  1.00 25.56           C  \nATOM   3179  O   GLY A1088     -14.215   9.886 -25.010  1.00 24.64           O  \nATOM   3180  H   GLY A1088     -15.360  10.718 -20.948  1.00 25.20           H  \nATOM   3181  HA3 GLY A1088     -15.369  11.734 -23.000  1.00 24.53           H  \nATOM   3182  HA2 GLY A1088     -16.295  10.385 -23.634  1.00 24.53           H  \nATOM   3183  N   VAL A1089     -13.018   9.990 -23.092  1.00 22.27           N  \nATOM   3184  CA  VAL A1089     -11.773   9.430 -23.621  1.00 21.54           C  \nATOM   3185  C   VAL A1089     -11.845   7.892 -23.772  1.00 25.32           C  \nATOM   3186  O   VAL A1089     -11.253   7.367 -24.713  1.00 25.91           O  \nATOM   3187  CB  VAL A1089     -10.538   9.818 -22.757  1.00 24.92           C  \nATOM   3188  CG1 VAL A1089      -9.205   9.300 -23.330  1.00 24.42           C  \nATOM   3189  CG2 VAL A1089     -10.419  11.342 -22.593  1.00 24.24           C  \nATOM   3190  H   VAL A1089     -13.022  10.219 -22.107  1.00 22.27           H  \nATOM   3191  HA  VAL A1089     -11.612   9.844 -24.616  1.00 21.54           H  \nATOM   3192  HB  VAL A1089     -10.659   9.389 -21.761  1.00 24.92           H  \nATOM   3193 HG11 VAL A1089      -8.358   9.619 -22.723  1.00 24.42           H  \nATOM   3194 HG12 VAL A1089      -9.165   8.214 -23.374  1.00 24.42           H  \nATOM   3195 HG13 VAL A1089      -9.045   9.679 -24.340  1.00 24.42           H  \nATOM   3196 HG21 VAL A1089      -9.521  11.613 -22.042  1.00 24.24           H  \nATOM   3197 HG22 VAL A1089     -10.373  11.837 -23.563  1.00 24.24           H  \nATOM   3198 HG23 VAL A1089     -11.258  11.760 -22.043  1.00 24.24           H  \nATOM   3199  N   THR A1090     -12.615   7.201 -22.911  1.00 22.27           N  \nATOM   3200  CA  THR A1090     -12.918   5.771 -23.052  1.00 21.73           C  \nATOM   3201  C   THR A1090     -13.803   5.497 -24.282  1.00 24.89           C  \nATOM   3202  O   THR A1090     -13.496   4.581 -25.038  1.00 24.37           O  \nATOM   3203  CB  THR A1090     -13.638   5.177 -21.811  1.00 26.43           C  \nATOM   3204  OG1 THR A1090     -12.855   5.394 -20.661  1.00 23.21           O  \nATOM   3205  CG2 THR A1090     -13.917   3.664 -21.880  1.00 26.50           C  \nATOM   3206  H   THR A1090     -13.071   7.685 -22.149  1.00 22.27           H  \nATOM   3207  HA  THR A1090     -11.974   5.239 -23.187  1.00 21.73           H  \nATOM   3208  HB  THR A1090     -14.587   5.688 -21.652  1.00 26.43           H  \nATOM   3209  HG1 THR A1090     -12.746   6.342 -20.526  1.00 23.21           H  \nATOM   3210 HG21 THR A1090     -14.289   3.293 -20.925  1.00 26.50           H  \nATOM   3211 HG22 THR A1090     -14.666   3.418 -22.633  1.00 26.50           H  \nATOM   3212 HG23 THR A1090     -13.011   3.107 -22.118  1.00 26.50           H  \nATOM   3213  N   LEU A1091     -14.844   6.326 -24.480  1.00 21.38           N  \nATOM   3214  CA  LEU A1091     -15.754   6.315 -25.626  1.00 21.26           C  \nATOM   3215  C   LEU A1091     -15.027   6.594 -26.953  1.00 25.55           C  \nATOM   3216  O   LEU A1091     -15.338   5.943 -27.948  1.00 24.92           O  \nATOM   3217  CB  LEU A1091     -16.902   7.321 -25.358  1.00 21.18           C  \nATOM   3218  CG  LEU A1091     -18.043   7.343 -26.400  1.00 26.34           C  \nATOM   3219  CD1 LEU A1091     -18.736   5.972 -26.517  1.00 27.66           C  \nATOM   3220  CD2 LEU A1091     -19.046   8.478 -26.096  1.00 28.91           C  \nATOM   3221  H   LEU A1091     -15.031   7.043 -23.789  1.00 21.38           H  \nATOM   3222  HA  LEU A1091     -16.172   5.309 -25.684  1.00 21.26           H  \nATOM   3223  HB3 LEU A1091     -16.476   8.322 -25.277  1.00 21.18           H  \nATOM   3224  HB2 LEU A1091     -17.339   7.107 -24.381  1.00 21.18           H  \nATOM   3225  HG  LEU A1091     -17.612   7.573 -27.373  1.00 26.34           H  \nATOM   3226 HD11 LEU A1091     -19.820   6.049 -26.604  1.00 27.66           H  \nATOM   3227 HD12 LEU A1091     -18.386   5.428 -27.392  1.00 27.66           H  \nATOM   3228 HD13 LEU A1091     -18.522   5.346 -25.651  1.00 27.66           H  \nATOM   3229 HD21 LEU A1091     -19.158   9.136 -26.959  1.00 28.91           H  \nATOM   3230 HD22 LEU A1091     -20.039   8.108 -25.839  1.00 28.91           H  \nATOM   3231 HD23 LEU A1091     -18.721   9.099 -25.260  1.00 28.91           H  \nATOM   3232  N   TYR A1092     -14.031   7.499 -26.923  1.00 23.80           N  \nATOM   3233  CA  TYR A1092     -13.099   7.753 -28.021  1.00 23.59           C  \nATOM   3234  C   TYR A1092     -12.315   6.491 -28.425  1.00 28.07           C  \nATOM   3235  O   TYR A1092     -12.272   6.181 -29.614  1.00 28.26           O  \nATOM   3236  CB  TYR A1092     -12.173   8.936 -27.658  1.00 24.03           C  \nATOM   3237  CG  TYR A1092     -11.033   9.197 -28.626  1.00 25.49           C  \nATOM   3238  CD1 TYR A1092     -11.301   9.688 -29.920  1.00 27.64           C  \nATOM   3239  CD2 TYR A1092      -9.705   8.903 -28.251  1.00 25.28           C  \nATOM   3240  CE1 TYR A1092     -10.251   9.863 -30.838  1.00 27.61           C  \nATOM   3241  CE2 TYR A1092      -8.652   9.096 -29.166  1.00 25.84           C  \nATOM   3242  CZ  TYR A1092      -8.929   9.573 -30.462  1.00 31.24           C  \nATOM   3243  OH  TYR A1092      -7.926   9.744 -31.367  1.00 30.99           O  \nATOM   3244  H   TYR A1092     -13.854   8.006 -26.066  1.00 23.80           H  \nATOM   3245  HA  TYR A1092     -13.698   8.053 -28.883  1.00 23.59           H  \nATOM   3246  HB3 TYR A1092     -11.731   8.761 -26.683  1.00 24.03           H  \nATOM   3247  HB2 TYR A1092     -12.756   9.847 -27.538  1.00 24.03           H  \nATOM   3248  HD1 TYR A1092     -12.315   9.900 -30.224  1.00 27.64           H  \nATOM   3249  HD2 TYR A1092      -9.491   8.520 -27.264  1.00 25.28           H  \nATOM   3250  HE1 TYR A1092     -10.457  10.196 -31.843  1.00 27.61           H  \nATOM   3251  HE2 TYR A1092      -7.639   8.871 -28.867  1.00 25.84           H  \nATOM   3252  HH  TYR A1092      -7.106   9.333 -31.072  1.00 30.99           H  \nATOM   3253  N   GLU A1093     -11.768   5.761 -27.435  1.00 24.82           N  \nATOM   3254  CA  GLU A1093     -11.086   4.484 -27.646  1.00 23.87           C  \nATOM   3255  C   GLU A1093     -11.975   3.389 -28.258  1.00 29.02           C  \nATOM   3256  O   GLU A1093     -11.477   2.664 -29.115  1.00 29.63           O  \nATOM   3257  CB  GLU A1093     -10.427   3.973 -26.356  1.00 24.44           C  \nATOM   3258  CG  GLU A1093      -9.237   4.821 -25.884  1.00 27.04           C  \nATOM   3259  CD  GLU A1093      -8.637   4.226 -24.611  1.00 39.48           C  \nATOM   3260  OE1 GLU A1093      -9.243   4.419 -23.533  1.00 26.77           O  \nATOM   3261  OE2 GLU A1093      -7.591   3.554 -24.738  1.00 32.38           O1-\nATOM   3262  H   GLU A1093     -11.845   6.074 -26.476  1.00 24.82           H  \nATOM   3263  HA  GLU A1093     -10.281   4.673 -28.357  1.00 23.87           H  \nATOM   3264  HB3 GLU A1093     -10.087   2.947 -26.501  1.00 24.44           H  \nATOM   3265  HB2 GLU A1093     -11.167   3.920 -25.560  1.00 24.44           H  \nATOM   3266  HG3 GLU A1093      -9.531   5.852 -25.702  1.00 27.04           H  \nATOM   3267  HG2 GLU A1093      -8.481   4.862 -26.670  1.00 27.04           H  \nATOM   3268  N   LEU A1094     -13.259   3.299 -27.860  1.00 26.56           N  \nATOM   3269  CA  LEU A1094     -14.192   2.306 -28.409  1.00 27.12           C  \nATOM   3270  C   LEU A1094     -14.478   2.531 -29.905  1.00 29.23           C  \nATOM   3271  O   LEU A1094     -14.481   1.561 -30.660  1.00 30.58           O  \nATOM   3272  CB  LEU A1094     -15.520   2.246 -27.615  1.00 27.75           C  \nATOM   3273  CG  LEU A1094     -15.421   2.018 -26.089  1.00 33.45           C  \nATOM   3274  CD1 LEU A1094     -16.789   1.644 -25.482  1.00 34.25           C  \nATOM   3275  CD2 LEU A1094     -14.323   1.027 -25.666  1.00 37.20           C  \nATOM   3276  H   LEU A1094     -13.614   3.919 -27.144  1.00 26.56           H  \nATOM   3277  HA  LEU A1094     -13.708   1.330 -28.327  1.00 27.12           H  \nATOM   3278  HB3 LEU A1094     -16.113   1.436 -28.041  1.00 27.75           H  \nATOM   3279  HB2 LEU A1094     -16.100   3.154 -27.790  1.00 27.75           H  \nATOM   3280  HG  LEU A1094     -15.166   2.977 -25.652  1.00 33.45           H  \nATOM   3281 HD11 LEU A1094     -17.053   2.322 -24.669  1.00 34.25           H  \nATOM   3282 HD12 LEU A1094     -17.592   1.700 -26.216  1.00 34.25           H  \nATOM   3283 HD13 LEU A1094     -16.794   0.632 -25.076  1.00 34.25           H  \nATOM   3284 HD21 LEU A1094     -14.466   0.703 -24.636  1.00 37.20           H  \nATOM   3285 HD22 LEU A1094     -14.313   0.140 -26.299  1.00 37.20           H  \nATOM   3286 HD23 LEU A1094     -13.335   1.487 -25.711  1.00 37.20           H  \nATOM   3287  N   LEU A1095     -14.672   3.802 -30.304  1.00 26.35           N  \nATOM   3288  CA  LEU A1095     -14.961   4.209 -31.682  1.00 28.85           C  \nATOM   3289  C   LEU A1095     -13.734   4.120 -32.619  1.00 32.34           C  \nATOM   3290  O   LEU A1095     -13.931   3.898 -33.813  1.00 33.48           O  \nATOM   3291  CB  LEU A1095     -15.577   5.632 -31.691  1.00 29.95           C  \nATOM   3292  CG  LEU A1095     -17.110   5.748 -31.482  1.00 37.01           C  \nATOM   3293  CD1 LEU A1095     -17.928   4.993 -32.548  1.00 41.99           C  \nATOM   3294  CD2 LEU A1095     -17.598   5.424 -30.060  1.00 37.43           C  \nATOM   3295  H   LEU A1095     -14.644   4.545 -29.618  1.00 26.35           H  \nATOM   3296  HA  LEU A1095     -15.694   3.506 -32.081  1.00 28.85           H  \nATOM   3297  HB3 LEU A1095     -15.375   6.094 -32.658  1.00 29.95           H  \nATOM   3298  HB2 LEU A1095     -15.062   6.260 -30.963  1.00 29.95           H  \nATOM   3299  HG  LEU A1095     -17.340   6.802 -31.630  1.00 37.01           H  \nATOM   3300 HD11 LEU A1095     -18.648   5.658 -33.026  1.00 41.99           H  \nATOM   3301 HD12 LEU A1095     -17.300   4.585 -33.335  1.00 41.99           H  \nATOM   3302 HD13 LEU A1095     -18.483   4.155 -32.126  1.00 41.99           H  \nATOM   3303 HD21 LEU A1095     -18.614   5.029 -30.052  1.00 37.43           H  \nATOM   3304 HD22 LEU A1095     -16.973   4.692 -29.555  1.00 37.43           H  \nATOM   3305 HD23 LEU A1095     -17.608   6.330 -29.455  1.00 37.43           H  \nATOM   3306  N   THR A1096     -12.506   4.251 -32.084  1.00 28.49           N  \nATOM   3307  CA  THR A1096     -11.253   3.995 -32.816  1.00 28.46           C  \nATOM   3308  C   THR A1096     -10.852   2.497 -32.815  1.00 34.09           C  \nATOM   3309  O   THR A1096      -9.856   2.153 -33.452  1.00 34.31           O  \nATOM   3310  CB  THR A1096     -10.059   4.808 -32.236  1.00 31.93           C  \nATOM   3311  OG1 THR A1096      -9.741   4.419 -30.916  1.00 28.23           O  \nATOM   3312  CG2 THR A1096     -10.258   6.329 -32.269  1.00 33.74           C  \nATOM   3313  H   THR A1096     -12.415   4.453 -31.098  1.00 28.49           H  \nATOM   3314  HA  THR A1096     -11.377   4.297 -33.856  1.00 28.46           H  \nATOM   3315  HB  THR A1096      -9.172   4.597 -32.833  1.00 31.93           H  \nATOM   3316  HG1 THR A1096     -10.439   4.736 -30.336  1.00 28.23           H  \nATOM   3317 HG21 THR A1096      -9.410   6.848 -31.821  1.00 33.74           H  \nATOM   3318 HG22 THR A1096     -10.359   6.687 -33.292  1.00 33.74           H  \nATOM   3319 HG23 THR A1096     -11.150   6.635 -31.735  1.00 33.74           H  \nATOM   3320  N   HIS A1097     -11.615   1.642 -32.103  1.00 31.69           N  \nATOM   3321  CA  HIS A1097     -11.381   0.204 -31.900  1.00 31.97           C  \nATOM   3322  C   HIS A1097     -10.062  -0.104 -31.165  1.00 33.69           C  \nATOM   3323  O   HIS A1097      -9.451  -1.146 -31.396  1.00 33.12           O  \nATOM   3324  CB  HIS A1097     -11.554  -0.597 -33.212  1.00 35.14           C  \nATOM   3325  CG  HIS A1097     -12.938  -0.518 -33.800  1.00 40.55           C  \nATOM   3326  ND1 HIS A1097     -13.357   0.538 -34.617  1.00 43.74           N  \nATOM   3327  CD2 HIS A1097     -13.982  -1.406 -33.645  1.00 43.94           C  \nATOM   3328  CE1 HIS A1097     -14.618   0.257 -34.914  1.00 44.01           C  \nATOM   3329  NE2 HIS A1097     -15.038  -0.885 -34.369  1.00 44.57           N  \nATOM   3330  H   HIS A1097     -12.425   2.012 -31.624  1.00 31.69           H  \nATOM   3331  HA  HIS A1097     -12.165  -0.123 -31.216  1.00 31.97           H  \nATOM   3332  HB3 HIS A1097     -11.341  -1.653 -33.046  1.00 35.14           H  \nATOM   3333  HB2 HIS A1097     -10.844  -0.264 -33.967  1.00 35.14           H  \nATOM   3334  HD2 HIS A1097     -14.056  -2.331 -33.092  1.00 43.94           H  \nATOM   3335  HE1 HIS A1097     -15.240   0.888 -35.531  1.00 44.01           H  \nATOM   3336  HE2 HIS A1097     -15.963  -1.292 -34.456  1.00 44.57           H  \nATOM   3337  N   CYS A1098      -9.658   0.828 -30.285  1.00 28.70           N  \nATOM   3338  CA  CYS A1098      -8.478   0.796 -29.422  1.00 27.70           C  \nATOM   3339  C   CYS A1098      -7.155   0.700 -30.208  1.00 30.22           C  \nATOM   3340  O   CYS A1098      -6.198   0.093 -29.727  1.00 27.75           O  \nATOM   3341  CB  CYS A1098      -8.592  -0.268 -28.315  1.00 27.86           C  \nATOM   3342  SG  CYS A1098     -10.039   0.093 -27.277  1.00 31.27           S  \nATOM   3343  H   CYS A1098     -10.254   1.635 -30.150  1.00 28.70           H  \nATOM   3344  HA  CYS A1098      -8.453   1.767 -28.928  1.00 27.70           H  \nATOM   3345  HB3 CYS A1098      -7.706  -0.255 -27.682  1.00 27.86           H  \nATOM   3346  HB2 CYS A1098      -8.685  -1.270 -28.729  1.00 27.86           H  \nATOM   3347  HG  CYS A1098     -10.014  -1.059 -26.600  1.00 31.27           H  \nATOM   3348  N   ASP A1099      -7.130   1.319 -31.404  1.00 28.20           N  \nATOM   3349  CA  ASP A1099      -5.967   1.423 -32.283  1.00 29.09           C  \nATOM   3350  C   ASP A1099      -4.871   2.253 -31.590  1.00 32.04           C  \nATOM   3351  O   ASP A1099      -5.137   3.386 -31.191  1.00 29.80           O  \nATOM   3352  CB  ASP A1099      -6.383   2.011 -33.658  1.00 31.01           C  \nATOM   3353  CG  ASP A1099      -5.334   2.058 -34.786  1.00 42.86           C  \nATOM   3354  OD1 ASP A1099      -4.205   1.546 -34.615  1.00 44.82           O  \nATOM   3355  OD2 ASP A1099      -5.706   2.585 -35.856  1.00 55.40           O1-\nATOM   3356  H   ASP A1099      -7.968   1.778 -31.732  1.00 28.20           H  \nATOM   3357  HA  ASP A1099      -5.599   0.408 -32.440  1.00 29.09           H  \nATOM   3358  HB3 ASP A1099      -6.782   3.015 -33.511  1.00 31.01           H  \nATOM   3359  HB2 ASP A1099      -7.232   1.442 -34.033  1.00 31.01           H  \nATOM   3360  N   SER A1100      -3.673   1.660 -31.457  1.00 30.26           N  \nATOM   3361  CA  SER A1100      -2.501   2.255 -30.813  1.00 30.30           C  \nATOM   3362  C   SER A1100      -2.007   3.557 -31.475  1.00 34.31           C  \nATOM   3363  O   SER A1100      -1.544   4.442 -30.757  1.00 34.07           O  \nATOM   3364  CB  SER A1100      -1.395   1.186 -30.688  1.00 35.14           C  \nATOM   3365  OG  SER A1100      -0.812   0.863 -31.936  1.00 49.21           O  \nATOM   3366  H   SER A1100      -3.544   0.722 -31.816  1.00 30.26           H  \nATOM   3367  HA  SER A1100      -2.810   2.508 -29.798  1.00 30.30           H  \nATOM   3368  HB3 SER A1100      -1.789   0.278 -30.231  1.00 35.14           H  \nATOM   3369  HB2 SER A1100      -0.604   1.548 -30.030  1.00 35.14           H  \nATOM   3370  HG  SER A1100      -0.171   0.161 -31.804  1.00 49.21           H  \nATOM   3371  N   SER A1101      -2.165   3.675 -32.806  1.00 31.40           N  \nATOM   3372  CA  SER A1101      -1.859   4.886 -33.572  1.00 31.93           C  \nATOM   3373  C   SER A1101      -2.867   6.034 -33.343  1.00 35.91           C  \nATOM   3374  O   SER A1101      -2.506   7.191 -33.557  1.00 36.89           O  \nATOM   3375  CB  SER A1101      -1.697   4.523 -35.064  1.00 36.50           C  \nATOM   3376  OG  SER A1101      -2.929   4.318 -35.729  1.00 42.36           O  \nATOM   3377  H   SER A1101      -2.558   2.902 -33.327  1.00 31.40           H  \nATOM   3378  HA  SER A1101      -0.886   5.241 -33.226  1.00 31.93           H  \nATOM   3379  HB3 SER A1101      -1.073   3.636 -35.181  1.00 36.50           H  \nATOM   3380  HB2 SER A1101      -1.179   5.333 -35.580  1.00 36.50           H  \nATOM   3381  HG  SER A1101      -3.291   3.462 -35.475  1.00 42.36           H  \nATOM   3382  N   GLN A1102      -4.091   5.700 -32.898  1.00 29.85           N  \nATOM   3383  CA  GLN A1102      -5.158   6.649 -32.581  1.00 28.09           C  \nATOM   3384  C   GLN A1102      -5.318   6.881 -31.067  1.00 29.55           C  \nATOM   3385  O   GLN A1102      -6.205   7.643 -30.690  1.00 27.73           O  \nATOM   3386  CB  GLN A1102      -6.487   6.161 -33.198  1.00 29.07           C  \nATOM   3387  CG  GLN A1102      -6.456   6.050 -34.735  1.00 37.94           C  \nATOM   3388  CD  GLN A1102      -7.845   5.775 -35.316  1.00 47.98           C  \nATOM   3389  OE1 GLN A1102      -8.717   6.640 -35.277  1.00 45.96           O  \nATOM   3390  NE2 GLN A1102      -8.059   4.581 -35.868  1.00 43.70           N  \nATOM   3391  H   GLN A1102      -4.308   4.725 -32.740  1.00 29.85           H  \nATOM   3392  HA  GLN A1102      -4.936   7.620 -33.021  1.00 28.09           H  \nATOM   3393  HB3 GLN A1102      -7.282   6.854 -32.919  1.00 29.07           H  \nATOM   3394  HB2 GLN A1102      -6.763   5.199 -32.764  1.00 29.07           H  \nATOM   3395  HG3 GLN A1102      -5.755   5.277 -35.050  1.00 37.94           H  \nATOM   3396  HG2 GLN A1102      -6.095   6.985 -35.164  1.00 37.94           H  \nATOM   3397 HE22 GLN A1102      -8.960   4.358 -36.266  1.00 43.70           H  \nATOM   3398 HE21 GLN A1102      -7.316   3.889 -35.901  1.00 43.70           H  \nATOM   3399  N   SER A1103      -4.496   6.236 -30.218  1.00 26.76           N  \nATOM   3400  CA  SER A1103      -4.636   6.266 -28.758  1.00 25.27           C  \nATOM   3401  C   SER A1103      -4.416   7.666 -28.134  1.00 28.60           C  \nATOM   3402  O   SER A1103      -3.673   8.456 -28.717  1.00 28.62           O  \nATOM   3403  CB  SER A1103      -3.733   5.180 -28.139  1.00 27.32           C  \nATOM   3404  OG  SER A1103      -2.362   5.531 -28.107  1.00 35.29           O  \nATOM   3405  H   SER A1103      -3.775   5.633 -30.588  1.00 26.76           H  \nATOM   3406  HA  SER A1103      -5.664   5.963 -28.587  1.00 25.27           H  \nATOM   3407  HB3 SER A1103      -3.855   4.235 -28.667  1.00 27.32           H  \nATOM   3408  HB2 SER A1103      -4.052   4.997 -27.114  1.00 27.32           H  \nATOM   3409  HG  SER A1103      -1.996   5.451 -28.995  1.00 35.29           H  \nATOM   3410  N   PRO A1104      -5.039   7.954 -26.962  1.00 25.17           N  \nATOM   3411  CA  PRO A1104      -4.893   9.264 -26.293  1.00 24.67           C  \nATOM   3412  C   PRO A1104      -3.456   9.762 -26.008  1.00 26.87           C  \nATOM   3413  O   PRO A1104      -3.206  10.927 -26.311  1.00 25.99           O  \nATOM   3414  CB  PRO A1104      -5.768   9.172 -25.030  1.00 26.01           C  \nATOM   3415  CG  PRO A1104      -6.761   8.063 -25.336  1.00 29.46           C  \nATOM   3416  CD  PRO A1104      -5.996   7.109 -26.241  1.00 25.85           C  \nATOM   3417  HA  PRO A1104      -5.359   9.984 -26.965  1.00 24.67           H  \nATOM   3418  HB3 PRO A1104      -6.271  10.113 -24.806  1.00 26.01           H  \nATOM   3419  HB2 PRO A1104      -5.186   8.913 -24.146  1.00 26.01           H  \nATOM   3420  HG3 PRO A1104      -7.598   8.483 -25.894  1.00 29.46           H  \nATOM   3421  HG2 PRO A1104      -7.161   7.577 -24.447  1.00 29.46           H  \nATOM   3422  HD2 PRO A1104      -5.453   6.369 -25.652  1.00 25.85           H  \nATOM   3423  HD3 PRO A1104      -6.704   6.583 -26.879  1.00 25.85           H  \nATOM   3424  N   PRO A1105      -2.512   8.903 -25.540  1.00 24.58           N  \nATOM   3425  CA  PRO A1105      -1.095   9.290 -25.409  1.00 24.76           C  \nATOM   3426  C   PRO A1105      -0.414   9.681 -26.728  1.00 29.78           C  \nATOM   3427  O   PRO A1105       0.275  10.696 -26.749  1.00 30.24           O  \nATOM   3428  CB  PRO A1105      -0.416   8.074 -24.751  1.00 25.88           C  \nATOM   3429  CG  PRO A1105      -1.547   7.335 -24.062  1.00 29.87           C  \nATOM   3430  CD  PRO A1105      -2.716   7.555 -25.010  1.00 25.57           C  \nATOM   3431  HA  PRO A1105      -1.051  10.139 -24.727  1.00 24.76           H  \nATOM   3432  HB3 PRO A1105       0.372   8.361 -24.055  1.00 25.88           H  \nATOM   3433  HB2 PRO A1105       0.031   7.420 -25.501  1.00 25.88           H  \nATOM   3434  HG3 PRO A1105      -1.760   7.813 -23.106  1.00 29.87           H  \nATOM   3435  HG2 PRO A1105      -1.332   6.283 -23.876  1.00 29.87           H  \nATOM   3436  HD2 PRO A1105      -2.673   6.841 -25.829  1.00 25.57           H  \nATOM   3437  HD3 PRO A1105      -3.660   7.421 -24.492  1.00 25.57           H  \nATOM   3438  N   THR A1106      -0.644   8.900 -27.798  1.00 26.99           N  \nATOM   3439  CA  THR A1106      -0.097   9.143 -29.134  1.00 27.47           C  \nATOM   3440  C   THR A1106      -0.563  10.483 -29.734  1.00 31.84           C  \nATOM   3441  O   THR A1106       0.284  11.263 -30.166  1.00 32.09           O  \nATOM   3442  CB  THR A1106      -0.470   7.995 -30.114  1.00 33.90           C  \nATOM   3443  OG1 THR A1106       0.169   6.812 -29.680  1.00 35.61           O  \nATOM   3444  CG2 THR A1106      -0.091   8.228 -31.588  1.00 32.59           C  \nATOM   3445  H   THR A1106      -1.225   8.079 -27.705  1.00 26.99           H  \nATOM   3446  HA  THR A1106       0.990   9.178 -29.039  1.00 27.47           H  \nATOM   3447  HB  THR A1106      -1.542   7.801 -30.070  1.00 33.90           H  \nATOM   3448  HG1 THR A1106       1.077   6.817 -30.001  1.00 35.61           H  \nATOM   3449 HG21 THR A1106      -0.167   7.307 -32.166  1.00 32.59           H  \nATOM   3450 HG22 THR A1106      -0.747   8.958 -32.064  1.00 32.59           H  \nATOM   3451 HG23 THR A1106       0.931   8.592 -31.679  1.00 32.59           H  \nATOM   3452  N   LYS A1107      -1.881  10.734 -29.718  1.00 27.48           N  \nATOM   3453  CA  LYS A1107      -2.498  11.914 -30.325  1.00 28.03           C  \nATOM   3454  C   LYS A1107      -2.239  13.220 -29.553  1.00 32.41           C  \nATOM   3455  O   LYS A1107      -2.116  14.260 -30.199  1.00 32.90           O  \nATOM   3456  CB  LYS A1107      -4.004  11.655 -30.524  1.00 29.00           C  \nATOM   3457  CG  LYS A1107      -4.332  10.463 -31.452  1.00 40.91           C  \nATOM   3458  CD  LYS A1107      -3.799  10.551 -32.893  1.00 47.46           C  \nATOM   3459  CE  LYS A1107      -4.424  11.691 -33.711  1.00 56.00           C  \nATOM   3460  NZ  LYS A1107      -3.900  11.720 -35.087  1.00 65.65           N1+\nATOM   3461  H   LYS A1107      -2.514  10.051 -29.322  1.00 27.48           H  \nATOM   3462  HA  LYS A1107      -2.042  12.056 -31.305  1.00 28.03           H  \nATOM   3463  HB3 LYS A1107      -4.486  12.553 -30.910  1.00 29.00           H  \nATOM   3464  HB2 LYS A1107      -4.459  11.467 -29.551  1.00 29.00           H  \nATOM   3465  HG3 LYS A1107      -5.412  10.339 -31.485  1.00 40.91           H  \nATOM   3466  HG2 LYS A1107      -3.949   9.546 -31.011  1.00 40.91           H  \nATOM   3467  HD3 LYS A1107      -3.999   9.605 -33.395  1.00 47.46           H  \nATOM   3468  HD2 LYS A1107      -2.713  10.638 -32.883  1.00 47.46           H  \nATOM   3469  HE3 LYS A1107      -4.217  12.652 -33.244  1.00 56.00           H  \nATOM   3470  HE2 LYS A1107      -5.507  11.575 -33.750  1.00 56.00           H  \nATOM   3471  HZ1 LYS A1107      -2.898  11.867 -35.052  1.00 65.65           H  \nATOM   3472  HZ2 LYS A1107      -4.094  10.843 -35.549  1.00 65.65           H  \nATOM   3473  HZ3 LYS A1107      -4.332  12.478 -35.596  1.00 65.65           H  \nATOM   3474  N   PHE A1108      -2.117  13.159 -28.214  1.00 27.91           N  \nATOM   3475  CA  PHE A1108      -1.728  14.312 -27.396  1.00 26.74           C  \nATOM   3476  C   PHE A1108      -0.225  14.638 -27.463  1.00 30.76           C  \nATOM   3477  O   PHE A1108       0.112  15.819 -27.437  1.00 31.53           O  \nATOM   3478  CB  PHE A1108      -2.223  14.161 -25.939  1.00 27.18           C  \nATOM   3479  CG  PHE A1108      -3.708  14.423 -25.709  1.00 27.38           C  \nATOM   3480  CD1 PHE A1108      -4.294  15.643 -26.113  1.00 29.59           C  \nATOM   3481  CD2 PHE A1108      -4.499  13.500 -24.989  1.00 28.32           C  \nATOM   3482  CE1 PHE A1108      -5.631  15.902 -25.840  1.00 30.31           C  \nATOM   3483  CE2 PHE A1108      -5.834  13.775 -24.728  1.00 29.39           C  \nATOM   3484  CZ  PHE A1108      -6.397  14.972 -25.151  1.00 28.52           C  \nATOM   3485  H   PHE A1108      -2.248  12.280 -27.730  1.00 27.91           H  \nATOM   3486  HA  PHE A1108      -2.218  15.191 -27.816  1.00 26.74           H  \nATOM   3487  HB3 PHE A1108      -1.680  14.842 -25.282  1.00 27.18           H  \nATOM   3488  HB2 PHE A1108      -1.976  13.159 -25.590  1.00 27.18           H  \nATOM   3489  HD1 PHE A1108      -3.706  16.390 -26.627  1.00 29.59           H  \nATOM   3490  HD2 PHE A1108      -4.075  12.576 -24.629  1.00 28.32           H  \nATOM   3491  HE1 PHE A1108      -6.075  16.835 -26.155  1.00 30.31           H  \nATOM   3492  HE2 PHE A1108      -6.435  13.059 -24.188  1.00 29.39           H  \nATOM   3493  HZ  PHE A1108      -7.436  15.180 -24.942  1.00 28.52           H  \nATOM   3494  N   LEU A1109       0.650  13.622 -27.593  1.00 27.77           N  \nATOM   3495  CA  LEU A1109       2.100  13.811 -27.752  1.00 28.51           C  \nATOM   3496  C   LEU A1109       2.516  14.255 -29.168  1.00 34.25           C  \nATOM   3497  O   LEU A1109       3.626  14.765 -29.315  1.00 34.88           O  \nATOM   3498  CB  LEU A1109       2.860  12.542 -27.309  1.00 28.11           C  \nATOM   3499  CG  LEU A1109       2.842  12.310 -25.779  1.00 32.10           C  \nATOM   3500  CD1 LEU A1109       3.338  10.893 -25.419  1.00 30.45           C  \nATOM   3501  CD2 LEU A1109       3.605  13.410 -25.010  1.00 36.17           C  \nATOM   3502  H   LEU A1109       0.319  12.666 -27.597  1.00 27.77           H  \nATOM   3503  HA  LEU A1109       2.404  14.626 -27.095  1.00 28.51           H  \nATOM   3504  HB3 LEU A1109       3.901  12.592 -27.634  1.00 28.11           H  \nATOM   3505  HB2 LEU A1109       2.437  11.682 -27.830  1.00 28.11           H  \nATOM   3506  HG  LEU A1109       1.804  12.362 -25.449  1.00 32.10           H  \nATOM   3507 HD11 LEU A1109       2.593  10.366 -24.822  1.00 30.45           H  \nATOM   3508 HD12 LEU A1109       3.521  10.287 -26.306  1.00 30.45           H  \nATOM   3509 HD13 LEU A1109       4.266  10.903 -24.848  1.00 30.45           H  \nATOM   3510 HD21 LEU A1109       4.230  13.014 -24.210  1.00 36.17           H  \nATOM   3511 HD22 LEU A1109       4.255  13.987 -25.667  1.00 36.17           H  \nATOM   3512 HD23 LEU A1109       2.908  14.111 -24.549  1.00 36.17           H  \nATOM   3513  N   GLU A1110       1.626  14.116 -30.166  1.00 32.96           N  \nATOM   3514  CA  GLU A1110       1.757  14.754 -31.480  1.00 35.44           C  \nATOM   3515  C   GLU A1110       1.538  16.278 -31.416  1.00 38.81           C  \nATOM   3516  O   GLU A1110       2.214  17.004 -32.143  1.00 38.69           O  \nATOM   3517  CB  GLU A1110       0.776  14.106 -32.477  1.00 36.99           C  \nATOM   3518  CG  GLU A1110       1.234  12.724 -32.992  1.00 47.30           C  \nATOM   3519  CD  GLU A1110       0.184  11.941 -33.801  1.00 70.21           C  \nATOM   3520  OE1 GLU A1110      -0.902  12.492 -34.093  1.00 64.58           O  \nATOM   3521  OE2 GLU A1110       0.490  10.773 -34.124  1.00 65.32           O1-\nATOM   3522  H   GLU A1110       0.748  13.648 -29.986  1.00 32.96           H  \nATOM   3523  HA  GLU A1110       2.773  14.593 -31.847  1.00 35.44           H  \nATOM   3524  HB3 GLU A1110       0.605  14.769 -33.327  1.00 36.99           H  \nATOM   3525  HB2 GLU A1110      -0.188  13.999 -31.980  1.00 36.99           H  \nATOM   3526  HG3 GLU A1110       1.562  12.107 -32.159  1.00 47.30           H  \nATOM   3527  HG2 GLU A1110       2.115  12.857 -33.622  1.00 47.30           H  \nATOM   3528  N   LEU A1111       0.621  16.731 -30.540  1.00 35.92           N  \nATOM   3529  CA  LEU A1111       0.318  18.147 -30.309  1.00 37.14           C  \nATOM   3530  C   LEU A1111       1.372  18.829 -29.418  1.00 40.62           C  \nATOM   3531  O   LEU A1111       1.740  19.971 -29.693  1.00 41.55           O  \nATOM   3532  CB  LEU A1111      -1.087  18.286 -29.673  1.00 36.92           C  \nATOM   3533  CG  LEU A1111      -2.260  17.801 -30.555  1.00 41.87           C  \nATOM   3534  CD1 LEU A1111      -3.572  17.728 -29.743  1.00 41.05           C  \nATOM   3535  CD2 LEU A1111      -2.410  18.636 -31.845  1.00 44.81           C  \nATOM   3536  H   LEU A1111       0.107  16.071 -29.975  1.00 35.92           H  \nATOM   3537  HA  LEU A1111       0.322  18.664 -31.270  1.00 37.14           H  \nATOM   3538  HB3 LEU A1111      -1.265  19.329 -29.406  1.00 36.92           H  \nATOM   3539  HB2 LEU A1111      -1.100  17.738 -28.731  1.00 36.92           H  \nATOM   3540  HG  LEU A1111      -2.038  16.781 -30.864  1.00 41.87           H  \nATOM   3541 HD11 LEU A1111      -4.009  16.731 -29.803  1.00 41.05           H  \nATOM   3542 HD12 LEU A1111      -3.410  17.942 -28.686  1.00 41.05           H  \nATOM   3543 HD13 LEU A1111      -4.325  18.435 -30.089  1.00 41.05           H  \nATOM   3544 HD21 LEU A1111      -3.440  18.931 -32.041  1.00 44.81           H  \nATOM   3545 HD22 LEU A1111      -1.820  19.552 -31.810  1.00 44.81           H  \nATOM   3546 HD23 LEU A1111      -2.074  18.066 -32.712  1.00 44.81           H  \nATOM   3547  N   ILE A1112       1.827  18.124 -28.368  1.00 34.80           N  \nATOM   3548  CA  ILE A1112       2.759  18.628 -27.356  1.00 34.93           C  \nATOM   3549  C   ILE A1112       4.230  18.572 -27.815  1.00 40.11           C  \nATOM   3550  O   ILE A1112       4.994  19.473 -27.471  1.00 41.74           O  \nATOM   3551  CB  ILE A1112       2.614  17.819 -26.027  1.00 36.99           C  \nATOM   3552  CG1 ILE A1112       1.226  18.047 -25.391  1.00 35.84           C  \nATOM   3553  CG2 ILE A1112       3.707  18.065 -24.963  1.00 37.00           C  \nATOM   3554  CD1 ILE A1112       0.810  16.938 -24.417  1.00 35.00           C  \nATOM   3555  H   ILE A1112       1.452  17.199 -28.201  1.00 34.80           H  \nATOM   3556  HA  ILE A1112       2.514  19.672 -27.148  1.00 34.93           H  \nATOM   3557  HB  ILE A1112       2.677  16.764 -26.294  1.00 36.99           H  \nATOM   3558 HG13 ILE A1112       0.460  18.112 -26.162  1.00 35.84           H  \nATOM   3559 HG12 ILE A1112       1.208  19.011 -24.881  1.00 35.84           H  \nATOM   3560 HG21 ILE A1112       3.496  17.533 -24.036  1.00 37.00           H  \nATOM   3561 HG22 ILE A1112       4.688  17.726 -25.289  1.00 37.00           H  \nATOM   3562 HG23 ILE A1112       3.786  19.123 -24.726  1.00 37.00           H  \nATOM   3563 HD11 ILE A1112      -0.272  16.926 -24.293  1.00 35.00           H  \nATOM   3564 HD12 ILE A1112       1.106  15.951 -24.774  1.00 35.00           H  \nATOM   3565 HD13 ILE A1112       1.261  17.086 -23.438  1.00 35.00           H  \nATOM   3566  N   GLY A1113       4.598  17.509 -28.549  1.00 36.74           N  \nATOM   3567  CA  GLY A1113       5.986  17.125 -28.807  1.00 38.59           C  \nATOM   3568  C   GLY A1113       6.458  16.152 -27.712  1.00 41.94           C  \nATOM   3569  O   GLY A1113       5.723  15.847 -26.772  1.00 39.30           O  \nATOM   3570  H   GLY A1113       3.896  16.830 -28.812  1.00 36.74           H  \nATOM   3571  HA3 GLY A1113       6.645  17.994 -28.846  1.00 38.59           H  \nATOM   3572  HA2 GLY A1113       6.038  16.630 -29.777  1.00 38.59           H  \nATOM   3573  N   ILE A1114       7.697  15.653 -27.849  1.00 41.30           N  \nATOM   3574  CA  ILE A1114       8.305  14.668 -26.942  1.00 41.02           C  \nATOM   3575  C   ILE A1114       9.607  15.170 -26.275  1.00 47.14           C  \nATOM   3576  O   ILE A1114      10.221  14.411 -25.524  1.00 48.03           O  \nATOM   3577  CB  ILE A1114       8.578  13.319 -27.673  1.00 43.24           C  \nATOM   3578  CG1 ILE A1114       9.541  13.438 -28.881  1.00 44.89           C  \nATOM   3579  CG2 ILE A1114       7.256  12.629 -28.061  1.00 42.60           C  \nATOM   3580  CD1 ILE A1114      10.047  12.085 -29.402  1.00 50.07           C  \nATOM   3581  H   ILE A1114       8.254  15.920 -28.647  1.00 41.30           H  \nATOM   3582  HA  ILE A1114       7.632  14.455 -26.109  1.00 41.02           H  \nATOM   3583  HB  ILE A1114       9.054  12.649 -26.955  1.00 43.24           H  \nATOM   3584 HG13 ILE A1114      10.411  14.042 -28.624  1.00 44.89           H  \nATOM   3585 HG12 ILE A1114       9.044  13.969 -29.694  1.00 44.89           H  \nATOM   3586 HG21 ILE A1114       7.425  11.627 -28.454  1.00 42.60           H  \nATOM   3587 HG22 ILE A1114       6.597  12.528 -27.198  1.00 42.60           H  \nATOM   3588 HG23 ILE A1114       6.716  13.194 -28.821  1.00 42.60           H  \nATOM   3589 HD11 ILE A1114      10.937  12.217 -30.019  1.00 50.07           H  \nATOM   3590 HD12 ILE A1114      10.311  11.414 -28.585  1.00 50.07           H  \nATOM   3591 HD13 ILE A1114       9.294  11.590 -30.015  1.00 50.07           H  \nATOM   3592  N   ALA A1115       9.991  16.433 -26.530  1.00 42.26           N  \nATOM   3593  CA  ALA A1115      11.194  17.067 -25.991  1.00 43.31           C  \nATOM   3594  C   ALA A1115      10.820  18.401 -25.327  1.00 48.36           C  \nATOM   3595  O   ALA A1115      11.240  19.462 -25.791  1.00 49.43           O  \nATOM   3596  CB  ALA A1115      12.223  17.220 -27.127  1.00 45.24           C  \nATOM   3597  H   ALA A1115       9.424  17.010 -27.133  1.00 42.26           H  \nATOM   3598  HA  ALA A1115      11.645  16.449 -25.212  1.00 43.31           H  \nATOM   3599  HB1 ALA A1115      13.140  17.690 -26.770  1.00 45.24           H  \nATOM   3600  HB2 ALA A1115      12.495  16.247 -27.537  1.00 45.24           H  \nATOM   3601  HB3 ALA A1115      11.832  17.826 -27.946  1.00 45.24           H  \nATOM   3602  N   GLN A1116      10.012  18.309 -24.258  1.00 44.35           N  \nATOM   3603  CA  GLN A1116       9.464  19.450 -23.516  1.00 44.30           C  \nATOM   3604  C   GLN A1116       9.925  19.478 -22.046  1.00 49.79           C  \nATOM   3605  O   GLN A1116       9.447  20.327 -21.292  1.00 49.85           O  \nATOM   3606  CB  GLN A1116       7.918  19.420 -23.615  1.00 44.27           C  \nATOM   3607  CG  GLN A1116       7.347  19.441 -25.051  1.00 53.29           C  \nATOM   3608  CD  GLN A1116       7.835  20.599 -25.930  1.00 72.09           C  \nATOM   3609  OE1 GLN A1116       8.158  20.396 -27.098  1.00 65.48           O  \nATOM   3610  NE2 GLN A1116       7.883  21.818 -25.389  1.00 65.05           N  \nATOM   3611  H   GLN A1116       9.716  17.395 -23.938  1.00 44.35           H  \nATOM   3612  HA  GLN A1116       9.827  20.386 -23.941  1.00 44.30           H  \nATOM   3613  HB3 GLN A1116       7.499  20.263 -23.064  1.00 44.27           H  \nATOM   3614  HB2 GLN A1116       7.541  18.532 -23.106  1.00 44.27           H  \nATOM   3615  HG3 GLN A1116       6.262  19.478 -25.007  1.00 53.29           H  \nATOM   3616  HG2 GLN A1116       7.588  18.503 -25.555  1.00 53.29           H  \nATOM   3617 HE22 GLN A1116       8.200  22.601 -25.942  1.00 65.05           H  \nATOM   3618 HE21 GLN A1116       7.607  21.967 -24.430  1.00 65.05           H  \nATOM   3619  N   GLY A1117      10.844  18.574 -21.657  1.00 46.41           N  \nATOM   3620  CA  GLY A1117      11.368  18.465 -20.296  1.00 44.66           C  \nATOM   3621  C   GLY A1117      10.279  17.930 -19.358  1.00 42.63           C  \nATOM   3622  O   GLY A1117       9.610  16.945 -19.673  1.00 37.23           O  \nATOM   3623  H   GLY A1117      11.190  17.910 -22.334  1.00 46.41           H  \nATOM   3624  HA3 GLY A1117      11.738  19.434 -19.957  1.00 44.66           H  \nATOM   3625  HA2 GLY A1117      12.213  17.776 -20.293  1.00 44.66           H  \nATOM   3626  N   GLN A1118      10.122  18.593 -18.202  1.00 39.82           N  \nATOM   3627  CA  GLN A1118       9.103  18.311 -17.187  1.00 38.37           C  \nATOM   3628  C   GLN A1118       7.702  18.861 -17.532  1.00 40.30           C  \nATOM   3629  O   GLN A1118       6.772  18.611 -16.767  1.00 41.07           O  \nATOM   3630  CB  GLN A1118       9.579  18.887 -15.835  1.00 41.27           C  \nATOM   3631  CG  GLN A1118      10.836  18.198 -15.270  1.00 52.25           C  \nATOM   3632  CD  GLN A1118      11.326  18.877 -13.990  1.00 66.80           C  \nATOM   3633  OE1 GLN A1118      11.669  20.058 -14.005  1.00 64.29           O  \nATOM   3634  NE2 GLN A1118      11.383  18.133 -12.884  1.00 50.92           N  \nATOM   3635  H   GLN A1118      10.710  19.396 -18.014  1.00 39.82           H  \nATOM   3636  HA  GLN A1118       9.006  17.229 -17.079  1.00 38.37           H  \nATOM   3637  HB3 GLN A1118       8.784  18.797 -15.092  1.00 41.27           H  \nATOM   3638  HB2 GLN A1118       9.757  19.958 -15.946  1.00 41.27           H  \nATOM   3639  HG3 GLN A1118      11.650  18.234 -15.995  1.00 52.25           H  \nATOM   3640  HG2 GLN A1118      10.632  17.142 -15.085  1.00 52.25           H  \nATOM   3641 HE22 GLN A1118      11.710  18.541 -12.020  1.00 50.92           H  \nATOM   3642 HE21 GLN A1118      11.099  17.164 -12.899  1.00 50.92           H  \nATOM   3643  N   MET A1119       7.569  19.615 -18.638  1.00 34.93           N  \nATOM   3644  CA  MET A1119       6.375  20.393 -18.980  1.00 34.58           C  \nATOM   3645  C   MET A1119       5.309  19.636 -19.797  1.00 34.58           C  \nATOM   3646  O   MET A1119       4.432  20.303 -20.340  1.00 34.71           O  \nATOM   3647  CB  MET A1119       6.788  21.702 -19.694  1.00 38.63           C  \nATOM   3648  CG  MET A1119       7.827  22.543 -18.940  1.00 44.95           C  \nATOM   3649  SD  MET A1119       8.154  24.140 -19.731  1.00 52.97           S  \nATOM   3650  CE  MET A1119       9.330  24.826 -18.536  1.00 51.70           C  \nATOM   3651  H   MET A1119       8.371  19.756 -19.237  1.00 34.93           H  \nATOM   3652  HA  MET A1119       5.885  20.689 -18.052  1.00 34.58           H  \nATOM   3653  HB3 MET A1119       5.908  22.328 -19.853  1.00 38.63           H  \nATOM   3654  HB2 MET A1119       7.169  21.473 -20.690  1.00 38.63           H  \nATOM   3655  HG3 MET A1119       8.773  22.006 -18.862  1.00 44.95           H  \nATOM   3656  HG2 MET A1119       7.483  22.729 -17.922  1.00 44.95           H  \nATOM   3657  HE1 MET A1119       9.653  25.818 -18.853  1.00 51.70           H  \nATOM   3658  HE2 MET A1119       8.868  24.912 -17.553  1.00 51.70           H  \nATOM   3659  HE3 MET A1119      10.208  24.186 -18.455  1.00 51.70           H  \nATOM   3660  N   THR A1120       5.357  18.294 -19.887  1.00 29.62           N  \nATOM   3661  CA  THR A1120       4.382  17.500 -20.655  1.00 28.01           C  \nATOM   3662  C   THR A1120       2.922  17.666 -20.173  1.00 30.48           C  \nATOM   3663  O   THR A1120       2.044  17.875 -21.008  1.00 31.09           O  \nATOM   3664  CB  THR A1120       4.714  15.984 -20.657  1.00 32.05           C  \nATOM   3665  OG1 THR A1120       6.047  15.796 -21.089  1.00 33.94           O  \nATOM   3666  CG2 THR A1120       3.806  15.122 -21.558  1.00 34.10           C  \nATOM   3667  H   THR A1120       6.099  17.780 -19.434  1.00 29.62           H  \nATOM   3668  HA  THR A1120       4.429  17.856 -21.687  1.00 28.01           H  \nATOM   3669  HB  THR A1120       4.654  15.596 -19.640  1.00 32.05           H  \nATOM   3670  HG1 THR A1120       6.086  15.941 -22.042  1.00 33.94           H  \nATOM   3671 HG21 THR A1120       4.157  14.090 -21.595  1.00 34.10           H  \nATOM   3672 HG22 THR A1120       2.778  15.093 -21.197  1.00 34.10           H  \nATOM   3673 HG23 THR A1120       3.789  15.501 -22.580  1.00 34.10           H  \nATOM   3674  N   VAL A1121       2.703  17.617 -18.846  1.00 28.98           N  \nATOM   3675  CA  VAL A1121       1.392  17.805 -18.215  1.00 29.28           C  \nATOM   3676  C   VAL A1121       0.911  19.271 -18.238  1.00 34.54           C  \nATOM   3677  O   VAL A1121      -0.286  19.494 -18.411  1.00 33.68           O  \nATOM   3678  CB  VAL A1121       1.377  17.249 -16.760  1.00 33.58           C  \nATOM   3679  CG1 VAL A1121       0.177  17.681 -15.888  1.00 33.26           C  \nATOM   3680  CG2 VAL A1121       1.457  15.714 -16.784  1.00 32.88           C  \nATOM   3681  H   VAL A1121       3.476  17.441 -18.218  1.00 28.98           H  \nATOM   3682  HA  VAL A1121       0.669  17.224 -18.791  1.00 29.28           H  \nATOM   3683  HB  VAL A1121       2.275  17.603 -16.253  1.00 33.58           H  \nATOM   3684 HG11 VAL A1121       0.163  17.145 -14.938  1.00 33.26           H  \nATOM   3685 HG12 VAL A1121       0.205  18.744 -15.644  1.00 33.26           H  \nATOM   3686 HG13 VAL A1121      -0.765  17.478 -16.396  1.00 33.26           H  \nATOM   3687 HG21 VAL A1121       1.485  15.304 -15.775  1.00 32.88           H  \nATOM   3688 HG22 VAL A1121       0.594  15.285 -17.294  1.00 32.88           H  \nATOM   3689 HG23 VAL A1121       2.350  15.362 -17.300  1.00 32.88           H  \nATOM   3690  N   LEU A1122       1.842  20.235 -18.115  1.00 32.43           N  \nATOM   3691  CA  LEU A1122       1.585  21.672 -18.261  1.00 33.01           C  \nATOM   3692  C   LEU A1122       1.097  22.028 -19.675  1.00 36.61           C  \nATOM   3693  O   LEU A1122       0.147  22.792 -19.813  1.00 35.87           O  \nATOM   3694  CB  LEU A1122       2.865  22.455 -17.871  1.00 35.17           C  \nATOM   3695  CG  LEU A1122       2.831  23.990 -18.076  1.00 42.10           C  \nATOM   3696  CD1 LEU A1122       1.697  24.666 -17.275  1.00 43.87           C  \nATOM   3697  CD2 LEU A1122       4.213  24.615 -17.788  1.00 45.28           C  \nATOM   3698  H   LEU A1122       2.802  19.973 -17.936  1.00 32.43           H  \nATOM   3699  HA  LEU A1122       0.790  21.933 -17.561  1.00 33.01           H  \nATOM   3700  HB3 LEU A1122       3.699  22.056 -18.448  1.00 35.17           H  \nATOM   3701  HB2 LEU A1122       3.102  22.243 -16.827  1.00 35.17           H  \nATOM   3702  HG  LEU A1122       2.640  24.189 -19.131  1.00 42.10           H  \nATOM   3703 HD11 LEU A1122       2.023  25.573 -16.765  1.00 43.87           H  \nATOM   3704 HD12 LEU A1122       0.879  24.954 -17.937  1.00 43.87           H  \nATOM   3705 HD13 LEU A1122       1.280  24.004 -16.515  1.00 43.87           H  \nATOM   3706 HD21 LEU A1122       4.553  25.207 -18.639  1.00 45.28           H  \nATOM   3707 HD22 LEU A1122       4.206  25.272 -16.919  1.00 45.28           H  \nATOM   3708 HD23 LEU A1122       4.975  23.858 -17.601  1.00 45.28           H  \nATOM   3709  N   ARG A1123       1.746  21.445 -20.692  1.00 32.17           N  \nATOM   3710  CA  ARG A1123       1.467  21.679 -22.105  1.00 32.60           C  \nATOM   3711  C   ARG A1123       0.200  20.951 -22.588  1.00 33.95           C  \nATOM   3712  O   ARG A1123      -0.493  21.472 -23.462  1.00 32.13           O  \nATOM   3713  CB  ARG A1123       2.736  21.303 -22.888  1.00 37.04           C  \nATOM   3714  CG  ARG A1123       2.892  21.997 -24.254  1.00 59.77           C  \nATOM   3715  CD  ARG A1123       4.363  22.141 -24.691  1.00 74.58           C  \nATOM   3716  NE  ARG A1123       5.119  23.067 -23.819  1.00 91.08           N  \nATOM   3717  CZ  ARG A1123       5.295  24.392 -23.966  1.00107.84           C  \nATOM   3718  NH1 ARG A1123       4.844  25.057 -25.040  1.00 95.16           N  \nATOM   3719  NH2 ARG A1123       5.939  25.067 -23.005  1.00 96.44           N1+\nATOM   3720  H   ARG A1123       2.526  20.832 -20.491  1.00 32.17           H  \nATOM   3721  HA  ARG A1123       1.305  22.752 -22.216  1.00 32.60           H  \nATOM   3722  HB3 ARG A1123       2.821  20.221 -22.983  1.00 37.04           H  \nATOM   3723  HB2 ARG A1123       3.583  21.603 -22.275  1.00 37.04           H  \nATOM   3724  HG3 ARG A1123       2.490  23.004 -24.140  1.00 59.77           H  \nATOM   3725  HG2 ARG A1123       2.293  21.525 -25.033  1.00 59.77           H  \nATOM   3726  HD3 ARG A1123       4.461  22.348 -25.756  1.00 74.58           H  \nATOM   3727  HD2 ARG A1123       4.854  21.184 -24.530  1.00 74.58           H  \nATOM   3728  HE  ARG A1123       5.455  22.651 -22.962  1.00 91.08           H  \nATOM   3729 HH12 ARG A1123       4.979  26.054 -25.126  1.00 95.16           H  \nATOM   3730 HH11 ARG A1123       4.356  24.557 -25.770  1.00 95.16           H  \nATOM   3731 HH22 ARG A1123       6.066  26.066 -23.080  1.00 96.44           H  \nATOM   3732 HH21 ARG A1123       6.276  24.592 -22.179  1.00 96.44           H  \nATOM   3733  N   LEU A1124      -0.112  19.805 -21.954  1.00 29.63           N  \nATOM   3734  CA  LEU A1124      -1.388  19.096 -22.055  1.00 27.63           C  \nATOM   3735  C   LEU A1124      -2.543  19.916 -21.454  1.00 32.17           C  \nATOM   3736  O   LEU A1124      -3.597  19.988 -22.075  1.00 30.80           O  \nATOM   3737  CB  LEU A1124      -1.248  17.704 -21.396  1.00 26.83           C  \nATOM   3738  CG  LEU A1124      -2.516  16.823 -21.323  1.00 30.02           C  \nATOM   3739  CD1 LEU A1124      -3.141  16.553 -22.711  1.00 28.94           C  \nATOM   3740  CD2 LEU A1124      -2.214  15.525 -20.543  1.00 30.63           C  \nATOM   3741  H   LEU A1124       0.538  19.434 -21.274  1.00 29.63           H  \nATOM   3742  HA  LEU A1124      -1.597  18.955 -23.116  1.00 27.63           H  \nATOM   3743  HB3 LEU A1124      -0.887  17.844 -20.379  1.00 26.83           H  \nATOM   3744  HB2 LEU A1124      -0.465  17.145 -21.905  1.00 26.83           H  \nATOM   3745  HG  LEU A1124      -3.267  17.355 -20.740  1.00 30.02           H  \nATOM   3746 HD11 LEU A1124      -3.376  15.502 -22.874  1.00 28.94           H  \nATOM   3747 HD12 LEU A1124      -4.075  17.103 -22.827  1.00 28.94           H  \nATOM   3748 HD13 LEU A1124      -2.488  16.857 -23.527  1.00 28.94           H  \nATOM   3749 HD21 LEU A1124      -2.585  14.631 -21.039  1.00 30.63           H  \nATOM   3750 HD22 LEU A1124      -1.145  15.379 -20.382  1.00 30.63           H  \nATOM   3751 HD23 LEU A1124      -2.678  15.549 -19.558  1.00 30.63           H  \nATOM   3752  N   THR A1125      -2.322  20.555 -20.291  1.00 30.97           N  \nATOM   3753  CA  THR A1125      -3.292  21.455 -19.661  1.00 31.58           C  \nATOM   3754  C   THR A1125      -3.564  22.701 -20.526  1.00 35.29           C  \nATOM   3755  O   THR A1125      -4.728  23.042 -20.712  1.00 34.46           O  \nATOM   3756  CB  THR A1125      -2.835  21.924 -18.252  1.00 40.93           C  \nATOM   3757  OG1 THR A1125      -2.671  20.794 -17.421  1.00 39.64           O  \nATOM   3758  CG2 THR A1125      -3.789  22.892 -17.526  1.00 41.19           C  \nATOM   3759  H   THR A1125      -1.430  20.452 -19.824  1.00 30.97           H  \nATOM   3760  HA  THR A1125      -4.231  20.908 -19.552  1.00 31.58           H  \nATOM   3761  HB  THR A1125      -1.860  22.404 -18.322  1.00 40.93           H  \nATOM   3762  HG1 THR A1125      -1.976  20.241 -17.794  1.00 39.64           H  \nATOM   3763 HG21 THR A1125      -3.407  23.132 -16.535  1.00 41.19           H  \nATOM   3764 HG22 THR A1125      -3.900  23.840 -18.054  1.00 41.19           H  \nATOM   3765 HG23 THR A1125      -4.782  22.457 -17.407  1.00 41.19           H  \nATOM   3766  N   GLU A1126      -2.501  23.309 -21.082  1.00 33.17           N  \nATOM   3767  CA  GLU A1126      -2.564  24.482 -21.955  1.00 34.02           C  \nATOM   3768  C   GLU A1126      -3.392  24.279 -23.235  1.00 37.28           C  \nATOM   3769  O   GLU A1126      -4.216  25.145 -23.522  1.00 35.08           O  \nATOM   3770  CB  GLU A1126      -1.143  24.993 -22.262  1.00 36.83           C  \nATOM   3771  CG  GLU A1126      -0.506  25.747 -21.070  1.00 44.51           C  \nATOM   3772  CD  GLU A1126       0.990  26.084 -21.204  1.00 58.80           C  \nATOM   3773  OE1 GLU A1126       1.481  26.792 -20.298  1.00 49.54           O  \nATOM   3774  OE2 GLU A1126       1.634  25.646 -22.185  1.00 45.75           O1-\nATOM   3775  H   GLU A1126      -1.572  22.967 -20.873  1.00 33.17           H  \nATOM   3776  HA  GLU A1126      -3.075  25.262 -21.386  1.00 34.02           H  \nATOM   3777  HB3 GLU A1126      -1.153  25.649 -23.133  1.00 36.83           H  \nATOM   3778  HB2 GLU A1126      -0.524  24.139 -22.539  1.00 36.83           H  \nATOM   3779  HG3 GLU A1126      -0.641  25.179 -20.151  1.00 44.51           H  \nATOM   3780  HG2 GLU A1126      -1.051  26.680 -20.919  1.00 44.51           H  \nATOM   3781  N   LEU A1127      -3.213  23.152 -23.954  1.00 34.11           N  \nATOM   3782  CA  LEU A1127      -4.014  22.845 -25.150  1.00 33.79           C  \nATOM   3783  C   LEU A1127      -5.491  22.548 -24.835  1.00 35.23           C  \nATOM   3784  O   LEU A1127      -6.346  22.943 -25.626  1.00 34.81           O  \nATOM   3785  CB  LEU A1127      -3.321  21.794 -26.055  1.00 33.69           C  \nATOM   3786  CG  LEU A1127      -3.213  20.336 -25.549  1.00 37.11           C  \nATOM   3787  CD1 LEU A1127      -4.490  19.501 -25.786  1.00 35.27           C  \nATOM   3788  CD2 LEU A1127      -1.978  19.633 -26.146  1.00 40.08           C  \nATOM   3789  H   LEU A1127      -2.527  22.467 -23.671  1.00 34.11           H  \nATOM   3790  HA  LEU A1127      -4.026  23.762 -25.744  1.00 33.79           H  \nATOM   3791  HB3 LEU A1127      -2.314  22.167 -26.235  1.00 33.69           H  \nATOM   3792  HB2 LEU A1127      -3.792  21.791 -27.039  1.00 33.69           H  \nATOM   3793  HG  LEU A1127      -3.048  20.386 -24.476  1.00 37.11           H  \nATOM   3794 HD11 LEU A1127      -4.753  18.940 -24.890  1.00 35.27           H  \nATOM   3795 HD12 LEU A1127      -5.351  20.108 -26.056  1.00 35.27           H  \nATOM   3796 HD13 LEU A1127      -4.367  18.778 -26.592  1.00 35.27           H  \nATOM   3797 HD21 LEU A1127      -2.160  18.585 -26.384  1.00 40.08           H  \nATOM   3798 HD22 LEU A1127      -1.629  20.117 -27.058  1.00 40.08           H  \nATOM   3799 HD23 LEU A1127      -1.156  19.657 -25.433  1.00 40.08           H  \nATOM   3800  N   LEU A1128      -5.779  21.925 -23.675  1.00 30.68           N  \nATOM   3801  CA  LEU A1128      -7.149  21.698 -23.203  1.00 29.82           C  \nATOM   3802  C   LEU A1128      -7.868  23.003 -22.796  1.00 37.95           C  \nATOM   3803  O   LEU A1128      -9.078  23.099 -23.001  1.00 37.53           O  \nATOM   3804  CB  LEU A1128      -7.182  20.679 -22.042  1.00 28.63           C  \nATOM   3805  CG  LEU A1128      -6.730  19.245 -22.401  1.00 31.65           C  \nATOM   3806  CD1 LEU A1128      -6.586  18.387 -21.126  1.00 31.42           C  \nATOM   3807  CD2 LEU A1128      -7.611  18.567 -23.467  1.00 31.56           C  \nATOM   3808  H   LEU A1128      -5.032  21.625 -23.062  1.00 30.68           H  \nATOM   3809  HA  LEU A1128      -7.696  21.275 -24.042  1.00 29.82           H  \nATOM   3810  HB3 LEU A1128      -8.195  20.625 -21.642  1.00 28.63           H  \nATOM   3811  HB2 LEU A1128      -6.560  21.058 -21.229  1.00 28.63           H  \nATOM   3812  HG  LEU A1128      -5.745  19.305 -22.850  1.00 31.65           H  \nATOM   3813 HD11 LEU A1128      -5.551  18.077 -20.987  1.00 31.42           H  \nATOM   3814 HD12 LEU A1128      -6.877  18.930 -20.226  1.00 31.42           H  \nATOM   3815 HD13 LEU A1128      -7.192  17.482 -21.154  1.00 31.42           H  \nATOM   3816 HD21 LEU A1128      -7.634  17.483 -23.356  1.00 31.56           H  \nATOM   3817 HD22 LEU A1128      -8.638  18.927 -23.434  1.00 31.56           H  \nATOM   3818 HD23 LEU A1128      -7.222  18.763 -24.465  1.00 31.56           H  \nATOM   3819  N   GLU A1129      -7.122  23.993 -22.277  1.00 37.30           N  \nATOM   3820  CA  GLU A1129      -7.628  25.331 -21.956  1.00 38.66           C  \nATOM   3821  C   GLU A1129      -7.904  26.197 -23.204  1.00 42.10           C  \nATOM   3822  O   GLU A1129      -8.801  27.037 -23.141  1.00 42.78           O  \nATOM   3823  CB  GLU A1129      -6.670  26.032 -20.967  1.00 41.41           C  \nATOM   3824  CG  GLU A1129      -6.622  25.388 -19.556  1.00 54.54           C  \nATOM   3825  CD  GLU A1129      -7.801  25.679 -18.612  1.00 90.90           C  \nATOM   3826  OE1 GLU A1129      -8.677  26.501 -18.958  1.00 94.26           O  \nATOM   3827  OE2 GLU A1129      -7.797  25.060 -17.524  1.00 91.13           O1-\nATOM   3828  H   GLU A1129      -6.137  23.838 -22.107  1.00 37.30           H  \nATOM   3829  HA  GLU A1129      -8.591  25.207 -21.456  1.00 38.66           H  \nATOM   3830  HB3 GLU A1129      -6.907  27.094 -20.890  1.00 41.41           H  \nATOM   3831  HB2 GLU A1129      -5.662  26.002 -21.380  1.00 41.41           H  \nATOM   3832  HG3 GLU A1129      -5.711  25.719 -19.055  1.00 54.54           H  \nATOM   3833  HG2 GLU A1129      -6.543  24.307 -19.642  1.00 54.54           H  \nATOM   3834  N   ARG A1130      -7.195  25.946 -24.324  1.00 37.87           N  \nATOM   3835  CA  ARG A1130      -7.499  26.535 -25.639  1.00 37.84           C  \nATOM   3836  C   ARG A1130      -8.697  25.873 -26.351  1.00 41.63           C  \nATOM   3837  O   ARG A1130      -9.138  26.406 -27.369  1.00 42.60           O  \nATOM   3838  CB  ARG A1130      -6.265  26.498 -26.566  1.00 37.09           C  \nATOM   3839  CG  ARG A1130      -5.073  27.342 -26.080  1.00 43.14           C  \nATOM   3840  CD  ARG A1130      -4.008  27.588 -27.166  1.00 47.74           C  \nATOM   3841  NE  ARG A1130      -3.331  26.356 -27.610  1.00 51.85           N  \nATOM   3842  CZ  ARG A1130      -2.239  25.772 -27.088  1.00 60.61           C  \nATOM   3843  NH1 ARG A1130      -1.609  26.260 -26.010  1.00 54.41           N  \nATOM   3844  NH2 ARG A1130      -1.770  24.664 -27.673  1.00 41.74           N1+\nATOM   3845  H   ARG A1130      -6.458  25.254 -24.302  1.00 37.87           H  \nATOM   3846  HA  ARG A1130      -7.769  27.582 -25.491  1.00 37.84           H  \nATOM   3847  HB3 ARG A1130      -6.554  26.873 -27.549  1.00 37.09           H  \nATOM   3848  HB2 ARG A1130      -5.950  25.465 -26.724  1.00 37.09           H  \nATOM   3849  HG3 ARG A1130      -4.609  26.808 -25.257  1.00 43.14           H  \nATOM   3850  HG2 ARG A1130      -5.394  28.295 -25.660  1.00 43.14           H  \nATOM   3851  HD3 ARG A1130      -3.308  28.371 -26.873  1.00 47.74           H  \nATOM   3852  HD2 ARG A1130      -4.508  27.966 -28.058  1.00 47.74           H  \nATOM   3853  HE  ARG A1130      -3.771  25.882 -28.391  1.00 51.85           H  \nATOM   3854 HH12 ARG A1130      -0.771  25.815 -25.659  1.00 54.41           H  \nATOM   3855 HH11 ARG A1130      -1.965  27.084 -25.548  1.00 54.41           H  \nATOM   3856 HH22 ARG A1130      -0.975  24.169 -27.288  1.00 41.74           H  \nATOM   3857 HH21 ARG A1130      -2.235  24.287 -28.490  1.00 41.74           H  \nATOM   3858  N   GLY A1131      -9.207  24.747 -25.824  1.00 36.22           N  \nATOM   3859  CA  GLY A1131     -10.366  24.048 -26.376  1.00 35.40           C  \nATOM   3860  C   GLY A1131      -9.974  22.960 -27.390  1.00 37.10           C  \nATOM   3861  O   GLY A1131     -10.871  22.416 -28.034  1.00 36.00           O  \nATOM   3862  H   GLY A1131      -8.801  24.371 -24.979  1.00 36.22           H  \nATOM   3863  HA3 GLY A1131     -11.060  24.747 -26.845  1.00 35.40           H  \nATOM   3864  HA2 GLY A1131     -10.909  23.585 -25.554  1.00 35.40           H  \nATOM   3865  N   GLU A1132      -8.676  22.623 -27.532  1.00 32.13           N  \nATOM   3866  CA  GLU A1132      -8.205  21.537 -28.397  1.00 31.71           C  \nATOM   3867  C   GLU A1132      -8.525  20.162 -27.793  1.00 33.67           C  \nATOM   3868  O   GLU A1132      -8.257  19.935 -26.613  1.00 31.64           O  \nATOM   3869  CB  GLU A1132      -6.694  21.640 -28.670  1.00 33.82           C  \nATOM   3870  CG  GLU A1132      -6.247  22.982 -29.287  1.00 48.90           C  \nATOM   3871  CD  GLU A1132      -4.778  23.022 -29.744  1.00 65.96           C  \nATOM   3872  OE1 GLU A1132      -4.195  21.948 -30.019  1.00 51.67           O  \nATOM   3873  OE2 GLU A1132      -4.249  24.151 -29.826  1.00 68.15           O1-\nATOM   3874  H   GLU A1132      -7.970  23.086 -26.976  1.00 32.13           H  \nATOM   3875  HA  GLU A1132      -8.720  21.634 -29.353  1.00 31.71           H  \nATOM   3876  HB3 GLU A1132      -6.426  20.815 -29.330  1.00 33.82           H  \nATOM   3877  HB2 GLU A1132      -6.135  21.468 -27.752  1.00 33.82           H  \nATOM   3878  HG3 GLU A1132      -6.417  23.786 -28.569  1.00 48.90           H  \nATOM   3879  HG2 GLU A1132      -6.869  23.208 -30.154  1.00 48.90           H  \nATOM   3880  N   ARG A1133      -9.080  19.277 -28.631  1.00 30.19           N  \nATOM   3881  CA  ARG A1133      -9.515  17.933 -28.263  1.00 28.71           C  \nATOM   3882  C   ARG A1133      -8.945  16.892 -29.230  1.00 31.32           C  \nATOM   3883  O   ARG A1133      -8.505  17.230 -30.331  1.00 31.52           O  \nATOM   3884  CB  ARG A1133     -11.063  17.876 -28.305  1.00 28.69           C  \nATOM   3885  CG  ARG A1133     -11.789  18.793 -27.309  1.00 29.69           C  \nATOM   3886  CD  ARG A1133     -11.505  18.482 -25.831  1.00 29.80           C  \nATOM   3887  NE  ARG A1133     -12.141  19.468 -24.947  1.00 30.88           N  \nATOM   3888  CZ  ARG A1133     -11.592  20.560 -24.393  1.00 38.38           C  \nATOM   3889  NH1 ARG A1133     -10.317  20.890 -24.594  1.00 29.25           N  \nATOM   3890  NH2 ARG A1133     -12.340  21.342 -23.612  1.00 30.33           N1+\nATOM   3891  H   ARG A1133      -9.223  19.537 -29.599  1.00 30.19           H  \nATOM   3892  HA  ARG A1133      -9.150  17.666 -27.270  1.00 28.71           H  \nATOM   3893  HB3 ARG A1133     -11.401  16.856 -28.123  1.00 28.69           H  \nATOM   3894  HB2 ARG A1133     -11.407  18.118 -29.312  1.00 28.69           H  \nATOM   3895  HG3 ARG A1133     -12.848  18.588 -27.471  1.00 29.69           H  \nATOM   3896  HG2 ARG A1133     -11.659  19.851 -27.538  1.00 29.69           H  \nATOM   3897  HD3 ARG A1133     -10.455  18.302 -25.603  1.00 29.80           H  \nATOM   3898  HD2 ARG A1133     -12.018  17.554 -25.586  1.00 29.80           H  \nATOM   3899  HE  ARG A1133     -13.129  19.321 -24.780  1.00 30.88           H  \nATOM   3900 HH12 ARG A1133      -9.923  21.702 -24.135  1.00 29.25           H  \nATOM   3901 HH11 ARG A1133      -9.733  20.336 -25.209  1.00 29.25           H  \nATOM   3902 HH22 ARG A1133     -11.950  22.154 -23.148  1.00 30.33           H  \nATOM   3903 HH21 ARG A1133     -13.297  21.079 -23.419  1.00 30.33           H  \nATOM   3904  N   LEU A1134      -9.055  15.621 -28.811  1.00 26.90           N  \nATOM   3905  CA  LEU A1134      -8.918  14.425 -29.644  1.00 26.48           C  \nATOM   3906  C   LEU A1134      -9.928  14.480 -30.815  1.00 31.07           C  \nATOM   3907  O   LEU A1134     -11.084  14.845 -30.581  1.00 29.22           O  \nATOM   3908  CB  LEU A1134      -9.227  13.190 -28.766  1.00 25.80           C  \nATOM   3909  CG  LEU A1134      -8.165  12.863 -27.694  1.00 28.43           C  \nATOM   3910  CD1 LEU A1134      -8.717  11.905 -26.614  1.00 27.29           C  \nATOM   3911  CD2 LEU A1134      -6.854  12.349 -28.325  1.00 31.24           C  \nATOM   3912  H   LEU A1134      -9.416  15.453 -27.879  1.00 26.90           H  \nATOM   3913  HA  LEU A1134      -7.887  14.406 -29.992  1.00 26.48           H  \nATOM   3914  HB3 LEU A1134      -9.362  12.309 -29.394  1.00 25.80           H  \nATOM   3915  HB2 LEU A1134     -10.189  13.350 -28.280  1.00 25.80           H  \nATOM   3916  HG  LEU A1134      -7.928  13.796 -27.183  1.00 28.43           H  \nATOM   3917 HD11 LEU A1134      -8.755  12.402 -25.644  1.00 27.29           H  \nATOM   3918 HD12 LEU A1134      -9.729  11.570 -26.840  1.00 27.29           H  \nATOM   3919 HD13 LEU A1134      -8.107  11.011 -26.487  1.00 27.29           H  \nATOM   3920 HD21 LEU A1134      -5.992  12.885 -27.926  1.00 31.24           H  \nATOM   3921 HD22 LEU A1134      -6.697  11.289 -28.144  1.00 31.24           H  \nATOM   3922 HD23 LEU A1134      -6.840  12.471 -29.408  1.00 31.24           H  \nATOM   3923  N   PRO A1135      -9.478  14.161 -32.051  1.00 29.27           N  \nATOM   3924  CA  PRO A1135     -10.320  14.269 -33.257  1.00 29.71           C  \nATOM   3925  C   PRO A1135     -11.484  13.263 -33.276  1.00 33.63           C  \nATOM   3926  O   PRO A1135     -11.495  12.320 -32.486  1.00 33.51           O  \nATOM   3927  CB  PRO A1135      -9.324  14.011 -34.400  1.00 32.38           C  \nATOM   3928  CG  PRO A1135      -8.283  13.086 -33.794  1.00 35.83           C  \nATOM   3929  CD  PRO A1135      -8.159  13.605 -32.368  1.00 30.45           C  \nATOM   3930  HA  PRO A1135     -10.734  15.274 -33.346  1.00 29.71           H  \nATOM   3931  HB3 PRO A1135      -8.853  14.953 -34.686  1.00 32.38           H  \nATOM   3932  HB2 PRO A1135      -9.779  13.590 -35.298  1.00 32.38           H  \nATOM   3933  HG3 PRO A1135      -7.340  13.077 -34.339  1.00 35.83           H  \nATOM   3934  HG2 PRO A1135      -8.673  12.068 -33.776  1.00 35.83           H  \nATOM   3935  HD2 PRO A1135      -7.859  12.805 -31.691  1.00 30.45           H  \nATOM   3936  HD3 PRO A1135      -7.419  14.404 -32.314  1.00 30.45           H  \nATOM   3937  N   ARG A1136     -12.446  13.482 -34.185  1.00 30.63           N  \nATOM   3938  CA  ARG A1136     -13.533  12.542 -34.459  1.00 30.68           C  \nATOM   3939  C   ARG A1136     -12.962  11.261 -35.110  1.00 36.51           C  \nATOM   3940  O   ARG A1136     -12.376  11.380 -36.188  1.00 36.37           O  \nATOM   3941  CB  ARG A1136     -14.560  13.241 -35.376  1.00 28.69           C  \nATOM   3942  CG  ARG A1136     -15.806  12.379 -35.679  1.00 33.51           C  \nATOM   3943  CD  ARG A1136     -16.847  13.056 -36.590  1.00 37.56           C  \nATOM   3944  NE  ARG A1136     -16.358  13.227 -37.972  1.00 52.22           N  \nATOM   3945  CZ  ARG A1136     -16.281  12.291 -38.939  1.00 71.16           C  \nATOM   3946  NH1 ARG A1136     -15.733  12.618 -40.115  1.00 60.58           N  \nATOM   3947  NH2 ARG A1136     -16.728  11.038 -38.774  1.00 53.25           N1+\nATOM   3948  H   ARG A1136     -12.389  14.291 -34.792  1.00 30.63           H  \nATOM   3949  HA  ARG A1136     -14.039  12.330 -33.523  1.00 30.68           H  \nATOM   3950  HB3 ARG A1136     -14.076  13.535 -36.309  1.00 28.69           H  \nATOM   3951  HB2 ARG A1136     -14.883  14.169 -34.905  1.00 28.69           H  \nATOM   3952  HG3 ARG A1136     -16.278  12.004 -34.771  1.00 33.51           H  \nATOM   3953  HG2 ARG A1136     -15.454  11.489 -36.199  1.00 33.51           H  \nATOM   3954  HD3 ARG A1136     -16.998  14.074 -36.231  1.00 37.56           H  \nATOM   3955  HD2 ARG A1136     -17.825  12.577 -36.532  1.00 37.56           H  \nATOM   3956  HE  ARG A1136     -15.982  14.141 -38.177  1.00 52.22           H  \nATOM   3957 HH12 ARG A1136     -15.652  11.923 -40.844  1.00 60.58           H  \nATOM   3958 HH11 ARG A1136     -15.382  13.551 -40.280  1.00 60.58           H  \nATOM   3959 HH22 ARG A1136     -16.634  10.363 -39.522  1.00 53.25           H  \nATOM   3960 HH21 ARG A1136     -17.185  10.766 -37.912  1.00 53.25           H  \nATOM   3961  N   PRO A1137     -13.133  10.074 -34.473  1.00 34.19           N  \nATOM   3962  CA  PRO A1137     -12.794   8.777 -35.100  1.00 34.79           C  \nATOM   3963  C   PRO A1137     -13.518   8.551 -36.438  1.00 39.69           C  \nATOM   3964  O   PRO A1137     -14.654   9.000 -36.591  1.00 37.63           O  \nATOM   3965  CB  PRO A1137     -13.235   7.730 -34.059  1.00 35.61           C  \nATOM   3966  CG  PRO A1137     -13.270   8.479 -32.741  1.00 38.50           C  \nATOM   3967  CD  PRO A1137     -13.716   9.872 -33.145  1.00 34.62           C  \nATOM   3968  HA  PRO A1137     -11.711   8.740 -35.234  1.00 34.79           H  \nATOM   3969  HB3 PRO A1137     -12.572   6.866 -34.029  1.00 35.61           H  \nATOM   3970  HB2 PRO A1137     -14.230   7.351 -34.286  1.00 35.61           H  \nATOM   3971  HG3 PRO A1137     -12.259   8.534 -32.343  1.00 38.50           H  \nATOM   3972  HG2 PRO A1137     -13.904   8.021 -31.984  1.00 38.50           H  \nATOM   3973  HD2 PRO A1137     -14.802   9.926 -33.221  1.00 34.62           H  \nATOM   3974  HD3 PRO A1137     -13.386  10.595 -32.401  1.00 34.62           H  \nATOM   3975  N   ASP A1138     -12.853   7.868 -37.383  1.00 39.28           N  \nATOM   3976  CA  ASP A1138     -13.426   7.546 -38.693  1.00 41.69           C  \nATOM   3977  C   ASP A1138     -14.685   6.666 -38.532  1.00 47.14           C  \nATOM   3978  O   ASP A1138     -14.612   5.633 -37.867  1.00 46.83           O  \nATOM   3979  CB  ASP A1138     -12.387   6.871 -39.624  1.00 45.59           C  \nATOM   3980  CG  ASP A1138     -12.841   6.652 -41.080  1.00 68.02           C  \nATOM   3981  OD1 ASP A1138     -13.557   7.527 -41.620  1.00 70.17           O  \nATOM   3982  OD2 ASP A1138     -12.365   5.662 -41.676  1.00 78.75           O1-\nATOM   3983  H   ASP A1138     -11.925   7.516 -37.195  1.00 39.28           H  \nATOM   3984  HA  ASP A1138     -13.719   8.501 -39.135  1.00 41.69           H  \nATOM   3985  HB3 ASP A1138     -12.074   5.921 -39.186  1.00 45.59           H  \nATOM   3986  HB2 ASP A1138     -11.481   7.478 -39.648  1.00 45.59           H  \nATOM   3987  N   LYS A1139     -15.800   7.116 -39.131  1.00 45.46           N  \nATOM   3988  CA  LYS A1139     -17.138   6.507 -39.107  1.00 46.10           C  \nATOM   3989  C   LYS A1139     -17.911   6.699 -37.781  1.00 48.03           C  \nATOM   3990  O   LYS A1139     -19.010   6.158 -37.663  1.00 49.27           O  \nATOM   3991  CB  LYS A1139     -17.123   5.027 -39.585  1.00 50.14           C  \nATOM   3992  CG  LYS A1139     -16.482   4.798 -40.972  1.00 69.71           C  \nATOM   3993  CD  LYS A1139     -17.332   5.278 -42.167  1.00 83.93           C  \nATOM   3994  CE  LYS A1139     -18.382   4.259 -42.647  1.00 98.25           C  \nATOM   3995  NZ  LYS A1139     -17.770   3.130 -43.374  1.00107.70           N1+\nATOM   3996  H   LYS A1139     -15.734   7.966 -39.674  1.00 45.46           H  \nATOM   3997  HA  LYS A1139     -17.712   7.081 -39.834  1.00 46.10           H  \nATOM   3998  HB3 LYS A1139     -18.137   4.626 -39.598  1.00 50.14           H  \nATOM   3999  HB2 LYS A1139     -16.590   4.415 -38.858  1.00 50.14           H  \nATOM   4000  HG3 LYS A1139     -16.252   3.738 -41.079  1.00 69.71           H  \nATOM   4001  HG2 LYS A1139     -15.512   5.290 -41.017  1.00 69.71           H  \nATOM   4002  HD3 LYS A1139     -16.672   5.557 -42.990  1.00 83.93           H  \nATOM   4003  HD2 LYS A1139     -17.850   6.199 -41.901  1.00 83.93           H  \nATOM   4004  HE3 LYS A1139     -19.082   4.749 -43.326  1.00 98.25           H  \nATOM   4005  HE2 LYS A1139     -18.968   3.879 -41.809  1.00 98.25           H  \nATOM   4006  HZ1 LYS A1139     -17.132   2.641 -42.762  1.00107.70           H  \nATOM   4007  HZ2 LYS A1139     -18.490   2.494 -43.686  1.00107.70           H  \nATOM   4008  HZ3 LYS A1139     -17.261   3.480 -44.174  1.00107.70           H  \nATOM   4009  N   CYS A1140     -17.379   7.501 -36.836  1.00 40.64           N  \nATOM   4010  CA  CYS A1140     -18.096   7.964 -35.642  1.00 37.44           C  \nATOM   4011  C   CYS A1140     -19.135   9.023 -36.075  1.00 40.28           C  \nATOM   4012  O   CYS A1140     -18.716  10.015 -36.674  1.00 40.75           O  \nATOM   4013  CB  CYS A1140     -17.119   8.571 -34.608  1.00 35.57           C  \nATOM   4014  SG  CYS A1140     -17.956   9.233 -33.132  1.00 37.88           S  \nATOM   4015  H   CYS A1140     -16.464   7.904 -36.986  1.00 40.64           H  \nATOM   4016  HA  CYS A1140     -18.547   7.094 -35.169  1.00 37.44           H  \nATOM   4017  HB3 CYS A1140     -16.551   9.391 -35.044  1.00 35.57           H  \nATOM   4018  HB2 CYS A1140     -16.407   7.814 -34.285  1.00 35.57           H  \nATOM   4019  HG  CYS A1140     -18.601  10.222 -33.759  1.00 37.88           H  \nATOM   4020  N   PRO A1141     -20.442   8.825 -35.776  1.00 34.69           N  \nATOM   4021  CA  PRO A1141     -21.483   9.846 -36.018  1.00 34.83           C  \nATOM   4022  C   PRO A1141     -21.161  11.214 -35.391  1.00 36.98           C  \nATOM   4023  O   PRO A1141     -20.604  11.262 -34.294  1.00 34.16           O  \nATOM   4024  CB  PRO A1141     -22.754   9.238 -35.404  1.00 36.57           C  \nATOM   4025  CG  PRO A1141     -22.512   7.741 -35.389  1.00 40.74           C  \nATOM   4026  CD  PRO A1141     -21.014   7.635 -35.148  1.00 36.09           C  \nATOM   4027  HA  PRO A1141     -21.603   9.941 -37.099  1.00 34.83           H  \nATOM   4028  HB3 PRO A1141     -23.645   9.500 -35.973  1.00 36.57           H  \nATOM   4029  HB2 PRO A1141     -22.903   9.592 -34.384  1.00 36.57           H  \nATOM   4030  HG3 PRO A1141     -22.751   7.330 -36.371  1.00 40.74           H  \nATOM   4031  HG2 PRO A1141     -23.108   7.209 -34.648  1.00 40.74           H  \nATOM   4032  HD2 PRO A1141     -20.788   7.650 -34.081  1.00 36.09           H  \nATOM   4033  HD3 PRO A1141     -20.634   6.709 -35.576  1.00 36.09           H  \nATOM   4034  N   ALA A1142     -21.496  12.292 -36.118  1.00 34.46           N  \nATOM   4035  CA  ALA A1142     -21.237  13.677 -35.716  1.00 34.01           C  \nATOM   4036  C   ALA A1142     -21.858  14.063 -34.363  1.00 35.94           C  \nATOM   4037  O   ALA A1142     -21.196  14.741 -33.582  1.00 33.77           O  \nATOM   4038  CB  ALA A1142     -21.717  14.626 -36.823  1.00 35.94           C  \nATOM   4039  H   ALA A1142     -21.956  12.168 -37.008  1.00 34.46           H  \nATOM   4040  HA  ALA A1142     -20.155  13.788 -35.623  1.00 34.01           H  \nATOM   4041  HB1 ALA A1142     -21.528  15.667 -36.559  1.00 35.94           H  \nATOM   4042  HB2 ALA A1142     -21.199  14.427 -37.761  1.00 35.94           H  \nATOM   4043  HB3 ALA A1142     -22.788  14.519 -37.005  1.00 35.94           H  \nATOM   4044  N   GLU A1143     -23.085  13.585 -34.095  1.00 34.04           N  \nATOM   4045  CA  GLU A1143     -23.816  13.835 -32.853  1.00 34.34           C  \nATOM   4046  C   GLU A1143     -23.305  12.992 -31.664  1.00 35.13           C  \nATOM   4047  O   GLU A1143     -23.390  13.458 -30.528  1.00 31.94           O  \nATOM   4048  CB  GLU A1143     -25.318  13.650 -33.135  1.00 37.10           C  \nATOM   4049  CG  GLU A1143     -26.246  14.080 -31.978  1.00 51.53           C  \nATOM   4050  CD  GLU A1143     -27.740  14.125 -32.340  1.00 70.35           C  \nATOM   4051  OE1 GLU A1143     -28.153  13.422 -33.291  1.00 77.38           O  \nATOM   4052  OE2 GLU A1143     -28.460  14.869 -31.638  1.00 51.45           O1-\nATOM   4053  H   GLU A1143     -23.564  13.026 -34.790  1.00 34.04           H  \nATOM   4054  HA  GLU A1143     -23.664  14.883 -32.589  1.00 34.34           H  \nATOM   4055  HB3 GLU A1143     -25.505  12.606 -33.385  1.00 37.10           H  \nATOM   4056  HB2 GLU A1143     -25.577  14.225 -34.027  1.00 37.10           H  \nATOM   4057  HG3 GLU A1143     -25.936  15.065 -31.626  1.00 51.53           H  \nATOM   4058  HG2 GLU A1143     -26.129  13.400 -31.134  1.00 51.53           H  \nATOM   4059  N   VAL A1144     -22.731  11.805 -31.940  1.00 32.23           N  \nATOM   4060  CA  VAL A1144     -22.009  10.987 -30.957  1.00 30.46           C  \nATOM   4061  C   VAL A1144     -20.648  11.617 -30.584  1.00 31.37           C  \nATOM   4062  O   VAL A1144     -20.236  11.503 -29.430  1.00 28.93           O  \nATOM   4063  CB  VAL A1144     -21.807   9.523 -31.459  1.00 34.90           C  \nATOM   4064  CG1 VAL A1144     -20.858   8.650 -30.606  1.00 34.06           C  \nATOM   4065  CG2 VAL A1144     -23.162   8.803 -31.593  1.00 35.48           C  \nATOM   4066  H   VAL A1144     -22.686  11.488 -32.898  1.00 32.23           H  \nATOM   4067  HA  VAL A1144     -22.610  10.949 -30.046  1.00 30.46           H  \nATOM   4068  HB  VAL A1144     -21.371   9.566 -32.457  1.00 34.90           H  \nATOM   4069 HG11 VAL A1144     -20.841   7.622 -30.969  1.00 34.06           H  \nATOM   4070 HG12 VAL A1144     -19.827   9.004 -30.638  1.00 34.06           H  \nATOM   4071 HG13 VAL A1144     -21.173   8.625 -29.562  1.00 34.06           H  \nATOM   4072 HG21 VAL A1144     -23.040   7.798 -31.997  1.00 35.48           H  \nATOM   4073 HG22 VAL A1144     -23.654   8.713 -30.625  1.00 35.48           H  \nATOM   4074 HG23 VAL A1144     -23.843   9.336 -32.256  1.00 35.48           H  \nATOM   4075  N   TYR A1145     -20.010  12.320 -31.540  1.00 28.72           N  \nATOM   4076  CA  TYR A1145     -18.815  13.130 -31.305  1.00 28.17           C  \nATOM   4077  C   TYR A1145     -19.111  14.402 -30.483  1.00 32.85           C  \nATOM   4078  O   TYR A1145     -18.270  14.789 -29.676  1.00 32.29           O  \nATOM   4079  CB  TYR A1145     -18.111  13.449 -32.643  1.00 29.44           C  \nATOM   4080  CG  TYR A1145     -16.805  14.215 -32.495  1.00 31.74           C  \nATOM   4081  CD1 TYR A1145     -15.727  13.605 -31.826  1.00 33.16           C  \nATOM   4082  CD2 TYR A1145     -16.667  15.532 -32.980  1.00 33.69           C  \nATOM   4083  CE1 TYR A1145     -14.533  14.312 -31.597  1.00 33.08           C  \nATOM   4084  CE2 TYR A1145     -15.457  16.230 -32.785  1.00 34.55           C  \nATOM   4085  CZ  TYR A1145     -14.395  15.627 -32.079  1.00 36.66           C  \nATOM   4086  OH  TYR A1145     -13.233  16.310 -31.864  1.00 35.20           O  \nATOM   4087  H   TYR A1145     -20.399  12.353 -32.473  1.00 28.72           H  \nATOM   4088  HA  TYR A1145     -18.129  12.519 -30.716  1.00 28.17           H  \nATOM   4089  HB3 TYR A1145     -18.775  14.007 -33.302  1.00 29.44           H  \nATOM   4090  HB2 TYR A1145     -17.894  12.516 -33.163  1.00 29.44           H  \nATOM   4091  HD1 TYR A1145     -15.827  12.586 -31.495  1.00 33.16           H  \nATOM   4092  HD2 TYR A1145     -17.486  16.012 -33.496  1.00 33.69           H  \nATOM   4093  HE1 TYR A1145     -13.720  13.833 -31.071  1.00 33.08           H  \nATOM   4094  HE2 TYR A1145     -15.352  17.237 -33.161  1.00 34.55           H  \nATOM   4095  HH  TYR A1145     -12.591  15.787 -31.372  1.00 35.20           H  \nATOM   4096  N   HIS A1146     -20.303  15.000 -30.665  1.00 31.34           N  \nATOM   4097  CA  HIS A1146     -20.779  16.145 -29.881  1.00 31.80           C  \nATOM   4098  C   HIS A1146     -21.146  15.778 -28.433  1.00 32.90           C  \nATOM   4099  O   HIS A1146     -20.947  16.611 -27.550  1.00 31.97           O  \nATOM   4100  CB  HIS A1146     -21.955  16.843 -30.592  1.00 33.81           C  \nATOM   4101  CG  HIS A1146     -21.650  17.391 -31.965  1.00 37.86           C  \nATOM   4102  ND1 HIS A1146     -22.623  17.473 -32.968  1.00 40.76           N  \nATOM   4103  CD2 HIS A1146     -20.458  17.881 -32.464  1.00 39.65           C  \nATOM   4104  CE1 HIS A1146     -21.991  17.984 -34.016  1.00 40.91           C  \nATOM   4105  NE2 HIS A1146     -20.706  18.244 -33.776  1.00 40.63           N  \nATOM   4106  H   HIS A1146     -20.940  14.639 -31.363  1.00 31.34           H  \nATOM   4107  HA  HIS A1146     -19.959  16.864 -29.820  1.00 31.80           H  \nATOM   4108  HB3 HIS A1146     -22.316  17.675 -29.985  1.00 33.81           H  \nATOM   4109  HB2 HIS A1146     -22.794  16.152 -30.679  1.00 33.81           H  \nATOM   4110  HD2 HIS A1146     -19.485  17.986 -32.008  1.00 39.65           H  \nATOM   4111  HE1 HIS A1146     -22.472  18.171 -34.965  1.00 40.91           H  \nATOM   4112  HE2 HIS A1146     -20.043  18.638 -34.428  1.00 40.63           H  \nATOM   4113  N   LEU A1147     -21.611  14.536 -28.202  1.00 29.07           N  \nATOM   4114  CA  LEU A1147     -21.778  13.940 -26.872  1.00 28.56           C  \nATOM   4115  C   LEU A1147     -20.424  13.756 -26.160  1.00 31.25           C  \nATOM   4116  O   LEU A1147     -20.338  13.997 -24.958  1.00 29.28           O  \nATOM   4117  CB  LEU A1147     -22.590  12.626 -27.011  1.00 29.23           C  \nATOM   4118  CG  LEU A1147     -22.817  11.793 -25.720  1.00 34.50           C  \nATOM   4119  CD1 LEU A1147     -24.077  10.917 -25.842  1.00 34.68           C  \nATOM   4120  CD2 LEU A1147     -21.606  10.922 -25.312  1.00 36.84           C  \nATOM   4121  H   LEU A1147     -21.788  13.924 -28.986  1.00 29.07           H  \nATOM   4122  HA  LEU A1147     -22.369  14.632 -26.270  1.00 28.56           H  \nATOM   4123  HB3 LEU A1147     -22.149  11.983 -27.771  1.00 29.23           H  \nATOM   4124  HB2 LEU A1147     -23.558  12.917 -27.419  1.00 29.23           H  \nATOM   4125  HG  LEU A1147     -23.013  12.499 -24.911  1.00 34.50           H  \nATOM   4126 HD11 LEU A1147     -24.525  10.753 -24.862  1.00 34.68           H  \nATOM   4127 HD12 LEU A1147     -24.837  11.371 -26.478  1.00 34.68           H  \nATOM   4128 HD13 LEU A1147     -23.850   9.940 -26.269  1.00 34.68           H  \nATOM   4129 HD21 LEU A1147     -21.884   9.888 -25.107  1.00 36.84           H  \nATOM   4130 HD22 LEU A1147     -20.841  10.896 -26.088  1.00 36.84           H  \nATOM   4131 HD23 LEU A1147     -21.140  11.306 -24.405  1.00 36.84           H  \nATOM   4132  N   MET A1148     -19.396  13.361 -26.929  1.00 29.35           N  \nATOM   4133  CA  MET A1148     -18.014  13.182 -26.484  1.00 30.67           C  \nATOM   4134  C   MET A1148     -17.339  14.513 -26.107  1.00 31.09           C  \nATOM   4135  O   MET A1148     -16.638  14.554 -25.099  1.00 28.70           O  \nATOM   4136  CB  MET A1148     -17.240  12.431 -27.592  1.00 34.60           C  \nATOM   4137  CG  MET A1148     -16.460  11.203 -27.102  1.00 40.60           C  \nATOM   4138  SD  MET A1148     -16.144   9.982 -28.405  1.00 46.94           S  \nATOM   4139  CE  MET A1148     -14.969  10.895 -29.430  1.00 42.17           C  \nATOM   4140  H   MET A1148     -19.567  13.172 -27.907  1.00 29.35           H  \nATOM   4141  HA  MET A1148     -18.055  12.563 -25.586  1.00 30.67           H  \nATOM   4142  HB3 MET A1148     -16.552  13.112 -28.095  1.00 34.60           H  \nATOM   4143  HB2 MET A1148     -17.922  12.103 -28.375  1.00 34.60           H  \nATOM   4144  HG3 MET A1148     -17.018  10.688 -26.320  1.00 40.60           H  \nATOM   4145  HG2 MET A1148     -15.515  11.514 -26.657  1.00 40.60           H  \nATOM   4146  HE1 MET A1148     -14.862  10.415 -30.402  1.00 42.17           H  \nATOM   4147  HE2 MET A1148     -15.302  11.918 -29.569  1.00 42.17           H  \nATOM   4148  HE3 MET A1148     -13.997  10.931 -28.953  1.00 42.17           H  \nATOM   4149  N   LYS A1149     -17.598  15.580 -26.886  1.00 27.88           N  \nATOM   4150  CA  LYS A1149     -17.154  16.946 -26.595  1.00 27.39           C  \nATOM   4151  C   LYS A1149     -17.917  17.609 -25.435  1.00 30.73           C  \nATOM   4152  O   LYS A1149     -17.329  18.451 -24.759  1.00 30.19           O  \nATOM   4153  CB  LYS A1149     -17.207  17.818 -27.865  1.00 30.13           C  \nATOM   4154  CG  LYS A1149     -16.108  17.472 -28.889  1.00 40.57           C  \nATOM   4155  CD  LYS A1149     -15.915  18.539 -29.980  1.00 49.92           C  \nATOM   4156  CE  LYS A1149     -15.173  19.793 -29.484  1.00 55.31           C  \nATOM   4157  NZ  LYS A1149     -14.911  20.746 -30.577  1.00 61.18           N1+\nATOM   4158  H   LYS A1149     -18.158  15.460 -27.720  1.00 27.88           H  \nATOM   4159  HA  LYS A1149     -16.112  16.888 -26.279  1.00 27.39           H  \nATOM   4160  HB3 LYS A1149     -17.079  18.859 -27.571  1.00 30.13           H  \nATOM   4161  HB2 LYS A1149     -18.193  17.764 -28.329  1.00 30.13           H  \nATOM   4162  HG3 LYS A1149     -16.348  16.522 -29.364  1.00 40.57           H  \nATOM   4163  HG2 LYS A1149     -15.157  17.313 -28.382  1.00 40.57           H  \nATOM   4164  HD3 LYS A1149     -16.890  18.818 -30.383  1.00 49.92           H  \nATOM   4165  HD2 LYS A1149     -15.361  18.095 -30.805  1.00 49.92           H  \nATOM   4166  HE3 LYS A1149     -14.215  19.514 -29.049  1.00 55.31           H  \nATOM   4167  HE2 LYS A1149     -15.743  20.306 -28.710  1.00 55.31           H  \nATOM   4168  HZ1 LYS A1149     -14.403  21.541 -30.215  1.00 61.18           H  \nATOM   4169  HZ2 LYS A1149     -14.362  20.296 -31.294  1.00 61.18           H  \nATOM   4170  HZ3 LYS A1149     -15.788  21.058 -30.970  1.00 61.18           H  \nATOM   4171  N   ASN A1150     -19.178  17.207 -25.195  1.00 27.52           N  \nATOM   4172  CA  ASN A1150     -19.961  17.623 -24.027  1.00 27.53           C  \nATOM   4173  C   ASN A1150     -19.491  16.903 -22.745  1.00 29.61           C  \nATOM   4174  O   ASN A1150     -19.527  17.504 -21.674  1.00 29.79           O  \nATOM   4175  CB  ASN A1150     -21.466  17.425 -24.321  1.00 28.97           C  \nATOM   4176  CG  ASN A1150     -22.410  17.975 -23.243  1.00 41.34           C  \nATOM   4177  OD1 ASN A1150     -23.302  17.265 -22.787  1.00 34.75           O  \nATOM   4178  ND2 ASN A1150     -22.230  19.234 -22.833  1.00 35.14           N  \nATOM   4179  H   ASN A1150     -19.616  16.537 -25.812  1.00 27.52           H  \nATOM   4180  HA  ASN A1150     -19.788  18.690 -23.883  1.00 27.53           H  \nATOM   4181  HB3 ASN A1150     -21.683  16.367 -24.477  1.00 28.97           H  \nATOM   4182  HB2 ASN A1150     -21.722  17.929 -25.254  1.00 28.97           H  \nATOM   4183 HD22 ASN A1150     -22.824  19.619 -22.112  1.00 35.14           H  \nATOM   4184 HD21 ASN A1150     -21.495  19.813 -23.220  1.00 35.14           H  \nATOM   4185  N   CYS A1151     -18.978  15.668 -22.883  1.00 24.02           N  \nATOM   4186  CA  CYS A1151     -18.226  14.967 -21.839  1.00 24.87           C  \nATOM   4187  C   CYS A1151     -16.843  15.601 -21.590  1.00 28.35           C  \nATOM   4188  O   CYS A1151     -16.282  15.363 -20.527  1.00 26.56           O  \nATOM   4189  CB  CYS A1151     -18.067  13.466 -22.147  1.00 25.12           C  \nATOM   4190  SG  CYS A1151     -19.666  12.631 -21.997  1.00 29.56           S  \nATOM   4191  H   CYS A1151     -19.008  15.218 -23.787  1.00 24.02           H  \nATOM   4192  HA  CYS A1151     -18.778  15.060 -20.903  1.00 24.87           H  \nATOM   4193  HB3 CYS A1151     -17.376  12.992 -21.451  1.00 25.12           H  \nATOM   4194  HB2 CYS A1151     -17.671  13.297 -23.146  1.00 25.12           H  \nATOM   4195  HG  CYS A1151     -20.221  13.209 -23.068  1.00 29.56           H  \nATOM   4196  N   TRP A1152     -16.334  16.407 -22.539  1.00 24.56           N  \nATOM   4197  CA  TRP A1152     -15.064  17.120 -22.440  1.00 24.31           C  \nATOM   4198  C   TRP A1152     -15.252  18.648 -22.357  1.00 28.86           C  \nATOM   4199  O   TRP A1152     -14.462  19.368 -22.962  1.00 29.11           O  \nATOM   4200  CB  TRP A1152     -14.150  16.769 -23.635  1.00 23.52           C  \nATOM   4201  CG  TRP A1152     -13.769  15.351 -23.905  1.00 23.91           C  \nATOM   4202  CD1 TRP A1152     -13.464  14.411 -22.983  1.00 26.64           C  \nATOM   4203  CD2 TRP A1152     -13.493  14.748 -25.205  1.00 24.07           C  \nATOM   4204  NE1 TRP A1152     -13.028  13.271 -23.624  1.00 25.72           N  \nATOM   4205  CE2 TRP A1152     -13.021  13.419 -24.996  1.00 26.84           C  \nATOM   4206  CE3 TRP A1152     -13.581  15.195 -26.545  1.00 25.78           C  \nATOM   4207  CZ2 TRP A1152     -12.651  12.581 -26.063  1.00 25.92           C  \nATOM   4208  CZ3 TRP A1152     -13.229  14.360 -27.624  1.00 27.26           C  \nATOM   4209  CH2 TRP A1152     -12.760  13.055 -27.383  1.00 27.17           C  \nATOM   4210  H   TRP A1152     -16.861  16.563 -23.386  1.00 24.56           H  \nATOM   4211  HA  TRP A1152     -14.549  16.820 -21.531  1.00 24.31           H  \nATOM   4212  HB3 TRP A1152     -13.195  17.278 -23.504  1.00 23.52           H  \nATOM   4213  HB2 TRP A1152     -14.587  17.165 -24.551  1.00 23.52           H  \nATOM   4214  HD1 TRP A1152     -13.530  14.552 -21.914  1.00 26.64           H  \nATOM   4215  HE1 TRP A1152     -12.743  12.443 -23.118  1.00 25.72           H  \nATOM   4216  HE3 TRP A1152     -13.922  16.199 -26.746  1.00 25.78           H  \nATOM   4217  HZ2 TRP A1152     -12.280  11.586 -25.875  1.00 25.92           H  \nATOM   4218  HZ3 TRP A1152     -13.304  14.727 -28.637  1.00 27.26           H  \nATOM   4219  HH2 TRP A1152     -12.468  12.425 -28.209  1.00 27.17           H  \nATOM   4220  N   GLU A1153     -16.243  19.166 -21.612  1.00 25.75           N  \nATOM   4221  CA  GLU A1153     -16.288  20.607 -21.306  1.00 26.82           C  \nATOM   4222  C   GLU A1153     -15.165  20.957 -20.317  1.00 30.62           C  \nATOM   4223  O   GLU A1153     -14.982  20.213 -19.355  1.00 26.79           O  \nATOM   4224  CB  GLU A1153     -17.661  21.015 -20.731  1.00 28.38           C  \nATOM   4225  CG  GLU A1153     -18.853  20.780 -21.684  1.00 35.13           C  \nATOM   4226  CD  GLU A1153     -19.078  21.826 -22.787  1.00 54.88           C  \nATOM   4227  OE1 GLU A1153     -18.283  22.786 -22.903  1.00 51.30           O  \nATOM   4228  OE2 GLU A1153     -20.072  21.633 -23.523  1.00 50.04           O1-\nATOM   4229  H   GLU A1153     -16.909  18.570 -21.143  1.00 25.75           H  \nATOM   4230  HA  GLU A1153     -16.126  21.170 -22.227  1.00 26.82           H  \nATOM   4231  HB3 GLU A1153     -17.632  22.059 -20.419  1.00 28.38           H  \nATOM   4232  HB2 GLU A1153     -17.847  20.473 -19.807  1.00 28.38           H  \nATOM   4233  HG3 GLU A1153     -19.767  20.707 -21.096  1.00 35.13           H  \nATOM   4234  HG2 GLU A1153     -18.736  19.816 -22.172  1.00 35.13           H  \nATOM   4235  N   THR A1154     -14.438  22.064 -20.561  1.00 30.88           N  \nATOM   4236  CA  THR A1154     -13.383  22.571 -19.668  1.00 31.88           C  \nATOM   4237  C   THR A1154     -13.939  22.913 -18.271  1.00 35.93           C  \nATOM   4238  O   THR A1154     -13.325  22.547 -17.269  1.00 35.75           O  \nATOM   4239  CB  THR A1154     -12.699  23.849 -20.233  1.00 43.66           C  \nATOM   4240  OG1 THR A1154     -12.085  23.555 -21.471  1.00 44.97           O  \nATOM   4241  CG2 THR A1154     -11.623  24.496 -19.338  1.00 43.44           C  \nATOM   4242  H   THR A1154     -14.652  22.640 -21.363  1.00 30.88           H  \nATOM   4243  HA  THR A1154     -12.631  21.787 -19.556  1.00 31.88           H  \nATOM   4244  HB  THR A1154     -13.464  24.600 -20.437  1.00 43.66           H  \nATOM   4245  HG1 THR A1154     -11.510  24.290 -21.702  1.00 44.97           H  \nATOM   4246 HG21 THR A1154     -11.136  25.325 -19.853  1.00 43.44           H  \nATOM   4247 HG22 THR A1154     -12.041  24.904 -18.417  1.00 43.44           H  \nATOM   4248 HG23 THR A1154     -10.847  23.781 -19.063  1.00 43.44           H  \nATOM   4249  N   GLU A1155     -15.129  23.536 -18.254  1.00 34.13           N  \nATOM   4250  CA  GLU A1155     -15.937  23.784 -17.069  1.00 35.75           C  \nATOM   4251  C   GLU A1155     -16.604  22.467 -16.627  1.00 37.89           C  \nATOM   4252  O   GLU A1155     -17.335  21.863 -17.414  1.00 35.58           O  \nATOM   4253  CB  GLU A1155     -16.967  24.873 -17.437  1.00 38.82           C  \nATOM   4254  CG  GLU A1155     -17.778  25.452 -16.258  1.00 56.26           C  \nATOM   4255  CD  GLU A1155     -17.038  26.450 -15.348  1.00 89.36           C  \nATOM   4256  OE1 GLU A1155     -15.839  26.728 -15.577  1.00 94.02           O  \nATOM   4257  OE2 GLU A1155     -17.704  26.925 -14.403  1.00 89.74           O1-\nATOM   4258  H   GLU A1155     -15.563  23.781 -19.134  1.00 34.13           H  \nATOM   4259  HA  GLU A1155     -15.283  24.149 -16.275  1.00 35.75           H  \nATOM   4260  HB3 GLU A1155     -17.672  24.451 -18.153  1.00 38.82           H  \nATOM   4261  HB2 GLU A1155     -16.479  25.683 -17.982  1.00 38.82           H  \nATOM   4262  HG3 GLU A1155     -18.176  24.641 -15.648  1.00 56.26           H  \nATOM   4263  HG2 GLU A1155     -18.645  25.972 -16.663  1.00 56.26           H  \nATOM   4264  N   ALA A1156     -16.319  22.041 -15.385  1.00 35.19           N  \nATOM   4265  CA  ALA A1156     -16.766  20.766 -14.818  1.00 35.22           C  \nATOM   4266  C   ALA A1156     -18.288  20.639 -14.646  1.00 38.77           C  \nATOM   4267  O   ALA A1156     -18.817  19.540 -14.816  1.00 37.90           O  \nATOM   4268  CB  ALA A1156     -16.044  20.526 -13.484  1.00 36.33           C  \nATOM   4269  H   ALA A1156     -15.724  22.604 -14.793  1.00 35.19           H  \nATOM   4270  HA  ALA A1156     -16.466  19.984 -15.513  1.00 35.22           H  \nATOM   4271  HB1 ALA A1156     -16.329  19.570 -13.043  1.00 36.33           H  \nATOM   4272  HB2 ALA A1156     -14.962  20.512 -13.622  1.00 36.33           H  \nATOM   4273  HB3 ALA A1156     -16.273  21.306 -12.757  1.00 36.33           H  \nATOM   4274  N   SER A1157     -18.958  21.763 -14.341  1.00 35.61           N  \nATOM   4275  CA  SER A1157     -20.409  21.866 -14.176  1.00 35.08           C  \nATOM   4276  C   SER A1157     -21.211  21.665 -15.479  1.00 37.46           C  \nATOM   4277  O   SER A1157     -22.359  21.228 -15.400  1.00 37.36           O  \nATOM   4278  CB  SER A1157     -20.732  23.206 -13.483  1.00 40.33           C  \nATOM   4279  OG  SER A1157     -20.526  24.317 -14.335  1.00 48.92           O  \nATOM   4280  H   SER A1157     -18.442  22.623 -14.209  1.00 35.61           H  \nATOM   4281  HA  SER A1157     -20.705  21.071 -13.490  1.00 35.08           H  \nATOM   4282  HB3 SER A1157     -20.130  23.330 -12.582  1.00 40.33           H  \nATOM   4283  HB2 SER A1157     -21.774  23.216 -13.163  1.00 40.33           H  \nATOM   4284  HG  SER A1157     -20.612  25.124 -13.820  1.00 48.92           H  \nATOM   4285  N   PHE A1158     -20.600  21.963 -16.641  1.00 32.83           N  \nATOM   4286  CA  PHE A1158     -21.225  21.832 -17.962  1.00 32.10           C  \nATOM   4287  C   PHE A1158     -21.262  20.383 -18.487  1.00 33.92           C  \nATOM   4288  O   PHE A1158     -22.027  20.112 -19.414  1.00 31.85           O  \nATOM   4289  CB  PHE A1158     -20.509  22.753 -18.976  1.00 33.90           C  \nATOM   4290  CG  PHE A1158     -20.583  24.263 -18.780  1.00 37.34           C  \nATOM   4291  CD1 PHE A1158     -21.365  24.870 -17.770  1.00 41.32           C  \nATOM   4292  CD2 PHE A1158     -19.866  25.090 -19.671  1.00 39.43           C  \nATOM   4293  CE1 PHE A1158     -21.392  26.253 -17.648  1.00 43.51           C  \nATOM   4294  CE2 PHE A1158     -19.906  26.471 -19.532  1.00 43.26           C  \nATOM   4295  CZ  PHE A1158     -20.663  27.049 -18.523  1.00 42.52           C  \nATOM   4296  H   PHE A1158     -19.654  22.318 -16.628  1.00 32.83           H  \nATOM   4297  HA  PHE A1158     -22.266  22.152 -17.891  1.00 32.10           H  \nATOM   4298  HB3 PHE A1158     -20.891  22.555 -19.979  1.00 33.90           H  \nATOM   4299  HB2 PHE A1158     -19.452  22.489 -19.006  1.00 33.90           H  \nATOM   4300  HD1 PHE A1158     -21.944  24.280 -17.075  1.00 41.32           H  \nATOM   4301  HD2 PHE A1158     -19.276  24.647 -20.460  1.00 39.43           H  \nATOM   4302  HE1 PHE A1158     -21.982  26.712 -16.868  1.00 43.51           H  \nATOM   4303  HE2 PHE A1158     -19.346  27.095 -20.212  1.00 43.26           H  \nATOM   4304  HZ  PHE A1158     -20.689  28.124 -18.419  1.00 42.52           H  \nATOM   4305  N   ARG A1159     -20.451  19.483 -17.901  1.00 27.94           N  \nATOM   4306  CA  ARG A1159     -20.401  18.062 -18.254  1.00 27.11           C  \nATOM   4307  C   ARG A1159     -21.635  17.307 -17.701  1.00 29.97           C  \nATOM   4308  O   ARG A1159     -22.017  17.562 -16.558  1.00 28.45           O  \nATOM   4309  CB  ARG A1159     -19.085  17.447 -17.725  1.00 27.28           C  \nATOM   4310  CG  ARG A1159     -17.826  18.123 -18.307  1.00 37.58           C  \nATOM   4311  CD  ARG A1159     -16.511  17.352 -18.102  1.00 43.51           C  \nATOM   4312  NE  ARG A1159     -16.026  17.327 -16.716  1.00 43.50           N  \nATOM   4313  CZ  ARG A1159     -14.971  17.962 -16.172  1.00 45.54           C  \nATOM   4314  NH1 ARG A1159     -14.222  18.856 -16.830  1.00 36.88           N  \nATOM   4315  NH2 ARG A1159     -14.648  17.676 -14.910  1.00 30.01           N1+\nATOM   4316  H   ARG A1159     -19.858  19.776 -17.138  1.00 27.94           H  \nATOM   4317  HA  ARG A1159     -20.378  18.025 -19.340  1.00 27.11           H  \nATOM   4318  HB3 ARG A1159     -19.064  16.393 -18.001  1.00 27.28           H  \nATOM   4319  HB2 ARG A1159     -19.056  17.476 -16.635  1.00 27.28           H  \nATOM   4320  HG3 ARG A1159     -17.736  19.090 -17.808  1.00 37.58           H  \nATOM   4321  HG2 ARG A1159     -17.947  18.333 -19.368  1.00 37.58           H  \nATOM   4322  HD3 ARG A1159     -15.755  17.616 -18.840  1.00 43.51           H  \nATOM   4323  HD2 ARG A1159     -16.727  16.298 -18.268  1.00 43.51           H  \nATOM   4324  HE  ARG A1159     -16.515  16.670 -16.123  1.00 43.50           H  \nATOM   4325 HH12 ARG A1159     -13.443  19.305 -16.367  1.00 36.88           H  \nATOM   4326 HH11 ARG A1159     -14.479  19.148 -17.766  1.00 36.88           H  \nATOM   4327 HH22 ARG A1159     -13.828  18.092 -14.480  1.00 30.01           H  \nATOM   4328 HH21 ARG A1159     -15.177  16.993 -14.389  1.00 30.01           H  \nATOM   4329  N   PRO A1160     -22.245  16.402 -18.505  1.00 26.80           N  \nATOM   4330  CA  PRO A1160     -23.417  15.614 -18.080  1.00 26.98           C  \nATOM   4331  C   PRO A1160     -23.023  14.501 -17.094  1.00 32.02           C  \nATOM   4332  O   PRO A1160     -22.041  13.808 -17.342  1.00 31.35           O  \nATOM   4333  CB  PRO A1160     -23.937  15.030 -19.406  1.00 28.34           C  \nATOM   4334  CG  PRO A1160     -22.695  14.855 -20.268  1.00 31.76           C  \nATOM   4335  CD  PRO A1160     -21.826  16.039 -19.861  1.00 27.47           C  \nATOM   4336  HA  PRO A1160     -24.178  16.252 -17.628  1.00 26.98           H  \nATOM   4337  HB3 PRO A1160     -24.608  15.750 -19.876  1.00 28.34           H  \nATOM   4338  HB2 PRO A1160     -24.491  14.098 -19.289  1.00 28.34           H  \nATOM   4339  HG3 PRO A1160     -22.907  14.822 -21.337  1.00 31.76           H  \nATOM   4340  HG2 PRO A1160     -22.192  13.923 -20.004  1.00 31.76           H  \nATOM   4341  HD2 PRO A1160     -20.769  15.781 -19.915  1.00 27.47           H  \nATOM   4342  HD3 PRO A1160     -22.012  16.890 -20.516  1.00 27.47           H  \nATOM   4343  N   THR A1161     -23.789  14.324 -16.007  1.00 29.10           N  \nATOM   4344  CA  THR A1161     -23.603  13.217 -15.056  1.00 28.91           C  \nATOM   4345  C   THR A1161     -23.827  11.838 -15.722  1.00 29.63           C  \nATOM   4346  O   THR A1161     -24.454  11.766 -16.780  1.00 26.66           O  \nATOM   4347  CB  THR A1161     -24.557  13.351 -13.832  1.00 34.86           C  \nATOM   4348  OG1 THR A1161     -25.865  12.856 -14.057  1.00 34.53           O  \nATOM   4349  CG2 THR A1161     -24.617  14.763 -13.229  1.00 35.90           C  \nATOM   4350  H   THR A1161     -24.607  14.901 -15.863  1.00 29.10           H  \nATOM   4351  HA  THR A1161     -22.573  13.254 -14.697  1.00 28.91           H  \nATOM   4352  HB  THR A1161     -24.153  12.711 -13.047  1.00 34.86           H  \nATOM   4353  HG1 THR A1161     -26.454  13.221 -13.388  1.00 34.53           H  \nATOM   4354 HG21 THR A1161     -25.175  14.766 -12.292  1.00 35.90           H  \nATOM   4355 HG22 THR A1161     -23.616  15.139 -13.017  1.00 35.90           H  \nATOM   4356 HG23 THR A1161     -25.103  15.469 -13.903  1.00 35.90           H  \nATOM   4357  N   PHE A1162     -23.334  10.762 -15.088  1.00 26.26           N  \nATOM   4358  CA  PHE A1162     -23.561   9.392 -15.560  1.00 25.89           C  \nATOM   4359  C   PHE A1162     -25.040   8.966 -15.610  1.00 30.07           C  \nATOM   4360  O   PHE A1162     -25.403   8.218 -16.515  1.00 29.53           O  \nATOM   4361  CB  PHE A1162     -22.699   8.388 -14.777  1.00 27.11           C  \nATOM   4362  CG  PHE A1162     -21.246   8.362 -15.201  1.00 25.98           C  \nATOM   4363  CD1 PHE A1162     -20.898   7.838 -16.459  1.00 26.41           C  \nATOM   4364  CD2 PHE A1162     -20.245   8.943 -14.402  1.00 27.86           C  \nATOM   4365  CE1 PHE A1162     -19.573   7.805 -16.862  1.00 26.21           C  \nATOM   4366  CE2 PHE A1162     -18.922   8.912 -14.824  1.00 29.34           C  \nATOM   4367  CZ  PHE A1162     -18.586   8.329 -16.039  1.00 25.75           C  \nATOM   4368  H   PHE A1162     -22.822  10.869 -14.222  1.00 26.26           H  \nATOM   4369  HA  PHE A1162     -23.226   9.366 -16.598  1.00 25.89           H  \nATOM   4370  HB3 PHE A1162     -23.079   7.379 -14.930  1.00 27.11           H  \nATOM   4371  HB2 PHE A1162     -22.764   8.571 -13.705  1.00 27.11           H  \nATOM   4372  HD1 PHE A1162     -21.672   7.455 -17.102  1.00 26.41           H  \nATOM   4373  HD2 PHE A1162     -20.507   9.395 -13.461  1.00 27.86           H  \nATOM   4374  HE1 PHE A1162     -19.316   7.369 -17.815  1.00 26.21           H  \nATOM   4375  HE2 PHE A1162     -18.153   9.342 -14.206  1.00 29.34           H  \nATOM   4376  HZ  PHE A1162     -17.554   8.293 -16.350  1.00 25.75           H  \nATOM   4377  N   GLU A1163     -25.873   9.500 -14.699  1.00 27.87           N  \nATOM   4378  CA  GLU A1163     -27.330   9.355 -14.724  1.00 28.69           C  \nATOM   4379  C   GLU A1163     -28.021  10.100 -15.882  1.00 33.26           C  \nATOM   4380  O   GLU A1163     -29.087   9.652 -16.303  1.00 32.51           O  \nATOM   4381  CB  GLU A1163     -27.927   9.769 -13.366  1.00 31.37           C  \nATOM   4382  CG  GLU A1163     -27.608   8.760 -12.239  1.00 44.54           C  \nATOM   4383  CD  GLU A1163     -28.145   9.129 -10.846  1.00 68.84           C  \nATOM   4384  OE1 GLU A1163     -28.711  10.233 -10.679  1.00 67.02           O  \nATOM   4385  OE2 GLU A1163     -27.958   8.284  -9.944  1.00 62.94           O1-\nATOM   4386  H   GLU A1163     -25.498  10.099 -13.976  1.00 27.87           H  \nATOM   4387  HA  GLU A1163     -27.551   8.297 -14.871  1.00 28.69           H  \nATOM   4388  HB3 GLU A1163     -29.009   9.882 -13.452  1.00 31.37           H  \nATOM   4389  HB2 GLU A1163     -27.540  10.753 -13.095  1.00 31.37           H  \nATOM   4390  HG3 GLU A1163     -26.530   8.625 -12.158  1.00 44.54           H  \nATOM   4391  HG2 GLU A1163     -28.013   7.785 -12.512  1.00 44.54           H  \nATOM   4392  N   ASN A1164     -27.417  11.190 -16.392  1.00 30.86           N  \nATOM   4393  CA  ASN A1164     -27.882  11.893 -17.596  1.00 30.74           C  \nATOM   4394  C   ASN A1164     -27.503  11.131 -18.879  1.00 32.00           C  \nATOM   4395  O   ASN A1164     -28.280  11.151 -19.832  1.00 31.36           O  \nATOM   4396  CB  ASN A1164     -27.317  13.336 -17.689  1.00 30.05           C  \nATOM   4397  CG  ASN A1164     -27.571  14.258 -16.490  1.00 41.44           C  \nATOM   4398  OD1 ASN A1164     -26.746  15.121 -16.200  1.00 30.45           O  \nATOM   4399  ND2 ASN A1164     -28.701  14.110 -15.795  1.00 30.02           N  \nATOM   4400  H   ASN A1164     -26.552  11.521 -15.984  1.00 30.86           H  \nATOM   4401  HA  ASN A1164     -28.972  11.954 -17.582  1.00 30.74           H  \nATOM   4402  HB3 ASN A1164     -27.734  13.831 -18.567  1.00 30.05           H  \nATOM   4403  HB2 ASN A1164     -26.240  13.302 -17.853  1.00 30.05           H  \nATOM   4404 HD22 ASN A1164     -28.879  14.703 -14.997  1.00 30.02           H  \nATOM   4405 HD21 ASN A1164     -29.374  13.396 -16.037  1.00 30.02           H  \nATOM   4406  N   LEU A1165     -26.326  10.480 -18.882  1.00 27.37           N  \nATOM   4407  CA  LEU A1165     -25.766   9.760 -20.028  1.00 26.17           C  \nATOM   4408  C   LEU A1165     -26.478   8.435 -20.352  1.00 30.32           C  \nATOM   4409  O   LEU A1165     -26.504   8.068 -21.525  1.00 29.57           O  \nATOM   4410  CB  LEU A1165     -24.259   9.516 -19.791  1.00 24.98           C  \nATOM   4411  CG  LEU A1165     -23.381  10.779 -19.932  1.00 27.47           C  \nATOM   4412  CD1 LEU A1165     -21.985  10.567 -19.304  1.00 26.17           C  \nATOM   4413  CD2 LEU A1165     -23.312  11.261 -21.400  1.00 28.90           C  \nATOM   4414  H   LEU A1165     -25.739  10.526 -18.060  1.00 27.37           H  \nATOM   4415  HA  LEU A1165     -25.886  10.396 -20.907  1.00 26.17           H  \nATOM   4416  HB3 LEU A1165     -23.883   8.764 -20.486  1.00 24.98           H  \nATOM   4417  HB2 LEU A1165     -24.131   9.083 -18.798  1.00 24.98           H  \nATOM   4418  HG  LEU A1165     -23.853  11.578 -19.359  1.00 27.47           H  \nATOM   4419 HD11 LEU A1165     -21.169  10.782 -19.992  1.00 26.17           H  \nATOM   4420 HD12 LEU A1165     -21.850  11.218 -18.439  1.00 26.17           H  \nATOM   4421 HD13 LEU A1165     -21.842   9.544 -18.956  1.00 26.17           H  \nATOM   4422 HD21 LEU A1165     -22.294  11.315 -21.782  1.00 28.90           H  \nATOM   4423 HD22 LEU A1165     -23.857  10.602 -22.076  1.00 28.90           H  \nATOM   4424 HD23 LEU A1165     -23.747  12.255 -21.501  1.00 28.90           H  \nATOM   4425  N   ILE A1166     -27.040   7.749 -19.341  1.00 27.97           N  \nATOM   4426  CA  ILE A1166     -27.745   6.467 -19.487  1.00 28.85           C  \nATOM   4427  C   ILE A1166     -28.953   6.492 -20.460  1.00 33.75           C  \nATOM   4428  O   ILE A1166     -28.925   5.705 -21.406  1.00 32.47           O  \nATOM   4429  CB  ILE A1166     -28.146   5.868 -18.102  1.00 32.86           C  \nATOM   4430  CG1 ILE A1166     -26.891   5.392 -17.344  1.00 32.40           C  \nATOM   4431  CG2 ILE A1166     -29.182   4.719 -18.139  1.00 34.79           C  \nATOM   4432  CD1 ILE A1166     -27.093   5.273 -15.829  1.00 41.27           C  \nATOM   4433  H   ILE A1166     -26.962   8.109 -18.400  1.00 27.97           H  \nATOM   4434  HA  ILE A1166     -27.016   5.782 -19.927  1.00 28.85           H  \nATOM   4435  HB  ILE A1166     -28.578   6.676 -17.513  1.00 32.86           H  \nATOM   4436 HG13 ILE A1166     -26.060   6.066 -17.526  1.00 32.40           H  \nATOM   4437 HG12 ILE A1166     -26.559   4.439 -17.750  1.00 32.40           H  \nATOM   4438 HG21 ILE A1166     -29.368   4.322 -17.141  1.00 34.79           H  \nATOM   4439 HG22 ILE A1166     -30.151   5.039 -18.522  1.00 34.79           H  \nATOM   4440 HG23 ILE A1166     -28.826   3.895 -18.757  1.00 34.79           H  \nATOM   4441 HD11 ILE A1166     -26.139   5.370 -15.317  1.00 41.27           H  \nATOM   4442 HD12 ILE A1166     -27.751   6.049 -15.441  1.00 41.27           H  \nATOM   4443 HD13 ILE A1166     -27.519   4.310 -15.552  1.00 41.27           H  \nATOM   4444  N   PRO A1167     -29.961   7.381 -20.270  1.00 32.13           N  \nATOM   4445  CA  PRO A1167     -31.104   7.471 -21.200  1.00 32.58           C  \nATOM   4446  C   PRO A1167     -30.756   7.999 -22.606  1.00 34.66           C  \nATOM   4447  O   PRO A1167     -31.441   7.626 -23.559  1.00 34.80           O  \nATOM   4448  CB  PRO A1167     -32.110   8.379 -20.476  1.00 35.43           C  \nATOM   4449  CG  PRO A1167     -31.254   9.243 -19.567  1.00 39.58           C  \nATOM   4450  CD  PRO A1167     -30.159   8.280 -19.129  1.00 34.49           C  \nATOM   4451  HA  PRO A1167     -31.550   6.482 -21.322  1.00 32.58           H  \nATOM   4452  HB3 PRO A1167     -32.779   7.765 -19.871  1.00 35.43           H  \nATOM   4453  HB2 PRO A1167     -32.734   8.973 -21.146  1.00 35.43           H  \nATOM   4454  HG3 PRO A1167     -31.803   9.681 -18.734  1.00 39.58           H  \nATOM   4455  HG2 PRO A1167     -30.817  10.057 -20.147  1.00 39.58           H  \nATOM   4456  HD2 PRO A1167     -29.269   8.825 -18.831  1.00 34.49           H  \nATOM   4457  HD3 PRO A1167     -30.503   7.693 -18.277  1.00 34.49           H  \nATOM   4458  N   ILE A1168     -29.692   8.816 -22.719  1.00 31.51           N  \nATOM   4459  CA  ILE A1168     -29.174   9.311 -23.996  1.00 32.13           C  \nATOM   4460  C   ILE A1168     -28.515   8.176 -24.809  1.00 34.20           C  \nATOM   4461  O   ILE A1168     -28.819   8.042 -25.992  1.00 33.26           O  \nATOM   4462  CB  ILE A1168     -28.157  10.480 -23.813  1.00 35.61           C  \nATOM   4463  CG1 ILE A1168     -28.818  11.695 -23.122  1.00 36.57           C  \nATOM   4464  CG2 ILE A1168     -27.491  10.936 -25.133  1.00 37.22           C  \nATOM   4465  CD1 ILE A1168     -27.816  12.756 -22.635  1.00 41.21           C  \nATOM   4466  H   ILE A1168     -29.178   9.087 -21.893  1.00 31.51           H  \nATOM   4467  HA  ILE A1168     -30.019   9.689 -24.577  1.00 32.13           H  \nATOM   4468  HB  ILE A1168     -27.363  10.125 -23.154  1.00 35.61           H  \nATOM   4469 HG13 ILE A1168     -29.409  11.372 -22.266  1.00 36.57           H  \nATOM   4470 HG12 ILE A1168     -29.529  12.160 -23.806  1.00 36.57           H  \nATOM   4471 HG21 ILE A1168     -26.825  11.783 -24.973  1.00 37.22           H  \nATOM   4472 HG22 ILE A1168     -26.886  10.153 -25.588  1.00 37.22           H  \nATOM   4473 HG23 ILE A1168     -28.240  11.243 -25.864  1.00 37.22           H  \nATOM   4474 HD11 ILE A1168     -28.223  13.321 -21.796  1.00 41.21           H  \nATOM   4475 HD12 ILE A1168     -26.881  12.305 -22.300  1.00 41.21           H  \nATOM   4476 HD13 ILE A1168     -27.581  13.469 -23.424  1.00 41.21           H  \nATOM   4477  N   LEU A1169     -27.664   7.367 -24.155  1.00 29.74           N  \nATOM   4478  CA  LEU A1169     -26.967   6.225 -24.756  1.00 29.80           C  \nATOM   4479  C   LEU A1169     -27.885   5.031 -25.075  1.00 35.11           C  \nATOM   4480  O   LEU A1169     -27.557   4.280 -25.991  1.00 36.14           O  \nATOM   4481  CB  LEU A1169     -25.777   5.814 -23.865  1.00 29.09           C  \nATOM   4482  CG  LEU A1169     -24.581   6.789 -23.960  1.00 32.75           C  \nATOM   4483  CD1 LEU A1169     -23.587   6.570 -22.808  1.00 32.66           C  \nATOM   4484  CD2 LEU A1169     -23.883   6.727 -25.337  1.00 36.03           C  \nATOM   4485  H   LEU A1169     -27.456   7.545 -23.180  1.00 29.74           H  \nATOM   4486  HA  LEU A1169     -26.565   6.559 -25.711  1.00 29.80           H  \nATOM   4487  HB3 LEU A1169     -25.421   4.823 -24.144  1.00 29.09           H  \nATOM   4488  HB2 LEU A1169     -26.125   5.721 -22.835  1.00 29.09           H  \nATOM   4489  HG  LEU A1169     -24.969   7.801 -23.834  1.00 32.75           H  \nATOM   4490 HD11 LEU A1169     -23.208   7.523 -22.440  1.00 32.66           H  \nATOM   4491 HD12 LEU A1169     -24.047   6.060 -21.962  1.00 32.66           H  \nATOM   4492 HD13 LEU A1169     -22.731   5.971 -23.114  1.00 32.66           H  \nATOM   4493 HD21 LEU A1169     -22.797   6.684 -25.255  1.00 36.03           H  \nATOM   4494 HD22 LEU A1169     -24.195   5.856 -25.915  1.00 36.03           H  \nATOM   4495 HD23 LEU A1169     -24.124   7.609 -25.930  1.00 36.03           H  \nATOM   4496  N   LYS A1170     -29.028   4.905 -24.376  1.00 32.29           N  \nATOM   4497  CA  LYS A1170     -30.116   3.981 -24.717  1.00 33.11           C  \nATOM   4498  C   LYS A1170     -30.825   4.360 -26.028  1.00 37.39           C  \nATOM   4499  O   LYS A1170     -31.078   3.477 -26.846  1.00 37.67           O  \nATOM   4500  CB  LYS A1170     -31.124   3.899 -23.551  1.00 37.22           C  \nATOM   4501  CG  LYS A1170     -30.641   3.002 -22.404  1.00 43.25           C  \nATOM   4502  CD  LYS A1170     -31.551   3.030 -21.170  1.00 49.41           C  \nATOM   4503  CE  LYS A1170     -31.093   2.016 -20.108  1.00 57.38           C  \nATOM   4504  NZ  LYS A1170     -31.915   2.081 -18.888  1.00 64.71           N1+\nATOM   4505  H   LYS A1170     -29.207   5.536 -23.606  1.00 32.29           H  \nATOM   4506  HA  LYS A1170     -29.678   2.992 -24.863  1.00 33.11           H  \nATOM   4507  HB3 LYS A1170     -32.069   3.483 -23.907  1.00 37.22           H  \nATOM   4508  HB2 LYS A1170     -31.357   4.899 -23.187  1.00 37.22           H  \nATOM   4509  HG3 LYS A1170     -29.633   3.290 -22.111  1.00 43.25           H  \nATOM   4510  HG2 LYS A1170     -30.573   1.978 -22.773  1.00 43.25           H  \nATOM   4511  HD3 LYS A1170     -32.578   2.820 -21.472  1.00 49.41           H  \nATOM   4512  HD2 LYS A1170     -31.550   4.038 -20.751  1.00 49.41           H  \nATOM   4513  HE3 LYS A1170     -30.052   2.195 -19.835  1.00 57.38           H  \nATOM   4514  HE2 LYS A1170     -31.143   1.003 -20.508  1.00 57.38           H  \nATOM   4515  HZ1 LYS A1170     -32.877   1.875 -19.115  1.00 64.71           H  \nATOM   4516  HZ2 LYS A1170     -31.574   1.402 -18.221  1.00 64.71           H  \nATOM   4517  HZ3 LYS A1170     -31.852   3.005 -18.484  1.00 64.71           H  \nATOM   4518  N   THR A1171     -31.102   5.663 -26.212  1.00 34.80           N  \nATOM   4519  CA  THR A1171     -31.738   6.219 -27.411  1.00 35.33           C  \nATOM   4520  C   THR A1171     -30.800   6.208 -28.638  1.00 39.05           C  \nATOM   4521  O   THR A1171     -31.260   5.941 -29.748  1.00 39.67           O  \nATOM   4522  CB  THR A1171     -32.220   7.675 -27.167  1.00 44.81           C  \nATOM   4523  OG1 THR A1171     -33.137   7.683 -26.089  1.00 44.59           O  \nATOM   4524  CG2 THR A1171     -32.908   8.359 -28.363  1.00 42.98           C  \nATOM   4525  H   THR A1171     -30.845   6.329 -25.497  1.00 34.80           H  \nATOM   4526  HA  THR A1171     -32.610   5.604 -27.647  1.00 35.33           H  \nATOM   4527  HB  THR A1171     -31.373   8.291 -26.863  1.00 44.81           H  \nATOM   4528  HG1 THR A1171     -32.663   7.467 -25.282  1.00 44.59           H  \nATOM   4529 HG21 THR A1171     -33.310   9.332 -28.077  1.00 42.98           H  \nATOM   4530 HG22 THR A1171     -32.218   8.533 -29.189  1.00 42.98           H  \nATOM   4531 HG23 THR A1171     -33.736   7.757 -28.739  1.00 42.98           H  \nATOM   4532  N   VAL A1172     -29.501   6.461 -28.407  1.00 34.64           N  \nATOM   4533  CA  VAL A1172     -28.437   6.393 -29.409  1.00 35.04           C  \nATOM   4534  C   VAL A1172     -28.142   4.943 -29.854  1.00 37.21           C  \nATOM   4535  O   VAL A1172     -27.962   4.722 -31.050  1.00 35.63           O  \nATOM   4536  CB  VAL A1172     -27.153   7.107 -28.887  1.00 39.11           C  \nATOM   4537  CG1 VAL A1172     -25.823   6.718 -29.557  1.00 39.01           C  \nATOM   4538  CG2 VAL A1172     -27.323   8.636 -28.939  1.00 39.06           C  \nATOM   4539  H   VAL A1172     -29.207   6.702 -27.470  1.00 34.64           H  \nATOM   4540  HA  VAL A1172     -28.785   6.931 -30.293  1.00 35.04           H  \nATOM   4541  HB  VAL A1172     -27.044   6.843 -27.837  1.00 39.11           H  \nATOM   4542 HG11 VAL A1172     -25.005   7.334 -29.184  1.00 39.01           H  \nATOM   4543 HG12 VAL A1172     -25.555   5.686 -29.335  1.00 39.01           H  \nATOM   4544 HG13 VAL A1172     -25.867   6.841 -30.639  1.00 39.01           H  \nATOM   4545 HG21 VAL A1172     -26.478   9.144 -28.472  1.00 39.06           H  \nATOM   4546 HG22 VAL A1172     -27.395   8.990 -29.967  1.00 39.06           H  \nATOM   4547 HG23 VAL A1172     -28.223   8.960 -28.417  1.00 39.06           H  \nATOM   4548  N   HIS A1173     -28.170   3.976 -28.917  1.00 33.86           N  \nATOM   4549  CA  HIS A1173     -28.096   2.540 -29.214  1.00 34.98           C  \nATOM   4550  C   HIS A1173     -29.277   2.060 -30.084  1.00 39.49           C  \nATOM   4551  O   HIS A1173     -29.043   1.349 -31.059  1.00 38.50           O  \nATOM   4552  CB  HIS A1173     -27.984   1.732 -27.901  1.00 35.81           C  \nATOM   4553  CG  HIS A1173     -28.090   0.234 -28.062  1.00 39.76           C  \nATOM   4554  ND1 HIS A1173     -27.102  -0.535 -28.649  1.00 41.19           N  \nATOM   4555  CD2 HIS A1173     -29.100  -0.647 -27.743  1.00 42.70           C  \nATOM   4556  CE1 HIS A1173     -27.538  -1.797 -28.663  1.00 41.61           C  \nATOM   4557  NE2 HIS A1173     -28.744  -1.941 -28.129  1.00 43.01           N  \nATOM   4558  H   HIS A1173     -28.305   4.222 -27.946  1.00 33.86           H  \nATOM   4559  HA  HIS A1173     -27.183   2.367 -29.788  1.00 34.98           H  \nATOM   4560  HB3 HIS A1173     -28.760   2.045 -27.201  1.00 35.81           H  \nATOM   4561  HB2 HIS A1173     -27.032   1.952 -27.414  1.00 35.81           H  \nATOM   4562  HD1 HIS A1173     -26.205  -0.215 -28.995  1.00 41.19           H  \nATOM   4563  HD2 HIS A1173     -30.059  -0.445 -27.288  1.00 42.70           H  \nATOM   4564  HE1 HIS A1173     -26.961  -2.619 -29.062  1.00 41.61           H  \nATOM   4565  N   GLU A1174     -30.502   2.495 -29.734  1.00 37.68           N  \nATOM   4566  CA  GLU A1174     -31.744   2.256 -30.476  1.00 39.70           C  \nATOM   4567  C   GLU A1174     -31.727   2.760 -31.930  1.00 42.94           C  \nATOM   4568  O   GLU A1174     -32.312   2.102 -32.790  1.00 44.72           O  \nATOM   4569  CB  GLU A1174     -32.935   2.873 -29.702  1.00 42.32           C  \nATOM   4570  CG  GLU A1174     -33.555   1.928 -28.651  1.00 60.01           C  \nATOM   4571  CD  GLU A1174     -34.443   0.805 -29.219  1.00 92.87           C  \nATOM   4572  OE1 GLU A1174     -34.832   0.871 -30.407  1.00 94.43           O  \nATOM   4573  OE2 GLU A1174     -34.715  -0.138 -28.446  1.00 90.73           O1-\nATOM   4574  H   GLU A1174     -30.599   3.061 -28.901  1.00 37.68           H  \nATOM   4575  HA  GLU A1174     -31.882   1.176 -30.525  1.00 39.70           H  \nATOM   4576  HB3 GLU A1174     -33.706   3.247 -30.379  1.00 42.32           H  \nATOM   4577  HB2 GLU A1174     -32.594   3.762 -29.175  1.00 42.32           H  \nATOM   4578  HG3 GLU A1174     -34.171   2.518 -27.971  1.00 60.01           H  \nATOM   4579  HG2 GLU A1174     -32.763   1.493 -28.038  1.00 60.01           H  \nATOM   4580  N   LYS A1175     -31.050   3.893 -32.178  1.00 37.93           N  \nATOM   4581  CA  LYS A1175     -30.917   4.504 -33.500  1.00 37.53           C  \nATOM   4582  C   LYS A1175     -30.053   3.674 -34.468  1.00 41.18           C  \nATOM   4583  O   LYS A1175     -30.453   3.507 -35.620  1.00 39.68           O  \nATOM   4584  CB  LYS A1175     -30.402   5.952 -33.337  1.00 38.66           C  \nATOM   4585  CG  LYS A1175     -30.187   6.714 -34.659  1.00 48.52           C  \nATOM   4586  CD  LYS A1175     -29.780   8.180 -34.438  1.00 57.93           C  \nATOM   4587  CE  LYS A1175     -29.465   8.944 -35.737  1.00 71.38           C  \nATOM   4588  NZ  LYS A1175     -30.655   9.138 -36.585  1.00 86.87           N1+\nATOM   4589  H   LYS A1175     -30.605   4.381 -31.413  1.00 37.93           H  \nATOM   4590  HA  LYS A1175     -31.920   4.562 -33.929  1.00 37.53           H  \nATOM   4591  HB3 LYS A1175     -29.462   5.948 -32.786  1.00 38.66           H  \nATOM   4592  HB2 LYS A1175     -31.109   6.507 -32.720  1.00 38.66           H  \nATOM   4593  HG3 LYS A1175     -31.100   6.660 -35.253  1.00 48.52           H  \nATOM   4594  HG2 LYS A1175     -29.406   6.228 -35.246  1.00 48.52           H  \nATOM   4595  HD3 LYS A1175     -28.898   8.205 -33.797  1.00 57.93           H  \nATOM   4596  HD2 LYS A1175     -30.561   8.700 -33.881  1.00 57.93           H  \nATOM   4597  HE3 LYS A1175     -28.705   8.416 -36.313  1.00 71.38           H  \nATOM   4598  HE2 LYS A1175     -29.056   9.926 -35.497  1.00 71.38           H  \nATOM   4599  HZ1 LYS A1175     -31.353   9.660 -36.073  1.00 86.87           H  \nATOM   4600  HZ2 LYS A1175     -30.398   9.649 -37.418  1.00 86.87           H  \nATOM   4601  HZ3 LYS A1175     -31.032   8.238 -36.845  1.00 86.87           H  \nATOM   4602  N   TYR A1176     -28.889   3.197 -33.995  1.00 37.88           N  \nATOM   4603  CA  TYR A1176     -27.868   2.567 -34.838  1.00 38.84           C  \nATOM   4604  C   TYR A1176     -27.921   1.028 -34.865  1.00 43.27           C  \nATOM   4605  O   TYR A1176     -27.210   0.447 -35.688  1.00 45.60           O  \nATOM   4606  CB  TYR A1176     -26.473   3.100 -34.436  1.00 39.66           C  \nATOM   4607  CG  TYR A1176     -26.302   4.594 -34.682  1.00 42.14           C  \nATOM   4608  CD1 TYR A1176     -26.315   5.101 -35.999  1.00 44.87           C  \nATOM   4609  CD2 TYR A1176     -26.162   5.487 -33.601  1.00 42.46           C  \nATOM   4610  CE1 TYR A1176     -26.229   6.489 -36.227  1.00 44.19           C  \nATOM   4611  CE2 TYR A1176     -26.089   6.875 -33.825  1.00 43.50           C  \nATOM   4612  CZ  TYR A1176     -26.135   7.378 -35.138  1.00 49.64           C  \nATOM   4613  OH  TYR A1176     -26.106   8.725 -35.354  1.00 54.89           O  \nATOM   4614  H   TYR A1176     -28.635   3.369 -33.031  1.00 37.88           H  \nATOM   4615  HA  TYR A1176     -28.033   2.870 -35.874  1.00 38.84           H  \nATOM   4616  HB3 TYR A1176     -25.694   2.591 -35.006  1.00 39.66           H  \nATOM   4617  HB2 TYR A1176     -26.271   2.873 -33.387  1.00 39.66           H  \nATOM   4618  HD1 TYR A1176     -26.412   4.428 -36.839  1.00 44.87           H  \nATOM   4619  HD2 TYR A1176     -26.126   5.113 -32.593  1.00 42.46           H  \nATOM   4620  HE1 TYR A1176     -26.257   6.870 -37.237  1.00 44.19           H  \nATOM   4621  HE2 TYR A1176     -26.007   7.551 -32.986  1.00 43.50           H  \nATOM   4622  HH  TYR A1176     -26.186   9.238 -34.543  1.00 54.89           H  \nATOM   4623  N   ARG A1177     -28.744   0.383 -34.014  1.00 37.76           N  \nATOM   4624  CA  ARG A1177     -28.935  -1.075 -34.023  1.00 53.07           C  \nATOM   4625  C   ARG A1177     -29.798  -1.553 -35.209  1.00 74.57           C  \nATOM   4626  O   ARG A1177     -30.502  -0.752 -35.827  1.00 46.90           O  \nATOM   4627  CB  ARG A1177     -29.496  -1.560 -32.664  1.00 52.87           C  \nATOM   4628  CG  ARG A1177     -30.982  -1.254 -32.399  1.00 64.39           C  \nATOM   4629  CD  ARG A1177     -31.514  -1.954 -31.138  1.00 74.69           C  \nATOM   4630  NE  ARG A1177     -32.978  -1.851 -31.034  1.00 82.78           N  \nATOM   4631  CZ  ARG A1177     -33.907  -2.569 -31.694  1.00 98.29           C  \nATOM   4632  NH1 ARG A1177     -33.589  -3.553 -32.550  1.00 84.15           N  \nATOM   4633  NH2 ARG A1177     -35.199  -2.283 -31.493  1.00 87.75           N1+\nATOM   4634  H   ARG A1177     -29.299   0.909 -33.353  1.00 37.76           H  \nATOM   4635  HA  ARG A1177     -27.950  -1.532 -34.140  1.00 53.07           H  \nATOM   4636  HB3 ARG A1177     -28.888  -1.173 -31.846  1.00 52.87           H  \nATOM   4637  HB2 ARG A1177     -29.369  -2.643 -32.620  1.00 52.87           H  \nATOM   4638  HG3 ARG A1177     -31.630  -1.450 -33.253  1.00 64.39           H  \nATOM   4639  HG2 ARG A1177     -31.028  -0.179 -32.238  1.00 64.39           H  \nATOM   4640  HD3 ARG A1177     -31.155  -1.396 -30.273  1.00 74.69           H  \nATOM   4641  HD2 ARG A1177     -31.139  -2.971 -31.017  1.00 74.69           H  \nATOM   4642  HE  ARG A1177     -33.319  -1.100 -30.445  1.00 82.78           H  \nATOM   4643 HH12 ARG A1177     -34.318  -4.055 -33.040  1.00 84.15           H  \nATOM   4644 HH11 ARG A1177     -32.621  -3.779 -32.721  1.00 84.15           H  \nATOM   4645 HH22 ARG A1177     -35.921  -2.787 -31.991  1.00 87.75           H  \nATOM   4646 HH21 ARG A1177     -35.454  -1.517 -30.880  1.00 87.75           H  \nHETATM 4647  N   NME A1178     -29.749  -2.869 -35.465  1.00  0.00           N  \nHETATM 4648  C   NME A1178     -30.535  -3.522 -36.502  1.00  0.00           C  \nHETATM 4649  H   NME A1178     -29.154  -3.459 -34.899  1.00  0.00           H  \nHETATM 4650  H1  NME A1178     -30.743  -2.862 -37.345  1.00  0.00           H  \nHETATM 4651  H2  NME A1178     -29.994  -4.388 -36.884  1.00  0.00           H  \nHETATM 4652  H3  NME A1178     -31.485  -3.868 -36.092  1.00  0.00           H  \nTER    4653      NME A1178 \nHETATM 4654  O   HOH A1301      -7.805  13.717 -21.733  1.00 23.87           O  \nHETATM 4655  H1  HOH A1301      -7.442  12.805 -21.938  1.00 23.87           H  \nHETATM 4656  H2  HOH A1301      -7.037  14.314 -21.478  1.00 23.87           H  \nHETATM 4657  O   HOH A1302      -7.300   4.134 -29.382  1.00 26.50           O  \nHETATM 4658  H1  HOH A1302      -6.564   3.946 -30.038  1.00 26.50           H  \nHETATM 4659  H2  HOH A1302      -8.155   4.275 -29.890  1.00 26.50           H  \nHETATM 4660  O   HOH A1303     -21.765  11.544 -12.438  1.00 28.48           O  \nHETATM 4661  H1  HOH A1303     -21.483  12.499 -12.298  1.00 28.48           H  \nHETATM 4662  H2  HOH A1303     -21.181  10.951 -11.877  1.00 28.48           H  \nHETATM 4663  O   HOH A1304      -9.035   2.704 -10.281  1.00 29.39           O  \nHETATM 4664  H1  HOH A1304      -9.409   1.932 -10.803  1.00 29.39           H  \nHETATM 4665  H2  HOH A1304      -9.652   3.492 -10.355  1.00 29.39           H  \nHETATM 4666  O   HOH A1305     -10.327  13.333 -14.896  1.00 24.85           O  \nHETATM 4667  H1  HOH A1305     -11.176  12.866 -15.157  1.00 24.85           H  \nHETATM 4668  H2  HOH A1305     -10.176  13.221 -13.913  1.00 24.85           H  \nHETATM 4669  O   HOH A1306     -11.177   8.182 -14.397  1.00 26.19           O  \nHETATM 4670  H1  HOH A1306     -11.137   8.958 -15.033  1.00 26.19           H  \nHETATM 4671  H2  HOH A1306     -11.960   8.307 -13.778  1.00 26.19           H  \nHETATM 4672  O   HOH A1307      -5.575  15.209 -20.665  1.00 23.28           O  \nHETATM 4673  H1  HOH A1307      -6.230  15.538 -19.979  1.00 23.28           H  \nHETATM 4674  H2  HOH A1307      -4.863  14.683 -20.193  1.00 23.28           H  \nHETATM 4675  O   HOH A1310      -7.035   2.198 -22.168  1.00 28.39           O  \nHETATM 4676  H1  HOH A1310      -7.249   2.734 -22.991  1.00 28.39           H  \nHETATM 4677  H2  HOH A1310      -6.202   2.562 -21.741  1.00 28.39           H  \nHETATM 4678  O   HOH A1319     -24.975   8.619  -9.410  1.00 28.29           O  \nHETATM 4679  H1  HOH A1319     -25.977   8.575  -9.470  1.00 28.29           H  \nHETATM 4680  H2  HOH A1319     -24.615   7.682  -9.428  1.00 28.29           H  \nHETATM 4681  O   HOH A1322       9.260  15.797 -22.620  1.00 33.09           O  \nHETATM 4682  H1  HOH A1322       9.238  15.995 -21.638  1.00 33.09           H  \nHETATM 4683  H2  HOH A1322       9.718  14.919 -22.770  1.00 33.09           H  \nHETATM 4684  O   HOH A1323     -15.175  20.060 -25.940  1.00 37.91           O  \nHETATM 4685  H1  HOH A1323     -15.823  19.549 -25.369  1.00 37.91           H  \nHETATM 4686  H2  HOH A1323     -15.622  20.901 -26.256  1.00 37.91           H  \nHETATM 4687  O   HOH A1325      -7.181  -8.809 -21.143  1.00 38.47           O  \nHETATM 4688  H1  HOH A1325      -6.991  -9.743 -20.831  1.00 38.47           H  \nHETATM 4689  H2  HOH A1325      -6.455  -8.515 -21.774  1.00 38.47           H  \nHETATM 4690  O   HOH A1326       7.389  15.381 -18.526  1.00 32.26           O  \nHETATM 4691  H1  HOH A1326       8.315  15.733 -18.681  1.00 32.26           H  \nHETATM 4692  H2  HOH A1326       6.915  15.335 -19.410  1.00 32.26           H  \nHETATM 4693  O   HOH A1329     -19.714  -6.468  -9.012  1.00 36.73           O  \nHETATM 4694  H1  HOH A1329     -19.884  -6.507 -10.000  1.00 36.73           H  \nHETATM 4695  H2  HOH A1329     -18.743  -6.288  -8.854  1.00 36.73           H  \nHETATM 4696  O   HOH A1330       4.141  19.654 -16.124  1.00 36.06           O  \nHETATM 4697  H1  HOH A1330       5.109  19.392 -16.168  1.00 36.06           H  \nHETATM 4698  H2  HOH A1330       3.830  19.606 -15.174  1.00 36.06           H  \nHETATM 4699  O   HOH A1333       4.982  16.327 -16.962  1.00 30.05           O  \nHETATM 4700  H1  HOH A1333       5.483  17.156 -16.704  1.00 30.05           H  \nHETATM 4701  H2  HOH A1333       5.635  15.674 -17.353  1.00 30.05           H  \nHETATM 4702  O   HOH A1339      -8.401   9.401 -34.311  1.00 35.17           O  \nHETATM 4703  H1  HOH A1339      -8.558   8.457 -34.614  1.00 35.17           H  \nHETATM 4704  H2  HOH A1339      -8.352   9.426 -33.310  1.00 35.17           H  \nHETATM 4705  O   HOH A1344      -1.246  -9.880  -2.385  1.00 46.63           O  \nHETATM 4706  H1  HOH A1344      -2.115  -9.784  -1.894  1.00 46.63           H  \nHETATM 4707  H2  HOH A1344      -0.512 -10.016  -1.717  1.00 46.63           H  \nHETATM 4708  O   HOH A1346      -2.546  14.870 -33.057  1.00 40.94           O  \nHETATM 4709  H1  HOH A1346      -1.902  14.222 -33.475  1.00 40.94           H  \nHETATM 4710  H2  HOH A1346      -2.400  14.877 -32.065  1.00 40.94           H  \nHETATM 4711  O   HOH A1349     -15.113 -20.319 -14.132  1.00 44.85           O  \nHETATM 4712  H1  HOH A1349     -15.777 -20.591 -13.428  1.00 44.85           H  \nHETATM 4713  H2  HOH A1349     -15.496 -19.565 -14.665  1.00 44.85           H  \nHETATM 4714  O   HOH A1350     -21.241  18.275 -13.756  1.00 31.90           O  \nHETATM 4715  H1  HOH A1350     -21.949  18.493 -14.431  1.00 31.90           H  \nHETATM 4716  H2  HOH A1350     -20.384  18.717 -14.034  1.00 31.90           H  \nHETATM 4717  O   HOH A1352     -12.770 -28.593  -8.238  1.00 61.97           O  \nHETATM 4718  H1  HOH A1352     -11.940 -28.665  -8.798  1.00 61.97           H  \nHETATM 4719  H2  HOH A1352     -13.089 -29.522  -8.039  1.00 61.97           H  \nHETATM 4720  O   HOH A1353       0.753  -1.961 -23.720  1.00 67.38           O  \nHETATM 4721  H1  HOH A1353       1.280  -1.741 -22.898  1.00 67.38           H  \nHETATM 4722  H2  HOH A1353       1.234  -2.673 -24.233  1.00 67.38           H  \nHETATM 4723  O   HOH A1356     -12.183 -25.973 -15.343  1.00 59.40           O  \nHETATM 4724  H1  HOH A1356     -12.353 -25.498 -14.476  1.00 59.40           H  \nHETATM 4725  H2  HOH A1356     -11.675 -26.817 -15.157  1.00 59.40           H  \nHETATM 4726  O   HOH A1360       0.186  23.081 -25.812  1.00 35.26           O  \nHETATM 4727  H1  HOH A1360       0.760  23.841 -25.494  1.00 35.26           H  \nHETATM 4728  H2  HOH A1360      -0.066  22.506 -25.030  1.00 35.26           H  \nHETATM 4729  O   HOH A1361       6.492  16.072 -23.950  1.00 37.72           O  \nHETATM 4730  H1  HOH A1361       7.475  15.916 -23.823  1.00 37.72           H  \nHETATM 4731  H2  HOH A1361       6.255  15.954 -24.918  1.00 37.72           H  \nHETATM 4732  O   HOH A1362     -12.299   4.648 -36.322  1.00 42.24           O  \nHETATM 4733  H1  HOH A1362     -13.007   4.928 -36.975  1.00 42.24           H  \nHETATM 4734  H2  HOH A1362     -12.726   4.127 -35.581  1.00 42.24           H  \nHETATM 4735  O   HOH A1364     -16.446  24.494 -21.075  1.00 34.81           O  \nHETATM 4736  H1  HOH A1364     -17.058  23.972 -21.679  1.00 34.81           H  \nHETATM 4737  H2  HOH A1364     -16.735  25.452 -21.068  1.00 34.81           H  \nHETATM 4738  O   HOH A1366     -15.941   9.353 -41.405  1.00 52.63           O  \nHETATM 4739  H1  HOH A1366     -15.091   8.827 -41.524  1.00 52.63           H  \nHETATM 4740  H2  HOH A1366     -16.453   9.327 -42.264  1.00 52.63           H  \nHETATM 4741  O   HOH A1367     -16.053   4.806 -35.554  1.00 51.77           O  \nHETATM 4742  H1  HOH A1367     -15.366   4.407 -34.941  1.00 51.77           H  \nHETATM 4743  H2  HOH A1367     -15.611   5.066 -36.416  1.00 51.77           H  \nHETATM 4744  O   HOH A1374     -11.258  22.843 -15.256  1.00 45.38           O  \nHETATM 4745  H1  HOH A1374     -11.414  21.917 -14.904  1.00 45.38           H  \nHETATM 4746  H2  HOH A1374     -11.922  23.020 -15.986  1.00 45.38           H  \nHETATM 4747  O   HOH A1379       1.460  25.653 -25.134  1.00 53.63           O  \nHETATM 4748  H1  HOH A1379       1.558  25.650 -24.132  1.00 53.63           H  \nHETATM 4749  H2  HOH A1379       1.812  26.519 -25.489  1.00 53.63           H  \nHETATM 4750  O   HOH A1381     -10.785  -4.363 -35.468  1.00 52.69           O  \nHETATM 4751  H1  HOH A1381     -10.882  -4.287 -34.472  1.00 52.69           H  \nHETATM 4752  H2  HOH A1381      -9.819  -4.506 -35.690  1.00 52.69           H  \nHETATM 4753  O   HOH A1382      11.586  21.266 -17.552  1.00 44.12           O  \nHETATM 4754  H1  HOH A1382      12.072  22.022 -17.992  1.00 44.12           H  \nHETATM 4755  H2  HOH A1382      11.771  21.284 -16.568  1.00 44.12           H  \nHETATM 4756  O   HOH A1388     -20.268  13.044  -1.959  1.00 51.68           O  \nHETATM 4757  H1  HOH A1388     -19.953  13.996  -1.925  1.00 51.68           H  \nHETATM 4758  H2  HOH A1388     -19.556  12.459  -1.568  1.00 51.68           H  \nHETATM 4759  O   HOH A1394      -8.203   1.938  -4.105  1.00 43.33           O  \nHETATM 4760  H1  HOH A1394      -8.463   1.333  -4.861  1.00 43.33           H  \nHETATM 4761  H2  HOH A1394      -8.767   2.767  -4.151  1.00 43.33           H  \nHETATM 4762  O   HOH A1396     -27.765  -2.906 -18.989  1.00 50.68           O  \nHETATM 4763  H1  HOH A1396     -27.731  -1.905 -18.908  1.00 50.68           H  \nHETATM 4764  H2  HOH A1396     -27.014  -3.284 -18.440  1.00 50.68           H  \nHETATM 4765  O   HOH A1397     -30.874  11.872 -15.139  1.00 52.33           O  \nHETATM 4766  H1  HOH A1397     -30.767  11.983 -14.146  1.00 52.33           H  \nHETATM 4767  H2  HOH A1397     -30.470  10.998 -15.416  1.00 52.33           H  \nHETATM 4768  O   HOH A1400     -36.880  -3.993 -33.716  1.00 50.72           O  \nHETATM 4769  H1  HOH A1400     -37.147  -3.437 -34.504  1.00 50.72           H  \nHETATM 4770  H2  HOH A1400     -37.524  -4.752 -33.618  1.00 50.72           H  \nHETATM 4771  O   HOH A1401     -24.206  -1.279 -35.770  1.00 53.88           O  \nHETATM 4772  H1  HOH A1401     -23.632  -1.063 -36.562  1.00 53.88           H  \nHETATM 4773  H2  HOH A1401     -25.118  -0.889 -35.914  1.00 53.88           H  \nHETATM 4774  O   HOH A1406      -1.292   8.841 -35.635  1.00 44.73           O  \nHETATM 4775  H1  HOH A1406      -1.662   8.240 -34.923  1.00 44.73           H  \nHETATM 4776  H2  HOH A1406      -0.648   9.487 -35.214  1.00 44.73           H  \nHETATM 4777  O   HOH A1412      -0.946  21.652 -15.116  1.00 53.19           O  \nHETATM 4778  H1  HOH A1412      -1.600  21.432 -15.844  1.00 53.19           H  \nHETATM 4779  H2  HOH A1412      -1.078  21.016 -14.353  1.00 53.19           H  \nHETATM 4780  O   HOH A1415     -23.399  -9.578 -15.048  1.00 55.01           O  \nHETATM 4781  H1  HOH A1415     -23.421  -8.698 -15.526  1.00 55.01           H  \nHETATM 4782  H2  HOH A1415     -24.267 -10.053 -15.194  1.00 55.01           H  \nHETATM 4783  O   HOH A1416       5.715  22.275 -28.185  1.00110.14           O  \nHETATM 4784  H1  HOH A1416       6.698  22.109 -28.267  1.00110.14           H  \nHETATM 4785  H2  HOH A1416       5.253  21.393 -28.063  1.00110.14           H  \nHETATM 4786  O   HOH A1417     -27.286  10.455 -33.143  1.00 53.90           O  \nHETATM 4787  H1  HOH A1417     -27.557  11.412 -33.288  1.00 53.90           H  \nHETATM 4788  H2  HOH A1417     -27.516  10.197 -32.205  1.00 53.90           H  \nHETATM 4789  O   HOH A1419     -33.125   0.444 -35.100  1.00 58.72           O  \nHETATM 4790  H1  HOH A1419     -32.946   1.047 -34.319  1.00 58.72           H  \nHETATM 4791  H2  HOH A1419     -32.253   0.120 -35.472  1.00 58.72           H  \nCONECT    1    4    5    6\nCONECT    4    1\nCONECT    5    1\nCONECT    6    1\nCONECT 4654 4655 4656\nCONECT 4655 4654\nCONECT 4656 4654\nCONECT 4657 4658 4659\nCONECT 4658 4657\nCONECT 4659 4657\nCONECT 4660 4661 4662\nCONECT 4661 4660\nCONECT 4662 4660\nCONECT 4663 4664 4665\nCONECT 4664 4663\nCONECT 4665 4663\nCONECT 4666 4667 4668\nCONECT 4667 4666\nCONECT 4668 4666\nCONECT 4669 4670 4671\nCONECT 4670 4669\nCONECT 4671 4669\nCONECT 4672 4673 4674\nCONECT 4673 4672\nCONECT 4674 4672\nCONECT 4675 4676 4677\nCONECT 4676 4675\nCONECT 4677 4675\nCONECT 4678 4679 4680\nCONECT 4679 4678\nCONECT 4680 4678\nCONECT 4681 4682 4683\nCONECT 4682 4681\nCONECT 4683 4681\nCONECT 4684 4685 4686\nCONECT 4685 4684\nCONECT 4686 4684\nCONECT 4687 4688 4689\nCONECT 4688 4687\nCONECT 4689 4687\nCONECT 4690 4691 4692\nCONECT 4691 4690\nCONECT 4692 4690\nCONECT 4693 4694 4695\nCONECT 4694 4693\nCONECT 4695 4693\nCONECT 4696 4697 4698\nCONECT 4697 4696\nCONECT 4698 4696\nCONECT 4699 4700 4701\nCONECT 4700 4699\nCONECT 4701 4699\nCONECT 4702 4703 4704\nCONECT 4703 4702\nCONECT 4704 4702\nCONECT 4705 4706 4707\nCONECT 4706 4705\nCONECT 4707 4705\nCONECT 4708 4709 4710\nCONECT 4709 4708\nCONECT 4710 4708\nCONECT 4711 4712 4713\nCONECT 4712 4711\nCONECT 4713 4711\nCONECT 4714 4715 4716\nCONECT 4715 4714\nCONECT 4716 4714\nCONECT 4717 4718 4719\nCONECT 4718 4717\nCONECT 4719 4717\nCONECT 4720 4721 4722\nCONECT 4721 4720\nCONECT 4722 4720\nCONECT 4723 4724 4725\nCONECT 4724 4723\nCONECT 4725 4723\nCONECT 4726 4727 4728\nCONECT 4727 4726\nCONECT 4728 4726\nCONECT 4729 4730 4731\nCONECT 4730 4729\nCONECT 4731 4729\nCONECT 4732 4733 4734\nCONECT 4733 4732\nCONECT 4734 4732\nCONECT 4735 4736 4737\nCONECT 4736 4735\nCONECT 4737 4735\nCONECT 4738 4739 4740\nCONECT 4739 4738\nCONECT 4740 4738\nCONECT 4741 4742 4743\nCONECT 4742 4741\nCONECT 4743 4741\nCONECT 4744 4745 4746\nCONECT 4745 4744\nCONECT 4746 4744\nCONECT 4747 4748 4749\nCONECT 4748 4747\nCONECT 4749 4747\nCONECT 4750 4751 4752\nCONECT 4751 4750\nCONECT 4752 4750\nCONECT 4753 4754 4755\nCONECT 4754 4753\nCONECT 4755 4753\nCONECT 4756 4757 4758\nCONECT 4757 4756\nCONECT 4758 4756\nCONECT 4759 4760 4761\nCONECT 4760 4759\nCONECT 4761 4759\nCONECT 4762 4763 4764\nCONECT 4763 4762\nCONECT 4764 4762\nCONECT 4765 4766 4767\nCONECT 4766 4765\nCONECT 4767 4765\nCONECT 4768 4769 4770\nCONECT 4769 4768\nCONECT 4770 4768\nCONECT 4771 4772 4773\nCONECT 4772 4771\nCONECT 4773 4771\nCONECT 4774 4775 4776\nCONECT 4775 4774\nCONECT 4776 4774\nCONECT 4777 4778 4779\nCONECT 4778 4777\nCONECT 4779 4777\nCONECT 4780 4781 4782\nCONECT 4781 4780\nCONECT 4782 4780\nCONECT 4783 4784 4785\nCONECT 4784 4783\nCONECT 4785 4783\nCONECT 4786 4787 4788\nCONECT 4787 4786\nCONECT 4788 4786\nCONECT 4789 4790 4791\nCONECT 4790 4789\nCONECT 4791 4789\nEND   \n"
  },
  {
    "path": "src/openfecli/tests/data/transformation.json",
    "content": "{\":version:\": 1, \"__module__\": \"gufe.transformations.transformation\", \"__qualname__\": \"Transformation\", \"mapping\": {\":version:\": 1, \"__module__\": \"gufe.mapping.ligandatommapping\", \"__qualname__\": \"LigandAtomMapping\", \"annotations\": \"{}\", \"componentA\": {\":version:\": 1, \"__module__\": \"gufe.components.smallmoleculecomponent\", \"__qualname__\": \"SmallMoleculeComponent\", \"atoms\": [[6, 0, 0, true, 0, 0, {}], [6, 0, 0, true, 0, 0, {}], [6, 0, 0, true, 0, 0, {}], [6, 0, 0, true, 0, 0, {}], [6, 0, 0, true, 0, 0, {}], [6, 0, 0, true, 0, 0, {}], [1, 0, 0, false, 0, 0, {}], [1, 0, 0, false, 0, 0, {}], [1, 0, 0, false, 0, 0, {}], [1, 0, 0, false, 0, 0, {}], [1, 0, 0, false, 0, 0, {}], [1, 0, 0, false, 0, 0, {}]], \"bonds\": [[0, 1, 12, 0, {}], [0, 5, 12, 0, {}], [0, 6, 1, 0, {}], [1, 2, 12, 0, {}], [1, 7, 1, 0, {}], [2, 3, 12, 0, {}], [2, 8, 1, 0, {}], [3, 4, 12, 0, {}], [3, 9, 1, 0, {}], [4, 5, 12, 0, {}], [4, 10, 1, 0, {}], [5, 11, 1, 0, {}]], \"conformer\": [\"\\u0093NUMPY\\u0001\\u0000v\\u0000{'descr': '<f8', 'fortran_order': False, 'shape': (12, 3), }                                                         \\n\\u00ee|?5^\\u00fa9@\\u0002+\\u0087\\u0016\\u00d9N\\u0015@\\u0004V\\u000e-\\u00b2\\u001d\\u0013@\\u0085\\u00ebQ\\u00b8\\u001ee:@\\u00b2\\u009d\\u00ef\\u00a7\\u00c6K\\u0014@\\u00cb\\u00a1E\\u00b6\\u00f3\\u00fd\\u000b@\\u00d7\\u00a3p=\\nW;@q=\\n\\u00d7\\u00a3p\\u0017@\\u009e\\u00ef\\u00a7\\u00c6K7\\u0007@\\u0083\\u00c0\\u00ca\\u00a1E\\u00d6;@\\u00c9v\\u00be\\u009f\\u001a\\u00af\\u001b@Zd;\\u00dfO\\u008d\\f@\\u00ecQ\\u00b8\\u001e\\u0085k;@b\\u0010X9\\u00b4\\u00c8\\u001c@\\u0006\\u0081\\u0095C\\u008bl\\u0013@sh\\u0091\\u00ed|\\u007f:@j\\u00bct\\u0093\\u0018\\u0084\\u0019@\\u00c7K7\\u0089A\\u00e0\\u0015@\\u00ed\\u009e<,\\u00d4:9@<N\\u00d1\\u0091\\\\\\u00be\\u0012@\\u0097\\u00ff\\u0090~\\u00fb\\u00fa\\u0014@\\u000f\\u009c3\\u00a2\\u00b4\\u00f79@\\u008d(\\u00ed\\r\\u00be\\u00f0\\u0010@\\u00f0\\u0016HP\\u00fc\\u0098\\u0007@\\u00aa\\u00f1\\u00d2Mb\\u00b0;@\\u00bc\\u0005\\u0012\\u0014?\\u0086\\u0016@\\u00c3d\\u00aa`TR\\u00fe?\\u00a6\\u009b\\u00c4 \\u00b0\\u0092<@\\u00dd$\\u0006\\u0081\\u0095C\\u001e@K\\u00ea\\u00044\\u0011\\u00b6\\b@RI\\u009d\\u0080&\\u00d2;@\\u0002\\u009a\\b\\u001b\\u009e\\u001e @z\\u00c7):\\u0092\\u008b\\u0015@9EGr\\u00f9/:@}?5^\\u00baI\\u001a@]m\\u00c5\\u00fe\\u00b2\\u00fb\\u0019@\", {}], \"molprops\": {\"ofe-name\": \"benzene\"}}, \"componentA_to_componentB\": {\"0\": 4, \"1\": 5, \"2\": 6, \"3\": 7, \"4\": 8, \"5\": 9, \"6\": 10, \"7\": 11, \"8\": 12, \"9\": 13, \"10\": 2, \"11\": 14}, \"componentB\": {\":version:\": 1, \"__module__\": \"gufe.components.smallmoleculecomponent\", \"__qualname__\": \"SmallMoleculeComponent\", \"atoms\": [[1, 0, 0, false, 0, 0, {}], [1, 0, 0, false, 0, 0, {}], [6, 0, 0, false, 0, 0, {}], [1, 0, 0, false, 0, 0, {}], [6, 0, 0, true, 0, 0, {}], [6, 0, 0, true, 0, 0, {}], [6, 0, 0, true, 0, 0, {}], [6, 0, 0, true, 0, 0, {}], [6, 0, 0, true, 0, 0, {}], [6, 0, 0, true, 0, 0, {}], [1, 0, 0, false, 0, 0, {}], [1, 0, 0, false, 0, 0, {}], [1, 0, 0, false, 0, 0, {}], [1, 0, 0, false, 0, 0, {}], [1, 0, 0, false, 0, 0, {}]], \"bonds\": [[0, 2, 1, 0, {}], [1, 2, 1, 0, {}], [2, 3, 1, 0, {}], [4, 5, 12, 0, {}], [4, 9, 12, 0, {}], [4, 10, 1, 0, {}], [5, 6, 12, 0, {}], [5, 11, 1, 0, {}], [6, 7, 12, 0, {}], [6, 12, 1, 0, {}], [7, 8, 12, 0, {}], [7, 13, 1, 0, {}], [2, 8, 1, 0, {}], [8, 9, 12, 0, {}], [9, 14, 1, 0, {}]], \"conformer\": [\"\\u0093NUMPY\\u0001\\u0000v\\u0000{'descr': '<f8', 'fortran_order': False, 'shape': (15, 3), }                                                         \\nc\\u00eeZB>\\u00e8<@[\\u00b1\\u00bf\\u00ec\\u009e|!@\\u00b0rh\\u0091\\u00ed|\\u0014@\\u00c3d\\u00aa`T2<@\\u009a\\b\\u001b\\u009e^I @\\u00caT\\u00c1\\u00a8\\u00a4\\u008e\\u001a@?\\u00c6\\u00dc\\u00b5\\u0084\\u00fc;@\\u00da\\u001b|a2\\u00d5 @$(~\\u008c\\u00b9k\\u0016@n\\u00a3\\u0001\\u00bc\\u0005B;@\\u00c0\\u00ec\\u009e<,t\\\"@\\u0084\\u009e\\u00cd\\u00aa\\u00cfU\\u0016@\\u00ee|?5^\\u00fa9@\\u0002+\\u0087\\u0016\\u00d9N\\u0015@\\u0004V\\u000e-\\u00b2\\u001d\\u0013@\\u0085\\u00ebQ\\u00b8\\u001ee:@\\u00b2\\u009d\\u00ef\\u00a7\\u00c6K\\u0014@\\u00cb\\u00a1E\\u00b6\\u00f3\\u00fd\\u000b@\\u00d7\\u00a3p=\\nW;@q=\\n\\u00d7\\u00a3p\\u0017@\\u009e\\u00ef\\u00a7\\u00c6K7\\u0007@\\u0083\\u00c0\\u00ca\\u00a1E\\u00d6;@\\u00c9v\\u00be\\u009f\\u001a\\u00af\\u001b@Zd;\\u00dfO\\u008d\\f@\\u00ecQ\\u00b8\\u001e\\u0085k;@b\\u0010X9\\u00b4\\u00c8\\u001c@\\u0006\\u0081\\u0095C\\u008bl\\u0013@sh\\u0091\\u00ed|\\u007f:@j\\u00bct\\u0093\\u0018\\u0084\\u0019@\\u00c7K7\\u0089A\\u00e0\\u0015@\\u00ed\\u009e<,\\u00d4:9@<N\\u00d1\\u0091\\\\\\u00be\\u0012@\\u0097\\u00ff\\u0090~\\u00fb\\u00fa\\u0014@\\u000f\\u009c3\\u00a2\\u00b4\\u00f79@\\u008d(\\u00ed\\r\\u00be\\u00f0\\u0010@\\u00f0\\u0016HP\\u00fc\\u0098\\u0007@\\u00aa\\u00f1\\u00d2Mb\\u00b0;@\\u00bc\\u0005\\u0012\\u0014?\\u0086\\u0016@\\u00c3d\\u00aa`TR\\u00fe?\\u00a6\\u009b\\u00c4 \\u00b0\\u0092<@\\u00dd$\\u0006\\u0081\\u0095C\\u001e@K\\u00ea\\u00044\\u0011\\u00b6\\b@9EGr\\u00f9/:@}?5^\\u00baI\\u001a@]m\\u00c5\\u00fe\\u00b2\\u00fb\\u0019@\", {}], \"molprops\": {\"ofe-name\": \"toluene\"}}}, \"name\": null, \"protocol\": {\":version:\": 1, \"__module__\": \"gufe.tests.test_protocol\", \"__qualname__\": \"DummyProtocol\", \"settings\": {\":is_custom:\": true, \"__class__\": \"DummySpecificSettings\", \"__module__\": \"gufe.tests.test_protocol\", \"forcefield_settings\": {\":is_custom:\": true, \"__class__\": \"OpenMMSystemGeneratorFFSettings\", \"__module__\": \"gufe.settings.models\", \"constraints\": \"hbonds\", \"forcefields\": [\"amber/ff14SB.xml\", \"amber/tip3p_standard.xml\", \"amber/tip3p_HFE_multivalent.xml\", \"amber/phosaa10.xml\"], \"hydrogen_mass\": 3.0, \"nonbonded_cutoff\": {\":is_custom:\": true, \"magnitude\": 1.0, \"pint_unit_registry\": \"openff_units\", \"unit\": \"nanometer\"}, \"nonbonded_method\": \"PME\", \"rigid_water\": true, \"small_molecule_forcefield\": \"openff-2.0.0\"}, \"n_repeats\": 21, \"thermo_settings\": {\":is_custom:\": true, \"__class__\": \"ThermoSettings\", \"__module__\": \"gufe.settings.models\", \"ph\": null, \"pressure\": null, \"redox_potential\": null, \"temperature\": {\":is_custom:\": true, \"magnitude\": 298.0, \"pint_unit_registry\": \"openff_units\", \"unit\": \"kelvin\"}}}}, \"stateA\": {\":version:\": 1, \"__module__\": \"gufe.chemicalsystem\", \"__qualname__\": \"ChemicalSystem\", \"components\": {\"ligand\": {\":version:\": 1, \"__module__\": \"gufe.components.smallmoleculecomponent\", \"__qualname__\": \"SmallMoleculeComponent\", \"atoms\": [[6, 0, 0, true, 0, 0, {}], [6, 0, 0, true, 0, 0, {}], [6, 0, 0, true, 0, 0, {}], [6, 0, 0, true, 0, 0, {}], [6, 0, 0, true, 0, 0, {}], [6, 0, 0, true, 0, 0, {}], [1, 0, 0, false, 0, 0, {}], [1, 0, 0, false, 0, 0, {}], [1, 0, 0, false, 0, 0, {}], [1, 0, 0, false, 0, 0, {}], [1, 0, 0, false, 0, 0, {}], [1, 0, 0, false, 0, 0, {}]], \"bonds\": [[0, 1, 12, 0, {}], [0, 5, 12, 0, {}], [0, 6, 1, 0, {}], [1, 2, 12, 0, {}], [1, 7, 1, 0, {}], [2, 3, 12, 0, {}], [2, 8, 1, 0, {}], [3, 4, 12, 0, {}], [3, 9, 1, 0, {}], [4, 5, 12, 0, {}], [4, 10, 1, 0, {}], [5, 11, 1, 0, {}]], \"conformer\": [\"\\u0093NUMPY\\u0001\\u0000v\\u0000{'descr': '<f8', 'fortran_order': False, 'shape': (12, 3), }                                                         \\n\\u00ee|?5^\\u00fa9@\\u0002+\\u0087\\u0016\\u00d9N\\u0015@\\u0004V\\u000e-\\u00b2\\u001d\\u0013@\\u0085\\u00ebQ\\u00b8\\u001ee:@\\u00b2\\u009d\\u00ef\\u00a7\\u00c6K\\u0014@\\u00cb\\u00a1E\\u00b6\\u00f3\\u00fd\\u000b@\\u00d7\\u00a3p=\\nW;@q=\\n\\u00d7\\u00a3p\\u0017@\\u009e\\u00ef\\u00a7\\u00c6K7\\u0007@\\u0083\\u00c0\\u00ca\\u00a1E\\u00d6;@\\u00c9v\\u00be\\u009f\\u001a\\u00af\\u001b@Zd;\\u00dfO\\u008d\\f@\\u00ecQ\\u00b8\\u001e\\u0085k;@b\\u0010X9\\u00b4\\u00c8\\u001c@\\u0006\\u0081\\u0095C\\u008bl\\u0013@sh\\u0091\\u00ed|\\u007f:@j\\u00bct\\u0093\\u0018\\u0084\\u0019@\\u00c7K7\\u0089A\\u00e0\\u0015@\\u00ed\\u009e<,\\u00d4:9@<N\\u00d1\\u0091\\\\\\u00be\\u0012@\\u0097\\u00ff\\u0090~\\u00fb\\u00fa\\u0014@\\u000f\\u009c3\\u00a2\\u00b4\\u00f79@\\u008d(\\u00ed\\r\\u00be\\u00f0\\u0010@\\u00f0\\u0016HP\\u00fc\\u0098\\u0007@\\u00aa\\u00f1\\u00d2Mb\\u00b0;@\\u00bc\\u0005\\u0012\\u0014?\\u0086\\u0016@\\u00c3d\\u00aa`TR\\u00fe?\\u00a6\\u009b\\u00c4 \\u00b0\\u0092<@\\u00dd$\\u0006\\u0081\\u0095C\\u001e@K\\u00ea\\u00044\\u0011\\u00b6\\b@RI\\u009d\\u0080&\\u00d2;@\\u0002\\u009a\\b\\u001b\\u009e\\u001e @z\\u00c7):\\u0092\\u008b\\u0015@9EGr\\u00f9/:@}?5^\\u00baI\\u001a@]m\\u00c5\\u00fe\\u00b2\\u00fb\\u0019@\", {}], \"molprops\": {\"ofe-name\": \"benzene\"}}, \"solvent\": {\":version:\": 1, \"__module__\": \"gufe.components.solventcomponent\", \"__qualname__\": \"SolventComponent\", \"ion_concentration\": \"0.15 molar\", \"negative_ion\": \"Cl-\", \"neutralize\": true, \"positive_ion\": \"K+\", \"smiles\": \"O\"}}, \"name\": \"\"}, \"stateB\": {\":version:\": 1, \"__module__\": \"gufe.chemicalsystem\", \"__qualname__\": \"ChemicalSystem\", \"components\": {\"ligand\": {\":version:\": 1, \"__module__\": \"gufe.components.smallmoleculecomponent\", \"__qualname__\": \"SmallMoleculeComponent\", \"atoms\": [[1, 0, 0, false, 0, 0, {}], [1, 0, 0, false, 0, 0, {}], [6, 0, 0, false, 0, 0, {}], [1, 0, 0, false, 0, 0, {}], [6, 0, 0, true, 0, 0, {}], [6, 0, 0, true, 0, 0, {}], [6, 0, 0, true, 0, 0, {}], [6, 0, 0, true, 0, 0, {}], [6, 0, 0, true, 0, 0, {}], [6, 0, 0, true, 0, 0, {}], [1, 0, 0, false, 0, 0, {}], [1, 0, 0, false, 0, 0, {}], [1, 0, 0, false, 0, 0, {}], [1, 0, 0, false, 0, 0, {}], [1, 0, 0, false, 0, 0, {}]], \"bonds\": [[0, 2, 1, 0, {}], [1, 2, 1, 0, {}], [2, 3, 1, 0, {}], [4, 5, 12, 0, {}], [4, 9, 12, 0, {}], [4, 10, 1, 0, {}], [5, 6, 12, 0, {}], [5, 11, 1, 0, {}], [6, 7, 12, 0, {}], [6, 12, 1, 0, {}], [7, 8, 12, 0, {}], [7, 13, 1, 0, {}], [2, 8, 1, 0, {}], [8, 9, 12, 0, {}], [9, 14, 1, 0, {}]], \"conformer\": [\"\\u0093NUMPY\\u0001\\u0000v\\u0000{'descr': '<f8', 'fortran_order': False, 'shape': (15, 3), }                                                         \\nc\\u00eeZB>\\u00e8<@[\\u00b1\\u00bf\\u00ec\\u009e|!@\\u00b0rh\\u0091\\u00ed|\\u0014@\\u00c3d\\u00aa`T2<@\\u009a\\b\\u001b\\u009e^I @\\u00caT\\u00c1\\u00a8\\u00a4\\u008e\\u001a@?\\u00c6\\u00dc\\u00b5\\u0084\\u00fc;@\\u00da\\u001b|a2\\u00d5 @$(~\\u008c\\u00b9k\\u0016@n\\u00a3\\u0001\\u00bc\\u0005B;@\\u00c0\\u00ec\\u009e<,t\\\"@\\u0084\\u009e\\u00cd\\u00aa\\u00cfU\\u0016@\\u00ee|?5^\\u00fa9@\\u0002+\\u0087\\u0016\\u00d9N\\u0015@\\u0004V\\u000e-\\u00b2\\u001d\\u0013@\\u0085\\u00ebQ\\u00b8\\u001ee:@\\u00b2\\u009d\\u00ef\\u00a7\\u00c6K\\u0014@\\u00cb\\u00a1E\\u00b6\\u00f3\\u00fd\\u000b@\\u00d7\\u00a3p=\\nW;@q=\\n\\u00d7\\u00a3p\\u0017@\\u009e\\u00ef\\u00a7\\u00c6K7\\u0007@\\u0083\\u00c0\\u00ca\\u00a1E\\u00d6;@\\u00c9v\\u00be\\u009f\\u001a\\u00af\\u001b@Zd;\\u00dfO\\u008d\\f@\\u00ecQ\\u00b8\\u001e\\u0085k;@b\\u0010X9\\u00b4\\u00c8\\u001c@\\u0006\\u0081\\u0095C\\u008bl\\u0013@sh\\u0091\\u00ed|\\u007f:@j\\u00bct\\u0093\\u0018\\u0084\\u0019@\\u00c7K7\\u0089A\\u00e0\\u0015@\\u00ed\\u009e<,\\u00d4:9@<N\\u00d1\\u0091\\\\\\u00be\\u0012@\\u0097\\u00ff\\u0090~\\u00fb\\u00fa\\u0014@\\u000f\\u009c3\\u00a2\\u00b4\\u00f79@\\u008d(\\u00ed\\r\\u00be\\u00f0\\u0010@\\u00f0\\u0016HP\\u00fc\\u0098\\u0007@\\u00aa\\u00f1\\u00d2Mb\\u00b0;@\\u00bc\\u0005\\u0012\\u0014?\\u0086\\u0016@\\u00c3d\\u00aa`TR\\u00fe?\\u00a6\\u009b\\u00c4 \\u00b0\\u0092<@\\u00dd$\\u0006\\u0081\\u0095C\\u001e@K\\u00ea\\u00044\\u0011\\u00b6\\b@9EGr\\u00f9/:@}?5^\\u00baI\\u001a@]m\\u00c5\\u00fe\\u00b2\\u00fb\\u0019@\", {}], \"molprops\": {\"ofe-name\": \"toluene\"}}, \"solvent\": {\":version:\": 1, \"__module__\": \"gufe.components.solventcomponent\", \"__qualname__\": \"SolventComponent\", \"ion_concentration\": \"0.15 molar\", \"negative_ion\": \"Cl-\", \"neutralize\": true, \"positive_ion\": \"K+\", \"smiles\": \"O\"}}, \"name\": \"\"}}"
  },
  {
    "path": "src/openfecli/tests/dev/__init__.py",
    "content": ""
  },
  {
    "path": "src/openfecli/tests/dev/write_transformation_json.py",
    "content": "\"\"\"\nWrite out the file that is used to test the quickrun command.\n\nThis will need to be run if the serialized transformation changes such that\nthe old file can't be read.\n\nUSAGE:\n\n    python write_transformation_json.py ../data/\n\n(Assuming you run from within this directory.)\n\"\"\"\n\nimport argparse\nimport json\nimport pathlib\n\nimport gufe\nfrom gufe.tests.conftest import benzene_modifications\nfrom gufe.tests.test_protocol import BrokenProtocol, DummyProtocol\n\nimport openfe\n\nparser = argparse.ArgumentParser()\nparser.add_argument(\"directory\")\nopts = parser.parse_args()\ndirectory = pathlib.Path(opts.directory)\nif not directory.exists() and directory.is_dir():\n    raise ValueError(f\"Bad parameter for directory: {directory}\")\n\nbenzene_modifications = benzene_modifications.__pytest_wrapped__.obj()\n\nbenzene = gufe.SmallMoleculeComponent.from_rdkit(benzene_modifications[\"benzene\"])\ntoluene = gufe.SmallMoleculeComponent.from_rdkit(benzene_modifications[\"toluene\"])\nsolvent = gufe.SolventComponent(positive_ion=\"K\", negative_ion=\"Cl\")\n\nbenz_dict = {\"ligand\": benzene}\ntol_dict = {\"ligand\": toluene}\nsolv_dict = {\"solvent\": solvent}\n\nsolv_benz = gufe.ChemicalSystem(dict(**benz_dict, **solv_dict))\nsolv_tol = gufe.ChemicalSystem(dict(**tol_dict, **solv_dict))\n\nmapper = openfe.setup.LomapAtomMapper()\nmapping = list(mapper.suggest_mappings(benzene, toluene))[0]\n\nprotocol = DummyProtocol(settings=DummyProtocol.default_settings())\n\ntransformation = gufe.Transformation(solv_benz, solv_tol, protocol, mapping)\nbad_protocol = BrokenProtocol(settings=BrokenProtocol.default_settings())\nbad_transformation = gufe.Transformation(solv_benz, solv_tol, bad_protocol, mapping)\n\ntransformation.to_json(directory / \"transformation.json\")\nbad_transformation.to_json(directory / \"bad_transformation.json\")\n"
  },
  {
    "path": "src/openfecli/tests/parameters/__init__.py",
    "content": ""
  },
  {
    "path": "src/openfecli/tests/parameters/test_mapper.py",
    "content": "import click\nimport pytest\n\nfrom openfe.setup import LomapAtomMapper\nfrom openfecli.parameters.mapper import get_atommapper\n\n\n@pytest.mark.parametrize(\n    \"user_input,expected\",\n    [\n        (\"LomapAtomMapper\", LomapAtomMapper),\n        (\"openfe.setup.LomapAtomMapper\", LomapAtomMapper),\n    ],\n)\ndef test_get_atommapper(user_input, expected):\n    assert get_atommapper(user_input) is expected\n\n\ndef test_get_atommapper_error():\n    with pytest.raises(click.BadParameter):\n        get_atommapper(\"foo\")\n"
  },
  {
    "path": "src/openfecli/tests/parameters/test_mol.py",
    "content": "from importlib import resources\n\nimport click\nimport pytest\n\nimport openfe\nfrom openfe import SmallMoleculeComponent\nfrom openfecli.parameters.mol import get_molecule\n\n\ndef test_get_molecule_smiles():\n    mol = get_molecule(\"CC\")\n    assert isinstance(mol, SmallMoleculeComponent)\n    assert mol.name == \"\"\n    assert mol.smiles == \"CC\"\n\n\ndef test_get_molecule_sdf():\n    with resources.as_file(resources.files(\"openfe.tests.data.serialization\")) as d:\n        filename = d / \"ethane_template.sdf\"\n        # Note: the template doesn't include a valid version, but it loads\n        # anyway. In the future, we may need to create a temporary file with\n        # template substitutions done, but that seemed like overkill now.\n        mol = get_molecule(filename)\n        assert mol.smiles == \"CC\"\n        assert mol.name == \"ethane\"\n\n\ndef test_get_molecule_mol2():\n    with resources.as_file(resources.files(\"openfe.tests.data.lomap_basic\")) as d:\n        f = d / \"toluene.mol2\"\n        mol = get_molecule(str(f))\n\n        assert mol.smiles == \"Cc1ccccc1\"\n\n\ndef test_get_molecule_error():\n    with pytest.raises(click.BadParameter):\n        get_molecule(\"foobar\")\n"
  },
  {
    "path": "src/openfecli/tests/parameters/test_molecules.py",
    "content": "import os\nfrom importlib import resources\n\nimport click\nimport pytest\n\nimport openfe\nfrom openfe import SmallMoleculeComponent\nfrom openfecli.parameters.molecules import load_molecules\n\n\ndef test_get_dir_molecules_sdf():\n    with resources.as_file(resources.files(\"openfe.tests.data.serialization\")) as dir_path:\n        # Note: the template doesn't include a valid version, but it loads\n        # anyway. In the future, we may need to create a temporary file with\n        # template substitutions done, but that seemed like overkill now.\n        mols = load_molecules(dir_path)\n\n        assert len(mols) == 1\n        assert mols[0].smiles == \"CC\"\n        assert mols[0].name == \"ethane\"\n\n\ndef test_load_molecules_sdf_file():\n    files = resources.files(\"openfe.tests.data\")\n    ref = files / \"benzene_modifications.sdf\"\n    with resources.as_file(ref) as path:\n        mols = load_molecules(path)\n\n    assert len(mols) == 7\n\n\ndef test_get_dir_molecules_mol2():\n    with resources.as_file(resources.files(\"openfe.tests.data.lomap_basic\")) as dir_path:\n        # Note: the template doesn't include a valid version, but it loads\n        # anyway. In the future, we may need to create a temporary file with\n        # template substitutions done, but that seemed like overkill now.\n        mols = load_molecules(dir_path)\n\n        assert len(mols) == 8\n        all_smiles = {mol.smiles for mol in mols}\n        all_names = {mol.name for mol in mols}\n        assert \"Cc1cc(C)c2cc(C)ccc2c1\" in all_smiles\n        assert \"*****\" in all_names\n\n\ndef test_get_molecule_error():\n    with pytest.raises(ValueError, match=\"Unable to find\"):\n        load_molecules(\"foobar\")\n"
  },
  {
    "path": "src/openfecli/tests/parameters/test_output.py",
    "content": "import pytest\n\nfrom openfecli.parameters.output import get_file_and_extension\n\n\n@pytest.mark.parametrize(\n    \"fname,expected_ext\",\n    [\n        (\"foo.bar\", \"bar\"),\n        (\"foo.bar.bz\", \"bz\"),\n    ],\n)\ndef test_get_file_and_extension(tmp_path, fname, expected_ext):\n    with open(tmp_path / fname, mode=\"w\") as file:\n        outfile, ext = get_file_and_extension(file, {})\n        assert outfile is file\n        assert ext == expected_ext\n"
  },
  {
    "path": "src/openfecli/tests/parameters/test_output_dir.py",
    "content": "import os\nimport pathlib\nfrom importlib import resources\n\nfrom openfecli.parameters.output_dir import get_dir\n\n\ndef test_get_output_dir():\n    with resources.as_file(resources.files(\"openfe.tests\")) as dir_path:\n        out_dir = get_dir(dir_path, None)\n\n        assert isinstance(out_dir, pathlib.Path)\n        assert out_dir.parent.exists()\n"
  },
  {
    "path": "src/openfecli/tests/parameters/test_plan_network_options.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\nimport pytest\n\nfrom openfecli.parameters import plan_network_options\n\n\n@pytest.fixture\ndef full_yaml():\n    return \"\"\"\\\nmapper:\n  method: LomapAtomMapper\n  settings:\n    timeout: 120.0\n\nnetwork:\n  method: generate_radial_network\n\"\"\"\n\n\n@pytest.fixture\ndef partial_mapper_yaml():\n    return \"\"\"\\\nmapper:\n  method: KartografAtomMapper\n  settings:\n    timeout: 120.0\n\"\"\"\n\n\n@pytest.fixture\ndef partial_network_yaml():\n    return \"\"\"\\\nnetwork:\n  method: generate_radial_network\n  settings:\n    scorer: default_lomap_scorer\n\"\"\"\n\n\n@pytest.fixture()\ndef unsupported_field_yaml():\n    return \"\"\"\\\nprotocol:\n  settings:\n    forcefield_settings:\n      small_molecule_forcefield: 'espaloma-0.2.2'\n    protocol_repeats: 2\n\"\"\"\n\n\ndef test_loading_full_yaml(full_yaml):\n    d = plan_network_options.parse_yaml_planner_options(full_yaml)\n\n    assert d\n    assert d.mapper\n    assert d.mapper.method == \"LomapAtomMapper\".lower()\n    assert d.mapper.settings[\"timeout\"] == 120\n    assert d.network\n    assert d.network.method == \"generate_radial_network\"\n\n\ndef test_loading_mapper_yaml(partial_mapper_yaml):\n    d = plan_network_options.parse_yaml_planner_options(partial_mapper_yaml)\n\n    assert d\n    assert d.mapper\n    assert d.mapper.method == \"KartografAtomMapper\".lower()\n    assert d.network is None\n\n\ndef test_loading_network_yaml(partial_network_yaml):\n    d = plan_network_options.parse_yaml_planner_options(partial_network_yaml)\n\n    assert d\n    assert d.mapper is None\n    assert d.network\n    assert d.network.method == \"generate_radial_network\"\n    assert d.network.settings[\"scorer\"] == \"default_lomap_scorer\"\n\n\ndef test_raise_unsupported_fields_warning(full_yaml, unsupported_field_yaml):\n    with pytest.warns(UserWarning, match=\"Ignoring unexpected section:\"):\n        d = plan_network_options.parse_yaml_planner_options(full_yaml + unsupported_field_yaml)\n\n    assert d.mapper\n    assert d.mapper.method == \"LomapAtomMapper\".lower()\n    assert d.mapper.settings[\"timeout\"] == 120\n    assert d.network\n    assert d.network.method == \"generate_radial_network\"\n"
  },
  {
    "path": "src/openfecli/tests/parameters/test_protein.py",
    "content": "from importlib import resources\n\nimport click\nimport pytest\nfrom rdkit import Chem\n\nfrom openfe import ProteinComponent, ProteinMembraneComponent\nfrom openfe.tests.conftest import a2a_protein_membrane_pdb\nfrom openfecli.parameters.protein import _get_protein, _get_protein_membrane\nfrom openfecli.tests.commands.test_plan_rbfe_network import protein_membrane_args\n\n\ndef test_load_protein_pdb():\n    with resources.as_file(resources.files(\"gufe.tests.data\")) as d:\n        filename = str(d / \"181l.pdb\")\n    protein_comp = _get_protein(filename, None)\n\n    assert isinstance(protein_comp, ProteinComponent)\n    assert isinstance(protein_comp.to_rdkit(), Chem.Mol)\n\n\ndef test_load_protein_pdbx():\n    with resources.as_file(resources.files(\"gufe.tests.data\")) as d:\n        filename = str(d / \"181l.cif\")\n    protein_comp = _get_protein(filename, None)\n\n    assert isinstance(protein_comp, ProteinComponent)\n    assert isinstance(protein_comp.to_rdkit(), Chem.Mol)\n\n\ndef test_load_protein_invalid_file_error():\n    with pytest.raises(click.exceptions.BadParameter, match=\"File extension must contain\"):\n        _get_protein(\"not_a_file.txt\", None)\n\n\ndef test_load_protein_with_membrane(a2a_protein_membrane_pdb):\n    \"\"\"A protein-membrane component passed to --protein won't fail here, but will be caught in validation downstream.\"\"\"\n\n    protein_comp = _get_protein(a2a_protein_membrane_pdb, None)\n    assert isinstance(protein_comp, ProteinComponent)\n    assert isinstance(protein_comp.to_rdkit(), Chem.Mol)\n\n\ndef test_load_membrane_pdb(a2a_protein_membrane_pdb):\n    protein_membrane_comp = _get_protein_membrane(a2a_protein_membrane_pdb, None)\n    assert isinstance(protein_membrane_comp, ProteinMembraneComponent)\n    assert isinstance(protein_membrane_comp.to_rdkit(), Chem.Mol)\n\n\ndef test_load_membrane_pdbx():\n    with resources.as_file(resources.files(\"gufe.tests.data\")) as d:\n        filename = str(d / \"a2a.cif.gz\")\n    protein_membrane_comp = _get_protein_membrane(filename, None)\n    assert isinstance(protein_membrane_comp, ProteinMembraneComponent)\n    assert isinstance(protein_membrane_comp.to_rdkit(), Chem.Mol)\n\n\ndef test_load_membrane_with_protein_only():\n    \"\"\"Should error if a protein-only system (like 181l.pdb) is loaded as a ProteinMembraneComponent.\"\"\"\n    with resources.as_file(resources.files(\"gufe.tests.data\")) as d:\n        filename = str(d / \"181l.pdb\")\n\n    with pytest.raises(click.exceptions.BadParameter, match=\"Could not determine box_vectors.\"):\n        _ = _get_protein_membrane(filename, None)\n"
  },
  {
    "path": "src/openfecli/tests/parameters/test_utils.py",
    "content": "import os\n\nimport pytest\nfrom plugcli.params import NOT_PARSED\n\nfrom openfecli.parameters.utils import import_parameter\n\n\n@pytest.mark.parametrize(\n    \"import_str,expected\",\n    [\n        (\"os.path.exists\", os.path.exists),\n        (\"os.getcwd\", os.getcwd),\n        (\"os.foo\", NOT_PARSED),\n        (\"foo.bar\", NOT_PARSED),\n        (\"foo\", NOT_PARSED),\n    ],\n)\ndef test_import_parameter(import_str, expected):\n    assert import_parameter(import_str) is expected\n"
  },
  {
    "path": "src/openfecli/tests/test_cli.py",
    "content": "import contextlib\nimport logging\n\nimport click.testing\nimport pytest\n\nfrom openfecli.cli import OpenFECLI, main\nfrom openfecli.plugins import OFECommandPlugin\n\n\n@click.command(\"null-command\", short_help=\"Do nothing (testing)\")\ndef null_command():\n    logger = logging.getLogger(\"null_command_logger\")\n    logger.info(\"Running null command\")\n\n\nPLUGIN = OFECommandPlugin(\n    command=null_command,\n    section=\"Analysis\",\n    requires_ofe=(0, 3),\n)\n\n\n@contextlib.contextmanager\ndef null_command_context(cli):\n    PLUGIN.attach_metadata(location=__file__, plugin_type=\"file\")\n    try:\n        cli._register_plugin(PLUGIN)\n        yield cli\n    finally:\n        cli._deregister_plugin(PLUGIN)\n\n\n@pytest.fixture\ndef cli():\n    return OpenFECLI()\n\n\nclass TestCLI:\n    def test_invoke(self):\n        runner = click.testing.CliRunner()\n        with runner.isolated_filesystem():\n            # isolated_filesystem is overkill here, but good practice for\n            # testing with CliRunner\n            result = runner.invoke(main, [\"-h\"])\n            assert result.exit_code == 0\n            assert \"Usage: openfe\" in result.output\n\n    def test_command_sections(self, cli):\n        # This test does not ensure the order of the sections, and does not\n        # prevent other sections from being added later. It only ensures\n        # that the main 4 sections continue to exist.\n        included = [\"Network Planning\", \"Quickrun Executor\", \"Miscellaneous\"]\n        for sec in included:\n            assert sec in cli.COMMAND_SECTIONS\n\n    def test_get_installed_plugins(self, cli):\n        # Test that we correctly load some plugins. This test only ensures\n        # that some plugins are loaded; it currently does nothing to ensure\n        # the identity of the specific plugins.\n        plugins = cli.get_installed_plugins()\n        for plugin in plugins:\n            assert isinstance(plugin, OFECommandPlugin)\n\n        assert len(plugins) > 0\n\n\n@pytest.mark.parametrize(\"with_log\", [True, False])\ndef test_main_log(with_log):\n    logged_text = \"Running null command\\n\"\n    logfile_text = \"\\n\".join(\n        [\n            \"[loggers]\",\n            \"keys=root\",\n            \"\",\n            \"[handlers]\",\n            \"keys=std\",\n            \"\",\n            \"[formatters]\",\n            \"keys=default\",\n            \"\",\n            \"[formatter_default]\",\n            \"format=%(message)s\",\n            \"\",\n            \"[handler_std]\",\n            \"class=StreamHandler\",\n            \"level=NOTSET\",\n            \"formatter=default\",\n            \"args=(sys.stdout,)\",\n            \"[logger_root]\",\n            \"level=DEBUG\",\n            \"handlers=std\",\n        ]\n    )\n    runner = click.testing.CliRunner()\n    invocation = [\"null_command\"]\n    if with_log:\n        invocation = [\"--log\", \"logging.conf\"] + invocation\n\n    expected = logged_text if with_log else \"\"\n\n    with runner.isolated_filesystem():\n        with open(\"logging.conf\", mode=\"w\") as log_conf:\n            log_conf.write(logfile_text)\n\n        with null_command_context(main):\n            result = runner.invoke(main, invocation)\n\n    found = result.stdout_bytes\n    assert found.decode(\"utf-8\") == expected\n"
  },
  {
    "path": "src/openfecli/tests/test_fetchables.py",
    "content": "import pathlib\n\nimport pytest\nfrom click.testing import CliRunner\n\nfrom openfecli.fetchables import RBFE_TUTORIAL, RBFE_TUTORIAL_RESULTS\nfrom openfecli.fetching import FetchablePlugin\n\nfrom .conftest import HAS_INTERNET\n\n\ndef fetchable_test(fetchable):\n    \"\"\"Unit test to ensure that a given FetchablePlugin works\"\"\"\n    assert isinstance(fetchable, FetchablePlugin)\n    expected_paths = [pathlib.Path(f) for f in fetchable.filenames]\n    runner = CliRunner()\n    if fetchable.fetcher.REQUIRES_INTERNET and not HAS_INTERNET:  # -no-cov-\n        pytest.skip(\"Internet seems to be unavailable\")\n    with runner.isolated_filesystem():\n        result = runner.invoke(fetchable.command, [\"-doutput-dir\"])\n        assert result.exit_code == 0\n        for path in expected_paths:\n            assert (pathlib.Path(\"output-dir\") / path).exists()\n\n\n@pytest.mark.flaky(reruns=3)  # in case of Too Many Request error\ndef test_rbfe_tutorial():\n    fetchable_test(RBFE_TUTORIAL)\n\n\n@pytest.mark.flaky(reruns=3)  # in case of Too Many Request error\ndef test_rbfe_tutorial_results():\n    fetchable_test(RBFE_TUTORIAL_RESULTS)\n"
  },
  {
    "path": "src/openfecli/tests/test_fetching.py",
    "content": "import pytest\n\nfrom openfecli.fetching import FetchablePlugin, PkgResourceFetcher, URLFetcher\n\nfrom .conftest import HAS_INTERNET\n\n\nclass FetcherTester:\n    @pytest.fixture\n    def fetcher(self):\n        raise NotImplementedError()\n\n    def test_resources(self):\n        raise NotImplementedError()\n\n    def test_plugin(self, fetcher):\n        # this is just a smoke test; individual plugins should test that\n        # they work\n        plugin = fetcher.plugin\n        assert isinstance(plugin, FetchablePlugin)\n\n    def test_call(self, fetcher, tmp_path):\n        # Here we just check that the machinery works. Each plugin should\n        # have a test to ensure that we're getting the right kind of file.\n        paths = [tmp_path / filename for _, filename in fetcher.resources]\n        for path in paths:\n            assert not path.exists()\n\n        fetcher(tmp_path)\n\n        for path in paths:\n            assert path.exists()\n\n\nclass TestURLFetcher(FetcherTester):\n    @pytest.fixture\n    def fetcher(self):\n        return URLFetcher(\n            resources=[(\"https://www.google.com/\", \"index.html\")],\n            short_name=\"google\",\n            short_help=\"The Goog\",\n            requires_ofe=(0, 7, 0),\n            long_help=\"Google, an Alphabet company\",\n        )\n\n    def test_resources(self, fetcher):\n        expected = [(\"https://www.google.com/\", \"index.html\")]\n        assert list(fetcher.resources) == expected\n\n    @pytest.mark.skipif(not HAS_INTERNET, reason=\"Internet seems to be unavailable\")\n    def test_call(self, fetcher, tmp_path):\n        super().test_call(fetcher, tmp_path)\n\n    @pytest.mark.skipif(not HAS_INTERNET, reason=\"Internet seems to be unavailable\")\n    def test_without_trailing_slash(self, tmp_path):\n        fetcher = URLFetcher(\n            resources=[(\"https://www.google.com\", \"index.html\")],\n            short_name=\"goog2\",\n            short_help=\"more goog\",\n            requires_ofe=(0, 7, 0),\n            long_help=\"What if you forget the trailing slash?\",\n        )\n\n        self.test_call(fetcher, tmp_path)\n\n\nclass TestPkgResourceFetcher(FetcherTester):\n    @pytest.fixture\n    def fetcher(self):\n        return PkgResourceFetcher(\n            resources=[(\"openfecli.tests\", \"test_fetching.py\")],\n            short_name=\"me\",\n            short_help=\"download this file\",\n            requires_ofe=(0, 7, 4),\n            long_help=\"whoa, meta.\",\n        )\n\n    def test_resources(self, fetcher):\n        expected = [(\"openfecli.tests\", \"test_fetching.py\")]\n        assert list(fetcher.resources) == expected\n"
  },
  {
    "path": "src/openfecli/tests/test_plugins.py",
    "content": "import click\n\nfrom openfecli.plugins import OFECommandPlugin\n\n\n@click.command(\"fake\")\ndef fake():\n    pass  # -no-cov-  a fake placeholder click subcommand\n\n\nclass TestOFECommandPlugin:\n    def setup_method(self):\n        self.plugin = OFECommandPlugin(\n            command=fake,\n            section=\"Some Section\",\n            requires_ofe=(0, 0, 1),\n        )\n\n    def test_plugin_setup(self):\n        assert self.plugin.command is fake\n        assert isinstance(self.plugin.command, click.Command)\n        assert self.plugin.section == \"Some Section\"\n        assert self.plugin.requires_lib == self.plugin.requires_cli\n        assert self.plugin.requires_lib == (0, 0, 1)\n        assert self.plugin.requires_cli == (0, 0, 1)\n"
  },
  {
    "path": "src/openfecli/tests/test_rbfe_tutorial.py",
    "content": "\"\"\"\nTests the easy start guide\n\n- runs plan_rbfe_network with tyk2 inputs and checks the network created\n- mocks the calculations and performs gathers on the mocked outputs\n\"\"\"\n\nimport os\nfrom importlib import resources\nfrom os import path\nfrom pathlib import Path\nfrom unittest import mock\n\nimport numpy as np\nimport pytest\nfrom click.testing import CliRunner\nfrom openff.units import unit\n\nfrom openfecli.commands.gather import gather\nfrom openfecli.commands.plan_rbfe_network import plan_rbfe_network\nfrom openfecli.commands.quickrun import quickrun\n\nfrom .utils import assert_click_success\n\n\n@pytest.fixture\ndef tyk2_ligands():\n    with resources.as_file(resources.files(\"openfecli.tests.data.rbfe_tutorial\")) as d:\n        yield str(d / \"tyk2_ligands.sdf\")\n\n\n@pytest.fixture\ndef tyk2_protein():\n    with resources.as_file(resources.files(\"openfecli.tests.data.rbfe_tutorial\")) as d:\n        yield str(d / \"tyk2_protein.pdb\")\n\n\n@pytest.fixture\ndef expected_transformations():\n    return [\n        \"rbfe_lig_ejm_31_solvent_lig_ejm_48_solvent.json\",\n        \"rbfe_lig_ejm_46_solvent_lig_jmc_28_solvent.json\",\n        \"rbfe_lig_jmc_27_complex_lig_jmc_28_complex.json\",\n        \"rbfe_lig_jmc_23_solvent_lig_jmc_28_solvent.json\",\n        \"rbfe_lig_ejm_42_solvent_lig_ejm_50_solvent.json\",\n        \"rbfe_lig_ejm_31_complex_lig_ejm_46_complex.json\",\n        \"rbfe_lig_ejm_31_solvent_lig_ejm_50_solvent.json\",\n        \"rbfe_lig_ejm_42_solvent_lig_ejm_43_solvent.json\",\n        \"rbfe_lig_ejm_31_complex_lig_ejm_47_complex.json\",\n        \"rbfe_lig_jmc_27_solvent_lig_jmc_28_solvent.json\",\n        \"rbfe_lig_jmc_23_complex_lig_jmc_28_complex.json\",\n        \"rbfe_lig_ejm_42_complex_lig_ejm_50_complex.json\",\n        \"rbfe_lig_ejm_31_solvent_lig_ejm_46_solvent.json\",\n        \"rbfe_lig_ejm_31_complex_lig_ejm_50_complex.json\",\n        \"rbfe_lig_ejm_42_complex_lig_ejm_43_complex.json\",\n        \"rbfe_lig_ejm_31_solvent_lig_ejm_47_solvent.json\",\n        \"rbfe_lig_ejm_31_complex_lig_ejm_48_complex.json\",\n        \"rbfe_lig_ejm_46_complex_lig_jmc_28_complex.json\",\n    ]\n\n\ndef test_plan_tyk2(tyk2_ligands, tyk2_protein, expected_transformations):\n    runner = CliRunner()\n\n    with runner.isolated_filesystem():\n        result = runner.invoke(\n            plan_rbfe_network,\n            [\n                \"-M\", tyk2_ligands,\n                \"-p\", tyk2_protein,\n            ],\n        )  # fmt: skip\n        assert_click_success(result)\n        assert path.exists(\"alchemicalNetwork/transformations\")\n        for f in expected_transformations:\n            assert path.exists(path.join(\"alchemicalNetwork/transformations\", f))\n        # make sure these are the only transforms\n        assert len(os.listdir(\"alchemicalNetwork/transformations\")) == len(expected_transformations)\n\n        # check that the correct default settings are used, we currently have no provenance on the object so check\n        # the output string\n        # check the atom mapper\n        assert \"Mapper: <KartografAtomMapper\" in result.output\n        # check the score method\n        assert \"Mapping Scorer: <function default_lomap_score\" in result.output\n        # check the network planner\n        assert \"Network Generation: <function generate_minimal_spanning_network\" in result.output\n        # check the partial charge method\n        assert \"Partial Charge Generation: am1bcc\" in result.output\n        # check the number of repeats\n        assert \"n_protocol_repeats=3\" in result.output\n\n\n@pytest.fixture\ndef ref_gather():\n    return \"\"\"\\\nLoading results:\nligand_i\\tligand_j\\tDDG(i->j) (kcal/mol)\\tuncertainty (kcal/mol)\nlig_ejm_31\\tlig_ejm_46\\t0.0\\t0.0\nlig_ejm_31\\tlig_ejm_47\\t0.0\\t0.0\nlig_ejm_31\\tlig_ejm_48\\t0.0\\t0.0\nlig_ejm_31\\tlig_ejm_50\\t0.0\\t0.0\nlig_ejm_42\\tlig_ejm_43\\t0.0\\t0.0\nlig_ejm_42\\tlig_ejm_50\\t0.0\\t0.0\nlig_ejm_46\\tlig_jmc_28\\t0.0\\t0.0\nlig_jmc_23\\tlig_jmc_28\\t0.0\\t0.0\nlig_jmc_27\\tlig_jmc_28\\t0.0\\t0.0\n\"\"\"\n\n\n@pytest.fixture\ndef fake_setup_execute_results():\n    \"\"\"Use for mocking the expensive _execute step and instead directly return plausible results.\"\"\"\n\n    def _fake_execute_results(*args, **kwargs):\n        return {\n            \"repeat_id\": kwargs[\"repeat_id\"],\n            \"generation\": kwargs[\"generation\"],\n            \"system\": Path(\"system.xml.bz2\"),\n            \"positions\": Path(\"positions.npy\"),\n            \"pdb_structure\": Path(\"hybrid_system.pdb\"),\n            \"selection_indices\": np.arange(50),\n        }\n\n    return _fake_execute_results\n\n\n@pytest.fixture\ndef fake_sim_execute_results():\n    \"\"\"Use for mocking the expensive _execute step and instead directly return plausible results.\"\"\"\n\n    def _fake_execute_results(*args, **kwargs):\n        return {\n            \"repeat_id\": kwargs[\"repeat_id\"],\n            \"generation\": kwargs[\"generation\"],\n            \"nc\": Path(\"file.nc\"),\n            \"checkpoint\": Path(\"chk.chk\"),\n        }\n\n    return _fake_execute_results\n\n\n@pytest.fixture\ndef fake_analysis_execute_results():\n    \"\"\"Use for mocking the expensive _execute step and instead directly return plausible results.\"\"\"\n\n    def _fake_execute_results(*args, **kwargs):\n        return {\n            \"repeat_id\": kwargs[\"repeat_id\"],\n            \"generation\": kwargs[\"generation\"],\n            \"pdb_structure\": Path(\"hybrid_system.pdb\"),\n            \"checkpoint\": Path(\"chk.chk\"),\n            \"selection_indices\": np.arange(50),\n            \"unit_estimate\": 4.2 * unit.kilocalories_per_mole,\n        }\n\n    return _fake_execute_results\n\n\ndef test_run_tyk2(\n    tyk2_ligands,\n    tyk2_protein,\n    expected_transformations,\n    fake_setup_execute_results,\n    fake_sim_execute_results,\n    fake_analysis_execute_results,\n    ref_gather,\n):\n    runner = CliRunner()\n    with runner.isolated_filesystem():\n        result_setup = runner.invoke(\n            plan_rbfe_network,\n            [\n                \"-M\", tyk2_ligands,\n                \"-p\", tyk2_protein,\n            ],\n        )  # fmt: skip\n\n        assert_click_success(result_setup)\n        with (\n            mock.patch(\n                \"openfe.protocols.openmm_rfe.hybridtop_units.HybridTopologySetupUnit._execute\",\n                side_effect=fake_setup_execute_results,\n            ),\n            mock.patch(\n                \"openfe.protocols.openmm_rfe.hybridtop_units.HybridTopologyMultiStateSimulationUnit._execute\",\n                side_effect=fake_sim_execute_results,\n            ),\n            mock.patch(\n                \"openfe.protocols.openmm_rfe.hybridtop_units.HybridTopologyMultiStateAnalysisUnit._execute\",\n                side_effect=fake_analysis_execute_results,\n            ),\n        ):\n            for f in expected_transformations:\n                fn = path.join(\"alchemicalNetwork/transformations\", f)\n                result_run = runner.invoke(quickrun, [fn])\n                assert_click_success(result_run)\n\n        result_gather = runner.invoke(gather, [\"--report\", \"ddg\", \".\", \"--tsv\"])\n\n        assert_click_success(result_gather)\n        assert result_gather.stdout == ref_gather\n"
  },
  {
    "path": "src/openfecli/tests/test_utils.py",
    "content": "import contextlib\nimport logging\nimport os\nfrom unittest.mock import patch\n\nimport pytest\n\nfrom openfecli.utils import _should_configure_logger, configure_logger, import_thing\n\n\n# looks like this can't be done as a fixture; related to\n# https://github.com/pytest-dev/pytest/issues/2974\n@contextlib.contextmanager\ndef patch_root_logger():\n    # use this to hide away some handlers that pytest attaches\n    old_manager = logging.Logger.manager\n    old_root = logging.root\n    new_root = logging.RootLogger(logging.WARNING)\n    manager = logging.Manager(new_root)\n\n    logging.Logger.manager = manager\n    logging.root = new_root\n    yield new_root\n    logging.Logger.manager = old_manager\n    logging.root = old_root\n\n\n@pytest.mark.parametrize(\n    \"import_string,expected\",\n    [\n        (\"os.path.exists\", os.path.exists),\n        (\"os.getcwd\", os.getcwd),\n        (\"os\", os),\n    ],\n)\ndef test_import_thing(import_string, expected):\n    assert import_thing(import_string) is expected\n\n\ndef test_import_thing_import_error():\n    with pytest.raises(ImportError):\n        import_thing(\"foo.bar\")\n\n\ndef test_import_thing_attribute_error():\n    with pytest.raises(AttributeError):\n        import_thing(\"os.foo\")\n\n\n@pytest.mark.parametrize(\n    \"logger_name, expected\",\n    [\n        (\"default\", True),\n        (\"default.default\", True),\n        (\"level\", False),\n        (\"level.default\", False),\n        (\"handler\", False),\n        (\"handler.default\", False),\n        (\"default.noprop\", False),\n    ],\n)\n@pytest.mark.parametrize(\"with_adapter\", [True, False])\ndef test_should_configure_logger(logger_name, expected, with_adapter):\n    with patch_root_logger():\n        logging.getLogger(\"level\").setLevel(logging.INFO)\n        logging.getLogger(\"handler\").addHandler(logging.NullHandler())\n        logging.getLogger(\"default.noprop\").propagate = False\n        logger = logging.getLogger(logger_name)\n        if with_adapter:\n            logger = logging.LoggerAdapter(logger, extra={\"foo\": \"bar\"})\n        assert _should_configure_logger(logger) == expected\n\n\ndef test_root_logger_level_configured():\n    with patch_root_logger():\n        root = logging.getLogger()\n        root.setLevel(logging.INFO)\n\n        logger = logging.getLogger(\"default.default\")\n        assert not _should_configure_logger(logger)\n\n\n@pytest.mark.parametrize(\"with_handler\", [True, False])\ndef test_configure_logger(with_handler):\n    handler = logging.NullHandler() if with_handler else None\n    expected_handlers = [handler] if handler else []\n    with patch_root_logger():\n        configure_logger(\"default.default\", handler=handler)\n        logger = logging.getLogger(\"default.default\")\n        parent = logging.getLogger(\"default\")\n        assert logger.isEnabledFor(logging.INFO)\n        assert not parent.isEnabledFor(logging.INFO)\n        assert logger.handlers == expected_handlers\n        assert parent.handlers == []\n"
  },
  {
    "path": "src/openfecli/tests/utils.py",
    "content": "\"\"\"Helper utilities for CLI tests\"\"\"\n\nimport traceback\n\nimport click\n\n\ndef assert_click_success(result: click.testing.Result):  # -no-cov-\n    \"\"\"Pass through error message if a click test fails.\n    Taken from https://github.com/openpathsampling/openpathsampling-cli/blob/main/paths_cli/commands/pathsampling.py\n    \"\"\"\n    if result.exit_code != 0:\n        print(result.output)\n        traceback.print_tb(result.exc_info[2])\n        print(result.exc_info[0], result.exc_info[1])\n    assert result.exit_code == 0\n"
  },
  {
    "path": "src/openfecli/utils.py",
    "content": "# This code is part of OpenFE and is licensed under the MIT license.\n# For details, see https://github.com/OpenFreeEnergy/openfe\n\nimport functools\nimport importlib\nimport logging\nfrom datetime import datetime\nfrom typing import Callable, Optional\n\nimport click\n\n\ndef import_thing(import_string: str):\n    \"\"\"Obtain an object from a valid qualname (or fully qualified name)\n\n    Parameters\n    ----------\n    import_string : str\n        the qualname\n\n    Returns\n    -------\n    Any :\n        the object from that namespace\n    \"\"\"\n    splitted = import_string.split(\".\")\n    if len(splitted) > 1:\n        # if the string has a dot, import the module and getattr the object\n        obj = splitted[-1]\n        mod = \".\".join(splitted[:-1])\n        module = importlib.import_module(mod)\n        result = getattr(module, obj)\n    else:\n        # if there is no dot, import and return the module\n        mod = splitted[0]\n        result = importlib.import_module(mod)\n    return result\n\n\ndef write(string: str):\n    \"\"\"\n\n    This is abstracted so that we can change output mechanism here and it\n    will automatically update in all commands.\n    \"\"\"\n    click.echo(string)\n\n\ndef _should_configure_logger(logger: logging.Logger):\n    \"\"\"Determine whether a logger should be configured.\n\n    Separated from configure_logger for ease of testing.\n    \"\"\"\n    if isinstance(logger, logging.LoggerAdapter):\n        logger = logger.logger\n\n    if logger.hasHandlers():\n        return False\n\n    # walk up the logging tree to see if any parent loggers are not default\n    _logger = logger\n    while (\n        _logger.parent is not None  # not the root logger\n        and _logger.level == logging.NOTSET  # level not already set\n        and _logger.propagate  # configured to use parent when not set\n    ):\n        _logger = _logger.parent\n\n    is_default = (_logger == logging.root and _logger.level == logging.WARNING)  # fmt: skip\n\n    return is_default\n\n\ndef configure_logger(\n    logger_name: str,\n    level: int = logging.INFO,\n    *,\n    handler: Optional[logging.Handler] = None,\n):\n    \"\"\"Configure the logger at ``logger_name`` to be at ``level``.\n\n    This is used to prevent accidentally overwriting existing logging\n    configurations.\n\n    This is particularly useful for setting INFO-level log messages to be\n    seen in the CLI (with the default handler/formatter).\n\n    Parameters\n    ----------\n    logger_name: str\n        name of the logger to configure\n    level: int\n        level to set the logger to use, typically one of the constants\n        defined in the ``logging`` module.\n    \"\"\"\n    logger = logging.getLogger(logger_name)\n\n    if _should_configure_logger(logger):\n        logger.setLevel(level)\n        if handler is not None:\n            logger.addHandler(handler)\n\n\ndef print_duration(function: Callable) -> Callable:\n    \"\"\"\n    Helper function to denote that a function should print a duration information.\n    A function decorated with this decorator will print out the execution time of\n    the decorated function.\n\n    \"\"\"\n\n    @functools.wraps(function)\n    def wrapper(*args, **kwargs):\n        start_time = datetime.now()\n\n        result = function(*args, **kwargs)\n\n        end_time = datetime.now()\n        duration = end_time - start_time\n        write(\"\\tDuration: \" + str(duration) + \"\\n\")\n        return result\n\n    return wrapper\n"
  }
]