Esempio n. 1
0
    def read_pixel_binning_parameters(self):
        """
        binning pixel
        :return:
        """
        # return the case for not being checked
        if not self.user_interface.checkBox_overPixel.isChecked():
            return False, None

        # process the binning parameters
        if self.user_interface.radioButton_binVerticalPixels.isChecked():
            bin_pixel_size = GuiUtility.parse_integer(self.user_interface.lineEdit_pixelSizeVertical)
            bin_pixel_direction = 'vertical'
        elif self.user_interface.radioButton_binHorizontalPixels.isChecked():
            bin_pixel_size = GuiUtility.parse_integer(self.user_interface.lineEdit_pixelSizeHorizontal)
            bin_pixel_direction = 'horizontal'
        else:
            raise RuntimeError(
                'Binning pixels: neither of 2 radio buttons (vertical/horizontal) is selected.')

        # form output
        par_dict = {'direction': bin_pixel_direction,
                    'pixel_size': bin_pixel_size}

        return True, par_dict
Esempio n. 2
0
    def do_smooth_vanadium(self):
        """
        smooth vanadium data
        :return:
        """
        # bank_group_index = self._get_banks_group()

        # get smoothing parameter
        try:
            smoother_type = str(
                self.ui.comboBox_smoothFilterTiype.currentText())
            smoother_n = GuiUtility.parse_integer(
                self.ui.lineEdit_smoothParameterN, allow_blank=False)
            smoother_order = GuiUtility.parse_integer(
                self.ui.lineEdit_smoothParameterOrder, allow_blank=False)
        except RuntimeError:
            GuiUtility.pop_dialog_error(
                self,
                'Smoothing parameter N or order is specified incorrectly.')
            return

        # emit signal
        print('[DB...BAT] Smooth type = {}, n = {}, order = {}'.format(
            smoother_type, smoother_n, smoother_order))
        self.mySmoothVanadiumSignal.emit(1, smoother_type, smoother_n,
                                         smoother_order)

        return
Esempio n. 3
0
    def evt_smooth_vanadium(self):
        """
        handle the event that the smoothing parameters are changed in the line edits
        if the smoothing operation is in the interactive mode, then it is same as
        pressing the 'smooth vanadium' button
        :return:
        """
        # change parameters
        self._slidersMutex = True
        param_n = GuiUtility.parse_integer(self.ui.lineEdit_smoothParameterN,
                                           allow_blank=False)
        if param_n is None or param_n == 0:
            param_n = 1
        self.ui.horizontalSlider_smoothN.setValue(param_n)

        param_order = GuiUtility.parse_integer(
            self.ui.lineEdit_smoothParameterOrder, allow_blank=False)
        if param_order is None or param_order == 0:
            param_order = 1
        self.ui.horizontalSlider_smoothOrder.setValue(param_order)

        self._slidersMutex = False

        # smooth vanadium
        if self.ui.checkBox_interactiveSmoothing.isChecked():
            self.do_smooth_vanadium()

        return
Esempio n. 4
0
    def do_save_vanadium_smooth_parameters(self):
        """
        save the vanadium smoothing parameters
        :return:
        """
        self._defaultDict['Order'] = GuiUtility.parse_integer(
            self.ui.lineEdit_smoothParameterOrder)
        self._defaultDict['n'] = GuiUtility.parse_integer(
            self.ui.lineEdit_smoothParameterN)
        self._defaultDict['Smoother'] = str(
            self.ui.comboBox_smoothFilterTiype.currentText())

        return
