DEMETER offers two very high level tools for efficiently parametrizing fits, particularly multiple data set fits. These are called “local guess parameters” and the “characteristic value”. Here is the the multiple data set fit to copper metal that we saw before, but modified to use these two tools.
- #!/usr/bin/perl use Demeter qw(:ui=screen);
- my @common = (fft_kmin => 3, fft_kmax => 14,
- bft_rmax => 1.0, bft_rmax => 4.3,
- fit_k1 => 1, fit_k3 => 1,);
- ## make a Data object and set the FT and fit parameters my ($data_010k, $data_150k) = $prj->records(1, 2);
- $data_010k -> set(name=>'10 K copper data', cv=>10, @common);
- $data_150k -> set(name=>'150 K copper data', cv=>150, @common);
- ## run a Feff calculation on copper metal my $feff = Demeter::Feff -> new(file => "cu_metal.inp");
- $feff -> set(workspace => "cu_workspace/", screen => 0,);
- $feff -> potph -> pathfinder;
- my @list_of_paths = $feff -> list_of_paths;
- ## define a set of parameters my @gds = (Demeter::GDS -> new(gds => 'lguess', name => 'alpha', mathexp => 0),
- Demeter::GDS -> new(gds => 'guess', name => 'amp', mathexp => 1),
- Demeter::GDS -> new(gds => 'guess', name => 'enot', mathexp => 0),
- Demeter::GDS -> new(gds => 'guess', name => 'theta', mathexp => 500),
- Demeter::GDS -> new(gds => 'set', name => 'sigmm', mathexp => 0.0005),
- );
- ## assign paths to the first data set my @paths_010k = ();
- foreach my $i (0 .. 4) {
- my $j = $i+1;
- $paths_010k[$i] = Demeter::Path -> new();
- $paths_010k[$i]->set(data => $data_010k,
- sp => $list_of_paths[$i];
- name => "[cv]K, path $j",
- s02 => 'amp',
- e0 => 'enot',
- delr => 'alpha*reff',
- sigma2 => 'debye([cv], theta) + sigmm',
- );
- };
- ## clone all the paths from the first data set and assign them to the second my @paths_150k = ();
- foreach my $i (0 .. 4) {
- my $j = $i+1;
- $paths_150k[$i] = $paths_010k[$i] -> Clone(data => $data_150k);
- };
- ## do the fit my $fitobject = Demeter::Fit -> new(gds => \@gds,
- data => [$data_010k, $data_150k],
- paths => [@paths_010k, @paths_150k],
- );
- $fitobject -> fit;
- ## after-fit chores follow ...
At lines 10 and 11, the cv attribute is set for each Data object. This is the “characteristic value” for each data set, a user-defined number that somehow relates to the XAS data contained in the Data object. In this case, it is the temperature at which each data were measured. In general, the cv should be something that is meaningful to you within the context of your fitting model. It need not be a number. The cv could be used, for instance, to assign different parameters to different data sets. It's a simple tool, but it can be used creatively to do interesting things in a fitting model.
The cv is then used at line 32 as part of each Path's name and at line 36 as the temperature argument to the debye function. As DEMETER digs through the collection of Paths in the Fit object, it will notice the use of the characteristic value and substitute in the value of cv of the associated Data object.
This is not only useful for multile data set fits, it is also useful when applying a specific fitting model to a sequence of data sets. Each data set can have a characteristic value that will then be used correctly by the fitting model for each fit in the sequence.
At lines 19, a new kind of GDS parameter is defined. An “lguess”, or “local guess”, is a token that tells DEMETER to create a guess parameter for every Data object which has a Path which uses the lguess parameter. In this example, alpha is intended to represent the volumetric expansion coefficient of the copper lattice at each temperature. We want to allow this volumetric coefficient to float freely for each data set.
As DEMETER digs through the Fit object, a uniquely named guess parameter will be created for each data set and any path parameter math expressions will be rewritten to use that guess parameter. in this example, the lguess alpha will be expaneded into two guess parameters called alpha_10 and alpha_150. (The cv is used if it is defined, otherwise the group attribute is used after the underscore.) The generated guess parameters will be reported in the log file.
In the earlier multiple data set example, it was necessary to redefine the delr and sigma2 path parameters after cloning Paths for use with the data set at 150 K. Using these two tools, those redefinitions were not necessary.
Obviously, both the lguess and the characteristic value are efficiency tools. They are intended to make fitting models easier to write and more flexile to reuse. Neither adds new functionality that would be unavailable in other ways, but both should make the use of DEMETER easier and less error-prone.
An “ldef” or “local def” parameter has not yet been implemented. Thus, lguess parameters can only be used in path parameter math expressions. Attempting to use an lguess parameter in the math expression for another GDS parameter will result in an error which will stop your program.