Browse Source

fixed indices of ladders

Thomas Forest 4 years ago
parent
commit
a242afd662
4 changed files with 156 additions and 122 deletions
  1. 132 109
      src/atom.py
  2. 11 9
      src/dssp.py
  3. 10 3
      src/pdb.py
  4. 3 1
      src/structure.py

+ 132 - 109
src/atom.py View File

@@ -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

+ 11 - 9
src/dssp.py View File

@@ -24,11 +24,11 @@ else:
24 24
 
25 25
     #turns = get_turns(pdb_file.residues)
26 26
     #get_helix(pdb_file.residues, turns)
27
-    get_bends(pdb_file.residues)
27
+    #get_bends(pdb_file.residues)
28 28
     # get_chirality(pdb_file.residues)
29
-    # bridges = get_bridges(pdb_file.residues)
30
-    # ladders = get_ladders(bridges, pdb_file.residues)
31
-    # get_sheets(ladders)  
29
+    bridges = get_bridges(pdb_file.residues)
30
+    ladders = get_ladders(bridges, pdb_file.residues)
31
+    get_sheets(ladders)  
32 32
 
33 33
     # print("NBRIDGES",len(bridges))
34 34
 
@@ -47,13 +47,15 @@ else:
47 47
 
48 48
     #get_phi_psi(residues)
49 49
     #print(residues[2].atoms, residues[0].resid, residues[1].resid)
50
-    print(get_TCO(residues[2],residues[3]))
50
+    #print(get_TCO(residues[2],residues[3]))
51 51
 
52
-    #turns = {}
53
-    ladders = {}
54 52
     for i,res in enumerate(residues):
55 53
         # res.get_turns(residues, turns)
56
-        #res.get_helix(residues)
54
+        res.get_helix(residues)
57 55
         #res.get_bridges(residues)
58
-        res.get_ladders(residues, ladders)
56
+        #res.get_ladders(residues, ladders)
59 57
         #res.get_sheets(residues)
58
+
59
+for i,ladder in enumerate(ladders.values()):
60
+    print(chr(65+i))
61
+    

+ 10 - 3
src/pdb.py View File

@@ -50,13 +50,20 @@ class PDBFile:
50 50
                 # get the current indice of atom
51 51
                 i = self.atoms.index(atom)
52 52
                 # if this is a brand new residue
53
+
54
+                if(len(self.atoms)>1 and
55
+                   (atom.res_seq_nb == self.atoms[i-1].res_seq_nb
56
+                    and atom.insertion_code!=self.atoms[i-1].insertion_code)):
57
+                    self.residues.append(Residue(temp_atoms, len(self.residues)+1))
58
+                    temp_atoms=[]
59
+                
53 60
                 if(len(self.atoms)>1
54
-                   and atom.res_seq_nb != self.atoms[i-1].res_seq_nb):
55
-                    self.residues.append(Residue(temp_atoms))
61
+                   and (atom.res_seq_nb != self.atoms[i-1].res_seq_nb)):
62
+                    self.residues.append(Residue(temp_atoms, len(self.residues)+1))
56 63
                     temp_atoms=[]
57 64
                 temp_atoms.append(atom)
58 65
         # last residue
59
-        self.residues.append(Residue(temp_atoms))
66
+        self.residues.append(Residue(temp_atoms, len(self.residues)))
60 67
         # hydrogens should represent in average 50% of total atoms...
61 68
         # We use 30% threshold...
62 69
         if(count_h/len(temp_atoms)<0.30):

+ 3 - 1
src/structure.py View File

@@ -14,11 +14,13 @@ class Turn(Structure):
14 14
                         
15 15
 class Bridge(Structure):
16 16
 
17
-    def __init__(self, bridge_type, res_num, res_partner):
17
+    def __init__(self, bridge_type, res_num, res_partner, indices):
18 18
         self.bridge_type = bridge_type
19 19
         self.res_num = res_num
20 20
         self.res_partner = res_partner
21 21
         Structure.res = res_num
22
+        self.i = indices[0]
23
+        self.j = indices[1]
22 24
 
23 25
 class Helix(Structure):
24 26