def test_write_object(): """Test writing of a object. """ tmpfile = tempfile.NamedTemporaryFile() storage = NetCDFStorage(tmpfile.name, mode='w') #use names we might encounter in simulation envname = 'vacuum' modname = 'ExpandedEnsembleSampler' varname = 'energy' view = NetCDFStorageView(storage, envname, modname) obj = {0: 0} view.write_object('singleton', obj) for iteration in range(10): obj = {'iteration': iteration} view.write_object(varname, obj, iteration=iteration) for iteration in range(10): obj = storage.get_object(envname, modname, varname, iteration=iteration) assert ('iteration' in obj) assert (obj['iteration'] == iteration)
def test_write_object(): """Test writing of a object. """ tmpfile = tempfile.NamedTemporaryFile() storage = NetCDFStorage(tmpfile.name, mode='w') #use names we might encounter in simulation envname = 'vacuum' modname = 'ExpandedEnsembleSampler' varname = 'energy' view = NetCDFStorageView(storage, envname, modname) obj = { 0 : 0 } view.write_object('singleton', obj) for iteration in range(10): obj = { 'iteration' : iteration } view.write_object(varname, obj, iteration=iteration) for iteration in range(10): obj = storage.get_object(envname, modname, varname, iteration=iteration) assert ('iteration' in obj) assert (obj['iteration'] == iteration)
def test_storage_append(): """Test storage layer appending to a file. """ tmpfile = tempfile.NamedTemporaryFile() storage = NetCDFStorage(tmpfile.name, mode='w') storage.close() storage = NetCDFStorage(tmpfile.name, mode='a') storage.close()
def test_write_object(): """Test writing of a object. """ tmpfile = tempfile.NamedTemporaryFile() storage = NetCDFStorage(tmpfile.name, mode='w') view = NetCDFStorageView(storage, 'envname', 'modname') obj = { 0 : 0 } view.write_object('singleton', obj) for iteration in range(10): obj = { 'iteration' : iteration } view.write_object('varname', obj, iteration=iteration) for iteration in range(10): obj = storage.get_object('/envname/modname/varname', iteration=iteration) assert ('iteration' in obj) assert (obj['iteration'] == iteration)
def test_storage_view(): """Test writing of a quantity. """ tmpfile = tempfile.NamedTemporaryFile() storage = NetCDFStorage(tmpfile.name, mode='w') view1 = NetCDFStorageView(storage, envname='envname') view2 = NetCDFStorageView(view1, modname='modname') assert (view1._envname == 'envname') assert (view2._envname == 'envname') assert (view2._modname == 'modname')
def test_write_quantity(): """Test writing of a quantity. """ tmpfile = tempfile.NamedTemporaryFile() storage = NetCDFStorage(tmpfile.name, mode='w') view = NetCDFStorageView(storage, 'envname', 'modname') view.write_quantity('singleton', 1.0) for iteration in range(10): view.write_quantity('varname', float(iteration), iteration=iteration) for iteration in range(10): assert (storage._ncfile['/envname/modname/varname'][iteration] == float(iteration))
def test_write_array(): """Test writing of a array. """ tmpfile = tempfile.NamedTemporaryFile() storage = NetCDFStorage(tmpfile.name, mode='w') view1 = NetCDFStorageView(storage, 'envname1', 'modname') view2 = NetCDFStorageView(storage, 'envname2', 'modname') from numpy.random import random shape = (10, 3) array = random(shape) view1.write_array('singleton', array) for iteration in range(10): array = random(shape) view1.write_array('varname', array, iteration=iteration) view2.write_array('varname', array, iteration=iteration) for iteration in range(10): array = storage._ncfile['/envname1/modname/varname'][iteration] assert array.shape == shape array = storage._ncfile['/envname2/modname/varname'][iteration] assert array.shape == shape
def test_sync(): """Test writing of a quantity. """ tmpfile = tempfile.NamedTemporaryFile() storage = NetCDFStorage(tmpfile.name, mode='w') storage.sync()
def test_storage_create(): """Test storage layer creating a new file. """ tmpfile = tempfile.NamedTemporaryFile() storage = NetCDFStorage(tmpfile.name, mode='w') storage.close()
def __init__(self, molecules: List[str], output_filename: str, ncmc_switching_times: Dict[str, int], equilibrium_steps: Dict[str, int], timestep: unit.Quantity, initial_molecule: str=None, geometry_options: Dict=None): self._molecules = [SmallMoleculeSetProposalEngine.canonicalize_smiles(molecule) for molecule in molecules] environments = ['explicit', 'vacuum'] temperature = 298.15 * unit.kelvin pressure = 1.0 * unit.atmospheres constraints = app.HBonds self._storage = NetCDFStorage(output_filename) self._ncmc_switching_times = ncmc_switching_times self._n_equilibrium_steps = equilibrium_steps self._geometry_options = geometry_options # Create a system generator for our desired forcefields. from perses.rjmc.topology_proposal import SystemGenerator system_generators = dict() from pkg_resources import resource_filename gaff_xml_filename = resource_filename('perses', 'data/gaff.xml') barostat = openmm.MonteCarloBarostat(pressure, temperature) system_generators['explicit'] = SystemGenerator([gaff_xml_filename, 'tip3p.xml'], forcefield_kwargs={'nonbondedCutoff': 9.0 * unit.angstrom, 'implicitSolvent': None, 'constraints': constraints, 'ewaldErrorTolerance': 1e-5, 'hydrogenMass': 3.0*unit.amu}, periodic_forcefield_kwargs = {'nonbondedMethod': app.PME} barostat=barostat) system_generators['vacuum'] = SystemGenerator([gaff_xml_filename], forcefield_kwargs={'implicitSolvent': None, 'constraints': constraints, 'hydrogenMass': 3.0*unit.amu}, nonperiodic_forcefield_kwargs = {'nonbondedMethod': app.NoCutoff}) # # Create topologies and positions # topologies = dict() positions = dict() from openmoltools import forcefield_generators forcefield = app.ForceField(gaff_xml_filename, 'tip3p.xml') forcefield.registerTemplateGenerator(forcefield_generators.gaffTemplateGenerator) # Create molecule in vacuum. from perses.utils.openeye import extractPositionsFromOEMol from openmoltools.openeye import smiles_to_oemol, generate_conformers if initial_molecule: smiles = initial_molecule else: smiles = np.random.choice(molecules) molecule = smiles_to_oemol(smiles) molecule = generate_conformers(molecule, max_confs=1) topologies['vacuum'] = forcefield_generators.generateTopologyFromOEMol(molecule) positions['vacuum'] = extractPositionsFromOEMol(molecule) # Create molecule in solvent. modeller = app.Modeller(topologies['vacuum'], positions['vacuum']) modeller.addSolvent(forcefield, model='tip3p', padding=9.0 * unit.angstrom) topologies['explicit'] = modeller.getTopology() positions['explicit'] = modeller.getPositions() # Set up the proposal engines. proposal_metadata = {} proposal_engines = dict() for environment in environments: proposal_engines[environment] = SmallMoleculeSetProposalEngine(self._molecules, system_generators[environment]) # Generate systems systems = dict() for environment in environments: systems[environment] = system_generators[environment].build_system(topologies[environment]) # Define thermodynamic state of interest. thermodynamic_states = dict() thermodynamic_states['explicit'] = states.ThermodynamicState(system=systems['explicit'], temperature=temperature, pressure=pressure) thermodynamic_states['vacuum'] = states.ThermodynamicState(system=systems['vacuum'], temperature=temperature) # Create SAMS samplers from perses.samplers.samplers import ExpandedEnsembleSampler, SAMSSampler mcmc_samplers = dict() exen_samplers = dict() sams_samplers = dict() for environment in environments: storage = NetCDFStorageView(self._storage, envname=environment) if self._geometry_options: n_torsion_divisions = self._geometry_options['n_torsion_divsions'][environment] use_sterics = self._geometry_options['use_sterics'][environment] else: n_torsion_divisions = 180 use_sterics = False geometry_engine = geometry.FFAllAngleGeometryEngine(storage=storage, n_torsion_divisions=n_torsion_divisions, use_sterics=use_sterics) move = mcmc.LangevinSplittingDynamicsMove(timestep=timestep, splitting="V R O R V", n_restart_attempts=10) chemical_state_key = proposal_engines[environment].compute_state_key(topologies[environment]) if environment == 'explicit': sampler_state = states.SamplerState(positions=positions[environment], box_vectors=systems[environment].getDefaultPeriodicBoxVectors()) else: sampler_state = states.SamplerState(positions=positions[environment]) mcmc_samplers[environment] = mcmc.MCMCSampler(thermodynamic_states[environment], sampler_state, move) exen_samplers[environment] = ExpandedEnsembleSampler(mcmc_samplers[environment], topologies[environment], chemical_state_key, proposal_engines[environment], geometry_engine, options={'nsteps': self._ncmc_switching_times[environment]}, storage=storage, ncmc_write_interval=self._ncmc_switching_times[environment]) exen_samplers[environment].verbose = True sams_samplers[environment] = SAMSSampler(exen_samplers[environment], storage=storage) sams_samplers[environment].verbose = True # Create test MultiTargetDesign sampler. from perses.samplers.samplers import MultiTargetDesign target_samplers = {sams_samplers['explicit']: 1.0, sams_samplers['vacuum']: -1.0} designer = MultiTargetDesign(target_samplers, storage=self._storage) # Store things. self.molecules = molecules self.environments = environments self.topologies = topologies self.positions = positions self.system_generators = system_generators self.proposal_engines = proposal_engines self.thermodynamic_states = thermodynamic_states self.mcmc_samplers = mcmc_samplers self.exen_samplers = exen_samplers self.sams_samplers = sams_samplers self.designer = designer