예제 #1
0
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
예제 #2
0
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))
예제 #3
0
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))