def test_apply_to_compound_noscale(self, betacristobalite, propyl): pattern = mb.Grid2DPattern(3,3) chains, _ = pattern.apply_to_compound(guest=propyl, host=betacristobalite, scale=False) chain_positions = [chain.pos for chain in chains] for i, pos in enumerate(chain_positions): for pos2 in chain_positions[i+1:]: assert betacristobalite.min_periodic_distance(pos, pos2) < 1.5
def test_monolayer(self, ch2): n = 8 m = 8 pattern = mb.Grid2DPattern(n, m) chain = mb.Polymer(ch2, n=10) monolayer = mb.Monolayer(surface=Betacristobalite(), chains=chain, backfill=H(), pattern=pattern) assert monolayer.n_particles == 1900 + n * m * (10 * 3) + (100 - n * m) assert monolayer.n_bonds == 2400 + n * m * (10 * 2 + 9 + 1) + (100 - n * m)
def test_monolayer(self, ch2): n = 8 m = 8 pattern = mb.Grid2DPattern(n, m) chain = mb.recipes.Polymer(monomers=[ch2]) chain.build(n=10, add_hydrogens=False) monolayer = mb.recipes.Monolayer( surface=Betacristobalite(), chains=chain, backfill=H(), pattern=pattern, ) assert monolayer.n_particles == 2000 + n * m * 29 assert monolayer.n_bonds == 2500 + n * m * 29
def test_pattern_kwargs(self, ch2): n = 8 m = 8 pattern = mb.Grid2DPattern(n, m) chain = mb.Polymer(ch2, n=10) monolayer = mb.Monolayer(surface=Betacristobalite(), chains=H(), guest_port_name='up', backfill=chain, backfill_port_name='down', pattern=pattern) chains = 100 - (n * m) assert monolayer.n_particles == 1900 + chains * (10 * 3) + (100 - chains) assert monolayer.n_bonds == 2400 + chains * (10 * 2 + 9 + 1) + (100 - chains)
def test_mixed_monolayer(self, ch2): n = 8 m = 8 pattern = mb.Grid2DPattern(n, m) fractions = [0.75, 0.25] chain_a = mb.Polymer(ch2, n=5) chain_b = mb.Polymer(ch2, n=15) monolayer = mb.Monolayer(surface=Betacristobalite(), chains=[chain_a, chain_b], fractions=fractions, backfill=H(), pattern=pattern) n_a = round(n * m * 0.75) n_b = round(n * m * 0.25) assert monolayer.n_particles == 1900 + n_a * 5 * 3 + n_b * 15 * 3 + ( 100 - (n_a + n_b)) assert monolayer.n_bonds == 2400 + n_a * (5 * 2 + 4 + 1) + n_b * ( 15 * 2 + 14 + 1) + (100 - (n_a + n_b))
def test_pattern_kwargs(self, ch2): n = 8 m = 8 pattern = mb.Grid2DPattern(n, m) chain = mb.recipes.Polymer(monomers=[ch2]) chain.build(n=10, add_hydrogens=False) monolayer = mb.recipes.Monolayer( surface=Betacristobalite(), chains=H(), guest_port_name="up", backfill=chain, backfill_port_name="down", pattern=pattern, ) chains = 100 - (n * m) assert monolayer.n_particles == 2000 + chains * 29 assert monolayer.n_bonds == 2500 + chains * 29
def test_mixed_monolayer(self, ch2): n = 8 m = 8 pattern = mb.Grid2DPattern(n, m) fractions = [0.75, 0.25] chain_a = mb.recipes.Polymer(monomers=[ch2]) chain_a.build(n=5, add_hydrogens=False) chain_b = mb.recipes.Polymer(monomers=[ch2]) chain_b.build(n=15, add_hydrogens=False) monolayer = mb.recipes.Monolayer( surface=Betacristobalite(), chains=[chain_a, chain_b], fractions=fractions, backfill=H(), pattern=pattern, ) n_a = round(n * m * 0.75) n_b = round(n * m * 0.25) assert monolayer.n_particles == 2000 + n_a * 14 + n_b * 44 assert monolayer.n_bonds == 2500 + n_a * 14 + n_b * 44
def test_grid_2d(self): pattern = mb.Grid2DPattern(10, 5) assert len(pattern) == 50
def __init__(self, lipids, ref_atoms, n_lipids_x=10, n_lipids_y=10, area_per_lipid=1.0, solvent=None, lipid_box=None, spacing_z=0.5, solvent_per_lipid=None, n_solvent=None, random_seed=12345, mirror=True): super(Bilayer, self).__init__() # Santitize inputs. if sum([lipid[1] for lipid in lipids]) != 1.0: raise ValueError('Lipid fractions do not add up to 1.') assert len(ref_atoms) == len(lipids) self.lipids = lipids self.ref_atoms = ref_atoms self._lipid_box = lipid_box # 2D Lipid locations. self.n_lipids_x = n_lipids_x self.n_lipids_y = n_lipids_y self.apl = area_per_lipid self.n_lipids_per_layer = self.n_lipids_x * self.n_lipids_y self.pattern = mb.Grid2DPattern(n_lipids_x, n_lipids_y) self.pattern.scale(np.sqrt(self.apl * self.n_lipids_per_layer)) # Solvent info. self.solvent = solvent self.n_solvent = n_solvent self.solvent_per_lipid = solvent_per_lipid # Other inputs. self.spacing = np.array([0, 0, spacing_z]) self.random_seed = random_seed self.mirror = mirror self._number_of_each_lipid_per_layer = [] self._solvent_per_layer = None # Containers for lipids and solvent. self.lipid_components = mb.Compound() self.solvent_components = mb.Compound() # Assemble the lipid layers seed(self.random_seed) top_layer, top_lipid_labels = self.create_layer() self.lipid_components.add(top_layer) if self.mirror == True: bottom_layer, bottom_lipid_labels = self.create_layer( lipid_indices=top_lipid_labels, flip_orientation=True) else: bottom_layer, bottom_lipid_labels = self.create_layer( flip_orientation=True) self.lipid_components.add(bottom_layer) # solvate the lipids #self.solvate_bilayer() # TODO: needs fixing # add everything to the big list self.add(self.lipid_components) self.add(self.solvent_components) print(self.number_of_each_lipid_per_layer)
def __init__(self, lipids, ref_atoms, n_lipids_x=10, n_lipids_y=10, area_per_lipid=1.0, lipid_box=None, spacing_z=None, solvent=None, solvent_per_lipid=None, n_solvent=None, solvent_density=None, solvent_mass=None, tilt=0, random_seed=12345, mirror=True): super(Bilayer, self).__init__() # Santitize inputs i = 0 while i < len(lipids): if lipids[i][1] == 0: lipids.remove(i) else: i += 1 if sum([lipid[1] for lipid in lipids]) != 1.0: raise ValueError('Lipid fractions do not add up to 1.') assert len(ref_atoms) == len(lipids) self.lipids = lipids self.ref_atoms = ref_atoms self._lipid_box = lipid_box # 2D Lipid locations self.n_lipids_x = n_lipids_x self.n_lipids_y = n_lipids_y self.apl = area_per_lipid self.n_lipids_per_layer = self.n_lipids_x * self.n_lipids_y self.pattern = mb.Grid2DPattern(n_lipids_x, n_lipids_y) self.pattern.scale(np.sqrt(self.apl * self.n_lipids_per_layer)) # Z-orientation parameters self.tilt = tilt if spacing_z: self.spacing = spacing_z else: self.spacing = max([lipid[0].boundingbox.lengths[2] for lipid in self.lipids]) * np.cos(self.tilt) # Solvent parameters if solvent: self.solvent = solvent if solvent_per_lipid != None: self.n_solvent = (self.n_lipids_x * self.n_lipids_y * 2 * solvent_per_lipid) elif n_solvent != None: self.n_solvent = n_solvent else: raise ValueError("Requires either n_solvent_per_lipid ", "or n_solvent arguments") # Other parameters self.random_seed = random_seed self.mirror = mirror # Initialize variables and containers for lipids and solvent self.lipid_components = mb.Compound() self.solvent_components = mb.Compound() self._number_of_each_lipid_per_layer = [] # Assemble the lipid layers seed(self.random_seed) self.tilt_about = [random(), random(), 0] top_layer, top_lipid_labels = self.create_layer() self.lipid_components.add(top_layer) if self.mirror == True: bottom_layer, bottom_lipid_labels = self.create_layer( lipid_indices=top_lipid_labels, flip_orientation=True) else: bottom_layer, bottom_lipid_labels = self.create_layer( flip_orientation=True) bottom_layer.translate([0, 0, 0]) self.lipid_components.add(bottom_layer) self.lipid_components.translate_to([0, 0, 0]) # Assemble solvent components solvent_top = self.solvate(solvent_mass, solvent_density) solvent_bot = mb.clone(solvent_top) solvent_top.translate_to( [0, 0, self.spacing + 0.5 * solvent_top.boundingbox.lengths[2]] ) solvent_bot.translate_to( [0, 0, -self.spacing - 0.5 * solvent_top.boundingbox.lengths[2]] ) self.solvent_components.add(solvent_top) self.solvent_components.add(solvent_bot) # Add all compounds self.add(self.lipid_components) self.add(self.solvent_components)