Source code for bandwitch.ClonesObservations.Clone
from collections import OrderedDict
from .CloneValidation import CloneValidation
[docs]class Clone:
"""Gather all informations necessary to validate a clone.
Parameters
----------
name
Name of the clone. Could be for instance a microplate well.
digestions
A dictionnary ``{digestion: CloneObservation}`` where ``digestion`` is
of the form ``('EcoRI', 'BamHI')``.
construct_id
ID of the construct to be validated. This is used to group clones
by construct in the validation reports.
"""
def __init__(self, name, digestions, construct_id=None):
"""Initialize."""
self.name = name
self.digestions = digestions
self.construct_id = construct_id
[docs] def validate_bands(self, bands_by_digestion, relative_tolerance=0.1,
min_band_cutoff=None, max_band_cutoff=None):
"""Return a validation results (comparison of observed and expected).
The result is a CloneValidation object.
Parameters
----------
bands_by_digestion
A dictionnary ``{digestion: [bands]}`` where ``digestion`` is
of the form ``('EcoRI', 'BamHI')``, and bands is a list of band sizes
relative_tolerance
Tolerance, as a ratio of the full ladder span. If =0.1, then the
discrepancy will have a value of 1 when a band's nearest
correspondent in the other pattern is more that 10% of the ladder
span apart.
min_band_cutoff
Discrepancies involving at least one band below this minimal band
size will be ignored. By default, it will be set to the smallest
band size in the ladder.
max_band_cutoff
Discrepancies involving at least one band above this minimal band
size will be ignored. By default, it will be set to the smallest
band size in the ladder.
"""
for digestion, observation in self.digestions.items():
discrepancies = {
digestion: observation.patterns_discrepancy(
other_bands=bands_by_digestion[digestion],
relative_tolerance=relative_tolerance,
min_band_cutoff=min_band_cutoff,
max_band_cutoff=max_band_cutoff
)
for digestion, observation in self.digestions.items()
}
return CloneValidation(self, bands_by_digestion,
discrepancies=discrepancies)
@staticmethod
def from_bands_observations(observations, constructs_map, digestions_map,
clones_map=None):
if isinstance(observations, (dict, OrderedDict)):
observations = list(observations.values())
if clones_map is None:
clones_map = {name: name for name in constructs_map}
clones = OrderedDict()
for obs in observations:
if obs.name not in clones_map:
continue
clone_name = clones_map[obs.name]
if clone_name not in clones:
clones[clone_name] = Clone(
name=clone_name,
construct_id=constructs_map.get(clone_name, 'no_clone'),
digestions={}
)
digestion = digestions_map[obs.name]
clones[clone_name].digestions[digestion] = obs
return clones