diff --git a/Code/Mantid/Framework/PythonInterface/plugins/algorithms/WorkflowAlgorithms/InelasticIndirectReduction.py b/Code/Mantid/Framework/PythonInterface/plugins/algorithms/WorkflowAlgorithms/InelasticIndirectReduction.py index a7e1b92e108a3dd10f097632b25a4d60ed365e07..cd63c024c1cd24cdfb8e555de9571ba6fab459eb 100644 --- a/Code/Mantid/Framework/PythonInterface/plugins/algorithms/WorkflowAlgorithms/InelasticIndirectReduction.py +++ b/Code/Mantid/Framework/PythonInterface/plugins/algorithms/WorkflowAlgorithms/InelasticIndirectReduction.py @@ -2,21 +2,22 @@ from mantid.kernel import * from mantid.api import * from mantid.simpleapi import * - class InelasticIndirectReduction(DataProcessorAlgorithm): def category(self): - return "Workflow\\Inelastic;PythonAlgorithms;Inelastic" + return 'Workflow\\Inelastic;PythonAlgorithms;Inelastic' + def summary(self): - return "Runs a reduction for an inelastic indirect geometry instrument." + return 'Runs a reduction for an inelastic indirect geometry instrument.' + def PyInit(self): self.declareProperty(WorkspaceProperty('OutputWorkspace', '', direction=Direction.Output, optional=PropertyMode.Optional), doc='Optionally override the name for the output workspace') - self.declareProperty(name='InputFiles', defaultValue='', validator=StringMandatoryValidator(), + self.declareProperty(StringArrayProperty(name='InputFiles'), doc='Comma separated list of input files') self.declareProperty(name='SumFiles', defaultValue=False, doc='Toggle input file summing or sequential processing') @@ -49,93 +50,62 @@ class InelasticIndirectReduction(DataProcessorAlgorithm): self.declareProperty(name='Plot', defaultValue='none', doc='Type of plot to output after reduction', validator=StringListValidator(['none', 'spectra', 'contour'])) + def PyExec(self): from mantid import config, logger from IndirectCommon import StartTime, EndTime import inelastic_indirect_reducer - StartTime('InelasticIndirectReduction') - - ## Get parameter values - out_ws = self.getPropertyValue('OutputWorkspace') - data_files = self.getPropertyValue('InputFiles').split(',') - - instrument = self.getPropertyValue('Instrument') - analyser = self.getPropertyValue('Analyser') - reflection = self.getPropertyValue('Reflection') - - param_file = config['instrumentDefinition.directory'] + instrument + '_' + analyser + '_' + reflection + '_Parameters.xml' - - detector_range = self.getProperty('DetectorRange').value - background_range = self.getProperty('BackgroundRange').value - - calib_ws = self.getProperty('CalibrationWorkspace') - calib_ws_name = self.getPropertyValue('CalibrationWorkspace') - - detailed_balance = self.getProperty('DetailedBalance').value + self._setup() - rebin_string = self.getPropertyValue('RebinString') - - scale_factor = self.getProperty('ScaleFactor').value - - map_file = self.getPropertyValue('MappingFile') - - save_format_string = self.getPropertyValue('SaveFormats') - save_formats = save_format_string.split(',') - - # Validate save format string - valid_formats = ['nxs', 'spe', 'nxspe', 'ascii', 'aclimax', 'davegrp'] - if len(save_format_string) > 0: - for save_format in save_formats: - if save_format not in valid_formats: - raise ValueError('Save format "' + save_format + '" is not valid.\nValid formats: ' + str(valid_formats)) + StartTime('InelasticIndirectReduction') # Setup reducer reducer = inelastic_indirect_reducer.IndirectReducer() reducer.set_rename(True) - reducer.set_instrument_name(instrument) - reducer.set_parameter_file(param_file) + reducer.set_instrument_name(self._instrument) + reducer.set_parameter_file(self._param_file) - for data_file in data_files: + for data_file in self._data_files: reducer.append_data_file(data_file) - reducer.set_sum_files(self.getProperty('SumFiles').value) + reducer.set_sum_files(self._sum_files) - reducer.set_detector_range(int(detector_range[0]) - 1, int(detector_range[1]) - 1) + reducer.set_detector_range(int(self._detector_range[0]) - 1, int(self._detector_range[1]) - 1) - use_calib_ws = calib_ws.value is not None - if use_calib_ws: + self._use_calib_ws = self._calib_ws.value is not None + if self._use_calib_ws: logger.debug('Using calibration workspace') - reducer.set_calibration_workspace(calib_ws.valueAsStr) + reducer.set_calibration_workspace(self._calib_ws.valueAsStr) - if len(background_range) == 2: - logger.debug('Using background range: ' + str(background_range)) - reducer.set_background(float(background_range[0]), float(background_range[1])) + if len(self._background_range) == 2: + logger.debug('Using background range: ' + str(self._background_range)) + reducer.set_background(float(self._background_range[0]), float(self._background_range[1])) # TODO: There should be a better way to do this - use_detailed_balance = detailed_balance != -1.0 - if use_detailed_balance: - logger.debug('Using detailed balance: ' + str(detailed_balance)) - reducer.set_detailed_balance(detailed_balance) + self._use_detailed_balance = self._detailed_balance != -1.0 + if self._use_detailed_balance: + logger.debug('Using detailed balance: ' + str(self._detailed_balance)) + reducer.set_detailed_balance(self._detailed_balance) - if rebin_string != "": - logger.debug('Using rebin string: ' + rebin_string) - reducer.set_rebin_string(rebin_string) + if self._rebin_string != '': + logger.debug('Using rebin string: ' + self._rebin_string) + reducer.set_rebin_string(self._rebin_string) - use_scale_factor = scale_factor != 1.0 - if use_scale_factor: - logger.debug('Using scale factor: ' + str(scale_factor)) - reducer.set_scale_factor(scale_factor) + self._use_scale_factor = self._scale_factor != 1.0 + if self._use_scale_factor: + logger.debug('Using scale factor: ' + str(self._scale_factor)) + reducer.set_scale_factor(self._scale_factor) - if map_file != '': - logger.debug('Using mapping file: ' + str(map_file)) - reducer.set_grouping_policy(map_file) + if self._map_file != '': + logger.debug('Using mapping file: ' + str(self._map_file)) + reducer.set_grouping_policy(self._map_file) reducer.set_fold_multiple_frames(self.getProperty('Fold').value) reducer.set_save_to_cm_1(self.getProperty('SaveCM1').value) - reducer.set_save_formats(save_formats) + reducer.set_save_formats(self._save_formats) # Do reduction and get result workspaces reducer.reduce() @@ -147,47 +117,102 @@ class InelasticIndirectReduction(DataProcessorAlgorithm): # Add sample logs to output workspace(s) for workspace in ws_list: - AddSampleLog(Workspace=workspace, LogName='use_calib_wokspace', LogType='String', LogText=str(use_calib_ws)) - if use_calib_ws: - AddSampleLog(Workspace=workspace, LogName='calib_workspace_name', LogType='String', LogText=str(calib_ws_name)) - - AddSampleLog(Workspace=workspace, LogName='use_detailed_balance', LogType='String', LogText=str(use_detailed_balance)) - if use_detailed_balance: - AddSampleLog(Workspace=workspace, LogName='detailed_balance', LogType='Number', LogText=str(detailed_balance)) - - AddSampleLog(Workspace=workspace, LogName='use_scale_factor', LogType='String', LogText=str(use_scale_factor)) - if use_scale_factor: - AddSampleLog(Workspace=workspace, LogName='scale_factor', LogType='Number', LogText=str(scale_factor)) + self._add_ws_logs(workspace) # Rename output workspace - # Only renames first workspace, but used in this way the reucer should only output one + # Only renames first workspace, but used in this way the reducer should only output one use_provided_out_ws = self.getPropertyValue('OutputWorkspace') != '' if use_provided_out_ws: - logger.information('Renaming output workspace ' + str(ws_list[0]) + ' to ' + str(out_ws)) - RenameWorkspace(InputWorkspace=ws_list[0], OutputWorkspace=out_ws) + logger.information('Renaming output workspace ' + str(ws_list[0]) + ' to ' + str(self._out_ws)) + RenameWorkspace(InputWorkspace=ws_list[0], OutputWorkspace=self._out_ws) else: - out_ws = ws_list[0] + self._out_ws = ws_list[0] - self.setProperty('OutputWorkspace', out_ws) + self.setProperty('OutputWorkspace', self._out_ws) # Do plotting plot_type = self.getPropertyValue('Plot') if plot_type != 'none': - if plot_type == 'spectra': - from mantidplot import plotSpectrum - num_spectra = mtd[out_ws].getNumberHistograms() - try: - plotSpectrum(out_ws, range(0, num_spectra)) - except RuntimeError: - logger.notice('Spectrum plotting canceled by user') - - if plot_type == 'contour': - from mantidplot import importMatrixWorkspace - plot_workspace = importMatrixWorkspace(out_ws) - plot_workspace.plotGraph2D() + self._plot() EndTime('InelasticIndirectReduction') + + def _setup(self): + """ + Gets and validates algorithm properties. + """ + + # Get parameter values + self._out_ws = self.getPropertyValue('OutputWorkspace') + self._data_files = self.getProperty('InputFiles').value + + self._instrument = self.getPropertyValue('Instrument') + self._analyser = self.getPropertyValue('Analyser') + self._reflection = self.getPropertyValue('Reflection') + + self._param_file = config['instrumentDefinition.directory'] + self._instrument + '_' + self._analyser + '_' + self._reflection + '_Parameters.xml' + + self._detector_range = self.getProperty('DetectorRange').value + self._background_range = self.getProperty('BackgroundRange').value + + self._calib_ws = self.getProperty('CalibrationWorkspace') + self._calib_ws_name = self.getPropertyValue('CalibrationWorkspace') + + self._detailed_balance = self.getProperty('DetailedBalance').value + self._rebin_string = self.getPropertyValue('RebinString') + self._scale_factor = self.getProperty('ScaleFactor').value + self._sum_files = self.getProperty('SumFiles').value + + # TODO: Replace with Grouping WS + self._map_file = self.getPropertyValue('MappingFile') + + self._save_formats = self.getProperty('SaveFormats').value + + # Validate save format string + valid_formats = ['nxs', 'spe', 'nxspe', 'ascii', 'aclimax', 'davegrp'] + for save_format in self._save_formats: + if save_format not in valid_formats: + raise ValueError('Save format "' + save_format + '" is not valid.\nValid formats: ' + str(valid_formats)) + + + def _add_ws_logs(self, workspace_name): + """ + Adds sample logs to a given output workspace. + """ + + AddSampleLog(Workspace=workspace_name, LogName='use_calib_wokspace', LogType='String', LogText=str(self._use_calib_ws)) + if self._use_calib_ws: + AddSampleLog(Workspace=workspace_name, LogName='calib_workspace_name', LogType='String', LogText=str(self._calib_ws_name)) + + AddSampleLog(Workspace=workspace_name, LogName='use_detailed_balance', LogType='String', LogText=str(self._use_detailed_balance)) + if self._use_detailed_balance: + AddSampleLog(Workspace=workspace_name, LogName='detailed_balance', LogType='Number', LogText=str(self._detailed_balance)) + + AddSampleLog(Workspace=workspace_name, LogName='use_scale_factor', LogType='String', LogText=str(self._use_scale_factor)) + if self._use_scale_factor: + AddSampleLog(Workspace=workspace_name, LogName='scale_factor', LogType='Number', LogText=str(self._scale_factor)) + + + def _plot(self): + """ + Plots results. + """ + + if self._plot_type == 'spectra': + from mantidplot import plotSpectrum + num_spectra = mtd[self._out_ws].getNumberHistograms() + try: + plotSpectrum(self._out_ws, range(0, num_spectra)) + except RuntimeError: + logger.notice('Spectrum plotting canceled by user') + + if self._plot_type == 'contour': + from mantidplot import importMatrixWorkspace + plot_workspace = importMatrixWorkspace(self._out_ws) + plot_workspace.plotGraph2D() + + # Register algorithm with Mantid AlgorithmFactory.subscribe(InelasticIndirectReduction) diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IndirectDataReduction.ui b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IndirectDataReduction.ui index cceee13ae1bcb8bb9eb50c2b0befbec2eb733e7e..ba8c2c3442298fe133e9ad0c148dd343ea3667ce 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IndirectDataReduction.ui +++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IndirectDataReduction.ui @@ -994,6 +994,13 @@ p, li { white-space: pre-wrap; } </property> </widget> </item> + <item> + <widget class="QCheckBox" name="save_ckDaveGrp"> + <property name="text"> + <string>DaveGrp</string> + </property> + </widget> + </item> <item> <spacer name="horizontalSpacer_15"> <property name="orientation"> diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectConvertToEnergy.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectConvertToEnergy.cpp index ccaea9fbcb9f5a0d07f64ae3ea9484e6fb986e6a..e3357d9aa32606005146860083591727cabdb516 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectConvertToEnergy.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectConvertToEnergy.cpp @@ -677,6 +677,8 @@ namespace CustomInterfaces fileFormats.push_back("ascii"); if ( m_uiForm.save_ckAclimax->isChecked() ) fileFormats.push_back("aclimax"); + if ( m_uiForm.save_ckDaveGrp->isChecked() ) + fileFormats.push_back("davegrp"); return fileFormats; }