Esempio n. 1
0
def rms(config, compare: Tuple[str, str], out: click.File):
    """Calculate the root mean squared deviation between two structures using quaternions.
    Based on a Fortran implementation by Chaok Seok, Evangelos
    Coutsias, and Ken Dill."""

    from rmsd import rmsd

    mol1 = ksr.constructMolecule(geometry=compare[0])
    nat1 = mol1.get_number_of_atoms()
    mol2 = ksr.constructMolecule(geometry=compare[1])
    nat2 = mol2.get_number_of_atoms()

    # for RMSD comparison both coordinates need the same atom count
    if nat1 != nat2:
        click.echo(
            "Error: number of atoms do not match in {} and in {}".format(
                compare[0], compare[1]
            ),
            file=out,  # type: ignore
        )
        errorbye(out)

    coord1 = mol1.get_positions()
    coord2 = mol2.get_positions()

    # get RMSD error and rotation matrix u
    error, u = rmsd(nat1, coord1, coord2)

    verbosePrinter(config.verbose, "RMSD {} Angstrom".format(error), out)
    verbosePrinter(config.verbose, "Rotation Matrix", out)
    click.echo(u, file=out)  # type: ignore

    return error, u
Esempio n. 2
0
def sort(config, inp: str, start: str, out: click.File):
    """Sort input geoemtry according to connectivity.

    start defines on which atom we start the sorting process.
    """

    molecule = ksr.constructMolecule(geometry=inp)
    bonds = molecule.get_bonds()
    nat = molecule.get_number_of_atoms()

    # construct graph
    from sort import Graph

    g = Graph(inp)

    for i in range(nat):
        partners = bonds[i]
        for j in partners:
            # add edges
            g.addEdge(j, i)

    if start == "X":
        # start at #0
        g.BFS(0)
    else:
        # start at atom #start
        g.BFS(int(start))
Esempio n. 3
0
def bonds(config, inp: str, partner: int, constrain: bool, out: click.File):
    """Get information about covalent bonding partner."""

    import os

    molecule = ksr.constructMolecule(geometry=inp)

    if partner == "X":
        # Get index table of covalent bonding partners
        bonds = molecule.get_bonds(partner=partner)
    else:
        # Get all covalent bonding partners of atom #partner
        bonds = molecule.get_bonds(partner=partner)

    # write constrain file in xtb format
    if constrain:
        nat = molecule.get_number_of_atoms()
        f = open("constrain.inp", "w")
        s = os.linesep
        f.write("$constrain" + s)
        for i in range(nat):
            for partner in bonds[i]:
                f.write(
                    " distance: {}, {}, auto".format(
                        i + 1 + config.shift, partner + 1 + config.shift
                    )
                    + s
                )
        f.write("$end" + s)
        f.close()
        pass

    return bonds
Esempio n. 4
0
def eeq(config, inp: str, out: click.File, chrg: int):
    """Electronegativity equilibration atomic partial charges."""

    molecule = ksr.constructMolecule(geometry=inp)
    nat = molecule.get_number_of_atoms()
    eeq = molecule.get_eeq(chrg)
    for i in range(nat):
        verbosePrinter(config.verbose, eeq[i], out)

    return eeq
Esempio n. 5
0
def alp(config, inp: str, out: click.File, chrg: int, molecular: bool):
    """Static atomic polarizabilities in Bohr^3."""

    molecule = ksr.constructMolecule(geometry=inp)
    nat = molecule.get_number_of_atoms()
    alp = molecule.get_alp(charge=chrg)
    if molecular:
        verbosePrinter(config.verbose, np.sum(alp), out)
    else:
        for i in range(nat):
            verbosePrinter(config.verbose, alp[i], out)

    return alp
Esempio n. 6
0
def vdw(config, inp: str, out: click.File, chrg: int, vdwtype: str, angstrom: bool):
    """Charge-dependent atomic van der Waals radii in Bohr."""

    molecule = ksr.constructMolecule(geometry=inp)
    nat = molecule.get_number_of_atoms()
    vdw = np.zeros(shape=(nat,), dtype=np.float64)

    if angstrom:
        from units import Bohr

        scale = Bohr
    else:
        scale = 1.0

    vdw = np.zeros(shape=(nat,), dtype=np.float64)
    vdw = molecule.get_vdw(chrg, vdwtype, scale)
    for i in range(nat):
        verbosePrinter(config.verbose, vdw[i], out)

    return vdw
Esempio n. 7
0
def lig(config, inp: str, center: int, out: click.File):
    """Get all substructures (or ligands) that are bound to the center atom."""

    # setup reference molecular structure
    ref = ksr.constructMolecule(geometry=inp)
    nat = ref.get_number_of_atoms()

    # get all covalent bonding partner in reference complex
    covbonds = config.context.invoke(bonds, inp=inp)

    from rmsd import recursiveGetSubstructures

    verbosePrinter(config.verbose, "Write out substructures for {}".format(center), out)

    substructures = recursiveGetSubstructures(nat, covbonds, center)

    if config.verbose:
        k = 0
        for path in substructures:
            verbosePrinter(
                config.verbose, "Substructure {}: {}".format(k, path), out,
            )
            k += 1