\(\renewcommand\AA{\unicode{x212B}}\)
GeneratePythonFitScript v1¶
Summary¶
An algorithm to generate a Python script file for performing a sequential or simultaneous fit.
See Also¶
Properties¶
| Name | Direction | Type | Default | Description | 
|---|---|---|---|---|
| InputWorkspaces | Input | str list | Mandatory | A list of workspace names to be fitted. The workspace name at index i in the list corresponds with the ‘WorkspaceIndices’, ‘StartXs’ and ‘EndXs’ properties. | 
| WorkspaceIndices | Input | unsigned int list | A list of workspace indices to be fitted. The workspace index at index i in the list will correspond to the input workspace at index i. | |
| StartXs | Input | dbl list | A list of start X’s to be used for the fitting. The Start X at index i will correspond to the input workspace at index i. | |
| EndXs | Input | dbl list | A list of end X’s to be used for the fitting. The End X at index i will correspond to the input workspace at index i. | |
| FittingType | Input | string | Sequential | The type of fitting to generate a python script for (Sequential or Simultaneous). Allowed values: [‘Sequential’, ‘Simultaneous’] | 
| Function | Input | Function | Mandatory | The function to use for the fitting. This should be a single domain function if the Python script will be for sequential fitting, or a MultiDomainFunction if the Python script is for simultaneous fitting. | 
| MaxIterations | Input | number | 500 | The MaxIterations to be passed to the Fit algorithm in the Python script. | 
| Minimizer | Input | string | Levenberg-Marquardt | The Minimizer to be passed to the Fit algorithm in the Python script. Allowed values: [‘BFGS’, ‘Conjugate gradient (Fletcher-Reeves imp.)’, ‘Conjugate gradient (Polak-Ribiere imp.)’, ‘Damped GaussNewton’, ‘FABADA’, ‘Levenberg-Marquardt’, ‘Levenberg-MarquardtMD’, ‘Simplex’, ‘SteepestDescent’, ‘Trust Region’] | 
| CostFunction | Input | string | Least squares | The CostFunction to be passed to the Fit algorithm in the Python script. Allowed values: [‘Least squares’, ‘Poisson’, ‘Rwp’, ‘Unweighted least squares’] | 
| EvaluationType | Input | string | CentrePoint | The EvaluationType to be passed to the Fit algorithm in the Python script. Allowed values: [‘CentrePoint’, ‘Histogram’] | 
| OutputBaseName | Input | string | Output_Fit | The OutputBaseName is the base output name to use for the resulting Fit workspaces. | 
| PlotOutput | Input | boolean | True | If true, code used for plotting the results of a fit will be generated and added to the python script. | 
| Filepath | Input | string | The name of the Python fit script which will be generated and saved in the selected location. Allowed extensions: [‘.py’] | |
| ScriptText | Output | string | 
Description¶
This algorithm can be used to generate a python script used for sequential or simultaneous fitting. The generated python script is intended to be a generic example for how you can perform a fit in Mantid, and can easily be adapted for specific needs. This algorithm is used by the Fit Script Generator interface.
Usage¶
Example - generate a python script used for sequential fitting:
ws1 = CreateSampleWorkspace()
ws2 = CreateSampleWorkspace()
function = \
"name=GausOsc,A=0.2,Sigma=0.2,Frequency=1,Phi=0"
# If you want to save the python script to a file then specify the Filepath property
script_text = GeneratePythonFitScript(InputWorkspaces=["ws1", "ws1", "ws2", "ws2"], WorkspaceIndices=[0, 1, 0, 1],
                                      StartXs=[0.0, 0.0, 0.0, 0.0], EndXs=[20000.0, 20000.0, 20000.0, 20000.0],
                                      FittingType="Sequential", Function=function, MaxIterations=500,
                                      Minimizer="Levenberg-Marquardt", OutputBaseName="Output_Fit")
