units.angstroms) complex_coordinates[1, 0] = 10.0 * units.angstroms # Create temporary directory for testing. import tempfile output_directory = tempfile.mkdtemp() # Initialize YANK object. from yank import Yank yank = Yank(receptor=receptor_system, ligand=ligand_system, complex_coordinates=[complex_coordinates], output_directory=output_directory) yank.solvent_protocol = yank.vacuum_protocol yank.complex_protocol = yank.vacuum_protocol yank.restraint_type = 'flat-bottom' yank.temperature = temperature yank.niterations = 100 yank.platform = openmm.Platform.getPlatformByName("Reference") # Run the simulation. yank.run() # # Analyze the data. # results = yank.analyze() # TODO: Check results against analytical results.
import simtk.unit as units complex_coordinates = units.Quantity(numpy.zeros([2,3], numpy.float64), units.angstroms) complex_coordinates[1,0] = 10.0 * units.angstroms # Create temporary directory for testing. import tempfile output_directory = tempfile.mkdtemp() # Initialize YANK object. from yank import Yank yank = Yank(receptor=receptor_system, ligand=ligand_system, complex_coordinates=[complex_coordinates], output_directory=output_directory) yank.solvent_protocol = yank.vacuum_protocol yank.complex_protocol = yank.vacuum_protocol yank.restraint_type = 'flat-bottom' yank.temperature = temperature yank.niterations = 100 yank.platform = openmm.Platform.getPlatformByName("Reference") # Run the simulation. yank.run() # # Analyze the data. # results = yank.analyze() # TODO: Check results against analytical results.
def notest_LennardJonesPair(box_width_nsigma=6.0): """ Compute binding free energy of two Lennard-Jones particles and compare to numerical result. Parameters ---------- box_width_nsigma : float, optional, default=6.0 Box width is set to this multiple of Lennard-Jones sigma. """ NSIGMA_MAX = 6.0 # number of standard errors tolerated for success # Create Lennard-Jones pair. thermodynamic_state = ThermodynamicState(temperature=300.0*unit.kelvin) kT = kB * thermodynamic_state.temperature sigma = 3.5 * unit.angstroms epsilon = 6.0 * kT test = testsystems.LennardJonesPair(sigma=sigma, epsilon=epsilon) system, positions = test.system, test.positions binding_free_energy = test.get_binding_free_energy(thermodynamic_state) # Create temporary directory for testing. import tempfile store_dir = tempfile.mkdtemp() # Initialize YANK object. options = dict() options['restraint_type'] = None options['number_of_iterations'] = 10 options['platform'] = openmm.Platform.getPlatformByName("Reference") # use Reference platform for speed options['mc_rotation'] = False options['mc_displacement'] = True options['mc_displacement_sigma'] = 1.0 * unit.nanometer options['timestep'] = 2 * unit.femtoseconds options['nsteps_per_iteration'] = 50 # Override receptor mass to keep it stationary. #system.setParticleMass(0, 0) # Override box vectors. box_edge = 6*sigma a = unit.Quantity((box_edge, 0 * unit.angstrom, 0 * unit.angstrom)) b = unit.Quantity((0 * unit.angstrom, box_edge, 0 * unit.angstrom)) c = unit.Quantity((0 * unit.angstrom, 0 * unit.angstrom, box_edge)) system.setDefaultPeriodicBoxVectors(a, b, c) # Override positions positions[0,:] = box_edge/2 positions[1,:] = box_edge/4 phase = 'complex-explicit' # Alchemical protocol. from yank.alchemy import AlchemicalState alchemical_states = list() lambda_values = [0.0, 0.25, 0.50, 0.75, 1.0] for lambda_value in lambda_values: alchemical_state = AlchemicalState() alchemical_state['lambda_electrostatics'] = lambda_value alchemical_state['lambda_sterics'] = lambda_value alchemical_states.append(alchemical_state) protocols = dict() protocols[phase] = alchemical_states # Create phases. systems = { phase : system } positions = { phase : positions } phases = [phase] atom_indices = { 'complex-explicit' : { 'ligand' : [1] } } # Create new simulation. yank = Yank(store_dir) yank.create(phases, systems, positions, atom_indices, thermodynamic_state, options=options, protocols=protocols) # Run the simulation. yank.run() # Analyze the data. results = yank.analyze() standard_state_correction = results[phase]['standard_state_correction'] Delta_f = results[phase]['Delta_f_ij'][0,1] - standard_state_correction dDelta_f = results[phase]['dDelta_f_ij'][0,1] nsigma = abs(binding_free_energy/kT - Delta_f) / dDelta_f # Check results against analytical results. # TODO: Incorporate standard state correction output = "\n" output += "Analytical binding free energy : %10.5f +- %10.5f kT\n" % (binding_free_energy / kT, 0) output += "Computed binding free energy (with standard state correction) : %10.5f +- %10.5f kT (nsigma = %3.1f)\n" % (Delta_f, dDelta_f, nsigma) output += "Computed binding free energy (without standard state correction): %10.5f +- %10.5f kT (nsigma = %3.1f)\n" % (Delta_f + standard_state_correction, dDelta_f, nsigma) output += "Standard state correction alone : %10.5f kT\n" % (standard_state_correction) print output #if (nsigma > NSIGMA_MAX): # output += "\n" # output += "Computed binding free energy differs from true binding free energy.\n" # raise Exception(output) return [Delta_f, dDelta_f]
def notest_LennardJonesPair(box_width_nsigma=6.0): """ Compute binding free energy of two Lennard-Jones particles and compare to numerical result. Parameters ---------- box_width_nsigma : float, optional, default=6.0 Box width is set to this multiple of Lennard-Jones sigma. """ NSIGMA_MAX = 6.0 # number of standard errors tolerated for success # Create Lennard-Jones pair. thermodynamic_state = ThermodynamicState(temperature=300.0 * unit.kelvin) kT = kB * thermodynamic_state.temperature sigma = 3.5 * unit.angstroms epsilon = 6.0 * kT test = testsystems.LennardJonesPair(sigma=sigma, epsilon=epsilon) system, positions = test.system, test.positions binding_free_energy = test.get_binding_free_energy(thermodynamic_state) # Create temporary directory for testing. import tempfile store_dir = tempfile.mkdtemp() # Initialize YANK object. options = dict() options['restraint_type'] = None options['number_of_iterations'] = 10 options['platform'] = openmm.Platform.getPlatformByName( "Reference") # use Reference platform for speed options['mc_rotation'] = False options['mc_displacement'] = True options['mc_displacement_sigma'] = 1.0 * unit.nanometer options['timestep'] = 2 * unit.femtoseconds options['nsteps_per_iteration'] = 50 # Override receptor mass to keep it stationary. #system.setParticleMass(0, 0) # Override box vectors. box_edge = 6 * sigma a = unit.Quantity((box_edge, 0 * unit.angstrom, 0 * unit.angstrom)) b = unit.Quantity((0 * unit.angstrom, box_edge, 0 * unit.angstrom)) c = unit.Quantity((0 * unit.angstrom, 0 * unit.angstrom, box_edge)) system.setDefaultPeriodicBoxVectors(a, b, c) # Override positions positions[0, :] = box_edge / 2 positions[1, :] = box_edge / 4 phase = 'complex-explicit' # Alchemical protocol. from yank.alchemy import AlchemicalState alchemical_states = list() lambda_values = [0.0, 0.25, 0.50, 0.75, 1.0] for lambda_value in lambda_values: alchemical_state = AlchemicalState() alchemical_state['lambda_electrostatics'] = lambda_value alchemical_state['lambda_sterics'] = lambda_value alchemical_states.append(alchemical_state) protocols = dict() protocols[phase] = alchemical_states # Create phases. systems = {phase: system} positions = {phase: positions} phases = [phase] atom_indices = {'complex-explicit': {'ligand': [1]}} # Create new simulation. yank = Yank(store_dir, **options) yank.create(phases, systems, positions, atom_indices, thermodynamic_state, protocols=protocols) # Run the simulation. yank.run() # Analyze the data. results = yank.analyze() standard_state_correction = results[phase]['standard_state_correction'] Delta_f = results[phase]['Delta_f_ij'][0, 1] - standard_state_correction dDelta_f = results[phase]['dDelta_f_ij'][0, 1] nsigma = abs(binding_free_energy / kT - Delta_f) / dDelta_f # Check results against analytical results. # TODO: Incorporate standard state correction output = "\n" output += "Analytical binding free energy : %10.5f +- %10.5f kT\n" % ( binding_free_energy / kT, 0) output += "Computed binding free energy (with standard state correction) : %10.5f +- %10.5f kT (nsigma = %3.1f)\n" % ( Delta_f, dDelta_f, nsigma) output += "Computed binding free energy (without standard state correction): %10.5f +- %10.5f kT (nsigma = %3.1f)\n" % ( Delta_f + standard_state_correction, dDelta_f, nsigma) output += "Standard state correction alone : %10.5f kT\n" % ( standard_state_correction) print output #if (nsigma > NSIGMA_MAX): # output += "\n" # output += "Computed binding free energy differs from true binding free energy.\n" # raise Exception(output) return [Delta_f, dDelta_f]