1
2
3
4
5
6
7 from string import letters
8
9 import numpy
10
11
12 from MMCIF2Dict import MMCIF2Dict
13 from StructureBuilder import StructureBuilder
14
15
16 __doc__="mmCIF parser (partly implemented in C)."
17
18
25
27 mmcif_dict=self._mmcif_dict
28 atom_id_list=mmcif_dict["_atom_site.label_atom_id"]
29 residue_id_list=mmcif_dict["_atom_site.label_comp_id"]
30 seq_id_list=mmcif_dict["_atom_site.label_seq_id"]
31 chain_id_list=mmcif_dict["_atom_site.label_asym_id"]
32 x_list=map(float, mmcif_dict["_atom_site.Cartn_x"])
33 y_list=map(float, mmcif_dict["_atom_site.Cartn_y"])
34 z_list=map(float, mmcif_dict["_atom_site.Cartn_z"])
35 alt_list=mmcif_dict["_atom_site.label_alt_id"]
36 b_factor_list=mmcif_dict["_atom_site.B_iso_or_equiv"]
37 occupancy_list=mmcif_dict["_atom_site.occupancy"]
38 fieldname_list=mmcif_dict["_atom_site.group_PDB"]
39 try:
40 aniso_u11=mmcif_dict["_atom_site.aniso_U[1][1]"]
41 aniso_u12=mmcif_dict["_atom_site.aniso_U[1][2]"]
42 aniso_u13=mmcif_dict["_atom_site.aniso_U[1][3]"]
43 aniso_u22=mmcif_dict["_atom_site.aniso_U[2][2]"]
44 aniso_u23=mmcif_dict["_atom_site.aniso_U[2][3]"]
45 aniso_u33=mmcif_dict["_atom_site.aniso_U[3][3]"]
46 aniso_flag=1
47 except KeyError:
48
49 aniso_flag=0
50
51
52 if mmcif_dict.has_key("_atom_site.auth_seq_id"):
53 seq_id_list=mmcif_dict["_atom_site.auth_seq_id"]
54 else:
55 seq_id_list=mmcif_dict["_atom_site.label_seq_id"]
56
57 current_chain_id=None
58 current_residue_id=None
59 current_model_id=0
60 structure_builder=self._structure_builder
61 structure_builder.init_structure(structure_id)
62 structure_builder.init_model(current_model_id)
63 structure_builder.init_seg(" ")
64 for i in xrange(0, len(atom_id_list)):
65 x=x_list[i]
66 y=y_list[i]
67 z=z_list[i]
68 resname=residue_id_list[i]
69 chainid=chain_id_list[i]
70 altloc=alt_list[i]
71 if altloc==".":
72 altloc=" "
73 resseq=seq_id_list[i]
74 name=atom_id_list[i]
75 tempfactor=b_factor_list[i]
76 occupancy=occupancy_list[i]
77 fieldname=fieldname_list[i]
78 if fieldname=="HETATM":
79 hetatm_flag="H"
80 else:
81 hetatm_flag=" "
82 if current_chain_id!=chainid:
83 current_chain_id=chainid
84 structure_builder.init_chain(current_chain_id)
85 current_residue_id=resseq
86 icode, int_resseq=self._get_icode(resseq)
87 structure_builder.init_residue(resname, hetatm_flag, int_resseq,
88 icode)
89 elif current_residue_id!=resseq:
90 current_residue_id=resseq
91 icode, int_resseq=self._get_icode(resseq)
92 structure_builder.init_residue(resname, hetatm_flag, int_resseq,
93 icode)
94 coord=numpy.array((x, y, z), 'f')
95 structure_builder.init_atom(name, coord, tempfactor, occupancy, altloc,
96 name)
97 if aniso_flag==1:
98 u=(aniso_u11[i], aniso_u12[i], aniso_u13[i],
99 aniso_u22[i], aniso_u23[i], aniso_u33[i])
100 mapped_anisou=map(float, u)
101 anisou_array=numpy.array(mapped_anisou, 'f')
102 structure_builder.set_anisou(anisou_array)
103
104 try:
105 a=float(mmcif_dict["_cell.length_a"])
106 b=float(mmcif_dict["_cell.length_b"])
107 c=float(mmcif_dict["_cell.length_c"])
108 alpha=float(mmcif_dict["_cell.angle_alpha"])
109 beta=float(mmcif_dict["_cell.angle_beta"])
110 gamma=float(mmcif_dict["_cell.angle_gamma"])
111 cell=numpy.array((a, b, c, alpha, beta, gamma), 'f')
112 spacegroup=mmcif_dict["_symmetry.space_group_name_H-M"]
113 spacegroup=spacegroup[1:-1]
114 if spacegroup==None:
115 raise Exception
116 structure_builder.set_symmetry(spacegroup, cell)
117 except:
118 pass
119
121 """Tries to return the icode. In MMCIF files this is just part of
122 resseq! In PDB files, it's a separate field."""
123 last_resseq_char=resseq[-1]
124 if last_resseq_char in letters:
125 icode=last_resseq_char
126 int_resseq=int(resseq[0:-1])
127 else:
128 icode=" "
129 int_resseq=int(resseq)
130 return icode, int_resseq
131
132
133 if __name__=="__main__":
134 import sys
135
136 filename=sys.argv[1]
137
138 p=MMCIFParser()
139
140 structure=p.get_structure("test", filename)
141
142 for model in structure.get_list():
143 print model
144 for chain in model.get_list():
145 print chain
146 print "Found %d residues." % len(chain.get_list())
147