print(script_text)
Output:
# A python script generated to perform a sequential or simultaneous fit
from mantid.simpleapi import *
import matplotlib.pyplot as plt
# List of tuples [ (workspace_name, workspace_index, start_x, end_x) ]
input_data = [
    ("ws1", 0, 0.000000, 20000.000000),
    ("ws1", 1, 0.000000, 20000.000000),
    ("ws2", 0, 0.000000, 20000.000000),
    ("ws2", 1, 0.000000, 20000.000000)
]
# Fit function as a string
function = \
    "name=GausOsc,A=0.2,Sigma=0.2,Frequency=1,Phi=0"
# Fitting options
max_iterations = 500
minimizer = "Levenberg-Marquardt"
cost_function = "Least squares"
evaluation_type = "CentrePoint"
output_base_name = "Output_Fit"
# Perform a sequential fit
output_workspaces, parameter_tables, normalised_matrices = [], [], []
for domain_data in input_data:
    output_name = output_base_name + domain_data[0] + str(domain_data[1])
    fit_output = Fit(Function=function, InputWorkspace=domain_data[0], WorkspaceIndex=domain_data[1],
                     StartX=domain_data[2], EndX=domain_data[3], MaxIterations=max_iterations,
                     Minimizer=minimizer, CostFunction=cost_function, EvaluationType=evaluation_type,
                     Output=output_name)
    output_workspaces.append(output_name + "_Workspace")
    parameter_tables.append(output_name + "_Parameters")
    normalised_matrices.append(output_name + "_NormalisedCovarianceMatrix")
    # Use the parameters in the previous function as the start parameters of the next fit
    function = fit_output.Function
# Group the output workspaces from the sequential fit
GroupWorkspaces(InputWorkspaces=output_workspaces, OutputWorkspace=output_base_name + "Workspaces")
GroupWorkspaces(InputWorkspaces=parameter_tables, OutputWorkspace=output_base_name + "Parameters")
GroupWorkspaces(InputWorkspaces=normalised_matrices, OutputWorkspace=output_base_name + "NormalisedCovarianceMatrices")
# Plot the results of the fit
fig, axes = plt.subplots(nrows=2,
                         ncols=len(output_workspaces),
                         sharex=True,
                         gridspec_kw={"height_ratios": [2, 1]},
                         subplot_kw={"projection": "mantid"})
for i, workspace_name in enumerate(output_workspaces):
    workspace = AnalysisDataService.retrieve(workspace_name)
    axes[0, i].errorbar(workspace, "rs", wkspIndex=0, label="Data", markersize=2)
    axes[0, i].errorbar(workspace, "b-", wkspIndex=1, label="Fit")
    axes[0, i].set_title(workspace_name)
    axes[0, i].set_xlabel("")
    axes[0, i].tick_params(axis="both", direction="in")
    axes[0, i].legend()
    axes[1, i].errorbar(workspace, "ko", wkspIndex=2, markersize=2)
    axes[1, i].set_ylabel("Difference")
    axes[1, i].tick_params(axis="both", direction="in")
fig.subplots_adjust(hspace=0)
fig.show()
Example - generate a python script used for simultaneous fitting:
ws1 = CreateSampleWorkspace()
ws2 = CreateSampleWorkspace()
function = \
"composite=MultiDomainFunction,NumDeriv=true;" \
"name=GausOsc,A=0.2,Sigma=0.2,Frequency=1,Phi=0,$domains=i;" \
"name=GausOsc,A=0.2,Sigma=0.2,Frequency=1,Phi=0,$domains=i;" \
"name=GausOsc,A=0.2,Sigma=0.2,Frequency=1,Phi=0,$domains=i;" \
"name=GausOsc,A=0.2,Sigma=0.2,Frequency=1,Phi=0,$domains=i;" \
"ties=(f2.Frequency=f3.Frequency,f1.Frequency=f3.Frequency,f0.Frequency=f3.Frequency)"
# If you want to save the python script to a file then specify the Filepath property
script_text = GeneratePythonFitScript(InputWorkspaces=["ws1", "ws1", "ws2", "ws2"], WorkspaceIndices=[0, 1, 0, 1],
                                      StartXs=[0.0, 0.0, 0.0, 0.0], EndXs=[20000.0, 20000.0, 20000.0, 20000.0],
                                      FittingType="Simultaneous", Function=function, MaxIterations=500,
                                      Minimizer="Levenberg-Marquardt", OutputBaseName="Output_Fit")
