Esempio n. 1
0
    def set_retrieved_information(self, run_tup_list):
        """
        Assumption: sort by time and date should have the exactly same result
        :param run_tup_list: sorted run tuple list
        :return:
        """
        assert (isinstance(run_tup_list, list)) and len(run_tup_list) > 0

        if len(run_tup_list) == 1:
            GuiUtility.pop_dialog_information(self, 'Only 1 run is given!')

        # set up run information
        first_run = run_tup_list[0][0]
        last_run = run_tup_list[-1][0]

        self.ui.lineEdit_begin.setText(str(first_run))
        self.ui.lineEdit_end.setText(str(last_run))

        # Sort by date
        first_run_time = run_tup_list[0][1]
        last_run_time = run_tup_list[-1][1]

        date_begin = GuiUtility.convert_to_qdate(first_run_time)
        self.ui.dateEdit_begin.setDate(date_begin)

        date_end = GuiUtility.convert_to_qdate(last_run_time)
        self.ui.dateEdit_end.setDate(date_end)

        self.ui.label_loadingStatus.setText('IPTS directory %s: Run %d - %d.'
                                            '' % (self._iptsDir, first_run, last_run))

        return
Esempio n. 2
0
    def do_set_target(self):
        """
        set the target workspace/index to the slicers in case some of them will be merged
        :return:
        """
        # check whether any rows are selected
        row_list = self.ui.tableWidget_segments.get_selected_rows(True)
        if len(row_list) == 0:
            GuiUtility.pop_dialog_information(
                self, 'No row is selected to set target.')
            return

        # get the name of the target
        # pop a dialog for the name of the slicer
        target, status = QInputDialog.getText(
            self, 'Input Target', 'Enter chopping target for selected rows:')
        # return if rejected with
        if status is False:
            return
        else:
            target = str(target)

        self.ui.tableWidget_segments.rename_chop_target(row_list, target)

        return
Esempio n. 3
0
    def save_processing_result(self):
        """
        Get saved file directory
        :return:
        """
        try:
            message = self._myController.project.vanadium_processing_manager.save_vanadium_to_file(
            )
            GuiUtility.pop_dialog_information(self._parent, message)
        except RuntimeError as run_err:
            GuiUtility.pop_dialog_error(self._parent, '{}'.format(run_err))

        return
Esempio n. 4
0
    def save_vanadium_process_parameters(self):
        """ Save vanadium process parameters
        :return:
        """
        # TODO - TONIGHT 2 - Shall be moved to pyvdrive.core

        setting_dir = '/SNS/VULCAN/shared/Calibrationfiles/Instrument/Standard/Vanadium'
        if not os.path.exists(setting_dir) or not os.access(
                setting_dir, os.W_OK):
            GuiUtility.pop_dialog_information(
                self._parent,
                'User cannot write file to {}'.format(setting_dir))
            setting_dir = os.path.expanduser('~')

        setting_name = os.path.join(setting_dir, 'vanadium_setting.txt')

        set_buffer = ''
        for bank_id in range(1, 4):
            try:
                set_buffer += '[BANK {}]\n'.format(bank_id)
                set_buffer += 'FWHM         = {}\n'.format(
                    self._peak_fwhm_dict[bank_id])
                set_buffer += 'Smooth n     = {}\n'.format(
                    self._smooth_n_dict[bank_id])
                set_buffer += 'Smooth order = {}\n'.format(
                    self._smooth_order_dict[bank_id])
            except KeyError as key_err:
                GuiUtility.pop_dialog_error(
                    self._parent, 'Bank {} has not been processed: {}'.format(
                        bank_id, key_err))
                return

        setting_file = open(setting_name, 'w')
        setting_file.write(set_buffer)
        setting_file.close()

        GuiUtility.pop_dialog_information(
            self._parent,
            'Vanadium process setting is saved to {}'.format(setting_name))

        return
