From d69fee13e25bd4322e13f1d067ca780fbef3414f Mon Sep 17 00:00:00 2001 From: David Fairbrother <DavidFair@users.noreply.github.com> Date: Tue, 22 Nov 2016 16:35:17 +0000 Subject: [PATCH] Re #17949 Fingerprint calibrated runs and use POL cal lookup --- .../Diffraction/isis_powder/abstract_inst.py | 9 +- scripts/Diffraction/isis_powder/pearl.py | 8 ++ scripts/Diffraction/isis_powder/polaris.py | 93 +++++++++++-------- .../polaris_routines/polaris_calibration.yaml | 18 +++- .../isis_powder/routines/calibrate.py | 6 +- 5 files changed, 84 insertions(+), 50 deletions(-) diff --git a/scripts/Diffraction/isis_powder/abstract_inst.py b/scripts/Diffraction/isis_powder/abstract_inst.py index 4e9a049da25..ba63cd129f3 100644 --- a/scripts/Diffraction/isis_powder/abstract_inst.py +++ b/scripts/Diffraction/isis_powder/abstract_inst.py @@ -77,8 +77,8 @@ class AbstractInst(object): self._create_calibration_silicon(calibration_runs=calibration_runs, cal_file_name=cal_file_name, grouping_file_name=grouping_file_name) - def create_calibration_vanadium(self, vanadium_runs, empty_runs, output_file_name=None, num_of_splines=None, - do_absorb_corrections=True, gen_absorb_correction=False): + def _create_calibration_vanadium(self, vanadium_runs, empty_runs, output_file_name=None, num_of_splines=None, + do_absorb_corrections=True, gen_absorb_correction=False): calibrate.create_van(instrument=self, van=vanadium_runs, empty=empty_runs, output_van_file_name=output_file_name, num_of_splines=num_of_splines, absorb=do_absorb_corrections, gen_absorb=gen_absorb_correction) @@ -222,16 +222,13 @@ class AbstractInst(object): return True # TODO set this to False if they just dump their raw files in one folder - def _calculate_solid_angle_efficiency_corrections(self, vanadium_ws): - return _empty_hook_return_none() - def _do_tof_rebinning_focus(self, input_workspace): return input_workspace def _process_focus_output(self, processed_spectra, run_details, attenuate=False): return _empty_hook_return_none() - def apply_solid_angle_efficiency_corr(self, ws_to_correct, vanadium_number=None, run_details=None): + def apply_solid_angle_efficiency_corr(self, ws_to_correct, run_details): return ws_to_correct def _apply_van_calibration_tof_rebinning(self, vanadium_ws, tof_rebin_pass, return_units): diff --git a/scripts/Diffraction/isis_powder/pearl.py b/scripts/Diffraction/isis_powder/pearl.py index d315ce3466f..d6996c9e5f0 100644 --- a/scripts/Diffraction/isis_powder/pearl.py +++ b/scripts/Diffraction/isis_powder/pearl.py @@ -53,6 +53,14 @@ class Pearl(AbstractInst): return self._focus(run_number=run_number, do_attenuation=do_attenuation, do_van_normalisation=do_van_normalisation) + def create_calibration_vanadium(self, vanadium_runs, empty_runs, output_file_name=None, num_of_splines=None, + do_absorb_corrections=True, gen_absorb_correction=False): + + self._create_calibration_vanadium(vanadium_runs=vanadium_runs, empty_runs=empty_runs, + output_file_name=output_file_name, num_of_splines=num_of_splines, + do_absorb_corrections=do_absorb_corrections, + gen_absorb_correction=gen_absorb_correction) + # Params # def _get_default_group_names(self): return self._default_group_names diff --git a/scripts/Diffraction/isis_powder/polaris.py b/scripts/Diffraction/isis_powder/polaris.py index 9bc41770fe4..f3c2c8216d9 100644 --- a/scripts/Diffraction/isis_powder/polaris.py +++ b/scripts/Diffraction/isis_powder/polaris.py @@ -40,6 +40,12 @@ class Polaris(AbstractInst): return self._focus(run_number=run_number, 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): + run_details = self._get_run_details(run_number=int(run_in_range)) + self._create_calibration_vanadium(vanadium_runs=run_details.vanadium, empty_runs=run_details.sample_empty, + do_absorb_corrections=do_absorb_corrections, + gen_absorb_correction=gen_absorb_correction) + # Abstract implementation def _get_lambda_range(self): return self._lower_lambda_range, self._upper_lambda_range @@ -64,8 +70,8 @@ class Polaris(AbstractInst): empty_runs = chopper_config["empty_run_numbers"] vanadium_runs = chopper_config["vanadium_run_numbers"] - solid_angle_file_name = "SAC_" + vanadium_runs - splined_vanadium_name = "SplinedVan_" + vanadium_runs + solid_angle_file_name = self._generate_solid_angle_file_name(vanadium_run_string=vanadium_runs) + splined_vanadium_name = self._generate_splined_van_name(vanadium_run_string=vanadium_runs) cycle = configuration["label"] calibration_dir = os.path.join(self.calibration_dir, cycle) @@ -104,34 +110,12 @@ class Polaris(AbstractInst): normalised_ws = mantid.NormaliseByCurrent(InputWorkspace=ws_to_correct) return normalised_ws - def _calculate_solid_angle_efficiency_corrections(self, vanadium_ws): - solid_angle_ws = mantid.SolidAngle(InputWorkspace=vanadium_ws) - solid_angle_multiplicand = mantid.CreateSingleValuedWorkspace(DataValue=str(100)) - solid_angle_ws = mantid.Multiply(LHSWorkspace=solid_angle_ws, RHSWorkspace=solid_angle_multiplicand) - common.remove_intermediate_workspace(solid_angle_multiplicand) - - efficiency_ws = mantid.Divide(LHSWorkspace=vanadium_ws, RHSWorkspace=solid_angle_ws) - efficiency_ws = mantid.ConvertUnits(InputWorkspace=efficiency_ws, Target="Wavelength") - efficiency_ws = mantid.Integration(InputWorkspace=efficiency_ws) - - corrections_ws = mantid.Multiply(LHSWorkspace=solid_angle_ws, RHSWorkspace=efficiency_ws) - corrections_divisor_ws = mantid.CreateSingleValuedWorkspace(DataValue=str(100000)) - corrections_ws = mantid.Divide(LHSWorkspace=corrections_ws, RHSWorkspace=corrections_divisor_ws) - - common.remove_intermediate_workspace(corrections_divisor_ws) - common.remove_intermediate_workspace(solid_angle_ws) - common.remove_intermediate_workspace(efficiency_ws) - - return corrections_ws - - def apply_solid_angle_efficiency_corr(self, ws_to_correct, vanadium_number=None, run_details=None): + def apply_solid_angle_efficiency_corr(self, ws_to_correct, run_details): if not self._apply_solid_angle: return ws_to_correct - assert(vanadium_number or run_details) - if not run_details or not os.path.isfile(run_details.solid_angle_corr): - corrections = self.generate_solid_angle_corrections(run_details, vanadium_number) + corrections = self.generate_solid_angle_corrections(run_details) else: corrections = mantid.Load(Filename=run_details.solid_angle_corr) @@ -141,19 +125,12 @@ class Polaris(AbstractInst): ws_to_correct = corrected_ws return ws_to_correct - def generate_solid_angle_corrections(self, run_details, vanadium_number): - if vanadium_number: - solid_angle_vanadium_ws = common.load_current_normalised_ws(run_number_string=vanadium_number, - instrument=self) - elif run_details: - solid_angle_vanadium_ws = common.load_current_normalised_ws(run_number_string=run_details.vanadium, - instrument=self) - else: - raise RuntimeError("Got no run_details or vanadium_number in gen solid angle corrections") + def generate_solid_angle_corrections(self, run_details): + solid_angle_vanadium_ws = common.load_current_normalised_ws(run_number_string=run_details.vanadium, + instrument=self) - corrections = self._calculate_solid_angle_efficiency_corrections(solid_angle_vanadium_ws) - if run_details: - mantid.SaveNexusProcessed(InputWorkspace=corrections, Filename=run_details.solid_angle_corr) + corrections = _calculate_solid_angle_efficiency_corrections(solid_angle_vanadium_ws) + mantid.SaveNexusProcessed(InputWorkspace=corrections, Filename=run_details.solid_angle_corr) common.remove_intermediate_workspace(solid_angle_vanadium_ws) return corrections @@ -286,6 +263,25 @@ class Polaris(AbstractInst): mantid.SaveFocusedXYE(InputWorkspace=ws, Filename=full_file_path, SplitFiles=False, IncludeHeader=False) + def _generate_solid_angle_file_name(self, vanadium_run_string): + if self._chopper_on: + return "SAC_chopperOn_" + vanadium_run_string + ".nxs" + else: + return "SAC_chopperOff_" + vanadium_run_string + ".nxs" + + def _generate_splined_van_name(self, vanadium_run_string): + output_string = "SVan_" + str(vanadium_run_string) + "_chopper" + if self._chopper_on: + output_string += "On" + else: + output_string += "Off" + + if self._apply_solid_angle: + output_string += "_SAC" + else: + output_string += "_noSAC" + + return output_string # Class private implementation @@ -351,3 +347,24 @@ def _create_d_spacing_tof_output(processed_spectra): tof_group = mantid.GroupWorkspaces(InputWorkspaces=tof_output, OutputWorkspace=tof_group_name) return d_spacing_group, tof_group + + +def _calculate_solid_angle_efficiency_corrections(vanadium_ws): + solid_angle_ws = mantid.SolidAngle(InputWorkspace=vanadium_ws) + solid_angle_multiplicand = mantid.CreateSingleValuedWorkspace(DataValue=str(100)) + solid_angle_ws = mantid.Multiply(LHSWorkspace=solid_angle_ws, RHSWorkspace=solid_angle_multiplicand) + common.remove_intermediate_workspace(solid_angle_multiplicand) + + efficiency_ws = mantid.Divide(LHSWorkspace=vanadium_ws, RHSWorkspace=solid_angle_ws) + efficiency_ws = mantid.ConvertUnits(InputWorkspace=efficiency_ws, Target="Wavelength") + efficiency_ws = mantid.Integration(InputWorkspace=efficiency_ws) + + corrections_ws = mantid.Multiply(LHSWorkspace=solid_angle_ws, RHSWorkspace=efficiency_ws) + corrections_divisor_ws = mantid.CreateSingleValuedWorkspace(DataValue=str(100000)) + corrections_ws = mantid.Divide(LHSWorkspace=corrections_ws, RHSWorkspace=corrections_divisor_ws) + + common.remove_intermediate_workspace(corrections_divisor_ws) + common.remove_intermediate_workspace(solid_angle_ws) + common.remove_intermediate_workspace(efficiency_ws) + + return corrections_ws diff --git a/scripts/Diffraction/isis_powder/polaris_routines/polaris_calibration.yaml b/scripts/Diffraction/isis_powder/polaris_routines/polaris_calibration.yaml index ca3322c6a63..0ebd74e8c35 100644 --- a/scripts/Diffraction/isis_powder/polaris_routines/polaris_calibration.yaml +++ b/scripts/Diffraction/isis_powder/polaris_routines/polaris_calibration.yaml @@ -12,14 +12,26 @@ vanadium_run_numbers : "78338" empty_run_numbers : "78339" +93104-93106: + offset_file_name : "offsets_2011_cycle111b.cal" + label : "15_2" + chopper_on: + vanadium_run_numbers : "93105" + empty_run_numbers : "93106" + + chopper_off: + vanadium_run_numbers : "93105" + empty_run_numbers : "93106" -93105-95614: + +95600-95614: # Calibration run offset_file_name : "offsets_2011_cycle111b.cal" - label : "15_2" + label : "16_4" chopper_on: vanadium_run_numbers : "95603-95607,95613-95614" empty_run_numbers : "78339" chopper_off: vanadium_run_numbers : "95603-95607,95613-95614" - empty_run_numbers : "78339" \ No newline at end of file + empty_run_numbers : "78339" + diff --git a/scripts/Diffraction/isis_powder/routines/calibrate.py b/scripts/Diffraction/isis_powder/routines/calibrate.py index 0a15f79096f..008494f8f21 100644 --- a/scripts/Diffraction/isis_powder/routines/calibrate.py +++ b/scripts/Diffraction/isis_powder/routines/calibrate.py @@ -8,10 +8,10 @@ import isis_powder.routines.common as common def create_van(instrument, van, empty, output_van_file_name, num_of_splines, absorb, gen_absorb): - input_van_ws = common.load_current_normalised_ws(run_number_string=van, instrument=instrument) + input_van_ws = common.load_current_normalised_ws(run_number_string=van, instrument=instrument) corrected_van_ws = common.subtract_sample_empty(ws_to_correct=input_van_ws, empty_sample_ws_string=empty, - instrument=instrument) + instrument=instrument) common.remove_intermediate_workspace(input_van_ws) @@ -24,7 +24,7 @@ def create_van(instrument, van, empty, output_van_file_name, num_of_splines, abs CalibrationFile=run_details.calibration) corrected_van_ws = instrument.apply_solid_angle_efficiency_corr(ws_to_correct=corrected_van_ws, - vanadium_number=van) + run_details=run_details) if absorb: corrected_van_ws = _apply_absorb_corrections(instrument=instrument, run_details=run_details, -- GitLab