示例#1
0
 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
示例#2
0
    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)
示例#3
0
    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
示例#4
0
    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)
示例#5
0
    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))
示例#6
0
    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
示例#7
0
    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
示例#8
0
 def test_grid_2d(self):
     pattern = mb.Grid2DPattern(10, 5)
     assert len(pattern) == 50
示例#9
0
    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)
示例#10
0
    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)