class CentralWidget(QSplitter): def __init__(self, parent, settings, toolbar, start_freq, bandwidth, numpts, dev): QSplitter.__init__(self, parent) self.setContentsMargins(10, 10, 10, 10) self.setOrientation(Qt.Vertical) self.curvewidget = CurveWidget(self) self.item = {} self.points = [] self.max_hold = False self.do_log = True self.colours = ['b', 'r', 'c', 'y'] self.legend = None self.settings = settings self.curvewidget.add_toolbar(toolbar, "default") self.curvewidget.register_all_image_tools() self.curvewidget.plot.set_axis_title(BasePlot.X_BOTTOM, 'Frequency') self.addWidget(self.curvewidget) self.prog = QProgressBar() self.prog.setMaximumHeight(32) self.addWidget(self.prog) self.setStretchFactor(0, 0) self.setStretchFactor(1, 0) self.setStretchFactor(2, 1) self.setHandleWidth(10) self.setSizes([1, 5, 1]) if start_freq is None: start_freq = float( self.settings.value('spectrum/start_freq', 190e6)) if bandwidth is None: bandwidth = float(self.settings.value('spectrum/bandwidth', 50e6)) if numpts is None: numpts = int(self.settings.value('spectrum/num_samps', 6000)) print start_freq, bandwidth, numpts self.settings.setValue('spectrum/start_freq', start_freq) self.settings.setValue('spectrum/bandwidth', bandwidth) self.settings.setValue('spectrum/num_samps', numpts) self.bg7 = BG7(start_freq, bandwidth, numpts, sport=dev) self.reset_data() self.bg7.measurement_progress.connect(self.measurement_progress) self.bg7.measurement_complete.connect(self.measurement_complete) self.bg7.start() def reset_data(self): self.count_data = 0 self.raw_data = {} self.raw_data['Latest'] = {} self.raw_data['Max'] = {} self.raw_data['Mean'] = {} self.raw_data['Max']['data'] = None self.raw_data['Logged'] = self.bg7.log_mode def measurement_progress(self, val): self.prog.setValue(int(val)) def measurement_complete(self, data, start_freq, step_size, num_samples): print 'cback', start_freq, step_size # data, start_freq, step_size, num_samples = cback_data if data is not None: if 'Cal Data' in self.raw_data.keys(): self.raw_data['Latest'][ 'data'] = data[:] - self.raw_data['Cal Data']['data'] else: self.raw_data['Latest']['data'] = data[:] self.raw_data['Latest']['freqs'] = (np.arange(num_samples) * step_size) + start_freq self.raw_data['Latest']['freq_units'] = 'MHz' if self.raw_data['Latest']['freqs'][num_samples / 2] > 1e9: self.raw_data['Latest']['freqs'] /= 1e9 self.raw_data['Latest']['freq_units'] = 'GHz' else: self.raw_data['Latest']['freqs'] /= 1e6 self.curvewidget.plot.set_axis_unit( BasePlot.X_BOTTOM, self.raw_data['Latest']['freq_units']) self.show_data('Latest') if self.count_data == 0: self.raw_data['Mean'][ 'data'] = self.raw_data['Latest']['data'] * 1.0 else: self.raw_data['Mean']['data'] = (( (self.raw_data['Mean']['data'] * self.count_data) + self.raw_data['Latest']['data']) / (self.count_data + 1.0)) self.count_data += 1 self.show_data('Mean') if self.max_hold: if self.raw_data['Max']['data'] is None: self.raw_data['Max']['data'] = self.raw_data['Latest'][ 'data'] else: self.raw_data['Max']['data'][:] = np.maximum( self.raw_data['Max']['data'], self.raw_data['Latest']['data']) self.show_data('Max') if 'Cal Data' in self.raw_data.keys(): self.show_data('Cal Data') self.bg7.start() def save_cal_data(self, fname): fp = open(fname, 'wb') cPickle.dump(self.raw_data, fp) fp.close() self.settings.setValue('spectrum/file_dir', os.path.dirname(fname)) def load_cal_data(self, fname): fp = open(fname, 'rb') cal_data = cPickle.load(fp) # Add some checks to make sure cal data is valid for our current setup self.raw_data['Cal Data'] = {} self.raw_data['Cal Data']['data'] = cal_data['Mean']['data'][:] fp.close() self.settings.setValue('spectrum/file_dir', os.path.dirname(fname)) def axes_changed(self, plot): pass def show_data(self, label): data = self.raw_data[label]['data'] xaxis = self.raw_data['Latest']['freqs'] print 'xmin', np.min(xaxis), np.max(xaxis) self.dshape = data.shape[0] vals = np.log10(data.shape[0]) if vals > 4: fact = 10**int(vals - 4) n = int(data.shape[0] / fact) print 'Factor', fact, 'N', n s = data[0:n * fact].reshape(n, fact) data = np.mean(s, axis=1) s = xaxis[0:n * fact].reshape(n, fact) xaxis = np.mean(s, axis=1) print 'Min', np.min(data), 'Max', np.max(data), data.shape print 'dshape', self.dshape if label in self.item.keys(): if self.do_log: self.item[label].set_data(xaxis, data) else: self.item[label].set_data(xaxis, np.log10(data)) else: if self.do_log: self.item[label] = make.curve( xaxis, data, color=self.colours[len(self.item) % len(self.colours)], title=label) else: self.item[label] = make.curve( xaxis, data, color=self.colours[len(self.item) % len(self.colours)], title=label) self.curvewidget.plot.add_item(self.item[label]) self.curvewidget.plot.set_antialiasing(True) if self.legend is None: self.legend = make.legend("TR") self.curvewidget.plot.add_item(self.legend) self.item[label].plot().replot() def rescan(self): print self.curvewidget.plot.get_axis_limits(BasePlot.X_BOTTOM) ax = self.curvewidget.plot.get_axis_limits(BasePlot.X_BOTTOM) un = self.curvewidget.plot.get_axis_unit(BasePlot.X_BOTTOM) if un == 'MHz': factor = 1e6 elif un == 'GHz': factor = 1e9 else: factor = 1.0 self.reset_data() self.bg7.setParams(ax[0] * factor, (ax[1] - ax[0]) * factor) self.settings.setValue('spectrum/start_freq', ax[0] * factor) self.settings.setValue('spectrum/bandwidth', (ax[1] - ax[0]) * factor) #self.bg7.start() def do_max_hold(self): self.max_hold = not self.max_hold self.settings.setValue('gui/max_hold', self.max_hold) def do_log_lin(self, new_state): self.bg7.do_log(new_state) self.reset_data() # self.settings.setValue('gui/log_lin', new_state) def do_new_plot(self): pass
class HDFViewWindow(gui.SlabWindow, UiClass): def __init__(self, fname=None): gui.SlabWindow.__init__(self, HDFViewThread) self.setupSlabWindow(autoparam=True) self.auto_register_gui() self.register_param(self.datasets_treeWidget, "dataset") self.register_param(self.datapath_lineEdit, "datapath") # Setup Plots -- Could be eliminated if QtDesigner plugins were setup self.toolbar = Qt.QToolBar() self.addToolBar(self.toolbar) self.image_widget = ImageWidget(show_xsection=True, show_ysection=True) self.image_widget.add_toolbar(self.toolbar) self.image_widget.register_all_image_tools() self.image_plot = self.image_widget.plot self.image_plot_layout.addWidget(self.image_widget) self.gui["image_plot"] = self.image_plot self.line_widget = CurveWidget() self.gui["line_plot"] = self.line_plot = self.line_widget.plot #CurvePlot() self.line_plot_layout.addWidget(self.line_plot) self.line_widget.register_all_image_tools() # Context Menu actions self.set_x_action = Qt.QAction("Set as x data", self) self.clear_x_action = Qt.QAction("Clear x data", self) self.datasets_treeWidget.customContextMenuRequested.connect( lambda point: self.msg("menu requested")) self.datasets_treeWidget.customContextMenuRequested.connect( self.datasets_context_menu) # Connect launchers self.datapath_browse_pushButton.clicked.connect(self.select_datapath) self.register_script("set_datapath", self.datapath_lineEdit) self.register_script("load_file", self.datafiles_listWidget) self.register_script("load_dset", self.datasets_treeWidget) self.register_script("set_x_data", self.set_x_action) self.register_script("clear_x_data", self.clear_x_action) # Syntax Highlighting self.highlight = syntax.PythonHighlighter(self.script_textEdit.document()) # Setup Prompt """ message = "The currently loaded file is stored as 'f'" self.shell = InternalShell(self, message=message) self.shell.set_font(Qt.QFont("Consolas")) self.shell_dockWidget.setWidget(self.shell) self.gui["shell"] = self.shell """ self.start_thread() if fname is not None: self.shell.exit_interpreter() directory = os.path.dirname(fname) nameitem = namedtuple('pseudoitem', ('filename',))(fname) self.msg(fname) self.set_param("datapath", directory) self.start_script("set_datapath") self.start_script("load_file", nameitem) def closeEvent(self, event): self.shell.exit_interpreter() event.accept() def select_datapath(self): path = str(Qt.QFileDialog.getExistingDirectory( self, 'Open Datapath',self.params["datapath"])) if path: self.params["datapath"] = path self.emit(Qt.SIGNAL("RunOnDataThread"), "set_datapath") def datasets_context_menu(self, point): menu = Qt.QMenu() menu.addAction(self.set_x_action) menu.addAction(self.clear_x_action) menu.exec_(self.datasets_treeWidget.mapToGlobal(point))
class HDFViewWindow(gui.SlabWindow, UiClass): def __init__(self, fname=None): gui.SlabWindow.__init__(self, HDFViewThread) self.setupSlabWindow(autoparam=True) self.auto_register_gui() self.register_param(self.datasets_treeWidget, "dataset") self.register_param(self.datapath_lineEdit, "datapath") # Setup Plots -- Could be eliminated if QtDesigner plugins were setup self.toolbar = Qt.QToolBar() self.addToolBar(self.toolbar) self.image_widget = ImageWidget(show_xsection=True, show_ysection=True) self.image_widget.add_toolbar(self.toolbar) self.image_widget.register_all_image_tools() self.image_plot = self.image_widget.plot self.image_plot_layout.addWidget(self.image_widget) self.gui["image_plot"] = self.image_plot self.line_widget = CurveWidget() self.gui[ "line_plot"] = self.line_plot = self.line_widget.plot #CurvePlot() self.line_plot_layout.addWidget(self.line_plot) self.line_widget.register_all_image_tools() # Context Menu actions self.set_x_action = Qt.QAction("Set as x data", self) self.clear_x_action = Qt.QAction("Clear x data", self) self.datasets_treeWidget.customContextMenuRequested.connect( lambda point: self.msg("menu requested")) self.datasets_treeWidget.customContextMenuRequested.connect( self.datasets_context_menu) # Connect launchers self.datapath_browse_pushButton.clicked.connect(self.select_datapath) self.register_script("set_datapath", self.datapath_lineEdit) self.register_script("load_file", self.datafiles_listWidget) self.register_script("load_dset", self.datasets_treeWidget) self.register_script("set_x_data", self.set_x_action) self.register_script("clear_x_data", self.clear_x_action) # Syntax Highlighting self.highlight = syntax.PythonHighlighter( self.script_textEdit.document()) # Setup Prompt """ message = "The currently loaded file is stored as 'f'" self.shell = InternalShell(self, message=message) self.shell.set_font(Qt.QFont("Consolas")) self.shell_dockWidget.setWidget(self.shell) self.gui["shell"] = self.shell """ self.start_thread() if fname is not None: self.shell.exit_interpreter() directory = os.path.dirname(fname) nameitem = namedtuple('pseudoitem', ('filename', ))(fname) self.msg(fname) self.set_param("datapath", directory) self.start_script("set_datapath") self.start_script("load_file", nameitem) def closeEvent(self, event): self.shell.exit_interpreter() event.accept() def select_datapath(self): path = str( Qt.QFileDialog.getExistingDirectory(self, 'Open Datapath', self.params["datapath"])) if path: self.params["datapath"] = path self.emit(Qt.SIGNAL("RunOnDataThread"), "set_datapath") def datasets_context_menu(self, point): menu = Qt.QMenu() menu.addAction(self.set_x_action) menu.addAction(self.clear_x_action) menu.exec_(self.datasets_treeWidget.mapToGlobal(point))