|
@@ -22,7 +22,7 @@ class Atom:
|
22
|
22
|
self.coords = coordinates
|
23
|
23
|
|
24
|
24
|
class Residue:
|
25
|
|
- def __init__(self, atoms_list):
|
|
25
|
+ def __init__(self, atoms_list, indice):
|
26
|
26
|
self.atoms = {}
|
27
|
27
|
for atom in atoms_list:
|
28
|
28
|
self.atoms[atom.atom_name] = atom
|
|
@@ -30,6 +30,7 @@ class Residue:
|
30
|
30
|
self.res_name = atom.res_name
|
31
|
31
|
self.chain_id = atom.chain_id
|
32
|
32
|
self.insertion_code = atom.insertion_code
|
|
33
|
+ self.indice = indice
|
33
|
34
|
|
34
|
35
|
|
35
|
36
|
def h_bond(self, res2):
|
|
@@ -120,11 +121,12 @@ class Residue:
|
120
|
121
|
# finally add the strongest bridge at i and j pos
|
121
|
122
|
if(strongest_bridge):
|
122
|
123
|
bridges[coord_bridge[0]] = (Bridge(strongest_bridge['btype'],
|
123
|
|
- strongest_bridge['ipos'],
|
124
|
|
- strongest_bridge['jpos']))
|
|
124
|
+ strongest_bridge['ipos'],
|
|
125
|
+ strongest_bridge['jpos']))
|
|
126
|
+
|
125
|
127
|
bridges[coord_bridge[1]] = (Bridge(strongest_bridge['btype'],
|
126
|
|
- strongest_bridge['jpos'],
|
127
|
|
- strongest_bridge['ipos']))
|
|
128
|
+ strongest_bridge['jpos'],
|
|
129
|
+ strongest_bridge['ipos']))
|
128
|
130
|
if(len(bridges)>0):
|
129
|
131
|
return(bridges[coord_bridge[0]])
|
130
|
132
|
else:
|
|
@@ -145,36 +147,6 @@ class Residue:
|
145
|
147
|
return(self.get_turns(residues).turn_type, residues[i].resid)
|
146
|
148
|
return(False)
|
147
|
149
|
|
148
|
|
- def get_helix2(self, residues):
|
149
|
|
- """
|
150
|
|
- Return if there is an helix at a given residue,
|
151
|
|
- as well as its type.
|
152
|
|
- """
|
153
|
|
- i = residues.index(self)
|
154
|
|
- # if there are no turns or it is the first residue, skip
|
155
|
|
- if i == 0:
|
156
|
|
- return False
|
157
|
|
-
|
158
|
|
- if(i in turns.keys() and i-1 in turns.keys()):
|
159
|
|
- print(turns[i].turn_type,"- HELIX at", residues[i].resid)
|
160
|
|
- return(turns[i].turn_type, residues[i].resid)
|
161
|
|
- return(False)
|
162
|
|
-
|
163
|
|
- def get_ladders(self, residues, ladders={}):
|
164
|
|
- #ladders = {}
|
165
|
|
- i = residues.index(self)
|
166
|
|
- if i != 0:
|
167
|
|
- if self.get_bridges(residues):
|
168
|
|
- if (residues[i-1].get_bridges(residues)):
|
169
|
|
- local_bridge = self.get_bridges(residues)
|
170
|
|
- consec_bridge = residues[i-1].get_bridges(residues)
|
171
|
|
- if local_bridge.bridge_type == consec_bridge.bridge_type:
|
172
|
|
- print("ladder", consec_bridge.res_num, local_bridge.res_num)
|
173
|
|
- ladders[i] = {'start':i-1,
|
174
|
|
- 'end':i,
|
175
|
|
- 'bridges':[consec_bridge, local_bridge]}
|
176
|
|
- return ladders
|
177
|
|
-
|
178
|
150
|
def get_ladder(self, residues):
|
179
|
151
|
#ladders = {}
|
180
|
152
|
i = residues.index(self)
|
|
@@ -189,76 +161,112 @@ class Residue:
|
189
|
161
|
'end':local_bridge.res_num,
|
190
|
162
|
'bridges':[consec_bridge, local_bridge]}
|
191
|
163
|
return ladder
|
192
|
|
- return False
|
|
164
|
+ return False
|
193
|
165
|
|
194
|
|
- def get_sheets(self, residues):
|
195
|
|
- """
|
196
|
|
- Bridges between ladders.
|
197
|
|
- Check if 1 bridge between one ladder and one or more other ladders.
|
198
|
|
- Iterate over all residues of one ladder and check if bridge with other residues
|
199
|
|
- of the other ladders.
|
200
|
|
- """
|
201
|
|
- sheets = {}
|
202
|
|
- sheet_start = residues.index(self)
|
203
|
|
- j=sheet_start
|
204
|
|
- k=2
|
205
|
|
- if(self.get_ladder(residues)):
|
206
|
|
- local_ladder = self.get_ladder(residues)
|
207
|
|
- while j < len(residues)-2:
|
208
|
|
- k = 2
|
209
|
|
- while residues[j+k].get_ladder(residues):
|
210
|
|
- if(residues[j+k].get_bridges(residues)):
|
211
|
|
- j = j+k
|
212
|
|
- k+=1
|
213
|
|
- if(k>):
|
214
|
|
- last = j
|
215
|
|
- j+=1
|
216
|
|
- print(j)
|
217
|
|
- if(k>2):
|
218
|
|
- sheet_end = last
|
219
|
|
-
|
220
|
|
- print("SHEET", sheet_start, sheet_end)
|
|
166
|
+def get_bridges(residues):
|
|
167
|
+ bridges = {}
|
|
168
|
+ bridge = {}
|
|
169
|
+ strongest_bridge = {}
|
|
170
|
+ for i in range(1,len(residues)-4):
|
|
171
|
+ E_min = 0
|
|
172
|
+ for j in range(i+2,len(residues)-1):
|
|
173
|
+ # select triplet with the minimal energy
|
221
|
174
|
|
222
|
|
- def get_sheets2(self):
|
223
|
|
- """
|
224
|
|
- Bridges between ladders.
|
225
|
|
- Check if 1 bridge between one ladder and one or more other ladders.
|
226
|
|
- Iterate over all residues of one ladder and check if bridge with other residues
|
227
|
|
- of the other ladders.
|
228
|
|
- """
|
229
|
|
- sheets = {}
|
230
|
|
- for ladder in ladders:
|
231
|
|
- for ladd2 in ladders:
|
232
|
|
- for bridge in ladders[ladder]['bridges']:
|
233
|
|
- if bridge.res_partner in res_list(ladders[ladd2]):
|
234
|
|
- print("ladder",ladders[ladder]['start'], ladders[ladder]['end'],"bridge",bridge.res_num, bridge.res_partner,
|
235
|
|
- "ladder 2",ladders[ladd2]['start'], ladders[ladd2]['end'])
|
236
|
|
- #print("stop ladder 2")
|
237
|
|
- print("stop ladder 1")
|
|
175
|
+ if(residues[i-1].h_bond(residues[j])<-0.5
|
|
176
|
+ and residues[j].h_bond(residues[i+1])<-0.5):
|
|
177
|
+ bridge = {'res1':residues[i-1].h_bond(residues[j]),
|
|
178
|
+ 'res2':residues[j].h_bond(residues[i+1]),
|
|
179
|
+ 'ipos':residues[i].resid,
|
|
180
|
+ 'jpos':residues[j].resid,
|
|
181
|
+ 'i':residues[i].indice,
|
|
182
|
+ 'j':residues[j].indice,
|
|
183
|
+ 'btype':"para"}
|
|
184
|
+
|
|
185
|
+ if(residues[j-1].h_bond(residues[i])<-0.5
|
|
186
|
+ and residues[i].h_bond(residues[j+1])<-0.5):
|
|
187
|
+ bridge = {'res1':residues[j-1].h_bond(residues[i]),
|
|
188
|
+ 'res2':residues[i].h_bond(residues[j+1]),
|
|
189
|
+ 'ipos':residues[i].resid,
|
|
190
|
+ 'jpos':residues[j].resid,
|
|
191
|
+ 'i':residues[i].indice,
|
|
192
|
+ 'j':residues[j].indice,
|
|
193
|
+ 'btype':"para"}
|
238
|
194
|
|
239
|
|
-
|
|
195
|
+ if(residues[i].h_bond(residues[j])<-0.5
|
|
196
|
+ and residues[j].h_bond(residues[i])<-0.5):
|
|
197
|
+ bridge = {'res1':residues[i].h_bond(residues[j]),
|
|
198
|
+ 'res2':residues[j].h_bond(residues[i]),
|
|
199
|
+ 'ipos':residues[i].resid,
|
|
200
|
+ 'jpos':residues[j].resid,
|
|
201
|
+ 'i':residues[i].indice,
|
|
202
|
+ 'j':residues[j].indice,
|
|
203
|
+ 'btype':"anti"}
|
|
204
|
+
|
|
205
|
+ if(residues[i-1].h_bond(residues[j+1])<-0.5
|
|
206
|
+ and residues[j-1].h_bond(residues[i+1])<-0.5):
|
|
207
|
+ bridge = {'res1':residues[i-1].h_bond(residues[j+1]),
|
|
208
|
+ 'res2':residues[j-1].h_bond(residues[i+1]),
|
|
209
|
+ 'ipos':residues[i].resid,
|
|
210
|
+ 'jpos':residues[j].resid,
|
|
211
|
+ 'i':residues[i].indice,
|
|
212
|
+ 'j':residues[j].indice,
|
|
213
|
+ 'btype':"anti"}
|
|
214
|
+
|
|
215
|
+ if(bridge):
|
|
216
|
+ if(bridge['res1']+bridge['res2']<E_min):
|
|
217
|
+ E_min = bridge['res1']+bridge['res2']
|
|
218
|
+ strongest_bridge = bridge
|
|
219
|
+ coord_bridge = [i,j]
|
|
220
|
+ bridge = {}
|
|
221
|
+ # finally add the strongest bridge at i and j pos
|
|
222
|
+ if(strongest_bridge):
|
|
223
|
+ bridges[strongest_bridge['i']] = (Bridge(strongest_bridge['btype'],
|
|
224
|
+ strongest_bridge['ipos'],
|
|
225
|
+ strongest_bridge['jpos'],
|
|
226
|
+ [strongest_bridge['i'],
|
|
227
|
+ strongest_bridge['j']]))
|
|
228
|
+ bridges[strongest_bridge['j']] = (Bridge(strongest_bridge['btype'],
|
|
229
|
+ strongest_bridge['jpos'],
|
|
230
|
+ strongest_bridge['ipos'],
|
|
231
|
+ [strongest_bridge['i'],
|
|
232
|
+ strongest_bridge['j']]))
|
|
233
|
+ if(len(bridges)>0):
|
|
234
|
+ return(bridges)
|
|
235
|
+ else:
|
|
236
|
+ return(False)
|
|
237
|
+
|
|
238
|
+def get_ladders(bridges, residues):
|
|
239
|
+ ladders = {}
|
|
240
|
+ i = 1
|
|
241
|
+ while i < len(residues):
|
|
242
|
+ k = 1
|
|
243
|
+ if i in bridges.keys():
|
|
244
|
+ temp_bridges = [bridges[i]]
|
|
245
|
+ while ((i+k in bridges.keys()) and
|
|
246
|
+ (bridges[i].bridge_type == bridges[i+k].bridge_type)):
|
|
247
|
+ temp_bridges.append(bridges[i+k])
|
|
248
|
+ k+=1
|
|
249
|
+ if k>1:
|
|
250
|
+ #print("ladder", bridges[i].res_num, bridges[i+k-1].res_num)
|
|
251
|
+ ladders[i] = {'start':bridges[i].res_num,
|
|
252
|
+ 'end':bridges[i+k-1].res_num,
|
|
253
|
+ 'bridges':temp_bridges,
|
|
254
|
+ 'i':i,
|
|
255
|
+ 'j':i+k-1}
|
|
256
|
+ i+=k-1
|
|
257
|
+ else:
|
|
258
|
+ i+=1
|
|
259
|
+ return ladders
|
|
260
|
+
|
|
261
|
+def connected_ladders(ladd_1, ladd_2):
|
|
262
|
+ links = []
|
|
263
|
+ for bridge in ladd_1['bridges']:
|
|
264
|
+ if bridge.res_partner in res_list(ladd_2):
|
|
265
|
+ return([ladd_1['i'], ladd_1['j'], bridge.i, bridge.j,
|
|
266
|
+ ladd_2['i'], ladd_2['j']])
|
|
267
|
+
|
|
268
|
+ return False
|
240
|
269
|
|
241
|
|
- def get_ladders2(self, bridges, residues):
|
242
|
|
- ladders = {}
|
243
|
|
- i = residues.index(self)
|
244
|
|
- if i != 0:
|
245
|
|
- k = 1
|
246
|
|
- if i in bridges.keys():
|
247
|
|
- temp_bridges = [bridges[i]]
|
248
|
|
- while ((i+k in bridges.keys()) and
|
249
|
|
- (bridges[i].bridge_type == bridges[i+k].bridge_type)):
|
250
|
|
- temp_bridges.append(bridges[i+k])
|
251
|
|
- k+=1
|
252
|
|
- if k>1:
|
253
|
|
- print("ladder", bridges[i].res_num, bridges[i+k-1].res_num)
|
254
|
|
- ladders[i] = {'start':bridges[i].res_num,
|
255
|
|
- 'end':bridges[i+k-1].res_num,
|
256
|
|
- 'bridges':temp_bridges}
|
257
|
|
- i+=k-1
|
258
|
|
- else:
|
259
|
|
- i+=1
|
260
|
|
- return ladders
|
261
|
|
-
|
262
|
270
|
def get_sheets(ladders):
|
263
|
271
|
"""
|
264
|
272
|
Bridges between ladders.
|
|
@@ -266,15 +274,30 @@ def get_sheets(ladders):
|
266
|
274
|
Iterate over all residues of one ladder and check if bridge with other residues
|
267
|
275
|
of the other ladders.
|
268
|
276
|
"""
|
|
277
|
+ ladds = [ elem for elem in ladders.values() ]
|
269
|
278
|
sheets = {}
|
270
|
|
- for ladder in ladders:
|
271
|
|
- for ladd2 in ladders:
|
272
|
|
- for bridge in ladders[ladder]['bridges']:
|
273
|
|
- if bridge.res_partner in res_list(ladders[ladd2]):
|
274
|
|
- print("ladder",ladders[ladder]['start'], ladders[ladder]['end'],"bridge",bridge.res_num, bridge.res_partner,
|
275
|
|
- "ladder 2",ladders[ladd2]['start'], ladders[ladd2]['end'])
|
276
|
|
- #print("stop ladder 2")
|
277
|
|
- print("stop ladder 1")
|
|
279
|
+ i = 0
|
|
280
|
+ while i < len(ladds):
|
|
281
|
+ j = i+1
|
|
282
|
+ ladd = ladds[i]
|
|
283
|
+ ladd1 = ladds[i]
|
|
284
|
+ ladd2 = ladds[j]
|
|
285
|
+
|
|
286
|
+ while j < len(ladds):
|
|
287
|
+ print(connected_ladders(ladd1, ladd2))
|
|
288
|
+ if connected_ladders(ladd1, ladd2)!=False:
|
|
289
|
+ ladd1 = ladd2
|
|
290
|
+ #print(connected_ladders(ladd1, ladd2)[4])
|
|
291
|
+ ladd2 = ladders[connected_ladders(ladd1, ladd2)[4]]
|
|
292
|
+ j+=1
|
|
293
|
+ print(ladd['i'], ladd2['i'])
|
|
294
|
+ i+=1
|
|
295
|
+ # for ladder in ladders:
|
|
296
|
+ # for ladd2 in ladders:
|
|
297
|
+ # if connected_ladders(ladders[ladder], ladders[ladd2]):
|
|
298
|
+ # pass
|
|
299
|
+ #print("ladder",ladders[ladder]['i'], ladders[ladder]['j'],"bridge",bridge.i, bridge.j,
|
|
300
|
+ # "ladder 2",ladders[ladd2]['i'], ladders[ladd2]['j'])
|
278
|
301
|
|
279
|
302
|
def res_list(ladder):
|
280
|
303
|
# TODO : method in ladder class
|