Source code for modelcif.alignment
"""Classes to handle alignments between template structure(s)
and target sequence(s).
To create an alignment, first declare a class for the given kind of
alignment by deriving from subclasses of :class:`AlignmentMode`
(e.g. :class:`Global`) and :class:`AlignmentType` (e.g. :class:`Pairwise`).
For example, a typical pairwise global alignment could be declared using::
class Alignment(modelcif.alignment.Global, modelcif.alignment.Pairwise):
pass
"""
import modelcif.data
[docs]
class Identity:
"""Percent sequence identity between the template sequence and the target
sequence being modeled.
Use the correct subclass that corresponds to the denominator used
when calculating the identity, for example
:class:`ShorterSequenceIdentity`, or if the denominator is not covered
here, subclass this class and provide a docstring to describe the
denominator, e.g.::
class CustomIdentity(Identity):
"my custom sequence identity denominator"
:param float value: The percent sequence identity value.
"""
denominator = "Other"
def __init__(self, value):
self.value = value
def _get_other_details(self):
if (type(self) is not Identity
and self.denominator == Identity.denominator):
return self.__doc__.split('\n')[0]
other_details = property(
_get_other_details,
doc="More information about a custom sequence identity denominator. "
"By default it is the first line of the docstring.")
[docs]
class ShorterSequenceIdentity(Identity):
"""Sequence identity calculated using the length of the shorter sequence
as the denominator.
See :class:`Identity` for more information."""
other_details = None
denominator = "Length of the shorter sequence"
[docs]
class AlignedPositionsIdentity(Identity):
"""Sequence identity calculated using the number of aligned positions
(including gaps) as the denominator.
See :class:`Identity` for more information."""
other_details = None
denominator = "Number of aligned positions (including gaps)"
[docs]
class AlignedResiduePairsIdentity(Identity):
"""Sequence identity calculated using the number of aligned residue pairs
(not including gaps) as the denominator.
See :class:`Identity` for more information."""
other_details = None
denominator = "Number of aligned residue pairs (not including the gaps)"
[docs]
class MeanSequenceIdentity(Identity):
"""Sequence identity calculated using the arithmetic mean of the sequence
lengths as the denominator.
See :class:`Identity` for more information."""
other_details = None
denominator = "Arithmetic mean sequence length"
[docs]
class Pair:
"""A single pairwise alignment between a single target and template chain.
See :class:`AlignmentMode`. An alignment consists of one or more of
these pairs.
:param template: The template segment that is aligned, i.e. the
seq_id range for the template and the sequence (including gaps)
of one-letter codes.
:type template: :class:`modelcif.TemplateSegment`
:param target: The target segment that is aligned.
:type target: output from :meth:`ihm.AsymUnit.segment`
:param identity: The sequence identity between target and template,
if known.
:type identity: :class:`Identity`
:param score: A measure of the quality of the alignment, if known.
:type score: :class:`Score`
"""
def __init__(self, template, target, identity=None, score=None):
self.template, self.target, self.score = template, target, score
self.identity = identity
[docs]
class AlignmentMode(modelcif.data.Data):
"""Base class for all alignments. Actual alignments should derive
from both a subclass of this class (e.g. :class:`Global`) and a
subclass of :class:`AlignmentType`.
:param str name: A short description of this alignment.
:param pairs: List of individual target-template alignments.
:type pairs: list of :class:`Pair` objects
:param software: The software that was used to build the alignment.
:type software: :class:`modelcif.Software`
or :class:`modelcif.SoftwareGroup`
"""
data_content_type = 'target-template alignment'
def __init__(self, name, pairs, software=None):
super().__init__(name)
self.pairs = pairs
self.software = software
[docs]
class Global(AlignmentMode):
"""Base class for global alignments. See :class:`AlignmentMode` for
more details."""
mode = "global"
[docs]
class Local(AlignmentMode):
"""Base class for local alignments. See :class:`AlignmentMode` for
more details."""
mode = "local"
[docs]
class AlignmentType:
"""Base class for all alignment types. Actual alignments should derive
from both a subclass of this class (e.g. :class:`Pairwise`) and a
subclass of :class:`AlignmentMode`.
"""
type = "other"
[docs]
class Pairwise(AlignmentType):
"""An alignment between a single target and template.
See :class:`AlignmentType` for more details."""
type = "target-template pairwise alignment"
other_details = None
[docs]
class Multiple(AlignmentType):
"""A multiple sequence alignment between target and template.
See :class:`AlignmentType` for more details."""
type = "target-template MSA"
other_details = None
[docs]
class Score:
"""Base class for a quality score for a given target-template alignment.
Usually a derived class such as :class:`BLASTEValue` is used, and
passed to :class:`Pair` objects.
:param float value: The actual score value.
"""
type = "Other"
def __init__(self, value):
self.value = value
[docs]
class BLASTEValue(Score):
"""BLAST e-value for an alignment. See :class:`Score` for more details."""
type = "BLAST e-value"
other_details = None
[docs]
class HHblitsEValue(Score):
"""E-value computed by HHblits for an alignment. See :class:`Score` for
more details."""
type = "HHblits e-value"
other_details = None