示例#1
0
    def __init__(self, parent=None, helpDialog=None):
        "Initialize LeginonUI widget"

        QtGui.QWidget.__init__(self, parent)

        # Build window
        _logger.info("\rBuilding main window ...")
        self.ui = Ui_Form()
        self.ui.setupUi(self)
        self.login = {}
        self.helpDialog = helpDialog
        self.startTabIndex = 0

        self.ui.progressDialog = QtGui.QProgressDialog('Loading...', "", 0, 5,
                                                       self)
        self.ui.progressDialog.setWindowModality(QtCore.Qt.ApplicationModal)
        self.ui.progressDialog.findChildren(QtGui.QPushButton)[0].hide()
        #self.ui.progressDialog.setCancelButton(0) # might work
        #self.ui.progressDialog.setWindowFlags(self.ui.progressDialog.windowFlags() & ~QtCore.Qt.WindowCloseButtonHint) #v5s
        self.ui.progressDialog.setWindowFlags(QtCore.Qt.Window
                                              | QtCore.Qt.WindowTitleHint
                                              | QtCore.Qt.CustomizeWindowHint)

        self.ui.reloadTableToolButton.clicked.connect(
            self.queryDatabaseForProjects)
        self.taskUpdated.connect(self.updateProgress)

        self.ui.leginonHostnameLineEdit.editingFinished.connect(
            lambda: self.ui.projectHostnameLineEdit.setText(
                self.ui.leginonHostnameLineEdit.text())
            if self.ui.projectHostnameLineEdit.text() == "" else None)

        header = [('Session', None), ('Project', None), ('Images', None),
                  ('Voltage', 'voltage'), ('Pixel Size', 'apix'),
                  ('Magnification', None), ('CS', 'cs'), ('Image Name', None),
                  ('Image Path', None), ('Frame Path', None)]
        self.header = [h[0] for h in header]
        self.headermap = dict([h for h in header if h[1] is not None])
        self.images = []

        self.ui.projectTableView.setModel(
            ListTableModel([], self.header, None, self))
        selmodel = self.ui.projectTableView.selectionModel()
        selmodel.selectionChanged.connect(self.selectionChanged)
        _logger.info("\rLoading settings ...")
        self.readSettings()
        self.on_loginPushButton_clicked()
示例#2
0
    def __init__(self, parent=None):
        "Initialize screener window"

        QtGui.QWidget.__init__(self, parent)
        self.parent_control = parent

        # Build window
        _logger.info("Building main window ...")
        self.ui = Ui_Form()
        self.ui.setupUi(self)
        self.header = ['# Mics', '# Particles', 'Disk', 'Mask', 'Overlap']
        self.options = [
            self.ui.diskDoubleSpinBox.statusTip(),
            self.ui.diskDoubleSpinBox.statusTip(),
            self.ui.diskDoubleSpinBox.statusTip()
        ]
        self.data = []
        self.micrograph_files = []
        self.output = None
        self.output_base = None

        self.ui.autopickHistoryTableView.setModel(
            ListTableModel([], self.header, None, self))

        #selmodel=self.ui.autopickHistoryTableView.selectionModel()
        self.ui.autopickHistoryTableView.doubleClicked.connect(
            self.on_runPushButton_clicked)

        #doubleClicked ( const QModelIndex & index )

        self.ui.progressDialog = QtGui.QProgressDialog('Running...', "Close",
                                                       0, 1, self)
        self.ui.progressDialog.setWindowModality(QtCore.Qt.ApplicationModal)
        #self.ui.progressDialog.findChildren(QtGui.QPushButton)[0].hide()
        self.ui.progressDialog.setWindowFlags(QtCore.Qt.Window
                                              | QtCore.Qt.WindowTitleHint
                                              | QtCore.Qt.CustomizeWindowHint)
        self.task = None
        self.output = None
        self.taskUpdated.connect(self.updateProgress)
        self.option_control_map = self._collect_options_controls()
        self._add_controls()
