diff --git a/Framework/Algorithms/src/CalculatePlaczekSelfScattering.cpp b/Framework/Algorithms/src/CalculatePlaczekSelfScattering.cpp index ec1683526ff9097b8435b700ba5f6319fc5ee43b..2c67eeaea3def0cd52b9f86a2cad76f6728e865f 100644 --- a/Framework/Algorithms/src/CalculatePlaczekSelfScattering.cpp +++ b/Framework/Algorithms/src/CalculatePlaczekSelfScattering.cpp @@ -5,13 +5,15 @@ // & Institut Laue - Langevin // SPDX - License - Identifier: GPL - 3.0 + #include "MantidAlgorithms/CalculatePlaczekSelfScattering.h" +#include "MantidAPI/Axis.h" #include "MantidAPI/Sample.h" +#include "MantidAPI/SpectrumInfo.h" #include "MantidAPI/WorkspaceFactory.h" #include "MantidDataObjects/Workspace2D.h" #include "MantidDataObjects/WorkspaceCreation.h" -#include "MantidGeometry/Instrument/DetectorInfo.h" #include "MantidKernel/Atom.h" #include "MantidKernel/Material.h" +#include "MantidKernel/Unit.h" #include <utility> @@ -52,8 +54,12 @@ void CalculatePlaczekSelfScattering::init() { declareProperty( std::make_unique<API::WorkspaceProperty<API::MatrixWorkspace>>( "InputWorkspace", "", Kernel::Direction::Input), - "Workspace of fitted incident spectrum with it's first derivative. " - "Workspace must have instument and sample data."); + "Raw diffraction data workspace for associated correction to be " + "calculated for. Workspace must have instument and sample data."); + declareProperty( + std::make_unique<API::WorkspaceProperty<API::MatrixWorkspace>>( + "IncidentSpecta", "", Kernel::Direction::Input), + "Workspace of fitted incident spectrum with it's first derivative."); declareProperty( std::make_unique<API::WorkspaceProperty<API::MatrixWorkspace>>( "OutputWorkspace", "", Kernel::Direction::Output), @@ -66,8 +72,8 @@ std::map<std::string, std::string> CalculatePlaczekSelfScattering::validateInputs() { std::map<std::string, std::string> issues; const API::MatrixWorkspace_sptr inWS = getProperty("InputWorkspace"); - const Geometry::DetectorInfo detInfo = inWS->detectorInfo(); - if (detInfo.size() == 0) { + const API::SpectrumInfo specInfo = inWS->spectrumInfo(); + if (specInfo.size() == 0) { issues["InputWorkspace"] = "Input workspace does not have detector information"; } @@ -84,6 +90,7 @@ CalculatePlaczekSelfScattering::validateInputs() { */ void CalculatePlaczekSelfScattering::exec() { const API::MatrixWorkspace_sptr inWS = getProperty("InputWorkspace"); + const API::MatrixWorkspace_sptr incidentWS = getProperty("IncidentSpecta"); API::MatrixWorkspace_sptr outWS = getProperty("OutputWorkspace"); constexpr double factor = 1.0 / 1.66053906660e-27; // atomic mass unit-kilogram relationship @@ -98,9 +105,9 @@ void CalculatePlaczekSelfScattering::exec() { neutronMass / atom.second["mass"]; } // get incident spectrum and 1st derivative - const MantidVec xLambda = inWS->readX(0); - const MantidVec incident = inWS->readY(0); - const MantidVec incidentPrime = inWS->readY(1); + const MantidVec xLambda = incidentWS->readX(0); + const MantidVec incident = incidentWS->readY(0); + const MantidVec incidentPrime = incidentWS->readY(1); double dx = (xLambda[1] - xLambda[0]) / 2.0; std::vector<double> phi1; for (size_t i = 0; i < xLambda.size() - 1; i++) { @@ -127,15 +134,16 @@ void CalculatePlaczekSelfScattering::exec() { MantidVec xLambdas; MantidVec placzekCorrection; size_t nReserve = 0; - const Geometry::DetectorInfo detInfo = inWS->detectorInfo(); - for (size_t detIndex = 0; detIndex < detInfo.size(); detIndex++) { - if (!detInfo.isMonitor(detIndex)) { - nReserve += 1; + const API::SpectrumInfo specInfo = inWS->spectrumInfo(); + for (size_t detIndex = 0; detIndex < specInfo.size(); detIndex++) { + if (!specInfo.isMonitor(detIndex)) { + if (!specInfo.l2(detIndex) == 0) { + nReserve += 1; + } } } xLambdas.reserve(nReserve); placzekCorrection.reserve(nReserve); - API::MatrixWorkspace_sptr outputWS = DataObjects::create<API::HistoWorkspace>(*inWS); // The algorithm computes the signal values at bin centres so they should @@ -178,4 +186,4 @@ void CalculatePlaczekSelfScattering::exec() { } } // namespace Algorithms -} // namespace Mantid +} // namespace Mantid \ No newline at end of file diff --git a/scripts/Diffraction/isis_powder/polaris.py b/scripts/Diffraction/isis_powder/polaris.py index 2b60dfbc8ed4def09d962867d5ebde3397d8a3a8..5acba2f709a9722159549480cbcce6b8e4d2a7bb 100644 --- a/scripts/Diffraction/isis_powder/polaris.py +++ b/scripts/Diffraction/isis_powder/polaris.py @@ -53,10 +53,13 @@ class Polaris(AbstractInst): # Generate pdf run_details = self._get_run_details(self._inst_settings.run_number) focus_file_path = self._generate_out_file_paths(run_details)["nxs_filename"] + cal_file_name = self._inst_settings.calibration_dir + '/' + self._inst_settings.grouping_file_name pdf_output = polaris_algs.generate_ts_pdf(run_number=self._inst_settings.run_number, focus_file_path=focus_file_path, merge_banks=self._inst_settings.merge_banks, - q_lims=q_lims) + q_lims=q_lims, + cal_file_name=cal_file_name, + sample_details=self._sample_details) return pdf_output def set_sample_details(self, **kwargs): diff --git a/scripts/Diffraction/isis_powder/polaris_routines/polaris_algs.py b/scripts/Diffraction/isis_powder/polaris_routines/polaris_algs.py index d1391727c0a3e7f65a46c5fc197c50d44d3598e2..9e712c66b5c17181364f239286a8c611e28a6b2e 100644 --- a/scripts/Diffraction/isis_powder/polaris_routines/polaris_algs.py +++ b/scripts/Diffraction/isis_powder/polaris_routines/polaris_algs.py @@ -79,11 +79,11 @@ def save_unsplined_vanadium(vanadium_ws, output_path): mantid.DeleteWorkspace(converted_group) -def generate_ts_pdf(run_number, focus_file_path, merge_banks=False, q_lims=None): +def generate_ts_pdf(run_number, focus_file_path, merge_banks=False, q_lims=None, cal_file_name=None, sample_details=None): focused_ws = _obtain_focused_run(run_number, focus_file_path) if merge_banks: - pdf_output = _generate_grouped_ts_pdf(focused_ws, q_lims) + pdf_output = _generate_grouped_ts_pdf(run_number, focused_ws, q_lims, cal_file_name, sample_details) else: focused_ws = mantid.ConvertUnits(InputWorkspace=focused_ws.name(), Target="MomentumTransfer") pdf_output = mantid.PDFFourierTransform(Inputworkspace=focused_ws, InputSofQType="S(Q)", PDFType="G(r)", @@ -120,7 +120,7 @@ def _obtain_focused_run(run_number, focus_file_path): return focused_ws -def _generate_grouped_ts_pdf(focused_ws, q_lims): +def _generate_grouped_ts_pdf(run_number, focused_ws, q_lims, cal_file_name, sample_details): focused_ws = mantid.ConvertUnits(InputWorkspace=focused_ws, Target="MomentumTransfer", EMode='Elastic') min_x = np.inf max_x = -np.inf @@ -134,7 +134,6 @@ def _generate_grouped_ts_pdf(focused_ws, q_lims): binning = [min_x, width_x, max_x] focused_ws = mantid.Rebin(InputWorkspace=focused_ws, Params=binning) focused_data_combined = mantid.ConjoinSpectra(InputWorkspaces=focused_ws) - mantid.ConvertFromDistribution(Workspace=focused_data_combined) raw_ws = mantid.LoadRaw(Filename='POL'+str(run_number)) mantid.SetSample(InputWorkspace=raw_ws, @@ -167,7 +166,6 @@ def _generate_grouped_ts_pdf(focused_ws, q_lims): mantid.ConvertToDistribution(Workspace=placzek) placzek = mantid.ConvertUnits(InputWorkspace=placzek, Target="MomentumTransfer", EMode='Elastic') placzek = mantid.RebinToWorkspace(WorkspaceToRebin=placzek, WorkspaceToMatch=focused_data_combined) - mantid.ConvertFromDistribution(Workspace=placzek) mantid.Subtract(LHSWorkspace=focused_data_combined, RHSWorkspace=placzek, OutputWorkspace=focused_data_combined)