[Ifeffit] status: potential surface scanning
Matt Newville
newville at cars.uchicago.edu
Mon Jul 28 10:26:24 CDT 2003
Hi Norbert,
> If I just have one shell, everything is fine. The program iterates through all
> possible variable combinations.
>
> But...
>
> if I have two shells I just manage to let him vary the shells independently. I
> know there must be a way to tell the algorithm that if there are 2 shells it
> needs to vary each of the eight parameters against each other and not two
> times the four from each shell.
Maybe I'm missing something, but why not just iterate through all
pairs of variables, and not worry about assigning them to a
particular shell?
for all variables:
adjust value
for all other variables:
adjust value
run ff2chi(), etc. to generate model xafs spectra
calculate goodness-of-fit with data
store in chisquare(variable1,variable2)
I thought that's what you were doing.
> I know there are some good PERL hackers around. So do you have an idea how to
> do this? Recursion shurely helps - I experimented a lot with it but it still
> does not do what I need it to do. Just for your convenience: I stored the
> parameters in an array of hashes, so that I can have something like
>
> $shell[0]{E0} = $something
> $shell[0]{dr} = $somethingelse...
>
> So the loop for one shell is just looping through the hashkeys of element 0 of
> this array...
I'd think of variables as different from the formal path parameters,
so that
$shell[0]{E0} = $variables{'e0'};
$shell[0]{dr} = $variables{'dr0'};
and the perl %variable hash mapped perl names to Ifeffit variable
names. Maybe you'd want a variable structure that contained 'perl
name', 'Ifeffit variable name', and 'value' for each variable, and a
path parameter structure that contained 'definition' and 'value'.
These structures could definitely be classes.
Another potential thing to try is to use perl's Tie mechanism to
make a setting/retrieving a perl variable automatically set/get an
Ifeffit program variable. That could simplify the process of
iterating over variables in perl and having the right Ifeffit
variable get automatically updated. At least something like
$variable{'e0'} = 1.0 ;
could replace
$variable{'e0'}['value'] = 1.0 ;
Ifeffit:put_scalar($variable{'e0'}['iff_name'],$variable{'e0'}['value']};
(don't trust my perl syntax!!!). That's closely associated with
having a 'Ifeffit_variable' class, but that might be the right thing
for this job (and others). I think that would not be too difficult
to do, and would be a generally useful addition to Ifeffit.pm.
Hope that helps,
--Matt
More information about the Ifeffit
mailing list