choderalab / perses

Experiments with expanded ensembles to explore chemical space
http://perses.readthedocs.io
MIT License
179 stars 51 forks source link

Fixes for new openmmtools 0.23.0 #1203

Closed mikemhenry closed 1 year ago

mikemhenry commented 1 year ago

Description

Motivation and context

Resolves #???

How has this been tested?

Change log

mikemhenry commented 1 year ago

This should pull in the dev build for all tests, but will need to double check CI logs

codecov[bot] commented 1 year ago

Codecov Report

Merging #1203 (6afba88) into main (53c61b8) will decrease coverage by 2.71%. The diff coverage is 30.00%.

mikemhenry commented 1 year ago

Getting this error on a few runs:

=================================== FAILURES ===================================
______________________ test_relative_setup_charge_change _______________________
[gw0] linux -- Python 3.10.0 /home/runner/micromamba-root/envs/test/bin/python3.10

    def test_relative_setup_charge_change():
        """
        execute `RelativeFEPSetup` in solvent/complex phase on a charge change and assert that the modified new system and old system charge difference is zero.
        also assert endstate validation.
        """
        from perses.app.relative_setup import RelativeFEPSetup
        import numpy as np
        # Setup directory
        ligand_sdf = resource_filename("perses", "data/bace-example/Bace_ligands_shifted.sdf")
        host_pdb = resource_filename("perses", "data/bace-example/Bace_protein.pdb")

>       setup = RelativeFEPSetup(
                     ligand_input = ligand_sdf,
                     old_ligand_index=0,
                     new_ligand_index=12,
                     forcefield_files = ['amber/ff14SB.xml','amber/tip3p_standard.xml','amber/tip3p_HFE_multivalent.xml'],
                     phases = ['solvent', 'vacuum'],
                     protein_pdb_filename=host_pdb,
                     receptor_mol2_filename=None,
                     pressure=1.0 * unit.atmosphere,
                     temperature=300.0 * unit.kelvin,
                     solvent_padding=9.0 * unit.angstroms,
                     ionic_strength=0.15 * unit.molar,
                     hmass=4*unit.amus,
                     neglect_angles=False,
                     map_strength='default',
                     atom_expr=None,
                     bond_expr=None,
                     anneal_14s=False,
                     small_molecule_forcefield='gaff-2.11',
                     small_molecule_parameters_cache=None,
                     trajectory_directory=None,
                     trajectory_prefix=None,
                     spectator_filenames=None,
                     nonbonded_method = 'PME',
                     complex_box_dimensions=None,
                     solvent_box_dimensions=None,
                     remove_constraints=False,
                     use_given_geometries = False
                     )

