Skip to content

Commit 36ea6b6

Browse files
committed
not totally hating this
1 parent a5f3cf0 commit 36ea6b6

File tree

5 files changed

+108
-106
lines changed

5 files changed

+108
-106
lines changed

src/Spectra.jl

Lines changed: 21 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
module Spectra
22

33
# common.jl
4-
export AbstractSpectrum, spectrum
4+
export AbstractSpectrum, SingleSpectrum, EchelleSpectrum, spectrum
55
# utils.jl
66
export blackbody
77
# transforms/redden.jl
@@ -12,11 +12,12 @@ using Measurements: Measurements, Measurement
1212
using Unitful: Unitful, Quantity, @u_str, ustrip, unit, dimension
1313
using PhysicalConstants.CODATA2018: h, c_0, k_B
1414

15-
# AbstractSpectrum and common functionality
15+
# AbstractSpectrum, Spectrum, and common functionality
1616
include("common.jl")
1717

1818
# Spectrum types and basic arithmetic
19-
include("spectrum.jl")
19+
include("spectrum_single.jl")
20+
include("spectrum_echelle.jl")
2021

2122
"""
2223
spectrum(wave, flux; kwds...)
@@ -73,27 +74,27 @@ function spectrum(wave::AbstractVector{<:Real}, flux::AbstractVector{<:Real}; kw
7374
Spectrum(wave, flux, Dict{Symbol,Any}(kwds))
7475
end
7576

76-
function spectrum(wave::AbstractVector{<:Quantity}, flux::AbstractVector{<:Quantity}; kwds...)
77-
@assert size(wave) == size(flux) "wave and flux must have equal size"
78-
@assert dimension(eltype(wave)) == u"𝐋" "wave not recognized as having dimensions of wavelengths"
79-
Spectrum(wave, flux, Dict{Symbol,Any}(kwds))
80-
end
77+
#function spectrum(wave::AbstractVector{<:Quantity}, flux::AbstractVector{<:Quantity}; kwds...)
78+
# @assert size(wave) == size(flux) "wave and flux must have equal size"
79+
# @assert dimension(eltype(wave)) == u"𝐋" "wave not recognized as having dimensions of wavelengths"
80+
# Spectrum(wave, flux, Dict{Symbol,Any}(kwds))
81+
#end
8182

8283
function spectrum(wave::AbstractMatrix{<:Real}, flux::AbstractMatrix{<:Real}; kwds...)
8384
@assert size(wave) == size(flux) "wave and flux must have equal size"
84-
EchelleSpectrum(wave, flux, Dict{Symbol,Any}(kwds))
85-
end
86-
87-
function spectrum(wave::AbstractMatrix{<:Quantity}, flux::AbstractMatrix{<:Quantity}; kwds...)
88-
@assert size(wave) == size(flux) "wave and flux must have equal size"
89-
@assert dimension(eltype(wave)) == u"𝐋" "wave not recognized as having dimensions of wavelengths"
90-
EchelleSpectrum(wave, flux, Dict{Symbol,Any}(kwds))
85+
Spectrum(wave, flux, Dict{Symbol,Any}(kwds))
9186
end
9287

93-
# tools
94-
include("utils.jl")
95-
include("transforms/transforms.jl")
96-
include("plotting.jl")
97-
include("fitting/fitting.jl")
88+
#function spectrum(wave::AbstractMatrix{<:Quantity}, flux::AbstractMatrix{<:Quantity}; kwds...)
89+
# @assert size(wave) == size(flux) "wave and flux must have equal size"
90+
# @assert dimension(eltype(wave)) == u"𝐋" "wave not recognized as having dimensions of wavelengths"
91+
# EchelleSpectrum(wave, flux, Dict{Symbol,Any}(kwds))
92+
#end
93+
#
94+
## tools
95+
#include("utils.jl")
96+
#include("transforms/transforms.jl")
97+
#include("plotting.jl")
98+
#include("fitting/fitting.jl")
9899

99100
end # module

src/common.jl

Lines changed: 41 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,19 @@ An abstract holder for astronomical spectra. All types inheriting from this must
99
"""
1010
abstract 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+
1225
function Base.getproperty(spec::AbstractSpectrum, nm::Symbol)
1326
if nm in keys(getfield(spec, :meta))
1427
return getfield(spec, :meta)[nm]
@@ -19,7 +32,7 @@ end
1932

2033
function Base.propertynames(spec::AbstractSpectrum)
2134
natural = (:wave, :flux, :meta)
22-
meta = keys(spec.meta)
35+
meta = keys(meta(spec))
2336
return (natural..., meta...)
2437
end
2538

@@ -37,32 +50,39 @@ Return the flux of the spectrum.
3750
"""
3851
flux(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))
5777
Base.:-(s::AbstractSpectrum, A) = s + -A
5878
Base.:-(A, s::AbstractSpectrum) = s - A
5979
Base.:-(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)
84104
Spectrum(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)))

src/spectrum.jl

Lines changed: 0 additions & 65 deletions
This file was deleted.

src/spectrum_echelle.jl

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
const EchelleSpectrum = Spectrum{W, F, 2} where {W, F}
2+
3+
function Base.getindex(spec::EchelleSpectrum, i::Int)
4+
w = wave(spec)[i, :]
5+
f = flux(spec)[i, :]
6+
m = merge(Dict(:Order => i), meta(spec))
7+
return Spectrum(w, f, m)
8+
end
9+
10+
function Base.getindex(spec::EchelleSpectrum, I::AbstractVector)
11+
w = wave(spec)[I, :]
12+
f = flux(spec)[I, :]
13+
m = merge(Dict(:Orders => (first(I), last(I))), meta(spec))
14+
return Spectrum(w, f, m)
15+
end
16+
17+
Base.firstindex(spec::EchelleSpectrum) = firstindex(flux(spec), 1)
18+
Base.lastindex(spec::EchelleSpectrum) = lastindex(flux(spec), 1)
19+
20+
function Base.show(io::IO, spec::EchelleSpectrum)
21+
println(io, "EchelleSpectrum($(eltype(wave(spec))), $(eltype(flux(spec))))")
22+
println(io, " # orders: $(size(spec, 1))")
23+
println(io, "meta: ", meta(spec))
24+
end

src/spectrum_single.jl

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
const SingleSpectrum = Spectrum{W, F, 1} where {W, F}
2+
3+
#Base.size(spec::SingleSpectrum) = (length(wave(spec)), )
4+
#Base.IndexStyle(::Type{<:SingleSpectrum}) = IndexLinear()
5+
6+
function Base.getindex(spec::SingleSpectrum, i::Int)
7+
return Spectrum([wave(spec)[i]], [flux(spec)[i]], meta(spec))
8+
end
9+
10+
function Base.getindex(spec::SingleSpectrum, inds)
11+
return Spectrum(wave(spec)[inds], flux(spec)[inds], meta(spec))
12+
end
13+
14+
Base.firstindex(spec::SingleSpectrum) = firstindex(wave(spec))
15+
Base.lastindex(spec::SingleSpectrum) = lastindex(wave(spec))
16+
17+
function Base.show(io::IO, spec::SingleSpectrum)
18+
println(io, "SingleSpectrum($(eltype(wave(spec))), $(eltype(flux(spec))))")
19+
println(io, "wave: ", wave(spec))
20+
println(io, "flux: ", flux(spec))
21+
println(io, "meta: ", meta(spec))
22+
end

0 commit comments

Comments
 (0)