Example #1
0
def create_esp_surfaces(Molecule):
    Rads = [VdW99[i] for i in Molecule.elem]
    #xyz = Molecule.xyzs[0]
    na = Molecule.na
    printxyz=True
    np.set_printoptions(precision=10, linewidth=120)
    # Pass 1: This will determine the number of ESP points.
    num_esp = []
    for i, xyz in enumerate(Molecule.xyzs):
        print("Generating grid points for snapshot %i\r" % i)
        num_esp_shell = []
        for j in [1.4, 1.6, 1.8, 2.0]:
            Radii = list(np.array(Rads)*j)
            vfloat = drive_msms(xyz, Radii, 20.0/j)
            if len(vfloat) < na:
                warn_press_key("I generated less ESP points than atoms!")
            num_esp_shell.append(len(vfloat))
        num_esp.append(num_esp_shell)

    num_esp = np.array(num_esp)
    num_pts = np.amin(num_esp,axis=0) / 100
    print("Number of points: ", num_pts)
    input()
    # We do not store.
    # Pass 2: This will actually print out the ESP grids.
    Mol_ESP = []
    for i, xyz in enumerate(Molecule.xyzs):
        esp_pts = []
        for sh, j in enumerate([1.4, 1.6, 1.8, 2.0]):
            Radii = list(np.array(Rads)*j)
            vfloat = drive_msms(xyz, Radii, 20.0/j)

            # print "Calling MSMS"
            # MS = MSMS(coords = list(xyz), radii = Radii)
            # print "Computing"
            # MS.compute(density=20.0/j)
            # print "Getting triangles"
            # vfloat, vint, tri = MS.getTriangles()
            # #vfloat = vfloat_shell[sh]
            a = list(range(len(vfloat)))
            random.shuffle(a)
            # We'll be careful and generate lots of ESP points, mm.
            # But we can't have a different number of points per snapshots, mm.
            for idx in a[:num_pts[sh]]:
                esp_pts.append(vfloat[idx][:3])
        if printxyz:
            Out = []
            Out.append("%i" % (len(xyz) + len(esp_pts)))
            Out.append("Molecule plus ESP points (heliums)")
            for j, x in enumerate(xyz):
                Out.append(format_xyz_coord(Molecule.elem[j], x))
            for esp_pt in esp_pts:
                Out.append(format_xyz_coord('He',esp_pt))
            fout = open('molecule_esp.xyz','w' if i == 0 else 'a')
            for line in Out:
                print(line, file=fout)
            fout.close()
        Mol_ESP.append(esp_pts)

    return Mol_ESP
Example #2
0
def create_esp_surfaces(Molecule):
    from forcebalance.mslib import MSMS
    Rads = [VdW99[i] for i in Molecule.elem]
    #xyz = Molecule.xyzs[0]
    na = Molecule.na
    Mol_ESP = []
    printxyz=0
    for i, xyz in enumerate(Molecule.xyzs):
        print "Generating grid points for snapshot %i\r" % i
        esp_pts = []
        for j in [1.4, 1.6, 1.8, 2.0]:
            MS = MSMS(coords = list(xyz), radii = list(np.array(Rads)*j))
            MS.compute(density=0.5)
            vfloat, vint, tri = MS.getTriangles()
            a = range(len(vfloat))
            random.shuffle(a)
            if len(vfloat) < na:
                warn_press_key("I generated less ESP points than atoms!")
            for idx in a[:na]:
                esp_pts.append(vfloat[idx][:3])
        if printxyz:
            Out = []
            Out.append("%i" % (len(xyz) + len(esp_pts)))
            Out.append("Molecule plus ESP points")
            for j, x in enumerate(xyz):
                Out.append(format_xyz_coord(Molecule.elem[j], x))
            for esp_pt in esp_pts:
                Out.append(format_xyz_coord('chg',esp_pt))
            fout = open('Mao.xyz','w')
            for line in Out:
                print >> fout, line
            fout.close()
            sys.exit(1)
        Mol_ESP.append(esp_pts)
    return Mol_ESP