diff --git a/Testing/SystemTests/tests/analysis/ISIS_PowderPolarisTest.py b/Testing/SystemTests/tests/analysis/ISIS_PowderPolarisTest.py index c32ecb2bba8e042907eaee77df8abdc35289ba01..7a6704398d27b02db4a86f8ec976a9a7eacd65f4 100644 --- a/Testing/SystemTests/tests/analysis/ISIS_PowderPolarisTest.py +++ b/Testing/SystemTests/tests/analysis/ISIS_PowderPolarisTest.py @@ -110,14 +110,17 @@ def _clean_up(): def setup_polaris_instrument(): user_name = "Test" + calibration_mapping_file_name = "polaris_calibration.yaml" calibration_dir = _get_calibration_dir() - path_to_add = os.path.join(DIRS[0], "POLARIS") - config['datasearch.directories'] += ";" + path_to_add + calibration_mapping_path = os.path.join(calibration_dir, calibration_mapping_file_name) output_dir = _get_output_dir() + path_to_add = os.path.join(DIRS[0], "POLARIS") + config['datasearch.directories'] += ";" + path_to_add polaris_obj = polaris.Polaris(user_name=user_name, chopper_on=True, apply_solid_angle=False, - calibration_directory=calibration_dir, output_directory=output_dir) + calibration_directory=calibration_dir, output_directory=output_dir, + calibration_mapping_file=calibration_mapping_path) return polaris_obj diff --git a/Testing/SystemTests/tests/analysis/reference/ISIS_Powder-POLARIS78338_Van_Cal.nxs.md5 b/Testing/SystemTests/tests/analysis/reference/ISIS_Powder-POLARIS78338_Van_Cal.nxs.md5 deleted file mode 100644 index 76e055cb075a06a960d13796e52829829e3fb141..0000000000000000000000000000000000000000 --- a/Testing/SystemTests/tests/analysis/reference/ISIS_Powder-POLARIS78338_Van_Cal.nxs.md5 +++ /dev/null @@ -1 +0,0 @@ -7e80088fe9a61995c18fa1f9156321b9 diff --git a/scripts/Diffraction/isis_powder/abstract_inst.py b/scripts/Diffraction/isis_powder/abstract_inst.py index d6749fcfcf32bce48356bb93c25109974c47e937..794bdc7096eb271960918093c5bf6a4073c02292 100644 --- a/scripts/Diffraction/isis_powder/abstract_inst.py +++ b/scripts/Diffraction/isis_powder/abstract_inst.py @@ -114,9 +114,6 @@ class AbstractInst(object): def attenuate_workspace(self, input_workspace): return input_workspace - def calculate_focus_binning_params(self, sample): - return None - def correct_sample_vanadium(self, focus_spectra, vanadium_spectra=None): raise NotImplementedError("Cannot process the sample with a vanadium run for this instrument") @@ -138,7 +135,7 @@ class AbstractInst(object): def pearl_focus_tof_rebinning(self, input_workspace): return input_workspace - def crop_data_tail(self, ws_to_crop): + def crop_to_sane_tof(self, ws_to_crop): return ws_to_crop def pearl_rebin_to_workspace(self, ws_to_rebin, ws_to_match): @@ -147,9 +144,6 @@ class AbstractInst(object): def spline_vanadium_ws(self, focused_vanadium_ws): return None - def extract_and_crop_spectra(self, focused_ws): - raise NotImplemented("Extract spectra and crop in tof not implemented") - # ----- Private Implementation ----- # # These should only be called by the abstract instrument class diff --git a/scripts/Diffraction/isis_powder/pearl.py b/scripts/Diffraction/isis_powder/pearl.py index 20609f3482704277389ceef0141593fe91601fdc..de9c8200e817c3cab2fe6d9fda94cd8f2d411807 100644 --- a/scripts/Diffraction/isis_powder/pearl.py +++ b/scripts/Diffraction/isis_powder/pearl.py @@ -6,7 +6,7 @@ import mantid.simpleapi as mantid from isis_powder.routines import common, yaml_parser from isis_powder.routines.common_enums import InputBatchingEnum from isis_powder.abstract_inst import AbstractInst -from isis_powder.pearl_routines import pearl_algs, pearl_calibration_algs, pearl_output, pearl_spline, PearlRunSettings +from isis_powder.pearl_routines import pearl_algs, pearl_output, pearl_spline, PearlRunSettings class Pearl(AbstractInst): @@ -116,14 +116,8 @@ class Pearl(AbstractInst): grouped_d_spacing = mantid.GroupWorkspaces(InputWorkspaces=output_spectra, OutputWorkspace=group_name) return grouped_d_spacing - def extract_and_crop_spectra(self, focused_ws): - ws_spectra = common.extract_ws_spectra(ws_to_split=focused_ws) - ws_spectra = common.crop_in_tof(ws_to_rebin=ws_spectra, x_min=1500, x_max=19900) - return ws_spectra - - def crop_data_tail(self, ws_to_crop): - # TODO move this param into advanced config - out_ws = mantid.CropWorkspace(XMax="19900", InputWorkspace=ws_to_crop, OutputWorkspace=ws_to_crop) + def crop_to_sane_tof(self, ws_to_crop): + out_ws = common.crop_in_tof(ws_to_rebin=ws_to_crop, x_min=1500, x_max=19900) return out_ws def generate_vanadium_absorb_corrections(self, run_details, ws_to_match): diff --git a/scripts/Diffraction/isis_powder/polaris.py b/scripts/Diffraction/isis_powder/polaris.py index 1e2c6db6fa465a47b10047af4d28cc156d64bf12..37dca70f7c1601d463900be5fdbf57771fda40fe 100644 --- a/scripts/Diffraction/isis_powder/polaris.py +++ b/scripts/Diffraction/isis_powder/polaris.py @@ -39,8 +39,8 @@ class Polaris(AbstractInst): def create_calibration_vanadium(self, run_in_range, do_absorb_corrections=True, gen_absorb_correction=False): run_details = self.get_run_details(run_number=int(run_in_range)) - return self._create_calibration_vanadium(vanadium_runs=run_details.vanadium, - empty_runs=run_details.sample_empty, + return self._create_calibration_vanadium(vanadium_runs=run_details.vanadium_run_numbers, + empty_runs=run_details.empty_runs, do_absorb_corrections=do_absorb_corrections, gen_absorb_correction=gen_absorb_correction) @@ -115,16 +115,6 @@ class Polaris(AbstractInst): def generate_vanadium_absorb_corrections(self, calibration_full_paths, ws_to_match): return polaris_algs.generate_absorb_corrections(ws_to_match=ws_to_match) - def extract_and_crop_spectra(self, focused_ws): - ws_spectra = common.extract_ws_spectra(ws_to_split=focused_ws) - ws_spectra = common.crop_in_tof(ws_to_rebin=ws_spectra, x_min=800, x_max=20000) - return ws_spectra - - def calculate_focus_binning_params(self, sample): - calculated_binning_params = polaris_algs.calculate_focus_binning_params(sample_ws=sample, - num_of_banks=self._number_of_banks) - return calculated_binning_params - def output_focused_ws(self, processed_spectra, run_details, output_mode=None): d_spacing_group, tof_group = polaris_algs.split_into_tof_d_spacing_groups(processed_spectra) output_paths = self._generate_out_file_paths(run_details=run_details) @@ -133,3 +123,7 @@ class Polaris(AbstractInst): output_paths=output_paths, run_number=run_details.run_number) return d_spacing_group + + def crop_to_sane_tof(self, ws_to_crop): + cropped_ws = common.crop_in_tof(ws_to_rebin=ws_to_crop, x_min=800, x_max=20000) + return cropped_ws diff --git a/scripts/Diffraction/isis_powder/polaris_routines/polaris_algs.py b/scripts/Diffraction/isis_powder/polaris_routines/polaris_algs.py index c282a8e3d54dcfe57c814c4a640c9d7a76e64419..bdee806ac53801d91835358267a1f57f3da1340c 100644 --- a/scripts/Diffraction/isis_powder/polaris_routines/polaris_algs.py +++ b/scripts/Diffraction/isis_powder/polaris_routines/polaris_algs.py @@ -8,14 +8,14 @@ from isis_powder.routines.common_enums import InputBatchingEnum from isis_powder.routines.RunDetails import RunDetails -def calculate_focus_binning_params(sample_ws, num_of_banks): - # TODO move these out to config file +def calculate_focus_binning_params(sample_ws): + # TODO remove this if they only want sane TOF values and not consistent binning focus_bin_widths = [-0.0050, -0.0010, -0.0010, -0.0010, -0.00050] focus_crop_start = 2 # These are used when calculating binning range focus_crop_end = 0.95 calculated_binning_params = [] - + num_of_banks = sample_ws.getNumberHistograms() for i in range(0, num_of_banks): sample_data = sample_ws.readX(i) starting_bin = sample_data[0] * (1 + focus_crop_start) @@ -60,8 +60,8 @@ def generate_absorb_corrections(ws_to_match): def generate_solid_angle_corrections(run_details, instrument): - vanadium_ws = common.load_current_normalised_ws_list(run_number_string=run_details.vanadium, instrument=instrument, - input_batching=InputBatchingEnum.Summed) + vanadium_ws = common.load_current_normalised_ws_list(run_number_string=run_details.vanadium_run_numbers, + 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) @@ -92,10 +92,13 @@ def get_run_details(chopper_on, sac_on, run_number_string, calibration_dir, mapp solid_angle_file_path = os.path.join(in_calib_dir, solid_angle_file_name) splined_vanadium = os.path.join(in_calib_dir, splined_vanadium_name) - run_details = RunDetails(calibration_path=calibration_full_path, grouping_path=grouping_full_path, - vanadium_runs=vanadium_runs, run_number=run_number_string) - run_details.label = label + run_details = RunDetails(run_number=run_number_string) run_details.empty_runs = empty_runs + run_details.vanadium_run_numbers = vanadium_runs + run_details.label = label + + run_details.calibration_file_path = calibration_full_path + run_details.grouping_file_path = grouping_full_path run_details.splined_vanadium_file_path = splined_vanadium run_details.solid_angle_corr = solid_angle_file_path @@ -103,8 +106,6 @@ def get_run_details(chopper_on, sac_on, run_number_string, calibration_dir, mapp def split_into_tof_d_spacing_groups(processed_spectra): - import pydevd - pydevd.settrace('localhost', port=51205, stdoutToServer=True, stderrToServer=True) name_index = 1 d_spacing_output = [] tof_output = [] diff --git a/scripts/Diffraction/isis_powder/polaris_routines/polaris_calibration.yaml b/scripts/Diffraction/isis_powder/polaris_routines/polaris_calibration.yaml index de8c5bfe984b0afe55e3cd04825a2b2dda5a54f7..ffba88488a36e68106dc603b9d13807eff3bd24b 100644 --- a/scripts/Diffraction/isis_powder/polaris_routines/polaris_calibration.yaml +++ b/scripts/Diffraction/isis_powder/polaris_routines/polaris_calibration.yaml @@ -24,6 +24,13 @@ vanadium_run_numbers : "93105" empty_run_numbers : "93106" +95597-95599: + offset_file_name : "cycle_16_3_silicon_all_spectra.cal" + label : "16_3" + chopper_on: + vanadium_run_numbers : "95598" + empty_run_numbers : "95597" + 95600- : #95614 # Calibration run offset_file_name : "offsets_2011_cycle111b.cal" diff --git a/scripts/Diffraction/isis_powder/routines/calibrate.py b/scripts/Diffraction/isis_powder/routines/calibrate.py index 0368120c99dd31fa246027b85963b193007d601f..9b8ca5c551679b9e561a1615edd2c02634b678b1 100644 --- a/scripts/Diffraction/isis_powder/routines/calibrate.py +++ b/scripts/Diffraction/isis_powder/routines/calibrate.py @@ -16,7 +16,7 @@ def create_van(instrument, van, empty, absorb, gen_absorb): instrument=instrument) # Crop the tail end of the data on PEARL if they are not capturing slow neutrons - corrected_van_ws = instrument.crop_data_tail(ws_to_crop=corrected_van_ws) + corrected_van_ws = instrument.crop_to_sane_tof(ws_to_crop=corrected_van_ws) corrected_van_ws = mantid.AlignDetectors(InputWorkspace=corrected_van_ws, CalibrationFile=run_details.calibration_file_path) @@ -31,7 +31,7 @@ def create_van(instrument, van, empty, absorb, gen_absorb): focused_vanadium = mantid.DiffractionFocussing(InputWorkspace=corrected_van_ws, GroupingFileName=run_details.grouping_file_path) - focused_cropped_spectra = instrument.extract_and_crop_spectra(focused_ws=focused_vanadium) + focused_cropped_spectra = common.extract_and_crop_spectra(focused_ws=focused_vanadium, instrument=instrument) d_spacing_group = _save_focused_vanadium(instrument=instrument, run_details=run_details, cropped_spectra=focused_cropped_spectra) _create_vanadium_splines(focused_cropped_spectra, instrument, run_details) diff --git a/scripts/Diffraction/isis_powder/routines/common.py b/scripts/Diffraction/isis_powder/routines/common.py index 4f1f585ac71758aedbbcbb1801b698b74a629aff..0a08d938be55563d1358ecbbc302880d2d7d7299 100644 --- a/scripts/Diffraction/isis_powder/routines/common.py +++ b/scripts/Diffraction/isis_powder/routines/common.py @@ -52,6 +52,12 @@ def extract_ws_spectra(ws_to_split): return spectra_bank_list +def extract_and_crop_spectra(focused_ws, instrument): + ws_spectra = extract_ws_spectra(ws_to_split=focused_ws) + ws_spectra = instrument.crop_to_sane_tof(ws_to_crop=ws_spectra) + return ws_spectra + + def generate_run_numbers(run_number_string): # Check its not a single run if isinstance(run_number_string, int) or run_number_string.isdigit(): diff --git a/scripts/Diffraction/isis_powder/routines/focus.py b/scripts/Diffraction/isis_powder/routines/focus.py index 44886de7380a0b447f96df6a7ea9d2c6e025139c..f86e51c49ebba86120b6ddc8a0efb80e41e9aa4e 100644 --- a/scripts/Diffraction/isis_powder/routines/focus.py +++ b/scripts/Diffraction/isis_powder/routines/focus.py @@ -15,73 +15,35 @@ def focus(run_number, instrument, input_batching, perform_vanadium_norm=True): return _batched_run_focusing(input_batching, instrument, perform_vanadium_norm, run_number) -def _batched_run_focusing(input_batching, instrument, perform_vanadium_norm, run_number): - read_ws_list = common.load_current_normalised_ws_list(run_number_string=run_number, - input_batching=input_batching, instrument=instrument) - output = None - for ws in read_ws_list: - output = _focus_one_ws(ws=ws, run_number=run_number, instrument=instrument, - perform_vanadium_norm=perform_vanadium_norm) - common.remove_intermediate_workspace(ws) - return output - - -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) - split_ws = common.extract_ws_spectra(ws_to_split=input_workspace) - - 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) - - return processed_spectra - - def _focus_one_ws(ws, run_number, instrument, perform_vanadium_norm): run_details = instrument.get_run_details(run_number=run_number) # Check the necessary splined vanadium file has been created - if not os.path.isfile(run_details.splined_vanadium): + if not os.path.isfile(run_details.splined_vanadium_file_path): raise ValueError("Processed vanadium runs not found at this path: " - + str(run_details.splined_vanadium) + + + str(run_details.splined_vanadium_file_path) + " \nHave you created a vanadium calibration with these settings yet?\n") - in_ws_name = ws.name() # Setup for later check that ws doesn't shadow - ws = instrument.pearl_focus_tof_rebinning(ws) # Rebins for PEARL # Compensate for empty sample if specified input_workspace = common.subtract_sample_empty(ws_to_correct=ws, instrument=instrument, - empty_sample_ws_string=run_details.sample_empty) + empty_sample_ws_string=run_details.empty_runs) + input_workspace = instrument.crop_to_sane_tof(ws_to_crop=input_workspace) + # Align / Focus input_workspace = mantid.AlignDetectors(InputWorkspace=input_workspace, - CalibrationFile=run_details.calibration) + CalibrationFile=run_details.calibration_file_path) input_workspace = instrument.apply_solid_angle_efficiency_corr(ws_to_correct=input_workspace, run_details=run_details) focused_ws = mantid.DiffractionFocussing(InputWorkspace=input_workspace, - GroupingFileName=run_details.grouping) - - # Process - rebinning_params = instrument.calculate_focus_binning_params(sample=focused_ws) + GroupingFileName=run_details.grouping_file_path) calibrated_spectra = _divide_sample_by_vanadium(instrument=instrument, run_number=run_number, input_workspace=focused_ws, perform_vanadium_norm=perform_vanadium_norm) - _apply_binning_to_spectra(spectra_list=calibrated_spectra, binning_list=rebinning_params) - # Output processed_nexus_files = instrument.output_focused_ws(calibrated_spectra, run_details=run_details) @@ -90,11 +52,39 @@ def _focus_one_ws(ws, run_number, instrument, perform_vanadium_norm): common.remove_intermediate_workspace(focused_ws) common.remove_intermediate_workspace(calibrated_spectra) - if ws.name() != in_ws_name: - # We have rebinned and will leak a workspace as there is now two 'ws' variables shadowing one ADS entry + return processed_nexus_files + + +def _batched_run_focusing(input_batching, instrument, perform_vanadium_norm, run_number): + read_ws_list = common.load_current_normalised_ws_list(run_number_string=run_number, + input_batching=input_batching, instrument=instrument) + output = None + for ws in read_ws_list: + output = _focus_one_ws(ws=ws, run_number=run_number, instrument=instrument, + perform_vanadium_norm=perform_vanadium_norm) common.remove_intermediate_workspace(ws) + return output - 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) + split_ws = common.extract_and_crop_spectra(input_workspace, instrument=instrument) + + if perform_vanadium_norm: + vanadium_ws_list = mantid.LoadNexus(Filename=run_details.splined_vanadium_file_path) + 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)) + + common.remove_intermediate_workspace(split_ws) + + return processed_spectra def _individual_run_focusing(input_batching, instrument, perform_vanadium_norm, run_number): @@ -106,15 +96,4 @@ def _individual_run_focusing(input_batching, instrument, perform_vanadium_norm, input_batching=input_batching) output = _focus_one_ws(ws=ws[0], run_number=run, instrument=instrument, perform_vanadium_norm=perform_vanadium_norm) - common.remove_intermediate_workspace(ws) return output - - -def _apply_binning_to_spectra(spectra_list, binning_list): - if not binning_list: - return - - for ws, bin_params in zip(spectra_list, binning_list): - # Starting bin edge / bin width / last bin edge - rebin_string = bin_params[0] + ',' + bin_params[1] + ',' + bin_params[2] - mantid.Rebin(InputWorkspace=ws, OutputWorkspace=ws, Params=rebin_string) diff --git a/scripts/Diffraction/isis_powder/routines/yaml_parser.py b/scripts/Diffraction/isis_powder/routines/yaml_parser.py index cc59d6fc424fb10cdb3a5e9b24d6d566ef7a87cf..cb013ca6150fcc567f4c33cbfc92c1c136481322 100644 --- a/scripts/Diffraction/isis_powder/routines/yaml_parser.py +++ b/scripts/Diffraction/isis_powder/routines/yaml_parser.py @@ -52,17 +52,16 @@ def _open_yaml_file_as_dictionary(file_path): def _find_dictionary_key(dict_to_search, run_number): - for key in dict_to_search: if is_run_range_key_unbounded(key): # Have an unbounded run don't generate numbers split_key = str(key).split('-') lower_key_bound = int(split_key[-2]) if run_number > lower_key_bound: return key - - generated_runs = common.generate_run_numbers(run_number_string=key) - if run_number in generated_runs: - return key + else: + generated_runs = common.generate_run_numbers(run_number_string=key) + if run_number in generated_runs: + return key return None