@@ -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
@@ -179,6 +179,7 @@ def test_get_priors_from_df():
179179 """Check petab.get_priors_from_df."""
180180 parameter_df = pd .DataFrame (
181181 {
182+ PARAMETER_ID : ["p1" , "p2" , "p3" , "p4" , "p5" ],
182183 PARAMETER_SCALE : [LOG10 , LOG10 , LOG10 , LOG10 , LOG10 ],
183184 LOWER_BOUND : [1e-8 , 1e-9 , 1e-10 , 1e-11 , 1e-5 ],
184185 UPPER_BOUND : [1e8 , 1e9 , 1e10 , 1e11 , 1e5 ],
@@ -193,6 +194,7 @@ def test_get_priors_from_df():
193194 ],
194195 }
195196 )
197+ parameter_df = petab .get_parameter_df (parameter_df )
196198
197199 prior_list = petab .get_priors_from_df (parameter_df , mode = INITIALIZATION )
198200
@@ -225,6 +227,18 @@ def test_get_priors_from_df():
225227 assert prior_pars [1 ] == (- 5 , 5 )
226228 assert prior_pars [2 ] == (1e-5 , 1e5 )
227229
230+ # check subsetting / reordering works
231+ prior_list_subset = petab .get_priors_from_df (
232+ parameter_df , mode = INITIALIZATION , parameter_ids = ["p2" , "p1" ]
233+ )
234+ assert len (prior_list_subset ) == 2
235+ assert prior_list_subset == [prior_list [1 ], prior_list [0 ]]
236+
237+ with pytest .raises (KeyError , match = "Parameter table does not contain" ):
238+ petab .get_priors_from_df (
239+ parameter_df , mode = INITIALIZATION , parameter_ids = ["non_existent" ]
240+ )
241+
228242
229243def test_startpoint_sampling (fujita_model_scaling ):
230244 n_starts = 10
@@ -639,7 +653,7 @@ def test_concat_condition_df():
639653
640654def test_get_observable_ids (petab_problem ): # pylint: disable=W0621
641655 """Test if observable ids functions returns correct value."""
642- assert set (petab_problem .get_observable_ids ()) == {"observable_1 " }
656+ assert set (petab_problem .get_observable_ids ()) == {"obs1 " }
643657
644658
645659def test_parameter_properties (petab_problem ): # pylint: disable=W0621
@@ -809,3 +823,35 @@ def test_problem_from_yaml_v1_multiple_files():
809823 assert petab_problem .measurement_df .shape [0 ] == 2
810824 assert petab_problem .observable_df .shape [0 ] == 2
811825 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