Package csb

[frames] | no frames]

# Source Code for Package csb

      1  """
      2  CSB is a high-level, object-oriented library used to solve problems in the
      3  field of Computational Structural Biology.
      4
      5
      6  Introduction
      7  ============
      8
      9  The library is composed of a set of highly branched python packages
     10  (namespaces). Some of the packages are meant to be directly used by
     11  the clients (core library), while others are utility modules and take
     12  part in the development of the library:
     13
     14      1. Core class library -- object-oriented, granular, with an emphasis
     15         on design and clean interfaces. A Sequence is not a string, and a
     16         Structure is not a dict or list. Naming conventions matter.
     17
     18      2. Application framework -- executable console applications
     19         ("protocols"), which consume objects from the core library.
     20         The framework ensures that each CSB application is also reusable
     21         and can be instantiated as a regular python object without any
     22         ugly side effects (sys.exit() and friends). See L{csb.apps} for more
     23         details.
     24
     25      3. Test framework -- built on top of the standard unittest as a thin
     26         wrapping layer. Provides some sugar like transparent management of
     27         test data files, and modular test execution. L{csb.test} will give
     28         you all the details.
     29
     30  The core library is roughly composed of:
     31
     32      - bioinformatics API: L{csb.bio}, which includes stuff like
     33        L{csb.bio.io}, L{csb.bio.structure}, L{csb.bio.sequence},
     34        L{csb.bio.hmm}
     35
     36      - statistics API: L{csb.statistics}, L{csb.numeric}
     37
     38      - utilities - L{csb.io}, L{csb.core}
     39
     40
     41  Getting started
     42  ===============
     43
     44  Perhaps one of the most frequently used parts of the library is the
     45  L{csb.bio.structure} module, which provides the L{Structure}, L{Chain},
     46  L{Residue} and L{Atom} objects. You could easily build a L{Structure}
     47  from scratch, but a far more common scenario is parsing a structure from
     48  a PDB file using one of the L{AbstractStructureParser}s. All bio IO
     49  objects, including the StructureParser factory, are defined in
     50  L{csb.bio.io} and sub-packages:
     51
     52      >>> from csb.bio.io.wwpdb import StructureParser
     53      >>> p = StructureParser("/some/file/pdb1x80.ent")
     54      >>> s = p.parse_structure()
     55      >>> print(s)
     56      <Structure: 1x80, 2 chains>
     57
     58  The last statement will return a L{csb.bio.structure.Structure} instance,
     59  which is a composite hierarchical object:
     60
     61      >>> for chain_id in s.chains:
     62              chain = s.chains[chain_id]
     63              for residue in chain.residues:
     64                  for atom_id in residue.atoms:
     65                      atom = residue.atoms[atom_id]
     66                      print(atom.vector)
     67
     68  Some of the inner objects in this hierarchy behave just like dictionaries
     69  (but are not):
     70
     71      >>> s.chains['A']        # access chain A by ID
     72      <Chain A: Protein>
     73      >>> s['A']               # the same
     74      <Chain A: Protein>
     75
     76  Others behave like collections:
     77
     78      >>> chain.residues[10]               # 1-based access to the residues in the chain
     79      <ProteinResidue [10]: PRO 10>
     80      >>> chain[10]                        # 0-based, list-like access
     81      <ProteinResidue [11]: GLY 11>
     82
     83  But all entities are iterable because they inherit the C{items} iterator
     84  from L{AbstractEntity}. The above loop can be shortened:
     85
     86      >>> for chain in s.items:
     87              for residue in chain.items:
     88                  for atom in residue.items:
     89                      print(atom.vector)
     90
     91  or even more:
     92
     93      >>> from csb.bio.structure import Atom
     94      >>> for atom in s.components(klass=Atom):
     95              print(atom.vector)
     96
     97  You may also be interested in extracting a sub-chain from this structure:
     98
     99      >>> s.chains['B'].subregion(3, 20)    # from positions 3 to 20, inclusive
    100      <Chain B: Protein>
    101
    102  or modifying it in some way, for example, in order to append a new residue,
    103  try:
    104
    105      >>> from csb.bio.structure import ProteinResidue
    106      >>> from csb.bio.sequence import ProteinAlphabet
    107      >>> residue = ProteinResidue(401, ProteinAlphabet.ALA)
    108      >>> s.chains['A'].residues.append(residue)
    109
    110  Finally, you would probably want to save your structure back to a PDB file:
    111
    112      >>> s.to_pdb('/some/file/name.pdb')
    113
    114
    115  Where to go from here
    116  =====================
    117
    118  If you want to dive into statistics, you could peek inside L{csb.statistics}
    119  and its sub-packages. For example, L{csb.statistics.pdf} contains a collection
    120  of L{probability density objects<csb.statistics.pdf.AbstractDensity>},
    121  like L{Gaussian<csb.statistics.pdf.Normal>} or L{Gamma<csb.statistics.pdf.Gamma>}.
    122
    123  But chances are you would first like to try reading some files, so you could
    124  start exploring L{csb.bio.io} right now. As we have already seen,
    125  L{csb.bio.io.wwpdb} provides PDB L{Structure<csb.bio.structure.Structure>}
    126  parsers, for example L{csb.bio.io.wwpdb.RegularStructureParser} and
    127  L{csb.bio.io.wwpdb.LegacyStructureParser}.
    128
    129  L{csb.bio.io.fasta} is all about reading FASTA
    130  L{Sequence<csb.bio.sequence.AbstractSequence>}s and
    131  L{SequenceAlignment<csb.bio.sequence.AbstractAlignment>}s. Be sure to check out
    132  L{csb.bio.io.fasta.SequenceParser}, L{csb.bio.io.fasta.SequenceAlignmentReader}
    133  and L{csb.bio.io.fasta.StructureAlignmentFactory}.
    134
    135  If you are working with HHpred (L{ProfileHMM<csb.bio.hmm.ProfileHMM>}s,
    136  L{HHpredHit<csb.bio.hmm.HHpredHit>}s), then L{csb.bio.io.hhpred} is for you.
    137  This package provides L{csb.bio.io.hhpred.HHProfileParser} and
    138  L{csb.bio.io.hhpred.HHOutputParser}, which are used to read *.hhm and *.hhr
    139  files.
    140
    141  Finally, if you want to make some nice plots with matplotlib, you may like the
    142  clean object-oriented interface of our L{Chart<csb.io.plots.Chart>}. See
    143  L{csb.io.plots} and maybe also L{csb.io.tsv} to get started.
    144
    145
    146  Development
    147  ===========
    148
    149  When contributing code to CSB, please take into account the following:
    150
    151      1. New features or bug fixes should always be accompanied by test cases.
    152         Also, always run the complete test suite before committing. For more
    153         details on this topic, see L{csb.test}.
    154
    155      2. The source code of CSB must be cross-platform and cross-interpreter
    156         compatible. L{csb.core} and L{csb.io} will give you all necessary
    157         details on how to use the CSB compatibility layer.
    158
    159
    160  License
    161  =======
    162
    163  CSB is open source and distributed under OSI-approved MIT license::
    164
    165      Copyright (c) 2012 Michael Habeck
    166
    167      Permission is hereby granted, free of charge, to any person obtaining
    168      a copy of this software and associated documentation files (the
    169      "Software"), to deal in the Software without restriction, including
    170      without limitation the rights to use, copy, modify, merge, publish,
    171      distribute, sublicense, and/or sell copies of the Software, and to
    172      permit persons to whom the Software is furnished to do so, subject to
    173      the following conditions:
    174
    175      The above copyright notice and this permission notice shall be
    176      included in all copies or substantial portions of the Software.
    177
    178      THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
    179      EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
    180      MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
    181      IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
    182      CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
    183      TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
    184      SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
    185
    186  """
    187
    188  __version__ = '1.2.5.{revision}'
    189
    190
    191 -class Version(object):
    192      """
    193      CSB version number.
    194      """
    195
    196 -    def __init__(self):
    197
    198          version = __version__.split('.')
    199
    200          if not len(version) in (3, 4):
    201              raise ValueError(version)
    202
    203          self._package = __name__
    204
    205          self._major = version[0]
    206          self._minor = version[1]
    207          self._micro = version[2]
    208          self._revision = None
    209
    210          if len(version) == 4:
    211              self._revision = version[3]
    212
    213 -    def __str__(self):
    214          return self.short
    215
    216 -    def __repr__(self):
    217          return '{0.package} {0.full}'.format(self)
    218
    219      @property
    220 -    def major(self):
    221          """
    222          Major version (huge, incompatible changes)
    223          @rtype: int
    224          """
    225          return int(self._major)
    226
    227      @property
    228 -    def minor(self):
    229          """
    230          Minor version (significant, but compatible changes)
    231          @rtype: int
    232          """
    233          return int(self._minor)
    234
    235      @property
    236 -    def micro(self):
    237          """
    238          Micro version (bug fixes and small enhancements)
    239          @rtype: int
    240          """
    241          return int(self._micro)
    242
    243      @property
    244 -    def revision(self):
    245          """
    246          Build number (exact repository revision number)
    247          @rtype: int
    248          """
    249          try:
    250              return int(self._revision)
    251          except:
    252              return self._revision
    253
    254      @property
    255 -    def short(self):
    256          """
    257          Canonical three-part version number.
    258          """
    259          return '{0.major}.{0.minor}.{0.micro}'.format(self)
    260
    261      @property
    262 -    def full(self):
    263          """
    264          Full version, including the repository revision number.
    265          """
    266          return '{0.major}.{0.minor}.{0.micro}.{0.revision}'.format(self)
    267
    268      @property
    269 -    def package(self):
    270          return self._package
    271