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