def test_gmx_tip4p(): mol = Topology.open(cwd + '/../topology/files/TIP3P.zmat').molecules[0] ff = ForceField.open(cwd + '/../forcefield/files/TIP4P.zfp') mol.generate_virtual_sites(ff) mol.assign_charge_from_ff(ff) top = Topology([mol], numbers=[100], cell=UnitCell([3, 3, 3])) top.set_positions(Topology.open(cwd + '/files/100-TIP4P.pdb').positions) system = System(top, ff) tmpgro = os.path.join(tmpdir, 'conf-vsite.gro') tmptop = os.path.join(tmpdir, 'topol-vsite.top') tmpmdp = os.path.join(tmpdir, 'grompp-vsite.mdp') system.export_gromacs(gro_out=tmpgro, top_out=tmptop, mdp_out=tmpmdp) assert filecmp.cmp(tmpgro, cwd + '/files/baselines/conf-vsite.gro') assert filecmp.cmp(tmptop, cwd + '/files/baselines/topol-vsite.top') assert filecmp.cmp(tmpmdp, cwd + '/files/baselines/grompp-vsite.mdp')
def test_tip4p(): mol = Topology.open(cwd + '/../topology/files/TIP3P.zmat').molecules[0] ff = ForceField.open(cwd + '/../forcefield/files/TIP4P.zfp') mol.generate_virtual_sites(ff) mol.assign_charge_from_ff(ff) top = Topology([mol], numbers=[100], cell=UnitCell([3, 3, 3])) top.set_positions(Topology.open(cwd + '/files/100-TIP4P.pdb').positions) system = System(top, ff) context = mm.Context(system.to_omm_system(), *get_omm_integrator_platform()) context.setPositions(top.positions) print_energy_terms(context) pe = context.getState(getEnergy=True).getPotentialEnergy().value_in_unit(kJ_mol) assert pytest.approx(pe, rel=0.001) == 383.796 # results of GROMACS
if args.packmol: top.update_molecules(list(mol_count.keys())) top.scale_with_packmol(list(mol_count.values())) sys.exit(0) logger.info('Exporting ...') top.update_molecules(list(mol_count.keys()), list(mol_count.values())) if args.trj is None: logger.warning('Trajectory file not provided. ' 'Will use positions and cell from the topology') else: _positions_set = False if len(frame.positions) == top.n_atom: top.set_positions(frame.positions) _positions_set = True elif ff.is_polarizable or ff.has_virtual_site: atoms_real = [atom for atom in top.atoms if not atom.is_drude and atom.virtual_site is None] if len(frame.positions) == len(atoms_real): for i, atom in enumerate(atoms_real): atom.position = frame.positions[i][:] np.random.seed(1) for parent, drude in top.get_drude_pairs(): drude.position = parent.position + (np.random.random(3) - 0.5) / 100 for parent, vsite in top.get_virtual_site_pairs(): vsite.position = vsite.virtual_site.calc_position() _positions_set = True if not _positions_set: logger.error(