-
Karl Palmen authored
Merge to ensure CrystalFieldFunction is available and up to date.
Karl Palmen authoredMerge to ensure CrystalFieldFunction is available and up to date.
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
ISIS_PowderPolarisTest.py 6.08 KiB
from __future__ import (absolute_import, division, print_function)
import os
import stresstesting
import shutil
import mantid.simpleapi as mantid
from mantid import config
from isis_powder import Polaris
DIRS = config['datasearch.directories'].split(';')
# Setup various path details
inst_name = "POLARIS"
# Relative to system data folder
working_folder_name = "ISIS_Powder"
# Relative to working folder
input_folder_name = "input"
output_folder_name = "output"
# Relative to input folder
calibration_folder_name = os.path.join("calibration", inst_name.lower())
calibration_map_rel_path = os.path.join("yaml_files", "polaris_system_test_mapping.yaml")
spline_rel_path = os.path.join("17_1", "VanSplined_98532_cycle_16_3_silicon_all_spectra.cal.nxs")
unsplined_van_rel_path = os.path.join("17_1", "Van_98532_cycle_16_3_silicon_all_spectra.cal.nxs")
# Generate paths for the tests
# This implies DIRS[0] is the system test data folder
working_dir = os.path.join(DIRS[0], working_folder_name)
input_dir = os.path.join(working_dir, input_folder_name)
output_dir = os.path.join(working_dir, output_folder_name)
calibration_map_path = os.path.join(input_dir, calibration_map_rel_path)
calibration_dir = os.path.join(input_dir, calibration_folder_name)
spline_path = os.path.join(calibration_dir, spline_rel_path)
unsplined_van_path = os.path.join(calibration_dir, unsplined_van_rel_path)
class CreateVanadiumTest(stresstesting.MantidStressTest):
calibration_results = None
existing_config = config['datasearch.directories']
def requiredFiles(self):
return _gen_required_files()
def runTest(self):
setup_mantid_paths()
self.calibration_results = run_vanadium_calibration()
def validate(self):
return calibration_validator(self.calibration_results)
def cleanup(self):
try:
_try_delete(output_dir)
_try_delete(spline_path)
finally:
mantid.mtd.clear()
config['datasearch.directories'] = self.existing_config
class FocusTest(stresstesting.MantidStressTest):
focus_results = None
existing_config = config['datasearch.directories']
def requiredFiles(self):
return _gen_required_files()
def runTest(self):
# Gen vanadium calibration first
setup_mantid_paths()
self.focus_results = run_focus()
def validate(self):
return focus_validation(self.focus_results)
def cleanup(self):
try:
_try_delete(spline_path)
_try_delete(output_dir)
finally:
config['datasearch.directories'] = self.existing_config
mantid.mtd.clear()
def _gen_required_files():
required_run_numbers = ["98531", "98532", # create_van : PDF mode
"98533"] # File to focus (Si)
# Generate file names of form "INSTxxxxx.nxs"
input_files = [os.path.join(input_dir, (inst_name + "000" + number + ".nxs")) for number in required_run_numbers]
input_files.append(calibration_map_path)
return input_files
def run_vanadium_calibration():
vanadium_run = 98532 # Choose arbitrary run in the cycle 17_1
pdf_inst_obj = setup_inst_object(mode="PDF")
# Run create vanadium twice to ensure we get two different output splines / files
pdf_inst_obj.create_vanadium(first_cycle_run_no=vanadium_run,
do_absorb_corrections=True, multiple_scattering=False)
# Check the spline looks good and was saved
if not os.path.exists(spline_path):
raise RuntimeError("Could not find output spline at the following path: " + spline_path)
splined_ws = mantid.Load(Filename=spline_path)
unsplined_ws = mantid.Load(Filename=unsplined_van_path)
return splined_ws, unsplined_ws
def run_focus():
run_number = 98533
sample_empty = 98532 # Use the vanadium empty again to make it obvious
sample_empty_scale = 0.5 # Set it to 50% scale
# Copy the required splined file into place first (instead of relying on generated one)
splined_file_name = "POLARIS00098532_splined.nxs"
original_splined_path = os.path.join(input_dir, splined_file_name)
shutil.copy(original_splined_path, spline_path)
inst_object = setup_inst_object(mode="PDF")
return inst_object.focus(run_number=run_number, input_mode="Individual", do_van_normalisation=True,
do_absorb_corrections=False, sample_empty=sample_empty,
sample_empty_scale=sample_empty_scale)
def calibration_validator(results):
splined_ws, unsplined_ws = results
# Get the name of the grouped workspace list
splined_reference_file_name = "ISIS_Powder-POLARIS00098533_splined.nxs"
unsplined_reference_file_name = "ISIS_Powder-POLARIS00098533_unsplined.nxs"
return _compare_ws(reference_file_name=splined_reference_file_name, results=splined_ws) and \
_compare_ws(reference_file_name=unsplined_reference_file_name, results=unsplined_ws)
def focus_validation(results):
reference_file_name = "ISIS_Powder-POLARIS98533_FocusSempty.nxs"
return _compare_ws(reference_file_name=reference_file_name, results=results)
def _compare_ws(reference_file_name, results):
ref_ws = mantid.Load(Filename=reference_file_name)
is_valid = len(results) > 0
for ws, ref in zip(results, ref_ws):
if not (mantid.CompareWorkspaces(Workspace1=ws, Workspace2=ref)):
is_valid = False
print (ws.getName() + " was not equal to: " + ref.getName())
return is_valid
def setup_mantid_paths():
config['datasearch.directories'] += ";" + input_dir
def setup_inst_object(mode):
user_name = "Test"
inst_obj = Polaris(user_name=user_name, calibration_mapping_file=calibration_map_path,
calibration_directory=calibration_dir, output_directory=output_dir, mode=mode)
return inst_obj
def _try_delete(path):
try:
# Use this instead of os.remove as we could be passed a non-empty dir
if os.path.isdir(path):
shutil.rmtree(path)
else:
os.remove(path)
except OSError:
print ("Could not delete output file at: ", path)