From 64d7aa446fb9236e7e905a8aaf3dc66dde64027c Mon Sep 17 00:00:00 2001 From: Anna Gruszka Date: Mon, 7 Jun 2021 17:40:03 +0200 Subject: [PATCH] PELE-451 Minor adjustments to ensure platform compatibility --- peleffy/topology/conformer.py | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) 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