def PyExec(self): self._setup() if self._binning_for_calc.size == 0: x = np.array(self._input_ws.readX(self._incident_index)) self._binning_for_calc = [ i for i in [min(x), x[1] - x[0], max(x) + x[1] - x[0]] ] else: x = np.arange(self._binning_for_calc[0], self._binning_for_calc[2], self._binning_for_calc[1]) if self._binning_for_fit.size == 0: x_fit = np.array(self._input_ws.readX(self._incident_index)) y_fit = np.array(self._input_ws.readY(self._incident_index)) else: rebinned = Rebin(InputWorkspace=self._input_ws, Params=self._binning_for_fit, PreserveEvents=True, StoreInADS=False) x_fit = np.array(rebinned.readX(self._incident_index)) y_fit = np.array(rebinned.readY(self._incident_index)) rebin_norm = x.size / x_fit.size x_bin_centers = 0.5 * (x[:-1] + x[1:]) if len(x_fit) != len(y_fit): x_fit = 0.5 * (x_fit[:-1] + x_fit[1:]) if self._fit_spectrum_with == 'CubicSpline': # Fit using cubic spline fit, fit_prime = self.fit_cubic_spline(x_fit, y_fit, x_bin_centers, s=1e7) elif self._fit_spectrum_with == 'CubicSplineViaMantid': # Fit using cubic spline via Mantid fit, fit_prime = self.fit_cubic_spline_via_mantid_spline_smoothing( self._input_ws, params_input=self._binning_for_fit, params_output=self._binning_for_calc, Error=0.0001, MaxNumberOfBreaks=0) elif self._fit_spectrum_with == 'GaussConvCubicSpline': # Fit using Gauss conv cubic spline fit, fit_prime = self.fit_cubic_spline_with_gauss_conv( x_fit, y_fit, x_bin_centers, sigma=0.5) # Create output workspace unit = self._input_ws.getAxis(0).getUnit().unitID() output_workspace = CreateWorkspace(DataX=x, DataY=np.append(fit, fit_prime) / rebin_norm, UnitX=unit, NSpec=2, Distribution=False, ParentWorkspace=self._input_ws, StoreInADS=False) self.setProperty("OutputWorkspace", output_workspace)
def fit_cubic_spline_via_mantid_spline_smoothing(self, InputWorkspace, params_input, params_output, **kwargs): # Fit with Cubic Spline using the mantid SplineSmoothing algorithm rebinned = Rebin(InputWorkspace=InputWorkspace, Params=params_input, PreserveEvents=True, StoreInADS=False) fit_tuple = SplineSmoothing(InputWorkspace=rebinned, OutputWorkspaceDeriv='fit_prime', DerivOrder=1, StoreInADS=False, **kwargs) fit = Rebin(InputWorkspace=fit_tuple.OutputWorkspace, Params=params_output, PreserveEvents=True, StoreInADS=False) fit_prime = Rebin(InputWorkspace=fit_tuple.OutputWorkspaceDeriv[0], Params=params_output, PreserveEvents=True, StoreInADS=False) fit_array = copy(fit.readY(0)) fit_prime_array = copy(fit_prime.readY(0)) return fit_array, fit_prime_array