Ejemplo n.º 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
Ejemplo n.º 2
0
class MainWidget(QSplitter):
    def __init__(self, parent, toolbar):
        QSplitter.__init__(self, parent)
        self.data_ref = None
        self.setContentsMargins(10, 10, 10, 10)
        self.setOrientation(Qt.Vertical)

        dsinfo = DSInfo(self)
        self.addWidget(dsinfo)
        dsproperties = DSProperties(self)
        self.addWidget(dsproperties)
        imagelistwithproperties = ImageListWithProperties(self)
        self.addWidget(imagelistwithproperties)
        self.imagelist = imagelistwithproperties.imagelist
        self.imagelist.currentRowChanged.connect(self.current_item_changed)
        self.imagelist.itemSelectionChanged.connect(self.selection_changed)
        self.ds = dsproperties.datas
        self.info = dsinfo.datas
        self.ds.SIG_APPLY_BUTTON_CLICKED.connect(self.properties_changed)
        self.properties = imagelistwithproperties.properties
        self.properties.SIG_APPLY_BUTTON_CLICKED.connect(
            self.properties_changed)

        self.imagewidget = CurveWidget(self)
        self.item = None
        self.flagitem = None
        self.flagname = ""

        self.imagewidget.add_toolbar(toolbar, "default")
        self.imagewidget.register_standard_tools()

        flag = create_action(self,
                             _("Get preflag from file..."),
                             icon=get_icon('eraser.png'),
                             tip=_("Get a preflag from file"),
                             triggered=self.preflag)
        fit = create_action(self,
                            _("Open fit window..."),
                            icon=get_icon('polyline.png'),
                            tip=_("Open fit window"),
                            triggered=self.fit_win)
        #apply = create_action(self, _("Apply fit file..."),
        #                      icon=get_icon('export.png'), tip=_("Apply fit file"),
        #                      triggered=self.apply_fit)
        add_actions(toolbar, [None, flag, fit])
        self.addWidget(self.imagewidget)

        self.images = []
        self.setStretchFactor(0, 0)
        self.setStretchFactor(1, 1)
        self.setHandleWidth(10)
        self.setSizes([50, 100, 200, 600])

    def set_data_ref(self, data_ref):
        self.data_ref = data_ref
        self.data_ref.flag = None

    def set_images(self, data_ref):
        for dataset in data_ref.dir_datasets:
            image = ImageParam()
            image.title = dataset.title
            image.otype = dataset.otype
            image.selected = dataset.selected
            self.images.append(image)

    def set_ds_selector(self):
        #c_polar = [("l", "l"), ("r", "r")]
        #choices.set(c_polar)
        #print choices.__call__()
        self.dssel = DSParam()

    def open_setup(self, data_ref):
        self.set_data_ref(data_ref)
        self.set_images(data_ref)
        self.set_ds_selector()
        self.refresh_list()
        self.update_info()


