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
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
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
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
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
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
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
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
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
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
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
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