示例#3
0
    def saveSelection(self, invert=False, filename=None, prefix=None):
        '''
        '''

        if filename is None: filename = self.selection_file
        self.setEnabled(False)
        try:
            progressDialog = QtGui.QProgressDialog('Saving...', "", 0, 5, self)
            progressDialog.setWindowModality(QtCore.Qt.WindowModal)
            progressDialog.show()
            if isinstance(filename, tuple): filename = filename[0]
            if not filename: return

            file_index = self.file_index.copy()
            if invert:
                sel = file_index[:, 2] > -1
                file_index[sel, 2] = numpy.logical_not(file_index[sel, 2] > 0)

            if filename != "":
                if self.advanced_settings.relion != "" and os.path.splitext(
                        filename)[1] == '.star':
                    if not (len(self.files) == 1
                            or len(self.files) == len(file_index)):
                        progressDialog.hide()
                        QtGui.QMessageBox.critical(
                            self, "Saving Relion Selection File",
                            "You have opened more than one class stack. Cannot save a Relion Selection file!",
                            QtGui.QMessageBox.Ok | QtGui.QMessageBox.Default
                            | QtGui.QMessageBox.NoButton)
                        self.setEnabled(True)
                        return

                    progressDialog.setValue(1)
                    _logger.info("Saving Relion selection file to %s" %
                                 filename)
                    class_column_name = 'rlnClassNumber'
                    vals = format.read(self.advanced_settings.relion,
                                       numeric=True)
                    progressDialog.setValue(2)
                    subset = []
                    selected = set([v[1] + 1 for v in file_index if v[2] > 0])
                    progressDialog.setValue(3)
                    for v in vals:
                        id = int(getattr(v, class_column_name))
                        if id in selected: subset.append(v)
                    progressDialog.setValue(4)
                    format.write(filename, subset, prefix=prefix)
                    progressDialog.setValue(5)
                    #relion_selection.select_class_subset(vals, select, filename)
                elif len(self.files) == 1 or len(
                        self.files) == len(file_index):
                    progressDialog.setValue(3)
                    _logger.info("Saving single selection file to %s" %
                                 filename)
                    if not spider_utility.is_spider_filename(
                            self.files) and len(self.files) > 1:
                        _logger.info(
                            "File names do not conform to SPIDER, writing as star file"
                        )
                        filename = os.path.splitext(filename)[0] + '.star'
                        vals = [(self.files[v[0]], 1) for v in file_index
                                if v[2] > 0]
                    elif len(self.files) > 1:
                        vals = [(spider_utility.spider_id(self.files[v[0]]), 1)
                                for v in file_index if v[2] > 0]
                    else:
                        vals = [(v[1] + 1, 1) for v in file_index if v[2] > 0]
                    progressDialog.setValue(4)
                    format.write(filename,
                                 vals,
                                 header='id,select'.split(','),
                                 default_format=format.spidersel,
                                 prefix=prefix)
                    progressDialog.setValue(5)
                else:
                    progressDialog.setValue(3)
                    _logger.info(
                        "Saving multiple selection files by stack to %s" %
                        filename)
                    if not spider_utility.is_spider_filename(self.files):
                        _logger.info(
                            "File names do not conform to SPIDER, writing as star file"
                        )
                        filename = os.path.splitext(filename)[0] + '.star'
                        vals = [(relion_utility.relion_identifier(
                            self.files[v[0]], v[1] + 1), 1) for v in file_index
                                if v[2] > 0]
                        format.write(filename,
                                     vals,
                                     header='id,select'.split(','))
                    else:
                        micselect = {}
                        for v in file_index:
                            if v[2] > 0:
                                mic = spider_utility.spider_id(
                                    self.files[v[0]])
                                if mic not in micselect: micselect[mic] = []
                                micselect[mic].append((v[1] + 1, 1))
                        for mic, vals in micselect.iteritems():
                            format.write(filename,
                                         numpy.asarray(vals),
                                         spiderid=mic,
                                         header="id,select".split(','),
                                         default_format=format.spidersel,
                                         prefix=prefix)
                    progressDialog.setValue(5)
        finally:
            self.setEnabled(True)
        #progressDialog.hide()
        print 'done'
