From b6707e4080cf0e074e6f343a9de5861554364da4 Mon Sep 17 00:00:00 2001 From: Claudia Alvarez Garcia Date: Mon, 22 Jun 2026 11:16:41 +0200 Subject: [PATCH 1/3] delete temperature --- examples/example_config_files/ivc_inactivelayer.yaml | 1 - examples/example_config_files/public_TrueCoaxial.yaml | 1 - 2 files changed, 2 deletions(-) diff --git a/examples/example_config_files/ivc_inactivelayer.yaml b/examples/example_config_files/ivc_inactivelayer.yaml index 3bc9aff87..265d69d5e 100644 --- a/examples/example_config_files/ivc_inactivelayer.yaml +++ b/examples/example_config_files/ivc_inactivelayer.yaml @@ -36,7 +36,6 @@ detectors: value: -1e10cm^-3 charge_drift_model: model: InactiveLayerChargeDriftModel - temperature: 90K neutral_impurity_density: name: constant value: 5.6769e15cm^-3 diff --git a/examples/example_config_files/public_TrueCoaxial.yaml b/examples/example_config_files/public_TrueCoaxial.yaml index 9aed3c0aa..36bd58087 100644 --- a/examples/example_config_files/public_TrueCoaxial.yaml +++ b/examples/example_config_files/public_TrueCoaxial.yaml @@ -37,7 +37,6 @@ detectors: value: -1e10cm^-3 charge_drift_model: model: InactiveLayerChargeDriftModel - temperature: 90K neutral_impurity_density: name: constant value: 5.6769e15cm^-3 From 345ec7f03824d3a3be49816b46854e72d1a8bc6b Mon Sep 17 00:00:00 2001 From: Claudia Alvarez Garcia Date: Mon, 22 Jun 2026 11:16:52 +0200 Subject: [PATCH 2/3] Fix tests --- test/test_charge_drift_models.jl | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/test/test_charge_drift_models.jl b/test/test_charge_drift_models.jl index 32ab3a9f5..fc2ddbed4 100644 --- a/test/test_charge_drift_models.jl +++ b/test/test_charge_drift_models.jl @@ -76,7 +76,7 @@ end end @timed_testset "Charge Trapping: BoggsChargeTrappingModel" begin - sim.detector = SolidStateDetector(sim.detector, BoggsChargeTrappingModel{T}()) + sim.detector = SolidStateDetector(sim.detector, BoggsChargeTrappingModel{T}(sim.detector.semiconductor.temperature)) evt = Event(pos, Edep) timed_simulate!(evt, sim) signalsum = T(0) @@ -92,15 +92,13 @@ end "model" => "Boggs", "parameters" => Dict( "nσe" => "0.001cm^-1", - "nσh" => "0.0005cm^-1", - "temperature" => "78K" + "nσh" => "0.0005cm^-1" ) ) simA = @test_nowarn Simulation{T}(config_dict) @test simA.detector.semiconductor.charge_trapping_model isa BoggsChargeTrappingModel{T} @test simA.detector.semiconductor.charge_trapping_model.nσe == T(0.1) @test simA.detector.semiconductor.charge_trapping_model.nσh == T(0.05) - @test simA.detector.semiconductor.charge_trapping_model.temperature == T(78) end @testset "Parse config file 2" begin config_dict["detectors"][1]["semiconductor"]["charge_trapping_model"] = Dict( @@ -109,8 +107,7 @@ end "nσe-1" => "500cm", "nσh-1" => "500cm", "meffe" => 0.1, - "meffh" => 0.2, - "temperature" => "100K" + "meffh" => 0.2 ) ) simB = @test_nowarn Simulation{T}(config_dict) @@ -119,7 +116,6 @@ end @test simB.detector.semiconductor.charge_trapping_model.nσh == T(0.2) @test simB.detector.semiconductor.charge_trapping_model.meffe == T(0.1) @test simB.detector.semiconductor.charge_trapping_model.meffh == T(0.2) - @test simB.detector.semiconductor.charge_trapping_model.temperature == T(100) end end @@ -175,7 +171,7 @@ end for (τ,τ_inactive) in zip(τ_list, τ_inactive_list) parameters = Dict("model" => "ConstantLifetime", "model_inactive" => "ConstantLifetime", "parameters" => Dict("τh" => τ, "τe" => τ), "parameters_inactive" => Dict("τh" => τ_inactive, "τe" => τ_inactive), "inactive_layer_geometry" => simA_inactive_layer_geometry) - trapping_model=CombinedChargeTrappingModel{T}(parameters) + trapping_model=CombinedChargeTrappingModel{T}(simA.detector.semiconductor.temperature, parameters) simA.detector = SolidStateDetector(simA.detector, trapping_model) evt_bulk = Event(pos_bulk , Edep) timed_simulate!(evt_bulk, simA) @@ -205,7 +201,7 @@ end τ, τ_inactive = 1u"ms", 100u"ns" parameters = Dict("model" => "ConstantLifetime", "model_inactive" => "ConstantLifetime", "parameters" => Dict("τh" => τ, "τe" => τ), "parameters_inactive" => Dict("τh" => τ_inactive, "τe" => τ_inactive), "inactive_layer_geometry" => simA_inactive_layer_geometry) - trapping_model=CombinedChargeTrappingModel{T}(parameters) + trapping_model=CombinedChargeTrappingModel{T}(simA.detector.semiconductor.temperature, parameters) simA.detector = SolidStateDetector(simA.detector, trapping_model) signalsum_list_inactive = T[] for depth in (0.1:0.1:0.9)/1000 From 8c2bc40426a481f90e4ae73abd3ad7150fdb8c0f Mon Sep 17 00:00:00 2001 From: Claudia Alvarez Garcia Date: Mon, 22 Jun 2026 11:17:22 +0200 Subject: [PATCH 3/3] Inherit temperature --- .../InactiveLayerChargeDriftModel.jl | 9 ++++++--- src/ChargeTrapping/ChargeTrapping.jl | 9 ++++----- src/SolidStateDetector/Semiconductor.jl | 6 +++--- 3 files changed, 13 insertions(+), 11 deletions(-) diff --git a/src/ChargeDriftModels/InactiveLayerChargeDriftModel/InactiveLayerChargeDriftModel.jl b/src/ChargeDriftModels/InactiveLayerChargeDriftModel/InactiveLayerChargeDriftModel.jl index 187122f18..29e4887ad 100644 --- a/src/ChargeDriftModels/InactiveLayerChargeDriftModel/InactiveLayerChargeDriftModel.jl +++ b/src/ChargeDriftModels/InactiveLayerChargeDriftModel/InactiveLayerChargeDriftModel.jl @@ -63,11 +63,14 @@ function _calculate_mobility_with_impurities( end function InactiveLayerChargeDriftModel{T}(config::AbstractDict, - imp_model::AbstractImpurityDensity, input_units::NamedTuple, + imp_model::AbstractImpurityDensity, input_units::NamedTuple, temperature::RealQuantity ) where {T <: SSDFloat} - temperature = _parse_value(T, get(config, "temperature", 90u"K"), input_units.temperature) + temperature::T = _parse_value(T, temperature, input_units.temperature) + if temperature < 50 || temperature > 150 + @warn "Temperature = $(temperature) K is outside the typical validated range (50–150 K)." + end neutral_imp_model = if haskey(config, "neutral_impurity_density") ImpurityDensity(T, config["neutral_impurity_density"], input_units) else @@ -98,4 +101,4 @@ end @fastmath function getVh(fv::SVector{3, T}, cdm::InactiveLayerChargeDriftModel{T}, current_pos::CartesianPoint{T} = zero(CartesianPoint{T})) where {T <: SSDFloat} calculate_mobility(cdm, current_pos, Hole) * fv -end \ No newline at end of file +end diff --git a/src/ChargeTrapping/ChargeTrapping.jl b/src/ChargeTrapping/ChargeTrapping.jl index b0990910d..01ae73d27 100644 --- a/src/ChargeTrapping/ChargeTrapping.jl +++ b/src/ChargeTrapping/ChargeTrapping.jl @@ -66,7 +66,6 @@ Charge trapping model presented in [Boggs _et al._ (2023)](https://doi.org/10.10 ## Fields * `nσe::T`: Trapping product for electrons (default: `(nσe)^-1 = 1020cm`). * `nσh::T`: Trapping product for holes (default: `(nσh)^-1 = 2040cm`). -* `temperature::T`: Temperature of the crystal (default: `78K`). See also [Charge Trapping Models](@ref). """ @@ -124,7 +123,7 @@ end BoggsChargeTrappingModel(args...; T::Type{<:SSDFloat}, kwargs...) = BoggsChargeTrappingModel{T}(args...; kwargs...) -function BoggsChargeTrappingModel{T}(config_dict::AbstractDict = Dict(); temperature::RealQuantity = T(78)) where {T <: SSDFloat} +function BoggsChargeTrappingModel{T}(temperature::RealQuantity, config_dict::AbstractDict = Dict()) where {T <: SSDFloat} nσe::T = ustrip(u"m^-1", inv(1020u"cm")) nσh::T = ustrip(u"m^-1", inv(2040u"cm")) meffe::T = 0.12 @@ -147,7 +146,7 @@ function BoggsChargeTrappingModel{T}(config_dict::AbstractDict = Dict(); tempera if haskey(parameters, "nσh-1") nσh = inv(_parse_value(T, parameters["nσh-1"], internal_length_unit)) end if haskey(parameters, "meffe") meffe = _parse_value(T, parameters["meffe"], Unitful.NoUnits) end if haskey(parameters, "meffh") meffh = _parse_value(T, parameters["meffh"], Unitful.NoUnits) end - if haskey(parameters, "temperature") temperature = _parse_value(T, parameters["temperature"], internal_temperature_unit) end + BoggsChargeTrappingModel{T}(nσe, nσh, meffe, meffh, temperature) end @@ -330,7 +329,7 @@ end CombinedChargeTrappingModel(args...; T::Type{<:SSDFloat}, kwargs...) = CombinedChargeTrappingModel{T}(args...; kwargs...) -function CombinedChargeTrappingModel{T}(config_dict::AbstractDict = Dict(); temperature::RealQuantity = T(78)) where {T <: SSDFloat} +function CombinedChargeTrappingModel{T}(temperature::RealQuantity, config_dict::AbstractDict = Dict()) where {T <: SSDFloat} if haskey(config_dict, "model") && config_dict["model"] !== nothing && !(haskey(config_dict, "parameters")) throw(ConfigFileError("`CombinedChargeTrappingModel` does not have `parameters`")) @@ -347,7 +346,7 @@ function CombinedChargeTrappingModel{T}(config_dict::AbstractDict = Dict(); temp if isnothing(model) throw(ConfigFileError("`model` is defined but empty in config. Remove it or provide a valid name.")) elseif model == "Boggs" - BoggsChargeTrappingModel{T}(config_dict; temperature) + BoggsChargeTrappingModel{T}(temperature, config_dict) elseif model == "ConstantLifetime" ConstantLifetimeChargeTrappingModel{T}(config_dict) else diff --git a/src/SolidStateDetector/Semiconductor.jl b/src/SolidStateDetector/Semiconductor.jl index 64f69c973..506805eda 100644 --- a/src/SolidStateDetector/Semiconductor.jl +++ b/src/SolidStateDetector/Semiconductor.jl @@ -70,7 +70,7 @@ function Semiconductor{T}(dict::AbstractDict, input_units::NamedTuple, outer_tra model = Symbol(dict["charge_drift_model"]["model"]) cdm = if isdefined(SolidStateDetectors, model) && getfield(SolidStateDetectors, model) <: AbstractChargeDriftModel if model == :InactiveLayerChargeDriftModel - InactiveLayerChargeDriftModel{T}(dict["charge_drift_model"], impurity_density_model, input_units) + InactiveLayerChargeDriftModel{T}(dict["charge_drift_model"], impurity_density_model, input_units, temperature) else getfield(SolidStateDetectors, model){T}(dict["charge_drift_model"], input_units, temperature = temperature) end @@ -98,11 +98,11 @@ function Semiconductor{T}(dict::AbstractDict, input_units::NamedTuple, outer_tra ctm_dict["parameters"]==ctm_dict["parameters_inactive"] && ctm_dict["model"] == "ConstantLifetime" ConstantLifetimeChargeTrappingModel{T}(ctm_dict) else - CombinedChargeTrappingModel{T}(ctm_dict, temperature = temperature) + CombinedChargeTrappingModel{T}(temperature, ctm_dict) end elseif haskey(ctm_dict, "model") && !haskey(ctm_dict, "model_inactive") && ctm_dict["model"] == "Boggs" - BoggsChargeTrappingModel{T}(ctm_dict, temperature = temperature) + BoggsChargeTrappingModel{T}(temperature, ctm_dict) elseif haskey(ctm_dict, "model") && !haskey(ctm_dict, "model_inactive") && ctm_dict["model"] == "ConstantLifetime" ConstantLifetimeChargeTrappingModel{T}(ctm_dict)