print(script_text)
Output:
# A python script generated to perform a sequential or simultaneous fit
from mantid.simpleapi import *
import matplotlib.pyplot as plt
# List of tuples [ (workspace_name, workspace_index, start_x, end_x) ]
input_data = [
    ("ws1", 0, 0.000000, 20000.000000),
    ("ws1", 1, 0.000000, 20000.000000),
    ("ws2", 0, 0.000000, 20000.000000),
    ("ws2", 1, 0.000000, 20000.000000)
]
# Fit function as a string
function = \
    "composite=MultiDomainFunction,NumDeriv=true;" \
    "name=GausOsc,A=0.2,Sigma=0.2,Frequency=1,Phi=0,$domains=i;" \
    "name=GausOsc,A=0.2,Sigma=0.2,Frequency=1,Phi=0,$domains=i;" \
    "name=GausOsc,A=0.2,Sigma=0.2,Frequency=1,Phi=0,$domains=i;" \
    "name=GausOsc,A=0.2,Sigma=0.2,Frequency=1,Phi=0,$domains=i;" \
    "ties=(f2.Frequency=f3.Frequency,f1.Frequency=f3.Frequency,f0.Frequency=f3.Frequency)"
# Fitting options
max_iterations = 500
minimizer = "Levenberg-Marquardt"
cost_function = "Least squares"
evaluation_type = "CentrePoint"
output_base_name = "Output_Fit"
# Perform a simultaneous fit
input_workspaces = [domain[0] for domain in input_data]
domain_data = [domain[1:] for domain in input_data]
fit_output = \
    Fit(Function=function,
        InputWorkspace=input_workspaces[0], WorkspaceIndex=domain_data[0][0], StartX=domain_data[0][1], EndX=domain_data[0][2],
        InputWorkspace_1=input_workspaces[1], WorkspaceIndex_1=domain_data[1][0], StartX_1=domain_data[1][1], EndX_1=domain_data[1][2],
        InputWorkspace_2=input_workspaces[2], WorkspaceIndex_2=domain_data[2][0], StartX_2=domain_data[2][1], EndX_2=domain_data[2][2],
        InputWorkspace_3=input_workspaces[3], WorkspaceIndex_3=domain_data[3][0], StartX_3=domain_data[3][1], EndX_3=domain_data[3][2],
        MaxIterations=max_iterations, Minimizer=minimizer, CostFunction=cost_function,
        EvaluationType=evaluation_type, Output=output_base_name)
output_workspaces = []
for i in range(len(input_workspaces)):
    output_workspaces.append(output_base_name + "_Workspace_" + str(i))
# Plot the results of the fit
fig, axes = plt.subplots(nrows=2,
                         ncols=len(output_workspaces),
                         sharex=True,
                         gridspec_kw={"height_ratios": [2, 1]},
                         subplot_kw={"projection": "mantid"})
for i, workspace_name in enumerate(output_workspaces):
    workspace = AnalysisDataService.retrieve(workspace_name)
    axes[0, i].errorbar(workspace, "rs", wkspIndex=0, label="Data", markersize=2)
    axes[0, i].errorbar(workspace, "b-", wkspIndex=1, label="Fit")
    axes[0, i].set_title(workspace_name)
    axes[0, i].set_xlabel("")
    axes[0, i].tick_params(axis="both", direction="in")
    axes[0, i].legend()
    axes[1, i].errorbar(workspace, "ko", wkspIndex=2, markersize=2)
    axes[1, i].set_ylabel("Difference")
    axes[1, i].tick_params(axis="both", direction="in")
fig.subplots_adjust(hspace=0)
fig.show()
Categories: AlgorithmIndex | Utility\Python
Source¶
C++ header: GeneratePythonFitScript.h
C++ source: GeneratePythonFitScript.cpp