added chaos support to genome reading

This commit is contained in:
erik 2011-12-18 15:14:39 -07:00
parent 00890dd0d1
commit 6228b1bb64

View File

@ -105,12 +105,15 @@ def palette_encode(data, format='rgb8'):
""" """
if format != 'rgb8': if format != 'rgb8':
raise NotImplementedError raise NotImplementedError
enc = base64.b64encode(np.uint8(data[:,:3]*255.0)) clamp = np.maximum(0, np.minimum(255, np.round(data[:,:3]*255.0)))
enc = base64.b64encode(np.uint8(clamp))
return ['rgb8'] + [enc[i:i+64] for i in range(0, len(enc), 64)] return ['rgb8'] + [enc[i:i+64] for i in range(0, len(enc), 64)]
class _AttrDict(dict): class _AttrDict(dict):
def __getattr__(self, name): def __getattr__(self, name):
if name in self:
return self[name] return self[name]
raise AttributeError('%s not a dict key' % name)
@classmethod @classmethod
def _wrap(cls, dct): def _wrap(cls, dct):
@ -296,9 +299,12 @@ def convert_flame(flame):
} }
info = {} info = {}
for k, f in [('name', 'name'), ('author_url', 'url'), ('author', 'nick')]: if 'name' in flame:
if f in flame: info['name'] = flame['name']
info[k] = flame[f] if 'nick' in flame:
info['authors'] = [flame['nick']]
if 'url' in flame:
info['authors'][0] = info['authors'][0] + ', http://' + flame['url']
time = dict(frame_width=float(flame.get('temporal_filter_width', 1)), time = dict(frame_width=float(flame.get('temporal_filter_width', 1)),
duration=1) duration=1)
@ -317,15 +323,16 @@ def convert_flame(flame):
('estimator_minimum', 'minimum', 0), ('estimator_minimum', 'minimum', 0),
('estimator_curve', 'curve', 0.6)]) ('estimator_curve', 'curve', 0.6)])
xfs = dict([(str(k), convert_xform(v)) num_xf = len(flame['xforms'])
xfs = dict([(str(k), convert_xform(v, num_xf))
for k, v in enumerate(flame['xforms'])]) for k, v in enumerate(flame['xforms'])])
if 'finalxform' in flame: if 'finalxform' in flame:
xfs['final'] = convert_xform(flame['finalxform'], True) xfs['final'] = convert_xform(flame['finalxform'], num_xf, True)
return dict(camera=camera, color=color, de=de, xforms=xfs, return dict(camera=camera, color=color, de=de, xforms=xfs,
info=info, time=time, palettes=[pal], link='self') info=info, time=time, palettes=[pal], link='self')
def convert_xform(xf, isfinal=False): def convert_xform(xf, num_xf, isfinal=False):
# TODO: chaos # TODO: chaos
xf = dict(xf) xf = dict(xf)
symm = float(xf.pop('symmetry', 0)) symm = float(xf.pop('symmetry', 0))
@ -337,6 +344,15 @@ def convert_xform(xf, isfinal=False):
out['affine'] = convert_affine(xf.pop('coefs'), anim) out['affine'] = convert_affine(xf.pop('coefs'), anim)
if 'post' in xf and map(float, xf['post'].split()) != [1, 0, 0, 1, 0, 0]: if 'post' in xf and map(float, xf['post'].split()) != [1, 0, 0, 1, 0, 0]:
out['post'] = convert_affine(xf.pop('post')) out['post'] = convert_affine(xf.pop('post'))
if 'chaos' in xf:
chaos = map(float, xf.pop('chaos').split())
out['chaos'] = dict()
for i in range(num_xf):
if i < len(chaos):
out['chaos'][str(i)] = chaos[i]
else:
out['chaos'][str(i)] = 1.0
out['variations'] = {} out['variations'] = {}
for k in var_code: for k in var_code:
if k in xf: if k in xf:
@ -344,7 +360,7 @@ def convert_xform(xf, isfinal=False):
for param, default in var_params.get(k, {}).items(): for param, default in var_params.get(k, {}).items():
var[param] = float(xf.pop('%s_%s' % (k, param), default)) var[param] = float(xf.pop('%s_%s' % (k, param), default))
out['variations'][k] = var out['variations'][k] = var
assert not xf, 'Unrecognized parameters remain: ' + xf assert not xf, 'Unrecognized parameters remain: ' + str(xf)
return out return out
def convert_affine(aff, animate=False): def convert_affine(aff, animate=False):