Skip to content
Snippets Groups Projects
Commit a7f0f4f4 authored by David Fairbrother's avatar David Fairbrother
Browse files

Re #18108 PEARL attenuate for all and trans modes

parent 332f971d
No related merge requests found
......@@ -11,6 +11,7 @@ from isis_powder.pearl_routines import pearl_algs, pearl_output, pearl_advanced_
class Pearl(AbstractInst):
def __init__(self, **kwargs):
basic_config_dict = yaml_parser.open_yaml_file_as_dictionary(kwargs.get("config_file", None))
self._inst_settings = InstrumentSettings.InstrumentSettings(
attr_mapping=pearl_param_mapping.attr_mapping, adv_conf_dict=pearl_advanced_config.get_all_adv_variables(),
basic_conf_dict=basic_config_dict, kwargs=kwargs)
......
......@@ -40,7 +40,8 @@ long_mode_off_params = {
long_mode_on_params = {
"monitor_lambda_crop_range": (5.9, 12.0),
"monitor_integration_range": (6, 10),
# This needs to be greater than the bank TOF cropping values or you will get data that divides to 0/inf
# raw_data_tof_cropping needs to be greater than the bank TOF cropping values or
# you will get data that divides to 0 or inf
"raw_data_tof_cropping": (20280, 39995),
"vanadium_tof_cropping": (20295, 39993),
"tof_cropping_ranges": [
......@@ -83,11 +84,11 @@ variable_help = {
"monitor_integration_range": "The minimum and maximum values to consider whilst integrating the monitor "
"workspace",
"raw_data_tof_cropping": "The crop values for to apply when loading raw data. This step is applied before any "
"processing takes place. This is to crop from 40,000 microseconds windows in the "
"raw data to 20,000 windows in PEARL",
"processing takes place. This is to crop from 40,000 microseconds in the "
"raw data to 20,000 microseconds worth of data",
"tof_cropping_ranges": "These values are used to determine the TOF range to crop a focused (not Vanadium "
"Cal.) workspace to. These are applied on a bank by bank basis. They must be less than "
"the values specified for raw_data_tof_cropping."
"calibration) workspace to. These are applied on a bank by bank basis. They must be "
"less than the values specified for raw_data_tof_cropping."
},
"general_params": {
......
......@@ -11,7 +11,7 @@ def generate_and_save_focus_output(instrument, processed_spectra, run_details, p
output_file_paths = instrument.generate_out_file_paths(run_details=run_details)
if focus_mode == "all":
processed_nexus_files = _focus_mode_all(output_file_paths, processed_spectra)
processed_nexus_files = _focus_mode_all(output_file_paths, processed_spectra, perform_attenuation, instrument)
elif focus_mode == "groups":
processed_nexus_files = _focus_mode_groups(output_file_paths, processed_spectra)
elif focus_mode == "trans":
......@@ -24,6 +24,14 @@ def generate_and_save_focus_output(instrument, processed_spectra, run_details, p
return processed_nexus_files
def _attenuate_workspace(instrument, output_file_paths, ws_to_attenuate):
# Clone a workspace which is not attenuated
no_att = output_file_paths["output_name"] + "_noatten"
mantid.CloneWorkspace(InputWorkspace=ws_to_attenuate, OutputWorkspace=no_att)
ws_to_attenuate = instrument.attenuate_workspace(ws_to_attenuate)
return ws_to_attenuate
def _focus_mode_mods(output_file_paths, calibrated_spectra):
index = 1
append = False
......@@ -41,44 +49,36 @@ def _focus_mode_mods(output_file_paths, calibrated_spectra):
return output_list
def _focus_mode_trans(output_file_paths, atten, instrument, calibrated_spectra):
summed_ws = mantid.CloneWorkspace(InputWorkspace=calibrated_spectra[0])
for i in range(1, 9): # Add workspaces 2-9 to workspace 1
summed_ws = mantid.Plus(LHSWorkspace=summed_ws, RHSWorkspace=calibrated_spectra[i])
summed_ws = mantid.Scale(InputWorkspace=summed_ws, Factor=0.111111111111111)
if atten:
# Clone a workspace which is not attenuated
no_att = output_file_paths["output_name"] + "_noatten"
mantid.CloneWorkspace(InputWorkspace=summed_ws, OutputWorkspace=no_att)
def _focus_mode_all(output_file_paths, processed_spectra, perform_attenuation, instrument):
summed_spectra_name = output_file_paths["output_name"] + "_mods1-9"
summed_spectra = mantid.MergeRuns(InputWorkspaces=processed_spectra[:9], OutputWorkspace=summed_spectra_name)
summed_ws = mantid.ConvertUnits(InputWorkspace=summed_ws, Target="dSpacing")
summed_ws = instrument.attenuate_workspace(summed_ws)
summed_ws = mantid.ConvertUnits(InputWorkspace=summed_ws, Target="TOF")
summed_spectra = mantid.Scale(InputWorkspace=summed_spectra, Factor=0.111111111111111,
OutputWorkspace=summed_spectra_name)
if perform_attenuation:
summed_spectra = _attenuate_workspace(instrument, output_file_paths, summed_spectra)
mantid.SaveGSS(InputWorkspace=summed_ws, Filename=output_file_paths["gss_filename"], Append=False, Bank=1)
mantid.SaveFocusedXYE(InputWorkspace=summed_ws, Filename=output_file_paths["tof_xye_filename"],
Append=False, IncludeHeader=False)
summed_spectra = mantid.ConvertUnits(InputWorkspace=summed_spectra, Target="TOF",
OutputWorkspace=summed_spectra_name)
summed_ws = mantid.ConvertUnits(InputWorkspace=summed_ws, Target="dSpacing")
mantid.SaveGSS(InputWorkspace=summed_spectra, Filename=output_file_paths["gss_filename"], Append=False, Bank=1)
# Rename to user friendly name:
summed_ws_name = output_file_paths["output_name"] + "_mods1-9"
summed_ws = mantid.RenameWorkspace(InputWorkspace=summed_ws, OutputWorkspace=summed_ws_name)
summed_spectra = mantid.ConvertUnits(InputWorkspace=summed_spectra, Target="dSpacing",
OutputWorkspace=summed_spectra_name)
mantid.SaveNexus(Filename=output_file_paths["nxs_filename"], InputWorkspace=summed_spectra, Append=False)
mantid.SaveFocusedXYE(InputWorkspace=summed_ws, Filename=output_file_paths["dspacing_xye_filename"],
Append=False, IncludeHeader=False)
mantid.SaveNexus(InputWorkspace=summed_ws, Filename=output_file_paths["nxs_filename"], Append=False)
output_list = [summed_spectra]
for i in range(0, 5):
spectra_index = (i + 9) # Compensate for 0 based index
ws_to_save = processed_spectra[spectra_index] # Save out workspaces 10/11/12
output_name = output_file_paths["output_name"] + "_mod" + str(spectra_index + 1)
output_list = [summed_ws]
ws_to_save = mantid.ConvertUnits(InputWorkspace=ws_to_save, OutputWorkspace=ws_to_save, Target="TOF")
mantid.SaveGSS(InputWorkspace=ws_to_save, Filename=output_file_paths["gss_filename"], Append=True, Bank=i + 2)
ws_to_save = mantid.ConvertUnits(InputWorkspace=ws_to_save, OutputWorkspace=output_name, Target="dSpacing")
mantid.SaveNexus(Filename=output_file_paths["nxs_filename"], InputWorkspace=ws_to_save, Append=True)
for i in range(0, 9):
workspace_name = output_file_paths["output_name"] + "_mod" + str(i + 1)
to_save = mantid.ConvertUnits(InputWorkspace=calibrated_spectra[i], Target="dSpacing",
OutputWorkspace=workspace_name)
output_list.append(to_save)
mantid.SaveNexus(Filename=output_file_paths["nxs_filename"], InputWorkspace=to_save, Append=True)
output_list.append(ws_to_save)
return output_list
......@@ -121,33 +121,36 @@ def _focus_mode_groups(output_file_paths, calibrated_spectra):
return output_list
def _focus_mode_all(output_file_paths, processed_spectra):
summed_spectra_name = output_file_paths["output_name"] + "_mods1-9"
summed_spectra = mantid.MergeRuns(InputWorkspaces=processed_spectra[:9], OutputWorkspace=summed_spectra_name)
def _focus_mode_trans(output_file_paths, atten, instrument, calibrated_spectra):
summed_ws = mantid.MergeRuns(InputWorkspaces=calibrated_spectra[:9])
summed_ws = mantid.Scale(InputWorkspace=summed_ws, Factor=0.111111111111111)
summed_spectra = mantid.Scale(InputWorkspace=summed_spectra, Factor=0.111111111111111,
OutputWorkspace=summed_spectra_name)
summed_spectra = mantid.ConvertUnits(InputWorkspace=summed_spectra, Target="TOF",
OutputWorkspace=summed_spectra_name)
if atten:
summed_ws = _attenuate_workspace(instrument, output_file_paths, summed_ws)
mantid.SaveGSS(InputWorkspace=summed_spectra, Filename=output_file_paths["gss_filename"], Append=False, Bank=1)
summed_ws = mantid.ConvertUnits(InputWorkspace=summed_ws, Target="TOF")
mantid.SaveGSS(InputWorkspace=summed_ws, Filename=output_file_paths["gss_filename"], Append=False, Bank=1)
mantid.SaveFocusedXYE(InputWorkspace=summed_ws, Filename=output_file_paths["tof_xye_filename"],
Append=False, IncludeHeader=False)
summed_spectra = mantid.ConvertUnits(InputWorkspace=summed_spectra, Target="dSpacing",
OutputWorkspace=summed_spectra_name)
mantid.SaveNexus(Filename=output_file_paths["nxs_filename"], InputWorkspace=summed_spectra, Append=False)
summed_ws = mantid.ConvertUnits(InputWorkspace=summed_ws, Target="dSpacing")
output_list = [summed_spectra]
for i in range(0, 5):
spectra_index = (i + 9) # Compensate for 0 based index
ws_to_save = processed_spectra[spectra_index] # Save out workspaces 10/11/12
output_name = output_file_paths["output_name"] + "_mod" + str(spectra_index + 1)
# Rename to user friendly name:
summed_ws_name = output_file_paths["output_name"] + "_mods1-9"
summed_ws = mantid.RenameWorkspace(InputWorkspace=summed_ws, OutputWorkspace=summed_ws_name)
ws_to_save = mantid.ConvertUnits(InputWorkspace=ws_to_save, OutputWorkspace=ws_to_save, Target="TOF")
mantid.SaveGSS(InputWorkspace=ws_to_save, Filename=output_file_paths["gss_filename"], Append=True, Bank=i + 2)
ws_to_save = mantid.ConvertUnits(InputWorkspace=ws_to_save, OutputWorkspace=output_name, Target="dSpacing")
mantid.SaveNexus(Filename=output_file_paths["nxs_filename"], InputWorkspace=ws_to_save, Append=True)
mantid.SaveFocusedXYE(InputWorkspace=summed_ws, Filename=output_file_paths["dspacing_xye_filename"],
Append=False, IncludeHeader=False)
mantid.SaveNexus(InputWorkspace=summed_ws, Filename=output_file_paths["nxs_filename"], Append=False)
output_list.append(ws_to_save)
output_list = [summed_ws]
for i in range(0, 9):
workspace_name = output_file_paths["output_name"] + "_mod" + str(i + 1)
to_save = mantid.ConvertUnits(InputWorkspace=calibrated_spectra[i], Target="dSpacing",
OutputWorkspace=workspace_name)
output_list.append(to_save)
mantid.SaveNexus(Filename=output_file_paths["nxs_filename"], InputWorkspace=to_save, Append=True)
return output_list
......
......@@ -48,8 +48,7 @@ variable_help = {
"defaulted to off and should be overridden in the basic configuration when necessary to "
"avoid them being performed accidentally.",
"raw_data_cropping_values": "This specifies the valid range in TOF of the raw data. This is applied before any "
"processing takes place to remove negative counts where at very low TOF the empty "
"count => sample count.",
"processing takes place to remove negative counts at very low TOF values",
"spline_coefficient": "The coefficient to use when calculating the vanadium splines during the calibration "
"step."
},
......
......@@ -18,19 +18,10 @@ def focus(run_number, instrument, input_batching, perform_vanadium_norm=True):
def _focus_one_ws(ws, run_number, instrument, perform_vanadium_norm):
run_details = instrument.get_run_details(run_number_string=run_number)
if perform_vanadium_norm:
_test_splined_vanadium_exists(instrument, run_details)
# Check the necessary splined vanadium file has been created
if not os.path.isfile(run_details.splined_vanadium_file_path):
if instrument.can_auto_gen_vanadium_cal():
warnings.warn("\nAttempting to automatically generate vanadium calibration at this path: "
+ str(run_details.splined_vanadium_file_path) + " for these settings.\n")
instrument.generate_auto_vanadium_calibration(run_details=run_details)
else:
ValueError("Processed vanadium runs not found at this path: "
+ str(run_details.splined_vanadium_file_path) +
" \nHave you created a vanadium calibration with these settings yet?\n")
# Compensate for empty sample if specified
# Subtract and crop to largest acceptable TOF range
input_workspace = common.subtract_sample_empty(ws_to_correct=ws, instrument=instrument,
empty_sample_ws_string=run_details.empty_runs)
input_workspace = instrument.crop_raw_to_expected_tof_range(ws_to_crop=input_workspace)
......@@ -52,7 +43,7 @@ def _focus_one_ws(ws, run_number, instrument, perform_vanadium_norm):
# Output
processed_nexus_files = instrument.output_focused_ws(calibrated_spectra, run_details=run_details)
# Tidy
# Tidy workspaces from Mantid
common.remove_intermediate_workspace(input_workspace)
common.remove_intermediate_workspace(focused_ws)
common.remove_intermediate_workspace(calibrated_spectra)
......@@ -60,16 +51,6 @@ def _focus_one_ws(ws, run_number, instrument, perform_vanadium_norm):
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)
return output
def _apply_vanadium_corrections(instrument, run_number, input_workspace, perform_vanadium_norm):
run_details = instrument.get_run_details(run_number_string=run_number)
converted_ws = mantid.ConvertUnits(InputWorkspace=input_workspace, OutputWorkspace=input_workspace, Target="TOF")
......@@ -84,6 +65,16 @@ def _apply_vanadium_corrections(instrument, run_number, input_workspace, perform
return processed_spectra
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)
return output
def _divide_by_vanadium_splines(spectra_list, spline_file_path):
vanadium_ws_list = mantid.LoadNexus(Filename=spline_file_path)
output_list = []
......@@ -104,3 +95,16 @@ def _individual_run_focusing(input_batching, instrument, perform_vanadium_norm,
output = _focus_one_ws(ws=ws[0], run_number=run, instrument=instrument,
perform_vanadium_norm=perform_vanadium_norm)
return output
def _test_splined_vanadium_exists(instrument, run_details):
# Check the necessary splined vanadium file has been created
if not os.path.isfile(run_details.splined_vanadium_file_path):
if instrument.can_auto_gen_vanadium_cal():
warnings.warn("\nAttempting to automatically generate vanadium calibration at this path: "
+ str(run_details.splined_vanadium_file_path) + " for these settings.\n")
instrument.generate_auto_vanadium_calibration(run_details=run_details)
else:
ValueError("Processed vanadium runs not found at this path: "
+ str(run_details.splined_vanadium_file_path) +
" \nHave you created a vanadium calibration with these settings yet?\n")
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment