def compare_energy_components(rest_system, other_system, positions, platform=REFERENCE_PLATFORM): """ Get energy components of a given system """ platform = configure_platform(platform) # Create thermodynamic state and sampler state for non-rest system thermostate_other = ThermodynamicState(system=other_system, temperature=temperature) # Create context for non-rest system integrator_other = openmm.VerletIntegrator(1.0 * unit.femtosecond) context_other = thermostate_other.create_context(integrator_other) context_other.setPositions(positions) # Get energy components for non-rest system components_other = [ component[1] for component in compute_potential_components(context_other, beta=beta) ] # Create thermodynamic state for rest_system thermostate_rest = ThermodynamicState(system=rest_system, temperature=temperature) # Create context forrest system integrator_rest = openmm.VerletIntegrator(1.0 * unit.femtosecond) context_rest = thermostate_rest.create_context(integrator_rest) context_rest.setPositions(positions) # Get energy components for rest system components_rest = [ component[1] for component in compute_potential_components(context_rest, beta=beta) ] # Check that bond, angle, and torsion energies match for other, rest in zip(components_other[:3], components_rest[:3]): assert np.isclose( [other], [rest] ), f"The energies do not match for the {other[0]}: {other[1]} (other system) vs. {rest[1]} (REST system)" # Check that nonbonded energies match print(components_rest) nonbonded_other = np.array(components_other[3:]).sum() nonbonded_rest = np.array(components_rest[3:]).sum() assert np.isclose( [nonbonded_other], [nonbonded_rest] ), f"The energies do not match for the NonbondedForce: {nonbonded_other} (other system) vs. {nonbonded_rest} (REST system)"
def test_mutate_quick(): """ Abbreviated version of test_mutate_all for travis. """ import perses.rjmc.topology_proposal as topology_proposal import perses.rjmc.geometry as geometry from perses.tests.utils import compute_potential_components from openmmtools import testsystems as ts geometry_engine = geometry.FFAllAngleGeometryEngine() aminos = ['ALA','VAL','GLY','PHE','PRO','TRP'] for aa in aminos: topology, positions = _get_capped_amino_acid(amino_acid=aa) modeller = app.Modeller(topology, positions) ff_filename = "amber99sbildn.xml" max_point_mutants = 1 ff = app.ForceField(ff_filename) system = ff.createSystem(modeller.topology) chain_id = '1' system_generator = topology_proposal.SystemGenerator([ff_filename]) pm_top_engine = topology_proposal.PointMutationEngine(modeller.topology, system_generator, chain_id, max_point_mutants=max_point_mutants) current_system = system current_topology = modeller.topology current_positions = modeller.positions minimize_integrator = openmm.VerletIntegrator(1.0*unit.femtosecond) platform = openmm.Platform.getPlatformByName("Reference") minimize_context = openmm.Context(current_system, minimize_integrator, platform) minimize_context.setPositions(current_positions) initial_state = minimize_context.getState(getEnergy=True) initial_potential = initial_state.getPotentialEnergy() openmm.LocalEnergyMinimizer.minimize(minimize_context) final_state = minimize_context.getState(getEnergy=True, getPositions=True) final_potential = final_state.getPotentialEnergy() current_positions = final_state.getPositions() print("Minimized initial structure from %s to %s" % (str(initial_potential), str(final_potential))) for k, proposed_amino in enumerate(aminos): pm_top_engine._allowed_mutations = [[('2',proposed_amino)]] pm_top_proposal = pm_top_engine.propose(current_system, current_topology) new_positions, logp = geometry_engine.propose(pm_top_proposal, current_positions, beta) new_system = pm_top_proposal.new_system if np.isnan(logp): raise Exception("NaN in the logp") integrator = openmm.VerletIntegrator(1*unit.femtoseconds) platform = openmm.Platform.getPlatformByName("Reference") context = openmm.Context(new_system, integrator, platform) context.setPositions(new_positions) state = context.getState(getEnergy=True) print(compute_potential_components(context)) potential = state.getPotentialEnergy() potential_without_units = potential / potential.unit print(str(potential)) if np.isnan(potential_without_units): raise Exception("Energy after proposal is NaN")
def test_mutate_quick(): """ Abbreviated version of test_mutate_all for travis. """ import perses.rjmc.topology_proposal as topology_proposal import perses.rjmc.geometry as geometry from perses.tests.utils import compute_potential_components from openmmtools import testsystems as ts geometry_engine = geometry.FFAllAngleGeometryEngine() aminos = ['ALA','VAL','GLY','PHE','PRO','TRP'] for aa in aminos: topology, positions = _get_capped_amino_acid(amino_acid=aa) modeller = app.Modeller(topology, positions) ff_filename = "amber99sbildn.xml" max_point_mutants = 1 ff = app.ForceField(ff_filename) system = ff.createSystem(modeller.topology) chain_id = '1' system_generator = topology_proposal.SystemGenerator([ff_filename]) pm_top_engine = topology_proposal.PointMutationEngine(modeller.topology, system_generator, chain_id, max_point_mutants=max_point_mutants) current_system = system current_topology = modeller.topology current_positions = modeller.positions minimize_integrator = openmm.VerletIntegrator(1.0*unit.femtosecond) platform = openmm.Platform.getPlatformByName("Reference") minimize_context = openmm.Context(current_system, minimize_integrator, platform) minimize_context.setPositions(current_positions) initial_state = minimize_context.getState(getEnergy=True) initial_potential = initial_state.getPotentialEnergy() openmm.LocalEnergyMinimizer.minimize(minimize_context) final_state = minimize_context.getState(getEnergy=True, getPositions=True) final_potential = final_state.getPotentialEnergy() current_positions = final_state.getPositions() print("Minimized initial structure from %s to %s" % (str(initial_potential), str(final_potential))) for k, proposed_amino in enumerate(aminos): pm_top_engine._allowed_mutations = [[('2',proposed_amino)]] pm_top_proposal = pm_top_engine.propose(current_system, current_topology) new_positions, logp = geometry_engine.propose(pm_top_proposal, current_positions, beta) new_system = pm_top_proposal.new_system if np.isnan(logp): raise Exception("NaN in the logp") integrator = openmm.VerletIntegrator(1*unit.femtoseconds) platform = openmm.Platform.getPlatformByName("Reference") context = openmm.Context(new_system, integrator, platform) context.setPositions(new_positions) state = context.getState(getEnergy=True) print(compute_potential_components(context)) potential = state.getPotentialEnergy() potential_without_units = potential / potential.unit print(str(potential)) if np.isnan(potential_without_units): raise Exception("Energy after proposal is NaN")
def test_run_geometry_engine(index=0): """ Run the geometry engine a few times to make sure that it actually runs without exceptions. Convert n-pentane to 2-methylpentane """ import logging logging.basicConfig(level=logging.DEBUG) import copy #molecule_name_1 = 'glycine' #molecule_name_2 = 'tryptophan' molecule_name_1 = 'erlotinib' molecule_name_2 = 'imatinib' molecule1 = generate_initial_molecule(molecule_name_1) molecule2 = generate_initial_molecule(molecule_name_2) new_to_old_atom_mapping = align_molecules(molecule1, molecule2) sys1, pos1, top1 = oemol_to_openmm_system(molecule1, molecule_name_1) sys2, pos2, top2 = oemol_to_openmm_system(molecule2, molecule_name_2) import perses.rjmc.geometry as geometry import perses.rjmc.topology_proposal as topology_proposal from perses.tests.utils import compute_potential_components sm_top_proposal = topology_proposal.TopologyProposal(new_topology=top2, new_system=sys2, old_topology=top1, old_system=sys1, old_chemical_state_key='',new_chemical_state_key='', logp_proposal=0.0, new_to_old_atom_map=new_to_old_atom_mapping, metadata={'test':0.0}) sm_top_proposal._beta = beta geometry_engine = geometry.FFAllAngleGeometryEngine({'test': 'true', 'reference_positions':pos2}) # Turn on PDB file writing. geometry_engine.write_proposal_pdb = True geometry_engine.pdb_filename_prefix = 'geometry-proposal' test_pdb_file = open("erlotinib_to_imatinib_0%d_0_nosterics.pdb" % index, 'w') valence_system = copy.deepcopy(sys2) valence_system.removeForce(3) valence_system.removeForce(3) integrator = openmm.VerletIntegrator(1*unit.femtoseconds) integrator_1 = openmm.VerletIntegrator(1*unit.femtoseconds) ctx_1 = openmm.Context(sys1, integrator_1) ctx_1.setPositions(pos1) ctx_1.setVelocitiesToTemperature(300*unit.kelvin) integrator_1.step(1000) pos1_new = ctx_1.getState(getPositions=True).getPositions(asNumpy=True) context = openmm.Context(sys2, integrator) context.setPositions(pos2) state = context.getState(getEnergy=True) print("Energy before proposal is: %s" % str(state.getPotentialEnergy())) openmm.LocalEnergyMinimizer.minimize(context) new_positions, logp_proposal = geometry_engine.propose(sm_top_proposal, pos1_new, beta) geometry_engine.logp_reverse(sm_top_proposal, new_positions, pos1, beta) app.PDBFile.writeFile(top2, new_positions, file=test_pdb_file) test_pdb_file.close() context.setPositions(new_positions) state2 = context.getState(getEnergy=True) print("Energy after proposal is: %s" %str(state2.getPotentialEnergy())) print(compute_potential_components(context)) valence_integrator = openmm.VerletIntegrator(1*unit.femtoseconds) platform = openmm.Platform.getPlatformByName("Reference") valence_ctx = openmm.Context(valence_system, valence_integrator, platform) valence_ctx.setPositions(new_positions) vstate = valence_ctx.getState(getEnergy=True) print("Valence energy after proposal is %s " % str(vstate.getPotentialEnergy())) final_potential = state2.getPotentialEnergy() return final_potential / final_potential.unit
def test_mutate_from_all_to_all(): """ Make sure mutations are successful between every possible pair of before-and-after residues Mutate Ecoli F-ATPase alpha subunit to all 20 amino acids (test going FROM all possibilities) Mutate each residue to all 19 alternatives """ import perses.rjmc.topology_proposal as topology_proposal import perses.rjmc.geometry as geometry from perses.tests.utils import compute_potential_components from openmmtools import testsystems as ts geometry_engine = geometry.FFAllAngleGeometryEngine() aminos = ['ALA','ARG','ASN','ASP','CYS','GLN','GLU','GLY','HIS','ILE','LEU','LYS','MET','PHE','PRO','SER','THR','TRP','TYR','VAL'] for aa in aminos: topology, positions = _get_capped_amino_acid(amino_acid=aa) modeller = app.Modeller(topology, positions) ff_filename = "amber99sbildn.xml" max_point_mutants = 1 ff = app.ForceField(ff_filename) system = ff.createSystem(modeller.topology) chain_id = 'A' system_generator = topology_proposal.SystemGenerator([ff_filename]) pm_top_engine = topology_proposal.PointMutationEngine(system_generator, chain_id, max_point_mutants=max_point_mutants) current_system = system current_topology = modeller.topology current_positions = modeller.positions minimize_integrator = openmm.VerletIntegrator(1.0*unit.femtosecond) platform = openmm.Platform.getPlatformByName("Reference") minimize_context = openmm.Context(current_system, minimize_integrator, platform) minimize_context.setPositions(current_positions) initial_state = minimize_context.getState(getEnergy=True) initial_potential = initial_state.getPotentialEnergy() openmm.LocalEnergyMinimizer.minimize(minimize_context) final_state = minimize_context.getState(getEnergy=True, getPositions=True) final_potential = final_state.getPotentialEnergy() current_positions = final_state.getPositions() print("Minimized initial structure from %s to %s" % (str(initial_potential), str(final_potential))) for k, proposed_amino in enumerate(aminos): pm_top_engine._allowed_mutations = [[('2',proposed_amino)]] pm_top_proposal = pm_top_engine.propose(current_system, current_topology) new_positions, logp = geometry_engine.propose(pm_top_proposal, current_positions, beta) new_system = pm_top_proposal.new_system if np.isnan(logp): raise Exception("NaN in the logp") integrator = openmm.VerletIntegrator(1*unit.femtoseconds) platform = openmm.Platform.getPlatformByName("Reference") context = openmm.Context(new_system, integrator, platform) context.setPositions(new_positions) state = context.getState(getEnergy=True) print(compute_potential_components(context)) potential = state.getPotentialEnergy() potential_without_units = potential / potential.unit print(str(potential)) if np.isnan(potential_without_units): raise Exception("Energy after proposal is NaN")
def test_run_geometry_engine(index=0): """ Run the geometry engine a few times to make sure that it actually runs without exceptions. Convert n-pentane to 2-methylpentane """ import logging logging.basicConfig(level=logging.DEBUG) import copy molecule_name_1 = 'benzene' molecule_name_2 = 'biphenyl' #molecule_name_1 = 'imatinib' #molecule_name_2 = 'erlotinib' molecule1 = generate_initial_molecule(molecule_name_1) molecule2 = generate_initial_molecule(molecule_name_2) new_to_old_atom_mapping = align_molecules(molecule1, molecule2) sys1, pos1, top1 = oemol_to_openmm_system(molecule1, molecule_name_1) sys2, pos2, top2 = oemol_to_openmm_system(molecule2, molecule_name_2) import perses.rjmc.geometry as geometry import perses.rjmc.topology_proposal as topology_proposal from perses.tests.utils import compute_potential_components sm_top_proposal = topology_proposal.TopologyProposal(new_topology=top2, new_system=sys2, old_topology=top1, old_system=sys1, old_chemical_state_key='',new_chemical_state_key='', logp_proposal=0.0, new_to_old_atom_map=new_to_old_atom_mapping, metadata={'test':0.0}) sm_top_proposal._beta = beta geometry_engine = geometry.FFAllAngleGeometryEngine(metadata={}) # Turn on PDB file writing. geometry_engine.write_proposal_pdb = True geometry_engine.pdb_filename_prefix = 't13geometry-proposal' test_pdb_file = open("%s_to_%s_%d.pdb" % (molecule_name_1, molecule_name_2, index), 'w') valence_system = copy.deepcopy(sys2) valence_system.removeForce(3) valence_system.removeForce(3) integrator = openmm.VerletIntegrator(1*unit.femtoseconds) integrator_1 = openmm.VerletIntegrator(1*unit.femtoseconds) ctx_1 = openmm.Context(sys1, integrator_1) ctx_1.setPositions(pos1) ctx_1.setVelocitiesToTemperature(300*unit.kelvin) integrator_1.step(1000) pos1_new = ctx_1.getState(getPositions=True).getPositions(asNumpy=True) context = openmm.Context(sys2, integrator) context.setPositions(pos2) state = context.getState(getEnergy=True) print("Energy before proposal is: %s" % str(state.getPotentialEnergy())) openmm.LocalEnergyMinimizer.minimize(context) new_positions, logp_proposal = geometry_engine.propose(sm_top_proposal, pos1_new, beta) logp_reverse = geometry_engine.logp_reverse(sm_top_proposal, new_positions, pos1, beta) print(logp_reverse) app.PDBFile.writeFile(top2, new_positions, file=test_pdb_file) test_pdb_file.close() context.setPositions(new_positions) state2 = context.getState(getEnergy=True) print("Energy after proposal is: %s" %str(state2.getPotentialEnergy())) print(compute_potential_components(context)) valence_integrator = openmm.VerletIntegrator(1*unit.femtoseconds) platform = openmm.Platform.getPlatformByName("Reference") valence_ctx = openmm.Context(valence_system, valence_integrator, platform) valence_ctx.setPositions(new_positions) vstate = valence_ctx.getState(getEnergy=True) print("Valence energy after proposal is %s " % str(vstate.getPotentialEnergy())) final_potential = state2.getPotentialEnergy() return final_potential / final_potential.unit
def test_mutate_from_all_to_all(): """ Make sure mutations are successful between every possible pair of before-and-after residues Mutate Ecoli F-ATPase alpha subunit to all 20 amino acids (test going FROM all possibilities) Mutate each residue to all 19 alternatives """ import perses.rjmc.topology_proposal as topology_proposal import perses.rjmc.geometry as geometry from perses.tests.utils import compute_potential_components from openmmtools import testsystems as ts geometry_engine = geometry.FFAllAngleGeometryEngine() aminos = ['ALA','ARG','ASN','ASP','CYS','GLN','GLU','GLY','HIS','ILE','LEU','LYS','MET','PHE','PRO','SER','THR','TRP','TYR','VAL'] for aa in aminos: topology, positions = _get_capped_amino_acid(amino_acid=aa) modeller = app.Modeller(topology, positions) ff_filename = "amber99sbildn.xml" max_point_mutants = 1 ff = app.ForceField(ff_filename) system = ff.createSystem(modeller.topology) chain_id = '1' system_generator = topology_proposal.SystemGenerator([ff_filename]) pm_top_engine = topology_proposal.PointMutationEngine(modeller.topology, system_generator, chain_id, max_point_mutants=max_point_mutants) current_system = system current_topology = modeller.topology current_positions = modeller.positions minimize_integrator = openmm.VerletIntegrator(1.0*unit.femtosecond) platform = openmm.Platform.getPlatformByName("Reference") minimize_context = openmm.Context(current_system, minimize_integrator, platform) minimize_context.setPositions(current_positions) initial_state = minimize_context.getState(getEnergy=True) initial_potential = initial_state.getPotentialEnergy() openmm.LocalEnergyMinimizer.minimize(minimize_context) final_state = minimize_context.getState(getEnergy=True, getPositions=True) final_potential = final_state.getPotentialEnergy() current_positions = final_state.getPositions() print("Minimized initial structure from %s to %s" % (str(initial_potential), str(final_potential))) for k, proposed_amino in enumerate(aminos): pm_top_engine._allowed_mutations = [[('2',proposed_amino)]] pm_top_proposal = pm_top_engine.propose(current_system, current_topology) new_positions, logp = geometry_engine.propose(pm_top_proposal, current_positions, beta) new_system = pm_top_proposal.new_system if np.isnan(logp): raise Exception("NaN in the logp") integrator = openmm.VerletIntegrator(1*unit.femtoseconds) platform = openmm.Platform.getPlatformByName("Reference") context = openmm.Context(new_system, integrator, platform) context.setPositions(new_positions) state = context.getState(getEnergy=True) print(compute_potential_components(context)) potential = state.getPotentialEnergy() potential_without_units = potential / potential.unit print(str(potential)) if np.isnan(potential_without_units): raise Exception("Energy after proposal is NaN")