-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathStructureTools.py
More file actions
236 lines (191 loc) · 8.1 KB
/
Copy pathStructureTools.py
File metadata and controls
236 lines (191 loc) · 8.1 KB
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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
#!/usr/bin/env python
#-*- coding : utf8 -*-
"""
Author : LesBellesGosses
Description : Projet Barstar
Structure Tools : les differentes fonctions de bases permettant de faire l'analyse globale et locale
"""
from math import sqrt
import numpy as np
import matplotlib.pyplot as plt
#parser un fichier pdb
def ParsingPDB (pdbFile):
"""but : creer un dictionnaire a partir d'un fichier pdb
input : le nom d'un fichier pdb
output : un dictionnaire
"""
infile = open(pdbFile, "r")
lines = infile.readlines()
dico_models={}
for line in lines:
if line[:5:] == "MODEL": #Si la ligne commence par MODEL,On rajoute le numero de conformation comme cle
dico_molecule=line[9:14].strip()
dico_models[dico_molecule] = {}
dico_models[dico_molecule]["chains"] = []
if line[:4:] == 'ATOM': #Si la ligne commence par ATOM, les sous-dictionnaires sont crees a partir de ces lignes
chain = line[21]
if chain not in dico_models[dico_molecule].keys():
dico_models[dico_molecule][chain] = {}
dico_models[dico_molecule]["chains"].append(chain)
dico_models[dico_molecule][chain]["reslist"]=[]
res = line[23:26].strip()
if res not in dico_models[dico_molecule][chain].keys() :
dico_models[dico_molecule][chain]["reslist"].append(res)
dico_models[dico_molecule][chain][res] = {}
dico_models[dico_molecule][chain][res]["atomlist"]=[]
atom = line[13:16].strip()
dico_models[dico_molecule][chain][res]["atomlist"].append(atom)
dico_models[dico_molecule][chain][res][atom] = {}
dico_models[dico_molecule][chain][res][atom]['x'] = line[31:38]
dico_models[dico_molecule][chain][res][atom]['y'] = line[39:46]
dico_models[dico_molecule][chain][res][atom]['z'] = line[47:54]
dico_models[dico_molecule][chain][res][atom]['id'] = line[7:11]
dico_models[dico_molecule][chain][res]['resname'] = line[17:20]
infile.close()
return(dico_models)
#Fonction qui lit les premieres lignes du fichier pdb et mets dans une liste les valeurs du temps
def Temps (pdbFile):
"""but : creer un liste contenant les valeurs du temps
input : le nom d'un fichier pdb
output : une liste
"""
temps = []
infile = open (pdbFile, "r")
lines = infile.readlines()
for line in lines :
if line[:5:] == "TITLE":
timet=line[65:80].strip()
temps.append(timet)
infile.close()
return(temps)
#Calcul de distance entre deux points
def Distance(x1,y1,z1,x2,y2,z2):
"""but : calculer la distance dans l'espace tridimensionnelle
input : les coordonnees de deux points
output : la distance entre ces deux points
"""
return(sqrt((x1-x2)**2+(y1-y2)**2+(z1-z2)**2))
#calcul du centre de masse (en negligeant la masse atomique)
def CM(listx,listy,listz):
"""but : calculer le centre de masse
input : l'ensemble des abscisses, des ordonnees et des cotes en liste
output : une liste contenant l'abscisse, l'ordonnee et la cote du centre de masse
"""
x=sum(listx)/float(len(listx))
y=sum(listy)/float(len(listy))
z=sum(listz)/float(len(listy))
coords=[x,y,z]
return coords
#creer un dictionnaire de centre de masse pour une proteine
def CMglob(dico):
"""but : calculer le centre de masse de chaque residu ainsi que le centre de masse de la proteine
input : dictionnaire de proteine pour une conformation donnee (dico[conformation])
output : un dictionnaire contenant le centre de masse de chaque residu et le centre de masse de la proteine
"""
globx=[] #liste qui permet de stocker le x de tous les atomes d'une prot
globy=[]
globz=[]
glob={}
glob["residulist"]=[]
for chain in dico["chains"]:
for res in dico[chain]["reslist"]:
listx=[]
listy=[]
listz=[]
for atom in dico[chain][res]["atomlist"]:
listx.append(float(dico[chain][res][atom]['x']))
listy.append(float(dico[chain][res][atom]['y']))
listz.append(float(dico[chain][res][atom]['z']))
globx.extend(listx)
globy.extend(listy)
globz.extend(listz)
glob[res]=CM(listx,listy,listz)
glob["residulist"].append(dico[chain][res]["resname"])
glob["prot"]=CM(globx,globy,globz)
return glob # dictionnaire contient le centre de masse de chaque residu et le centre de masse de la proteine
#calcul de RMSD
def RMSD(list_delta):
"""but : calculer le RMSD
input : une liste de distances
output : la valeur de RMSD
"""
distcarre=[]
for delta in list_delta:
distcarre.append(delta**2)
return (sqrt((sum(distcarre))/float(len(list_delta))))
#creer des classes
def createClass(dico, bestscore, nbcl) :
"""but : un dictionnaire permettant de classer les valeurs d'un dictionnaire en nombre de classes que les utilisateurs souhaitent
input : dictionnaire, valeur maximale, nombre de classes
output : dictionnaire contenant chaque element de la liste comme cle, et sa classe comme valeur
"""
classe={} #dictionnaire de la classe aux elements
compteur=0
seuil=0
while len(classe) != nbcl:
compteur=compteur+1
classe[compteur]=[]
seuil=(nbcl-compteur)*(bestscore/nbcl)
for cle,element in dico.items(): #on parcours le dico
if element >= seuil:
classe[compteur].append(cle) #on range le numero du residu
dico_etoclass={} # dictionnaire d'element a la classe
for key in classe:
for elem in classe[key]:
if not elem in dico_etoclass:
dico_etoclass[elem]=key
return dico_etoclass
#fonction pour tracer les graphes
def graph(ordonnee,abscisse,ordonne2,titre,titrey,titrex):
"""but : Representer les resultats sous forme de graphique pour les interpreter
input :les coordonnees x=ordonnee,y=abscisse et y2=ordonne2 : y2 permet de superposer 2 graphs si on le souhaite(si on veut faire un graph unique, y2 sera vide)
titrey et titrex sont les legendes des coordonees des axes y et x
x,y et y2 peuvent etre des dictionnaires a condition que leur valeurs ne soient pas des cles
output : un graphique =>sous forme de line (pas point)
"""
absc=[] #Liste qui va contenir les coordonnees de l'abscisse
ordo=[] #Liste qui va contenir les coordonnnees de l'ordonees
ordo2=[] #Pour le cas ou on veut superposer des graphs
if type(ordonnee) is list : #si cest une liste
ordo=ordonnee
else: #sinon c'est un dictionnaire
if "0" in ordonnee:
for i in range(len(ordonnee)): #on parcours le dictionnaire
ordo.append(ordonnee["%s"%i]) #Et on range dans une liste les differentes valeurs contenues dans le dictionnaire, dans l'ordre dans lesquelles on les a trouve
else:
for i in range(1,len(ordonnee)):
ordo.append(ordonnee["%s"%i])
if type(ordonne2) is list: #Si cest une liste
ordo2=ordonne2
else:
if "0" in ordonnee:
for i in range(len(ordonne2)):
ordo2.append(ordonne2["%s"%i])
else:
for i in range(1,len(ordonne2)):
ordo2.append(ordonne2["%s"%i])
if type(abscisse) is list:
absc=abscisse
else:
for i in range(len(abscisse)):
absc.append((abscisse["%s"%i]))
#Si la liste ordo2 est vide, on fait une simple representation
if not ordo2:
y=np.array(ordo)
x=np.array(absc)
plt.title(titre)
plt.xlabel(titrex)
plt.ylabel(titrey)
plt.plot(x,y)
#Sinon on fait des graphs superposes
else:
y=np.array(ordo) #RMSD
y2=np.array(ordo2)
x=np.array(absc) #La conformation=numero du modele
plt.title(titre)
plt.xlabel(titrex)
plt.ylabel(titrey)
plt.plot(x,y,c='red')
plt.plot(x,y2,c='blue')
#On affiche le graph
plt.show()