99import pandas as pd
1010from pandas .io .common import get_handle , is_url
1111
12- import petab .v1 .C
13- from petab .models import MODEL_TYPE_SBML
14- from petab .v1 import Problem as ProblemV1
15- from petab .yaml import get_path_prefix
16-
1712from .. import v1 , v2
18- from ..v1 .yaml import load_yaml , validate , write_yaml
13+ from ..v1 import Problem as ProblemV1
14+ from ..v1 .yaml import get_path_prefix , load_yaml , validate , write_yaml
1915from ..versions import get_major_version
16+ from .models import MODEL_TYPE_SBML
2017
2118__all__ = ["petab1to2" ]
2219
@@ -63,18 +60,18 @@ def petab1to2(yaml_config: Path | str, output_dir: Path | str = None):
6360 if get_major_version (yaml_config ) != 1 :
6461 raise ValueError ("PEtab problem is not version 1." )
6562 petab_problem = ProblemV1 .from_yaml (yaml_file or yaml_config )
63+ # get rid of conditionName column if present (unsupported in v2)
64+ petab_problem .condition_df = petab_problem .condition_df .drop (
65+ columns = [v1 .C .CONDITION_NAME ], errors = "ignore"
66+ )
6667 if v1 .lint_problem (petab_problem ):
6768 raise ValueError ("Provided PEtab problem does not pass linting." )
6869
70+ output_dir = Path (output_dir )
71+
6972 # Update YAML file
7073 new_yaml_config = _update_yaml (yaml_config )
7174
72- # Write new YAML file
73- output_dir = Path (output_dir )
74- output_dir .mkdir (parents = True , exist_ok = True )
75- new_yaml_file = output_dir / Path (yaml_file ).name
76- write_yaml (new_yaml_config , new_yaml_file )
77-
7875 # Update tables
7976 # condition tables, observable tables, SBML files, parameter table:
8077 # no changes - just copy
@@ -104,6 +101,19 @@ def petab1to2(yaml_config: Path | str, output_dir: Path | str = None):
104101 def create_experiment_id (sim_cond_id : str , preeq_cond_id : str ) -> str :
105102 if not sim_cond_id and not preeq_cond_id :
106103 return ""
104+ # check whether the conditions will exist in the v2 condition table
105+ sim_cond_exists = (
106+ petab_problem .condition_df .loc [sim_cond_id ].notna ().any ()
107+ )
108+ preeq_cond_exists = (
109+ preeq_cond_id
110+ and petab_problem .condition_df .loc [preeq_cond_id ].notna ().any ()
111+ )
112+ if not sim_cond_exists and not preeq_cond_exists :
113+ # if we have only all-NaN conditions, we don't create a new
114+ # experiment
115+ return ""
116+
107117 if preeq_cond_id :
108118 preeq_cond_id = f"{ preeq_cond_id } _"
109119 exp_id = f"experiment__{ preeq_cond_id } __{ sim_cond_id } "
@@ -126,6 +136,8 @@ def create_experiment_id(sim_cond_id: str, preeq_cond_id: str) -> str:
126136 sim_cond_id = row [v1 .C .SIMULATION_CONDITION_ID ]
127137 preeq_cond_id = row .get (v1 .C .PREEQUILIBRATION_CONDITION_ID , "" )
128138 exp_id = create_experiment_id (sim_cond_id , preeq_cond_id )
139+ if not exp_id :
140+ continue
129141 if preeq_cond_id :
130142 experiments .append (
131143 {
@@ -165,10 +177,8 @@ def create_experiment_id(sim_cond_id: str, preeq_cond_id: str) -> str:
165177 # add pre-eq condition id if not present or convert to string
166178 # for simplicity
167179 if v1 .C .PREEQUILIBRATION_CONDITION_ID in measurement_df .columns :
168- measurement_df [
169- v1 .C .PREEQUILIBRATION_CONDITION_ID
170- ] = measurement_df [v1 .C .PREEQUILIBRATION_CONDITION_ID ].astype (
171- str
180+ measurement_df .fillna (
181+ {v1 .C .PREEQUILIBRATION_CONDITION_ID : "" }, inplace = True
172182 )
173183 else :
174184 measurement_df [v1 .C .PREEQUILIBRATION_CONDITION_ID ] = ""
@@ -177,7 +187,7 @@ def create_experiment_id(sim_cond_id: str, preeq_cond_id: str) -> str:
177187 petab_problem .condition_df is not None
178188 and len (
179189 set (petab_problem .condition_df .columns )
180- - {petab . v1 .C .CONDITION_NAME }
190+ - {v1 .C .CONDITION_NAME }
181191 )
182192 == 0
183193 ):
@@ -209,6 +219,10 @@ def create_experiment_id(sim_cond_id: str, preeq_cond_id: str) -> str:
209219 measurement_df , get_dest_path (measurement_file )
210220 )
211221
222+ # Write new YAML file
223+ new_yaml_file = output_dir / Path (yaml_file ).name
224+ write_yaml (new_yaml_config , new_yaml_file )
225+
212226 # validate updated Problem
213227 validation_issues = v2 .lint_problem (new_yaml_file )
214228
0 commit comments