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'])
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)
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)
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)
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 __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)
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'])
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_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_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)
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)
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== --
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)
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)