From acd25046df602fdd7991025fe7fb6d0119a0b526 Mon Sep 17 00:00:00 2001 From: Daniel Schwalbe-Koda Date: Wed, 15 Jul 2020 08:48:32 -0400 Subject: [PATCH] remove grower; keep it in a different branch --- moldocker/mcarlo/__init__.py | 1 - moldocker/mcarlo/grower.py | 44 ----- moldocker/mcarlo/tests/test_grower.py | 61 ------- moldocker/samplers/tests/test_voronoi.py | 2 +- moldocker/structure/__init__.py | 1 - moldocker/structure/fragment.py | 59 ------- moldocker/structure/tests/test_fragment.py | 27 --- moldocker/structure/tests/test_transformer.py | 16 +- moldocker/tests/files/fragments.xyz | 166 ------------------ moldocker/tests/test_inputs.py | 10 -- moldocker/utils/parser/__init__.py | 1 - moldocker/utils/parser/grow.py | 42 ----- moldocker/utils/parser/tests/test_grow.py | 24 --- 13 files changed, 3 insertions(+), 451 deletions(-) delete mode 100644 moldocker/mcarlo/grower.py delete mode 100644 moldocker/mcarlo/tests/test_grower.py delete mode 100644 moldocker/structure/fragment.py delete mode 100644 moldocker/structure/tests/test_fragment.py delete mode 100644 moldocker/tests/files/fragments.xyz delete mode 100644 moldocker/utils/parser/grow.py delete mode 100644 moldocker/utils/parser/tests/test_grow.py diff --git a/moldocker/mcarlo/__init__.py b/moldocker/mcarlo/__init__.py index d5ed291..d05575a 100644 --- a/moldocker/mcarlo/__init__.py +++ b/moldocker/mcarlo/__init__.py @@ -1,6 +1,5 @@ from .base import MonteCarlo from .mcmc import MarkovChainMC, Action from .metropolis import Metropolis -from .grower import Grower __all__ = [] diff --git a/moldocker/mcarlo/grower.py b/moldocker/mcarlo/grower.py deleted file mode 100644 index 70d3bdd..0000000 --- a/moldocker/mcarlo/grower.py +++ /dev/null @@ -1,44 +0,0 @@ -import random -import numpy as np - -from .mcmc import Action -from .metropolis import Metropolis - - -class Grower(Metropolis): - PARSER_NAME = "grower" - HELP = "Grows a guest inside a host." - - def __init__(self, *args, fragments, **kwargs): - super().__init__(*args, **kwargs) - self.fragments = fragments - - def sample_fragment(self): - return random.sample(self.fragments, 1)[0] - - @Action - def translate(self, cpx): - cpx.guest_transform.translate() - return cpx - - @Action - def rotate(self, cpx): - cpx.guest_transform.rotate() - return cpx - - @Action - def twist_bond(self, cpx): - cpx.guest_transform.twist_bond() - return cpx - - @Action - def grow(self, cpx): - frag = self.sample_fragment() - - try: - cpx.guest_transform.substitute(frag) - except RuntimeError: - pass - - return cpx - diff --git a/moldocker/mcarlo/tests/test_grower.py b/moldocker/mcarlo/tests/test_grower.py deleted file mode 100644 index 431bf17..0000000 --- a/moldocker/mcarlo/tests/test_grower.py +++ /dev/null @@ -1,61 +0,0 @@ -import numpy as np -import unittest as ut - -from moldocker.mcarlo import Grower -from moldocker.structure import FragmentCreator, Complex -from moldocker.fitness import ( - MinDistanceGaussianTarget, - MinDistanceFitness, - MultipleFitness, - SumInvDistanceFitness, -) -from moldocker.tests.test_inputs import load_fragments, load_structure - - -class TestGrower(ut.TestCase): - def setUp(self): - self.host = load_structure() - fragments = load_fragments() - self.fragments = [ - FragmentCreator(frag.copy()).get_fragment() for frag in fragments - ] - self.seed = fragments[0] - self.complex = Complex(self.host, self.seed) - - self.target = 1.5 - self.tolerance = 0.2 - fitness = [ - MinDistanceGaussianTarget(target=self.target, tolerance=self.tolerance), - MinDistanceFitness(threshold=0.85, structure="guest", step=True), - MinDistanceFitness(threshold=1.1, structure="complex", step=True), - ] - weights = [50, 1e10, 1e10] - self.fitness = MultipleFitness(fitness, weights) - - self.num_steps = 200 - self.temperature = 0.1 - self.temperature_profile = lambda step: 0.1 if step < 100 else 0 - - self.grower = Grower( - fitness=self.fitness, - temperature=self.temperature, - temperature_profile=self.temperature_profile, - fragments=self.fragments, - ) - - def test_examplemc(self): - cpx = self.grower.run(self.complex.copy(), self.num_steps) - - with open("/tmp/pose.cif", "w") as f: - f.write(cpx.pose.to("cif")) - - with open("/tmp/guest.xyz", "w") as f: - f.write(cpx.guest.to("xyz")) - - self.assertTrue( - np.abs(cpx.distance_matrix.min() - self.target) < self.tolerance - ) - - -if __name__ == "__main__": - ut.main() diff --git a/moldocker/samplers/tests/test_voronoi.py b/moldocker/samplers/tests/test_voronoi.py index 1c420d6..07c47c2 100644 --- a/moldocker/samplers/tests/test_voronoi.py +++ b/moldocker/samplers/tests/test_voronoi.py @@ -9,7 +9,7 @@ class TestVoronoi(ut.TestCase): def setUp(self): self.host = load_structure() self.guest = load_molecule() - self.sampler = VoronoiSampler() + self.sampler = VoronoiSampler(remove_species=["O"]) def test_points(self): points = self.sampler.get_points(self.host) diff --git a/moldocker/structure/__init__.py b/moldocker/structure/__init__.py index 6b2f1e0..e21b836 100644 --- a/moldocker/structure/__init__.py +++ b/moldocker/structure/__init__.py @@ -1,3 +1,2 @@ from .complex import Complex from .molecule import MoleculeTransformer -from .fragment import FragmentCreator diff --git a/moldocker/structure/fragment.py b/moldocker/structure/fragment.py deleted file mode 100644 index 0c1474c..0000000 --- a/moldocker/structure/fragment.py +++ /dev/null @@ -1,59 +0,0 @@ -import random -from pymatgen.core import Molecule - - -class FragmentCreator: - RADICAL_SPECIES = "X0+" - NBR_RADIUS = 2 - - def __init__(self, frag): - """Create fragments from molecules to make them appropriate for - substitution/functionalization methods. - - Args: - frag (pymatgen.core.Molecule) - """ - self.frag = frag - - def is_neighbor(self, atom, nbr): - return nbr in self.frag.get_neighbors(atom, self.NBR_RADIUS) - - def is_species(self, atom, species): - return atom.species_string == species - - def is_fragment_formatted(self): - return self.is_species(self.frag[0], self.RADICAL_SPECIES) and self.is_neighbor( - self.frag[0], self.frag[1] - ) - - def sample_terminal_atom(self): - hydrogens = [at for at in self.frag if self.is_species(at, "H")] - return random.sample(hydrogens, 1)[0] - - def create_radical(self, atom=None): - if atom is None: - atom = self.sample_terminal_atom() - - nearest_nbr = [ - nbr - for nbr in self.frag.get_neighbors(atom, self.NBR_RADIUS) - if not self.is_species(nbr, "H") - ][0] - - self.frag.remove(atom) - self.frag.remove(nearest_nbr) - - # insert the atoms again to reorder them - self.frag.insert(0, self.RADICAL_SPECIES, atom.coords) - self.frag.insert(1, nearest_nbr.species, nearest_nbr.coords) - - if not self.is_fragment_formatted(): - raise RuntimeError("Unknown error during formatting of fragment") - - return self.frag - - def get_fragment(self): - if self.is_fragment_formatted(): - return self.frag - - return self.create_radical() diff --git a/moldocker/structure/tests/test_fragment.py b/moldocker/structure/tests/test_fragment.py deleted file mode 100644 index ea9bba8..0000000 --- a/moldocker/structure/tests/test_fragment.py +++ /dev/null @@ -1,27 +0,0 @@ -import numpy as np -import unittest as ut - -from moldocker.structure import FragmentCreator -from moldocker.tests.test_inputs import load_fragments - - -class TestFragment(ut.TestCase): - def setUp(self): - self.fragments = load_fragments() - self.creator = FragmentCreator(self.fragments[2].copy()) - - def test_radical(self): - frag = self.creator.get_fragment() - self.assertTrue(frag[0].species_string == "X0+") - - def test_small_frag(self): - frag = self.fragments[10] - newfrag = FragmentCreator(frag.copy()).get_fragment() - - def test_all_fragments(self): - for idx, frag in enumerate(self.fragments): - newfrag = FragmentCreator(frag.copy()).get_fragment() - - -if __name__ == "__main__": - ut.main() diff --git a/moldocker/structure/tests/test_transformer.py b/moldocker/structure/tests/test_transformer.py index 3008c1b..b8a0382 100644 --- a/moldocker/structure/tests/test_transformer.py +++ b/moldocker/structure/tests/test_transformer.py @@ -1,15 +1,14 @@ import numpy as np import unittest as ut -from moldocker.structure import MoleculeTransformer, FragmentCreator +from moldocker.structure import MoleculeTransformer from moldocker.utils.geometry import rotation_matrix -from moldocker.tests.test_inputs import load_molecule, load_fragments +from moldocker.tests.test_inputs import load_molecule class TestTransformer(ut.TestCase): def setUp(self): self.guest = load_molecule() - self.fragments = load_fragments() self.transformer = MoleculeTransformer(self.guest.copy()) self.smallguest = load_molecule("ammonium.xyz") @@ -74,17 +73,6 @@ def test_twist_small_molecule(self): except ValueError: self.fail("error while twisting the bond of a small molecule") - def test_substitute(self): - import networkx as nx - - frag = self.fragments[3] - frag = FragmentCreator(frag).get_fragment() - - self.transformer.substitute(frag) - coordination = nx.degree(self.transformer.molgraph.graph) - - self.assertTrue(all([deg <= 4 for deg in dict(coordination).values()])) - if __name__ == "__main__": ut.main() diff --git a/moldocker/tests/files/fragments.xyz b/moldocker/tests/files/fragments.xyz deleted file mode 100644 index 51b53a1..0000000 --- a/moldocker/tests/files/fragments.xyz +++ /dev/null @@ -1,166 +0,0 @@ -5 -SMILES=C, name=methane -C 3e-06 0.0 1.4e-05 -H 0.108696 -0.230141 1.076624 -H -0.605921 -0.78766 -0.486107 -H -0.502812 0.978199 -0.119027 -H 1.000034 0.039602 -0.471404 - -8 -SMILES=CC, name=ethane -C 0.762213 -0.023193 -0.064488 -C -0.762213 0.023193 0.064488 -H 1.17302 0.945648 -0.417229 -H 1.248566 -0.251963 0.906579 -H 1.088648 -0.800516 -0.786327 -H -1.088648 0.800516 0.786327 -H -1.17302 -0.945648 0.417229 -H -1.248566 0.251963 -0.906579 - -11 -SMILES=CCC, name=propane -C 1.267846 -0.157697 -0.240559 -C 0.006333 0.003212 0.61489 -C -1.272515 0.155279 -0.216096 -H 2.17871 -0.265816 0.383377 -H 1.419529 0.720085 -0.904226 -H 1.201005 -1.054472 -0.892701 -H -0.09503 -0.87248 1.293808 -H 0.121513 0.885985 1.282338 -H -2.170355 0.270165 0.425264 -H -1.437806 -0.729452 -0.867165 -H -1.21913 1.045092 -0.87893 - -4 -SMILES=N, name=amine -N -0.008269 -0.001404 0.319112 -H 0.928711 -0.156404 -0.083066 -H -0.59594 -0.723239 -0.125073 -H -0.324502 0.881048 -0.110973 - -7 -SMILES=CN, name=methylamine -C -0.56302 -0.018149 -0.003217 -N 0.856781 0.0604 -0.34221 -H -1.026509 -0.876972 -0.533021 -H -1.084553 0.892579 -0.366076 -H -0.816588 -0.128941 1.083018 -H 1.343594 -0.777212 0.003935 -H 1.290295 0.848295 0.157471 - -18 -SMILES=C1CCCCC1, name=cyclohexane -C 0.956676 -1.03411 -0.470642 -C -0.249697 -1.406358 0.407078 -C -1.409306 -0.413959 0.220591 -C -0.956676 1.03411 0.470642 -C 0.249697 1.406358 -0.407078 -C 1.409306 0.413959 -0.220591 -H 0.675006 -1.147229 -1.54276 -H 1.796919 -1.739264 -0.294807 -H 0.063631 -1.40252 1.476365 -H -0.585681 -2.441945 0.186068 -H -2.256516 -0.676848 0.889389 -H -1.796887 -0.499007 -0.820615 -H -1.796919 1.739264 0.294807 -H -0.675006 1.147229 1.542761 -H 0.585681 2.441945 -0.186068 -H -0.063631 1.40252 -1.476364 -H 2.256516 0.676848 -0.889389 -H 1.796887 0.499007 0.820615 - -12 -SMILES=c1ccccc1, name=benzene -C -1.389893 -0.209288 0.005912 -C -0.876197 1.099026 -0.001376 -C 0.51369 1.308324 -0.007291 -C 1.389893 0.209288 -0.005912 -C 0.876197 -1.099026 0.001376 -C -0.51369 -1.308324 0.007291 -H -2.478693 -0.37322 0.010536 -H -1.562598 1.959978 -0.002456 -H 0.916052 2.33324 -0.012998 -H 2.478693 0.37322 -0.010536 -H 1.562598 -1.959978 0.002456 -H -0.916052 -2.33324 0.012998 - -21 -SMILES=C1CN2CCC1CC2, name=quinuclidine -C -0.716495 -0.7662 -1.207276 -C -1.390483 0.548478 -0.689861 -N -0.632585 1.148293 0.416947 -C 0.725221 1.477444 -0.038347 -C 1.496175 0.205505 -0.526292 -C 0.555163 -1.007702 -0.366033 -C 0.152625 -1.132198 1.119031 -C -0.559704 0.198021 1.535316 -H -1.402349 -1.634456 -1.112003 -H -0.448864 -0.685201 -2.282068 -H -2.42346 0.354206 -0.332182 -H -1.468467 1.303455 -1.500222 -H 1.258295 1.970258 0.801714 -H 0.641099 2.229962 -0.850349 -H 1.806273 0.305415 -1.588002 -H 2.422707 0.045331 0.064706 -H 1.065313 -1.933679 -0.702264 -H 1.054147 -1.31742 1.740608 -H -0.516922 -2.007483 1.256909 -H -1.59443 0.004067 1.888153 -H -0.023461 0.693803 2.371617 - -26 -SMILES=C1C2CC3CC1CC(C2)C3, name=adamantane -C -1.46131 -0.126557 1.012191 -C -1.078263 -1.102361 -0.122011 -C 0.288162 -1.747376 0.197699 -C 1.367077 -0.64892 0.320269 -C 0.978665 0.325981 1.453532 -C -0.386293 0.975538 1.136614 -C -0.288012 1.747432 -0.19752 -C 0.097637 0.775858 -1.334498 -C -0.978528 -0.325603 -1.453311 -C 1.461333 0.126242 -1.012331 -H -2.453031 0.330686 0.802419 -H -1.554758 -0.677549 1.973539 -H -1.853173 -1.894501 -0.209746 -H 0.22412 -2.325819 1.145254 -H 0.566338 -2.466759 -0.603353 -H 2.349467 -1.115489 0.550293 -H 0.926031 -0.21744 2.42224 -H 1.757669 1.111821 1.563549 -H -0.664147 1.676662 1.953255 -H -1.260239 2.235857 -0.42726 -H 0.470237 2.556593 -0.114634 -H 0.167619 1.333408 -2.293629 -H -0.721693 -1.021495 -2.281805 -H -1.962158 0.128512 -1.704015 -H 1.758049 -0.562739 -1.833163 -H 2.249098 0.908038 -0.943587 - -17 -SMILES=C[N+](C)(C)C, name=tetramethylammonium -C 0.95546 -0.61084 0.995536 -N -4.2e-05 -4e-06 -0.000166 -C -1.081986 -0.997114 -0.335631 -C -0.624184 1.237921 0.595798 -C 0.750787 0.369973 -1.25582 -H 1.407587 -1.515391 0.550884 -H 1.743 0.125668 1.235546 -H 0.397948 -0.878822 1.910811 -H -0.616373 -1.899819 -0.769959 -H -1.626216 -1.261015 0.588803 -H -1.776086 -0.542642 -1.065059 -H 0.174366 1.961228 0.839874 -H -1.320456 1.678837 -0.13987 -H -1.172403 0.957558 1.51296 -H 0.044863 0.818231 -1.977687 -H 1.202426 -0.541667 -1.686231 -H 1.54141 1.097898 -1.000089 - -5 -SMILES=[NH4+], name=ammonium -H 0.654687 -0.418551 0.682148 -N -0.000029 -0.000003 -0.000114 -H -0.741384 -0.683229 -0.229977 -H -0.427695 0.848231 0.408245 -H 0.514444 0.253508 -0.860496 diff --git a/moldocker/tests/test_inputs.py b/moldocker/tests/test_inputs.py index fabeebf..63f0827 100644 --- a/moldocker/tests/test_inputs.py +++ b/moldocker/tests/test_inputs.py @@ -18,17 +18,10 @@ def load_molecule(filename="molecule.xyz"): return Molecule.from_file(path) -def load_fragments(filename="fragments.xyz"): - path = os.path.join(inpath, filename) - xyz = XYZ.from_file(path) - return xyz.all_molecules - - class TestInputs(ut.TestCase): def setUp(self): self.structure = load_structure() self.molecule = load_molecule() - self.fragments = load_fragments() def test_struct(self): self.assertEqual(len(self.structure), 72) @@ -36,9 +29,6 @@ def test_struct(self): def test_molecule(self): self.assertEqual(len(self.molecule), 47) - def test_fragments(self): - self.assertEqual(len(self.fragments), 11) - if __name__ == "__main__": ut.main() diff --git a/moldocker/utils/parser/__init__.py b/moldocker/utils/parser/__init__.py index d773225..8935e25 100644 --- a/moldocker/utils/parser/__init__.py +++ b/moldocker/utils/parser/__init__.py @@ -1,3 +1,2 @@ from .base import Parser from .dock import DockParser -from .grow import GrowParser diff --git a/moldocker/utils/parser/grow.py b/moldocker/utils/parser/grow.py deleted file mode 100644 index 162f3dc..0000000 --- a/moldocker/utils/parser/grow.py +++ /dev/null @@ -1,42 +0,0 @@ -from .base import Parser -from moldocker import mcarlo, fitness - - -class GrowParser(Parser): - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - self.mcarlo_opts = self.get_mcarlo_parsers() - self.fitness_opts = self.get_fitness_parsers() - - def get_fitness_parsers(self): - parsers = self.get_module_parsers(fitness) - self.parser.add_argument( - "-f", - "--fitness", - type=str, - help="fitness function to be used", - choices=list(parsers.keys()), - ) - return parsers - - def get_mcarlo_parsers(self): - parsers = self.get_module_parsers(mcarlo) - self.parser.add_argument( - "-m", - "--mcarlo", - type=str, - help="Monte Carlo utility to be used", - choices=list(parsers.keys()), - ) - return parsers - - def add_extra_main_kwargs(self): - pass - - def get_parent_parsers(self, options): - parent_parsers = [ - self.parser, - self.mcarlo_opts[options.mcarlo], - ] - - return parent_parsers diff --git a/moldocker/utils/parser/tests/test_grow.py b/moldocker/utils/parser/tests/test_grow.py deleted file mode 100644 index 7949bb9..0000000 --- a/moldocker/utils/parser/tests/test_grow.py +++ /dev/null @@ -1,24 +0,0 @@ -import numpy as np -import unittest as ut - -from moldocker.utils.parser import GrowParser - - -class TestParser(ut.TestCase): - def setUp(self): - self.parser = GrowParser() - - def test_parse(self): - args = [ - "../../tests/files/AFI.cif", - "../../tests/files/molecule.xyz", - "--mcarlo", - "grower", - ] - - parsed = self.parser.parse_args(args) - self.assertEqual(parsed.mcarlo, "grower") - - -if __name__ == "__main__": - ut.main()