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