示例#4
0
    def on_loadImagesPushButton_clicked(self):
        ''' Load the current batch of images into the list
        '''

        if len(self.files) == 0: return
        self.imageListModel.clear()
        index, start = self.imageSubset(self.ui.pageSpinBox.value() - 1,
                                        self.ui.imageCountSpinBox.value())
        if len(index) == 0:
            self.ui.pageSpinBox.blockSignals(True)
            self.ui.pageSpinBox.setValue(0)
            self.ui.pageSpinBox.blockSignals(False)
            self.ui.imageCountSpinBox.blockSignals(True)
            self.ui.imageCountSpinBox.setValue(1)
            self.ui.imageCountSpinBox.blockSignals(False)
            index, start = self.imageSubset(0, 1)
        bin_factor = self.ui.decimateSpinBox.value()
        nstd = self.ui.clampDoubleSpinBox.value()
        img = None
        self.loaded_images = []
        self.base_level = None
        zoom = self.ui.imageZoomDoubleSpinBox.value()
        masks = {}

        template = self.get_template()

        progressDialog = QtGui.QProgressDialog('Opening...', "Cancel", 0,
                                               len(index), self)
        progressDialog.setWindowModality(QtCore.Qt.WindowModal)
        progressDialog.show()

        self.ui.imageListView.setModel(None)

        if not drawing.is_available():
            _logger.info("No PIL loaded")
            self.advanced_settings.mark_image = False
        if not plotting.is_available():
            _logger.info("No matplotlib loaded")
            self.advanced_settings.mark_image = False

        current_powerspec = self.advanced_settings.current_powerspec
        if current_powerspec:
            if self.advanced_settings.invert:
                _logger.info("Cannot invert a power spectra")
        else:
            if self.advanced_settings.center_mask > 0:
                _logger.info("Cannot mask micrograph")

        added_items = []
        for i, (imgname, img, pixel_size) in enumerate(
                iter_images(self.files, index, template)):
            selimg = None
            progressDialog.setValue(i + 1)
            if hasattr(img, 'ndim'):
                if current_powerspec and self.advanced_settings.center_mask > 0 and img.shape not in masks:
                    masks[img.shape] = ndimage_utility.model_disk(
                        self.advanced_settings.center_mask, img.shape) * -1 + 1
                if self.advanced_settings.invert and not current_powerspec:
                    if img.max() != img.min(): ndimage_utility.invert(img, img)
                img = ndimage_utility.replace_outlier(img,
                                                      nstd,
                                                      nstd,
                                                      replace='mean')
                if self.advanced_settings.gaussian_high_pass > 0.0:
                    img = ndimage_filter.filter_gaussian_highpass(
                        img,
                        pixel_size / self.advanced_settings.gaussian_high_pass)
                if self.advanced_settings.gaussian_low_pass > 0.0:
                    img = ndimage_filter.filter_gaussian_lowpass(
                        img,
                        pixel_size / self.advanced_settings.gaussian_low_pass)
                if current_powerspec and self.advanced_settings.center_mask > 0:
                    #img[numpy.logical_not(masks[img.shape])] = numpy.mean(img[masks[img.shape]])
                    img *= masks[img.shape]
                if bin_factor > 1.0:
                    img = ndimage_interpolate.interpolate(
                        img, bin_factor,
                        self.advanced_settings.downsample_type)
                pixel_size *= bin_factor
                img = self.display_powerspectra_1D(img, imgname, pixel_size)
                img = self.display_resolution(img, imgname, pixel_size)
                img = self.box_particles(img, imgname)
                if self.advanced_settings.mark_image:
                    imgm = self.imageMarker(img)
                    selimg = qimage_utility.numpy_to_qimage(imgm)
                qimg = qimage_utility.numpy_to_qimage(img)
                if img.ndim == 2:
                    if self.base_level is not None:
                        qimg.setColorTable(self.color_level)
                    else:
                        self.base_level = qimg.colorTable()
                        self.color_level = qimage_utility.adjust_level(
                            qimage_utility.change_contrast, self.base_level,
                            self.ui.contrastSlider.value())
                        qimg.setColorTable(self.color_level)
                else:
                    if self.base_level is None: self.base_level = []
                    self.base_level.append(qimg.colorTable())
                    self.color_level = qimage_utility.adjust_level(
                        qimage_utility.change_contrast, self.base_level[-1],
                        self.ui.contrastSlider.value())
                    qimg.setColorTable(self.color_level)

            else:
                qimg = img.convertToFormat(QtGui.QImage.Format_Indexed8)
                if self.base_level is None: self.base_level = []
                self.base_level.append(qimg.colorTable())
                self.color_level = qimage_utility.adjust_level(
                    qimage_utility.change_contrast, self.base_level[-1],
                    self.ui.contrastSlider.value())
                qimg.setColorTable(self.color_level)
            self.loaded_images.append(qimg)
            pix = QtGui.QPixmap.fromImage(qimg)
            icon = QtGui.QIcon()
            icon.addPixmap(pix, QtGui.QIcon.Normal)
            if selimg is not None:
                pix = QtGui.QPixmap.fromImage(selimg)
            icon.addPixmap(pix, QtGui.QIcon.Selected)
            if self.advanced_settings.show_label:
                item = QtGui.QStandardItem(
                    icon,
                    "%s/%d" % (os.path.basename(imgname[0]), imgname[1] + 1))
            else:
                item = QtGui.QStandardItem(icon, "")
            if hasattr(start, '__iter__'):
                item.setData(start[i], QtCore.Qt.UserRole)
            else:
                item.setData(i + start, QtCore.Qt.UserRole)

            self.addToolTipImage(imgname, item, pixel_size)
            self.imageListModel.appendRow(item)
            added_items.append(item)

        self.ui.imageListView.setModel(self.imageListModel)
        progressDialog.hide()
        for item in added_items:
            self.notify_added_item(item)

        self.imagesize = img.shape[0] if hasattr(img, 'shape') else img.width()
        n = max(5, int(self.imagesize * zoom))
        self.ui.imageListView.setIconSize(QtCore.QSize(n, n))

        batch_count = numpy.ceil(
            float(self.imageTotal()) / self.ui.imageCountSpinBox.value())
        self.ui.pageSpinBox.setSuffix(" of %d" % batch_count)
        self.ui.pageSpinBox.setMaximum(batch_count)
        self.ui.actionForward.setEnabled(
            self.ui.pageSpinBox.value() < batch_count)
        self.ui.actionBackward.setEnabled(self.ui.pageSpinBox.value() > 0)