Performance improvements, broke the background patches
This commit is contained in:
		
							parent
							
								
									f328a6dae6
								
							
						
					
					
						commit
						974a189e52
					
				
							
								
								
									
										76
									
								
								main.py
								
								
								
								
							
							
						
						
									
										76
									
								
								main.py
								
								
								
								
							|  | @ -31,8 +31,9 @@ import os | |||
| import os.path | ||||
| import pygame.image | ||||
| import Queue | ||||
| import StringIO | ||||
| import cStringIO | ||||
| import temp_log | ||||
| import time | ||||
| import threading | ||||
| 
 | ||||
| dataThread = None | ||||
|  | @ -97,6 +98,8 @@ class MainWindow(FloatLayout): | |||
|                 else: | ||||
|                     self.lastStatus = {'status' : 'paused', 'message' : 'Data reception halted by user'} | ||||
|                     Logger.debug('MainWindow: state set to ' + str(self.state) + ' : ignoring data') | ||||
|             if dataThreadDataQueue.qsize(): | ||||
|                 Logger.debug('Queue Size: ' + str(dataThreadDataQueue.qsize())) | ||||
|         except Queue.Empty: | ||||
|             pass | ||||
| 
 | ||||
|  | @ -389,6 +392,7 @@ class PlotWidget(Image): | |||
|         self.data = numpy.array([], dtype=float); | ||||
|         self.lastTime = 0 | ||||
|         self.lastTemperature = 0 | ||||
|         self.lastSave = 0 | ||||
|         self.figure = matplotlib.pyplot.figure() | ||||
|         self.plot_axes = self.figure.add_subplot(1, 1, 1) | ||||
|         self.plot_axes.hold(False) | ||||
|  | @ -420,15 +424,17 @@ class PlotWidget(Image): | |||
|                     matplotlib.patches.Rectangle(origin, width, height, | ||||
|                                                  fc = color, visible = True, | ||||
|                                                  fill = True) | ||||
|                     #matplotlib.patches.Polygon(vertices, facecolor = color) | ||||
|                 ) | ||||
|                 legend_handles.append(p) | ||||
|                 legend_strings.append(name) | ||||
|         self.figure.legend(legend_handles, legend_strings, 'upper left', | ||||
|         # Disabled for the moment | ||||
|         self.figure.legend(legend_handles, legend_strings, 'lower right', | ||||
|                            title = 'Enzyme Activity Zones') | ||||
|         return legend_handles | ||||
| 
 | ||||
| 
 | ||||
|     def clear_data(self): | ||||
|         self.update_output_files(True) | ||||
|         self.data = numpy.array([], dtype=float); | ||||
|         self.reference_profile_file = '' | ||||
|         self.reference_profile = None | ||||
|  | @ -458,9 +464,7 @@ class PlotWidget(Image): | |||
|         self.texture.flip_vertical() | ||||
|         # Update output files, if any | ||||
|         # @TODO Add in an update interval so the disk isn't hammered on every single update | ||||
|         self.update_image_output_file() | ||||
|         self.update_raw_data_output_file() | ||||
| 
 | ||||
|         self.update_output_files() | ||||
| 
 | ||||
|     def to_image_data(self): | ||||
|         # Add in polygons for hilightning particular temperature ranges of interest. | ||||
|  | @ -470,42 +474,52 @@ class PlotWidget(Image): | |||
|         temp_max = 80 | ||||
|         handles = [] | ||||
|         if self.data.any(): | ||||
|             data = numpy.copy(self.data) | ||||
|             data = data.transpose() | ||||
|             #data = numpy.copy(self.data) | ||||
|             data = self.data.transpose() | ||||
|             t, temperature = numpy.split(data, 2, axis = 0) | ||||
|             if t[0][-1] > time_max: | ||||
|                 time_max = t[0][-1] | ||||
|             if numpy.nanmax(temperature[0]) > temp_max: | ||||
|                 temp_max = numpy.nanmax(temperature[0]) | ||||
|             #if numpy.nanmax(temperature[0]) > temp_max: | ||||
|             #    temp_max = numpy.nanmax(temperature[0]) | ||||
|             plot_args.extend((t[0], temperature[0], 'b')) | ||||
|             handles.append('Recorded Temperature Profile') | ||||
|         if self.reference_profile is not None and self.reference_profile.any(): | ||||
|             reference_data = numpy.copy(self.reference_profile) | ||||
|             reference_data = reference_data.transpose() | ||||
|             #reference_data = numpy.copy(self.reference_profile) | ||||
|             reference_data = self.reference_profile.transpose() | ||||
|             t2, reference_temperature = numpy.split(reference_data, 2, axis = 0) | ||||
|             # Add t[0] to all reference points to make it fit on the current graph | ||||
|             if t: | ||||
|                 t2 = numpy.add(t2, t[0][0]) | ||||
|             t2 = numpy.add(t2, t[0][0]) | ||||
|             if t2[0][-1] > time_max: | ||||
|                 time_max = t2[0][-1] | ||||
|             if numpy.nanmax(reference_temperature[0]) > temp_max: | ||||
|                 temp_max = numpy.nanmax(reference_temperature[0]) | ||||
|             #if numpy.nanmax(reference_temperature[0]) > temp_max: | ||||
|             #    temp_max = numpy.nanmax(reference_temperature[0]) | ||||
|             plot_args.extend((t2[0], reference_temperature[0], 'r')) | ||||
|             handles.append('Reference Temperature Profile') | ||||
|         lines = self.plot_axes.plot(*plot_args) | ||||
|         # Patches must be changed after the axes are plotted. | ||||
|         self.update_patches(time_max) | ||||
|         self.plot_axes.legend(lines, handles, 'upper right', title = 'Temperature Profiles') | ||||
|         if not lines: | ||||
|             # Set a default in case no data is plotted. This may allow patches to show, | ||||
|             # and it will look a little nicer before recording starts. | ||||
|             self.plot_axes.set_xlim(0, time_max) | ||||
|             self.plot_axes.set_ylim(0, temp_max) | ||||
|         image_data = StringIO.StringIO() | ||||
|         self.update_patches() | ||||
|         # Disabled the legend for the moment. | ||||
|         # @TODO Make a small subplot next to the main plot into which legends may be placed. | ||||
|         #self.plot_axes.legend(lines, handles, 'lower right', title = 'Temperature Profiles') | ||||
|         # Set a default in case no data is plotted. This may allow patches to show, | ||||
|         # and it will look a little nicer before recording starts. | ||||
|         #self.plot_axes.set_xlim(0, time_max) | ||||
|         self.plot_axes.set_ylim(0, temp_max) | ||||
|         image_data = cStringIO.StringIO() | ||||
|         self.figure.savefig(image_data, format = 'png') | ||||
|         image_data.seek(0) | ||||
|         self._image_raw_data = image_data | ||||
|         return self._image_raw_data | ||||
|         self._image_raw_data = image_data.getvalue() | ||||
|         return image_data | ||||
| 
 | ||||
| 
 | ||||
|     def update_output_files(self, force = False): | ||||
|         # Do this only once every 15 seconds to avoid hitting the disk frequently | ||||
|         Logger.debug('update_output_files called') | ||||
|         if force or time.time() - self.lastSave > 15: | ||||
|             Logger.debug('update_output_files going ahead') | ||||
|             self.update_raw_data_output_file() | ||||
|             self.update_image_output_file() | ||||
|             self.lastSave = time.time() | ||||
| 
 | ||||
| 
 | ||||
|     def update_raw_data_output_file(self): | ||||
|  | @ -515,11 +529,15 @@ class PlotWidget(Image): | |||
| 
 | ||||
|     def update_image_output_file(self, image_data = None): | ||||
|         if not image_data: | ||||
|             image_data = self.to_image_data() | ||||
|             image_data = self._image_raw_data | ||||
|         if self.image_output_file and image_data: | ||||
|             f = open(self.image_output_file, 'w') | ||||
|             f.write(image_data.read()) | ||||
|             f.close() | ||||
|             if f: | ||||
|                 Logger.debug('Updated image output file') | ||||
|                 f.write(image_data) | ||||
|                 f.close() | ||||
|             else: | ||||
|                 Logger.debug('update_image_output_file: Unable to open file ' + self.image_output_file) | ||||
| 
 | ||||
| 
 | ||||
|     def on_lastTemperature(self, value): | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue