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 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108
|
# Copyright (C) 2002, Thomas Hamelryck (thamelry@binf.ku.dk)
# This code is part of the Biopython distribution and governed by its
# license. Please see the LICENSE file that should have been included
# as part of this package.
"""Turn an mmCIF file into a dictionary."""
from __future__ import print_function
from Bio.File import as_handle
from Bio._py3k import input as _input
import shlex
class MMCIF2Dict(dict):
"""Parse a mmCIF file and return a dictionary."""
def __init__(self, filename):
"""Parse a mmCIF file and return a dictionary.
Arguments:
- file - name of the PDB file OR an open filehandle
"""
with as_handle(filename) as handle:
loop_flag = False
key = None
tokens = self._tokenize(handle)
token = next(tokens)
self[token[0:5]] = token[5:]
i = 0
n = 0
for token in tokens:
if token == "loop_":
loop_flag = True
keys = []
i = 0
n = 0
continue
elif loop_flag:
if token.startswith("_"):
if i > 0:
loop_flag = False
else:
self[token] = []
keys.append(token)
n += 1
continue
else:
self[keys[i % n]].append(token)
i += 1
continue
if key is None:
key = token
else:
self[key] = token
key = None
# Private methods
def _tokenize(self, handle):
for line in handle:
if line.startswith("#"):
continue
elif line.startswith(";"):
token = line[1:].strip()
for line in handle:
line = line.strip()
if line == ';':
break
token += line
yield token
else:
tokens = shlex.split(line)
for token in tokens:
yield token
if __name__ == "__main__":
import sys
if len(sys.argv) != 2:
print("Usage: python MMCIF2Dict filename.")
filename = sys.argv[1]
mmcif_dict = MMCIF2Dict(filename)
entry = ""
print("Now type a key ('q' to end, 'k' for a list of all keys):")
while(entry != "q"):
entry = _input("MMCIF dictionary key ==> ")
if entry == "q":
sys.exit()
if entry == "k":
for key in mmcif_dict:
print(key)
continue
try:
value = mmcif_dict[entry]
if isinstance(value, list):
for item in value:
print(item)
else:
print(value)
except KeyError:
print("No such key found.")
|