Skip to content
Snippets Groups Projects
Commit e2b1c5c7 authored by Bienchen's avatar Bienchen
Browse files

Fixing PDBize

parent 6ee0cad3
No related branches found
No related tags found
No related merge requests found
...@@ -380,105 +380,110 @@ def _PDBize(biounit, asu, seqres=None, min_polymer_size=10, ...@@ -380,105 +380,110 @@ def _PDBize(biounit, asu, seqres=None, min_polymer_size=10,
return atom_pos_wrong return atom_pos_wrong
chain_names='ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz' chain_names='ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz'
cur_chain_name = 0
water_chain = mol.ChainHandle()
ligand_chain = mol.ChainHandle()
a_pos_wrong = False
pdb_bu = mol.CreateEntity()
edi = pdb_bu.EditXCS(mol.BUFFERED_EDIT)
chains = biounit.GetChainList()
c_intvls = biounit.GetChainIntervalList()
o_intvls = biounit.GetOperationsIntervalList()
# create list of operations # create list of operations
# for cartesian products, operations are stored in a list, multiplied with # for cartesian products, operations are stored in a list, multiplied with
# the next list of operations and re-stored... until all lists of operations # the next list of operations and re-stored... until all lists of operations
# are multiplied in an all-against-all manner. # are multiplied in an all-against-all manner.
operations = biounit.GetOperations() operations = biounit.GetOperations()
trans_matrices = list() for i in range(0,len(c_intvls)):
if len(operations) > 0: trans_matrices = list()
for op in operations[0]: l_operations = operations[o_intvls[i][0]:o_intvls[i][1]]
rot = geom.Mat4() if len(l_operations) > 0:
rot.PasteRotation(op.rotation) for op in l_operations[0]:
trans = geom.Mat4()
trans.PasteTranslation(op.translation)
tr = geom.Mat4()
tr = trans * rot
trans_matrices.append(tr)
for op_n in range(1, len(operations)):
tmp_ops = list()
for o in operations[op_n]:
rot = geom.Mat4() rot = geom.Mat4()
rot.PasteRotation(o.rotation) rot.PasteRotation(op.rotation)
trans = geom.Mat4() trans = geom.Mat4()
trans.PasteTranslation(o.translation) trans.PasteTranslation(op.translation)
tr = geom.Mat4() tr = geom.Mat4()
tr = trans * rot tr = trans * rot
for t_o in trans_matrices: trans_matrices.append(tr)
tp = t_o * tr for op_n in range(1, len(l_operations)):
tmp_ops.append(tp) tmp_ops = list()
trans_matrices = tmp_ops for o in l_operations[op_n]:
# select chains into a view as basis for each transformation rot = geom.Mat4()
assu = asu.Select('cname=' + ','.join(biounit.GetChainList())) rot.PasteRotation(o.rotation)
# use each transformation on the view, store as entity and transform, PDBize trans = geom.Mat4()
# the result while adding everything to one large entity trans.PasteTranslation(o.translation)
pdb_bu = mol.CreateEntity() tr = geom.Mat4()
edi = pdb_bu.EditXCS(mol.BUFFERED_EDIT) tr = trans * rot
cur_chain_name = 0 for t_o in trans_matrices:
water_chain = mol.ChainHandle() tp = t_o * tr
ligand_chain = mol.ChainHandle() tmp_ops.append(tp)
a_pos_wrong = False trans_matrices = tmp_ops
for tr in trans_matrices: # select chains into a view as basis for each transformation
# do a PDBize, add each new entity to the end product assu = asu.Select('cname='+','.join(chains[c_intvls[i][0]:c_intvls[i][1]]))
for chain in assu.chains: # use each transformation on the view, store as entity and transform, PDBize
residue_count = len(chain.residues) # the result while adding everything to one large entity
if seqres: for tr in trans_matrices:
seqres_chain = seqres.FindSequence(chain.name) # do a PDBize, add each new entity to the end product
if seqres_chain.IsValid(): for chain in assu.chains:
residue_count = len(seqres_chain) residue_count = len(chain.residues)
if chain.is_polymer and residue_count >= min_polymer_size: if seqres:
if len(chain_names) == cur_chain_name: seqres_chain = seqres.FindSequence(chain.name)
raise RuntimeError('Running out of chain names') if seqres_chain.IsValid():
new_chain = edi.InsertChain(chain_names[cur_chain_name]) residue_count = len(seqres_chain)
cur_chain_name += 1 if chain.is_polymer and residue_count >= min_polymer_size:
edi.SetChainDescription(new_chain, chain.description) if len(chain_names) == cur_chain_name:
edi.SetChainType(new_chain, chain.type) raise RuntimeError('Running out of chain names')
new_chain.SetStringProp('original_name', chain.name) new_chain = edi.InsertChain(chain_names[cur_chain_name])
if chain.HasProp("pdb_auth_chain_name"): cur_chain_name += 1
new_chain.SetStringProp("pdb_auth_chain_name", edi.SetChainDescription(new_chain, chain.description)
chain.GetStringProp("pdb_auth_chain_name")) edi.SetChainType(new_chain, chain.type)
for res in chain.residues: new_chain.SetStringProp('original_name', chain.name)
new_res = edi.AppendResidue(new_chain, res.name, res.number)
a_b = _CopyAtoms(res, new_res, edi, tr)
if not a_pos_wrong:
a_pos_wrong = a_b
elif chain.type == mol.CHAINTYPE_WATER:
if not water_chain.IsValid():
# water gets '-' as name
water_chain = edi.InsertChain('-')
edi.SetChainDescription(water_chain, chain.description)
edi.SetChainType(water_chain, chain.type)
for res in chain.residues:
new_res = edi.AppendResidue(water_chain, res.name)
new_res.SetStringProp('type', mol.StringFromChainType(chain.type))
new_res.SetStringProp('description', chain.description)
a_b = _CopyAtoms(res, new_res, edi, tr)
if not a_pos_wrong:
a_pos_wrong = a_b
else:
if not ligand_chain.IsValid():
# all ligands, put in one chain, are named '_'
ligand_chain = edi.InsertChain('_')
last_rnum = 0
else:
last_rnum = ligand_chain.residues[-1].number.num
residues=chain.residues
ins_code='\0'
if len(residues)>1:
ins_code='A'
for res in chain.residues:
new_res = edi.AppendResidue(ligand_chain, res.name,
mol.ResNum(last_rnum+1, ins_code))
new_res.SetStringProp('description', chain.description)
new_res.SetStringProp('type', mol.StringFromChainType(chain.type))
new_res.SetStringProp("original_name", chain.name)
if chain.HasProp("pdb_auth_chain_name"): if chain.HasProp("pdb_auth_chain_name"):
new_res.SetStringProp("pdb_auth_chain_name", new_chain.SetStringProp("pdb_auth_chain_name",
chain.GetStringProp("pdb_auth_chain_name")) chain.GetStringProp("pdb_auth_chain_name"))
ins_code = chr(ord(ins_code)+1) for res in chain.residues:
a_b = _CopyAtoms(res, new_res, edi, tr) new_res = edi.AppendResidue(new_chain, res.name, res.number)
if not a_pos_wrong: a_b = _CopyAtoms(res, new_res, edi, tr)
a_pos_wrong = a_b if not a_pos_wrong:
a_pos_wrong = a_b
elif chain.type == mol.CHAINTYPE_WATER:
if not water_chain.IsValid():
# water gets '-' as name
water_chain = edi.InsertChain('-')
edi.SetChainDescription(water_chain, chain.description)
edi.SetChainType(water_chain, chain.type)
for res in chain.residues:
new_res = edi.AppendResidue(water_chain, res.name)
new_res.SetStringProp('type', mol.StringFromChainType(chain.type))
new_res.SetStringProp('description', chain.description)
a_b = _CopyAtoms(res, new_res, edi, tr)
if not a_pos_wrong:
a_pos_wrong = a_b
else:
if not ligand_chain.IsValid():
# all ligands, put in one chain, are named '_'
ligand_chain = edi.InsertChain('_')
last_rnum = 0
else:
last_rnum = ligand_chain.residues[-1].number.num
residues=chain.residues
ins_code='\0'
if len(residues)>1:
ins_code='A'
for res in chain.residues:
new_res = edi.AppendResidue(ligand_chain, res.name,
mol.ResNum(last_rnum+1, ins_code))
new_res.SetStringProp('description', chain.description)
new_res.SetStringProp('type', mol.StringFromChainType(chain.type))
new_res.SetStringProp("original_name", chain.name)
if chain.HasProp("pdb_auth_chain_name"):
new_res.SetStringProp("pdb_auth_chain_name",
chain.GetStringProp("pdb_auth_chain_name"))
ins_code = chr(ord(ins_code)+1)
a_b = _CopyAtoms(res, new_res, edi, tr)
if not a_pos_wrong:
a_pos_wrong = a_b
move_to_origin = None move_to_origin = None
if a_pos_wrong: if a_pos_wrong:
start = pdb_bu.bounds.min start = pdb_bu.bounds.min
......
...@@ -200,7 +200,7 @@ class TestMMCifInfo(unittest.TestCase): ...@@ -200,7 +200,7 @@ class TestMMCifInfo(unittest.TestCase):
pdb_ent, t = info.GetBioUnits()[0].PDBize(ent, transformation=True) pdb_ent, t = info.GetBioUnits()[0].PDBize(ent, transformation=True)
self.assertAlmostEquals(pdb_ent.GetCenterOfAtoms()[0], -915.8, 1) self.assertAlmostEquals(pdb_ent.GetCenterOfAtoms()[0], -915.8, 1)
self.assertAlmostEquals(pdb_ent.GetCenterOfAtoms()[1], -952.345, 2) self.assertAlmostEquals(pdb_ent.GetCenterOfAtoms()[1], -952.345, 2)
self.assertAlmostEquals(pdb_ent.GetCenterOfAtoms()[2], 3221.74, 2) self.assertAlmostEquals(pdb_ent.GetCenterOfAtoms()[2], 3221.75, 2)
self.assertEquals(geom.Equal(t, self.assertEquals(geom.Equal(t,
geom.Mat4(1,0,0,-920.462, geom.Mat4(1,0,0,-920.462,
0,1,0,-966.654, 0,1,0,-966.654,
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment