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()
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()
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'
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)