Mercurial > repos > miller-lab > genome_diversity
diff Population.py @ 27:8997f2ca8c7a
Update to Miller Lab devshed revision bae0d3306d3b
author | Richard Burhans <burhans@bx.psu.edu> |
---|---|
date | Mon, 15 Jul 2013 10:47:35 -0400 |
parents | 2c498d40ecde |
children |
line wrap: on
line diff
--- a/Population.py Mon Jun 03 12:29:29 2013 -0400 +++ b/Population.py Mon Jul 15 10:47:35 2013 -0400 @@ -1,12 +1,17 @@ #!/usr/bin/env python -from OrderedDict import OrderedDict +import OrderedDict +import base64 +import json +import zlib + +import sys class Individual(object): __slots__ = ['_column', '_name', '_alias'] def __init__(self, column, name, alias=None): - self._column = column + self._column = int(column) self._name = name self._alias = alias @@ -42,7 +47,7 @@ class Population(object): def __init__(self, name=None): - self._columns = OrderedDict() + self._columns = OrderedDict.OrderedDict() self._name = name @property @@ -87,8 +92,9 @@ def tag_list(self, delimiter=':'): entries = [] - for column, individual in self._columns.items(): - entry = '{0}{1}{2}'.format(column, delimiter, individual.name) + for column, individual in self._columns.iteritems(): + first_token = individual.name.split()[0] + entry = '{0}{1}{2}'.format(column, delimiter, first_token) entries.append(entry) return entries @@ -122,7 +128,58 @@ individual = Individual(column, name) self.add_individual(individual) + def from_wrapped_dict(self, wrapped_dict): + unwraped_dict = self.unwrap_dict(wrapped_dict) + for name, column in unwraped_dict.iteritems(): + individual = Individual(column, name) + self.add_individual(individual) + + def unwrap_dict(self, wrapped_dict): + decoded_value = self.decode_value(wrapped_dict) + decompressed_value = self.decompress_value(decoded_value) + def _decode_list(data): + rv = [] + for item in data: + if isinstance(item, unicode): + item = item.encode('utf-8') + elif isinstance(item, list): + item = _decode_list(item) + elif isinstance(item, dict): + item = _decode_dict(item) + rv.append(item) + return rv + def _decode_dict(data): + rv = {} + for key, value in data.iteritems(): + if isinstance(key, unicode): + key = key.encode('utf-8') + if isinstance(value, unicode): + value = value.encode('utf-8') + elif isinstance(value, list): + value = _decode_list(value) + elif isinstance(value, dict): + value = _decode_dict(value) + rv[key] = value + return rv + unwrapped_dict = json.loads(decompressed_value, object_hook=_decode_dict) + return unwrapped_dict + + def decode_value(self, value): + try: + return base64.b64decode(value) + except TypeError, message: + print >> sys.stderr, 'base64.b64decode: {0}: {1}'.format(message, value) + sys.exit(1) + + def decompress_value(self, value): + try: + return zlib.decompress(value) + except zlib.error, message: + print >> sys.stderr, 'zlib.decompress: {0}'.format(message) + sys.exit(1) + def individual_names(self): for column, individual in self._columns.items(): - yield individual.name + first_token = individual.name.split()[0] + yield first_token