structs.jl 4.38 KB
Newer Older
1

Miroslav Kratochvil's avatar
Miroslav Kratochvil committed
2
3
4
5
6
7
"""
    Maybe{X}

Type shortcut for "`X` or nothing" or "nullable `X`" in javaspeak. Name
got inspired by our functional friends.
"""
8
9
const Maybe{X} = Union{Nothing,X}

Miroslav Kratochvil's avatar
Miroslav Kratochvil committed
10
"""
Miroslav Kratochvil's avatar
Miroslav Kratochvil committed
11
Part of a measurement unit definition that corresponds to the SBML definition
Miroslav Kratochvil's avatar
Miroslav Kratochvil committed
12
of `Unit`. For example, the unit "per square megahour", Mh^(-2), is written as:
Miroslav Kratochvil's avatar
Miroslav Kratochvil committed
13

Miroslav Kratochvil's avatar
Miroslav Kratochvil committed
14
15
16
17
18
19
20
21
    UnitPart("second",  # base SI unit, this says we are measuring time
             -2,        # exponent, says "per square"
             6,         # log-10 scale of the unit, says "mega"
             1/3600)    # second-to-hour multiplier

Compound units (such as "volt-amperes" and "dozens of yards per ounce") are
built from multiple `UnitPart`s; see the definition of field `units` in
[`Model`](@ref).
Miroslav Kratochvil's avatar
Miroslav Kratochvil committed
22
"""
23
24
25
26
27
28
29
30
struct UnitPart
    kind::String
    exponent::Int
    scale::Int
    multiplier::Float64
    UnitPart(k, e, s, m) = new(k, e, s, m)
end

31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57

"""
Abstract type for all kinds of gene product associations
"""
abstract type GeneProductAssociation end

"""
Gene product reference in the association expression
"""
struct GPARef <: GeneProductAssociation
    gene_product::String
end

"""
Boolean binary "and" in the association expression
"""
struct GPAAnd <: GeneProductAssociation
    terms::Vector{GeneProductAssociation}
end

"""
Boolean binary "or" in the association expression
"""
struct GPAOr <: GeneProductAssociation
    terms::Vector{GeneProductAssociation}
end

58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
"""
A simplified representation of MathML-specified math AST
"""
abstract type Math end

"""
A literal value (usually a numeric constant) in mathematical expression
"""
struct MathVal{T} <: Math where {T}
    val::T
end

"""
An identifier (usually a variable name) in mathematical expression
"""
struct MathIdent <: Math
    id::String
end

"""
Function application ("call by name", no tricks allowed) in mathematical expression
"""
struct MathApply <: Math
    fn::String
    args::Vector{Math}
end
84

85
86
87
88
89
90
91
92
"""
Function definition (aka "lambda") in mathematical expression
"""
struct MathLambda <: Math
    args::Vector{String}
    body::Math
end

Miroslav Kratochvil's avatar
Miroslav Kratochvil committed
93
94
"""
Reaction with stoichiometry that assigns reactants and products their relative
Miroslav Kratochvil's avatar
Miroslav Kratochvil committed
95
96
consumption/production rates (accessible in field `stoichiometry`), lower/upper
bounds (in tuples `lb` and `ub`, with unit names), and objective coefficient
Miroslav Kratochvil's avatar
Miroslav Kratochvil committed
97
(`oc`). Also may contains `notes` and `annotation`.
Miroslav Kratochvil's avatar
Miroslav Kratochvil committed
98
"""
99
100
101
102
103
struct Reaction
    stoichiometry::Dict{String,Float64}
    lb::Tuple{Float64,String}
    ub::Tuple{Float64,String}
    oc::Float64
104
    gene_product_association::Maybe{GeneProductAssociation}
105
    kinetic_math::Maybe{Math}
106
    notes::Maybe{String}
107
    annotation::Maybe{String}
108
    Reaction(s, l, u, o, as, km, n = nothing, an = nothing) = new(s, l, u, o, as, km, n, an)
109
110
end

Miroslav Kratochvil's avatar
Miroslav Kratochvil committed
111
"""
Miroslav Kratochvil's avatar
Miroslav Kratochvil committed
112
113
Species metadata -- contains a human-readable `name`, a `compartment`
identifier, `formula`, `charge`, and additional `notes` and `annotation`.
Miroslav Kratochvil's avatar
Miroslav Kratochvil committed
114
"""
115
struct Species
116
    name::Maybe{String}
117
    compartment::String
118
    formula::Maybe{String}
119
    charge::Maybe{Int}
120
    initial_amount::Maybe{Tuple{Float64,String}}
121
    only_substance_units::Bool
122
    notes::Maybe{String}
123
    annotation::Maybe{String}
124
125
    Species(na, co, f, ch, ia, osu, no = nothing, a = nothing) =
        new(na, co, f, ch, ia, osu, no, a)
126
127
end

Miroslav Kratochvil's avatar
Miroslav Kratochvil committed
128
129
130
131
132
133
134
135
136
137
138
"""
Gene product metadata.
"""
struct GeneProduct
    name::Maybe{String}
    label::Maybe{String}
    notes::Maybe{String}
    annotation::Maybe{String}
    GeneProduct(na, l, no = nothing, a = nothing) = new(na, l, no, a)
end

139
140
141
142
143
144
145
146
147
148
149
"""
Custom function definition.
"""
struct FunctionDefinition
    name::Maybe{String}
    body::Maybe{Math}
    notes::Maybe{String}
    annotation::Maybe{String}
    FunctionDefinition(na, b, no = nothing, a = nothing) = new(na, b, no, a)
end

Miroslav Kratochvil's avatar
Miroslav Kratochvil committed
150
"""
Miroslav Kratochvil's avatar
Miroslav Kratochvil committed
151
152
153
154
155
Structure that collects the model-related data. Contains `parameters`, `units`,
`compartments`, `species` and `reactions` and `gene_products`, and additional
`notes` and `annotation` (also present internally in some of the data fields).
The contained dictionaries are indexed by identifiers of the corresponding
objects.
Miroslav Kratochvil's avatar
Miroslav Kratochvil committed
156
"""
157
struct Model
Miroslav Kratochvil's avatar
Miroslav Kratochvil committed
158
    parameters::Dict{String,Float64}
159
160
161
162
    units::Dict{String,Vector{UnitPart}}
    compartments::Vector{String}
    species::Dict{String,Species}
    reactions::Dict{String,Reaction}
Miroslav Kratochvil's avatar
Miroslav Kratochvil committed
163
    gene_products::Dict{String,GeneProduct}
164
    function_definitions::Dict{String,FunctionDefinition}
165
    notes::Maybe{String}
166
    annotation::Maybe{String}
167
    Model(p, u, c, s, r, g, f, n = nothing, a = nothing) = new(p, u, c, s, r, g, f, n, a)
168
end