def test_gb1_energy(self): # HCT (uses mbondi radii internally) """ Compare OpenMM and CHARMM GB (igb=1) energies """ parm = charmm_gas system = parm.createSystem(param22, implicitSolvent=app.HCT) self.assertEqual(parm.combining_rule, 'lorentz') integrator = mm.VerletIntegrator(1.0*u.femtoseconds) sim = app.Simulation(parm.topology, system, integrator, platform=CPU) sim.context.setPositions(charmm_gas_crds.positions) energies = energy_decomposition(parm, sim.context) self.assertAlmostEqual(energies['bond'], 1.3351, places=3) self.assertAlmostEqual(energies['angle'], 14.1158, places=3) self.assertAlmostEqual(energies['urey_bradley'], 0.3669, places=3) self.assertAlmostEqual(energies['dihedral'], 14.2773, places=3) self.assertAlmostEqual(energies['improper'], 0.3344, places=3) self.assertAlmostEqual(energies['cmap'], -0.5239, places=3) self.assertRelativeEqual(energies['nonbonded'], -102.1598379, places=5) system = parm.createSystem(param22, implicitSolvent=app.HCT, implicitSolventSaltConc=1.0*u.molar) integrator = mm.VerletIntegrator(1.0*u.femtoseconds) sim = app.Simulation(parm.topology, system, integrator, platform=CPU) sim.context.setPositions(charmm_gas_crds.positions) energies = energy_decomposition(parm, sim.context) self.assertAlmostEqual(energies['bond'], 1.3351, places=3) self.assertAlmostEqual(energies['angle'], 14.1158, places=3) self.assertAlmostEqual(energies['urey_bradley'], 0.3669, places=3) self.assertAlmostEqual(energies['dihedral'], 14.2773, places=3) self.assertAlmostEqual(energies['improper'], 0.3344, places=3) self.assertAlmostEqual(energies['cmap'], -0.5239, places=3) self.assertRelativeEqual(energies['nonbonded'], -102.5012873, places=5)
def test_progress_reporter(self): """ Test ProgressReporter with various options """ self.assertRaises(ValueError, lambda: ProgressReporter(sys.stdout, 1, 5)) system = self.amber_gas.createSystem() integrator = mm.LangevinIntegrator(300 * u.kelvin, 5.0 / u.picoseconds, 1.0 * u.femtoseconds) sim = app.Simulation(self.amber_gas.topology, system, integrator, platform=CPU) sim.context.setPositions(self.amber_gas.positions) sim.reporters.append( ProgressReporter(self.get_fn('progress_reporter.dat', written=True), 10, 500, step=True, time=True, potentialEnergy=True, kineticEnergy=True, totalEnergy=True, temperature=True, volume=True, density=True, systemMass=None)) sim.step(500) self.assertEqual(len(os.listdir(self._temporary_directory.name)), 1) text = open(self.get_fn('progress_reporter.dat', written=True), 'r').read() self.assertTrue('Estimated time to completion' in text) self.assertTrue('Total Energy' in text) self.assertTrue('Potential Energy' in text) self.assertTrue('Kinetic Energy' in text) self.assertTrue('Temperature' in text)
def test_dispersion_correction(self): """ Compare OpenMM and CHARMM PME energies w/out vdW correction """ parm = charmm_nbfix system = parm.createSystem( param36, nonbondedMethod=app.PME, nonbondedCutoff=8 * u.angstroms, ) self.assertEqual(parm.combining_rule, 'lorentz') for force in system.getForces(): if isinstance(force, mm.NonbondedForce): force.setUseDispersionCorrection(False) elif isinstance(force, mm.CustomNonbondedForce): force.setUseLongRangeCorrection(False) integrator = mm.VerletIntegrator(1.0 * u.femtoseconds) sim = app.Simulation(parm.topology, system, integrator, platform=CPU) sim.context.setPositions(charmm_nbfix_crds.positions) energies = energy_decomposition(parm, sim.context) self.assertAlmostEqual(energies['bond'], 1.1324212, places=4) self.assertAlmostEqual(energies['angle'], 1.06880188, places=4) self.assertAlmostEqual(energies['urey_bradley'], 0.06142407, places=4) self.assertAlmostEqual(energies['dihedral'], 7.81143025, places=4) self.assertAlmostEqual(energies['improper'], 0, places=4) self.assertAlmostEqual(energies['cmap'], 0.126790, places=4) self.assertRelativeEqual(energies['nonbonded'], 6584.01821319, places=4)
def test_reporters_pbc(self): """ Test NetCDF and ASCII restart and trajectory reporters (w/ PBC) """ systemsolv = load_file(self.get_fn('ildn.solv.top'), xyz=self.get_fn('ildn.solv.gro')) system = systemsolv.createSystem(nonbondedMethod=app.PME, nonbondedCutoff=8 * u.angstroms) integrator = mm.LangevinIntegrator(300 * u.kelvin, 5.0 / u.picoseconds, 1.0 * u.femtoseconds) sim = app.Simulation(systemsolv.topology, system, integrator, CPU) sim.context.setPositions(systemsolv.positions) sim.reporters.extend([ NetCDFReporter(self.get_fn('traj.nc', written=True), 1, vels=True, frcs=True), MdcrdReporter(self.get_fn('traj.mdcrd', written=True), 1), RestartReporter(self.get_fn('restart.ncrst', written=True), 1, netcdf=True), RestartReporter(self.get_fn('restart.rst7', written=True), 1), StateDataReporter(self.get_fn('state.o', written=True), 1, volume=True, density=True, systemMass=1) ]) sim.step(5) for reporter in sim.reporters: reporter.finalize() ntraj = NetCDFTraj.open_old(self.get_fn('traj.nc', written=True)) atraj = AmberMdcrd(self.get_fn('traj.mdcrd', written=True), len(systemsolv.atoms), True, mode='r') nrst = NetCDFRestart.open_old( self.get_fn('restart.ncrst', written=True)) arst = AmberAsciiRestart(self.get_fn('restart.rst7', written=True), 'r') self.assertEqual(ntraj.frame, 5) self.assertEqual(atraj.frame, 5) self.assertTrue(ntraj.hasvels) self.assertTrue(ntraj.hasfrcs) for i in range(ntraj.frame): for x1, x2 in zip(ntraj.box[i], atraj.box[i]): self.assertAlmostEqual(x1, x2, places=3) self.assertEqual(len(nrst.box), 6) self.assertEqual(len(arst.box), 6) # Make sure the EnergyMinimizerReporter does not fail f = StringIO() rep = EnergyMinimizerReporter(f, volume=True) rep.report(sim) rep.finalize()
def test_gas_energy_conf_4(self): """ Compare Amber and OpenMM gas phase energies and forces (topology 4) """ parm = AmberParm(get_fn('ethanol_T0.prmtop'), get_fn('ethanol_T0.rst7')) self.assertEqual(parm.combining_rule, 'geometric') system = parm.createSystem() # Default, no cutoff integrator = mm.VerletIntegrator(1.0 * u.femtoseconds) sim = app.Simulation(parm.topology, system, integrator, platform=CPU) sim.context.setPositions(parm.positions) energies = energy_decomposition(parm, sim.context) #BOND = 0.0239 ANGLE = 0.0298 DIHED = 0.0093 #VDWAALS = 0.0000 EEL = 6.7526 HBOND = 0.0000 #1-4 VDW = 0.0492 1-4 EEL = -6.0430 RESTRAINT = 0.0000 # Compare OpenMM energies with the Amber energies (above) self.assertAlmostEqual(energies['bond'], 0.0239, places=4) self.assertAlmostEqual(energies['angle'], 0.0298, places=4) self.assertAlmostEqual(energies['dihedral'], 0.0093, places=4) self.assertRelativeEqual(energies['nonbonded'], 0.0000 + 6.7526 + 0.0492 - 6.0430, places=3) # Now test the forces to make sure that they are computed correctly in # the presence of extra points pstate = sim.context.getState(getForces=True) pf = pstate.getForces().value_in_unit(u.kilojoule_per_mole / u.nanometer) # gmx forces: # f[ 0]={ 1.73101e+02, 5.67250e+01, -4.02950e+01} # f[ 1]={-8.13704e+00, -1.79612e+01, 9.88537e+01} # f[ 2]={-2.83120e+01, 6.23352e+00, -5.47393e+00} # f[ 3]={-1.03312e+01, -1.00966e+01, -5.12129e+00} # f[ 4]={-1.69636e+02, 3.34850e+01, -1.73612e+02} # f[ 5]={ 4.19932e+00, -2.58283e+00, 1.29999e+02} # f[ 6]={ 3.02865e+01, -6.68331e+00, -2.99153e+01} # f[ 7]={ 1.00113e+02, -5.22480e+01, 4.80526e+01} # f[ 8]={-9.12828e+01, -6.87157e+00, -2.24877e+01} gf = [(1.73101e+02, 5.67250e+01, -4.02950e+01), (-8.13704e+00, -1.79612e+01, 9.88537e+01), (-2.83120e+01, 6.23352e+00, -5.47393e+00), (-1.03312e+01, -1.00966e+01, -5.12129e+00), (-1.69636e+02, 3.34850e+01, -1.73612e+02), (4.19932e+00, -2.58283e+00, 1.29999e+02), (3.02865e+01, -6.68331e+00, -2.99153e+01), (1.00113e+02, -5.22480e+01, 4.80526e+01), (-9.12828e+01, -6.87157e+00, -2.24877e+01)] for p, s in zip(pf, gf): for x1, x2 in zip(p, s): self.assertAlmostEqual(x1, x2, places=3)
def test_gas_energy(self): """ Compare OpenMM and CHARMM gas phase energies """ parm = charmm_gas system = parm.createSystem(param22) self.assertEqual(parm.combining_rule, 'lorentz') integrator = mm.VerletIntegrator(1.0*u.femtoseconds) sim = app.Simulation(parm.topology, system, integrator, platform=CPU) sim.context.setPositions(charmm_gas_crds.positions) energies = energy_decomposition(parm, sim.context) self.assertAlmostEqual(energies['bond'], 1.3351, places=4) self.assertAlmostEqual(energies['angle'], 14.1158, places=4) self.assertAlmostEqual(energies['urey_bradley'], 0.3669, places=4) self.assertAlmostEqual(energies['dihedral'], 14.2773, places=4) self.assertAlmostEqual(energies['improper'], 0.3344, places=4) self.assertAlmostEqual(energies['cmap'], -0.5239, places=4) self.assertRelativeEqual(energies['nonbonded'], 9.2210, places=4)
def test_nbfix(self): """ Test PME energies of systems with NBFIX modifications """ parm = charmm_nbfix system = parm.createSystem(param36, nonbondedMethod=app.PME, nonbondedCutoff=8*u.angstroms) self.assertEqual(parm.combining_rule, 'lorentz') integrator = mm.VerletIntegrator(1.0*u.femtoseconds) sim = app.Simulation(parm.topology, system, integrator, platform=Reference) sim.context.setPositions(charmm_nbfix_crds.positions) energies = energy_decomposition(parm, sim.context) self.assertAlmostEqual(energies['bond'], 1.1324212, places=4) self.assertAlmostEqual(energies['angle'], 1.06880188, places=4) self.assertAlmostEqual(energies['urey_bradley'], 0.06142407, places=4) self.assertAlmostEqual(energies['dihedral'], 7.81143025, places=4) self.assertAlmostEqual(energies['improper'], 0, places=4) self.assertAlmostEqual(energies['cmap'], 0.126790, places=4) self.assertRelativeEqual(energies['nonbonded'], 6514.283116, places=4)
def test_gas_energy_conf_3(self): """ Compare Amber and OpenMM gas phase energies and forces (topology 3) """ parm = AmberParm(get_fn('methanol_T0.prmtop'), get_fn('methanol_T0.rst7')) self.assertEqual(parm.combining_rule, 'geometric') system = parm.createSystem() # Default, no cutoff integrator = mm.VerletIntegrator(1.0 * u.femtoseconds) sim = app.Simulation(parm.topology, system, integrator, platform=CPU) sim.context.setPositions(parm.positions) energies = energy_decomposition(parm, sim.context) #BOND = 0.0224 ANGLE = 0.0469 DIHED = 0.0039 #VDWAALS = 0.0000 EEL = 0.0000 HBOND = 0.0000 #1-4 VDW = 0.0000 1-4 EEL = 3.3789 RESTRAINT = 0.0000 # Compare OpenMM energies with the Amber energies (above) self.assertAlmostEqual(energies['bond'], 0.0224, places=4) self.assertAlmostEqual(energies['angle'], 0.0469, places=4) self.assertAlmostEqual(energies['dihedral'], 0.0039, places=4) self.assertRelativeEqual(energies['nonbonded'], 3.3789, places=3) # Now test the forces to make sure that they are computed correctly in # the presence of extra points pstate = sim.context.getState(getForces=True) pf = pstate.getForces().value_in_unit(u.kilojoule_per_mole / u.nanometer) # gmx forces: # f[ 0]={ 2.19935e+01, 8.60143e+01, 1.77895e+02} # f[ 1]={ 5.25347e+01, 3.46119e+01, -9.73738e+01} # f[ 2]={ 1.76138e+01, -7.13778e+01, -1.08807e+00} # f[ 3]={-3.74994e+01, -5.39602e+01, -6.75679e+01} # f[ 4]={-8.35142e+01, -7.86616e+01, -1.60611e+02} # f[ 5]={ 2.88716e+01, 8.33735e+01, 1.48746e+02} gf = [(2.19935e+01, 8.60143e+01, 1.77895e+02), (5.25347e+01, 3.46119e+01, -9.73738e+01), (1.76138e+01, -7.13778e+01, -1.08807e+00), (-3.74994e+01, -5.39602e+01, -6.75679e+01), (-8.35142e+01, -7.86616e+01, -1.60611e+02), (2.88716e+01, 8.33735e+01, 1.48746e+02)] for p, s in zip(pf, gf): for x1, x2 in zip(p, s): self.assertAlmostEqual(x1, x2, places=3)
def test_gas_energy_conf_2(self): """ Compare Amber and OpenMM gas phase energies and forces (topology 2) """ parm = AmberParm(get_fn('hydrogen-peroxide_T0_2.prmtop'), get_fn('hydrogen-peroxide_T0_2.rst7')) self.assertEqual(parm.combining_rule, 'lorentz') system = parm.createSystem() # Default, no cutoff integrator = mm.VerletIntegrator(1.0 * u.femtoseconds) sim = app.Simulation(parm.topology, system, integrator, platform=CPU) sim.context.setPositions(parm.positions) energies = energy_decomposition(parm, sim.context) #BOND = 0.0319 ANGLE = 2.1690 DIHED = -2.7931 #VDWAALS = 0.0000 EEL = 0.0000 HBOND = 0.0000 #1-4 VDW = 0.0000 1-4 EEL = 0.0000 RESTRAINT = 0.0000 # Compare OpenMM energies with the Amber energies (above) self.assertAlmostEqual(energies['bond'], 0.0319, places=4) self.assertAlmostEqual(energies['angle'], 2.1690, places=4) self.assertAlmostEqual(energies['dihedral'], -2.7931, places=4) self.assertRelativeEqual(energies['nonbonded'], 0.0, places=3) # Now test the forces to make sure that they are computed correctly in # the presence of extra points pstate = sim.context.getState(getForces=True) pf = pstate.getForces().value_in_unit(u.kilojoule_per_mole / u.nanometer) # gmx forces: # f[ 0]={ 3.14357e+02, -5.90363e+02, 2.11410e+02} # f[ 1]={-3.14357e+02, 5.90363e+02, 2.11410e+02} # f[ 2]={ 2.70641e+02, 5.90363e+02, -2.11410e+02} # f[ 3]={-2.70641e+02, -5.90363e+02, -2.11410e+02} gf = [(3.14357e+02, -5.90363e+02, 2.11410e+02), (-3.14357e+02, 5.90363e+02, 2.11410e+02), (2.70641e+02, 5.90363e+02, -2.11410e+02), (-2.70641e+02, -5.90363e+02, -2.11410e+02)] for p, s in zip(pf, gf): for x1, x2 in zip(p, s): self.assertAlmostEqual(x1, x2, places=3)
def test_state_data_reporter(self): """ Test StateDataReporter with various options """ system = self.amber_gas.createSystem() integrator = mm.LangevinIntegrator(300 * u.kelvin, 5.0 / u.picoseconds, 1.0 * u.femtoseconds) sim = app.Simulation(self.amber_gas.topology, system, integrator, platform=CPU) sim.context.setPositions(self.amber_gas.positions) f = open(self.get_fn('akma5.dat', written=True), 'w') sim.reporters.extend([ StateDataReporter(self.get_fn('akma1.dat', written=True), 10), StateDataReporter(self.get_fn('akma2.dat', written=True), 10, time=False, potentialEnergy=False, kineticEnergy=False, totalEnergy=False, temperature=False), StateDataReporter(self.get_fn('akma3.dat', written=True), 10, volume=True, density=True), StateDataReporter(self.get_fn('akma4.dat', written=True), 10, separator='\t'), StateDataReporter(self.get_fn('units.dat', written=True), 10, volume=True, density=True, energyUnit=u.kilojoules_per_mole, volumeUnit=u.nanometers**3), StateDataReporter(f, 10) ]) sim.step(500) f.close() # Now open all of the reporters and check that the information in there # is what we expect it to be akma1 = open(self.get_fn('akma1.dat', written=True), 'r') akma2 = open(self.get_fn('akma2.dat', written=True), 'r') akma3 = open(self.get_fn('akma3.dat', written=True), 'r') akma4 = open(self.get_fn('akma4.dat', written=True), 'r') akma5 = open(self.get_fn('akma5.dat', written=True), 'r') units = open(self.get_fn('units.dat', written=True), 'r') # AKMA 1 first header = akma1.readline().strip()[1:].split(',') self.assertEqual(len(header), 6) for i, label in enumerate( ('Step', 'Time', 'Potential Energy', 'Kinetic Energy', 'Total Energy', 'Temperature')): self.assertTrue(label in header[i]) for i, line in enumerate(akma1): words = line.replace('\n', '').split(',') self.assertEqual(i * 10 + 10, int(words[0])) # step akma1.close() # AKMA 2 header = akma2.readline().strip()[1:].split(',') self.assertEqual(len(header), 1) self.assertTrue('Step' in header[0]) for i, line in enumerate(akma2): self.assertEqual(int(line.replace('\n', '').split(',')[0]), 10 * i + 10) akma2.close() # AKMA 3 -- save energies so we can compare to the file with different # units header = akma3.readline().strip()[1:].split(',') self.assertEqual(len(header), 8) for i, label in enumerate( ('Step', 'Time', 'Potential Energy', 'Kinetic Energy', 'Total Energy', 'Temperature', 'Box Volume', 'Density')): self.assertTrue(label in header[i]) akma_energies = [[0.0 for i in range(8)] for j in range(50)] for i, line in enumerate(akma3): words = line.replace('\n', '').split(',') akma_energies[i][0] = int(words[0]) for j in range(1, 8): akma_energies[i][j] = float(words[j]) akma3.close() # AKMA 4 -- tab delimiter header = akma4.readline().strip()[1:].split('\t') self.assertEqual(len(header), 6) for i, label in enumerate( ('Step', 'Time', 'Potential Energy', 'Kinetic Energy', 'Total Energy', 'Temperature')): self.assertTrue(label in header[i]) for i, line in enumerate(akma4): words = line.replace('\n', '').split('\t') self.assertEqual(i * 10 + 10, int(words[0])) # step akma4.close() # AKMA 5 -- write to open file handle header = akma5.readline().strip()[1:].split(',') self.assertEqual(len(header), 6) for i, label in enumerate( ('Step', 'Time', 'Potential Energy', 'Kinetic Energy', 'Total Energy', 'Temperature')): self.assertTrue(label in header[i]) for i, line in enumerate(akma5): words = line.replace('\n', '').split(',') self.assertEqual(i * 10 + 10, int(words[0])) # step akma5.close() # UNITS -- compare other units ene = u.kilojoule_per_mole.conversion_factor_to(u.kilocalorie_per_mole) volume = u.nanometers.conversion_factor_to(u.angstroms)**3 conversions = [1, 1, ene, ene, ene, 1, volume, 1] headers = units.readline().strip()[1:].split(',') self.assertEqual(len(headers), 8) for i, line in enumerate(units): words = line.replace('\n', '').split(',') self.assertEqual(int(words[0]), akma_energies[i][0]) for j in range(1, 8): self.assertAlmostEqual(float(words[j]) * conversions[j], akma_energies[i][j], places=5) units.close()
def test_reporters(self): """ Test NetCDF and ASCII restart and trajectory reporters (no PBC) """ with self.assertRaises(ValueError): NetCDFReporter(self.get_fn('blah', written=True), 1, crds=False) with self.assertRaises(ValueError): MdcrdReporter(self.get_fn('blah', written=True), 1, crds=False) with self.assertRaises(ValueError): MdcrdReporter(self.get_fn('blah', written=True), 1, crds=True, vels=True) system = self.amber_gas.createSystem() integrator = mm.LangevinIntegrator(300 * u.kelvin, 5.0 / u.picoseconds, 1.0 * u.femtoseconds) sim = app.Simulation(self.amber_gas.topology, system, integrator, platform=CPU) sim.context.setPositions(self.amber_gas.positions) sim.reporters.extend([ NetCDFReporter(self.get_fn('traj1.nc', written=True), 10), NetCDFReporter(self.get_fn('traj2.nc', written=True), 10, vels=True), NetCDFReporter(self.get_fn('traj3.nc', written=True), 10, frcs=True), NetCDFReporter(self.get_fn('traj4.nc', written=True), 10, vels=True, frcs=True), NetCDFReporter(self.get_fn('traj5.nc', written=True), 10, crds=False, vels=True), NetCDFReporter(self.get_fn('traj6.nc', written=True), 10, crds=False, frcs=True), NetCDFReporter(self.get_fn('traj7.nc', written=True), 10, crds=False, vels=True, frcs=True), MdcrdReporter(self.get_fn('traj1.mdcrd', written=True), 10), MdcrdReporter(self.get_fn('traj2.mdcrd', written=True), 10, crds=False, vels=True), MdcrdReporter(self.get_fn('traj3.mdcrd', written=True), 10, crds=False, frcs=True), RestartReporter(self.get_fn('restart.ncrst', written=True), 10, write_multiple=True, netcdf=True), RestartReporter(self.get_fn('restart.rst7', written=True), 10), ]) sim.step(500) for reporter in sim.reporters: reporter.finalize() self.assertEqual(len(os.listdir(self._temporary_directory.name)), 61) ntraj = [ NetCDFTraj.open_old(self.get_fn('traj1.nc', written=True)), NetCDFTraj.open_old(self.get_fn('traj2.nc', written=True)), NetCDFTraj.open_old(self.get_fn('traj3.nc', written=True)), NetCDFTraj.open_old(self.get_fn('traj4.nc', written=True)), NetCDFTraj.open_old(self.get_fn('traj5.nc', written=True)), NetCDFTraj.open_old(self.get_fn('traj6.nc', written=True)), NetCDFTraj.open_old(self.get_fn('traj7.nc', written=True)) ] atraj = [ AmberMdcrd(self.get_fn('traj1.mdcrd', written=True), self.amber_gas.ptr('natom'), hasbox=False, mode='r'), AmberMdcrd(self.get_fn('traj2.mdcrd', written=True), self.amber_gas.ptr('natom'), hasbox=False, mode='r'), AmberMdcrd(self.get_fn('traj3.mdcrd', written=True), self.amber_gas.ptr('natom'), hasbox=False, mode='r'), ] for traj in ntraj: self.assertEqual(traj.frame, 50) self.assertEqual(traj.Conventions, 'AMBER') self.assertEqual(traj.ConventionVersion, '1.0') self.assertEqual(traj.application, 'AmberTools') self.assertEqual(traj.program, 'ParmEd') self.assertFalse(traj.hasbox) self.assertTrue(ntraj[0].hascrds) self.assertFalse(ntraj[0].hasvels) self.assertFalse(ntraj[0].hasfrcs) self.assertTrue(ntraj[1].hascrds) self.assertTrue(ntraj[1].hasvels) self.assertFalse(ntraj[1].hasfrcs) self.assertTrue(ntraj[2].hascrds) self.assertFalse(ntraj[2].hasvels) self.assertTrue(ntraj[2].hasfrcs) self.assertTrue(ntraj[3].hascrds) self.assertTrue(ntraj[3].hasvels) self.assertTrue(ntraj[3].hasfrcs) self.assertFalse(ntraj[4].hascrds) self.assertTrue(ntraj[4].hasvels) self.assertFalse(ntraj[4].hasfrcs) self.assertFalse(ntraj[5].hascrds) self.assertFalse(ntraj[5].hasvels) self.assertTrue(ntraj[5].hasfrcs) self.assertFalse(ntraj[6].hascrds) self.assertTrue(ntraj[6].hasvels) self.assertTrue(ntraj[6].hasfrcs) for i in (0, 2, 3, 4, 5, 6): ntraj[i].close() # still need the 2nd for traj in atraj: traj.close() # Now test the NetCDF restart files fn = self.get_fn('restart.ncrst.%d', written=True) for i, j in enumerate(range(10, 501, 10)): ncrst = NetCDFRestart.open_old(fn % j) self.assertEqual(ncrst.coordinates.shape, (1, 25, 3)) self.assertEqual(ncrst.velocities.shape, (1, 25, 3)) np.testing.assert_allclose(ncrst.coordinates[0], ntraj[1].coordinates[i]) np.testing.assert_allclose(ncrst.velocities[0], ntraj[1].velocities[i], rtol=1e-6) # Now test the ASCII restart file f = AmberAsciiRestart(self.get_fn('restart.rst7', written=True), 'r') # Compare to ncrst and make sure it's the same data np.testing.assert_allclose(ncrst.coordinates, f.coordinates, atol=1e-3) np.testing.assert_allclose(ncrst.velocities, f.velocities, rtol=1e-3) # Make sure the EnergyMinimizerReporter does not fail f = StringIO() rep = EnergyMinimizerReporter(f) rep.report(sim, frame=10) rep.finalize()