diff --git a/docs/src/color_laws.md b/docs/src/color_laws.md index 72232e0..6a78f2d 100644 --- a/docs/src/color_laws.md +++ b/docs/src/color_laws.md @@ -280,7 +280,9 @@ G16 ```@docs redden +redden! deredden +deredden! DustExtinction.ExtinctionLaw DustExtinction.bounds DustExtinction.checkbounds diff --git a/src/DustExtinction.jl b/src/DustExtinction.jl index 52f3e22..84a55bb 100644 --- a/src/DustExtinction.jl +++ b/src/DustExtinction.jl @@ -7,7 +7,9 @@ import FITSIO as FITS import BSplineKit as BSK export redden, + redden!, deredden, + deredden!, # Rv laws CCM89, CAL00, @@ -117,11 +119,23 @@ julia> redden(CCM89(Rv=3.1), wave, flux; Av=2) # See Also [`deredden`](@ref) """ -redden(L::Type{<:ExtinctionLaw}, wave, flux; Av = 1, kwargs...) = redden(L(values(kwargs)...), wave, flux; Av = Av) +redden(L::Type{<:ExtinctionLaw}, wave, flux; Av = 1, kwargs...) = redden(L(values(kwargs)...), wave, flux; Av) redden(law::ExtinctionLaw, wave::Real, flux; Av = 1) = flux * 10^(-0.4 * Av * law(wave)) -redden(law::ExtinctionLaw, wave::U.Quantity, flux::Real; Av = 1) = redden(law, U.ustrip(U.u"Å", wave), flux; Av = Av) +redden(law::ExtinctionLaw, wave::U.Quantity, flux::Real; Av = 1) = redden(law, U.ustrip(U.u"Å", wave), flux; Av) redden(law::ExtinctionLaw, wave::U.Quantity, flux::U.Quantity; Av = 1) = flux * (Av * law(wave)) +""" + redden!(::ExtinctionLaw, wave, flux; Av=1) + redden!(::Type{ExtinctionLaw}, wave, flux; Av=1, law_kwargs...) + +In-place version of [`redden`](@ref). Modifies `flux`. +""" +function redden!(law::ExtinctionLaw, wave, flux; Av = 1) + @. flux *= 10^(-0.4 * Av * law(wave)) + return flux +end +redden!(L::Type{<:ExtinctionLaw}, wave, flux; Av = 1, kwargs...) = redden!(L(values(kwargs)...), wave, flux; Av) + """ deredden(::ExtinctionLaw, wave, flux; Av=1) deredden(::Type{ExtinctionLaw}, wave, flux; Av=1, law_kwargs...) @@ -148,11 +162,23 @@ julia> deredden(CCM89(Rv=3.1), wave, flux; Av=2) # See Also [`redden`](@ref) """ -deredden(L::Type{<:ExtinctionLaw}, wave, flux; Av = 1, kwargs...) = deredden(L(values(kwargs)...), wave, flux; Av = Av) +deredden(L::Type{<:ExtinctionLaw}, wave, flux; Av = 1, kwargs...) = deredden(L(values(kwargs)...), wave, flux; Av) deredden(law::ExtinctionLaw, wave::Real, flux; Av = 1) = flux / 10^(-0.4 * Av * law(wave)) -deredden(law::ExtinctionLaw, wave::U.Quantity, flux::Real; Av = 1) = deredden(law, U.ustrip(U.u"Å", wave), flux; Av = Av) +deredden(law::ExtinctionLaw, wave::U.Quantity, flux::Real; Av = 1) = deredden(law, U.ustrip(U.u"Å", wave), flux; Av) deredden(law::ExtinctionLaw, wave::U.Quantity, flux::U.Quantity; Av = 1) = flux / (Av * law(wave)) +""" + deredden!(::ExtinctionLaw, wave, flux; Av=1) + deredden!(::Type{ExtinctionLaw}, wave, flux; Av=1, law_kwargs...) + +In-place version of [`deredden`](@ref). Modifies `flux`. +""" +function deredden!(law::ExtinctionLaw, wave, flux; Av = 1) + @. flux /= 10^(-0.4 * Av * law(wave)) + return flux +end +deredden!(L::Type{<:ExtinctionLaw}, wave, flux; Av = 1, kwargs...) = deredden!(L(values(kwargs)...), wave, flux; Av) + # -------------------------------------------------------------------------------- # bring in the support diff --git a/test/runtests.jl b/test/runtests.jl index 026f6ad..a40826a 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -54,9 +54,9 @@ using Test, Measurements, SkyCoords, Unitful, UnitfulAstro, Random ] flux = ones(length(wave)) - output = @inferred broadcast((l, w, f)->redden(l, w, f; Av = 0.3), CCM89, wave, flux) + output = @inferred broadcast((l, w, f) -> redden(l, w, f; Av = 0.3), CCM89, wave, flux) @test output ≈ ref_values - @test @inferred(broadcast((l, w, f)->deredden(l, w, f; Av = 0.3), CCM89, wave, output)) ≈ flux + @test @inferred(broadcast((l, w, f) -> deredden(l, w, f; Av = 0.3), CCM89, wave, output)) ≈ flux flux .= redden.(CCM89, wave, flux, Av = 0.3) @test flux ≈ ref_values @@ -67,21 +67,32 @@ using Test, Measurements, SkyCoords, Unitful, UnitfulAstro, Random @test redden.(CCM89, wave, flux) == redden.(CCM89(), wave, flux) @test redden.(CCM89, wave, flux, Rv = 2.8) == redden.(CCM89(Rv = 2.8), wave, flux) + # in-place reddening/de-reddening + flux_mut = copy(flux) + redden!(CCM89, wave, flux_mut) + @test redden.(CCM89, wave, flux) == flux_mut + flux_mut = copy(flux) + redden!(CCM89, wave, flux_mut, Rv = 2.8) + @test redden.(CCM89(Rv = 2.8), wave, flux) == flux_mut + flux_mut = copy(flux) + deredden!(CCM89, wave, flux_mut, Rv = 2.8) + @test flux_mut == deredden.(CCM89(Rv = 2.8), wave, flux) + # Measurements flux = ones(length(wave)) .± 0.1 - output = @inferred broadcast((l, w, f)->redden(l, w, f; Av = 0.3), CCM89, wave, flux) + output = @inferred broadcast((l, w, f) -> redden(l, w, f; Av = 0.3), CCM89, wave, flux) @test Measurements.value.(output) ≈ ref_values - @test @inferred(broadcast((l, w, f)->deredden(l, w, f; Av = 0.3), CCM89, wave, output)) ≈ flux + @test @inferred(broadcast((l, w, f) -> deredden(l, w, f; Av = 0.3), CCM89, wave, output)) ≈ flux flux .= redden.(CCM89, wave, flux, Av = 0.3) @test flux ≈ ref_values # Unitful flux = ones(length(wave))u"Jy" wave = wave * u"angstrom" - output = @inferred broadcast((l, w, f)->redden(l, w, f; Av = 0.3), CCM89, wave, flux) + output = @inferred broadcast((l, w, f) -> redden(l, w, f; Av = 0.3), CCM89, wave, flux) @test redden.(CCM89, wave, ustrip.(u"Jy", flux), Av = 0.3) ≈ ustrip.(u"Jy", output) @test ustrip.(output) ≈ ref_values - @test @inferred(broadcast((l, w, f)->deredden(l, w, f; Av = 0.3), CCM89, wave, output)) ≈ flux + @test @inferred(broadcast((l, w, f) -> deredden(l, w, f; Av = 0.3), CCM89, wave, output)) ≈ flux @test deredden.(CCM89, wave, ustrip.(u"Jy", output), Av = 0.3) ≈ ustrip.(u"Jy", flux) flux .= redden.(CCM89, wave, flux, Av = 0.3) @test flux ≈ output