def __init__(self, chain_length):
        """Initialize an Alkane Compound.

        Parameters
        ----------
        chain_length : int
            Length of the alkane chain (in number of carbons)
        """
        # Make sure the user inputs a chain length of at least 1
        if chain_length < 1:
            raise ValueError('Chain length must be greater than 1')

        super(Alkane, self).__init__()

        # Create a polymer of CH2 units
        chain = mb.Polymer(CH2(), n=chain_length, port_labels=('up', 'down'))
        self.add(chain, 'chain')

        # Cap one end of the polymer with a hydrogen
        self.add(H(), 'up_cap')
        mb.force_overlap(move_this=self['up_cap'],
                         from_positions=self['up_cap']['up'],
                         to_positions=self['chain']['up'])

        # Cap the other end of the polymer with a hydrogen
        self.add(H(), 'down_cap')
        mb.force_overlap(move_this=self['down_cap'],
                         from_positions=self['down_cap']['up'],
                         to_positions=self['chain']['down'])
示例#2
0
    def __init__(self, ball_radius=10, n_chains=4, chain_length=10, monomer=None):
        """Initialize a tethered nanoparticle.

        Args:
            ball_radius (float): Radius of the nanoparticle.
            n_chains (int): Number of chains to attach to the nanoparticle.
            chain_length (int): Length of the chains being attached.
            monomer (Compound, optional): Type of chain being attached.
        """
        super(Tnp, self).__init__()

        if not monomer:
            monomer = Bead(particle_kind='t')

        n = 129  # TODO: make this tweakable
        self.add(Sphere(n=n, radius=ball_radius, port_distance_from_surface=0.7), label="np")

        # Generate 65 points on the surface of a unit sphere.
        pattern = mb.SpherePattern(n_chains)

        # Magnify it a bit.
        pattern.scale(ball_radius)

        chain_proto = mb.Polymer(monomer, n=chain_length)

        # Apply chains to pattern.
        chain_protos, empty_backfill = pattern.apply_to_compound(chain_proto,
                guest_port_name="down", host=self['np'])
        self.add(chain_protos)

        self.generate_bonds('np', 'np', sqrt(4 * ball_radius ** 2 * pi / n) - 0.5,
                            sqrt(4 * ball_radius**2 * pi / n) + 0.5)
        self.generate_bonds('np', 't', 0.1, 0.3)
        self.generate_bonds('t', 'np', 0.1, 0.3)
示例#3
0
    def __init__(self, n, cap_front=True, cap_end=True):
        if n < 2:
            raise ValueError('n must be 2 or more')
        super(Alkane, self).__init__()

        if not cap_front:
            n += 1
        if not cap_end:
            n += 1
        chain = mb.Polymer(CH2(), n=n - 2, port_labels=('up', 'down'))
        self.add(chain, 'chain')

        if cap_front:
            self.add(CH3(), 'methyl_front')
            mb.force_overlap(move_this=self['chain'],
                             from_positions=self['chain']['up'],
                             to_positions=self['methyl_front']['up'])
        else:
            self.add(chain['up'], 'up', containment=False)

        if cap_end:
            self.add(CH3(), 'methyl_end')
            mb.force_overlap(self['methyl_end'], self['methyl_end']['up'],
                             self['chain']['down'])
        else:
            self.add(chain['down'], 'down', containment=False)
示例#4
0
    def __init__(self, n, cap_front=True, cap_end=True):
        """Initialize an united atom Alkane Compound.

        Parameters
        ----------
        n: int
            Number of backbone particles.
        cap_front: bool, optional, default=True
            Add methyl group to beginning of chain ('down' port).
        cap_end: bool, optional, default=True
            Add methyl group to end of chain ('up' port).

        """
        super(Alkane, self).__init__()

        if n == 1:
            if cap_front and cap_end:
                ch4 = CH4()
                self.add(ch4)
            else:
                ch3 = CH3()
                self.add(ch3, 'ch3')
                self.add(self['ch3']['up'], 'up', containment=False)
        elif n == 2:
            if cap_front:
                ua1 = CH3()
            else:
                ua1 = CH2()
            if cap_end:
                ua2 = CH3()
            else:
                ua2 = CH2()
            self.add(ua1, 'ua1')
            self.add(ua2, 'ua2')
            mb.force_overlap(self['ua2'], self['ua2']['up'], self['ua1']['up'])
        else:
            if not cap_front:
                n += 1
            if not cap_end:
                n += 1
            chain = mb.Polymer(CH2(), n=n - 2, port_labels=('up', 'down'))
            self.add(chain, 'chain')

            if cap_front:
                self.add(CH3(), "methyl_front")
                mb.force_overlap(self['chain'], self['chain']['up'],
                                 self['methyl_front']['up'])
            else:
                self.add(chain['up'], 'up', containment=False)

            if cap_end:
                self.add(CH3(), 'methyl_end')
                mb.force_overlap(self['methyl_end'], self['methyl_end']['up'],
                                 self['chain']['down'])
            else:
                self.add(chain['down'], 'down', containment=False)
