87 lines
2.5 KiB
Julia
87 lines
2.5 KiB
Julia
|
module Utils
|
|||
|
|
|||
|
import TOML: parsefile
|
|||
|
import DelimitedFiles: readdlm
|
|||
|
import DSP
|
|||
|
|
|||
|
function load_init_params(filename::String)
|
|||
|
meta = parsefile(filename)["metadata"]
|
|||
|
params = NamedTuple(Dict(Symbol(p["symbol"]) => p["initial_value"] for p in meta["parameters"]))
|
|||
|
lower_bounds = [p["min"] for p in meta["parameters"]]
|
|||
|
upper_bounds = [p["max"] for p in meta["parameters"]]
|
|||
|
return (meta=meta, params=params, lower_bounds=lower_bounds, upper_bounds=upper_bounds)
|
|||
|
end
|
|||
|
|
|||
|
function select_columns(QIE_array, qmin, qmax, bin, err_mul)
|
|||
|
#""Select q / I(q) / err(q) data - Change I(q) value from mm^-1 to nm^-1'
|
|||
|
|
|||
|
Q = Float64[]
|
|||
|
IDATA = Float64[]
|
|||
|
ERR = Float64[]
|
|||
|
|
|||
|
for i in axes(QIE_array, 1)
|
|||
|
# keep only the values of q within bounds
|
|||
|
if qmin <= QIE_array[i, 1] <= qmax
|
|||
|
# skip all but the (k*bin)-th values
|
|||
|
if i % bin == 0
|
|||
|
if QIE_array[i, 2] > 0
|
|||
|
push!(Q, QIE_array[i, 1])
|
|||
|
push!(IDATA, 1e-6 * QIE_array[i, 2])
|
|||
|
if err_mul == 0
|
|||
|
push!(ERR, 0.01 * 1e-6 * QIE_array[i, 2])
|
|||
|
elseif QIE_array[i, 3] * err_mul > 0.01 * QIE_array[i, 2]
|
|||
|
push!(ERR, 1e-6 * QIE_array[i, 3] * err_mul)
|
|||
|
else
|
|||
|
push!(ERR, 0.01 * 1e-6 * QIE_array[i, 2])
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
return (Q, IDATA, ERR)
|
|||
|
end
|
|||
|
|
|||
|
"""
|
|||
|
compute_logscale_weights(q)
|
|||
|
|
|||
|
Compute the weights W, which are proportional to the distance in the log space
|
|||
|
"""
|
|||
|
function compute_logscale_weights(q)
|
|||
|
diff_log_q = diff(log10.(q))
|
|||
|
left_diff_log_q = view(diff_log_q, [firstindex(diff_log_q); eachindex(diff_log_q)])
|
|||
|
right_diff_log_q = view(diff_log_q, [eachindex(diff_log_q); lastindex(diff_log_q)])
|
|||
|
|
|||
|
return left_diff_log_q + right_diff_log_q
|
|||
|
end
|
|||
|
|
|||
|
function load_config(filename::String)
|
|||
|
meta, params_init, lower_bounds, upper_bounds = load_init_params(filename)
|
|||
|
f = open(meta["data_file"], "r")
|
|||
|
qie_data = readdlm(f, '\t')
|
|||
|
close(f)
|
|||
|
return (meta=meta,
|
|||
|
params_init=params_init,
|
|||
|
lower_bounds=lower_bounds,
|
|||
|
upper_bounds=upper_bounds,
|
|||
|
qie_deta=qie_data)
|
|||
|
end
|
|||
|
|
|||
|
function lowpass_filter(i; σ=1)
|
|||
|
half_w = 10
|
|||
|
x = range(-5, 5; length=2half_w + 1)
|
|||
|
i_padded = view(i, [fill(firstindex(i), half_w); eachindex(i); fill(lastindex(i), half_w)])
|
|||
|
k = exp.(-0.5 * ((x / σ) .^ 2)) / (2 * σ * sqrt(2π))
|
|||
|
k ./= sum(k)
|
|||
|
@show sum(k)
|
|||
|
r = DSP.conv(i_padded, k)[2half_w+1:end-2half_w]
|
|||
|
@show size(r)
|
|||
|
return r
|
|||
|
end
|
|||
|
|
|||
|
function chi2(I_data, I_model, err)
|
|||
|
return sum((I_data .- I_model ./ err) .^ 2)
|
|||
|
end
|
|||
|
|
|||
|
end # module Utils
|