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
|
#!/usr/bin/env python
# This script looks for chains that exceed the size of the unit cell (by >20%)
# in one of the a, b, c directions.
import sys
import gemmi
def run(path):
counter = 0
st = gemmi.read_structure(path)
if st.cell.is_crystal():
st.add_entity_types()
for chain in st[0]:
polymer = chain.get_polymer()
if polymer:
low_bounds = [float('+inf')] * 3
high_bounds = [float('-inf')] * 3
for residue in polymer:
for atom in residue:
pos = st.cell.fractionalize(atom.pos)
for i in range(3):
if pos[i] < low_bounds[i]:
low_bounds[i] = pos[i]
if pos[i] > high_bounds[i]:
high_bounds[i] = pos[i]
for i in range(3):
delta = high_bounds[i] - low_bounds[i]
if delta > 1.2: # 120% of the unit cell size
counter += 1
code = st.info['_entry.id']
print('%s chain:%s delta%c = %.3f' %
(code, chain.name, ord('X') + i, delta))
return counter
def main():
for arg in sys.argv[1:]:
for path in gemmi.CoorFileWalk(arg):
run(path)
if __name__ == '__main__':
main()
|