| import numpy as np |
| """ |
| read_msms.py: Read an msms output file that was output by MSMS (MSMS is the program we use to build a surface) |
| Pablo Gainza - LPDI STI EPFL 2019 |
| Released under an Apache License 2.0 |
| """ |
|
|
| def read_msms(file_root): |
| |
| |
| vertfile = open(file_root + ".vert") |
| meshdata = (vertfile.read().rstrip()).split("\n") |
| vertfile.close() |
|
|
| |
| count = {} |
| header = meshdata[2].split() |
| count["vertices"] = int(header[0]) |
| |
| vertices = np.zeros((count["vertices"], 3)) |
| normalv = np.zeros((count["vertices"], 3)) |
| atom_id = [""] * count["vertices"] |
| res_id = [""] * count["vertices"] |
| for i in range(3, len(meshdata)): |
| fields = meshdata[i].split() |
| vi = i - 3 |
| vertices[vi][0] = float(fields[0]) |
| vertices[vi][1] = float(fields[1]) |
| vertices[vi][2] = float(fields[2]) |
| normalv[vi][0] = float(fields[3]) |
| normalv[vi][1] = float(fields[4]) |
| normalv[vi][2] = float(fields[5]) |
| atom_id[vi] = fields[7] |
| res_id[vi] = fields[9] |
| count["vertices"] -= 1 |
|
|
| |
| facefile = open(file_root + ".face") |
| meshdata = (facefile.read().rstrip()).split("\n") |
| facefile.close() |
|
|
| |
| header = meshdata[2].split() |
| count["faces"] = int(header[0]) |
| faces = np.zeros((count["faces"], 3), dtype=int) |
| normalf = np.zeros((count["faces"], 3)) |
|
|
| for i in range(3, len(meshdata)): |
| fi = i - 3 |
| fields = meshdata[i].split() |
| faces[fi][0] = int(fields[0]) - 1 |
| faces[fi][1] = int(fields[1]) - 1 |
| faces[fi][2] = int(fields[2]) - 1 |
| count["faces"] -= 1 |
|
|
| assert count["vertices"] == 0 |
| assert count["faces"] == 0 |
|
|
| return vertices, faces, normalv, res_id |
|
|
|
|