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.recipes.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): """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.recipes.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, n=1, cap_start=True): super(Alkane, self).__init__() if n < 1: raise ValueError('n must be 1 or more') if cap_start: #if n == 1, will simply return a a methane molecule if n == 1: self.add(CH4(), 'methyl_start') if n > 1: self.add(Backbone(n=n-1, cap_start_mol=CH3(), cap_start_name= 'methyl_start', cap_start_port = 'up', cap_end_mol = CH3_down(), cap_end_name='methyl_end', cap_end_port= 'dow')) else: #if n == 1, will simply return a a methane molecule, #with an available 'down' port. #We will label this as 'methyl_start', again for consistency #with longer chain molecules. if n == 1: self.add(CH3_down(), 'methyl_start') if n > 1: self.add(Backbone(n=n-1, cap_start_mol=CH2(), cap_start_name= 'methyl_start', cap_start_port = 'up', cap_end_mol = CH3_down(), cap_end_name='methyl_end', cap_end_port= 'down'))
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.recipes.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)
def __init__(self, n=1, cap_start_mol=CH3(), cap_start_name= 'methyl_start', cap_start_port = 'up', cap_end_mol = OH(), cap_end_name='OH', cap_end_port= 'down'): super(Backbone, self).__init__() if n < 1: raise ValueError('n must be 1 or more') if n == 1: cap1 = cap_start_mol self.add(cap1, cap_start_name) cap2 = cap_end_mol self.add(cap2, cap_end_name) mb.force_overlap(cap1, cap1[cap_start_port], cap2[cap_end_port]) if n == 2: cap1 = cap_start_mol self.add(cap1, cap_start_name) chain = CH2() self.add(chain, 'chain') mb.force_overlap(move_this=chain, from_positions=chain['down'], to_positions=cap1[cap_start_port], ) cap2 = cap_end_mol self.add(cap2, cap_end_name) mb.force_overlap(move_this=cap2, from_positions=cap2[cap_end_port], to_positions=chain['up']) if n > 2: cap1 = cap_start_mol self.add(cap1, cap_start_name) chain = mb.recipes.Polymer(CH2(), n=n-1, port_labels=('up', 'down')) self.add(chain, 'chain') mb.force_overlap(move_this=chain, from_positions=chain['down'], to_positions=cap1[cap_start_port]) cap2 = cap_end_mol self.add(cap2, cap_end_name) mb.force_overlap(move_this=cap2, from_positions=cap2[cap_end_port], to_positions=chain['up'])
def test_label_consistency(self): from mbuild.lib.moieties import CH2, CH3 parent = mb.Compound(name='Hierarchy1') for i in range(10): parent.add(CH2()) parent.add(CH3()) compound_to_json(parent, 'parent.json', include_ports=True) parent_copy = compound_from_json('parent.json') assert len(parent_copy['CH2']) == len(parent['CH2']) assert parent_copy.labels.keys() == parent.labels.keys() for child, child_copy in zip(parent.successors(), parent_copy.successors()): assert child.labels.keys() == child_copy.labels.keys() assert parent_copy.available_ports() == parent.available_ports()
def __init__(self, n=1, cap_start=True): super(Alcohol, self).__init__() if n < 1: raise ValueError('n must be 1 or more') if cap_start: self.add(Backbone(n=n, cap_start_mol=CH3(), cap_start_name= 'methyl_start', cap_start_port = 'up', cap_end_mol = OH(), cap_end_name='OH_end', cap_end_port= 'down')) else: self.add(Backbone(n=n, cap_start_mol=CH2(), cap_start_name= 'methyl_start', cap_start_port = 'up', cap_end_mol = OH(), cap_end_name='OH_end', cap_end_port= 'down'))
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.lib.recipes.Polymer([CH2()]) chain.build(n=chain_length) self.add(chain, 'chain')
def __init__(self, n=1, cap_start=True): super(Acid, self).__init__() if n < 1: raise ValueError('n must be 1 or more') if cap_start: if n ==1: self.add(Methanol()) if n > 1: self.add(Backbone(n=n-1, cap_start_mol=CH3(), cap_start_name= 'methyl_start', cap_start_port = 'up', cap_end_mol = COOH(), cap_end_name='COOH_end', cap_end_port= 'down')) else: if n ==1: self.add(COOH()) if n > 1: self.add(Backbone(n=n-1, cap_start_mol=CH2(), cap_start_name= 'methyl_start', cap_start_port = 'up', cap_end_mol = COOH(), cap_end_name='COOH_end', cap_end_port= 'down'))
def __init__(self, n=3, cap_front=True, cap_end=True): """Initialize an Alkane Compound. Args: n: Number of carbon atoms. cap_front: Add a methyl group to the beginning of chain ('down' port). cap_end: Add a methyl group to the end of chain ('up' port). """ if n < 1: raise ValueError('n must be 1 or more') super(Alkane, self).__init__() # Handle the case of Methane and Ethane separately if n < 3: if n == 1: if cap_front and cap_end: self.add(Methane(), 'chain') elif cap_front != cap_end: chain = CH3() self.add(chain, 'chain') if cap_front: self.add(chain['up'], 'down', containment=False) else: self.add(chain['up'], 'up', containment=False) else: chain = CH2() self.add(chain) self.add(chain['down'], 'down', containment=False) self.add(chain['up'], 'up', containment=False) elif n == 2: if cap_front and cap_end: self.add(Ethane(), 'chain') elif cap_front != cap_end: chain = CH2() 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']) self.add(chain['down'], 'down', containment=False) else: self.add(CH3(), 'methyl_end') mb.force_overlap(self['methyl_end'], self['methyl_end']['up'], self['chain']['down']) self.add(chain['up'], 'up', containment=False) else: chain = CH2() self.add(chain, 'chain') self.add(chain['down'], 'down', containment=False) self.add(chain['up'], 'up', containment=False) # Handle general case of n >= 3 else: # Adjust length of Polmyer for absence of methyl terminations. if not cap_front: n += 1 if not cap_end: n += 1 chain = mb.recipes.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)
def ch2(self): from mbuild.lib.moieties import CH2 return CH2()
def __init__(self, n=3, cap_front=True, cap_end=True): """Initialize an Alkane Compound. Args ---- n: int, default 3, Number of carbon atoms. cap_front: bool, default True Whether to add a methyl group to the beginning of chain ('down' port). cap_end: bool, default True, Whether to add a methyl group to the end of chain ('up' port). """ if n < 1: raise ValueError("n must be 1 or more") super(Alkane, self).__init__() # Handle the case of Methane and Ethane separately if n < 3: if n == 1: if cap_front and cap_end: self.add(Methane(), "chain") elif cap_front != cap_end: chain = CH3() self.add(chain, "chain") if cap_front: self.add(chain["up"], "down", containment=False) else: self.add(chain["up"], "up", containment=False) else: chain = CH2() self.add(chain) self.add(chain["down"], "down", containment=False) self.add(chain["up"], "up", containment=False) elif n == 2: if cap_front and cap_end: self.add(Ethane(), "chain") elif cap_front != cap_end: chain = CH2() 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"], ) self.add(chain["down"], "down", containment=False) else: self.add(CH3(), "methyl_end") mb.force_overlap( self["methyl_end"], self["methyl_end"]["up"], self["chain"]["down"], ) self.add(chain["up"], "up", containment=False) else: chain = CH2() self.add(chain, "chain") self.add(chain["down"], "down", containment=False) self.add(chain["up"], "up", containment=False) # Handle general case of n >= 3 else: end_groups = [None, None] # Adjust length of Polmyer for absence of methyl terminations. if cap_front: n -= 1 end_groups[0] = CH3() if cap_end: n -= 1 end_groups[1] = CH3() chain = mb.recipes.Polymer(monomers=[CH2()], end_groups=end_groups) chain.build(n, add_hydrogens=False) self.add(chain, "chain") if not cap_front: # Hoist port label to Alkane level. self.add(self["chain"]["up"], "up", containment=False) if not cap_end: # Hoist port label to Alkane level. self.add(self["chain"]["down"], "down", containment=False)
first_part = this_part else: # Transform this part, such that it's bottom port is rotated # and translated to the last part's top port. force_overlap( this_part, this_part.labels[port_labels[1]], last_part.labels[port_labels[0]], ) last_part = this_part if n_added == n * len(sequence) - 1: break # Hoist the last part's top port to be the top port of the polymer. self.add(last_part.labels[port_labels[0]], port_labels[0], containment=False) # Hoist the first part's bottom port to the bottom port of the polymer. self.add(first_part.labels[port_labels[1]], port_labels[1], containment=False) if __name__ == "__main__": from mbuild.lib.moieties import CH2 ch2 = CH2() poly = Polymer(ch2, n=13, port_labels=("up", "down")) poly.save("polymer.mol2")
def __init__(self, n=3, cap_front=True, cap_end=True): """Initialize an PEG Compound. Args: n: Number of carbon + oxygen atoms. After deducted for cap front, cap end, and ch2 end n will be divided by 3 since there are 3 element in a PEG 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(PEG, 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 = CH3() self.add(ch3_end, 'methyl_end') # If n is not divisible by 3, add CH2 in place of them m = 0 while n % 3 != 0: m += 1 n -= 1 n = n//3 chain = mb.lib.recipes.Polymer(PegMonomer(), n=n, port_labels=('up', 'down')) self.add(chain, 'chain') if m != 0: ch2_chain = mb.lib.recipes.Polymer(CH2(), n=m, port_labels=('up','down')) self.add(ch2_chain, 'ch2_chain') mb.force_overlap(self['ch2_chain'], self['ch2_chain']['up'], self['chain']['down']) if cap_end: mb.force_overlap(self['methyl_end'], self['methyl_end']['down'], self['ch2_chain']['down']) else: self.add(ch2_chain['down'], 'down', containment=False) else: 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['methyl_front'], self['methyl_front']['down'], self['chain']['up']) else: self.add(chain['up'], 'up', containment=False) else: if cap_end or cap_front: ch3 = CH3() self.add(ch3, 'methyl') self.add(ch3['down'], 'down', containment=False) else: peg = PegMonomer() self.add(peg, 'PEG') self.add(peg['up'], 'up', containment=False) self.add(peg['down'], 'down', containment=False)