From 5691246d79eaa166dace4e2bffde0b853de3470e Mon Sep 17 00:00:00 2001
From: David Fairbrother <DavidFair@users.noreply.github.com>
Date: Tue, 10 Jan 2017 16:02:25 +0000
Subject: [PATCH] Re #18108 POLARIS replace cylinder abs with MayerSampleCorr

---
 .../pearl_routines/pearl_advanced_config.py   |  2 +-
 scripts/Diffraction/isis_powder/polaris.py    |  2 +-
 .../polaris_advanced_config.py                |  2 ++
 .../polaris_routines/polaris_algs.py          | 33 +++++++++++--------
 .../polaris_routines/polaris_param_mapping.py |  1 +
 .../isis_powder/routines/calibrate.py         | 25 ++++----------
 .../isis_powder/routines/common.py            |  6 ++--
 7 files changed, 33 insertions(+), 38 deletions(-)

diff --git a/scripts/Diffraction/isis_powder/pearl_routines/pearl_advanced_config.py b/scripts/Diffraction/isis_powder/pearl_routines/pearl_advanced_config.py
index 80aac7b734b..1ca341e252c 100644
--- a/scripts/Diffraction/isis_powder/pearl_routines/pearl_advanced_config.py
+++ b/scripts/Diffraction/isis_powder/pearl_routines/pearl_advanced_config.py
@@ -40,7 +40,7 @@ long_mode_off_params = {
 long_mode_on_params = {
     "monitor_lambda_crop_range": (5.9, 12.0),
     "monitor_integration_range": (6, 10),
-    # raw_data_tof_cropping needs to be greater than the bank TOF cropping values or
+    # raw_data_tof_cropping needs to be have smaller/larger values 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),
diff --git a/scripts/Diffraction/isis_powder/polaris.py b/scripts/Diffraction/isis_powder/polaris.py
index ff0e333e636..bcfaf8d17a8 100644
--- a/scripts/Diffraction/isis_powder/polaris.py
+++ b/scripts/Diffraction/isis_powder/polaris.py
@@ -97,7 +97,7 @@ class Polaris(AbstractInst):
         return output
 
     def generate_vanadium_absorb_corrections(self, calibration_full_paths, ws_to_match):
-        return polaris_algs.generate_absorb_corrections(ws_to_match=ws_to_match)
+        return polaris_algs.generate_absorb_corrections(ws_to_correct=ws_to_match)
 
     def output_focused_ws(self, processed_spectra, run_details, output_mode=None):
         d_spacing_group, tof_group = polaris_algs.split_into_tof_d_spacing_groups(processed_spectra)
diff --git a/scripts/Diffraction/isis_powder/polaris_routines/polaris_advanced_config.py b/scripts/Diffraction/isis_powder/polaris_routines/polaris_advanced_config.py
index 7fc0682e169..a61b999c064 100644
--- a/scripts/Diffraction/isis_powder/polaris_routines/polaris_advanced_config.py
+++ b/scripts/Diffraction/isis_powder/polaris_routines/polaris_advanced_config.py
@@ -25,7 +25,9 @@ absorption_correction_params = {
     # http://docs.mantidproject.org/nightly/algorithms/CylinderAbsorption-v1.html
     "cylinder_sample_height": 4.0,
     "cylinder_sample_radius": 0.4,
+    "cylinder_position": [0., 0., 0.],
 
+    "chemical_formula": "V",
     "attenuation_cross_section": 4.88350,
     "scattering_cross_section": 5.15775,
     "sample_number_density": 0.0718956,
diff --git a/scripts/Diffraction/isis_powder/polaris_routines/polaris_algs.py b/scripts/Diffraction/isis_powder/polaris_routines/polaris_algs.py
index 54231ddb695..c2e488da243 100644
--- a/scripts/Diffraction/isis_powder/polaris_routines/polaris_algs.py
+++ b/scripts/Diffraction/isis_powder/polaris_routines/polaris_algs.py
@@ -8,21 +8,26 @@ from isis_powder.routines.RunDetails import RunDetails
 from isis_powder.polaris_routines import polaris_advanced_config
 
 
-def generate_absorb_corrections(ws_to_match):
-    absorb_ws = mantid.CloneWorkspace(InputWorkspace=ws_to_match)
-    absorb_dict = polaris_advanced_config.absorption_correction_params
+def generate_absorb_corrections(ws_to_correct):
+    mantid.MaskDetectors(ws_to_correct, SpectraList=list(range(0, 55)))
 
-    absorb_ws = mantid.CylinderAbsorption(InputWorkspace=absorb_ws,
-                                          CylinderSampleHeight=absorb_dict["cylinder_sample_height"],
-                                          CylinderSampleRadius=absorb_dict["cylinder_sample_radius"],
-                                          AttenuationXSection=absorb_dict["attenuation_cross_section"],
-                                          ScatteringXSection=absorb_dict["scattering_cross_section"],
-                                          SampleNumberDensity=absorb_dict["sample_number_density"],
-                                          NumberOfSlices=absorb_dict["number_of_slices"],
-                                          NumberOfAnnuli=absorb_dict["number_of_annuli"],
-                                          NumberOfWavelengthPoints=absorb_dict["number_of_wavelength_points"],
-                                          ExpMethod=absorb_dict["exponential_method"])
-    return absorb_ws
+    absorb_dict = polaris_advanced_config.absorption_correction_params
+    geometry_json = {'Shape': 'Cylinder', 'Height': absorb_dict["cylinder_sample_height"],
+                     'Radius': absorb_dict["cylinder_sample_radius"], 'Center': absorb_dict["cylinder_position"]}
+    material_json = {'AttenuationXSection': absorb_dict["attenuation_cross_section"],
+                     'ChemicalFormula': absorb_dict["chemical_formula"],
+                     'ScatteringXSection':  absorb_dict["scattering_cross_section"],
+                     'SampleNumberDensity': absorb_dict["sample_number_density"]}
+
+    mantid.SetSample(InputWorkspace=ws_to_correct, Geometry=geometry_json, Material=material_json)
+
+    ws_to_correct = mantid.ConvertUnits(InputWorkspace=ws_to_correct, OutputWorkspace=ws_to_correct, Target="TOF")
+    ws_to_correct = mantid.MayersSampleCorrection(InputWorkspace=ws_to_correct, OutputWorkspace=ws_to_correct)
+    ws_to_correct = mantid.ReplaceSpecialValues(InputWorkspace=ws_to_correct, OutputWorkspace=ws_to_correct,
+                                                NaNValue=0, NaNError=0)
+    ws_to_correct = mantid.ConvertUnits(InputWorkspace=ws_to_correct, OutputWorkspace=ws_to_correct, Target="dSpacing")
+
+    return ws_to_correct
 
 
 def generate_solid_angle_corrections(run_details, instrument):
diff --git a/scripts/Diffraction/isis_powder/polaris_routines/polaris_param_mapping.py b/scripts/Diffraction/isis_powder/polaris_routines/polaris_param_mapping.py
index ad4dc87e6dd..93114324423 100644
--- a/scripts/Diffraction/isis_powder/polaris_routines/polaris_param_mapping.py
+++ b/scripts/Diffraction/isis_powder/polaris_routines/polaris_param_mapping.py
@@ -10,6 +10,7 @@ attr_mapping = [("apply_solid_angle",           "solid_angle_on"),
                 ("do_absorb_corrections",       "do_absorb_corrections"),
                 ("generate_absorb_corrections", "gen_absorb_corrections"),
                 ("masking_file_name",           "masking_file_name"),
+                ("multiple_scattering",         "multiple_scattering"),
                 ("raw_data_cropping_values",    "raw_data_crop_values"),
                 ("spline_coefficient",          "spline_coeff"),
                 ("tof_cropping_ranges",         "tof_cropping_values"),
diff --git a/scripts/Diffraction/isis_powder/routines/calibrate.py b/scripts/Diffraction/isis_powder/routines/calibrate.py
index b33f5b2d117..a96fa0fbe89 100644
--- a/scripts/Diffraction/isis_powder/routines/calibrate.py
+++ b/scripts/Diffraction/isis_powder/routines/calibrate.py
@@ -23,19 +23,20 @@ def create_van(instrument, van, empty, absorb, gen_absorb):
 
     corrected_van_ws = instrument.apply_solid_angle_efficiency_corr(ws_to_correct=corrected_van_ws,
                                                                     run_details=run_details)
+
     if absorb:
-        corrected_van_ws = _apply_absorb_corrections(instrument=instrument,
-                                                     run_details=run_details,
+        corrected_van_ws = _apply_absorb_corrections(instrument=instrument, run_details=run_details,
                                                      corrected_van_ws=corrected_van_ws, gen_absorb=gen_absorb)
 
     focused_vanadium = mantid.DiffractionFocussing(InputWorkspace=corrected_van_ws,
                                                    GroupingFileName=run_details.grouping_file_path)
+
     focused_spectra = common.extract_ws_spectra(focused_vanadium)
-    # Crop back to sane TOF as for PEARL at least 20,000-40,000 microseconds is extrapolated
-    # to 0-60,000 microseconds
     focused_spectra = instrument.crop_van_to_expected_tof_range(focused_spectra)
+
     d_spacing_group = _save_focused_vanadium(instrument=instrument, run_details=run_details,
                                              van_spectra=focused_spectra)
+
     _create_vanadium_splines(focused_spectra, instrument, run_details)
 
     common.remove_intermediate_workspace(corrected_van_ws)
@@ -56,20 +57,8 @@ def _create_vanadium_splines(focused_spectra, instrument, run_details):
 
 
 def _apply_absorb_corrections(instrument, run_details, corrected_van_ws, gen_absorb):
-    corrected_van_ws = mantid.ConvertUnits(InputWorkspace=corrected_van_ws, Target="Wavelength")
-
-    if gen_absorb or not run_details.vanadium_absorption_path:
-        absorb_ws = instrument.generate_vanadium_absorb_corrections(run_details, corrected_van_ws)
-    else:
-        absorb_ws = mantid.LoadNexus(Filename=run_details.vanadium_absorption_path)
-
-    if corrected_van_ws.getNumberBins() != absorb_ws.getNumberBins():
-        corrected_van_ws = mantid.RebinToWorkspace(WorkspaceToRebin=corrected_van_ws, WorkspaceToMatch=absorb_ws)
-    corrected_van_ws = mantid.Divide(LHSWorkspace=corrected_van_ws, RHSWorkspace=absorb_ws)
-    corrected_van_ws = mantid.ConvertUnits(InputWorkspace=corrected_van_ws, Target="dSpacing")
-
-    common.remove_intermediate_workspace(absorb_ws)
-    return corrected_van_ws
+    absorb_ws = instrument.generate_vanadium_absorb_corrections(run_details, corrected_van_ws)
+    return absorb_ws
 
 
 def _save_focused_vanadium(instrument, run_details, van_spectra):
diff --git a/scripts/Diffraction/isis_powder/routines/common.py b/scripts/Diffraction/isis_powder/routines/common.py
index a4e7f911fc0..9b63ba3a79c 100644
--- a/scripts/Diffraction/isis_powder/routines/common.py
+++ b/scripts/Diffraction/isis_powder/routines/common.py
@@ -4,9 +4,6 @@ import mantid.kernel as kernel
 import mantid.simpleapi as mantid
 from isis_powder.routines.common_enums import InputBatchingEnum
 
-# A small workaround to ensure when reading workspaces in a loop
-# the previous workspace does not got overridden
-
 
 def create_calibration_by_names(calibration_runs, startup_objects, grouping_file_name, group_names):
     _create_blank_cal_file(calibration_runs=calibration_runs, group_names=group_names,
@@ -125,7 +122,8 @@ def spline_vanadium_for_focusing(focused_vanadium_spectra, num_splines):
     for ws in focused_vanadium_spectra:
         out_name = "spline_bank_" + str(bank_index)
         bank_index += 1
-        tof_ws_list.append(mantid.ConvertUnits(InputWorkspace=ws, Target="TOF", OutputWorkspace=out_name))
+        tof_ws_list.append(mantid.CloneWorkspace(InputWorkspace=ws, OutputWorkspace=out_name))
+        #tof_ws_list.append(mantid.ConvertUnits(InputWorkspace=ws, Target="TOF", OutputWorkspace=out_name))
 
     splined_ws_list = []
     for ws in tof_ws_list:
-- 
GitLab