1 | #!@PYTHON@
|
---|
2 | #
|
---|
3 | # calculates pair correlation for a given residuum in a PDB file and the TIP3 molecules
|
---|
4 |
|
---|
5 | import sys, string, re, math
|
---|
6 | wrerr = sys.stderr.write
|
---|
7 | wrout = sys.stdout.write
|
---|
8 |
|
---|
9 | # check for parameters
|
---|
10 | if len(sys.argv) < 3:
|
---|
11 | wrerr("Usage: "+sys.argv[0]+" <prefix> <offset to xyz> <residuum regexp>\n")
|
---|
12 | sys.exit(1)
|
---|
13 |
|
---|
14 | bin_no=15
|
---|
15 | offset=int(sys.argv[2])
|
---|
16 | res=sys.argv[3]
|
---|
17 | output = open(sys.argv[1]+".min_distance", "w")
|
---|
18 | output2 = open(sys.argv[1]+".density", "w")
|
---|
19 | output.write("# timestep\tminimum distance to atom in "+res+" molecule\n")
|
---|
20 | output2.write("# timestep\t")
|
---|
21 | for n in range(bin_no):
|
---|
22 | output2.write("[%d,%d]\t" % (n,n+1))
|
---|
23 | output2.write("\n")
|
---|
24 |
|
---|
25 | timestep=0
|
---|
26 | TYRMatch=re.compile(res)
|
---|
27 | TIPMatch=re.compile('TIP3.*WTO')
|
---|
28 |
|
---|
29 | input = open((sys.argv[1]+".pov1.%04d.pdb" % (timestep)), "r")
|
---|
30 | while input:
|
---|
31 | wrout("Scanning time step %d ... " % (timestep))
|
---|
32 | # parse the file
|
---|
33 | TYRs=[]
|
---|
34 | TIPs=[]
|
---|
35 | min=[]
|
---|
36 | bins=[]
|
---|
37 | for line in input:
|
---|
38 | if "#" in line:
|
---|
39 | continue
|
---|
40 | if "END" in line:
|
---|
41 | break
|
---|
42 | if "CONECT" in line:
|
---|
43 | break
|
---|
44 | if TYRMatch.search(line):
|
---|
45 | entries=line.split()
|
---|
46 | for n in range(3):
|
---|
47 | TYRs.append(float(entries[n+offset]))
|
---|
48 | if TIPMatch.search(line):
|
---|
49 | entries=line.split()
|
---|
50 | for n in range(3):
|
---|
51 | TIPs.append(float(entries[n+offset]))
|
---|
52 | input.close()
|
---|
53 |
|
---|
54 | # reset arrays
|
---|
55 | center=[0.,0.,0.]
|
---|
56 | for j in range(len(TYRs)/3):
|
---|
57 | min.append(-1.)
|
---|
58 | for n in range(bin_no):
|
---|
59 | bins.append(0)
|
---|
60 | for n in range(3):
|
---|
61 | center[n]+=TYRs[j*3+n]
|
---|
62 | for n in range(3):
|
---|
63 | center[n]/=len(TYRs)/3
|
---|
64 | wrout(" atoms (%d,%d) ... center is at [%f,%f,%f] ... " % (len(TYRs)/3,len(TIPs)/3,center[0], center[1], center[2]))
|
---|
65 | # calculate distance
|
---|
66 | for i in range(len(TIPs)/3):
|
---|
67 | mindistance=-1.
|
---|
68 | for j in range(len(TYRs)/3):
|
---|
69 | # minimum distance
|
---|
70 | distance=0.
|
---|
71 | for n in range(3):
|
---|
72 | distance+=(TIPs[i*3+n]-TYRs[j*3+n])*(TIPs[i*3+n]-TYRs[j*3+n])
|
---|
73 | if (min[j]==-1) or (min[j]*min[j]>distance): # note down minimum distance
|
---|
74 | # radial density
|
---|
75 | min[j] = math.sqrt(distance)
|
---|
76 | if (mindistance == -1) or (mindistance > min[j]):
|
---|
77 | mindistance=min[j]
|
---|
78 | # distance=0.
|
---|
79 | # for n in range(3):
|
---|
80 | # distance+=(TIPs[i*3+n]-center[n])*(TIPs[i*3+n]-center[n])
|
---|
81 | for n in range(bin_no):
|
---|
82 | if (n*n<mindistance) and ((n+1)*(n+1)>mindistance):
|
---|
83 | bins[n]+=1
|
---|
84 | # store values
|
---|
85 | wrout(" writing ... ")
|
---|
86 | output.write("%d\t" % (timestep))
|
---|
87 | for n in range(len(TYRs)/3):
|
---|
88 | output.write("%lg\t" % (min[n]))
|
---|
89 | output.write("\n")
|
---|
90 | output2.write("%d\t" % (timestep))
|
---|
91 | for n in range(bin_no):
|
---|
92 | output2.write("%d\t" % (bins[n]))
|
---|
93 | output2.write("\n")
|
---|
94 | wrout("done.\n")
|
---|
95 | # open next file
|
---|
96 | timestep+=1
|
---|
97 | input = open((sys.argv[1]+".pov1.%04d.pdb" % (timestep)), "r")
|
---|
98 |
|
---|