Skip to content

Commit a1d3d80

Browse files
authored
Fix get_required_parameters_for_parameter_table (#43)
Check that placeholder parameters are only considered as such for either observable *or* noise formula Closes AMICI-dev/AMICI#1470
1 parent 6c46c00 commit a1d3d80

File tree

2 files changed

+38
-13
lines changed

2 files changed

+38
-13
lines changed

petab/observables.py

Lines changed: 29 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,12 @@ def write_observable_df(df: pd.DataFrame, filename: str) -> None:
5757
df.to_csv(fh, sep='\t', index=True)
5858

5959

60-
def get_output_parameters(observable_df: pd.DataFrame,
61-
sbml_model: libsbml.Model) -> List[str]:
60+
def get_output_parameters(
61+
observable_df: pd.DataFrame,
62+
sbml_model: libsbml.Model,
63+
observables: bool = True,
64+
noise: bool = True,
65+
) -> List[str]:
6266
"""Get output parameters
6367
6468
Returns IDs of parameters used in observable and noise formulas that are
@@ -67,12 +71,16 @@ def get_output_parameters(observable_df: pd.DataFrame,
6771
Arguments:
6872
observable_df: PEtab observable table
6973
sbml_model: SBML model
74+
observables: Include parameters from observableFormulas
75+
noise: Include parameters from noiseFormulas
7076
7177
Returns:
7278
List of output parameter IDs
7379
"""
74-
formulas = list(observable_df[OBSERVABLE_FORMULA])
75-
if NOISE_FORMULA in observable_df:
80+
formulas = []
81+
if observables:
82+
formulas.extend(observable_df[OBSERVABLE_FORMULA])
83+
if noise and NOISE_FORMULA in observable_df:
7684
formulas.extend(observable_df[NOISE_FORMULA])
7785
output_parameters = OrderedDict()
7886

@@ -125,12 +133,18 @@ def get_formula_placeholders(formula_string: str, observable_id: str,
125133
return placeholders
126134

127135

128-
def get_placeholders(observable_df: pd.DataFrame) -> List[str]:
136+
def get_placeholders(
137+
observable_df: pd.DataFrame,
138+
observables: bool = True,
139+
noise: bool = True,
140+
) -> List[str]:
129141
"""Get all placeholder parameters from observable table observableFormulas
130142
and noiseFormulas
131143
132144
Arguments:
133145
observable_df: PEtab observable table
146+
observables: Include parameters from observableFormulas
147+
noise: Include parameters from noiseFormulas
134148
135149
Returns:
136150
List of placeholder parameters from observable table observableFormulas
@@ -139,11 +153,19 @@ def get_placeholders(observable_df: pd.DataFrame) -> List[str]:
139153

140154
# collect placeholder parameters overwritten by
141155
# {observable,noise}Parameters
156+
placeholder_types = []
157+
formula_columns = []
158+
if observables:
159+
placeholder_types.append('observable')
160+
formula_columns.append(OBSERVABLE_FORMULA)
161+
if noise:
162+
placeholder_types.append('noise')
163+
formula_columns.append(NOISE_FORMULA)
164+
142165
placeholders = []
143166
for _, row in observable_df.iterrows():
144167
for placeholder_type, formula_column \
145-
in zip(['observable', 'noise'],
146-
[OBSERVABLE_FORMULA, NOISE_FORMULA]):
168+
in zip(placeholder_types, formula_columns):
147169
if formula_column not in row:
148170
continue
149171

petab/parameters.py

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -215,12 +215,15 @@ def append_overrides(overrides):
215215
row.get(NOISE_PARAMETERS, None)))
216216

217217
# Add output parameters except for placeholders
218-
output_parameters = observables.get_output_parameters(
219-
observable_df, sbml_model)
220-
placeholders = observables.get_placeholders(observable_df)
221-
for p in output_parameters:
222-
if p not in placeholders and sbml_model.getParameter(p) is None:
223-
parameter_ids[p] = None
218+
for kwargs in [dict(observables=True, noise=False),
219+
dict(observables=False, noise=True)]:
220+
output_parameters = observables.get_output_parameters(
221+
observable_df, sbml_model, **kwargs)
222+
placeholders = observables.get_placeholders(
223+
observable_df, **kwargs)
224+
for p in output_parameters:
225+
if p not in placeholders and sbml_model.getParameter(p) is None:
226+
parameter_ids[p] = None
224227

225228
# Add condition table parametric overrides unless already defined in the
226229
# SBML model

0 commit comments

Comments
 (0)