perses/tests/test_relative_setup.py:315: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
perses/app/relative_setup.py:477: in __init__
    self._solvent_topology_proposal = self._proposal_engine.propose(self._ligand_system_old_solvated,
perses/rjmc/topology_proposal.py:2094: in propose
    new_system = self._system_generator.create_system(new_topology)
../../../micromamba-root/envs/test/lib/python3.10/site-packages/openmmforcefields/generators/system_generators.py:327: in create_system
    system = self.forcefield.createSystem(topology, **forcefield_kwargs)
../../../micromamba-root/envs/test/lib/python3.10/site-packages/openmm/app/forcefield.py:1212: in createSystem
    templateForResidue = self._matchAllResiduesToTemplates(data, topology, residueTemplates, ignoreExternalBonds)
../../../micromamba-root/envs/test/lib/python3.10/site-packages/openmm/app/forcefield.py:1417: in _matchAllResiduesToTemplates
    if generator(self, res):
../../../micromamba-root/envs/test/lib/python3.10/site-packages/openmmforcefields/generators/template_generators.py:547: in generator
    return super().generator(forcefield, residue)
../../../micromamba-root/envs/test/lib/python3.10/site-packages/openmmforcefields/generators/template_generators.py:323: in generator
    forcefield.loadFile(StringIO(ffxml_contents))
../../../micromamba-root/envs/test/lib/python3.10/site-packages/openmm/app/forcefield.py:288: in loadFile
    self.registerAtomType(type.attrib)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <openmm.app.forcefield.ForceField object at 0x7f5de10af640>
parameters = {'class': 'c5', 'element': 'C', 'mass': '12.01', 'name': 'c5'}

    def registerAtomType(self, parameters):
        """Register a new atom type."""
        name = parameters['name']
        if name in self._atomTypes:
>           raise ValueError('Found multiple definitions for atom type: '+name)
E           ValueError: Found multiple definitions for atom type: c5

../../../micromamba-root/envs/test/lib/python3.10/site-packages/openmm/app/forcefield.py:433: ValueError
jchodera commented 1 year ago

I can reproduce this error locally with openmmforcefields test tests/test_system_generator.py::TestSystemGenerator::test_add_molecules, and am debugging now.

____________________________________________________________________________________________________________________ TestSystemGenerator.test_add_molecules _____________________________________________________________________________________________________________________

self = <openmmforcefields.tests.test_system_generator.TestSystemGenerator testMethod=test_add_molecules>

    def test_add_molecules(self):
        """Test that Molecules can be added to SystemGenerator later"""
        SMALL_MOLECULE_FORCEFIELDS = SystemGenerator.SMALL_MOLECULE_FORCEFIELDS if not CI else ['gaff-2.11', 'openff-2.0.0', 'espaloma-0.2.2']
        for small_molecule_forcefield in SMALL_MOLECULE_FORCEFIELDS:
            # Create a SystemGenerator for this force field
            generator = SystemGenerator(forcefields=self.amber_forcefields,
                                            small_molecule_forcefield=small_molecule_forcefield)

            # Add molecules for each test system separately
            for name, testsystem in self.testsystems.items():
                molecules = testsystem['molecules']

                # Add molecules
                generator.add_molecules(molecules)

                # Parameterize molecules
                for molecule in molecules:
                    openmm_topology = molecule.to_topology().to_openmm()
                    with Timer() as t1:
>                       system = generator.create_system(openmm_topology)

tests/test_system_generator.py:329: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
generators/system_generators.py:332: in create_system
    system = self.forcefield.createSystem(topology, **forcefield_kwargs)
../../../../micromamba/envs/openmmforcefields/lib/python3.10/site-packages/openmm/app/forcefield.py:1218: in createSystem
    templateForResidue = self._matchAllResiduesToTemplates(data, topology, residueTemplates, ignoreExternalBonds)
../../../../micromamba/envs/openmmforcefields/lib/python3.10/site-packages/openmm/app/forcefield.py:1423: in _matchAllResiduesToTemplates
    if generator(self, res):
generators/template_generators.py:551: in generator
    return super().generator(forcefield, residue)
generators/template_generators.py:324: in generator
    forcefield.loadFile(StringIO(ffxml_contents))
../../../../micromamba/envs/openmmforcefields/lib/python3.10/site-packages/openmm/app/forcefield.py:288: in loadFile
    self.registerAtomType(type.attrib)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <openmm.app.forcefield.ForceField object at 0x18800e500>, parameters = {'class': 'c5', 'element': 'C', 'mass': '12.01', 'name': 'c5'}

    def registerAtomType(self, parameters):
        """Register a new atom type."""
        name = parameters['name']
        if name in self._atomTypes:
>           raise ValueError('Found multiple definitions for atom type: '+name)
E           ValueError: Found multiple definitions for atom type: c5

../../../../micromamba/envs/openmmforcefields/lib/python3.10/site-packages/openmm/app/forcefield.py:437: ValueError
----------------------------------------------------------------------------------------------------------------------------- Captured stdout call ------------------------------------------------------------------------------------------------------------------------------
ijpulidos commented 1 year ago

I think the best approach to move forward with the release is to just force for now ambertools < 23 on the ~perses~ openmmforcefields conda package, until the problem gets handled upstream.