示例#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 __init__(self, n=3, cap_front=True, cap_end=True):
        """Initialize an Alkane Compound.

        Args:
            n: Number of carbon atoms.
            cap_front: Add methyl group to beginning of chain ('down' port).
            cap_end: Add methyl group to end of chain ('up' port).
        """
        if n < 1:
            raise ValueError('n must be 1 or more')
        elif n == 1:
            if cap_front or cap_end:
                warn('Returning CH3 group')
            else:
                warn('Returning CH2 group')
        super(Alkane, self).__init__()

        if n > 1:
            if cap_front:
                n -= 1
                ch3_front = CH3()
                self.add(ch3_front, 'methyl_front')
            if cap_end:
                n -= 1
                ch3_end = clone(ch3_front)
                self.add(ch3_end, 'methyl_end')
            try:
                chain = mb.Polymer(CH2(), n=n, port_labels=('up', 'down'))
                self.add(chain, 'chain')
                if cap_end:
                    mb.force_overlap(self['methyl_end'],
                                     self['methyl_end']['down'],
                                     self['chain']['down'])
                else:
                    self.add(chain['down'], 'down', containment=False)
                if cap_front:
                    mb.force_overlap(self['chain'], self['chain']['up'],
                                     self['methyl_front']['down'])
                else:
                    self.add(chain['up'], 'up', containment=False)
            except ValueError:
                mb.force_overlap(self['methyl_end'],
                                 self['methyl_end']['down'],
                                 self['methyl_front']['down'])
        else:
            if cap_end or cap_front:
                ch3 = CH3()
                self.add(ch3, 'methyl')
                self.add(ch3['down'], 'down', containment=False)
            else:
                ch2 = CH2()
                self.add(ch2, 'methylene')
                self.add(ch2['up'], 'up', containment=False)
                self.add(ch2['down'], 'down', containment=False)
示例#7
0
    def __init__(self, chain_length, fidelity, cap_front=True, cap_end=True):
        super(Alkane, self).__init__()

        if fidelity not in ['UA', 'CG']:
            raise Exception("`fidelity` must be either 'UA' or 'CG'.")
        if chain_length < 2:
            raise Exception("Chain length must be 2 or greater.")
        if fidelity == 'CG' and chain_length % 3 != 0:
            raise Exception("Chain length must be divisible by three for "
                            "use with `fidelity`='CG'.")
        if fidelity == 'CG' and chain_length == 3:
            raise Exception("Chain length must be greater than 3 for "
                            "use with `fidelity`='CG'.")

        if fidelity == 'UA':
            middle_bead = CH2UA()
            end_bead = CH3UA()
        if fidelity == 'CG':
            chain_length /= 3
            middle_bead = MMM()
            end_bead = MME()

        if not cap_front:
            chain_length += 1
        if not cap_end:
            chain_length += 1

        if chain_length > 2:
            chain = mb.Polymer(mb.clone(middle_bead),
                               n=chain_length - 2,
                               port_labels=('up', 'down'))
            self.add(chain, 'chain')

            if cap_front:
                self.add(mb.clone(end_bead), 'front_cap')
                mb.force_overlap(self['front_cap'], self['front_cap']['up'],
                                 self['chain']['up'])
            else:
                # Hoist port label to `Alkane` level
                self.add(chain['up'], 'up', containment=False)

            if cap_end:
                self.add(mb.clone(end_bead), 'end_cap')
                mb.force_overlap(self['end_cap'], self['end_cap']['up'],
                                 self['chain']['down'])
            else:
                # Hoist port label to `Alkane` level
                self.add(chain['down'], 'down', containment=False)

        else:
            self.add(mb.clone(end_bead), 'front_cap')
            self.add(mb.clone(end_bead), 'end_cap')
            mb.force_overlap(self['end_cap'], self['end_cap']['up'],
                             self['front_cap']['up'])
