diff --git a/src/ImpurityDensities/ImpurityDensities.jl b/src/ImpurityDensities/ImpurityDensities.jl index d23cd8061..0567c4305 100644 --- a/src/ImpurityDensities/ImpurityDensities.jl +++ b/src/ImpurityDensities/ImpurityDensities.jl @@ -24,12 +24,24 @@ In this matter the detector impurities are automatically determined from those o abstract type AbstractImpurityDensity{T <: SSDFloat} end @inline function ImpurityDensity(T::DataType, dict::AbstractDict, input_units::NamedTuple) - return ImpurityDensity(T, Val{Symbol(dict["name"])}(), dict, input_units) + imp = ImpurityDensity(T, Val{Symbol(dict["name"])}(), dict, input_units) + if !haskey(dict, "corrections") + imp + else + scale = _parse_value(T, get(dict["corrections"], "scale", 1), NoUnits) + offset = _parse_value(T, get(dict["corrections"], "offset", 0), input_units.length^(-3)) + (scale * imp) + offset + end end (*)(idm::AbstractImpurityDensity, scale::Real) = (*)(scale, idm) (+)(idm::AbstractImpurityDensity, offset::Union{<:Real, <:Quantity{<:Real, Unitful.𝐋^(-3)}}) = (+)(offset, idm) +# Throw ConfigFileError for impurity densities that do not support corrections +(*)(scale::Real, ::I) where {I <: AbstractImpurityDensity} = throw(ConfigFileError("Impurity density $(I.name.name) does not support corrections")) +(+)(offset::Union{<:Real, <:Quantity{<:Real, Unitful.𝐋^(-3)}}, ::I) where {I <: AbstractImpurityDensity} = throw(ConfigFileError("Impurity density $(I.name.name) does not support corrections")) + + """ get_impurity_density(id::AbstractImpurityDensity, pt::AbstractCoordinatePoint) diff --git a/src/SolidStateDetector/Semiconductor.jl b/src/SolidStateDetector/Semiconductor.jl index af1c535f9..a63e81b62 100644 --- a/src/SolidStateDetector/Semiconductor.jl +++ b/src/SolidStateDetector/Semiconductor.jl @@ -51,10 +51,7 @@ end function Semiconductor{T}(dict::AbstractDict, input_units::NamedTuple, outer_transformations) where T <: SSDFloat impurity_density_model = if haskey(dict, "impurity_density") - hascorrections = haskey(dict["impurity_density"], "corrections") - impurity_density_scale = hascorrections ? _parse_value(T, get(dict["impurity_density"]["corrections"], "scale", 1), NoUnits) : T(1) - impurity_density_offset = hascorrections ? _parse_value(T, get(dict["impurity_density"]["corrections"], "offset", 0), input_units.length^(-3)) : T(0) - impurity_density_scale * ImpurityDensity(T, dict["impurity_density"], input_units) + impurity_density_offset + imp = ImpurityDensity(T, dict["impurity_density"], input_units) elseif haskey(dict, "charge_density_model") @warn "Config file deprication: The field \"charge_density_model\" under semiconductor is deprecated. It should be changed to \"impurity_density\". In later version this will result in an error.