Fitting¶
The script will cycle through all files in a selected directory (unless certain files are excluded or explicitly listed) and will store the experimental data. The experimental data can then be fitted to user-defined model.
Formulate the model¶
The ImpedanceFitter parser understands circuits that follow a simple pattern:
Elements in series are connected by a +.
Elements in parallel are connected by parallel(A, B).
An example of a circuit could be:
parallel(R, C) + CPE
This stands for a resistor in parallel with a capacitor that are in series with a constant phase element (CPE).
Also nested parallels are possible:
parallel(parallel(L, C), R)
Find all available elements in Section Circuit elements and all available circuits in Section Circuits.
You can also use prefixes. This is needed if you want to combine multiple elements or circuits of the same type. Otherwise, the parameters cannot be distinguished by LMFIT.
For example:
parallel(R_f1, C_f1) + parallel(R_f2, C_f2)
Execute the fit¶
Using impedancefitter.fitter.Fitter.run(), those files can be fitted
to an equivalent circuit model.
If there are two models involved that shall be fitted sequentially for each file,
refer to impedancefitter.fitter.Fitter.sequential_run().
This method allows one to communicate inferered parameters to the second model.
In [Sabuncu2012], an example of such a sequential procedure has been presented.
Add a custom model¶
If you want to add a custom model that cannot be built by the existing models, you need to follow these steps:
Create a new function for this like
def example_function(omega, parameterA, parameterB): impedance = ... return impedance
The first argument of the function needs to be named omega and is the angular frequency! The same holds true for elements. LMFIT generates the model based on the function arguments and always takes the first argument as the independent variable. The other parameters are then accessible by their names.
Give this model a reference name that does not contain numbers or underscores. Link it in
impedancefitter.utils._model_function()to the function you defined in the previous step. Add the model toimpedancefitter.utils.available_models().Add the new parameter names and their corresponding LaTex representation to
impedancefitter.utils.get_labels().Write a unit test for the model.
Use the model.
API Reference¶
-
class
impedancefitter.fitter.Fitter(inputformat, directory=None, **kwargs)[source]¶ The main fitting object class. All files in the data directory with matching file ending are imported to be fitted.
- Parameters
inputformat (string) – The inputformat of the data files. Must be one of the formats specified in
impedancefitter.utils.available_file_format(). Moreover, the ending of the file must match the inputformat.directory (string, optional) – Path to data directory. Provide the data directory if the data directory is not the current working directory.
LogLevel ({‘DEBUG’, ‘INFO’, ‘WARNING’}, optional) – choose level for logger. Case DEBUG: the script will output plots after each fit, case INFO: the script will output results from each fit to the console.
excludeEnding (string, optional) – For file ending that should be ignored (if there are files with the same ending as the chosen inputformat). Useful for instance, if there are files like *_data.csv and *_result.csv around and only the first should be fitted.
excludeFilter (string, optional) – Files containing a certain string are ignored (if they are files with the same ending as the chosen inputformat). Useful for instance, if there are files that were measured using different measurement voltages. For example, files containing _25mV should not be fitted.
ending (string, optional) – When inputformat is TXT, an alternative file ending is possible. The default is .TXT.
minimumFrequency (float, optional) – If you want to use another frequency than the minimum frequency in the dataset.
maximumFrequency (float, optional) – If you want to use another frequency than the maximum frequency in the dataset.
data_sets (int, optional) – Use only a certain number of data sets instead of all in directory.
current_threshold (float, optional) – Use only for data from E4980AL LCR meter to check current. If the current is not close to the threshold, the data point will be neglected.
voltage_threshold (float, optional) – Use only for data from E4980AL LCR meter to check voltage. If the voltage is not close to the threshold, the data point will be neglected.
E4980AL_tolerance (float, optional) – Set tolerance for current_threshold and/or voltage_threshold.
write_output (bool, optional) – Decide if you want to dump output to file. Default is False
fileList (list of strings, optional) – provide a list of files that exclusively should be processed. No other files will be processed. This option is particularly good if you have a common fileending of your data (e.g., .csv)
show (bool, optional) – Decide if you want to see the plots during the fitting procedure.
savefig (bool, optional) – Decide if you want to save the plots. Default is False.
trace_b (string, optional) – For TXT files, which contain more than one trace. The data is only read in until
trace_bis found. Default is None (then trace_b does not have any effect).skiprows_txt (int, optional) – Number of header rows inside a TXT file. Default is 1.
skiprows_trace (int, optional) – Lines between traces blocks in a TXT file. Default is None (then skiprows_trace does not have any effect).
delimiter (str, optional) – Only for TXT and CSV files. If the TXT/CSV file is not tab-separated, this can be specified here.
- Variables
omega_dict (dict) – Contains frequency lists that were found in the individual files. The keys are the file names, the values the frequencies.
Z_dict (dict) – Contains corresponding impedances. Note that the values might be lists when there was more than one impedance data set in the file.
fit_data (dict) – Contains the fitting results for each individual file. In case of a sequential run, the dictionary contains two sub-dictionaries with keys model1 and model2 and the results.
fittedValues (
lmfit.model.ModelResult) – The fitting result of the last data set that was fitted. Exists only whenrun()was called.fittedValues1 (
lmfit.model.ModelResult) – The fitting result of the last data set that was fitted. Exists only whensequential_run()was called and corresponds to the first model in this run.fittedValues2 (
lmfit.model.ModelResult) – The fitting result of the last data set that was fitted. Exists only whensequential_run()was called and corresponds to the second model in this run.
-
cluster_emcee_result(constant=100.0, show=False)[source]¶ Apply clustering to eliminate low-probability samples.
- Parameters
constant (float) – The constant, which is used to define the threshold from which on walkers are eliminated.
show (bool, optional) – Plot clustering result.
Notes
The clustering approach described in [Hou2012] is implemented in this function. The walkers are sorted by probability and subsequently the difference between adjacent walker probabilities \(\Delta_j\) is evaluated. Then the average difference between the current and the first walkeri (\(\bar{\Delta}_j\)) is evaluated. Both differences are compared and a threshold is defined:
\[\Delta_j > \mathrm{constant} \cdot \bar{\Delta}_j\]When this inequality becomes true, all walkers with \(k > j\) are thrown away.
References
- Hou2012
Hou, F., Goodman, J., Hogg, D. W., Weare, J., & Schwab, C. (2012). An affine-invariant sampler for exoplanet fitting and discovery in radial velocity data. Astrophysical Journal, 745(2). https://doi.org/10.1088/0004-637X/745/2/198
-
emcee_conf_interval(result)[source]¶ Compute emcee confidence intervals.
The \(1\sigma\) to \(3\sigma\) confidence intervals are computed for a fitting result generated by emcee since this case is not covered by the original LMFIT implementation.
- Parameters
result (
lmfit.model.ModelResult) – Result from fit.- Returns
Dictionary containing limits of confidence intervals for all free parameters. The limits are structured in a list with 7 items, which are ordered as follows:
lower limit of \(3\sigma\) confidence interval.
lower limit of \(2\sigma\) confidence interval.
lower limit of \(1\sigma\) confidence interval.
median.
upper limit of \(1\sigma\) confidence interval.
upper limit of \(2\sigma\) confidence interval.
upper limit of \(3\sigma\) confidence interval.
- Return type
dict
-
initialize_model(modelname, log=False, eps=False)[source]¶ Interface to LMFIT model class.
The equivalent circuit (represented as a string) is parsed and a LMFIT Model is returned. This can be useful if one wants to compute the impedance values for a given model and use it in a different context.
- Parameters
modelname (string) – Provide equivalent circuit model to be parsed.
log (bool) – Decide, if logscale is used for the model.
diel (bool) – Convert to complex permittivity and fit this instead of impedance.
- Returns
model – The resulting LMFIT model.
- Return type
-
linkk_test(capacitance=False, inductance=False, save=False, c=0.85, maxM=100, show=True, limits=[- 2, 2], weighting='modulus')[source]¶ Lin-KK test to check Kramers-Kronig validity.
- Parameters
capacitance (bool, optional) – Add extra capacitance to circuit.
inductance (bool, optional) – Add extra inductance to circuit.
c (double, optional) – Set threshold for algorithm as described in [Schoenleber2014]. Must be between 0 and 1.
maxM (int, optional) – Maximum number of RC elements. Default is 100.
show (bool) – Show plots of test result. Default is True.
limits (list, optional) – Lower and upper limit of residual.
weighting (“modulus” or None) – Apply modulus weighting (as in [Schoenleber2014]) or process unweighted data.
- Returns
results (dict) – Values of Lin-KK test for each file.
mus (dict) – All mu values during Lin-KK run for each file.
residuals (dict) – Least-squares residuals during Lin-KK run for each file.
Notes
The implementation of the algorithm follows [Schoenleber2014] closely.
If the option savefig is generally enabled, the plot result of the LinKK-Test will be saved to a pdf-file.
References
- Schoenleber2014(1,2,3)
Schönleber, M., Klotz, D., & Ivers-Tiffée, E. (2014). A Method for Improving the Robustness of linear Kramers-Kronig Validity Tests. Electrochimica Acta, 131, 20–27. https://doi.org/10.1016/j.electacta.2014.01.034
-
plot_initial_best_fit(sequential=False, save=False, show=True)[source]¶ Plot initial and best fit together.
This method reveals how good the initial fit was.
- Parameters
sequential (bool, optional) – If a
sequential_run()was performed, set this value to True.
-
plot_uncertainty_interval(sigma=1, sequential=False)[source]¶ Plot uncertainty interval around best fit.
- Parameters
sigma ({1, 2, 3}, optional) – Choose sigma for confidence interval.
sequential (bool, optional) – Set to True if you performed a sequential run before.
-
prepare_emcee_run(leastsquaresresult, lnsigma={'max': 0.6931471805599453, 'min': - 6.907755278982137, 'value': - 2.3025850929940455}, nwalkers=100, radius=0.0001, weighted=False, burn=500, steps=10000.0, thin=10, fix_parameters=[])[source]¶ Prepare initial configuration based on previous least squares run.
- Parameters
leastsquaresresult (
lmfit.ModelResult) – Result of previous least squares run on same model. Basically the initial setting. Could also stem from a previous MCMC run.lnsigma (dict) – Value of initial guess for experimental uncertainty.
nwalkers (int) – Number of walkers.
radius (float) – Radius of ball around initial guess.
burn (int) – Number of steps to be removed from MCMC chain in burn-in phase.
steps (int) – Length of MCMC chain.
thin (int) – Take only every thin-th step into account.
weighted (bool) – If False, lnsigma will be used.
fix_parameters (list) – Tell emcee to fix certain parameters to their least squares result.
Notes
The result from a previous least squares run is taking and the emcee run is prepared. The walkers are created and their initial positions are assigned. The initial positions are placed in a tight Gaussian ball around the least squares guess. Their radius can be set manually. Important parameters for the MCMC chains are set.
- Returns
dictionary, which can be passed to run method via solver_kwargs keyword.
- Return type
dict
-
process_data_from_file(filename, model, parameters, residual='parts', limits_residual=None, weighting_model=False)[source]¶ Fit data from input file to model.
Wrapper for LMFIT fitting routine.
- Parameters
filename (str) – Filename, which is contained in the data dictionaries
omega_dictandz_dict.model (
lmfit.model.Modelorlmfit.model.CompositeModel) – The model to fit to.parameters (
lmfit.parameter.Parameters) – The model parameters to be used.residual (str) – Plot relative difference w.r.t. real and imaginary part if parts. Plot relative difference w.r.t. absolute value if absolute. Plot difference (residual) if diff.
limits_residual (list, optional) – List with entries [bottom, top] for y-axis of residual plot.
- Returns
Result of fit as
lmfit.model.ModelResultobject.- Return type
-
run(modelname, solver=None, parameters=None, solver_kwargs={}, log=False, weighting=None, show=False, report=False, savemodelresult=True, eps=False, residual='parts', limits_residual=None, weighting_model=False)[source]¶ Main function that iterates through all data sets provided.
- Parameters
modelname (string) – Name of the model to be parsed. Must be built by those provided in
impedancefitter.utils.available_models()and using + and parallel(x, y) as possible representations of series or parallel circuit.solver (string, optional) – Choose an optimizer. Must be available in LMFIT. Default is least_squares
parameters (dict, optional) – Provide parameters if you do not want to read them from a yaml file (for instance in parallel UQ runs).
solver_kwargs (dict, optional) – Customize the employed solver. Interface to the LMFIT routine.
weighting (str, optional) – Choose a weighting scheme. Default is unit weighting. Also possible: proportional and modulus weighting. See [Barsoukov2018] and [Orazem2017] for more information. Moreover, weighted least squares is possible. This should only be chosen if the data can be averaged. The average data will be fitted and the standard deviation is used for the weights. The keyword for this is WLS. In this case, you need to provide weights.
savemodelresult (bool, optional) – Saves all
lmfit.model.ModelResultinstances to plot or evaluate uncertainty later.residual (str) – Plot relative difference w.r.t. real and imaginary part if parts. Plot relative difference w.r.t. absolute value if absolute. Plot difference (residual) if diff.
limits_residual (list, optional) – List with entries [bottom, top] for y-axis of residual plot.
-
sequential_run(model1, model2, communicate, solver=None, solver_kwargs={}, parameters1=None, parameters2=None, weighting=None)[source]¶ Main function that iterates through all data sets provided.
Here, two models are fitted sequentially and fitted parameters can be communicated from one model to the other.
- Parameters
model1 (string) – Name of first model. Must be built by those provided in
impedancefitter.utils.available_models()and using + and parallel(x, y) as possible representations of series or parallel circuitmodel2 (string) – Name of second model. Must be built by those provided in
impedancefitter.utils.available_models()and using + and parallel(x, y) as possible representations of series or parallel circuitcommunicate (list of strings) – Names of parameters that should be communicated from model1 to model2. Requires that model2 contains a parameter that is named appropriately.
solver (string, optional) – choose an optimizer. Must be available in LMFIT. Default is least_squares
solver_kwargs (dict, optional) – Customize the employed solver. Interface to the LMFIT routine.
parameters1 (dict, optional) – Parameters of model1. Provide parameters if you do not want to use a yaml file.
parameters2 (dict, optional) – Parameters of model2. Provide parameters if you do not want to use a yaml file.
weighting (str, optional) – Choose a weighting scheme. Default is unit weighting. Also possible: proportional weighting. See [Barsoukov2018] for more information.
-
visualize_data(savefig=False, Zlog=False, allinone=False, plottype='impedance', show=True, legend=True)[source]¶ Visualize impedance data.
- Parameters
savefig (bool, optional) – Decide if plots should be saved as pdf. Default is False. Saves the file as filename + index of dataset + _impedance_overview.pdf. If allinone is True, then it is allinone_impedance_overview.pdf.
Zlog (bool, optional) – Plot impedance on logscale.
show (bool, optional) – Decide if you want to immediately see the plot.
allinone (bool, optional) – Visualize all data sets in one plot
plottype (str, optional) – Choose between standard impedance plot (‘impedance’), resistance / capacitance (“RC”) and bode plot (‘bode’).
legend (str, optional) – Choose if a legend should be shown. Recommended to switch to False when using large datasets.