#    def refresh_list(self):
#        self.imagelist.clear()
#        self.imagelist.addItems([image.title for image in self.images])

    def refresh_list(self):
        self.imagelist.clear()
        for image in self.images:
            item = QListWidgetItem(image.title)
            item.setFlags(item.flags() | Qt.ItemIsUserCheckable)
            item.setCheckState(2 if image.selected else 0)
            self.imagelist.addItem(item)

    def selection_changed(self):
        row = self.imagelist.currentRow()
        self.properties.setDisabled(row == -1)

    def current_item_changed(self, row):
        self.image = self.images[row]
        med = self.data_ref.get_median_data([row], self.dssel.section,
                                            self.dssel.polar,
                                            [self.image.rangei],
                                            [self.image.ranges],
                                            [self.image.excluded])
        self.image.x = med[0]
        self.image.y = med[1]
        self.show_data(self.image.x, self.image.y, self.data_ref.flag)
        update_dataset(self.properties.dataset, self.image)
        self.properties.get()
        self.update_info()

    def show_data(self, x, y, flag=None):
        plot = self.imagewidget.plot
        if self.item is not None:
            self.item.set_data(x, y)
        else:
            self.item = make.curve(x, y, color='blue')
            plot.add_item(self.item, z=0)
        if flag is not None:
            if self.flagitem is not None:
                self.flagitem.set_data(x, flag * y)
            else:
                self.flagitem = make.curve(x, flag * y, color='green')
                plot.add_item(self.flagitem, z=0)
        plot.replot()

    def update_info(self):
        row = self.imagelist.currentRow()
        ds = self.data_ref.dir_datasets[row]
        self.info.dataset.feed = self.dssel.feed
        self.info.dataset.section = self.dssel.section
        d = {"0": "L", "1": "R", "2": "Q", "3": "U"}
        self.info.dataset.polar = d[self.dssel.polar]
        self.info.dataset.freq = self.data_ref.dw_io.get_frequency(ds.th)
        self.info.dataset.band = self.data_ref.dw_io.get_bandwidth(
            ds.th, self.dssel.section, d[self.dssel.polar])
        self.info.dataset.otype = ds.otype
        self.info.dataset.flagname = self.flagname
        self.info.get()

    def properties_changed(self):
        row = self.imagelist.currentRow()
        image = self.images[row]
        try:
            image.x
        except:
            pass
        else:
            if ((self.properties.dataset.franges != 0
                 and self.properties.dataset.franges < len(image.x)
                 and self.properties.dataset.frangei <
                 self.properties.dataset.franges)
                    or (self.properties.dataset.franges == 0
                        and self.properties.dataset.frangei < len(image.x))):
                pass
            else:
                msgBox = QMessageBox()
                msgBox.setText(
                    "Fit range void or out of bound! Range max 0:%s" %
                    (len(image.x) - 1))
                msgBox.exec_()
                return -1
        update_dataset(image, self.properties.dataset)
        #self.dssel.section = self.data_ref.list2choices(self.data_ref.sections[int(self.ds.dataset.feed)])
        csections.set(
            self.data_ref.list2choices(self.data_ref.sections[int(
                self.ds.dataset.feed)]))
        update_dataset(self.dssel, self.ds.dataset)
        self.update_info()
        if self.flagname:
            self.data_ref.flag = self.data_ref.get_flag_curve(
                self.flagname, self.dssel.section)
        #for i in self.images:
        #    i.otype = image.otype
        if image.rall == True:
            for i in self.images:
                i.rangei = image.rangei
                i.ranges = image.ranges
        if image.eall == True:
            for i in self.images:
                i.excluded = image.excluded
        for i in self.images:
            i.frangei = image.frangei
            i.franges = image.franges
        try:
            self.show_data(image.x, image.y, self.data_ref.flag)
        except:
            pass

    def preflag(self):
        filename = getopenfilename(self, _("Open"), "")
        if not str(filename[0]):
            return -1
        else:
            #try:
            self.flagname = str(filename[0])
            self.data_ref.flag = self.data_ref.get_flag_curve(
                self.flagname, self.dssel.section)
            self.properties_changed()
            #except:
            #    msgBox = QMessageBox()
            #    msgBox.setText("Wrong file!")
            #    msgBox.exec_()
            #    return -1

    def get_gmedian(self):
        ldata = []
        liran = []
        lsran = []
        lexcl = []
        for i in enumerate(self.images):
            if self.imagelist.item(i[0]).checkState() == 2:
                ldata.append(i[0])
                liran.append(i[1].rangei)
                lsran.append(i[1].ranges)
                lexcl.append(i[1].excluded)
        if len(ldata) != 0:
            self.data_ref.dssel = [
                self.dssel.feed, self.dssel.section, self.dssel.polar
            ]
            self.data_ref.gmed = self.data_ref.get_median_data(
                ldata, self.dssel.section, self.dssel.polar, liran, lsran,
                lexcl)
        else:
            return -1

    def fit_win(self):
        self.fwindow = FitWindow()
        #try:
        self.get_gmedian()
        self.fwindow.get_data(self.data_ref, self.images[0].frangei,
                              self.images[0].franges)
        self.fwindow.show()
        #except:
        #    msgBox = QMessageBox()
        #    msgBox.setText("Selection empty!")
        #    msgBox.exec_()
        #    return -1

    def apply_fit(self):
        msgBox = QMessageBox()
        msgBox.setText("Apply corrections?")
        msgBox.setInformativeText(
            "Select to which files will be applied the correction.")
        CancelButton = msgBox.addButton("Cancel", msgBox.RejectRole)
        SelectButton = msgBox.addButton("Select", msgBox.NoRole)
        AllButton = msgBox.addButton("All", msgBox.YesRole)
        #msgBox.setDefaultButton(QMessageBox.Cancel)
        msgBox.exec_()
        if msgBox.clickedButton() == CancelButton:
            return -1
        elif msgBox.clickedButton() == AllButton:
            filelist = None
        elif msgBox.clickedButton() == SelectButton:
            flret = getopenfilenames(self, _("Select file list"),
                                     self.data_ref.dir_name)[0]
            filelist = []
            for f in flret:
                filelist.append((basename(str(f)), dirname(str(f))))
            msgBox = QMessageBox()
            msgBox.setText("Select the correction file")
            msgBox.addButton(QMessageBox.Ok)
            msgBox.exec_()

        filename = getopenfilename(
            self, _("Correction file"),
            self.data_ref.dir_name + "/" + basename(
                normpath(self.data_ref.dir_name) + "_fit." +
                self.data_ref.files_type))
        try:
            self.data_ref.applycorr(str(filename[0]), filelist)
        except:
            msgBox = QMessageBox()
            msgBox.setText("Not a correction file!")
            msgBox.exec_()
            return -1