source: trunk/synapse/synapse-render_video.py @ 263

Last change on this file since 263 was 263, checked in by sc, 11 years ago

synapse/synapse-render_video.py:

  • data values merged
  • Property svn:executable set to *
File size: 6.3 KB
Line 
1#!/usr/bin/env python
2# -*- coding: utf-8 -*-
3
4# Copyright Puzzlebox Productions, LLC (2010)
5#
6# This code is released under the GNU Pulic License (GPL) version 2
7# For more information please refer to http://www.gnu.org/copyleft/gpl.html
8
9__changelog__ = """\
10Last Update: 2011.01.22
11"""
12
13#__doc__ = """\
14#Puzzlebox.Synapse.Protocol
15
16#usage:
17  #from Puzzlebox.Synapse import Protocol
18#"""
19
20#import Puzzlebox.Synapse.Interface as tgInterface
21
22import sys
23
24from mpl_toolkits.mplot3d import Axes3D
25from matplotlib.collections import PolyCollection
26from matplotlib.colors import colorConverter
27import matplotlib.pyplot as plt
28import numpy
29
30try:
31        import cPickle as pickle
32except:
33        import pickle
34
35#####################################################################
36# Globals
37#####################################################################
38
39DEBUG = 1
40
41DEFAULT_INPUT_FILE = 'untitled.synapse'
42DEFAULT_HISTORY_IMAGE_FILE = 'history.png'
43DEFAULT_CURRENT_VALUES_IMAGE_FILE = 'current.png'
44
45DEFAULT_OUTPUT_DIRECTORY = 'output'
46DEFAULT_OUTPUT_IMAGE_PREFIX = 'output'
47
48DEFAULT_ATTENTION_COLOR = 'red'
49DEFAULT_MEDITATION_COLOR = 'blue'
50
51DEFAULT_HISTORY_WIDTH = 240
52DEFAULT_HISTORY_HEIGHT = 180
53
54DEFAULT_CURRENT_VALUES_WIDTH = 96
55DEFAULT_CURRENT_VALUES_HEIGHT = 720
56
57#####################################################################
58# Functions
59#####################################################################
60
61def renderHistoryImage(attention=None, \
62                            meditation=None ,\
63                            width = DEFAULT_HISTORY_WIDTH, \
64                            height = DEFAULT_HISTORY_HEIGHT, \
65                            attention_color = DEFAULT_ATTENTION_COLOR, \
66                            mediation_color = DEFAULT_MEDITATION_COLOR, \
67                            output_file=DEFAULT_HISTORY_IMAGE_FILE):
68       
69        figsize = (width / 100.0, height / 100.0) # @ 100 dpi
70
71        fig = plt.figure(figsize=figsize)
72
73        ax = fig.gca(projection='3d')
74
75        cc = lambda arg: colorConverter.to_rgba(arg, alpha=0.6)
76
77        xs = numpy.arange(-30, 0, 1)
78        verts = []
79        #zs = [0.333, 0.667]
80        #zs = [0.25, 0.75]
81        zs = [0.2, 0.8]
82
83
84        # Draw Attention History
85        if attention == None:
86                ys = numpy.random.rand(len(xs))
87
88                #for y in range(0, len(ys) - 1):
89                for y in range(0, len(ys)):
90                        ys[y] = ys[y] * 100 # bring random numbers up to the 100's range
91       
92        else:
93                ys = attention
94       
95        #ys[0], ys[-1] = 0, 0
96        #ys[0], ys[-1] = 50, 50
97        ys[0] = 0
98        #ys[1] = 50
99
100        verts.append(zip(xs, ys))
101
102
103        # Draw Meditation History
104        if meditation == None:
105                ys = numpy.random.rand(len(xs))
106
107                #for y in range(0, len(ys) - 1):
108                for y in range(0, len(ys)):
109                        ys[y] = ys[y] * 100 # bring random numbers up to the 100's range
110       
111        else:
112                ys = meditation
113       
114        #ys[0], ys[-1] = 0, 0
115        #ys[0], ys[-1] = 50, 50
116        ys[0] = 0
117        #ys[1] = 50
118
119        verts.append(zip(xs, ys))
120
121
122        poly = PolyCollection(verts, facecolors = [cc('red'), cc('blue')])
123        poly.set_alpha(0.8)
124        ax.add_collection3d(poly, zs=zs, zdir='y')
125
126        ax.set_axis_bgcolor('black')
127
128        ax.set_xlim3d(-30, 0)
129        ax.set_ylim3d(0, 1)
130        ax.set_zlim3d(0, 100)
131
132        plt.savefig(output_file, \
133                dpi=100, \
134                facecolor='black', \
135                edgecolor='black', \
136                format='png', \
137                pad_inches=0)
138
139
140#####################################################################
141
142def renderCurrentValuesImage(x=None, y=None ,\
143                                  width = DEFAULT_CURRENT_VALUES_WIDTH, \
144                                  height = DEFAULT_CURRENT_VALUES_HEIGHT, \
145                                  x_color = DEFAULT_ATTENTION_COLOR, \
146                                  y_color = DEFAULT_MEDITATION_COLOR, \
147                                  output_file=DEFAULT_CURRENT_VALUES_IMAGE_FILE):
148       
149        figsize = (width / 100.0, height / 100.0) # @ 100 dpi
150       
151        fig = plt.figure(figsize=figsize)
152       
153        ax = fig.add_subplot(111, projection='3d')
154       
155        if x == None:
156                x = numpy.random.rand(1)[0] * 100
157       
158        if y == None:
159                y = numpy.random.rand(1)[0] * 100
160       
161        if type(x) != type([]):
162                x = [x]
163       
164        if type(y) != type([]):
165                y = [y]
166               
167        hist, xedges, yedges = numpy.histogram2d(x, y, bins=[2,1])
168
169        elements = (len(xedges) - 1) * (len(yedges) - 1)
170        xpos, ypos = numpy.meshgrid(xedges[:-1], yedges[:-1])
171
172        xpos = xpos.flatten()
173        ypos = ypos.flatten()
174        zpos = numpy.zeros(elements)
175        dx = 0.5 * numpy.ones_like(zpos)
176        dy = dx.copy()
177        dz = hist.flatten()
178
179        dx = [0.5]
180        dy = [0.5]
181        dz = [x, y]
182
183        ax.bar3d(xpos, ypos, zpos, dx, dy, dz, color=[x_color, y_color], zsort='average')
184
185        ax.set_axis_bgcolor('black')
186
187        ax.set_zlim3d(0, 100)
188
189        ax.view_init(10, -120)
190
191        plt.savefig(output_file, \
192                dpi=100, \
193                facecolor='black', \
194                edgecolor='black', \
195                format='png', \
196                pad_inches=0)
197
198
199#####################################################################
200
201def openData(input_file=DEFAULT_INPUT_FILE):
202       
203        file = open(input_file, 'r')
204        data = pickle.load(file)
205        file.close()
206       
207        return(data)
208
209
210#####################################################################
211
212def mergeDataValues(data):
213       
214        merge = {}
215       
216        for signal in data['signals']:
217               
218                if 'eSense' in signal.keys():
219                       
220                        #index = int(signal['timestamp'])
221                        index = signal['timestamp']
222                       
223                        if index not in merge.keys():
224                                merge[index] = {}
225                       
226                        if 'attention' in signal['eSense'].keys():
227                                merge[ index ]['attention'] = \
228                                   signal['eSense']['attention']
229
230                        if 'meditation' in signal['eSense'].keys():
231                                merge[ index ]['meditation'] = \
232                                   signal['eSense']['meditation']
233
234
235        return(merge)
236
237
238#####################################################################
239
240def renderValuesFrames(data, \
241                            output_directory=DEFAULT_OUTPUT_DIRECTORY, \
242                            prefix=DEFAULT_OUTPUT_IMAGE_PREFIX):
243
244        data_keys = data.keys()
245        data_keys.sort()
246
247        for each in data_keys:
248               
249                if DEBUG > 1:
250                        print each,
251                        print data[each]
252
253
254#####################################################################
255# Main
256#####################################################################
257
258if __name__ == '__main__':
259
260        input_file = DEFAULT_INPUT_FILE
261        output_directory = DEFAULT_OUTPUT_DIRECTORY
262        prefix = DEFAULT_OUTPUT_IMAGE_PREFIX
263
264        for each in sys.argv:
265                if each.startswith("--file="):
266                        input_file = each[ len("--file="): ]
267                if each.startswith("--directory="):
268                        output_directory = each[ len("--directory="): ]
269                if each.startswith("--prefix="):
270                        prexfix = each[ len("--prexfix="): ]
271       
272        data = openData(input_file)
273       
274        #renderCurrentValuesImage()
275        #renderHistoryImage()
276       
277        data = mergeDataValues(data)
278        renderValuesFrames(data, output_directory, prefix)
279
Note: See TracBrowser for help on using the repository browser.