def runEthyleneTest(dir, N): filename = dir.join('ethylene-test_%s' % N) print('Running %s...' % filename) # Set Simulation parameters temperature = 200 * unit.kelvin collision_rate = 1 / unit.picoseconds timestep = 1.0 * unit.femtoseconds n_steps = 20 nIter = 100 reportInterval = 5 alchemical_atoms = [2, 3, 4, 5, 6, 7] platform = openmm.Platform.getPlatformByName('CPU') context_cache = cache.ContextCache(platform) # Load a Parmed Structure for the Topology and create our openmm.Simulation structure_pdb = utils.get_data_filename( 'blues', 'tests/data/ethylene_structure.pdb') structure = parmed.load_file(structure_pdb) nc_reporter = NetCDF4Storage(filename + '_MD.nc', reportInterval) # Iniitialize our Move set rot_move = RandomLigandRotationMove(timestep=timestep, n_steps=n_steps, atom_subset=alchemical_atoms, context_cache=context_cache, reporters=[nc_reporter]) langevin_move = ReportLangevinDynamicsMove(timestep=timestep, collision_rate=collision_rate, n_steps=n_steps, reassign_velocities=True, context_cache=context_cache) # Load our OpenMM System and create Integrator system_xml = utils.get_data_filename('blues', 'tests/data/ethylene_system.xml') with open(system_xml, 'r') as infile: xml = infile.read() system = openmm.XmlSerializer.deserialize(xml) thermodynamic_state = ThermodynamicState(system=system, temperature=temperature) sampler_state = SamplerState( positions=structure.positions.in_units_of(unit.nanometers)) sampler = BLUESSampler(thermodynamic_state=thermodynamic_state, sampler_state=sampler_state, ncmc_move=rot_move, dynamics_move=langevin_move, topology=structure.topology) sampler.run(nIter) return filename
def get_states(): # Set Simulation parameters temperature = 200 * unit.kelvin collision_rate = 1 / unit.picoseconds timestep = 1.0 * unit.femtoseconds n_steps = 20 nIter = 100 alchemical_atoms = [2, 3, 4, 5, 6, 7] platform = openmm.Platform.getPlatformByName('CPU') context_cache = cache.ContextCache(platform) # Load a Parmed Structure for the Topology and create our openmm.Simulation structure_pdb = utils.get_data_filename( 'blues', 'tests/data/ethylene_structure.pdb') structure = parmed.load_file(structure_pdb) # Load our OpenMM System and create Integrator system_xml = utils.get_data_filename('blues', 'tests/data/ethylene_system.xml') with open(system_xml, 'r') as infile: xml = infile.read() system = openmm.XmlSerializer.deserialize(xml) thermodynamic_state = ThermodynamicState(system=system, temperature=temperature) sampler_state = SamplerState( positions=structure.positions.in_units_of(unit.nanometers)) alch_system = generateAlchSystem(thermodynamic_state.get_system(), alchemical_atoms) alch_state = alchemy.AlchemicalState.from_system(alch_system) alch_thermodynamic_state = ThermodynamicState( alch_system, thermodynamic_state.temperature) alch_thermodynamic_state = CompoundThermodynamicState( alch_thermodynamic_state, composable_states=[alch_state]) return structure, thermodynamic_state, alch_thermodynamic_state
def setup(self, n_states, temperature, storage_file, minimisation_steps=100, n_replicas=None, lambda_schedule=None, lambda_protocol=LambdaProtocol(), endstates=True): from perses.dispersed import feptasks hybrid_system = self._factory.hybrid_system positions = self._factory.hybrid_positions lambda_zero_alchemical_state = RelativeAlchemicalState.from_system( hybrid_system) thermostate = ThermodynamicState(hybrid_system, temperature=temperature) compound_thermodynamic_state = CompoundThermodynamicState( thermostate, composable_states=[lambda_zero_alchemical_state]) thermodynamic_state_list = [] sampler_state_list = [] context_cache = cache.ContextCache() if n_replicas is None: _logger.info( f'n_replicas not defined, setting to match n_states, {n_states}' ) n_replicas = n_states elif n_replicas > n_states: _logger.warning( f'More sampler states: {n_replicas} requested greater than number of states: {n_states}. Setting n_replicas to n_states: {n_states}' ) n_replicas = n_states # TODO this feels like it should be somewhere else... just not sure where. Maybe into lambda_protocol if lambda_schedule is None: lambda_schedule = np.linspace(0., 1., n_states) else: assert ( len(lambda_schedule) == n_states ), 'length of lambda_schedule must match the number of states, n_states' assert ( lambda_schedule[0] == 0.), 'lambda_schedule must start at 0.' assert ( lambda_schedule[-1] == 1.), 'lambda_schedule must end at 1.' difference = np.diff(lambda_schedule) assert (all(i >= 0. for i in difference) ), 'lambda_schedule must be monotonicly increasing' #starting with the initial positions generated py geometry.py sampler_state = SamplerState( positions, box_vectors=hybrid_system.getDefaultPeriodicBoxVectors()) for lambda_val in lambda_schedule: compound_thermodynamic_state_copy = copy.deepcopy( compound_thermodynamic_state) compound_thermodynamic_state_copy.set_alchemical_parameters( lambda_val, lambda_protocol) thermodynamic_state_list.append(compound_thermodynamic_state_copy) # now generating a sampler_state for each thermodyanmic state, with relaxed positions context, context_integrator = context_cache.get_context( compound_thermodynamic_state_copy) feptasks.minimize(compound_thermodynamic_state_copy, sampler_state) sampler_state_list.append(copy.deepcopy(sampler_state)) reporter = storage_file # making sure number of sampler states equals n_replicas if len(sampler_state_list) != n_replicas: # picking roughly evenly spaced sampler states # if n_replicas == 1, then it will pick the first in the list idx = np.round( np.linspace(0, len(sampler_state_list) - 1, n_replicas)).astype(int) sampler_state_list = [ state for i, state in enumerate(sampler_state_list) if i in idx ] assert len(sampler_state_list) == n_replicas if endstates: # generating unsampled endstates _logger.info('Generating unsampled endstates.') unsampled_dispersion_endstates = create_endstates( copy.deepcopy(thermodynamic_state_list[0]), copy.deepcopy(thermodynamic_state_list[-1])) self.create( thermodynamic_states=thermodynamic_state_list, sampler_states=sampler_state_list, storage=reporter, unsampled_thermodynamic_states=unsampled_dispersion_endstates) else: self.create(thermodynamic_states=thermodynamic_state_list, sampler_states=sampler_state_list, storage=reporter)
def setup(self, n_states, temperature, storage_file, minimisation_steps=100, lambda_schedule=None, lambda_protocol=LambdaProtocol(), endstates=True): from perses.dispersed import feptasks hybrid_system = self._factory.hybrid_system positions = self._factory.hybrid_positions lambda_zero_alchemical_state = RelativeAlchemicalState.from_system( hybrid_system) thermostate = ThermodynamicState(hybrid_system, temperature=temperature) compound_thermodynamic_state = CompoundThermodynamicState( thermostate, composable_states=[lambda_zero_alchemical_state]) thermodynamic_state_list = [] sampler_state_list = [] context_cache = cache.ContextCache() if lambda_schedule is None: lambda_schedule = np.linspace(0., 1., n_states) else: assert ( len(lambda_schedule) == n_states ), 'length of lambda_schedule must match the number of states, n_states' assert ( lambda_schedule[0] == 0.), 'lambda_schedule must start at 0.' assert ( lambda_schedule[-1] == 1.), 'lambda_schedule must end at 1.' difference = np.diff(lambda_schedule) assert (all(i >= 0. for i in difference) ), 'lambda_schedule must be monotonicly increasing' #starting with the initial positions generated py geometry.py sampler_state = SamplerState( positions, box_vectors=hybrid_system.getDefaultPeriodicBoxVectors()) for lambda_val in lambda_schedule: compound_thermodynamic_state_copy = copy.deepcopy( compound_thermodynamic_state) compound_thermodynamic_state_copy.set_alchemical_parameters( lambda_val, lambda_protocol) thermodynamic_state_list.append(compound_thermodynamic_state_copy) # now generating a sampler_state for each thermodyanmic state, with relaxed positions context, context_integrator = context_cache.get_context( compound_thermodynamic_state_copy) feptasks.minimize(compound_thermodynamic_state_copy, sampler_state) sampler_state_list.append(copy.deepcopy(sampler_state)) reporter = storage_file if endstates: # generating unsampled endstates logger.info('Generating unsampled endstates.') unsampled_dispersion_endstates = create_endstates( copy.deepcopy(thermodynamic_state_list[0]), copy.deepcopy(thermodynamic_state_list[-1])) self.create( thermodynamic_states=thermodynamic_state_list, sampler_states=sampler_state_list, storage=reporter, unsampled_thermodynamic_states=unsampled_dispersion_endstates) else: self.create(thermodynamic_states=thermodynamic_state_list, sampler_states=sampler_state_list, storage=reporter)