Mass Spectra

JuChrom.AbstractMassSpectrumType
AbstractMassSpectrum

Supertype for all mass spectrum implementations. All subtypes (e.g., MassSpectrum) include fields to store ions, their associated intensities, and optionally, retention time, retention index, and metadata.

See also MassSpectrum.

source
JuChrom.MassSpectrumType
MassSpectrum(ions::AbstractVector{<:Real}, intensities::AbstractVector{<:Real};
retentiontime::Union{Unitful.Time, Nothing}=nothing,
retentionindexname::Union{AbstractString, Nothing}=nothing,
retentionindex::Union{<:Real, Nothing}=nothing, metadata::Dict=Dict())

Construct a ChromMS object that includes scantimes, ions, intensities, and metadata. Note that scantimes and ions must be in ascending order, and intensities must not contain any values less than zero. The retentiontime must include a time unit. All time units supported by the Unitful.jl package(e.g., u"s", u"minute") are accepted.

See also AbstractMassSpectrum, ions(::AbstractMassSpectrum), intensities(::AbstractMassSpectrum), retentiontime(::AbstractMassSpectrum; ::Unitful.TimeUnits, ::Bool), retentionindexname(::AbstractMassSpectrum), retentionindex(::AbstractMassSpectrum), metadata(::AbstractMassSpectrum), sharedions, similarity.

Examples

julia> MassSpectrum([85.1, 112.2, 124.1], Int64[13, 0, 67])
MassSpectrum {ions: Float64, intensities: Int64}
3 ions: m/z 85.1, 112.2, 124.1
intensity range: 0 - 67
metadata: 0 entries

julia> MassSpectrum([85.1, 112.2, 124.1], Int64[13, 0, 67], retentiontime=3.2u"minute")
MassSpectrum {ions: Float64, intensities: Int64}
3 ions: m/z 85.1, 112.2, 124.1
intensity range: 0 - 67
retention time: 3.2 minute
metadata: 0 entries

julia> MassSpectrum([1.2, 2.1], [1.1, 8.1], retentionindex=131, retentionindexname="Kovats")
MassSpectrum {ions: Float64, intensities: Float64}
2 ions: m/z 1.2, 2.1
intensity range: 1.1 - 8.1
retention index: 131 (Kovats)
metadata: 0 entries

julia> MassSpectrum([85.1, 112.2, 124.1], [13.0, 0.0, 67.0], metadata=Dict(:name=>"Hexane"))
MassSpectrum {ions: Float64, intensities: Float64}
3 ions: m/z 85.1, 112.2, 124.1
intensity range: 0.0 - 67.0
metadata: 1 entry
source
JuChrom.cosineFunction
cosine(x::AbstractVector{<:Real}, y::AbstractVector{<:Real})

Return the angle between two non-zero vectors, which can be considered a measure of the similarity (i.e., cosine similarity) between the two vectors.

See also similarity.

Examples

julia> cosine([100, 500, 250], [200, 1000, 0]) ≈ 0.8978872704229618
true

julia> cosine([100, 0, 50], [0, 20, 0]) ≈ 0.0
true

julia> cosine([10, 50, 25], [100, 500, 250]) ≈ 1.0
true
source
JuChrom.intensityMethod
intensity(ms::AbstractMassSpectrum, ionindex::Integer)

Return the intensity for an ion by specifying its index.

See also AbstractMassSpectrum, intensities(::AbstractMassSpectrum), maxintensity(::AbstractMassSpectrum), minintensity(::AbstractMassSpectrum).

Examples

julia> ms = MassSpectrum(Int64[85, 112, 124], Int64[13, 0, 67])
MassSpectrum {ions: Int64, intensities: Int64}
3 ions: m/z 85, 112, 124
intensity range: 0 - 67
metadata: 0 entries

julia> intensity(ms, 1)
13

julia> intensity(ms, 2)
0

julia> intensity(ms, 4)
ERROR: BoundsError: attempt to access 3-element Vector{Int64} at index [4]
[...]
source
JuChrom.intensitydifferencesFunction
intensitydifferences(ms₁::AbstractMassSpectrum, ms₂::AbstractMassSpectrum)

