fixed indices of ladders
parent
182fee3f7a
commit
a242afd662
195
src/atom.py
195
src/atom.py
|
|
@ -22,7 +22,7 @@ class Atom:
|
||||||
self.coords = coordinates
|
self.coords = coordinates
|
||||||
|
|
||||||
class Residue:
|
class Residue:
|
||||||
def __init__(self, atoms_list):
|
def __init__(self, atoms_list, indice):
|
||||||
self.atoms = {}
|
self.atoms = {}
|
||||||
for atom in atoms_list:
|
for atom in atoms_list:
|
||||||
self.atoms[atom.atom_name] = atom
|
self.atoms[atom.atom_name] = atom
|
||||||
|
|
@ -30,6 +30,7 @@ class Residue:
|
||||||
self.res_name = atom.res_name
|
self.res_name = atom.res_name
|
||||||
self.chain_id = atom.chain_id
|
self.chain_id = atom.chain_id
|
||||||
self.insertion_code = atom.insertion_code
|
self.insertion_code = atom.insertion_code
|
||||||
|
self.indice = indice
|
||||||
|
|
||||||
|
|
||||||
def h_bond(self, res2):
|
def h_bond(self, res2):
|
||||||
|
|
@ -122,6 +123,7 @@ class Residue:
|
||||||
bridges[coord_bridge[0]] = (Bridge(strongest_bridge['btype'],
|
bridges[coord_bridge[0]] = (Bridge(strongest_bridge['btype'],
|
||||||
strongest_bridge['ipos'],
|
strongest_bridge['ipos'],
|
||||||
strongest_bridge['jpos']))
|
strongest_bridge['jpos']))
|
||||||
|
|
||||||
bridges[coord_bridge[1]] = (Bridge(strongest_bridge['btype'],
|
bridges[coord_bridge[1]] = (Bridge(strongest_bridge['btype'],
|
||||||
strongest_bridge['jpos'],
|
strongest_bridge['jpos'],
|
||||||
strongest_bridge['ipos']))
|
strongest_bridge['ipos']))
|
||||||
|
|
@ -145,36 +147,6 @@ class Residue:
|
||||||
return(self.get_turns(residues).turn_type, residues[i].resid)
|
return(self.get_turns(residues).turn_type, residues[i].resid)
|
||||||
return(False)
|
return(False)
|
||||||
|
|
||||||
def get_helix2(self, residues):
|
|
||||||
"""
|
|
||||||
Return if there is an helix at a given residue,
|
|
||||||
as well as its type.
|
|
||||||
"""
|
|
||||||
i = residues.index(self)
|
|
||||||
# if there are no turns or it is the first residue, skip
|
|
||||||
if i == 0:
|
|
||||||
return False
|
|
||||||
|
|
||||||
if(i in turns.keys() and i-1 in turns.keys()):
|
|
||||||
print(turns[i].turn_type,"- HELIX at", residues[i].resid)
|
|
||||||
return(turns[i].turn_type, residues[i].resid)
|
|
||||||
return(False)
|
|
||||||
|
|
||||||
def get_ladders(self, residues, ladders={}):
|
|
||||||
#ladders = {}
|
|
||||||
i = residues.index(self)
|
|
||||||
if i != 0:
|
|
||||||
if self.get_bridges(residues):
|
|
||||||
if (residues[i-1].get_bridges(residues)):
|
|
||||||
local_bridge = self.get_bridges(residues)
|
|
||||||
consec_bridge = residues[i-1].get_bridges(residues)
|
|
||||||
if local_bridge.bridge_type == consec_bridge.bridge_type:
|
|
||||||
print("ladder", consec_bridge.res_num, local_bridge.res_num)
|
|
||||||
ladders[i] = {'start':i-1,
|
|
||||||
'end':i,
|
|
||||||
'bridges':[consec_bridge, local_bridge]}
|
|
||||||
return ladders
|
|
||||||
|
|
||||||
def get_ladder(self, residues):
|
def get_ladder(self, residues):
|
||||||
#ladders = {}
|
#ladders = {}
|
||||||
i = residues.index(self)
|
i = residues.index(self)
|
||||||
|
|
@ -191,57 +163,82 @@ class Residue:
|
||||||
return ladder
|
return ladder
|
||||||
return False
|
return False
|
||||||
|
|
||||||
def get_sheets(self, residues):
|
def get_bridges(residues):
|
||||||
"""
|
bridges = {}
|
||||||
Bridges between ladders.
|
bridge = {}
|
||||||
Check if 1 bridge between one ladder and one or more other ladders.
|
strongest_bridge = {}
|
||||||
Iterate over all residues of one ladder and check if bridge with other residues
|
for i in range(1,len(residues)-4):
|
||||||
of the other ladders.
|
E_min = 0
|
||||||
"""
|
for j in range(i+2,len(residues)-1):
|
||||||
sheets = {}
|
# select triplet with the minimal energy
|
||||||
sheet_start = residues.index(self)
|
|
||||||
j=sheet_start
|
|
||||||
k=2
|
|
||||||
if(self.get_ladder(residues)):
|
|
||||||
local_ladder = self.get_ladder(residues)
|
|
||||||
while j < len(residues)-2:
|
|
||||||
k = 2
|
|
||||||
while residues[j+k].get_ladder(residues):
|
|
||||||
if(residues[j+k].get_bridges(residues)):
|
|
||||||
j = j+k
|
|
||||||
k+=1
|
|
||||||
if(k>):
|
|
||||||
last = j
|
|
||||||
j+=1
|
|
||||||
print(j)
|
|
||||||
if(k>2):
|
|
||||||
sheet_end = last
|
|
||||||
|
|
||||||
print("SHEET", sheet_start, sheet_end)
|
if(residues[i-1].h_bond(residues[j])<-0.5
|
||||||
|
and residues[j].h_bond(residues[i+1])<-0.5):
|
||||||
|
bridge = {'res1':residues[i-1].h_bond(residues[j]),
|
||||||
|
'res2':residues[j].h_bond(residues[i+1]),
|
||||||
|
'ipos':residues[i].resid,
|
||||||
|
'jpos':residues[j].resid,
|
||||||
|
'i':residues[i].indice,
|
||||||
|
'j':residues[j].indice,
|
||||||
|
'btype':"para"}
|
||||||
|
|
||||||
def get_sheets2(self):
|
if(residues[j-1].h_bond(residues[i])<-0.5
|
||||||
"""
|
and residues[i].h_bond(residues[j+1])<-0.5):
|
||||||
Bridges between ladders.
|
bridge = {'res1':residues[j-1].h_bond(residues[i]),
|
||||||
Check if 1 bridge between one ladder and one or more other ladders.
|
'res2':residues[i].h_bond(residues[j+1]),
|
||||||
Iterate over all residues of one ladder and check if bridge with other residues
|
'ipos':residues[i].resid,
|
||||||
of the other ladders.
|
'jpos':residues[j].resid,
|
||||||
"""
|
'i':residues[i].indice,
|
||||||
sheets = {}
|
'j':residues[j].indice,
|
||||||
for ladder in ladders:
|
'btype':"para"}
|
||||||
for ladd2 in ladders:
|
|
||||||
for bridge in ladders[ladder]['bridges']:
|
|
||||||
if bridge.res_partner in res_list(ladders[ladd2]):
|
|
||||||
print("ladder",ladders[ladder]['start'], ladders[ladder]['end'],"bridge",bridge.res_num, bridge.res_partner,
|
|
||||||
"ladder 2",ladders[ladd2]['start'], ladders[ladd2]['end'])
|
|
||||||
#print("stop ladder 2")
|
|
||||||
print("stop ladder 1")
|
|
||||||
|
|
||||||
|
if(residues[i].h_bond(residues[j])<-0.5
|
||||||
|
and residues[j].h_bond(residues[i])<-0.5):
|
||||||
|
bridge = {'res1':residues[i].h_bond(residues[j]),
|
||||||
|
'res2':residues[j].h_bond(residues[i]),
|
||||||
|
'ipos':residues[i].resid,
|
||||||
|
'jpos':residues[j].resid,
|
||||||
|
'i':residues[i].indice,
|
||||||
|
'j':residues[j].indice,
|
||||||
|
'btype':"anti"}
|
||||||
|
|
||||||
|
if(residues[i-1].h_bond(residues[j+1])<-0.5
|
||||||
|
and residues[j-1].h_bond(residues[i+1])<-0.5):
|
||||||
|
bridge = {'res1':residues[i-1].h_bond(residues[j+1]),
|
||||||
|
'res2':residues[j-1].h_bond(residues[i+1]),
|
||||||
|
'ipos':residues[i].resid,
|
||||||
|
'jpos':residues[j].resid,
|
||||||
|
'i':residues[i].indice,
|
||||||
|
'j':residues[j].indice,
|
||||||
|
'btype':"anti"}
|
||||||
|
|
||||||
def get_ladders2(self, bridges, residues):
|
if(bridge):
|
||||||
|
if(bridge['res1']+bridge['res2']<E_min):
|
||||||
|
E_min = bridge['res1']+bridge['res2']
|
||||||
|
strongest_bridge = bridge
|
||||||
|
coord_bridge = [i,j]
|
||||||
|
bridge = {}
|
||||||
|
# finally add the strongest bridge at i and j pos
|
||||||
|
if(strongest_bridge):
|
||||||
|
bridges[strongest_bridge['i']] = (Bridge(strongest_bridge['btype'],
|
||||||
|
strongest_bridge['ipos'],
|
||||||
|
strongest_bridge['jpos'],
|
||||||
|
[strongest_bridge['i'],
|
||||||
|
strongest_bridge['j']]))
|
||||||
|
bridges[strongest_bridge['j']] = (Bridge(strongest_bridge['btype'],
|
||||||
|
strongest_bridge['jpos'],
|
||||||
|
strongest_bridge['ipos'],
|
||||||
|
[strongest_bridge['i'],
|
||||||
|
strongest_bridge['j']]))
|
||||||
|
if(len(bridges)>0):
|
||||||
|
return(bridges)
|
||||||
|
else:
|
||||||
|
return(False)
|
||||||
|
|
||||||
|
def get_ladders(bridges, residues):
|
||||||
ladders = {}
|
ladders = {}
|
||||||
i = residues.index(self)
|
i = 1
|
||||||
if i != 0:
|
while i < len(residues):
|
||||||
k = 1
|
k = 1
|
||||||
if i in bridges.keys():
|
if i in bridges.keys():
|
||||||
temp_bridges = [bridges[i]]
|
temp_bridges = [bridges[i]]
|
||||||
|
|
@ -250,15 +247,26 @@ class Residue:
|
||||||
temp_bridges.append(bridges[i+k])
|
temp_bridges.append(bridges[i+k])
|
||||||
k+=1
|
k+=1
|
||||||
if k>1:
|
if k>1:
|
||||||
print("ladder", bridges[i].res_num, bridges[i+k-1].res_num)
|
#print("ladder", bridges[i].res_num, bridges[i+k-1].res_num)
|
||||||
ladders[i] = {'start':bridges[i].res_num,
|
ladders[i] = {'start':bridges[i].res_num,
|
||||||
'end':bridges[i+k-1].res_num,
|
'end':bridges[i+k-1].res_num,
|
||||||
'bridges':temp_bridges}
|
'bridges':temp_bridges,
|
||||||
|
'i':i,
|
||||||
|
'j':i+k-1}
|
||||||
i+=k-1
|
i+=k-1
|
||||||
else:
|
else:
|
||||||
i+=1
|
i+=1
|
||||||
return ladders
|
return ladders
|
||||||
|
|
||||||
|
def connected_ladders(ladd_1, ladd_2):
|
||||||
|
links = []
|
||||||
|
for bridge in ladd_1['bridges']:
|
||||||
|
if bridge.res_partner in res_list(ladd_2):
|
||||||
|
return([ladd_1['i'], ladd_1['j'], bridge.i, bridge.j,
|
||||||
|
ladd_2['i'], ladd_2['j']])
|
||||||
|
|
||||||
|
return False
|
||||||
|
|
||||||
def get_sheets(ladders):
|
def get_sheets(ladders):
|
||||||
"""
|
"""
|
||||||
Bridges between ladders.
|
Bridges between ladders.
|
||||||
|
|
@ -266,15 +274,30 @@ def get_sheets(ladders):
|
||||||
Iterate over all residues of one ladder and check if bridge with other residues
|
Iterate over all residues of one ladder and check if bridge with other residues
|
||||||
of the other ladders.
|
of the other ladders.
|
||||||
"""
|
"""
|
||||||
|
ladds = [ elem for elem in ladders.values() ]
|
||||||
sheets = {}
|
sheets = {}
|
||||||
for ladder in ladders:
|
i = 0
|
||||||
for ladd2 in ladders:
|
while i < len(ladds):
|
||||||
for bridge in ladders[ladder]['bridges']:
|
j = i+1
|
||||||
if bridge.res_partner in res_list(ladders[ladd2]):
|
ladd = ladds[i]
|
||||||
print("ladder",ladders[ladder]['start'], ladders[ladder]['end'],"bridge",bridge.res_num, bridge.res_partner,
|
ladd1 = ladds[i]
|
||||||
"ladder 2",ladders[ladd2]['start'], ladders[ladd2]['end'])
|
ladd2 = ladds[j]
|
||||||
#print("stop ladder 2")
|
|
||||||
print("stop ladder 1")
|
while j < len(ladds):
|
||||||
|
print(connected_ladders(ladd1, ladd2))
|
||||||
|
if connected_ladders(ladd1, ladd2)!=False:
|
||||||
|
ladd1 = ladd2
|
||||||
|
#print(connected_ladders(ladd1, ladd2)[4])
|
||||||
|
ladd2 = ladders[connected_ladders(ladd1, ladd2)[4]]
|
||||||
|
j+=1
|
||||||
|
print(ladd['i'], ladd2['i'])
|
||||||
|
i+=1
|
||||||
|
# for ladder in ladders:
|
||||||
|
# for ladd2 in ladders:
|
||||||
|
# if connected_ladders(ladders[ladder], ladders[ladd2]):
|
||||||
|
# pass
|
||||||
|
#print("ladder",ladders[ladder]['i'], ladders[ladder]['j'],"bridge",bridge.i, bridge.j,
|
||||||
|
# "ladder 2",ladders[ladd2]['i'], ladders[ladd2]['j'])
|
||||||
|
|
||||||
def res_list(ladder):
|
def res_list(ladder):
|
||||||
# TODO : method in ladder class
|
# TODO : method in ladder class
|
||||||
|
|
|
||||||
20
src/dssp.py
20
src/dssp.py
|
|
@ -24,11 +24,11 @@ else:
|
||||||
|
|
||||||
#turns = get_turns(pdb_file.residues)
|
#turns = get_turns(pdb_file.residues)
|
||||||
#get_helix(pdb_file.residues, turns)
|
#get_helix(pdb_file.residues, turns)
|
||||||
get_bends(pdb_file.residues)
|
#get_bends(pdb_file.residues)
|
||||||
# get_chirality(pdb_file.residues)
|
# get_chirality(pdb_file.residues)
|
||||||
# bridges = get_bridges(pdb_file.residues)
|
bridges = get_bridges(pdb_file.residues)
|
||||||
# ladders = get_ladders(bridges, pdb_file.residues)
|
ladders = get_ladders(bridges, pdb_file.residues)
|
||||||
# get_sheets(ladders)
|
get_sheets(ladders)
|
||||||
|
|
||||||
# print("NBRIDGES",len(bridges))
|
# print("NBRIDGES",len(bridges))
|
||||||
|
|
||||||
|
|
@ -47,13 +47,15 @@ else:
|
||||||
|
|
||||||
#get_phi_psi(residues)
|
#get_phi_psi(residues)
|
||||||
#print(residues[2].atoms, residues[0].resid, residues[1].resid)
|
#print(residues[2].atoms, residues[0].resid, residues[1].resid)
|
||||||
print(get_TCO(residues[2],residues[3]))
|
#print(get_TCO(residues[2],residues[3]))
|
||||||
|
|
||||||
#turns = {}
|
|
||||||
ladders = {}
|
|
||||||
for i,res in enumerate(residues):
|
for i,res in enumerate(residues):
|
||||||
# res.get_turns(residues, turns)
|
# res.get_turns(residues, turns)
|
||||||
#res.get_helix(residues)
|
res.get_helix(residues)
|
||||||
#res.get_bridges(residues)
|
#res.get_bridges(residues)
|
||||||
res.get_ladders(residues, ladders)
|
#res.get_ladders(residues, ladders)
|
||||||
#res.get_sheets(residues)
|
#res.get_sheets(residues)
|
||||||
|
|
||||||
|
for i,ladder in enumerate(ladders.values()):
|
||||||
|
print(chr(65+i))
|
||||||
|
|
||||||
|
|
|
||||||
13
src/pdb.py
13
src/pdb.py
|
|
@ -50,13 +50,20 @@ class PDBFile:
|
||||||
# get the current indice of atom
|
# get the current indice of atom
|
||||||
i = self.atoms.index(atom)
|
i = self.atoms.index(atom)
|
||||||
# if this is a brand new residue
|
# if this is a brand new residue
|
||||||
|
|
||||||
|
if(len(self.atoms)>1 and
|
||||||
|
(atom.res_seq_nb == self.atoms[i-1].res_seq_nb
|
||||||
|
and atom.insertion_code!=self.atoms[i-1].insertion_code)):
|
||||||
|
self.residues.append(Residue(temp_atoms, len(self.residues)+1))
|
||||||
|
temp_atoms=[]
|
||||||
|
|
||||||
if(len(self.atoms)>1
|
if(len(self.atoms)>1
|
||||||
and atom.res_seq_nb != self.atoms[i-1].res_seq_nb):
|
and (atom.res_seq_nb != self.atoms[i-1].res_seq_nb)):
|
||||||
self.residues.append(Residue(temp_atoms))
|
self.residues.append(Residue(temp_atoms, len(self.residues)+1))
|
||||||
temp_atoms=[]
|
temp_atoms=[]
|
||||||
temp_atoms.append(atom)
|
temp_atoms.append(atom)
|
||||||
# last residue
|
# last residue
|
||||||
self.residues.append(Residue(temp_atoms))
|
self.residues.append(Residue(temp_atoms, len(self.residues)))
|
||||||
# hydrogens should represent in average 50% of total atoms...
|
# hydrogens should represent in average 50% of total atoms...
|
||||||
# We use 30% threshold...
|
# We use 30% threshold...
|
||||||
if(count_h/len(temp_atoms)<0.30):
|
if(count_h/len(temp_atoms)<0.30):
|
||||||
|
|
|
||||||
|
|
@ -14,11 +14,13 @@ class Turn(Structure):
|
||||||
|
|
||||||
class Bridge(Structure):
|
class Bridge(Structure):
|
||||||
|
|
||||||
def __init__(self, bridge_type, res_num, res_partner):
|
def __init__(self, bridge_type, res_num, res_partner, indices):
|
||||||
self.bridge_type = bridge_type
|
self.bridge_type = bridge_type
|
||||||
self.res_num = res_num
|
self.res_num = res_num
|
||||||
self.res_partner = res_partner
|
self.res_partner = res_partner
|
||||||
Structure.res = res_num
|
Structure.res = res_num
|
||||||
|
self.i = indices[0]
|
||||||
|
self.j = indices[1]
|
||||||
|
|
||||||
class Helix(Structure):
|
class Helix(Structure):
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue