예제 #1
0
    def readSettings(self):
        '''
        '''

        settings = QtCore.QSettings()
        settings.beginGroup("LeginonUI")
        val = settings.value('leginonDB')
        if val: self.ui.leginonHostnameLineEdit.setText(val)
        val = settings.value('leginonPath')
        if val: self.ui.leginonDBNameLineEdit.setText(val)
        val = settings.value('projectDB')
        if val: self.ui.projectHostnameLineEdit.setText(val)
        val = settings.value('projectPath')
        if val: self.ui.projectDBNameLineEdit.setText(val)
        self.ui.usernameLineEdit.setText(settings.value('targetuser'))
        self.ui.passwordLineEdit.setText(settings.value('targetpass'))

        val = settings.value('username')
        if val: self.ui.dbUsernameLineEdit.setText(val)
        val = settings.value('password')
        if val: self.ui.dbPasswordLineEdit.setText(base64.b64decode(val))

        #self.ui.alternateUserLineEdit.setText(settings.value('alternate-user'))
        settings.endGroup()
        if self.ui.usernameLineEdit.text() == "":
            self.ui.usernameLineEdit.setText(getpass.getuser())
예제 #2
0
 def __init__(self, parent=None, helpDialog=None):
     '''
     '''
     
     QtGui.QWidget.__init__(self, parent)
     
     self.ui = Ui_Form()
     
     self.timer_interval=500
     self.ui.jobUpdateTimer = QtCore.QTimer(self)
     self.ui.jobUpdateTimer.setInterval(self.timer_interval)
     self.ui.jobUpdateTimer.setSingleShot(False)
     self.helpDialog=helpDialog
     self.last_offset=0
     self.total_running=0
     
     self.ui.setupUi(self)
     #self.ui.pushButton.clicked.connect(self.runProgram)
     self.ui.jobUpdateTimer.timeout.connect(self.on_jobUpdateTimer_timeout)
     self.ui.jobProgressBar.setMinimum(0)
     self.ui.jobListView.setModel(QtGui.QStandardItemModel(self))
     self.job_status_icons=[QtGui.QIcon(f) for f in [':/mini/mini/clock.png', ':/mini/mini/arrow_refresh.png', ':/mini/mini/tick.png', ':/mini/mini/cross.png']]
     self.ui.crashReportToolButton.setEnabled(False)
     #self.text_cursor = QtGui.QTextCursor(self.ui.logTextEdit.document())
     self.current_pid = None
     self.fin = None
     self.log_file = None
     self.created = None
     self.log_text=""
     self.workflowProcess=None
예제 #3
0
    def on_loadImagesPushButton_clicked(self):
        ''' Load the current batch of images into the list
        '''

        selmodel = self.ui.imageListView.selectionModel()
        self.disconnect(
            selmodel,
            QtCore.SIGNAL(
                "selectionChanged(const QItemSelection &, const QItemSelection &)"
            ), self.onSelectionChanged)
        ImageViewerWindow.on_loadImagesPushButton_clicked(self)
        selmodel = self.ui.imageListView.selectionModel()
        self.connect(
            selmodel,
            QtCore.SIGNAL(
                "selectionChanged(const QItemSelection &, const QItemSelection &)"
            ), self.onSelectionChanged)
예제 #4
0
 def on_monitorInformationToolButton_clicked(self):
     '''
     '''
     
     if self.helpDialog is not None:
         self.helpDialog.setHTML(self.ui.pushButton.toolTip())
         self.helpDialog.show()
     else:
         QtGui.QToolTip.showText(self.ui.pushButton.mapToGlobal(QtCore.QPoint(0,0)), self.ui.pushButton.toolTip())
예제 #5
0
    def getSettings(self):
        ''' Get the settings object
        '''
        '''
        return QtCore.QSettings(QtCore.QSettings.IniFormat, QtCore.QSettings.UserScope, "Arachnid", "ImageScreen")
        '''

        if self.inifile == "": return None
        return QtCore.QSettings(self.inifile, QtCore.QSettings.IniFormat)