Return the intensity difference for each ion in ms₁ and ms₂, with any negative results set to zero. This function assumes both mass spectra contain data for the same set of ions.

See also AbstractMassSpectrum, ions(::AbstractMassSpectrum), intensities(::AbstractMassSpectrum), intensitysums, meanintensities.

Examples

julia> ms₁ = MassSpectrum([80, 85, 90], [10, 80, 5]);

julia> ms₂ = MassSpectrum([80, 85, 90], [0, 10, 0]);

julia> intensitydifferences(ms₁, ms₂)
3-element Vector{Int64}:
 10
 70
  5

julia> intensitydifferences(ms₂, ms₁)
3-element Vector{Int64}:
 0
 0
 0

julia> ms₃ = MassSpectrum([80, 85, 90], [5.5, 20.1, 5]);

julia> intensitydifferences(ms₁, ms₃) ≈ [4.5, 59.9, 0.0]
true

julia> intensitydifferences(MassSpectrum([80], [5]), MassSpectrum([81], [5]))
ERROR: ArgumentError: mass spectra differ in ions
[...]
source
JuChrom.intensitysumsFunction
intensitysums(ms₁::AbstractMassSpectrum, ms₂::AbstractMassSpectrum)

Return the intensity sums for each ion in ms₁ and ms₂. This function assumes that both mass spectra contain data for the same set of ions.

See also AbstractMassSpectrum, ions(::AbstractMassSpectrum), intensities(::AbstractMassSpectrum), meanintensities.

Examples

julia> ms₁ = MassSpectrum([80, 85, 90], Int64[0, 10, 0]);

julia> ms₂ = MassSpectrum([80, 85, 90], Int64[10, 80, 5]);

julia> intensitysums(ms₁, ms₂)
3-element Vector{Int64}:
 10
 90
  5

julia> ms₃ = MassSpectrum([80, 85, 90], Float64[10, 80, 5]);

julia> intensitysums(ms₁, ms₃) ≈ [10.0, 90.0, 5.0]
true

julia> intensitysums(MassSpectrum([80], [5]), MassSpectrum([81], [5]))
ERROR: ArgumentError: mass spectra differ in ions
[...]
source
JuChrom.ionMethod
ion(ms::AbstractMassSpectrum, ionindex::Integer)

Return the ion at the specified ionindex.

See also AbstractMassSpectrum, ions(::AbstractMassSpectrum), maxion(::AbstractMassSpectrum), minion(::AbstractMassSpectrum), ioncount(::AbstractMassSpectrum), ionindex(::AbstractMassSpectrum, ::Real), sharedions.

Examples

julia> ms = MassSpectrum(Int64[85, 112, 124], Int64[13, 0, 67])
MassSpectrum {ions: Int64, intensities: Int64}
3 ions: m/z 85, 112, 124
intensity range: 0 - 67
metadata: 0 entries

julia> ion(ms, 1)
85

julia> ion(ms, 2)
112

julia> ion(ms, 3)
124

julia> ion(ms, 4)
ERROR: BoundsError: attempt to access 3-element Vector{Int64} at index [4]
[...]

julia> ion.(ms, 1:2)  # broadcasting across multiple ion indices
2-element Vector{Int64}:
  85
 112

See also AbstractMassSpectrum, ions(::AbstractMassSpectrum), ionindex(::AbstractMassSpectrum, ::Real), minion(::AbstractMassSpectrum), maxion(::AbstractMassSpectrum), ioncount(::AbstractMassSpectrum).

source
JuChrom.ionindexMethod
ionindex(ms::AbstractMassSpectrum, ion::Real) -> Int

Return the index of the ion. If the ion is not present in the mass spectrum, an error is raised.

See also AbstractMassSpectrum, ion(::AbstractMassSpectrum, ::Integer), ions(::AbstractMassSpectrum), ioncount(::AbstractMassSpectrum), maxion(::AbstractMassSpectrum), minion(::AbstractMassSpectrum).

Example

