diff --git a/scripts/Diffraction/isis_powder/polaris_routines/polaris_algs.py b/scripts/Diffraction/isis_powder/polaris_routines/polaris_algs.py index d8335acdd19a3c5724542abbb7bbd1bf0ba7e79e..c762d67e8caa426bacacc056486ff21faba4e6b8 100644 --- a/scripts/Diffraction/isis_powder/polaris_routines/polaris_algs.py +++ b/scripts/Diffraction/isis_powder/polaris_routines/polaris_algs.py @@ -7,7 +7,6 @@ from __future__ import (absolute_import, division, print_function) import numpy as np -from mantid.api import WorkspaceGroup import mantid.simpleapi as mantid from isis_powder.routines import absorb_corrections, common @@ -85,98 +84,51 @@ def save_unsplined_vanadium(vanadium_ws, output_path): def generate_ts_pdf(run_number, focus_file_path, merge_banks=False, q_lims=None, cal_file_name=None): focused_ws = _obtain_focused_run(run_number, focus_file_path) - pdf_output = mantid.ConvertUnits(InputWorkspace=focused_ws.name(), Target="MomentumTransfer") + focused_ws = mantid.ConvertUnits(InputWorkspace=focused_ws.name(), Target="MomentumTransfer") if merge_banks: - group_bin_min = None - group_bin_max = None - group_bin_width = None - for i in range(pdf_output.getNumberOfEntries()): - x_array = pdf_output.getItem(i).readX(0) - bin_min = x_array[0] - bin_max = x_array[-1] - bin_width = (x_array[-1] - x_array[0])/x_array.size - binning = [bin_min, bin_width, bin_max] - if not group_bin_min: - group_bin_min = bin_min - group_bin_max = bin_max - group_bin_width = bin_width - else: - group_bin_min = min(group_bin_min, bin_min) - group_bin_max = min(group_bin_max, bin_max) - group_bin_width = min(group_bin_width, bin_width) - fit_spectra = mantid.FitIncidentSpectrum(InputWorkspace=pdf_output.getItem(i), - BinningForFit=binning, - BinningForCalc=binning, - FitSpectrumWith="GaussConvCubicSpline") - placzek_self_scattering = mantid.CalculatePlaczekSelfScattering(InputWorkspace=fit_spectra) - cal_workspace = mantid.LoadCalFile( - InputWorkspace=placzek_self_scattering, - CalFileName=cal_file_name, - Workspacename='cal_workspace', - MakeOffsetsWorkspace=False, - MakeMaskWorkspace=False) - focused_correction = None - for spec_index in range(placzek_self_scattering.getNumberHistograms()): - if cal_workspace.dataY(spec_index)[0] == i + 1: - if focused_correction is None: - focused_correction = placzek_self_scattering.dataY(spec_index) - else: - focused_correction = np.add(focused_correction, placzek_self_scattering.dataY(spec_index)) - mantid.CreateWorkspace(DataX=placzek_self_scattering.dataX(0), - DataY=focused_correction, - Distribution=True, - UnitX='MomentumTransfer', - OutputWorkspace='focused_correction_ws') - mantid.Rebin(InputWorkspace=pdf_output.getItem(i), OutputWorkspace='pdf_rebined', Params=binning) - mantid.Rebin(InputWorkspace='focused_correction_ws', OutputWorkspace='focused_correction_ws', Params=binning) - mantid.Subtract(LHSWorkspace='pdf_rebined', RHSWorkspace='focused_correction_ws', OutputWorkspace=pdf_output.getItem(i)) - binning = [group_bin_min, group_bin_width, group_bin_max] - pdf_output = mantid.Rebin(InputWorkspace=pdf_output, Params=binning) - pdf_output_combined = mantid.ConjoinSpectra(InputWorkspaces='pdf_output') - mantid.MatchSpectra(InputWorkspace=pdf_output_combined, OutputWorkspace=pdf_output_combined, ReferenceSpectrum=1) - if type(q_lims) == str: - q_min = [] - q_max = [] - try: - with open(q_lims, 'r') as f: - line_list = [line.rstrip('\n') for line in f] - for line in line_list[:-1]: - value_list = line.split() - q_min.append(value_list[2]) - q_max.append(value_list[3]) - except IOError: - raise RuntimeError("q_lims is not valid") - elif type(q_lims) == list or type(q_lims) == np.ndarray: - q_min = q_lims[0, :] - q_max = q_lims[1, :] - else: - raise RuntimeError("q_lims is not valid") - pdf_x_array = pdf_output_combined.readX(0) - for i in range(q_min.size): - q_min[i] = pdf_x_array[np.amin(np.where(pdf_x_array >= q_min[i]))] - q_max[i] = pdf_x_array[np.amax(np.where(pdf_x_array <= q_max[i]))] - bin_width = pdf_x_array[1] - pdf_x_array[0] - pdf_output_combined = mantid.CropWorkspaceRagged(InputWorkspace=pdf_output_combined, XMin=q_min, XMax=q_max) - pdf_output_combined = mantid.Rebin(InputWorkspace=pdf_output_combined, Params=[min(q_min), bin_width, max(q_max)]) - pdf_output_combined = mantid.SumSpectra(InputWorkspace=pdf_output_combined, WeightedSum=True, MultiplyBySpectra=False) - pdf_fourier_transform = mantid.PDFFourierTransform(Inputworkspace=pdf_output_combined, InputSofQType="S(Q)", - PDFType="G(r)", Filter=True) - return pdf_fourier_transform - - pdf_output = mantid.PDFFourierTransform(Inputworkspace=pdf_output, InputSofQType="S(Q)", PDFType="G(r)", - Filter=True) - pdf_output = mantid.RebinToWorkspace(WorkspaceToRebin=pdf_output, WorkspaceToMatch=pdf_output[4], - PreserveEvents=True) + pdf_output = _generate_grouped_ts_pdf(focused_ws, q_lims, cal_file_name) + else: + pdf_output = mantid.PDFFourierTransform(Inputworkspace=focused_ws, InputSofQType="S(Q)", PDFType="G(r)", + Filter=True) + pdf_output = mantid.RebinToWorkspace(WorkspaceToRebin=pdf_output, WorkspaceToMatch=pdf_output[4], + PreserveEvents=True) + common.remove_intermediate_workspace(focused_ws) return pdf_output -def _generate_grouped_ts_pdf(focused_data, q_lims, cal_file_name): +def _obtain_focused_run(run_number, focus_file_path): + """ + Searches for the focused workspace to use (based on user specified run number) in the ADS and then the output + directory. + If unsuccessful, a ValueError exception is thrown. + :param run_number: The run number to search for. + :param focus_file_path: The expected file path for the focused file. + :return: The focused workspace. + """ + # Try the ADS first to avoid undesired loading + if mantid.mtd.doesExist('%s-Results-TOF-Grp' % run_number): + focused_ws = mantid.mtd['%s-Results-TOF-Grp' % run_number] + elif mantid.mtd.doesExist('%s-Results-D-Grp' % run_number): + focused_ws = mantid.mtd['%s-Results-D-Grp' % run_number] + else: + # Check output directory + print('No loaded focused files found. Searching in output directory...') + try: + focused_ws = mantid.LoadNexus(Filename=focus_file_path, OutputWorkspace='focused_ws').OutputWorkspace + except ValueError: + raise ValueError("Could not find focused file for run number:%s\n" + "Please ensure a focused file has been produced and is located in the output directory." + % run_number) + return focused_ws + + +def _generate_grouped_ts_pdf(focused_ws, q_lims, cal_file_name): group_bin_min = None group_bin_max = None group_bin_width = None - for i in range(focused_data.getNumberOfEntries()): - x_array = focused_data.getItem(i).readX(0) + for i in range(focused_ws.getNumberOfEntries()): + x_array = focused_ws.getItem(i).readX(0) bin_min = x_array[0] bin_max = x_array[-1] bin_width = (x_array[-1] - x_array[0]) / x_array.size @@ -189,17 +141,16 @@ def _generate_grouped_ts_pdf(focused_data, q_lims, cal_file_name): group_bin_min = min(group_bin_min, bin_min) group_bin_max = min(group_bin_max, bin_max) group_bin_width = min(group_bin_width, bin_width) - fit_spectra = mantid.FitIncidentSpectrum(InputWorkspace=focused_data.getItem(i), + fit_spectra = mantid.FitIncidentSpectrum(InputWorkspace=focused_ws.getItem(i), BinningForFit=binning, BinningForCalc=binning, FitSpectrumWith="GaussConvCubicSpline") placzek_self_scattering = mantid.CalculatePlaczekSelfScattering(InputWorkspace=fit_spectra) - cal_workspace = mantid.LoadCalFile( - InputWorkspace=placzek_self_scattering, - CalFileName=cal_file_name, - Workspacename='cal_workspace', - MakeOffsetsWorkspace=False, - MakeMaskWorkspace=False) + cal_workspace = mantid.LoadCalFile(InputWorkspace=placzek_self_scattering, + CalFileName=cal_file_name, + Workspacename='cal_workspace', + MakeOffsetsWorkspace=False, + MakeMaskWorkspace=False) focused_correction = None for spec_index in range(placzek_self_scattering.getNumberHistograms()): if cal_workspace.dataY(spec_index)[0] == i + 1: @@ -207,19 +158,19 @@ def _generate_grouped_ts_pdf(focused_data, q_lims, cal_file_name): focused_correction = placzek_self_scattering.dataY(spec_index) else: focused_correction = np.add(focused_correction, placzek_self_scattering.dataY(spec_index)) - mantid.CreateWorkspace(DataX=placzek_self_scattering.dataX(0), - DataY=focused_correction, - Distribution=True, - UnitX='MomentumTransfer', - OutputWorkspace='focused_correction_ws') - mantid.Rebin(InputWorkspace=focused_data.getItem(i), OutputWorkspace='focused_rebined', Params=binning) - mantid.Rebin(InputWorkspace='focused_correction_ws', OutputWorkspace='focused_correction_ws', Params=binning) - mantid.Subtract(LHSWorkspace='focused_rebined', RHSWorkspace='focused_correction_ws', - OutputWorkspace=focused_data.getItem(i)) + focused_correction_ws = mantid.CreateWorkspace(DataX=placzek_self_scattering.dataX(0), + DataY=focused_correction, + Distribution=True, + UnitX='MomentumTransfer') + mantid.Rebin(InputWorkspace=focused_ws.getItem(i), OutputWorkspace=focused_ws.getItem(i), Params=binning) + focused_correction_ws = mantid.Rebin(InputWorkspace=focused_correction_ws, Params=binning) + mantid.Subtract(LHSWorkspace=focused_ws.getItem(i), + RHSWorkspace=focused_correction_ws, + OutputWorkspace=focused_ws.getItem(i)) binning = [group_bin_min, group_bin_width, group_bin_max] - focused_data = mantid.Rebin(InputWorkspace=focused_data, Params=binning) - pdf_output_combined = mantid.ConjoinSpectra(InputWorkspaces=focused_data) - mantid.MatchSpectra(InputWorkspace=pdf_output_combined, OutputWorkspace=pdf_output_combined, ReferenceSpectrum=1) + focused_data = mantid.Rebin(InputWorkspace=focused_ws, Params=binning) + focused_data_combined = mantid.ConjoinSpectra(InputWorkspaces=focused_data) + mantid.MatchSpectra(InputWorkspace=focused_data_combined, OutputWorkspace=focused_data_combined, ReferenceSpectrum=1) if type(q_lims) == str: q_min = [] q_max = [] @@ -237,44 +188,28 @@ def _generate_grouped_ts_pdf(focused_data, q_lims, cal_file_name): q_max = q_lims[1, :] else: raise RuntimeError("q_lims is not valid") - pdf_x_array = pdf_output_combined.readX(0) + pdf_x_array = focused_data_combined.readX(0) for i in range(q_min.size): q_min[i] = pdf_x_array[np.amin(np.where(pdf_x_array >= q_min[i]))] q_max[i] = pdf_x_array[np.amax(np.where(pdf_x_array <= q_max[i]))] bin_width = pdf_x_array[1] - pdf_x_array[0] - focused_data_combined = mantid.CropWorkspaceRagged(InputWorkspace=pdf_output_combined, XMin=q_min, XMax=q_max) - focused_data_combined = mantid.Rebin(InputWorkspace=pdf_output_combined, Params=[min(q_min), bin_width, max(q_max)]) - focused_data_combined = mantid.SumSpectra(InputWorkspace=pdf_output_combined, WeightedSum=True, - MultiplyBySpectra=False) - pdf_output = mantid.PDFFourierTransform(Inputworkspace=pdf_output_combined, InputSofQType="S(Q)", - PDFType="G(r)", Filter=True) - return pdf_output - + focused_data_combined = mantid.CropWorkspaceRagged(InputWorkspace=focused_data_combined, XMin=q_min, XMax=q_max) + focused_data_combined = mantid.Rebin(InputWorkspace=focused_data_combined, + Params=[min(q_min), bin_width, max(q_max)]) + focused_data_combined = mantid.SumSpectra(InputWorkspace=focused_data_combined, + WeightedSum=True, + MultiplyBySpectra=False) + pdf_output = mantid.PDFFourierTransform(Inputworkspace=focused_data_combined, + InputSofQType="S(Q)", + PDFType="G(r)", + Filter=True) -def _obtain_focused_run(run_number, focus_file_path): - """ - Searches for the focused workspace to use (based on user specified run number) in the ADS and then the output - directory. - If unsuccessful, a ValueError exception is thrown. - :param run_number: The run number to search for. - :param focus_file_path: The expected file path for the focused file. - :return: The focused workspace. - """ - # Try the ADS first to avoid undesired loading - if mantid.mtd.doesExist('%s-Results-TOF-Grp' % run_number): - focused_ws = mantid.mtd['%s-Results-TOF-Grp' % run_number] - elif mantid.mtd.doesExist('%s-Results-D-Grp' % run_number): - focused_ws = mantid.mtd['%s-Results-D-Grp' % run_number] - else: - # Check output directory - print('No loaded focused files found. Searching in output directory...') - try: - focused_ws = mantid.LoadNexus(Filename=focus_file_path, OutputWorkspace='focused_ws').OutputWorkspace - except ValueError: - raise ValueError("Could not find focused file for run number:%s\n" - "Please ensure a focused file has been produced and is located in the output directory." - % run_number) - return focused_ws + common.remove_intermediate_workspace(cal_workspace) + common.remove_intermediate_workspace(fit_spectra) + common.remove_intermediate_workspace(focused_correction_ws) + common.remove_intermediate_workspace(focused_data) + common.remove_intermediate_workspace(placzek_self_scattering) + return pdf_output def _determine_chopper_mode(ws):