Commit db78e2d5 authored by Antonino D'Anna's avatar Antonino D'Anna

Moved fit_scan from ift_desk to FitRoutines and adapted. Created iterator for...

Moved fit_scan from ift_desk to FitRoutines and adapted. Created iterator for looping through the scanned ranges without allocating a dedicated vector

* src/fit_scan.jl: C
parent 083b215c
......@@ -2,7 +2,7 @@
julia_version = "1.11.2"
manifest_format = "2.0"
project_hash = "d40f659f3cf723144d1f15b850c672d0bbff13f5"
project_hash = "3f63f0538aed850aa4a08da627db432ea46026e3"
[[deps.ADTypes]]
git-tree-sha1 = "f7304359109c768cf32dc5fa2d371565bb63b68a"
......@@ -397,6 +397,11 @@ deps = ["ArgTools", "FileWatching", "LibCURL", "NetworkOptions"]
uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6"
version = "1.6.0"
[[deps.EnumClasses]]
git-tree-sha1 = "889148bc638c63a7777b384ec0fad43836af99a5"
uuid = "53ae640c-c67a-4d53-9dcb-4c921c67b7cd"
version = "0.1.0"
[[deps.EpollShim_jll]]
deps = ["Artifacts", "JLLWrappers", "Libdl"]
git-tree-sha1 = "8a4be429317c42cfae6a7fc03c31bad1970c310d"
......
......@@ -6,13 +6,17 @@ version = "0.1.0"
[deps]
ADerrors = "5e92007d-7bf1-471c-8ceb-4591b8b567a9"
BDIO = "375f315e-f2c4-11e9-2ef9-134f02f79e27"
EnumClasses = "53ae640c-c67a-4d53-9dcb-4c921c67b7cd"
ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210"
LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"
LsqFit = "2fda8390-95c7-5789-9bda-21331edee243"
Printf = "de0858da-6303-5e67-8744-51eddeeeb8d7"
[compat]
ADerrors = "0.1.0"
BDIO = "0.1.0"
EnumClasses = "0.1.0"
ForwardDiff = "1.3.3"
LinearAlgebra = "1.11.0"
LsqFit = "0.16.0"
Printf = "1.11.0"
using EnumClasses, Printf
@enumclass Update tmin tmax
mutable struct Ranges
tmin::Int64
tmax::Int64
is::Int64
ie::Int64
step::Int64
update::Update.Type
Ranges(tmin,tmax,update) = new(tmin,tmax,tmin,tmax,1,update)
Ranges(tmin,tmax,step,update) = new(tmin,tmax,tmin,tmax,step,update)
end
function Base.iterate(r::Ranges)
r.is=r.tmin
r.ie=r.tmax
return range(r.is, r.ie, step=r.step), 1
end
function Base.iterate(r::Ranges,state)
if r.ie-r.is == 1
if r.update == Update.tmin
r.ie -=1
r.ie == r.tmin && return nothing
r.is = r.tmin
elseif r.update==Update.tmax
r.is +=1
r.is == r.tmax && return nothing
r.ie = r.tmax
end
return range(r.is,r.ie,step = r.step), state+1
end
if r.update == Update.tmin
r.is +=1
elseif r.update==Update.tmax
r.ie -=1
end
return range(r.is,r.ie,step=r.step), state+1
end
function Base.IteratorSize(r::Ranges)
if r.update in (Update.tmin, Update.tmax)
return Base.HasLength()
end
return Base.SizeUnknown()
end
function Base.length(r::Ranges)
if r.update in (Update.tmin, Update.tmax)
L = r.tmax-r.tmin+1
return div(L*(L-1),2)
end
return Base.SizeUnknown()
end
function fit_scan(model,xdata,ydata,npar;
tmin = 1, tmax = lastindex(xdata),
update = Update.tmin,
W = Float64[],
logfile = FitRoutines.NoPrint(),
wpm = Dict{Int64,Vector{Float64}}(),
C = Matrix{Float64}(undef, 0,0),
guess = fill(0.5, npar),
corr = false)
println(logfile,"Starting Fit Scan")
Printf.@printf logfile "Scanning region [%.12e, %.12e]\n" xdata[1] xdata[end]
Printf.@printf logfile "Scanning update %s\n" string(update)
vdata = Vector{NamedTuple}() ## vector of fit results
ranges = Ranges(tmin,tmax,update)
fits =Vector{Union{FitRes,Missing}}(missing, length(ranges))
for (idx,r) in enumerate(ranges)
length(r)<=npar && continue;
println(logfile, "="^80, "\n")
Printf.@printf logfile "Fit range [%.5e, %.5e]\n" xdata[r[1]] xdata[r[end]]
fit = fit_routine(model,xdata[r],ydata[r],npar, W=W,C=C,
guess=guess,logfile=logfile, corr=corr)
fits[idx] = FitRes(;fit...,range = (xdata[r[1]],xdata[r[end]]))
end
flush(logfile)
return collect(skipmissing(fits))
end
......@@ -70,6 +70,9 @@ print(::NoPrint,x...) = nothing
println(::NoPrint,x...) = nothing
Base.flush(::NoPrint) = nothing
import Printf:format
format(::NoPrint,f,x...) = nothing
## auxiliary function for uwreal
compute_error_for_logging(logfile, p) = uwerr.(p)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment