Exemplo n.º 1
0
    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)
Exemplo n.º 2
0
 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