def ketone(length, pos, name="ketone", short="KET", is_h=True): """This function generates linear ketone molecules. Parameters ---------- length : integer Number of carbon atoms pos : integer Position of the oxygen atom name : string, optional Molecule name short : string, optional Molecule short name is_h : bool True if hydrogens are needed Returns ------- mol : Molecule Molecule object """ # Check input if length < 3: print("Specified length is too small for ketones ...") return # Initialize Molecule mol = Molecule(name, short) # Define bond lengths and angles b = {"cc": 0.153, "ch": 0.109, "co": 0.123} a = {"ccc": 30.00, "cch": 109.47} # Add carbons mol.add("C", [0, 0, 0]) angle = a["ccc"] for i in range(length-1): angle *= -1 mol.add("C", mol.get_num()-1, r=b["cc"], theta=angle) # Add oxygen angle = -90 if pos % 2 == 0 else 90 mol.add("O", pos-1, r=b["co"], theta=angle) # Add hydrogens if is_h: angle = -90 for i in range(length): # Boundary if i==0 or i==length-1: for j in range(3): mol.add("H", i, r=b["ch"], theta=angle-30, phi=120*j) # Inner elif not i == pos-1: mol.add("H", i, r=b["ch"], theta=angle, phi=a["cch"]) mol.add("H", i, r=b["ch"], theta=angle, phi=-a["cch"]) # Switch orientation angle *= -1 # Move to zero mol.zero() # Return molecule return mol
def alcohol(length, name="alcohol", short="ALC", is_h=True): """This function generates linear alcohol molecules. Parameters ---------- length : integer Number of carbon atoms name : string, optional Molecule name short : string, optional Molecule short name is_h : bool, optional True if hydrogens are needed Returns ------- mol : Molecule Molecule object """ # Initialize Molecule mol = Molecule(name, short) # Define bond lengths and angles b = {"cc": 0.153, "ch": 0.109, "co": 0.143, "oh": 0.098} a = {"ccc": 30.00, "cch": 109.47, "occ": 30.00, "coh": 109.47} # Add carbons mol.add("C", [0, 0, 0]) angle = a["ccc"] for i in range(length-1): angle *= -1 mol.add("C", mol.get_num()-1, r=b["cc"], theta=angle) # Add hydroxy mol.add("O", mol.get_num()-1, r=b["co"], theta=-angle) mol.add("H", mol.get_num()-1, r=b["oh"], theta=angle) # Add hydrogens if is_h: if length > 1: angle = -90 for i in range(length): # Boundary if i==0: for j in range(3): mol.add("H", i, r=b["ch"], theta=angle-30, phi=120*j) # Inner else: mol.add("H", i, r=b["ch"], theta=angle, phi=a["cch"]) mol.add("H", i, r=b["ch"], theta=angle, phi=-a["cch"]) # Switch orientation angle *= -1 # Methanol else: for i in range(3): mol.add("H", 0, r=b["ch"], theta=a["cch"], phi=i*120) # Move to zero mol.zero() # Return molecule return mol
def pattern(self): """Construct minimal block structure. Returns ------- block : Molecule Minimal block structure """ # Initialize mols = [self._hexagonal() for x in range(3)] # Combine three hexagonal molecules mols[0].add("O", 2, r=self._b) mols[0].add("O", 6, r=self._b) mols[0].add("O", 10, r=self._b) mols[1].move(0, mols[0].pos(12)) mols[1].translate([0, 0, self._b]) mols[1].delete([1, 2, 3, 4, 5, 6, 7]) mols[2].move(0, mols[0].pos(14)) mols[2].translate([0, 0, self._b]) mols[2].delete([2, 3, 4, 5, 6, 7, 8, 9, 10, 11]) # Build block block = [] for i in range(11): block.append(Molecule(inp=copy.deepcopy(mols))) block[1].rotate("x", 180) block[1].move(18, block[0].pos(18)) block[1].translate([0, 0, self._b * 2]) block[1].add("O", block[0].pos(18), r=self._b) block[2].rotate("x", 180) block[2].move(0, block[0].pos(18)) block[3].move(4, block[0].pos(15)) block[4].rotate("x", 180) block[4].move(16, block[0].pos(18)) block[4].delete([21, 19, 15, 20, 14, 12, 10, 2, 11, 1, 0]) block[5].move(6, block[1].pos(16)) block[5].delete([21, 19, 15, 20, 14, 12, 10, 2, 11, 1, 0]) # Delete overlapping molecules block = Molecule(inp=block) overlap = block.overlap() block.delete(sum([overlap[x] for x in overlap], [])) # Check overlapping atoms due to repetition for dim in range(3): for pm in range(2): # Define translate vector translate = [0, 0, 0] translate[dim] = self._repeat[dim] translate[dim] *= -1 if pm == 1 else 1 # Remove atoms block = Molecule(inp=[block]) mol_repeat = copy.deepcopy(block) mol_repeat.translate(translate) block.delete([ x for x in Molecule(inp=[block, mol_repeat]).overlap() if x < block.get_num() ]) # Move to zero block.zero() return block