示例#8
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)
示例#9
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)
示例#10
0
    def test_block_copolymer(self, ch2, ester):
        n = 2
        sequence = 'ABBA'
        abba = mb.Polymer([ch2, ester], sequence=sequence, n=n)

        assert abba.n_particles == n * 3 * len(sequence)
        assert len(abba.children) == len(sequence) * n
        assert abba.children[0].name == 'CH2'
        assert abba.children[1].name == 'Ester'
        assert abba.children[2].name == 'Ester'
        assert abba.children[3].name == 'CH2'
        assert abba.children[4].name == 'CH2'
        assert abba.children[5].name == 'Ester'
        assert abba.children[6].name == 'Ester'
        assert abba.children[7].name == 'CH2'
        n_elements = Counter(p.name for p in abba.particles())
        assert n_elements['C'] == n * len(sequence)
        assert n_elements['H'] == n * len(sequence)
        assert n_elements['O'] == n * len(sequence)
        assert abba.n_bonds == n * 2 * len(sequence) + (n * len(sequence) - 1)
示例#11
0
文件: brush.py 项目: whitehml/mbuild
    def __init__(self, chain_length=4, alpha=pi / 4):
        super(Brush, self).__init__()

        # Add parts
        self.add(Silane(), label='silane')
        self.add(Initiator(), label='initiator')
        self.add(mb.Polymer(MPC(alpha=alpha),
                            n=chain_length,
                            port_labels=('up', 'down')),
                 label='pmpc')
        self.add(CH3(), label='methyl')

        mb.force_overlap(self['initiator'], self['initiator']['down'],
                         self['silane']['up'])
        mb.force_overlap(self['pmpc'], self['pmpc']['down'],
                         self['initiator']['up'])
        mb.force_overlap(self['methyl'], self['methyl']['up'],
                         self['pmpc']['up'])

        # Make self.port point to silane.bottom_port
        self.add(self['silane']['down'], label='down', containment=False)
示例#12
0
文件: alkane.py 项目: whitehml/mbuild
    def __init__(self, n=3, cap_front=True, cap_end=True):
        """Initialize an Alkane Compound.

        Args:
            n: Number of carbon atoms.
            cap_front: Add methyl group to beginning of chain ('down' port).
            cap_end: Add methyl group to end of chain ('up' port).
        """
        if n < 2:
            raise ValueError('n must be 1 or more')
        super(Alkane, self).__init__()

        # Adjust length of Polmyer for absence of methyl terminations.
        if not cap_front:
            n += 1
        if not cap_end:
            n += 1
        chain = mb.Polymer(CH2(), n=n - 2, port_labels=('up', 'down'))
        self.add(chain, 'chain')

        if cap_front:
            self.add(CH3(), "methyl_front")
            mb.force_overlap(move_this=self['chain'],
                             from_positions=self['chain']['up'],
                             to_positions=self['methyl_front']['up'])
        else:
            # Hoist port label to Alkane level.
            self.add(chain['up'], 'up', containment=False)

        if cap_end:
            self.add(CH3(), 'methyl_end')
            mb.force_overlap(self['methyl_end'], self['methyl_end']['up'],
                             self['chain']['down'])
        else:
            # Hoist port label to Alkane level.
            self.add(chain['down'], 'down', containment=False)


# -- ==alkane== --
示例#13
0
        self.add_bond([c3, c2])
        self.add_bond([c3, c4])
        self.add_bond([c4, o41])
        self.add_bond([c4, n])
        self.add_bond([n, c5])
        self.add_bond([c5, c6])

        self.add(mb.Port(anchor=c5), 'up')
        self.add(mb.Port(anchor=c6), 'down')


# Implicit hydrogens
# XYZ doesn't matter, we just need bonds and particle names
# So we can upload to charmm-gui
cap_with = 'H'
pvp = mb.Polymer(mvp(), n=2)

if cap_with == 'C':
    c_top = mb.Particle(name='C')
    cap_top = mb.Compound()
    cap_top.add(c_top)
    cap_top.add(mb.Port(anchor=c_top), 'down')
    mb.force_overlap(cap_top, cap_top['down'], pvp['up'])

    c_bot = mb.Particle(name='C')
    cap_bot = mb.Compound()
    cap_bot.add(c_bot)
    cap_bot.add(mb.Port(anchor=c_bot), 'up')
    mb.force_overlap(cap_bot, cap_bot['up'], pvp['down'])
    pvp.add(cap_top)
    pvp.add(cap_bot)
示例#14
0
 def test_polymer(self, ch2):
     n = 6
     c6 = mb.Polymer(ch2, n=n)
     assert c6.n_particles == n * 3
     assert c6.n_bonds == n * 2 + (n - 1)