source: trunk/Puzzlebox/Synapse/Interface_Plot.py @ 305

Last change on this file since 305 was 305, checked in by sc, 10 years ago
  • Packaging preparations for 0.5.1
  • Support for Matplotlib with PySide? backend
File size: 9.5 KB
Line 
1# -*- coding: utf-8 -*-
2
3# Copyright Puzzlebox Productions, LLC (2010-2011)
4#
5# This code is released under the GNU Pulic License (GPL) version 2
6# For more information please refer to http://www.gnu.org/copyleft/gpl.html
7
8__changelog__ = """\
9Last Update: 2011.12.04
10"""
11
12import os
13
14#import Puzzlebox.Jigsaw.Configuration as configuration
15import Configuration as configuration
16
17if configuration.ENABLE_PYSIDE:
18        try:
19                import PySide as PyQt4
20                from PySide import QtCore, QtGui
21        except:
22                print "ERROR: Exception importing PySide:",
23                print e
24                configuration.ENABLE_PYSIDE = False
25        else:
26                print "INFO: [Interface_Plot] Using PySide module"
27                os.environ["QT_API"] = "pyside"
28                import matplotlib
29                matplotlib.use("Qt4Agg")
30
31if not configuration.ENABLE_PYSIDE:
32        print "INFO: [Interface_Plot] Using PyQt4 module"
33        from PyQt4 import QtCore, QtGui
34
35
36### IMPORTS ###
37from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas
38from matplotlib.figure import Figure
39from numpy import arange, sin, pi
40
41
42#try:
43        #import PySide as PyQt4
44        #from PySide import QtCore, QtGui
45#except:
46        #print "Using PyQt4 module"
47        #from PyQt4 import QtCore, QtGui
48#else:
49        #print "Using PySide module"
50
51#import Configuration as configuration
52
53### GLOBALS ###
54
55DEBUG = configuration.DEBUG
56INTERFACE_RAW_EEG_UPDATE_FREQUENCY = 512
57
58
59#####################################################################
60
61class matplotlibCanvas(FigureCanvas):
62       
63        """Ultimately, this is a QWidget (as well as a FigureCanvasAgg, etc.)."""
64       
65        def __init__(self, parent=None, width=8, height=4, dpi=100, title=None):
66               
67                fig = Figure(figsize=(width, height), dpi=dpi)
68                self.axes_top = fig.add_subplot(211)
69                self.axes_bottom = fig.add_subplot(212)
70                # We want the axes cleared every time plot() is called
71                self.axes_top.hold(False)
72                self.axes_bottom.hold(False)
73               
74                if title != None:
75                        fig.suptitle(title, fontsize=12)
76               
77                FigureCanvas.__init__(self, fig)
78                self.setParent(parent)
79               
80                FigureCanvas.setSizePolicy(self,
81                                                                                        QtGui.QSizePolicy.Expanding,
82                                                                                        QtGui.QSizePolicy.Expanding)
83                FigureCanvas.updateGeometry(self)
84
85
86#####################################################################
87#####################################################################
88
89class rawEEGMatplotlibCanvas(matplotlibCanvas):
90       
91        def __init__(self,  *args, **kwargs):
92               
93                matplotlibCanvas.__init__(self, *args, **kwargs)
94               
95                self.DEBUG=DEBUG
96               
97                #timer = QtCore.QTimer(self)
98                #QtCore.QObject.connect(timer, QtCore.SIGNAL("timeout()"), self.update_figure)
99                #timer.start(256)
100               
101                self.update_top_frequency = \
102                   INTERFACE_RAW_EEG_UPDATE_FREQUENCY
103                self.update_bottom_frequency = \
104                   INTERFACE_RAW_EEG_UPDATE_FREQUENCY / 2
105               
106                self.values_top = []
107                self.values_bottom = []
108               
109                self.axes_top.set_xbound(0, self.update_top_frequency)
110                self.axes_top.set_ybound(-2048, 2047)
111               
112                self.axes_bottom.set_xbound(0, self.update_bottom_frequency)
113                self.axes_bottom.set_ybound(-512, 512)
114               
115                self.axes_top.grid(True)
116                self.axes_bottom.grid(True)
117               
118                self.axes_top.text(self.update_top_frequency + 24, \
119                                   0, \
120                                   '1.0 seconds', \
121                                   rotation='vertical', \
122                                   verticalalignment='center')
123               
124                self.axes_bottom.text(self.update_bottom_frequency + 12, \
125                                   0, \
126                                   '0.5 seconds', \
127                                   rotation='vertical', \
128                                   verticalalignment='center')
129               
130                self.axes_top.set_autoscale_on(False)
131                self.axes_bottom.set_autoscale_on(False)
132       
133       
134        ##################################################################
135       
136        def update_figure(self, value):
137               
138                self.values_top.append(value)
139                self.values_bottom.append(value)
140               
141                if len(self.values_top) == self.update_top_frequency:
142                       
143                        self.axes_top.plot(range(self.update_top_frequency), \
144                                       self.values_top, \
145                                       'b-', \
146                                       scalex=False, \
147                                       scaley=False)
148                       
149                        #self.axes_top.set_ylabel('%i Hz' % self.update_top_frequency)
150                        self.axes_top.grid(True)
151                       
152                        self.axes_top.text(self.update_top_frequency + 24, \
153                                           0, \
154                                           '1.0 seconds', \
155                                           rotation='vertical', \
156                                           verticalalignment='center')
157                       
158                        self.draw()
159                       
160                        self.values_top = []
161               
162               
163                if len(self.values_bottom) == self.update_bottom_frequency:
164                       
165                        self.axes_bottom.plot(range(self.update_bottom_frequency), \
166                                       self.values_bottom, \
167                                       'r-', \
168                                       scalex=False, \
169                                       scaley=False)
170                       
171                        #self.axes_bottom.set_ylabel('%i Hz' % self.update_bottom_frequency)
172                        self.axes_bottom.grid(True)
173                       
174                        self.axes_bottom.text(self.update_bottom_frequency + 12, \
175                                           0, \
176                                           '0.5 seconds', \
177                                           rotation='vertical', \
178                                           verticalalignment='center')
179                       
180                        self.draw()
181                       
182                        self.values_bottom = []
183
184
185#####################################################################
186#####################################################################
187
188class chartEEGMatplotlibCanvas(matplotlibCanvas):
189       
190        def __init__(self,  *args, **kwargs):
191               
192                matplotlibCanvas.__init__(self, *args, **kwargs)
193               
194                self.DEBUG=DEBUG
195               
196                self.graph_length = 30
197               
198                self.values_eeg_bands = {}
199               
200                for key in configuration.THINKGEAR_EEG_POWER_BAND_ORDER:
201                        self.values_eeg_bands[key] = []
202                        for x in range(self.graph_length):
203                                self.values_eeg_bands[key].append(0)
204               
205               
206                self.values_esense = {'attention': [], \
207                                      'meditation': []}
208               
209                for key in self.values_esense.keys():
210                        for x in range(self.graph_length):
211                                self.values_esense[key].append(0)
212               
213               
214                self.axes_top.set_xbound(self.graph_length, 0)
215                self.axes_top.set_ybound(0, 100)
216               
217                self.axes_bottom.set_xbound(self.graph_length, 0)
218                self.axes_bottom.set_ybound(0, 100)
219               
220                self.axes_top.grid(True)
221                self.axes_bottom.grid(True)
222               
223                self.axes_top.text(self.graph_length + 1, \
224                                   50, \
225                                   'Frequency Bands', \
226                                   rotation='vertical', \
227                                   verticalalignment='center')
228               
229                self.axes_bottom.text(self.graph_length + 1, \
230                                   50, \
231                                   'eSense Values', \
232                                   rotation='vertical', \
233                                   verticalalignment='center')
234               
235                self.axes_top.set_autoscale_on(False)
236                self.axes_bottom.set_autoscale_on(False)
237       
238       
239        ##################################################################
240       
241        def update_values(self, index, values):
242               
243                if (index == 'eegPower'):
244                       
245                        for key in values.keys():
246                                self.values_eeg_bands[key].append(values[key])
247                                self.values_eeg_bands[key] = \
248                                        self.values_eeg_bands[key][1:]         
249               
250               
251                elif (index == 'eSense'):
252                       
253                        for key in values.keys():
254                               
255                                self.values_esense[key].append(values[key])
256                                self.values_esense[key] = \
257                                        self.values_esense[key][1:]
258       
259       
260        ##################################################################
261       
262        def update_figure(self, index, values):
263               
264                if (index == 'eegPower'):
265                       
266                        label_values = self.axes_top.plot(range(self.graph_length), \
267                                           #self.values_eeg_bands['delta'], \
268                                           #configuration.INTERFACE_CHART_STYLES['delta'], \
269                                           #self.values_eeg_bands['theta'], \
270                                           #configuration.INTERFACE_CHART_STYLES['theta'], \
271                                           self.values_eeg_bands['lowAlpha'], \
272                                           configuration.INTERFACE_CHART_STYLES['lowAlpha'], \
273                                           self.values_eeg_bands['highAlpha'], \
274                                           configuration.INTERFACE_CHART_STYLES['highAlpha'], \
275                                           self.values_eeg_bands['lowBeta'], \
276                                           configuration.INTERFACE_CHART_STYLES['lowBeta'], \
277                                           self.values_eeg_bands['highBeta'], \
278                                           configuration.INTERFACE_CHART_STYLES['highBeta'], \
279                                           #self.values_eeg_bands['lowGamma'], \
280                                           #configuration.INTERFACE_CHART_STYLES['lowGamma'], \
281                                           #self.values_eeg_bands['highGamma'], \
282                                           #configuration.INTERFACE_CHART_STYLES['highGamma'], \
283                                           scalex=False, \
284                                           scaley=True)
285                       
286                        self.axes_top.grid(True)
287                       
288                        self.axes_top.text(self.graph_length + 1, \
289                                           50, \
290                                           '                            Frequency Bands', \
291                                           rotation='vertical', \
292                                           verticalalignment='center')
293                       
294                        self.axes_top.legend( \
295                           (label_values[0], label_values[1], label_values[2], label_values[3]), \
296                           ('LowAlpha', 'HighAlpha', 'LowBeta', 'HighBeta'), \
297                           loc='center left')
298                       
299                        self.draw()
300               
301               
302                elif (index == 'eSense'):
303                       
304                        label_values = self.axes_bottom.plot(range(self.graph_length), \
305                                              self.values_esense['attention'], \
306                                              configuration.INTERFACE_CHART_STYLES['attention'], \
307                                              self.values_esense['meditation'], \
308                                              configuration.INTERFACE_CHART_STYLES['meditation'], \
309                                              scalex=False, \
310                                              scaley=False)
311                       
312                       
313                        self.axes_bottom.grid(True)
314                       
315                        self.axes_bottom.text(self.graph_length + 1, \
316                                              50, \
317                                              'eSense Values', \
318                                              rotation='vertical', \
319                                              verticalalignment='center')
320                       
321                        self.axes_bottom.legend( \
322                           (label_values[0], label_values[1]), \
323                           ('Attention', 'Meditation'), \
324                           loc='lower left')
325                       
326                        self.draw()
327
Note: See TracBrowser for help on using the repository browser.