From 65cc5105501267d83b29367acf4015f3a8adb5e7 Mon Sep 17 00:00:00 2001 From: David Fairbrother <DavidFair@users.noreply.github.com> Date: Thu, 1 Dec 2016 11:56:36 +0000 Subject: [PATCH] Re #18108 Add processing mode POLARIS --- .../Diffraction/isis_powder/abstract_inst.py | 4 +- .../isis_powder/pearl_routines/pearl_algs.py | 2 +- .../pearl_routines/pearl_calibration_algs.py | 4 +- scripts/Diffraction/isis_powder/polaris.py | 6 +- .../polaris_routines/polaris_algs.py | 10 ++- .../isis_powder/routines/calibrate.py | 17 ++-- .../isis_powder/routines/common.py | 74 ++++++++++------- .../isis_powder/routines/common_enums.py | 6 ++ .../Diffraction/isis_powder/routines/focus.py | 80 ++++++++++++------- 9 files changed, 126 insertions(+), 77 deletions(-) create mode 100644 scripts/Diffraction/isis_powder/routines/common_enums.py diff --git a/scripts/Diffraction/isis_powder/abstract_inst.py b/scripts/Diffraction/isis_powder/abstract_inst.py index 49281d87a4f..764e8709c8a 100644 --- a/scripts/Diffraction/isis_powder/abstract_inst.py +++ b/scripts/Diffraction/isis_powder/abstract_inst.py @@ -71,8 +71,8 @@ class AbstractInst(object): output_van_file_name=output_file_name, absorb=do_absorb_corrections, gen_absorb=gen_absorb_correction) - def _focus(self, run_number, do_attenuation, do_van_normalisation): - return focus.focus(run_number=run_number, perform_attenuation=do_attenuation, + def _focus(self, run_number, input_batching, do_attenuation, do_van_normalisation): + return focus.focus(run_number=run_number, perform_attenuation=do_attenuation, input_batching=input_batching, perform_vanadium_norm=do_van_normalisation, instrument=self) def _generate_out_file_paths(self, run_details, output_directory=None): diff --git a/scripts/Diffraction/isis_powder/pearl_routines/pearl_algs.py b/scripts/Diffraction/isis_powder/pearl_routines/pearl_algs.py index 25ff773b51b..277123ce0a7 100644 --- a/scripts/Diffraction/isis_powder/pearl_routines/pearl_algs.py +++ b/scripts/Diffraction/isis_powder/pearl_routines/pearl_algs.py @@ -14,7 +14,7 @@ def attenuate_workspace(attenuation_file_path, ws_to_correct): wc_attenuated = mantid.RebinToWorkspace(WorkspaceToRebin=wc_attenuated, WorkspaceToMatch=ws_to_correct, OutputWorkspace=wc_attenuated) pearl_attenuated_ws = mantid.Divide(LHSWorkspace=ws_to_correct, RHSWorkspace=wc_attenuated) - common.remove_intermediate_workspace(workspace_name=wc_attenuated) + common.remove_intermediate_workspace(workspaces=wc_attenuated) return pearl_attenuated_ws diff --git a/scripts/Diffraction/isis_powder/pearl_routines/pearl_calibration_algs.py b/scripts/Diffraction/isis_powder/pearl_routines/pearl_calibration_algs.py index 80713c22cb0..1ab806f0a37 100644 --- a/scripts/Diffraction/isis_powder/pearl_routines/pearl_calibration_algs.py +++ b/scripts/Diffraction/isis_powder/pearl_routines/pearl_calibration_algs.py @@ -8,7 +8,7 @@ import isis_powder.routines.common as common def create_calibration(self, calibration_runs, offset_file_name, grouping_file_name): - input_ws = common.load_current_normalised_ws(run_number_string=calibration_runs, instrument=self) + input_ws = common.load_current_normalised_ws_list(run_number_string=calibration_runs, instrument=self) run_details = self.get_run_details(calibration_runs) if run_details.instrument_version == "new" or run_details.instrument_version == "new2": @@ -49,7 +49,7 @@ def create_calibration(self, calibration_runs, offset_file_name, grouping_file_n def do_silicon_calibration(self, runs_to_process, cal_file_name, grouping_file_name): # TODO fix all of this as the script is too limited to be useful - create_si_ws = common.load_current_normalised_ws(run_number_string=runs_to_process, instrument=self) + create_si_ws = common.load_current_normalised_ws_list(run_number_string=runs_to_process, instrument=self) cycle_details = self._get_label_information(runs_to_process) instrument_version = cycle_details["instrument_version"] diff --git a/scripts/Diffraction/isis_powder/polaris.py b/scripts/Diffraction/isis_powder/polaris.py index 7c8ee08e6fd..28987b7ab38 100644 --- a/scripts/Diffraction/isis_powder/polaris.py +++ b/scripts/Diffraction/isis_powder/polaris.py @@ -33,8 +33,8 @@ class Polaris(AbstractInst): self._ads_workaround = 0 - def focus(self, run_number, do_attenuation=True, do_van_normalisation=True): - return self._focus(run_number=run_number, do_attenuation=do_attenuation, + def focus(self, run_number, input_mode, do_attenuation=True, do_van_normalisation=True): + return self._focus(run_number=run_number, input_batching=input_mode, do_attenuation=do_attenuation, do_van_normalisation=do_van_normalisation) def create_calibration_vanadium(self, run_in_range, do_absorb_corrections=True, gen_absorb_correction=False): @@ -74,7 +74,7 @@ class Polaris(AbstractInst): return self._number_of_banks def normalise_ws(self, ws_to_correct, run_details=None): - normalised_ws = mantid.NormaliseByCurrent(InputWorkspace=ws_to_correct) + normalised_ws = mantid.NormaliseByCurrent(InputWorkspace=ws_to_correct, OutputWorkspace=ws_to_correct) return normalised_ws def apply_solid_angle_efficiency_corr(self, ws_to_correct, run_details): diff --git a/scripts/Diffraction/isis_powder/polaris_routines/polaris_algs.py b/scripts/Diffraction/isis_powder/polaris_routines/polaris_algs.py index 9be2b07e265..74e827da88b 100644 --- a/scripts/Diffraction/isis_powder/polaris_routines/polaris_algs.py +++ b/scripts/Diffraction/isis_powder/polaris_routines/polaris_algs.py @@ -3,6 +3,7 @@ from __future__ import (absolute_import, division, print_function) import mantid.simpleapi as mantid import os import isis_powder.routines.common as common +from isis_powder.routines.common_enums import InputBatchingEnum from isis_powder.polaris_routines import polaris_calib_parser from isis_powder.routines.RunDetails import RunDetails @@ -59,8 +60,9 @@ def generate_absorb_corrections(ws_to_match): def generate_solid_angle_corrections(run_details, instrument): - vanadium_ws = common.load_current_normalised_ws(run_number_string=run_details.vanadium, instrument=instrument) - corrections = _calculate_solid_angle_efficiency_corrections(vanadium_ws) + vanadium_ws = common.load_current_normalised_ws_list(run_number_string=run_details.vanadium, instrument=instrument, + input_batching=InputBatchingEnum.Summed) + corrections = _calculate_solid_angle_efficiency_corrections(vanadium_ws[0]) mantid.SaveNexusProcessed(InputWorkspace=corrections, Filename=run_details.solid_angle_corr) common.remove_intermediate_workspace(vanadium_ws) return corrections @@ -180,9 +182,9 @@ def _calculate_solid_angle_efficiency_corrections(vanadium_ws): def _generate_solid_angle_file_name(chopper_on, vanadium_run_string): if chopper_on: - return "SAC_chopperOn_" + vanadium_run_string + ".nxs" + return "SAC_" + vanadium_run_string + "_chopperOn" else: - return "SAC_chopperOff_" + vanadium_run_string + ".nxs" + return "SAC_" + vanadium_run_string + "_chopperOff" def _generate_splined_van_name(chopper_on, sac_applied, vanadium_run_string): diff --git a/scripts/Diffraction/isis_powder/routines/calibrate.py b/scripts/Diffraction/isis_powder/routines/calibrate.py index 8563d94fee4..dacda3d8788 100644 --- a/scripts/Diffraction/isis_powder/routines/calibrate.py +++ b/scripts/Diffraction/isis_powder/routines/calibrate.py @@ -5,20 +5,25 @@ import os import mantid.simpleapi as mantid import isis_powder.routines.common as common +from isis_powder.routines.common_enums import InputBatchingEnum def create_van(instrument, van, empty, output_van_file_name, absorb, gen_absorb): - input_van_ws = common.load_current_normalised_ws(run_number_string=van, instrument=instrument) + # Always sum a range of inputs as its a vanadium run over multiple captures + input_van_ws_list = common.load_current_normalised_ws_list(run_number_string=van, instrument=instrument, + input_batching=InputBatchingEnum.Summed) + + input_van_ws = input_van_ws_list[0] # As we asked for a summed ws there should only be one returned + corrected_van_ws = common.subtract_sample_empty(ws_to_correct=input_van_ws, empty_sample_ws_string=empty, instrument=instrument) - common.remove_intermediate_workspace(input_van_ws) run_details = instrument.get_run_details(run_number=van) - # corrected_van_ws = instrument. pearl_van_calibration_tof_rebinning(vanadium_ws=corrected_van_ws, - # tof_rebin_pass=1, return_units="TOF") + corrected_van_ws = instrument. pearl_van_calibration_tof_rebinning(vanadium_ws=corrected_van_ws, + tof_rebin_pass=1, return_units="TOF") corrected_van_ws = mantid.AlignDetectors(InputWorkspace=corrected_van_ws, CalibrationFile=run_details.calibration) @@ -34,8 +39,8 @@ def create_van(instrument, van, empty, output_van_file_name, absorb, gen_absorb) GroupingFileName=run_details.grouping) # Optional - # focused_van_file = instrument. pearl_van_calibration_tof_rebinning(vanadium_ws=focused_van_file, - # tof_rebin_pass=2, return_units="dSpacing") + focused_van_file = instrument. pearl_van_calibration_tof_rebinning(vanadium_ws=focused_van_file, + tof_rebin_pass=2, return_units="dSpacing") common.remove_intermediate_workspace(corrected_van_ws) diff --git a/scripts/Diffraction/isis_powder/routines/common.py b/scripts/Diffraction/isis_powder/routines/common.py index ceb8066c47b..db8a942a0bd 100644 --- a/scripts/Diffraction/isis_powder/routines/common.py +++ b/scripts/Diffraction/isis_powder/routines/common.py @@ -2,7 +2,7 @@ from __future__ import (absolute_import, division, print_function) import mantid.kernel as kernel import mantid.simpleapi as mantid - +from isis_powder.routines.common_enums import InputBatchingEnum # A small workaround to ensure when reading workspaces in a loop # the previous workspace does not got overridden @@ -62,46 +62,56 @@ def get_monitor_ws(ws_to_process, run_number_string, instrument): return load_monitor_ws -def load_current_normalised_ws(run_number_string, instrument): +def load_current_normalised_ws_list(run_number_string, instrument, input_batching): run_information = instrument.get_run_details(run_number=run_number_string) - read_in_ws = _load_raw_files(run_number_string=run_number_string, instrument=instrument) - read_ws = instrument.normalise_ws(ws_to_correct=read_in_ws, run_details=run_information) + raw_ws_list = _load_raw_files(run_number_string=run_number_string, instrument=instrument) + + if input_batching.lower() == InputBatchingEnum.Summed.lower(): + summed_ws = _sum_ws_range(ws_list=raw_ws_list) + remove_intermediate_workspace(raw_ws_list) + raw_ws_list = [summed_ws] - output_name = "read_ws_output-" + str(g_ads_workaround["read_ws"]) - g_ads_workaround["read_ws"] += 1 - read_ws = mantid.RenameWorkspace(InputWorkspace=read_ws, OutputWorkspace=output_name) + normalised_ws_list = _normalise_workspaces(ws_list=raw_ws_list, run_information=run_information, + instrument=instrument) - remove_intermediate_workspace(read_in_ws) - return read_ws + return normalised_ws_list -def remove_intermediate_workspace(workspace_name): - #if mantid.mtd.doesExist(workspace_name): - mantid.DeleteWorkspace(workspace_name) - # del workspace_name # Mark it as deleted so that more information is preserved on throw - #else: - # raise RuntimeError("Tried to remove non-existent workspace: " + str(workspace_name)) +def remove_intermediate_workspace(workspaces): + if isinstance(workspaces, list): + for ws in workspaces: + mantid.DeleteWorkspace(ws) + else: + mantid.DeleteWorkspace(workspaces) def subtract_sample_empty(ws_to_correct, empty_sample_ws_string, instrument): - output = ws_to_correct if empty_sample_ws_string: - empty_sample = load_current_normalised_ws(run_number_string=empty_sample_ws_string, instrument=instrument) - corrected_ws = mantid.Minus(LHSWorkspace=ws_to_correct, RHSWorkspace=empty_sample) + empty_sample = load_current_normalised_ws_list(run_number_string=empty_sample_ws_string, instrument=instrument, + input_batching=InputBatchingEnum.Summed) + mantid.Minus(LHSWorkspace=ws_to_correct, RHSWorkspace=empty_sample[0], OutputWorkspace=ws_to_correct) remove_intermediate_workspace(empty_sample) - output = corrected_ws - return output + + return ws_to_correct + + +def _normalise_workspaces(ws_list, instrument, run_information): + output_list = [] + for ws in ws_list: + output_list.append(instrument.normalise_ws(ws_to_correct=ws, run_details=run_information)) + + return output_list def _check_load_range(list_of_runs_to_load): - MAXIMUM_RANGE_LEN = 20 # If more than this number of runs is entered probably wrong + MAXIMUM_RANGE_LEN = 1000 # If more than this number of runs is entered probably wrong if len(list_of_runs_to_load) > MAXIMUM_RANGE_LEN: raise ValueError("More than " + str(MAXIMUM_RANGE_LEN) + " runs were selected." " Found " + str(len(list_of_runs_to_load)) + " Aborting.") def _create_blank_cal_file(calibration_runs, out_grouping_file_name, instrument, group_names): - input_ws = load_current_normalised_ws(calibration_runs, instrument) + input_ws = load_current_normalised_ws_list(calibration_runs, instrument, input_batching=InputBatchingEnum.Summed) calibration_d_spacing_ws = mantid.ConvertUnits(InputWorkspace=input_ws, Target="dSpacing") mantid.CreateCalFileByNames(InstrumentWorkspace=calibration_d_spacing_ws, GroupingFileName=out_grouping_file_name, GroupNames=group_names) @@ -112,27 +122,29 @@ def _create_blank_cal_file(calibration_runs, out_grouping_file_name, instrument, def _load_raw_files(run_number_string, instrument): run_number_list = generate_run_numbers(run_number_string=run_number_string) instrument._old_api_pearl_setup_input_dirs(run_number=run_number_list[0]) - load_raw_ws = _load_sum_file_range(run_number_list, instrument) + load_raw_ws = _load_list_of_files(run_number_list, instrument) return load_raw_ws -def _load_sum_file_range(run_numbers_list, instrument): +def _load_list_of_files(run_numbers_list, instrument): read_ws_list = [] - _check_load_range(list_of_runs_to_load=run_numbers_list) for run_number in run_numbers_list: file_name = instrument.generate_inst_file_name(run_number=run_number) - read_ws = mantid.Load(Filename=file_name, LoadLogFiles="0") + read_ws = mantid.Load(Filename=file_name) read_ws_list.append(mantid.RenameWorkspace(InputWorkspace=read_ws, OutputWorkspace=str(file_name))) + return read_ws_list + + +def _sum_ws_range(ws_list): # Sum all workspaces - out_ws_name = "summed_range_load-" + str(g_ads_workaround["read_ws"]) - g_ads_workaround["read_ws"] += 1 - summed_ws = mantid.RenameWorkspace(InputWorkspace=read_ws_list[0], OutputWorkspace=out_ws_name) - for ws in read_ws_list[1:]: # Skip first member + out_ws_name = "summed_" + ws_list[0].name() + '_' + ws_list[-1].name() + + summed_ws = mantid.CloneWorkspace(InputWorkspace=ws_list[0], OutputWorkspace=out_ws_name) + for ws in ws_list[1:]: # Skip the first element summed_ws = mantid.Plus(LHSWorkspace=summed_ws, RHSWorkspace=ws, OutputWorkspace=out_ws_name) - remove_intermediate_workspace(ws) return summed_ws diff --git a/scripts/Diffraction/isis_powder/routines/common_enums.py b/scripts/Diffraction/isis_powder/routines/common_enums.py new file mode 100644 index 00000000000..1261755dc4b --- /dev/null +++ b/scripts/Diffraction/isis_powder/routines/common_enums.py @@ -0,0 +1,6 @@ +from __future__ import (absolute_import, division, print_function) + + +class InputBatchingEnum(object): + Individual = "Individual" + Summed = "Summed" diff --git a/scripts/Diffraction/isis_powder/routines/focus.py b/scripts/Diffraction/isis_powder/routines/focus.py index 9bc8cd09846..deaff89ff80 100644 --- a/scripts/Diffraction/isis_powder/routines/focus.py +++ b/scripts/Diffraction/isis_powder/routines/focus.py @@ -3,13 +3,52 @@ from __future__ import (absolute_import, division, print_function) import mantid.simpleapi as mantid import isis_powder.routines.common as common +from isis_powder.routines.common_enums import InputBatchingEnum import os -def focus(run_number, instrument, perform_attenuation=True, perform_vanadium_norm=True): - # Read +def focus(run_number, instrument, input_batching, perform_attenuation=True, perform_vanadium_norm=True): + if input_batching.lower() == InputBatchingEnum.Individual.lower(): + _individual_run_focusing(input_batching, instrument, perform_attenuation, perform_vanadium_norm, run_number) + else: + _batched_run_focusing(input_batching, instrument, perform_attenuation, perform_vanadium_norm, run_number) + + +def _batched_run_focusing(input_batching, instrument, perform_attenuation, perform_vanadium_norm, run_number): + import pydevd + pydevd.settrace('localhost', port=51205, stdoutToServer=True, stderrToServer=True) + read_ws_list = common.load_current_normalised_ws_list(run_number_string=run_number, + input_batching=input_batching, instrument=instrument) + for ws in read_ws_list: + _focus_one_ws(ws=ws, run_number=run_number, instrument=instrument, perform_attenuation=perform_attenuation, + perform_vanadium_norm=perform_vanadium_norm) + common.remove_intermediate_workspace(ws) + + +def _divide_sample_by_vanadium(instrument, run_number, input_workspace, perform_vanadium_norm): + processed_spectra = [] + run_details = instrument.get_run_details(run_number=run_number) + num_of_banks = instrument.get_num_of_banks(run_details.instrument_version) + split_ws = common.extract_bank_spectra(ws_to_split=input_workspace, num_banks=num_of_banks) + + if perform_vanadium_norm: + vanadium_ws_list = mantid.LoadNexus(Filename=run_details.splined_vanadium) + for focus_spectra, van_spectra in zip(split_ws, vanadium_ws_list[1:]): + processed_spectra.append( + instrument.correct_sample_vanadium(focus_spectra=focus_spectra, vanadium_spectra=van_spectra)) + common.remove_intermediate_workspace(vanadium_ws_list[0]) + + else: + for focus_spectra in split_ws: + processed_spectra.append(instrument.correct_sample_vanadium(focus_spectra=focus_spectra)) + + for ws in split_ws: + common.remove_intermediate_workspace(ws) - read_ws = common.load_current_normalised_ws(run_number_string=run_number, instrument=instrument) + return processed_spectra + + +def _focus_one_ws(ws, run_number, instrument, perform_attenuation=True, perform_vanadium_norm=True): # input_workspace = instrument.pearl_focus_tof_rebinning(read_ws) # Rebins for PEARL run_details = instrument.get_run_details(run_number=run_number) @@ -20,7 +59,7 @@ def focus(run_number, instrument, perform_attenuation=True, perform_vanadium_nor " \n\nHave you created a vanadium calibration with these settings yet?") # Compensate for empty sample if specified - input_workspace = common.subtract_sample_empty(ws_to_correct=read_ws, instrument=instrument, + input_workspace = common.subtract_sample_empty(ws_to_correct=ws, instrument=instrument, empty_sample_ws_string=run_details.sample_empty) # Align / Focus @@ -47,38 +86,23 @@ def focus(run_number, instrument, perform_attenuation=True, perform_vanadium_nor attenuate=perform_attenuation) # Tidy - common.remove_intermediate_workspace(read_ws) common.remove_intermediate_workspace(input_workspace) common.remove_intermediate_workspace(focused_ws) - for ws in calibrated_spectra: - common.remove_intermediate_workspace(ws) - pass + common.remove_intermediate_workspace(calibrated_spectra) return processed_nexus_files -def _divide_sample_by_vanadium(instrument, run_number, input_workspace, perform_vanadium_norm): - processed_spectra = [] - run_details = instrument.get_run_details(run_number=run_number) - num_of_banks = instrument.get_num_of_banks(run_details.instrument_version) - split_ws = common.extract_bank_spectra(ws_to_split=input_workspace, num_banks=num_of_banks) - - if perform_vanadium_norm: - vanadium_ws_list = mantid.LoadNexus(Filename=run_details.splined_vanadium) - for focus_spectra, van_spectra in zip(split_ws, vanadium_ws_list[1:]): - processed_spectra.append( - instrument.correct_sample_vanadium(focus_spectra=focus_spectra, vanadium_spectra=van_spectra)) - common.remove_intermediate_workspace(vanadium_ws_list[0]) - - else: - for focus_spectra in split_ws: - processed_spectra.append(instrument.correct_sample_vanadium(focus_spectra=focus_spectra)) - - for ws in split_ws: +def _individual_run_focusing(input_batching, instrument, perform_attenuation, perform_vanadium_norm, run_number): + # Load and process one by one + run_numbers = common.generate_run_numbers(run_number_string=run_number) + for run in run_numbers: + ws = common.load_current_normalised_ws_list(run_number_string=run, instrument=instrument, + input_batching=input_batching) + _focus_one_ws(ws=ws[0], run_number=run, instrument=instrument, perform_attenuation=perform_attenuation, + perform_vanadium_norm=perform_vanadium_norm) common.remove_intermediate_workspace(ws) - return processed_spectra - def _apply_binning_to_spectra(spectra_list, binning_list): if not binning_list: -- GitLab