Commit 871b7b0c authored by Antonino D'Anna's avatar Antonino D'Anna

Removed Update @enumclass. TMIN and TMAX now are merged into ALL. updated...

Removed Update @enumclass. TMIN and TMAX now are merged into ALL. updated fit_scan to reflect the changes
parent 7c37ef51
using EnumClasses, Printf using EnumClasses, Printf
abstract type AbstractUpdate end abstract type AbstractUpdate end
struct TMIN <:AbstractUpdate end struct ALL <:AbstractUpdate end
struct TMAX <:AbstractUpdate end
struct TMAX_SPAN <:AbstractUpdate end struct TMAX_SPAN <:AbstractUpdate end
struct TMIN_SPAN <:AbstractUpdate end struct TMIN_SPAN <:AbstractUpdate end
struct TMINMAX_SPAN <:AbstractUpdate end
@enumclass Update tmin tmax tmax_span tmin_span
mutable struct Ranges{T<:AbstractUpdate} mutable struct Ranges{T<:AbstractUpdate}
tmin tmin
...@@ -14,19 +12,11 @@ mutable struct Ranges{T<:AbstractUpdate} ...@@ -14,19 +12,11 @@ mutable struct Ranges{T<:AbstractUpdate}
is is
ie ie
step step
function Ranges(tmin,tmax,step,update::Update.Type) Ranges(tmin, tmax, step=1) = Ranges(tmin,tmax,step,eltype(tmin),eltype(tmax))
update == Update.tmin && return new{TMIN}(tmin,tmax,tmin,tmax,step) Ranges(tmin::T,tmax::U,step,::Type{T},::Type{U}) where {T<:Number,U<:Number} = new{ALL}(tmin,tmax,tmin,tmax,step)
update == Update.tmax && return new{TMAX}(tmin,tmax,tmin,tmax,step) Ranges(tmin::T,tmax::U,step,::Type{S},::Type{V}) where {T,U,S<:Number,V<:Number} = new{TMINMAX_SPAN}(tmin,tmax,tmin[1],tmax[1],step)
if update == Update.tmax_span Ranges(tmin::T,tmax::U,step,::Type{T},::Type{V}) where {T<:Number,U,V<:Number} = new{TMAX_SPAN}(tmin,tmax,tmin,tmax[1],step)
length(tmax) >1 || error("Expected more than one tmax") Ranges(tmin::T,tmax::U,step,::Type{V},::Type{U}) where {T, U<:Number,V<:Number} = new{TMIN_SPAN}(tmin,tmax,tmin[1],tmax,step)
return new{TMAX_SPAN}(tmin,tmax,tmin,tmax[1],step)
end
if update == Update.tmin_span
length(tmin)>1 || error("Expected more than one tmin")
return new{TMIN_SPAN}(tmin,tmax,tmin[1],tmax,step)
end
end
Ranges(tmin,tmax,update::Update.Type) = Ranges(tmin,tmax,1,update)
end end
function Base.iterate(r::Ranges{T}) where T<:AbstractUpdate function Base.iterate(r::Ranges{T}) where T<:AbstractUpdate
...@@ -35,8 +25,8 @@ function Base.iterate(r::Ranges{T}) where T<:AbstractUpdate ...@@ -35,8 +25,8 @@ function Base.iterate(r::Ranges{T}) where T<:AbstractUpdate
return range(r.is, r.ie, step=r.step), 1 return range(r.is, r.ie, step=r.step), 1
end end
function Base.iterate(r::Ranges{TMIN},state) function Base.iterate(r::Ranges{ALL},state)
if r.ie-r.is == 1 if r.ie-r.is <= 1
r.ie -=1 r.ie -=1
r.ie == r.tmin && return nothing r.ie == r.tmin && return nothing
r.is = r.tmin r.is = r.tmin
...@@ -46,19 +36,8 @@ function Base.iterate(r::Ranges{TMIN},state) ...@@ -46,19 +36,8 @@ function Base.iterate(r::Ranges{TMIN},state)
return range(r.is,r.ie,step=r.step), state+1 return range(r.is,r.ie,step=r.step), state+1
end end
function Base.iterate(r::Ranges{TMAX},state)
if r.ie-r.is == 1
r.is +=1
r.is == r.tmax && return nothing
r.ie = r.tmax
return range(r.is,r.ie,step = r.step), state+1
end
r.ie -=1
return range(r.is,r.ie,step=r.step), state+1
end
function Base.iterate(r::Ranges{TMAX_SPAN},state) function Base.iterate(r::Ranges{TMAX_SPAN},state)
if r.ie-r.is ==1 if r.ie-r.is <=1
i = findlast(r.ie.== r.tmax) i = findlast(r.ie.== r.tmax)
i == lastindex(r.tmax) && return nothing i == lastindex(r.tmax) && return nothing
r.is = r.tmin r.is = r.tmin
...@@ -70,7 +49,7 @@ function Base.iterate(r::Ranges{TMAX_SPAN},state) ...@@ -70,7 +49,7 @@ function Base.iterate(r::Ranges{TMAX_SPAN},state)
end end
function Base.iterate(r::Ranges{TMIN_SPAN},state) function Base.iterate(r::Ranges{TMIN_SPAN},state)
if r.ie-r.is ==1 if r.ie-r.is <=1
i = findlast(r.is.== r.tmin) i = findlast(r.is.== r.tmin)
i == lastindex(r.tmin) && return nothing i == lastindex(r.tmin) && return nothing
r.is = r.tmin[i+1] r.is = r.tmin[i+1]
...@@ -81,23 +60,30 @@ function Base.iterate(r::Ranges{TMIN_SPAN},state) ...@@ -81,23 +60,30 @@ function Base.iterate(r::Ranges{TMIN_SPAN},state)
return range(r.is,r.ie,step=r.step),state+1 return range(r.is,r.ie,step=r.step),state+1
end end
function Base.iterate(r::Ranges{TMINMAX_SPAN},state)
if r.is == r.tmin[end]
r.ie == r.tmax[end] && return nothing
i= findlast(r.ie==t for t in r.tmax)
r.ie=r.tmax[i+1]
r.is=r.tmin[1]
else
i= findlast(r.is==t for t in r.tmin)
r.is = r.tmin[i+1]
end
return range(r.is,r.ie,step=r.step), state
end
Base.IteratorSize(::Ranges{T}) where T <:AbstractUpdate = Base.SizeUnknown() Base.IteratorSize(::Ranges{T}) where T <:AbstractUpdate = Base.SizeUnknown()
Base.IteratorSize(::Ranges{TMIN}) = Base.HasLength()
Base.IteratorSize(::Ranges{TMAX}) = Base.HasLength()
Base.IteratorSize(::Ranges{TMAX_SPAN}) = Base.HasLength()
function Base.length(r::Ranges{T}) where T<: Union{TMIN,TMAX}
L = r.tmax-r.tmin+1
return div(L*(L-1),2)
end
Base.length(r::Ranges{TMAX_SPAN}) = sum(t-r.tmin for t in r.tmax) @doc raw"""
Base.length(r::Ranges{TMIN_SPAN}) = sum(r.tmax-t for t in r.tmin) fit_scan(model,xdata,ydata,npar;
tmin=1, tmax=lastindex(xdata), kwargs...)
It exectutes all the fit compatible with `tmin`, `tmax`. Return a `Vector{FitRes}
"""
function fit_scan(model,xdata,ydata,npar; function fit_scan(model,xdata,ydata,npar;
tmin = 1, tmax = lastindex(xdata), tmin = 1, tmax = lastindex(xdata),
update = Update.tmin,
W = Float64[], W = Float64[],
logfile = FitRoutines.NoPrint(), logfile = FitRoutines.NoPrint(),
wpm = Dict{Int64,Vector{Float64}}(), wpm = Dict{Int64,Vector{Float64}}(),
...@@ -110,15 +96,21 @@ function fit_scan(model,xdata,ydata,npar; ...@@ -110,15 +96,21 @@ function fit_scan(model,xdata,ydata,npar;
Printf.@printf logfile "Scanning update %s\n" string(update) Printf.@printf logfile "Scanning update %s\n" string(update)
vdata = Vector{NamedTuple}() ## vector of fit results vdata = Vector{NamedTuple}() ## vector of fit results
ranges = Ranges(tmin,tmax,update) ranges = Ranges(tmin,tmax)
fits =Vector{Union{FitRes,Missing}}(missing, length(ranges)) fits =Vector{Union{FitRes,Missing}}(missing, length(ranges))
for (idx,r) in enumerate(ranges) for (idx,r) in enumerate(ranges)
length(r)<=npar && continue; length(r)<=npar && continue;
println(logfile, "="^80, "\n") println(logfile, "="^80, "\n")
Printf.@printf logfile "Fit range [%.5e, %.5e]\n" xdata[r[1]] xdata[r[end]] 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, fit = try
guess=guess,logfile=logfile, corr=corr) fit_routine(model,xdata[r],ydata[r],npar, W=W,C=C,
guess=guess,logfile=logfile, corr=corr)
catch e
Printf.@printf logfile "Error during fit routine: %s\n" e.msg
@error "Error in fit range [%.5e,%.5e]\n" xdata[r[1]] xdata[r[end]]
continue;
end
fits[idx] = FitRes(;fit...,range = (xdata[r[1]],xdata[r[end]])) fits[idx] = FitRes(;fit...,range = (xdata[r[1]],xdata[r[end]]))
end end
flush(logfile) flush(logfile)
......
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