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, out=out) nat = ref.get_number_of_atoms() # get all covalent bonding partner in reference complex covbonds = config.context.invoke(bonds, inp=inp) from kallisto.rmsd import recursiveGetSubstructures silentPrinter(config.silent, "Write out substructures for {}".format(center), out) substructures = recursiveGetSubstructures(nat, covbonds, center) k = 0 for path in substructures: silentPrinter( config.silent, "Substructure {}: {}".format(k, path), out, ) k += 1
def vdw(config, inp: str, out: click.File, chrg: int, vdwtype: str, angstrom: bool): """Charge-dependent atomic van der Waals radii in Bohr.""" # Available VDWs availableVDW = ("rahm", "truhlar") if vdwtype not in availableVDW: errorbye( 'VDW definition "{}" is not implemented. Please use "rahm" or "truhlar"'.format( vdwtype ) ) molecule = ksr.constructMolecule(geometry=inp, out=out) nat = molecule.get_number_of_atoms() if angstrom: from kallisto.units import Bohr scale = Bohr else: scale = 1.0 vdw = molecule.get_vdw(chrg, vdwtype, scale) for i in range(nat): silentPrinter(config.silent, vdw[i], out) return vdw
def rms(config, inp: 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 kallisto.rmsd import rmsd mol1 = ksr.constructMolecule(geometry=inp[0], out=out) nat1 = mol1.get_number_of_atoms() mol2 = ksr.constructMolecule(geometry=inp[1], out=out) nat2 = mol2.get_number_of_atoms() # for RMSD comparison both coordinates need the same atom count if nat1 != nat2: errorbye( "Error: number of atoms do not match in {} and in {}".format( inp[0], inp[1]), ) coord1 = mol1.get_positions() coord2 = mol2.get_positions() # get RMSD error and rotation matrix u error, u = rmsd(nat1, coord1, coord2) silentPrinter(config.silent, "RMSD {} Angstrom".format(error), out) silentPrinter(config.silent, "Rotation Matrix", out) click.echo(u, file=out) # type: ignore return error, u
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, out=out) 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) nat = molecule.get_number_of_atoms() # write constrain file in xtb format if constrain: 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() if partner != "X": silentPrinter(config.silent, str(bonds), out) else: for i in range(nat): silentPrinter(config.silent, str(bonds[i]), out) return bonds
def prox(config, inp: str, size: Tuple[int, int], out: click.File): """Atomic proximity shells.""" molecule = ksr.constructMolecule(geometry=inp, out=out) nat = molecule.get_number_of_atoms() prox = molecule.get_prox(size) for i in range(nat): silentPrinter(config.silent, prox[i], out) return prox
def cns(config, inp: str, out: click.File, cntype: str): """Atomic coordination numbers.""" molecule = ksr.constructMolecule(geometry=inp, out=out) cns = molecule.get_cns(cntype) nat = molecule.get_number_of_atoms() for i in range(nat): silentPrinter(config.silent, cns[i], out) return cns
def eeq(config, inp: str, out: click.File, chrg: int): """Electronegativity equilibration atomic partial charges.""" molecule = ksr.constructMolecule(geometry=inp, out=out) nat = molecule.get_number_of_atoms() eeq = molecule.get_eeq(chrg) for i in range(nat): silentPrinter(config.silent, eeq[i], out) return eeq
def alp(config, inp: str, out: click.File, chrg: int, molecular: bool): """Static atomic polarizabilities in Bohr^3.""" molecule = ksr.constructMolecule(geometry=inp, out=out) nat = molecule.get_number_of_atoms() alp = molecule.get_alp(charge=chrg) if molecular: silentPrinter(config.silent, np.sum(alp), out) else: for i in range(nat): silentPrinter(config.silent, alp[i], out) return alp
def prox(config, inp: str, size: Tuple[int, int], out: click.File): """Atomic proximity shells.""" # Stop if outer border is smaller than inner one if size[0] > size[1]: errorbye("Outer border is smaller than inner one. Switch them and try again!") molecule = ksr.constructMolecule(geometry=inp, out=out) nat = molecule.get_number_of_atoms() prox = molecule.get_prox(size) for i in range(nat): silentPrinter(config.silent, prox[i], out) return prox
def cns(config, inp: str, out: click.File, cntype: str): """Atomic coordination numbers.""" # Available CNs availableCN = ("erf", "cov", "exp") if cntype not in availableCN: errorbye( 'CN definition "{}" is not implemented. Please use "erf", "cov", or "exp"' .format(cntype)) molecule = ksr.constructMolecule(geometry=inp, out=out) cns = molecule.get_cns(cntype) nat = molecule.get_number_of_atoms() for i in range(nat): silentPrinter(config.silent, cns[i], out) return cns
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, out=out) nat = molecule.get_number_of_atoms() if angstrom: from kallisto.units import Bohr scale = Bohr else: scale = 1.0 vdw = molecule.get_vdw(chrg, vdwtype, scale) for i in range(nat): silentPrinter(config.silent, vdw[i], out) return vdw
def stm(config, inp: str, origin: int, partner: int, out: click.File): """Calculate sterimol descriptors using kallisto van der Waals radii.""" # setup molecular structure mol = ksr.constructMolecule(geometry=inp, out=out) # calculate Sterimol descriptors: L, bmin, bmax from kallisto.sterics import getClassicalSterimol L, bmin, bmax = getClassicalSterimol(mol, origin, partner) # print origin and partner silentPrinter( config.silent, "Calculated for atom {0} (origin) and atom {1} (partner)".format( origin, partner ), out, ) # descriptors in Bohr silentPrinter( config.silent, "L, Bmin, Bmax / au: {:8.6f} {:8.6f} {:8.6f}".format(L, bmin, bmax), out, ) # descriptors in Angstrom from kallisto.units import Bohr silentPrinter( config.silent, "L, Bmin, Bmax / A: {:8.6f} {:8.6f} {:8.6f}".format( L * Bohr, bmin * Bohr, bmax * Bohr ), out, ) return L, bmin, bmax