Skip to content

Commit 4cd02ef

Browse files
authored
Validator: check datasetId in visualizations table exists in measurements table (#255)
Closes #229
1 parent f32feed commit 4cd02ef

File tree

2 files changed

+41
-4
lines changed

2 files changed

+41
-4
lines changed

petab/visualize/lint.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,20 @@ def validate_visualization_df(problem: Problem) -> bool:
127127
)
128128
errors = True
129129

130+
if problem.measurement_df is not None:
131+
referenced_datasets = set(filter(bool, vis_df[C.DATASET_ID].unique()))
132+
if referenced_datasets:
133+
existing_datasets = set(
134+
filter(bool, problem.measurement_df[C.DATASET_ID].unique())
135+
)
136+
if not referenced_datasets.issubset(existing_datasets):
137+
logger.error(
138+
f"Visualization table references {C.DATASET_ID}(s) "
139+
f"{referenced_datasets - existing_datasets}, but no such "
140+
"dataset(s) exist in the measurement table."
141+
)
142+
errors = True
143+
130144
return errors
131145

132146

tests/test_visualization.py

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -178,11 +178,16 @@ def test_visualization_with_vis_and_sim(
178178
simulation_file_Isensee,
179179
close_fig,
180180
):
181-
validate_visualization_df(
182-
petab.Problem(
183-
condition_df=petab.get_condition_df(condition_file_Isensee),
184-
visualization_df=petab.get_visualization_df(vis_spec_file_Isensee),
181+
assert (
182+
validate_visualization_df(
183+
petab.Problem(
184+
condition_df=petab.get_condition_df(condition_file_Isensee),
185+
visualization_df=petab.get_visualization_df(
186+
vis_spec_file_Isensee
187+
),
188+
)
185189
)
190+
is False
186191
)
187192
plot_with_vis_spec(
188193
vis_spec_file_Isensee,
@@ -577,3 +582,21 @@ def test_validate(vis_file, request):
577582
assert False is validate_visualization_df(
578583
petab.Problem(visualization_df=petab.get_visualization_df(vis_file))
579584
)
585+
586+
587+
def test_validate_visualization_missing_dataset(
588+
condition_file_Isensee,
589+
data_file_Isensee,
590+
vis_spec_file_Isensee,
591+
simulation_file_Isensee,
592+
):
593+
petab_problem = petab.Problem(
594+
condition_df=petab.get_condition_df(condition_file_Isensee),
595+
measurement_df=petab.get_measurement_df(data_file_Isensee),
596+
visualization_df=petab.get_visualization_df(vis_spec_file_Isensee),
597+
)
598+
599+
assert validate_visualization_df(petab_problem) is False
600+
601+
petab_problem.visualization_df.loc[0, petab.DATASET_ID] = "missing_dataset"
602+
assert validate_visualization_df(petab_problem) is True

0 commit comments

Comments
 (0)