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

# Source Code for Module csb.bio.io.psipred

     1  """
     2  PSIPRED Parser
     3  """
     4
     5  import csb.core
     6
     7  from csb.bio.structure import SecondaryStructure, SecStructures, UnknownSecStructureError
     8
     9
    10 -class PSIPredParseError(ValueError):
    11      pass
    12
    13
    14 -class PSIPredResidueInfo(object):
    15
    16 -    def __init__(self, rank, residue, sec_structure, helix, strand, coil):
    17
    18          self.rank = rank
    19          self.residue = residue
    20          self.sec_structure = sec_structure
    21          self.helix = helix
    22          self.coil = coil
    23          self.strand = strand
    24
    25
    26 -class PSIPredParser(object):
    27      """
    28      Simple PSI-PRED Secondary Structure Parser.
    29      """
    30
    31 -    def parse(self, psipred_file):
    32          """
    33          @param psipred_file: source PSI-PRED *.horiz file to parse
    34          @type psipred_file: str
    35          @rtype: L{SecondaryStructure}
    36          """
    37
    38          ss = []
    39          conf = []
    40
    41          for line in open(psipred_file):
    42
    43              if line.startswith('Conf:'):
    44                  conf.extend(line[6:].strip())
    45
    46              elif line.startswith('Pred:'):
    47                  ss.append(line[6:].strip())
    48
    49          ss = ''.join(ss)
    50          conf = ''.join(conf)
    51
    52          if len(ss) != len(conf):
    53              raise PSIPredParseError('Invalid PSI-PRED output file')
    54
    55          if ss:
    56              return SecondaryStructure(ss, conf)
    57          else:
    58              return SecondaryStructure(None)
    59
    60 -    def parse_scores(self, scores_file):
    61          """
    62          @param scores_file: source PSI-PRED *.ss2 file to parse
    63          @type scores_file: str
    64          @rtype: list of L{PSIPredResidueInfo}
    65          """
    66          residues = []
    67
    68          for line in open(scores_file):
    69
    70              if line.startswith('#') or not line.strip():
    71                  continue
    72              else:
    73                  line = line.split()
    74
    75                  rank = int(line[0])
    76                  residue = line[1]
    77
    78                  try:
    79                      ss = csb.core.Enum.parse(SecStructures, line[2])
    80                  except csb.core.EnumValueError as e:
    81                      raise UnknownSecStructureError(str(e))
    82
    83                  coil, helix, strand = map(float, line[3:6])
    84
    85                  residues.append(PSIPredResidueInfo(rank, residue, ss, helix, strand, coil))
    86
    87          return tuple(residues)
    88