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