Package csb :: Package bio :: Package io :: Module dssp
[frames] | no frames]

Source Code for Module csb.bio.io.dssp

  1  """ 
  2  DSSP Parser 
  3  """ 
  4   
  5  import csb.core 
  6  import csb.io 
  7   
  8  from csb.bio.structure import SecStructures, UnknownSecStructureError 
  9   
 10   
11 -class DSSPParseError(ValueError):
12 pass
13 14
15 -class ResidueAssignmentInfo(object):
16
17 - def __init__(self, residue_id, accession, chain, secondary_structure, phi, psi):
18 19 self.residue_id = residue_id 20 self.accession = accession 21 self.chain = chain 22 self.secondary_structure = secondary_structure 23 self.phi = phi 24 self.psi = psi
25 26
27 -class DSSPParser(object):
28 """ 29 Simple DSSP Secondary Structure Parser. 30 """ 31
32 - def parse(self, dssp_file):
33 """ 34 @param dssp_file: source DSSP file to parse 35 @type dssp_file: str 36 @return: a dictionary of L{ResidueAssignmentInfo} objects 37 @rtype: dict 38 """ 39 40 data = {} 41 start = False 42 offset = 0 # assume old DSSP format 43 accession = None 44 45 for line in open(dssp_file): 46 47 if not start: 48 49 if line.startswith('HEADER'): 50 accession = line[62:66].strip().lower() 51 52 elif line.startswith(' # RESIDUE'): 53 if len(line) >= 140: 54 offset = 4 # the new DSSP format 55 start = True 56 else: 57 if line[13] == '!': 58 continue 59 60 residue_id = line[6:11].strip() 61 chain = line[11] 62 try: 63 ss = line[16].strip() 64 if ss == '': 65 ss = SecStructures.Gap 66 else: 67 ss = csb.core.Enum.parse(SecStructures, ss) 68 except csb.core.EnumValueError as e: 69 raise UnknownSecStructureError(str(e)) 70 phi = float(line[104 + offset : 109 + offset]) 71 psi = float(line[110 + offset : 115 + offset]) 72 73 74 if chain not in data: 75 data[chain] = {} 76 77 data[chain][residue_id] = ResidueAssignmentInfo(residue_id, accession, chain, ss, phi, psi) 78 79 return data
80
81 -class StrideParser(object):
82 """ 83 Simple STRIDE Secondary Structure Parser. 84 """ 85
86 - def parse(self, stride_file):
87 """ 88 @param stride_file: source STRIDE file to parse 89 @type stride_file: str 90 @return: a dictionary of L{ResidueAssignmentInfo} objects 91 @rtype: dict 92 """ 93 94 data = {} 95 96 for line in open(stride_file): 97 if line.startswith('ASG '): 98 99 fields = line.split() 100 101 residue_id = fields[3] 102 chain = fields[2] 103 accession = fields[-1].lower() 104 try: 105 ss = csb.core.Enum.parse(SecStructures, fields[5]) 106 except csb.core.EnumValueError as e: 107 raise UnknownSecStructureError(str(e)) 108 phi = float(fields[7]) 109 psi = float(fields[8]) 110 111 if chain not in data: 112 data[chain] = {} 113 114 data[chain][residue_id] = ResidueAssignmentInfo(residue_id, accession, chain, ss, phi, psi) 115 116 return data
117 118
119 -def get(accession, prefix='http://www.pdb.org/pdb/files/'):
120 """ 121 Download and parse a DSSP entry. 122 123 @param accession: accession number of the entry 124 @type accession: str 125 @param prefix: download URL prefix 126 @type prefix: str 127 128 @return: see L{DSSPParser.parse} 129 @rtype: dict 130 """ 131 dssp = csb.io.TempFile() 132 133 browser = csb.io.urllib.urlopen(prefix + accession.lower() + '.dssp') 134 dssp.write(browser.read().decode('utf-8')) 135 dssp.flush() 136 137 return DSSPParser().parse(dssp.name)
138