def peek_from_file(self): peek = os.path.join(SYSTEM_DIR, "test_peek.mol2") peek_system = system.System(system_type="custom", density=0.8, forcefield="gaff", remove_hydrogens=True, file_path=peek) return peek_system
def test_stack(self): stacked_system = system.System(molecule="PEEK", para_weight=0.50, density=0.7, n_compounds=[10], polymer_lengths=[5], system_type="stack", forcefield="gaff", remove_hydrogens=False, expand_factor=4)
def test_weighted_sequence(self): para_system = system.System(molecule="PEEK", para_weight=1.0, n_compounds=[1], polymer_lengths=[10], density=0.1, system_type="pack") assert para_system.molecule_sequences[0] == "P" * 10 random_system = system.System(molecule="PEEK", para_weight=0.40, n_compounds=[1], polymer_lengths=[20], density=0.1, system_type="pack") random.seed(24) sequence = system.random_sequence(para_weight=0.40, length=20) sequence = "".join(sequence) assert random_system.molecule_sequences[0] == sequence
def bad_system_type(self): with pytest.raises(ValueError): stacked_system = system.System(molecule="PEEK", para_weight=0.50, density=0.7, n_compounds=[10], polymer_lengths=[5], system_type="wrong", forcefield="gaff", remove_hydrogens=False, expand_factor=4)
def test_multiple_compounds(self): simple_system = system.System(molecule="PEEK", para_weight=0.60, density=.1, n_compounds=[5, 4, 3, 2, 1], polymer_lengths=[2, 4, 5, 11, 22], forcefield=None, system_type="pack", assert_dihedrals=False, remove_hydrogens=False, expand_factor=7)
def pekk_system_noH(self): pekk_sys = system.System(molecule="PEKK", para_weight=0.50, density=1.2, n_compounds=[3], polymer_lengths=[3], system_type="pack", forcefield="gaff", remove_hydrogens=True, expand_factor=5) return pekk_sys
def test_monomer_sequence(self): with pytest.warns(UserWarning): system_even = system.System(molecule="PEEK", monomer_sequence="PM", para_weight=0.5, n_compounds=[1], polymer_lengths=[4], density=.1, system_type="pack", remove_hydrogens=True) system_even = system.System(molecule="PEEK", monomer_sequence="PM", n_compounds=[1], polymer_lengths=[4], density=.1, system_type="pack", remove_hydrogens=True) assert system_even.para == system_even.meta == 2 assert system_even.molecule_sequences[0] == "PMPM" system_odd = system.System(molecule="PEEK", monomer_sequence="PM", n_compounds=[1], polymer_lengths=[5], density=.1, system_type="pack", remove_hydrogens=True) assert system_odd.para == 3 assert system_odd.meta == 2 assert system_odd.molecule_sequences[0] == "PMPMP" system_large_seq = system.System(molecule="PEEK", monomer_sequence="PMPMPMPMPM", n_compounds=[1], polymer_lengths=[4], density=.1, system_type="pack", remove_hydrogens=True) assert system_large_seq.para == system_large_seq.meta == 2 assert system_large_seq.molecule_sequences[0] == "PMPM"
def test_dihedrals(self): simple_system = system.System( molecule="PEEK", para_weight=0.60, density=.1, n_compounds=[1], polymer_lengths=[2], forcefield="gaff", system_type="pack", assert_dihedrals=True, remove_hydrogens=False, )
def test_mw_mn(self): simple_system = system.System(molecule="PEEK", para_weight=0.60, density=0.1, n_compounds=3, sample_pdi=True, Mn=5.0, Mw=6.0, system_type="pack", forcefield=None, assert_dihedrals=False, remove_hydrogens=False, expand_factor=7)
def test_too_few_pdi_vals(self): with pytest.raises(AssertionError): simple_system = system.System( molecule="PEEK", para_weight=0.60, density=0.1, n_compounds=3, sample_pdi=True, pdi=1.2, forcefield=None, system_type="pack", assert_dihedrals=False, remove_hydrogens=False, )
def test_remove_hydrogens(self): simple_system = system.System( molecule="PEEK", para_weight=0.60, density=.1, n_compounds=[1], polymer_lengths=[2], system_type="pack", forcefield="gaff", assert_dihedrals=False, remove_hydrogens=True, ) post_remove_h = simple_system.system assert sum([int(item.type == "H") for item in post_remove_h.atoms]) == 0
def test_custom_bad_params(self): file_path = os.path.join(SYSTEM_DIR, "test_peek.mol2") with pytest.warns(UserWarning): custom_sys = system.System(system_type="custom", density=0.7, molecule="PEEK", para_weight=0.50, n_compounds=10, polymer_lengths=5, file_path=file_path) ignore_args = [ custom_sys.molecule, custom_sys.para_weight, custom_sys.polymer_lengths, custom_sys.n_compounds ] assert not any(ignore_args)
def test_gauss_dist(self): random.seed(42) simple_system = system.System( molecule="PEEK", para_weight=0.60, density=0.1, n_compounds=3, sample_pdi=True, pdi=1.001, Mn=5.0, system_type="pack", forcefield=None, assert_dihedrals=False, remove_hydrogens=False, mass_dist_type="gaussian", )
def sample(job): from uli_init import simulate, system from uli_init.utils import base_units, unit_conversions import numpy as np import logging with job: print(job.id) logging.info("Creating system...") if job.sp["system_type"] != "interface": system_parms = system.System( density=job.sp['density'], molecule=job.sp['molecule'], n_compounds=job.sp['n_compounds'], polymer_lengths=job.sp["polymer_lengths"], para_weight=job.sp['para_weight'], monomer_sequence=job.sp['monomer_sequence'], sample_pdi=job.doc.sample_pdi, pdi=job.sp['pdi'], Mn=job.sp['Mn'], Mw=job.sp['Mw'], seed=job.sp['system_seed']) system = system.Initializer( system=system_parms, system_type=job.sp["system_type"], forcefield=job.sp["forcefield"], remove_hydrogens=job.sp["remove_hydrogens"], **job.sp["kwargs"]) if any(list(job.sp["box_constraints"].values())): system.target_box = system.set_target_box( job.sp["box_constraints"]["x"], job.sp["box_constraints"]["y"], job.sp["box_constraints"]["z"]) job.doc["target_volume"] = system.target_box shrink_kT = job.sp['shrink_kT'] shrink_steps = job.sp['shrink_steps'] shrink_period = job.sp['shrink_period'] job.doc['num_para'] = system_parms.para job.doc['num_meta'] = system_parms.meta job.doc['num_compounds'] = system_parms.n_compounds job.doc['polymer_lengths'] = system_parms.polymer_lengths job.doc["chain_sequences"] = system_parms.molecule_sequences elif job.sp["system_type"] == "interface": slab_files = [] ref_distances = [] if job.doc['use_signac'] is True: signac_args = [] if isinstance(job.sp['signac_args'], list): slab_1_arg = job.sp['signac_args'][0] signac_args.append(slab_1_arg) if len(job.sp['signac_args']) == 2: slab_2_arg = job.sp['signac_args'][1] signac_args.append(slab_2_args) elif not isinstance(job.sp['signac_args'], list): signac_args.append(job.sp['signac_args']) project = signac.get_project(root=job.sp['signac_project'], search=True) for arg in signac_args: if isinstance(arg, dict): _job = list(project.find_jobs(filter=arg))[0] slab_files.append(_job.fn('restart.gsd')) ref_distances.append(_job.doc['ref_distance'] / 10) elif isinstance(arg, str): # Find job using job ID _job = project.open_job(id=arg) slab_files.append(_job.fn('restart.gsd')) ref_distances.append(_job.doc['ref_distance'] / 10) elif job.doc['use_signac'] is False: slab_files.append(job.sp.slab_file) ref_distances.append(job.sp['reference_distance']) system = system.Interface( slabs=slab_files, ref_distance=ref_distances[0], gap=job.sp['interface_gap'], weld_axis=job.sp["weld_axis"], ) job.doc['slab_ref_distances'] = system.ref_distance shrink_kT = None shrink_steps = None shrink_period = None system.system.save('init.mol2', overwrite=True) logging.info("System generated...") logging.info("Starting simulation...") simulation = simulate.Simulation( system, r_cut=job.sp["r_cut"], tau_kt=job.sp['tau_kt'], tau_p=job.sp['tau_p'], nlist=job.sp['neighbor_list'], dt=job.sp['dt'], seed=job.sp['sim_seed'], auto_scale=True, ref_values=None, mode="gpu", gsd_write=max([int(job.doc['steps'] / 100), 1]), log_write=max([int(job.doc['steps'] / 10000), 1])) logging.info("Simulation object generated...") job.doc['ref_energy'] = simulation.ref_energy job.doc['ref_distance'] = simulation.ref_distance job.doc['ref_mass'] = simulation.ref_mass job.doc['real_timestep'] = unit_conversions.convert_to_real_time( simulation.dt, simulation.ref_energy, simulation.ref_distance, simulation.ref_mass) job.doc['time_unit'] = 'fs' job.doc['steps_per_frame'] = simulation.gsd_write job.doc['steps_per_log'] = simulation.log_write if job.sp['procedure'] == "quench": job.doc['T_SI'] = unit_conversions.kelvin_from_reduced( job.sp['kT_quench'], simulation.ref_energy) job.doc['T_unit'] = 'K' logging.info("Beginning quench simulation...") simulation.quench(kT=job.sp['kT_quench'], pressure=job.sp['pressure'], n_steps=job.sp['n_steps'], shrink_kT=shrink_kT, shrink_steps=shrink_steps, wall_axis=job.sp['walls'], shrink_period=shrink_period) elif job.sp['procedure'] == "anneal": logging.info("Beginning anneal simulation...") if not job.sp['schedule']: kT_list = np.linspace( job.sp['kT_anneal'][0], job.sp['kT_anneal'][1], len(job.sp['anneal_sequence']), ) kT_SI = [ unit_conversions.kelvin_from_reduced( kT, simulation.ref_energy) for kT in kT_list ] job.doc['T_SI'] = kT_SI job.doc['T_unit'] = 'K' simulation.anneal(kT_init=job.sp['kT_anneal'][0], kT_final=job.sp['kT_anneal'][1], pressure=job.sp['pressure'], step_sequence=job.sp['anneal_sequence'], schedule=job.sp['schedule'], shrink_kT=shrink_kT, shrink_steps=shrink_steps, wall_axis=job.sp['walls'], shrink_period=shrink_period)