Semantic path descriptions

DEMETER does away with the old-fashioned way of organizing the paths calculated in a FEFF calculation. The “path index” is no longer explicitly used in a DEMETER program. Nonetheless, to build Path objects from a list of ScatteringPath objects, you need to know something about which path is which. The path interpretation is one good way of obtaining information about the list of paths, but it is not especially useful for finding automated solutions to building fitting models.

Consider a situation where a molecule is adsorbed to a surface. As an example, consider a ruthenium complex on an aluminum oxide support. One might run a series of DFT or molecular dynamics calculations in an attempt to determine the position at the surface where the molecule rests. Presumably the scattering from the atoms in the surface will be used to identify the surface position by analysis of the EXAFS data. Given several candidate positions, one would automate the construction of a simple fitting model which includes scattering from surface atoms.

The difficulty of this approach is that the single scattering paths from atoms in the surface might be in different positions in FEFF's path list depending on details of the structural geometry. If you want to include a single scattering path from, to use the example with the aluminum oxide support, an aluminum atom in the surface. Doing so is difficult to automate as you may not know FEFF's path index for that path going into the fit.

DEMETER offers a solution to this problem. You can specify a path using a semnatic description of the path. For example, you can find the single scattering path which scatters from aluminum and is between 3 and 4 Å from the scatterer. The following snippet of code imports a FEFF calculation from its serialization file and finds the path meeting that description:


      my $feff = Demeter::Feff->new(yaml=>'myfeff.yaml', workspace=>'mycalc');
      my $this_sp = $feff->find_path(gt => 3, lt=>4, tag=>['Al']);
      my $path = Demeter::Path -> new(feff => $feff,
                                      sp   => $this_sp,
                                     );

The find_path method examines all the paths in a Feff objects path list and compares them against the semantic descriptions given as arguments to the method. In this case, the path that gets returned must have a half path length greater than 3 Å and less that 4 Å. As the anonymous list given as the tag argument has only one element, the path that returns must be a single scattering path. The scatterer must have a site tag that equals the string “Al”.

If there are more than one path meeting the criteria outlined in the argument, then the find_path method returns the shortest such path. The find_all_paths takes the same sort of argument list as find_path and will return a list of paths meeting the criteria.

Here are all the criteria available to the find_path and find_all_paths methods:

lt
This criterion takes a number and requires that the returned path be shorter in half path length than that number.

gt
This criterion takes a number and requires that the returned path be longer in half path length than that number.

nleg
This criterion takes an integer and requires that the returned path have this number of scattering legs. This criterion is redundant when the list-valued criteria are also used.

sp
This criterion takes a ScatteringPath object and requires that the returned path be longer in half path length than that path.

tag
This criterion takes a string or an anonymous array of strings and requires that the returned path contain the atoms which have this (these) tags. The tag is the optional fifth column in a feff.inp file written by Demeter's Atoms. This criterion requires that the tags are lexically equal. See the tagmatch criterion for matching tags in the sense of regular expressions.

tagmatch
This criterion takes a string or an anonymous array of strings and requires that the returned path contain the atoms which have tags matching the arguments of this criterion. The tag is the optional fifth column in a feff.inp file written by Demeter's Atoms. This criterion requires that the tags match in the sense of regular expressions. See the tag criterion for requiring that tags be lexically equal.

ipot
This criterion takes an integer from 0 to 7 or an anonymous array of such integers and requires that the returned path contain the atoms which have ipots equal to the arguments of this criterion.

element
This criterion takes a string identifying an element (its name, its one or two letter symbol or its Z number) or an anonymous array of such strings and requires that the returned path contain the atoms which have the elements specified.

This method returns 0 if a path meeting the criteria cannot be found or if there is an error in specifying the criteria.

The list-valued criterion are compared in order with the scattering atoms in a path and the match is only true is each element mataches a scatterer in a path. Thus is not necessary to specify the nleg criterion when any of the list valued criteria are used.

Here is an example of using the find_all_paths method to find all single scattering paths in a FEFF calculcation which are shorter than 6 Å.


      my @list = $feff->find_all_paths( lt=>6, nleg=>2 );

For more details, see the Demeter::Feff::Paths documentation.

The example of Hg absorbed to DNA demonstrates extensive use of the find_path method. The silver/gold alloy example also makes strategic use of this tool.