@@ -92,12 +92,8 @@ def petab_files_1to2(yaml_config: Path | str, output_dir: Path | str):
9292
9393 # Update tables
9494
95- # parameter table:
96- # * parameter.estimate: int -> bool
97- parameter_df = petab_problem .parameter_df .copy ()
98- parameter_df [v1 .C .ESTIMATE ] = parameter_df [v1 .C .ESTIMATE ].apply (
99- lambda x : str (bool (int (x ))).lower ()
100- )
95+ # parameter table
96+ parameter_df = v1v2_parameter_df (petab_problem .parameter_df .copy ())
10197 file = yaml_config [v2 .C .PARAMETER_FILE ]
10298 v2 .write_parameter_df (parameter_df , get_dest_path (file ))
10399
@@ -393,3 +389,70 @@ def update_noise_dist(row):
393389 df .drop (columns = [v1 .C .OBSERVABLE_TRANSFORMATION ], inplace = True )
394390
395391 return df
392+
393+
394+ def v1v2_parameter_df (
395+ parameter_df : pd .DataFrame ,
396+ ) -> pd .DataFrame :
397+ """Convert parameter table from petab v1 to v2.
398+
399+ Do all the necessary conversions to the parameter table that can
400+ be done with the parameter table alone.
401+ """
402+ df = parameter_df .copy ().reset_index ()
403+
404+ # parameter.estimate: int -> bool
405+ df [v2 .C .ESTIMATE ] = df [v1 .C .ESTIMATE ].apply (
406+ lambda x : str (bool (int (x ))).lower ()
407+ )
408+
409+ def update_prior (row ):
410+ """Convert prior to v2 format."""
411+ prior_type = row .get (v1 .C .OBJECTIVE_PRIOR_TYPE )
412+ if pd .isna (prior_type ):
413+ prior_type = v1 .C .UNIFORM
414+
415+ pscale = row .get (v1 .C .PARAMETER_SCALE )
416+ if pd .isna (pscale ):
417+ pscale = v1 .C .LIN
418+
419+ if prior_type not in v1 .C .PARAMETER_SCALE_PRIOR_TYPES :
420+ return prior_type
421+
422+ new_prior_type = prior_type .removeprefix ("parameterScale" ).lower ()
423+ if pscale != v1 .C .LIN :
424+ new_prior_type = f"{ pscale } -{ new_prior_type } "
425+
426+ if new_prior_type not in v2 .C .PRIOR_DISTRIBUTIONS :
427+ raise NotImplementedError (
428+ f"PEtab v2 does not support prior type `{ new_prior_type } ' "
429+ f"required for parameter `{ row .index } '."
430+ )
431+
432+ return new_prior_type
433+
434+ # update parameterScale*-priors
435+ if v1 .C .OBJECTIVE_PRIOR_TYPE in df .columns :
436+ df [v1 .C .OBJECTIVE_PRIOR_TYPE ] = df .apply (update_prior , axis = 1 )
437+
438+ # rename objectivePrior* to prior*
439+ df .rename (
440+ columns = {
441+ v1 .C .OBJECTIVE_PRIOR_TYPE : v2 .C .PRIOR_DISTRIBUTION ,
442+ v1 .C .OBJECTIVE_PRIOR_PARAMETERS : v2 .C .PRIOR_PARAMETERS ,
443+ },
444+ inplace = True ,
445+ errors = "ignore" ,
446+ )
447+ # some columns were dropped in PEtab v2
448+ df .drop (
449+ columns = [
450+ v1 .C .INITIALIZATION_PRIOR_TYPE ,
451+ v1 .C .INITIALIZATION_PRIOR_PARAMETERS ,
452+ v1 .C .PARAMETER_SCALE ,
453+ ],
454+ inplace = True ,
455+ errors = "ignore" ,
456+ )
457+
458+ return df
0 commit comments