Package Bio :: Package PDB :: Module MMCIFParser
[hide private]
[frames] | no frames]

Source Code for Module Bio.PDB.MMCIFParser

  1  # Copyright (C) 2002, Thomas Hamelryck (thamelry@binf.ku.dk) 
  2  # This code is part of the Biopython distribution and governed by its 
  3  # license.  Please see the LICENSE file that should have been included 
  4  # as part of this package. 
  5   
  6  #Python stuff 
  7  from string import letters 
  8   
  9  import numpy 
 10   
 11  # My stuff 
 12  from MMCIF2Dict import MMCIF2Dict 
 13  from StructureBuilder import StructureBuilder 
 14   
 15   
 16  __doc__="mmCIF parser (partly implemented in C)."  
 17   
 18   
19 -class MMCIFParser:
20 - def get_structure(self, structure_id, filename):
21 self._mmcif_dict=MMCIF2Dict(filename) 22 self._structure_builder=StructureBuilder() 23 self._build_structure(structure_id) 24 return self._structure_builder.get_structure()
25
26 - def _build_structure(self, structure_id):
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 # no anisotropic B factors 49 aniso_flag=0 50 # if auth_seq_id is present, we use this. 51 # Otherwise label_seq_id is used. 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 # Now loop over atoms and build the structure 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 # Now try to set the cell 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] # get rid of quotes!! 114 if spacegroup==None: 115 raise Exception 116 structure_builder.set_symmetry(spacegroup, cell) 117 except: 118 pass # no cell found, so just ignore
119
120 - def _get_icode(self, resseq):
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