예제 #6
0
    def writeSettings(self):
        '''
        '''

        settings = QtCore.QSettings()
        settings.beginGroup("ProjectUI")
        settings.setValue('spiderExecutable',
                          self.ui.spiderExecutableLineEdit.text())
        settings.endGroup()
예제 #7
0
    def readSettings(self):
        '''
        '''

        settings = QtCore.QSettings()
        settings.beginGroup("ProjectUI")
        val = settings.value('spiderExecutable')
        if val: self.ui.spiderExecutableLineEdit.setText(val)
        settings.endGroup()
예제 #8
0
    def registerPage(self, wizardPage):
        '''
        '''

        wizardPage.registerField(
            wizardPage.wizard().param("raw_reference_file*"),
            self.ui.referenceLineEdit)
        wizardPage.registerField(wizardPage.wizard().param("curr_apix*"),
                                 self.ui.referencePixelSizeDoubleSpinBox,
                                 "value",
                                 QtCore.SIGNAL('valueChanged(double)'))
예제 #9
0
    def setup(self):
        ''' Display specific setup
        '''

        selmodel = self.ui.imageListView.selectionModel()
        self.connect(
            selmodel,
            QtCore.SIGNAL(
                "selectionChanged(const QItemSelection &, const QItemSelection &)"
            ), self.onSelectionChanged)
        self.ui.imageListView.setStyleSheet(
            'QListView::item:selected{ color: #008000; border: 3px solid #6FFF00; }'
        )
예제 #10
0
    def on_imageZoomDoubleSpinBox_valueChanged(self, zoom=None):
        ''' Called when the user wants to plot only a subset of the data
        
        :Parameters:
        
        index : int
                New index in the subset combobox
        '''

        if zoom is None: zoom = self.ui.imageZoomDoubleSpinBox.value()
        self.ui.zoomSlider.blockSignals(True)
        self.ui.zoomSlider.setValue(int(self.ui.zoomSlider.maximum() * zoom))
        self.ui.zoomSlider.blockSignals(False)

        if self.imagesize > 0:
            n = max(5, int(self.imagesize * zoom))
            self.ui.imageListView.setIconSize(QtCore.QSize(n, n))
예제 #11
0
    def writeSettings(self):
        '''
        '''

        settings = QtCore.QSettings()
        settings.beginGroup("LeginonUI")
        settings.setValue('leginonDB', self.ui.leginonHostnameLineEdit.text())
        settings.setValue('leginonPath', self.ui.leginonDBNameLineEdit.text())
        settings.setValue('projectDB', self.ui.projectHostnameLineEdit.text())
        settings.setValue('projectPath', self.ui.projectDBNameLineEdit.text())
        settings.setValue('targetuser', self.ui.usernameLineEdit.text())
        settings.setValue('targetpass', self.ui.passwordLineEdit.text())
        settings.setValue('username', self.ui.dbUsernameLineEdit.text())
        settings.setValue('password',
                          base64.b64encode(self.ui.dbPasswordLineEdit.text()))
        #settings.setValue('alternate-user', self.ui.alternateUserLineEdit.text())
        settings.endGroup()
