Skip to content

Commit 9c23a21

Browse files
authored
Treat observableParameter overrides as placeholders in noise formulae (#231)
1 parent c0158ba commit 9c23a21

File tree

2 files changed

+55
-10
lines changed

2 files changed

+55
-10
lines changed

petab/parameters.py

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -298,14 +298,27 @@ def append_overrides(overrides):
298298
)
299299

300300
# Add output parameters except for placeholders
301-
for kwargs in [
302-
dict(observables=True, noise=False),
303-
dict(observables=False, noise=True),
304-
]:
301+
for formula_type, placeholder_sources in (
302+
(
303+
# Observable formulae
304+
{'observables': True, 'noise': False},
305+
# can only contain observable placeholders
306+
{'noise': False, 'observables': True}
307+
),
308+
(
309+
# Noise formulae
310+
{'observables': False, 'noise': True},
311+
# can contain noise and observable placeholders
312+
{'noise': True, 'observables': True}
313+
),
314+
):
305315
output_parameters = observables.get_output_parameters(
306-
observable_df, model, mapping_df=mapping_df, **kwargs
316+
observable_df, model, mapping_df=mapping_df, **formula_type,
317+
)
318+
placeholders = observables.get_placeholders(
319+
observable_df,
320+
**placeholder_sources,
307321
)
308-
placeholders = observables.get_placeholders(observable_df, **kwargs)
309322
for p in output_parameters:
310323
if p not in placeholders:
311324
parameter_ids[p] = None

tests/test_petab.py

Lines changed: 36 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -68,10 +68,10 @@ def petab_problem():
6868

6969
observable_df = pd.DataFrame(
7070
data={
71-
OBSERVABLE_ID: ["observable_1"],
71+
OBSERVABLE_ID: ["obs1"],
7272
OBSERVABLE_NAME: ["julius"],
73-
OBSERVABLE_FORMULA: ["observable_1"],
74-
NOISE_FORMULA: [1],
73+
OBSERVABLE_FORMULA: ["observable_1 * observableParameter1_obs1"],
74+
NOISE_FORMULA: ["0.1 * observable_1 * observableParameter1_obs1"],
7575
}
7676
).set_index(OBSERVABLE_ID)
7777

@@ -653,7 +653,7 @@ def test_concat_condition_df():
653653

654654
def test_get_observable_ids(petab_problem): # pylint: disable=W0621
655655
"""Test if observable ids functions returns correct value."""
656-
assert set(petab_problem.get_observable_ids()) == {"observable_1"}
656+
assert set(petab_problem.get_observable_ids()) == {"obs1"}
657657

658658

659659
def test_parameter_properties(petab_problem): # pylint: disable=W0621
@@ -823,3 +823,35 @@ def test_problem_from_yaml_v1_multiple_files():
823823
assert petab_problem.measurement_df.shape[0] == 2
824824
assert petab_problem.observable_df.shape[0] == 2
825825
assert petab_problem.condition_df.shape[0] == 2
826+
827+
828+
def test_get_required_parameters_for_parameter_table(petab_problem):
829+
"""Test identification of required parameter table parameters.
830+
831+
NB: currently, this test only checks that observable parameter placeholders
832+
in noise formulae are correctly identified as not required in the parameter
833+
table.
834+
"""
835+
noise_placeholders = petab.observables.get_output_parameters(
836+
petab_problem.observable_df,
837+
petab_problem.model,
838+
observables=False,
839+
noise=True,
840+
)
841+
# The observable parameter (scaling) appears in the noise formula,
842+
# as part of the proportional error model.
843+
assert "observableParameter1_obs1" in noise_placeholders
844+
845+
required_parameters_for_parameter_table = \
846+
petab.parameters.get_required_parameters_for_parameter_table(
847+
model=petab_problem.model,
848+
condition_df=petab_problem.condition_df,
849+
observable_df=petab_problem.observable_df,
850+
measurement_df=petab_problem.measurement_df,
851+
)
852+
# The observable parameter is correctly recognized as a placeholder,
853+
# i.e. does not need to be in the parameter table.
854+
assert (
855+
"observableParameter1_obs1"
856+
not in required_parameters_for_parameter_table
857+
)

0 commit comments

Comments
 (0)