diff --git a/.github/workflows/conda.yml b/.github/workflows/conda.yml index 65ea837f..e8f5e761 100644 --- a/.github/workflows/conda.yml +++ b/.github/workflows/conda.yml @@ -10,7 +10,7 @@ jobs: strategy: matrix: os: [ubuntu-latest, macOS-latest] - python-version: [3.6, 3.7] + python-version: [3.6, 3.7, 3.8] name: Python ${{ matrix.python-version }} at ${{ matrix.os }} steps: - uses: actions/checkout@v2 diff --git a/.github/workflows/master.yml b/.github/workflows/master.yml index 38b41568..ba7ed8ef 100644 --- a/.github/workflows/master.yml +++ b/.github/workflows/master.yml @@ -11,32 +11,37 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v2 - - name: Set up Python 3.7 - uses: actions/setup-python@v2 - with: - python-version: 3.7 + - name: Setup conda + uses: s-weigand/setup-conda@v1 + with: + update-conda: true + python-version: 3.7 + conda-channels: anaconda, omnia, conda-forge, martimunicoy - - name: Install dependencies - shell: bash -l {0} - run: | - python -m pip install --upgrade pip - if [ -f docs/requirements.txt ]; then pip install -r docs/requirements.txt; fi + - name: Install doc dependencies + shell: bash + run: | + python -m pip install --upgrade pip + if [ -f docs/requirements.txt ]; then pip install -r docs/requirements.txt; fi - - name: Build sphinx documentation - shell: bash -l {0} - run: | - cd docs/ - make github + - name: Install latest peleffy version + run: conda install peleffy - # https://github.com/peaceiris/actions-gh-pages - - name: Deploy documentation - if: success() - uses: peaceiris/actions-gh-pages@v3 - with: - publish_branch: gh-pages - github_token: ${{ secrets.GITHUB_TOKEN }} - publish_dir: docs/html/ - user_name: 'Martí Municoy' - user_email: 'martimunicoy@gmail.com' + - name: Build sphinx documentation + shell: bash + run: | + cd docs/ + make github + + # https://github.com/peaceiris/actions-gh-pages + - name: Deploy documentation + if: success() + uses: peaceiris/actions-gh-pages@v3 + with: + publish_branch: gh-pages + github_token: ${{ secrets.GITHUB_TOKEN }} + publish_dir: docs/html/ + user_name: 'Martí Municoy' + user_email: 'martimunicoy@gmail.com' diff --git a/README.md b/README.md index 64da3c7f..99eecff2 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -| **About** | [![License](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE) [![Python](https://img.shields.io/badge/python-3.6%2C%203.7-blue.svg)](https://martimunicoy.github.io/peleffy) [![Release](https://img.shields.io/github/release/martimunicoy/peleffy.svg?include_prereleases)](https://github.com/martimunicoy/peleffy/releases/) | +| **About** | [![License](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE) [![Python](https://img.shields.io/badge/python-3.6%2C%203.7%2C%203.8-blue.svg)](https://martimunicoy.github.io/peleffy) [![Release](https://img.shields.io/github/release/martimunicoy/peleffy.svg?include_prereleases)](https://github.com/martimunicoy/peleffy/releases/) | | :------ | :------- | | **Status** | [![Language grade: Python](https://img.shields.io/lgtm/grade/python/g/martimunicoy/peleffy.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/martimunicoy/peleffy/context:python) [![Test](https://github.com/martimunicoy/peleffy/workflows/Test/badge.svg)](https://github.com/martimunicoy/peleffy/actions?query=workflow%3ATest) [![codecov](https://codecov.io/gh/martimunicoy/peleffy/branch/master/graph/badge.svg)](https://codecov.io/gh/martimunicoy/peleffy) | | **Installation** | [![Conda](https://img.shields.io/conda/v/martimunicoy/peleffy.svg)](https://anaconda.org/martimunicoy/peleffy) [![PyPI](https://img.shields.io/pypi/v/peleffy)](https://pypi.org/project/peleffy/) | diff --git a/devtools/conda/meta.yaml b/devtools/conda/meta.yaml index f5e73c09..065f1fb5 100644 --- a/devtools/conda/meta.yaml +++ b/devtools/conda/meta.yaml @@ -13,13 +13,11 @@ build: requirements: build: - # Note that rdkit does not support Python 3.8 yet - - python 3.6|3.7 + - python - setuptools run: - # Note that rdkit does not support Python 3.8 yet - - python 3.6|3.7 + - python - numpy - matplotlib - pytest diff --git a/docs/requirements.txt b/docs/requirements.txt index 1ca1ffb6..a89dfbf8 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -1,3 +1,5 @@ Sphinx==3.1.2 sphinx-rtd-theme==0.5.0 m2r==0.2.1 +docutils==0.16 +peleffy diff --git a/peleffy/topology/conformer.py b/peleffy/topology/conformer.py index a1bbb180..23459ff9 100644 --- a/peleffy/topology/conformer.py +++ b/peleffy/topology/conformer.py @@ -16,10 +16,9 @@ class BCEConformations(object): """ - A class to produce a library of conformations from the output - of the BCE server. + A class to produce a library of conformations from a set of ligand PDB files. """ - def __init__(self, topology_obj, bce_output_path): + def __init__(self, topology_obj, bce_output_path, from_bce=True): """ Initializes a BCEConformations object. @@ -29,11 +28,15 @@ def __init__(self, topology_obj, bce_output_path): A Topology object that contains the ligand's information bce_output_path: str Path where the output from the BCE server is stored + from_bce : bool + Whether the ligand clusters originate from the BCE server or not. Affects cluster search path in + _calculate_all_conformations method. """ self._topology = topology_obj self._molecule = topology_obj.molecule self.bce_path = bce_output_path self.conformations_library = {} + self.from_bce = from_bce def calculate(self): """ @@ -44,9 +47,11 @@ def calculate(self): self._calculate_all_conformations() def _calculate_all_conformations(self): - clusters = sorted(glob.glob(os.path.join(self.bce_path, - "CLUSTERS", "CL*", - "cluster*.min.imaged.pdb"))) + if self.from_bce: + clusters = sorted(glob.glob(os.path.join(self.bce_path, "CLUSTERS", "CL*", "cluster*.min.imaged.pdb"))) + else: + clusters = sorted(glob.glob(os.path.join(self.bce_path, "*.pdb"))) + if not clusters: raise ValueError("Path to the BCE output does not contain a " + "CLUSTERS folder, please check if the path " @@ -56,7 +61,6 @@ def _calculate_all_conformations(self): for cluster in ordered_clusters: self.calculate_cluster_offsets(cluster) - def calculate_cluster_offsets(self, cluster_pdb): """ Calculate dihedral angles from PDB. @@ -71,7 +75,8 @@ def calculate_cluster_offsets(self, cluster_pdb): # Use the input molecule as template since the cluster structures # probably will not have proper stereochemistry mol = molecule.Molecule( - cluster_pdb, connectivity_template=self._molecule.rdkit_molecule) + cluster_pdb, connectivity_template=self._molecule.rdkit_molecule, + allow_undefined_stereo=self._molecule.allow_undefined_stereo) cluster_coordinates = mol.get_conformer() topology_to_cluster = { i: x for i, x @@ -136,7 +141,8 @@ def order_clusters_min_distances(self, clusters): # probably will not have proper stereochemistry cluster_molecules.append(molecule.Molecule( cluster, - connectivity_template=self._molecule.rdkit_molecule)) + connectivity_template=self._molecule.rdkit_molecule, + allow_undefined_stereo=self._molecule.allow_undefined_stereo)) for i, cluster_mol in enumerate(cluster_molecules): for j, cluster_mol_2 in enumerate(cluster_molecules[i+1:], start=i+1): @@ -179,6 +185,7 @@ def find_optimal_path_from_matrix(distances): return min_path + def find_heuristic_path(graph, distances, start_node): """ Given a graph, the corresponding distances matrix and a starting node, @@ -222,13 +229,13 @@ def find_heuristic_path(graph, distances, start_node): def find_index_root(sorted_topology, topology): """ It finds the index of the root atom in the original topology - that matches with the one from the topology that fullfills the Impact + that matches with the one from the topology that fulfills the Impact template rules. Parameters ---------- sorted_topology : a peleffy.topology.Topology object - The topology sorted to fullfill the Impact template format + The topology sorted to fulfill the Impact template format topology : a peleffy.topology.Topology object The original topology object