Skip to content

Commit

Permalink
Add support for multiple OSIRIS and IRIS files (#422)
Browse files Browse the repository at this point in the history
  • Loading branch information
Pasarus authored Nov 21, 2024
1 parent 444aaea commit c5befd2
Show file tree
Hide file tree
Showing 4 changed files with 18 additions and 346 deletions.
4 changes: 2 additions & 2 deletions fia_api/scripts/transforms/iris_transform.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,8 @@ def apply(self, script: PreScript, job: Job) -> None:
else f"[{job.inputs['input_runs']}]" # type: ignore
)
continue
if line.startswith("calibration_run_number ="):
lines[index] = f"calibration_run_number = \"{job.inputs['calibration_run_number']}\"" # type: ignore
if line.startswith("calibration_run_numbers ="):
lines[index] = f"calibration_run_numbers = [{job.inputs['calibration_run_numbers']}]" # type: ignore
continue
if line.startswith("cycle ="):
lines[index] = f"cycle = \"{job.inputs['cycle_string']}\"" # type: ignore
Expand Down
4 changes: 2 additions & 2 deletions fia_api/scripts/transforms/osiris_transform.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,8 @@ def apply(self, script: PreScript, job: Job) -> None:
else f"[{job.inputs['input_runs']}]" # type: ignore
)
continue
if line.startswith("calibration_run_number ="):
lines[index] = f"calibration_run_number = \"{job.inputs['calibration_run_number']}\"" # type: ignore
if line.startswith("calibration_run_numbers ="):
lines[index] = f"calibration_run_numbers = [{job.inputs['calibration_run_numbers']}]" # type: ignore
continue
if line.startswith("cycle ="):
lines[index] = f"cycle = \"{job.inputs['cycle_string']}\"" # type: ignore
Expand Down
186 changes: 7 additions & 179 deletions test/scripts/transforms/test_iris_transform.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ def generate_input_path_for_run(run_number, cycle):
# To change by automatic script
input_runs = [105277]
calibration_run_number = "105277"
calibration_run_numbers = [105313, 105315, 105317]
cycle = "cycle_24_3"
analyser = "graphite"
reflection = "002"
Expand All @@ -35,98 +35,12 @@ def generate_input_path_for_run(run_number, cycle):
spec_spectra_range = "3,53"
diff_spectra_range = '105,112'
unit_x = "DeltaE"
fold_multiple_frames = False
sum_runs = len(input_runs) > 1
input_file_paths = ""
for input_run in input_runs:
input_file_paths += ", " + generate_input_path_for_run(input_run, cycle)
input_file_paths = input_file_paths[2:] # Slice out the excess ", "
print(input_file_paths)
output = []
# Generate calibration workspace function
def generate_spec_calibration_workspace():
resolution = \
instrument_workspace.getInstrument().getComponentByName(analyser).getNumberParameter("resolution", True)[0]
x = [-6 * resolution, -5 * resolution, -2 * resolution, 0, 2 * resolution]
y = [1, 2, 3, 4]
e = [0, 0, 0, 0]
energy_workspace = CreateWorkspace(DataX=x, DataY=y, DataE=e, NSpec=1, UnitX="DeltaE",
OutputWorkspace="energy_workspace")
energy_workspace = ConvertToHistogram(InputWorkspace="energy_workspace", OutputWorkspace="energy_workspace")
LoadInstrument(Workspace="energy_workspace", InstrumentName=instrument, RewriteSpectraMap=True)
LoadParameterFile(Filename=parameter_filename, Workspace="energy_workspace")
spectra_min = energy_workspace.getInstrument().getNumberParameter("spectra-min")[0]
spectrum = energy_workspace.getSpectrum(0)
spectrum.setSpectrumNo(int(spectra_min))
spectrum.clearDetectorIDs()
spectrum.addDetectorID(int(spectra_min))
tof_workspace = ConvertUnits(InputWorkspace="energy_workspace", OutputWorkspace="tof_workspace", Target="TOF",
EMode="Indirect", EFixed=efixed)
tof_data = tof_workspace.readX(0)
calibration_input_files = "IRIS" + calibration_run_number + ".nxs"
peak_range = f"{tof_data[0]},{tof_data[2]}"
background_range = f"{tof_data[3]},{tof_data[4]}"
calibration_workspace_name = instrument.lower() + calibration_run_number + "_" + analyser + reflection + "_calib"
return IndirectCalibration(InputFiles=calibration_input_files, DetectorRange=spec_spectra_range,
PeakRange=peak_range, BackgroundRange=background_range, ScaleByFactor=0, ScaleFactor=1,
LoadLogFiles=0, OutputWorkspace=calibration_workspace_name)
def save_workspace(workspace):
save_file_name = f"{workspace.name()}.nxs"
save_path = f"/output/{save_file_name}"
SaveNexusProcessed(workspace, save_path)
output.append(save_file_name)
# Perform the reduction
calibration_workspace = generate_spec_calibration_workspace()
output_workspace_prefix = instrument
if len(input_runs) > 6:
output_workspace_prefix += input_runs[0] + ","
output_workspace_prefix += input_runs[1] + ","
output_workspace_prefix += input_runs[2] + ","
output_workspace_prefix += "..."
output_workspace_prefix += input_runs[-3] + ","
output_workspace_prefix += input_runs[-2] + ","
output_workspace_prefix += input_runs[-1] + ","
else:
for input_run in input_runs:
output_workspace_prefix += str(input_run) + ","
output_workspace_prefix = output_workspace_prefix[
:-1] + f"_{analyser}_{reflection}_Reduced" # Slice out the excess "," and finalize prefix
output_spec_ws_individual = ISISIndirectEnergyTransferWrapper(
OutputWorkspace=output_workspace_prefix + "-individual", GroupingMethod="Individual",
InputFiles=input_file_paths, SumFiles=sum_runs, CalibrationWorkspace=calibration_workspace,
Instrument=instrument, Analyser=analyser, Reflection=reflection, EFixed=efixed, SpectraRange=spec_spectra_range,
FoldMultipleFrames=fold_multiple_frames, UnitX=unit_x)
save_workspace(output_spec_ws_individual)
output_spec_ws_all = ISISIndirectEnergyTransferWrapper(OutputWorkspace=output_workspace_prefix + "-all",
GroupingMethod="All", InputFiles=input_file_paths,
SumFiles=sum_runs,
CalibrationWorkspace=calibration_workspace,
Instrument=instrument, Analyser=analyser,
Reflection=reflection, EFixed=efixed,
SpectraRange=spec_spectra_range,
FoldMultipleFrames=fold_multiple_frames, UnitX=unit_x)
save_workspace(output_spec_ws_all)
output_diffspec_ws = ISISIndirectDiffractionReduction(InputFiles=input_file_paths, Instrument=instrument,
SpectraRange=diff_spectra_range,
OutputWorkspace=f"{instrument}{input_runs[0]}_diffspec_red")
save_workspace(output_diffspec_ws)"""
fold_multiple_frames = False"""