julia> ms = MassSpectrum([85.1, 112.0, 124.2], Int64[13, 0, 67])
MassSpectrum {ions: Float64, intensities: Int64}
3 ions: m/z 85.1, 112.0, 124.2
intensity range: 0 - 67
metadata: 0 entries

julia> ionindex(ms, 124.2)
3

julia> ionindex(ms, 124)
ERROR: ArgumentError: ion 124 does not exist
[...]

See also AbstractMassSpectrum, ions(::AbstractMassSpectrum), ion(::AbstractMassSpectrum, ::Integer), minion(::AbstractMassSpectrum), maxion(::AbstractMassSpectrum), ioncount(::AbstractMassSpectrum).

source
JuChrom.ionsMethod
ions(ms::AbstractMassSpectrum)

Return the ions.

See also AbstractMassSpectrum, ion(::AbstractMassSpectrum, ::Integer), maxion(::AbstractMassSpectrum), minion(::AbstractMassSpectrum), ioncount(::AbstractMassSpectrum), ionindex(::AbstractMassSpectrum, ::Real), sharedions.

Example

julia> ms = MassSpectrum(Int64[85, 112, 124], Int64[13, 0, 67])
MassSpectrum {ions: Int64, intensities: Int64}
3 ions: m/z 85, 112, 124
intensity range: 0 - 67
metadata: 0 entries

julia> ions(ms)
3-element Vector{Int64}:
  85
 112
 124
source
JuChrom.ioncountMethod
ioncount(ms::AbstractMassSpectrum) -> Int

Return the number of ions.

See also AbstractMassSpectrum, ions(::AbstractMassSpectrum), ion(::AbstractMassSpectrum, ::Integer), ionindex(::AbstractMassSpectrum, ::Real), minion(::AbstractMassSpectrum), maxion(::AbstractMassSpectrum), sharedions.

Example

julia> ms = MassSpectrum(Int64[85, 112, 124], Int64[13, 0, 67])
MassSpectrum {ions: Int64, intensities: Int64}
3 ions: m/z 85, 112, 124
intensity range: 0 - 67
metadata: 0 entries

julia> ioncount(ms)
3
source
JuChrom.massspectrumFunction
massspectrum(chrom::AbstractChromMS, scanindex::Integer; 
retentionindexname::Union{AbstractString, Nothing}=nothing,
retentionindex::Union{Real, Nothing}=nothing, metadata::Dict=Dict())

Returns a MassSpectrum containing the intensity values for all ions at the specified scan index. The optional keyword arguments, retentionindexname and retentionindex, allow the mass spectrum to be associated with a retention index. Note that both retentionindexname and retentionindex must always be provided together. The optional keyword argument metadata allows the mass spectrum to be associated with additional metadata.

See also AbstractChromMS, MassSpectrum, ions(::AbstractMassSpectrum), intensities(::AbstractMassSpectrum), retentiontime(::AbstractMassSpectrum; ::Unitful.TimeUnits, ::Bool).

Examples

julia> chrom = ChromMS([1, 2, 3]u"s", [85, 100], [0 12; 34 956; 23 1])
ChromMS {scan times: Int64, ions: Int64, intensities: Int64}
3 scans; scan times: 1 s, 2 s, 3 s
2 ions: m/z 85, 100
intensity range: 0 - 956
metadata: 0 entries

julia> massspectrum(chrom, 2)
MassSpectrum {ions: Int64, intensities: Int64}
2 ions: m/z 85, 100
intensity range: 34 - 956
retention time: 2 s
metadata: 0 entries

julia> massspectrum(chrom, 2, retentionindexname="Kovats", retentionindex=123.21)
MassSpectrum {ions: Int64, intensities: Int64}
2 ions: m/z 85, 100
intensity range: 34 - 956
retention time: 2 s
retention index: 123.21 (Kovats)
metadata: 0 entries

julia> ms = massspectrum(chrom, 2, metadata=Dict(:compound => "hexane"))
MassSpectrum {ions: Int64, intensities: Int64}
2 ions: m/z 85, 100
intensity range: 34 - 956
retention time: 2 s
metadata: 1 entry

