diff --git a/petabtests/cases/v2.0.0/sbml/0026/0026.py b/petabtests/cases/v2.0.0/sbml/0026/0026.py new file mode 100644 index 0000000..29ff50f --- /dev/null +++ b/petabtests/cases/v2.0.0/sbml/0026/0026.py @@ -0,0 +1,87 @@ +from inspect import cleandoc + +from petab.v2.C import * +from petab.v2 import Problem + +from petabtests import ( + PetabV2TestCase, + analytical_a, + analytical_b, + antimony_to_sbml_str, +) +from pathlib import Path + +DESCRIPTION = cleandoc(""" +## Objective + +This case tests the handling of initial concentrations that are specified +via mathematical expressions (rather than a single value or parameter) in +the conditions table. For species `A`, the initial concentration is given +by an expression containing both parameters to be estimated and parameters +that are not estimated. For species `B`, the initial concentration is +specified via an expression involving only parameters that are not +estimated. + +## Model + +A simple conversion reaction `A <=> B` in a single compartment, following +mass action kinetics. +""") + +# problem -------------------------------------------------------------------- +ant_model = """ +model *petab_test_0026() + compartment compartment_ = 1; + species A in compartment_, B in compartment_; + + fwd: A => B; compartment_ * k1 * A; + rev: B => A; compartment_ * k2 * B; + + A = a0; + B = 1; + a0 = 1; + k1 = 0; + k2 = 0; +end +""" +model_file = Path(__file__).parent / "_model.xml" +model_file.write_text(antimony_to_sbml_str(ant_model)) + +problem = Problem() + +problem.add_condition("c0", A="initial_A1 + initial_A2", B="initial_B1 / initial_B2") +problem.add_experiment("e1", 0, "c0") + +problem.add_observable("obs_a", "A", noise_formula="0.5") +problem.add_observable("obs_b", "B", noise_formula="0.5") +problem.add_measurement("obs_a", experiment_id="e1", time=0, measurement=0.7) +problem.add_measurement("obs_a", experiment_id="e1", time=10, measurement=0.1) +problem.add_measurement("obs_b", experiment_id="e1", time=0, measurement=0.7) +problem.add_measurement("obs_b", experiment_id="e1", time=10, measurement=0.1) + +problem.add_parameter("k1", lb=0, ub=10, nominal_value=0.8, estimate=True) +problem.add_parameter("k2", lb=0, ub=10, nominal_value=0.6, estimate=True) +problem.add_parameter("initial_A1", lb=1, ub=10, nominal_value=0.5, estimate=True) +problem.add_parameter("initial_A2", lb=1, ub=10, nominal_value=1.5, estimate=False) +problem.add_parameter("initial_B1", lb=0, ub=10, nominal_value=9, estimate=False) +problem.add_parameter("initial_B2", lb=0, ub=10, nominal_value=3, estimate=False) + + +# solutions ------------------------------------------------------------------ + +simulation_df = problem.measurement_df.copy(deep=True).rename( + columns={MEASUREMENT: SIMULATION} +) +simulation_df[SIMULATION] = [ + *(analytical_a(t, 2, 3, 0.8, 0.6) for t in (0, 10)), + *(analytical_b(t, 2, 3, 0.8, 0.6) for t in (0, 10)), +] + +case = PetabV2TestCase.from_problem( + id=26, + brief="Simulation. Estimated initial value via math expressions in conditions table.", + description=DESCRIPTION, + model=model_file, + problem=problem, + simulation_df=simulation_df, +) diff --git a/petabtests/cases/v2.0.0/sbml/0026/README.md b/petabtests/cases/v2.0.0/sbml/0026/README.md new file mode 100644 index 0000000..9b14c1f --- /dev/null +++ b/petabtests/cases/v2.0.0/sbml/0026/README.md @@ -0,0 +1,16 @@ +# PEtab test case 0026 + +## Objective + +This case tests the handling of initial concentrations that are specified +via mathematical expressions (rather than a single value or parameter) in +the conditions table. For species `A`, the initial concentration is given +by an expression containing both parameters to be estimated and parameters +that are not estimated. For species `B`, the initial concentration is +specified via an expression involving only parameters that are not +estimated. + +## Model + +A simple conversion reaction `A <=> B` in a single compartment, following +mass action kinetics. diff --git a/petabtests/cases/v2.0.0/sbml/0026/_0026.yaml b/petabtests/cases/v2.0.0/sbml/0026/_0026.yaml new file mode 100644 index 0000000..2a7c4ad --- /dev/null +++ b/petabtests/cases/v2.0.0/sbml/0026/_0026.yaml @@ -0,0 +1,15 @@ +condition_files: +- _conditions.tsv +experiment_files: +- _experiments.tsv +format_version: 2.0.0 +measurement_files: +- _measurements.tsv +model_files: + model_0: + language: sbml + location: _model.xml +observable_files: +- _observables.tsv +parameter_files: +- _parameters.tsv diff --git a/petabtests/cases/v2.0.0/sbml/0026/_0026_solution.yaml b/petabtests/cases/v2.0.0/sbml/0026/_0026_solution.yaml new file mode 100644 index 0000000..6bc1f12 --- /dev/null +++ b/petabtests/cases/v2.0.0/sbml/0026/_0026_solution.yaml @@ -0,0 +1,7 @@ +chi2: 75.02040884206437 +llh: -38.41336983161109 +simulation_files: +- _simulations.tsv +tol_chi2: 0.001 +tol_llh: 0.001 +tol_simulations: 0.001 diff --git a/petabtests/cases/v2.0.0/sbml/0026/_conditions.tsv b/petabtests/cases/v2.0.0/sbml/0026/_conditions.tsv new file mode 100644 index 0000000..bc499e5 --- /dev/null +++ b/petabtests/cases/v2.0.0/sbml/0026/_conditions.tsv @@ -0,0 +1,3 @@ +conditionId targetId targetValue +c0 A initial_A1 + initial_A2 +c0 B initial_B1/initial_B2 diff --git a/petabtests/cases/v2.0.0/sbml/0026/_experiments.tsv b/petabtests/cases/v2.0.0/sbml/0026/_experiments.tsv new file mode 100644 index 0000000..5d8c1e0 --- /dev/null +++ b/petabtests/cases/v2.0.0/sbml/0026/_experiments.tsv @@ -0,0 +1,2 @@ +experimentId time conditionId +e1 0.0 c0 diff --git a/petabtests/cases/v2.0.0/sbml/0026/_measurements.tsv b/petabtests/cases/v2.0.0/sbml/0026/_measurements.tsv new file mode 100644 index 0000000..d9f5e7b --- /dev/null +++ b/petabtests/cases/v2.0.0/sbml/0026/_measurements.tsv @@ -0,0 +1,5 @@ +modelId observableId experimentId time measurement observableParameters noiseParameters + obs_a e1 0.0 0.7 + obs_a e1 10.0 0.1 + obs_b e1 0.0 0.7 + obs_b e1 10.0 0.1 diff --git a/petabtests/cases/v2.0.0/sbml/0026/_model.xml b/petabtests/cases/v2.0.0/sbml/0026/_model.xml new file mode 100644 index 0000000..4a0dbcc --- /dev/null +++ b/petabtests/cases/v2.0.0/sbml/0026/_model.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + a0 + + + + + + + + + + + + + + + + compartment_ + k1 + A + + + + + + + + + + + + + + + + compartment_ + k2 + B + + + + + + + diff --git a/petabtests/cases/v2.0.0/sbml/0026/_observables.tsv b/petabtests/cases/v2.0.0/sbml/0026/_observables.tsv new file mode 100644 index 0000000..1234233 --- /dev/null +++ b/petabtests/cases/v2.0.0/sbml/0026/_observables.tsv @@ -0,0 +1,3 @@ +observableId observableName observableFormula noiseFormula noiseDistribution observablePlaceholders noisePlaceholders +obs_a A 0.500000000000000 normal +obs_b B 0.500000000000000 normal diff --git a/petabtests/cases/v2.0.0/sbml/0026/_parameters.tsv b/petabtests/cases/v2.0.0/sbml/0026/_parameters.tsv new file mode 100644 index 0000000..d210cf0 --- /dev/null +++ b/petabtests/cases/v2.0.0/sbml/0026/_parameters.tsv @@ -0,0 +1,7 @@ +parameterId lowerBound upperBound nominalValue estimate priorDistribution priorParameters +k1 0.0 10.0 0.8 true +k2 0.0 10.0 0.6 true +initial_A1 1.0 10.0 0.5 true +initial_A2 1.0 10.0 1.5 false +initial_B1 0.0 10.0 9.0 false +initial_B2 0.0 10.0 3.0 false diff --git a/petabtests/cases/v2.0.0/sbml/0026/_simulations.tsv b/petabtests/cases/v2.0.0/sbml/0026/_simulations.tsv new file mode 100644 index 0000000..642a386 --- /dev/null +++ b/petabtests/cases/v2.0.0/sbml/0026/_simulations.tsv @@ -0,0 +1,5 @@ +modelId observableId experimentId time simulation observableParameters noiseParameters + obs_a e1 0.0 2.0 + obs_a e1 10.0 2.1428570240673257 + obs_b e1 0.0 3.0 + obs_b e1 10.0 2.8571429759326743 diff --git a/petabtests/cases/v2.0.0/sbml/0027/0027.py b/petabtests/cases/v2.0.0/sbml/0027/0027.py new file mode 100644 index 0000000..83a5934 --- /dev/null +++ b/petabtests/cases/v2.0.0/sbml/0027/0027.py @@ -0,0 +1,86 @@ +from inspect import cleandoc +from pathlib import Path + +from petab.v2.C import * +from petab.v2 import Problem +from petabtests import PetabV2TestCase, analytical_a, antimony_to_sbml_str + +DESCRIPTION = cleandoc(""" +## Objective + +This case tests support for parametric overrides from condition table +via math expressions. + +The model is simulated for two different experimental conditions +(here: different initial concentrations). The observable is offset via +a parametric override in the condition table (i.e. the actual value +has to be taken from the parameter table). The formulas in the +condition table are mathematical expressions consisting of +numerical values, parameters to be estimated, and parameters that +are not to be estimated. + +## Model + +A simple conversion reaction `A <=> B` in a single compartment, following +mass action kinetics. +""") + +# problem -------------------------------------------------------------------- +ant_model = """ +model *petab_test_0027() + compartment compartment_ = 1; + species A in compartment_, B in compartment_; + + fwd: A => B; compartment_ * k1 * A; + rev: B => A; compartment_ * k2 * B; + + A = a0; + B = b0; + offset_A = 0; + a0 = 1; + b0 = 0; + k1 = 0; + k2 = 0; +end +""" +model_file = Path(__file__).parent / "_model.xml" +model_file.write_text(antimony_to_sbml_str(ant_model)) + +problem = Problem() +problem.add_condition("c0", offset_A="offset_A1_c0 + offset_A2_c0") +problem.add_condition("c1", offset_A="offset_A1_c1 / 3.0") + +problem.add_experiment("e1", 0, "c0") +problem.add_experiment("e2", 0, "c1") + +problem.add_observable("obs_a", "A + offset_A", noise_formula="1") + +problem.add_measurement("obs_a", experiment_id="e1", time=10, measurement=2.1) +problem.add_measurement("obs_a", experiment_id="e2", time=10, measurement=3.2) + +problem.add_parameter("a0", lb=0, ub=10, nominal_value=1, estimate=True) +problem.add_parameter("b0", lb=0, ub=10, nominal_value=0, estimate=True) +problem.add_parameter("k1", lb=0, ub=10, nominal_value=0.8, estimate=True) +problem.add_parameter("k2", lb=0, ub=10, nominal_value=0.6, estimate=True) +problem.add_parameter("offset_A1_c0", lb=0, ub=10, nominal_value=0.5, estimate=True) +problem.add_parameter("offset_A2_c0", lb=0, ub=10, nominal_value=1.5, estimate=False) +problem.add_parameter("offset_A1_c1", lb=0, ub=10, nominal_value=9, estimate=True) + +# solutions ------------------------------------------------------------------ + +simulation_df = problem.measurement_df.copy(deep=True).rename( + columns={MEASUREMENT: SIMULATION} +) +simulation_df[SIMULATION] = [ + analytical_a(10, 1, 0, 0.8, 0.6) + offset for offset in [2, 3] +] + +case = PetabV2TestCase.from_problem( + id=27, + brief="Simulation. Condition-specific parameters defined via " + "math expressions in the parameter table.", + description=DESCRIPTION, + model=model_file, + problem=problem, + simulation_df=simulation_df, +) diff --git a/petabtests/cases/v2.0.0/sbml/0027/README.md b/petabtests/cases/v2.0.0/sbml/0027/README.md new file mode 100644 index 0000000..7cc3041 --- /dev/null +++ b/petabtests/cases/v2.0.0/sbml/0027/README.md @@ -0,0 +1,19 @@ +# PEtab test case 0027 + +## Objective + +This case tests support for parametric overrides from condition table +via math expressions. + +The model is simulated for two different experimental conditions +(here: different initial concentrations). The observable is offset via +a parametric override in the condition table (i.e. the actual value +has to be taken from the parameter table). The formulas in the +condition table are mathematical expressions consisting of +numerical values, parameters to be estimated, and parameters that +are not to be estimated. + +## Model + +A simple conversion reaction `A <=> B` in a single compartment, following +mass action kinetics. diff --git a/petabtests/cases/v2.0.0/sbml/0027/_0027.yaml b/petabtests/cases/v2.0.0/sbml/0027/_0027.yaml new file mode 100644 index 0000000..2a7c4ad --- /dev/null +++ b/petabtests/cases/v2.0.0/sbml/0027/_0027.yaml @@ -0,0 +1,15 @@ +condition_files: +- _conditions.tsv +experiment_files: +- _experiments.tsv +format_version: 2.0.0 +measurement_files: +- _measurements.tsv +model_files: + model_0: + language: sbml + location: _model.xml +observable_files: +- _observables.tsv +parameter_files: +- _parameters.tsv diff --git a/petabtests/cases/v2.0.0/sbml/0027/_0027_solution.yaml b/petabtests/cases/v2.0.0/sbml/0027/_0027_solution.yaml new file mode 100644 index 0000000..5f6c46b --- /dev/null +++ b/petabtests/cases/v2.0.0/sbml/0027/_0027_solution.yaml @@ -0,0 +1,7 @@ +chi2: 0.16020461109629 +llh: -1.91797937195749 +simulation_files: +- _simulations.tsv +tol_chi2: 0.001 +tol_llh: 0.001 +tol_simulations: 0.001 diff --git a/petabtests/cases/v2.0.0/sbml/0027/_conditions.tsv b/petabtests/cases/v2.0.0/sbml/0027/_conditions.tsv new file mode 100644 index 0000000..0bd0965 --- /dev/null +++ b/petabtests/cases/v2.0.0/sbml/0027/_conditions.tsv @@ -0,0 +1,3 @@ +conditionId targetId targetValue +c0 offset_A offset_A1_c0 + offset_A2_c0 +c1 offset_A 0.333333333333333*offset_A1_c1 diff --git a/petabtests/cases/v2.0.0/sbml/0027/_experiments.tsv b/petabtests/cases/v2.0.0/sbml/0027/_experiments.tsv new file mode 100644 index 0000000..7c2a6e8 --- /dev/null +++ b/petabtests/cases/v2.0.0/sbml/0027/_experiments.tsv @@ -0,0 +1,3 @@ +experimentId time conditionId +e1 0.0 c0 +e2 0.0 c1 diff --git a/petabtests/cases/v2.0.0/sbml/0027/_measurements.tsv b/petabtests/cases/v2.0.0/sbml/0027/_measurements.tsv new file mode 100644 index 0000000..679f1c2 --- /dev/null +++ b/petabtests/cases/v2.0.0/sbml/0027/_measurements.tsv @@ -0,0 +1,3 @@ +modelId observableId experimentId time measurement observableParameters noiseParameters + obs_a e1 10.0 2.1 + obs_a e2 10.0 3.2 diff --git a/petabtests/cases/v2.0.0/sbml/0027/_model.xml b/petabtests/cases/v2.0.0/sbml/0027/_model.xml new file mode 100644 index 0000000..9661881 --- /dev/null +++ b/petabtests/cases/v2.0.0/sbml/0027/_model.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + a0 + + + + + b0 + + + + + + + + + + + + + + + + compartment_ + k1 + A + + + + + + + + + + + + + + + + compartment_ + k2 + B + + + + + + + diff --git a/petabtests/cases/v2.0.0/sbml/0027/_observables.tsv b/petabtests/cases/v2.0.0/sbml/0027/_observables.tsv new file mode 100644 index 0000000..e8b2bea --- /dev/null +++ b/petabtests/cases/v2.0.0/sbml/0027/_observables.tsv @@ -0,0 +1,2 @@ +observableId observableName observableFormula noiseFormula noiseDistribution observablePlaceholders noisePlaceholders +obs_a A + offset_A 1.00000000000000 normal diff --git a/petabtests/cases/v2.0.0/sbml/0027/_parameters.tsv b/petabtests/cases/v2.0.0/sbml/0027/_parameters.tsv new file mode 100644 index 0000000..f8920c5 --- /dev/null +++ b/petabtests/cases/v2.0.0/sbml/0027/_parameters.tsv @@ -0,0 +1,8 @@ +parameterId lowerBound upperBound nominalValue estimate priorDistribution priorParameters +a0 0.0 10.0 1.0 true +b0 0.0 10.0 0.0 true +k1 0.0 10.0 0.8 true +k2 0.0 10.0 0.6 true +offset_A1_c0 0.0 10.0 0.5 true +offset_A2_c0 0.0 10.0 1.5 false +offset_A1_c1 0.0 10.0 9.0 true diff --git a/petabtests/cases/v2.0.0/sbml/0027/_simulations.tsv b/petabtests/cases/v2.0.0/sbml/0027/_simulations.tsv new file mode 100644 index 0000000..b1fd1b6 --- /dev/null +++ b/petabtests/cases/v2.0.0/sbml/0027/_simulations.tsv @@ -0,0 +1,3 @@ +modelId observableId experimentId time simulation observableParameters noiseParameters + obs_a e1 10.0 2.4285719037306968 + obs_a e2 10.0 3.4285719037306968 diff --git a/petabtests/cases/v2.0.0/sbml/README.md b/petabtests/cases/v2.0.0/sbml/README.md index c76bb72..6c0ab27 100644 --- a/petabtests/cases/v2.0.0/sbml/README.md +++ b/petabtests/cases/v2.0.0/sbml/README.md @@ -94,3 +94,11 @@ Truncated prior distributions. Non-truncated prior distributions. +# [0026](0026/) + +Simulation. Estimated initial value via math expressions in conditions table. + +# [0027](0027/) + +Simulation. Condition-specific parameters defined via math expressions in the parameter table. +