From 52e51d5be38bc6d755bc8684445ab2ed7d90b240 Mon Sep 17 00:00:00 2001 From: Daniel Weindl Date: Thu, 9 Jul 2026 21:09:18 +0200 Subject: [PATCH 1/2] Fix missing return in v1v2_observable_df noise distribution merge update_noise_dist lacked a return statement, so the merged noiseDistribution column was always NaN after petab1to2 conversion. Co-Authored-By: Claude Sonnet 5 --- petab/v2/petab1to2.py | 2 ++ tests/v2/test_conversion.py | 26 +++++++++++++++++++++++++- 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/petab/v2/petab1to2.py b/petab/v2/petab1to2.py index de809acf..42b77d2c 100644 --- a/petab/v2/petab1to2.py +++ b/petab/v2/petab1to2.py @@ -416,6 +416,8 @@ def update_noise_dist(row): f" is not supported in PEtab v2." ) + return new_dist + df[v2.C.NOISE_DISTRIBUTION] = df.apply(update_noise_dist, axis=1) df.drop(columns=[v1.C.OBSERVABLE_TRANSFORMATION], inplace=True) diff --git a/tests/v2/test_conversion.py b/tests/v2/test_conversion.py index 21949714..2c8be626 100644 --- a/tests/v2/test_conversion.py +++ b/tests/v2/test_conversion.py @@ -1,9 +1,33 @@ import logging +import pandas as pd import pytest +import petab.v1 as v1 +import petab.v2 as v2 from petab.v2 import Problem -from petab.v2.petab1to2 import petab1to2 +from petab.v2.petab1to2 import petab1to2, v1v2_observable_df + + +def test_v1v2_observable_df_noise_distribution(): + """Test that noiseDistribution is correctly merged with + observableTransformation.""" + observable_df = pd.DataFrame( + data={ + v1.C.OBSERVABLE_ID: ["obs1", "obs2"], + v1.C.OBSERVABLE_FORMULA: ["a", "b"], + v1.C.NOISE_FORMULA: ["1", "1"], + v1.C.OBSERVABLE_TRANSFORMATION: [v1.C.LIN, v1.C.LOG], + v1.C.NOISE_DISTRIBUTION: [v1.C.NORMAL, v1.C.NORMAL], + } + ).set_index(v1.C.OBSERVABLE_ID) + + new_df = v1v2_observable_df(observable_df) + + assert list(new_df[v2.C.NOISE_DISTRIBUTION]) == [ + v2.C.NORMAL, + v2.C.LOG_NORMAL, + ] def test_petab1to2_remote(): From 0e0eee3dd38114ecbc7f11ac8825abbc3334f2b3 Mon Sep 17 00:00:00 2001 From: Daniel Weindl Date: Thu, 9 Jul 2026 21:47:53 +0200 Subject: [PATCH 2/2] .. --- petab/v2/petab1to2.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/petab/v2/petab1to2.py b/petab/v2/petab1to2.py index 42b77d2c..98fd41bc 100644 --- a/petab/v2/petab1to2.py +++ b/petab/v2/petab1to2.py @@ -389,7 +389,7 @@ def v1v2_observable_df(observable_df: pd.DataFrame) -> pd.DataFrame: df[v1.C.NOISE_DISTRIBUTION] = v1.C.NORMAL # merge observableTransformation into noiseDistribution - def update_noise_dist(row): + def get_noise_dist(row): dist = row.get(v1.C.NOISE_DISTRIBUTION) trans = row.get(v1.C.OBSERVABLE_TRANSFORMATION) @@ -418,7 +418,7 @@ def update_noise_dist(row): return new_dist - df[v2.C.NOISE_DISTRIBUTION] = df.apply(update_noise_dist, axis=1) + df[v2.C.NOISE_DISTRIBUTION] = df.apply(get_noise_dist, axis=1) df.drop(columns=[v1.C.OBSERVABLE_TRANSFORMATION], inplace=True) def extract_placeholders(row: pd.Series, type_: str) -> str: