@@ -9,6 +9,19 @@ An abstract holder for astronomical spectra. All types inheriting from this must
99"""
1010abstract type AbstractSpectrum{W,F} end
1111
12+ """
13+ Spectrum <: AbstractSpectrum
14+
15+ A spectrum or spectra stored as arrays of real numbers. The wavelengths are assumed to be in angstrom.
16+ """
17+ mutable struct Spectrum{W<: Number , F<: Number , N} <: AbstractSpectrum{W, F}
18+ wave:: AbstractArray{W, N}
19+ flux:: AbstractArray{F, N}
20+ meta:: Dict{Symbol,Any}
21+ end
22+
23+ Spectrum (wave, flux, meta:: Dict{Symbol, Any} ) = Spectrum (collect (wave), collect (flux), meta)
24+
1225function Base. getproperty (spec:: AbstractSpectrum , nm:: Symbol )
1326 if nm in keys (getfield (spec, :meta ))
1427 return getfield (spec, :meta )[nm]
1932
2033function Base. propertynames (spec:: AbstractSpectrum )
2134 natural = (:wave , :flux , :meta )
22- meta = keys (spec . meta)
35+ meta = keys (meta (spec) )
2336 return (natural... , meta... )
2437end
2538
@@ -37,32 +50,39 @@ Return the flux of the spectrum.
3750"""
3851flux (spec:: AbstractSpectrum ) = spec. flux
3952
53+ """
54+ meta(::AbstractSpectrum)
55+
56+ Return the meta of the spectrum.
57+ """
58+ meta (spec:: AbstractSpectrum ) = spec. meta
59+
4060# Collection
41- Base. eltype (spec:: AbstractSpectrum ) = eltype (spec . flux)
42- Base. size (spec:: AbstractSpectrum ) = size (spec . flux)
43- Base. size (spec:: AbstractSpectrum , i) = size (spec . flux, i)
44- Base. length (spec:: AbstractSpectrum ) = length (spec . flux)
45- Base. maximum (spec:: AbstractSpectrum ) = maximum (spec . flux)
46- Base. minimum (spec:: AbstractSpectrum ) = minimum (spec . flux)
47- Base. argmax (spec:: AbstractSpectrum ) = argmax (spec . flux)
48- Base. argmin (spec:: AbstractSpectrum ) = argmin (spec . flux)
49- Base. findmax (spec:: AbstractSpectrum ) = findmax (spec . flux)
50- Base. findmin (spec:: AbstractSpectrum ) = findmin (spec . flux)
61+ Base. eltype (spec:: AbstractSpectrum ) = eltype (flux (spec) )
62+ Base. size (spec:: AbstractSpectrum ) = size (flux (spec) )
63+ Base. size (spec:: AbstractSpectrum , i) = size (flux (spec) , i)
64+ Base. length (spec:: AbstractSpectrum ) = length (flux (spec) )
65+ Base. maximum (spec:: AbstractSpectrum ) = maximum (flux (spec) )
66+ Base. minimum (spec:: AbstractSpectrum ) = minimum (flux (spec) )
67+ Base. argmax (spec:: AbstractSpectrum ) = argmax (flux (spec) )
68+ Base. argmin (spec:: AbstractSpectrum ) = argmin (flux (spec) )
69+ Base. findmax (spec:: AbstractSpectrum ) = findmax (flux (spec) )
70+ Base. findmin (spec:: AbstractSpectrum ) = findmin (flux (spec) )
5171
5272# Arithmetic
53- Base.:+ (s:: T , A) where {T <: AbstractSpectrum } = T (s . wave, s . flux .+ A, s . meta)
54- Base.:* (s:: T , A:: Union{Real, AbstractVector} ) where {T <: AbstractSpectrum } = T (s . wave, s . flux .* A, s . meta)
55- Base.:/ (s:: T , A) where {T <: AbstractSpectrum } = T (s . wave, s . flux ./ A, s . meta)
56- Base.:- (s:: T ) where {T <: AbstractSpectrum } = T (s . wave, - s . flux, s . meta)
73+ Base.:+ (s:: T , A) where {T <: AbstractSpectrum } = T (wave (s), flux (s) .+ A, meta (s) )
74+ Base.:* (s:: T , A:: Union{Real, AbstractVector} ) where {T <: AbstractSpectrum } = T (wave (s), flux (s) .* A, meta (s) )
75+ Base.:/ (s:: T , A) where {T <: AbstractSpectrum } = T (wave (s), flux (s) ./ A, meta (s) )
76+ Base.:- (s:: T ) where {T <: AbstractSpectrum } = T (wave (s) , - flux (s), meta (s) )
5777Base.:- (s:: AbstractSpectrum , A) = s + - A
5878Base.:- (A, s:: AbstractSpectrum ) = s - A
5979Base.:- (s:: AbstractSpectrum , o:: AbstractSpectrum ) = s - o # Satisfy Aqua
6080
6181# Multi-Spectrum
62- Base.:+ (s:: T , o:: T ) where {T <: AbstractSpectrum } = T (s . wave, s . flux .+ o . flux, s . meta)
63- Base.:* (s:: T , o:: T ) where {T <: AbstractSpectrum } = T (s . wave, s . flux .* o . flux, s . meta)
64- Base.:/ (s:: T , o:: T ) where {T <: AbstractSpectrum } = T (s . wave, s . flux ./ o . flux * unit (s)[2 ], s . meta)
65- Base.:- (s:: T , o:: T ) where {T <: AbstractSpectrum } = T (s . wave, s . flux .- o . flux, s . meta)
82+ Base.:+ (s:: T , o:: T ) where {T <: AbstractSpectrum } = T (wave (s), flux (s) .+ flux (s), meta (s) )
83+ Base.:* (s:: T , o:: T ) where {T <: AbstractSpectrum } = T (wave (s), flux (s) .* flux (s), meta (s) )
84+ Base.:/ (s:: T , o:: T ) where {T <: AbstractSpectrum } = T (wave (s), flux (s) ./ flux (s) * unit (s)[2 ], meta (s) )
85+ Base.:- (s:: T , o:: T ) where {T <: AbstractSpectrum } = T (wave (s), flux (s) .- flux (s), meta (s) )
6686
6787"""
6888 Unitful.ustrip(::AbstractSpectrum)
@@ -84,7 +104,7 @@ julia> ustrip(spec)
84104Spectrum(Float64, Float64)
85105```
86106"""
87- Unitful. ustrip (spec:: AbstractSpectrum ) = spectrum (ustrip .(spec . wave) , ustrip .(spec . flux); spec . meta... )
107+ Unitful. ustrip (spec:: AbstractSpectrum ) = spectrum (ustrip .(wave (spec)) , ustrip .(flux (spec)); meta (spec) ... )
88108
89109"""
90110 Unitful.unit(::AbstractSpectrum)
@@ -105,4 +125,4 @@ julia> w_unit, f_unit = unit(spec)
105125(Å, W Å^-1 m^-2)
106126```
107127"""
108- Unitful. unit (spec:: AbstractSpectrum ) = unit (eltype (spec . wave)) , unit (eltype (spec . flux))
128+ Unitful. unit (spec:: AbstractSpectrum ) = unit (eltype (wave (spec))) , unit (eltype (flux (spec) ))
0 commit comments