<html dir="ltr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<style id="owaParaStyle" type="text/css">P {margin-top:0;margin-bottom:0;}</style>
</head>
<body ocsi="0" fpstyle="1">
<div style="direction: ltr;font-family: Tahoma;color: #000000;font-size: 10pt;">Hello Matt,<br>
<br>
Thank you for providing the examples. I tried to to write my own script based on your examples and things appear to be working fine until I get to the point where I want to run feffit, then I get the traceback I've pasted here below. I've attached an archive
 with the script and the data, do you have any idea what the problem is here?<br>
<br>
Best regards,<br>
Johan<br>
<br>
johan@johan-Latitude-E6430:~/misc/larch/pd_metal_python$ python pd_metal_python.py
<br>
Traceback (most recent call last):<br>
  File "pd_metal_python.py", line 49, in <module><br>
    out = feffit(pars, dset, _larch=mylarch)<br>
  File "/usr/local/lib/python2.7/dist-packages/larch/__init__.py", line 38, in wrapper<br>
    return fcn(*args, **keywords)<br>
  File "/home/johan/.larch/plugins/xafs/feffit.py", line 411, in feffit<br>
    fit.leastsq()<br>
  File "/usr/local/lib/python2.7/dist-packages/larch/fitting/minimizer.py", line 398, in leastsq<br>
    lsout = leastsq(self.__residual, self.vars, **lskws)<br>
  File "/usr/local/lib/python2.7/dist-packages/larch/fitting/minimizer.py", line 222, in leastsq<br>
    shape = _check_func('leastsq', 'func', func, x0, args, n)<br>
  File "/usr/lib/python2.7/dist-packages/scipy/optimize/minpack.py", line 19, in _check_func<br>
    res = atleast_1d(thefunc(*((x0[:numinputs],) + args)))<br>
  File "/usr/local/lib/python2.7/dist-packages/larch/fitting/minimizer.py", line 325, in __residual<br>
    return self.userfcn(self.paramgroup, *self.userargs, **self.userkws)<br>
  File "/home/johan/.larch/plugins/xafs/feffit.py", line 399, in _resid<br>
    return concatenate([d._residual() for d in datasets])<br>
  File "/home/johan/.larch/plugins/xafs/feffit.py", line 266, in _residual<br>
    _larch=self._larch, group=self.model)<br>
  File "/usr/local/lib/python2.7/dist-packages/larch/__init__.py", line 38, in wrapper<br>
    return fcn(*args, **keywords)<br>
  File "/home/johan/.larch/plugins/xafs/feffdat.py", line 447, in _ff2chi<br>
    path._calc_chi(k=k, kstep=kstep, kmax=kmax)<br>
  File "/home/johan/.larch/plugins/xafs/feffdat.py", line 333, in _calc_chi<br>
    if self._larch.symtable._sys.paramGroup is not None:<br>
AttributeError: 'NoneType' object has no attribute 'symtable'<br>
johan@johan-Latitude-E6430:~/misc/larch/pd_metal_python$ <br>
<br>
<div style="font-family: Times New Roman; color: #000000; font-size: 16px">
<hr tabindex="-1">
<div style="direction: ltr;" id="divRpF552375"><font color="#000000" face="Tahoma" size="2"><b>From:</b> ifeffit-bounces@millenia.cars.aps.anl.gov [ifeffit-bounces@millenia.cars.aps.anl.gov] on behalf of Matt Newville [newville@cars.uchicago.edu]<br>
<b>Sent:</b> 01 October 2015 06:16<br>
<b>To:</b> XAFS Analysis using Ifeffit<br>
<b>Subject:</b> Re: [Ifeffit] Problems importing larch plugins to python<br>
</font><br>
</div>
<div></div>
<div>
<div dir="ltr">Hi Johan,<br>
<br>
<div class="gmail_extra"><br>
<div class="gmail_quote">On Wed, Sep 30, 2015 at 10:53 AM, Johan Nilsson <span dir="ltr">
<<a href="mailto:johan.nilsson@chalmers.se" target="_blank">johan.nilsson@chalmers.se</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex; border-left:1px solid rgb(204,204,204); padding-left:1ex">
<div>
<div style="direction:ltr; font-family:Tahoma; color:rgb(0,0,0); font-size:10pt">
Hello Matt,<br>
<br>
I was able to import pre_edge, autobk, and xftf without problems. Is it possible to import feff paths and do a fit to exafs data in a python script? I was able to do<br>
<br>
   larch.enable_plugins()<br>
   from larch_plugins.xafs import feffdat<br>