Esempio n. 5
0
    def get_runs_by_number(self):
        """
        Call the method in parent class to add runs
        :return:
        """
        # get workflow
        workflow_controller = self._myParent.get_controller()

        # get start run and end run
        begin_run = GuiUtility.parse_integer(self.ui.lineEdit_begin)
        end_run = GuiUtility.parse_integer(self.ui.lineEdit_end)

        # two ways to add date by run numbers
        if self._skipScanData:
            # easy to add run numbers
            if begin_run is None:
                GuiUtility.pop_dialog_error(self, 'In skip scanning mode, first run must be given!')
                return False
            # if end run is not given, just add 1 run
            if end_run is None:
                end_run = begin_run

            # get run information in quick mode
            assert isinstance(self._iptsNumber, int) and self._iptsNumber > 0, 'IPTS number must be verified ' \
                                                                               'for quick-filter-run mode.'
            run_info_dict_list = workflow_controller.scan_ipts_runs(
                self._iptsNumber, begin_run, end_run)

        else:
            # it is impossible to have an empty end run because the non-skip option always specifies one
            assert end_run is not None and begin_run is not None, 'Begin run and end run must be given ' \
                                                                  'in non-skip-scan case.'

            if self._iptsNumber > 0:
                # valid archiving system
                status, ret_obj = workflow_controller.get_archived_runs(self._archiveKey, begin_run,
                                                                        end_run)
            else:
                # add local data files
                status, ret_obj = workflow_controller.get_local_runs(self._archiveKey, self._iptsDir,
                                                                     begin_run, end_run, standard_sns_file=True)
            # get the complete list of run (tuples) as it is filtered by date
            if status is True:
                run_info_dict_list = ret_obj
            else:
                error_message = ret_obj
                GuiUtility.pop_dialog_error(self, error_message)
                return False
        # END-IF-ELSE

        return run_info_dict_list
Esempio n. 6
0
    def do_strip_vanadium_peaks(self):
        """
        strip vanadium peaks
        :return:
        """
        # collect the parameters from the UI
        try:
            peak_fwhm = GuiUtility.parse_integer(self.ui.lineEdit_vanPeakFWHM,
                                                 allow_blank=False)
            fit_tolerance = GuiUtility.parse_float(
                self.ui.lineEdit_stripPeakTolerance, allow_blank=False)
        except RuntimeError:
            GuiUtility.pop_dialog_error(
                self, 'Both FWHM and Tolerance must be specified.')
            return

        # append the banks
        # bank_group = str(self.ui.comboBox_banks.currentText())
        # if bank_group.count('East') > 0:
        #     bank_group_index = 90
        # elif bank_group.count('High') > 0:
        #     bank_group_index = 150
        # else:
        #     raise NotImplementedError('Bank group {} is not supported.'.format(bank_group))
        # bank_group_index = self._get_banks_group()

        background_type = str(
            self.ui.comboBox_vanPeakBackgroundType.currentText())
        is_high_background = self.ui.checkBox_isHighBackground.isChecked()

        self.myStripPeakSignal.emit(1, peak_fwhm, fit_tolerance,
                                    background_type, is_high_background)

        return
Esempio n. 7
0
    def do_save_result(self):
        """
        apply the result to controller
        :return:
        """
        # get IPTS number and run number
        try:
            run_number = GuiUtility.parse_integer(self.ui.lineEdit_runNumber,
                                                  allow_blank=False)
        except RuntimeError as run_err:
            GuiUtility.pop_dialog_error(
                self,
                'IPTS and run number must be specified in order to save for GSAS. {}.'
                .format(run_err))
            return

        # get default directory
        default_dir = '/SNS/VULCAN/shared/CalibrationFiles/Instrument/Standards/Vanadium'
        if not os.access(default_dir, os.W_OK):
            default_dir = os.getcwd()

        file_filter = 'GSAS (*.gda);;All (*.*)'
        van_file_name = str(
            QFileDialog.getSaveFileName(self, 'Smoothed Vanadium File',
                                        default_dir, file_filter))
        if len(van_file_name) == 0:
            return

        self.myApplyResultSignal.emit(van_file_name, run_number)

        return
Esempio n. 8
0
    def do_save_peak_strip_parameters(self):
        """
        save current vanadium-peak-striping parameters as defaults
        :return:
        """
        self._defaultDict['FWHM'] = GuiUtility.parse_integer(
            self.ui.lineEdit_vanPeakFWHM)
        self._defaultDict['Tolerance'] = GuiUtility.parse_integer(
            self.ui.lineEdit_vanPeakFWHM)
        self._defaultDict['BackgroundType'] = str(
            self.ui.comboBox_vanPeakBackgroundType.currentText())
        self._defaultDict[
            'IsHighBackground'] = self.ui.checkBox_isHighBackground.isChecked(
            )

        return
