From 14081e81e9497c53081b1844b563b8e5cf64e517 Mon Sep 17 00:00:00 2001 From: Donald Chung <37064034+DonaldChung-HK@users.noreply.github.com> Date: Fri, 1 Jul 2022 13:46:39 +0100 Subject: [PATCH 01/26] update readme for CCP Biosim --- README.md | 25 ++----------------------- 1 file changed, 2 insertions(+), 23 deletions(-) diff --git a/README.md b/README.md index 3403698..9925ca4 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,7 @@ CodeEntropy ============================== [//]: # (Badges) -[![GitHub Actions Build Status](https://github.com/DonaldChung-HK/CodeEntropy/workflows/CI/badge.svg)](https://github.com/DonaldChung-HK/CodeEntropy/actions?query=workflow%3ACI) -[![codecov](https://codecov.io/gh/DonaldChung-HK/CodeEntropy/branch/main/graph/badge.svg)](https://codecov.io/gh/DonaldChung-HK/CodeEntropy/branch/main) +[![GitHub Actions Build Status](https://github.com/CCPBioSim/CodeEntropy/workflows/CI/badge.svg)](https://github.com/CCPBioSim/CodeEntropy/actions?query=workflow%3ACI) CodeEntropy tool with POSEIDON code integrated to form a complete and generally applicable set of tools for calculating entropy @@ -74,29 +73,9 @@ The program assumes the following default unit | mass | u | | force | kJ/(mol·Å) | -## Script Examples -See `Example` folder -You can add your own trajectories by editing the path in the python script to point to your own trajectories -### `create_new_universe.py` -This repo uses MDAnalysis to parse values and it can only parse force natively for GROMACS TRR and AMBER NETCDF. This scripts shows you how to create a new universe from unsuppported data so that you can use trajectories created from other simulation software or reduce the size of universe to focus on a section of simulation. -### `CodeEntropy_non_topo.py` -Calculate entropy of target trajectory non topographical level with a no water lysozyme trajectory -### `CodeEntropy_topo.py` -Calculate entropy of target trajectory based on different method with a no water lysozyme trajectory -### `Poseidon_GROMACS` -Run POSEIDON analysis for a GROMACS trajectories with a lysozyme in water -### `Poseidon_LAMMPS` -A LAMMPS example for POSEIDON this is a capped amino acid example (note the force unit of this trajectory is based on KCal not KJ) -### `mcc_mdanalysis` -A DNA example for CodeEntropy without using function to show the inner working of CodeEntropy -### `mcc_mdanalysis_multiprocess` -mcc_mdanalysis with multiprocess parallelization -### `CodeEntropy_DNA.py` -the DNA strand example but with updated generalized CodeEntropy functions - ## Copyright -Copyright (c) 2022, DonaldChung-HK +Copyright (c) 2022, DonaldChung-HK, CCPBioSim ## Acknowledgements From e638263956a7b399b5e38c876fdc625def8694cd Mon Sep 17 00:00:00 2001 From: Donald Chung <37064034+DonaldChung-HK@users.noreply.github.com> Date: Fri, 1 Jul 2022 13:49:22 +0100 Subject: [PATCH 02/26] testing CI and remove method 3 and 4 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9925ca4..d401a6d 100644 --- a/README.md +++ b/README.md @@ -49,7 +49,7 @@ CodeEntropyPoseidon -h | `--wm` | Do entropy calculation at whole molecule level (The whole molecule is treated as one single bead.). | Flag, activate when included | Flag | | `--res` | Do entropy calculation at residue level (A residue as a whole represents a bead.). | Flag, activate when included | Flag | | `--uatom` | Do entropy calculation at united atom level (A heavy atom and its covalently bonded H-atoms for an united atom and represent a bead.). | Flag, activate when included | Flag | -| `--topog` | Compute the topographical entropy using | `0`: no topographical analysis | `int` | +| `--topog` | Compute the topographical entropy using | `0`: no topographical analysis | `int` | | `--solwm` | Do water entropy calculation at residue level (The whole molecule is treated as one single bead.). | Flag, activate when included | Flag | | `--solres` | Do water entropy calculation at residue level (A residue as a whole represents a bead. | Flag, activate when included | Flag | | `--soluatom` | Do solution entropy calculation at united atom level (A heavy atom and its covalently bonded H-atoms for an united atom and represent a bead.). | Flag, activate when included | Flag | From 8795f3aa1936f423ee766601c2c3b81f677745a0 Mon Sep 17 00:00:00 2001 From: Donald Chung <37064034+DonaldChung-HK@users.noreply.github.com> Date: Fri, 1 Jul 2022 14:00:39 +0100 Subject: [PATCH 03/26] Fast forwarded --- README.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/README.md b/README.md index 826c9ef..d401a6d 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,5 @@ CodeEntropy ============================== -!!! This repo is now moved to [CCPBioSim/CodeEntropy](https://github.com/CCPBioSim/CodeEntropy). Please check there for the latest version. - - - [//]: # (Badges) [![GitHub Actions Build Status](https://github.com/CCPBioSim/CodeEntropy/workflows/CI/badge.svg)](https://github.com/CCPBioSim/CodeEntropy/actions?query=workflow%3ACI) From 56ef539777834ff9df5ede7fdc59cb685a367cec Mon Sep 17 00:00:00 2001 From: Donald Chung <37064034+DonaldChung-HK@users.noreply.github.com> Date: Mon, 4 Jul 2022 11:36:43 +0100 Subject: [PATCH 04/26] See if new line make list show in Readthedocs --- docs/getting_started.rst | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/getting_started.rst b/docs/getting_started.rst index 5b31681..cf5bb62 100644 --- a/docs/getting_started.rst +++ b/docs/getting_started.rst @@ -3,7 +3,8 @@ Getting Started Requirements ---------------- -* Python >3.9 + +* Python > 3.9 * gcc * g++ @@ -185,4 +186,4 @@ Example CodeEntropyPoseidon -f "Example/data/md_A4_dna.tpr" "Example/data/md_A4_dna_xf.trr" -a "C5'" "C4'" "C3'" -l "all" -t 8 --wm --res --uatom --topog 5 # example 2 lysozyme in water - CodeEntropyPoseidon -f "Example/data/1AKI_prod_60.tpr" "Example/data/1AKI_prod_60.trr" -l "protein" -b 1 -e 30 -d 2 --wm --res --uatom --topog 1 --solwm --solres --soluatom --solContact \ No newline at end of file + CodeEntropyPoseidon -f "Example/data/1AKI_prod_60.tpr" "Example/data/1AKI_prod_60.trr" -l "protein" -b 1 -e 30 -d 2 --wm --res --uatom --topog 1 --solwm --solres --soluatom --solContact From 1aa9f1b6749b693509194a02305728ab07036095 Mon Sep 17 00:00:00 2001 From: DonaldChung-HK Date: Tue, 5 Jul 2022 15:55:34 +0100 Subject: [PATCH 05/26] testing setup.py changes --- setup.cfg | 3 +++ setup.py | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/setup.cfg b/setup.cfg index 865d33c..4e6d5d5 100644 --- a/setup.cfg +++ b/setup.cfg @@ -7,6 +7,9 @@ omit = */tests/* # Omit generated versioneer CodeEntropy/_version.py + # Omit the Examples + */Example/* + Example/* [yapf] # YAPF, in .style.yapf files this shows up as "[style]" header diff --git a/setup.py b/setup.py index 18541ed..019ef72 100644 --- a/setup.py +++ b/setup.py @@ -22,8 +22,8 @@ setup( # Self-descriptive entries which should always be present name='CodeEntropy', - author='Arghya \"Argo\" Chakravorty, DonaldChung-HK', - author_email='arghyac@umich.edu, lpchungaa@gmail.com', + author='Arghya \"Argo\" Chakravorty, Jas Kalayan, DonaldChung-HK', + author_email='arghyac@umich.edu, jas.kalayan@manchester.ac.uk, donald.chung@stfc.ac.uk', description=short_description, long_description=long_description, long_description_content_type="text/markdown", From 725e2c28e2f434cdde87ea27ddee02e55fab720d Mon Sep 17 00:00:00 2001 From: DonaldChung-HK Date: Tue, 5 Jul 2022 16:01:01 +0100 Subject: [PATCH 06/26] testing setup.py changes --- setup.cfg | 3 +++ setup.py | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/setup.cfg b/setup.cfg index 865d33c..4e6d5d5 100644 --- a/setup.cfg +++ b/setup.cfg @@ -7,6 +7,9 @@ omit = */tests/* # Omit generated versioneer CodeEntropy/_version.py + # Omit the Examples + */Example/* + Example/* [yapf] # YAPF, in .style.yapf files this shows up as "[style]" header diff --git a/setup.py b/setup.py index 18541ed..019ef72 100644 --- a/setup.py +++ b/setup.py @@ -22,8 +22,8 @@ setup( # Self-descriptive entries which should always be present name='CodeEntropy', - author='Arghya \"Argo\" Chakravorty, DonaldChung-HK', - author_email='arghyac@umich.edu, lpchungaa@gmail.com', + author='Arghya \"Argo\" Chakravorty, Jas Kalayan, DonaldChung-HK', + author_email='arghyac@umich.edu, jas.kalayan@manchester.ac.uk, donald.chung@stfc.ac.uk', description=short_description, long_description=long_description, long_description_content_type="text/markdown", From cb4f95042cb035e28a35c4894e9bcaccc4d5bdc1 Mon Sep 17 00:00:00 2001 From: DonaldChung-HK Date: Tue, 5 Jul 2022 16:21:39 +0100 Subject: [PATCH 07/26] fixed classifier --- setup.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index 019ef72..853afc0 100644 --- a/setup.py +++ b/setup.py @@ -56,8 +56,8 @@ # Manual control if final package is compressible or not, set False to prevent the .egg from being made # zip_safe=False, ## REQUIREMENTS ## - classifiers = ['Programming Language :: Python :: 3.9', - 'Intended Audience :: Users'], + classifiers = ['Programming Language :: Python :: 3', + 'Intended Audience :: Science/Research'], # can be run as a zip zip_safe = False, From 4c8915148652c0bb899b8e58ad392a4fb175e2f5 Mon Sep 17 00:00:00 2001 From: DonaldChung-HK Date: Tue, 5 Jul 2022 16:38:02 +0100 Subject: [PATCH 08/26] exclude full lysozyme trajectory in build --- MANIFEST.in | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/MANIFEST.in b/MANIFEST.in index aaeee58..3aa4c7e 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -4,4 +4,7 @@ include CODE_OF_CONDUCT.md include versioneer.py graft CodeEntropy -global-exclude *.py[cod] __pycache__ *.so \ No newline at end of file +global-exclude *.py[cod] __pycache__ *.so + +exclude CodeEntropy/tests/data/1AKI_prod_60.trr +exclude CodeEntropy/tests/data/1AKI_prod_60.tpr \ No newline at end of file From fae055fb55be0c4e2b2482f5fb106bc7f10ec32c Mon Sep 17 00:00:00 2001 From: DonaldChung-HK Date: Wed, 6 Jul 2022 07:57:50 +0100 Subject: [PATCH 09/26] add github action to test build and upload to pypi if tagged --- .github/workflows/CI.yaml | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/.github/workflows/CI.yaml b/.github/workflows/CI.yaml index 7f0fab3..be7eba0 100644 --- a/.github/workflows/CI.yaml +++ b/.github/workflows/CI.yaml @@ -80,3 +80,16 @@ jobs: if: runner.os == 'Linux' run: | CodeEntropyPoseidon -f "CodeEntropy/tests/data/1AKI_prod_60.tpr" "CodeEntropy/tests/data/1AKI_prod_60.trr" -l "protein" -b 2 -e 12 -d 2 -t 2 --wm --res --uatom --topog 5 --solwm --solres --soluatom --solContact + + publish: + name: Publish to pypi if tagged + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-python@v2 + - uses: casperdcl/deploy-pypi@v2 + with: + password: ${{ secrets.PYPI_API_TOKEN }} + pip: wheel -w dist/ --no-deps . + # only upload if a tag is pushed (otherwise just build & check) + upload: ${{ github.event_name == 'push' && startsWith(github.event.ref, 'refs/tags') }} \ No newline at end of file From 609fc943395137d9ff18770511c0df5bbb2748be Mon Sep 17 00:00:00 2001 From: DonaldChung-HK Date: Wed, 6 Jul 2022 07:58:20 +0100 Subject: [PATCH 10/26] update docs to us pypi --- README.md | 2 +- docs/getting_started.rst | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index d401a6d..88a7554 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ See [CodeEntropy’s documentation](https://codeentropy.readthedocs.io/en/latest ### Install via ``` -pip install . +pip install CodeEntropy ``` ### Command-line tool diff --git a/docs/getting_started.rst b/docs/getting_started.rst index cf5bb62..559691b 100644 --- a/docs/getting_started.rst +++ b/docs/getting_started.rst @@ -14,7 +14,7 @@ Run the following at the root directory of this repository .. code-block:: bash - pip install . + pip install CodeEntropy Units ------------ From ddcdb92e146a4f1a48654b8bc04588034eff925b Mon Sep 17 00:00:00 2001 From: DonaldChung-HK Date: Wed, 6 Jul 2022 08:04:26 +0100 Subject: [PATCH 11/26] change publish to run only if passed test --- .github/workflows/publish.yaml | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 .github/workflows/publish.yaml diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml new file mode 100644 index 0000000..2cdc7a5 --- /dev/null +++ b/.github/workflows/publish.yaml @@ -0,0 +1,21 @@ +name: Publish + +on: + workflow_run: + workflows: ["CI"] + types: + - completed + +jobs: + publish: + name: Publish to pypi if tagged + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-python@v2 + - uses: casperdcl/deploy-pypi@v2 + with: + password: ${{ secrets.PYPI_API_TOKEN }} + pip: wheel -w dist/ --no-deps . + # only upload if a tag is pushed (otherwise just build & check) + upload: ${{ github.event_name == 'push' && startsWith(github.event.ref, 'refs/tags') }} \ No newline at end of file From 74a79032ed692cdc04b08cff158d4d7c72ab578c Mon Sep 17 00:00:00 2001 From: DonaldChung-HK Date: Wed, 6 Jul 2022 08:07:12 +0100 Subject: [PATCH 12/26] removed artifact --- .github/workflows/CI.yaml | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/.github/workflows/CI.yaml b/.github/workflows/CI.yaml index be7eba0..f566203 100644 --- a/.github/workflows/CI.yaml +++ b/.github/workflows/CI.yaml @@ -79,17 +79,4 @@ jobs: shell: bash if: runner.os == 'Linux' run: | - CodeEntropyPoseidon -f "CodeEntropy/tests/data/1AKI_prod_60.tpr" "CodeEntropy/tests/data/1AKI_prod_60.trr" -l "protein" -b 2 -e 12 -d 2 -t 2 --wm --res --uatom --topog 5 --solwm --solres --soluatom --solContact - - publish: - name: Publish to pypi if tagged - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - uses: actions/setup-python@v2 - - uses: casperdcl/deploy-pypi@v2 - with: - password: ${{ secrets.PYPI_API_TOKEN }} - pip: wheel -w dist/ --no-deps . - # only upload if a tag is pushed (otherwise just build & check) - upload: ${{ github.event_name == 'push' && startsWith(github.event.ref, 'refs/tags') }} \ No newline at end of file + CodeEntropyPoseidon -f "CodeEntropy/tests/data/1AKI_prod_60.tpr" "CodeEntropy/tests/data/1AKI_prod_60.trr" -l "protein" -b 2 -e 12 -d 2 -t 2 --wm --res --uatom --topog 5 --solwm --solres --soluatom --solContact \ No newline at end of file From 944441c510457d54b85f46e17fb891dbd721de9a Mon Sep 17 00:00:00 2001 From: DonaldChung-HK Date: Wed, 6 Jul 2022 08:37:04 +0100 Subject: [PATCH 13/26] 0.3.6 test From 29fe0327ac387a5de75c62585e0712394434498d Mon Sep 17 00:00:00 2001 From: DonaldChung-HK Date: Wed, 6 Jul 2022 09:51:42 +0100 Subject: [PATCH 14/26] remove publish github action --- .github/workflows/publish.yaml | 21 --------------------- 1 file changed, 21 deletions(-) delete mode 100644 .github/workflows/publish.yaml diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml deleted file mode 100644 index 2cdc7a5..0000000 --- a/.github/workflows/publish.yaml +++ /dev/null @@ -1,21 +0,0 @@ -name: Publish - -on: - workflow_run: - workflows: ["CI"] - types: - - completed - -jobs: - publish: - name: Publish to pypi if tagged - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - uses: actions/setup-python@v2 - - uses: casperdcl/deploy-pypi@v2 - with: - password: ${{ secrets.PYPI_API_TOKEN }} - pip: wheel -w dist/ --no-deps . - # only upload if a tag is pushed (otherwise just build & check) - upload: ${{ github.event_name == 'push' && startsWith(github.event.ref, 'refs/tags') }} \ No newline at end of file From 9a123b8c40bd9baf7ffe3c07321eb7ed149576bc Mon Sep 17 00:00:00 2001 From: DonaldChung-HK Date: Wed, 13 Jul 2022 16:54:56 +0100 Subject: [PATCH 15/26] fixed readme.md and updated topog method --- .github/workflows/CI.yaml | 2 +- README.md | 6 +++--- docs/getting_started.rst | 8 ++------ scripts/CodeEntropyPoseidon | 2 +- 4 files changed, 7 insertions(+), 11 deletions(-) diff --git a/.github/workflows/CI.yaml b/.github/workflows/CI.yaml index f566203..86a1e3a 100644 --- a/.github/workflows/CI.yaml +++ b/.github/workflows/CI.yaml @@ -79,4 +79,4 @@ jobs: shell: bash if: runner.os == 'Linux' run: | - CodeEntropyPoseidon -f "CodeEntropy/tests/data/1AKI_prod_60.tpr" "CodeEntropy/tests/data/1AKI_prod_60.trr" -l "protein" -b 2 -e 12 -d 2 -t 2 --wm --res --uatom --topog 5 --solwm --solres --soluatom --solContact \ No newline at end of file + CodeEntropyPoseidon -f "CodeEntropy/tests/data/1AKI_prod_60.tpr" "CodeEntropy/tests/data/1AKI_prod_60.trr" -l "protein" -b 2 -e 12 -d 2 -t 2 --wm --res --uatom --topog 3 --solwm --solres --soluatom --solContact \ No newline at end of file diff --git a/README.md b/README.md index 88a7554..b767327 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,7 @@ CodeEntropyPoseidon -h | `-l`, `--selectString` | Selection string for CodeEntropy such as protein or resid, refer to `MDAnalysis.select_atoms` for more information. | `"all"`: select all atom in trajectory for CodeEntropy analysis for trajectory without solvent | `str` | | `-b`, `--begin` | Start analysing the trajectory from this frame index. | `0`: From begining | `int` | | `-e`, `--end` | Stop analysing the trajectory at this frame index | `-1`: end of trajectory | `int` | -| `-d`, `--step` | Stop analysing the trajectory at this frame index | `1` | `int` | +| `-d`, `--step` | Steps between frame | `1` | `int` | | `-k`, `--tempra` | Temperature for entropy calculation (K) | `298.0` | `float` | | `-t`, `--thread` | How many multiprocess to use. | `1`: for single core execution | `int` | | `-o`, `--out` | Name of the file where the text format output will be written. | `outfile.out` | `str` | @@ -49,7 +49,7 @@ CodeEntropyPoseidon -h | `--wm` | Do entropy calculation at whole molecule level (The whole molecule is treated as one single bead.). | Flag, activate when included | Flag | | `--res` | Do entropy calculation at residue level (A residue as a whole represents a bead.). | Flag, activate when included | Flag | | `--uatom` | Do entropy calculation at united atom level (A heavy atom and its covalently bonded H-atoms for an united atom and represent a bead.). | Flag, activate when included | Flag | -| `--topog` | Compute the topographical entropy using
  • 1 : pLogP method (will separate between backbone and side chain)
  • 2: Corr. pLogP method (will separate between backbone and side chain)
  • 5: Corr. pLogP after adaptive enumeration of states
| `0`: no topographical analysis | `int` | +| `--topog` | Compute the topographical entropy using
  • 1 : pLogP method (will separate between backbone and side chain)
  • 2: Corr. pLogP method (will separate between backbone and side chain)
  • 3: Corr. pLogP after adaptive enumeration of states
| `0`: no topographical analysis | `int` | | `--solwm` | Do water entropy calculation at residue level (The whole molecule is treated as one single bead.). | Flag, activate when included | Flag | | `--solres` | Do water entropy calculation at residue level (A residue as a whole represents a bead. | Flag, activate when included | Flag | | `--soluatom` | Do solution entropy calculation at united atom level (A heavy atom and its covalently bonded H-atoms for an united atom and represent a bead.). | Flag, activate when included | Flag | @@ -57,7 +57,7 @@ CodeEntropyPoseidon -h #### Example ``` # example 1 DNA -CodeEntropyPoseidon -f "Example/data/md_A4_dna.tpr" "Example/data/md_A4_dna_xf.trr" -a "C5'" "C4'" "C3'" -l "all" -t 8 --wm --res --uatom --topog 5 +CodeEntropyPoseidon -f "Example/data/md_A4_dna.tpr" "Example/data/md_A4_dna_xf.trr" -a "C5'" "C4'" "C3'" -l "all" -t 8 --wm --res --uatom --topog 3 # example 2 lysozyme in water CodeEntropyPoseidon -f "Example/data/1AKI_prod_60.tpr" "Example/data/1AKI_prod_60.trr" -l "protein" -b 1 -e 30 -d 2 --wm --res --uatom --topog 1 --solwm --solres --soluatom --solContact diff --git a/docs/getting_started.rst b/docs/getting_started.rst index 559691b..2e66af0 100644 --- a/docs/getting_started.rst +++ b/docs/getting_started.rst @@ -55,10 +55,6 @@ For help Arguments ^^^^^^^^^^^^^ -.. Warning:: - - Method 3 and 4 for topographical analysis is still in development!!! - .. list-table:: Arguments :widths: 20 30 10 10 :class: tight-table @@ -156,7 +152,7 @@ Arguments - Compute the topographical entropy using : * 1 : pLogP method (will separate between backbone and side chain) * 2 : Corr. pLogP method (will separate between backbone and side chain) - * 5 : Corr. pLogP after adaptive enumeration of states + * 3 : Corr. pLogP after adaptive enumeration of states - ``0`` : no topographical analysis - ``int`` * - ``--solwm`` @@ -183,7 +179,7 @@ Example .. code-block:: bash # example 1 DNA - CodeEntropyPoseidon -f "Example/data/md_A4_dna.tpr" "Example/data/md_A4_dna_xf.trr" -a "C5'" "C4'" "C3'" -l "all" -t 8 --wm --res --uatom --topog 5 + CodeEntropyPoseidon -f "Example/data/md_A4_dna.tpr" "Example/data/md_A4_dna_xf.trr" -a "C5'" "C4'" "C3'" -l "all" -t 8 --wm --res --uatom --topog 3 # example 2 lysozyme in water CodeEntropyPoseidon -f "Example/data/1AKI_prod_60.tpr" "Example/data/1AKI_prod_60.trr" -l "protein" -b 1 -e 30 -d 2 --wm --res --uatom --topog 1 --solwm --solres --soluatom --solContact diff --git a/scripts/CodeEntropyPoseidon b/scripts/CodeEntropyPoseidon index 6e452a4..2bc2801 100755 --- a/scripts/CodeEntropyPoseidon +++ b/scripts/CodeEntropyPoseidon @@ -426,7 +426,7 @@ if topogEntropyMethod != 0: # results_df = pd.concat([results_df, newRow], ignore_index=True) # print(f"result_entropy4 = {result_entropy4}") - elif topogEntropyMethod == 5: + elif topogEntropyMethod == 3: result_entropyAEM = EF.compute_topographical_entropy_AEM( arg_hostDataContainer = dataContainer, arg_selector = "all", From a9183b52d0240a705c562faba6faf7892a45c14d Mon Sep 17 00:00:00 2001 From: DonaldChung-HK Date: Tue, 19 Jul 2022 12:00:40 +0100 Subject: [PATCH 16/26] added build action, excluded test trajectory from build and freeze dependency --- .github/workflows/publish-on-pypi.yaml | 21 +++++++++++++++++++++ MANIFEST.in | 3 +-- setup.py | 12 ++++++------ 3 files changed, 28 insertions(+), 8 deletions(-) create mode 100644 .github/workflows/publish-on-pypi.yaml diff --git a/.github/workflows/publish-on-pypi.yaml b/.github/workflows/publish-on-pypi.yaml new file mode 100644 index 0000000..3acadfc --- /dev/null +++ b/.github/workflows/publish-on-pypi.yaml @@ -0,0 +1,21 @@ +name: Publish on PyPI + +on: + push: + tags: + # After vMajor.Minor.Patch _anything_ is allowed (without "/") ! + - '*' + +jobs: + publish: + name: Publish to pypi if tagged + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-python@v2 + - uses: casperdcl/deploy-pypi@v2 + with: + password: ${{ secrets.PYPI_API_TOKEN }} + pip: wheel -w dist/ --no-deps . + # only upload if a tag is pushed (otherwise just build & check) + upload: ${{ github.event_name == 'push' && startsWith(github.event.ref, 'refs/tags') }} \ No newline at end of file diff --git a/MANIFEST.in b/MANIFEST.in index 3aa4c7e..d71277c 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -6,5 +6,4 @@ include versioneer.py graft CodeEntropy global-exclude *.py[cod] __pycache__ *.so -exclude CodeEntropy/tests/data/1AKI_prod_60.trr -exclude CodeEntropy/tests/data/1AKI_prod_60.tpr \ No newline at end of file +prune CodeEntropy/tests/* \ No newline at end of file diff --git a/setup.py b/setup.py index 853afc0..4cd2e35 100644 --- a/setup.py +++ b/setup.py @@ -63,12 +63,12 @@ zip_safe = False, install_requires=[ - 'numpy', - 'bitarray', - 'mdanalysis', - 'pandas', - 'psutil', - 'dill' + 'numpy==1.22.3', + 'bitarray==2.5.0', + 'mdanalysis==2.1.0', + 'pandas==1.4.2', + 'psutil==5.9.0', + 'dill==0.3.5.1' ], scripts=['scripts/CodeEntropyPoseidon'] From 0f4b52f51782d9a0dc90dcb16ddc05df51962191 Mon Sep 17 00:00:00 2001 From: DonaldChung-HK Date: Thu, 21 Jul 2022 19:41:59 +0100 Subject: [PATCH 17/26] added paper --- .github/workflows/paper.yaml | 25 ++++ paper/paper.bib | 35 ++++++ paper/paper.jats | 232 +++++++++++++++++++++++++++++++++++ paper/paper.md | 44 +++++++ 4 files changed, 336 insertions(+) create mode 100644 .github/workflows/paper.yaml create mode 100644 paper/paper.bib create mode 100644 paper/paper.jats create mode 100644 paper/paper.md diff --git a/.github/workflows/paper.yaml b/.github/workflows/paper.yaml new file mode 100644 index 0000000..cf96529 --- /dev/null +++ b/.github/workflows/paper.yaml @@ -0,0 +1,25 @@ +name: paper + +on: [push] + +jobs: + paper: + runs-on: ubuntu-latest + name: Paper Draft + steps: + - name: Checkout + uses: actions/checkout@v2 + - name: Build draft PDF + uses: openjournals/openjournals-draft-action@master + with: + journal: joss + # This should be the path to the paper within your repo. + paper-path: paper/paper.md + - name: Upload + uses: actions/upload-artifact@v1 + with: + name: paper + # This is the output path where Pandoc will write the compiled + # PDF. Note, this should be the same directory as the input + # paper.md + path: paper/paper.pdf \ No newline at end of file diff --git a/paper/paper.bib b/paper/paper.bib new file mode 100644 index 0000000..4dc685b --- /dev/null +++ b/paper/paper.bib @@ -0,0 +1,35 @@ + @article{mda2, + title={MDAnalysis: A python package for the rapid analysis of molecular dynamics simulations}, + DOI={10.25080/majora-629e541a-00e}, + journal={Proceedings of the Python in Science Conference}, + author={Gowers, Richard and Linke, Max and Barnoud, Jonathan and Reddy, Tyler and Melo, Manuel and Seyler, Sean and Domański, Jan and Dotson, David and Buchoux, Sébastien and Kenney, Ian and Beckstein, Oliver}, + year={2016}} + + @article{mda1, + title={MDAnalysis: A toolkit for the analysis of molecular dynamics simulations}, + volume={32}, + DOI={10.1002/jcc.21787}, + number={10}, + journal={Journal of Computational Chemistry}, + author={Michaud-Agrawal, Naveen and Denning, Elizabeth J. and Woolf, Thomas B. and Beckstein, Oliver}, + year={2011}, + pages={2319–2327}} + + +@misc{argoRepo, + author = {Chakravorty, Arghya}, + title = {CodeEntropy}, + year = {2021}, + publisher = {GitHub}, + journal = {GitHub repository}, + url = {https://github.com/arghya90/CodeEntropy} +} + +@misc{jasRepo, + author = {Kalayan, Jas}, + title = {PoseidonBeta}, + year = {2021}, + publisher = {GitHub}, + journal = {GitHub repository}, + url = {https://github.com/jkalayan/PoseidonBeta} +} \ No newline at end of file diff --git a/paper/paper.jats b/paper/paper.jats new file mode 100644 index 0000000..315e56e --- /dev/null +++ b/paper/paper.jats @@ -0,0 +1,232 @@ + + +
+ + + + +Journal of Open Source Software +JOSS + +2475-9066 + +Open Journals + + + +0 +N/A + +CodeEntropy: A Python package for Multiscale Entropy and +Structure Quantification from Molecular Dynamics +Simulation + + + + +Chakravorty +Arghya + + + + + +Kalayan +Jas + + + + + +Chung +Donald + + + + + +University of Michigan, Ann Arbor, USA + + + + +University of Manchester, United Kingdom + + + + +Science and Technology Facilities Council, United +Kingdom + + + + +21 +7 +2022 + +¿VOL? +¿ISSUE? +¿PAGE? + +Authors of papers retain copyright and release the +work under a Creative Commons Attribution 4.0 International License (CC +BY 4.0) +2022 +The article authors + +Authors of papers retain copyright and release the work under +a Creative Commons Attribution 4.0 International License (CC BY +4.0) + + + +Python +entropy +molecular dynamics +molecular simulations + + + + + + Summary +

Entropy is a fundamental property of any system that quantifies the + structural flexibility of the system and together with energy governs + system stability. It is particularly important in biomolecular systems + because of their highly flexible and complex nature. Many properties + are a delicate balance of entropy versus energy, necessitating the + determination of entropy in order to understand stability. Moreover, + entropy provides a way to quantify the structural flexibility of a + system over all its degrees of freedom. + CodeEntropy is a code based on the Multiscale + Cell Correlation (MCC) method which is a novel solution to the + problems encountered by other methods by providing a single, scalable + and general framework applicable to all molecules in the system.

+

CodeEntropy is a code based on a combination + of CodeEntropy + (Chakravorty, + 2021) by Dr Arghya Chakravorty and + POSEIDON + (Kalayan, + 2021) by Jas Kalayan. The code written by Arghya Chakravorty + accounts for the vibrational and conformational entropy in a + multiscale formulation using an Applications Programming Interface + that makes it highly customisable. To make + CodeEntropy fully applicable to biomolecular + systems, the POSEIDON code will calculate the + topographical entropy terms for solvents and mixtures. The + topology/trajectory parser, atom selector and distance calculation is + performed by the MDAnalysis + (Gowers + et al., 2016; + Michaud-Agrawal + et al., 2011) package.

+
+ + Statement of needs +

There are a range of existing methods to calculate entropy from + molecular dynamics simulations but they suffer from a number of + limitations: they may only work for particular kinds of system or + degrees of freedom, they may require additional calculations, they can + be difficult to interpret, or they do not scale well to large and + complex systems. Some methods only work for water, such as + Inhomogeneous Solvation Theory, for liquids such as 2-Phase + Thermodynamics, for only some degrees of freedom such as dihedral + binning, or for single molecules such as Quasiharmonic Analysis, + Normal Mode Analysis or non-parametric methods such as Minimal + Spanning Tree or K-Nearest-Neighbours.

+

Given the widespread use of free-energy calculations and molecular + dynamics simulations, there is a large user-community for software to + calculate entropy and quantify full structural flexibility of + biomolecular systems. Multiscale Cell Correlation (MCC) provides a + novel solution to the problems encountered by other methods by + providing a single, scalable and general framework applicable to all + molecules in the system. It utilises a judicial synthesis of + mean-field cell theory and covariance matrices over a range of length + scales: - Correlations are considered between groups of locally + connected atoms as in a mean-field cell, and longer-range correlations + are accounted for using a coarser representation of the groups, a + framework that is scaled to higher length scales. - At each length + scale, the potential energy surface is discretised into energy wells + for translational and rotational motion. These are represented as an + average energy well and an energy-well distribution, denoted as + vibrational and topographical, respectively. - The decomposition over + molecules, length scales, type of motion and energy-well size and + distribution provides an exquisite level of detail in explaining the + entropies obtained

+

MCC has been applied by the group of RH to a wide range of systems, + namely liquids, aqueous and octanol solutions, host-guest complexes, + chemical reactions and large biomolecules such as proteins, DNA and + membrane bilayers in aqueous electrolytes.

+
+ + + + + + + GowersRichard + LinkeMax + BarnoudJonathan + ReddyTyler + MeloManuel + SeylerSean + DomańskiJan + DotsonDavid + BuchouxSébastien + KenneyIan + BecksteinOliver + + MDAnalysis: A python package for the rapid analysis of molecular dynamics simulations + Proceedings of the Python in Science Conference + 2016 + 10.25080/majora-629e541a-00e + + + + + + Michaud-AgrawalNaveen + DenningElizabeth J. + WoolfThomas B. + BecksteinOliver + + MDAnalysis: A toolkit for the analysis of molecular dynamics simulations + Journal of Computational Chemistry + 2011 + 32 + 10 + 10.1002/jcc.21787 + 2319 + 2327 + + + + + + ChakravortyArghya + + CodeEntropy + GitHub repository + GitHub + 2021 + https://github.com/arghya90/CodeEntropy + + + + + + KalayanJas + + PoseidonBeta + GitHub repository + GitHub + 2021 + https://github.com/jkalayan/PoseidonBeta + + + + +
diff --git a/paper/paper.md b/paper/paper.md new file mode 100644 index 0000000..d26e0e1 --- /dev/null +++ b/paper/paper.md @@ -0,0 +1,44 @@ +--- +title: 'CodeEntropy: A Python package for Multiscale Entropy and Structure Quantification from Molecular Dynamics Simulation' +tags: + - Python + - entropy + - molecular dynamics + - molecular simulations +authors: + - name: Arghya Chakravorty + equal-contrib: true + affiliation: 1 # (Multiple affiliations must be quoted) + - name: Jas Kalayan + equal-contrib: true # (This is how you can denote equal contributions between multiple authors) + affiliation: 2 + - name: Donald Chung + equal-contrib: true # (This is how you can denote equal contributions between multiple authors) + affiliation: 3 +affiliations: + - name: University of Michigan, Ann Arbor, USA + index: 1 + - name: University of Manchester, United Kingdom + index: 2 + - name: Science and Technology Facilities Council, United Kingdom + index: 3 +date: 21 July 2022 +bibliography: paper.bib +--- +# Summary + +Entropy is a fundamental property of any system that quantifies the structural flexibility of the system and together with energy governs system stability. It is particularly important in biomolecular systems because of their highly flexible and complex nature. Many properties are a delicate balance of entropy versus energy, necessitating the determination of entropy in order to understand stability. Moreover, entropy provides a way to quantify the structural flexibility of a system over all its degrees of freedom. ``CodeEntropy`` is a code based on the Multiscale Cell Correlation (MCC) method which is a novel solution to the problems encountered by other methods by providing a single, scalable and general framework applicable to all molecules in the system. + +``CodeEntropy`` is a code based on a combination of ``CodeEntropy`` [@argoRepo] by Dr Arghya Chakravorty and ``POSEIDON`` [@jasRepo] by Jas Kalayan. The code written by Arghya Chakravorty accounts for the vibrational and conformational entropy in a multiscale formulation using an Applications Programming Interface that makes it highly customisable. To make ``CodeEntropy`` fully applicable to biomolecular systems, the ``POSEIDON`` code will calculate the topographical entropy terms for solvents and mixtures. The topology/trajectory parser, atom selector and distance calculation is performed by the ``MDAnalysis`` [@mda1; @mda2] package. + +# Statement of needs +There are a range of existing methods to calculate entropy from molecular dynamics simulations but they suffer from a number of limitations: they may only work for particular kinds of system or degrees of freedom, they may require additional calculations, they can be difficult to interpret, or they do not scale well to large and complex systems. Some methods only work for water, such as Inhomogeneous Solvation Theory, for liquids such as 2-Phase Thermodynamics, for only some degrees of freedom such as dihedral binning, or for single molecules such as Quasiharmonic Analysis, Normal Mode Analysis or non-parametric methods such as Minimal Spanning Tree or K-Nearest-Neighbours. + +Given the widespread use of free-energy calculations and molecular dynamics simulations, there is a large user-community for software to calculate entropy and quantify full structural flexibility of biomolecular systems. Multiscale Cell Correlation (MCC) provides a novel solution to the problems encountered by other methods by providing a single, scalable and general framework applicable to all molecules in the system. It utilises a judicial synthesis of mean-field cell theory and covariance matrices over a range of length scales: +- Correlations are considered between groups of locally connected atoms as in a mean-field cell, and longer-range correlations are accounted for using a coarser representation of the groups, a framework that is scaled to higher length scales. +- At each length scale, the potential energy surface is discretised into energy wells for translational and rotational motion. These are represented as an average energy well and an energy-well distribution, denoted as vibrational and topographical, respectively. +- The decomposition over molecules, length scales, type of motion and energy-well size and distribution provides an exquisite level of detail in explaining the entropies obtained + +MCC has been applied by the group of RH to a wide range of systems, namely liquids, aqueous and octanol solutions, host-guest complexes, chemical reactions and large biomolecules such as proteins, DNA and membrane bilayers in aqueous electrolytes. + +# References \ No newline at end of file From 003b32dbbdf1ff952536ec4e382c9abb8e8c307b Mon Sep 17 00:00:00 2001 From: DonaldChung-HK Date: Thu, 21 Jul 2022 19:45:24 +0100 Subject: [PATCH 18/26] removed auto paper build --- .github/workflows/paper.yaml | 25 ------------------------- 1 file changed, 25 deletions(-) delete mode 100644 .github/workflows/paper.yaml diff --git a/.github/workflows/paper.yaml b/.github/workflows/paper.yaml deleted file mode 100644 index cf96529..0000000 --- a/.github/workflows/paper.yaml +++ /dev/null @@ -1,25 +0,0 @@ -name: paper - -on: [push] - -jobs: - paper: - runs-on: ubuntu-latest - name: Paper Draft - steps: - - name: Checkout - uses: actions/checkout@v2 - - name: Build draft PDF - uses: openjournals/openjournals-draft-action@master - with: - journal: joss - # This should be the path to the paper within your repo. - paper-path: paper/paper.md - - name: Upload - uses: actions/upload-artifact@v1 - with: - name: paper - # This is the output path where Pandoc will write the compiled - # PDF. Note, this should be the same directory as the input - # paper.md - path: paper/paper.pdf \ No newline at end of file From aae78412e3e911a64caef6c75eb8d3daf4ce4ae8 Mon Sep 17 00:00:00 2001 From: DonaldChung-HK Date: Fri, 22 Jul 2022 10:45:18 +0100 Subject: [PATCH 19/26] added draft of paper --- paper/paper.jats | 24 +++++++++++++----------- paper/paper.md | 7 ++----- paper/paper.pdf | Bin 0 -> 181341 bytes 3 files changed, 15 insertions(+), 16 deletions(-) create mode 100644 paper/paper.pdf diff --git a/paper/paper.jats b/paper/paper.jats index 315e56e..34e1a48 100644 --- a/paper/paper.jats +++ b/paper/paper.jats @@ -104,13 +104,15 @@ a Creative Commons Attribution 4.0 International License (CC BY Cell Correlation (MCC) method which is a novel solution to the problems encountered by other methods by providing a single, scalable and general framework applicable to all molecules in the system.

-

CodeEntropy is a code based on a combination +

CodeEntropy is a code that calculates + entropy with Multiscale Cell Correlation (MCC) method based on + molecular simulation trajectories. The code is based on a combination of CodeEntropy (Chakravorty, 2021) by Dr Arghya Chakravorty and POSEIDON (Kalayan, - 2021) by Jas Kalayan. The code written by Arghya Chakravorty + 2021) by Jas Kalayan. The code written by Dr Chakravorty accounts for the vibrational and conformational entropy in a multiscale formulation using an Applications Programming Interface that makes it highly customisable. To make @@ -145,17 +147,17 @@ a Creative Commons Attribution 4.0 International License (CC BY providing a single, scalable and general framework applicable to all molecules in the system. It utilises a judicial synthesis of mean-field cell theory and covariance matrices over a range of length - scales: - Correlations are considered between groups of locally + scales: First, Correlations are considered between groups of locally connected atoms as in a mean-field cell, and longer-range correlations are accounted for using a coarser representation of the groups, a - framework that is scaled to higher length scales. - At each length - scale, the potential energy surface is discretised into energy wells - for translational and rotational motion. These are represented as an - average energy well and an energy-well distribution, denoted as - vibrational and topographical, respectively. - The decomposition over - molecules, length scales, type of motion and energy-well size and - distribution provides an exquisite level of detail in explaining the - entropies obtained

+ framework that is scaled to higher length scales. Second, At each + length scale, the potential energy surface is discretised into energy + wells for translational and rotational motion. These are represented + as an average energy well and an energy-well distribution, denoted as + vibrational and topographical, respectively. Finally, The + decomposition over molecules, length scales, type of motion and + energy-well size and distribution provides an exquisite level of + detail in explaining the entropies obtained.

MCC has been applied by the group of RH to a wide range of systems, namely liquids, aqueous and octanol solutions, host-guest complexes, chemical reactions and large biomolecules such as proteins, DNA and diff --git a/paper/paper.md b/paper/paper.md index d26e0e1..94319b9 100644 --- a/paper/paper.md +++ b/paper/paper.md @@ -29,15 +29,12 @@ bibliography: paper.bib Entropy is a fundamental property of any system that quantifies the structural flexibility of the system and together with energy governs system stability. It is particularly important in biomolecular systems because of their highly flexible and complex nature. Many properties are a delicate balance of entropy versus energy, necessitating the determination of entropy in order to understand stability. Moreover, entropy provides a way to quantify the structural flexibility of a system over all its degrees of freedom. ``CodeEntropy`` is a code based on the Multiscale Cell Correlation (MCC) method which is a novel solution to the problems encountered by other methods by providing a single, scalable and general framework applicable to all molecules in the system. -``CodeEntropy`` is a code based on a combination of ``CodeEntropy`` [@argoRepo] by Dr Arghya Chakravorty and ``POSEIDON`` [@jasRepo] by Jas Kalayan. The code written by Arghya Chakravorty accounts for the vibrational and conformational entropy in a multiscale formulation using an Applications Programming Interface that makes it highly customisable. To make ``CodeEntropy`` fully applicable to biomolecular systems, the ``POSEIDON`` code will calculate the topographical entropy terms for solvents and mixtures. The topology/trajectory parser, atom selector and distance calculation is performed by the ``MDAnalysis`` [@mda1; @mda2] package. +``CodeEntropy`` is a code that calculates entropy with Multiscale Cell Correlation (MCC) method based on molecular simulation trajectories. The code is based on a combination of ``CodeEntropy`` [@argoRepo] by Dr Arghya Chakravorty and ``POSEIDON`` [@jasRepo] by Jas Kalayan. The code written by Dr Chakravorty accounts for the vibrational and conformational entropy in a multiscale formulation using an Applications Programming Interface that makes it highly customisable. To make ``CodeEntropy`` fully applicable to biomolecular systems, the ``POSEIDON`` code will calculate the topographical entropy terms for solvents and mixtures. The topology/trajectory parser, atom selector and distance calculation is performed by the ``MDAnalysis`` [@mda1; @mda2] package. # Statement of needs There are a range of existing methods to calculate entropy from molecular dynamics simulations but they suffer from a number of limitations: they may only work for particular kinds of system or degrees of freedom, they may require additional calculations, they can be difficult to interpret, or they do not scale well to large and complex systems. Some methods only work for water, such as Inhomogeneous Solvation Theory, for liquids such as 2-Phase Thermodynamics, for only some degrees of freedom such as dihedral binning, or for single molecules such as Quasiharmonic Analysis, Normal Mode Analysis or non-parametric methods such as Minimal Spanning Tree or K-Nearest-Neighbours. -Given the widespread use of free-energy calculations and molecular dynamics simulations, there is a large user-community for software to calculate entropy and quantify full structural flexibility of biomolecular systems. Multiscale Cell Correlation (MCC) provides a novel solution to the problems encountered by other methods by providing a single, scalable and general framework applicable to all molecules in the system. It utilises a judicial synthesis of mean-field cell theory and covariance matrices over a range of length scales: -- Correlations are considered between groups of locally connected atoms as in a mean-field cell, and longer-range correlations are accounted for using a coarser representation of the groups, a framework that is scaled to higher length scales. -- At each length scale, the potential energy surface is discretised into energy wells for translational and rotational motion. These are represented as an average energy well and an energy-well distribution, denoted as vibrational and topographical, respectively. -- The decomposition over molecules, length scales, type of motion and energy-well size and distribution provides an exquisite level of detail in explaining the entropies obtained +Given the widespread use of free-energy calculations and molecular dynamics simulations, there is a large user-community for software to calculate entropy and quantify full structural flexibility of biomolecular systems. Multiscale Cell Correlation (MCC) provides a novel solution to the problems encountered by other methods by providing a single, scalable and general framework applicable to all molecules in the system. It utilises a judicial synthesis of mean-field cell theory and covariance matrices over a range of length scales: First, Correlations are considered between groups of locally connected atoms as in a mean-field cell, and longer-range correlations are accounted for using a coarser representation of the groups, a framework that is scaled to higher length scales. Second, At each length scale, the potential energy surface is discretised into energy wells for translational and rotational motion. These are represented as an average energy well and an energy-well distribution, denoted as vibrational and topographical, respectively. Finally, The decomposition over molecules, length scales, type of motion and energy-well size and distribution provides an exquisite level of detail in explaining the entropies obtained. MCC has been applied by the group of RH to a wide range of systems, namely liquids, aqueous and octanol solutions, host-guest complexes, chemical reactions and large biomolecules such as proteins, DNA and membrane bilayers in aqueous electrolytes. diff --git a/paper/paper.pdf b/paper/paper.pdf new file mode 100644 index 0000000000000000000000000000000000000000..f7612ac5063c64c611431c7aaa159f9c1ca0db19 GIT binary patch literal 181341 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

fQ%#RxXxZ}FG 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

\n", + "
\n", + "
\n", + "

Client

\n", + "

Client-457cefc9-0d76-11ed-b2c5-00155de7810d

\n", + " \n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n", + "
Connection method: Cluster objectCluster type: distributed.LocalCluster
\n", + " Dashboard: http://127.0.0.1:8787/status\n", + "
\n", + "\n", + " \n", + "
\n", + "

Cluster Info

\n", + "
\n", + "
\n", + "
\n", + "
\n", + "

LocalCluster

\n", + "

e3cb55d4

\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n", + "\n", + " \n", + "
\n", + " Dashboard: http://127.0.0.1:8787/status\n", + " \n", + " Workers: 4\n", + "
\n", + " Total threads: 16\n", + " \n", + " Total memory: 7.70 GiB\n", + "
Status: runningUsing processes: True
\n", + "\n", + "
\n", + " \n", + "

Scheduler Info

\n", + "
\n", + "\n", + "
\n", + "
\n", + "
\n", + "
\n", + "

Scheduler

\n", + "

Scheduler-2c4cdf5b-7ef3-4729-b5e0-65f2f759e100

\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " Comm: tcp://127.0.0.1:34737\n", + " \n", + " Workers: 4\n", + "
\n", + " Dashboard: http://127.0.0.1:8787/status\n", + " \n", + " Total threads: 16\n", + "
\n", + " Started: Just now\n", + " \n", + " Total memory: 7.70 GiB\n", + "
\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "

Workers

\n", + "
\n", + "\n", + " \n", + "
\n", + "
\n", + "
\n", + "
\n", + " \n", + "

Worker: 0

\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "
\n", + " Comm: tcp://127.0.0.1:45771\n", + " \n", + " Total threads: 4\n", + "
\n", + " Dashboard: http://127.0.0.1:42899/status\n", + " \n", + " Memory: 1.92 GiB\n", + "
\n", + " Nanny: tcp://127.0.0.1:41617\n", + "
\n", + " Local directory: /tmp/dask-worker-space/worker-2ddr2vpy\n", + "
\n", + "
\n", + "
\n", + "
\n", + " \n", + "
\n", + "
\n", + "
\n", + "
\n", + " \n", + "

Worker: 1

\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "
\n", + " Comm: tcp://127.0.0.1:38855\n", + " \n", + " Total threads: 4\n", + "
\n", + " Dashboard: http://127.0.0.1:40223/status\n", + " \n", + " Memory: 1.92 GiB\n", + "
\n", + " Nanny: tcp://127.0.0.1:41809\n", + "
\n", + " Local directory: /tmp/dask-worker-space/worker-v_zyqpab\n", + "
\n", + "
\n", + "
\n", + "
\n", + " \n", + "
\n", + "
\n", + "
\n", + "
\n", + " \n", + "

Worker: 2

\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "
\n", + " Comm: tcp://127.0.0.1:46257\n", + " \n", + " Total threads: 4\n", + "
\n", + " Dashboard: http://127.0.0.1:35559/status\n", + " \n", + " Memory: 1.92 GiB\n", + "
\n", + " Nanny: tcp://127.0.0.1:43237\n", + "
\n", + " Local directory: /tmp/dask-worker-space/worker-yor9ctjy\n", + "
\n", + "
\n", + "
\n", + "
\n", + " \n", + "
\n", + "
\n", + "
\n", + "
\n", + " \n", + "

Worker: 3

\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "
\n", + " Comm: tcp://127.0.0.1:41335\n", + " \n", + " Total threads: 4\n", + "
\n", + " Dashboard: http://127.0.0.1:46301/status\n", + " \n", + " Memory: 1.92 GiB\n", + "
\n", + " Nanny: tcp://127.0.0.1:35259\n", + "
\n", + " Local directory: /tmp/dask-worker-space/worker-sl9eby0f\n", + "
\n", + "
\n", + "
\n", + "
\n", + " \n", + "\n", + "
\n", + "
\n", + "\n", + "
\n", + "
\n", + "
\n", + "
\n", + " \n", + "\n", + "
\n", + "
" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import dask\n", + "import dask.multiprocessing\n", + "dask.config.set(scheduler='multiprocessing')\n", + "from dask.distributed import Client, progress\n", + "client = Client()\n", + "client" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "fd5a5807-dde0-458c-8e65-715083df5079", + "metadata": {}, + "outputs": [], + "source": [ + "import sys\n", + "import logging\n", + "import gc\n", + "\n", + "from collections import Counter\n", + "from datetime import datetime\n", + "\n", + "from joblib import delayed\n", + "\n", + "from CodeEntropy.poseidon.extractData.readFiles import populateTopology, getCoordsForces, getDistArray\n", + "# # Energy is not needed\n", + "# from CodeEntropy.poseidon.extractData.readFiles import populateEnergy, UAEnergyGroup\n", + "from CodeEntropy.poseidon.extractData.HBRAD import distCutoffNc, UALevelRAD, HBCalc\n", + "from CodeEntropy.poseidon.extractData.forceTorques import calculateFTMatrix\n", + "from CodeEntropy.poseidon.extractData.dihedrals import calculateDihedrals\n", + "from CodeEntropy.poseidon.extractData.nearestNonlike2 import getShellAssignment, moleculePositionRankingRAD \n", + "from CodeEntropy.poseidon.extractData.outputFiles import moleculeObjectPopulation\n", + "from CodeEntropy.poseidon.extractData.mainClass import clearClass\n", + "\n", + "from CodeEntropy.poseidon.analysis.populateClasses import classPopulation\n", + "from CodeEntropy.poseidon.analysis.EECalculation import processEE\n", + "from CodeEntropy.poseidon.analysis.helper import memoryInfo, weightingPopulation\n", + "\n", + "from CodeEntropy.FunctionCollection.PoseidonHelper import frame_iteration" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "6371f229-a8fb-4ba5-b65d-930ee098073f", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2022-07-27 07:35:42.869084\n", + "TOPOLOGY\n", + "0:00:00.801938\n", + "dict_keys(['ACE', 'ARG', 'NME', 'WAT'])\n", + "EXCLUDED RESNAMES: None\n", + "frame = 0\n", + "< Timestep 0 with unit cell dimensions [30.67833 30.40052 29.490604 90. 90. 90. ] >\n", + "COORDS-FORCES\n", + "0:00:00.852477\n", + "DIH\n", + "0:00:00.859203\n", + "NEAREST ARRAYS\n", + "0:00:01.184122\n", + "RAD\n", + "0:00:01.840073\n", + "HB\n", + "0:00:02.094277\n", + "NEAREST NON-LIKE ASSIGNMENT\n", + "0:00:02.096734\n", + "PROX\n", + "0:00:02.098553\n", + "FTMATRIX\n", + "0:00:02.535373\n", + "ORIENTS\n", + "0:00:02.539700\n", + "frame = 1\n", + "< Timestep 1 with unit cell dimensions [30.682182 30.404337 29.494312 90. 90. 90. ] >\n", + "COORDS-FORCES\n", + "0:00:02.592686\n", + "DIH\n", + "0:00:02.599517\n", + "NEAREST ARRAYS\n", + "0:00:02.887840\n", + "RAD\n", + "0:00:03.648667\n", + "HB\n", + "0:00:03.896246\n", + "NEAREST NON-LIKE ASSIGNMENT\n", + "0:00:03.899294\n", + "PROX\n", + "0:00:03.901879\n", + "FTMATRIX\n", + "0:00:04.350654\n", + "ORIENTS\n", + "0:00:04.354834\n", + "frame = 2\n", + "< Timestep 2 with unit cell dimensions [30.713255 30.435127 29.524178 90. 90. 90. ] >\n", + "COORDS-FORCES\n", + "0:00:04.396243\n", + "DIH\n", + "0:00:04.402641\n", + "NEAREST ARRAYS\n", + "0:00:04.695812\n", + "RAD\n", + "0:00:05.377131\n", + "HB\n", + "0:00:05.634235\n", + "NEAREST NON-LIKE ASSIGNMENT\n", + "0:00:05.636695\n", + "PROX\n", + "0:00:05.638350\n", + "FTMATRIX\n", + "0:00:06.089667\n", + "ORIENTS\n", + "0:00:06.173258\n", + "frame = 3\n", + "< Timestep 3 with unit cell dimensions [30.598316 30.321232 29.41369 90. 90. 90. ] >\n", + "COORDS-FORCES\n", + "0:00:06.240124\n", + "DIH\n", + "0:00:06.248649\n", + "NEAREST ARRAYS\n", + "0:00:06.603247\n", + "RAD\n", + "0:00:07.357493\n", + "HB\n", + "0:00:07.653185\n", + "NEAREST NON-LIKE ASSIGNMENT\n", + "0:00:07.656026\n", + "PROX\n", + "0:00:07.658352\n", + "FTMATRIX\n", + "0:00:08.093111\n", + "ORIENTS\n", + "0:00:08.097388\n", + "frame = 4\n", + "< Timestep 4 with unit cell dimensions [30.618622 30.341354 29.43321 90. 90. 90. ] >\n", + "COORDS-FORCES\n", + "0:00:08.146741\n", + "DIH\n", + "0:00:08.151636\n", + "NEAREST ARRAYS\n", + "0:00:08.426659\n", + "RAD\n", + "0:00:09.191003\n", + "HB\n", + "0:00:09.430586\n", + "NEAREST NON-LIKE ASSIGNMENT\n", + "0:00:09.433815\n", + "PROX\n", + "0:00:09.435607\n", + "FTMATRIX\n", + "0:00:09.871486\n", + "ORIENTS\n", + "0:00:09.876483\n", + "frame = 5\n", + "< Timestep 5 with unit cell dimensions [30.619095 30.341824 29.433666 90. 90. 90. ] >\n", + "COORDS-FORCES\n", + "0:00:09.929012\n", + "DIH\n", + "0:00:09.936505\n", + "NEAREST ARRAYS\n", + "0:00:10.355421\n", + "RAD\n", + "0:00:11.240257\n", + "HB\n", + "0:00:11.544711\n", + "NEAREST NON-LIKE ASSIGNMENT\n", + "0:00:11.548049\n", + "PROX\n", + "0:00:11.551975\n", + "FTMATRIX\n", + "0:00:11.995587\n", + "ORIENTS\n", + "0:00:11.999490\n", + "frame = 6\n", + "< Timestep 6 with unit cell dimensions [30.738136 30.459784 29.5481 90. 90. 90. ] >\n", + "COORDS-FORCES\n", + "0:00:12.068327\n", + "DIH\n", + "0:00:12.073833\n", + "NEAREST ARRAYS\n", + "0:00:12.398391\n", + "RAD\n", + "0:00:13.209010\n", + "HB\n", + "0:00:13.463295\n", + "NEAREST NON-LIKE ASSIGNMENT\n", + "0:00:13.466642\n", + "PROX\n", + "0:00:13.468991\n", + "FTMATRIX\n", + "0:00:13.930722\n", + "ORIENTS\n", + "0:00:13.938167\n", + "frame = 7\n", + "< Timestep 7 with unit cell dimensions [30.694881 30.416918 29.506514 90. 90. 90. ] >\n", + "COORDS-FORCES\n", + "0:00:14.012628\n", + "DIH\n", + "0:00:14.019262\n", + "NEAREST ARRAYS\n", + "0:00:14.366534\n", + "RAD\n", + "0:00:15.212298\n", + "HB\n", + "0:00:15.538945\n", + "NEAREST NON-LIKE ASSIGNMENT\n", + "0:00:15.541952\n", + "PROX\n", + "0:00:15.544194\n", + "FTMATRIX\n", + "0:00:16.015811\n", + "ORIENTS\n", + "0:00:16.019771\n", + "frame = 8\n", + "< Timestep 8 with unit cell dimensions [30.644718 30.36721 29.458292 90. 90. 90. ] >\n", + "COORDS-FORCES\n", + "0:00:16.171288\n", + "DIH\n", + "0:00:16.177264\n", + "NEAREST ARRAYS\n", + "0:00:16.514908\n", + "RAD\n", + "0:00:17.327573\n", + "HB\n", + "0:00:17.594469\n", + "NEAREST NON-LIKE ASSIGNMENT\n", + "0:00:17.596938\n", + "PROX\n", + "0:00:17.600141\n", + "FTMATRIX\n", + "0:00:18.015800\n", + "ORIENTS\n", + "0:00:18.020546\n", + "frame = 9\n", + "< Timestep 9 with unit cell dimensions [30.726116 30.447872 29.536541 90. 90. 90. ] >\n", + "COORDS-FORCES\n", + "0:00:18.071443\n", + "DIH\n", + "0:00:18.078147\n", + "NEAREST ARRAYS\n", + "0:00:18.313848\n", + "RAD\n", + "0:00:19.015759\n", + "HB\n", + "0:00:19.268260\n", + "NEAREST NON-LIKE ASSIGNMENT\n", + "0:00:19.270942\n", + "PROX\n", + "0:00:19.272977\n", + "FTMATRIX\n", + "0:00:19.682983\n", + "ORIENTS\n", + "0:00:19.687900\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/donald/miniconda3/envs/CEtrial/lib/python3.10/site-packages/distributed/worker.py:2843: UserWarning: Large object of size 8.65 MiB detected in task graph: \n", + " ([[0 H1 1.008 0.11230000108480453 1 ACE [1], 1 CH3 ... ype=float32)],)\n", + "Consider scattering large objects ahead of time\n", + "with client.scatter to reduce scheduler burden and \n", + "keep data on workers\n", + "\n", + " future = client.submit(func, big_data) # bad\n", + "\n", + " big_future = client.scatter(big_data) # good\n", + " future = client.submit(func, big_future) # good\n", + " warnings.warn(\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Done Threading Work\n", + "10\n", + "0:00:33.516714\n" + ] + } + ], + "source": [ + "# def load(container, start=0, end=-1, \n", + "# step=1, pureAtomNum=1, cutShell=None, \n", + "# excludedResnames=None,\n", + "# water='WAT', verbose=False, thread=4):\n", + "# \"\"\"\n", + "# Warning!!!\n", + "\n", + "# This requires a lot of memory to run with very little performance gain.\n", + "\n", + "# This is a initialization function to collect information from a MDanalysis universe into a data container for analysis using POSEIDON.\n", + "\n", + "# Parameters\n", + "# ----------\n", + "# container : MDAnalyse.Universe\n", + "# A Universe object will all topology, dihedrals,coordinates and force information Check ``Example/create_new_universe.py`` on how to create a universe from existing data.\n", + "# start : int or None, Optional, default: 0\n", + "# Frame id to start analysis.\n", + "# end : int or None, Optional, default: -1\n", + "# Frame id to end analysis.\n", + "# step : int, Optional, default: 1\n", + "# Steps between frame.\n", + "# pureAtomNum : int, Optional, default: 1\n", + "# Reference molecule resid for pure liquid.\n", + "# cutShell : float or None, Optional, default: 1\n", + "# Explicit cut off shell. Default to None which uses the relative angular distance (RAD) algorithm. See Jonathan Higham and Richard H. Henchman , \"Locally adaptive method to define coordination shell\", J. Chem. Phys. 145, 084108 (2016)\n", + "# excludedResnames : list of str or None, Optional, default: None\n", + "# List of resnames to exclude from nearest non alike analysis.\n", + "# water : list of str, Optional, default: \"WAT\"\n", + "# Resname for water molecules.\n", + "# verbose : bool, Optional, default: False\n", + "# Print out progress of each step.\n", + "# thread : int, Optional, default: 4\n", + "# How many multiprocess thread to spawn\n", + "\n", + "# \"\"\"\n", + "container=u\n", + "start=0\n", + "end=10\n", + "step=1\n", + "pureAtomNum=1\n", + "cutShell=None\n", + "excludedResnames=None,\n", + "water='WAT'\n", + "verbose=True\n", + "thread=4\n", + "startTime = datetime.now()\n", + "print(startTime)\n", + "verbosePrint = print if verbose else lambda *a, **k: None\n", + "\n", + "waterTuple = ('SOL', 'WAT', 'HOH', 'TIP3') #needed for pdb as top file \n", + "if water != 'WAT':\n", + " waterTuple = (water)\n", + "\n", + "iterations = 0\n", + "\n", + "all_data = []\n", + "\n", + "populateTopology(container, all_data, waterTuple)\n", + "verbosePrint('TOPOLOGY')\n", + "verbosePrint(datetime.now() - startTime)\n", + "sys.stdout.flush()\n", + "\n", + "\n", + "resids = Counter([(i.resname) for i in all_data])\n", + "verbosePrint(resids.keys())\n", + "if len(resids.keys()) == 1:\n", + " verbosePrint('Pure system with reference ID: %s' % (pureAtomNum))\n", + "\n", + "if excludedResnames != None:\n", + " verbosePrint('EXCLUDED RESNAMES: %s' % (excludedResnames))\n", + "\n", + "\n", + "dimensions = None\n", + "allMoleculeList = []\n", + "\n", + "#fix end frame\n", + "if end == -1:\n", + " end = len(container.trajectory)\n", + "sys.setrecursionlimit(3000000)\n", + "job_list = []\n", + "for frame in range(int(start), int(end), int(step)):\n", + " job_list.append(dask.delayed(frame_iteration(\n", + " container, \n", + " all_data, \n", + " dimensions, \n", + " startTime, \n", + " verbosePrint, \n", + " waterTuple, \n", + " cutShell, \n", + " excludedResnames,\n", + " frame)))\n", + "data = dask.compute(*job_list)\n", + "\n", + "print(\"Done Threading Work\")\n", + "#print(data)\n", + "# data = []\n", + "# for frame in range(int(start), int(end), int(step)):\n", + "# data.append(fi_partial(frame))\n", + "\n", + "print(len(data))\n", + "for item in data:\n", + " allMoleculeList = moleculeObjectPopulation(item[0], \n", + " allMoleculeList, item[1], item[2])\n", + "# #writing file here \n", + "# with gzip.GzipFile('moleculeListAll.obj', 'wb') as pickleFile:\n", + "# pickle.dump((allMoleculeList), pickleFile, protocol=2)\n", + "# pickleFile.close()\n", + "\n", + "print(datetime.now() - startTime)\n", + "\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "e59703af-e98f-4770-be93-4566b7b7f4d2", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Delayed('tuple-ffd34808-f68c-40c6-ad98-900c62642712')" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "job_list[0]" + ] + }, + { + "cell_type": "markdown", + "id": "289d84e8-c4f5-48d2-8c91-6c9d7243a351", + "metadata": {}, + "source": [ + "2. Load data into POSEIDON object" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "b6a0fd0c-2bb1-4c90-a90b-b094a976ee3b", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2022-07-26 19:28:24.507828\n", + "frame = 0\n", + "< Timestep 0 with unit cell dimensions [30.67833 30.40052 29.490604 90. 90. 90. ] >\n", + "0:00:02.192713\n", + "frame = 1\n", + "< Timestep 1 with unit cell dimensions [30.682182 30.404337 29.494312 90. 90. 90. ] >\n", + "0:00:03.918281\n", + "frame = 2\n", + "< Timestep 2 with unit cell dimensions [30.713255 30.435127 29.524178 90. 90. 90. ] >\n", + "0:00:05.502399\n", + "frame = 3\n", + "< Timestep 3 with unit cell dimensions [30.598316 30.321232 29.41369 90. 90. 90. ] >\n", + "0:00:06.949409\n", + "frame = 4\n", + "< Timestep 4 with unit cell dimensions [30.618622 30.341354 29.43321 90. 90. 90. ] >\n", + "0:00:08.473875\n", + "frame = 5\n", + "< Timestep 5 with unit cell dimensions [30.619095 30.341824 29.433666 90. 90. 90. ] >\n", + "0:00:10.128160\n", + "frame = 6\n", + "< Timestep 6 with unit cell dimensions [30.738136 30.459784 29.5481 90. 90. 90. ] >\n", + "0:00:11.705685\n", + "frame = 7\n", + "< Timestep 7 with unit cell dimensions [30.694881 30.416918 29.506514 90. 90. 90. ] >\n", + "0:00:13.413162\n", + "frame = 8\n", + "< Timestep 8 with unit cell dimensions [30.644718 30.36721 29.458292 90. 90. 90. ] >\n", + "0:00:14.876336\n", + "frame = 9\n", + "< Timestep 9 with unit cell dimensions [30.726116 30.447872 29.536541 90. 90. 90. ] >\n", + "0:00:16.332658\n", + "0:00:16.333407\n", + "0:00:16.341065\n" + ] + } + ], + "source": [ + "from CodeEntropy.ClassCollection.PoseidonClass import Poseidon\n", + "startTime = datetime.now()\n", + "poseidon_object = Poseidon(container=u, start=0, end=10)\n", + "print(datetime.now() - startTime)" + ] + }, + { + "cell_type": "markdown", + "id": "5fd37e4e-1fc5-4a30-84b3-863f19cbb0b6", + "metadata": { + "tags": [] + }, + "source": [ + "## Calculate Entropy" + ] + }, + { + "cell_type": "markdown", + "id": "41cc97b9-e89d-431c-9991-00a39f69f2a2", + "metadata": { + "tags": [] + }, + "source": [ + "### Whole Molecule level" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "f5f77c6b-2b32-4321-9fab-f597f6371ac4", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2022-06-30 14:03:04.107787\n", + "\n", + "solvent: ['WAT', 'wat', 'SOL', 'H2O', 'h2o', 'WAT_O', 'TIP3']\n", + "\n", + "water: ['WAT', 'wat', 'SOL', 'H2O', 'h2o', 'WAT_O', 'TIP3']\n", + "\n", + "1. Populate Dictionaries\n", + "\n", + "memory use: 0.231 GB\n", + "0:00:00.001139\n", + "memory use: 0.231 GB\n", + "0:00:01.374287\n", + "0:00:01.374803\n", + "memory use: 0.231 GB\n", + "\n", + "Total number of frames: 20.0\n", + "Number of atoms in each frame: 916\n", + "Number of variables in each list: 19\n", + "\n", + "2. Process Dictionaries\n", + "['moleculeLevel']\n", + "---level: moleculeLevel\n", + "\n", + "\n", + "0:00:01.557718\n", + "{'moleculeLevel': {'solventData': nearest assigned shell_num variable value count\n", + "0 ACE WAT 1.0 Sor_test2 4.489916 155\n", + "1 ACE WAT 1.0 Strans 47.114194 155\n", + "2 ACE WAT 1.0 Srot 21.518819 155\n", + "3 ACE WAT 1.0 count 7.75 155\n", + "4 ARG WAT 1.0 Sor_test2 4.389286 358\n", + "5 ARG WAT 1.0 Strans 46.659296 358\n", + "6 ARG WAT 1.0 Srot 21.813924 358\n", + "7 ARG WAT 1.0 count 17.9 358\n", + "8 NME WAT 1.0 Sor_test2 2.782703 117\n", + "9 NME WAT 1.0 Strans 46.479766 117\n", + "10 NME WAT 1.0 Srot 20.958346 117\n", + "11 NME WAT 1.0 count 5.85 117, 'soluteData': resName variable value count\n", + "0 ACE WM_Strans 31.20938 20\n", + "1 ACE WM_Srot 18.233384 20\n", + "2 ACE WM_UA_Strans 1.450273 20\n", + "3 ACE WM_UA_Srot 17.25675 20\n", + "4 ARG WM_Strans 37.553747 20\n", + "5 ARG WM_Srot 10.55119 20\n", + "6 ARG WM_UA_Strans 203.095275 20\n", + "7 ARG WM_UA_Srot NaN 20\n", + "8 ARG conf_AE 18.358527 20\n", + "9 NME WM_Strans 28.852401 20\n", + "10 NME WM_Srot 0.387749 20\n", + "11 NME WM_UA_Strans 0.0 20\n", + "12 NME WM_UA_Srot 27.433272 20}}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/donald/miniconda3/envs/CEtrial/lib/python3.10/site-packages/CodeEntropy/poseidon/analysis/EECalculation.py:859: RuntimeWarning: invalid value encountered in double_scalars\n", + " w = w ** 0.5\n" + ] + } + ], + "source": [ + "result_wm = poseidon_object.run_analysis(level_list = ['moleculeLevel'], verbose=False, forceUnits=\"Kcal\") # this is because the forces value supplied in this trajectory is in Kcal\n", + "print(result_wm)" + ] + }, + { + "cell_type": "markdown", + "id": "6899945c-edb3-408c-a0ae-4035895b50e9", + "metadata": {}, + "source": [ + "### Residue Level" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "2a32bbeb-0033-4958-84d6-cf05266b486d", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2022-06-30 14:03:08.891780\n", + "\n", + "solvent: ['WAT', 'wat', 'SOL', 'H2O', 'h2o', 'WAT_O', 'TIP3']\n", + "\n", + "water: ['WAT', 'wat', 'SOL', 'H2O', 'h2o', 'WAT_O', 'TIP3']\n", + "\n", + "1. Populate Dictionaries\n", + "\n", + "memory use: 0.232 GB\n", + "0:00:00.001426\n", + "memory use: 0.232 GB\n", + "0:00:01.297753\n", + "0:00:01.298211\n", + "memory use: 0.232 GB\n", + "\n", + "Total number of frames: 20.0\n", + "Number of atoms in each frame: 916\n", + "Number of variables in each list: 19\n", + "\n", + "2. Process Dictionaries\n", + "['residLevel_resname']\n", + "---level: residLevel_resname\n", + "\n", + "\n", + "0:00:01.458315\n", + "{'residLevel_resname': {'solventData': nearest assigned shell_num variable value count\n", + "0 ACE_1 WAT 1.0 Sor_test2 4.489916 155\n", + "1 ACE_1 WAT 1.0 Strans 47.114194 155\n", + "2 ACE_1 WAT 1.0 Srot 21.518819 155\n", + "3 ACE_1 WAT 1.0 count 7.75 155\n", + "4 ARG_2 WAT 1.0 Sor_test2 4.389286 358\n", + "5 ARG_2 WAT 1.0 Strans 46.659296 358\n", + "6 ARG_2 WAT 1.0 Srot 21.813924 358\n", + "7 ARG_2 WAT 1.0 count 17.9 358\n", + "8 NME_3 WAT 1.0 Sor_test2 2.782703 117\n", + "9 NME_3 WAT 1.0 Strans 46.479766 117\n", + "10 NME_3 WAT 1.0 Srot 20.958346 117\n", + "11 NME_3 WAT 1.0 count 5.85 117, 'soluteData': resName variable value count\n", + "0 ACE_1 WM_Strans 31.20938 20\n", + "1 ACE_1 WM_Srot 18.233384 20\n", + "2 ACE_1 WM_UA_Strans 1.450273 20\n", + "3 ACE_1 WM_UA_Srot 17.25675 20\n", + "4 ARG_2 WM_Strans 37.553747 20\n", + "5 ARG_2 WM_Srot 10.55119 20\n", + "6 ARG_2 WM_UA_Strans 203.095275 20\n", + "7 ARG_2 WM_UA_Srot NaN 20\n", + "8 ARG_2 conf_AE 18.358527 20\n", + "9 NME_3 WM_Strans 28.852401 20\n", + "10 NME_3 WM_Srot 0.387749 20\n", + "11 NME_3 WM_UA_Strans 0.0 20\n", + "12 NME_3 WM_UA_Srot 27.433272 20, 'contactMatrix': centre_resid neighbour_resid count centre_resname neighbour_resname\n", + "0 1 2 3.0 ACE_1 ARG\n", + "1 1 3 0.1 ACE_1 NME\n", + "2 2 1 3.0 ARG_2 ACE\n", + "3 2 3 3.0 ARG_2 NME\n", + "4 3 1 0.1 NME_3 ACE\n", + "5 3 2 3.0 NME_3 ARG}}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/donald/miniconda3/envs/CEtrial/lib/python3.10/site-packages/CodeEntropy/poseidon/analysis/EECalculation.py:859: RuntimeWarning: invalid value encountered in double_scalars\n", + " w = w ** 0.5\n" + ] + } + ], + "source": [ + "result_res = poseidon_object.run_analysis(level_list = ['residLevel_resname'], verbose=False, forceUnits=\"Kcal\") # this is because the forces value supplied in this trajectory is in Kcal\n", + "print(result_res)" + ] + }, + { + "cell_type": "markdown", + "id": "81e7011e-3dc9-4115-932f-0bbad538ae0a", + "metadata": {}, + "source": [ + "### United Atom Level" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "33ebd4aa-d117-4812-b7e8-1faed30c88e0", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2022-06-30 14:03:13.104061\n", + "\n", + "solvent: ['WAT', 'wat', 'SOL', 'H2O', 'h2o', 'WAT_O', 'TIP3']\n", + "\n", + "water: ['WAT', 'wat', 'SOL', 'H2O', 'h2o', 'WAT_O', 'TIP3']\n", + "\n", + "1. Populate Dictionaries\n", + "\n", + "memory use: 0.232 GB\n", + "0:00:00.002788\n", + "memory use: 0.233 GB\n", + "0:00:01.388482\n", + "0:00:01.388816\n", + "memory use: 0.233 GB\n", + "\n", + "Total number of frames: 20.0\n", + "Number of atoms in each frame: 916\n", + "Number of variables in each list: 19\n", + "\n", + "2. Process Dictionaries\n", + "['atomLevel']\n", + "---level: atomLevel\n", + "\n", + "\n", + "0:00:01.590813\n", + "{'atomLevel': {'solventData': nearest assigned shell_num variable value count\n", + "0 ACE_C WAT_O 1.0 Sor_test2 3.859492 90\n", + "1 ACE_C WAT_O 1.0 Strans 46.89642 90\n", + "2 ACE_C WAT_O 1.0 Srot 21.477797 90\n", + "3 ACE_C WAT_O 1.0 count 4.5 90\n", + "4 ACE_O WAT_O 1.0 Sor_test2 1.383652 65\n", + "5 ACE_O WAT_O 1.0 Strans 47.442017 65\n", + "6 ACE_O WAT_O 1.0 Srot 21.607751 65\n", + "7 ACE_O WAT_O 1.0 count 3.25 65\n", + "8 ARG_C WAT_O 1.0 Sor_test2 2.209787 94\n", + "9 ARG_C WAT_O 1.0 Strans 44.950488 94\n", + "10 ARG_C WAT_O 1.0 Srot 22.805753 94\n", + "11 ARG_C WAT_O 1.0 count 4.7 94\n", + "12 ARG_N WAT_O 1.0 Sor_test2 4.32251 213\n", + "13 ARG_N WAT_O 1.0 Strans 47.054251 213\n", + "14 ARG_N WAT_O 1.0 Srot 21.210664 213\n", + "15 ARG_N WAT_O 1.0 count 10.65 213\n", + "16 ARG_O WAT_O 1.0 Sor_test2 0.658554 51\n", + "17 ARG_O WAT_O 1.0 Strans 49.519626 51\n", + "18 ARG_O WAT_O 1.0 Srot 23.221778 51\n", + "19 ARG_O WAT_O 1.0 count 2.55 51\n", + "20 NME_C WAT_O 1.0 Sor_test2 2.876769 92\n", + "21 NME_C WAT_O 1.0 Strans 46.592128 92\n", + "22 NME_C WAT_O 1.0 Srot 20.791071 92\n", + "23 NME_C WAT_O 1.0 count 4.6 92\n", + "24 NME_N WAT_O 1.0 Sor_test2 0.3607 25\n", + "25 NME_N WAT_O 1.0 Strans 46.337027 25\n", + "26 NME_N WAT_O 1.0 Srot 21.698027 25\n", + "27 NME_N WAT_O 1.0 count 1.25 25, 'soluteData': resName variable value count\n", + "0 ACE_C WM_Strans 31.20938 20\n", + "1 ACE_C WM_Srot 18.233384 20\n", + "2 ACE_C WM_UA_Strans 1.450273 20\n", + "3 ACE_C WM_UA_Srot 17.25675 20\n", + "4 ARG_N WM_Strans 37.553747 20\n", + "5 ARG_N WM_Srot 10.55119 20\n", + "6 ARG_N WM_UA_Strans 203.095275 20\n", + "7 ARG_N WM_UA_Srot NaN 20\n", + "8 ARG_N conf_AE 18.358527 20\n", + "9 NME_N WM_Strans 28.852401 20\n", + "10 NME_N WM_Srot 0.387749 20\n", + "11 NME_N WM_UA_Strans 0.0 20\n", + "12 NME_N WM_UA_Srot 27.433272 20, 'contactMatrix': centre_resid neighbour_resid count centre_resname neighbour_resname \\\n", + "0 1 2 1.0 ACE ARG \n", + "1 2 3 1.0 ARG NME \n", + "2 2 1 1.0 ARG ACE \n", + "3 2 3 1.0 ARG NME \n", + "4 1 2 1.0 ACE ARG \n", + "5 3 2 1.0 NME ARG \n", + "6 2 1 1.0 ARG ACE \n", + "7 2 1 1.0 ARG ACE \n", + "8 3 2 1.0 NME ARG \n", + "9 3 1 0.1 NME ACE \n", + "10 3 2 1.0 NME ARG \n", + "11 1 2 1.0 ACE ARG \n", + "12 1 3 0.1 ACE NME \n", + "13 2 3 1.0 ARG NME \n", + "\n", + " centre_atom neighbour_atom \n", + "0 C CA \n", + "1 C CH3 \n", + "2 CA C \n", + "3 CA N \n", + "4 CH3 N \n", + "5 CH3 C \n", + "6 N CH3 \n", + "7 N O \n", + "8 N CA \n", + "9 N O \n", + "10 N O \n", + "11 O N \n", + "12 O N \n", + "13 O N }}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/donald/miniconda3/envs/CEtrial/lib/python3.10/site-packages/CodeEntropy/poseidon/analysis/EECalculation.py:859: RuntimeWarning: invalid value encountered in double_scalars\n", + " w = w ** 0.5\n" + ] + } + ], + "source": [ + "result_ua = poseidon_object.run_analysis(level_list = ['atomLevel'], verbose=False, forceUnits=\"Kcal\") # this is because the forces value supplied in this trajectory is in Kcal\n", + "print(result_ua)" + ] + }, + { + "cell_type": "markdown", + "id": "0137f3df-31d8-49d6-abab-6bce5f1d2ca3", + "metadata": {}, + "source": [ + "### Solute Contact" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "27ca66f2-04c2-4471-9fa7-23b6d392c26b", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2022-06-30 14:03:19.556689\n", + "\n", + "solvent: ['WAT', 'wat', 'SOL', 'H2O', 'h2o', 'WAT_O', 'TIP3']\n", + "\n", + "water: ['WAT', 'wat', 'SOL', 'H2O', 'h2o', 'WAT_O', 'TIP3']\n", + "\n", + "1. Populate Dictionaries\n", + "\n", + "memory use: 0.233 GB\n", + "0:00:00.001247\n", + "memory use: 0.233 GB\n", + "0:00:00.091347\n", + "0:00:00.091990\n", + "memory use: 0.233 GB\n", + "\n", + "Total number of frames: 20.0\n", + "Number of atoms in each frame: 916\n", + "Number of variables in each list: 19\n", + "\n", + "2. Process Dictionaries\n", + "['soluteContacts']\n", + "---level: soluteContacts\n", + "\n", + "\n", + "0:00:00.190073\n", + "{'soluteContacts': {'solventData': nearest assigned shell_num variable value count\n", + "0 ACE_1_ACE_1 WAT 1.0 Sor_test2 0.747622 19\n", + "1 ACE_1_ACE_1 WAT 1.0 Strans 54.849501 19\n", + "2 ACE_1_ACE_1 WAT 1.0 Srot 21.83436 19\n", + "3 ACE_1_ACE_1 WAT 1.0 count 0.95 19\n", + "4 ACE_1_ARG_2 WAT 1.0 Sor_test2 0.129079 26\n", + "5 ACE_1_ARG_2 WAT 1.0 Strans 53.464565 26\n", + "6 ACE_1_ARG_2 WAT 1.0 Srot 21.481491 26\n", + "7 ACE_1_ARG_2 WAT 1.0 count 1.3 26\n", + "8 ACE_1_NME_3 WAT 1.0 Sor_test2 0.029043 16\n", + "9 ACE_1_NME_3 WAT 1.0 Strans 49.229698 16\n", + "10 ACE_1_NME_3 WAT 1.0 Srot 26.038399 16\n", + "11 ACE_1_NME_3 WAT 1.0 count 0.8 16\n", + "12 ARG_2_ACE_1 WAT 1.0 Sor_test2 0.129079 26\n", + "13 ARG_2_ACE_1 WAT 1.0 Strans 53.464565 26\n", + "14 ARG_2_ACE_1 WAT 1.0 Srot 21.481491 26\n", + "15 ARG_2_ACE_1 WAT 1.0 count 1.3 26\n", + "16 ARG_2_ARG_2 WAT 1.0 Sor_test2 0.424278 104\n", + "17 ARG_2_ARG_2 WAT 1.0 Strans 47.596492 104\n", + "18 ARG_2_ARG_2 WAT 1.0 Srot 23.318138 104\n", + "19 ARG_2_ARG_2 WAT 1.0 count 5.2 104\n", + "20 ARG_2_NME_3 WAT 1.0 Sor_test2 0.733499 35\n", + "21 ARG_2_NME_3 WAT 1.0 Strans 49.012885 35\n", + "22 ARG_2_NME_3 WAT 1.0 Srot 20.595806 35\n", + "23 ARG_2_NME_3 WAT 1.0 count 1.75 35\n", + "24 NME_3_ACE_1 WAT 1.0 Sor_test2 0.029043 16\n", + "25 NME_3_ACE_1 WAT 1.0 Strans 49.229698 16\n", + "26 NME_3_ACE_1 WAT 1.0 Srot 26.038399 16\n", + "27 NME_3_ACE_1 WAT 1.0 count 0.8 16\n", + "28 NME_3_ARG_2 WAT 1.0 Sor_test2 0.733499 35\n", + "29 NME_3_ARG_2 WAT 1.0 Strans 49.012885 35\n", + "30 NME_3_ARG_2 WAT 1.0 Srot 20.595806 35\n", + "31 NME_3_ARG_2 WAT 1.0 count 1.75 35\n", + "32 NME_3_NME_3 WAT 1.0 Sor_test2 0.015884 13\n", + "33 NME_3_NME_3 WAT 1.0 Strans 48.028634 13\n", + "34 NME_3_NME_3 WAT 1.0 Srot 22.175048 13\n", + "35 NME_3_NME_3 WAT 1.0 count 0.65 13, 'soluteData': Empty DataFrame\n", + "Columns: [resName, variable, value, count]\n", + "Index: []}}\n" + ] + } + ], + "source": [ + "result_solcon = poseidon_object.run_analysis(level_list = ['soluteContacts'], verbose=False, forceUnits=\"Kcal\") # this is because the forces value supplied in this trajectory is in Kcal\n", + "print(result_solcon)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8bbbbf65-8e67-4a06-9e92-2d515e31567d", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.4" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/Example/Poseidon_GROMACS.py b/Example/Poseidon_GROMACS.py index d2a1b3b..55fdec5 100644 --- a/Example/Poseidon_GROMACS.py +++ b/Example/Poseidon_GROMACS.py @@ -7,18 +7,18 @@ from MDAnalysis.analysis.base import AnalysisFromFunction from MDAnalysis.coordinates.memory import MemoryReader import pandas as pd -from CodeEntropy.ClassCollection.PoseidonClass import Poseidon, Poseidon_mp +from CodeEntropy.ClassCollection.PoseidonClass import Poseidon, Poseidon_mp, Poseidon_dask def main(): #hard coded for now wd = os.path.dirname(os.path.abspath(__file__)) # loading files - topo_file = os.path.join(wd,"data/1AKI_prod_60.tpr") - traj_file = os.path.join(wd,"data/1AKI_prod_60.trr") + topo_file = os.path.join(wd,"data/poseidon_example.prmtop") + traj_file = os.path.join(wd,"data/poseidon_example.trr") # loading data into individual universe main = mda.Universe(topo_file, traj_file) - poseidon_object = Poseidon(container=main, start=0, end=10, water=('SOL',), excludedResnames=("CL",), verbose=False) + poseidon_object = Poseidon_dask(container=main, start=0, end=10, verbose=True) poseidon_object.run_analysis(level_list=['moleculeLevel', 'residLevel_resname', 'atomLevel', 'soluteContacts'], verbose=False) if __name__ == '__main__': diff --git a/docs/api.rst b/docs/api.rst index 6f07203..9e5ebd8 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -69,6 +69,7 @@ Import Data :toctree: autosummary CodeEntropy.ClassCollection.PoseidonClass.Poseidon + CodeEntropy.ClassCollection.PoseidonClass.Poseidon_mp Run Analysis ^^^^^^^^^^^^^^^^ @@ -76,4 +77,5 @@ Run Analysis .. autosummary:: :toctree: autosummary - CodeEntropy.ClassCollection.PoseidonClass.Poseidon.run_analysis \ No newline at end of file + CodeEntropy.ClassCollection.PoseidonClass.Poseidon.run_analysis + CodeEntropy.ClassCollection.PoseidonClass.Poseidon_mp.run_analysis \ No newline at end of file diff --git a/docs/autosummary/CodeEntropy.ClassCollection.PoseidonClass.Poseidon_mp.rst b/docs/autosummary/CodeEntropy.ClassCollection.PoseidonClass.Poseidon_mp.rst new file mode 100644 index 0000000..741df18 --- /dev/null +++ b/docs/autosummary/CodeEntropy.ClassCollection.PoseidonClass.Poseidon_mp.rst @@ -0,0 +1,23 @@ +CodeEntropy.ClassCollection.PoseidonClass.Poseidon\_mp +====================================================== + +.. currentmodule:: CodeEntropy.ClassCollection.PoseidonClass + +.. autoclass:: Poseidon_mp + + + .. automethod:: __init__ + + + .. rubric:: Methods + + .. autosummary:: + + ~Poseidon_mp.__init__ + ~Poseidon_mp.run_analysis + + + + + + \ No newline at end of file diff --git a/docs/autosummary/CodeEntropy.ClassCollection.PoseidonClass.Poseidon_mp.run_analysis.rst b/docs/autosummary/CodeEntropy.ClassCollection.PoseidonClass.Poseidon_mp.run_analysis.rst new file mode 100644 index 0000000..f396829 --- /dev/null +++ b/docs/autosummary/CodeEntropy.ClassCollection.PoseidonClass.Poseidon_mp.run_analysis.rst @@ -0,0 +1,6 @@ +CodeEntropy.ClassCollection.PoseidonClass.Poseidon\_mp.run\_analysis +==================================================================== + +.. currentmodule:: CodeEntropy.ClassCollection.PoseidonClass + +.. automethod:: Poseidon_mp.run_analysis \ No newline at end of file From bcfd4e657ed5e54fe7683de5d565f119864a8589 Mon Sep 17 00:00:00 2001 From: DonaldChung-HK Date: Wed, 27 Jul 2022 07:41:54 +0100 Subject: [PATCH 21/26] Removed dask implementation see jupyter notebook for exploration work --- CodeEntropy/ClassCollection/PoseidonClass.py | 105 ------------------ ...pynb => Capped_protein_Example_dask.ipynb} | 0 2 files changed, 105 deletions(-) rename Example/{Capped_protein_Example copy.ipynb => Capped_protein_Example_dask.ipynb} (100%) diff --git a/CodeEntropy/ClassCollection/PoseidonClass.py b/CodeEntropy/ClassCollection/PoseidonClass.py index dc5a6a1..aece0af 100644 --- a/CodeEntropy/ClassCollection/PoseidonClass.py +++ b/CodeEntropy/ClassCollection/PoseidonClass.py @@ -514,108 +514,3 @@ def __init__(self ,container, start=0, end=-1, print(datetime.now() - startTime) self.allMoleculeList = allMoleculeList - -class Poseidon_dask(Poseidon): - def __init__(self ,container, start=0, end=-1, - step=1, pureAtomNum=1, cutShell=None, - excludedResnames=None, - water='WAT', verbose=False, thread=4): - """ - Warning!!! - - This requires a lot of memory to run with very little performance gain. - - This is a initialization function to collect information from a MDanalysis universe into a data container for analysis using POSEIDON. - - Parameters - ---------- - container : MDAnalyse.Universe - A Universe object will all topology, dihedrals,coordinates and force information Check ``Example/create_new_universe.py`` on how to create a universe from existing data. - start : int or None, Optional, default: 0 - Frame id to start analysis. - end : int or None, Optional, default: -1 - Frame id to end analysis. - step : int, Optional, default: 1 - Steps between frame. - pureAtomNum : int, Optional, default: 1 - Reference molecule resid for pure liquid. - cutShell : float or None, Optional, default: 1 - Explicit cut off shell. Default to None which uses the relative angular distance (RAD) algorithm. See Jonathan Higham and Richard H. Henchman , "Locally adaptive method to define coordination shell", J. Chem. Phys. 145, 084108 (2016) - excludedResnames : list of str or None, Optional, default: None - List of resnames to exclude from nearest non alike analysis. - water : list of str, Optional, default: "WAT" - Resname for water molecules. - verbose : bool, Optional, default: False - Print out progress of each step. - thread : int, Optional, default: 4 - How many multiprocess thread to spawn - - """ - startTime = datetime.now() - print(startTime) - verbosePrint = print if verbose else lambda *a, **k: None - - waterTuple = ('SOL', 'WAT', 'HOH', 'TIP3') #needed for pdb as top file - if water != 'WAT': - waterTuple = (water) - - iterations = 0 - - all_data = [] - - populateTopology(container, all_data, waterTuple) - verbosePrint('TOPOLOGY') - verbosePrint(datetime.now() - startTime) - sys.stdout.flush() - - - resids = Counter([(i.resname) for i in all_data]) - verbosePrint(resids.keys()) - if len(resids.keys()) == 1: - verbosePrint('Pure system with reference ID: %s' % (pureAtomNum)) - - if excludedResnames != None: - verbosePrint('EXCLUDED RESNAMES: %s' % (excludedResnames)) - - - dimensions = None - allMoleculeList = [] - - #fix end frame - if end == -1: - end = len(container.trajectory) - sys.setrecursionlimit(3000000) - #p = Pool(processes=thread) - fi_partial = partial(frame_iteration, container, all_data, dimensions, startTime, verbosePrint, waterTuple, cutShell, excludedResnames) - job_list = [] - client = Client(n_workers=thread) - for frame in range(int(start), int(end), int(step)): - job_list.append(dask.delayed(frame_iteration( - container, - all_data, - dimensions, - startTime, - verbosePrint, - waterTuple, - cutShell, - excludedResnames, - frame))) - data = dask.compute(job_list) - - print("Done Threading Work") - print(len(data)) - # data = [] - # for frame in range(int(start), int(end), int(step)): - # data.append(fi_partial(frame)) - for item in data: - allMoleculeList = moleculeObjectPopulation(item[0], - allMoleculeList, item[1], item[2]) - # #writing file here - # with gzip.GzipFile('moleculeListAll.obj', 'wb') as pickleFile: - # pickle.dump((allMoleculeList), pickleFile, protocol=2) - # pickleFile.close() - - print(datetime.now() - startTime) - - self.allMoleculeList = allMoleculeList - \ No newline at end of file diff --git a/Example/Capped_protein_Example copy.ipynb b/Example/Capped_protein_Example_dask.ipynb similarity index 100% rename from Example/Capped_protein_Example copy.ipynb rename to Example/Capped_protein_Example_dask.ipynb From 62f5976c7d33e3ba6041b9037bb50febf8570429 Mon Sep 17 00:00:00 2001 From: DonaldChung-HK Date: Wed, 27 Jul 2022 07:49:11 +0100 Subject: [PATCH 22/26] add pathos to requirement and removed dask from core implementation --- CodeEntropy/ClassCollection/PoseidonClass.py | 5 ----- setup.py | 3 ++- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/CodeEntropy/ClassCollection/PoseidonClass.py b/CodeEntropy/ClassCollection/PoseidonClass.py index aece0af..f1ee252 100644 --- a/CodeEntropy/ClassCollection/PoseidonClass.py +++ b/CodeEntropy/ClassCollection/PoseidonClass.py @@ -27,11 +27,6 @@ from multiprocessing import Pool from pathos.pools import ProcessPool -import dask -import dask.multiprocessing -dask.config.set(scheduler='processes') - -from dask.distributed import Client import numpy as nmp diff --git a/setup.py b/setup.py index 4cd2e35..647aa68 100644 --- a/setup.py +++ b/setup.py @@ -68,7 +68,8 @@ 'mdanalysis==2.1.0', 'pandas==1.4.2', 'psutil==5.9.0', - 'dill==0.3.5.1' + 'dill==0.3.5.1', + 'pathos==0.2.9', ], scripts=['scripts/CodeEntropyPoseidon'] From 79c44ef9f22163e8c9268f47faa1f60f52b3effa Mon Sep 17 00:00:00 2001 From: DonaldChung-HK Date: Wed, 27 Jul 2022 08:59:29 +0100 Subject: [PATCH 23/26] fixed docs and added community guidelines --- CodeEntropy/ClassCollection/PoseidonClass.py | 7 ++++--- docs/community_guide.rst | 14 ++++++++++++++ docs/index.rst | 1 + 3 files changed, 19 insertions(+), 3 deletions(-) create mode 100644 docs/community_guide.rst diff --git a/CodeEntropy/ClassCollection/PoseidonClass.py b/CodeEntropy/ClassCollection/PoseidonClass.py index f1ee252..b8c3992 100644 --- a/CodeEntropy/ClassCollection/PoseidonClass.py +++ b/CodeEntropy/ClassCollection/PoseidonClass.py @@ -422,12 +422,13 @@ def __init__(self ,container, start=0, end=-1, excludedResnames=None, water='WAT', verbose=False, thread=4): """ - Warning!!! - - This requires a lot of memory to run with very little performance gain. This is a initialization function to collect information from a MDanalysis universe into a data container for analysis using POSEIDON. + .. Warning :: + + This requires a lot of memory to run with very little performance gain. + Parameters ---------- container : MDAnalyse.Universe diff --git a/docs/community_guide.rst b/docs/community_guide.rst new file mode 100644 index 0000000..b527d13 --- /dev/null +++ b/docs/community_guide.rst @@ -0,0 +1,14 @@ +Community guidelines +============================== + +Contribute to the software +----------------------------- +To contribute to CodeEntropy, fork the repository and create a pull request when you want to share and push your changes upstream. + +Report Issue +----------------- +Create an issue ticket on GitHub and the team will review it as soon as possible. Please send us the input file as well. + +Seek support +---------------- +Post on GitHub discussion and the team will reply as soon as possible. \ No newline at end of file diff --git a/docs/index.rst b/docs/index.rst index 706fcb4..f95495c 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -19,6 +19,7 @@ This code is based on the CodeEntropy tool with POSEIDON code integrated to form Script_example api faq + community_guide From bd4ea8c15112fca2a2864927ac374322ba00d597 Mon Sep 17 00:00:00 2001 From: DonaldChung-HK Date: Wed, 27 Jul 2022 09:26:36 +0100 Subject: [PATCH 24/26] added developer guide --- docs/developer_guide.rst | 25 +++++++++++++++++++++++++ docs/index.rst | 1 + 2 files changed, 26 insertions(+) create mode 100644 docs/developer_guide.rst diff --git a/docs/developer_guide.rst b/docs/developer_guide.rst new file mode 100644 index 0000000..c83cab0 --- /dev/null +++ b/docs/developer_guide.rst @@ -0,0 +1,25 @@ +Developer's Guide +============================== + +CodeEntropy uses the Python programming language. + +Running tests +----------------------------- +To run the full test suite, simply install ``pytest`` and run in root directory of the repository: + +.. code-block:: bash + + pytest + +To only run the unit tests in a particular part of program. For example only running test for solute part. + +.. code-block:: bash + + pytest CodeEntropy/tests/test_CodeEntropy.py + + +To only run the a specific test. e.g. + +.. code-block:: bash + + pytest CodeEntropy/tests/test_CodeEntropy.py::test_CodeEntropy_parser_labForces \ No newline at end of file diff --git a/docs/index.rst b/docs/index.rst index f95495c..93fd45e 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -20,6 +20,7 @@ This code is based on the CodeEntropy tool with POSEIDON code integrated to form api faq community_guide + developer_guide From 696248901eb2c6256bc50910e9600ef5dbcca769 Mon Sep 17 00:00:00 2001 From: DonaldChung-HK Date: Fri, 29 Jul 2022 10:30:55 +0100 Subject: [PATCH 25/26] remove pdf and added trial dask implementation --- Example/Capped_protein_Example_dask.ipynb | 739 +++++++++++++++------- paper/paper.pdf | Bin 181341 -> 0 bytes 2 files changed, 497 insertions(+), 242 deletions(-) delete mode 100644 paper/paper.pdf diff --git a/Example/Capped_protein_Example_dask.ipynb b/Example/Capped_protein_Example_dask.ipynb index b70ef2a..a1764e4 100644 --- a/Example/Capped_protein_Example_dask.ipynb +++ b/Example/Capped_protein_Example_dask.ipynb @@ -49,8 +49,8 @@ "source": [ "import MDAnalysis as mda\n", "# set the working dir to the root of repo inorder to use these path\n", - "tprfile = \"data/molecules.prmtop\"\n", - "trrfile = \"data/data.trr\"\n", + "tprfile = \"data/1AKI_prod_60.tpr\"\n", + "trrfile = \"data/1AKI_prod_60.trr\"\n", "u = mda.Universe(tprfile, trrfile)" ] }, @@ -64,7 +64,14 @@ "name": "stderr", "output_type": "stream", "text": [ - "2022-07-27 07:35:14,977 - distributed.diskutils - INFO - Found stale lock file and directory '/tmp/dask-worker-space/worker-lyz47d0p', purging\n" + "2022-07-28 18:22:02,409 - distributed.diskutils - INFO - Found stale lock file and directory '/tmp/dask-worker-space/worker-au6fh2kr', purging\n", + "2022-07-28 18:22:02,409 - distributed.diskutils - INFO - Found stale lock file and directory '/tmp/dask-worker-space/worker-024x0wbs', purging\n", + "2022-07-28 18:22:02,410 - distributed.diskutils - INFO - Found stale lock file and directory '/tmp/dask-worker-space/worker-9xmuk268', purging\n", + "2022-07-28 18:22:02,410 - distributed.diskutils - INFO - Found stale lock file and directory '/tmp/dask-worker-space/worker-76fptn9s', purging\n", + "2022-07-28 18:22:02,410 - distributed.diskutils - INFO - Found stale lock file and directory '/tmp/dask-worker-space/worker-8r24ogky', purging\n", + "2022-07-28 18:22:02,410 - distributed.diskutils - INFO - Found stale lock file and directory '/tmp/dask-worker-space/worker-whhtuqau', purging\n", + "2022-07-28 18:22:02,411 - distributed.diskutils - INFO - Found stale lock file and directory '/tmp/dask-worker-space/worker-9xguvzox', purging\n", + "2022-07-28 18:22:02,411 - distributed.diskutils - INFO - Found stale lock file and directory '/tmp/dask-worker-space/worker-45_2778y', purging\n" ] }, { @@ -74,7 +81,7 @@ "
\n", "
\n", "

Client

\n", - "

Client-457cefc9-0d76-11ed-b2c5-00155de7810d

\n", + "

Client-cadca31b-0e99-11ed-a0a2-00155de7810d

\n", " \n", "\n", " \n", @@ -103,7 +110,7 @@ " \n", "
\n", "

LocalCluster

\n", - "

e3cb55d4

\n", + "

51a7b50a

\n", "
\n", " \n", "
\n", @@ -140,11 +147,11 @@ "
\n", "
\n", "

Scheduler

\n", - "

Scheduler-2c4cdf5b-7ef3-4729-b5e0-65f2f759e100

\n", + "

Scheduler-62cc562b-c7c5-46c5-9a48-30cde1a32abb

\n", " \n", " \n", " \n", "
\n", - " Comm: tcp://127.0.0.1:34737\n", + " Comm: tcp://127.0.0.1:39441\n", " \n", " Workers: 4\n", @@ -186,7 +193,7 @@ " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\n", @@ -231,7 +238,7 @@ "
\n", - " Comm: tcp://127.0.0.1:45771\n", + " Comm: tcp://127.0.0.1:41523\n", " \n", " Total threads: 4\n", @@ -194,7 +201,7 @@ "
\n", - " Dashboard: http://127.0.0.1:42899/status\n", + " Dashboard: http://127.0.0.1:45231/status\n", " \n", " Memory: 1.92 GiB\n", @@ -202,13 +209,13 @@ "
\n", - " Nanny: tcp://127.0.0.1:41617\n", + " Nanny: tcp://127.0.0.1:36329\n", "
\n", - " Local directory: /tmp/dask-worker-space/worker-2ddr2vpy\n", + " Local directory: /tmp/dask-worker-space/worker-h00ktz12\n", "
\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\n", @@ -276,7 +283,7 @@ "
\n", - " Comm: tcp://127.0.0.1:38855\n", + " Comm: tcp://127.0.0.1:42921\n", " \n", " Total threads: 4\n", @@ -239,7 +246,7 @@ "
\n", - " Dashboard: http://127.0.0.1:40223/status\n", + " Dashboard: http://127.0.0.1:38047/status\n", " \n", " Memory: 1.92 GiB\n", @@ -247,13 +254,13 @@ "
\n", - " Nanny: tcp://127.0.0.1:41809\n", + " Nanny: tcp://127.0.0.1:44551\n", "
\n", - " Local directory: /tmp/dask-worker-space/worker-v_zyqpab\n", + " Local directory: /tmp/dask-worker-space/worker-vud0_r_u\n", "
\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\n", @@ -321,7 +328,7 @@ "
\n", - " Comm: tcp://127.0.0.1:46257\n", + " Comm: tcp://127.0.0.1:41499\n", " \n", " Total threads: 4\n", @@ -284,7 +291,7 @@ "
\n", - " Dashboard: http://127.0.0.1:35559/status\n", + " Dashboard: http://127.0.0.1:44985/status\n", " \n", " Memory: 1.92 GiB\n", @@ -292,13 +299,13 @@ "
\n", - " Nanny: tcp://127.0.0.1:43237\n", + " Nanny: tcp://127.0.0.1:46385\n", "
\n", - " Local directory: /tmp/dask-worker-space/worker-yor9ctjy\n", + " Local directory: /tmp/dask-worker-space/worker-skfrjn5y\n", "
\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\n", @@ -370,7 +377,7 @@ "" ], "text/plain": [ - "" + "" ] }, "execution_count": 2, @@ -381,7 +388,7 @@ "source": [ "import dask\n", "import dask.multiprocessing\n", - "dask.config.set(scheduler='multiprocessing')\n", + "dask.config.set(scheduler='processes')\n", "from dask.distributed import Client, progress\n", "client = Client()\n", "client" @@ -422,7 +429,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 8, "id": "6371f229-a8fb-4ba5-b65d-930ee098073f", "metadata": {}, "outputs": [ @@ -430,237 +437,209 @@ "name": "stdout", "output_type": "stream", "text": [ - "2022-07-27 07:35:42.869084\n", + "2022-07-28 18:19:46.761391\n", "TOPOLOGY\n", - "0:00:00.801938\n", - "dict_keys(['ACE', 'ARG', 'NME', 'WAT'])\n", + "0:00:10.816648\n", + "dict_keys(['LYS', 'VAL', 'PHE', 'GLY', 'ARG', 'CYS', 'GLU', 'LEU', 'ALA', 'MET', 'HIS', 'ASP', 'ASN', 'TYR', 'SER', 'TRP', 'THR', 'GLN', 'ILE', 'PRO', 'SOL', 'CL'])\n", "EXCLUDED RESNAMES: None\n", - "frame = 0\n", - "< Timestep 0 with unit cell dimensions [30.67833 30.40052 29.490604 90. 90. 90. ] >\n", + "prepare to execute\n", + "frame = 3\n", + "< Timestep 3 with unit cell dimensions [69.52697 69.52697 69.52697 90. 90. 90. ] >\n", "COORDS-FORCES\n", - "0:00:00.852477\n", - "DIH\n", - "0:00:00.859203\n", - "NEAREST ARRAYS\n", - "0:00:01.184122\n", - "RAD\n", - "0:00:01.840073\n", - "HB\n", - "0:00:02.094277\n", - "NEAREST NON-LIKE ASSIGNMENT\n", - "0:00:02.096734\n", - "PROX\n", - "0:00:02.098553\n", - "FTMATRIX\n", - "0:00:02.535373\n", - "ORIENTS\n", - "0:00:02.539700\n", + "0:00:14.470321\n", + "frame = 2\n", + "< Timestep 2 with unit cell dimensions [69.61369 69.61369 69.61369 90. 90. 90. ] >\n", + "COORDS-FORCES\n", + "0:00:14.534201\n", "frame = 1\n", - "< Timestep 1 with unit cell dimensions [30.682182 30.404337 29.494312 90. 90. 90. ] >\n", + "< Timestep 1 with unit cell dimensions [69.476456 69.476456 69.476456 90. 90. 90. ] >\n", "COORDS-FORCES\n", - "0:00:02.592686\n", + "0:00:14.535861\n", "DIH\n", - "0:00:02.599517\n", - "NEAREST ARRAYS\n", - "0:00:02.887840\n", - "RAD\n", - "0:00:03.648667\n", - "HB\n", - "0:00:03.896246\n", - "NEAREST NON-LIKE ASSIGNMENT\n", - "0:00:03.899294\n", - "PROX\n", - "0:00:03.901879\n", - "FTMATRIX\n", - "0:00:04.350654\n", - "ORIENTS\n", - "0:00:04.354834\n", - "frame = 2\n", - "< Timestep 2 with unit cell dimensions [30.713255 30.435127 29.524178 90. 90. 90. ] >\n", + "0:00:14.804284\n", + "DIH\n", + "0:00:14.890316\n", + "DIH\n", + "0:00:14.894539\n", + "frame = 4\n", + "frame = 0\n", + "< Timestep 4 with unit cell dimensions [69.57063 69.57063 69.57063 90. 90. 90. ] >\n", + "< Timestep 0 with unit cell dimensions [69.57307 69.57307 69.57307 90. 90. 90. ] >\n", "COORDS-FORCES\n", - "0:00:04.396243\n", + "0:00:16.530269\n", "DIH\n", - "0:00:04.402641\n", - "NEAREST ARRAYS\n", - "0:00:04.695812\n", - "RAD\n", - "0:00:05.377131\n", - "HB\n", - "0:00:05.634235\n", - "NEAREST NON-LIKE ASSIGNMENT\n", - "0:00:05.636695\n", - "PROX\n", - "0:00:05.638350\n", - "FTMATRIX\n", - "0:00:06.089667\n", - "ORIENTS\n", - "0:00:06.173258\n", - "frame = 3\n", - "< Timestep 3 with unit cell dimensions [30.598316 30.321232 29.41369 90. 90. 90. ] >\n", + "0:00:17.063608\n", "COORDS-FORCES\n", - "0:00:06.240124\n", + "0:00:17.272644\n", "DIH\n", - "0:00:06.248649\n", + "0:00:17.706473\n", + "NEAREST ARRAYS\n", + "0:00:24.242707\n", "NEAREST ARRAYS\n", - "0:00:06.603247\n", + "0:00:24.294053\n", + "NEAREST ARRAYS\n", + "0:00:24.392514\n", + "NEAREST ARRAYS\n", + "0:00:36.637898\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/donald/miniconda3/envs/CEtrial/lib/python3.10/site-packages/CodeEntropy/poseidon/extractData/HBRAD.py:192: RuntimeWarning: invalid value encountered in arccos\n", + " angle1 = np.arccos(cosine_angle)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ "RAD\n", - "0:00:07.357493\n", + "0:00:35.219296\n", "HB\n", - "0:00:07.653185\n", + "0:00:37.813414\n", "NEAREST NON-LIKE ASSIGNMENT\n", - "0:00:07.656026\n", + "0:00:37.847995\n", "PROX\n", - "0:00:07.658352\n", - "FTMATRIX\n", - "0:00:08.093111\n", - "ORIENTS\n", - "0:00:08.097388\n", - "frame = 4\n", - "< Timestep 4 with unit cell dimensions [30.618622 30.341354 29.43321 90. 90. 90. ] >\n", - "COORDS-FORCES\n", - "0:00:08.146741\n", - "DIH\n", - "0:00:08.151636\n", - "NEAREST ARRAYS\n", - "0:00:08.426659\n", + "0:00:37.884287\n", "RAD\n", - "0:00:09.191003\n", + "0:00:35.603050\n", "HB\n", - "0:00:09.430586\n", + "0:00:38.440154\n", "NEAREST NON-LIKE ASSIGNMENT\n", - "0:00:09.433815\n", - "PROX\n", - "0:00:09.435607\n", - "FTMATRIX\n", - "0:00:09.871486\n", - "ORIENTS\n", - "0:00:09.876483\n", - "frame = 5\n", - "< Timestep 5 with unit cell dimensions [30.619095 30.341824 29.433666 90. 90. 90. ] >\n", - "COORDS-FORCES\n", - "0:00:09.929012\n", - "DIH\n", - "0:00:09.936505\n", - "NEAREST ARRAYS\n", - "0:00:10.355421\n", + "0:00:38.473420\n", "RAD\n", - "0:00:11.240257\n", + "0:00:35.809416\n", "HB\n", - "0:00:11.544711\n", + "0:00:38.495989\n", + "PROX\n", + "0:00:38.509796\n", "NEAREST NON-LIKE ASSIGNMENT\n", - "0:00:11.548049\n", + "0:00:38.532525\n", "PROX\n", - "0:00:11.551975\n", + "0:00:38.569533\n", + "NEAREST ARRAYS\n", + "0:00:39.726922\n", "FTMATRIX\n", - "0:00:11.995587\n", + "0:00:43.661345\n", "ORIENTS\n", - "0:00:11.999490\n", - "frame = 6\n", - "< Timestep 6 with unit cell dimensions [30.738136 30.459784 29.5481 90. 90. 90. ] >\n", - "COORDS-FORCES\n", - "0:00:12.068327\n", - "DIH\n", - "0:00:12.073833\n", - "NEAREST ARRAYS\n", - "0:00:12.398391\n", - "RAD\n", - "0:00:13.209010\n", - "HB\n", - "0:00:13.463295\n", - "NEAREST NON-LIKE ASSIGNMENT\n", - "0:00:13.466642\n", - "PROX\n", - "0:00:13.468991\n", + "0:00:43.729755\n", "FTMATRIX\n", - "0:00:13.930722\n", + "0:00:44.487481\n", "ORIENTS\n", - "0:00:13.938167\n", - "frame = 7\n", - "< Timestep 7 with unit cell dimensions [30.694881 30.416918 29.506514 90. 90. 90. ] >\n", - "COORDS-FORCES\n", - "0:00:14.012628\n", - "DIH\n", - "0:00:14.019262\n", - "NEAREST ARRAYS\n", - "0:00:14.366534\n", - "RAD\n", - "0:00:15.212298\n", - "HB\n", - "0:00:15.538945\n", - "NEAREST NON-LIKE ASSIGNMENT\n", - "0:00:15.541952\n", - "PROX\n", - "0:00:15.544194\n", + "0:00:44.554535\n", "FTMATRIX\n", - "0:00:16.015811\n", + "0:00:44.695925\n", "ORIENTS\n", - "0:00:16.019771\n", - "frame = 8\n", - "< Timestep 8 with unit cell dimensions [30.644718 30.36721 29.458292 90. 90. 90. ] >\n", - "COORDS-FORCES\n", - "0:00:16.171288\n", - "DIH\n", - "0:00:16.177264\n", - "NEAREST ARRAYS\n", - "0:00:16.514908\n", + "0:00:44.765300\n", "RAD\n", - "0:00:17.327573\n", + "0:01:04.065172\n", + "RAD\n", + "0:01:10.980770\n", "HB\n", - "0:00:17.594469\n", + "0:01:11.554396\n", "NEAREST NON-LIKE ASSIGNMENT\n", - "0:00:17.596938\n", + "0:01:11.609858\n", "PROX\n", - "0:00:17.600141\n", - "FTMATRIX\n", - "0:00:18.015800\n", - "ORIENTS\n", - "0:00:18.020546\n", - "frame = 9\n", - "< Timestep 9 with unit cell dimensions [30.726116 30.447872 29.536541 90. 90. 90. ] >\n", - "COORDS-FORCES\n", - "0:00:18.071443\n", - "DIH\n", - "0:00:18.078147\n", - "NEAREST ARRAYS\n", - "0:00:18.313848\n", - "RAD\n", - "0:00:19.015759\n", + "0:01:11.668300\n", "HB\n", - "0:00:19.268260\n", + "0:01:15.105755\n", "NEAREST NON-LIKE ASSIGNMENT\n", - "0:00:19.270942\n", + "0:01:15.147424\n", "PROX\n", - "0:00:19.272977\n", + "0:01:15.187237\n", + "FTMATRIX\n", + "0:01:29.186166\n", + "ORIENTS\n", + "0:01:29.305053\n", "FTMATRIX\n", - "0:00:19.682983\n", + "0:01:30.530090\n", "ORIENTS\n", - "0:00:19.687900\n" + "0:01:30.984170\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ - "/home/donald/miniconda3/envs/CEtrial/lib/python3.10/site-packages/distributed/worker.py:2843: UserWarning: Large object of size 8.65 MiB detected in task graph: \n", - " ([[0 H1 1.008 0.11230000108480453 1 ACE [1], 1 CH3 ... ype=float32)],)\n", - "Consider scattering large objects ahead of time\n", - "with client.scatter to reduce scheduler burden and \n", - "keep data on workers\n", + "2022-07-28 18:21:21,340 - distributed.protocol.core - CRITICAL - Failed to deserialize\n", + "Traceback (most recent call last):\n", + " File \"/home/donald/miniconda3/envs/CEtrial/lib/python3.10/site-packages/distributed/protocol/core.py\", line 158, in loads\n", + " return msgpack.loads(\n", + " File \"msgpack/_unpacker.pyx\", line 194, in msgpack._cmsgpack.unpackb\n", + " File \"/home/donald/miniconda3/envs/CEtrial/lib/python3.10/site-packages/distributed/protocol/core.py\", line 138, in _decode_default\n", + " return merge_and_deserialize(\n", + " File \"/home/donald/miniconda3/envs/CEtrial/lib/python3.10/site-packages/distributed/protocol/serialize.py\", line 497, in merge_and_deserialize\n", + " return deserialize(header, merged_frames, deserializers=deserializers)\n", + " File \"/home/donald/miniconda3/envs/CEtrial/lib/python3.10/site-packages/distributed/protocol/serialize.py\", line 410, in deserialize\n", + " deserialize(\n", + " File \"/home/donald/miniconda3/envs/CEtrial/lib/python3.10/site-packages/distributed/protocol/serialize.py\", line 426, in deserialize\n", + " return loads(header, frames)\n", + " File \"/home/donald/miniconda3/envs/CEtrial/lib/python3.10/site-packages/distributed/protocol/serialize.py\", line 180, in serialization_error_loads\n", + " raise TypeError(msg)\n", + "TypeError: Could not serialize object of type list\n", + "Traceback (most recent call last):\n", + " File \"/home/donald/miniconda3/envs/CEtrial/lib/python3.10/site-packages/distributed/protocol/pickle.py\", line 46, in dumps\n", + " result = pickle.dumps(x, **dump_kwargs)\n", + "RecursionError: maximum recursion depth exceeded while calling a Python object\n", "\n", - " future = client.submit(func, big_data) # bad\n", + "During handling of the above exception, another exception occurred:\n", "\n", - " big_future = client.scatter(big_data) # good\n", - " future = client.submit(func, big_future) # good\n", - " warnings.warn(\n" + "Traceback (most recent call last):\n", + " File \"/home/donald/miniconda3/envs/CEtrial/lib/python3.10/site-packages/cloudpickle/cloudpickle_fast.py\", line 602, in dump\n", + " return Pickler.dump(self, obj)\n", + "RecursionError: maximum recursion depth exceeded\n", + "\n", + "The above exception was the direct cause of the following exception:\n", + "\n", + "Traceback (most recent call last):\n", + " File \"/home/donald/miniconda3/envs/CEtrial/lib/python3.10/site-packages/distributed/protocol/serialize.py\", line 347, in serialize\n", + " header, frames = dumps(x, context=context) if wants_context else dumps(x)\n", + " File \"/home/donald/miniconda3/envs/CEtrial/lib/python3.10/site-packages/distributed/protocol/serialize.py\", line 71, in pickle_dumps\n", + " frames[0] = pickle.dumps(\n", + " File \"/home/donald/miniconda3/envs/CEtrial/lib/python3.10/site-packages/distributed/protocol/pickle.py\", line 58, in dumps\n", + " result = cloudpickle.dumps(x, **dump_kwargs)\n", + " File \"/home/donald/miniconda3/envs/CEtrial/lib/python3.10/site-packages/cloudpickle/cloudpickle_fast.py\", line 73, in dumps\n", + " cp.dump(obj)\n", + " File \"/home/donald/miniconda3/envs/CEtrial/lib/python3.10/site-packages/cloudpickle/cloudpickle_fast.py\", line 609, in dump\n", + " raise pickle.PicklingError(msg) from e\n", + "_pickle.PicklingError: Could not pickle object as excessively deep recursion required.\n", + "\n" ] }, { - "name": "stdout", - "output_type": "stream", - "text": [ - "Done Threading Work\n", - "10\n", - "0:00:33.516714\n" + "ename": "TypeError", + "evalue": "Could not serialize object of type list\nTraceback (most recent call last):\n File \"/home/donald/miniconda3/envs/CEtrial/lib/python3.10/site-packages/distributed/protocol/pickle.py\", line 46, in dumps\n result = pickle.dumps(x, **dump_kwargs)\nRecursionError: maximum recursion depth exceeded while calling a Python object\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n File \"/home/donald/miniconda3/envs/CEtrial/lib/python3.10/site-packages/cloudpickle/cloudpickle_fast.py\", line 602, in dump\n return Pickler.dump(self, obj)\nRecursionError: maximum recursion depth exceeded\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n File \"/home/donald/miniconda3/envs/CEtrial/lib/python3.10/site-packages/distributed/protocol/serialize.py\", line 347, in serialize\n header, frames = dumps(x, context=context) if wants_context else dumps(x)\n File \"/home/donald/miniconda3/envs/CEtrial/lib/python3.10/site-packages/distributed/protocol/serialize.py\", line 71, in pickle_dumps\n frames[0] = pickle.dumps(\n File \"/home/donald/miniconda3/envs/CEtrial/lib/python3.10/site-packages/distributed/protocol/pickle.py\", line 58, in dumps\n result = cloudpickle.dumps(x, **dump_kwargs)\n File \"/home/donald/miniconda3/envs/CEtrial/lib/python3.10/site-packages/cloudpickle/cloudpickle_fast.py\", line 73, in dumps\n cp.dump(obj)\n File \"/home/donald/miniconda3/envs/CEtrial/lib/python3.10/site-packages/cloudpickle/cloudpickle_fast.py\", line 609, in dump\n raise pickle.PicklingError(msg) from e\n_pickle.PicklingError: Could not pickle object as excessively deep recursion required.\n", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m/tmp/ipykernel_7257/2897571424.py\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 92\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 93\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"prepare to execute\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 94\u001b[0;31m \u001b[0mdata\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdask\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcompute\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mjob_list\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mscheduler\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m\"distributed\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 95\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 96\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"Done Threading Work\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/miniconda3/envs/CEtrial/lib/python3.10/site-packages/dask/base.py\u001b[0m in \u001b[0;36mcompute\u001b[0;34m(traverse, optimize_graph, scheduler, get, *args, **kwargs)\u001b[0m\n\u001b[1;32m 596\u001b[0m \u001b[0mpostcomputes\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__dask_postcompute__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 597\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 598\u001b[0;31m \u001b[0mresults\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mschedule\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdsk\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkeys\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 599\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mrepack\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mr\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mr\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0ma\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mzip\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mresults\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mpostcomputes\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 600\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/miniconda3/envs/CEtrial/lib/python3.10/site-packages/distributed/client.py\u001b[0m in \u001b[0;36mget\u001b[0;34m(self, dsk, keys, workers, allow_other_workers, resources, sync, asynchronous, direct, retries, priority, fifo_timeout, actors, **kwargs)\u001b[0m\n\u001b[1;32m 2999\u001b[0m \u001b[0mshould_rejoin\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3000\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 3001\u001b[0;31m \u001b[0mresults\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgather\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mpacked\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0masynchronous\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0masynchronous\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdirect\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mdirect\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3002\u001b[0m \u001b[0;32mfinally\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3003\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mf\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mfutures\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalues\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/miniconda3/envs/CEtrial/lib/python3.10/site-packages/distributed/client.py\u001b[0m in \u001b[0;36mgather\u001b[0;34m(self, futures, errors, direct, asynchronous)\u001b[0m\n\u001b[1;32m 2173\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2174\u001b[0m \u001b[0mlocal_worker\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2175\u001b[0;31m return self.sync(\n\u001b[0m\u001b[1;32m 2176\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_gather\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2177\u001b[0m \u001b[0mfutures\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/miniconda3/envs/CEtrial/lib/python3.10/site-packages/distributed/utils.py\u001b[0m in \u001b[0;36msync\u001b[0;34m(self, func, asynchronous, callback_timeout, *args, **kwargs)\u001b[0m\n\u001b[1;32m 336\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mfuture\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 337\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 338\u001b[0;31m return sync(\n\u001b[0m\u001b[1;32m 339\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mloop\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcallback_timeout\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mcallback_timeout\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 340\u001b[0m )\n", + "\u001b[0;32m~/miniconda3/envs/CEtrial/lib/python3.10/site-packages/distributed/utils.py\u001b[0m in \u001b[0;36msync\u001b[0;34m(loop, func, callback_timeout, *args, **kwargs)\u001b[0m\n\u001b[1;32m 403\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0merror\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 404\u001b[0m \u001b[0mtyp\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mexc\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtb\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0merror\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 405\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mexc\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mwith_traceback\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtb\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 406\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 407\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mresult\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/miniconda3/envs/CEtrial/lib/python3.10/site-packages/distributed/utils.py\u001b[0m in \u001b[0;36mf\u001b[0;34m()\u001b[0m\n\u001b[1;32m 376\u001b[0m \u001b[0mfuture\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0masyncio\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mwait_for\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfuture\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcallback_timeout\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 377\u001b[0m \u001b[0mfuture\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0masyncio\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mensure_future\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfuture\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 378\u001b[0;31m \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32myield\u001b[0m \u001b[0mfuture\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 379\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mException\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 380\u001b[0m \u001b[0merror\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0msys\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexc_info\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/miniconda3/envs/CEtrial/lib/python3.10/site-packages/tornado/gen.py\u001b[0m in \u001b[0;36mrun\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 760\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 761\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 762\u001b[0;31m \u001b[0mvalue\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfuture\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mresult\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 763\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mException\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 764\u001b[0m \u001b[0mexc_info\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0msys\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexc_info\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/miniconda3/envs/CEtrial/lib/python3.10/site-packages/distributed/client.py\u001b[0m in \u001b[0;36m_gather\u001b[0;34m(self, futures, errors, direct, local_worker)\u001b[0m\n\u001b[1;32m 2065\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2066\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_gather_future\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfuture\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2067\u001b[0;31m \u001b[0mresponse\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mawait\u001b[0m \u001b[0mfuture\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2068\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2069\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mresponse\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m\"status\"\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m\"error\"\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/miniconda3/envs/CEtrial/lib/python3.10/site-packages/distributed/client.py\u001b[0m in \u001b[0;36m_gather_remote\u001b[0;34m(self, direct, local_worker)\u001b[0m\n\u001b[1;32m 2116\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2117\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;31m# ask scheduler to gather data for us\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2118\u001b[0;31m \u001b[0mresponse\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mawait\u001b[0m \u001b[0mretry_operation\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mscheduler\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgather\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkeys\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mkeys\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2119\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2120\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mresponse\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/miniconda3/envs/CEtrial/lib/python3.10/site-packages/distributed/utils_comm.py\u001b[0m in \u001b[0;36mretry_operation\u001b[0;34m(coro, operation, *args, **kwargs)\u001b[0m\n\u001b[1;32m 381\u001b[0m \u001b[0mdask\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mconfig\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"distributed.comm.retry.delay.max\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdefault\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m\"s\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 382\u001b[0m )\n\u001b[0;32m--> 383\u001b[0;31m return await retry(\n\u001b[0m\u001b[1;32m 384\u001b[0m \u001b[0mpartial\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcoro\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 385\u001b[0m \u001b[0mcount\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mretry_count\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/miniconda3/envs/CEtrial/lib/python3.10/site-packages/distributed/utils_comm.py\u001b[0m in \u001b[0;36mretry\u001b[0;34m(coro, count, delay_min, delay_max, jitter_fraction, retry_on_exceptions, operation)\u001b[0m\n\u001b[1;32m 366\u001b[0m \u001b[0mdelay\u001b[0m \u001b[0;34m*=\u001b[0m \u001b[0;36m1\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mrandom\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrandom\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m*\u001b[0m \u001b[0mjitter_fraction\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 367\u001b[0m \u001b[0;32mawait\u001b[0m \u001b[0masyncio\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msleep\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdelay\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 368\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0;32mawait\u001b[0m \u001b[0mcoro\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 369\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 370\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/miniconda3/envs/CEtrial/lib/python3.10/site-packages/distributed/core.py\u001b[0m in \u001b[0;36msend_recv_from_rpc\u001b[0;34m(**kwargs)\u001b[0m\n\u001b[1;32m 1151\u001b[0m \u001b[0mprev_name\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcomm\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mname\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcomm\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mname\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"ConnectionPool.\"\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mkey\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1152\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1153\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0;32mawait\u001b[0m \u001b[0msend_recv\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcomm\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mcomm\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mop\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1154\u001b[0m \u001b[0;32mfinally\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1155\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpool\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mreuse\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0maddr\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcomm\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/miniconda3/envs/CEtrial/lib/python3.10/site-packages/distributed/core.py\u001b[0m in \u001b[0;36msend_recv\u001b[0;34m(comm, reply, serializers, deserializers, **kwargs)\u001b[0m\n\u001b[1;32m 916\u001b[0m \u001b[0;32mawait\u001b[0m \u001b[0mcomm\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mwrite\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmsg\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mserializers\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mserializers\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mon_error\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m\"raise\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 917\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mreply\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 918\u001b[0;31m \u001b[0mresponse\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mawait\u001b[0m \u001b[0mcomm\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mread\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdeserializers\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mdeserializers\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 919\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 920\u001b[0m \u001b[0mresponse\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/miniconda3/envs/CEtrial/lib/python3.10/site-packages/distributed/comm/tcp.py\u001b[0m in \u001b[0;36mread\u001b[0;34m(self, deserializers)\u001b[0m\n\u001b[1;32m 250\u001b[0m \u001b[0mframes\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0munpack_frames\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mframes\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 251\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 252\u001b[0;31m msg = await from_frames(\n\u001b[0m\u001b[1;32m 253\u001b[0m \u001b[0mframes\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 254\u001b[0m \u001b[0mdeserialize\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdeserialize\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/miniconda3/envs/CEtrial/lib/python3.10/site-packages/distributed/comm/utils.py\u001b[0m in \u001b[0;36mfrom_frames\u001b[0;34m(frames, deserialize, deserializers, allow_offload)\u001b[0m\n\u001b[1;32m 98\u001b[0m \u001b[0mres\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mawait\u001b[0m \u001b[0moffload\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0m_from_frames\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 99\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 100\u001b[0;31m \u001b[0mres\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_from_frames\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 101\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 102\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mres\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/miniconda3/envs/CEtrial/lib/python3.10/site-packages/distributed/comm/utils.py\u001b[0m in \u001b[0;36m_from_frames\u001b[0;34m()\u001b[0m\n\u001b[1;32m 81\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_from_frames\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 82\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 83\u001b[0;31m return protocol.loads(\n\u001b[0m\u001b[1;32m 84\u001b[0m \u001b[0mframes\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdeserialize\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mdeserialize\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdeserializers\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mdeserializers\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 85\u001b[0m )\n", + "\u001b[0;32m~/miniconda3/envs/CEtrial/lib/python3.10/site-packages/distributed/protocol/core.py\u001b[0m in \u001b[0;36mloads\u001b[0;34m(frames, deserialize, deserializers)\u001b[0m\n\u001b[1;32m 156\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mmsgpack_decode_default\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mobj\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 157\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 158\u001b[0;31m return msgpack.loads(\n\u001b[0m\u001b[1;32m 159\u001b[0m \u001b[0mframes\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mobject_hook\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0m_decode_default\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0muse_list\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mFalse\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mmsgpack_opts\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 160\u001b[0m )\n", + "\u001b[0;32mmsgpack/_unpacker.pyx\u001b[0m in \u001b[0;36mmsgpack._cmsgpack.unpackb\u001b[0;34m()\u001b[0m\n", + "\u001b[0;32m~/miniconda3/envs/CEtrial/lib/python3.10/site-packages/distributed/protocol/core.py\u001b[0m in \u001b[0;36m_decode_default\u001b[0;34m(obj)\u001b[0m\n\u001b[1;32m 136\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;34m\"compression\"\u001b[0m \u001b[0;32min\u001b[0m \u001b[0msub_header\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 137\u001b[0m \u001b[0msub_frames\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdecompress\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msub_header\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msub_frames\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 138\u001b[0;31m return merge_and_deserialize(\n\u001b[0m\u001b[1;32m 139\u001b[0m \u001b[0msub_header\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msub_frames\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdeserializers\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mdeserializers\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 140\u001b[0m )\n", + "\u001b[0;32m~/miniconda3/envs/CEtrial/lib/python3.10/site-packages/distributed/protocol/serialize.py\u001b[0m in \u001b[0;36mmerge_and_deserialize\u001b[0;34m(header, frames, deserializers)\u001b[0m\n\u001b[1;32m 495\u001b[0m \u001b[0mmerged_frames\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmerged\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 496\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 497\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mdeserialize\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mheader\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmerged_frames\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdeserializers\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mdeserializers\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 498\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 499\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/miniconda3/envs/CEtrial/lib/python3.10/site-packages/distributed/protocol/serialize.py\u001b[0m in \u001b[0;36mdeserialize\u001b[0;34m(header, frames, deserializers)\u001b[0m\n\u001b[1;32m 408\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0m_header\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0m_length\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mzip\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mheaders\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlengths\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 409\u001b[0m lst.append(\n\u001b[0;32m--> 410\u001b[0;31m deserialize(\n\u001b[0m\u001b[1;32m 411\u001b[0m \u001b[0m_header\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 412\u001b[0m \u001b[0mframes\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mstart\u001b[0m \u001b[0;34m:\u001b[0m \u001b[0mstart\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0m_length\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/miniconda3/envs/CEtrial/lib/python3.10/site-packages/distributed/protocol/serialize.py\u001b[0m in \u001b[0;36mdeserialize\u001b[0;34m(header, frames, deserializers)\u001b[0m\n\u001b[1;32m 424\u001b[0m )\n\u001b[1;32m 425\u001b[0m \u001b[0mdumps\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mloads\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mwants_context\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfamilies\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mname\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 426\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mloads\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mheader\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mframes\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 427\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 428\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/miniconda3/envs/CEtrial/lib/python3.10/site-packages/distributed/protocol/serialize.py\u001b[0m in \u001b[0;36mserialization_error_loads\u001b[0;34m(header, frames)\u001b[0m\n\u001b[1;32m 178\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mserialization_error_loads\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mheader\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mframes\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 179\u001b[0m \u001b[0mmsg\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m\"\\n\"\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mjoin\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mcodecs\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdecode\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mframe\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"utf8\"\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mframe\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mframes\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 180\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mTypeError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmsg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 181\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 182\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mTypeError\u001b[0m: Could not serialize object of type list\nTraceback (most recent call last):\n File \"/home/donald/miniconda3/envs/CEtrial/lib/python3.10/site-packages/distributed/protocol/pickle.py\", line 46, in dumps\n result = pickle.dumps(x, **dump_kwargs)\nRecursionError: maximum recursion depth exceeded while calling a Python object\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n File \"/home/donald/miniconda3/envs/CEtrial/lib/python3.10/site-packages/cloudpickle/cloudpickle_fast.py\", line 602, in dump\n return Pickler.dump(self, obj)\nRecursionError: maximum recursion depth exceeded\n\nThe above exception was the direct cause of the following exception:\n\nTraceback (most recent call last):\n File \"/home/donald/miniconda3/envs/CEtrial/lib/python3.10/site-packages/distributed/protocol/serialize.py\", line 347, in serialize\n header, frames = dumps(x, context=context) if wants_context else dumps(x)\n File \"/home/donald/miniconda3/envs/CEtrial/lib/python3.10/site-packages/distributed/protocol/serialize.py\", line 71, in pickle_dumps\n frames[0] = pickle.dumps(\n File \"/home/donald/miniconda3/envs/CEtrial/lib/python3.10/site-packages/distributed/protocol/pickle.py\", line 58, in dumps\n result = cloudpickle.dumps(x, **dump_kwargs)\n File \"/home/donald/miniconda3/envs/CEtrial/lib/python3.10/site-packages/cloudpickle/cloudpickle_fast.py\", line 73, in dumps\n cp.dump(obj)\n File \"/home/donald/miniconda3/envs/CEtrial/lib/python3.10/site-packages/cloudpickle/cloudpickle_fast.py\", line 609, in dump\n raise pickle.PicklingError(msg) from e\n_pickle.PicklingError: Could not pickle object as excessively deep recursion required.\n" ] } ], @@ -702,7 +681,7 @@ "# \"\"\"\n", "container=u\n", "start=0\n", - "end=10\n", + "end=5\n", "step=1\n", "pureAtomNum=1\n", "cutShell=None\n", @@ -746,7 +725,7 @@ "sys.setrecursionlimit(3000000)\n", "job_list = []\n", "for frame in range(int(start), int(end), int(step)):\n", - " job_list.append(dask.delayed(frame_iteration(\n", + " job_list.append(dask.delayed(frame_iteration)(\n", " container, \n", " all_data, \n", " dimensions, \n", @@ -755,8 +734,10 @@ " waterTuple, \n", " cutShell, \n", " excludedResnames,\n", - " frame)))\n", - "data = dask.compute(*job_list)\n", + " frame))\n", + " \n", + "print(\"prepare to execute\")\n", + "data = dask.compute(job_list, scheduler=\"distributed\")\n", "\n", "print(\"Done Threading Work\")\n", "#print(data)\n", @@ -765,7 +746,7 @@ "# data.append(fi_partial(frame))\n", "\n", "print(len(data))\n", - "for item in data:\n", + "for item in data[0]:\n", " allMoleculeList = moleculeObjectPopulation(item[0], \n", " allMoleculeList, item[1], item[2])\n", "# #writing file here \n", @@ -780,23 +761,267 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 15, "id": "e59703af-e98f-4770-be93-4566b7b7f4d2", "metadata": {}, "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2022-07-28 18:06:33.882125\n", + "\n", + "solvent: ['WAT', 'wat', 'SOL', 'H2O', 'h2o', 'WAT_O', 'TIP3']\n", + "\n", + "water: ['WAT', 'wat', 'SOL', 'H2O', 'h2o', 'WAT_O', 'TIP3']\n", + "\n", + "1. Populate Dictionaries\n", + "\n", + "memory use: 1.929 GB\n", + "0:00:00.000914\n", + "memory use: 1.929 GB\n", + "0:00:01.406618\n", + "0:00:01.407275\n", + "memory use: 1.929 GB\n", + "\n", + "Total number of frames: 20.0\n", + "Number of atoms in each frame: 916\n", + "Number of variables in each list: 19\n", + "\n", + "2. Process Dictionaries\n", + "['moleculeLevel']\n", + "---level: moleculeLevel\n", + "\n", + "\n", + "0:00:01.600541\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/donald/miniconda3/envs/CEtrial/lib/python3.10/site-packages/CodeEntropy/poseidon/analysis/EECalculation.py:859: RuntimeWarning: invalid value encountered in double_scalars\n", + " w = w ** 0.5\n" + ] + }, { "data": { "text/plain": [ - "Delayed('tuple-ffd34808-f68c-40c6-ad98-900c62642712')" + "{'moleculeLevel': {'solventData': nearest assigned shell_num variable value count\n", + " 0 ACE WAT 1.0 Sor_test2 4.489916 155\n", + " 1 ACE WAT 1.0 Strans 140.062995 155\n", + " 2 ACE WAT 1.0 Srot 113.115592 155\n", + " 3 ACE WAT 1.0 count 7.75 155\n", + " 4 ARG WAT 1.0 Sor_test2 4.389286 358\n", + " 5 ARG WAT 1.0 Strans 139.597899 358\n", + " 6 ARG WAT 1.0 Srot 113.456453 358\n", + " 7 ARG WAT 1.0 count 17.9 358\n", + " 8 NME WAT 1.0 Sor_test2 2.782703 117\n", + " 9 NME WAT 1.0 Strans 139.409094 117\n", + " 10 NME WAT 1.0 Srot 112.39722 117\n", + " 11 NME WAT 1.0 count 5.85 117,\n", + " 'soluteData': resName variable value count\n", + " 0 ACE WM_Strans 123.289652 20\n", + " 1 ACE WM_Srot 102.152818 20\n", + " 2 ACE WM_UA_Strans 76.734475 20\n", + " 3 ACE WM_UA_Srot 106.684997 20\n", + " 4 ARG WM_Strans 130.232761 20\n", + " 5 ARG WM_Srot 99.15884 20\n", + " 6 ARG WM_UA_Strans 923.724725 20\n", + " 7 ARG WM_UA_Srot NaN 20\n", + " 8 ARG conf_AE 18.358527 20\n", + " 9 NME WM_Strans 120.852381 20\n", + " 10 NME WM_Srot 66.745401 20\n", + " 11 NME WM_UA_Strans 0.0 20\n", + " 12 NME WM_UA_Srot 202.251284 20}}" ] }, - "execution_count": 11, + "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "job_list[0]" + "def run_analysis(allMoleculeList, \n", + " temperature=298.0, \n", + " entropyEnergy=True, \n", + " level_list=['moleculeLevel'], \n", + " solvent=None, water='WAT',\n", + " verbose=False, weighting=None, \n", + " forceUnits='kJ'):\n", + " \"\"\"Perform analysis using poseidon\n", + "\n", + " Parameters\n", + " -----------\n", + " temperature : float, Optional, default: 298.0\n", + " Temperature for system.\n", + " entropyEnergy : Bool, Optional, default: True\n", + " Run entropy and energy analysis.\n", + " level_list : list of str, Optional, default: ['moleculeLevel']\n", + " Choose and refine the level of analyiss: moleculeLevel, residLevel_resname, atomLevel, soluteContacts.\n", + " solvent : str, Optional, default: None\n", + " Resname for solvent.\n", + " water : str or list of str, Optional, default: 'WAT'\n", + " Resname for water.\n", + " verbose : bool, Optional, default: False\n", + " Print out progress of each step.\n", + " weighting : str or None, Optional, default: None\n", + " Get weighing for each frame if the simulation is biased.\n", + " forceUnits : str, Optional, default: 'kJ'\n", + " Units of forces, kJ or Kcal. \n", + "\n", + " Returns\n", + " ---------\n", + " Tuple of DataFrame, for each level analysed:\n", + " solventData: dataframe that contains the result for solvent\n", + " soluteData: dataframe that contains the result for solute\n", + " contactMatrix: dataframe that contains the contact matrix\n", + " \"\"\"\n", + "\n", + " verbosePrint = print if verbose else lambda *a, **k: None\n", + " startTime = datetime.now()\n", + " print(startTime)\n", + "\n", + "\n", + "\n", + " waterTuple = ['WAT', 'wat', 'SOL', 'H2O', 'h2o', 'WAT_O', 'TIP3']\n", + " if water != 'WAT':\n", + " waterTuple = [water]\n", + " if solvent == None: ##when solvent is NOT water\n", + " solvent = waterTuple\n", + "\n", + "\n", + "\n", + "\n", + " print('\\nsolvent: %s' % (solvent))\n", + " print('\\nwater: %s' % (waterTuple))\n", + " print('\\n1. Populate Dictionaries\\n')\n", + "\n", + " count = 1\n", + " totAtoms = 0\n", + " list_len = None\n", + " atom_nums = []\n", + " atom_count = 0\n", + " objectIteration = 0\n", + "\n", + " EEclass = None \n", + " EEclass_residLevel_resname = None\n", + " EEclass_soluteContacts = None\n", + " EEclass_atomLevel = None\n", + "\n", + "\n", + " class_str_list = ['EEclass', 'EEclass_residLevel_resname', \n", + " 'EEclass_soluteContacts', 'EEclass_atomLevel', \n", + " 'totAtoms', 'atom_nums', 'atom_count', 'objectIteration']\n", + "\n", + " memoryInfo(verbosePrint)\n", + " print(datetime.now() - startTime)\n", + " sys.stdout.flush()\n", + " if totAtoms != 0:\n", + " count = 2\n", + "\n", + " weighting_info = None\n", + " atomList = allMoleculeList\n", + " list_len = len(atomList[0])\n", + " totAtoms += len(atomList)\n", + " if count == 1:\n", + " for i in atomList:\n", + " atom_num = i[2]\n", + " if atom_num not in atom_nums:\n", + " atom_nums.append(atom_num)\n", + " else:\n", + " break\n", + " if weighting != None:\n", + " weighting_info = weightingPopulation(weighting)\n", + "\n", + " EEclass, EEclass_residLevel_resname, \\\n", + " EEclass_soluteContacts, EEclass_atomLevel, \\\n", + " atom_count = \\\n", + " classPopulation(\n", + " atomList, entropyEnergy, \n", + " level_list, count, \n", + " atom_count, len(atom_nums), \n", + " waterTuple, temperature, \n", + " solvent, EEclass, \n", + " EEclass_residLevel_resname, EEclass_soluteContacts, \n", + " EEclass_atomLevel, \n", + " weighting_info, verbosePrint)\n", + " count += 1 #needed for class initiation\n", + " gc.enable()\n", + " memoryInfo(verbosePrint)\n", + " print(datetime.now() - startTime)\n", + " sys.stdout.flush()\n", + "\n", + "\n", + " print(datetime.now() - startTime)\n", + " memoryInfo(verbosePrint)\n", + " sys.stdout.flush()\n", + "\n", + "\n", + " try:\n", + " totFrames = float(totAtoms) / float(len(atom_nums))\n", + " print('\\nTotal number of frames: %s' % (totFrames))\n", + " print('Number of atoms in each frame: %s' % (len(atom_nums)))\n", + " print('Number of variables in each list: %s' % (list_len))\n", + " num_frames = totFrames\n", + " except ZeroDivisionError:\n", + " logging.error('No frames to analyse, please chose correct '\\\n", + " 'path to .obj files')\n", + " num_frames = None\n", + " sys.exit()\n", + "\n", + " ###once all the classes have been populated, calculate properties\n", + " #and output to files\n", + "\n", + " print('\\n2. Process Dictionaries')\n", + " result_list = dict()\n", + " print(level_list)\n", + " for level in level_list:\n", + "\n", + " print('---level:', level)\n", + " EEclass2, DSclass2 = None, None\n", + "\n", + " if level in [None, 'moleculeLevel']:\n", + " EEclass2 = EEclass\n", + " if level in ['residLevel_resname']:\n", + " EEclass2 = EEclass_residLevel_resname\n", + " if level in ['soluteContacts']:\n", + " EEclass2 = EEclass_soluteContacts\n", + " if level in ['atomLevel']:\n", + " EEclass2 = EEclass_atomLevel\n", + "\n", + "\n", + " if entropyEnergy:\n", + " name = 'EE'\n", + " result = processEE(num_frames, totFrames, EEclass2, \n", + " solvent, waterTuple, \n", + " temperature, level, name, forceUnits, verbosePrint)\n", + " result_list[level] = result\n", + " # #'''\n", + " # ##Save each class as an object so that we can continue populating\n", + " # #in stages.\n", + " # if len(paths) != 0:\n", + " # objectIteration += 1\n", + " # if pathClasses:\n", + " # print('\\n3. Save Dictionaries')\n", + " # for Aclass in class_str_list:\n", + " # with gzip.GzipFile('%s.obj' % (Aclass), 'wb') as pickleFile:\n", + " # pickle.dump((locals()[Aclass]), pickleFile, protocol=2)\n", + " # pickleFile.close()\n", + " # #locals()[Aclass] = None\n", + " # print('Number of objectIteration cycles saved: %s' % \n", + " # (objectIteration))\n", + " # print('Total atoms processed: %s' % (totAtoms))\n", + "\n", + " # #'''\n", + "\n", + "\n", + " sys.stdout.flush()\n", + " print('\\n')\n", + " print(datetime.now() - startTime)\n", + " return result_list\n", + "\n", + "run_analysis(allMoleculeList)" ] }, { @@ -809,7 +1034,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 16, "id": "b6a0fd0c-2bb1-4c90-a90b-b094a976ee3b", "metadata": {}, "outputs": [ @@ -817,46 +1042,76 @@ "name": "stdout", "output_type": "stream", "text": [ - "2022-07-26 19:28:24.507828\n", + "2022-07-28 18:07:05.426259\n", "frame = 0\n", "< Timestep 0 with unit cell dimensions [30.67833 30.40052 29.490604 90. 90. 90. ] >\n", - "0:00:02.192713\n", + "0:00:02.403687\n", "frame = 1\n", "< Timestep 1 with unit cell dimensions [30.682182 30.404337 29.494312 90. 90. 90. ] >\n", - "0:00:03.918281\n", + "0:00:04.069732\n", "frame = 2\n", "< Timestep 2 with unit cell dimensions [30.713255 30.435127 29.524178 90. 90. 90. ] >\n", - "0:00:05.502399\n", + "0:00:05.803433\n", "frame = 3\n", "< Timestep 3 with unit cell dimensions [30.598316 30.321232 29.41369 90. 90. 90. ] >\n", - "0:00:06.949409\n", + "0:00:07.367259\n", "frame = 4\n", "< Timestep 4 with unit cell dimensions [30.618622 30.341354 29.43321 90. 90. 90. ] >\n", - "0:00:08.473875\n", + "0:00:08.980108\n", "frame = 5\n", "< Timestep 5 with unit cell dimensions [30.619095 30.341824 29.433666 90. 90. 90. ] >\n", - "0:00:10.128160\n", + "0:00:10.749856\n", "frame = 6\n", "< Timestep 6 with unit cell dimensions [30.738136 30.459784 29.5481 90. 90. 90. ] >\n", - "0:00:11.705685\n", + "0:00:12.403620\n", "frame = 7\n", "< Timestep 7 with unit cell dimensions [30.694881 30.416918 29.506514 90. 90. 90. ] >\n", - "0:00:13.413162\n", + "0:00:14.742970\n", "frame = 8\n", "< Timestep 8 with unit cell dimensions [30.644718 30.36721 29.458292 90. 90. 90. ] >\n", - "0:00:14.876336\n", + "0:00:16.458944\n", "frame = 9\n", "< Timestep 9 with unit cell dimensions [30.726116 30.447872 29.536541 90. 90. 90. ] >\n", - "0:00:16.332658\n", - "0:00:16.333407\n", - "0:00:16.341065\n" + "0:00:18.211993\n", + "frame = 10\n", + "< Timestep 10 with unit cell dimensions [30.580582 30.303658 29.39664 90. 90. 90. ] >\n", + "0:00:19.819312\n", + "frame = 11\n", + "< Timestep 11 with unit cell dimensions [30.772951 30.494282 29.581562 90. 90. 90. ] >\n", + "0:00:21.489616\n", + "frame = 12\n", + "< Timestep 12 with unit cell dimensions [30.772266 30.493605 29.580906 90. 90. 90. ] >\n", + "0:00:23.093535\n", + "frame = 13\n", + "< Timestep 13 with unit cell dimensions [30.58512 30.308151 29.401005 90. 90. 90. ] >\n", + "0:00:24.708540\n", + "frame = 14\n", + "< Timestep 14 with unit cell dimensions [30.599762 30.322662 29.415077 90. 90. 90. ] >\n", + "0:00:26.441673\n", + "frame = 15\n", + "< Timestep 15 with unit cell dimensions [30.746477 30.468048 29.556114 90. 90. 90. ] >\n", + "0:00:28.087924\n", + "frame = 16\n", + "< Timestep 16 with unit cell dimensions [30.764982 30.486385 29.573902 90. 90. 90. ] >\n", + "0:00:29.980376\n", + "frame = 17\n", + "< Timestep 17 with unit cell dimensions [30.672724 30.394962 29.485216 90. 90. 90. ] >\n", + "0:00:31.753867\n", + "frame = 18\n", + "< Timestep 18 with unit cell dimensions [30.674246 30.396471 29.48668 90. 90. 90. ] >\n", + "0:00:34.179204\n", + "frame = 19\n", + "< Timestep 19 with unit cell dimensions [30.699165 30.421165 29.510633 90. 90. 90. ] >\n", + "0:00:36.197494\n", + "0:00:36.198390\n", + "0:00:36.205887\n" ] } ], "source": [ "from CodeEntropy.ClassCollection.PoseidonClass import Poseidon\n", "startTime = datetime.now()\n", - "poseidon_object = Poseidon(container=u, start=0, end=10)\n", + "poseidon_object = Poseidon(container=u, start=0, end=20)\n", "print(datetime.now() - startTime)" ] }, @@ -882,7 +1137,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 18, "id": "f5f77c6b-2b32-4321-9fab-f597f6371ac4", "metadata": {}, "outputs": [ @@ -890,7 +1145,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "2022-06-30 14:03:04.107787\n", + "2022-07-28 18:08:43.031855\n", "\n", "solvent: ['WAT', 'wat', 'SOL', 'H2O', 'h2o', 'WAT_O', 'TIP3']\n", "\n", @@ -898,12 +1153,12 @@ "\n", "1. Populate Dictionaries\n", "\n", - "memory use: 0.231 GB\n", - "0:00:00.001139\n", - "memory use: 0.231 GB\n", - "0:00:01.374287\n", - "0:00:01.374803\n", - "memory use: 0.231 GB\n", + "memory use: 1.929 GB\n", + "0:00:00.001169\n", + "memory use: 1.929 GB\n", + "0:00:01.406683\n", + "0:00:01.407889\n", + "memory use: 1.929 GB\n", "\n", "Total number of frames: 20.0\n", "Number of atoms in each frame: 916\n", @@ -914,7 +1169,7 @@ "---level: moleculeLevel\n", "\n", "\n", - "0:00:01.557718\n", + "0:00:01.603452\n", "{'moleculeLevel': {'solventData': nearest assigned shell_num variable value count\n", "0 ACE WAT 1.0 Sor_test2 4.489916 155\n", "1 ACE WAT 1.0 Strans 47.114194 155\n", diff --git a/paper/paper.pdf b/paper/paper.pdf deleted file mode 100644 index f7612ac5063c64c611431c7aaa159f9c1ca0db19..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 181341 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

fQ%#RxXxZ}FG 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

e@$ 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�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 From b4d723be0aec0688d536e670c8fabea2d5f9178c Mon Sep 17 00:00:00 2001 From: DonaldChung-HK Date: Wed, 10 Aug 2022 16:08:34 +0100 Subject: [PATCH 26/26] fixed documentation on need to output both force and coordinate to the same file --- README.md | 8 +++++++- docs/Run_as_script.rst | 2 ++ docs/getting_started.rst | 8 +++++++- scripts/CodeEntropyPoseidon | 2 +- 4 files changed, 17 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index b767327..e146e28 100644 --- a/README.md +++ b/README.md @@ -19,6 +19,11 @@ See [CodeEntropy’s documentation](https://codeentropy.readthedocs.io/en/latest pip install CodeEntropy ``` +### Input +For supported format (AMBER NETCDF and GROMACS TRR) you will need to output the **coordinates** and **forces** to the **same file**. + +See [Format overview — MDAnalysis User Guide documentation](https://userguide.mdanalysis.org/stable/formats/index.html) + ### Command-line tool A quick and easy way to get started is to use the command-line tool which you can run in bash by simply typing `CodeEntropyPoseidon` (Note: this doesn't work on Windows!!!) #### For help @@ -28,7 +33,7 @@ CodeEntropyPoseidon -h #### Arguments | Arguments | Description | Default | type| | ------------- | ------------- |----------- |--------------| -| `-f`, `--top_traj_file` | Path to Structure/topology file (AMBER PRMTOP or GROMACS TPR) followed by Trajectory file(s) | Requires either `--top_traj_file` or `--pickle` | list of `str` | +| `-f`, `--top_traj_file` | Path to Structure/topology file (AMBER PRMTOP or GROMACS TPR) followed by Trajectory file(s) (AMBER NETCDF or GROMACS TRR). You will need to output the **coordinates** and **forces** to the **same file** | Require at least 2 file: a topology and a trajectory file | list of `str` | | `-l`, `--selectString` | Selection string for CodeEntropy such as protein or resid, refer to `MDAnalysis.select_atoms` for more information. | `"all"`: select all atom in trajectory for CodeEntropy analysis for trajectory without solvent | `str` | | `-b`, `--begin` | Start analysing the trajectory from this frame index. | `0`: From begining | `int` | | `-e`, `--end` | Stop analysing the trajectory at this frame index | `-1`: end of trajectory | `int` | @@ -55,6 +60,7 @@ CodeEntropyPoseidon -h | `--soluatom` | Do solution entropy calculation at united atom level (A heavy atom and its covalently bonded H-atoms for an united atom and represent a bead.). | Flag, activate when included | Flag | | `--solContact` | Do solute contact calculation. | Flag, activate when included | Flag | #### Example +You need to clone this repository to download example trajectories. ``` # example 1 DNA CodeEntropyPoseidon -f "Example/data/md_A4_dna.tpr" "Example/data/md_A4_dna_xf.trr" -a "C5'" "C4'" "C3'" -l "all" -t 8 --wm --res --uatom --topog 3 diff --git a/docs/Run_as_script.rst b/docs/Run_as_script.rst index 4ac5ce4..0f6c92a 100644 --- a/docs/Run_as_script.rst +++ b/docs/Run_as_script.rst @@ -2,6 +2,8 @@ Run As Script ================= CodeEntropy can also be run as a script for more advanced operations. +.. _load-custom: + 1. Loading data ------------------- First you should load the data into an MDanalysis universe. For this code, MDanalysis must be able to read dihedral and force directly from the trajectory files diff --git a/docs/getting_started.rst b/docs/getting_started.rst index 2e66af0..40320f3 100644 --- a/docs/getting_started.rst +++ b/docs/getting_started.rst @@ -16,6 +16,12 @@ Run the following at the root directory of this repository pip install CodeEntropy +Input +---------- +For supported format (AMBER NETCDF and GROMACS TRR) you will need to output the **coordinates** and **forces** to the **same file**. + +For unsupported format see :ref:`load-custom` for ideas on how to load custom data into MDanalysis universe and convert to supported format. + Units ------------ The program assumes the following default unit @@ -65,7 +71,7 @@ Arguments - Default - Type * - ``-f``, ``--top_traj_file`` - - Path to Structure/topology file(``AMBER PRMTOP``, ``GROMACS TPR`` or topology file with MDAnalysis readable dihedral information (not officially supported)) followed by Trajectory file(s) (``GROMAC TRR`` or ``AMBER NETCDF``) + - Path to Structure/topology file(``AMBER PRMTOP``, ``GROMACS TPR`` or topology file with MDAnalysis readable dihedral information (not officially supported)) followed by Trajectory file(s) (``GROMAC TRR`` or ``AMBER NETCDF``) You will need to output the **coordinates** and **forces** to the **same file** . - Required - list of ``str`` * - ``-l``, ``--selectString`` diff --git a/scripts/CodeEntropyPoseidon b/scripts/CodeEntropyPoseidon index 2bc2801..ecb75d1 100755 --- a/scripts/CodeEntropyPoseidon +++ b/scripts/CodeEntropyPoseidon @@ -43,7 +43,7 @@ try: dest="filePath", action='store', nargs='+', - help="Path to Structure/topology file (AMBER PRMTOP, GROMACS TPR which contains topology and dihedral information) followed by Trajectory file(s) (AMBER NETCDF or GROMACS TRR). Required.") + help="Path to Structure/topology file (AMBER PRMTOP, GROMACS TPR which contains topology and dihedral information) followed by Trajectory file(s) (AMBER NETCDF or GROMACS TRR) you will need to output the coordinates and forces to the same file. Required.") parser.add_argument('-l', '--selectString', action='store', dest="selectionString",

\n", - " Comm: tcp://127.0.0.1:41335\n", + " Comm: tcp://127.0.0.1:41151\n", " \n", " Total threads: 4\n", @@ -329,7 +336,7 @@ "
\n", - " Dashboard: http://127.0.0.1:46301/status\n", + " Dashboard: http://127.0.0.1:34671/status\n", " \n", " Memory: 1.92 GiB\n", @@ -337,13 +344,13 @@ "
\n", - " Nanny: tcp://127.0.0.1:35259\n", + " Nanny: tcp://127.0.0.1:42665\n", "
\n", - " Local directory: /tmp/dask-worker-space/worker-sl9eby0f\n", + " Local directory: /tmp/dask-worker-space/worker-d179xp5o\n", "

e@$ zQir;`!V%U;sg*Jxf37bBtQxMum*V3QS_Ss$-CEI)y8y&BA&8?;YanUS8StAwd;NKN zL#U-53Q%R}^tQE>O)KDXKormeAlUB+q7IjDGph|#0eOgx-BL|-rq%iq=vJR+EZ$3rYfb?c@2f%rjWQ4-F_4OE~ zQ`fU-wgK>&5VS`d?jrH4W|TcMm0 zP>_x@1e30{>eSgF;Eo_oIN(J%J3tU11$V%du(v{j^z0ph7wCkbmEp5KiE-u4I-D^* z-Ow)ypzB{8_J6Cp-`n&TT0$eRvKQnNVgFX!@&Ju706^?k93Vb15ne8kEW*~#9RiZK zgB(RbT;M>?HWx?@@PE}I4iI+;j0>ay2U1q8fdbAj+wVnwBbI2qF^(J%vqfw|eVqt@ zOb7<}qU{8vuc`r?Gk~^%S$T8H>B^gRburxftPKpu0QuO|=B6ao)ofEKK;-$kc}2MS z`494ni3uwCENl~woe>)?8*=vFYY4&O}D zb-1l>=yOJY-noxrDz$D1e5=^^432g9U}&`oYjj6ew&4H?(oW7O9u(9KQ*QO;IyHmV z8_s}M_&&;F^vmbSue@2u4NPO3L8Gzylm!Z4W&;-o97Zr7FOM7MAJ`fJu>q{)jpf#m z1(dhAJX#Y&70@H&%R_5Zq4jk&(V5%se^GZ`p$&Cca|ZsZ_WEM$>tpbSBM!ph4pJHr z^o)p(G=uDbA&mgG7GNfimCmgeTC2R05+#mK2a*z4nUL+RSAK3PvMy;wO73IH^>5cI z05sCn6koGPR28J0odKAF!u-5KV!RM;sEr7OTM%l)&kYd){u8zmw1Ns+3GxX*As9S2 z*4+s7Q-16!P(D#>D={H4Zc9FEK5jt)0pQ8fl8+mBD=2IQwE_NEtpQzEcO%e``J7UG zYh^#Z+E{dBrl6EH)CK}fbZfOXeO;@HNyiZXw35G?!61dQLqO5Nc683i7d~&SzAmb! z1*|ip_fBq{lUFq_+BnB(Vm-_@IglRQ2IUGtd~9bEoHenOSixe`im}v@6?MLb_Y<#F&Ih-*h(j*p{WZ8 zayR*SxpkqoXv;tulIqe7kK-i7!=m zSxIgN3^icGi4;E%FR$SK1A3s92VlP`An-1L>CMX{D7N1bauf4pP8g71&B1z$Z## zKCG+t`SkK}3jJX&>p@`1f5c=ofFI)V*IWMeSd3hu((lY+Ik*E5{QESxFjBs5aD7FF z|0#PnH~Y)-))Ju4?>xv(|=RP zuZPV8pt}a<`_(%TJ%Ijv^^V5-&lveLMpkUJmH#(bYJj2lXN>&OBhbx<1Z*-BFk=Kg zlY>-&)n0qRG2K+)FYE|({f%|LbG|{h`FWE+d&=P#7W(>>^9jZO%B=GV{BJk$pi$q* zbwJ(xH%H3)#(w@70j!g+nI&jS{MSauZ#OPJ7wGTtMSfU^eBRv89vggu-_Rc`=>1nl z#|r4*ZhZW4YF3<^KTZwCV*R4Q`e$xg8y$b&|yG4RKU`L==j zUo=F}I_mc`Ml>`rOB5nsih6#JRsmMPR-)%3>m3s%AUz0J9{ZXfgt1M()$(^5uRn49 z3$r*P0>pEF)8#MGf68FdALH*A+x<1!EBgC#myiFSvX>87j$a?|`fmCCV#~iKg8?f2 zw(<)sU;l_Z@KHVgKz;&dV)(q-UzE4J+?K!u{5vgfu4SKmQG&j6?p@73`2pcw$$a@@ z+rJ)%SF%rjQ}M-6`it}6-(vC)Ou%1n`4?sJZ#o5I=q&sXreF*J5RjDjccVAxnT_cj3$xp8*?XrPMbfSvPk!zPFbki z&!;TZ?Wa=~>b4>D@ZTRlj!1~(&!+6Z)#gtpt>wQ!+JC3bpG;aSN5s#c!Vo`Q8z6q3 zn#EY}t5M9)-Q@4I?N@@Qf4uW`*?a5OLjUz$1OLQr!?1RP0DON~{EO{wp4vWUvv17w z{mD`B-_&RON_6Xw*kVSR17L7q_RRc#K{YgE#r}aWjuBh2zwe5FwcTG+Y{h;vM|}Nk z`^Bi`-;&%P2$-Vz`{i|(Uz5RqRy$y*)vcc2y_og68TX6w_V-)uz+|TU$$I>g_4s8= zf1P?4<<37bJ`-0{6 zx8eam9)SNs%bWG$uMwvOG6;W5vjP)$;r*vR!NvvK?+?TSRQto>b$R^%(K&uqOJmHp zf1;&V495)%s^7=quebc`$uP!n{N1$lN5gTW{B5T0e{@uRY;(ha_!&+9JGo3hy_^3| zV$o0T=AVq4wK&CRX9fR*1Nksgh;}}HGB?rLFB@#UpP>#Af3uS-T5#P7mza}FKRXFi zV)b}Ttpn&&{?X@XZhV26tyf?vK#^7mdnfb(-RRADD=&2wl%xoNO5#8@N8rfXjob7- z`U>Cwu+BXA{z~gg{;9u?7(ej%hkidmv~^Yf&~F_ve&F#B{eFOG>#F>r-#TLaz~dkK z{Q%L{RUwd&c0=C|0!4wKFl$LhS4L?m0s`O>i2@GXcSJwIEsqfJfp|gazY-EsQfu${ zzwl1r<2w)t>||@>gs`;)nSc*KQ0SYzL0|=_3vhdiuCkmd=o26j-ql(rAbwGh2}lq) z0o4>FAOt)L@reMBg8aavuz(myP*4#4Q{>|p;QUmeJm#$sy1W3dFi=1U4MkX31UO!m z7x*cRt}enWx(ZEL82HJLh9<%fd_%J;LzMFzf*C+{~utr`GSP!@e z2{o@S?PuN=HVmS_I`nZ`dVq^ z#EIpJ<&p_A%2FFLE=u(mc}>lZ^HD6F-7djQmQfv@ZnKZ&k}X-T!5Ka1CCwivsGE?z zQ|9u>q$aAf-@8Bd=tIv(LRl|!*cM`rxAtisorb(&^0T0*70i3??Q;z|@G5oaIdXT* zj{9BO_-Cn08Mjs_R~)tUtF+Oysc=^SoCt!(@aWO z4n;@>w(dQCB^pk0<*fvY`EnvANri`lZzh$Ue1o4z0;EaR0!Vck<4*}x;cHLl2}9~0Dlt6{ z)wdIFscpz;?K)d$vp?I}VT3L*PUl>+ewxhjTJMP{S3R~?!_!bbA-(w~D51E4 zqYUB2Fw^~~^RxLANBW+hc74}|eI9Pv2fN;`WbpicLMJ}#;5G-1fS|>g$||a(#}?j* zc?Ti)nE4cC*9PJpAk&E2i@j{OaNbT;V!$GXS)Ryqi&~~_`2v0J@Ih17D!=-2SSIyZ z>M$kyIaFfRDasv_0Vs};m&wKhGfZXMCIfLy^`>Eg34@gPd@U)Lm>Kb|$7j{F-8Pgj zDD8BGH!<+YDDQj7`J}ahZfoF3iI$(p0rHwS^Fs&CTXu95F2<1bH(JK0j;93eH-2Zd zMS30*!_Orp3Oy^%%*;f7YWiR|K~U0|{UYu|oL53tCi@3k$L94-U+5}+c=>j+>}5_$ zuRn!0?s;2Agf*KO8&gWG?k!JaA3L(c14UJ4_UXBGc_lB)NQEQ_W{D5#(>2^9$Qn+2 zXZTK3PTQHyqq~NNMy6-W>vtVA-Yz24FS7OW@G=Mnk0XhR$@9IJwVmd3SZB9!O)zH7 zsyL7P_{!OA6X2%dzkP+Cm+Kw&-R3AmFA^;rmr|c%!4yroK;`$;Zq|L=S4=Y+%Z`yM z+3iRA_fe0Kj7rgMrSzWWE0319$uH^;H++#J>zYcN=2fkZ|E5`AnOKccRLwntmEf*p ziLXthJoDYjw0yeB1)4|XPdx1|7GjGDGpTPmP01v-{4~Cwz$a)W6>#f3mDD9OM~m7CU?PDXSLFzwnvpA; z#0ZhaI{HW7Xj|ilfG@G*ez=I@w)T{IwV!pidQm0}UK2)7 zJY=GtCTn`Lix2y?*3N}393$lhTkxKR(2DVnxWS%bxv5U!JM%H-@o=6QxO7ES&{~FD zt+h>M9{qB*ptx@vaO?P(;o zJ0qlY2fN3>?c3*#6Qd=B)_T_}L{JGMZw7Mq;tJRNL z4XYBSly33hY+4|FEc?nh`Pr$r_!HZ6?$9Jl9y5>Iu3hVj@)>_|nXXizm;01?Alu&4 zLT657SSRf+j}ELG(zhdJI5s%arxx;3VU<(x^G#uiKS#XNSZVqXm&*!C0KyghpY zt93<(oDQd06VWhG*JUT0w+V@QvD3&b@zzpb8GAFIb(1v^#iM*uH#_O z_?-R}a?!CjB*ebBUMXaG)|NA1QmN`JhEco|`?)UIC2|x$&o2&Y>azt?o-zssQP9Kgy+SPwN+)#k zB4&7e)_*|hMQ@XzjfG~6j#O70uE!23Ry?%T*UGb5G536G zJk7UX>&Lm7)W~Hm7SeXLvGj;zS%G6M`GeZz@g$F3b;)7Ix911&G(8?VoRQDmCfHh& zMkgaL`bc$ZAPSFhde@6=NuEa9*Mb+r@T84<+2KhC`LB##T;OpFJtb28fw6T7_t?G! z5g(b#dv7^oE@st9BxT9ZZ`G%G&*J>z*rLaN7OjDOXHv2*yeB^$O2qxZ^0uIS?z0om z`hpam2x zX6~wNR~|QOJv4pVg6wEOJzw1CWntmc_`Yq{kV*v zfcDWxutz;?NL zeeO@)E0|2#dsscPT2Ti;(sH8KIkV?Ds+y!4I!o zku{kcP;%`-a(kF{&VsW11u|UkmF&zw;yd+hSHE9#>4UN%(TnN#PS4~g!wT=DrgL(? zifQE-3oA^FmQ%Pkw)@Cn%;3uc;=2x+9y^JxBvj(AMRN#Y8G~9!PLRh*9NBMryy>Y~ zfH=2(jh>mrnB&RV@>AFQ`p#HCxW%5kZM)h#*R1HlfiC;OBTu9U5;>ssaB6G|cDAZW z?*q|ckx{YU3r5pPdYtv)=|o$SEi#U5p=|cQTsVq)bE}i<#f{j?TCT|S;QV154{S>M z)R`ionh2);`lsh6G{lfh%hhp;I+_rnLNDhA(+@MMO_Jqkp%H~Tat5feL#$4R@ z=0f|i)FbzriJFzJi7-?t+fWuGa_)9rRF5?_j;)%CRUEk|u(ahETcGmij*7@9PXz=< zo6dm23>eXC!BF7-L(Fe<2pIS-dq7h|dEduD<=nc1MGKhL1Ewo zWC6gI=MxkL{^Juu`w3uKBybxfYUL+b9^#||wYRlHfrJ4s0`PWLK4NNtR}P4ih1mi( zFLLwo1C~B;*Q5bROaKHnTCIilWH9)lvjPRst_d$lcfF^y&cFJmLx6UnKKcWoPY!`s zxGcPvcjw88If|Ywy2n+H?NU)Y$=HOoFGcr&Z2J8`Hwz|Gwh?B$rNs_!t$q4qjJ~sO z0_Q}gt>0OlnB09u>O6y_)3lOfce>w#L!3yDU2ewdV#fCSySDH0?~uyApLTkS^C(Xz zmq^a&xbu_}On9gQEeQA#+~zbDzpkyF4=mfzEM)%w-mnR^j(_pXmx`yH39 zRxn1L9ktaNO6IQ%GU?RGJ3r77*U&zzdD<}*Cj9=sNDqf>TEy-;bK9pvLB;l&)^B*n zuX2!~T3bJyF?$=*)^?_Z^bmJpr|ZCE6S7FCLhdm(&hEU#{2D^tdqrU)&w?K437d}? z4xcB#j5?dyOnsd&Fbl%3QhE6>buy?~DZWbf2>ThCy><}$UA~u+#18qhMqSw{h|7{l z)pvMT81h)I-!wkrQeyDic;7IG94tw>$1?TE?T7pfqOM`v5&1oi04nS{P%9fFsq~z@ z`C;`1(Tl#k$Ir|$rtVemI~>MRdXJgUE~-~+lrCmOAa1spTQMubjG{2pg`t);;zEx| z!42AG=<{hEDtdMK!n_$0E^Owu&*edQ{fPM_59{1ajDHCNE5ZPe61Z3j1YWu19OVw& zMFN%sE-*pM&o^XcWsq9~cZQ-1A^}Me5yT8zKsXM<^L-STCsS z5L@s6eitU21RbLabU|Q4!1u>Aj`pba+>wCPsR9=ef+QqBU|>^%J>V_7gV<$(I0uvi z1lC4aL(vy(f!NpR0KC+51}<*JTnq~U0_194>_TX@8>_JkA>a}hAVPtT6Rd<6Rw5Lb zNW)5mf?o(I0K_KHF@;a@2O)IuU?u1vCV#RqMc+~lSlyN>G0K%z1d4g90FK5o=_aznLB?3@|@SohLwYWRNS#PONp zxApr6ki~C_HG?b3HJjC2(!8dc_WM0ORzu_OZaO)B#?wnDyZ)^T%YuTDyIO%9equm> z?yWNQ7YaCFDX#ZrJ-SWKH{6y$^n?~yv3rwi5g}K=T<> zo$Y(cnY&iv*T@VwwK~#5at&1N^YdThtJNHtkZKSLEqh&1d?;9>Itx`E5x3NwtDA-*o9NvLL7;N%roo ziFnCpr#s`T;s_aoe4U%*sHrI4dl6ZkJQ3#UpjLdB1VTOiI=d*WT%F+Zy&(NbI$yzOy@q-%dT;h5 zd7L%Km9QSxz_lf48cEXeHOOR+Z?84D9?O=oFdFD?ZW9tYAVKCyZPEUabldUUW4C;c ziQJ7j(Dl zy++g6`JDN|mQmBN-0)Mwds@XJLoZ#VN!V3t;=NNe)soS8&+Pq>^V_|cyP!N})~5r0@@~NtW$Ck5f-ZIuT=(V+Y{#`YXy(vY4K;W4h(2Fy7o5(zB(*XTw48FJmXcF zdDpwcB%aAW8f?>n&Z3krjf!Zq%3~*vS^JR?`%`V*zn8vME->7r`N{)TYEdlpY?3l5 z(idBT@9$Aq-nO$5qzGCRxONOhsk%VG@j>v$`S7RsQKrTuPU4>gs~rUq0nL z0Giw~cLy}l=RIAFbNjWkYFv|vs{ez-ud5dq>*EqahhZ2?L?IR-@Ak_4AX|DeQ+XL*GY=A&x&keqsbKSQB?Z zz2mH4RDQxll&43j4bTyr6oYb(O$Ku1Y7QV5p`khu>nm!XC$)TFRR7RQGsB6%Jh1-181gHpR!BT zGuUMrvT{dFQ~Hibc^up1y&q2C%&Vzbl(oBghPS)%K8iSXB~5xXeSrP}5>Y@`Vo|16 zKtP|^6Z>|N&C6S->9-AcojaWv;U2f> zzSZm$cht=bG}B#fd&%|R8=B`oTe_m3bLqaoWf{9=x+mf=63_0wcUgIcCS#R(tjo7e z#GNPv9`A}ZHZ8+H-)`!bW;Y1OgO?*~G|UdZ^+s99yDRKS?Jx=$B5*c-n$&pq4hyY# z_v^jy?qrvqkL!Bi*6HxdOVv90ibTG{X;`$iiN_IRo+l~hm#+7neO}1>rlcDux$3sKykd~s- zs^jr-SJc=14j{JAEdWgCfX5;FH~kKv)>r)w(Xaa*XwzVWu_n5%bKhEs5ER7NN1rW3 zcwLZ%C!_t2C5j&Tly@?GVKR3@!VX>Po)XD3h&1N%JFSQ}s^Je1NbbvwH6SU(2 zuYK#rDs7hbLUvGcYYlgDR^w2q6Mo1*0ZVv|?%O2n7C6?{Q#xbgL#LaH{4QyoMi_Ip zKQ}_&n6=-@TaXz?|B}5WsB$q#%XMEVV3b-Gxt?LvDl>m4uym z^KiO`!f+rn=-NR%O-e$V;zQXZb?vsrdtbKV^Xk$Kz4K5wdLuAj()YAHbq$j9g@s}M zV*68~#>TPx)!<_Y2Hr89+{bi{rJMNk5?GL2{Q)dOuKieh1-J=ouU3~g*S?6Z2eYy&x%P<`1S$AFghVfZGeiK{&jh`3okgRf%QG$69l}cPZdA^)bJI4s%cZ|93={O^z6 zx3#H{7xSv`!u7$D!OGZ*i(rc)(NbUXe38}mmeYG*I!(Ohox}TQ*s-#io}}xaHpw&8 zwT#2UIZ;~d({T++lSAJffxENz7JN$VZFGzG{hUELAMXKzg#sE|=NFY80uK_KRKV%P z`#nets5O)1ncT#mK3uEEE7}8L2@}Ek{lH(>SPc7+C zPnw0e`h0N2A6+m#PzjER?q|}$dd4SIMj;D(XAfdHDg#@bq{A|(nNgR(oggpirS^4Y zyv$|6Hf%{H>}f$Yy|v7OieMm|uv))QI45$j4~aPQuyOYg9)S+|)o4pS9{rApeG#FL z93M%BWJ+X8Bo$>8U0b-mQ1OAEmiFPBb_avXLv5O)#M3*E$4ge3S!U&!yR)C`*SqK6 z@H%=bKk>GlH=!7ft7=#HvE{S#`fr zoMXhjJxVpIJt~gd)r9`mXzpmvXtt-tT-lohp)MNxmJH#eAZSk@x_&JSJ-4r?$my@_)57#`^;sA6S4~rXH8z6W2x1Qzj&AZ zm{srViq2gO8eNgI2YYV^gPG|yBqC<@dmH=>ND90g4gI~f{ZdL*-(J`fK7VamYwR-3 z<%=G6kCTE9SDmFJGmz=F=iQojm)iLbwet*U?#x{~_y-&>Lu@_Q-TTsYTt^~~Ms!9x zs_h>hSM7)Ex<0UM!xE0CxFwbm>u6!pCOl2mS!ZUQb?ccs{>0-3neK$T1W%&j@zAj6 zuM8ealFrC?fobgac35z0(x!zr5@>Yi9eJE5?0DOyWcvDzLS6NHQ2&0)$C6QaI*ZLtgzuP&r9TpPg z#v%psw)V95lwWu>d$d|n-|blHoVYa|@h72k4sNRVhENpR}~gihIxU8ahxkKZTR zd~XC6+v1-4J9G9wI?FRe_3l;R1fJ_OgSSEtEpbCwgH%weXTgVN_1bJ^AML}JH5La4 zw8taHBo0QDQlZo5xPakvNQ(la{;?_e?pI!eKFM2(^)H2!?%4WvHwV)M#KL@E@uT;TLLae0 zPv_{nKX{?p{@VFDYU1l@HZ>R0qgIBuoJV=*Q_|_%Wv5A| zwWnF;XPh{-?&$GFOuz8E-Ay<5XXz_COt>;qY!<5(t+l+kB<0sm?(0mv-=(j zcz$DBlz97b&Ag`zQ7;XvCTwHUa0=e^zuo$7a;nM86yu zLc@nYW?OR-WxelQBUWARdCErC;&_8eVWS!sb zpzUQZHL9z+t;o;#N_gxDfe6?7#PSkSJ`i;yGkCDeXxr`w2vLTacJ&u(cX3)vJ?_#8 zmpk6VH7HM>+&b!4^+L=o-g|pP+59BW9-o;P>TaaP554*if8gT6H5VoEvxw|afA4?b zF1g=J%dQixGR(QMT!(QD%au;~679r$CIdH0|B#Mt;X4As>e?!NSBL1JKL{K4aB&Ex z;(OBxuWS1ar`^ouH;FYr9PAs9*l`(@FTsoC9u3a zjY6r6>A+U)a+upTf|ndrgbn2iv$PszkCMpEd=YM%MEd0x1Vz~4FP(+7#z=_UNGK+S zpFU9L#al}1c#3_1DCog<1{n%Z{P&X_f@Ow{Te&B>x%?OsDT@6klCUlXsC9MUblP$z zP?DEoy0m@Lwd?LL4h8#?YLwIAly5R8D#y_bf)CE(jLS!Vst>GmfwN zov9|NAl{icz$gxuI6_Oj#-4VJKsEl>h}=js!NOeG1?ptBKib5@494ZdkC zmN-pwSR`S(7;bawPQ0er=jKG@Egr2vXDRw60g?FSA@r5RfjCYv$maM+BG=f<9UBI} z6+zNC>l>Xkkn0V{9|5v@G+sq_@}4~c56PGnB2#4tb57jaq6^beH&#bEtkcprCLT!b zS!;Y%`HdGSFIpNx#WVCyRMfeQ2aMq{h{6LisZOYw6;G2AM+L@Ca1{!9iE9#gErB%3 zPZabLyc{v(#kQ0ChdfVE-iaOJ>v^7s%TBznoZev_<-s$8H$-WIAy?-Q_b=dYwr@nd z0-}?#H&Py`V+uM0!^bGbRW-8iitfP2p{hUOJT;f9ymDRyA4MKj9%UYN9_8G#AL)Hj ze+j7JLmPCBCf{~z6=Ail)G^g5VT%k0|`=tGXt?rVK}Z{uNxEV?-}?SW+UR`@mJg_lY)f`uuP~?bb}9 z$w0nb?eXC&a00}U!q#E21Q4~7e}a&44x*T^67m!MYo^PjZUWjN0*Sb|3L#2sTwVc1 zKqA2~hC~`-Q2`}}L{VI!(F|<@wlVpu5W$V6ah!sPZ~nW=aN^J~vT^BF6$rUfY8412 zfkZ$JpSe=n0dJ!5jbnN9JjL;W>afQX<7?RIUi%W`iTp~HmDi``zHN6PStHIzKAupr zp95|Tjn~L`$g;Zuk6+4Lr`;qZn-E;mmgdHiE`Os{I)Xz=>37vs6` z?pp>A$@m$9imac1{d}46)s`R< z@ji2U0=q84FD|Qn9yh*T^qT+1=|E&@0KMeU5J_z;xoFT3T3>^5!qAXb(M9nr=o0Ep zd}nd@^*Pcz`uQ5INzk_s*MzhB$tSSB_Vh$`zRTPF({og_8!hf2hU(J!3Htpu{|Pzx z*+c;QKF^7b3%uv2W0y?raT_DnYH2md@;(VY?)iMx+Ncu=7nIhZ)nS&}E%19^Y9esl;_VXgMMjgHAc^9`w{IBD15_==)`&R8H z@JiEIwGpp#hfto++m9ntLH&*cJZP3U&npF2*pZ1XoKh6z4<_s4GB;RDgj7c+Dkm8YZv3K$H7cwnf@HQcTfOX|D@$v}!hWhb z*&TehrCf|=Hu5pn370u(QBhCNQ*2eKIBb=4PO`hZ^Xuj9tS*&Pg{GuxK|Ci<*U|r} zZt$Cesl5)l)d7b-EsH1zJ4DcuwK{X|iSL9#GmS?m5*{I?Rg#ivr)aF?(5Db3aWOxP zp7*mcBzYM_(e$QWFMeZ-u1_MIF$zZlgi-Hs%-5-H5Mk>_r^ad`h--Ai}vxgZPnMwp`9I_Hq-Y02#%%6<)=|qu`Z&oBi_)4h0mp}b( zG;B`SO-VMoR4YqvFS~t#p&-Uk9~5n-tnX$?S5#B5KsN|PaiRuGb#e^5t7C_bBzci# z(8l{#i(jP3bT0ncRQ z>yxEQ$-lC47*Z|b(LDE@oPLSpEzIL4Ce|ez=i+8lcVqWZ)bY$|0^O7*lQ)AT>8Q)o zCWkK^vlM*Zs^J$$#gcLCq3>@>@$Vw?z$O=`ztW9t*Oqoh1a1HhT$a;(CPd17sAy0tX0Hr`iT)vk>)f$rHF<91iu_#AFp-rk<<23NDZ zQaUgvKg2?CcbbSWi-(C3IBPM+n`$|AsF8IGe0S2lY!)t&e_orC_( zW%Fl=3pa_nY?m5#q`q8vW^WRUX|%M_G%meCAW(1<>=BI;u9C?QgHyHsRuU}b-X3^kBQ zR8yJoEOXf?+}J$ROehrYR;a1kDTyyARfQIPghV+m19kN%%i;7vN*g8t7-%y>s06VH zKX$OCwB^XNy5E)gqM;jeCV9*3B%OIW0_rh=J5T!d#7U_Cf$cbk7Qw<{1Qu85<+ z%S%rg;O0R}=!#~E)pexQS~~<+KnQYmdbX*A8=0O6F?H7bE~0!Kx4*+jq9|wU&KDqv%r(a$RV}a}vO_{!NzY8%7-0&k z>^HQGbZyr|zZ8PA)fgdd^C>_hd$e&>4$sSL9kfBp4pS#qHv1_CKUPH^)kUq0wJByT zOM-yjV(N@R9r5*)ABwQ-f}z5?I-5f?G16W;9v2RQa??2fNFcwfKsUE zk@*VM6hF!MDF*(+2J}J!C>DT%Ii!j!P#;J8Ig{uSQ7&^wlJ6F4X9Xn>kCpb3K{&poHnthL%#tq zGGh{Y4xetglT@HF82OhZtQNX7shYyAyKKk7ACC$dFyxy@*`QA8CifyViK`s>v~ z9mhg_d9*Dks2AX4S;@|wz8P)l7Y!mGbH$=>dB3DC%a+}^ehCo@G@XEx$w`l&^oZu|Vt8DNvuj_LGY4LcA^BDh0E8299 z@xgTxuf~xP2!e#(Pbv2mLIHngUlt%KKe zMShnSSdYvhUk*EymTHEA+HuWU6(pN0c&EZRxBrNAY8MN}U9FAMZn9oJN3)7&DkdB= z7GwMbw%7msC^w6O5mEUqW9B;6TG8^>NlQ)5Obz1xJm3V;0J1&^5eu?jnuPyq%=Tit zGTX)u$361={Gzb)C215X=1mgv{q)-nnpVEpZz3Aj{t$(5N%R7gcqRptw|3Co$s4)0 zC7OZW>ya$OjjPq3`}eHzySJp#ySFSF-|7J217F6;cY!XTug&6Sx-+|Man}!8Y+1kt zPl4*))a_pQ34x{4=aZ)bHMN1u!jPV2VdlZju;7u=dCoYLDjA+@wv<`J+CK^JOHf!* zclOa%+`K>g7-ai|mlIfK{pQa1XtYeVd^|hC&|Ih_*dAaTgRv_brM`i^2C-AmsME@6bIhw$H>$05qD*inKOxg&}RT(Md}5 z!q@|L#M2PMr8xmqJ%fatI3FDkO3--!E=}3kb4P#?Z_Q zF~FRagQXy|fDJDl70K0<@PgbYuZB-V9N2+l!v%#^vfX+_54YdB3&Z2Xcc1)5a4EQD zK-3NN>aARjph+tznTqk_`^_j!E>yNuZU%WSR4xjZh1i3tii!zoG?a8~G_|d^z1!}D zYGtXn&2S{yo)Yg8Dh^_5H6@b(PDfRfyZ0IzQl-5P^7BK0>RJ|BYsXhI>*BdAZ=Kgg zOP{c zi@h+%-fxfVmst`kS}LnIek&UrmsL`eH`ypRBkb?zdBN4yK4>%Xva(`xvjeeWaLk9; zt&FjuAk2OJ7IJ%F1~m1W|9pRpg^7)Sf+Czpyq>bn*gYwt9~+CxBj|5{S+@KooNRO} zFWmb}gX=pZldYiW(N$u4r1zHo4hft)Br-eBsI>qC5To#~g@|wP7xC#n_>fG%Jc?Fm z{R$F$IGkGGgCR}f=WnJ7*(@&|EBG>c@S&aJH9+2#df+JPusAf>I5bk2d`7qKXRt)1 ztWZKTnc12vz|o>T*7_=jwBj-25(@(Mtg!^h7#7QprfOqkM!zecK+EROj1pbX?P1T+ zCGnbVRx3R@Xc%7%V4wQTcDnHL+OK^j7hY(YuyHZJ;Gm!O$hW?UycOqm+smIK6U~Hb z-hgo2k7WBk?(_P-9Y!##>b4i19!33Zy1pm+X%uRShxuZ-pqUPL>bczmzrN@SvEVz* zoG9IY8<4}wh6kBrvI5C`102f*!~6qXhGBsQnZis?jvy`fi|is!$kre%9Aq>E^cl`H zr`0#+UQw%X0pU2qbY_HmP}pPQp&LclAmuaf$7@<0FUKdEE6huPrGKgAw%p;BWdXYK zTx-24YkB^X0Y}Iw56|N@D#or|sZN{z3J0dI`RyQNBO*0MA^ukG%P^xF+9BTsmidL{ zyc4xa=XR`Jy0pzAh&vLNK!G_|oQLY-1{tkQS!SpGGEuAA?z1EfxkujCFG?I+$n~Wd z7e#yTvc+UVx-=q`m1MJI?~=mhjzD_EQif{8vdy9<>O#q$FdWF*s%ExQU{``*&o4Ng zkE^VWG%W^G!1uh-&AlohrR6A;X-a!2-@Y?^HZs6gc1oWz!;TX9|D6wz#gy&kY&2P+XTrq z=N&}wNjhArEP2J(#2cDS#x!m?T90k(Jh;PXowYkU3}?bi%Z#Pwa(T4}DW=lPn_s=z zlSGZE`V#G>%co2+vh?92CXJ$q?{=)>WG-Tkkc7OeLlIDV#)HN07{j%Y?)CT;+6J6| z%`Y^n>dEmL=%3f(tsgwmFu!83Y#xXh`-Ge?Jt9m2gIU135?j-6eZ_s<;z?Krf5B&W z)uZjM=G%4~=#HNEm;W)8x3sXZFtIT4gD&VcO!_A|i@c_nV_;jGE&o95<8#8=^ZoT} zCrP}d7Nr>>_wO#gH*G@U+5S(p0ixKS=TtkmUpyabDR&(wk}5 z?aA6%+$--RBObD@Bsh1Kr7JI5;Iba_UR$(OUzn2-9fmCn-Ctj0w90ki0iw?_RMqiZ zyslSH+tH|H@xtvkUgvD&%);UEjq?+ScV>r-ZgJJjg0J%&=6S}Way8;sq%STEYq$5- zDRnAR(_(oMuzth?+F5z>qwi;Qy3e{+7<57SZp(ovVgWs*qdBZ$bow$+2(6H1lj+ec z`nm_Al+sOTi-*mmC-Ck!Hb`*a>~AEI;3B1!Yoyp9k}T)G!$(bmjO1V(ZDRijP?^-j zSL(v|DjM?DObd`>H=q{Cp!m_H5^F{M&EiBo_*8z;qOUn>(WdK8?JUy!hR18ek60w@I%PuG{zIirGQ!VMM|>H&_Z+wGY2qT4GJDP*GK{8@X3 ztwrxfxOi;_(_ny_Q7n2ZgpS9s0 zwj<*v(LQTgwzPi8FU__F;rO#r!lGQ~=`1X7n>UK37#nH6BAF3YOcsf|zZ~#m-%JjpVF%88Nxa4FS?$uO%11{#^DoEOEjbz#s9|V^v1HwD5J0 z$X0v%#|zu|iqACpZN-pI5Acz(6NcB~SZKLGTEzDjP54z)Xjzu62~Dv3qcI)NAK62P zgon&7wBArnpY?xAR1|A(8&`~zqc$(m>{i^{af@CV=ry?YwJr;u;(Ed)trZTfJt}B| z!QU2jaGrV)t}eBoSPV|@Tu#p0=*(_)sT0=EP3B7<75Z2hJ5kXU-i({fUD1%c4lky{ zwwiGLjDT3eEUbVjQx?xECCR=e_3dfd(I-=|N_fnhp;?=va?mX+QMRRSBFZ@o{0Rt; zM?~`Hx1<>kuO8|Lw*}vG$Qopt#N1F%Z=;GG$%y|Hk9Hk)rLZhYyNU@GVCO(!oHiFdbJ}+EM3w5`HITH)28UINr(#&p?c$Y$Yy=B&$PI#TqpAU16RDJpjmtQm9 zdWwSo1yW3Ml)5*qNU2hdrbI?)5q@C6@SM#HHOt|C8clXHD zd{`MW!_K|fYD!hZo$!y-uMFlehDB7A;FLZtYhyhc8%5mBKV*V%sN}o&ftVaB({*gV zeGQ36@kTA+v)1lYe!(bMBT@m3Fq_Sw0y+B^%Hp&dOg8~u#W4hZqOR-*+u#)(V_rl?}#BZYTR(wUIv14AmsO2LI!g-ilvF6!}-0%i$2 zjgA#zq_o{OHWq6wNNH%>HdKvX`J7dy+2m#j8hZxpG#*7$WSH9 z3=j06sIJejpvfq^GF;CT_~Ta zFIo4UC9Kw`ZscfLDeg6crTXo; zGbl~8z0j%(tU6j%sGDLksHWb!$BVB@=Q=K=tXBl%gksbW3ieP?-!G^tWX{=5Fee_+ z%izv62`pru3*Cwq*}hS7yl@GtK~TAy^WhUY@e;2^%dTAx^DwFE^V%?qQ$Gs6# zmuFe(Z6t1hV(yFuZMvstCV_LjR^MdubEbT;&|I9NKJEFF{7a{cKpICC=4_^5=Cr59 zs4J1Std6iwbG2z|o1>O98ayM#GVeJ5f^*C9wou!WwC6XQcI~S=RD@L(bbW!j22O*!Hui1S)S1e9I2bkk5=^V<*`{#4!raQobqQp zORdC~G0x%j5wPzwYSyvpGwrIbBI%rQ8GD-ghP)O$o1XEc*V;vjTV_RCX^&?Wo~xI> zM2eYOrR*k=b!pG~){TrtvFeTQwwa{$oi|K}I=7wd(iZO%GVyC{nHy~^=F7OBph|LWodgaiL&m;2v&mDTvwg_Oi8KYqjIAAJ9R zZ&U`PBN+gY6?!@VDuor0mHbyY@?-07*+^Cf_P=E#KaTki9%Vq=zmkyv-}66{k<0+- z%RiHm4ETQxe}6ZC0^lqEdP)DC1CWV@?Oz7Kza=A`ZRkJ4;Ui%8D8>d>)hjcV0ur$IBM@c>z3v6mEtmuuNQ- zkemnQMk9u=%y^h`uZ-V5(TlW_Jy|fV3(6J?E2~J{!Lu|gyf8qZ*PfACZ&1y-hR@{A z0JnjkAM@_!LixCLrZ^rC$=EEkqLadTK}*oBSqnU*ppQN_TnL&7~D*C#6Bglwe>+>cf*10@cRXTJz0TFT7?o*!+7a-?`W0h`$ZqX zo}77j6U~dY4sY%Gc|V9DZeQuw5RIkjl@=?X;DQ5*mD1gUXS?q{UgaNqvdBN|$&B9< zt+RHW>T6YH_`-a*V9KJ&gwp9c`Y+M9@aiw26I}@U_i9(I8qgr`d9mj4Jv=K^__Z_%4!#`r~`v6VS1OlCDjxoVPYUN)}6#N%#?#Q&OIX z9~4F@+5uxkZ1p`%djcb|()t=hyG~7Hbw2rk`O{%@S8MHc{eTx;zfCo-o)6h7t^}yA zY4u!1*;ONN+xEovfwAZt(Ay(o_RPoh1J{@BfxL{Qu}){)ZV+tNHhQ1hAF<+WjZl$PVZL zU_t*2s|3hj12U0-DE0^R>7(kS{4c0ai~t+)pHBZL_K5*7m5+!v6B~f#1UM}|a8Lk) z^hb|u01DIx1L_~ZsJ{mLE04+ew}Ajhd`yiI(8EUoWHdh<&L4wl;{%eJfb8W*>pzoc z|6^Ka0x+Wf#)|rA`HxxuH3mK1pCtjT5aWNtkNWU!GXeIq0~UhiFXj~ehw=NP4qz4k z8()f^;SU`P;O71_4xlX?AP@2p2mP22^T+f6MH>L!`m>UN)dM6~0c#1^_h;JwvRD7# zMn#z!ng5nY|5sErQ5{?jdEs}Kb84zGLaZ}_tCNXvycwdoh%kt7DHRm-VrAl*XFWkq z&MzPp5ER12YJ3CMF7jzDP$fPB{2cNry|CuyDO(osv)2j#=KH;*_s4hdB=w?<>-K%h z^ZP9A&$)%d5FkLnp01pl@C&r4)OQz9G4#x-XJ=?%(2h_ln)e4~w_p>0Q}Oz3kU_b* zpie-$r=mV7X}Za4maSv2rtgSpM>Es#m}*?5Ll1M;2&? zPJj;+8rF-Ir<+59PJm90ey=;4hLM`$WsHT;Ou#{oPp4vHV!*I1Ic6U{+Al_We+3yP z777U&=N|MtydzT6C&G{%3gX2q#==afwRehkfO13|agj`YsYwtKaTyUE3o0bqE8H)| z7)K2W6CO(v+)qei03Htbu+|bYUTI^yh6;gGj*;+;IB&$n>*~qZ*?pLNZNHGa%PcJot2mOj>(}1bXAj}9SCbaG95mfKly)RLA)4*LM|!?_Zn?EZb5HJ z8gS?fp(7OqV$cVq2#=DEhOq~N(kG{gj*^v!fd<0rO9JdYfxw$$RKz=hj6Xxwq?*1! zbw}BeafOofDi~n=^j8xvC!9yf3PjtKe)!T6h_@*Vg2*pKhaeD$5G#a?Al-|2+3R5d z{4;h@h!{~51PSChh|T3;SBT9#?}u;`;;#RSez!hP4=yx&ZlPUswOnYORQ+`QHzwkR zIJ8041XgaphT_Jl#~bw)^#T$HRBO~sgjG~$xJL9W?w7rb&d5c!JoBBVSU4g^kvlWr zJe<;Y^=I0AY>`tO3hRBlo?sj@Y#b~f(BwQp?l zFJ4v~ixNY2kd%<$6maV8<+EWaK8> zIxTY7l2y3U#FaC4m$h@GbKJ{w%JlQTc>VnNdu#l40S+zzZ%YmWd1zRe3rN=+E?+;ud_DZ zUr`^CGAdu>P}kW=!|LBFpqNQiFgAH=ur6nd7n5A>AYv!c-?qq}wa)wgi~6lYVdlJI zt<$b;iOJM{!C9WaPQi0WPO6ztdhZct_Z>IEh zJj$+XP+Es|+@VF#wT`Z^)6i>B63~#v@{_bSzo`^26V-p~&r-q#kcW8Z!vEVw--m6DA20 z%K77x_&{{;k7P9E|Ijqx?tw+1N`oWYK$74(dDTpA&Vcj%G;q>JAqcvRc+;X$v8?ae zs@6Xs5DDUh!jGfZEfOmPOkG1I{ z-3&F)?C0i`;QnxFN(+lD6KaT5hStRWEHtKP&`Z2!Tpjo(Rnql`n|*?0KM+?X}v z47KeLwOauFyHk4l%&OS|(s~9qydlrpXq;0jz_Fb_g?@!tn183La*Z?Rzrg)cfSc>V zaU-sWVW0si2n>NV!(==iilFKQV83> zmqE%fU$JH07SN$#6V*}JSD~8hesXVGq#-SW$aMBBtCKi?+NwN8UF<8n~jO}COsB6Ga(_h7oT@9zy{?g z7+J5Rt!LhAegv5N5@(g5P40Xa>FK#D4*>N$CvK%${xh@j=_vqwffCnQOOwXbQLb#~y3aBbXNBU)$C}-@?9OijStZ1_H^EgG zl>Huj!AD419P{ZE4BK;)N2x>(fsU_9 zOU0^b#vxFn=<8EO8xKsGFmYr7-s-aB%SBk^nCVikGPg=sh6leX^n;$Hq<$ty|LBW( zc+C3V4?EPhO*w9lHCdKvH0WX4S%&qsE0N!WK!@awG)~QSlo`->_^Y(s7iUI#JFVG# zvfE!_ygR}hrM~Bzo6T8ww98YWLL?&(W*rGmlg>}UgLH>_0p{laXIEBZ!iXT`BXj5}hxK_(V= z9(QMR+!$yNddUy&os!DZK>GIhIV8Wy&bIK}#eBBo!rx8h#lzifI*q*KR<<$+IN!JQ z8JCSo^>Ac7r=eU~`*_i_wIiVLWd&JjXQqDCnm4QRZKvG_0n_))Q~iQuXO_?I~`JGO(4o1=c&VymWRqr-bETEyxs)_VIuDvhDjslX=xp9p7`H72}&K03=F$tF#cJwq1fLW%fhHE zTnB}T+0Gyop9iqG3g~vSDfu!yuY^V_iMDGQhCTyL=&+zW@tbm%Pqz)El`WVF_}I?C znuGJL#!hOwzud;>kKFB_k7`;5bxECYx{@pg9z^I&} zGU&SABe^v}o32>24fp!g5i%h!*41>$GvpDxCIXu=gR9WYifG!yyZCLVg0lPpI4zaS zHj4xax$R!*6Ix4TB#$PpZ-}2g9TXeHzDa}lUb&WDGsl*gI~SHKLG4TUjm3OnT-nJ` z4+#ltY9pvw_plWWrE+Q<#hm;=Kl8=;G3Z=-n`V_9H`WvqJsfV0!@Jn5sJd@8l-s^BW75DOK-#b zi$RLM<~>iL>Mz1Zfy%b1vP}|c(YiJ{TZ0`nIht3# zt7wU3k0I;=;V${A!6YJ0JPCz%eWQ#)$lAhGM)=%HDDV3jGoVbFx?c(q)ULGP;Hld< zo9iNzZ9aM5LP1uzVeL*|t3u{IJeK2Ep+==mL3HOhp-=UMxpiBNMoXwhQ78G1S5) zIVoK0$M@XD!v#8AdD50~;t}a3p=e=3(IaWFir^}wKd-%ct0}C;#L-->y=aZcW-J?f%HgJy( z`H8u#cW!97L{k(kea}hqD>SGm5Jp50*%AJI)k7(7cSOXLaeZoElCdAzQ$`9H&CJ-6 z>_FhZLAC6C%mN_l*0?b|L<7G5lcV!BMZ?6~lzjQsgZalyr z7hRfL2R&!x*>cgF8L!^Xn_Wd9tCBdjS@n4=AY`k{;C@J<(yl4^1tz&xRV01Owc$J! z(b{%rp`g7r^RRLgXEwDN)z_7!P)s62x>nRYR=YHYx)Zk_gLKZIcX4Hk9vm-`;f3Z? zf|S70vt>eX)1xMy_`Vd0J>N*>aG!k_mUN;U@2TxkES&0Fl&akuSapt6T8C_~L)ja#Vz*qrXa@Pbp=Bf?WDvqf6P)b>dOi`_n%Q1-4yKZ9( z#O)yTA;n(CK<`Z%#Y2n(jNsBt+r$B#+ z6qv5l3Ettl&eC5n5fiv_F6OIxGVsshyCkjZD?455mQPzfq zz@!B{9%w-_fwhy18>_IJUHn>IwvTN&3LI|&5-bhcmO`WC`OiiR#xB&&Ib8WtGZP1R zTJD-!^N4@H(`oKx<20$1PKgTkDUZbsEC7shl2QP;H4~=@(@3qRB7KRu?yc;)k;=QPu=n7 zXK-oO=v_R+clCm6jrLB-8_sB9tL4I)XV*gRy(q=~rH4h&pZiI1(qvfUB`N6(JsH|< zC^TVO8YaQhG}1fMQo!<7H)LhZMtu8^>AKAR^6KX+Fg@v? zk8a)c(axkLFV}?L>}?5i#uMu5vv?kzH={;$(ZVaWTa_P`pz8WKjlPk?m!;BMt@Uf0 zFC8vnG;2B_39sYPnEQ6!tX4Oq?VeTI?d~nbZaEc1IEkA^*-2Jz73R{V!J+tw^ud3Mb}K=IU<@4y2&RU^_-+w{UAH z+-*QJF6-FY!ly8tPrG5XerNB!8yHCj*Sy_|SWt7M=vlD4kwEdl-9OFP z0&dG$_s-ej4r(jr(SXIWV}&EwmlF%$!$;lwzK2-^%|9{;Ruj?9t@SyZ2vmhyXRu5} z{W>ogFFA*d=KX+=YBY^;-l#vk`u%JSG#TePsT&4DD<|= z$k1sY$zflln!HNZ{k|ldId-CJPKAtIcg&Zo?4x!5Y}mpPDyWWN)*aBBbfBi(G_&GK z{hOp4Tm^vzWv`sQbmB7Av?}hkjf}JJPA3mjW%1UxE^ICS@{6Kr?v7n7%VYZz)ULlX zYV&In7tpqw?Qha!m9r~ z(aD|eahW%l3d=4rbo2Qx$ob?xG)ZH?QWevPrv@=)u=?Z(9)p5XNP<>lu;i_=(#%T3 z%$cB`Q#}wot|!Q3fDdc9iiFqBn3PK0_)(q{;Q%CrA{9t{ z0{!Tj48z}O(akQgU<|(q*;_b#_RJoaiC9D90r|D#DtNQL{~7|_`T9)Aln;+)nPhj) z8xySf`V<$F4$6Zwt<09}YWCZ#MQEnR=GMJbNt2OvNeh@WXs~^QiIQPV*&gKp{<2*GS2e*65KJ1n=-WJ*iTd3CSOR9>ynyWwGteACE zYdn7rQO0M}1a%m{a+;UM6uK8Qag=w?@b>hX@GMvMoZ~Hz)*-;NKDn_QOAoGAXfI`2 z-Mu5FM%9qX?`1#crZ<$2az^N|@89X^hpRigz%A?XQ7ml~JC?53)_ew@Bwg`QzNAigAI7|wW2%R@&k{0}Wt5FGJNufHwS}HaFNPm)=AZIuQ(8Qb zwGTwdcAO7-MUqc)1vm`iCvxCX9K>87mKY%tN00#N6c)qb+7}@dv3j6b3ql1E6fq3) z%?mp4*l~hTCq#Zzp!4~n7=*%5Y5oiRunhwKWJI^`LIr81@fL(P9O~aDEyY1Zfrb^_ z#FFpERjhkOCw=ydf)~9{%-v3ZyVdrauK=F+TM{aW~c1=`g5pr@R)zOrcpu zCvpA=fn?-5^3lM&MYwGW4q5RT09`WyI%WU}hphA;G8;gy z1b7`j>i?l80=P$P0DTUy`H!*x>iRE15ir2V=KrkvBf|k^#{`h#KFU8d#Xoar{};pc zFFg@JU;U8Pm;szy#y?8|a9;d#=JbH6{Nq*pr7N-mY8U}+0s0@naRHDg=>Wfv^JgjO z0Wj(hTeTP{%ikVDA_+tLeKuOJgk7nzx|dC``C4Icg zj6ZMN&$!PJ5=co$LJZqEoy?J&_(J{q^hsrYZBISXkkr7ev_mkJ6sq#_B)xdR1ddJbz1i6bL$ zWjiaaQVPK`Nx4nmOj3EI#L_U8LK0C+CkpR!k$O5}a<$!j>G`sx-ij&WVhbh3;!>p& z%qR+#Dp`AHr`h5@HZy1XXv@nCrGZ}7cm*732Ssn7mw;lL%Ug{Nyt-ff*(ItKb4N;3 znBGcS2Bkf|DG&RFohr%5i3bQ3+7*{k^Tfy7H|ij3YLV0E22__c^g-2RMTpUXjP&sz z0^tgTYj?l}aT|oK!RJjuDq>Uw3j_L1(FY{I4>=G)D)39L5ITZPIk5_Ye6Iyznwn%U zqP-AdtWd!h4guK$ghL_JDdIl3u4Nd5;34L{KxlaycTqyIvvlDUn zSAqMBi~zMWa8Nu_P6EF$a%3Q{7^S^q<>w|!y>-H7FW|iAg1j==jQng*7a4_+Dp|;V z7x#GOdbE2T{VEla(noU4u?az=f-;7!K+X5!S7B!AjNox_lz5s0gXv~?=Sz1CtHn}5 z)8G2;_UyLCH(z*JAl#B?-yuwR1&(6!&(IHjOxP2(@prs?kCTIKqV%Vfgn*#O>EO%t zL8_B25d$b5fG@*1YZmQiND08`?@8OOz(+{sc&WZ=lLJ$Wj1NKz=Rw#BjeohQT2Aid z>6!3z=%*iD_BA&9!>*xEptmHEaS`-6>(HUob z$({WKudU^Y5|6;N&J9gSAOSOWE;2{T)r2T8myQ}cIfO4X zOa@`kw!oH{2jx};|CZBftciF%J*(0iXkElN>BoHU8(L4Y+Qv_(3J?hVAOQcC8Ct>SfmlMC}B2REkMBd%*CsRc_rjzK&m(N=N@=T&yN`V|JuKxr>*L%Cv`n9)DAsncg=O}5=5SPQh6%6}?r>?-+^{w1z6RBS84nlU8n^FSxS=|@l1jf#m+6me z#C+@8CX+tt&|3JQ4O2s3x+({&ja2963dE^@rp5$C&${N_Picc~`}kmi)R_@Xzn3b& ze+EWFNc-=P#*BK=~EecTwG*VGked@@EYrg75u*={|9Yv9hXJ-?SD&mcS%ZjBi+&s(%mWDjYy}` z-Hjk6B8`AZcPd@dozGlw-?w*t&+nY`yv`rjIJ0N(HEU+}-g3RK&sv*0c7*8lf~3r6 z)XA*1@-F2YRIZ@SRMLQ+G-VcydE8F15f}I()arY#6<#O^sj!* zhQm&dINh-?RMtu6UCJ&LQdB56OEz;QsMw^o@(Gx~Ro}WCK*5zqO9LM`wq9r>pUQpv ziM)>0L7 z!z&ItvKW_F;T-Y}I|97N-!4s1_DHXY%?iwO=XB1EIRXtD+izvno-kabqQgNHdlTU{ z$c16fghG&aL0fHAMrI8kn3B@Ou@HKno0AC(xZEC8Wa>lin;@%=sXG7>7sZ3jJaDoj zCNV{t!eHun$zV7BF6aKo4BZ^bmgLYMk)TK6i>{3@*bM9yw8M7B5G59aZ;VSW7-h}6 zoREX`M|PkjP4Mu2FT_|I+M^=3m~C#ueLPm+dmWsKg_SCnzfE~&AvUI*Ktr+Se&>8C zat*y|ZtYT#Rrt!2qoksx`jmNY*838zD%pgcjks;7uA!(rl5UCqY(})?RVvbRs*i1G z+#>RY(0#&A%It3V%7VeN_=yHE;uf&SXJ=gCZk`Sf)7fhWJOiPZt6rGlB4tu69X>A> z;EcEC8VvA9e{7wKq>bEg;2Jf_%}L|0Va4K;hY08B1sRP_MC3Ua((KE=XsPkwx46yK z*bK>QLGi>=h$=diqbQ0)=htkYhJ3|CJZ)RVnV}2T$;L#&dojbg!xy$Hx~=!BI#zj? z3Bg(@L8i{&wfu}POT=!Df6&sox-P`V5q@(=yRePxtu=~_U0QmCU!G3nN55+~b+MO5 zwC7vzPSy{1(+{wuJU{y^8c?6H-Es-ue|dK6CwweXaAN=CNDJy*U)3OGlpR8rwXMud z%H1W>et<9PZ z>*tdutXwn34-SP*1}=}AIOtu+wcA9|_s2U2kdIRd;yrhdZRFj|u2Y=)w>!2I^qsE1 zB4=5d_|ZwO7{gz7RCE+FNYmxTPErckz8yz-V+f(VqU_!;gqVuR77MdTm4`(HOY@BX zn24Vw?bR%Mp3-uevsO#5-W$`~%{-S5bB&Akm=S8h1dLe8=k%Oy3+hr?VPggM@Y&vQ z$qFN$HVB757#oo^&)cz|*OzksM8Do?*=RdroWr|@(sRNv>Sv;KihV&$T~%6Y-mLwp z$cPm;lyyws)ZE~U^ba^%BazDNIA(ZXMG*o!Q_Q3)M=N-wGH7tmoH>XXeV z6n-|@h`nO@(BTaKE=QeJWxl=m_I4N+SuS{?@%D+Pbu3O{?vlezsQHU42i7GVELoVJ zbqic(F4?;|Uko-G-sJi1-|iWb_7reb$aoJkmb60X8~W`9kU+l(t-OS3gbVGhuBm22 z>c65xLgBR<)6iQ!J59)HCHC!wn>zE8O)Z{lDs+Upm-GM8S)1l7-EeCr`cqo4V4qdc zT;m+WMW%6gEC0SWl=ue)?(H!`tkKk~rX^8n8RLlj8iJeV0x~E>C#%kq=@p&%_xZZM zrZvexy2TPD&Uyqd-m=q~FWmDogs0l?jXBCBF`!HcfYssHlkQpX4(cbPY7(?}oH`S& zGz^Wu*C@nPEpvLt!^urKZollb$1(`ZQvXP$ySx9+e+44F+lcA7GyB>bHt%ac{MVPb z!apiUOrL87jJ`#oriNmB1BQ=T_(W23t4d%Xc06KVx*OJ*td?tI<=c!$6ORX>=iwJV zRzD|Uz09M|8ir@ru8Hq{e*fNG=3(+mY9yM7+bPL#{N5s=O)b4)Kg^HWR`ev$nq3Sl zPPEHEuFbrW9Mv*CoGVQ@j`Z>;bo6rPz!f&Dv966g89~e8__L>+osDMf$e2%GuzcG` zrpC~+%Tt2{aGYZ@HSy*a9h~l)@EHle zcpmMD(4c9A2MiEeVX@AA=AUFSzMQ3*o9u@#4!ph0g6!nh7@i(1Z1ZA{^_Fb`1N(~G zQa!*Yz0X1L)&?%twx~W+#$MNN0>-)iscMIbeg2SkpyYAcB>#X7vj1AW9cE-Z?Nu=) zY>9=Sb6MkTWh`w!eHi1c>PKbj>6S_uxO$Y5R_wPXLAfLdPP*Vc869|B2vGr=7nmZ7 z;P8@~CW25Hq)&F0o?Kql^{OsrpS>U7v{PkMpBiulwsaD!SPdLyC%nbhKYlNg^i81NBa)tUOzt+ zss5h?3cv%uxa%)%`@b_~brp3HHPPRgGS7b<*1^CIAQmA1JR4};D^3tn2EmO#t$W4s z=h%+Ft$PKu`uErl0Ac(Q+wr$muO0}(pBWZ_pMTxje}$Ae0Q~g_IruYDPMos?kn-#O zW6VVa3eULsgrCZ!6tEM(%T(B4rmsVU+YWQBoPXMc4l^)%dI-i%S=7hJ;3e=t#_PdoDuQ)f)Zr6A*4{B%V zUx^^;ooBq;*4bvl(GHC|-)``mCVJPZe82IPaqQ>#z2e4QJcqAA(3z=t?lHGgSb4b;U^NW271n);V0?pPvMxZRkx)LY39gN)}{rJl8dtN;oBzVk*6C%w zWxH|<)n0Ak{?Bm-gaQ2OoWI81|D62(r!o0Y@C(4ce}t7hjFG<#n*T{y3GhqLua&<3 zlOuoQz7G@5LkP(Ooc+HEApxd|zi?kJU@qc#SV4>Jfo}p7_xF{;AHp9V&@UG=+e2Un zC@uu_0Y!6gJe~#tOHNP_29RVPz`G!j%k~fh@kn|f%srCchx!ksmkofVtUzvk4i*sT z1maBq=E(_I1d2I;SPjrAfbN1!aRX5$zk}X~_K%Pkba}us=mT;M2oC{O2JNx|`SUpe zSJ;6#7Z8^Pm9qm;Aiq}!l|3Nn2WyX<_P1D(M@|dGfPgqHi03|*{}HnRgv$Ktm;W0M z%gzk^l=#PN`isLx0UQ=XV=9x~Brx0}ERQ3I&GHnZ0+zAD#nQIUNU1D$SiQ6u)^G^} zU0v#>NPJo_1*+=|CS>Bb5ZYpws=CQ4X<}mAYi�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 literal 0 HcmV?d00001 From eaf094a18d1419bc5d0ded72c8c70347edc28d17 Mon Sep 17 00:00:00 2001 From: DonaldChung-HK Date: Wed, 27 Jul 2022 07:40:17 +0100 Subject: [PATCH 20/26] added multi processing but not officially supported due to low performance --- CodeEntropy/ClassCollection/PoseidonClass.py | 272 ++-- .../FunctionCollection/PoseidonHelper.py | 135 ++ Example/Capped_protein_Example copy.ipynb | 1302 +++++++++++++++++ Example/Poseidon_GROMACS.py | 8 +- docs/api.rst | 4 +- ...ssCollection.PoseidonClass.Poseidon_mp.rst | 23 + ...PoseidonClass.Poseidon_mp.run_analysis.rst | 6 + 7 files changed, 1620 insertions(+), 130 deletions(-) create mode 100644 CodeEntropy/FunctionCollection/PoseidonHelper.py create mode 100644 Example/Capped_protein_Example copy.ipynb create mode 100644 docs/autosummary/CodeEntropy.ClassCollection.PoseidonClass.Poseidon_mp.rst create mode 100644 docs/autosummary/CodeEntropy.ClassCollection.PoseidonClass.Poseidon_mp.run_analysis.rst diff --git a/CodeEntropy/ClassCollection/PoseidonClass.py b/CodeEntropy/ClassCollection/PoseidonClass.py index 16f83f7..dc5a6a1 100644 --- a/CodeEntropy/ClassCollection/PoseidonClass.py +++ b/CodeEntropy/ClassCollection/PoseidonClass.py @@ -5,6 +5,8 @@ from collections import Counter from datetime import datetime +from joblib import delayed + from CodeEntropy.poseidon.extractData.readFiles import populateTopology, getCoordsForces, getDistArray # # Energy is not needed # from CodeEntropy.poseidon.extractData.readFiles import populateEnergy, UAEnergyGroup @@ -19,9 +21,20 @@ from CodeEntropy.poseidon.analysis.EECalculation import processEE from CodeEntropy.poseidon.analysis.helper import memoryInfo, weightingPopulation +from CodeEntropy.FunctionCollection.PoseidonHelper import frame_iteration + from functools import partial from multiprocessing import Pool +from pathos.pools import ProcessPool +import dask +import dask.multiprocessing +dask.config.set(scheduler='processes') + +from dask.distributed import Client + +import numpy as nmp + class Poseidon(): """ Container to host data from MDAnalysis.Universe and run Poseidon Analysis @@ -413,21 +426,36 @@ def __init__(self ,container, start=0, end=-1, step=1, pureAtomNum=1, cutShell=None, excludedResnames=None, water='WAT', verbose=False, thread=4): - """This is a initialization function to collect information from a MDanalysis universe into a data container for analysis using POSEIDON - Pending Work - - rewrite this into a class initalization for easier understanding - - rewrite the energy part to be compulsory - - Args: - container (MDAnalysis.Universe): A MDAnalysis object with coordinates, forces and energy (loaded to velocity field with the value [Potential Energy(index 0), Kinetic Energy(1) and dummy(2)] respectively) - start (int): Starting Frame ID. Defaults to 0. - end (int): Ending Frame ID, this frame is not included. Defaults to -1. - step (int, optional): Steps between frame. Defaults to 1. - pureAtomNum (int, optional): Reference molecule resid for pure liquid. Defaults to 1. - cutShell (float, optional): Explicit cut off shell (might be buggy since part of it is not defined). Default to None which uses the relative angular distance (RAD) algorithm. See Jonathan Higham and Richard H. Henchman , "Locally adaptive method to define coordination shell", J. Chem. Phys. 145, 084108 (2016) - excludedResnames (list, optional): List of resnames to exclude from nearest non alike analysis. Defaults to None. - water (str, optional): Resname for water molecules. Defaults to 'WAT'. - verbose (bool, optional): print out progress of each analysis step. Defaults to False. + """ + Warning!!! + + This requires a lot of memory to run with very little performance gain. + + This is a initialization function to collect information from a MDanalysis universe into a data container for analysis using POSEIDON. + + Parameters + ---------- + container : MDAnalyse.Universe + A Universe object will all topology, dihedrals,coordinates and force information Check ``Example/create_new_universe.py`` on how to create a universe from existing data. + start : int or None, Optional, default: 0 + Frame id to start analysis. + end : int or None, Optional, default: -1 + Frame id to end analysis. + step : int, Optional, default: 1 + Steps between frame. + pureAtomNum : int, Optional, default: 1 + Reference molecule resid for pure liquid. + cutShell : float or None, Optional, default: 1 + Explicit cut off shell. Default to None which uses the relative angular distance (RAD) algorithm. See Jonathan Higham and Richard H. Henchman , "Locally adaptive method to define coordination shell", J. Chem. Phys. 145, 084108 (2016) + excludedResnames : list of str or None, Optional, default: None + List of resnames to exclude from nearest non alike analysis. + water : list of str, Optional, default: "WAT" + Resname for water molecules. + verbose : bool, Optional, default: False + Print out progress of each step. + thread : int, Optional, default: 4 + How many multiprocess thread to spawn + """ startTime = datetime.now() print(startTime) @@ -463,9 +491,15 @@ def __init__(self ,container, start=0, end=-1, if end == -1: end = len(container.trajectory) sys.setrecursionlimit(3000000) - p = Pool(processes=thread) - fi_partial = partial(self.frame_iteration, container, all_data, dimensions, startTime, verbosePrint, waterTuple, cutShell, excludedResnames) - data = p.map(fi_partial, [frame for frame in range(int(start), int(end), int(step))]) + #p = Pool(processes=thread) + p = ProcessPool(nodes=thread) + fi_partial = partial(frame_iteration, container, all_data, dimensions, startTime, verbosePrint, waterTuple, cutShell, excludedResnames) + range = nmp.arange(int(start), int(end), int(step)) + data = p.map(fi_partial, range) + p.close() + + print("Done Threading Work") + print(len(data)) # data = [] # for frame in range(int(start), int(end), int(step)): # data.append(fi_partial(frame)) @@ -480,120 +514,108 @@ def __init__(self ,container, start=0, end=-1, print(datetime.now() - startTime) self.allMoleculeList = allMoleculeList - - def frame_iteration(self, container, all_data, dimensions, startTime, verbosePrint, waterTuple, cutShell, excludedResnames, frame): - clearClass(all_data) - print(f"frame = {frame}") - all_data, dimensions = getCoordsForces(container, - all_data, dimensions, frame, startTime, - verbosePrint) - # # Energy is not needed - # populateEnergy(container, all_data, - # dimensions, frame, startTime, verbosePrint) - # UAEnergyGroup(all_data) - - - calculateDihedrals(all_data, dimensions) - verbosePrint('DIH') - verbosePrint(datetime.now() - startTime) - sys.stdout.flush() - - #''' - traj = container.trajectory[frame] - neighbour_coords = None - neighbour_coords = traj.positions - - max_cutoff = 10 - for x in range(0, len(all_data)): - atom = all_data[x] - #start nearest array from solutes - if atom.resname not in waterTuple: - getDistArray(atom, all_data, traj, max_cutoff, - dimensions, neighbour_coords, - startTime, verbosePrint) - #find nearest array for solute neighbours that are solvent - for nearDist in atom.nearest_all_atom_array[0:20]: - neighbour = all_data[nearDist[0]] - if neighbour.resname in waterTuple and \ - neighbour.nearest_all_atom_array == None: - getDistArray(neighbour, all_data, traj, max_cutoff, - dimensions, neighbour_coords, - startTime, verbosePrint) - #find solvent neighbours neighbours nearest array - if neighbour.nearest_all_atom_array != None: - for nearDist2 in neighbour.nearest_all_atom_array[0:20]: - neighbour2 = all_data[nearDist2[0]] - if neighbour2.resname in waterTuple and \ - neighbour2.nearest_all_atom_array == None: - getDistArray(neighbour2, all_data, - traj, max_cutoff, - dimensions, - neighbour_coords, - startTime, verbosePrint) - else: - continue - else: - continue - else: - continue - verbosePrint('NEAREST ARRAYS') - verbosePrint(datetime.now() - startTime) - sys.stdout.flush() - #''' - - - - if cutShell != None: - #Used for fixed cut-off coordination shells - try: - cutoff_dist = float(cutShell) - distCutoffNc(all_data, dimensions, cutoff_dist) - # #don't know what this is it is not defined anywhere - # NcPairs(all_data, dimensions) - verbosePrint('distCutoffNc') - verbosePrint(datetime.now() - startTime) - sys.stdout.flush() - except ValueError: - logging.error('Cutoff distance needs to be a float') - - - if cutShell == None: - UALevelRAD(all_data, dimensions) - verbosePrint('RAD') - verbosePrint(datetime.now() - startTime) - - - #if inputType != 'pdb': - HBCalc(all_data, waterTuple, dimensions) - verbosePrint('HB') - verbosePrint(datetime.now() - startTime) - sys.stdout.flush() +class Poseidon_dask(Poseidon): + def __init__(self ,container, start=0, end=-1, + step=1, pureAtomNum=1, cutShell=None, + excludedResnames=None, + water='WAT', verbose=False, thread=4): + """ + Warning!!! + + This requires a lot of memory to run with very little performance gain. + + This is a initialization function to collect information from a MDanalysis universe into a data container for analysis using POSEIDON. + + Parameters + ---------- + container : MDAnalyse.Universe + A Universe object will all topology, dihedrals,coordinates and force information Check ``Example/create_new_universe.py`` on how to create a universe from existing data. + start : int or None, Optional, default: 0 + Frame id to start analysis. + end : int or None, Optional, default: -1 + Frame id to end analysis. + step : int, Optional, default: 1 + Steps between frame. + pureAtomNum : int, Optional, default: 1 + Reference molecule resid for pure liquid. + cutShell : float or None, Optional, default: 1 + Explicit cut off shell. Default to None which uses the relative angular distance (RAD) algorithm. See Jonathan Higham and Richard H. Henchman , "Locally adaptive method to define coordination shell", J. Chem. Phys. 145, 084108 (2016) + excludedResnames : list of str or None, Optional, default: None + List of resnames to exclude from nearest non alike analysis. + water : list of str, Optional, default: "WAT" + Resname for water molecules. + verbose : bool, Optional, default: False + Print out progress of each step. + thread : int, Optional, default: 4 + How many multiprocess thread to spawn + + """ + startTime = datetime.now() + print(startTime) + verbosePrint = print if verbose else lambda *a, **k: None + + waterTuple = ('SOL', 'WAT', 'HOH', 'TIP3') #needed for pdb as top file + if water != 'WAT': + waterTuple = (water) + iterations = 0 + + all_data = [] - getShellAssignment(all_data, excludedResnames, dimensions, - startTime, verbosePrint) - verbosePrint('PROX') + populateTopology(container, all_data, waterTuple) + verbosePrint('TOPOLOGY') verbosePrint(datetime.now() - startTime) sys.stdout.flush() - #if (force != None): - calculateFTMatrix(all_data, dimensions) - verbosePrint('FTMATRIX') - verbosePrint(datetime.now() - startTime) - sys.stdout.flush() - + resids = Counter([(i.resname) for i in all_data]) + verbosePrint(resids.keys()) + if len(resids.keys()) == 1: + verbosePrint('Pure system with reference ID: %s' % (pureAtomNum)) - moleculePositionRankingRAD(all_data, waterTuple, dimensions) - verbosePrint('ORIENTS') - verbosePrint(datetime.now() - startTime) - sys.stdout.flush() + if excludedResnames != None: + verbosePrint('EXCLUDED RESNAMES: %s' % (excludedResnames)) + - ''' - if iterations == 1: - verbosePrint('Generating .pdb file for frame %s' % (frame+1)) - pdbGenerate(all_data, ('frame_%s' % (frame+1)), dimensions) - ''' + dimensions = None + allMoleculeList = [] + + #fix end frame + if end == -1: + end = len(container.trajectory) + sys.setrecursionlimit(3000000) + #p = Pool(processes=thread) + fi_partial = partial(frame_iteration, container, all_data, dimensions, startTime, verbosePrint, waterTuple, cutShell, excludedResnames) + job_list = [] + client = Client(n_workers=thread) + for frame in range(int(start), int(end), int(step)): + job_list.append(dask.delayed(frame_iteration( + container, + all_data, + dimensions, + startTime, + verbosePrint, + waterTuple, + cutShell, + excludedResnames, + frame))) + data = dask.compute(job_list) + + print("Done Threading Work") + print(len(data)) + # data = [] + # for frame in range(int(start), int(end), int(step)): + # data.append(fi_partial(frame)) + for item in data: + allMoleculeList = moleculeObjectPopulation(item[0], + allMoleculeList, item[1], item[2]) + # #writing file here + # with gzip.GzipFile('moleculeListAll.obj', 'wb') as pickleFile: + # pickle.dump((allMoleculeList), pickleFile, protocol=2) + # pickleFile.close() - return (all_data, frame, dimensions) + print(datetime.now() - startTime) + + self.allMoleculeList = allMoleculeList + \ No newline at end of file diff --git a/CodeEntropy/FunctionCollection/PoseidonHelper.py b/CodeEntropy/FunctionCollection/PoseidonHelper.py new file mode 100644 index 0000000..470435f --- /dev/null +++ b/CodeEntropy/FunctionCollection/PoseidonHelper.py @@ -0,0 +1,135 @@ +import sys +import logging + +from CodeEntropy.poseidon.extractData.readFiles import populateTopology, getCoordsForces, getDistArray +# # Energy is not needed +# from CodeEntropy.poseidon.extractData.readFiles import populateEnergy, UAEnergyGroup +from CodeEntropy.poseidon.extractData.HBRAD import distCutoffNc, UALevelRAD, HBCalc +from CodeEntropy.poseidon.extractData.forceTorques import calculateFTMatrix +from CodeEntropy.poseidon.extractData.dihedrals import calculateDihedrals +from CodeEntropy.poseidon.extractData.nearestNonlike2 import getShellAssignment, moleculePositionRankingRAD +from CodeEntropy.poseidon.extractData.outputFiles import moleculeObjectPopulation +from CodeEntropy.poseidon.extractData.mainClass import clearClass + +from CodeEntropy.poseidon.analysis.populateClasses import classPopulation +from CodeEntropy.poseidon.analysis.EECalculation import processEE +from CodeEntropy.poseidon.analysis.helper import memoryInfo, weightingPopulation + +from datetime import datetime + +def frame_iteration(container, all_data, dimensions, startTime, verbosePrint, waterTuple, cutShell, excludedResnames, frame): + clearClass(all_data) + print(f"frame = {frame}") + + all_data, dimensions = getCoordsForces(container, + all_data, dimensions, frame, startTime, + verbosePrint) + # # Energy is not needed + # populateEnergy(container, all_data, + # dimensions, frame, startTime, verbosePrint) + # UAEnergyGroup(all_data) + + + calculateDihedrals(all_data, dimensions) + verbosePrint('DIH') + verbosePrint(datetime.now() - startTime) + sys.stdout.flush() + + #''' + traj = container.trajectory[frame] + neighbour_coords = None + neighbour_coords = traj.positions + + max_cutoff = 10 + for x in range(0, len(all_data)): + atom = all_data[x] + #start nearest array from solutes + if atom.resname not in waterTuple: + getDistArray(atom, all_data, traj, max_cutoff, + dimensions, neighbour_coords, + startTime, verbosePrint) + #find nearest array for solute neighbours that are solvent + for nearDist in atom.nearest_all_atom_array[0:20]: + neighbour = all_data[nearDist[0]] + if neighbour.resname in waterTuple and \ + neighbour.nearest_all_atom_array == None: + getDistArray(neighbour, all_data, traj, max_cutoff, + dimensions, neighbour_coords, + startTime, verbosePrint) + #find solvent neighbours neighbours nearest array + if neighbour.nearest_all_atom_array != None: + for nearDist2 in neighbour.nearest_all_atom_array[0:20]: + neighbour2 = all_data[nearDist2[0]] + if neighbour2.resname in waterTuple and \ + neighbour2.nearest_all_atom_array == None: + getDistArray(neighbour2, all_data, + traj, max_cutoff, + dimensions, + neighbour_coords, + startTime, verbosePrint) + else: + continue + else: + continue + else: + continue + verbosePrint('NEAREST ARRAYS') + verbosePrint(datetime.now() - startTime) + sys.stdout.flush() + #''' + + + + if cutShell != None: + #Used for fixed cut-off coordination shells + try: + cutoff_dist = float(cutShell) + distCutoffNc(all_data, dimensions, cutoff_dist) + # #don't know what this is it is not defined anywhere + # NcPairs(all_data, dimensions) + verbosePrint('distCutoffNc') + verbosePrint(datetime.now() - startTime) + sys.stdout.flush() + except ValueError: + logging.error('Cutoff distance needs to be a float') + + + if cutShell == None: + UALevelRAD(all_data, dimensions) + verbosePrint('RAD') + verbosePrint(datetime.now() - startTime) + + + #if inputType != 'pdb': + HBCalc(all_data, waterTuple, dimensions) + verbosePrint('HB') + verbosePrint(datetime.now() - startTime) + sys.stdout.flush() + + + getShellAssignment(all_data, excludedResnames, dimensions, + startTime, verbosePrint) + verbosePrint('PROX') + verbosePrint(datetime.now() - startTime) + sys.stdout.flush() + + + #if (force != None): + calculateFTMatrix(all_data, dimensions) + verbosePrint('FTMATRIX') + verbosePrint(datetime.now() - startTime) + sys.stdout.flush() + + + moleculePositionRankingRAD(all_data, waterTuple, dimensions) + verbosePrint('ORIENTS') + verbosePrint(datetime.now() - startTime) + sys.stdout.flush() + + ''' + if iterations == 1: + verbosePrint('Generating .pdb file for frame %s' % (frame+1)) + pdbGenerate(all_data, ('frame_%s' % (frame+1)), dimensions) + ''' + #print(all_data, frame, dimensions) + return (all_data, frame, dimensions) diff --git a/Example/Capped_protein_Example copy.ipynb b/Example/Capped_protein_Example copy.ipynb new file mode 100644 index 0000000..b70ef2a --- /dev/null +++ b/Example/Capped_protein_Example copy.ipynb @@ -0,0 +1,1302 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "b062a235-be79-4897-9f63-73f3d5fa411d", + "metadata": {}, + "source": [ + "# Calculate Solvent Entropy for a capped amino acid (Solvent)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d4724f43-d655-4829-8ae2-521fdcad9a05", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ac10fa4a-9be8-423c-b5b7-9f2d902191c1", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "7ab57875-f604-491b-a08d-85cb5386f9e3", + "metadata": {}, + "source": [ + "## Load Data" + ] + }, + { + "cell_type": "markdown", + "id": "3fb95f32-d4ff-46a1-b6a8-dea0011f07a4", + "metadata": {}, + "source": [ + "1. Load data into MDAnalysis Universe" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "fadb5a2e-d401-418f-bf43-5bb1771d052e", + "metadata": {}, + "outputs": [], + "source": [ + "import MDAnalysis as mda\n", + "# set the working dir to the root of repo inorder to use these path\n", + "tprfile = \"data/molecules.prmtop\"\n", + "trrfile = \"data/data.trr\"\n", + "u = mda.Universe(tprfile, trrfile)" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "9556958c-0992-4359-a41c-3752b254e376", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2022-07-27 07:35:14,977 - distributed.diskutils - INFO - Found stale lock file and directory '/tmp/dask-worker-space/worker-lyz47d0p', purging\n" + ] + }, + { + "data": { + "text/html": [ + "