<br>
   path1 = feffdat.feffpath('feff0001.dat')<br>
<br>
but I could not figure out how to get the feffit_transform and feffit_dataset functions to work. Before I upgraded I was able to use those two in a python script but I was not able to get the feffit function to run to do the actual fit.<br>
<br>
</div>
</div>
</blockquote>
<div><br>
</div>
<div>Sorry, the use from python is not as well documented as it should be.   A larch script for a simple use of feffit would be:<br>
<br>
## simple feffit in larch<br>
# read chi(k)<br>
cu_data = read_ascii('../xafsdata/cu.chi', labels='k, chi')<br>
<br>
# define fitting parameter group<br>
pars = group(amp    = param(1, vary=True),<br>
             del_e0 = param(0.1, vary=True),<br>
             sig2   = param(0.002, vary=True),<br>
             del_r  = param(0., vary=True) )<br>
<br>
# define a Feff Path, give expressions for Path Parameters<br>
path1 = feffpath('feffcu01.dat',<br>
                 s02    = 'amp',<br>
                 e0     = 'del_e0',<br>
                 sigma2 = 'sig2',<br>
                 deltar = 'del_r')<br>
<br>
# set tranform / fit ranges<br>
trans = feffit_transform(kmin=3, kmax=17, kw=2, dk=4,<br>
                         window='kaiser', rmin=1.4, rmax=3.0)<br>
<br>
# define dataset to include data, pathlist, transform<br>
dset  = feffit_dataset(data=cu_data, pathlist=[path1], transform=trans)<br>
<br>
# perform fit<br>
out = feffit(pars, dset)<br>
<br>
# print result<br>
print feffit_report(out)<br>
###########################################<br>
<br>
</div>
<div><br>
Translating that into pure Python would be:<br>
<br>
## simple feffit in python<br>
import larch<br>
from larch import Group, Parameter<br>
from <a href="http://larch_plugins.io" target="_blank">larch_plugins.io</a> import read_ascii<br>
from larch_plugins.xafs import FeffPathGroup<br>
from larch_plugins.xafs.feffit import (TransformGroup, FeffitDataSet,<br>
                                       feffit, feffit_report)<br>
<br>
#create larch session<br>
session = larch.Interpreter()<br>
<br>
# read chi(k)<br>
cu_data = read_ascii('../xafsdata/cu.chi', labels='k, chi', _larch=session)<br>
<br>
# define fitting parameter group<br>
pars = larch.Group(amp    = Parameter(1, vary=True),<br>
                   del_e0 = Parameter(0.1, vary=True),<br>
                   sig2   = Parameter(0.002, vary=True),<br>
                   del_r  = Parameter(0., vary=True) )<br>
<br>
# define a Feff Path, give expressions for Path Parameters<br>
path1 = FeffPathGroup('feffcu01.dat',<br>
                      s02    = 'amp',<br>
                      e0     = 'del_e0',<br>
                      sigma2 = 'sig2',<br>
                      deltar = 'del_r', _larch=session)<br>
<br>
# set tranform / fit ranges<br>
trans = TransformGroup(kmin=3, kmax=17, kw=2, dk=4,<br>
                       window='kaiser', rmin=1.4, rmax=3.0, _larch=session)<br>
<br>
# define dataset to include data, pathlist, transform<br>
dset  = FeffitDataSet(data=cu_data, pathlist=[path1],<br>
                      transform=trans, _larch=session)<br>
# perform fit<br>
out = feffit(pars, dset, _larch=session)<br>
<br>
# print result<br>
print feffit_report(out, _larch=session)<br>
##################################################<br>
<br>
<br>
</div>
<div>So, it's FeffPathGroup, TransformGroup and FeffitDataSet that you were looking for -- python classes, with the corresponding larch functione just return an instance of these classes.    And you have to pass in a '_larch=session'<br>
</div>
<div>to all of these classes and fnctions, as these all assume they can read/write to the session-wide larch symbol table (and, while fitting, they actually do).   Yeah, a couple of these might be possible to eliminate, and it's not how you'd do it in pure
 python, but you'd probably build a Feffit class, and be passing around 'self', which is really not so different from "reference to global state".
<br>
<br>
</div>
<div>Anyway, it is doable in non-larch Python.  Suggestions for improvement welcome!<br>
<br>
</div>
<div>--Matt<br>
<br>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</body>
</html>