diff --git a/scripts/Diffraction/isis_powder/gem.py b/scripts/Diffraction/isis_powder/gem.py index efa851e31ac177f3d97f27fee9af394c1c065252..68e7e0b349b4f8ea8c9b22d32e135d10ff4c5070 100644 --- a/scripts/Diffraction/isis_powder/gem.py +++ b/scripts/Diffraction/isis_powder/gem.py @@ -44,6 +44,7 @@ class Gem(AbstractInst): do_absorb_corrections=self._inst_settings.do_absorb_corrections) def create_cal(self, **kwargs): + print(hasattr(self._inst_settings, "calibration_to_adjust")) self._switch_texture_mode_specific_inst_settings(kwargs.get("texture_mode")) self._inst_settings.update_attributes(kwargs=kwargs) self._inst_settings.update_attributes(advanced_config=gem_advanced_config.get_calibration_variables()) @@ -58,8 +59,17 @@ class Gem(AbstractInst): "Step": self._inst_settings.get_det_offsets_step, "XMin": self._inst_settings.get_det_offsets_x_min, "XMax": self._inst_settings.get_det_offsets_x_max} - - return gem_calibration_algs.create_calibration(calibration_runs=self._inst_settings.run_number, + if hasattr(self._inst_settings, "calibration_to_adjust"): + return gem_calibration_algs.create_calibration(calibration_runs=self._inst_settings.run_number, + instrument=self, + offset_file_name=run_details.offset_file_path, + grouping_file_name=run_details.grouping_file_path, + calibration_dir=self._inst_settings.calibration_dir, + rebin_1_params=self._inst_settings.cal_rebin_1, + rebin_2_params=self._inst_settings.cal_rebin_2, + cross_correlate_params=cross_correlate_params, + get_det_offset_params=get_detector_offsets_params) + return gem_calibration_algs.adjust_calibration(calibration_runs=self._inst_settings.run_number, instrument=self, offset_file_name=run_details.offset_file_path, grouping_file_name=run_details.grouping_file_path, @@ -67,7 +77,8 @@ class Gem(AbstractInst): rebin_1_params=self._inst_settings.cal_rebin_1, rebin_2_params=self._inst_settings.cal_rebin_2, cross_correlate_params=cross_correlate_params, - get_det_offset_params=get_detector_offsets_params) + get_det_offset_params=get_detector_offsets_params, + original_cal =self._inst_settings.cal_adjust) def set_sample_details(self, **kwargs): kwarg_name = "sample" diff --git a/scripts/Diffraction/isis_powder/gem_routines/gem_advanced_config.py b/scripts/Diffraction/isis_powder/gem_routines/gem_advanced_config.py index 5039665eeded09d06b8fc0a1ef75bb27c49d2bed..7e59abb1ba6e4546208579d5e36dad697f15bd86 100644 --- a/scripts/Diffraction/isis_powder/gem_routines/gem_advanced_config.py +++ b/scripts/Diffraction/isis_powder/gem_routines/gem_advanced_config.py @@ -111,7 +111,7 @@ texture_mode_off ={"focused_cropping_values": focused_cropping_values, calibration_params = { "create_cal_rebin_1_params": "100,-0.0006,19950", - "create_cal_rebin_2_params": "1,0.002,1.3", + "create_cal_rebin_2_params": "1.05,0.002,1.3", "create_cal_cross_correlate_params": { "cross_corr_reference_spectra": 5000, "cross_corr_ws_index_min": 11, diff --git a/scripts/Diffraction/isis_powder/gem_routines/gem_calibration_algs.py b/scripts/Diffraction/isis_powder/gem_routines/gem_calibration_algs.py index bfd316acb74d0c5954ef0dfcf4add31b38a6ce4d..c5c31ffcf88b9212734d701a22aa446082498dd3 100644 --- a/scripts/Diffraction/isis_powder/gem_routines/gem_calibration_algs.py +++ b/scripts/Diffraction/isis_powder/gem_routines/gem_calibration_algs.py @@ -1,5 +1,6 @@ from __future__ import (absolute_import, division, print_function) +import csv import os import mantid.simpleapi as mantid import isis_powder.routines.common as common @@ -24,9 +25,44 @@ def create_calibration(calibration_runs, instrument, offset_file_name, grouping_ input_batching=INPUT_BATCHING.Summed) input_ws = input_ws_list[0] - calibration_ws = mantid.Rebin(InputWorkspace=input_ws, Params=rebin_1_params) + focused = _calibration_processing(calibration_dir, calibration_runs, cross_correlate_params, get_det_offset_params, + grouping_file_name, input_ws, instrument, offset_file_name, rebin_1_params, + rebin_2_params) + return focused + + +def adjust_calibration(calibration_runs, instrument, offset_file_name, grouping_file_name, calibration_dir, + rebin_1_params, rebin_2_params, cross_correlate_params, get_det_offset_params, original_cal): + """ + Create a calibration file from (usually) a ceria run + :param calibration_runs: Run number(s) for this run + :param instrument: The GEM instrument object + :param offset_file_name: Name of the file to write detector offset information to + :param grouping_file_name: Name of grouping calibration file + :param calibration_dir: Path to directory containing calibration information + :param rebin_1_params: Parameters for the first rebin step (as a string in the usual format) + :param rebin_2_params: Parameters for the second rebin step (as a string in the usual format) + :param cross_correlate_params: Parameters for CrossCorrelate (as a dictionary PropertyName: PropertyValue) + :param get_det_offset_params: Parameters for GetDetectorOffsets (as a dictionary PropertyName: PropertyValue) + """ + input_ws_list = common.load_current_normalised_ws_list(run_number_string=calibration_runs, instrument=instrument, + input_batching=INPUT_BATCHING.Summed) + + input_ws = input_ws_list[0] + input_ws = mantid.AlignDetectors(InputWorkspace=input_ws, CalibrationFile=original_cal) + offset_file = os.path.join(calibration_dir, offset_file_name) + focused = _calibration_processing(calibration_dir, calibration_runs, cross_correlate_params, get_det_offset_params, + grouping_file_name, input_ws, instrument, offset_file, rebin_1_params, + rebin_2_params) + _adjust_cal_file(original_cal, offset_file) + return focused + +def _calibration_processing(calibration_dir, calibration_runs, cross_correlate_params, get_det_offset_params, + grouping_file_name, input_ws, instrument, offset_file, rebin_1_params, rebin_2_params): + calibration_ws = input_ws if calibration_ws.getAxis(0).getUnit().unitID() != WORKSPACE_UNITS.d_spacing: + calibration_ws = mantid.Rebin(InputWorkspace=input_ws, Params=rebin_1_params) calibration_ws = mantid.ConvertUnits(InputWorkspace=calibration_ws, Target="dSpacing") spectrum_list = [] for i in range(0, calibration_ws.getNumberHistograms()): @@ -39,23 +75,36 @@ def create_calibration(calibration_runs, instrument, offset_file_name, grouping_ spectrum_list.append(i) calibration_ws = mantid.ExtractSpectra(InputWorkspace=calibration_ws, WorkspaceIndexList=spectrum_list) rebinned = mantid.Rebin(InputWorkspace=calibration_ws, Params=rebin_2_params) - cross_correlated = mantid.CrossCorrelate(InputWorkspace=rebinned, **cross_correlate_params) - offset_file = os.path.join(calibration_dir, offset_file_name) # Offsets workspace must be referenced as string so it can be deleted, as simpleapi doesn't recognise it as a ws offsets_ws_name = "offsets" mantid.GetDetectorOffsets(InputWorkspace=cross_correlated, GroupingFileName=offset_file, OutputWorkspace=offsets_ws_name, **get_det_offset_params) - rebinned_tof = mantid.ConvertUnits(InputWorkspace=rebinned, Target="TOF") aligned = mantid.AlignDetectors(InputWorkspace=rebinned_tof, CalibrationFile=offset_file) - grouping_file = os.path.join(calibration_dir, grouping_file_name) focused = mantid.DiffractionFocussing(InputWorkspace=aligned, GroupingFileName=grouping_file, OutputWorkspace=instrument._generate_output_file_name(calibration_runs) - + "_grouped") + + "_grouped") print("Saved cal file to " + offset_file) - common.remove_intermediate_workspace([calibration_ws, rebinned, cross_correlated, rebinned_tof, aligned, + common.remove_intermediate_workspace([calibration_ws, rebinned, cross_correlated, rebinned_tof, offsets_ws_name]) return focused + + +def _adjust_cal_file(original_cal, generated_cal): + origin_ws = "origin{}" + gen_ws = "newCal{}" + out_ws = "adjusted_cal" + mantid.LoadCalFile(InstrumentName="Gem", MakeGroupingWorkspace=False, MakeMaskWorkspace=False, + MakeOffsetsWorkspace=True, WorkspaceName=origin_ws.format(''), CalFilename=original_cal) + mantid.LoadCalFile(InstrumentName="Gem", MakeGroupingWorkspace=False, MakeMaskWorkspace=False, + MakeOffsetsWorkspace=True, WorkspaceName=gen_ws.format(''), CalFilename=generated_cal) + mantid.Plus(LHSWorkspace=origin_ws.format("_offsets"), RHSWorkspace=gen_ws.format("_offsets"), + OutputWorkspace=out_ws) + mantid.SaveCalFile(OffsetsWorkspace=out_ws, Filename=generated_cal) + common.remove_intermediate_workspace([origin_ws.format("_offsets"), gen_ws.format("_offsets"), + origin_ws.format("_cal"), gen_ws.format("_cal")]) + + diff --git a/scripts/Diffraction/isis_powder/gem_routines/gem_param_mapping.py b/scripts/Diffraction/isis_powder/gem_routines/gem_param_mapping.py index 58f16cd25823403c08f83ea889f00b8f36ecfe06..b0aa3cd085cce00bde2f5443853e910733d99562 100644 --- a/scripts/Diffraction/isis_powder/gem_routines/gem_param_mapping.py +++ b/scripts/Diffraction/isis_powder/gem_routines/gem_param_mapping.py @@ -13,6 +13,7 @@ from isis_powder.routines.common_enums import INPUT_BATCHING, WORKSPACE_UNITS # Maps friendly user name (ext_name) -> script name (int_name) attr_mapping = \ [ + ParamMapEntry(ext_name="calibration_to_adjust", int_name="cal_adjust", optional=True), ParamMapEntry(ext_name="calibration_directory", int_name="calibration_dir"), ParamMapEntry(ext_name="calibration_mapping_file", int_name="cal_mapping_path"), ParamMapEntry(ext_name="config_file", int_name="config_file"),