Skip to content

Commit

Permalink
chore: lint
Browse files Browse the repository at this point in the history
  • Loading branch information
dbirman committed Sep 26, 2024
1 parent 51a36d6 commit 17725c0
Show file tree
Hide file tree
Showing 4 changed files with 62 additions and 127 deletions.
81 changes: 13 additions & 68 deletions examples/quality_control.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,93 +13,38 @@
evaluation_description="Qualitative check that drift map shows minimal movement",
evaluation_modality=Modality.ECEPHYS,
evaluation_stage=Stage.PROCESSING,
evaluation_status=[
QCStatus(
evaluator="Fred Flintstone",
timestamp=t,
status=Status.FAIL
)
],
evaluation_status=[QCStatus(evaluator="Fred Flintstone", timestamp=t, status=Status.FAIL)],
qc_metrics=[
QCMetric(
name="Probe A drift",
value="High",
reference="ecephys-drift-map"
),
QCMetric(
name="Probe B drift",
value="Low",
reference="ecephys-drift-map"
),
QCMetric(
name="Probe C drift",
value="Low",
reference="ecephys-drift-map"
)
QCMetric(name="Probe A drift", value="High", reference="ecephys-drift-map"),
QCMetric(name="Probe B drift", value="Low", reference="ecephys-drift-map"),
QCMetric(name="Probe C drift", value="Low", reference="ecephys-drift-map"),
],
notes="Manually annotated: failed due to high drift on probe A"
notes="Manually annotated: failed due to high drift on probe A",
)

eval1 = QCEvaluation(
evaluation_name="Video frame count check",
evaluation_modality=Modality.BEHAVIOR_VIDEOS,
evaluation_stage=Stage.RAW,
evaluation_status=[
QCStatus(
evaluator="Fred Flintstone",
timestamp=t,
status=Status.FAIL
)
],
qc_metrics=[
QCMetric(
name="video_1_num_frames",
value=662
),
QCMetric(
name="video_2_num_frames",
value=662
)
],
notes="Pass when video_1_num_frames==video_2_num_frames"
evaluation_status=[QCStatus(evaluator="Fred Flintstone", timestamp=t, status=Status.FAIL)],
qc_metrics=[QCMetric(name="video_1_num_frames", value=662), QCMetric(name="video_2_num_frames", value=662)],
notes="Pass when video_1_num_frames==video_2_num_frames",
)

eval2 = QCEvaluation(
evaluation_name="Probes present",
evaluation_modality=Modality.ECEPHYS,
evaluation_stage=Stage.RAW,
evaluation_status=[
QCStatus(
evaluator="Automated",
timestamp=t,
status=Status.PASS
)
],
evaluation_status=[QCStatus(evaluator="Automated", timestamp=t, status=Status.PASS)],
qc_metrics=[
QCMetric(
name="ProbeA_success",
value=True
),
QCMetric(
name="ProbeB_success",
value=True
),
QCMetric(
name="ProbeC_success",
value=True
)
QCMetric(name="ProbeA_success", value=True),
QCMetric(name="ProbeB_success", value=True),
QCMetric(name="ProbeC_success", value=True),
],
)

q = QualityControl(
overall_status=[
QCStatus(
evaluator="Automated",
timestamp=t,
status=Status.PASS
)
],
evaluations=[eval0, eval1, eval2]
overall_status=[QCStatus(evaluator="Automated", timestamp=t, status=Status.PASS)], evaluations=[eval0, eval1, eval2]
)

serialized = q.model_dump_json()
Expand Down
33 changes: 15 additions & 18 deletions src/aind_data_schema/core/metadata.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,16 +24,16 @@


CORE_FILES = [
"subject",
"data_description",
"procedures",
"session",
"rig",
"processing",
"acquisition",
"instrument",
"quality_control"
]
"subject",
"data_description",
"procedures",
"session",
"rig",
"processing",
"acquisition",
"instrument",
"quality_control",
]


class MetadataStatus(str, Enum):
Expand Down Expand Up @@ -125,7 +125,8 @@ class Metadata(AindCoreModel):
default=None, title="Quality Control", description="Description of quality metrics for a data asset"
)