julia> metadata(ms)
Dict{Any, Any} with 1 entry:
  :compound => "hexane"
source
massspectrum(chrom::AbstractChromMS, time::Unitful.Time; precisetime::Bool=false, 
retentionindexname::Union{AbstractString, Nothing}=nothing,
retentionindex::Union{Real, Nothing}=nothing, metadata::Dict=Dict())

Return a MassSpectrum containing the intensity values for all ions in the scan with a scan time closest to the specified time. All time units defined in the package Unitful.jl (e.g., u"s", u"minute") are supported. In case of a tie, the larger scan time is selected. If the optional parameter precisetime is set to true, the specified time must match exactly, otherwise an error will be thrown. The optional keyword arguments, retentionindexname and retentionindex, allow the mass spectrum to be associated with a retention index. Note that both retentionindexname and retentionindex must always be provided together. The optional keyword argument metadata allows the mass spectrum to be associated with additional metadata.

See also AbstractChromMS, MassSpectrum, ions(::AbstractMassSpectrum), intensities(::AbstractMassSpectrum), retentiontime(::AbstractMassSpectrum; ::Unitful.TimeUnits, ::Bool).

Examples

julia> chrom = ChromMS([1, 2, 3]u"s", [85, 100], [0 12; 34 956; 23 1])
ChromMS {scan times: Int64, ions: Int64, intensities: Int64}
3 scans; scan times: 1 s, 2 s, 3 s
2 ions: m/z 85, 100
intensity range: 0 - 956
metadata: 0 entries

julia> massspectrum(chrom, 2u"s")
MassSpectrum {ions: Int64, intensities: Int64}
2 ions: m/z 85, 100
intensity range: 34 - 956
retention time: 2 s
metadata: 0 entries

julia> massspectrum(chrom, 2.5u"s")
MassSpectrum {ions: Int64, intensities: Int64}
2 ions: m/z 85, 100
intensity range: 1 - 23
retention time: 3 s
metadata: 0 entries

julia> massspectrum(chrom, 3.5u"s")
MassSpectrum {ions: Int64, intensities: Int64}
2 ions: m/z 85, 100
intensity range: 1 - 23
retention time: 3 s
metadata: 0 entries

julia> massspectrum(chrom, 2.1u"s", precisetime=true)
ERROR: ArgumentError: scantime 2.1 s does not exist
[...]

julia> massspectrum(chrom, 2.5u"s", retentionindexname="Kovats", retentionindex=123.21)
MassSpectrum {ions: Int64, intensities: Int64}
2 ions: m/z 85, 100
intensity range: 1 - 23
retention time: 3 s
retention index: 123.21 (Kovats)
metadata: 0 entries

julia> ms = massspectrum(chrom, 2.5u"s", metadata=Dict(:compound => "hexane"))
MassSpectrum {ions: Int64, intensities: Int64}
2 ions: m/z 85, 100
intensity range: 1 - 23
retention time: 3 s
metadata: 1 entry

julia> metadata(ms)
Dict{Any, Any} with 1 entry:
  :compound => "hexane"
source
JuChrom.maxionMethod
maxion(ms::AbstractMassSpectrum)

Return the largest ion.

See also AbstractMassSpectrum, minion(::AbstractMassSpectrum), ions(::AbstractMassSpectrum), ioncount(::AbstractMassSpectrum), ion(::AbstractMassSpectrum, ::Integer), ionindex(::AbstractMassSpectrum, ::Real).

Example

julia> ms = MassSpectrum(Int64[85, 112, 124], Int64[13, 0, 67])
MassSpectrum {ions: Int64, intensities: Int64}
3 ions: m/z 85, 112, 124
intensity range: 0 - 67
metadata: 0 entries

julia> maxion(ms)
124
source
JuChrom.meanintensitiesFunction
meanintensities(mss::AbstractVector{<:AbstractMassSpectrum}) -> Vector{Float64}

Return a vector of the average intensities for all ions in the provided mass spectra. This function assumes that each mass spectrum contains data for the same set of ions.

See also AbstractMassSpectrum, ions(::AbstractMassSpectrum), intensities(::AbstractMassSpectrum), intensitydifferences, intensitysums.