예제 #12
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)
예제 #13
0
    def __init__(self, parent=None):
        "Initialize a image display window"

        QtGui.QMainWindow.__init__(self, parent)

        # Setup logging
        root = logging.getLogger()
        while len(root.handlers) > 0:
            root.removeHandler(root.handlers[0])
        h = logging.StreamHandler()
        h.setFormatter(logging.Formatter('%(message)s'))
        root.addHandler(h)

        # Build window
        _logger.info("\rBuilding main window ...")
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)

        # Setup variables
        self.lastpath = str(QtCore.QDir.currentPath())
        self.loaded_images = []
        self.files = []
        self.file_index = []
        self.color_level = None
        self.base_level = None
        self.inifile = ''  #'ara_view.ini'
        self.settings_group = 'ImageViewer'
        self.imagesize = 0

        # Image View
        self.imageListModel = QtGui.QStandardItemModel(self)
        self.ui.imageListView.setModel(self.imageListModel)

        #self.templateListModel = QtGui.QStandardItemModel(self)
        #self.ui.templateListView.setModel(self.templateListModel)

        # Empty init
        self.ui.actionForward.setEnabled(False)
        self.ui.actionBackward.setEnabled(False)
        self.setup()

        self.ui.autopickWidget = AutoPickWidget(self)
        self.ui.tabWidget.addTab(self.ui.autopickWidget, "AutoPick")
        self.ui.tabWidget.currentChanged.connect(self.tabValid)

        # Custom Actions

        self.ui.dockWidgetAction = self.ui.dockWidget.toggleViewAction()
        self.ui.whatsThisAction = QtGui.QWhatsThis.createAction(self)
        icon8 = QtGui.QIcon()
        icon8.addPixmap(QtGui.QPixmap(":/mini/mini/application_side_list.png"),
                        QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.ui.dockWidgetAction.setIcon(icon8)
        self.ui.dockWidgetAction.setToolTip("Show or hide the controls widget")
        self.ui.dockWidgetAction.setWhatsThis(
            QtGui.QApplication.translate(
                "MainWindow",
                '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">\n<html><head><meta name="qrichtext" content="1" /><style type="text/css">\np, li { white-space: pre-wrap; }\n</style></head><body style=" font-family:\'Lucida Grande\'; font-size:13pt; font-weight:400; font-style:normal;">\n<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><img src=":/mini/mini/application_side_list.png" /> Display/Hide the controls widget</p>\n<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p>\n<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This widget can be hidden to increase the number of images that can be shown.</p></body></html>',
                None, QtGui.QApplication.UnicodeUTF8))
        self.ui.toolBar.addAction(self.ui.dockWidgetAction)
        self.ui.toolBar.addAction(self.ui.whatsThisAction)

        # Create advanced settings

        property.setView(self.ui.advancedSettingsTreeView)
        self.advanced_settings, self.advanced_names = self.ui.advancedSettingsTreeView.model(
        ).addOptionList(self.advancedSettings())
        self.ui.advancedSettingsTreeView.setStyleSheet(
            'QTreeView::item[readOnly="true"]{ color: #000000; }')

        for i in xrange(
                self.ui.advancedSettingsTreeView.model().rowCount() - 1, 0,
                -1):
            if self.ui.advancedSettingsTreeView.model().index(
                    i, 0).internalPointer().isReadOnly(
                    ):  # Hide widget items (read only)
                self.ui.advancedSettingsTreeView.setRowHidden(
                    i, QtCore.QModelIndex(), True)

        # Help system
        self.helpDialog = HelpDialog(self)
        _logger.info("\rLoading settings ...")
        self.loadSettings()
예제 #14
0
    def registerPage(self, wizardPage):
        '''
        '''

        wizardPage.registerField("sessions*", self, "selected",
                                 QtCore.SIGNAL('selectionChanged()'))
예제 #15
0
    def __init__(self, parent=None):
        "Initialize a image display window"

        QtGui.QMainWindow.__init__(self, parent)

        # Setup logging
        root = logging.getLogger()
        while len(root.handlers) > 0:
            root.removeHandler(root.handlers[0])
        h = logging.StreamHandler()
        h.setFormatter(logging.Formatter('%(message)s'))
        root.addHandler(h)

        # Build window
        _logger.info("\rBuilding main window ...")
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)

        # Setup variables
        self.lastpath = str(QtCore.QDir.currentPath())
        self.coordinates_files = []
        self.stack_file = ""
        self.inifile = ""  #'ara_view.ini'
        self.data = None
        self.header = None
        self.group_indices = None
        self.label_cols = []
        self.rtsq_cols = []
        self.select_col = -1
        self.markers = ['s', 'o', '^', '>', 'v', 'd', 'p', 'h', '8', '+', 'x']
        self.selectedImage = None

        # Setup Plotting View
        self.fig = Figure((6.0, 4.0))  #, dpi=self.ui.dpiSpinBox.value())
        self.ui.canvas = FigureCanvas(self.fig)
        self.ui.canvas.setParent(self.ui.centralwidget)
        self.axes = self.fig.add_subplot(111)
        self.ui.centralHLayout.addWidget(self.ui.canvas)
        self.ui.centralHLayout.setStretchFactor(self.ui.canvas, 4)

        #self.ui.canvas.mpl_connect('motion_notify_event', self.onHover)
        self.ui.canvas.mpl_connect('pick_event', self.displayLabel)
        self.annotation = None

        # Setup Navigation Tool Bar
        self.ui.mpl_toolbar = NavigationToolbar(self.ui.canvas, self)
        self.ui.mpl_toolbar.hide()
        self.addToolBar(QtCore.Qt.TopToolBarArea, self.ui.mpl_toolbar)
        if not hasattr(self.ui.mpl_toolbar, 'edit_parameters'):
            self.ui.toolBar.removeAction(self.ui.actionShow_Options)

        # Custom Actions
        self.ui.toggleImageDockAction = self.ui.imageDockWidget.toggleViewAction(
        )
        icon8 = QtGui.QIcon()
        icon8.addPixmap(QtGui.QPixmap(":/mini/mini/image.png"),
                        QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.ui.toggleImageDockAction.setIcon(icon8)
        self.ui.toolBar.insertAction(self.ui.actionShow_Options,
                                     self.ui.toggleImageDockAction)
        self.ui.imageDockWidget.hide()
        self.ui.toggleImageDockAction.setEnabled(False)

        action = self.ui.plotDockWidget.toggleViewAction()
        icon8 = QtGui.QIcon()
        icon8.addPixmap(QtGui.QPixmap(":/mini/mini/chart_line.png"),
                        QtGui.QIcon.Normal, QtGui.QIcon.Off)
        action.setIcon(icon8)
        self.ui.toolBar.insertAction(self.ui.actionShow_Options, action)

        self.ui.toggleAdvancedDockAction = self.ui.advancedDockWidget.toggleViewAction(
        )
        icon8 = QtGui.QIcon()
        icon8.addPixmap(QtGui.QPixmap(":/mini/mini/cog_edit.png"),
                        QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.ui.toggleAdvancedDockAction.setIcon(icon8)
        self.ui.toolBar.insertAction(self.ui.actionShow_Options,
                                     self.ui.toggleAdvancedDockAction)
        self.ui.advancedDockWidget.hide()

        action = self.ui.fileDockWidget.toggleViewAction()
        icon8 = QtGui.QIcon()
        icon8.addPixmap(QtGui.QPixmap(":/mini/mini/folder_explore.png"),
                        QtGui.QIcon.Normal, QtGui.QIcon.Off)
        action.setIcon(icon8)
        self.ui.toolBar.insertAction(self.ui.actionShow_Options, action)

        # Create advanced settings

        property.setView(self.ui.advancedSettingsTreeView)
        self.advanced_settings, self.advanced_names = self.ui.advancedSettingsTreeView.model(
        ).addOptionList(self.advancedSettings())
        self.ui.advancedSettingsTreeView.setStyleSheet(
            'QTreeView::item[readOnly="true"]{ color: #000000; }')

        for i in xrange(
                self.ui.advancedSettingsTreeView.model().rowCount() - 1, 0,
                -1):
            if self.ui.advancedSettingsTreeView.model().index(
                    i, 0).internalPointer().isReadOnly(
                    ):  # Hide widget items (read only)
                self.ui.advancedSettingsTreeView.setRowHidden(
                    i, QtCore.QModelIndex(), True)

        # Subset List
        self.subsetListModel = QtGui.QStandardItemModel()
        self.ui.subsetListView.setModel(self.subsetListModel)

        # File List
        self.fileListModel = QtGui.QStandardItemModel()
        self.ui.fileTableView.setModel(self.fileListModel)
        self.fileListModel.setHorizontalHeaderLabels(['file', 'items'])
        self.connect(
            self.ui.fileTableView.selectionModel(),
            QtCore.SIGNAL(
                "selectionChanged(const QItemSelection &, const QItemSelection &)"
            ), self.openSelectedFile)

        # Plot

        # Create advanced settings

        #property.setView(self.ui.advancedSettingsTreeView)
        #self.advanced_settings, self.advanced_names = self.ui.advancedSettingsTreeView.model().addOptionList(self.advancedSettings())
        #self.ui.advancedSettingsTreeView.setStyleSheet('QTreeView::item[readOnly="true"]{ color: #000000; }')

        #for i in xrange(self.ui.advancedSettingsTreeView.model().rowCount()-1, 0, -1):
        #    if self.ui.advancedSettingsTreeView.model().index(i, 0).internalPointer().isReadOnly(): # Hide widget items (read only)
        #        self.ui.advancedSettingsTreeView.setRowHidden(i, QtCore.QModelIndex(), True)

        # Load the settings
        _logger.info("\rLoading settings ...")
        self.loadSettings()
예제 #16
0
    def __init__(self, screen_shot_file=None, parent=None):
        '''
        '''

        QtGui.QWizard.__init__(self, parent)

        self.ui = Ui_ProjectWizard()
        self.ui.setupUi(self)
        #self.subPages={}
        self.lastmicpath = str(QtCore.QDir.currentPath())
        self.lastgainpath = str(QtCore.QDir.currentPath())
        self.micrograph_files = []
        self.gain_files = []
        self.parameters = []
        self.screen_shot_file = screen_shot_file
        self.helpDialog = HelpDialog(self)
        self.default_spider_path = '/guam.raid.cluster.software/spider.21.00/'

        version = arachnid.__version__
        n = version.find('_')
        if n != -1: version = version[:n]
        self.setWindowTitle("Arachnid - Workflow Creation Wizard - v%s" %
                            version)
        self.docs_url = ""

        self.setPixmap(
            QtGui.QWizard.WatermarkPixmap,
            QtGui.QPixmap(':/icons/logo/ArachnidLogoWindow_small.png'
                          ))  #:/icons/icons/icon256x256.png'))
        self.setPixmap(
            QtGui.QWizard.BackgroundPixmap,
            QtGui.QPixmap(':/icons/logo/ArachnidLogoWindow_small.png'
                          ))  #:/icons/icons/icon256x256.png'))

        ########################################################################################################################################
        ###### Introduction Page
        ########################################################################################################################################
        self.ui.introductionPage.setTitle('Welcome to Arachnid - v%s' %
                                          version)
        if screen_shot_file:
            self.ui.screenShotCheckBox.setCheckState(QtCore.Qt.Checked)
            self.ui.screenShotCheckBox.setEnabled(False)

        ########################################################################################################################################
        ###### Question Page
        ########################################################################################################################################
        self.currentIdChanged.connect(self.onCurrentIDChanged)
        self.ui.yesLeginonPushButton.clicked.connect(self.next)
        self.ui.noLeginonPushButton.clicked.connect(self.next)
        self.ui.yesReferencePushButton.clicked.connect(self.next)
        self.ui.noReferencePushButton.clicked.connect(self.next)

        ########################################################################################################################################
        ###### Leginon Page
        ########################################################################################################################################
        self.ui.leginonWidget = LeginonUI(self, self.helpDialog)
        self.ui.leginonDBLayout.addWidget(self.ui.leginonWidget)
        #self.subPages[self.idOf(self.ui.leginonDBPage)]=self.ui.leginonWidget
        self.ui.leginonWidget.registerPage(self.ui.leginonDBPage)
        #self.ui.leginonWidget.loadFinished.connect(self.next)
        self.ui.leginonWidget.loadFinished.connect(self.onLeginonLoadFinished)
        self.ui.leginonWidget.captureScreen.connect(self.captureScreen)

        ########################################################################################################################################
        ###### Reference Page
        ########################################################################################################################################
        self.ui.referenceWidget = ReferenceUI(self, self.helpDialog)
        self.ui.referenceLayout.addWidget(self.ui.referenceWidget)
        #self.subPages[self.idOf(self.ui.referencePage)]=self.ui.referenceWidget
        self.ui.referenceWidget.registerPage(self.ui.referencePage)
        #self.ui.referencePage.registerField("referenceEdit*", self.ui.referenceWidget.ui.referenceLineEdit)
        self.ui.referenceWidget.captureScreen.connect(self.captureScreen)
        self.ui.referenceWidget.updateParticleDiameter.connect(
            self.ui.particleSizeDoubleSpinBox.setValue)

        ########################################################################################################################################
        ###### Monitor Page
        ########################################################################################################################################
        self.ui.monitorWidget = MonitorUI(self, self.helpDialog)
        self.ui.monitorLayout.insertWidget(0, self.ui.monitorWidget)
        self.ui.monitorWidget.programStarted.connect(self.onProgramStarted)
        self.ui.monitorWidget.programCompleted.connect(self.onProgramCompleted)

        ########################################################################################################################################
        ###### Fine Settings Page
        ########################################################################################################################################
        self.ui.settingsTabWidget = SettingsUI(self)
        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding,
                                       QtGui.QSizePolicy.Expanding)
        sizePolicy.setHorizontalStretch(2)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(
            self.ui.settingsTabWidget.sizePolicy().hasHeightForWidth())
        self.ui.settingsTabWidget.setSizePolicy(sizePolicy)
        self.ui.settingsHorizontalLayout.addWidget(self.ui.settingsTabWidget)

        self.ui.workflowListView.setModel(self.ui.monitorWidget.model())
        selmodel = self.ui.workflowListView.selectionModel()
        selmodel.currentChanged.connect(
            self.ui.settingsTabWidget.settingsChanged)

        ########################################################################################################################################
        ###### Manual Settings Page
        ########################################################################################################################################
        self.ui.manualSettingsPage.registerField(
            self.param("apix*"), self.ui.pixelSizeDoubleSpinBox, "value",
            QtCore.SIGNAL('valueChanged(double)'))

        self.ui.manualSettingsPage.registerField(
            self.param("voltage*"), self.ui.voltageDoubleSpinBox, "value",
            QtCore.SIGNAL('valueChanged(double)'))
        self.ui.manualSettingsPage.registerField(
            self.param("cs*"), self.ui.csDoubleSpinBox, "value",
            QtCore.SIGNAL('valueChanged(double)'))
        self.ui.manualSettingsPage.registerField(
            self.param("input_files*"), self, 'micrographFiles',
            QtCore.SIGNAL('micrographFilesUpdated()'))
        self.ui.manualSettingsPage.registerField(
            self.param("gain_files"), self, 'gainFiles',
            QtCore.SIGNAL('gainFilesUpdated()'))
        self.ui.manualSettingsPage.registerField(self.param("gain_file"), self,
                                                 'gainFile')
        self.ui.manualSettingsPage.registerField(self.param("invert"),
                                                 self.ui.invertCheckBox)
        self.ui.imageStatTableView.setModel(
            ListTableModel([], ['Exposure', 'Gain'],
                           ['Width', 'Height', 'Frames', 'Total'], self))
        self.ui.importMessageLabel.setVisible(False)

        ########################################################################################################################################
        ###### Additional Settings Page
        ########################################################################################################################################

        if os.path.exists(self.default_spider_path):
            self.updateSpiderExe(self.default_spider_path, True)

        self.updateParticleSizeSpinBox = lambda x: self.ui.particleSizeSpinBox.setValue(
            int(x / self.ui.pixelSizeDoubleSpinBox.value())
            if self.ui.pixelSizeDoubleSpinBox.value() > 0 else 0)
        self.updateWindowSizeSpinBox = lambda x: self.ui.windowSizeSpinBox.setValue(
            int(x / self.ui.pixelSizeDoubleSpinBox.value())
            if self.ui.pixelSizeDoubleSpinBox.value() > 0 else 0)
        self.updateMaskDiameterSpinBox = lambda x: self.ui.maskDiameterSpinBox.setValue(
            int(x / self.ui.pixelSizeDoubleSpinBox.value())
            if self.ui.pixelSizeDoubleSpinBox.value() > 0 else 0)

        self.updateParticleSizeDoubleSpinBox = lambda x: self.ui.particleSizeDoubleSpinBox.setValue(
            float(x * self.ui.pixelSizeDoubleSpinBox.value())
            if self.ui.pixelSizeDoubleSpinBox.value() > 0 else 0.0)
        self.updateWindowSizeDoubleSpinBox = lambda x: self.ui.windowSizeDoubleSpinBox.setValue(
            float(x * self.ui.pixelSizeDoubleSpinBox.value())
            if self.ui.pixelSizeDoubleSpinBox.value() > 0 else 0.0)
        self.updateMaskDiameterDoubleSpinBox = lambda x: self.ui.maskDiameterDoubleSpinBox.setValue(
            float(x * self.ui.pixelSizeDoubleSpinBox.value())
            if self.ui.pixelSizeDoubleSpinBox.value() > 0 else 0.0)

        self.ui.particleSizeDoubleSpinBox.valueChanged.connect(
            self.updateParticleSizeSpinBox)
        self.ui.windowSizeDoubleSpinBox.valueChanged.connect(
            self.updateWindowSizeSpinBox)
        self.ui.maskDiameterDoubleSpinBox.valueChanged.connect(
            self.updateMaskDiameterSpinBox)

        self.ui.particleSizeUnitComboBox.currentIndexChanged.connect(
            self.ui.particleDiameterStackedWidget.setCurrentIndex)
        self.ui.windowSizeUnitComboBox.currentIndexChanged.connect(
            self.ui.windowSizeStackedWidget.setCurrentIndex)
        self.ui.maskDiameterUnitComboBox.currentIndexChanged.connect(
            self.ui.maskDiameterStackedWidget.setCurrentIndex)

        self.ui.particleSizeUnitComboBox.currentIndexChanged.connect(
            functools.partial(
                connect_visible_spin_box,
                signals=(self.ui.particleSizeDoubleSpinBox.valueChanged,
                         self.ui.particleSizeSpinBox.valueChanged),
                slots=(self.updateParticleSizeSpinBox,
                       self.updateParticleSizeDoubleSpinBox)))
        self.ui.windowSizeUnitComboBox.currentIndexChanged.connect(
            functools.partial(
                connect_visible_spin_box,
                signals=(self.ui.windowSizeDoubleSpinBox.valueChanged,
                         self.ui.windowSizeSpinBox.valueChanged),
                slots=(self.updateWindowSizeSpinBox,
                       self.updateWindowSizeDoubleSpinBox)))
        self.ui.maskDiameterUnitComboBox.currentIndexChanged.connect(
            functools.partial(
                connect_visible_spin_box,
                signals=(self.ui.maskDiameterDoubleSpinBox.valueChanged,
                         self.ui.maskDiameterSpinBox.valueChanged),
                slots=(self.updateMaskDiameterSpinBox,
                       self.updateMaskDiameterDoubleSpinBox)))

        self.ui.particleSizeDoubleSpinBox.valueChanged.connect(
            lambda x: self.ui.windowSizeDoubleSpinBox.setValue(
                ensure_even_window(x * 1.4,
                                   self.ui.pixelSizeDoubleSpinBox.value())))
        self.ui.particleSizeDoubleSpinBox.valueChanged.connect(
            lambda x: self.ui.maskDiameterDoubleSpinBox.setValue(x * 1.2))

        self.ui.additionalSettingsPage.registerField(
            self.param("spider_path"), self.ui.spiderExecutableLineEdit)
        self.ui.particleSizeDoubleSpinBox.valueChanged.connect(
            self.diameterChanged)
        self.ui.additionalSettingsPage.registerField(
            self.param("particle_diameter*"),
            self.ui.particleSizeDoubleSpinBox, "value",
            QtCore.SIGNAL('valueChanged(double)'))
        #self.ui.additionalSettingsPage.registerField(self.param("particle_diameter*"), self, "particleDiameter", QtCore.SIGNAL('diameterChanged(double)'))

        self.ui.additionalSettingsPage.registerField(
            self.param("window_actual*"), self.ui.windowSizeDoubleSpinBox,
            "value", QtCore.SIGNAL('valueChanged(double)'))
        self.ui.additionalSettingsPage.registerField(
            self.param("mask_diameter*"), self.ui.maskDiameterDoubleSpinBox,
            "value", QtCore.SIGNAL('valueChanged(double)'))
        self.ui.additionalSettingsPage.registerField(
            self.param('worker_count'), self.ui.workerCountSpinBox)
        self.ui.additionalSettingsPage.registerField(
            self.param('thread_count'), self.ui.threadCountSpinBox)
        self.ui.additionalSettingsPage.registerField(self.param("window"),
                                                     self, "window")
        self.ui.additionalSettingsPage.registerField(
            self.param('enable_stderr'), self.ui.enableStderrCheckBox)
        self.ui.additionalSettingsPage.registerField(self.param("disk_mult"),
                                                     self, 'sampleShape')
        self.ui.additionalSettingsPage.registerField(
            self.param("overlap_mult"), self, 'sampleDensity')
        self.ui.additionalSettingsPage.registerField(
            self.param("threshold_minimum"), self, 'sampleDensityMin')
        self.ui.sampleShapeComboBox.setItemData(0, 0.6)
        self.ui.sampleShapeComboBox.setItemData(1, 0.35)
        self.ui.sampleDensityComboBox.setItemData(0, 1.0)
        self.ui.sampleDensityComboBox.setItemData(1, 1.2)
        self.ui.sampleDensityComboBox.setItemData(2, 0.8)

        thread_count = 1
        if openmp.is_openmp_enabled():
            thread_count = openmp.get_num_procs()
        else:
            try:
                thread_count = multiprocessing.cpu_count()
            except:
                pass
        # Hack to determine whether CPU supports hyperthreading
        frac = 1.0
        if sys.platform == 'darwin':
            try:
                info = dict([
                    line.strip().split(':')
                    for line in os.popen('sysctl hw').readlines()[1:20]
                    if line.find(':') != -1
                ])
                frac = float(info['hw.activecpu'].strip()) / float(
                    info['hw.physicalcpu'].strip())
            except:
                pass
        else:
            if os.path.exists('/proc/cpuinfo'):
                info = dict([
                    (line.strip().split(':')[0].strip(),
                     line.strip().split(':')[1].strip())
                    for line in open('/proc/cpuinfo', 'r').readlines()
                    if line.find(':') != -1
                ])
                frac = float(info['siblings'].strip()) / float(
                    info['cpu cores'].strip())

        thread_count = int(thread_count / frac)
        self.ui.workerCountSpinBox.setValue(thread_count)
        self.ui.selectLeginonInformationLabel.setVisible(False)
        self.ui.selectReferenceInformationLabel.setVisible(False)

        _logger.info("\rLoading project settings ...")
        self.readSettings()
        self.loadProject()