def create_expected_script(
input_runs,
calibration_run_number,
calibration_run_numbers,
cycle,
analyser,
reflection,
Expand All @@ -141,7 +55,7 @@ def generate_input_path_for_run(run_number, cycle):
# To change by automatic script
input_runs = {input_runs}
calibration_run_number = "{calibration_run_number}"
calibration_run_numbers = [{calibration_run_numbers}]
cycle = "{cycle}"
analyser = "{analyser}"
reflection = "{reflection}"
Expand All @@ -161,101 +75,15 @@ def generate_input_path_for_run(run_number, cycle):
spec_spectra_range = "3,53"
diff_spectra_range = '105,112'
unit_x = "DeltaE"
fold_multiple_frames = False
sum_runs = len(input_runs) > 1
input_file_paths = ""
for input_run in input_runs:
input_file_paths += ", " + generate_input_path_for_run(input_run, cycle)
input_file_paths = input_file_paths[2:] # Slice out the excess ", "
print(input_file_paths)
output = []
# Generate calibration workspace function
def generate_spec_calibration_workspace():
resolution = \
instrument_workspace.getInstrument().getComponentByName(analyser).getNumberParameter("resolution", True)[0]
x = [-6 * resolution, -5 * resolution, -2 * resolution, 0, 2 * resolution]
y = [1, 2, 3, 4]
e = [0, 0, 0, 0]
energy_workspace = CreateWorkspace(DataX=x, DataY=y, DataE=e, NSpec=1, UnitX="DeltaE",
OutputWorkspace="energy_workspace")
energy_workspace = ConvertToHistogram(InputWorkspace="energy_workspace", OutputWorkspace="energy_workspace")
LoadInstrument(Workspace="energy_workspace", InstrumentName=instrument, RewriteSpectraMap=True)
LoadParameterFile(Filename=parameter_filename, Workspace="energy_workspace")
spectra_min = energy_workspace.getInstrument().getNumberParameter("spectra-min")[0]
spectrum = energy_workspace.getSpectrum(0)
spectrum.setSpectrumNo(int(spectra_min))
spectrum.clearDetectorIDs()
spectrum.addDetectorID(int(spectra_min))
tof_workspace = ConvertUnits(InputWorkspace="energy_workspace", OutputWorkspace="tof_workspace", Target="TOF",
EMode="Indirect", EFixed=efixed)
tof_data = tof_workspace.readX(0)
calibration_input_files = "IRIS" + calibration_run_number + ".nxs"
peak_range = f"{{tof_data[0]}},{{tof_data[2]}}"
background_range = f"{{tof_data[3]}},{{tof_data[4]}}"
calibration_workspace_name = instrument.lower() + calibration_run_number + "_" + analyser + reflection + "_calib"
return IndirectCalibration(InputFiles=calibration_input_files, DetectorRange=spec_spectra_range,
PeakRange=peak_range, BackgroundRange=background_range, ScaleByFactor=0, ScaleFactor=1,
LoadLogFiles=0, OutputWorkspace=calibration_workspace_name)
def save_workspace(workspace):
save_file_name = f"{{workspace.name()}}.nxs"
save_path = f"/output/{{save_file_name}}"
SaveNexusProcessed(workspace, save_path)
output.append(save_file_name)
# Perform the reduction
calibration_workspace = generate_spec_calibration_workspace()
output_workspace_prefix = instrument
if len(input_runs) > 6:
output_workspace_prefix += input_runs[0] + ","
output_workspace_prefix += input_runs[1] + ","
output_workspace_prefix += input_runs[2] + ","
output_workspace_prefix += "..."
output_workspace_prefix += input_runs[-3] + ","
output_workspace_prefix += input_runs[-2] + ","
output_workspace_prefix += input_runs[-1] + ","
else:
for input_run in input_runs:
output_workspace_prefix += str(input_run) + ","
output_workspace_prefix = output_workspace_prefix[
:-1] + f"_{{analyser}}_{{reflection}}_Reduced" # Slice out the excess "," and finalize prefix
output_spec_ws_individual = ISISIndirectEnergyTransferWrapper(
OutputWorkspace=output_workspace_prefix + "-individual", GroupingMethod="Individual",
InputFiles=input_file_paths, SumFiles=sum_runs, CalibrationWorkspace=calibration_workspace,
Instrument=instrument, Analyser=analyser, Reflection=reflection, EFixed=efixed, SpectraRange=spec_spectra_range,
FoldMultipleFrames=fold_multiple_frames, UnitX=unit_x)
save_workspace(output_spec_ws_individual)
output_spec_ws_all = ISISIndirectEnergyTransferWrapper(OutputWorkspace=output_workspace_prefix + "-all",
GroupingMethod="All", InputFiles=input_file_paths,
SumFiles=sum_runs,
CalibrationWorkspace=calibration_workspace,
Instrument=instrument, Analyser=analyser,
Reflection=reflection, EFixed=efixed,
SpectraRange=spec_spectra_range,
FoldMultipleFrames=fold_multiple_frames, UnitX=unit_x)
save_workspace(output_spec_ws_all)
output_diffspec_ws = ISISIndirectDiffractionReduction(InputFiles=input_file_paths, Instrument=instrument,
SpectraRange=diff_spectra_range,
OutputWorkspace=f"{{instrument}}{{input_runs[0]}}_diffspec_red")
save_workspace(output_diffspec_ws)"""
fold_multiple_frames = False"""


def test_iris_transform_spectroscopy():
"""Test spectroscopy transform"""
job = Mock()
job.inputs = {
"input_runs": [1, 2, 3],
"calibration_run_number": "0123456",
"calibration_run_numbers": "105313, 105315, 105317",
"cycle_string": "cycle_1_2",
"analyser": "graphite",
"reflection": "002",
Expand All @@ -265,7 +93,7 @@ def test_iris_transform_spectroscopy():

assert script.value == create_expected_script(
input_runs="[1, 2, 3]",
calibration_run_number="0123456",
calibration_run_numbers="105313, 105315, 105317",
cycle="cycle_1_2",
analyser="graphite",
reflection="002",
Expand Down
Loading

0 comments on commit c5befd2

Please sign in to comment.