Exemple #1
0
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
Exemple #2
0
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
Exemple #3
0
    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