Esempio n. 5
0
    def init_session(self, data_key):
        """
        Init a vanadium processing session including
        (1) laod meta data
        :param data_key:
        :return:
        """
        print('[DB...BAT] Init vanadium session with data key (workspace) {}'.
              format(data_key))

        # generate a temporary gsas file name
        gsas_dir = '/SNS/VULCAN/shared/Calibrationfiles/Instrument/Standard/Vanadium'
        if not os.path.exists(gsas_dir) or not os.access(gsas_dir, os.W_OK):
            GuiUtility.pop_dialog_information(
                self._parent,
                'User cannot write GSAS file to {}'.format(gsas_dir))
            gsas_dir = os.path.expanduser('~')
        temp_out_gda_name = os.path.join(gsas_dir,
                                         '{}-s.gda'.format(self._run_number))

        # load sample log workspace
        # TODO - TODAY 9 - Load meta data can take up to 3 seconds.  Make it on a separate thread
        log_ws_name = self._myController.load_meta_data(
            self._ipts_number, self._run_number, None)

        # call
        processor = self._myController.project.vanadium_processing_manager
        try:
            processor.init_session(workspace_name=data_key,
                                   ipts_number=self._ipts_number,
                                   van_run_number=self._run_number,
                                   out_gsas_name=temp_out_gda_name,
                                   sample_log_ws_name=log_ws_name)
        except RuntimeError as run_err:
            GuiUtility.pop_dialog_error(
                self._parent,
                'Unable to initialize a vanadium processing sesson due to {}'
                ''.format(run_err))

        return
Esempio n. 6
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
Esempio n. 7
0
    def do_expand_slicers(self):
        """
        expand the selected slicers as the second-level choppers
        :return:
        """
        # get the selected slicers
        selected_rows = self.ui.tableWidget_segments.get_selected_rows(True)
        if len(selected_rows) == 0:
            GuiUtility.pop_dialog_information(
                self, 'No splitter (row) in the table is selected to expand.')
            return

        # get the slicers
        slicer_list = list()
        for row_index in sorted(selected_rows):
            slicer = self.ui.tableWidget_segments.get_splitter(row_index)
            slicer_list.append((row_index, slicer))
        # END-FOR

        # sort the slicers in reverse order in order to replace in the table
        slicer_list.sort(reverse=True)

        # get the slicing setup
        if self.ui.radioButton_timeStep.isChecked():
            # split by constant time step
            try:
                time_step = float(str(self.ui.lineEdit_timeStep.text()))
                log_step = None
            except ValueError:
                GuiUtility.pop_dialog_error(
                    self, 'Time step {0} cannot be converted to float.'
                    ''.format(self.ui.lineEdit_timeStep.text()))
                return

        elif self.ui.radioButton_logValueStep.isChecked():
            # split by constant log step
            try:
                time_step = None
                log_step = float(
                    str(self.ui.lineEdit_logValueStepLevel2.text()))
            except ValueError:
                GuiUtility.pop_dialog_error(
                    self, 'Log step {0} cannot be converted to float.'
                    ''.format(self.ui.lineEdit_logValueStepLevel2.text()))
                return

        else:
            raise NotImplementedError(
                'One of split by time step or split by log value step must be chosen.'
            )

        # TODO/ISSUE/FUTURE
        if log_step is not None:
            raise NotImplementedError(
                'It has not been implemented yet to split further by log value.'
            )

        # expand
        for row_index, splitter in slicer_list:
            # get the splitter
            if time_step is not None:
                # split by log step
                new_splitter_list = self.generate_time_splitters(
                    splitter, time_step)
            else:
                # log_step is not None:
                raise RuntimeError('Where does the workspace come from????')
                # new_splitter_list = self._myParent.get_controller().generate_log_splitters(workspace_name,
                #                                                                            splitter, log_step)
            # END-IF-ELSE

            # replace the selected splitter by the new splitters
            self.ui.tableWidget_segments.replace_splitter(
                row_index, new_splitter_list)
        # END-FOR

        return