-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathcluster_means.py
executable file
·113 lines (93 loc) · 3.62 KB
/
cluster_means.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
#!/usr/bin/env python
"""
Generates cluster means and coordinate data for ligands.
Makes it possible to not visualize entire trajectories since
they won't fit in memory any more
"""
import os
from beak.msm import visualizers, sampler
from configparser import ConfigParser
from msmbuilder.utils import load
from vmd import atomsel
#==============================================================================
def save_representative_frames(sample, outdir, msm=None, clusters=None):
"""
Saves a frame of protein and ligand representing each cluster
in the sampler in a given directory
Args:
sample (Sampler): MSM trajectory object
outdir (str): Location for saved cluster files
msm (MarkovStateModel): MSM to use
clusters (clusters): Cluster stuff
"""
if msm is None:
msm = sample.mmsm
if clusters is None:
clusters = sample.mclust
protsel = "(protein or resname ACE NMA) and not same fragment as resname %s" \
% " ".join(sample.ligands)
fn = open(os.path.join(outdir, "rmsds"), 'w')
for cl in msm.mapping_.values():
print("On cluster: %s" % cl)
x = visualizers.get_representative_ligand(sample, cl, clusters)
if x is None: continue
lg, rms = x
m, f, l = lg
print(" Molid: %d\tFrame: %d\tLigand: %d" % (m,f,l))
fn.write("%s\t%f\n" % (cl, rms))
atomsel("(%s) or (same fragment as residue %d)" % (protsel, l),
molid=m, frame=f).write(
"mae", os.path.join(outdir, "%s.mae" % cl))
fn.close()
#==============================================================================
if __name__ == "__main__":
# Parse arguments
if not os.environ.get("CONFIG"):
print("Usage: env CONFIG= config file")
quit(1)
cfg = ConfigParser(interpolation=None)
cfg.read(os.environ.get("CONFIG"))
# Load optional env variables files
if os.environ.get("GEN"):
prevgen = int(os.environ.get("GEN"))
else:
prevgen = cfg.getint("production", "generation")-1
if os.environ.get("STRIDE"):
stride = int(os.environ.get("STRIDE"))
else:
stride = 1
if os.environ.get("MSM"):
mmsm = load(os.environ.get("MSM"))
else:
mmsm = load(os.path.join(cfg["system"]["rootdir"], "production",
str(prevgen), "mmsm_G%d.pkl" % prevgen))
if os.environ.get("CLUST"):
clust = load(os.environ.get("CLUST"))
else:
clust = load(os.path.join(cfg["system"]["rootdir"], "production",
str(prevgen), "testing.mcluster.pkl"))
clust = [c[::stride] for c in clust]
# Make directory structure
if os.environ.get("CDIR"):
outdir = os.environ.get("CDIR")
else:
outdir = os.path.join(cfg["system"]["rootdir"], "clusters",
str(prevgen))
if not os.path.isdir(outdir):
os.mkdir(outdir)
updir = os.path.join(cfg["system"]["rootdir"], "clusters")
if not os.path.isdir(updir):
os.mkdir(updir)
updir = os.path.join(updir, str(prevgen))
if not os.path.isdir(updir):
os.mkdir(updir)
# Load data
# Do one generation before because generation always lags
samp = sampler.Sampler(configfile=os.environ.get("CONFIG"),
generation=prevgen,
stride=stride)
save_representative_frames(samp,
outdir,
msm=mmsm,
clusters=clust)
#==============================================================================