1
2
3
4
5
6 """Turn an mmCIF file into a dictionary."""
7
8 import os.path
9 import warnings
10 import Bio.PDB.mmCIF.MMCIFlex
11 from UserDict import UserDict
12
13
15
16 NAME=1
17 LOOP=2
18 DATA=3
19 SEMICOLONS=4
20 DOUBLEQUOTED=5
21 QUOTED=6
22 SIMPLE=7
23
34
36
37 NAME=self.NAME
38 LOOP=self.LOOP
39 DATA=self.DATA
40 SEMICOLONS=self.SEMICOLONS
41 DOUBLEQUOTED=self.DOUBLEQUOTED
42 QUOTED=self.QUOTED
43 SIMPLE=self.SIMPLE
44 get_token=Bio.PDB.mmCIF.MMCIFlex.get_token
45
46 loop_flag=0
47
48 temp_list=[]
49
50 current_name=None
51
52 token, value=get_token()
53
54 mmcif_dict=self.data
55
56 while token:
57 if token==NAME:
58 if loop_flag:
59
60 while token==NAME:
61
62 new_list=mmcif_dict[value]=[]
63 temp_list.append(new_list)
64 token, value=get_token()
65
66 loop_flag=0
67
68 data_counter=0
69
70 pos=0
71 nr_fields=len(temp_list)
72
73 while token>3:
74 pos=data_counter%nr_fields
75 data_counter=data_counter+1
76 temp_list[pos].append(value)
77 token, value=get_token()
78
79 if pos!=nr_fields-1:
80 warnings.warn("ERROR: broken name-data pair "
81 "(data missing)!", RuntimeWarning)
82
83
84
85 else:
86
87
88 next_token, data=get_token()
89
90 mmcif_dict[value]=data
91 if next_token<4:
92 warnings.warn("ERROR: broken name-data pair "
93 "(name-non data pair)!", RuntimeWarning)
94
95 else:
96
97 token=None
98 elif token==LOOP:
99 loop_flag=1
100 temp_list=[]
101
102 token=None
103 elif token==DATA:
104 mmcif_dict[value[0:5]]=value[5:]
105 token=None
106 else:
107
108 warnings.warn("ERROR: broken name-data pair "
109 "(missing name)!\n%s %s" % (token, value),
110 RuntimeWarning)
111 mmcif_dict[None].append(value)
112
113 token=None
114 if token==None:
115 token, value=get_token()
116
117
119 return self.data[key]
120
121
122 if __name__=="__main__":
123
124 import sys
125
126 if len(sys.argv)!=2:
127 print "Usage: python MMCIF2Dict filename."
128
129 filename=sys.argv[1]
130
131 mmcif_dict=MMCIF2Dict(filename)
132
133 entry = ""
134 print "Now type a key ('q' to end, 'k' for a list of all keys):"
135 while(entry != "q"):
136 entry = raw_input("MMCIF dictionary key ==> ")
137 if entry == "q":
138 sys.exit()
139 if entry == "k":
140 for key in mmcif_dict:
141 print key
142 continue
143 try:
144 value=mmcif_dict[entry]
145 if type(value)==type([]):
146 for item in value:
147 print item
148 else:
149 print value
150 except KeyError:
151 print "No such key found."
152