Example

julia> ms₁ = MassSpectrum([80, 85, 90], [0, 10, 0]);

julia> ms₂ = MassSpectrum([80, 85, 90], [10, 80, 5]);

julia> meanintensities([ms₁, ms₂]) ≈ Float64[5.0, 45.0, 2.5]
true

julia> meanintensities([MassSpectrum([80], [5]), MassSpectrum([81], [5])])
ERROR: ArgumentError: mass spectra differ in ions
[...]
source
JuChrom.metadataMethod
metadata(ms::AbstractMassSpectrum) -> Dict{Any, Any}

Return the metadata.

See also AbstractMassSpectrum.

Examples

julia> ms = MassSpectrum([85.1], [13.0], metadata=Dict(:name=>"unknown"))
MassSpectrum {ions: Float64, intensities: Float64}
1 ion: m/z 85.1
intensity: 13.0
metadata: 1 entry

julia> metadata(ms)
Dict{Any, Any} with 1 entry:
  :name => "unknown"

julia> ms = MassSpectrum([85.1], [13.0])
MassSpectrum {ions: Float64, intensities: Float64}
1 ion: m/z 85.1
intensity: 13.0
metadata: 0 entries

julia> metadata(ms)
Dict{Any, Any}()

julia> metadata(ms)[:species] = "Polistes dominula"
"Polistes dominula"

julia> metadata(ms)[:id] = 123
123

julia> metadata(ms)
Dict{Any, Any} with 2 entries:
  :species => "Polistes dominula"
  :id      => 123

julia> ms
MassSpectrum {ions: Float64, intensities: Float64}
1 ion: m/z 85.1
intensity: 13.0
metadata: 2 entries

julia> delete!(metadata(ms), :species)
Dict{Any, Any} with 1 entry:
  :id => 123

julia> ms
MassSpectrum {ions: Float64, intensities: Float64}
1 ion: m/z 85.1
intensity: 13.0
metadata: 1 entry
source
JuChrom.minionMethod
minion(ms::AbstractMassSpectrum)

Return the smallest ion.

See also AbstractMassSpectrum, maxion(::AbstractMassSpectrum), ions(::AbstractMassSpectrum), ioncount(::AbstractMassSpectrum), ion(::AbstractMassSpectrum, ::Integer), ionindex(::AbstractMassSpectrum, ::Real).

Example

julia> ms = MassSpectrum(Int64[85, 112, 124], Int64[13, 0, 67])
MassSpectrum {ions: Int64, intensities: Int64}
3 ions: m/z 85, 112, 124
intensity range: 0 - 67
metadata: 0 entries

julia> minion(ms)
85
source
JuChrom.retentionindexMethod
retentionindex(ms::AbstractMassSpectrum)

Return the retention index. If no retention index is associated with the mass spectrum, the function returns the value nothing.

See also AbstractMassSpectrum, retentionindexname(::AbstractMassSpectrum).

Example

julia> ms = MassSpectrum([1.2], [1.1], retentionindex=131.1, retentionindexname="Kovats")
MassSpectrum {ions: Float64, intensities: Float64}
1 ion: m/z 1.2
intensity: 1.1
retention index: 131.1 (Kovats)
metadata: 0 entries

julia> retentionindex(ms) ≈ 131.1
true

julia> ms = MassSpectrum(Int64[85, 112, 124], Int64[13, 0, 67])
MassSpectrum {ions: Int64, intensities: Int64}
3 ions: m/z 85, 112, 124
intensity range: 0 - 67
metadata: 0 entries

julia> retentionindex(ms) === nothing
true
source
JuChrom.retentionindexnameMethod
retentionindexname(ms::AbstractMassSpectrum)

Return the retention index name. If the mass spectrum has no associated retention index, the function returns the value nothing.

See also AbstractMassSpectrum, retentionindex(::AbstractMassSpectrum).

Example

julia> ms = MassSpectrum([1.2], [1.1], retentionindex=131.1, retentionindexname="Kovats")
MassSpectrum {ions: Float64, intensities: Float64}
1 ion: m/z 1.2
intensity: 1.1
retention index: 131.1 (Kovats)
metadata: 0 entries

