Contact
CoCalc Logo Icon
StoreFeaturesDocsShareSupport News AboutSign UpSign In
| Download
Views: 16
1
import sys
2
import numpy as np
3
from itertools import permutations as perm
4
5
rmsd_list=[1000]
6
final_atom_names=[]
7
8
def rmsd(V, W):
9
"""
10
Calculate Root-mean-square deviation from two sets of vectors V and W.
11
12
Parameters
13
----------
14
V : array
15
(N,D) matrix, where N is points and D is dimension.
16
W : array
17
(N,D) matrix, where N is points and D is dimension.
18
19
Returns
20
-------
21
rmsd : float
22
Root-mean-square deviation
23
24
"""
25
D = len(V[0])
26
N = len(V)
27
rmsd = 0.0
28
for v, w in zip(V, W):
29
rmsd += sum([(v[i] - w[i])**2.0 for i in range(D)])
30
return np.sqrt(rmsd/N)
31
32
def calculator(initial_file, final_file):
33
34
p_atoms, p_all = "xyz", initial_file
35
q_atoms, q_all = "xyz", final_file
36
#de ingelezen data
37
38
# Calculate 'dumb' RMSD
39
normal_rmsd =rmsd(p_all[:], q_all[:])
40
if normal_rmsd < rmsd_list[0]:
41
rmsd_list[0] = normal_rmsd
42
#de calculator
43
return normal_rmsd
44
45
#--------------------------- inlezen --> xyz file 1 is altijd de initial file, xyz file 2 is altijd de final file
46
47
def inread(file_xyz, list_coordinates, list_names, initial):
48
filename = file_xyz
49
datafile = open(filename)
50
51
lines= list(datafile.readlines())
52
53
if initial == True:
54
molecule_length.append(int(lines.pop(0).rstrip()))
55
#hier isoleren we de molecuul lengte van het initial-molecule.
56
elif initial == False:
57
lines.pop(0) #haalt het eerste element uit de lijst, dit is de lengte van het molecuul
58
else:
59
print("Fourth statement should be True or False")
60
61
for line in lines:
62
#lines bestaat uit een lijst met elk atoom en zijn coordinaten als apart element in deze lijst
63
list_coordinates.append(map(str, line.split()))
64
#maakt van elk atoom en zijn coordinaten een aparte lijst en zet deze in een overkoepelende lijst (initial_molecule).
65
list_coordinates.pop(0)
66
#haalt het eerste element uit de lijst omdat dit een n/ was dus dit resulteert nu in een lege lijst
67
68
for atoms in list_coordinates:
69
list_names.append(atoms.pop(0).rstrip())
70
#verwijdert uit alle lijsten in initial_molecule het eerste element (de atoomnaam) en plaatst deze in de lijst atom_names.
71
72
for atoms in list_coordinates:
73
#maakt van alle overgebleven coordinaten in initial_molecule een float
74
for i, coordinates in enumerate(atoms):
75
atoms[i]= float(coordinates)
76
77
78
79
80
81
#--------------------------- permuteren en vergelijken
82
#dit wordt de lijst waar elke keer het gepermuteerde molecuul in opgeslagen gaat worden
83
def permutate_and_calculate(molecule_length, initial_molecule_coordinates ,final_molecule_coordinates, final_atom_names):
84
85
86
permutated_final_molecule=[]
87
permutated_atom_names=[]
88
counter = 0
89
90
for i in perm(range(molecule_length)):
91
#deze loop gaat elke keer 1 finial molecule permuteren en dan vergelijken met het initial molecule
92
#i: lijst met permutatie nummers (bv: 1,2,3,4,5)
93
for j in i:
94
#j: is dit cijfer individueel
95
permutated_final_molecule.append(final_molecule_coordinates[j])
96
#haalt uit de final_molecule lijst de coordinaten met de indexen die hij krijgt via j
97
permutated_atom_names.append(final_atom_names[j])
98
#haalt uit de atom_names_final lijst de atoom namen met de zelfde indexen die hij krijgt via j
99
permutated_final_molecule= np.asarray(permutated_final_molecule)
100
#maakt van de final_molecule_lijst een array (is nodig als input)
101
if calculator(initial_molecule_coordinates, permutated_final_molecule) != None:
102
#als de nieuwe berekende rmsd groter is dan de vorige returned het progamma een none, anders returned hij de nieuwe rmsd
103
better_list[0] = permutated_atom_names
104
better_list[1] = permutated_final_molecule
105
permutated_final_molecule=[]
106
#leegt de lijsten zodat ze opnieuw gebruikt kunnen worden
107
permutated_atom_names=[]
108
counter += 1
109
print ("Hij heeft {} loops gerunt".format(counter))
110
111
112
molecule_length=[]
113
initial_molecule = []
114
atom_names = []
115
116
inread(sys.argv[1], initial_molecule, atom_names, True)
117
118
final_molecule= []
119
atom_names_final = []
120
121
inread(sys.argv[2], final_molecule, atom_names_final, False)
122
123
initial_molecule= np.asarray(initial_molecule)
124
#maakt van de lijst met lijsten met coordinaten een array.
125
126
better_list=[0,0]
127
128
permutate_and_calculate(molecule_length[0],initial_molecule, final_molecule, atom_names_final)
129
print (better_list[0])
130
print (better_list[1])
131
132
133
134