Skip to content

Commit 8b3b21e

Browse files
authored
feat validator for rig/session compatibility (#991)
* feat validator for rig/session compatibility * linters
1 parent 0f081e4 commit 8b3b21e

File tree

3 files changed

+36
-10
lines changed

3 files changed

+36
-10
lines changed

docs/source/example_workflow/example_workflow.py

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,14 @@
1-
import pandas as pd
21
import os
32

3+
import pandas as pd
44
from aind_data_schema_models.modalities import Modality
55
from aind_data_schema_models.organizations import Organization
66
from aind_data_schema_models.pid_names import PIDName
77
from aind_data_schema_models.platforms import Platform
88

99
from aind_data_schema.core.data_description import Funding, RawDataDescription
10-
from aind_data_schema.core.subject import Subject, Species, BreedingInfo, Housing
11-
from aind_data_schema.core.procedures import (
12-
NanojectInjection,
13-
Procedures,
14-
Surgery,
15-
ViralMaterial,
16-
Perfusion,
17-
)
10+
from aind_data_schema.core.procedures import NanojectInjection, Perfusion, Procedures, Surgery, ViralMaterial
11+
from aind_data_schema.core.subject import BreedingInfo, Housing, Species, Subject
1812

1913
sessions_df = pd.read_excel("example_workflow.xlsx", sheet_name="sessions")
2014
mice_df = pd.read_excel("example_workflow.xlsx", sheet_name="mice")
@@ -34,7 +28,6 @@
3428

3529
# loop through all of the sessions
3630
for session_idx, session in sessions_df.iterrows():
37-
3831
# our data always contains planar optical physiology and behavior videos
3932
d = RawDataDescription(
4033
modality=[Modality.POPHYS, Modality.BEHAVIOR_VIDEOS],

src/aind_data_schema/core/metadata.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
from aind_data_schema.core.rig import Rig
1919
from aind_data_schema.core.session import Session
2020
from aind_data_schema.core.subject import Subject
21+
from aind_data_schema.utils.compatibility_check import RigSessionCompatibility
2122

2223

2324
class MetadataStatus(Enum):
@@ -232,3 +233,11 @@ def validate_ecephys_metadata(self):
232233
):
233234
raise ValueError("Injection is missing injection_materials.")
234235
return self
236+
237+
@model_validator(mode="after")
238+
def validate_rig_session_compatibility(self):
239+
"""Validator for metadata"""
240+
if self.rig and self.session:
241+
check = RigSessionCompatibility(self.rig, self.session)
242+
check.run_compatibility_check()
243+
return self

tests/test_metadata.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
from pydantic import ValidationError
1111
from pydantic import __version__ as pyd_version
1212

13+
from aind_data_schema.components.devices import MousePlatform
1314
from aind_data_schema.core.acquisition import Acquisition
1415
from aind_data_schema.core.data_description import DataDescription
1516
from aind_data_schema.core.instrument import Instrument
@@ -205,6 +206,29 @@ def test_validate_ecephys_metadata(self):
205206
)
206207
self.assertIn("Injection is missing injection_materials.", str(context.exception))
207208

209+
def test_validate_rig_session_compatibility(self):
210+
"""Tests that rig/session compatibility validator works as expected"""
211+
mouse_platform = MousePlatform.model_construct(name="platform1")
212+
rig = Rig.model_construct(rig_id="123_EPHYS1_20220101", mouse_platform=mouse_platform)
213+
session = Session.model_construct(rig_id="123_EPHYS2_20230101", mouse_platform_name="platform2")
214+
with self.assertRaises(ValueError) as context:
215+
Metadata(
216+
name="ecephys_655019_2023-04-03_18-17-09",
217+
location="bucket",
218+
data_description=DataDescription.model_construct(
219+
label="some label", platform=Ecephys, creation_time=time(12, 12, 12)
220+
),
221+
subject=Subject.model_construct(),
222+
procedures=Procedures.model_construct(),
223+
rig=rig,
224+
processing=Processing.model_construct(),
225+
session=session,
226+
)
227+
self.assertIn(
228+
"Rig ID in session 123_EPHYS2_20230101 does not match the rig's 123_EPHYS1_20220101.",
229+
str(context.exception),
230+
)
231+
208232

209233
if __name__ == "__main__":
210234
unittest.main()

0 commit comments

Comments
 (0)