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
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))
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
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
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
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
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