diff --git a/Framework/PythonInterface/plugins/algorithms/WorkflowAlgorithms/CalculateSelfScatteringCorrection.py b/Framework/PythonInterface/plugins/algorithms/WorkflowAlgorithms/CalculateSelfScatteringCorrection.py
new file mode 100644
index 0000000000000000000000000000000000000000..31e53298b45ef672074f304ca9631cb8bfdc0855
--- /dev/null
+++ b/Framework/PythonInterface/plugins/algorithms/WorkflowAlgorithms/CalculateSelfScatteringCorrection.py
@@ -0,0 +1,103 @@
+# Mantid Repository : https://github.com/mantidproject/mantid
+#
+# Copyright © 2018 ISIS Rutherford Appleton Laboratory UKRI,
+#     NScD Oak Ridge National Laboratory, European Spallation Source
+#     & Institut Laue - Langevin
+# SPDX - License - Identifier: GPL - 3.0 +
+from __future__ import (absolute_import, division, print_function)
+
+from mantid.simpleapi import (CalculatePlaczekSelfScattering, ConvertToDistribution, ConvertUnits, CreateWorkspace,
+                              DeleteWorkspace, DiffractionFocussing, Divide, ExtractSpectra, FitIncidentSpectrum,
+                              LoadCalFile, SetSample)
+from mantid.api import (DataProcessorAlgorithm, AlgorithmFactory, WorkspaceProperty)
+from mantid.kernel import Direction
+import numpy as np
+
+
+class CalculateSelfScatteringCorrection(DataProcessorAlgorithm):
+
+    def category(self):
+        return "Workflow\\Diffraction"
+
+    def seeAlso(self):
+        return [""]
+
+    def summary(self):
+        return "Calculates the self scattering correction factor for total scattering data."
+
+    def checkGroups(self):
+        return False
+
+    def PyInit(self):
+        self.declareProperty(WorkspaceProperty('RawWorkspace', '', direction=Direction.Input),
+                             doc='Raw workspace')
+        self.declareProperty(WorkspaceProperty('CorrectionsWorkspace', '', direction=Direction.Output),
+                             doc='Focused corrected workspace')
+        self.declareProperty(name='CalFileName', defaultValue='',
+                             doc='Chemical formula for the sample material')
+        self.declareProperty(name='SampleGeometry', defaultValue={},
+                             doc='Geometry of the sample material')
+        self.declareProperty(name='SampleMaterial', defaultValue={},
+                             doc='Chemical formula for the sample material')
+
+    def PyExec(self):
+        raw_ws = self.getProperty('RawWorkspace').value
+        sample_geometry = self.getPropertyValue('SampleGeometry')
+        sample_material = self.getPropertyValue('SampleMaterial')
+        cal_file_name = self.getPropertyValue('CalFileName')
+        SetSample(InputWorkspace=raw_ws,
+                  Geometry=sample_geometry,
+                  Material=sample_material)
+        # find the closest monitor to the sample for incident spectrum
+        raw_spec_info = raw_ws.spectrumInfo()
+        incident_index = None
+        for i in range(raw_spec_info.size()):
+            if raw_spec_info.isMonitor(i):
+                l2 = raw_spec_info.position(i)[2]
+                if not incident_index:
+                    incident_index = i
+                else:
+                    if raw_spec_info.position(incident_index)[2] < l2 < 0:
+                        incident_index = i
+        monitor = ExtractSpectra(InputWorkspace=raw_ws, WorkspaceIndexList=[incident_index])
+        monitor = ConvertUnits(InputWorkspace=monitor, Target="Wavelength")
+        x_data = monitor.dataX(0)
+        min_x = np.min(x_data)
+        max_x = np.max(x_data)
+        width_x = (max_x - min_x) / x_data.size
+        fit_spectra = FitIncidentSpectrum(InputWorkspace=monitor,
+                                          BinningForCalc=[min_x, 1 * width_x, max_x],
+                                          BinningForFit=[min_x, 10 * width_x, max_x],
+                                          FitSpectrumWith="CubicSpline")
+        self_scattering_correction = CalculatePlaczekSelfScattering(InputWorkspace=raw_ws,
+                                                                    IncidentSpecta=fit_spectra)
+        cal_workspace = LoadCalFile(InputWorkspace=self_scattering_correction,
+                                    CalFileName=cal_file_name,
+                                    Workspacename='cal_workspace',
+                                    MakeOffsetsWorkspace=False,
+                                    MakeMaskWorkspace=False)
+        self_scattering_correction = DiffractionFocussing(InputWorkspace=self_scattering_correction,
+                                                          GroupingFilename=cal_file_name)
+
+        n_pixel = np.zeros(self_scattering_correction.getNumberHistograms())
+
+        for i in range(cal_workspace.getNumberHistograms()):
+            grouping = cal_workspace.dataY(i)
+            if grouping[0] > 0:
+                n_pixel[int(grouping[0] - 1)] += 1
+        correction_ws = CreateWorkspace(DataY=n_pixel, DataX=[0, 1],
+                                        NSpec=self_scattering_correction.getNumberHistograms())
+        self_scattering_correction = Divide(LHSWorkspace=self_scattering_correction, RHSWorkspace=correction_ws)
+        ConvertToDistribution(Workspace=self_scattering_correction)
+        self_scattering_correction = ConvertUnits(InputWorkspace=self_scattering_correction,
+                                                  Target="MomentumTransfer", EMode='Elastic')
+        DeleteWorkspace('cal_workspace_group')
+        DeleteWorkspace(correction_ws)
+        DeleteWorkspace(fit_spectra)
+        DeleteWorkspace(monitor)
+        DeleteWorkspace(raw_ws)
+        self.setProperty('CorrectionsWorkspace', self_scattering_correction)
+
+
+# Register algorithm with Mantid
+AlgorithmFactory.subscribe(CalculateSelfScatteringCorrection)
\ No newline at end of file
diff --git a/scripts/Diffraction/isis_powder/polaris_routines/polaris_algs.py b/scripts/Diffraction/isis_powder/polaris_routines/polaris_algs.py
index 16502de817d8deab5fd306bff0b9f06964347f29..205097c5d707c6eee519d4e907a369387102f727 100644
--- a/scripts/Diffraction/isis_powder/polaris_routines/polaris_algs.py
+++ b/scripts/Diffraction/isis_powder/polaris_routines/polaris_algs.py
@@ -83,7 +83,14 @@ def generate_ts_pdf(run_number, focus_file_path, merge_banks=False, q_lims=None,
                     sample_details=None):
     focused_ws = _obtain_focused_run(run_number, focus_file_path)
     focused_ws = mantid.ConvertUnits(InputWorkspace=focused_ws, Target="MomentumTransfer", EMode='Elastic')
-    self_scattering_correction = _calculate_self_scattering_correction(run_number, cal_file_name, sample_details)
+
+    raw_ws = mantid.Load(Filename='POLARIS'+str(run_number)+'.nxs')
+    sample_geometry = common.generate_sample_geometry(sample_details)
+    sample_material = common.generate_sample_material(sample_details)
+    self_scattering_correction = mantid.CalculateSelfScatteringCorrection(RawWorkspace=raw_ws,
+                                                                          CalFileName=cal_file_name,
+                                                                          SampleGeometry=sample_geometry,
+                                                                          SampleMaterial=sample_material)
 
     ws_group_list = []
     for i in range(self_scattering_correction.getNumberHistograms()):