julia> retentionindexname(ms)
"Kovats"

julia> ms = MassSpectrum(Int64[85, 112, 124], Int64[13, 0, 67])
MassSpectrum {ions: Int64, intensities: Int64}
3 ions: m/z 85, 112, 124
intensity range: 0 - 67
metadata: 0 entries

julia> retentionindexname(ms) === nothing
true
source
JuChrom.retentiontimeFunction
retentiontime(ms::AbstractMassSpectrum; timeunit::Unitful.TimeUnits, 
ustripped::Bool=false)

Return the retention time. If no retention time is associated with the mass spectrum, the function returns the value nothing. The optional keyword argument timeunit lets you change the unit of the returned scan time. All time units defined in the package Unitful.jl (e.g., u"s", u"minute") are supported. The optional keyword argument ustripped lets you choose whether to include the unit in the returned value.

See also AbstractMassSpectrum, massspectrum.

Examples

julia> ms = MassSpectrum([85.1, 112.2, 124.1], Int64[13, 0, 67], retentiontime=3.2u"minute")
MassSpectrum {ions: Float64, intensities: Int64}
3 ions: m/z 85.1, 112.2, 124.1
intensity range: 0 - 67
retention time: 3.2 minute
metadata: 0 entries

julia> retentiontime(ms) ≈ 3.2u"minute"
true

julia> retentiontime(ms, timeunit=u"s") ≈ 192.0u"s"
true

julia> retentiontime(ms, timeunit=u"s", ustripped=true) ≈ 192.0
true

julia> retentiontime(ms, ustripped=true) ≈ 3.2
true

julia> ms = MassSpectrum([85.1, 112.2, 124.1], Int64[13, 0, 67])
MassSpectrum {ions: Float64, intensities: Int64}
3 ions: m/z 85.1, 112.2, 124.1
intensity range: 0 - 67
metadata: 0 entries

julia> retentiontime(ms) === nothing
true

julia> retentiontime(ms, timeunit=u"ms", ustripped=true) === nothing
true
source
JuChrom.sharedionsFunction
sharedions(ms₁::AbstractMassSpectrum, ms₂::AbstractMassSpectrum)

Return the ions present in both mass spectra.

See also MassSpectrum, ions(::AbstractMassSpectrum), ion(::AbstractMassSpectrum, ::Integer), ioncount(::AbstractMassSpectrum).

Example

julia> ms₁ = MassSpectrum([80, 85, 90], [100, 500, 250])
MassSpectrum {ions: Int64, intensities: Int64}
3 ions: m/z 80, 85, 90
intensity range: 100 - 500
metadata: 0 entries

julia> ms₂ = MassSpectrum([80, 85], [100, 500])
MassSpectrum {ions: Int64, intensities: Int64}
2 ions: m/z 80, 85
intensity range: 100 - 500
metadata: 0 entries

julia> sharedions(ms₁, ms₂)
2-element Vector{Int64}:
 80
 85
source
JuChrom.similarityFunction
similarity(ms₁::AbstractMassSpectrum, ms₂::AbstractMassSpectrum, f::Function)

Compute the similarity between the two mass spectra by applying the similarity function f (e.g., cosine) to the intensity values of the ions shared between ms₁ and ms₂.

See also AbstractMassSpectrum, cosine, sharedions, ions(::AbstractMassSpectrum), intensities(::AbstractMassSpectrum).

Examples

julia> ms₁ = MassSpectrum(Int64[80, 85, 90], Int64[100, 500, 250]);

julia> ms₂ = MassSpectrum(Int32[80, 85], Int32[200, 1000]);

julia> similarity(ms₁, ms₂, cosine) ≈ 1.0
true

julia> ms₁ = MassSpectrum(Float64[80, 85, 90], Float32[100, 500, 250]);

julia> ms₂ = MassSpectrum(Int64[80, 85, 90], Int32[200, 1000, 0]);

julia> similarity(ms₁, ms₂, cosine) ≈ 0.8978873122816586
true
source