Esempio n. 9
0
    def do_add_archive_ipts(self):
        """
        add from archive
        :return:
        """
        # Get IPTS number
        ipts_number = GuiUtility.parse_integer(self.ui.lineEdit_iptsNumber)
        if ipts_number is None:
            GuiUtility.pop_dialog_error(self, 'IPTS number must be given!')
            return
        self._iptsNumber = ipts_number

        # set IPTS number to parent
        self._myParent.set_ipts_number(self._iptsNumber)

        # Get and check IPTS directory
        if self._dataDir is None:
            GuiUtility.pop_dialog_error(self, 'Data directory is not set up!')
            return

        # build IPTS directory and check existence of data
        ipts_dir_1 = os.path.join(self._dataDir, 'IPTS-%d/data/' % ipts_number)
        ipts_dir_2 = os.path.join(self._dataDir, 'IPTS-%d/nexus/' % ipts_number)
        if not os.path.exists(ipts_dir_1) and not os.path.exists(ipts_dir_2):
            GuiUtility.pop_dialog_error(self, 'IPTS number %d cannot be found under %s or %s.'
                                              '' % (ipts_number, ipts_dir_1, ipts_dir_2))
            self.ui.lineEdit_iptsNumber.setStyleSheet('color:red')
            return
        else:
            self.ui.lineEdit_iptsNumber.setStyleSheet('color:green')

        if os.path.exists(ipts_dir_1):
            self._iptsDir = ipts_dir_1
            self._iptsDirFromNumber = ipts_dir_1
        else:
            self._iptsDir = ipts_dir_2
            self._iptsDirFromNumber = ipts_dir_2

        # browse log files
        self.ui.comboBox_existingIPTS.addItem('{0}'.format(ipts_number))

        # scan files
        if self.ui.radioButton_scanAutoRecord.isChecked():
            record_data_only = self.ui.checkBox_autoRecordDataOnly.isChecked()
            self.scan_record_file(record_data_only, True)
        else:
            # scan the HD
            self.scan_archive()

        # signal parent TODO ASAP ASAP2 - (1) add IPTS to tree without runs  (2) set IPTS to parent
        # blabla

        return
Esempio n. 10
0
    def get_bank_id(self):
        """
        Get the current bank ID from UI
        :return: integer or None
        """
        if self.ui.radioButton_vpeakCurrentBank.isChecked():
            bank_id = GuiUtility.parse_integer(self.ui.comboBox_bankNumbers,
                                               False)
        else:
            bank_id = None  # all banks

        print('[DB...BAT] Current bank: {}'.format(bank_id))

        return bank_id
Esempio n. 11
0
    def do_remove_line(self):
        """ Remove a line
        :return:
        """
        # get value
        run_number = GuiUtility.parse_integer(self.ui.lineEdit_runNumber, True)
        chop_seq_index = GuiUtility.parse_integer(
            self.ui.lineEdit_chopSeqIndex, True)
        bank_id = GuiUtility.parse_integer(self.ui.lineEdit_bankNumber, True)

        # check
        if run_number is None or run_number < 1:
            GuiUtility.pop_dialog_error(
                self, 'Run number must be specified as a positive integer')
            return
        if bank_id is None or bank_id < 1:
            GuiUtility.pop_dialog_error(
                self, 'Bank ID must be specified as a positive integer')
            return

        # check
        if chop_seq_index is None:
            plot_key = run_number, bank_id
        else:
            plot_key = run_number, chop_seq_index, bank_id

        # remove the line
        if plot_key in self._plot_id_dict:
            self.ui.graphicsView_mainPlot.remove_line(
                self._plot_id_dict[plot_key])
            del self._plot_id_dict[plot_key]
        else:
            GuiUtility.pop_dialog_error(
                self, 'Run {} Chop-Seq {} is not in figure to delete'
                ''.format(run_number, chop_seq_index))

        return