@field_validator(*CORE_FILES,
@field_validator(
*CORE_FILES,
mode="before",
)
def validate_core_fields(cls, value, info: ValidationInfo):
Expand Down Expand Up @@ -204,18 +205,14 @@ def validate_expected_files_by_modality(self):
for file in CORE_FILES:
# For each field, check if this is a required/excluded file
file_requirement = getattr(getattr(ExpectedFiles, str(modality.abbreviation).upper()), file)

# Check required case
if file_requirement == FileRequirement.REQUIRED and not getattr(self, file):
raise ValueError(
f"{modality.abbreviation} metadata missing required file: {file}"
)
raise ValueError(f"{modality.abbreviation} metadata missing required file: {file}")

# Check excluded case
if file_requirement == FileRequirement.EXCLUDED and getattr(self, file):
raise ValueError(
f"{modality.abbreviation} metadata includes excluded file: {file}"
)
raise ValueError(f"{modality.abbreviation} metadata includes excluded file: {file}")

return self

Expand Down
24 changes: 16 additions & 8 deletions tests/test_metadata.py
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,7 @@ def test_validate_smartspim_metadata(self):
location="bucket",
data_description=DataDescription.model_construct(
label="some label",
platform=Platform.SMARTSPIM,
platform=Platform.SMARTSPIM,
creation_time=time(12, 12, 12),
modality=[Modality.SPIM],
),
Expand All @@ -161,14 +161,16 @@ def test_validate_smartspim_metadata(self):
name="ecephys_655019_2023-04-03_18-17-09",
location="bucket",
data_description=DataDescription.model_construct(
label="some label", platform=Platform.SMARTSPIM, creation_time=time(12, 12, 12),
modality=[Modality.SPIM]
label="some label",
platform=Platform.SMARTSPIM,
creation_time=time(12, 12, 12),
modality=[Modality.SPIM],
),
subject=Subject.model_construct(),
procedures=Procedures.model_construct(subject_procedures=[surgery2]),
acquisition=Acquisition.model_construct(),
instrument=Instrument.model_construct(),
processing=Processing.model_construct()
processing=Processing.model_construct(),
)
self.assertIn("Injection is missing injection_materials.", str(context.exception))

Expand All @@ -185,7 +187,9 @@ def test_validate_ecephys_metadata(self):
name="ecephys_655019_2023-04-03_18-17-09",
location="bucket",
data_description=DataDescription.model_construct(
label="some label", platform=Platform.ECEPHYS, creation_time=time(12, 12, 12),
label="some label",
platform=Platform.ECEPHYS,
creation_time=time(12, 12, 12),
modality=[Modality.ECEPHYS],
),
procedures=Procedures.model_construct(subject_procedures=[surgery1]),
Expand All @@ -203,7 +207,9 @@ def test_validate_ecephys_metadata(self):
name="ecephys_655019_2023-04-03_18-17-09",
location="bucket",
data_description=DataDescription.model_construct(
label="some label", platform=Platform.ECEPHYS, creation_time=time(12, 12, 12),
label="some label",
platform=Platform.ECEPHYS,
creation_time=time(12, 12, 12),
modality=[Modality.ECEPHYS],
),
subject=Subject.model_construct(),
Expand All @@ -224,8 +230,10 @@ def test_validate_rig_session_compatibility(self):
name="ecephys_655019_2023-04-03_18-17-09",
location="bucket",
data_description=DataDescription.model_construct(
label="some label", platform=Platform.ECEPHYS, creation_time=time(12, 12, 12),
modality=[Modality.ECEPHYS]
label="some label",
platform=Platform.ECEPHYS,
creation_time=time(12, 12, 12),
modality=[Modality.ECEPHYS],
),
subject=Subject.model_construct(),
procedures=Procedures.model_construct(),
Expand Down
51 changes: 18 additions & 33 deletions tests/test_quality_control.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,43 +19,28 @@ def test_constructors(self):
q = QualityControl()

test_eval = QCEvaluation(
evaluation_name="Drift map",
evaluation_status=[
QCStatus(
evaluator="Fred Flintstone",
timestamp=date.fromisoformat("2020-10-10"),
status=Status.PASS
)
],
evaluation_modality=Modality.ECEPHYS,
evaluation_stage=Stage.PROCESSING,
qc_metrics=[
QCMetric(
name="Multiple values example",
value={"stuff": "in_a_dict"}
),
QCMetric(
name="Drift map pass/fail",
value=False,
description="Manual evaluation of whether the drift map looks good",
references=["s3://some-data-somewhere"]
)
],
)

q = QualityControl(
overall_status=[
QCStatus(
evaluator="Bob",
timestamp=date.fromisoformat("2020-10-10"),
status=Status.PASS
)
evaluation_name="Drift map",
evaluation_status=[
QCStatus(evaluator="Fred Flintstone", timestamp=date.fromisoformat("2020-10-10"), status=Status.PASS)
],
evaluations=[
test_eval
evaluation_modality=Modality.ECEPHYS,
evaluation_stage=Stage.PROCESSING,
qc_metrics=[
QCMetric(name="Multiple values example", value={"stuff": "in_a_dict"}),
QCMetric(
name="Drift map pass/fail",
value=False,
description="Manual evaluation of whether the drift map looks good",
references=["s3://some-data-somewhere"],
),
],
)

q = QualityControl(
overall_status=[QCStatus(evaluator="Bob", timestamp=date.fromisoformat("2020-10-10"), status=Status.PASS)],
evaluations=[test_eval],
)

assert q is not None


Expand Down

0 comments on commit 17725c0

Please sign in to comment.