Exemple #1
0
class main_window(QMainWindow):
    start_video_signal = QtCore.pyqtSignal()
    qswitch_screenshot_signal = QtCore.pyqtSignal('PyQt_PyObject')
    start_focus_signal = QtCore.pyqtSignal()
    start_localization_signal = QtCore.pyqtSignal()

    def __init__(self, test_run):
        super(main_window, self).__init__()
        self.lysing = True
        # get our experiment variables
        if test_run != 'True':
            self.get_experiment_variables()

        # Set up the user interface
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)

        # set up the video classes
        self.vid = ShowVideo(self.ui.verticalLayoutWidget.size())
        self.screen_shooter = screen_shooter()
        self.image_viewer = ImageViewer()
        # self.autofocuser = autofocuser()
        self.localizer = Localizer()

        # add the viewer to our ui
        self.ui.verticalLayout.addWidget(self.image_viewer)

        # create our extra threads
        self.screenshooter_thread = QThread()
        self.screenshooter_thread.start()
        self.screen_shooter.moveToThread(self.screenshooter_thread)

        # self.autofocuser_thread = QThread()
        # self.autofocuser_thread.start()
        # self.autofocuser.moveToThread(self.autofocuser_thread)

        self.localizer_thread = QThread()
        self.localizer_thread.start()
        self.localizer.moveToThread(self.localizer_thread)

        self.video_input_thread = QThread()
        self.video_input_thread.start()
        self.vid.moveToThread(self.video_input_thread)

        # connect the outputs to our signals
        self.vid.VideoSignal.connect(self.image_viewer.setImage)
        self.vid.vid_process_signal.connect(
            self.screen_shooter.screenshot_slot)
        # self.vid.vid_process_signal.connect(self.autofocuser.vid_process_slot)
        self.vid.vid_process_signal.connect(self.localizer.vid_process_slot)
        self.qswitch_screenshot_signal.connect(
            self.screen_shooter.save_qswitch_fire_slot)
        self.localizer.qswitch_screenshot_signal.connect(
            self.screen_shooter.save_qswitch_fire_slot)
        # self.start_focus_signal.connect(self.autofocuser.autofocus)
        self.start_localization_signal.connect(self.localizer.localize)
        # self.autofocuser.position_and_variance_signal.connect(self.plot_variance_and_position)
        self.image_viewer.click_move_signal.connect(stage.click_move_slot)
        self.localizer.localizer_move_signal.connect(stage.localizer_move_slot)
        self.localizer.ai_fire_qswitch_signal.connect(
            self.ai_fire_qswitch_slot)
        self.localizer.start_laser_flash_signal.connect(
            self.start_laser_flash_slot)
        self.localizer.stop_laser_flash_signal.connect(
            self.stop_laser_flash_slot)
        self.vid.reticle_and_center_signal.connect(
            stage.reticle_and_center_slot)
        self.vid.reticle_and_center_signal.emit(self.vid.center_x,
                                                self.vid.center_y,
                                                self.vid.reticle_x,
                                                self.vid.reticle_y)

        # connect to the video thread and start the video
        self.start_video_signal.connect(self.vid.startVideo)
        self.start_video_signal.emit()

        # Screenshot and comment buttons
        self.ui.misc_screenshot_button.clicked.connect(
            self.screen_shooter.save_misc_image)
        self.ui.user_comment_button.clicked.connect(self.send_user_comment)
        self.ui.noise_filter_checkbox.stateChanged.connect(
            self.noise_filter_check_changed)

        # Stage movement buttons
        self.ui.step_size_doublespin_box.valueChanged.connect(
            stage.set_step_size)
        self.setup_combobox()
        self.localizer.get_position_signal.connect(stage.get_position_slot)
        stage.position_return_signal.connect(
            self.localizer.position_return_slot)

        # Laser control buttons
        self.ui.qswitch_delay_doublespin_box.valueChanged.connect(
            laser.set_delay)
        self.ui.attenuator_doublespin_box.valueChanged.connect(
            attenuator.set_attenuation)

        self.ui.cells_to_lyse_doublespin_box.valueChanged.connect(
            self.localizer.set_cells_to_lyse)
        self.ui.process_well_pushButton.clicked.connect(
            self.start_localization)
        self.show()
        comment('finished gui init')

    def get_text(self, text_prompt):
        text, okPressed = QInputDialog.getText(self, "Experiment Input",
                                               text_prompt, QLineEdit.Normal,
                                               "")
        if okPressed and text != None:
            return text

    def get_experiment_variables(self):
        var_dict = {
            'stain(s) used:': 'Enter the stain(s) used',
            'cell line:': 'Enter the cell line',
            'fixative used:': 'Enter the fixative used'
        }
        nums = range(10)
        checks = ['a', 'e', 'i', 'o', 'u'] + [str(num) for num in nums]
        for key, value in var_dict.items():
            good_entry = False
            while good_entry != True:
                user_input = self.get_text(var_dict[key])
                val = user_input.lower()
                if any(vowel in val for vowel in checks):
                    comment('{} {}'.format(key, user_input))
                    good_entry = True

    def start_autofocus(self):
        self.start_focus_signal.emit()

    def start_localization(self):
        self.start_localization_signal.emit()

    def noise_filter_check_changed(self, int):
        if self.ui.noise_filter_checkbox.isChecked():
            self.vid.noise_removal = True
        else:
            self.vid.noise_removal = False

    def setup_combobox(self):
        magnifications = ['4x', '20x', '40x', '60x', '100x']
        self.ui.magnification_combobox.addItems(magnifications)
        self.ui.magnification_combobox.currentIndexChanged.connect(
            stage.change_magnification)
        self.ui.cell_type_to_lyse_comboBox.addItems(
            ['red', 'green', 'green hope'])
        self.ui.cell_type_to_lyse_comboBox.currentIndexChanged.connect(
            self.localizer.change_type_to_lyse)
        self.ui.lysis_mode_comboBox.addItems(['direct', 'excision'])
        self.ui.lysis_mode_comboBox.currentIndexChanged.connect(
            self.localizer.change_lysis_mode)

    def send_user_comment(self):
        comment('user comment:{}'.format(self.ui.comment_box.toPlainText()))
        self.ui.comment_box.clear()

    @QtCore.pyqtSlot()
    def qswitch_screenshot_slot(self):
        self.qswitch_screenshot_signal.emit(15)
        comment('stage position during qswitch: {}'.format(
            stage.get_position_slot()))
        laser.fire_qswitch()

    @QtCore.pyqtSlot('PyQt_PyObject')
    def ai_fire_qswitch_slot(self, auto_fire):
        comment('automated firing from localizer!')
        if auto_fire == True:
            laser.qswitch_auto()
        else:
            laser.fire_qswitch()

    @QtCore.pyqtSlot()
    def start_laser_flash_slot(self):
        laser.fire_auto()

    @QtCore.pyqtSlot()
    def stop_laser_flash_slot(self):
        laser.stop_flash()

    # def toggle_dmf_or_lysis(self):
    # 	# we want to get our objective out of the way first
    # 	if self.lysing == True:
    # 		ret = self.autofocuser.retract_objective()
    # 		if ret == True:
    # 			stage.go_to_dmf_location()
    # 	elif self.lysing == False:
    # 		stage.go_to_lysing_loc()
    # 		self.autofocuser.return_objective_to_focus()
    # 	self.lysing = not self.lysing

    def keyPressEvent(self, event):
        if not event.isAutoRepeat():
            print('key pressed {}'.format(event.key()))
            key_control_dict = {
                87: stage.move_up,
                65: stage.move_left,
                83: stage.move_down,
                68: stage.move_right,
                66: stage.move_last,
                16777249: laser.fire_auto,
                70: self.qswitch_screenshot_slot,
                81: laser.qswitch_auto,
                # 73:self.autofocuser.roll_forward,
                # 75:self.autofocuser.roll_backward,
                # 79:self.start_autofocus,
                # 71:self.toggle_dmf_or_lysis,
                84: stage.move_left_one_well_slot,
                89: stage.move_right_one_well_slot,
                96: self.screen_shooter.save_target_image,
                16777216: self.localizer.stop_auto_lysis
            }
            if event.key() in key_control_dict.keys():
                key_control_dict[event.key()]()

    def keyReleaseEvent(self, event):
        if not event.isAutoRepeat():
            # print('key released: {}'.format(event.key()))
            key_control_dict = {
                16777249: laser.stop_flash,
                # 73:self.autofocuser.stop_roll,
                # 75:self.autofocuser.stop_roll
            }
            if event.key() in key_control_dict.keys():
                key_control_dict[event.key()]()

    def closeEvent(self, event):
        self.vid.run_video = False

    @QtCore.pyqtSlot('PyQt_PyObject')
    def plot_variance_and_position(self, ituple):
        positions = ituple[0]
        variances = ituple[1]
        plt.plot(positions)
        plt.plot(variances)
        plt.legend(['Variance of Laplacian', 'AF Network Output'])
        plt.xlabel('Position')
        plt.ylabel('Focus Metric Comparison')
        plt.show()