Using Bumps¶
The first step in using Bumps is to define a fit file. This is python code defining the function, the fitting parameters and any data that is being fitted.
A fit file usually starts with an import statement:
from bumps.names import *
This imports names from bumps.names
and makes the available to the
model definition.
Next the fit file should load the data with something like np.loadtxt
which loads columnar ASCII data into an array. This data feeds into a
Fitness
function for a particular
model that gives the probability of seeing the data for a given set of
model parameters. These model functions can be quite complex, involving
not only the calculation of the theory function, but also simulating
instrumental resolution and background signal.
The fitness function will have Parameter
objects defining the fittable parameters. Usually the model is initialized
without any fitted parameters, allowing the user to set a
range
on each parameter that
needs to be fitted. Although it is a little tedious to set up, keeping the
fitted ranges separate from the model definition works better in the fitting
process, which usually involves multiple iterations with different
configurations. It is convenient to be able to turn on and off fitting for
individual parameter with a simple comment character (‘#’) at the start of
the line.
Every fit file ends with a FitProblem
definition:
problem = FitProblem(model)
In fact, this is the only requirement of the fit file. The Bumps engine
loads the fit file, retieves the problem symbol and feeds it to the selected
fitter
. Some fit files do not even use FitProblem to
define problem, or use Parameter objects for the fitted parameters, so
long as problem implements the
BaseFitProblem
interface, which
provides getp to get the existing parameter vector, setp to set a new
parameter vector, bounds to return the parameter bounds, and nllf to
to compute the negative log likelihood function. The remaining methods are
optional.
Note that the pattern of importing all names from a file using from bumps.names import *, while convenient for simple scripts, can make the code more difficult to understand later, and can lead to unexpected results when moving code around to other files. The alternative pattern to use is:
import bumps.names as bmp
...
problem = bmp.FitProblem(model)
This documents to the reader unfamiliar with your code (such as you, dear reader, when looking at your model files two years from now) exactly where the name comes from.
The Tutorial walks through the process for several different data sets.