Esempio n. 12
0
    def do_add_line(self):
        """ Add a line
        :return:
        """
        # get value
        ipts_number = GuiUtility.parse_integer(self.ui.lineEdit_iptsNumber,
                                               True)
        run_number = GuiUtility.parse_integer(self.ui.lineEdit_runNumber, True)
        chop_seq_index = GuiUtility.parse_integer(
            self.ui.lineEdit_chopSeqIndex, True)
        bank_id = GuiUtility.parse_integer(self.ui.lineEdit_bankNumber, True)

        # check
        if run_number is None or run_number < 1:
            GuiUtility.pop_dialog_error(
                self, 'Run number must be specified as a positive integer')
            return
        if bank_id is None or bank_id < 1:
            GuiUtility.pop_dialog_error(
                self, 'Bank ID must be specified as a positive integer')
            return

        # check
        if chop_seq_index is None:
            plot_key = run_number, bank_id
        else:
            plot_key = run_number, chop_seq_index, bank_id

        # if exists, then give a notice
        if plot_key in self._plot_id_dict:
            GuiUtility.pop_dialog_information(
                self, 'Run {} Chop-seq {} has been plotted'
                ''.format(run_number, chop_seq_index))
            return

        # get data
        if not self._parent.has_data_loaded(run_number, chop_seq_index):
            # load data explicitly
            # check IPTS information
            if ipts_number is None and run_number in self._run_ipts_map:
                # loaded run but different chop sequence
                ipts_number = self._run_ipts_map[run_number]
                self.ui.lineEdit_iptsNumber.setText('{}'.format(ipts_number))
            elif ipts_number is None:
                # information not adequet
                GuiUtility.pop_dialog_error(
                    self, 'Run {} has not been loaded; Specify IPTS'
                    ''.format(run_number))
                return
            # END-IF-ELSE

            # load data via parent window
            try:
                # need to convert chop-sequence-index to list
                if chop_seq_index is not None:
                    chop_seq_index_list = [chop_seq_index]
                else:
                    chop_seq_index_list = None
                # load data
                self._parent.load_reduced_data(ipts_number, run_number,
                                               chop_seq_index_list)
                self._run_ipts_map[run_number] = ipts_number
                vdrive_constants.run_ipts_dict[run_number] = ipts_number
            except RuntimeError as run_err:
                if chop_seq_index is None:
                    chop_note = 'original GSAS'
                else:
                    chop_note = 'chopped run {}'.format(chop_seq_index)
                GuiUtility.pop_dialog_error(
                    self, 'Unable to load {} of IPTS {} Run {}: {}'
                    ''.format(chop_note, ipts_number, run_number, run_err))
                return
            # END-TRY-Catch
        elif ipts_number is None:
            # set the IPTS even the data has been loaded
            ipts_number = vdrive_constants.run_ipts_dict[run_number]
        # END-IF-ELSE

        try:
            data_key = self._parent.get_data_key(run_number, chop_seq_index)
            vec_x, vec_y = self._parent.retrieve_loaded_reduced_data(
                data_key,
                ipts_number,
                run_number,
                chop_seq_index,
                bank_id,
                unit='dSpacing',
                pc_norm=self._norm_proton_charge,
                van_run=self._van_number)
        except (RuntimeError, KeyError) as run_err:
            GuiUtility.pop_dialog_error(
                self, 'Unable to retrieve data from Run {} Bank {} due to {}'
                ''.format(run_number, bank_id, run_err))
            return

        # plot
        plot_information = PlotInformation(ipts_number, run_number,
                                           chop_seq_index,
                                           self._norm_proton_charge,
                                           self._van_number)
        self.plot_data(vec_x,
                       vec_y,
                       'data key',
                       unit=None,
                       bank_id=bank_id,
                       plot_info=plot_information)

        return