From 80ceab4922b3e0f667eb9ce321dba41145474952 Mon Sep 17 00:00:00 2001 From: jtyoung84 <104453205+jtyoung84@users.noreply.github.com> Date: Tue, 20 Aug 2024 14:57:49 -0700 Subject: [PATCH 01/23] Build merge main (#1032) * build: updates version number * feat: adds qc schema json * fix: updates schema version check to handle new core schemas * ci: adds service account token to github actions * bump schema version [skip actions] * fix: updates broken github action * bump schema version [skip actions] * build: increments version to 1.0.0 * build: sets core metadata schema to v1.0.0 --------- Co-authored-by: github-actions <41898282+github-actions[bot]@users.noreply.github.com> --- schemas/metadata_schema.json | 54 ++++++++++++++++---------------- src/aind_data_schema/__init__.py | 2 +- 2 files changed, 28 insertions(+), 28 deletions(-) diff --git a/schemas/metadata_schema.json b/schemas/metadata_schema.json index 5448c73b..5df6c5ad 100644 --- a/schemas/metadata_schema.json +++ b/schemas/metadata_schema.json @@ -4872,10 +4872,10 @@ "type": "string" }, "schema_version": { - "const": "0.13.12", - "default": "0.13.12", + "const": "1.0.0", + "default": "1.0.0", "enum": [ - "0.13.12" + "1.0.0" ], "title": "Schema Version", "type": "string" @@ -13176,10 +13176,10 @@ "type": "string" }, "schema_version": { - "const": "0.10.29", - "default": "0.10.29", + "const": "1.0.0", + "default": "1.0.0", "enum": [ - "0.10.29" + "1.0.0" ], "title": "Schema Version", "type": "string" @@ -24205,10 +24205,10 @@ "type": "string" }, "schema_version": { - "const": "0.13.15", - "default": "0.13.15", + "const": "1.0.0", + "default": "1.0.0", "enum": [ - "0.13.15" + "1.0.0" ], "title": "Schema Version", "type": "string" @@ -24329,10 +24329,10 @@ "type": "string" }, "schema_version": { - "const": "0.4.9", - "default": "0.4.9", + "const": "1.0.0", + "default": "1.0.0", "enum": [ - "0.4.9" + "1.0.0" ], "title": "Schema Version", "type": "string" @@ -24711,10 +24711,10 @@ "type": "string" }, "schema_version": { - "const": "0.0.1", - "default": "0.0.1", + "const": "1.0.0", + "default": "1.0.0", "enum": [ - "0.0.1" + "1.0.0" ], "title": "Schema Version", "type": "string" @@ -26606,10 +26606,10 @@ "type": "string" }, "schema_version": { - "const": "0.5.5", - "default": "0.5.5", + "const": "1.0.0", + "default": "1.0.0", "enum": [ - "0.5.5" + "1.0.0" ], "title": "Schema Version", "type": "string" @@ -28742,10 +28742,10 @@ "type": "string" }, "schema_version": { - "const": "0.3.5", - "default": "0.3.5", + "const": "1.0.0", + "default": "1.0.0", "enum": [ - "0.3.5" + "1.0.0" ], "title": "Schema Version", "type": "string" @@ -30998,10 +30998,10 @@ "type": "string" }, "schema_version": { - "const": "0.5.10", - "default": "0.5.10", + "const": "1.0.0", + "default": "1.0.0", "enum": [ - "0.5.10" + "1.0.0" ], "title": "Schema Version", "type": "string" @@ -34383,10 +34383,10 @@ "type": "string" }, "schema_version": { - "const": "0.2.33", - "default": "0.2.33", + "const": "1.0.0", + "default": "1.0.0", "enum": [ - "0.2.33" + "1.0.0" ], "title": "Schema Version", "type": "string" diff --git a/src/aind_data_schema/__init__.py b/src/aind_data_schema/__init__.py index e2c88594..a0706de6 100755 --- a/src/aind_data_schema/__init__.py +++ b/src/aind_data_schema/__init__.py @@ -1,4 +1,4 @@ """ imports for AindModel subclasses """ -__version__ = "0.39.1" +__version__ = "1.0.0" From d272a5c107f323a614df1d8c08e43c08da3159d8 Mon Sep 17 00:00:00 2001 From: Saskia de Vries Date: Fri, 23 Aug 2024 13:22:48 -0700 Subject: [PATCH 02/23] added EMGInsertion (#1030) * added EMGInsertion * lint * one_of * chore: lint * fix: removing ONE_OF calls for Union types * changed name --------- Co-authored-by: Dan Birman --- src/aind_data_schema/components/devices.py | 14 ++++++++++ src/aind_data_schema/core/procedures.py | 31 +++++++++++++++++++++- 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/src/aind_data_schema/components/devices.py b/src/aind_data_schema/components/devices.py index 9d52fca2..37f744ad 100644 --- a/src/aind_data_schema/components/devices.py +++ b/src/aind_data_schema/components/devices.py @@ -253,6 +253,13 @@ class LickSensorType(str, Enum): PIEZOELECTIC = "Piezoelectric" +class MyomatrixArrayType(str, Enum): + """Type of Myomatrix array""" + + INJECTED = "Injected" + SUTURED = "Sutured" + + class Device(AindModel): """Generic device""" @@ -921,4 +928,11 @@ class Scanner(Device): magnetic_strength_unit: str = Field(default="T", title="Magnetic strength unit") +class MyomatrixArray(Device): + """Description of a Myomatrix array""" + + device_type: Literal["Myomatrix Array"] = "Myomatrix Array" + array_type: MyomatrixArrayType = Field(..., title="Array type") + + LIGHT_SOURCES = Annotated[Union[Laser, LightEmittingDiode, Lamp], Field(discriminator="device_type")] diff --git a/src/aind_data_schema/core/procedures.py b/src/aind_data_schema/core/procedures.py index 4da38f1c..7640575d 100644 --- a/src/aind_data_schema/core/procedures.py +++ b/src/aind_data_schema/core/procedures.py @@ -5,6 +5,7 @@ from enum import Enum from typing import List, Literal, Optional, Set, Union +from aind_data_schema_models.mouse_anatomy import MouseAnatomicalStructure from aind_data_schema_models.pid_names import PIDName from aind_data_schema_models.species import Species from aind_data_schema_models.specimen_procedure_types import SpecimenProcedureType @@ -24,7 +25,7 @@ from typing_extensions import Annotated from aind_data_schema.base import AindCoreModel, AindModel, AwareDatetimeWithDefault -from aind_data_schema.components.devices import FiberProbe +from aind_data_schema.components.devices import FiberProbe, MyomatrixArray from aind_data_schema.components.reagent import Reagent @@ -555,6 +556,33 @@ class WaterRestriction(AindModel): end_date: Optional[date] = Field(default=None, title="Water restriction end date") +class MyomatrixContact(AindModel): + """ "Description of a contact on a myomatrix thread""" + + body_part: MouseAnatomicalStructure.BODY_PARTS = Field(..., title="Body part of contact insertion") + muscle: MouseAnatomicalStructure.EMG_MUSCLES = Field(..., title="Muscle of contact insertion") + in_muscle: bool = Field(..., title="In muscle") + notes: Optional[str] = Field(default=None, title="Notes") + + +class MyomatrixThread(AindModel): + """Description of a thread of a myomatrix array""" + + ground_electrode_location: MouseAnatomicalStructure.BODY_PARTS = Field( + ..., title="Location of ground electrode" + ) + contacts: List[MyomatrixContact] = Field(..., title="Contacts") + + +class MyomatrixInsertion(AindModel): + """Description of a Myomatrix array insertion for EMG""" + + procedure_type: Literal["Myomatrix_Insertion"] = "Myomatrix_Insertion" + protocol_id: str = Field(..., title="Protocol ID", description="DOI for protocols.io") + myomatrix_array: MyomatrixArray = Field(..., title="Myomatrix array") + threads: List[MyomatrixThread] = Field(..., title="Array threads") + + class Perfusion(AindModel): """Description of a perfusion procedure that creates a specimen""" @@ -603,6 +631,7 @@ class Surgery(AindModel): IntraCisternalMagnaInjection, IntraperitonealInjection, IontophoresisInjection, + MyomatrixInsertion, NanojectInjection, OtherSubjectProcedure, Perfusion, From 1cac6575be9b15cab794119ad3e784096e6171b9 Mon Sep 17 00:00:00 2001 From: Dan Birman Date: Thu, 29 Aug 2024 20:47:26 -0700 Subject: [PATCH 03/23] =?UTF-8?q?chore:=20making=20all=20use=20of=20Field(?= =?UTF-8?q?default=3DNone)=20consistent=20for=20Optional=20=E2=80=A6=20(#1?= =?UTF-8?q?041)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore: making all use of Field(default=None) consistent for Optional fields * chore: lint --- src/aind_data_schema/components/coordinates.py | 2 +- src/aind_data_schema/components/tile.py | 4 ++-- src/aind_data_schema/core/data_description.py | 4 +++- src/aind_data_schema/core/instrument.py | 8 ++++---- src/aind_data_schema/core/metadata.py | 10 ++++++---- src/aind_data_schema/core/procedures.py | 4 +--- src/aind_data_schema/core/subject.py | 14 +++++++------- 7 files changed, 24 insertions(+), 22 deletions(-) diff --git a/src/aind_data_schema/components/coordinates.py b/src/aind_data_schema/components/coordinates.py index 387649fb..854d9d3f 100644 --- a/src/aind_data_schema/components/coordinates.py +++ b/src/aind_data_schema/components/coordinates.py @@ -178,4 +178,4 @@ class RelativePosition(AindModel): ..., title="Device origin", description="Reference point on device for position information" ) device_axes: List[Axis] = Field(..., title="Device axes", min_length=3, max_length=3) - notes: Optional[str] = Field(None, title="Notes") + notes: Optional[str] = Field(default=None, title="Notes") diff --git a/src/aind_data_schema/components/tile.py b/src/aind_data_schema/components/tile.py index 2160a100..3ffe8a44 100644 --- a/src/aind_data_schema/components/tile.py +++ b/src/aind_data_schema/components/tile.py @@ -60,5 +60,5 @@ class AcquisitionTile(Tile): notes: Optional[str] = Field(default=None, title="Notes") imaging_angle: int = Field(default=0, title="Imaging angle") imaging_angle_unit: AngleUnit = Field(default=AngleUnit.DEG, title="Imaging angle unit") - acquisition_start_time: Optional[AwareDatetimeWithDefault] = Field(None, title="Acquisition start time") - acquisition_end_time: Optional[AwareDatetimeWithDefault] = Field(None, title="Acquisition end time") + acquisition_start_time: Optional[AwareDatetimeWithDefault] = Field(default=None, title="Acquisition start time") + acquisition_end_time: Optional[AwareDatetimeWithDefault] = Field(default=None, title="Acquisition end time") diff --git a/src/aind_data_schema/core/data_description.py b/src/aind_data_schema/core/data_description.py index 2f546773..9397e1f9 100644 --- a/src/aind_data_schema/core/data_description.py +++ b/src/aind_data_schema/core/data_description.py @@ -120,7 +120,9 @@ class DataDescription(AindCoreModel): title="Related data", description="Path and description of data assets associated with this asset (eg. reference images)", ) - data_summary: Optional[str] = Field(None, title="Data summary", description="Semantic summary of experimental goal") + data_summary: Optional[str] = Field( + default=None, title="Data summary", description="Semantic summary of experimental goal" + ) @classmethod def parse_name(cls, name): diff --git a/src/aind_data_schema/core/instrument.py b/src/aind_data_schema/core/instrument.py index 10822306..b7184289 100644 --- a/src/aind_data_schema/core/instrument.py +++ b/src/aind_data_schema/core/instrument.py @@ -45,10 +45,10 @@ class Instrument(AindCoreModel): modification_date: date = Field(..., title="Date of modification") instrument_type: ImagingInstrumentType = Field(..., title="Instrument type") manufacturer: Organization.ONE_OF = Field(..., title="Instrument manufacturer") - temperature_control: Optional[bool] = Field(None, title="Temperature control") - humidity_control: Optional[bool] = Field(None, title="Humidity control") + temperature_control: Optional[bool] = Field(default=None, title="Temperature control") + humidity_control: Optional[bool] = Field(default=None, title="Humidity control") optical_tables: List[OpticalTable] = Field(default=[], title="Optical table") - enclosure: Optional[Enclosure] = Field(None, title="Enclosure") + enclosure: Optional[Enclosure] = Field(default=None, title="Enclosure") objectives: List[Objective] = Field(..., title="Objectives") detectors: List[Detector] = Field(default=[], title="Detectors") light_sources: List[LIGHT_SOURCES] = Field(default=[], title="Light sources") @@ -69,7 +69,7 @@ class Instrument(AindCoreModel): ) com_ports: List[Com] = Field(default=[], title="COM ports") daqs: List[DAQDevice] = Field(default=[], title="DAQ") - notes: Optional[str] = Field(None, validate_default=True) + notes: Optional[str] = Field(default=None, validate_default=True) @field_validator("daqs", mode="after") def validate_device_names(cls, value: List[DAQDevice], info: ValidationInfo) -> List[DAQDevice]: diff --git a/src/aind_data_schema/core/metadata.py b/src/aind_data_schema/core/metadata.py index f7fd07e0..c9f038b8 100644 --- a/src/aind_data_schema/core/metadata.py +++ b/src/aind_data_schema/core/metadata.py @@ -98,10 +98,12 @@ class Metadata(AindCoreModel): procedures: Optional[Procedures] = Field( default=None, title="Procedures", description="All procedures performed on a subject." ) - session: Optional[Session] = Field(None, title="Session", description="Description of a session.") - rig: Optional[Rig] = Field(None, title="Rig", description="Rig.") - processing: Optional[Processing] = Field(None, title="Processing", description="All processes run on data.") - acquisition: Optional[Acquisition] = Field(None, title="Acquisition", description="Imaging acquisition session") + session: Optional[Session] = Field(default=None, title="Session", description="Description of a session.") + rig: Optional[Rig] = Field(default=None, title="Rig", description="Rig.") + processing: Optional[Processing] = Field(default=None, title="Processing", description="All processes run on data.") + acquisition: Optional[Acquisition] = Field( + default=None, title="Acquisition", description="Imaging acquisition session" + ) instrument: Optional[Instrument] = Field( default=None, title="Instrument", description="Instrument, which is a collection of devices" ) diff --git a/src/aind_data_schema/core/procedures.py b/src/aind_data_schema/core/procedures.py index 7640575d..58f7137a 100644 --- a/src/aind_data_schema/core/procedures.py +++ b/src/aind_data_schema/core/procedures.py @@ -568,9 +568,7 @@ class MyomatrixContact(AindModel): class MyomatrixThread(AindModel): """Description of a thread of a myomatrix array""" - ground_electrode_location: MouseAnatomicalStructure.BODY_PARTS = Field( - ..., title="Location of ground electrode" - ) + ground_electrode_location: MouseAnatomicalStructure.BODY_PARTS = Field(..., title="Location of ground electrode") contacts: List[MyomatrixContact] = Field(..., title="Contacts") diff --git a/src/aind_data_schema/core/subject.py b/src/aind_data_schema/core/subject.py index 52ea61fb..dd2100bd 100644 --- a/src/aind_data_schema/core/subject.py +++ b/src/aind_data_schema/core/subject.py @@ -63,9 +63,9 @@ class WellnessReport(AindModel): class Housing(AindModel): """Description of subject housing""" - cage_id: Optional[str] = Field(None, title="Cage ID") - room_id: Optional[str] = Field(None, title="Room ID") - light_cycle: Optional[LightCycle] = Field(None, title="Light cycle") + cage_id: Optional[str] = Field(default=None, title="Cage ID") + room_id: Optional[str] = Field(default=None, title="Room ID") + light_cycle: Optional[LightCycle] = Field(default=None, title="Light cycle") home_cage_enrichment: List[HomeCageEnrichment] = Field(default=[], title="Home cage enrichment") cohoused_subjects: List[str] = Field( default=[], @@ -104,8 +104,8 @@ class Subject(AindCoreModel): ) species: Species.ONE_OF = Field(..., title="Species") alleles: List[PIDName] = Field(default=[], title="Alleles", description="Allele names and persistent IDs") - background_strain: Optional[BackgroundStrain] = Field(None, title="Background strain") - breeding_info: Optional[BreedingInfo] = Field(None, title="Breeding Info") + background_strain: Optional[BackgroundStrain] = Field(default=None, title="Background strain") + breeding_info: Optional[BreedingInfo] = Field(default=None, title="Breeding Info") source: Organization.SUBJECT_SOURCES = Field( ..., description="Where the subject was acquired from. If bred in-house, use Allen Institute.", @@ -122,8 +122,8 @@ class Subject(AindCoreModel): title="Restrictions", ) wellness_reports: List[WellnessReport] = Field(default=[], title="Wellness Report") - housing: Optional[Housing] = Field(None, title="Housing") - notes: Optional[str] = Field(None, title="Notes") + housing: Optional[Housing] = Field(default=None, title="Housing") + notes: Optional[str] = Field(default=None, title="Notes") @field_validator("source", mode="after") def validate_inhouse_breeding_info(cls, v: Organization.ONE_OF, info: ValidationInfo): From 9dc0556078c2f1af7a49aef19a87fdc9bcff0efc Mon Sep 17 00:00:00 2001 From: Saskia de Vries Date: Thu, 29 Aug 2024 23:01:06 -0700 Subject: [PATCH 04/23] Feat emg side (#1036) * added Side * midline * schema version --- src/aind_data_schema/core/procedures.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/aind_data_schema/core/procedures.py b/src/aind_data_schema/core/procedures.py index 58f7137a..df9716f8 100644 --- a/src/aind_data_schema/core/procedures.py +++ b/src/aind_data_schema/core/procedures.py @@ -66,6 +66,7 @@ class Side(str, Enum): LEFT = "Left" RIGHT = "Right" + MIDLINE = "Midline" class SectionOrientation(str, Enum): @@ -560,6 +561,7 @@ class MyomatrixContact(AindModel): """ "Description of a contact on a myomatrix thread""" body_part: MouseAnatomicalStructure.BODY_PARTS = Field(..., title="Body part of contact insertion") + side: Side = Field(..., title="Body side") muscle: MouseAnatomicalStructure.EMG_MUSCLES = Field(..., title="Muscle of contact insertion") in_muscle: bool = Field(..., title="In muscle") notes: Optional[str] = Field(default=None, title="Notes") From 8246813f3af9a92716a5a1a09331e88b7dcc2a22 Mon Sep 17 00:00:00 2001 From: Dan Birman Date: Fri, 30 Aug 2024 11:06:52 -0700 Subject: [PATCH 05/23] Refactor to add QCMetric class and list of URLs for reference images/figures (#1037) * feat: refactor qc_metrics to a List of metrics, with additional metadata * fix: replace AindGenericType with typing.Any * feat/tests: making references optional but name required, fixing typo, trying to fix tests * tests: fixing broken quality_control example + tests * fix: add default= for Optional fields * tests: changing how examples are generated * refactor: QC.Stage and adding _name and _desc fields * fix: no shortened names, lint * chore: missed name changes --- examples/quality_control.json | 93 ++++++++++++++--- examples/quality_control.py | 97 +++++++++++++----- quality_control.json | 102 +++++++++++++++++++ src/aind_data_schema/core/quality_control.py | 41 ++++++-- tests/test_quality_control.py | 34 +++++-- 5 files changed, 304 insertions(+), 63 deletions(-) create mode 100644 quality_control.json diff --git a/examples/quality_control.json b/examples/quality_control.json index 013944f7..961b188c 100644 --- a/examples/quality_control.json +++ b/examples/quality_control.json @@ -1,38 +1,99 @@ { - "describedBy": "https://raw.githubusercontent.com/AllenNeuralDynamics/aind-data-schema/main/src/aind_data_schema/core/quality_metrics.py", + "describedBy": "https://raw.githubusercontent.com/AllenNeuralDynamics/aind-data-schema/main/src/aind_data_schema/core/quality_control.py", "schema_version": "1.0.0", "overall_status": "Pass", "overall_status_date": "2022-11-22", "evaluations": [ + { + "evaluation_modality": { + "name": "Extracellular electrophysiology", + "abbreviation": "ecephys" + }, + "evaluation_stage": "Preprocessing", + "evaluation_name": "Drift map", + "evaluation_description": "Qualitative check that drift map shows minimal movement", + "evaluator": "Fred Flintstone", + "evaluation_date": "2022-11-22", + "qc_metrics": [ + { + "name": "Probe A drift", + "value": "High", + "description": null, + "references": null + }, + { + "name": "Probe B drift", + "value": "Low", + "description": null, + "references": null + }, + { + "name": "Probe C drift", + "value": "Low", + "description": null, + "references": null + } + ], + "stage_status": "Fail", + "notes": "Manually annotated: failed due to high drift on probe A" + }, { "evaluation_modality": { "name": "Behavior videos", "abbreviation": "behavior-videos" }, - "evaluation_stage": "Data acquisition", - "evaluator_full_name": "Fred Flinstone", + "evaluation_stage": "Raw data", + "evaluation_name": "Video frame count check", + "evaluation_description": null, + "evaluator": "Fred Flinstone", "evaluation_date": "2022-11-22", - "qc_metrics": { - "Video_1_num_frames": 662, - "Video_2_num_frames": 662, - "Frame_match": true - }, + "qc_metrics": [ + { + "name": "video_1_num_frames", + "value": 662, + "description": null, + "references": null + }, + { + "name": "video_2_num_frames", + "value": 662, + "description": null, + "references": null + } + ], "stage_status": "Pass", - "notes": null + "notes": "Pass when video_1_num_frames==video_2_num_frames" }, { "evaluation_modality": { "name": "Extracellular electrophysiology", "abbreviation": "ecephys" }, - "evaluation_stage": "Data acquisition", - "evaluator_full_name": "Fred Flinstone", + "evaluation_stage": "Raw data", + "evaluation_name": "Probes present", + "evaluation_description": null, + "evaluator": "Automated", "evaluation_date": "2022-11-22", - "qc_metrics": { - "ProbeA_success": true, - "ProbeB_success": true, - "ProbeC_success": false - }, + "qc_metrics": [ + { + "name": "ProbeA_success", + "value": true, + "description": null, + "references": null + }, + { + "name": "ProbeB_success", + "value": true, + "description": null, + "references": null + }, + { + "name": "ProbeC_success", + "value": true, + "description": null, + "references": null + } + ], "stage_status": "Pass", "notes": null } diff --git a/examples/quality_control.py b/examples/quality_control.py index 69dabc64..41366e08 100644 --- a/examples/quality_control.py +++ b/examples/quality_control.py @@ -4,39 +4,82 @@ from aind_data_schema_models.modalities import Modality -from aind_data_schema.core.quality_control import QCEvaluation, QualityControl +from aind_data_schema.core.quality_control import QCEvaluation, QualityControl, QCMetric, Stage, Status t = date(2022, 11, 22) -q = QualityControl( - overall_status="Pass", - overall_status_date=t, - evaluations=[ - QCEvaluation( - evaluation_modality=Modality.BEHAVIOR_VIDEOS, - evaluation_stage="Data acquisition", - evaluator_full_name="Fred Flinstone", - evaluation_date=t, - qc_metrics={ - "Video_1_num_frames": 662, - "Video_2_num_frames": 662, - "Frame_match": True, - }, - stage_status="Pass", +eval0 = QCEvaluation( + evaluation_name="Drift map", + evaluation_description="Qualitative check that drift map shows minimal movement", + evaluation_modality=Modality.ECEPHYS, + evaluation_stage=Stage.PREPROCESSING, + evaluator="Fred Flintstone", + evaluation_date=t, + qc_metrics=[ + QCMetric( + name="Probe A drift", + value="High" ), - QCEvaluation( - evaluation_modality=Modality.ECEPHYS, - evaluation_stage="Data acquisition", - evaluator_full_name="Fred Flinstone", - evaluation_date=t, - qc_metrics={ - "ProbeA_success": True, - "ProbeB_success": True, - "ProbeC_success": False, - }, - stage_status="Pass", + QCMetric( + name="Probe B drift", + value="Low" ), + QCMetric( + name="Probe C drift", + value="Low" + ) ], + stage_status=Status.FAIL, + 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, + evaluator="Fred Flinstone", + evaluation_date=t, + qc_metrics=[ + QCMetric( + name="video_1_num_frames", + value=662 + ), + QCMetric( + name="video_2_num_frames", + value=662 + ) + ], + stage_status=Status.PASS, + 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, + evaluator="Automated", + evaluation_date=t, + qc_metrics=[ + QCMetric( + name="ProbeA_success", + value=True + ), + QCMetric( + name="ProbeB_success", + value=True + ), + QCMetric( + name="ProbeC_success", + value=True + ) + ], + stage_status=Status.PASS, +) + +q = QualityControl( + overall_status="Pass", + overall_status_date=t, + evaluations=[eval0, eval1, eval2] ) serialized = q.model_dump_json() diff --git a/quality_control.json b/quality_control.json new file mode 100644 index 00000000..97b4e37e --- /dev/null +++ b/quality_control.json @@ -0,0 +1,102 @@ +{ + "describedBy": "https://raw.githubusercontent.com/AllenNeuralDynamics/aind-data-schema/main/src/aind_data_schema/core/quality_control.py", + "schema_version": "1.0.0", + "overall_status": "Pass", + "overall_status_date": "2022-11-22", + "evaluations": [ + { + "evaluation_modality": { + "name": "Extracellular electrophysiology", + "abbreviation": "ecephys" + }, + "evaluation_stage": "Preprocessing", + "evaluation_name": "Drift map", + "evaluation_desc": "Qualitative check that drift map shows minimal movement", + "evaluator": "Fred Flintstone", + "evaluation_date": "2022-11-22", + "qc_metrics": [ + { + "name": "Probe A drift", + "value": "High", + "description": null, + "references": null + }, + { + "name": "Probe B drift", + "value": "Low", + "description": null, + "references": null + }, + { + "name": "Probe C drift", + "value": "Low", + "description": null, + "references": null + } + ], + "stage_status": "Fail", + "notes": "Manually annotated: failed due to high drift on probe A" + }, + { + "evaluation_modality": { + "name": "Behavior videos", + "abbreviation": "behavior-videos" + }, + "evaluation_stage": "Raw data", + "evaluation_name": "Video frame count check", + "evaluation_desc": null, + "evaluator": "Fred Flinstone", + "evaluation_date": "2022-11-22", + "qc_metrics": [ + { + "name": "video_1_num_frames", + "value": 662, + "description": null, + "references": null + }, + { + "name": "video_2_num_frames", + "value": 662, + "description": null, + "references": null + } + ], + "stage_status": "Pass", + "notes": "Pass when video_1_num_frames==video_2_num_frames" + }, + { + "evaluation_modality": { + "name": "Extracellular electrophysiology", + "abbreviation": "ecephys" + }, + "evaluation_stage": "Raw data", + "evaluation_name": "Probes present", + "evaluation_desc": null, + "evaluator": "Automated", + "evaluation_date": "2022-11-22", + "qc_metrics": [ + { + "name": "ProbeA_success", + "value": true, + "description": null, + "references": null + }, + { + "name": "ProbeB_success", + "value": true, + "description": null, + "references": null + }, + { + "name": "ProbeC_success", + "value": true, + "description": null, + "references": null + } + ], + "stage_status": "Pass", + "notes": null + } + ], + "notes": null +} \ No newline at end of file diff --git a/src/aind_data_schema/core/quality_control.py b/src/aind_data_schema/core/quality_control.py index 82b0b357..49e0f644 100644 --- a/src/aind_data_schema/core/quality_control.py +++ b/src/aind_data_schema/core/quality_control.py @@ -4,12 +4,12 @@ from datetime import date from enum import Enum -from typing import List, Literal, Optional +from typing import List, Literal, Optional, Any from aind_data_schema_models.modalities import Modality -from pydantic import Field +from pydantic import Field, BaseModel -from aind_data_schema.base import AindCoreModel, AindGeneric, AindGenericType, AindModel +from aind_data_schema.base import AindCoreModel, AindModel class Status(str, Enum): @@ -19,25 +19,46 @@ class Status(str, Enum): PASS = "Pass" +class Stage(str, Enum): + """QCEvaluation Stage + + When during data processing the QC metrics were derived. + """ + + RAW = "Raw data" + PREPROCESSING = "Preprocessing" + ANALYSIS = "Analysis" + + +class QCMetric(BaseModel): + """Description of a single quality control metric""" + name: str = Field(..., title="Metric name") + value: Any = Field(..., title="Metric value") + description: Optional[str] = Field(default=None, title="Metric description") + references: Optional[List[str]] = Field(default=None, title="Metric reference URLs") + + class QCEvaluation(AindModel): - """Description of one evaluation stage""" + """Description of one evaluation stage, with one or more metrics""" evaluation_modality: Modality.ONE_OF = Field(..., title="Modality") - evaluation_stage: str = Field(..., title="Evaluation stage") - evaluator_full_name: str = Field(..., title="Evaluator full name") + evaluation_stage: Stage = Field(..., title="Evaluation stage") + evaluation_name: str = Field(..., title="Evaluation name") + evaluation_description: Optional[str] = Field(default=None, title="Evaluation description") + evaluator: str = Field(..., title="Evaluator full name") evaluation_date: date = Field(..., title="Evaluation date") - qc_metrics: AindGenericType = Field(AindGeneric(), title="QC metrics") + qc_metrics: List[QCMetric] = Field(..., title="QC metrics") stage_status: Status = Field(..., title="Stage status") - notes: Optional[str] = Field(None, title="Notes") + notes: Optional[str] = Field(default=None, title="Notes") class QualityControl(AindCoreModel): """Description of quality metrics for a data asset""" - _DESCRIBED_BY_URL = AindCoreModel._DESCRIBED_BY_BASE_URL.default + "aind_data_schema/core/quality_metrics.py" + _DESCRIBED_BY_URL = AindCoreModel._DESCRIBED_BY_BASE_URL.default + "aind_data_schema/core/quality_control.py" describedBy: str = Field(_DESCRIBED_BY_URL, json_schema_extra={"const": _DESCRIBED_BY_URL}) schema_version: Literal["1.0.0"] = Field("1.0.0") overall_status: Status = Field(..., title="Overall status") overall_status_date: date = Field(..., title="Date of status") evaluations: List[QCEvaluation] = Field(..., title="Evaluations") - notes: Optional[str] = Field(None, title="Notes") + notes: Optional[str] = Field(default=None, title="Notes") diff --git a/tests/test_quality_control.py b/tests/test_quality_control.py index 7ed56b4a..9ae3136a 100644 --- a/tests/test_quality_control.py +++ b/tests/test_quality_control.py @@ -6,7 +6,7 @@ from aind_data_schema_models.modalities import Modality from pydantic import ValidationError -from aind_data_schema.core.quality_control import QCEvaluation, QualityControl +from aind_data_schema.core.quality_control import QCEvaluation, QualityControl, QCMetric, Stage, Status class QualityControlTests(unittest.TestCase): @@ -18,18 +18,32 @@ def test_constructors(self): with self.assertRaises(ValidationError): q = QualityControl() + test_eval = QCEvaluation( + evaluation_name="Drift map", + evaluator="Bob", + evaluation_date=date.fromisoformat("2020-10-10"), + evaluation_modality=Modality.ECEPHYS, + evaluation_stage=Stage.PREPROCESSING, + 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"] + ) + ], + stage_status=Status.PASS, + ) + q = QualityControl( overall_status_date=date.fromisoformat("2020-10-10"), - overall_status="Pass", + overall_status=Status.PASS, evaluations=[ - QCEvaluation( - evaluator_full_name="Bob", - evaluation_date=date.fromisoformat("2020-10-10"), - evaluation_modality=Modality.ECEPHYS, - evaluation_stage="Spike sorting", - qc_metrics={"number_good_units": [622]}, - stage_status="Pass", - ), + test_eval ], ) From 79dc73b122d49e37acacbedca56728369654e78e Mon Sep 17 00:00:00 2001 From: Saskia de Vries Date: Fri, 30 Aug 2024 19:45:50 -0700 Subject: [PATCH 06/23] fixed lick sensor (#1035) * fixed lick sensor * lint * updated reward spounts in rig session compat test * fixed name for daq channels * lint * lick sensor required * fip_ophys_rig example * test_device update * updated models --- examples/fip_behavior_rig.json | 44 ++++++++++++++++++++-- examples/fip_behavior_rig.py | 14 ++++++- examples/fip_ophys_rig.json | 28 ++++++++++++-- examples/fip_ophys_rig.py | 12 +++++- src/aind_data_schema/components/devices.py | 2 +- src/aind_data_schema/core/rig.py | 2 +- tests/test_device.py | 4 ++ tests/test_rig_session_compatibility.py | 26 ++++++++++--- 8 files changed, 112 insertions(+), 20 deletions(-) diff --git a/examples/fip_behavior_rig.json b/examples/fip_behavior_rig.json index 59eeae77..48528586 100644 --- a/examples/fip_behavior_rig.json +++ b/examples/fip_behavior_rig.json @@ -43,7 +43,7 @@ "reward_spouts": [ { "device_type": "Reward spout", - "name": "Janelia_Lick_Detector Left", + "name": "Left spout", "serial_number": null, "manufacturer": null, "model": null, @@ -66,12 +66,30 @@ "additional_settings": {}, "notes": null }, - "lick_sensor": null, + "lick_sensor": { + "device_type": "Lick detector", + "name": "Janelia_Lick_Detector Left", + "serial_number": null, + "manufacturer": { + "name": "Janelia Research Campus", + "abbreviation": "Janelia", + "registry": { + "name": "Research Organization Registry", + "abbreviation": "ROR" + }, + "registry_identifier": "013sk6x84" + }, + "model": null, + "path_to_cad": null, + "port_index": null, + "additional_settings": {}, + "notes": null + }, "lick_sensor_type": "Capacitive" }, { "device_type": "Reward spout", - "name": "Janelia_Lick_Detector Right", + "name": "Right spout", "serial_number": null, "manufacturer": null, "model": null, @@ -94,7 +112,25 @@ "additional_settings": {}, "notes": null }, - "lick_sensor": null, + "lick_sensor": { + "device_type": "Lick detector", + "name": "Janelia_Lick_Detector Right", + "serial_number": null, + "manufacturer": { + "name": "Janelia Research Campus", + "abbreviation": "Janelia", + "registry": { + "name": "Research Organization Registry", + "abbreviation": "ROR" + }, + "registry_identifier": "013sk6x84" + }, + "model": null, + "path_to_cad": null, + "port_index": null, + "additional_settings": {}, + "notes": null + }, "lick_sensor_type": "Capacitive" } ] diff --git a/examples/fip_behavior_rig.py b/examples/fip_behavior_rig.py index 53286f55..82870e15 100644 --- a/examples/fip_behavior_rig.py +++ b/examples/fip_behavior_rig.py @@ -98,17 +98,27 @@ d.RewardDelivery( reward_spouts=[ d.RewardSpout( - name="Janelia_Lick_Detector Left", + name="Left spout", side=d.SpoutSide.LEFT, spout_diameter=1.2, solenoid_valve=d.Device(device_type="Solenoid", name="Solenoid Left"), + lick_sensor=d.Device( + name="Janelia_Lick_Detector Left", + device_type="Lick detector", + manufacturer=d.Organization.JANELIA, + ), lick_sensor_type=d.LickSensorType("Capacitive"), ), d.RewardSpout( - name="Janelia_Lick_Detector Right", + name="Right spout", side=d.SpoutSide.RIGHT, spout_diameter=1.2, solenoid_valve=d.Device(device_type="Solenoid", name="Solenoid Right"), + lick_sensor=d.Device( + name="Janelia_Lick_Detector Right", + device_type="Lick detector", + manufacturer=d.Organization.JANELIA, + ), lick_sensor_type=d.LickSensorType("Capacitive"), ), ], diff --git a/examples/fip_ophys_rig.json b/examples/fip_ophys_rig.json index 784fb69a..7c42a76b 100644 --- a/examples/fip_ophys_rig.json +++ b/examples/fip_ophys_rig.json @@ -29,7 +29,7 @@ "reward_spouts": [ { "device_type": "Reward spout", - "name": "Lick-o-meter Left", + "name": "Left spout", "serial_number": null, "manufacturer": null, "model": null, @@ -52,12 +52,22 @@ "additional_settings": {}, "notes": null }, - "lick_sensor": null, + "lick_sensor": { + "device_type": "Lick detector", + "name": "Lick-o-meter Left", + "serial_number": null, + "manufacturer": null, + "model": null, + "path_to_cad": null, + "port_index": null, + "additional_settings": {}, + "notes": null + }, "lick_sensor_type": null }, { "device_type": "Reward spout", - "name": "Lick-o-meter Right", + "name": "Right spout", "serial_number": null, "manufacturer": null, "model": null, @@ -80,7 +90,17 @@ "additional_settings": {}, "notes": null }, - "lick_sensor": null, + "lick_sensor": { + "device_type": "Lick detector", + "name": "Lick-o-meter Right", + "serial_number": null, + "manufacturer": null, + "model": null, + "path_to_cad": null, + "port_index": null, + "additional_settings": {}, + "notes": null + }, "lick_sensor_type": null } ] diff --git a/examples/fip_ophys_rig.py b/examples/fip_ophys_rig.py index 1f894aa4..38bc5c00 100644 --- a/examples/fip_ophys_rig.py +++ b/examples/fip_ophys_rig.py @@ -261,16 +261,24 @@ d.RewardDelivery( reward_spouts=[ d.RewardSpout( - name="Lick-o-meter Left", + name="Left spout", side=d.SpoutSide.LEFT, spout_diameter=1.2, solenoid_valve=d.Device(device_type="Solenoid", name="Solenoid Left"), + lick_sensor=d.Device( + name="Lick-o-meter Left", + device_type="Lick detector", + ), ), d.RewardSpout( - name="Lick-o-meter Right", + name="Right spout", side=d.SpoutSide.RIGHT, spout_diameter=1.2, solenoid_valve=d.Device(device_type="Solenoid", name="Solenoid Right"), + lick_sensor=d.Device( + name="Lick-o-meter Right", + device_type="Lick detector", + ), ), ] ) diff --git a/src/aind_data_schema/components/devices.py b/src/aind_data_schema/components/devices.py index 37f744ad..4f1c290c 100644 --- a/src/aind_data_schema/components/devices.py +++ b/src/aind_data_schema/components/devices.py @@ -823,7 +823,7 @@ class RewardSpout(Device): spout_diameter_unit: SizeUnit = Field(default=SizeUnit.MM, title="Spout diameter unit") spout_position: Optional[RelativePosition] = Field(default=None, title="Spout stage position") solenoid_valve: Device = Field(..., title="Solenoid valve") - lick_sensor: Optional[Device] = Field(default=None, title="Lick sensor") + lick_sensor: Device = Field(..., title="Lick sensor") lick_sensor_type: Optional[LickSensorType] = Field(default=None, title="Lick sensor type") notes: Optional[str] = Field(default=None, title="Notes") diff --git a/src/aind_data_schema/core/rig.py b/src/aind_data_schema/core/rig.py index 6238a0e4..72b01046 100644 --- a/src/aind_data_schema/core/rig.py +++ b/src/aind_data_schema/core/rig.py @@ -142,7 +142,7 @@ def validate_device_names(cls, value: List[DAQDevice], info: ValidationInfo) -> reward_delivery_device_names = [] for rd in reward_deliveries: for rs in rd.reward_spouts: - reward_delivery_device_names += [rs.name, rs.solenoid_valve.name] + reward_delivery_device_names += [rs.name, rs.solenoid_valve.name, rs.lick_sensor.name] all_device_names = ( standard_device_names diff --git a/tests/test_device.py b/tests/test_device.py index e4dc4e0c..684cf7f6 100644 --- a/tests/test_device.py +++ b/tests/test_device.py @@ -38,6 +38,10 @@ def test_other_validators(self): device_type="solenoid", name="test_solenoid", ), + lick_sensor=Device( + device_type="Lick sensor", + name="Sensor_test", + ), side=SpoutSide.OTHER, ) diff --git a/tests/test_rig_session_compatibility.py b/tests/test_rig_session_compatibility.py index be4734fd..8be612c7 100644 --- a/tests/test_rig_session_compatibility.py +++ b/tests/test_rig_session_compatibility.py @@ -710,9 +710,11 @@ def read_json(filepath: Path) -> dict: channels=[ d.DAQChannel(channel_name="DO0", device_name="Solenoid Left", channel_type="Digital Output"), d.DAQChannel(channel_name="DO1", device_name="Solenoid Right", channel_type="Digital Output"), - d.DAQChannel(channel_name="DI0", device_name="Lick-o-meter Left", channel_type="Digital Input"), d.DAQChannel( - channel_name="DI1", device_name="Lick-o-meter Right", channel_type="Digital Input" + channel_name="DI0", device_name="Janelia_Lick_Detector Left", channel_type="Digital Input" + ), + d.DAQChannel( + channel_name="DI1", device_name="Janelia_Lick_Detector Right", channel_type="Digital Input" ), d.DAQChannel(channel_name="DI3", device_name="Photometry Clock", channel_type="Digital Input"), ], @@ -723,19 +725,31 @@ def read_json(filepath: Path) -> dict: d.RewardDelivery( reward_spouts=[ d.RewardSpout( - name="Lick-o-meter Left", + name="Left spout", side=d.SpoutSide.LEFT, spout_diameter=1.2, solenoid_valve=d.Device(device_type="Solenoid", name="Solenoid Left"), + lick_sensor=d.Device( + name="Janelia_Lick_Detector Left", + device_type="Lick detector", + manufacturer=d.Organization.JANELIA, + ), + lick_sensor_type=d.LickSensorType("Capacitive"), ), d.RewardSpout( - name="Lick-o-meter Right", + name="Right spout", side=d.SpoutSide.RIGHT, spout_diameter=1.2, solenoid_valve=d.Device(device_type="Solenoid", name="Solenoid Right"), + lick_sensor=d.Device( + name="Janelia_Lick_Detector Right", + device_type="Lick detector", + manufacturer=d.Organization.JANELIA, + ), + lick_sensor_type=d.LickSensorType("Capacitive"), ), - ] - ) + ], + ), ], additional_devices=[d.Device(device_type="Photometry Clock", name="Photometry Clock")], calibrations=[ From 35dcab18a4e243374bdac885996e92b2e194d791 Mon Sep 17 00:00:00 2001 From: Dan Birman Date: Thu, 5 Sep 2024 19:13:29 -0700 Subject: [PATCH 07/23] fix: limit pydantic version to <2.9 (#1051) --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 3338211f..98a81046 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -16,7 +16,7 @@ dynamic = ["version"] dependencies = [ 'aind-data-schema-models>=0.3.2', 'dictdiffer', - 'pydantic>=2.7', + 'pydantic>=2.7,<2.9', 'inflection', 'jsonschema', 'semver' From b13971fe948ad7534bc26aff6aa69957d02d1f5b Mon Sep 17 00:00:00 2001 From: Dan Birman Date: Fri, 6 Sep 2024 13:02:13 -0700 Subject: [PATCH 08/23] feat: add pending option to QC status (#1048) --- src/aind_data_schema/core/quality_control.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/aind_data_schema/core/quality_control.py b/src/aind_data_schema/core/quality_control.py index 49e0f644..8f2cbc77 100644 --- a/src/aind_data_schema/core/quality_control.py +++ b/src/aind_data_schema/core/quality_control.py @@ -17,6 +17,7 @@ class Status(str, Enum): FAIL = "Fail" PASS = "Pass" + PENDING = "Pending" class Stage(str, Enum): From 904a6b9ae5a554c0cc98054e3b71edc1a7e9104d Mon Sep 17 00:00:00 2001 From: Saskia de Vries Date: Mon, 9 Sep 2024 09:46:28 -0700 Subject: [PATCH 09/23] session defaults (#1034) --- src/aind_data_schema/core/session.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/aind_data_schema/core/session.py b/src/aind_data_schema/core/session.py index a23de611..71114004 100644 --- a/src/aind_data_schema/core/session.py +++ b/src/aind_data_schema/core/session.py @@ -178,7 +178,7 @@ class SlapFieldOfView(FieldOfView): session_type: SlapSessionType = Field(..., title="Session type") dmd_dilation_x: int = Field(..., title="DMD Dilation X (pixels)") dmd_dilation_y: int = Field(..., title="DMD Dilation Y (pixels)") - dilation_unit: SizeUnit = Field(SizeUnit.PX, title="Dilation unit") + dilation_unit: SizeUnit = Field(default=SizeUnit.PX, title="Dilation unit") target_neuron: Optional[str] = Field(default=None, title="Target neuron") target_branch: Optional[str] = Field(default=None, title="Target branch") path_to_array_of_frame_rates: str = Field(..., title="Array of frame rates") @@ -222,7 +222,7 @@ class ManipulatorModule(DomeModule): Field(default=None, title="Anatomical coordinate reference") ) surface_z: Optional[Decimal] = Field(default=None, title="Surface z") - surface_z_unit: SizeUnit = Field(SizeUnit.UM, title="Surface z unit") + surface_z_unit: SizeUnit = Field(default=SizeUnit.UM, title="Surface z unit") dye: Optional[str] = Field(default=None, title="Dye") implant_hole_number: Optional[int] = Field(default=None, title="Implant hole number") @@ -520,9 +520,9 @@ class StimulusEpoch(AindModel): light_source_config: Optional[List[LIGHT_SOURCE_CONFIGS]] = Field( default=[], title="Light source config", description="Light sources for stimulation" ) - output_parameters: AindGenericType = Field(AindGeneric(), title="Performance metrics") + output_parameters: AindGenericType = Field(default=AindGeneric(), title="Performance metrics") reward_consumed_during_epoch: Optional[Decimal] = Field(default=None, title="Reward consumed during training (uL)") - reward_consumed_unit: VolumeUnit = Field(VolumeUnit.UL, title="Reward consumed unit") + reward_consumed_unit: VolumeUnit = Field(default=VolumeUnit.UL, title="Reward consumed unit") trials_total: Optional[int] = Field(default=None, title="Total trials") trials_finished: Optional[int] = Field(default=None, title="Finished trials") trials_rewarded: Optional[int] = Field(default=None, title="Rewarded trials") @@ -535,7 +535,7 @@ class Session(AindCoreModel): _DESCRIBED_BY_URL = AindCoreModel._DESCRIBED_BY_BASE_URL.default + "aind_data_schema/core/session.py" describedBy: str = Field(_DESCRIBED_BY_URL, json_schema_extra={"const": _DESCRIBED_BY_URL}) schema_version: Literal["1.0.0"] = Field("1.0.0") - protocol_id: List[str] = Field([], title="Protocol ID", description="DOI for protocols.io") + protocol_id: List[str] = Field(default=[], title="Protocol ID", description="DOI for protocols.io") experimenter_full_name: List[str] = Field( ..., description="First and last name of the experimenter(s).", @@ -583,9 +583,9 @@ class Session(AindCoreModel): ..., title="Active mouse platform", description="Is the mouse platform being actively controlled" ) headframe_registration: Optional[Affine3dTransform] = Field( - None, title="Headframe registration", description="MRI transform matrix for headframe" + default=None, title="Headframe registration", description="MRI transform matrix for headframe" ) reward_delivery: Optional[RewardDeliveryConfig] = Field(default=None, title="Reward delivery") reward_consumed_total: Optional[Decimal] = Field(default=None, title="Total reward consumed (mL)") - reward_consumed_unit: VolumeUnit = Field(VolumeUnit.ML, title="Reward consumed unit") + reward_consumed_unit: VolumeUnit = Field(default=VolumeUnit.ML, title="Reward consumed unit") notes: Optional[str] = Field(default=None, title="Notes") From 0104e43068841263aed63aacb46042b416e4b2c8 Mon Sep 17 00:00:00 2001 From: Helen Lin <46795546+helen-m-lin@users.noreply.github.com> Date: Mon, 9 Sep 2024 09:47:08 -0700 Subject: [PATCH 10/23] fix: default type for external_links (#1054) --- src/aind_data_schema/core/metadata.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/aind_data_schema/core/metadata.py b/src/aind_data_schema/core/metadata.py index c9f038b8..747b442f 100644 --- a/src/aind_data_schema/core/metadata.py +++ b/src/aind_data_schema/core/metadata.py @@ -22,7 +22,7 @@ from aind_data_schema.utils.compatibility_check import RigSessionCompatibility -class MetadataStatus(Enum): +class MetadataStatus(str, Enum): """Status of Metadata""" VALID = "Valid" @@ -31,7 +31,7 @@ class MetadataStatus(Enum): UNKNOWN = "Unknown" -class ExternalPlatforms(Enum): +class ExternalPlatforms(str, Enum): """External Platforms of Data Assets.""" CODEOCEAN = "Code Ocean" @@ -81,7 +81,7 @@ class Metadata(AindCoreModel): default=MetadataStatus.UNKNOWN, title=" Metadata Status", description="The status of the metadata." ) external_links: Dict[ExternalPlatforms, List[str]] = Field( - default=[], title="External Links", description="Links to the data asset on different platforms." + default=dict(), title="External Links", description="Links to the data asset on different platforms." ) # We can make the AindCoreModel fields optional for now and do more # granular validations using validators. We may have some older data From 4e6ee98790a96200a006e05141c894124e3dbece Mon Sep 17 00:00:00 2001 From: brunocruz <7049351+bruno-f-cruz@users.noreply.github.com> Date: Tue, 10 Sep 2024 21:19:16 -0700 Subject: [PATCH 11/23] Fix type signatures to be compatible with pydantic 2.9 (#1053) * Remove redundant discriminator * Fix type signature and length constrain * Linting * chore: un-capping pydantic version * Revert "chore: un-capping pydantic version" This reverts commit 2f81eda810c84373b8ef9ad3d5ea425b6ab11415. --------- Co-authored-by: Dan Birman --- src/aind_data_schema/core/procedures.py | 7 +++---- src/aind_data_schema/core/rig.py | 2 +- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/aind_data_schema/core/procedures.py b/src/aind_data_schema/core/procedures.py index df9716f8..486358ac 100644 --- a/src/aind_data_schema/core/procedures.py +++ b/src/aind_data_schema/core/procedures.py @@ -390,10 +390,9 @@ class NonViralMaterial(Reagent): class Injection(AindModel): """Description of an injection procedure""" - injection_materials: Annotated[ - List[Union[ViralMaterial, NonViralMaterial]], - Field(title="Injection material", min_length=1, discriminator="material_type"), - ] + injection_materials: List[ + Annotated[Union[ViralMaterial, NonViralMaterial], Field(..., discriminator="material_type")] + ] = Field(..., title="Injection material", min_length=1) recovery_time: Optional[Decimal] = Field(default=None, title="Recovery time") recovery_time_unit: TimeUnit = Field(default=TimeUnit.M, title="Recovery time unit") injection_duration: Optional[Decimal] = Field(default=None, title="Injection duration") diff --git a/src/aind_data_schema/core/rig.py b/src/aind_data_schema/core/rig.py index 72b01046..5c074bbf 100644 --- a/src/aind_data_schema/core/rig.py +++ b/src/aind_data_schema/core/rig.py @@ -77,7 +77,7 @@ class Rig(AindCoreModel): polygonal_scanners: List[PolygonalScanner] = Field(default=[], title="Polygonal scanners") pockels_cells: List[PockelsCell] = Field(default=[], title="Pockels cells") additional_devices: List[Device] = Field(default=[], title="Additional devices") - daqs: List[RIG_DAQ_DEVICES] = Field(default=[], title="Data acquisition devices", discriminator="device_type") + daqs: List[RIG_DAQ_DEVICES] = Field(default=[], title="Data acquisition devices") calibrations: List[Calibration] = Field(..., title="Full calibration of devices") ccf_coordinate_transform: Optional[str] = Field( default=None, From f10b06bc4ddab339d581f3487f75525006685ad0 Mon Sep 17 00:00:00 2001 From: Dan Birman Date: Wed, 11 Sep 2024 20:36:43 -0700 Subject: [PATCH 12/23] Update quality_control.py (#1059) * Update quality_control.py * tests: fixing tests * tests: one more missing test --- examples/quality_control.json | 2 +- examples/quality_control.py | 2 +- quality_control.json | 2 +- src/aind_data_schema/core/quality_control.py | 2 +- tests/test_quality_control.py | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/examples/quality_control.json b/examples/quality_control.json index 961b188c..bbd48cf7 100644 --- a/examples/quality_control.json +++ b/examples/quality_control.json @@ -9,7 +9,7 @@ "name": "Extracellular electrophysiology", "abbreviation": "ecephys" }, - "evaluation_stage": "Preprocessing", + "evaluation_stage": "Processing", "evaluation_name": "Drift map", "evaluation_description": "Qualitative check that drift map shows minimal movement", "evaluator": "Fred Flintstone", diff --git a/examples/quality_control.py b/examples/quality_control.py index 41366e08..6469d2b8 100644 --- a/examples/quality_control.py +++ b/examples/quality_control.py @@ -12,7 +12,7 @@ evaluation_name="Drift map", evaluation_description="Qualitative check that drift map shows minimal movement", evaluation_modality=Modality.ECEPHYS, - evaluation_stage=Stage.PREPROCESSING, + evaluation_stage=Stage.PROCESSING, evaluator="Fred Flintstone", evaluation_date=t, qc_metrics=[ diff --git a/quality_control.json b/quality_control.json index 97b4e37e..e8b55acc 100644 --- a/quality_control.json +++ b/quality_control.json @@ -9,7 +9,7 @@ "name": "Extracellular electrophysiology", "abbreviation": "ecephys" }, - "evaluation_stage": "Preprocessing", + "evaluation_stage": "Processing", "evaluation_name": "Drift map", "evaluation_desc": "Qualitative check that drift map shows minimal movement", "evaluator": "Fred Flintstone", diff --git a/src/aind_data_schema/core/quality_control.py b/src/aind_data_schema/core/quality_control.py index 8f2cbc77..a6d2b7e2 100644 --- a/src/aind_data_schema/core/quality_control.py +++ b/src/aind_data_schema/core/quality_control.py @@ -27,7 +27,7 @@ class Stage(str, Enum): """ RAW = "Raw data" - PREPROCESSING = "Preprocessing" + PROCESSING = "Processing" ANALYSIS = "Analysis" diff --git a/tests/test_quality_control.py b/tests/test_quality_control.py index 9ae3136a..6e17ffde 100644 --- a/tests/test_quality_control.py +++ b/tests/test_quality_control.py @@ -23,7 +23,7 @@ def test_constructors(self): evaluator="Bob", evaluation_date=date.fromisoformat("2020-10-10"), evaluation_modality=Modality.ECEPHYS, - evaluation_stage=Stage.PREPROCESSING, + evaluation_stage=Stage.PROCESSING, qc_metrics=[ QCMetric( name="Multiple values example", From ebd9319596402dd8bf2c88e84bed64bd7cee696c Mon Sep 17 00:00:00 2001 From: Dan Birman Date: Thu, 12 Sep 2024 18:20:46 -0700 Subject: [PATCH 13/23] 1043 enforce default formatting (#1060) * feat: adding flake8 extension that checks for default= and ... Still needs work, this catches situations that it shouldn't catch * chore: missing default= * chore: realized there is a special linters section --- .flake8 | 4 ++++ pyproject.toml | 3 ++- src/aind_data_schema/components/devices.py | 2 +- src/aind_data_schema/components/stimulus.py | 2 +- src/aind_data_schema/core/instrument.py | 6 +++--- src/aind_data_schema/core/procedures.py | 2 +- src/aind_data_schema/core/subject.py | 6 +++--- 7 files changed, 15 insertions(+), 10 deletions(-) diff --git a/.flake8 b/.flake8 index ec522361..27c4fbac 100644 --- a/.flake8 +++ b/.flake8 @@ -5,3 +5,7 @@ exclude = build max-complexity = 10 max-line-length = 120 + +[flake8:local-plugins] +extension = + PF = aind_flake8_extensions.plugin:run_ast_checks \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index 98a81046..08708a2a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -33,7 +33,8 @@ linters = [ 'coverage', 'flake8', 'interrogate', - 'isort' + 'isort', + 'aind-flake8-extensions' ] docs = [ diff --git a/src/aind_data_schema/components/devices.py b/src/aind_data_schema/components/devices.py index 4f1c290c..2f6bffac 100644 --- a/src/aind_data_schema/components/devices.py +++ b/src/aind_data_schema/components/devices.py @@ -528,7 +528,7 @@ class Laser(Device): power_unit: PowerUnit = Field(default=PowerUnit.MW, title="Power unit") coupling: Optional[Coupling] = Field(default=None, title="Coupling") coupling_efficiency: Optional[Decimal] = Field( - None, + default=None, title="Coupling efficiency (percent)", ge=0, le=100, diff --git a/src/aind_data_schema/components/stimulus.py b/src/aind_data_schema/components/stimulus.py index 2bd4c57e..c7dcedd4 100644 --- a/src/aind_data_schema/components/stimulus.py +++ b/src/aind_data_schema/components/stimulus.py @@ -40,7 +40,7 @@ class OptoStimulation(AindModel): pulse_train_duration_unit: TimeUnit = Field(default=TimeUnit.S, title="Pulse train duration unit") fixed_pulse_train_interval: bool = Field(..., title="Fixed pulse train interval") pulse_train_interval: Optional[Decimal] = Field( - None, title="Pulse train interval (s)", description="Time between pulse trains" + default=None, title="Pulse train interval (s)", description="Time between pulse trains" ) pulse_train_interval_unit: TimeUnit = Field(default=TimeUnit.S, title="Pulse train interval unit") baseline_duration: Decimal = Field( diff --git a/src/aind_data_schema/core/instrument.py b/src/aind_data_schema/core/instrument.py index b7184289..d622cd2d 100644 --- a/src/aind_data_schema/core/instrument.py +++ b/src/aind_data_schema/core/instrument.py @@ -38,7 +38,7 @@ class Instrument(AindCoreModel): schema_version: Literal["1.0.0"] = Field("1.0.0") instrument_id: Optional[str] = Field( - None, + default=None, description="Unique instrument identifier, name convention: --", title="Instrument ID", ) @@ -58,12 +58,12 @@ class Instrument(AindCoreModel): scanning_stages: List[ScanningStage] = Field(default=[], title="Scanning motorized stages") additional_devices: List[AdditionalImagingDevice] = Field(default=[], title="Additional devices") calibration_date: Optional[date] = Field( - None, + default=None, description="Date of most recent calibration", title="Calibration date", ) calibration_data: Optional[str] = Field( - None, + default=None, description="Path to calibration data from most recent calibration", title="Calibration data", ) diff --git a/src/aind_data_schema/core/procedures.py b/src/aind_data_schema/core/procedures.py index 486358ac..11b5dddc 100644 --- a/src/aind_data_schema/core/procedures.py +++ b/src/aind_data_schema/core/procedures.py @@ -241,7 +241,7 @@ class SpecimenProcedure(AindModel): procedure_type: SpecimenProcedureType = Field(..., title="Procedure type") procedure_name: Optional[str] = Field( - None, title="Procedure name", description="Name to clarify specific procedure used as needed" + default=None, title="Procedure name", description="Name to clarify specific procedure used as needed" ) specimen_id: str = Field(..., title="Specimen ID") start_date: date = Field(..., title="Start date") diff --git a/src/aind_data_schema/core/subject.py b/src/aind_data_schema/core/subject.py index dd2100bd..d54bc3ed 100644 --- a/src/aind_data_schema/core/subject.py +++ b/src/aind_data_schema/core/subject.py @@ -98,7 +98,7 @@ class Subject(AindCoreModel): sex: Sex = Field(..., title="Sex") date_of_birth: date_type = Field(..., title="Date of birth") genotype: Optional[str] = Field( - None, + default=None, description="Genotype of the animal providing both alleles", title="Genotype", ) @@ -112,12 +112,12 @@ class Subject(AindCoreModel): title="Source", ) rrid: Optional[PIDName] = Field( - None, + default=None, description="RRID of mouse if acquired from supplier", title="RRID", ) restrictions: Optional[str] = Field( - None, + default=None, description="Any restrictions on use or publishing based on subject source", title="Restrictions", ) From 6cfd0eac383e0e3e6396e5620c6b49ff7f5eca7a Mon Sep 17 00:00:00 2001 From: Dan Birman Date: Sun, 22 Sep 2024 20:21:20 -0700 Subject: [PATCH 14/23] 1062 quality control needs versioning for evaluations (#1067) * refactor: changing references -> reference * feat: add an overall evaluator name * feat: adding QCStatus and lists of status for versioning * chore: lint * tests: updating tests for QCStatus --- examples/quality_control.json | 55 +++++++++++++------- examples/quality_control.py | 50 ++++++++++++------ src/aind_data_schema/core/quality_control.py | 18 ++++--- tests/test_quality_control.py | 21 +++++--- 4 files changed, 98 insertions(+), 46 deletions(-) diff --git a/examples/quality_control.json b/examples/quality_control.json index bbd48cf7..31717377 100644 --- a/examples/quality_control.json +++ b/examples/quality_control.json @@ -1,8 +1,13 @@ { "describedBy": "https://raw.githubusercontent.com/AllenNeuralDynamics/aind-data-schema/main/src/aind_data_schema/core/quality_control.py", "schema_version": "1.0.0", - "overall_status": "Pass", - "overall_status_date": "2022-11-22", + "overall_status": [ + { + "evaluator": "Automated", + "status": "Pass", + "timestamp": "2022-11-22" + } + ], "evaluations": [ { "evaluation_modality": { @@ -12,29 +17,33 @@ "evaluation_stage": "Processing", "evaluation_name": "Drift map", "evaluation_description": "Qualitative check that drift map shows minimal movement", - "evaluator": "Fred Flintstone", - "evaluation_date": "2022-11-22", "qc_metrics": [ { "name": "Probe A drift", "value": "High", "description": null, - "references": null + "reference": "ecephys-drift-map" }, { "name": "Probe B drift", "value": "Low", "description": null, - "references": null + "reference": "ecephys-drift-map" }, { "name": "Probe C drift", "value": "Low", "description": null, - "references": null + "reference": "ecephys-drift-map" + } + ], + "evaluation_status": [ + { + "evaluator": "Fred Flintstone", + "status": "Fail", + "timestamp": "2022-11-22" } ], - "stage_status": "Fail", "notes": "Manually annotated: failed due to high drift on probe A" }, { @@ -45,23 +54,27 @@ "evaluation_stage": "Raw data", "evaluation_name": "Video frame count check", "evaluation_description": null, - "evaluator": "Fred Flinstone", - "evaluation_date": "2022-11-22", "qc_metrics": [ { "name": "video_1_num_frames", "value": 662, "description": null, - "references": null + "reference": null }, { "name": "video_2_num_frames", "value": 662, "description": null, - "references": null + "reference": null + } + ], + "evaluation_status": [ + { + "evaluator": "Fred Flintstone", + "status": "Fail", + "timestamp": "2022-11-22" } ], - "stage_status": "Pass", "notes": "Pass when video_1_num_frames==video_2_num_frames" }, { @@ -72,29 +85,33 @@ "evaluation_stage": "Raw data", "evaluation_name": "Probes present", "evaluation_description": null, - "evaluator": "Automated", - "evaluation_date": "2022-11-22", "qc_metrics": [ { "name": "ProbeA_success", "value": true, "description": null, - "references": null + "reference": null }, { "name": "ProbeB_success", "value": true, "description": null, - "references": null + "reference": null }, { "name": "ProbeC_success", "value": true, "description": null, - "references": null + "reference": null + } + ], + "evaluation_status": [ + { + "evaluator": "Automated", + "status": "Pass", + "timestamp": "2022-11-22" } ], - "stage_status": "Pass", "notes": null } ], diff --git a/examples/quality_control.py b/examples/quality_control.py index 6469d2b8..e63dea24 100644 --- a/examples/quality_control.py +++ b/examples/quality_control.py @@ -4,7 +4,7 @@ from aind_data_schema_models.modalities import Modality -from aind_data_schema.core.quality_control import QCEvaluation, QualityControl, QCMetric, Stage, Status +from aind_data_schema.core.quality_control import QCEvaluation, QualityControl, QCMetric, Stage, Status, QCStatus t = date(2022, 11, 22) @@ -13,23 +13,30 @@ evaluation_description="Qualitative check that drift map shows minimal movement", evaluation_modality=Modality.ECEPHYS, evaluation_stage=Stage.PROCESSING, - evaluator="Fred Flintstone", - evaluation_date=t, + evaluation_status=[ + QCStatus( + evaluator="Fred Flintstone", + timestamp=t, + status=Status.FAIL + ) + ], qc_metrics=[ QCMetric( name="Probe A drift", - value="High" + value="High", + reference="ecephys-drift-map" ), QCMetric( name="Probe B drift", - value="Low" + value="Low", + reference="ecephys-drift-map" ), QCMetric( name="Probe C drift", - value="Low" + value="Low", + reference="ecephys-drift-map" ) ], - stage_status=Status.FAIL, notes="Manually annotated: failed due to high drift on probe A" ) @@ -37,8 +44,13 @@ evaluation_name="Video frame count check", evaluation_modality=Modality.BEHAVIOR_VIDEOS, evaluation_stage=Stage.RAW, - evaluator="Fred Flinstone", - evaluation_date=t, + evaluation_status=[ + QCStatus( + evaluator="Fred Flintstone", + timestamp=t, + status=Status.FAIL + ) + ], qc_metrics=[ QCMetric( name="video_1_num_frames", @@ -49,7 +61,6 @@ value=662 ) ], - stage_status=Status.PASS, notes="Pass when video_1_num_frames==video_2_num_frames" ) @@ -57,8 +68,13 @@ evaluation_name="Probes present", evaluation_modality=Modality.ECEPHYS, evaluation_stage=Stage.RAW, - evaluator="Automated", - evaluation_date=t, + evaluation_status=[ + QCStatus( + evaluator="Automated", + timestamp=t, + status=Status.PASS + ) + ], qc_metrics=[ QCMetric( name="ProbeA_success", @@ -73,12 +89,16 @@ value=True ) ], - stage_status=Status.PASS, ) q = QualityControl( - overall_status="Pass", - overall_status_date=t, + overall_status=[ + QCStatus( + evaluator="Automated", + timestamp=t, + status=Status.PASS + ) + ], evaluations=[eval0, eval1, eval2] ) diff --git a/src/aind_data_schema/core/quality_control.py b/src/aind_data_schema/core/quality_control.py index a6d2b7e2..38224df7 100644 --- a/src/aind_data_schema/core/quality_control.py +++ b/src/aind_data_schema/core/quality_control.py @@ -31,12 +31,21 @@ class Stage(str, Enum): ANALYSIS = "Analysis" +class QCStatus(BaseModel): + """Description of a QC status, set by an evaluator""" + + evaluator: str = Field(..., title="Status evaluator full name") + status: Status = Field(..., title="Status") + timestamp: date = Field(..., title="Status date") + + class QCMetric(BaseModel): """Description of a single quality control metric""" + name: str = Field(..., title="Metric name") value: Any = Field(..., title="Metric value") description: Optional[str] = Field(default=None, title="Metric description") - references: Optional[List[str]] = Field(default=None, title="Metric reference URLs") + reference: Optional[str] = Field(default=None, title="Metric reference image URL or plot type") class QCEvaluation(AindModel): @@ -46,10 +55,8 @@ class QCEvaluation(AindModel): evaluation_stage: Stage = Field(..., title="Evaluation stage") evaluation_name: str = Field(..., title="Evaluation name") evaluation_description: Optional[str] = Field(default=None, title="Evaluation description") - evaluator: str = Field(..., title="Evaluator full name") - evaluation_date: date = Field(..., title="Evaluation date") qc_metrics: List[QCMetric] = Field(..., title="QC metrics") - stage_status: Status = Field(..., title="Stage status") + evaluation_status: List[QCStatus] = Field(..., title="Evaluation status") notes: Optional[str] = Field(default=None, title="Notes") @@ -59,7 +66,6 @@ class QualityControl(AindCoreModel): _DESCRIBED_BY_URL = AindCoreModel._DESCRIBED_BY_BASE_URL.default + "aind_data_schema/core/quality_control.py" describedBy: str = Field(_DESCRIBED_BY_URL, json_schema_extra={"const": _DESCRIBED_BY_URL}) schema_version: Literal["1.0.0"] = Field("1.0.0") - overall_status: Status = Field(..., title="Overall status") - overall_status_date: date = Field(..., title="Date of status") + overall_status: List[QCStatus] = Field(..., title="Overall status") evaluations: List[QCEvaluation] = Field(..., title="Evaluations") notes: Optional[str] = Field(default=None, title="Notes") diff --git a/tests/test_quality_control.py b/tests/test_quality_control.py index 6e17ffde..508a5c4b 100644 --- a/tests/test_quality_control.py +++ b/tests/test_quality_control.py @@ -6,7 +6,7 @@ from aind_data_schema_models.modalities import Modality from pydantic import ValidationError -from aind_data_schema.core.quality_control import QCEvaluation, QualityControl, QCMetric, Stage, Status +from aind_data_schema.core.quality_control import QCEvaluation, QualityControl, QCMetric, Stage, Status, QCStatus class QualityControlTests(unittest.TestCase): @@ -20,8 +20,13 @@ def test_constructors(self): test_eval = QCEvaluation( evaluation_name="Drift map", - evaluator="Bob", - evaluation_date=date.fromisoformat("2020-10-10"), + 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=[ @@ -36,12 +41,16 @@ def test_constructors(self): references=["s3://some-data-somewhere"] ) ], - stage_status=Status.PASS, ) q = QualityControl( - overall_status_date=date.fromisoformat("2020-10-10"), - overall_status=Status.PASS, + overall_status=[ + QCStatus( + evaluator="Bob", + timestamp=date.fromisoformat("2020-10-10"), + status=Status.PASS + ) + ], evaluations=[ test_eval ], From a9655585ef37cdff2eb11ebc752ed78866b08164 Mon Sep 17 00:00:00 2001 From: Dan Birman Date: Mon, 23 Sep 2024 13:59:39 -0700 Subject: [PATCH 15/23] Blocking pydantic versions 2.9.0/2.9.1 in [dev] (#1068) * chore: un-cap pydantic version * fix: increasing pydantic floor to avoid model_construct() + Union issues * fix: specify versions to ignore * fix: moving version limits to [dev] --- pyproject.toml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 08708a2a..c9795109 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -16,7 +16,7 @@ dynamic = ["version"] dependencies = [ 'aind-data-schema-models>=0.3.2', 'dictdiffer', - 'pydantic>=2.7,<2.9', + 'pydantic>=2.7', 'inflection', 'jsonschema', 'semver' @@ -24,7 +24,8 @@ dependencies = [ [project.optional-dependencies] dev = [ - 'aind_data_schema[linters]' + 'aind_data_schema[linters]', + 'pydantic>=2.7, !=2.9.0, !=2.9.1' ] linters = [ From 7f2a325eea1e177203c2c8e73322b8dac2434fbe Mon Sep 17 00:00:00 2001 From: Dan Birman Date: Thu, 26 Sep 2024 10:41:40 -0700 Subject: [PATCH 16/23] ci: pin aind-flake8-extensions version (#1082) --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index c9795109..f68a7d32 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -35,7 +35,7 @@ linters = [ 'flake8', 'interrogate', 'isort', - 'aind-flake8-extensions' + 'aind-flake8-extensions==0.5.2' ] docs = [ From 0d83d6a4f299b10737cc9820742d64f8786115b7 Mon Sep 17 00:00:00 2001 From: Dan Birman Date: Thu, 3 Oct 2024 14:27:34 -0700 Subject: [PATCH 17/23] 1047 qc docs (#1075) * docs: adding draft QC docs * docs: adding more qc docs * feat: add myst_parser and qc to index * refactor: replace .rst file with .md * docs: adding information about reference URLs * docs: separating portal information into an AIND section * docs: cleaning up documentation for qc * docs: more cleanup on qc docs * docs: small updates to docs based on discussion about credentials * docs: updating qc docs based on discussion * docs: cleaning up docs and clarifying in a few spots --- docs/source/aind_data_schema.core.rst | 8 ++ docs/source/conf.py | 4 + docs/source/index.rst | 2 + docs/source/quality_control.md | 107 ++++++++++++++++++++++++++ pyproject.toml | 3 +- 5 files changed, 123 insertions(+), 1 deletion(-) create mode 100644 docs/source/quality_control.md diff --git a/docs/source/aind_data_schema.core.rst b/docs/source/aind_data_schema.core.rst index 5136feb7..502c1d28 100644 --- a/docs/source/aind_data_schema.core.rst +++ b/docs/source/aind_data_schema.core.rst @@ -84,6 +84,14 @@ aind\_data\_schema.core.subject module :undoc-members: :show-inheritance: +aind\_data\_schema.core.quality_control module +-------------------------------------- + +.. automodule:: aind_data_schema.core.quality_control + :members: + :undoc-members: + :show-inheritance: + Module contents --------------- diff --git a/docs/source/conf.py b/docs/source/conf.py index 4da5b361..31d9a3be 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -21,6 +21,7 @@ rig, session, subject, + quality_control ) dummy_object = [ @@ -33,6 +34,7 @@ rig, session, subject, + quality_control ] # A temporary workaround to bypass "Imported but unused" error INSTITUTE_NAME = "Allen Institute for Neural Dynamics" @@ -55,6 +57,7 @@ "sphinxcontrib.autodoc_pydantic", "sphinx.ext.napoleon", "sphinx_jinja", + "myst_parser", ] templates_path = ["_templates"] exclude_patterns = [] @@ -88,6 +91,7 @@ "rig", "session", "subject", + "quality_control", ] rst_epilog = "" for diagram in diagrams_list: diff --git a/docs/source/index.rst b/docs/source/index.rst index ad3c812a..85d2c0cf 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -27,6 +27,7 @@ A given data asset will have the following JSON files: - :doc:`rig ` or :doc:`instrument `: Metadata describing the equipment used to acquire data, including part names, serial numbers, and configuration details. - :doc:`session ` or :doc:`acquisition `: Metadata describing how the data was acquired - :doc:`processing `: Metadata describing how data has been processed and analyzed into derived data assets, including information on the software and parameters used for processing and analysis. +- :doc:`quality_control `: Metadata describing how the data has been evaluated for quality control. Example ======= @@ -175,6 +176,7 @@ build NWB extension that easily embeds metadata not covered by the core NWB sche session acquisition processing + quality_control .. toctree:: diff --git a/docs/source/quality_control.md b/docs/source/quality_control.md new file mode 100644 index 00000000..acf3da9e --- /dev/null +++ b/docs/source/quality_control.md @@ -0,0 +1,107 @@ +# Quality control + +## Overview + +Quality control is a collection of **evaluations** based on sets of **metrics** about the data. + +`QCEvaluation`s should be generated during pipelines: before raw data upload, during processing, and during analysis by researchers. + +Each `QualityControl`, `QCEvaluation`, and `QCMetric` includes a `aind_data_schema.quality_control.State` which is a timestamped object indicating that the Overall QC/Evaluation/Metric passes, fails, or is in a pending state waiting for manual annotation. + +The state of an evaluation is set automatically to the lowest of its metric's states. A single failed metric sets an entire evaluation to fail. While a single pending metric (with all other metrics passing) sets an entire evaluation to pending. An optional setting `QCEvaluation.allow_failed_metrics` allows you to ignore failures, which can be useful in situations where an evaluation is not critical for quality control. + +## Details + +**Q: What is an evaluation?** + +Each `QCEvaluation` should be thought of as a single aspect of the data asset, from one `Modality`, that is evaluated for quality at a specific `Stage` in data acquisition or analysis. For example, the brain moves a small amount during electrophysiology. This evaluation would be marked with `Stage:RAW` and `Modality:ECEPHYS`. Evaluations will often consist of multiple metrics, some of which can be measured and evaluated automatically, as well as qualititative metrics that need to be evaluated by a human observer. + +The state of an evaluation depends on the state of its metrics according to these rules: + +- If any metric fails the evaluation fails (except when `allow_failed_metrics=True`, see below) +- If any metric is pending and the rest pass the evaluation is pending +- If all metrics pass the evaluation passes + +There are many situations where quality control is evaluated on an aspect of the data that isn't critical to the overall experimental goals. For example, you may have a `QCEvaluation` that checks whether the temperature and humidity sensors on the rig were functional, but the overall analysis can proceed with or without the these data. In these situations set `QCEvaluation.allow_failed_metrics=True` to allow the evaluation to pass even if these sensors actually failed. This ensures that the overall `QualityControl` for the data asset can also pass, without regard to these optional elements of the data. + +**Q: What is a metric?** + +Each `QCMetric` is a single value or set of values that can be computed, or observed, about a set of data as part of an evaluation. These can have any type. See the AIND section for special rules for annotating metrics with options. + +`QCMetric`s have a `Status`. The `Status` should depend directly on the `QCMetric.value`, either by a simple function: "value>5", or by a qualitative rule: "Field of view includes visual areas". The `QCMetric.description` field should be used to describe the rule used to set the status. Metrics can be evaluated multiple times, in which case the new status should be appended the `QCMetric.status_history`. + +Metrics should include a `QCMetric.reference`. References are intended to be publicly accessible images, figures, combined figures with multiple panels, or videos that support the metric or provide information necessary for manual annotation of a metric's status. + +**Q: What are the status options for metrics?** + +In our quality control a metric's status is always `PASS`, `PENDING` (waiting for manual annotation), or `FAIL`. `PENDING` should be used when a user must manually annotated the metric's state. + +We enforce this minimal set of states to prevent ambiguity and make it easier to build tools that can interpret the status of a data asset. + +## Details for AIND users + +### Uploading QC + +#### Preferred workflow + +**Metadata** + +If you are building `QCEvaluation` and `QCMetric` objects prior to raw data upload or in a capsule alongside your processing or analysis, your workflow is: + +``` +from aind_data_schema.core.quality_control import QualityControl + +# Build your QCEvaluations and metrics +evaluations = [QCEvaluation(), ...] + +# Build your QualityControl object +qc = QualityControl(evaluations=evaluations) + +qc.write_standard_file() +``` + +The indexer will pick up this file alongside the other metadata files and handle it appropriately. + +**References** + +Each `QCMetric` you build should have an attached reference. Our preference is that you post these images to [FigURL](https://github.com/flatironinstitute/figurl/blob/main/doc/intro.md) and put the generated URL into the reference. + +We recommend that you write PNG files for images and static multi-panel figures, MP4 files for videos, and Altair charts for interactive figures. + +#### Alternate workflows + +**Metadata** + +We'll post documentation on how to append `QCEvaluations` to pre-existing quality_control.json files, via DocDB using the `aind-data-access-api`, in the future. + +**References** + +You can also place the references in the data asset itself, to do this include the relative path "qc_images/your_image.png" to that asset inside of the results folder. + +### QC Portal + +The QC Portal is a browser application that allows users to view and interact with the AIND QC metadata and to annotate ``PENDING`` metrics with qualitative evaluations. The portal is maintained by scientific computing, reach out to us with any questions or concerns. + +The portal works by pulling the metadata object from the Document Database (DocDB). When you make changes to metrics or add notes the **submit** button will be enabled, submitting pushes your updates to the DocDB along with a timestamp and your name. + +**Q: When does the state get set for the QCEvaluation and QualityControl objects?** + +The QC portal automatically calls ``QualityControl.evaluate_status()`` whenever you submit changes to the metrics. This first evaluates the individual `QCEvaluation` objects, and then evaluates the overall status. + +**Q: How do reference URLs get pulled into the QC Portal?** + +Each metric is associated with a reference figure, image, or video. The QC portal can interpret four ways of setting the reference field: + +- Provide a relative path to a file in this data asset's S3 bucket +- Provide a url to a FigURL figure +- Provide the name of one of the interactive plots, e.g. "ecephys-drift-map" + + + +**Q: I saw fancy things like dropdowns in the QC Portal, how do I do that?** + +By default the QC portal displays dictionaries as tables where the values can be edited. We also support a few special cases to allow a bit more flexibility or to constrain the actions that manual annotators can take. Install the `aind-qcportal-schema` package and set the `value` field to the corresponding pydantic object to use these. + +### Multi-session QC + +[Details coming soon, this is under discussion] \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index f68a7d32..bfb7fa1d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -43,7 +43,8 @@ docs = [ 'sphinx-jinja', 'furo', 'erdantic>=0.7.0,<1.0', - 'autodoc_pydantic' + 'autodoc_pydantic', + 'myst-parser' ] viz = [ From cb97a80e25bbaf8b51879c17f076e267ada917ba Mon Sep 17 00:00:00 2001 From: Dan Birman Date: Thu, 3 Oct 2024 14:33:58 -0700 Subject: [PATCH 18/23] 536 add compute resource usage to processingjson (#1063) * feat: adding optional ResourceUsage to DataProcess * tests: adding example * refactor: adding ResourceTimestamped * chore: remove timeunit * tests: adding tests * fix: missing Field() * chore: lint * chore: lint * tests: examples * chore: lint * refactor: date->datetime and usage_unit * chore: update processing example * chore: lint * fix: datetime -> AwareDatetime * refactor: rename memory to system_memory * chore: lint * tests: force timezones to utc for CI * fix: timezone issue for tests * refactor: remove MemoryValue and add validators for Optional unit fields * refactor: remove file_io * chore: lint * chore: lint * refactor: remove file_io * refactor: clean up validators into a single root validator * chore: lint * tests: fix examples, also allow float memory sizes * tests: update example file * chore: lint --- examples/processing.json | 52 +++++++++++++++- examples/processing.py | 47 +++++++++++++- examples/quality_control.py | 81 ++++--------------------- src/aind_data_schema/core/processing.py | 39 +++++++++++- tests/test_processing.py | 64 ++++++++++++++++++- tests/test_quality_control.py | 51 ++++++---------- 6 files changed, 227 insertions(+), 107 deletions(-) diff --git a/examples/processing.json b/examples/processing.json index 9087286f..01efb037 100644 --- a/examples/processing.json +++ b/examples/processing.json @@ -16,7 +16,49 @@ "size": 7 }, "outputs": {}, - "notes": null + "notes": null, + "resources": { + "os": "Ubuntu 20.04", + "architecture": "x86-64", + "cpu": "Intel Core i7", + "cpu_cores": 8, + "gpu": "NVIDIA GeForce RTX 3080", + "system_memory": 32.0, + "system_memory_unit": "Gigabyte", + "ram": 16.0, + "ram_unit": "Gigabyte", + "cpu_usage": [ + { + "timestamp": "2024-09-13T00:00:00Z", + "usage": 75.5 + }, + { + "timestamp": "2024-09-13T00:00:00Z", + "usage": 80.0 + } + ], + "gpu_usage": [ + { + "timestamp": "2024-09-13T00:00:00Z", + "usage": 60.0 + }, + { + "timestamp": "2024-09-13T00:00:00Z", + "usage": 65.5 + } + ], + "ram_usage": [ + { + "timestamp": "2024-09-13T00:00:00Z", + "usage": 70.0 + }, + { + "timestamp": "2024-09-13T00:00:00Z", + "usage": 72.5 + } + ], + "usage_unit": "percent" + } }, { "name": "File format conversion", @@ -32,7 +74,8 @@ "z": true }, "outputs": {}, - "notes": null + "notes": null, + "resources": null }, { "name": "Image destriping", @@ -48,7 +91,8 @@ "b": -2 }, "outputs": {}, - "notes": null + "notes": null, + "resources": null } ], "processor_full_name": "Some Processor", @@ -71,6 +115,7 @@ }, "outputs": {}, "notes": null, + "resources": null, "analyst_full_name": "Some Analyzer", "description": "some description" }, @@ -89,6 +134,7 @@ }, "outputs": {}, "notes": null, + "resources": null, "analyst_full_name": "Some Analyzer", "description": "some description" } diff --git a/examples/processing.py b/examples/processing.py index 59efa4d6..8d7521d9 100644 --- a/examples/processing.py +++ b/examples/processing.py @@ -2,12 +2,43 @@ from datetime import datetime, timezone -from aind_data_schema.core.processing import AnalysisProcess, DataProcess, PipelineProcess, Processing, ProcessName +from aind_data_schema.core.processing import ( + AnalysisProcess, + DataProcess, + PipelineProcess, + Processing, + ProcessName, + ResourceTimestamped, + ResourceUsage, +) +from aind_data_schema_models.units import MemoryUnit +from aind_data_schema_models.system_architecture import OperatingSystem, CPUArchitecture # If a timezone isn't specified, the timezone of the computer running this # script will be used as default t = datetime(2022, 11, 22, 8, 43, 00, tzinfo=timezone.utc) + +cpu_usage_list = [ + ResourceTimestamped(timestamp=datetime(2024, 9, 13, tzinfo=timezone.utc), usage=75.5), + ResourceTimestamped(timestamp=datetime(2024, 9, 13, tzinfo=timezone.utc), usage=80.0), +] + +gpu_usage_list = [ + ResourceTimestamped(timestamp=datetime(2024, 9, 13, tzinfo=timezone.utc), usage=60.0), + ResourceTimestamped(timestamp=datetime(2024, 9, 13, tzinfo=timezone.utc), usage=65.5), +] + +ram_usage_list = [ + ResourceTimestamped(timestamp=datetime(2024, 9, 13, tzinfo=timezone.utc), usage=70.0), + ResourceTimestamped(timestamp=datetime(2024, 9, 13, tzinfo=timezone.utc), usage=72.5), +] + +file_io_usage_list = [ + ResourceTimestamped(timestamp=datetime(2024, 9, 13, tzinfo=timezone.utc), usage=5.5), + ResourceTimestamped(timestamp=datetime(2024, 9, 13, tzinfo=timezone.utc), usage=6.0), +] + p = Processing( processing_pipeline=PipelineProcess( processor_full_name="Some Processor", @@ -24,6 +55,20 @@ code_version="0.1", code_url="https://github.com/abcd", parameters={"size": 7}, + resources=ResourceUsage( + os=OperatingSystem.UBUNTU_20_04, + architecture=CPUArchitecture.X86_64, + cpu="Intel Core i7", + cpu_cores=8, + gpu="NVIDIA GeForce RTX 3080", + system_memory=32.0, + system_memory_unit=MemoryUnit.GB, + ram=16.0, + ram_unit=MemoryUnit.GB, + cpu_usage=cpu_usage_list, + gpu_usage=gpu_usage_list, + ram_usage=ram_usage_list, + ), ), DataProcess( name=ProcessName.FILE_FORMAT_CONVERSION, diff --git a/examples/quality_control.py b/examples/quality_control.py index e63dea24..4ba3b754 100644 --- a/examples/quality_control.py +++ b/examples/quality_control.py @@ -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() diff --git a/src/aind_data_schema/core/processing.py b/src/aind_data_schema/core/processing.py index 3474aace..e516fa7c 100644 --- a/src/aind_data_schema/core/processing.py +++ b/src/aind_data_schema/core/processing.py @@ -4,10 +4,11 @@ from typing import List, Literal, Optional from aind_data_schema_models.process_names import ProcessName -from pydantic import Field, ValidationInfo, field_validator +from pydantic import Field, ValidationInfo, model_validator, field_validator from aind_data_schema.base import AindCoreModel, AindGeneric, AindGenericType, AindModel, AwareDatetimeWithDefault from aind_data_schema.components.tile import Tile +from aind_data_schema_models.units import MemoryUnit, UnitlessUnit class RegistrationType(str, Enum): @@ -17,6 +18,41 @@ class RegistrationType(str, Enum): INTRA = "Intra-channel" +class ResourceTimestamped(AindModel): + """Description of resource usage at a moment in time""" + + timestamp: AwareDatetimeWithDefault = Field(..., title="Timestamp") + usage: float = Field(..., title="Usage") + + +class ResourceUsage(AindModel): + """Description of resources used by a process""" + + os: str = Field(..., title="Operating system") + architecture: str = Field(..., title="Architecture") + cpu: Optional[str] = Field(default=None, title="CPU name") + cpu_cores: Optional[int] = Field(default=None, title="CPU cores") + gpu: Optional[str] = Field(default=None, title="GPU name") + system_memory: Optional[float] = Field(default=None, title="System memory") + system_memory_unit: Optional[MemoryUnit] = Field(default=None, title="System memory unit") + ram: Optional[float] = Field(default=None, title="System RAM") + ram_unit: Optional[MemoryUnit] = Field(default=None, title="Ram unit") + + cpu_usage: Optional[List[ResourceTimestamped]] = Field(default=None, title="CPU usage") + gpu_usage: Optional[List[ResourceTimestamped]] = Field(default=None, title="GPU usage") + ram_usage: Optional[List[ResourceTimestamped]] = Field(default=None, title="RAM usage") + usage_unit: str = Field(default=UnitlessUnit.PERCENT, title="Usage unit") + + @model_validator(mode="after") + def check_value_and_unit(cls, values): + """Ensure that all valued fields have units""" + if values.system_memory and not values.system_memory_unit: + raise ValueError("System memory unit is required if system memory is provided.") + if values.ram and not values.ram_unit: + raise ValueError("RAM unit is required if RAM is provided.") + return values + + class DataProcess(AindModel): """Description of a single processing step""" @@ -31,6 +67,7 @@ class DataProcess(AindModel): parameters: AindGenericType = Field(..., title="Parameters") outputs: AindGenericType = Field(AindGeneric(), description="Output parameters", title="Outputs") notes: Optional[str] = Field(default=None, title="Notes", validate_default=True) + resources: Optional[ResourceUsage] = Field(default=None, title="Process resource usage") @field_validator("notes", mode="after") def validate_other(cls, value: Optional[str], info: ValidationInfo) -> Optional[str]: diff --git a/tests/test_processing.py b/tests/test_processing.py index 1b04056e..81d7d9d8 100644 --- a/tests/test_processing.py +++ b/tests/test_processing.py @@ -5,7 +5,17 @@ import pydantic -from aind_data_schema.core.processing import DataProcess, PipelineProcess, Processing +from datetime import datetime + +from aind_data_schema.core.processing import ( + DataProcess, + PipelineProcess, + Processing, + ResourceUsage, + ResourceTimestamped, +) +from aind_data_schema_models.system_architecture import OperatingSystem, CPUArchitecture +from aind_data_schema_models.units import MemoryUnit PYD_VERSION = re.match(r"(\d+.\d+).\d+", pydantic.__version__).group(1) @@ -58,6 +68,58 @@ def test_constructors(self): self.assertIsNotNone(p) self.assertEqual(expected_exception, repr(e.exception)) + def test_resource_usage(self): + """Test the ResourceUsage class""" + + resources = ResourceUsage( + os=OperatingSystem.MACOS_SONOMA, + architecture=CPUArchitecture.X86_64, + cpu_usage=[ResourceTimestamped(timestamp=datetime.fromisoformat("2024-09-13"), usage=0.5)], + ) + + self.assertIsNotNone(resources) + + with self.assertRaises(pydantic.ValidationError): + ResourceUsage() + + def test_resource_usage_unit_validators(self): + """Test that unit validators work""" + + # Check ram + with self.assertRaises(ValueError) as e: + ResourceUsage( + os=OperatingSystem.MACOS_SONOMA, + architecture=CPUArchitecture.X86_64, + cpu_usage=[ResourceTimestamped(timestamp=datetime.fromisoformat("2024-09-13"), usage=0.5)], + ram=1, + ) + + expected_exception = "RAM unit is required if RAM is provided" + + self.assertTrue(expected_exception in repr(e.exception)) + + resources = ResourceUsage( + os=OperatingSystem.MACOS_SONOMA, + architecture=CPUArchitecture.X86_64, + cpu_usage=[ResourceTimestamped(timestamp=datetime.fromisoformat("2024-09-13"), usage=0.5)], + ram=1, + ram_unit=MemoryUnit.GB, + ) + self.assertIsNotNone(resources) + + # Check system memory + with self.assertRaises(ValueError) as e: + ResourceUsage( + os=OperatingSystem.MACOS_SONOMA, + architecture=CPUArchitecture.X86_64, + cpu_usage=[ResourceTimestamped(timestamp=datetime.fromisoformat("2024-09-13"), usage=0.5)], + system_memory=1, + ) + + expected_exception = "System memory unit is required if system memory is provided" + + self.assertTrue(expected_exception in repr(e.exception)) + if __name__ == "__main__": unittest.main() diff --git a/tests/test_quality_control.py b/tests/test_quality_control.py index 508a5c4b..acccab46 100644 --- a/tests/test_quality_control.py +++ b/tests/test_quality_control.py @@ -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 From e880ccd76e1384711cb4ce0cbdaf75202ae9636f Mon Sep 17 00:00:00 2001 From: Dan Birman Date: Thu, 3 Oct 2024 16:11:41 -0700 Subject: [PATCH 19/23] 1072 qc automate state properties in qualitycontrol and evaluation based on metric states (#1074) * refactor: changing references -> reference * feat: add an overall evaluator name * feat: adding QCStatus and lists of status for versioning * chore: lint * tests: updating tests for QCStatus * feat: add QCStatus list to metrics * feat: adding a function to automate setting the evaluation_status field Coverage not at 100% yet Also replaced date with datetime in QCStatus * test: test coverage for overall_status * test: add coverage for properties * refactor: date -> datetime * chore: lint * doc: missing docstrings * tests: remove unnecessary test * feat: auto-set status when never previously evaluated, and tests * fix: fixing an issue with private attributes You can't do what I wanted (hide the _evaluation_status list) because pydantic doesn't serialize the field. So we have to keep the history exposed but we'll have to encourage people not to access it directly * chore: example and lint * fix: removing default_factory, trying to allow timestamp pass through * test: fixing examples test timestamp issue * chore: lint * refactor: datetime -> AwareDatetime and remove default * tests: add a test that confirms that order is preserved * fix: missing timezones for example * feat: add option to allow failures in metrics * feat: add a convenience function to get metrics that are failing * tests: update qc.json example * feat: ensure metric_status_history not empty with validator * chore: docstring * test: improving examples * chore: lint * feat: add asset_id field to qc * tests: fix examples * tests: fix examples * docs: extended desc for allowing failed metrics * feat: removing prefixes to clean up fields * feat: remove property prefixes * chore: lint * chore/tests: lint and fix examples * tests: fix refactor issues in tests * docs: fix typo * chore: unused import snuck in? * fix: allow none to return from failed_metrics * ci: fix for python 3.8 failures * fix: remove the confusing "Automated" evaluator * tests: fix qc example * refactor: removing redundant status_history from QualityControl and QCEvaluation * fix: forgot to remove redundant fields * tests: fix examples --- examples/quality_control.json | 169 ++++++++---- examples/quality_control.py | 91 +++++-- quality_control.json | 125 +++++++-- src/aind_data_schema/core/quality_control.py | 108 +++++++- tests/test_quality_control.py | 261 ++++++++++++++++++- 5 files changed, 620 insertions(+), 134 deletions(-) diff --git a/examples/quality_control.json b/examples/quality_control.json index 31717377..08d0585e 100644 --- a/examples/quality_control.json +++ b/examples/quality_control.json @@ -1,118 +1,175 @@ { "describedBy": "https://raw.githubusercontent.com/AllenNeuralDynamics/aind-data-schema/main/src/aind_data_schema/core/quality_control.py", "schema_version": "1.0.0", - "overall_status": [ - { - "evaluator": "Automated", - "status": "Pass", - "timestamp": "2022-11-22" - } - ], "evaluations": [ { - "evaluation_modality": { + "modality": { "name": "Extracellular electrophysiology", "abbreviation": "ecephys" }, - "evaluation_stage": "Processing", - "evaluation_name": "Drift map", - "evaluation_description": "Qualitative check that drift map shows minimal movement", - "qc_metrics": [ + "stage": "Raw data", + "name": "Drift map", + "description": "Qualitative check that drift map shows minimal movement", + "metrics": [ { "name": "Probe A drift", - "value": "High", + "value": { + "value": "", + "options": [ + "Low", + "Medium", + "High" + ], + "status": [ + "Pass", + "Fail", + "Fail" + ], + "type": "dropdown" + }, "description": null, - "reference": "ecephys-drift-map" + "reference": "ecephys-drift-map", + "status_history": [ + { + "evaluator": "", + "status": "Pending", + "timestamp": "2022-11-22T00:00:00Z" + } + ] }, { "name": "Probe B drift", - "value": "Low", + "value": { + "value": "", + "options": [ + "Drift visible in entire session", + "Drift visible in part of session", + "Sudden movement event" + ], + "status": [ + "Fail", + "Pass", + "Fail" + ], + "type": "checkbox" + }, "description": null, - "reference": "ecephys-drift-map" + "reference": "ecephys-drift-map", + "status_history": [ + { + "evaluator": "", + "status": "Pending", + "timestamp": "2022-11-22T00:00:00Z" + } + ] }, { "name": "Probe C drift", "value": "Low", "description": null, - "reference": "ecephys-drift-map" - } - ], - "evaluation_status": [ - { - "evaluator": "Fred Flintstone", - "status": "Fail", - "timestamp": "2022-11-22" + "reference": "ecephys-drift-map", + "status_history": [ + { + "evaluator": "Automated", + "status": "Pass", + "timestamp": "2022-11-22T00:00:00Z" + } + ] } ], - "notes": "Manually annotated: failed due to high drift on probe A" + "notes": "", + "allow_failed_metrics": false }, { - "evaluation_modality": { + "modality": { "name": "Behavior videos", "abbreviation": "behavior-videos" }, - "evaluation_stage": "Raw data", - "evaluation_name": "Video frame count check", - "evaluation_description": null, - "qc_metrics": [ + "stage": "Raw data", + "name": "Video frame count check", + "description": null, + "metrics": [ { "name": "video_1_num_frames", "value": 662, "description": null, - "reference": null + "reference": null, + "status_history": [ + { + "evaluator": "Automated", + "status": "Pass", + "timestamp": "2022-11-22T00:00:00Z" + } + ] }, { "name": "video_2_num_frames", "value": 662, "description": null, - "reference": null + "reference": null, + "status_history": [ + { + "evaluator": "Automated", + "status": "Pass", + "timestamp": "2022-11-22T00:00:00Z" + } + ] } ], - "evaluation_status": [ - { - "evaluator": "Fred Flintstone", - "status": "Fail", - "timestamp": "2022-11-22" - } - ], - "notes": "Pass when video_1_num_frames==video_2_num_frames" + "notes": "Pass when video_1_num_frames==video_2_num_frames", + "allow_failed_metrics": false }, { - "evaluation_modality": { + "modality": { "name": "Extracellular electrophysiology", "abbreviation": "ecephys" }, - "evaluation_stage": "Raw data", - "evaluation_name": "Probes present", - "evaluation_description": null, - "qc_metrics": [ + "stage": "Raw data", + "name": "Probes present", + "description": null, + "metrics": [ { "name": "ProbeA_success", "value": true, "description": null, - "reference": null + "reference": null, + "status_history": [ + { + "evaluator": "Automated", + "status": "Pass", + "timestamp": "2022-11-22T00:00:00Z" + } + ] }, { "name": "ProbeB_success", "value": true, "description": null, - "reference": null + "reference": null, + "status_history": [ + { + "evaluator": "Automated", + "status": "Pass", + "timestamp": "2022-11-22T00:00:00Z" + } + ] }, { "name": "ProbeC_success", "value": true, "description": null, - "reference": null - } - ], - "evaluation_status": [ - { - "evaluator": "Automated", - "status": "Pass", - "timestamp": "2022-11-22" + "reference": null, + "status_history": [ + { + "evaluator": "Automated", + "status": "Pass", + "timestamp": "2022-11-22T00:00:00Z" + } + ] } ], - "notes": null + "notes": null, + "allow_failed_metrics": false } ], "notes": null diff --git a/examples/quality_control.py b/examples/quality_control.py index 4ba3b754..df687d4d 100644 --- a/examples/quality_control.py +++ b/examples/quality_control.py @@ -1,51 +1,86 @@ """Example quality control processing""" -from datetime import date +from datetime import datetime, timezone from aind_data_schema_models.modalities import Modality from aind_data_schema.core.quality_control import QCEvaluation, QualityControl, QCMetric, Stage, Status, QCStatus -t = date(2022, 11, 22) +t = datetime(2022, 11, 22, 0, 0, 0, tzinfo=timezone.utc) + +s = QCStatus(evaluator="Automated", status=Status.PASS, timestamp=t) +sp = QCStatus(evaluator="", status=Status.PENDING, timestamp=t) + +# Example of how to use a dictionary to provide options a metric +drift_value_with_options = { + "value": "", + "options": ["Low", "Medium", "High"], + "status": [ + "Pass", + "Fail", + "Fail", + ], # when set, this field will be used to automatically parse the status, blank forces manual update + "type": "dropdown", # other type options: "checkbox" +} + +# Example of how to use a dictionary to provide multiple checkable flags, some of which will fail the metric +drift_value_with_flags = { + "value": "", + "options": ["Drift visible in entire session", "Drift visible in part of session", "Sudden movement event"], + "status": ["Fail", "Pass", "Fail"], + "type": "checkbox", +} eval0 = QCEvaluation( - evaluation_name="Drift map", - 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)], - 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"), + name="Drift map", + description="Qualitative check that drift map shows minimal movement", + modality=Modality.ECEPHYS, + stage=Stage.RAW, + metrics=[ + QCMetric( + name="Probe A drift", + value=drift_value_with_options, + reference="ecephys-drift-map", + status_history=[sp], + ), + QCMetric( + name="Probe B drift", + value=drift_value_with_flags, + reference="ecephys-drift-map", + status_history=[sp], + ), + QCMetric(name="Probe C drift", value="Low", reference="ecephys-drift-map", status_history=[s]), ], - notes="Manually annotated: failed due to high drift on probe A", + notes="", ) 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)], + name="Video frame count check", + modality=Modality.BEHAVIOR_VIDEOS, + stage=Stage.RAW, + metrics=[ + QCMetric(name="video_1_num_frames", value=662, status_history=[s]), + QCMetric(name="video_2_num_frames", value=662, status_history=[s]), + ], 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)], - qc_metrics=[ - QCMetric(name="ProbeA_success", value=True), - QCMetric(name="ProbeB_success", value=True), - QCMetric(name="ProbeC_success", value=True), + name="Probes present", + modality=Modality.ECEPHYS, + stage=Stage.RAW, + metrics=[ + QCMetric(name="ProbeA_success", value=True, status_history=[s]), + QCMetric(name="ProbeB_success", value=True, status_history=[s]), + QCMetric(name="ProbeC_success", value=True, status_history=[s]), ], ) -q = QualityControl( - overall_status=[QCStatus(evaluator="Automated", timestamp=t, status=Status.PASS)], evaluations=[eval0, eval1, eval2] -) +q = QualityControl(evaluations=[eval0, eval1, eval2]) + +# This is a special call that needs to be made to populate the .overall_status and .evaluation_status properties +# Note that the timestamp is set here because of how examples testing works, in general you should not set the +# timestamp manually serialized = q.model_dump_json() deserialized = QualityControl.model_validate_json(serialized) diff --git a/quality_control.json b/quality_control.json index e8b55acc..5a345e2f 100644 --- a/quality_control.json +++ b/quality_control.json @@ -1,8 +1,6 @@ { "describedBy": "https://raw.githubusercontent.com/AllenNeuralDynamics/aind-data-schema/main/src/aind_data_schema/core/quality_control.py", "schema_version": "1.0.0", - "overall_status": "Pass", - "overall_status_date": "2022-11-22", "evaluations": [ { "evaluation_modality": { @@ -11,31 +9,56 @@ }, "evaluation_stage": "Processing", "evaluation_name": "Drift map", - "evaluation_desc": "Qualitative check that drift map shows minimal movement", - "evaluator": "Fred Flintstone", - "evaluation_date": "2022-11-22", + "evaluation_description": "Qualitative check that drift map shows minimal movement", "qc_metrics": [ { "name": "Probe A drift", "value": "High", "description": null, - "references": null + "reference": "ecephys-drift-map", + "metric_status_history": [ + { + "evaluator": "Bob", + "status": "Pass", + "timestamp": "2022-11-22T00:00:00" + } + ] }, { "name": "Probe B drift", "value": "Low", "description": null, - "references": null + "reference": "ecephys-drift-map", + "metric_status_history": [ + { + "evaluator": "Bob", + "status": "Pass", + "timestamp": "2022-11-22T00:00:00" + } + ] }, { "name": "Probe C drift", "value": "Low", "description": null, - "references": null + "reference": "ecephys-drift-map", + "metric_status_history": [ + { + "evaluator": "Bob", + "status": "Pass", + "timestamp": "2022-11-22T00:00:00" + } + ] } ], - "stage_status": "Fail", - "notes": "Manually annotated: failed due to high drift on probe A" + "notes": "Manually annotated: failed due to high drift on probe A", + "evaluation_status_history": [ + { + "evaluator": "Automated", + "status": "Pass", + "timestamp": "2024-09-23T14:04:03.094512" + } + ] }, { "evaluation_modality": { @@ -44,25 +67,43 @@ }, "evaluation_stage": "Raw data", "evaluation_name": "Video frame count check", - "evaluation_desc": null, - "evaluator": "Fred Flinstone", - "evaluation_date": "2022-11-22", + "evaluation_description": null, "qc_metrics": [ { "name": "video_1_num_frames", "value": 662, "description": null, - "references": null + "reference": null, + "metric_status_history": [ + { + "evaluator": "Bob", + "status": "Pass", + "timestamp": "2022-11-22T00:00:00" + } + ] }, { "name": "video_2_num_frames", "value": 662, "description": null, - "references": null + "reference": null, + "metric_status_history": [ + { + "evaluator": "Bob", + "status": "Pass", + "timestamp": "2022-11-22T00:00:00" + } + ] } ], - "stage_status": "Pass", - "notes": "Pass when video_1_num_frames==video_2_num_frames" + "notes": "Pass when video_1_num_frames==video_2_num_frames", + "evaluation_status_history": [ + { + "evaluator": "Automated", + "status": "Pass", + "timestamp": "2024-09-23T14:04:03.094519" + } + ] }, { "evaluation_modality": { @@ -71,32 +112,64 @@ }, "evaluation_stage": "Raw data", "evaluation_name": "Probes present", - "evaluation_desc": null, - "evaluator": "Automated", - "evaluation_date": "2022-11-22", + "evaluation_description": null, "qc_metrics": [ { "name": "ProbeA_success", "value": true, "description": null, - "references": null + "reference": null, + "metric_status_history": [ + { + "evaluator": "Bob", + "status": "Pass", + "timestamp": "2022-11-22T00:00:00" + } + ] }, { "name": "ProbeB_success", "value": true, "description": null, - "references": null + "reference": null, + "metric_status_history": [ + { + "evaluator": "Bob", + "status": "Pass", + "timestamp": "2022-11-22T00:00:00" + } + ] }, { "name": "ProbeC_success", "value": true, "description": null, - "references": null + "reference": null, + "metric_status_history": [ + { + "evaluator": "Bob", + "status": "Pass", + "timestamp": "2022-11-22T00:00:00" + } + ] } ], - "stage_status": "Pass", - "notes": null + "notes": null, + "evaluation_status_history": [ + { + "evaluator": "Automated", + "status": "Pass", + "timestamp": "2024-09-23T14:04:03.094522" + } + ] } ], - "notes": null + "notes": null, + "overall_status_history": [ + { + "evaluator": "Automated", + "status": "Pass", + "timestamp": "2024-09-23T14:04:03.094524" + } + ] } \ No newline at end of file diff --git a/src/aind_data_schema/core/quality_control.py b/src/aind_data_schema/core/quality_control.py index 38224df7..b4879ff4 100644 --- a/src/aind_data_schema/core/quality_control.py +++ b/src/aind_data_schema/core/quality_control.py @@ -1,15 +1,12 @@ """ Schemas for Quality Metrics """ -from __future__ import annotations - -from datetime import date from enum import Enum from typing import List, Literal, Optional, Any from aind_data_schema_models.modalities import Modality -from pydantic import Field, BaseModel +from pydantic import Field, BaseModel, field_validator -from aind_data_schema.base import AindCoreModel, AindModel +from aind_data_schema.base import AindCoreModel, AindModel, AwareDatetimeWithDefault class Status(str, Enum): @@ -36,7 +33,7 @@ class QCStatus(BaseModel): evaluator: str = Field(..., title="Status evaluator full name") status: Status = Field(..., title="Status") - timestamp: date = Field(..., title="Status date") + timestamp: AwareDatetimeWithDefault = Field(..., title="Status date") class QCMetric(BaseModel): @@ -46,18 +43,87 @@ class QCMetric(BaseModel): value: Any = Field(..., title="Metric value") description: Optional[str] = Field(default=None, title="Metric description") reference: Optional[str] = Field(default=None, title="Metric reference image URL or plot type") + status_history: List[QCStatus] = Field(default=[], title="Metric status history") + + @property + def status(self) -> QCStatus: + """Get the latest status object for this metric + + Returns + ------- + QCStatus + Most recent status object + """ + return self.status_history[-1] + + @field_validator("status_history") + def validate_status_history(cls, v): + """Ensure that at least one QCStatus object is provided""" + if len(v) == 0: + raise ValueError("At least one QCStatus object must be provided") + return v class QCEvaluation(AindModel): """Description of one evaluation stage, with one or more metrics""" - evaluation_modality: Modality.ONE_OF = Field(..., title="Modality") - evaluation_stage: Stage = Field(..., title="Evaluation stage") - evaluation_name: str = Field(..., title="Evaluation name") - evaluation_description: Optional[str] = Field(default=None, title="Evaluation description") - qc_metrics: List[QCMetric] = Field(..., title="QC metrics") - evaluation_status: List[QCStatus] = Field(..., title="Evaluation status") + modality: Modality.ONE_OF = Field(..., title="Modality") + stage: Stage = Field(..., title="Evaluation stage") + name: str = Field(..., title="Evaluation name") + description: Optional[str] = Field(default=None, title="Evaluation description") + metrics: List[QCMetric] = Field(..., title="QC metrics") notes: Optional[str] = Field(default=None, title="Notes") + allow_failed_metrics: bool = Field( + default=False, + title="Allow metrics to fail", + description=( + "Set to true for evaluations that are not critical to the overall state of QC for a data asset, this" + " will allow individual metrics to fail while still passing the evaluation." + ), + ) + + @property + def status(self) -> Status: + """Loop through all metrics and return the evaluation's status + + Any fail -> FAIL + If no fails, then any pending -> PENDING + All PASS -> PASS + + Returns + ------- + Status + Current status of the evaluation + """ + latest_metric_statuses = [metric.status.status for metric in self.metrics] + + if (not self.allow_failed_metrics) and any(status == Status.FAIL for status in latest_metric_statuses): + return Status.FAIL + elif any(status == Status.PENDING for status in latest_metric_statuses): + return Status.PENDING + + return Status.PASS + + @property + def failed_metrics(self) -> Optional[List[QCMetric]]: + """Return any metrics that are failing + + Returns none if allow_failed_metrics is False + + Returns + ------- + list[QCMetric] + Metrics that fail + """ + if not self.allow_failed_metrics: + return None + else: + failing_metrics = [] + for metric in self.metrics: + if metric.status.status == Status.FAIL: + failing_metrics.append(metric) + + return failing_metrics class QualityControl(AindCoreModel): @@ -66,6 +132,22 @@ class QualityControl(AindCoreModel): _DESCRIBED_BY_URL = AindCoreModel._DESCRIBED_BY_BASE_URL.default + "aind_data_schema/core/quality_control.py" describedBy: str = Field(_DESCRIBED_BY_URL, json_schema_extra={"const": _DESCRIBED_BY_URL}) schema_version: Literal["1.0.0"] = Field("1.0.0") - overall_status: List[QCStatus] = Field(..., title="Overall status") evaluations: List[QCEvaluation] = Field(..., title="Evaluations") notes: Optional[str] = Field(default=None, title="Notes") + + @property + def status(self) -> Status: + """Loop through all evaluations and return the overall status + + Any FAIL -> FAIL + If no fails, then any PENDING -> PENDING + All PASS -> PASS + """ + eval_statuses = [evaluation.status for evaluation in self.evaluations] + + if any(status == Status.FAIL for status in eval_statuses): + return Status.FAIL + elif any(status == Status.PENDING for status in eval_statuses): + return Status.PENDING + + return Status.PASS diff --git a/tests/test_quality_control.py b/tests/test_quality_control.py index acccab46..1b287f05 100644 --- a/tests/test_quality_control.py +++ b/tests/test_quality_control.py @@ -1,7 +1,7 @@ """test quality metrics """ import unittest -from datetime import date +from datetime import datetime from aind_data_schema_models.modalities import Modality from pydantic import ValidationError @@ -19,30 +19,269 @@ 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"}), + name="Drift map", + modality=Modality.ECEPHYS, + stage=Stage.PROCESSING, + metrics=[ + QCMetric( + name="Multiple values example", + value={"stuff": "in_a_dict"}, + status_history=[ + QCStatus(evaluator="Bob", timestamp=datetime.fromisoformat("2020-10-10"), status=Status.PASS) + ], + ), QCMetric( name="Drift map pass/fail", value=False, description="Manual evaluation of whether the drift map looks good", - references=["s3://some-data-somewhere"], + reference="s3://some-data-somewhere", + status_history=[ + QCStatus(evaluator="Bob", timestamp=datetime.fromisoformat("2020-10-10"), status=Status.PASS) + ], ), ], ) q = QualityControl( - overall_status=[QCStatus(evaluator="Bob", timestamp=date.fromisoformat("2020-10-10"), status=Status.PASS)], evaluations=[test_eval], ) assert q is not None + def test_overall_status(self): + """test that overall status goes to pass/pending/fail correctly""" + + test_eval = QCEvaluation( + name="Drift map", + modality=Modality.ECEPHYS, + stage=Stage.PROCESSING, + metrics=[ + QCMetric( + name="Multiple values example", + value={"stuff": "in_a_dict"}, + status_history=[ + QCStatus(evaluator="Bob", timestamp=datetime.fromisoformat("2020-10-10"), status=Status.PASS) + ], + ), + QCMetric( + name="Drift map pass/fail", + value=False, + description="Manual evaluation of whether the drift map looks good", + reference="s3://some-data-somewhere", + status_history=[ + QCStatus(evaluator="Bob", timestamp=datetime.fromisoformat("2020-10-10"), status=Status.PASS) + ], + ), + ], + ) + + # check that evaluation status gets auto-set if it has never been set before + self.assertEqual(test_eval.status, Status.PASS) + + q = QualityControl( + evaluations=[test_eval, test_eval], + ) + + # check that overall status gets auto-set if it has never been set before + self.assertEqual(q.status, Status.PASS) + + # Add a pending metric to the first evaluation + q.evaluations[0].metrics.append( + QCMetric( + name="Drift map pass/fail", + value=False, + description="Manual evaluation of whether the drift map looks good", + reference="s3://some-data-somewhere", + status_history=[ + QCStatus( + evaluator="Automated", timestamp=datetime.fromisoformat("2020-10-10"), status=Status.PENDING + ) + ], + ) + ) + + self.assertEqual(q.status, Status.PENDING) + + # Add a failing metric to the first evaluation + q.evaluations[0].metrics.append( + QCMetric( + name="Drift map pass/fail", + value=False, + description="Manual evaluation of whether the drift map looks good", + reference="s3://some-data-somewhere", + status_history=[ + QCStatus(evaluator="Automated", timestamp=datetime.fromisoformat("2020-10-10"), status=Status.FAIL) + ], + ) + ) + + self.assertEqual(q.status, Status.FAIL) + + def test_evaluation_status(self): + """test that evaluation status goes to pass/pending/fail correctly""" + evaluation = QCEvaluation( + name="Drift map", + modality=Modality.ECEPHYS, + stage=Stage.PROCESSING, + metrics=[ + QCMetric( + name="Multiple values example", + value={"stuff": "in_a_dict"}, + status_history=[ + QCStatus( + evaluator="Automated", timestamp=datetime.fromisoformat("2020-10-10"), status=Status.PASS + ) + ], + ), + QCMetric( + name="Drift map pass/fail", + value=False, + description="Manual evaluation of whether the drift map looks good", + reference="s3://some-data-somewhere", + status_history=[ + QCStatus( + evaluator="Automated", timestamp=datetime.fromisoformat("2020-10-10"), status=Status.PASS + ) + ], + ), + ], + ) + + self.assertEqual(evaluation.status, Status.PASS) + + # Add a pending metric, evaluation should now evaluate to pending + evaluation.metrics.append( + QCMetric( + name="Drift map pass/fail", + value=False, + description="Manual evaluation of whether the drift map looks good", + reference="s3://some-data-somewhere", + status_history=[ + QCStatus( + evaluator="Automated", timestamp=datetime.fromisoformat("2020-10-10"), status=Status.PENDING + ) + ], + ) + ) + + self.assertEqual(evaluation.status, Status.PENDING) + + # Add a failing metric, evaluation should now evaluate to fail + evaluation.metrics.append( + QCMetric( + name="Drift map pass/fail", + value=False, + description="Manual evaluation of whether the drift map looks good", + reference="s3://some-data-somewhere", + status_history=[ + QCStatus(evaluator="Automated", timestamp=datetime.fromisoformat("2020-10-10"), status=Status.FAIL) + ], + ) + ) + + self.assertEqual(evaluation.status, Status.FAIL) + + def test_allowed_failed_metrics(self): + """Test that if you set the flag to allow failures that evaluations pass""" + + metric2 = QCMetric( + name="Drift map pass/fail", + value=False, + description="Manual evaluation of whether the drift map looks good", + reference="s3://some-data-somewhere", + status_history=[ + QCStatus(evaluator="Automated", timestamp=datetime.fromisoformat("2020-10-10"), status=Status.PENDING) + ], + ) + + # First check that a pending evaluation still evaluates properly + evaluation = QCEvaluation( + name="Drift map", + modality=Modality.ECEPHYS, + stage=Stage.PROCESSING, + allow_failed_metrics=False, + metrics=[ + QCMetric( + name="Multiple values example", + value={"stuff": "in_a_dict"}, + status_history=[ + QCStatus( + evaluator="Automated", timestamp=datetime.fromisoformat("2020-10-10"), status=Status.PASS + ) + ], + ), + metric2, + ], + ) + + self.assertIsNone(evaluation.failed_metrics) + + evaluation.allow_failed_metrics = True + + self.assertEqual(evaluation.status, Status.PENDING) + + # Replace the pending evaluation with a fail, evaluation should not evaluate to pass + evaluation.metrics[1].status_history[0].status = Status.FAIL + + self.assertEqual(evaluation.status, Status.PASS) + + metric2.status_history[0].status = Status.FAIL + self.assertEqual(evaluation.failed_metrics, [metric2]) + + def test_metric_history_order(self): + """Test that the order of the metric status history list is preserved when dumping""" + t0 = datetime.fromisoformat("2020-10-10") + t1 = datetime.fromisoformat("2020-10-11") + t2 = datetime.fromisoformat("2020-10-12") + + evaluation = QCEvaluation( + name="Drift map", + modality=Modality.ECEPHYS, + stage=Stage.PROCESSING, + metrics=[ + QCMetric( + name="Multiple values example", + value={"stuff": "in_a_dict"}, + status_history=[ + QCStatus(evaluator="Automated", timestamp=t0, status=Status.PASS), + QCStatus(evaluator="Automated", timestamp=t1, status=Status.PASS), + QCStatus(evaluator="Automated", timestamp=t2, status=Status.PASS), + ], + ), + ], + ) + + # roundtrip to json to check that metric order is preserved + json = evaluation.model_dump_json() + evaluation_rebuild = QCEvaluation.model_validate_json(json) + + # because the actual model uses AwareDatetime objects we have to strip the timezone + roundtrip_t0 = evaluation_rebuild.metrics[0].status_history[0].timestamp + roundtrip_t1 = evaluation_rebuild.metrics[0].status_history[1].timestamp + roundtrip_t2 = evaluation_rebuild.metrics[0].status_history[2].timestamp + + roundtrip_t0 = roundtrip_t0.replace(tzinfo=None) + roundtrip_t1 = roundtrip_t1.replace(tzinfo=None) + roundtrip_t2 = roundtrip_t2.replace(tzinfo=None) + + self.assertEqual(roundtrip_t0, t0) + self.assertEqual(roundtrip_t1, t1) + self.assertEqual(roundtrip_t2, t2) + + def test_metric_status(self): + """Ensure that at least one status object exists for metric_status_history""" + + with self.assertRaises(ValueError) as context: + QCMetric( + name="Multiple values example", + value={"stuff": "in_a_dict"}, + status_history=[], + ) + + expected_exception = "At least one QCStatus object must be provided" + + self.assertTrue(expected_exception in repr(context.exception)) + if __name__ == "__main__": unittest.main() From 0e7876b5c59e3b04ff497f82b752c692e32f98ba Mon Sep 17 00:00:00 2001 From: Dan Birman Date: Fri, 4 Oct 2024 10:16:53 -0700 Subject: [PATCH 20/23] chore: version bump --- src/aind_data_schema/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/aind_data_schema/__init__.py b/src/aind_data_schema/__init__.py index a0706de6..c02cc6a6 100755 --- a/src/aind_data_schema/__init__.py +++ b/src/aind_data_schema/__init__.py @@ -1,4 +1,4 @@ """ imports for AindModel subclasses """ -__version__ = "1.0.0" +__version__ = "1.1.0" From d767e8cfe12fc787560c19837736e37d55a87697 Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 4 Oct 2024 17:20:02 +0000 Subject: [PATCH 21/23] bump schema version [skip actions] --- examples/aibs_smartspim_instrument.json | 2 +- examples/aibs_smartspim_procedures.json | 2 +- examples/aind_smartspim_instrument.json | 2 +- examples/bergamo_ophys_session.json | 2 +- examples/data_description.json | 2 +- examples/ephys_rig.json | 2 +- examples/ephys_session.json | 2 +- examples/exaspim_acquisition.json | 2 +- examples/exaspim_instrument.json | 2 +- examples/fip_behavior_rig.json | 2 +- examples/fip_ophys_rig.json | 2 +- examples/mri_session.json | 2 +- examples/multiplane_ophys_session.json | 2 +- examples/ophys_procedures.json | 2 +- examples/ophys_session.json | 2 +- examples/procedures.json | 2 +- examples/processing.json | 2 +- examples/quality_control.json | 2 +- schemas/acquisition_schema.json | 78 +- schemas/data_description_schema.json | 12 +- schemas/instrument_schema.json | 302 +- schemas/metadata_schema.json | 3988 ++++++++++------- schemas/procedures_schema.json | 2030 +++++++-- schemas/processing_schema.json | 264 +- schemas/quality_control_schema.json | 177 +- schemas/rig_schema.json | 646 +-- schemas/session_schema.json | 464 +- src/aind_data_schema/core/acquisition.py | 2 +- src/aind_data_schema/core/data_description.py | 2 +- src/aind_data_schema/core/instrument.py | 2 +- src/aind_data_schema/core/metadata.py | 2 +- src/aind_data_schema/core/procedures.py | 2 +- src/aind_data_schema/core/processing.py | 2 +- src/aind_data_schema/core/quality_control.py | 2 +- src/aind_data_schema/core/rig.py | 2 +- src/aind_data_schema/core/session.py | 2 +- 36 files changed, 4664 insertions(+), 3351 deletions(-) diff --git a/examples/aibs_smartspim_instrument.json b/examples/aibs_smartspim_instrument.json index 8e5ed5f8..61c382cd 100644 --- a/examples/aibs_smartspim_instrument.json +++ b/examples/aibs_smartspim_instrument.json @@ -1,6 +1,6 @@ { "describedBy": "https://raw.githubusercontent.com/AllenNeuralDynamics/aind-data-schema/main/src/aind_data_schema/core/instrument.py", - "schema_version": "1.0.0", + "schema_version": "1.0.1", "instrument_id": "440_SmartSPIM2_20231004", "modification_date": "2023-10-04", "instrument_type": "SmartSPIM", diff --git a/examples/aibs_smartspim_procedures.json b/examples/aibs_smartspim_procedures.json index 2410541c..f8e1e823 100644 --- a/examples/aibs_smartspim_procedures.json +++ b/examples/aibs_smartspim_procedures.json @@ -1,6 +1,6 @@ { "describedBy": "https://raw.githubusercontent.com/AllenNeuralDynamics/aind-data-schema/main/src/aind_data_schema/core/procedures.py", - "schema_version": "1.0.0", + "schema_version": "1.0.1", "subject_id": "651286", "subject_procedures": [ { diff --git a/examples/aind_smartspim_instrument.json b/examples/aind_smartspim_instrument.json index 192cb8ab..fc0104d6 100644 --- a/examples/aind_smartspim_instrument.json +++ b/examples/aind_smartspim_instrument.json @@ -1,6 +1,6 @@ { "describedBy": "https://raw.githubusercontent.com/AllenNeuralDynamics/aind-data-schema/main/src/aind_data_schema/core/instrument.py", - "schema_version": "1.0.0", + "schema_version": "1.0.1", "instrument_id": "440_SmartSPIM1_20231004", "modification_date": "2023-10-04", "instrument_type": "SmartSPIM", diff --git a/examples/bergamo_ophys_session.json b/examples/bergamo_ophys_session.json index d1d98533..e649d8d6 100644 --- a/examples/bergamo_ophys_session.json +++ b/examples/bergamo_ophys_session.json @@ -1,6 +1,6 @@ { "describedBy": "https://raw.githubusercontent.com/AllenNeuralDynamics/aind-data-schema/main/src/aind_data_schema/core/session.py", - "schema_version": "1.0.0", + "schema_version": "1.0.1", "protocol_id": [], "experimenter_full_name": [ "John Doe" diff --git a/examples/data_description.json b/examples/data_description.json index fb5b5ed4..ed87c3c5 100644 --- a/examples/data_description.json +++ b/examples/data_description.json @@ -1,6 +1,6 @@ { "describedBy": "https://raw.githubusercontent.com/AllenNeuralDynamics/aind-data-schema/main/src/aind_data_schema/core/data_description.py", - "schema_version": "1.0.0", + "schema_version": "1.0.1", "license": "CC-BY-4.0", "platform": { "name": "Electrophysiology platform", diff --git a/examples/ephys_rig.json b/examples/ephys_rig.json index 1a56fba7..c2e5baa3 100644 --- a/examples/ephys_rig.json +++ b/examples/ephys_rig.json @@ -1,6 +1,6 @@ { "describedBy": "https://raw.githubusercontent.com/AllenNeuralDynamics/aind-data-schema/main/src/aind_data_schema/core/rig.py", - "schema_version": "1.0.0", + "schema_version": "1.0.1", "rig_id": "323_EPHYS1_20231003", "modification_date": "2023-10-03", "mouse_platform": { diff --git a/examples/ephys_session.json b/examples/ephys_session.json index 57092944..48eb28aa 100644 --- a/examples/ephys_session.json +++ b/examples/ephys_session.json @@ -1,6 +1,6 @@ { "describedBy": "https://raw.githubusercontent.com/AllenNeuralDynamics/aind-data-schema/main/src/aind_data_schema/core/session.py", - "schema_version": "1.0.0", + "schema_version": "1.0.1", "protocol_id": [], "experimenter_full_name": [ "Max Quibble", diff --git a/examples/exaspim_acquisition.json b/examples/exaspim_acquisition.json index 6ec7b4f2..a4117ea1 100644 --- a/examples/exaspim_acquisition.json +++ b/examples/exaspim_acquisition.json @@ -1,6 +1,6 @@ { "describedBy": "https://raw.githubusercontent.com/AllenNeuralDynamics/aind-data-schema/main/src/aind_data_schema/core/acquisition.py", - "schema_version": "1.0.0", + "schema_version": "1.0.1", "protocol_id": [], "experimenter_full_name": [ "###" diff --git a/examples/exaspim_instrument.json b/examples/exaspim_instrument.json index 3206ce81..91043aff 100644 --- a/examples/exaspim_instrument.json +++ b/examples/exaspim_instrument.json @@ -1,6 +1,6 @@ { "describedBy": "https://raw.githubusercontent.com/AllenNeuralDynamics/aind-data-schema/main/src/aind_data_schema/core/instrument.py", - "schema_version": "1.0.0", + "schema_version": "1.0.1", "instrument_id": "440_exaSPIM1-20231004", "modification_date": "2023-10-04", "instrument_type": "exaSPIM", diff --git a/examples/fip_behavior_rig.json b/examples/fip_behavior_rig.json index 48528586..51a89a45 100644 --- a/examples/fip_behavior_rig.json +++ b/examples/fip_behavior_rig.json @@ -1,6 +1,6 @@ { "describedBy": "https://raw.githubusercontent.com/AllenNeuralDynamics/aind-data-schema/main/src/aind_data_schema/core/rig.py", - "schema_version": "1.0.0", + "schema_version": "1.0.1", "rig_id": "447_FIP-Behavior_20000101", "modification_date": "2000-01-01", "mouse_platform": { diff --git a/examples/fip_ophys_rig.json b/examples/fip_ophys_rig.json index 7c42a76b..5c189fc1 100644 --- a/examples/fip_ophys_rig.json +++ b/examples/fip_ophys_rig.json @@ -1,6 +1,6 @@ { "describedBy": "https://raw.githubusercontent.com/AllenNeuralDynamics/aind-data-schema/main/src/aind_data_schema/core/rig.py", - "schema_version": "1.0.0", + "schema_version": "1.0.1", "rig_id": "428_FIP1_20231003", "modification_date": "2023-10-03", "mouse_platform": { diff --git a/examples/mri_session.json b/examples/mri_session.json index 151f5041..55afc353 100644 --- a/examples/mri_session.json +++ b/examples/mri_session.json @@ -1,6 +1,6 @@ { "describedBy": "https://raw.githubusercontent.com/AllenNeuralDynamics/aind-data-schema/main/src/aind_data_schema/core/session.py", - "schema_version": "1.0.0", + "schema_version": "1.0.1", "protocol_id": [ "dx.doi.org/10.57824/protocols.io.bh7kl4n6" ], diff --git a/examples/multiplane_ophys_session.json b/examples/multiplane_ophys_session.json index 4d8b941f..4f5fc1d6 100644 --- a/examples/multiplane_ophys_session.json +++ b/examples/multiplane_ophys_session.json @@ -1,6 +1,6 @@ { "describedBy": "https://raw.githubusercontent.com/AllenNeuralDynamics/aind-data-schema/main/src/aind_data_schema/core/session.py", - "schema_version": "1.0.0", + "schema_version": "1.0.1", "protocol_id": [], "experimenter_full_name": [ "John Doe" diff --git a/examples/ophys_procedures.json b/examples/ophys_procedures.json index 9ce75fbf..92ce4006 100644 --- a/examples/ophys_procedures.json +++ b/examples/ophys_procedures.json @@ -1,6 +1,6 @@ { "describedBy": "https://raw.githubusercontent.com/AllenNeuralDynamics/aind-data-schema/main/src/aind_data_schema/core/procedures.py", - "schema_version": "1.0.0", + "schema_version": "1.0.1", "subject_id": "625100", "subject_procedures": [ { diff --git a/examples/ophys_session.json b/examples/ophys_session.json index 45443870..5e5eb7c6 100644 --- a/examples/ophys_session.json +++ b/examples/ophys_session.json @@ -1,6 +1,6 @@ { "describedBy": "https://raw.githubusercontent.com/AllenNeuralDynamics/aind-data-schema/main/src/aind_data_schema/core/session.py", - "schema_version": "1.0.0", + "schema_version": "1.0.1", "protocol_id": [], "experimenter_full_name": [ "John Doe" diff --git a/examples/procedures.json b/examples/procedures.json index 27df0e54..666c5157 100644 --- a/examples/procedures.json +++ b/examples/procedures.json @@ -1,6 +1,6 @@ { "describedBy": "https://raw.githubusercontent.com/AllenNeuralDynamics/aind-data-schema/main/src/aind_data_schema/core/procedures.py", - "schema_version": "1.0.0", + "schema_version": "1.0.1", "subject_id": "625100", "subject_procedures": [ { diff --git a/examples/processing.json b/examples/processing.json index 01efb037..75cb8a97 100644 --- a/examples/processing.json +++ b/examples/processing.json @@ -1,6 +1,6 @@ { "describedBy": "https://raw.githubusercontent.com/AllenNeuralDynamics/aind-data-schema/main/src/aind_data_schema/core/processing.py", - "schema_version": "1.0.0", + "schema_version": "1.0.1", "processing_pipeline": { "data_processes": [ { diff --git a/examples/quality_control.json b/examples/quality_control.json index 08d0585e..4da23817 100644 --- a/examples/quality_control.json +++ b/examples/quality_control.json @@ -1,6 +1,6 @@ { "describedBy": "https://raw.githubusercontent.com/AllenNeuralDynamics/aind-data-schema/main/src/aind_data_schema/core/quality_control.py", - "schema_version": "1.0.0", + "schema_version": "1.0.1", "evaluations": [ { "modality": { diff --git a/schemas/acquisition_schema.json b/schemas/acquisition_schema.json index 763a6e3b..a5aa2241 100644 --- a/schemas/acquisition_schema.json +++ b/schemas/acquisition_schema.json @@ -613,11 +613,7 @@ "type": "integer" }, "imaging_angle_unit": { - "allOf": [ - { - "$ref": "#/$defs/AngleUnit" - } - ], + "$ref": "#/$defs/AngleUnit", "default": "degrees", "title": "Imaging angle unit" }, @@ -1261,21 +1257,13 @@ "type": "string" }, "input": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "description": "Calibration input", "title": "inputs" }, "output": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "description": "Calibration output", "title": "outputs" @@ -1342,11 +1330,7 @@ "type": "integer" }, "excitation_wavelength_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "nanometer", "title": "Laser wavelength unit" }, @@ -1356,11 +1340,7 @@ "type": "number" }, "excitation_power_unit": { - "allOf": [ - { - "$ref": "#/$defs/PowerUnit" - } - ], + "$ref": "#/$defs/PowerUnit", "default": "milliwatt", "title": "Laser power unit" }, @@ -1381,11 +1361,7 @@ "title": "Dilation (pixels)" }, "dilation_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "pixel", "title": "Dilation unit" }, @@ -2182,19 +2158,11 @@ "description": "Description of an image axis", "properties": { "name": { - "allOf": [ - { - "$ref": "#/$defs/AxisName" - } - ], + "$ref": "#/$defs/AxisName", "title": "Name" }, "direction": { - "allOf": [ - { - "$ref": "#/$defs/AnatomicalDirection" - } - ], + "$ref": "#/$defs/AnatomicalDirection", "description": "Tissue direction as the value of axis increases. If Other describe in notes." }, "dimension": { @@ -2203,11 +2171,7 @@ "type": "integer" }, "unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "micrometer", "title": "Axis physical units" } @@ -2225,11 +2189,7 @@ "description": "Description of immersion medium", "properties": { "medium": { - "allOf": [ - { - "$ref": "#/$defs/ImmersionMedium" - } - ], + "$ref": "#/$defs/ImmersionMedium", "title": "Immersion medium" }, "refractive_index": { @@ -4662,11 +4622,7 @@ "title": "URL to commit being used" }, "parameters": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "title": "Software parameters" } @@ -5144,10 +5100,10 @@ "type": "string" }, "schema_version": { - "const": "1.0.0", - "default": "1.0.0", + "const": "1.0.1", + "default": "1.0.1", "enum": [ - "1.0.0" + "1.0.1" ], "title": "Schema Version", "type": "string" @@ -5244,11 +5200,7 @@ "type": "array" }, "chamber_immersion": { - "allOf": [ - { - "$ref": "#/$defs/Immersion" - } - ], + "$ref": "#/$defs/Immersion", "title": "Acquisition chamber immersion data" }, "sample_immersion": { diff --git a/schemas/data_description_schema.json b/schemas/data_description_schema.json index b94486e1..b9f5986a 100644 --- a/schemas/data_description_schema.json +++ b/schemas/data_description_schema.json @@ -1775,10 +1775,10 @@ "type": "string" }, "schema_version": { - "const": "1.0.0", - "default": "1.0.0", + "const": "1.0.1", + "default": "1.0.1", "enum": [ - "1.0.0" + "1.0.1" ], "title": "Schema Version", "type": "string" @@ -1954,11 +1954,7 @@ "type": "array" }, "data_level": { - "allOf": [ - { - "$ref": "#/$defs/DataLevel" - } - ], + "$ref": "#/$defs/DataLevel", "description": "level of processing that data has undergone", "title": "Data Level" }, diff --git a/schemas/instrument_schema.json b/schemas/instrument_schema.json index 0a67635c..2f292591 100644 --- a/schemas/instrument_schema.json +++ b/schemas/instrument_schema.json @@ -988,11 +988,7 @@ "title": "Port index" }, "additional_settings": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "title": "Additional parameters" }, @@ -1009,11 +1005,7 @@ "title": "Notes" }, "imaging_device_type": { - "allOf": [ - { - "$ref": "#/$defs/ImagingDeviceType" - } - ], + "$ref": "#/$defs/ImagingDeviceType", "title": "Device type" } }, @@ -1587,11 +1579,7 @@ "type": "string" }, "channel_type": { - "allOf": [ - { - "$ref": "#/$defs/DaqChannelType" - } - ], + "$ref": "#/$defs/DaqChannelType", "title": "DAQ channel type" }, "port": { @@ -1634,11 +1622,7 @@ "title": "DAQ channel sample rate (Hz)" }, "sample_rate_unit": { - "allOf": [ - { - "$ref": "#/$defs/FrequencyUnit" - } - ], + "$ref": "#/$defs/FrequencyUnit", "default": "hertz", "title": "Sample rate unit" }, @@ -1768,11 +1752,7 @@ "title": "Port index" }, "additional_settings": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "title": "Additional parameters" }, @@ -1789,11 +1769,7 @@ "title": "Notes" }, "data_interface": { - "allOf": [ - { - "$ref": "#/$defs/DataInterface" - } - ], + "$ref": "#/$defs/DataInterface", "title": "Type of connection to PC" }, "computer_name": { @@ -2081,11 +2057,7 @@ "title": "Port index" }, "additional_settings": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "title": "Additional parameters" }, @@ -2102,29 +2074,16 @@ "title": "Notes" }, "detector_type": { - "allOf": [ - { - "$ref": "#/$defs/DetectorType" - } - ], + "$ref": "#/$defs/DetectorType", "title": "Detector Type" }, "data_interface": { - "allOf": [ - { - "$ref": "#/$defs/DataInterface" - } - ], + "$ref": "#/$defs/DataInterface", "title": "Data interface" }, "cooling": { - "allOf": [ - { - "$ref": "#/$defs/Cooling" - } - ], - "default": "None", - "title": "Cooling" + "$ref": "#/$defs/Cooling", + "default": "None" }, "computer_name": { "anyOf": [ @@ -2155,11 +2114,7 @@ "title": "Frame rate (Hz)" }, "frame_rate_unit": { - "allOf": [ - { - "$ref": "#/$defs/FrequencyUnit" - } - ], + "$ref": "#/$defs/FrequencyUnit", "default": "hertz", "title": "Frame rate unit" }, @@ -2212,11 +2167,7 @@ "title": "Height of the sensor (pixels)" }, "size_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "pixel", "title": "Size unit" }, @@ -2257,11 +2208,7 @@ "title": "Bit depth" }, "bin_mode": { - "allOf": [ - { - "$ref": "#/$defs/BinMode" - } - ], + "$ref": "#/$defs/BinMode", "default": "None", "title": "Detector binning mode" }, @@ -2290,11 +2237,7 @@ "title": "Bin height" }, "bin_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "pixel", "title": "Bin size unit" }, @@ -2362,11 +2305,7 @@ "title": "Crop width" }, "crop_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "pixel", "title": "Crop size unit" }, @@ -3055,11 +2994,7 @@ "title": "Port index" }, "additional_settings": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "title": "Additional parameters" }, @@ -3076,11 +3011,7 @@ "title": "Notes" }, "size": { - "allOf": [ - { - "$ref": "#/$defs/Size3d" - } - ], + "$ref": "#/$defs/Size3d", "title": "Size" }, "internal_material": { @@ -3306,11 +3237,7 @@ "title": "Port index" }, "additional_settings": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "title": "Additional parameters" }, @@ -3327,11 +3254,7 @@ "title": "Notes" }, "filter_type": { - "allOf": [ - { - "$ref": "#/$defs/FilterType" - } - ], + "$ref": "#/$defs/FilterType", "title": "Type of filter" }, "diameter": { @@ -3380,17 +3303,14 @@ "title": "Height (mm)" }, "size_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "millimeter", "title": "Size unit" }, "thickness": { "anyOf": [ { + "minimum": 0.0, "type": "number" }, { @@ -3404,11 +3324,7 @@ "title": "Thickness (mm)" }, "thickness_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "millimeter", "title": "Thickness unit" }, @@ -3461,11 +3377,7 @@ "title": "Center wavelength (nm)" }, "wavelength_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "nanometer", "title": "Wavelength unit" }, @@ -4718,11 +4630,7 @@ "title": "Port index" }, "additional_settings": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "title": "Additional parameters" }, @@ -4763,11 +4671,7 @@ "title": "Wavelength maximum (nm)" }, "wavelength_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "nanometer", "title": "Wavelength unit" }, @@ -4784,11 +4688,7 @@ "title": "Temperature (K)" }, "temperature_unit": { - "allOf": [ - { - "$ref": "#/$defs/TemperatureUnit" - } - ], + "$ref": "#/$defs/TemperatureUnit", "default": "Kelvin", "title": "Temperature unit" } @@ -4900,11 +4800,7 @@ "title": "Port index" }, "additional_settings": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "title": "Additional parameters" }, @@ -4925,11 +4821,7 @@ "type": "integer" }, "wavelength_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "nanometer", "title": "Wavelength unit" }, @@ -4949,11 +4841,7 @@ "title": "Maximum power (mW)" }, "power_unit": { - "allOf": [ - { - "$ref": "#/$defs/PowerUnit" - } - ], + "$ref": "#/$defs/PowerUnit", "default": "milliwatt", "title": "Power unit" }, @@ -4972,6 +4860,8 @@ "coupling_efficiency": { "anyOf": [ { + "maximum": 100.0, + "minimum": 0.0, "type": "number" }, { @@ -5147,11 +5037,7 @@ "title": "Port index" }, "additional_settings": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "title": "Additional parameters" }, @@ -5183,11 +5069,7 @@ "title": "Focal length of the lens (mm)" }, "focal_length_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "millimeter", "title": "Focal length unit" }, @@ -5204,11 +5086,7 @@ "title": "Size (inches)" }, "lens_size_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "inch", "title": "Lens size unit" }, @@ -5225,11 +5103,7 @@ "title": "Optimized wavelength range (nm)" }, "wavelength_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "nanometer", "title": "Wavelength unit" }, @@ -5359,11 +5233,7 @@ "title": "Port index" }, "additional_settings": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "title": "Additional parameters" }, @@ -5384,11 +5254,7 @@ "type": "integer" }, "wavelength_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "nanometer", "title": "Wavelength unit" }, @@ -5405,11 +5271,7 @@ "title": "Bandwidth (FWHM)" }, "bandwidth_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "nanometer", "title": "Bandwidth unit" } @@ -6181,11 +6043,7 @@ "title": "Port index" }, "additional_settings": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "title": "Additional parameters" }, @@ -6213,11 +6071,7 @@ "title": "Travel of device (mm)" }, "travel_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "millimeter", "title": "Travel unit" }, @@ -7356,11 +7210,7 @@ "title": "Port index" }, "additional_settings": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "title": "Additional parameters" }, @@ -7399,11 +7249,7 @@ "title": "Magnification" }, "immersion": { - "allOf": [ - { - "$ref": "#/$defs/ImmersionMedium" - } - ], + "$ref": "#/$defs/ImmersionMedium", "title": "Immersion" }, "objective_type": { @@ -7878,11 +7724,7 @@ "title": "Port index" }, "additional_settings": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "title": "Additional parameters" }, @@ -7901,6 +7743,7 @@ "length": { "anyOf": [ { + "minimum": 0.0, "type": "number" }, { @@ -7916,6 +7759,7 @@ "width": { "anyOf": [ { + "minimum": 0.0, "type": "number" }, { @@ -7929,11 +7773,7 @@ "title": "Width (inches)" }, "table_size_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "inch", "title": "Table size unit" }, @@ -8825,11 +8665,7 @@ "title": "Port index" }, "additional_settings": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "title": "Additional parameters" }, @@ -8857,11 +8693,7 @@ "title": "Travel of device (mm)" }, "travel_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "millimeter", "title": "Travel unit" }, @@ -8878,19 +8710,11 @@ "title": "Firmware" }, "stage_axis_direction": { - "allOf": [ - { - "$ref": "#/$defs/StageAxisDirection" - } - ], + "$ref": "#/$defs/StageAxisDirection", "title": "Direction of stage axis" }, "stage_axis_name": { - "allOf": [ - { - "$ref": "#/$defs/StageAxisName" - } - ], + "$ref": "#/$defs/StageAxisName", "title": "Name of stage axis" } }, @@ -8920,11 +8744,7 @@ "type": "integer" }, "unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "meter", "title": "Size unit" } @@ -8976,11 +8796,7 @@ "title": "URL to commit being used" }, "parameters": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "title": "Software parameters" } @@ -9451,10 +9267,10 @@ "type": "string" }, "schema_version": { - "const": "1.0.0", - "default": "1.0.0", + "const": "1.0.1", + "default": "1.0.1", "enum": [ - "1.0.0" + "1.0.1" ], "title": "Schema Version", "type": "string" @@ -9478,11 +9294,7 @@ "type": "string" }, "instrument_type": { - "allOf": [ - { - "$ref": "#/$defs/ImagingInstrumentType" - } - ], + "$ref": "#/$defs/ImagingInstrumentType", "title": "Instrument type" }, "manufacturer": { diff --git a/schemas/metadata_schema.json b/schemas/metadata_schema.json index 5df6c5ad..14ac83e7 100644 --- a/schemas/metadata_schema.json +++ b/schemas/metadata_schema.json @@ -558,10 +558,10 @@ "type": "string" }, "schema_version": { - "const": "1.0.0", - "default": "1.0.0", + "const": "1.0.1", + "default": "1.0.1", "enum": [ - "1.0.0" + "1.0.1" ], "title": "Schema Version", "type": "string" @@ -658,11 +658,7 @@ "type": "array" }, "chamber_immersion": { - "allOf": [ - { - "$ref": "#/$defs/Immersion" - } - ], + "$ref": "#/$defs/Immersion", "title": "Acquisition chamber immersion data" }, "sample_immersion": { @@ -832,11 +828,7 @@ "type": "integer" }, "imaging_angle_unit": { - "allOf": [ - { - "$ref": "#/$defs/AngleUnit" - } - ], + "$ref": "#/$defs/AngleUnit", "default": "degrees", "title": "Imaging angle unit" }, @@ -1315,11 +1307,7 @@ "title": "Port index" }, "additional_settings": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "title": "Additional parameters" }, @@ -1336,11 +1324,7 @@ "title": "Notes" }, "imaging_device_type": { - "allOf": [ - { - "$ref": "#/$defs/ImagingDeviceType" - } - ], + "$ref": "#/$defs/ImagingDeviceType", "title": "Device type" } }, @@ -1414,17 +1398,15 @@ "title": "Duration" }, "duration_unit": { - "allOf": [ - { - "$ref": "#/$defs/TimeUnit" - } - ], + "$ref": "#/$defs/TimeUnit", "default": "minute", "title": "Duration unit" }, "level": { "anyOf": [ { + "maximum": 5.0, + "minimum": 1.0, "type": "number" }, { @@ -1450,11 +1432,7 @@ "description": "Description of an Analysis", "properties": { "name": { - "allOf": [ - { - "$ref": "#/$defs/ProcessName" - } - ], + "$ref": "#/$defs/ProcessName", "default": "Analysis", "title": "Process name" }, @@ -1502,19 +1480,11 @@ "title": "Code version" }, "parameters": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "title": "Parameters" }, "outputs": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "description": "Output parameters", "title": "Outputs" @@ -1531,6 +1501,18 @@ "default": null, "title": "Notes" }, + "resources": { + "anyOf": [ + { + "$ref": "#/$defs/ResourceUsage" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Process resource usage" + }, "analyst_full_name": { "description": "Name of person responsible for running analysis", "title": "Analyst Full Name", @@ -1982,11 +1964,7 @@ "title": "Lot expiration date" }, "immunolabel_class": { - "allOf": [ - { - "$ref": "#/$defs/ImmunolabelClass" - } - ], + "$ref": "#/$defs/ImmunolabelClass", "title": "Immunolabel class" }, "fluorophore": { @@ -2013,11 +1991,7 @@ "title": "Mass of antibody" }, "mass_unit": { - "allOf": [ - { - "$ref": "#/$defs/MassUnit" - } - ], + "$ref": "#/$defs/MassUnit", "default": "microgram", "title": "Mass unit" }, @@ -2485,11 +2459,7 @@ "title": "Port index" }, "additional_settings": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "title": "Additional parameters" }, @@ -2531,11 +2501,7 @@ "title": "Date surface replaced" }, "size": { - "allOf": [ - { - "$ref": "#/$defs/Size3d" - } - ], + "$ref": "#/$defs/Size3d", "title": "3D Size" }, "objects_in_arena": { @@ -2595,11 +2561,7 @@ "title": "Amplitude modulation frequency" }, "frequency_unit": { - "allOf": [ - { - "$ref": "#/$defs/FrequencyUnit" - } - ], + "$ref": "#/$defs/FrequencyUnit", "default": "hertz", "title": "Tone frequency unit" }, @@ -2682,11 +2644,7 @@ "description": "Description of an axis", "properties": { "name": { - "allOf": [ - { - "$ref": "#/$defs/AxisName" - } - ], + "$ref": "#/$defs/AxisName", "title": "Axis" }, "direction": { @@ -2774,6 +2732,37 @@ "title": "BEHAVIOR_VIDEOS", "type": "object" }, + "BICEPS_BRACHII": { + "properties": { + "name": { + "const": "biceps brachii", + "default": "biceps brachii", + "enum": [ + "biceps brachii" + ], + "title": "Name", + "type": "string" + }, + "registry": { + "$ref": "#/$defs/RegistryModel", + "default": { + "name": "Edinburgh Mouse Atlas Project", + "abbreviation": "EMAPA" + } + }, + "registry_identifier": { + "const": "EMAPA_19108", + "default": "EMAPA_19108", + "enum": [ + "EMAPA_19108" + ], + "title": "Registry Identifier", + "type": "string" + } + }, + "title": "BICEPS_BRACHII", + "type": "object" + }, "BackgroundStrain": { "description": "Animal background strain name", "enum": [ @@ -3434,21 +3423,13 @@ "type": "string" }, "input": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "description": "Calibration input", "title": "inputs" }, "output": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "description": "Calibration output", "title": "outputs" @@ -3599,11 +3580,7 @@ "title": "Port index" }, "additional_settings": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "title": "Additional parameters" }, @@ -3620,29 +3597,16 @@ "title": "Notes" }, "detector_type": { - "allOf": [ - { - "$ref": "#/$defs/DetectorType" - } - ], + "$ref": "#/$defs/DetectorType", "title": "Detector Type" }, "data_interface": { - "allOf": [ - { - "$ref": "#/$defs/DataInterface" - } - ], + "$ref": "#/$defs/DataInterface", "title": "Data interface" }, "cooling": { - "allOf": [ - { - "$ref": "#/$defs/Cooling" - } - ], - "default": "None", - "title": "Cooling" + "$ref": "#/$defs/Cooling", + "default": "None" }, "computer_name": { "anyOf": [ @@ -3673,11 +3637,7 @@ "title": "Frame rate (Hz)" }, "frame_rate_unit": { - "allOf": [ - { - "$ref": "#/$defs/FrequencyUnit" - } - ], + "$ref": "#/$defs/FrequencyUnit", "default": "hertz", "title": "Frame rate unit" }, @@ -3730,11 +3690,7 @@ "title": "Height of the sensor (pixels)" }, "size_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "pixel", "title": "Size unit" }, @@ -3775,11 +3731,7 @@ "title": "Bit depth" }, "bin_mode": { - "allOf": [ - { - "$ref": "#/$defs/BinMode" - } - ], + "$ref": "#/$defs/BinMode", "default": "None", "title": "Detector binning mode" }, @@ -3808,11 +3760,7 @@ "title": "Bin height" }, "bin_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "pixel", "title": "Bin size unit" }, @@ -3880,11 +3828,7 @@ "title": "Crop width" }, "crop_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "pixel", "title": "Crop size unit" }, @@ -3943,27 +3887,15 @@ "type": "string" }, "camera_target": { - "allOf": [ - { - "$ref": "#/$defs/CameraTarget" - } - ], + "$ref": "#/$defs/CameraTarget", "title": "Camera target" }, "camera": { - "allOf": [ - { - "$ref": "#/$defs/Camera" - } - ], + "$ref": "#/$defs/Camera", "title": "Camera" }, "lens": { - "allOf": [ - { - "$ref": "#/$defs/Lens" - } - ], + "$ref": "#/$defs/Lens", "title": "Lens" }, "filter": { @@ -4065,20 +3997,12 @@ "title": "DV" }, "unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "micrometer", "title": "Coordinate unit" }, "ccf_version": { - "allOf": [ - { - "$ref": "#/$defs/CcfVersion" - } - ], + "$ref": "#/$defs/CcfVersion", "default": "CCFv3", "title": "CCF version" } @@ -4141,11 +4065,7 @@ "type": "integer" }, "excitation_wavelength_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "nanometer", "title": "Laser wavelength unit" }, @@ -4155,11 +4075,7 @@ "type": "number" }, "excitation_power_unit": { - "allOf": [ - { - "$ref": "#/$defs/PowerUnit" - } - ], + "$ref": "#/$defs/PowerUnit", "default": "milliwatt", "title": "Laser power unit" }, @@ -4180,11 +4096,7 @@ "title": "Dilation (pixels)" }, "dilation_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "pixel", "title": "Dilation unit" }, @@ -4312,11 +4224,7 @@ "title": "Position Z" }, "unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "micrometer", "title": "Position unit" } @@ -4359,11 +4267,7 @@ "type": "string" }, "craniotomy_type": { - "allOf": [ - { - "$ref": "#/$defs/CraniotomyType" - } - ], + "$ref": "#/$defs/CraniotomyType", "title": "Craniotomy type" }, "craniotomy_hemisphere": { @@ -4395,11 +4299,7 @@ "title": "Bregma to lambda (mm)" }, "bregma_to_lambda_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "millimeter", "title": "Bregma to lambda unit" }, @@ -4455,11 +4355,7 @@ "title": "Recovery time" }, "recovery_time_unit": { - "allOf": [ - { - "$ref": "#/$defs/TimeUnit" - } - ], + "$ref": "#/$defs/TimeUnit", "default": "minute", "title": "Recovery time unit" } @@ -4506,11 +4402,7 @@ "type": "string" }, "channel_type": { - "allOf": [ - { - "$ref": "#/$defs/DaqChannelType" - } - ], + "$ref": "#/$defs/DaqChannelType", "title": "DAQ channel type" }, "port": { @@ -4553,11 +4445,7 @@ "title": "DAQ channel sample rate (Hz)" }, "sample_rate_unit": { - "allOf": [ - { - "$ref": "#/$defs/FrequencyUnit" - } - ], + "$ref": "#/$defs/FrequencyUnit", "default": "hertz", "title": "Sample rate unit" }, @@ -4687,11 +4575,7 @@ "title": "Port index" }, "additional_settings": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "title": "Additional parameters" }, @@ -4708,11 +4592,7 @@ "title": "Notes" }, "data_interface": { - "allOf": [ - { - "$ref": "#/$defs/DataInterface" - } - ], + "$ref": "#/$defs/DataInterface", "title": "Type of connection to PC" }, "computer_name": { @@ -4761,6 +4641,37 @@ "title": "DAQDevice", "type": "object" }, + "DELTOID": { + "properties": { + "name": { + "const": "deltoid", + "default": "deltoid", + "enum": [ + "deltoid" + ], + "title": "Name", + "type": "string" + }, + "registry": { + "$ref": "#/$defs/RegistryModel", + "default": { + "name": "Edinburgh Mouse Atlas Project", + "abbreviation": "EMAPA" + } + }, + "registry_identifier": { + "const": "EMAPA_18177", + "default": "EMAPA_18177", + "enum": [ + "EMAPA_18177" + ], + "title": "Registry Identifier", + "type": "string" + } + }, + "title": "DELTOID", + "type": "object" + }, "DODOTRONIC": { "properties": { "name": { @@ -4872,10 +4783,10 @@ "type": "string" }, "schema_version": { - "const": "1.0.0", - "default": "1.0.0", + "const": "1.0.1", + "default": "1.0.1", "enum": [ - "1.0.0" + "1.0.1" ], "title": "Schema Version", "type": "string" @@ -5051,11 +4962,7 @@ "type": "array" }, "data_level": { - "allOf": [ - { - "$ref": "#/$defs/DataLevel" - } - ], + "$ref": "#/$defs/DataLevel", "description": "level of processing that data has undergone", "title": "Data Level" }, @@ -5243,11 +5150,7 @@ "description": "Description of a single processing step", "properties": { "name": { - "allOf": [ - { - "$ref": "#/$defs/ProcessName" - } - ], + "$ref": "#/$defs/ProcessName", "title": "Name" }, "software_version": { @@ -5294,19 +5197,11 @@ "title": "Code version" }, "parameters": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "title": "Parameters" }, "outputs": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "description": "Output parameters", "title": "Outputs" @@ -5322,6 +5217,18 @@ ], "default": null, "title": "Notes" + }, + "resources": { + "anyOf": [ + { + "$ref": "#/$defs/ResourceUsage" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Process resource usage" } }, "required": [ @@ -5462,11 +5369,7 @@ "title": "Port index" }, "additional_settings": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "title": "Additional parameters" }, @@ -5483,29 +5386,16 @@ "title": "Notes" }, "detector_type": { - "allOf": [ - { - "$ref": "#/$defs/DetectorType" - } - ], + "$ref": "#/$defs/DetectorType", "title": "Detector Type" }, "data_interface": { - "allOf": [ - { - "$ref": "#/$defs/DataInterface" - } - ], + "$ref": "#/$defs/DataInterface", "title": "Data interface" }, "cooling": { - "allOf": [ - { - "$ref": "#/$defs/Cooling" - } - ], - "default": "None", - "title": "Cooling" + "$ref": "#/$defs/Cooling", + "default": "None" }, "computer_name": { "anyOf": [ @@ -5536,11 +5426,7 @@ "title": "Frame rate (Hz)" }, "frame_rate_unit": { - "allOf": [ - { - "$ref": "#/$defs/FrequencyUnit" - } - ], + "$ref": "#/$defs/FrequencyUnit", "default": "hertz", "title": "Frame rate unit" }, @@ -5593,11 +5479,7 @@ "title": "Height of the sensor (pixels)" }, "size_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "pixel", "title": "Size unit" }, @@ -5638,11 +5520,7 @@ "title": "Bit depth" }, "bin_mode": { - "allOf": [ - { - "$ref": "#/$defs/BinMode" - } - ], + "$ref": "#/$defs/BinMode", "default": "None", "title": "Detector binning mode" }, @@ -5671,11 +5549,7 @@ "title": "Bin height" }, "bin_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "pixel", "title": "Bin size unit" }, @@ -5743,11 +5617,7 @@ "title": "Crop width" }, "crop_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "pixel", "title": "Crop size unit" }, @@ -5817,20 +5687,12 @@ "title": "Exposure time (ms)" }, "exposure_time_unit": { - "allOf": [ - { - "$ref": "#/$defs/TimeUnit" - } - ], + "$ref": "#/$defs/TimeUnit", "default": "millisecond", "title": "Exposure time unit" }, "trigger_type": { - "allOf": [ - { - "$ref": "#/$defs/TriggerType" - } - ], + "$ref": "#/$defs/TriggerType", "title": "Trigger type" } }, @@ -6288,11 +6150,7 @@ "title": "Port index" }, "additional_settings": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "title": "Additional parameters" }, @@ -6767,11 +6625,7 @@ "title": "Port index" }, "additional_settings": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "title": "Additional parameters" }, @@ -6808,11 +6662,7 @@ "type": "integer" }, "padding_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "pixel", "title": "Padding unit" }, @@ -6828,11 +6678,7 @@ "title": "DMD Pixel size" }, "pixel_size_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "micrometer", "title": "Pixel size unit" }, @@ -6866,11 +6712,7 @@ "type": "array" }, "dmd_curtain_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "pixel", "title": "dmd_curtain_unit" }, @@ -6882,11 +6724,7 @@ "type": "array" }, "line_shear_units": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "pixel", "title": "Line shear units" } @@ -7348,11 +7186,7 @@ "title": "Port index" }, "additional_settings": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "title": "Additional parameters" }, @@ -7406,11 +7240,7 @@ "title": "Radius (cm)" }, "radius_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "centimeter", "title": "radius unit" }, @@ -7504,11 +7334,7 @@ "title": "Module Angle (deg)" }, "angle_unit": { - "allOf": [ - { - "$ref": "#/$defs/AngleUnit" - } - ], + "$ref": "#/$defs/AngleUnit", "default": "degrees", "title": "Angle unit" }, @@ -7801,6 +7627,130 @@ "title": "EXASPIM", "type": "object" }, + "EXTENSOR_CARPI_RADIALIS_LONGUS": { + "properties": { + "name": { + "const": "extensor carpi radialis longus", + "default": "extensor carpi radialis longus", + "enum": [ + "extensor carpi radialis longus" + ], + "title": "Name", + "type": "string" + }, + "registry": { + "$ref": "#/$defs/RegistryModel", + "default": { + "name": "Edinburgh Mouse Atlas Project", + "abbreviation": "EMAPA" + } + }, + "registry_identifier": { + "const": "EMAPA_36189", + "default": "EMAPA_36189", + "enum": [ + "EMAPA_36189" + ], + "title": "Registry Identifier", + "type": "string" + } + }, + "title": "EXTENSOR_CARPI_RADIALIS_LONGUS", + "type": "object" + }, + "EXTENSOR_CARPI_ULNARIS": { + "properties": { + "name": { + "const": "extensor carpi ulnaris", + "default": "extensor carpi ulnaris", + "enum": [ + "extensor carpi ulnaris" + ], + "title": "Name", + "type": "string" + }, + "registry": { + "$ref": "#/$defs/RegistryModel", + "default": { + "name": "Edinburgh Mouse Atlas Project", + "abbreviation": "EMAPA" + } + }, + "registry_identifier": { + "const": "EMAPA_36190", + "default": "EMAPA_36190", + "enum": [ + "EMAPA_36190" + ], + "title": "Registry Identifier", + "type": "string" + } + }, + "title": "EXTENSOR_CARPI_ULNARIS", + "type": "object" + }, + "EXTENSOR_DIGITORUM_COMMUNIS": { + "properties": { + "name": { + "const": "extensor digitorum communis", + "default": "extensor digitorum communis", + "enum": [ + "extensor digitorum communis" + ], + "title": "Name", + "type": "string" + }, + "registry": { + "$ref": "#/$defs/RegistryModel", + "default": { + "name": "Edinburgh Mouse Atlas Project", + "abbreviation": "EMAPA" + } + }, + "registry_identifier": { + "const": "EMAPA_36191", + "default": "EMAPA_36191", + "enum": [ + "EMAPA_36191" + ], + "title": "Registry Identifier", + "type": "string" + } + }, + "title": "EXTENSOR_DIGITORUM_COMMUNIS", + "type": "object" + }, + "EXTENSOR_DIGITORUM_LATERALIS": { + "properties": { + "name": { + "const": "extensor digitorum lateralis", + "default": "extensor digitorum lateralis", + "enum": [ + "extensor digitorum lateralis" + ], + "title": "Name", + "type": "string" + }, + "registry": { + "$ref": "#/$defs/RegistryModel", + "default": { + "name": "Edinburgh Mouse Atlas Project", + "abbreviation": "EMAPA" + } + }, + "registry_identifier": { + "const": "EMAPA_36192", + "default": "EMAPA_36192", + "enum": [ + "EMAPA_36192" + ], + "title": "Registry Identifier", + "type": "string" + } + }, + "title": "EXTENSOR_DIGITORUM_LATERALIS", + "type": "object" + }, "Enclosure": { "additionalProperties": false, "description": "Description of an enclosure", @@ -8242,11 +8192,7 @@ "title": "Port index" }, "additional_settings": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "title": "Additional parameters" }, @@ -8263,11 +8209,7 @@ "title": "Notes" }, "size": { - "allOf": [ - { - "$ref": "#/$defs/Size3d" - } - ], + "$ref": "#/$defs/Size3d", "title": "Size" }, "internal_material": { @@ -8771,11 +8713,7 @@ "title": "Port index" }, "additional_settings": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "title": "Additional parameters" }, @@ -8792,11 +8730,7 @@ "title": "Notes" }, "probe_model": { - "allOf": [ - { - "$ref": "#/$defs/ProbeModel" - } - ], + "$ref": "#/$defs/ProbeModel", "title": "Probe model" }, "lasers": { @@ -8876,6 +8810,99 @@ "title": "FIP", "type": "object" }, + "FLEXOR_CARPI_RADIALIS": { + "properties": { + "name": { + "const": "flexor carpi radialis", + "default": "flexor carpi radialis", + "enum": [ + "flexor carpi radialis" + ], + "title": "Name", + "type": "string" + }, + "registry": { + "$ref": "#/$defs/RegistryModel", + "default": { + "name": "Edinburgh Mouse Atlas Project", + "abbreviation": "EMAPA" + } + }, + "registry_identifier": { + "const": "EMAPA_36197", + "default": "EMAPA_36197", + "enum": [ + "EMAPA_36197" + ], + "title": "Registry Identifier", + "type": "string" + } + }, + "title": "FLEXOR_CARPI_RADIALIS", + "type": "object" + }, + "FLEXOR_CARPI_ULNARIS": { + "properties": { + "name": { + "const": "flexor carpi ulnaris", + "default": "flexor carpi ulnaris", + "enum": [ + "flexor carpi ulnaris" + ], + "title": "Name", + "type": "string" + }, + "registry": { + "$ref": "#/$defs/RegistryModel", + "default": { + "name": "Edinburgh Mouse Atlas Project", + "abbreviation": "EMAPA" + } + }, + "registry_identifier": { + "const": "EMAPA_36198", + "default": "EMAPA_36198", + "enum": [ + "EMAPA_36198" + ], + "title": "Registry Identifier", + "type": "string" + } + }, + "title": "FLEXOR_CARPI_ULNARIS", + "type": "object" + }, + "FLEXOR_DIGITORUM_PROFUNDUS": { + "properties": { + "name": { + "const": "flexor digitorum profundus", + "default": "flexor digitorum profundus", + "enum": [ + "flexor digitorum profundus" + ], + "title": "Name", + "type": "string" + }, + "registry": { + "$ref": "#/$defs/RegistryModel", + "default": { + "name": "Edinburgh Mouse Atlas Project", + "abbreviation": "EMAPA" + } + }, + "registry_identifier": { + "const": "EMAPA_19319", + "default": "EMAPA_19319", + "enum": [ + "EMAPA_19319" + ], + "title": "Registry Identifier", + "type": "string" + } + }, + "title": "FLEXOR_DIGITORUM_PROFUNDUS", + "type": "object" + }, "FLIR": { "properties": { "name": { @@ -8952,6 +8979,37 @@ "title": "FMOST", "type": "object" }, + "FORELIMB": { + "properties": { + "name": { + "const": "forelimb", + "default": "forelimb", + "enum": [ + "forelimb" + ], + "title": "Name", + "type": "string" + }, + "registry": { + "$ref": "#/$defs/RegistryModel", + "default": { + "name": "Edinburgh Mouse Atlas Project", + "abbreviation": "EMAPA" + } + }, + "registry_identifier": { + "const": "EMAPA_17412", + "default": "EMAPA_17412", + "enum": [ + "EMAPA_17412" + ], + "title": "Registry Identifier", + "type": "string" + } + }, + "title": "FORELIMB", + "type": "object" + }, "FUJINON": { "properties": { "name": { @@ -9046,11 +9104,7 @@ "title": "Output power (uW)" }, "output_power_unit": { - "allOf": [ - { - "$ref": "#/$defs/PowerUnit" - } - ], + "$ref": "#/$defs/PowerUnit", "default": "microwatt", "title": "Output power unit" }, @@ -9131,11 +9185,7 @@ "title": "Module Angle (deg)" }, "angle_unit": { - "allOf": [ - { - "$ref": "#/$defs/AngleUnit" - } - ], + "$ref": "#/$defs/AngleUnit", "default": "degrees", "title": "Angle unit" }, @@ -9220,11 +9270,7 @@ "type": "array" }, "manipulator_coordinates": { - "allOf": [ - { - "$ref": "#/$defs/Coordinates3d" - } - ], + "$ref": "#/$defs/Coordinates3d", "title": "Manipulator coordinates" }, "anatomical_coordinates": { @@ -9271,11 +9317,7 @@ "title": "Surface z" }, "surface_z_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "micrometer", "title": "Surface z unit" }, @@ -9763,11 +9805,7 @@ "title": "Port index" }, "additional_settings": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "title": "Additional parameters" }, @@ -9795,11 +9833,7 @@ "title": "Core diameter (um)" }, "core_diameter_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "micrometer", "title": "Core diameter unit" }, @@ -9854,11 +9888,7 @@ "title": "Total length (mm)" }, "length_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "millimeter", "title": "Length unit" } @@ -9885,11 +9915,7 @@ "type": "integer" }, "imaging_depth_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "micrometer", "title": "Imaging depth unit" }, @@ -9920,11 +9946,7 @@ "title": "FOV coordinate AP" }, "fov_coordinate_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "micrometer", "title": "FOV coordinate unit" }, @@ -9942,11 +9964,7 @@ "type": "integer" }, "fov_size_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "pixel", "title": "FOV size unit" }, @@ -9986,11 +10004,7 @@ "title": "Frame rate (Hz)" }, "frame_rate_unit": { - "allOf": [ - { - "$ref": "#/$defs/FrequencyUnit" - } - ], + "$ref": "#/$defs/FrequencyUnit", "default": "hertz", "title": "Frame rate unit" }, @@ -10024,11 +10038,7 @@ "title": "Power" }, "power_unit": { - "allOf": [ - { - "$ref": "#/$defs/PowerUnit" - } - ], + "$ref": "#/$defs/PowerUnit", "default": "percent", "title": "Power unit" }, @@ -10060,11 +10070,7 @@ "title": "Z stage position of the fastz actuator for a given targeted depth" }, "scanfield_z_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "micrometer", "title": "Z stage position unit" }, @@ -10209,11 +10215,7 @@ "title": "Port index" }, "additional_settings": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "title": "Additional parameters" }, @@ -10230,11 +10232,7 @@ "title": "Notes" }, "filter_type": { - "allOf": [ - { - "$ref": "#/$defs/aind_data_schema__components__devices__FilterType" - } - ], + "$ref": "#/$defs/aind_data_schema__components__devices__FilterType", "title": "Type of filter" }, "diameter": { @@ -10283,17 +10281,14 @@ "title": "Height (mm)" }, "size_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "millimeter", "title": "Size unit" }, "thickness": { "anyOf": [ { + "minimum": 0.0, "type": "number" }, { @@ -10307,11 +10302,7 @@ "title": "Thickness (mm)" }, "thickness_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "millimeter", "title": "Thickness unit" }, @@ -10364,11 +10355,7 @@ "title": "Center wavelength (nm)" }, "wavelength_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "nanometer", "title": "Wavelength unit" }, @@ -11095,11 +11082,7 @@ "title": "Species" }, "gene": { - "allOf": [ - { - "$ref": "#/$defs/PIDName" - } - ], + "$ref": "#/$defs/PIDName", "title": "Gene name, accession number, and registry" }, "probe_sequences": { @@ -11110,11 +11093,7 @@ "type": "array" }, "readout": { - "allOf": [ - { - "$ref": "#/$defs/HCRReadout" - } - ], + "$ref": "#/$defs/HCRReadout", "title": "Readout" }, "initiator_name": { @@ -11546,20 +11525,12 @@ "type": "integer" }, "excitation_wavelength_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "nanometer", "title": "Excitation wavelength unit" }, "stain_type": { - "allOf": [ - { - "$ref": "#/$defs/StainType" - } - ], + "$ref": "#/$defs/StainType", "title": "Stain type" }, "initiator_name": { @@ -11612,6 +11583,68 @@ "title": "HCRSeries", "type": "object" }, + "HEAD": { + "properties": { + "name": { + "const": "head", + "default": "head", + "enum": [ + "head" + ], + "title": "Name", + "type": "string" + }, + "registry": { + "$ref": "#/$defs/RegistryModel", + "default": { + "name": "Edinburgh Mouse Atlas Project", + "abbreviation": "EMAPA" + } + }, + "registry_identifier": { + "const": "EMAPA_31858", + "default": "EMAPA_31858", + "enum": [ + "EMAPA_31858" + ], + "title": "Registry Identifier", + "type": "string" + } + }, + "title": "HEAD", + "type": "object" + }, + "HINDLIMB": { + "properties": { + "name": { + "const": "hindlimb", + "default": "hindlimb", + "enum": [ + "hindlimb" + ], + "title": "Name", + "type": "string" + }, + "registry": { + "$ref": "#/$defs/RegistryModel", + "default": { + "name": "Edinburgh Mouse Atlas Project", + "abbreviation": "EMAPA" + } + }, + "registry_identifier": { + "const": "EMAPA_17458", + "default": "EMAPA_17458", + "enum": [ + "EMAPA_17458" + ], + "title": "Registry Identifier", + "type": "string" + } + }, + "title": "HINDLIMB", + "type": "object" + }, "HOMO_SAPIENS": { "properties": { "name": { @@ -11843,11 +11876,7 @@ "title": "Port index" }, "additional_settings": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "title": "Additional parameters" }, @@ -11864,11 +11893,7 @@ "title": "Notes" }, "data_interface": { - "allOf": [ - { - "$ref": "#/$defs/DataInterface" - } - ], + "$ref": "#/$defs/DataInterface", "default": "USB", "title": "Data interface" }, @@ -12542,11 +12567,7 @@ "title": "Port index" }, "additional_settings": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "title": "Additional parameters" }, @@ -13036,19 +13057,11 @@ "description": "Description of an image axis", "properties": { "name": { - "allOf": [ - { - "$ref": "#/$defs/AxisName" - } - ], + "$ref": "#/$defs/AxisName", "title": "Name" }, "direction": { - "allOf": [ - { - "$ref": "#/$defs/AnatomicalDirection" - } - ], + "$ref": "#/$defs/AnatomicalDirection", "description": "Tissue direction as the value of axis increases. If Other describe in notes." }, "dimension": { @@ -13057,11 +13070,7 @@ "type": "integer" }, "unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "micrometer", "title": "Axis physical units" } @@ -13113,11 +13122,7 @@ "description": "Description of immersion medium", "properties": { "medium": { - "allOf": [ - { - "$ref": "#/$defs/ImmersionMedium" - } - ], + "$ref": "#/$defs/ImmersionMedium", "title": "Immersion medium" }, "refractive_index": { @@ -13176,10 +13181,10 @@ "type": "string" }, "schema_version": { - "const": "1.0.0", - "default": "1.0.0", + "const": "1.0.1", + "default": "1.0.1", "enum": [ - "1.0.0" + "1.0.1" ], "title": "Schema Version", "type": "string" @@ -13203,11 +13208,7 @@ "type": "string" }, "instrument_type": { - "allOf": [ - { - "$ref": "#/$defs/ImagingInstrumentType" - } - ], + "$ref": "#/$defs/ImagingInstrumentType", "title": "Instrument type" }, "manufacturer": { @@ -13772,7 +13773,14 @@ "properties": { "injection_materials": { "items": { - "anyOf": [ + "discriminator": { + "mapping": { + "Reagent": "#/$defs/NonViralMaterial", + "Virus": "#/$defs/ViralMaterial" + }, + "propertyName": "material_type" + }, + "oneOf": [ { "$ref": "#/$defs/ViralMaterial" }, @@ -13801,11 +13809,7 @@ "title": "Recovery time" }, "recovery_time_unit": { - "allOf": [ - { - "$ref": "#/$defs/TimeUnit" - } - ], + "$ref": "#/$defs/TimeUnit", "default": "minute", "title": "Recovery time unit" }, @@ -13825,11 +13829,7 @@ "title": "Injection duration" }, "injection_duration_unit": { - "allOf": [ - { - "$ref": "#/$defs/TimeUnit" - } - ], + "$ref": "#/$defs/TimeUnit", "default": "minute", "title": "Injection duration unit" }, @@ -13887,11 +13887,7 @@ "type": "array" }, "injection_coordinate_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "millimeter", "title": "Injection coordinate unit" }, @@ -13924,11 +13920,7 @@ "title": "Bregma to lambda (mm)" }, "bregma_to_lambda_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "millimeter", "title": "Bregma to lambda unit" }, @@ -13944,11 +13936,7 @@ "title": "Injection angle (deg)" }, "injection_angle_unit": { - "allOf": [ - { - "$ref": "#/$defs/AngleUnit" - } - ], + "$ref": "#/$defs/AngleUnit", "default": "degrees", "title": "Injection angle unit" }, @@ -14001,11 +13989,7 @@ "type": "array" }, "injection_volume_unit": { - "allOf": [ - { - "$ref": "#/$defs/VolumeUnit" - } - ], + "$ref": "#/$defs/VolumeUnit", "default": "nanoliter", "title": "Injection volume unit" } @@ -14028,7 +14012,14 @@ "properties": { "injection_materials": { "items": { - "anyOf": [ + "discriminator": { + "mapping": { + "Reagent": "#/$defs/NonViralMaterial", + "Virus": "#/$defs/ViralMaterial" + }, + "propertyName": "material_type" + }, + "oneOf": [ { "$ref": "#/$defs/ViralMaterial" }, @@ -14057,11 +14048,7 @@ "title": "Recovery time" }, "recovery_time_unit": { - "allOf": [ - { - "$ref": "#/$defs/TimeUnit" - } - ], + "$ref": "#/$defs/TimeUnit", "default": "minute", "title": "Recovery time unit" }, @@ -14081,11 +14068,7 @@ "title": "Injection duration" }, "injection_duration_unit": { - "allOf": [ - { - "$ref": "#/$defs/TimeUnit" - } - ], + "$ref": "#/$defs/TimeUnit", "default": "minute", "title": "Injection duration unit" }, @@ -14143,11 +14126,7 @@ "type": "array" }, "injection_coordinate_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "millimeter", "title": "Injection coordinate unit" }, @@ -14180,11 +14159,7 @@ "title": "Bregma to lambda (mm)" }, "bregma_to_lambda_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "millimeter", "title": "Bregma to lambda unit" }, @@ -14200,11 +14175,7 @@ "title": "Injection angle (deg)" }, "injection_angle_unit": { - "allOf": [ - { - "$ref": "#/$defs/AngleUnit" - } - ], + "$ref": "#/$defs/AngleUnit", "default": "degrees", "title": "Injection angle unit" }, @@ -14257,11 +14228,7 @@ "type": "array" }, "injection_volume_unit": { - "allOf": [ - { - "$ref": "#/$defs/VolumeUnit" - } - ], + "$ref": "#/$defs/VolumeUnit", "default": "nanoliter", "title": "Injection volume unit" } @@ -14284,7 +14251,14 @@ "properties": { "injection_materials": { "items": { - "anyOf": [ + "discriminator": { + "mapping": { + "Reagent": "#/$defs/NonViralMaterial", + "Virus": "#/$defs/ViralMaterial" + }, + "propertyName": "material_type" + }, + "oneOf": [ { "$ref": "#/$defs/ViralMaterial" }, @@ -14313,11 +14287,7 @@ "title": "Recovery time" }, "recovery_time_unit": { - "allOf": [ - { - "$ref": "#/$defs/TimeUnit" - } - ], + "$ref": "#/$defs/TimeUnit", "default": "minute", "title": "Recovery time unit" }, @@ -14337,11 +14307,7 @@ "title": "Injection duration" }, "injection_duration_unit": { - "allOf": [ - { - "$ref": "#/$defs/TimeUnit" - } - ], + "$ref": "#/$defs/TimeUnit", "default": "minute", "title": "Injection duration unit" }, @@ -14383,11 +14349,7 @@ "title": "Injection volume (uL)" }, "injection_volume_unit": { - "allOf": [ - { - "$ref": "#/$defs/VolumeUnit" - } - ], + "$ref": "#/$defs/VolumeUnit", "default": "microliter", "title": "Injection volume unit" } @@ -14406,7 +14368,14 @@ "properties": { "injection_materials": { "items": { - "anyOf": [ + "discriminator": { + "mapping": { + "Reagent": "#/$defs/NonViralMaterial", + "Virus": "#/$defs/ViralMaterial" + }, + "propertyName": "material_type" + }, + "oneOf": [ { "$ref": "#/$defs/ViralMaterial" }, @@ -14435,11 +14404,7 @@ "title": "Recovery time" }, "recovery_time_unit": { - "allOf": [ - { - "$ref": "#/$defs/TimeUnit" - } - ], + "$ref": "#/$defs/TimeUnit", "default": "minute", "title": "Recovery time unit" }, @@ -14459,11 +14424,7 @@ "title": "Injection duration" }, "injection_duration_unit": { - "allOf": [ - { - "$ref": "#/$defs/TimeUnit" - } - ], + "$ref": "#/$defs/TimeUnit", "default": "minute", "title": "Injection duration unit" }, @@ -14521,11 +14482,7 @@ "type": "array" }, "injection_coordinate_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "millimeter", "title": "Injection coordinate unit" }, @@ -14558,11 +14515,7 @@ "title": "Bregma to lambda (mm)" }, "bregma_to_lambda_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "millimeter", "title": "Bregma to lambda unit" }, @@ -14578,11 +14531,7 @@ "title": "Injection angle (deg)" }, "injection_angle_unit": { - "allOf": [ - { - "$ref": "#/$defs/AngleUnit" - } - ], + "$ref": "#/$defs/AngleUnit", "default": "degrees", "title": "Injection angle unit" }, @@ -14631,11 +14580,7 @@ "title": "Injection current (uA)" }, "injection_current_unit": { - "allOf": [ - { - "$ref": "#/$defs/CurrentUnit" - } - ], + "$ref": "#/$defs/CurrentUnit", "default": "microamps", "title": "Injection current unit" }, @@ -14797,6 +14742,37 @@ "title": "JULABO", "type": "object" }, + "LATERAL_HEAD_OF_TRICEPS_BRACHII": { + "properties": { + "name": { + "const": "lateral head of triceps brachii", + "default": "lateral head of triceps brachii", + "enum": [ + "lateral head of triceps brachii" + ], + "title": "Name", + "type": "string" + }, + "registry": { + "$ref": "#/$defs/RegistryModel", + "default": { + "name": "Edinburgh Mouse Atlas Project", + "abbreviation": "EMAPA" + } + }, + "registry_identifier": { + "const": "EMAPA_36184", + "default": "EMAPA_36184", + "enum": [ + "EMAPA_36184" + ], + "title": "Registry Identifier", + "type": "string" + } + }, + "title": "LATERAL_HEAD_OF_TRICEPS_BRACHII", + "type": "object" + }, "LEICA": { "properties": { "name": { @@ -14972,6 +14948,68 @@ "title": "LOAD_CELLS", "type": "object" }, + "LONG_HEAD_OF_BICEPS_BRACHII": { + "properties": { + "name": { + "const": "long head of biceps brachii", + "default": "long head of biceps brachii", + "enum": [ + "long head of biceps brachii" + ], + "title": "Name", + "type": "string" + }, + "registry": { + "$ref": "#/$defs/RegistryModel", + "default": { + "name": "Edinburgh Mouse Atlas Project", + "abbreviation": "EMAPA" + } + }, + "registry_identifier": { + "const": "EMAPA_25054", + "default": "EMAPA_25054", + "enum": [ + "EMAPA_25054" + ], + "title": "Registry Identifier", + "type": "string" + } + }, + "title": "LONG_HEAD_OF_BICEPS_BRACHII", + "type": "object" + }, + "LONG_HEAD_OF_TRICEPS_BRACHII": { + "properties": { + "name": { + "const": "long head of triceps brachii", + "default": "long head of triceps brachii", + "enum": [ + "long head of triceps brachii" + ], + "title": "Name", + "type": "string" + }, + "registry": { + "$ref": "#/$defs/RegistryModel", + "default": { + "name": "Edinburgh Mouse Atlas Project", + "abbreviation": "EMAPA" + } + }, + "registry_identifier": { + "const": "EMAPA_36185", + "default": "EMAPA_36185", + "enum": [ + "EMAPA_36185" + ], + "title": "Registry Identifier", + "type": "string" + } + }, + "title": "LONG_HEAD_OF_TRICEPS_BRACHII", + "type": "object" + }, "LUMEN_DYNAMICS": { "properties": { "name": { @@ -15451,11 +15489,7 @@ "title": "Port index" }, "additional_settings": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "title": "Additional parameters" }, @@ -15496,11 +15530,7 @@ "title": "Wavelength maximum (nm)" }, "wavelength_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "nanometer", "title": "Wavelength unit" }, @@ -15517,11 +15547,7 @@ "title": "Temperature (K)" }, "temperature_unit": { - "allOf": [ - { - "$ref": "#/$defs/TemperatureUnit" - } - ], + "$ref": "#/$defs/TemperatureUnit", "default": "Kelvin", "title": "Temperature unit" } @@ -15633,11 +15659,7 @@ "title": "Port index" }, "additional_settings": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "title": "Additional parameters" }, @@ -15658,11 +15680,7 @@ "type": "integer" }, "wavelength_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "nanometer", "title": "Wavelength unit" }, @@ -15682,11 +15700,7 @@ "title": "Maximum power (mW)" }, "power_unit": { - "allOf": [ - { - "$ref": "#/$defs/PowerUnit" - } - ], + "$ref": "#/$defs/PowerUnit", "default": "milliwatt", "title": "Power unit" }, @@ -15705,6 +15719,8 @@ "coupling_efficiency": { "anyOf": [ { + "maximum": 100.0, + "minimum": 0.0, "type": "number" }, { @@ -15766,19 +15782,11 @@ "type": "array" }, "collimator": { - "allOf": [ - { - "$ref": "#/$defs/Device" - } - ], + "$ref": "#/$defs/Device", "title": "Collimator" }, "fiber": { - "allOf": [ - { - "$ref": "#/$defs/Patch" - } - ], + "$ref": "#/$defs/Patch", "title": "Fiber patch" } }, @@ -15815,11 +15823,7 @@ "type": "integer" }, "wavelength_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "nanometer", "title": "Wavelength unit" }, @@ -15839,11 +15843,7 @@ "title": "Excitation power (mW)" }, "excitation_power_unit": { - "allOf": [ - { - "$ref": "#/$defs/PowerUnit" - } - ], + "$ref": "#/$defs/PowerUnit", "default": "milliwatt", "title": "Excitation power unit" } @@ -15988,11 +15988,7 @@ "title": "Port index" }, "additional_settings": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "title": "Additional parameters" }, @@ -16024,11 +16020,7 @@ "title": "Focal length of the lens (mm)" }, "focal_length_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "millimeter", "title": "Focal length unit" }, @@ -16045,11 +16037,7 @@ "title": "Size (inches)" }, "lens_size_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "inch", "title": "Lens size unit" }, @@ -16066,11 +16054,7 @@ "title": "Optimized wavelength range (nm)" }, "wavelength_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "nanometer", "title": "Wavelength unit" }, @@ -16233,11 +16217,7 @@ "title": "Port index" }, "additional_settings": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "title": "Additional parameters" }, @@ -16258,11 +16238,7 @@ "type": "integer" }, "wavelength_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "nanometer", "title": "Wavelength unit" }, @@ -16279,11 +16255,7 @@ "title": "Bandwidth (FWHM)" }, "bandwidth_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "nanometer", "title": "Bandwidth unit" } @@ -16329,11 +16301,7 @@ "title": "Excitation power (mW)" }, "excitation_power_unit": { - "allOf": [ - { - "$ref": "#/$defs/PowerUnit" - } - ], + "$ref": "#/$defs/PowerUnit", "default": "milliwatt", "title": "Excitation power unit" } @@ -16488,6 +16456,37 @@ "title": "MEADOWLARK_OPTICS", "type": "object" }, + "MEDIAL_HEAD_OF_TRICEPS_BRACHII": { + "properties": { + "name": { + "const": "medial head of triceps brachii", + "default": "medial head of triceps brachii", + "enum": [ + "medial head of triceps brachii" + ], + "title": "Name", + "type": "string" + }, + "registry": { + "$ref": "#/$defs/RegistryModel", + "default": { + "name": "Edinburgh Mouse Atlas Project", + "abbreviation": "EMAPA" + } + }, + "registry_identifier": { + "const": "EMAPA_36186", + "default": "EMAPA_36186", + "enum": [ + "EMAPA_36186" + ], + "title": "Registry Identifier", + "type": "string" + } + }, + "title": "MEDIAL_HEAD_OF_TRICEPS_BRACHII", + "type": "object" + }, "MESOSPIM": { "properties": { "name": { @@ -16761,11 +16760,7 @@ "type": "integer" }, "scan_type": { - "allOf": [ - { - "$ref": "#/$defs/ScanType" - } - ], + "$ref": "#/$defs/ScanType", "title": "Scan type" }, "primary_scan": { @@ -16786,11 +16781,7 @@ "title": "MRI scanner" }, "scan_sequence_type": { - "allOf": [ - { - "$ref": "#/$defs/MriScanSequence" - } - ], + "$ref": "#/$defs/MriScanSequence", "title": "Scan sequence" }, "rare_factor": { @@ -16832,11 +16823,7 @@ "title": "Effective echo time (ms)" }, "echo_time_unit": { - "allOf": [ - { - "$ref": "#/$defs/TimeUnit" - } - ], + "$ref": "#/$defs/TimeUnit", "default": "millisecond", "title": "Echo time unit" }, @@ -16852,11 +16839,7 @@ "title": "Repetition time (ms)" }, "repetition_time_unit": { - "allOf": [ - { - "$ref": "#/$defs/TimeUnit" - } - ], + "$ref": "#/$defs/TimeUnit", "default": "millisecond", "title": "Repetition time unit" }, @@ -16885,11 +16868,7 @@ "title": "Scan position" }, "subject_position": { - "allOf": [ - { - "$ref": "#/$defs/SubjectPosition" - } - ], + "$ref": "#/$defs/SubjectPosition", "title": "Subject position" }, "voxel_sizes": { @@ -16919,11 +16898,7 @@ "type": "array" }, "additional_scan_parameters": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "title": "Parameters" }, "notes": { @@ -17172,11 +17147,7 @@ "title": "Port index" }, "additional_settings": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "title": "Additional parameters" }, @@ -17231,11 +17202,7 @@ "title": "Module Angle (deg)" }, "angle_unit": { - "allOf": [ - { - "$ref": "#/$defs/AngleUnit" - } - ], + "$ref": "#/$defs/AngleUnit", "default": "degrees", "title": "Angle unit" }, @@ -17320,11 +17287,7 @@ "type": "array" }, "manipulator_coordinates": { - "allOf": [ - { - "$ref": "#/$defs/Coordinates3d" - } - ], + "$ref": "#/$defs/Coordinates3d", "title": "Manipulator coordinates" }, "anatomical_coordinates": { @@ -17371,11 +17334,7 @@ "title": "Surface z" }, "surface_z_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "micrometer", "title": "Surface z unit" }, @@ -17426,6 +17385,20 @@ "title": "MassUnit", "type": "string" }, + "MemoryUnit": { + "description": "Computer memory units", + "enum": [ + "Byte", + "Kilobyte", + "Megabyte", + "Gigabyte", + "Terabyte", + "Petabyte", + "Exabyte" + ], + "title": "MemoryUnit", + "type": "string" + }, "MetadataStatus": { "description": "Status of Metadata", "enum": [ @@ -17526,11 +17499,7 @@ "title": "Port index" }, "additional_settings": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "title": "Additional parameters" }, @@ -17560,11 +17529,7 @@ "type": "integer" }, "size_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "pixel", "title": "Size unit" }, @@ -17580,11 +17545,7 @@ "title": "Viewing distance (cm)" }, "viewing_distance_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "centimeter", "title": "Viewing distance unit" }, @@ -18083,11 +18044,509 @@ "title": "Port index" }, "additional_settings": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", + "default": {}, + "title": "Additional parameters" + }, + "notes": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Notes" + }, + "travel": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string" + } + ], + "title": "Travel of device (mm)" + }, + "travel_unit": { + "$ref": "#/$defs/SizeUnit", + "default": "millimeter", + "title": "Travel unit" + }, + "firmware": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Firmware" + } + }, + "required": [ + "name", + "travel" + ], + "title": "MotorizedStage", + "type": "object" + }, + "MriScanSequence": { + "description": "MRI scan sequence", + "enum": [ + "RARE", + "Other" + ], + "title": "MriScanSequence", + "type": "string" + }, + "MyomatrixArray": { + "additionalProperties": false, + "description": "Description of a Myomatrix array", + "properties": { + "device_type": { + "const": "Myomatrix Array", + "default": "Myomatrix Array", + "enum": [ + "Myomatrix Array" + ], + "title": "Device Type", + "type": "string" + }, + "name": { + "title": "Device name", + "type": "string" + }, + "serial_number": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Serial number" + }, + "manufacturer": { + "anyOf": [ + { + "discriminator": { + "mapping": { + "AA Opto Electronic": "#/$defs/AA_OPTO_ELECTRONIC", + "ASUS": "#/$defs/ASUS", + "Abcam": "#/$defs/ABCAM", + "Addgene": "#/$defs/ADDGENE", + "Ailipu Technology Co": "#/$defs/AILIPU", + "Allen Institute": "#/$defs/AI", + "Allen Institute for Brain Science": "#/$defs/AIBS", + "Allen Institute for Neural Dynamics": "#/$defs/AIND", + "Allied": "#/$defs/ALLIED", + "Applied Scientific Instrumentation": "#/$defs/ASI", + "Arecont Vision Costar": "#/$defs/ARECONT_VISION_COSTAR", + "Basler": "#/$defs/BASLER", + "Cambridge Technology": "#/$defs/CAMBRIDGE_TECHNOLOGY", + "Carl Zeiss": "#/$defs/CARL_ZEISS", + "Champalimaud Foundation": "#/$defs/CHAMPALIMAUD", + "Chan Zuckerberg Initiative": "#/$defs/CZI", + "Chroma": "#/$defs/CHROMA", + "Coherent Scientific": "#/$defs/COHERENT_SCIENTIFIC", + "Columbia University": "#/$defs/COLUMBIA", + "Computar": "#/$defs/COMPUTAR", + "Conoptics": "#/$defs/CONOPTICS", + "Custom": "#/$defs/CUSTOM", + "Dodotronic": "#/$defs/DODOTRONIC", + "Doric": "#/$defs/DORIC", + "Ealing": "#/$defs/EALING", + "Edmund Optics": "#/$defs/EDMUND_OPTICS", + "Emory University": "#/$defs/EMORY", + "Euresys": "#/$defs/EURESYS", + "Fujinon": "#/$defs/FUJINON", + "Hamamatsu": "#/$defs/HAMAMATSU", + "Hamilton": "#/$defs/HAMILTON", + "Huazhong University of Science and Technology": "#/$defs/HUST", + "IR Robot Co": "#/$defs/IR_ROBOT_CO", + "ISL Products International": "#/$defs/ISL", + "Infinity Photo-Optical": "#/$defs/INFINITY_PHOTO_OPTICAL", + "Integrated DNA Technologies": "#/$defs/IDT", + "Interuniversity Microelectronics Center": "#/$defs/IMEC", + "Invitrogen": "#/$defs/INVITROGEN", + "Jackson Laboratory": "#/$defs/JAX", + "Janelia Research Campus": "#/$defs/JANELIA", + "Julabo": "#/$defs/JULABO", + "LG": "#/$defs/LG", + "Leica": "#/$defs/LEICA", + "LifeCanvas": "#/$defs/LIFECANVAS", + "Lumen Dynamics": "#/$defs/LUMEN_DYNAMICS", + "MBF Bioscience": "#/$defs/MBF", + "MKS Newport": "#/$defs/MKS_NEWPORT", + "MPI": "#/$defs/MPI", + "Meadowlark Optics": "#/$defs/MEADOWLARK_OPTICS", + "Michael J. Fox Foundation for Parkinson's Research": "#/$defs/MJFF", + "Midwest Optical Systems, Inc.": "#/$defs/MIDOPT", + "Mitutuyo": "#/$defs/MITUTUYO", + "NResearch Inc": "#/$defs/NRESEARCH_INC", + "National Center for Complementary and Integrative Health": "#/$defs/NCCIH", + "National Institute of Mental Health": "#/$defs/NIMH", + "National Institute of Neurological Disorders and Stroke": "#/$defs/NINDS", + "National Instruments": "#/$defs/NATIONAL_INSTRUMENTS", + "Navitar": "#/$defs/NAVITAR", + "Neurophotometrics": "#/$defs/NEUROPHOTOMETRICS", + "New Scale Technologies": "#/$defs/NEW_SCALE_TECHNOLOGIES", + "New York University": "#/$defs/NYU", + "Nikon": "#/$defs/NIKON", + "Olympus": "#/$defs/OLYMPUS", + "Open Ephys Production Site": "#/$defs/OEPS", + "Optotune": "#/$defs/OPTOTUNE", + "Other": "#/$defs/OTHER", + "Oxxius": "#/$defs/OXXIUS", + "Prizmatix": "#/$defs/PRIZMATIX", + "Quantifi": "#/$defs/QUANTIFI", + "Raspberry Pi": "#/$defs/RASPBERRY_PI", + "SICGEN": "#/$defs/SICGEN", + "Schneider-Kreuznach": "#/$defs/SCHNEIDER_KREUZNACH", + "Second Order Effects": "#/$defs/SECOND_ORDER_EFFECTS", + "Semrock": "#/$defs/SEMROCK", + "Sigma-Aldritch": "#/$defs/SIGMA_ALDRITCH", + "Simons Foundation": "#/$defs/SIMONS_FOUNDATION", + "Spinnaker": "#/$defs/SPINNAKER", + "Tamron": "#/$defs/TAMRON", + "Technical Manufacturing Corporation": "#/$defs/TMC", + "Teledyne FLIR": "#/$defs/FLIR", + "Templeton World Charity Foundation": "#/$defs/TWCF", + "The Imaging Source": "#/$defs/THE_IMAGING_SOURCE", + "The Lee Company": "#/$defs/THE_LEE_COMPANY", + "Thermo Fisher Scientific": "#/$defs/THERMO_FISHER_SCIENTIFIC", + "Thorlabs": "#/$defs/THORLABS", + "Tymphany": "#/$defs/TYMPHANY", + "Vieworks": "#/$defs/VIEWORKS", + "Vortran": "#/$defs/VORTRAN", + "ams OSRAM": "#/$defs/AMS_OSRAM" + }, + "propertyName": "name" + }, + "oneOf": [ + { + "$ref": "#/$defs/AA_OPTO_ELECTRONIC" + }, + { + "$ref": "#/$defs/ASUS" + }, + { + "$ref": "#/$defs/ABCAM" + }, + { + "$ref": "#/$defs/ADDGENE" + }, + { + "$ref": "#/$defs/AILIPU" + }, + { + "$ref": "#/$defs/AI" + }, + { + "$ref": "#/$defs/AIBS" + }, + { + "$ref": "#/$defs/AIND" + }, + { + "$ref": "#/$defs/ALLIED" + }, + { + "$ref": "#/$defs/ASI" + }, + { + "$ref": "#/$defs/ARECONT_VISION_COSTAR" + }, + { + "$ref": "#/$defs/BASLER" + }, + { + "$ref": "#/$defs/CAMBRIDGE_TECHNOLOGY" + }, + { + "$ref": "#/$defs/CARL_ZEISS" + }, + { + "$ref": "#/$defs/CHAMPALIMAUD" + }, + { + "$ref": "#/$defs/CZI" + }, + { + "$ref": "#/$defs/CHROMA" + }, + { + "$ref": "#/$defs/COHERENT_SCIENTIFIC" + }, + { + "$ref": "#/$defs/COLUMBIA" + }, + { + "$ref": "#/$defs/COMPUTAR" + }, + { + "$ref": "#/$defs/CONOPTICS" + }, + { + "$ref": "#/$defs/CUSTOM" + }, + { + "$ref": "#/$defs/DODOTRONIC" + }, + { + "$ref": "#/$defs/DORIC" + }, + { + "$ref": "#/$defs/EALING" + }, + { + "$ref": "#/$defs/EDMUND_OPTICS" + }, + { + "$ref": "#/$defs/EMORY" + }, + { + "$ref": "#/$defs/EURESYS" + }, + { + "$ref": "#/$defs/FUJINON" + }, + { + "$ref": "#/$defs/HAMAMATSU" + }, + { + "$ref": "#/$defs/HAMILTON" + }, + { + "$ref": "#/$defs/HUST" + }, + { + "$ref": "#/$defs/IR_ROBOT_CO" + }, + { + "$ref": "#/$defs/ISL" + }, + { + "$ref": "#/$defs/INFINITY_PHOTO_OPTICAL" + }, + { + "$ref": "#/$defs/IDT" + }, + { + "$ref": "#/$defs/IMEC" + }, + { + "$ref": "#/$defs/INVITROGEN" + }, + { + "$ref": "#/$defs/JAX" + }, + { + "$ref": "#/$defs/JANELIA" + }, + { + "$ref": "#/$defs/JULABO" + }, + { + "$ref": "#/$defs/LG" + }, + { + "$ref": "#/$defs/LEICA" + }, + { + "$ref": "#/$defs/LUMEN_DYNAMICS" + }, + { + "$ref": "#/$defs/LIFECANVAS" + }, + { + "$ref": "#/$defs/MBF" + }, + { + "$ref": "#/$defs/MKS_NEWPORT" + }, + { + "$ref": "#/$defs/MPI" + }, + { + "$ref": "#/$defs/MEADOWLARK_OPTICS" + }, + { + "$ref": "#/$defs/MJFF" + }, + { + "$ref": "#/$defs/MIDOPT" + }, + { + "$ref": "#/$defs/MITUTUYO" + }, + { + "$ref": "#/$defs/NRESEARCH_INC" + }, + { + "$ref": "#/$defs/NCCIH" + }, + { + "$ref": "#/$defs/NIMH" + }, + { + "$ref": "#/$defs/NINDS" + }, + { + "$ref": "#/$defs/NATIONAL_INSTRUMENTS" + }, + { + "$ref": "#/$defs/NAVITAR" + }, + { + "$ref": "#/$defs/NEUROPHOTOMETRICS" + }, + { + "$ref": "#/$defs/NEW_SCALE_TECHNOLOGIES" + }, + { + "$ref": "#/$defs/NYU" + }, + { + "$ref": "#/$defs/NIKON" + }, + { + "$ref": "#/$defs/OLYMPUS" + }, + { + "$ref": "#/$defs/OEPS" + }, + { + "$ref": "#/$defs/OPTOTUNE" + }, + { + "$ref": "#/$defs/OTHER" + }, + { + "$ref": "#/$defs/OXXIUS" + }, + { + "$ref": "#/$defs/PRIZMATIX" + }, + { + "$ref": "#/$defs/QUANTIFI" + }, + { + "$ref": "#/$defs/RASPBERRY_PI" + }, + { + "$ref": "#/$defs/SICGEN" + }, + { + "$ref": "#/$defs/SCHNEIDER_KREUZNACH" + }, + { + "$ref": "#/$defs/SECOND_ORDER_EFFECTS" + }, + { + "$ref": "#/$defs/SEMROCK" + }, + { + "$ref": "#/$defs/SIGMA_ALDRITCH" + }, + { + "$ref": "#/$defs/SIMONS_FOUNDATION" + }, + { + "$ref": "#/$defs/SPINNAKER" + }, + { + "$ref": "#/$defs/TAMRON" + }, + { + "$ref": "#/$defs/TMC" + }, + { + "$ref": "#/$defs/FLIR" + }, + { + "$ref": "#/$defs/TWCF" + }, + { + "$ref": "#/$defs/THE_IMAGING_SOURCE" + }, + { + "$ref": "#/$defs/THE_LEE_COMPANY" + }, + { + "$ref": "#/$defs/THERMO_FISHER_SCIENTIFIC" + }, + { + "$ref": "#/$defs/THORLABS" + }, + { + "$ref": "#/$defs/TYMPHANY" + }, + { + "$ref": "#/$defs/VIEWORKS" + }, + { + "$ref": "#/$defs/VORTRAN" + }, + { + "$ref": "#/$defs/AMS_OSRAM" + } + ] + }, + { + "type": "null" + } + ], + "default": null, + "title": "Manufacturer" + }, + "model": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Model" + }, + "path_to_cad": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "For CUSTOM manufactured devices", + "title": "Path to CAD diagram" + }, + "port_index": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Port index" + }, + "additional_settings": { + "$ref": "#/$defs/AindGeneric", "default": {}, "title": "Additional parameters" }, @@ -18103,27 +18562,156 @@ "default": null, "title": "Notes" }, - "travel": { - "anyOf": [ + "array_type": { + "$ref": "#/$defs/MyomatrixArrayType", + "title": "Array type" + } + }, + "required": [ + "name", + "array_type" + ], + "title": "MyomatrixArray", + "type": "object" + }, + "MyomatrixArrayType": { + "description": "Type of Myomatrix array", + "enum": [ + "Injected", + "Sutured" + ], + "title": "MyomatrixArrayType", + "type": "string" + }, + "MyomatrixContact": { + "additionalProperties": false, + "description": "\"Description of a contact on a myomatrix thread", + "properties": { + "body_part": { + "discriminator": { + "mapping": { + "forelimb": "#/$defs/FORELIMB", + "head": "#/$defs/HEAD", + "hindlimb": "#/$defs/HINDLIMB", + "neck": "#/$defs/NECK", + "tail": "#/$defs/TAIL", + "trunk": "#/$defs/TRUNK" + }, + "propertyName": "name" + }, + "oneOf": [ { - "type": "number" + "$ref": "#/$defs/FORELIMB" }, { - "type": "string" + "$ref": "#/$defs/HEAD" + }, + { + "$ref": "#/$defs/HINDLIMB" + }, + { + "$ref": "#/$defs/NECK" + }, + { + "$ref": "#/$defs/TAIL" + }, + { + "$ref": "#/$defs/TRUNK" } ], - "title": "Travel of device (mm)" + "title": "Body part of contact insertion" }, - "travel_unit": { - "allOf": [ + "side": { + "$ref": "#/$defs/Side", + "title": "Body side" + }, + "muscle": { + "discriminator": { + "mapping": { + "biceps brachii": "#/$defs/BICEPS_BRACHII", + "deltoid": "#/$defs/DELTOID", + "extensor carpi radialis longus": "#/$defs/EXTENSOR_CARPI_RADIALIS_LONGUS", + "extensor carpi ulnaris": "#/$defs/EXTENSOR_CARPI_ULNARIS", + "extensor digitorum communis": "#/$defs/EXTENSOR_DIGITORUM_COMMUNIS", + "extensor digitorum lateralis": "#/$defs/EXTENSOR_DIGITORUM_LATERALIS", + "flexor carpi radialis": "#/$defs/FLEXOR_CARPI_RADIALIS", + "flexor carpi ulnaris": "#/$defs/FLEXOR_CARPI_ULNARIS", + "flexor digitorum profundus": "#/$defs/FLEXOR_DIGITORUM_PROFUNDUS", + "lateral head of triceps brachii": "#/$defs/LATERAL_HEAD_OF_TRICEPS_BRACHII", + "long head of biceps brachii": "#/$defs/LONG_HEAD_OF_BICEPS_BRACHII", + "long head of triceps brachii": "#/$defs/LONG_HEAD_OF_TRICEPS_BRACHII", + "medial head of triceps brachii": "#/$defs/MEDIAL_HEAD_OF_TRICEPS_BRACHII", + "pars scapularis of deltoid": "#/$defs/PARS_SCAPULARIS_OF_DELTOID", + "pectoralis major": "#/$defs/PECTORALIS_MAJOR", + "short head of biceps brachii": "#/$defs/SHORT_HEAD_OF_BICEPS_BRACHII", + "tendon of biceps brachii": "#/$defs/TENDON_OF_BICEPS_BRACHII", + "triceps brachii": "#/$defs/TRICEPS_BRACHII" + }, + "propertyName": "name" + }, + "oneOf": [ + { + "$ref": "#/$defs/DELTOID" + }, { - "$ref": "#/$defs/SizeUnit" + "$ref": "#/$defs/PECTORALIS_MAJOR" + }, + { + "$ref": "#/$defs/TRICEPS_BRACHII" + }, + { + "$ref": "#/$defs/LATERAL_HEAD_OF_TRICEPS_BRACHII" + }, + { + "$ref": "#/$defs/LONG_HEAD_OF_TRICEPS_BRACHII" + }, + { + "$ref": "#/$defs/MEDIAL_HEAD_OF_TRICEPS_BRACHII" + }, + { + "$ref": "#/$defs/BICEPS_BRACHII" + }, + { + "$ref": "#/$defs/LONG_HEAD_OF_BICEPS_BRACHII" + }, + { + "$ref": "#/$defs/SHORT_HEAD_OF_BICEPS_BRACHII" + }, + { + "$ref": "#/$defs/TENDON_OF_BICEPS_BRACHII" + }, + { + "$ref": "#/$defs/PARS_SCAPULARIS_OF_DELTOID" + }, + { + "$ref": "#/$defs/EXTENSOR_CARPI_RADIALIS_LONGUS" + }, + { + "$ref": "#/$defs/EXTENSOR_DIGITORUM_COMMUNIS" + }, + { + "$ref": "#/$defs/EXTENSOR_DIGITORUM_LATERALIS" + }, + { + "$ref": "#/$defs/EXTENSOR_CARPI_ULNARIS" + }, + { + "$ref": "#/$defs/FLEXOR_CARPI_RADIALIS" + }, + { + "$ref": "#/$defs/FLEXOR_CARPI_ULNARIS" + }, + { + "$ref": "#/$defs/FLEXOR_DIGITORUM_PROFUNDUS" } ], - "default": "millimeter", - "title": "Travel unit" + "title": "Muscle of contact insertion" }, - "firmware": { + "in_muscle": { + "title": "In muscle", + "type": "boolean" + }, + "notes": { "anyOf": [ { "type": "string" @@ -18133,24 +18721,108 @@ } ], "default": null, - "title": "Firmware" + "title": "Notes" } }, "required": [ - "name", - "travel" + "body_part", + "side", + "muscle", + "in_muscle" ], - "title": "MotorizedStage", + "title": "MyomatrixContact", "type": "object" }, - "MriScanSequence": { - "description": "MRI scan sequence", - "enum": [ - "RARE", - "Other" + "MyomatrixInsertion": { + "additionalProperties": false, + "description": "Description of a Myomatrix array insertion for EMG", + "properties": { + "procedure_type": { + "const": "Myomatrix_Insertion", + "default": "Myomatrix_Insertion", + "enum": [ + "Myomatrix_Insertion" + ], + "title": "Procedure Type", + "type": "string" + }, + "protocol_id": { + "description": "DOI for protocols.io", + "title": "Protocol ID", + "type": "string" + }, + "myomatrix_array": { + "$ref": "#/$defs/MyomatrixArray", + "title": "Myomatrix array" + }, + "threads": { + "items": { + "$ref": "#/$defs/MyomatrixThread" + }, + "title": "Array threads", + "type": "array" + } + }, + "required": [ + "protocol_id", + "myomatrix_array", + "threads" ], - "title": "MriScanSequence", - "type": "string" + "title": "MyomatrixInsertion", + "type": "object" + }, + "MyomatrixThread": { + "additionalProperties": false, + "description": "Description of a thread of a myomatrix array", + "properties": { + "ground_electrode_location": { + "discriminator": { + "mapping": { + "forelimb": "#/$defs/FORELIMB", + "head": "#/$defs/HEAD", + "hindlimb": "#/$defs/HINDLIMB", + "neck": "#/$defs/NECK", + "tail": "#/$defs/TAIL", + "trunk": "#/$defs/TRUNK" + }, + "propertyName": "name" + }, + "oneOf": [ + { + "$ref": "#/$defs/FORELIMB" + }, + { + "$ref": "#/$defs/HEAD" + }, + { + "$ref": "#/$defs/HINDLIMB" + }, + { + "$ref": "#/$defs/NECK" + }, + { + "$ref": "#/$defs/TAIL" + }, + { + "$ref": "#/$defs/TRUNK" + } + ], + "title": "Location of ground electrode" + }, + "contacts": { + "items": { + "$ref": "#/$defs/MyomatrixContact" + }, + "title": "Contacts", + "type": "array" + } + }, + "required": [ + "ground_electrode_location", + "contacts" + ], + "title": "MyomatrixThread", + "type": "object" }, "NATIONAL_INSTRUMENTS": { "properties": { @@ -18317,6 +18989,37 @@ "title": "NCCIH", "type": "object" }, + "NECK": { + "properties": { + "name": { + "const": "neck", + "default": "neck", + "enum": [ + "neck" + ], + "title": "Name", + "type": "string" + }, + "registry": { + "$ref": "#/$defs/RegistryModel", + "default": { + "name": "Edinburgh Mouse Atlas Project", + "abbreviation": "EMAPA" + } + }, + "registry_identifier": { + "const": "EMAPA_35587", + "default": "EMAPA_35587", + "enum": [ + "EMAPA_35587" + ], + "title": "Registry Identifier", + "type": "string" + } + }, + "title": "NECK", + "type": "object" + }, "NEUROPHOTOMETRICS": { "properties": { "name": { @@ -18641,7 +19344,14 @@ "properties": { "injection_materials": { "items": { - "anyOf": [ + "discriminator": { + "mapping": { + "Reagent": "#/$defs/NonViralMaterial", + "Virus": "#/$defs/ViralMaterial" + }, + "propertyName": "material_type" + }, + "oneOf": [ { "$ref": "#/$defs/ViralMaterial" }, @@ -18670,11 +19380,7 @@ "title": "Recovery time" }, "recovery_time_unit": { - "allOf": [ - { - "$ref": "#/$defs/TimeUnit" - } - ], + "$ref": "#/$defs/TimeUnit", "default": "minute", "title": "Recovery time unit" }, @@ -18694,11 +19400,7 @@ "title": "Injection duration" }, "injection_duration_unit": { - "allOf": [ - { - "$ref": "#/$defs/TimeUnit" - } - ], + "$ref": "#/$defs/TimeUnit", "default": "minute", "title": "Injection duration unit" }, @@ -18756,11 +19458,7 @@ "type": "array" }, "injection_coordinate_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "millimeter", "title": "Injection coordinate unit" }, @@ -18793,11 +19491,7 @@ "title": "Bregma to lambda (mm)" }, "bregma_to_lambda_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "millimeter", "title": "Bregma to lambda unit" }, @@ -18813,11 +19507,7 @@ "title": "Injection angle (deg)" }, "injection_angle_unit": { - "allOf": [ - { - "$ref": "#/$defs/AngleUnit" - } - ], + "$ref": "#/$defs/AngleUnit", "default": "degrees", "title": "Injection angle unit" }, @@ -18870,11 +19560,7 @@ "type": "array" }, "injection_volume_unit": { - "allOf": [ - { - "$ref": "#/$defs/VolumeUnit" - } - ], + "$ref": "#/$defs/VolumeUnit", "default": "nanoliter", "title": "Injection volume unit" } @@ -18981,11 +19667,7 @@ "title": "Port index" }, "additional_settings": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "title": "Additional parameters" }, @@ -20200,206 +20882,194 @@ "title": "Port index" }, "additional_settings": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], - "default": {}, - "title": "Additional parameters" - }, - "notes": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Notes" - }, - "numerical_aperture": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "string" - } - ], - "title": "Numerical aperture (in air)" - }, - "magnification": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "string" - } - ], - "title": "Magnification" - }, - "immersion": { - "allOf": [ - { - "$ref": "#/$defs/ImmersionMedium" - } - ], - "title": "Immersion" - }, - "objective_type": { - "anyOf": [ - { - "$ref": "#/$defs/ObjectiveType" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Objective type" - } - }, - "required": [ - "name", - "numerical_aperture", - "magnification", - "immersion" - ], - "title": "Objective", - "type": "object" - }, - "ObjectiveType": { - "description": "Objective type for Slap2", - "enum": [ - "Remote", - "Primary" - ], - "title": "ObjectiveType", - "type": "string" - }, - "Olfactometer": { - "additionalProperties": false, - "description": "Description of an olfactometer for odor stimuli", - "properties": { - "device_type": { - "const": "Olfactometer", - "default": "Olfactometer", - "enum": [ - "Olfactometer" - ], - "title": "Device Type", - "type": "string" - }, - "name": { - "title": "Device name", - "type": "string" - }, - "serial_number": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Serial number" - }, - "manufacturer": { - "default": { - "name": "Champalimaud Foundation", - "abbreviation": "Champalimaud", - "registry": { - "abbreviation": "ROR", - "name": "Research Organization Registry" - }, - "registry_identifier": "03g001n57" - }, - "discriminator": { - "mapping": { - "Allen Institute for Neural Dynamics": "#/$defs/AIND", - "Champalimaud Foundation": "#/$defs/CHAMPALIMAUD", - "Interuniversity Microelectronics Center": "#/$defs/IMEC", - "National Instruments": "#/$defs/NATIONAL_INSTRUMENTS", - "Open Ephys Production Site": "#/$defs/OEPS", - "Other": "#/$defs/OTHER", - "Second Order Effects": "#/$defs/SECOND_ORDER_EFFECTS" - }, - "propertyName": "name" - }, - "oneOf": [ - { - "$ref": "#/$defs/AIND" - }, - { - "$ref": "#/$defs/CHAMPALIMAUD" - }, - { - "$ref": "#/$defs/NATIONAL_INSTRUMENTS" - }, - { - "$ref": "#/$defs/IMEC" - }, - { - "$ref": "#/$defs/OEPS" - }, - { - "$ref": "#/$defs/SECOND_ORDER_EFFECTS" - }, - { - "$ref": "#/$defs/OTHER" - } - ], - "title": "Manufacturer" - }, - "model": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Model" - }, - "path_to_cad": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "For CUSTOM manufactured devices", - "title": "Path to CAD diagram" - }, - "port_index": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Port index" - }, - "additional_settings": { - "allOf": [ + "$ref": "#/$defs/AindGeneric", + "default": {}, + "title": "Additional parameters" + }, + "notes": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Notes" + }, + "numerical_aperture": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string" + } + ], + "title": "Numerical aperture (in air)" + }, + "magnification": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string" + } + ], + "title": "Magnification" + }, + "immersion": { + "$ref": "#/$defs/ImmersionMedium", + "title": "Immersion" + }, + "objective_type": { + "anyOf": [ + { + "$ref": "#/$defs/ObjectiveType" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Objective type" + } + }, + "required": [ + "name", + "numerical_aperture", + "magnification", + "immersion" + ], + "title": "Objective", + "type": "object" + }, + "ObjectiveType": { + "description": "Objective type for Slap2", + "enum": [ + "Remote", + "Primary" + ], + "title": "ObjectiveType", + "type": "string" + }, + "Olfactometer": { + "additionalProperties": false, + "description": "Description of an olfactometer for odor stimuli", + "properties": { + "device_type": { + "const": "Olfactometer", + "default": "Olfactometer", + "enum": [ + "Olfactometer" + ], + "title": "Device Type", + "type": "string" + }, + "name": { + "title": "Device name", + "type": "string" + }, + "serial_number": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Serial number" + }, + "manufacturer": { + "default": { + "name": "Champalimaud Foundation", + "abbreviation": "Champalimaud", + "registry": { + "abbreviation": "ROR", + "name": "Research Organization Registry" + }, + "registry_identifier": "03g001n57" + }, + "discriminator": { + "mapping": { + "Allen Institute for Neural Dynamics": "#/$defs/AIND", + "Champalimaud Foundation": "#/$defs/CHAMPALIMAUD", + "Interuniversity Microelectronics Center": "#/$defs/IMEC", + "National Instruments": "#/$defs/NATIONAL_INSTRUMENTS", + "Open Ephys Production Site": "#/$defs/OEPS", + "Other": "#/$defs/OTHER", + "Second Order Effects": "#/$defs/SECOND_ORDER_EFFECTS" + }, + "propertyName": "name" + }, + "oneOf": [ + { + "$ref": "#/$defs/AIND" + }, + { + "$ref": "#/$defs/CHAMPALIMAUD" + }, + { + "$ref": "#/$defs/NATIONAL_INSTRUMENTS" + }, + { + "$ref": "#/$defs/IMEC" + }, + { + "$ref": "#/$defs/OEPS" + }, + { + "$ref": "#/$defs/SECOND_ORDER_EFFECTS" + }, + { + "$ref": "#/$defs/OTHER" + } + ], + "title": "Manufacturer" + }, + "model": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Model" + }, + "path_to_cad": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "For CUSTOM manufactured devices", + "title": "Path to CAD diagram" + }, + "port_index": { + "anyOf": [ { - "$ref": "#/$defs/AindGeneric" + "type": "string" + }, + { + "type": "null" } ], + "default": null, + "title": "Port index" + }, + "additional_settings": { + "$ref": "#/$defs/AindGeneric", "default": {}, "title": "Additional parameters" }, @@ -20416,11 +21086,7 @@ "title": "Notes" }, "data_interface": { - "allOf": [ - { - "$ref": "#/$defs/DataInterface" - } - ], + "$ref": "#/$defs/DataInterface", "default": "USB", "title": "Data interface" }, @@ -20524,11 +21190,7 @@ "type": "integer" }, "channel_type": { - "allOf": [ - { - "$ref": "#/$defs/ChannelType" - } - ], + "$ref": "#/$defs/ChannelType", "default": "Odor", "title": "Channel type" }, @@ -20577,11 +21239,7 @@ "title": "Odorant dilution" }, "odorant_dilution_unit": { - "allOf": [ - { - "$ref": "#/$defs/ConcentrationUnit" - } - ], + "$ref": "#/$defs/ConcentrationUnit", "default": "% v/v", "title": "Dilution unit" }, @@ -21084,11 +21742,7 @@ "title": "Species" }, "gene": { - "allOf": [ - { - "$ref": "#/$defs/PIDName" - } - ], + "$ref": "#/$defs/PIDName", "title": "Gene name, accession number, and registry" }, "probe_sequences": { @@ -21228,11 +21882,7 @@ "title": "Port index" }, "additional_settings": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "title": "Additional parameters" }, @@ -21314,11 +21964,7 @@ "description": "Description of an implanted ophys probe", "properties": { "ophys_probe": { - "allOf": [ - { - "$ref": "#/$defs/FiberProbe" - } - ], + "$ref": "#/$defs/FiberProbe", "title": "Fiber probe" }, "targeted_structure": { @@ -21359,11 +22005,7 @@ "title": "Stereotactic coordinate D/V (mm)" }, "stereotactic_coordinate_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "millimeter", "title": "Sterotactic coordinate unit" }, @@ -21396,11 +22038,7 @@ "title": "Bregma to lambda (mm)" }, "bregma_to_lambda_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "millimeter", "title": "Bregma to lambda unit" }, @@ -21416,11 +22054,7 @@ "title": "Angle (deg)" }, "angle_unit": { - "allOf": [ - { - "$ref": "#/$defs/AngleUnit" - } - ], + "$ref": "#/$defs/AngleUnit", "default": "degrees", "title": "Angle unit" }, @@ -21889,11 +22523,7 @@ "title": "Port index" }, "additional_settings": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "title": "Additional parameters" }, @@ -21912,6 +22542,7 @@ "length": { "anyOf": [ { + "minimum": 0.0, "type": "number" }, { @@ -21927,6 +22558,7 @@ "width": { "anyOf": [ { + "minimum": 0.0, "type": "number" }, { @@ -21940,11 +22572,7 @@ "title": "Width (inches)" }, "table_size_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "inch", "title": "Table size unit" }, @@ -21985,11 +22613,7 @@ "type": "string" }, "pulse_shape": { - "allOf": [ - { - "$ref": "#/$defs/PulseShape" - } - ], + "$ref": "#/$defs/PulseShape", "title": "Pulse shape" }, "pulse_frequency": { @@ -22007,11 +22631,7 @@ "type": "array" }, "pulse_frequency_unit": { - "allOf": [ - { - "$ref": "#/$defs/FrequencyUnit" - } - ], + "$ref": "#/$defs/FrequencyUnit", "default": "hertz", "title": "Pulse frequency unit" }, @@ -22030,11 +22650,7 @@ "type": "array" }, "pulse_width_unit": { - "allOf": [ - { - "$ref": "#/$defs/TimeUnit" - } - ], + "$ref": "#/$defs/TimeUnit", "default": "millisecond", "title": "Pulse width unit" }, @@ -22053,11 +22669,7 @@ "type": "array" }, "pulse_train_duration_unit": { - "allOf": [ - { - "$ref": "#/$defs/TimeUnit" - } - ], + "$ref": "#/$defs/TimeUnit", "default": "second", "title": "Pulse train duration unit" }, @@ -22082,11 +22694,7 @@ "title": "Pulse train interval (s)" }, "pulse_train_interval_unit": { - "allOf": [ - { - "$ref": "#/$defs/TimeUnit" - } - ], + "$ref": "#/$defs/TimeUnit", "default": "second", "title": "Pulse train interval unit" }, @@ -22103,20 +22711,12 @@ "title": "Baseline duration (s)" }, "baseline_duration_unit": { - "allOf": [ - { - "$ref": "#/$defs/TimeUnit" - } - ], + "$ref": "#/$defs/TimeUnit", "default": "second", "title": "Baseline duration unit" }, "other_parameters": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "title": "Other parameters" }, @@ -22205,6 +22805,68 @@ "title": "OtherSubjectProcedure", "type": "object" }, + "PARS_SCAPULARIS_OF_DELTOID": { + "properties": { + "name": { + "const": "pars scapularis of deltoid", + "default": "pars scapularis of deltoid", + "enum": [ + "pars scapularis of deltoid" + ], + "title": "Name", + "type": "string" + }, + "registry": { + "$ref": "#/$defs/RegistryModel", + "default": { + "name": "Edinburgh Mouse Atlas Project", + "abbreviation": "EMAPA" + } + }, + "registry_identifier": { + "const": "EMAPA_36163", + "default": "EMAPA_36163", + "enum": [ + "EMAPA_36163" + ], + "title": "Registry Identifier", + "type": "string" + } + }, + "title": "PARS_SCAPULARIS_OF_DELTOID", + "type": "object" + }, + "PECTORALIS_MAJOR": { + "properties": { + "name": { + "const": "pectoralis major", + "default": "pectoralis major", + "enum": [ + "pectoralis major" + ], + "title": "Name", + "type": "string" + }, + "registry": { + "$ref": "#/$defs/RegistryModel", + "default": { + "name": "Edinburgh Mouse Atlas Project", + "abbreviation": "EMAPA" + } + }, + "registry_identifier": { + "const": "EMAPA_18179", + "default": "EMAPA_18179", + "enum": [ + "EMAPA_18179" + ], + "title": "Registry Identifier", + "type": "string" + } + }, + "title": "PECTORALIS_MAJOR", + "type": "object" + }, "PIDName": { "additionalProperties": false, "description": "Model for associate a name with a persistent identifier (PID),\nthe registry for that PID, and abbreviation for that registry", @@ -22760,11 +23422,7 @@ "title": "Port index" }, "additional_settings": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "title": "Additional parameters" }, @@ -22899,20 +23557,12 @@ "title": "Inter trial interval (s)" }, "inter_trial_interval_unit": { - "allOf": [ - { - "$ref": "#/$defs/TimeUnit" - } - ], + "$ref": "#/$defs/TimeUnit", "default": "second", "title": "Inter trial interval unit" }, "other_parameters": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "title": "Other parameters" }, @@ -22962,11 +23612,7 @@ "title": "Stimulation laser power (mW)" }, "stimulation_laser_power_unit": { - "allOf": [ - { - "$ref": "#/$defs/PowerUnit" - } - ], + "$ref": "#/$defs/PowerUnit", "default": "milliwatt", "title": "Stimulation laser power unit" }, @@ -22990,11 +23636,7 @@ "title": "Spiral duration (s)" }, "spiral_duration_unit": { - "allOf": [ - { - "$ref": "#/$defs/TimeUnit" - } - ], + "$ref": "#/$defs/TimeUnit", "default": "second", "title": "Spiral duration unit" }, @@ -23010,20 +23652,12 @@ "title": "Inter trial interval (s)" }, "inter_spiral_interval_unit": { - "allOf": [ - { - "$ref": "#/$defs/TimeUnit" - } - ], + "$ref": "#/$defs/TimeUnit", "default": "second", "title": "Inter trial interval unit" }, "other_parameters": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "title": "Other parameters" }, @@ -23555,11 +24189,7 @@ "title": "Port index" }, "additional_settings": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "title": "Additional parameters" }, @@ -23619,11 +24249,7 @@ "title": "Off time (fraction of cycle)" }, "time_setting_unit": { - "allOf": [ - { - "$ref": "#/$defs/UnitlessUnit" - } - ], + "$ref": "#/$defs/UnitlessUnit", "default": "fraction of cycle", "title": "Time setting unit" }, @@ -23643,11 +24269,7 @@ "title": "Beam modulation (V)" }, "beam_modulation_unit": { - "allOf": [ - { - "$ref": "#/$defs/VoltageUnit" - } - ], + "$ref": "#/$defs/VoltageUnit", "default": "Volts", "title": "Beam modulation unit" } @@ -24099,11 +24721,7 @@ "title": "Port index" }, "additional_settings": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "title": "Additional parameters" }, @@ -24124,11 +24742,7 @@ "type": "integer" }, "speed_unit": { - "allOf": [ - { - "$ref": "#/$defs/SpeedUnit" - } - ], + "$ref": "#/$defs/SpeedUnit", "default": "rotations per minute", "title": "Speed unit" }, @@ -24205,10 +24819,10 @@ "type": "string" }, "schema_version": { - "const": "1.0.0", - "default": "1.0.0", + "const": "1.0.1", + "default": "1.0.1", "enum": [ - "1.0.0" + "1.0.1" ], "title": "Schema Version", "type": "string" @@ -24301,10 +24915,8 @@ "Image tile alignment", "Image tile fusing", "Image tile projection", - "Manual annotation", "Neuropil subtraction", "Other", - "Quality control and assessment", "Simulation", "Skull stripping", "Spatial timeseries demixing", @@ -24312,6 +24924,7 @@ "Video motion correction", "Video plane decrosstalk", "Video ROI classification", + "Video ROI cross session matching", "Video ROI segmentation", "Video ROI timeseries extraction" ], @@ -24329,20 +24942,16 @@ "type": "string" }, "schema_version": { - "const": "1.0.0", - "default": "1.0.0", + "const": "1.0.1", + "default": "1.0.1", "enum": [ - "1.0.0" + "1.0.1" ], "title": "Schema Version", "type": "string" }, "processing_pipeline": { - "allOf": [ - { - "$ref": "#/$defs/PipelineProcess" - } - ], + "$ref": "#/$defs/PipelineProcess", "description": "Pipeline used to process data", "title": "Processing Pipeline" }, @@ -24441,11 +25050,7 @@ "type": "string" }, "protective_material": { - "allOf": [ - { - "$ref": "#/$defs/ProtectiveMaterial" - } - ], + "$ref": "#/$defs/ProtectiveMaterial", "description": "New material being applied", "title": "Protective material" }, @@ -24489,11 +25094,7 @@ "title": "Ground wire diameter" }, "ground_wire_diameter_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "inch", "title": "Ground wire diameter unit" }, @@ -24541,9 +25142,9 @@ }, "QCEvaluation": { "additionalProperties": false, - "description": "Description of one evaluation stage", + "description": "Description of one evaluation stage, with one or more metrics", "properties": { - "evaluation_modality": { + "modality": { "discriminator": { "mapping": { "EMG": "#/$defs/EMG", @@ -24609,37 +25210,84 @@ ], "title": "Modality" }, - "evaluation_stage": { - "title": "Evaluation stage", - "type": "string" + "stage": { + "$ref": "#/$defs/Stage", + "title": "Evaluation stage" }, - "evaluator_full_name": { - "title": "Evaluator full name", + "name": { + "title": "Evaluation name", "type": "string" }, - "evaluation_date": { - "format": "date", - "title": "Evaluation date", - "type": "string" + "description": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Evaluation description" + }, + "metrics": { + "items": { + "$ref": "#/$defs/QCMetric" + }, + "title": "QC metrics", + "type": "array" }, - "qc_metrics": { - "allOf": [ + "notes": { + "anyOf": [ + { + "type": "string" + }, { - "$ref": "#/$defs/AindGeneric" + "type": "null" } ], - "default": {}, - "title": "QC metrics" + "default": null, + "title": "Notes" }, - "stage_status": { - "allOf": [ + "allow_failed_metrics": { + "default": false, + "description": "Set to true for evaluations that are not critical to the overall state of QC for a data asset, this will allow individual metrics to fail while still passing the evaluation.", + "title": "Allow metrics to fail", + "type": "boolean" + } + }, + "required": [ + "modality", + "stage", + "name", + "metrics" + ], + "title": "QCEvaluation", + "type": "object" + }, + "QCMetric": { + "description": "Description of a single quality control metric", + "properties": { + "name": { + "title": "Metric name", + "type": "string" + }, + "value": { + "title": "Metric value" + }, + "description": { + "anyOf": [ + { + "type": "string" + }, { - "$ref": "#/$defs/Status" + "type": "null" } ], - "title": "Stage status" + "default": null, + "title": "Metric description" }, - "notes": { + "reference": { "anyOf": [ { "type": "string" @@ -24649,17 +25297,46 @@ } ], "default": null, - "title": "Notes" + "title": "Metric reference image URL or plot type" + }, + "status_history": { + "default": [], + "items": { + "$ref": "#/$defs/QCStatus" + }, + "title": "Metric status history", + "type": "array" } }, "required": [ - "evaluation_modality", - "evaluation_stage", - "evaluator_full_name", - "evaluation_date", - "stage_status" + "name", + "value" ], - "title": "QCEvaluation", + "title": "QCMetric", + "type": "object" + }, + "QCStatus": { + "description": "Description of a QC status, set by an evaluator", + "properties": { + "evaluator": { + "title": "Status evaluator full name", + "type": "string" + }, + "status": { + "$ref": "#/$defs/Status" + }, + "timestamp": { + "format": "date-time", + "title": "Status date", + "type": "string" + } + }, + "required": [ + "evaluator", + "status", + "timestamp" + ], + "title": "QCStatus", "type": "object" }, "QUANTIFI": { @@ -24705,33 +25382,20 @@ "description": "Description of quality metrics for a data asset", "properties": { "describedBy": { - "const": "https://raw.githubusercontent.com/AllenNeuralDynamics/aind-data-schema/main/src/aind_data_schema/core/quality_metrics.py", - "default": "https://raw.githubusercontent.com/AllenNeuralDynamics/aind-data-schema/main/src/aind_data_schema/core/quality_metrics.py", + "const": "https://raw.githubusercontent.com/AllenNeuralDynamics/aind-data-schema/main/src/aind_data_schema/core/quality_control.py", + "default": "https://raw.githubusercontent.com/AllenNeuralDynamics/aind-data-schema/main/src/aind_data_schema/core/quality_control.py", "title": "Describedby", "type": "string" }, "schema_version": { - "const": "1.0.0", - "default": "1.0.0", + "const": "1.0.1", + "default": "1.0.1", "enum": [ - "1.0.0" + "1.0.1" ], "title": "Schema Version", "type": "string" }, - "overall_status": { - "allOf": [ - { - "$ref": "#/$defs/Status" - } - ], - "title": "Overall status" - }, - "overall_status_date": { - "format": "date", - "title": "Date of status", - "type": "string" - }, "evaluations": { "items": { "$ref": "#/$defs/QCEvaluation" @@ -24753,8 +25417,6 @@ } }, "required": [ - "overall_status", - "overall_status_date", "evaluations" ], "title": "QualityControl", @@ -25276,20 +25938,12 @@ "type": "integer" }, "excitation_wavelength_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "nanometer", "title": "Excitation wavelength unit" }, "stain_type": { - "allOf": [ - { - "$ref": "#/$defs/StainType" - } - ], + "$ref": "#/$defs/StainType", "title": "Stain type" } }, @@ -25716,6 +26370,26 @@ "title": "Reagent", "type": "object" }, + "RegistryModel": { + "additionalProperties": false, + "description": "Base model config", + "properties": { + "name": { + "title": "Registry name", + "type": "string" + }, + "abbreviation": { + "title": "Registry abbreviation", + "type": "string" + } + }, + "required": [ + "name", + "abbreviation" + ], + "title": "RegistryModel", + "type": "object" + }, "RelatedData": { "additionalProperties": false, "description": "Description of related data asset", @@ -25797,13 +26471,195 @@ "title": "RelativePosition", "type": "object" }, + "ResourceTimestamped": { + "additionalProperties": false, + "description": "Description of resource usage at a moment in time", + "properties": { + "timestamp": { + "format": "date-time", + "title": "Timestamp", + "type": "string" + }, + "usage": { + "title": "Usage", + "type": "number" + } + }, + "required": [ + "timestamp", + "usage" + ], + "title": "ResourceTimestamped", + "type": "object" + }, + "ResourceUsage": { + "additionalProperties": false, + "description": "Description of resources used by a process", + "properties": { + "os": { + "title": "Operating system", + "type": "string" + }, + "architecture": { + "title": "Architecture", + "type": "string" + }, + "cpu": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "CPU name" + }, + "cpu_cores": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "title": "CPU cores" + }, + "gpu": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "GPU name" + }, + "system_memory": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null, + "title": "System memory" + }, + "system_memory_unit": { + "anyOf": [ + { + "$ref": "#/$defs/MemoryUnit" + }, + { + "type": "null" + } + ], + "default": null, + "title": "System memory unit" + }, + "ram": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null, + "title": "System RAM" + }, + "ram_unit": { + "anyOf": [ + { + "$ref": "#/$defs/MemoryUnit" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Ram unit" + }, + "cpu_usage": { + "anyOf": [ + { + "items": { + "$ref": "#/$defs/ResourceTimestamped" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "title": "CPU usage" + }, + "gpu_usage": { + "anyOf": [ + { + "items": { + "$ref": "#/$defs/ResourceTimestamped" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "title": "GPU usage" + }, + "ram_usage": { + "anyOf": [ + { + "items": { + "$ref": "#/$defs/ResourceTimestamped" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "title": "RAM usage" + }, + "usage_unit": { + "default": "percent", + "title": "Usage unit", + "type": "string" + } + }, + "required": [ + "os", + "architecture" + ], + "title": "ResourceUsage", + "type": "object" + }, "RetroOrbitalInjection": { "additionalProperties": false, "description": "Description of a retro-orbital injection procedure", "properties": { "injection_materials": { "items": { - "anyOf": [ + "discriminator": { + "mapping": { + "Reagent": "#/$defs/NonViralMaterial", + "Virus": "#/$defs/ViralMaterial" + }, + "propertyName": "material_type" + }, + "oneOf": [ { "$ref": "#/$defs/ViralMaterial" }, @@ -25832,11 +26688,7 @@ "title": "Recovery time" }, "recovery_time_unit": { - "allOf": [ - { - "$ref": "#/$defs/TimeUnit" - } - ], + "$ref": "#/$defs/TimeUnit", "default": "minute", "title": "Recovery time unit" }, @@ -25856,11 +26708,7 @@ "title": "Injection duration" }, "injection_duration_unit": { - "allOf": [ - { - "$ref": "#/$defs/TimeUnit" - } - ], + "$ref": "#/$defs/TimeUnit", "default": "minute", "title": "Injection duration unit" }, @@ -25902,20 +26750,12 @@ "title": "Injection volume (uL)" }, "injection_volume_unit": { - "allOf": [ - { - "$ref": "#/$defs/VolumeUnit" - } - ], + "$ref": "#/$defs/VolumeUnit", "default": "microliter", "title": "Injection volume unit" }, "injection_eye": { - "allOf": [ - { - "$ref": "#/$defs/Side" - } - ], + "$ref": "#/$defs/Side", "title": "Injection eye" } }, @@ -25972,11 +26812,7 @@ "description": "Description of reward delivery configuration", "properties": { "reward_solution": { - "allOf": [ - { - "$ref": "#/$defs/RewardSolution" - } - ], + "$ref": "#/$defs/RewardSolution", "description": "If Other use notes", "title": "Reward solution" }, @@ -26457,11 +27293,7 @@ "title": "Port index" }, "additional_settings": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "title": "Additional parameters" }, @@ -26478,11 +27310,7 @@ "title": "Notes" }, "side": { - "allOf": [ - { - "$ref": "#/$defs/SpoutSide" - } - ], + "$ref": "#/$defs/SpoutSide", "description": "If Other use notes", "title": "Spout side" }, @@ -26498,11 +27326,7 @@ "title": "Spout diameter (mm)" }, "spout_diameter_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "millimeter", "title": "Spout diameter unit" }, @@ -26519,23 +27343,11 @@ "title": "Spout stage position" }, "solenoid_valve": { - "allOf": [ - { - "$ref": "#/$defs/Device" - } - ], + "$ref": "#/$defs/Device", "title": "Solenoid valve" }, "lick_sensor": { - "anyOf": [ - { - "$ref": "#/$defs/Device" - }, - { - "type": "null" - } - ], - "default": null, + "$ref": "#/$defs/Device", "title": "Lick sensor" }, "lick_sensor_type": { @@ -26555,7 +27367,8 @@ "name", "side", "spout_diameter", - "solenoid_valve" + "solenoid_valve", + "lick_sensor" ], "title": "RewardSpout", "type": "object" @@ -26565,20 +27378,12 @@ "description": "Reward spout session information", "properties": { "side": { - "allOf": [ - { - "$ref": "#/$defs/SpoutSide" - } - ], + "$ref": "#/$defs/SpoutSide", "description": "Must match rig", "title": "Spout side" }, "starting_position": { - "allOf": [ - { - "$ref": "#/$defs/RelativePosition" - } - ], + "$ref": "#/$defs/RelativePosition", "title": "Starting position" }, "variable_position": { @@ -26606,10 +27411,10 @@ "type": "string" }, "schema_version": { - "const": "1.0.0", - "default": "1.0.0", + "const": "1.0.1", + "default": "1.0.1", "enum": [ - "1.0.0" + "1.0.1" ], "title": "Schema Version", "type": "string" @@ -27157,6 +27962,37 @@ "title": "SEMROCK", "type": "object" }, + "SHORT_HEAD_OF_BICEPS_BRACHII": { + "properties": { + "name": { + "const": "short head of biceps brachii", + "default": "short head of biceps brachii", + "enum": [ + "short head of biceps brachii" + ], + "title": "Name", + "type": "string" + }, + "registry": { + "$ref": "#/$defs/RegistryModel", + "default": { + "name": "Edinburgh Mouse Atlas Project", + "abbreviation": "EMAPA" + } + }, + "registry_identifier": { + "const": "EMAPA_25055", + "default": "EMAPA_25055", + "enum": [ + "EMAPA_25055" + ], + "title": "Registry Identifier", + "type": "string" + } + }, + "title": "SHORT_HEAD_OF_BICEPS_BRACHII", + "type": "object" + }, "SICGEN": { "properties": { "name": { @@ -28026,11 +28862,7 @@ "title": "Port index" }, "additional_settings": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "title": "Additional parameters" }, @@ -28047,19 +28879,11 @@ "title": "Notes" }, "scanner_location": { - "allOf": [ - { - "$ref": "#/$defs/ScannerLocation" - } - ], + "$ref": "#/$defs/ScannerLocation", "title": "Scanner location" }, "magnetic_strength": { - "allOf": [ - { - "$ref": "#/$defs/MagneticStrength" - } - ], + "$ref": "#/$defs/MagneticStrength", "title": "Magnetic strength (T)" }, "magnetic_strength_unit": { @@ -28526,11 +29350,7 @@ "title": "Port index" }, "additional_settings": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "title": "Additional parameters" }, @@ -28558,11 +29378,7 @@ "title": "Travel of device (mm)" }, "travel_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "millimeter", "title": "Travel unit" }, @@ -28579,19 +29395,11 @@ "title": "Firmware" }, "stage_axis_direction": { - "allOf": [ - { - "$ref": "#/$defs/StageAxisDirection" - } - ], + "$ref": "#/$defs/StageAxisDirection", "title": "Direction of stage axis" }, "stage_axis_name": { - "allOf": [ - { - "$ref": "#/$defs/StageAxisName" - } - ], + "$ref": "#/$defs/StageAxisName", "title": "Name of stage axis" } }, @@ -28649,11 +29457,7 @@ "type": "array" }, "section_orientation": { - "allOf": [ - { - "$ref": "#/$defs/SectionOrientation" - } - ], + "$ref": "#/$defs/SectionOrientation", "title": "Sectioning orientation" }, "section_thickness": { @@ -28668,11 +29472,7 @@ "title": "Section thickness" }, "section_thickness_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "millimeter", "title": "Section thickness unit" }, @@ -28688,28 +29488,16 @@ "title": "Section distance from reference" }, "section_distance_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "millimeter", "title": "Distance unit" }, "reference_location": { - "allOf": [ - { - "$ref": "#/$defs/CoordinateReferenceLocation" - } - ], + "$ref": "#/$defs/CoordinateReferenceLocation", "title": "Reference location for distance measurement" }, "section_strategy": { - "allOf": [ - { - "$ref": "#/$defs/SectionStrategy" - } - ], + "$ref": "#/$defs/SectionStrategy", "title": "Slice strategy" }, "targeted_structure": { @@ -28742,10 +29530,10 @@ "type": "string" }, "schema_version": { - "const": "1.0.0", - "default": "1.0.0", + "const": "1.0.1", + "default": "1.0.1", "enum": [ - "1.0.0" + "1.0.1" ], "title": "Schema Version", "type": "string" @@ -28860,11 +29648,7 @@ "title": "Animal weight (g)" }, "weight_unit": { - "allOf": [ - { - "$ref": "#/$defs/MassUnit" - } - ], + "$ref": "#/$defs/MassUnit", "default": "gram", "title": "Weight unit" }, @@ -28946,11 +29730,7 @@ "title": "Total reward consumed (mL)" }, "reward_consumed_unit": { - "allOf": [ - { - "$ref": "#/$defs/VolumeUnit" - } - ], + "$ref": "#/$defs/VolumeUnit", "default": "milliliter", "title": "Reward consumed unit" }, @@ -28993,7 +29773,8 @@ "description": "Side of animal", "enum": [ "Left", - "Right" + "Right", + "Midline" ], "title": "Side", "type": "string" @@ -29015,11 +29796,7 @@ "type": "integer" }, "unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "meter", "title": "Size unit" } @@ -29059,11 +29836,7 @@ "type": "integer" }, "imaging_depth_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "micrometer", "title": "Imaging depth unit" }, @@ -29094,11 +29867,7 @@ "title": "FOV coordinate AP" }, "fov_coordinate_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "micrometer", "title": "FOV coordinate unit" }, @@ -29116,11 +29885,7 @@ "type": "integer" }, "fov_size_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "pixel", "title": "FOV size unit" }, @@ -29160,11 +29925,7 @@ "title": "Frame rate (Hz)" }, "frame_rate_unit": { - "allOf": [ - { - "$ref": "#/$defs/FrequencyUnit" - } - ], + "$ref": "#/$defs/FrequencyUnit", "default": "hertz", "title": "Frame rate unit" }, @@ -29198,11 +29959,7 @@ "title": "Power" }, "power_unit": { - "allOf": [ - { - "$ref": "#/$defs/PowerUnit" - } - ], + "$ref": "#/$defs/PowerUnit", "default": "percent", "title": "Power unit" }, @@ -29234,11 +29991,7 @@ "title": "Z stage position of the fastz actuator for a given targeted depth" }, "scanfield_z_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "micrometer", "title": "Z stage position unit" }, @@ -29267,11 +30020,7 @@ "title": "Notes" }, "session_type": { - "allOf": [ - { - "$ref": "#/$defs/SlapSessionType" - } - ], + "$ref": "#/$defs/SlapSessionType", "title": "Session type" }, "dmd_dilation_x": { @@ -29283,11 +30032,7 @@ "type": "integer" }, "dilation_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "pixel", "title": "Dilation unit" }, @@ -29373,11 +30118,7 @@ "title": "URL to commit being used" }, "parameters": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "title": "Software parameters" } @@ -29487,11 +30228,7 @@ "title": "Port index" }, "additional_settings": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "title": "Additional parameters" }, @@ -29552,11 +30289,7 @@ "title": "Volume (dB)" }, "volume_unit": { - "allOf": [ - { - "$ref": "#/$defs/SoundIntensityUnit" - } - ], + "$ref": "#/$defs/SoundIntensityUnit", "default": "decibels", "title": "Volume unit" } @@ -29572,11 +30305,7 @@ "description": "Description of surgical or other procedure performed on a specimen", "properties": { "procedure_type": { - "allOf": [ - { - "$ref": "#/$defs/SpecimenProcedureType" - } - ], + "$ref": "#/$defs/SpecimenProcedureType", "title": "Procedure type" }, "procedure_name": { @@ -29754,11 +30483,7 @@ "type": "number" }, "step_size_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "micrometer", "title": "Step size unit" }, @@ -29779,11 +30504,7 @@ "type": "number" }, "fov_coordinate_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "micrometer", "title": "FOV coordinate unit" }, @@ -29801,11 +30522,7 @@ "type": "integer" }, "fov_size_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "pixel", "title": "FOV size unit" }, @@ -29842,11 +30559,7 @@ "title": "Frame rate (Hz)" }, "frame_rate_unit": { - "allOf": [ - { - "$ref": "#/$defs/FrequencyUnit" - } - ], + "$ref": "#/$defs/FrequencyUnit", "default": "hertz", "title": "Frame rate unit" }, @@ -29921,11 +30634,7 @@ "type": "integer" }, "excitation_wavelength_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "nanometer", "title": "Laser wavelength unit" }, @@ -29935,11 +30644,7 @@ "type": "number" }, "excitation_power_unit": { - "allOf": [ - { - "$ref": "#/$defs/PowerUnit" - } - ], + "$ref": "#/$defs/PowerUnit", "default": "milliwatt", "title": "Laser power unit" }, @@ -29960,11 +30665,7 @@ "title": "Dilation (pixels)" }, "dilation_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "pixel", "title": "Dilation unit" }, @@ -29989,11 +30690,7 @@ "type": "integer" }, "depth_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "micrometer", "title": "Depth unit" } @@ -30012,6 +30709,16 @@ "title": "StackChannel", "type": "object" }, + "Stage": { + "description": "QCEvaluation Stage\n\nWhen during data processing the QC metrics were derived.", + "enum": [ + "Raw data", + "Processing", + "Analysis" + ], + "title": "Stage", + "type": "string" + }, "StageAxisDirection": { "description": "Direction of motion for motorized stage", "enum": [ @@ -30436,19 +31143,11 @@ "title": "Lot expiration date" }, "stain_type": { - "allOf": [ - { - "$ref": "#/$defs/StainType" - } - ], + "$ref": "#/$defs/StainType", "title": "Stain type" }, "concentration": { - "allOf": [ - { - "$ref": "#/$defs/concentration" - } - ], + "$ref": "#/$defs/concentration", "title": "Concentration (uM)" } }, @@ -30476,7 +31175,8 @@ "description": "QC Status", "enum": [ "Fail", - "Pass" + "Pass", + "Pending" ], "title": "Status", "type": "string" @@ -30641,11 +31341,7 @@ "title": "Light source config" }, "output_parameters": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "title": "Performance metrics" }, @@ -30665,11 +31361,7 @@ "title": "Reward consumed during training (uL)" }, "reward_consumed_unit": { - "allOf": [ - { - "$ref": "#/$defs/VolumeUnit" - } - ], + "$ref": "#/$defs/VolumeUnit", "default": "microliter", "title": "Reward consumed unit" }, @@ -31285,11 +31977,7 @@ "title": "Animal weight (g)" }, "weight_unit": { - "allOf": [ - { - "$ref": "#/$defs/MassUnit" - } - ], + "$ref": "#/$defs/MassUnit", "default": "gram", "title": "Weight unit" }, @@ -31329,6 +32017,7 @@ "ICV injection": "#/$defs/IntraCerebellarVentricleInjection", "Intraperitoneal injection": "#/$defs/IntraperitonealInjection", "Iontophoresis injection": "#/$defs/IontophoresisInjection", + "Myomatrix_Insertion": "#/$defs/MyomatrixInsertion", "Nanoject injection": "#/$defs/NanojectInjection", "Other Subject Procedure": "#/$defs/OtherSubjectProcedure", "Perfusion": "#/$defs/Perfusion", @@ -31358,6 +32047,9 @@ { "$ref": "#/$defs/IontophoresisInjection" }, + { + "$ref": "#/$defs/MyomatrixInsertion" + }, { "$ref": "#/$defs/NanojectInjection" }, @@ -31401,6 +32093,37 @@ "title": "Surgery", "type": "object" }, + "TAIL": { + "properties": { + "name": { + "const": "tail", + "default": "tail", + "enum": [ + "tail" + ], + "title": "Name", + "type": "string" + }, + "registry": { + "$ref": "#/$defs/RegistryModel", + "default": { + "name": "Edinburgh Mouse Atlas Project", + "abbreviation": "EMAPA" + } + }, + "registry_identifier": { + "const": "EMAPA_16748", + "default": "EMAPA_16748", + "enum": [ + "EMAPA_16748" + ], + "title": "Registry Identifier", + "type": "string" + } + }, + "title": "TAIL", + "type": "object" + }, "TAMRON": { "properties": { "name": { @@ -31439,6 +32162,37 @@ "title": "TAMRON", "type": "object" }, + "TENDON_OF_BICEPS_BRACHII": { + "properties": { + "name": { + "const": "tendon of biceps brachii", + "default": "tendon of biceps brachii", + "enum": [ + "tendon of biceps brachii" + ], + "title": "Name", + "type": "string" + }, + "registry": { + "$ref": "#/$defs/RegistryModel", + "default": { + "name": "Edinburgh Mouse Atlas Project", + "abbreviation": "EMAPA" + } + }, + "registry_identifier": { + "const": "EMAPA_25053", + "default": "EMAPA_25053", + "enum": [ + "EMAPA_25053" + ], + "title": "Registry Identifier", + "type": "string" + } + }, + "title": "TENDON_OF_BICEPS_BRACHII", + "type": "object" + }, "THERMO_FISHER_SCIENTIFIC": { "properties": { "name": { @@ -31727,6 +32481,68 @@ "title": "TREADMILL", "type": "object" }, + "TRICEPS_BRACHII": { + "properties": { + "name": { + "const": "triceps brachii", + "default": "triceps brachii", + "enum": [ + "triceps brachii" + ], + "title": "Name", + "type": "string" + }, + "registry": { + "$ref": "#/$defs/RegistryModel", + "default": { + "name": "Edinburgh Mouse Atlas Project", + "abbreviation": "EMAPA" + } + }, + "registry_identifier": { + "const": "EMAPA_19111", + "default": "EMAPA_19111", + "enum": [ + "EMAPA_19111" + ], + "title": "Registry Identifier", + "type": "string" + } + }, + "title": "TRICEPS_BRACHII", + "type": "object" + }, + "TRUNK": { + "properties": { + "name": { + "const": "trunk", + "default": "trunk", + "enum": [ + "trunk" + ], + "title": "Name", + "type": "string" + }, + "registry": { + "$ref": "#/$defs/RegistryModel", + "default": { + "name": "Edinburgh Mouse Atlas Project", + "abbreviation": "EMAPA" + } + }, + "registry_identifier": { + "const": "EMAPA_31857", + "default": "EMAPA_31857", + "enum": [ + "EMAPA_31857" + ], + "title": "Registry Identifier", + "type": "string" + } + }, + "title": "TRUNK", + "type": "object" + }, "TWCF": { "properties": { "name": { @@ -32453,11 +33269,7 @@ "title": "Port index" }, "additional_settings": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "title": "Additional parameters" }, @@ -32510,11 +33322,7 @@ "title": "Width of treadmill (mm)" }, "width_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "centimeter", "title": "Width unit" } @@ -32976,11 +33784,7 @@ "title": "Port index" }, "additional_settings": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "title": "Additional parameters" }, @@ -33034,11 +33838,7 @@ "title": "Diameter" }, "diameter_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "centimeter", "title": "Diameter unit" } @@ -33231,11 +34031,7 @@ "type": "string" }, "stimulus_parameters": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "description": "Define and list the parameter values used (e.g. all TF or orientation values)", "title": "Stimulus parameters" @@ -33310,11 +34106,7 @@ "type": "integer" }, "target_fraction_weight_unit": { - "allOf": [ - { - "$ref": "#/$defs/UnitlessUnit" - } - ], + "$ref": "#/$defs/UnitlessUnit", "default": "percent", "title": "Target fraction weight unit" }, @@ -33330,11 +34122,7 @@ "title": "Minimum water per day (mL)" }, "minimum_water_per_day_unit": { - "allOf": [ - { - "$ref": "#/$defs/VolumeUnit" - } - ], + "$ref": "#/$defs/VolumeUnit", "default": "milliliter", "title": "Minimum water per day unit" }, @@ -33351,11 +34139,7 @@ "title": "Baseline weight (g)" }, "weight_unit": { - "allOf": [ - { - "$ref": "#/$defs/MassUnit" - } - ], + "$ref": "#/$defs/MassUnit", "default": "gram", "title": "Weight unit" }, @@ -33850,11 +34634,7 @@ "title": "Port index" }, "additional_settings": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "title": "Additional parameters" }, @@ -33918,20 +34698,12 @@ "title": "Width (mm)" }, "size_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "millimeter", "title": "Size unit" }, "encoder": { - "allOf": [ - { - "$ref": "#/$defs/Device" - } - ], + "$ref": "#/$defs/Device", "title": "Encoder" }, "encoder_output": { @@ -33951,11 +34723,7 @@ "type": "integer" }, "magnetic_brake": { - "allOf": [ - { - "$ref": "#/$defs/Device" - } - ], + "$ref": "#/$defs/Device", "title": "Magnetic brake" }, "brake_output": { @@ -33971,11 +34739,7 @@ "title": "Brake DAQ channel" }, "torque_sensor": { - "allOf": [ - { - "$ref": "#/$defs/Device" - } - ], + "$ref": "#/$defs/Device", "title": "Torque sensor" }, "torque_output": { @@ -34358,11 +35122,7 @@ "title": "Value" }, "unit": { - "allOf": [ - { - "$ref": "#/$defs/ConcentrationUnit" - } - ], + "$ref": "#/$defs/ConcentrationUnit", "default": "micromolar" } }, @@ -34383,10 +35143,10 @@ "type": "string" }, "schema_version": { - "const": "1.0.0", - "default": "1.0.0", + "const": "1.0.1", + "default": "1.0.1", "enum": [ - "1.0.0" + "1.0.1" ], "title": "Schema Version", "type": "string" @@ -34420,11 +35180,7 @@ "type": "string" }, "metadata_status": { - "allOf": [ - { - "$ref": "#/$defs/MetadataStatus" - } - ], + "$ref": "#/$defs/MetadataStatus", "default": "Unknown", "description": "The status of the metadata.", "title": " Metadata Status" @@ -34436,7 +35192,7 @@ }, "type": "array" }, - "default": [], + "default": {}, "description": "Links to the data asset on different platforms.", "title": "External Links", "type": "object" diff --git a/schemas/procedures_schema.json b/schemas/procedures_schema.json index f9944327..d2c03a6a 100644 --- a/schemas/procedures_schema.json +++ b/schemas/procedures_schema.json @@ -574,17 +574,15 @@ "title": "Duration" }, "duration_unit": { - "allOf": [ - { - "$ref": "#/$defs/TimeUnit" - } - ], + "$ref": "#/$defs/TimeUnit", "default": "minute", "title": "Duration unit" }, "level": { "anyOf": [ { + "maximum": 5.0, + "minimum": 1.0, "type": "number" }, { @@ -1018,11 +1016,7 @@ "title": "Lot expiration date" }, "immunolabel_class": { - "allOf": [ - { - "$ref": "#/$defs/ImmunolabelClass" - } - ], + "$ref": "#/$defs/ImmunolabelClass", "title": "Immunolabel class" }, "fluorophore": { @@ -1049,11 +1043,7 @@ "title": "Mass of antibody" }, "mass_unit": { - "allOf": [ - { - "$ref": "#/$defs/MassUnit" - } - ], + "$ref": "#/$defs/MassUnit", "default": "microgram", "title": "Mass unit" }, @@ -1118,6 +1108,37 @@ "title": "BASLER", "type": "object" }, + "BICEPS_BRACHII": { + "properties": { + "name": { + "const": "biceps brachii", + "default": "biceps brachii", + "enum": [ + "biceps brachii" + ], + "title": "Name", + "type": "string" + }, + "registry": { + "$ref": "#/$defs/RegistryModel", + "default": { + "name": "Edinburgh Mouse Atlas Project", + "abbreviation": "EMAPA" + } + }, + "registry_identifier": { + "const": "EMAPA_19108", + "default": "EMAPA_19108", + "enum": [ + "EMAPA_19108" + ], + "title": "Registry Identifier", + "type": "string" + } + }, + "title": "BICEPS_BRACHII", + "type": "object" + }, "BaseName": { "additionalProperties": false, "description": "A simple model associating a name with an abbreviation", @@ -1673,11 +1694,7 @@ "type": "string" }, "craniotomy_type": { - "allOf": [ - { - "$ref": "#/$defs/CraniotomyType" - } - ], + "$ref": "#/$defs/CraniotomyType", "title": "Craniotomy type" }, "craniotomy_hemisphere": { @@ -1709,11 +1726,7 @@ "title": "Bregma to lambda (mm)" }, "bregma_to_lambda_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "millimeter", "title": "Bregma to lambda unit" }, @@ -1769,11 +1782,7 @@ "title": "Recovery time" }, "recovery_time_unit": { - "allOf": [ - { - "$ref": "#/$defs/TimeUnit" - } - ], + "$ref": "#/$defs/TimeUnit", "default": "minute", "title": "Recovery time unit" } @@ -1807,6 +1816,37 @@ "title": "CurrentUnit", "type": "string" }, + "DELTOID": { + "properties": { + "name": { + "const": "deltoid", + "default": "deltoid", + "enum": [ + "deltoid" + ], + "title": "Name", + "type": "string" + }, + "registry": { + "$ref": "#/$defs/RegistryModel", + "default": { + "name": "Edinburgh Mouse Atlas Project", + "abbreviation": "EMAPA" + } + }, + "registry_identifier": { + "const": "EMAPA_18177", + "default": "EMAPA_18177", + "enum": [ + "EMAPA_18177" + ], + "title": "Registry Identifier", + "type": "string" + } + }, + "title": "DELTOID", + "type": "object" + }, "DODOTRONIC": { "properties": { "name": { @@ -2074,6 +2114,223 @@ "title": "EURESYS", "type": "object" }, + "EXTENSOR_CARPI_RADIALIS_LONGUS": { + "properties": { + "name": { + "const": "extensor carpi radialis longus", + "default": "extensor carpi radialis longus", + "enum": [ + "extensor carpi radialis longus" + ], + "title": "Name", + "type": "string" + }, + "registry": { + "$ref": "#/$defs/RegistryModel", + "default": { + "name": "Edinburgh Mouse Atlas Project", + "abbreviation": "EMAPA" + } + }, + "registry_identifier": { + "const": "EMAPA_36189", + "default": "EMAPA_36189", + "enum": [ + "EMAPA_36189" + ], + "title": "Registry Identifier", + "type": "string" + } + }, + "title": "EXTENSOR_CARPI_RADIALIS_LONGUS", + "type": "object" + }, + "EXTENSOR_CARPI_ULNARIS": { + "properties": { + "name": { + "const": "extensor carpi ulnaris", + "default": "extensor carpi ulnaris", + "enum": [ + "extensor carpi ulnaris" + ], + "title": "Name", + "type": "string" + }, + "registry": { + "$ref": "#/$defs/RegistryModel", + "default": { + "name": "Edinburgh Mouse Atlas Project", + "abbreviation": "EMAPA" + } + }, + "registry_identifier": { + "const": "EMAPA_36190", + "default": "EMAPA_36190", + "enum": [ + "EMAPA_36190" + ], + "title": "Registry Identifier", + "type": "string" + } + }, + "title": "EXTENSOR_CARPI_ULNARIS", + "type": "object" + }, + "EXTENSOR_DIGITORUM_COMMUNIS": { + "properties": { + "name": { + "const": "extensor digitorum communis", + "default": "extensor digitorum communis", + "enum": [ + "extensor digitorum communis" + ], + "title": "Name", + "type": "string" + }, + "registry": { + "$ref": "#/$defs/RegistryModel", + "default": { + "name": "Edinburgh Mouse Atlas Project", + "abbreviation": "EMAPA" + } + }, + "registry_identifier": { + "const": "EMAPA_36191", + "default": "EMAPA_36191", + "enum": [ + "EMAPA_36191" + ], + "title": "Registry Identifier", + "type": "string" + } + }, + "title": "EXTENSOR_DIGITORUM_COMMUNIS", + "type": "object" + }, + "EXTENSOR_DIGITORUM_LATERALIS": { + "properties": { + "name": { + "const": "extensor digitorum lateralis", + "default": "extensor digitorum lateralis", + "enum": [ + "extensor digitorum lateralis" + ], + "title": "Name", + "type": "string" + }, + "registry": { + "$ref": "#/$defs/RegistryModel", + "default": { + "name": "Edinburgh Mouse Atlas Project", + "abbreviation": "EMAPA" + } + }, + "registry_identifier": { + "const": "EMAPA_36192", + "default": "EMAPA_36192", + "enum": [ + "EMAPA_36192" + ], + "title": "Registry Identifier", + "type": "string" + } + }, + "title": "EXTENSOR_DIGITORUM_LATERALIS", + "type": "object" + }, + "FLEXOR_CARPI_RADIALIS": { + "properties": { + "name": { + "const": "flexor carpi radialis", + "default": "flexor carpi radialis", + "enum": [ + "flexor carpi radialis" + ], + "title": "Name", + "type": "string" + }, + "registry": { + "$ref": "#/$defs/RegistryModel", + "default": { + "name": "Edinburgh Mouse Atlas Project", + "abbreviation": "EMAPA" + } + }, + "registry_identifier": { + "const": "EMAPA_36197", + "default": "EMAPA_36197", + "enum": [ + "EMAPA_36197" + ], + "title": "Registry Identifier", + "type": "string" + } + }, + "title": "FLEXOR_CARPI_RADIALIS", + "type": "object" + }, + "FLEXOR_CARPI_ULNARIS": { + "properties": { + "name": { + "const": "flexor carpi ulnaris", + "default": "flexor carpi ulnaris", + "enum": [ + "flexor carpi ulnaris" + ], + "title": "Name", + "type": "string" + }, + "registry": { + "$ref": "#/$defs/RegistryModel", + "default": { + "name": "Edinburgh Mouse Atlas Project", + "abbreviation": "EMAPA" + } + }, + "registry_identifier": { + "const": "EMAPA_36198", + "default": "EMAPA_36198", + "enum": [ + "EMAPA_36198" + ], + "title": "Registry Identifier", + "type": "string" + } + }, + "title": "FLEXOR_CARPI_ULNARIS", + "type": "object" + }, + "FLEXOR_DIGITORUM_PROFUNDUS": { + "properties": { + "name": { + "const": "flexor digitorum profundus", + "default": "flexor digitorum profundus", + "enum": [ + "flexor digitorum profundus" + ], + "title": "Name", + "type": "string" + }, + "registry": { + "$ref": "#/$defs/RegistryModel", + "default": { + "name": "Edinburgh Mouse Atlas Project", + "abbreviation": "EMAPA" + } + }, + "registry_identifier": { + "const": "EMAPA_19319", + "default": "EMAPA_19319", + "enum": [ + "EMAPA_19319" + ], + "title": "Registry Identifier", + "type": "string" + } + }, + "title": "FLEXOR_DIGITORUM_PROFUNDUS", + "type": "object" + }, "FLIR": { "properties": { "name": { @@ -2125,6 +2382,37 @@ "title": "FLIR", "type": "object" }, + "FORELIMB": { + "properties": { + "name": { + "const": "forelimb", + "default": "forelimb", + "enum": [ + "forelimb" + ], + "title": "Name", + "type": "string" + }, + "registry": { + "$ref": "#/$defs/RegistryModel", + "default": { + "name": "Edinburgh Mouse Atlas Project", + "abbreviation": "EMAPA" + } + }, + "registry_identifier": { + "const": "EMAPA_17412", + "default": "EMAPA_17412", + "enum": [ + "EMAPA_17412" + ], + "title": "Registry Identifier", + "type": "string" + } + }, + "title": "FORELIMB", + "type": "object" + }, "FUJINON": { "properties": { "name": { @@ -2646,11 +2934,7 @@ "title": "Port index" }, "additional_settings": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "title": "Additional parameters" }, @@ -2678,11 +2962,7 @@ "title": "Core diameter (um)" }, "core_diameter_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "micrometer", "title": "Core diameter unit" }, @@ -2737,11 +3017,7 @@ "title": "Total length (mm)" }, "length_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "millimeter", "title": "Length unit" } @@ -3305,11 +3581,7 @@ "title": "Species" }, "gene": { - "allOf": [ - { - "$ref": "#/$defs/PIDName" - } - ], + "$ref": "#/$defs/PIDName", "title": "Gene name, accession number, and registry" }, "probe_sequences": { @@ -3320,11 +3592,7 @@ "type": "array" }, "readout": { - "allOf": [ - { - "$ref": "#/$defs/HCRReadout" - } - ], + "$ref": "#/$defs/HCRReadout", "title": "Readout" }, "initiator_name": { @@ -3756,20 +4024,12 @@ "type": "integer" }, "excitation_wavelength_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "nanometer", "title": "Excitation wavelength unit" }, "stain_type": { - "allOf": [ - { - "$ref": "#/$defs/StainType" - } - ], + "$ref": "#/$defs/StainType", "title": "Stain type" }, "initiator_name": { @@ -3822,31 +4082,93 @@ "title": "HCRSeries", "type": "object" }, - "HOMO_SAPIENS": { + "HEAD": { "properties": { "name": { - "const": "Homo sapiens", - "default": "Homo sapiens", + "const": "head", + "default": "head", "enum": [ - "Homo sapiens" + "head" ], "title": "Name", "type": "string" }, "registry": { + "$ref": "#/$defs/RegistryModel", "default": { - "name": "National Center for Biotechnology Information", - "abbreviation": "NCBI" - }, - "discriminator": { - "mapping": { - "National Center for Biotechnology Information": "#/$defs/NCBI" - }, - "propertyName": "name" - }, - "oneOf": [ - { - "$ref": "#/$defs/NCBI" + "name": "Edinburgh Mouse Atlas Project", + "abbreviation": "EMAPA" + } + }, + "registry_identifier": { + "const": "EMAPA_31858", + "default": "EMAPA_31858", + "enum": [ + "EMAPA_31858" + ], + "title": "Registry Identifier", + "type": "string" + } + }, + "title": "HEAD", + "type": "object" + }, + "HINDLIMB": { + "properties": { + "name": { + "const": "hindlimb", + "default": "hindlimb", + "enum": [ + "hindlimb" + ], + "title": "Name", + "type": "string" + }, + "registry": { + "$ref": "#/$defs/RegistryModel", + "default": { + "name": "Edinburgh Mouse Atlas Project", + "abbreviation": "EMAPA" + } + }, + "registry_identifier": { + "const": "EMAPA_17458", + "default": "EMAPA_17458", + "enum": [ + "EMAPA_17458" + ], + "title": "Registry Identifier", + "type": "string" + } + }, + "title": "HINDLIMB", + "type": "object" + }, + "HOMO_SAPIENS": { + "properties": { + "name": { + "const": "Homo sapiens", + "default": "Homo sapiens", + "enum": [ + "Homo sapiens" + ], + "title": "Name", + "type": "string" + }, + "registry": { + "default": { + "name": "National Center for Biotechnology Information", + "abbreviation": "NCBI" + }, + "discriminator": { + "mapping": { + "National Center for Biotechnology Information": "#/$defs/NCBI" + }, + "propertyName": "name" + }, + "oneOf": [ + { + "$ref": "#/$defs/NCBI" } ], "title": "Registry" @@ -4352,7 +4674,14 @@ "properties": { "injection_materials": { "items": { - "anyOf": [ + "discriminator": { + "mapping": { + "Reagent": "#/$defs/NonViralMaterial", + "Virus": "#/$defs/ViralMaterial" + }, + "propertyName": "material_type" + }, + "oneOf": [ { "$ref": "#/$defs/ViralMaterial" }, @@ -4381,11 +4710,7 @@ "title": "Recovery time" }, "recovery_time_unit": { - "allOf": [ - { - "$ref": "#/$defs/TimeUnit" - } - ], + "$ref": "#/$defs/TimeUnit", "default": "minute", "title": "Recovery time unit" }, @@ -4405,11 +4730,7 @@ "title": "Injection duration" }, "injection_duration_unit": { - "allOf": [ - { - "$ref": "#/$defs/TimeUnit" - } - ], + "$ref": "#/$defs/TimeUnit", "default": "minute", "title": "Injection duration unit" }, @@ -4467,11 +4788,7 @@ "type": "array" }, "injection_coordinate_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "millimeter", "title": "Injection coordinate unit" }, @@ -4504,11 +4821,7 @@ "title": "Bregma to lambda (mm)" }, "bregma_to_lambda_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "millimeter", "title": "Bregma to lambda unit" }, @@ -4524,11 +4837,7 @@ "title": "Injection angle (deg)" }, "injection_angle_unit": { - "allOf": [ - { - "$ref": "#/$defs/AngleUnit" - } - ], + "$ref": "#/$defs/AngleUnit", "default": "degrees", "title": "Injection angle unit" }, @@ -4581,11 +4890,7 @@ "type": "array" }, "injection_volume_unit": { - "allOf": [ - { - "$ref": "#/$defs/VolumeUnit" - } - ], + "$ref": "#/$defs/VolumeUnit", "default": "nanoliter", "title": "Injection volume unit" } @@ -4608,7 +4913,14 @@ "properties": { "injection_materials": { "items": { - "anyOf": [ + "discriminator": { + "mapping": { + "Reagent": "#/$defs/NonViralMaterial", + "Virus": "#/$defs/ViralMaterial" + }, + "propertyName": "material_type" + }, + "oneOf": [ { "$ref": "#/$defs/ViralMaterial" }, @@ -4637,11 +4949,7 @@ "title": "Recovery time" }, "recovery_time_unit": { - "allOf": [ - { - "$ref": "#/$defs/TimeUnit" - } - ], + "$ref": "#/$defs/TimeUnit", "default": "minute", "title": "Recovery time unit" }, @@ -4661,11 +4969,7 @@ "title": "Injection duration" }, "injection_duration_unit": { - "allOf": [ - { - "$ref": "#/$defs/TimeUnit" - } - ], + "$ref": "#/$defs/TimeUnit", "default": "minute", "title": "Injection duration unit" }, @@ -4723,11 +5027,7 @@ "type": "array" }, "injection_coordinate_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "millimeter", "title": "Injection coordinate unit" }, @@ -4760,11 +5060,7 @@ "title": "Bregma to lambda (mm)" }, "bregma_to_lambda_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "millimeter", "title": "Bregma to lambda unit" }, @@ -4780,11 +5076,7 @@ "title": "Injection angle (deg)" }, "injection_angle_unit": { - "allOf": [ - { - "$ref": "#/$defs/AngleUnit" - } - ], + "$ref": "#/$defs/AngleUnit", "default": "degrees", "title": "Injection angle unit" }, @@ -4837,11 +5129,7 @@ "type": "array" }, "injection_volume_unit": { - "allOf": [ - { - "$ref": "#/$defs/VolumeUnit" - } - ], + "$ref": "#/$defs/VolumeUnit", "default": "nanoliter", "title": "Injection volume unit" } @@ -4864,7 +5152,14 @@ "properties": { "injection_materials": { "items": { - "anyOf": [ + "discriminator": { + "mapping": { + "Reagent": "#/$defs/NonViralMaterial", + "Virus": "#/$defs/ViralMaterial" + }, + "propertyName": "material_type" + }, + "oneOf": [ { "$ref": "#/$defs/ViralMaterial" }, @@ -4893,11 +5188,7 @@ "title": "Recovery time" }, "recovery_time_unit": { - "allOf": [ - { - "$ref": "#/$defs/TimeUnit" - } - ], + "$ref": "#/$defs/TimeUnit", "default": "minute", "title": "Recovery time unit" }, @@ -4917,11 +5208,7 @@ "title": "Injection duration" }, "injection_duration_unit": { - "allOf": [ - { - "$ref": "#/$defs/TimeUnit" - } - ], + "$ref": "#/$defs/TimeUnit", "default": "minute", "title": "Injection duration unit" }, @@ -4963,11 +5250,7 @@ "title": "Injection volume (uL)" }, "injection_volume_unit": { - "allOf": [ - { - "$ref": "#/$defs/VolumeUnit" - } - ], + "$ref": "#/$defs/VolumeUnit", "default": "microliter", "title": "Injection volume unit" } @@ -4986,7 +5269,14 @@ "properties": { "injection_materials": { "items": { - "anyOf": [ + "discriminator": { + "mapping": { + "Reagent": "#/$defs/NonViralMaterial", + "Virus": "#/$defs/ViralMaterial" + }, + "propertyName": "material_type" + }, + "oneOf": [ { "$ref": "#/$defs/ViralMaterial" }, @@ -5015,11 +5305,7 @@ "title": "Recovery time" }, "recovery_time_unit": { - "allOf": [ - { - "$ref": "#/$defs/TimeUnit" - } - ], + "$ref": "#/$defs/TimeUnit", "default": "minute", "title": "Recovery time unit" }, @@ -5039,11 +5325,7 @@ "title": "Injection duration" }, "injection_duration_unit": { - "allOf": [ - { - "$ref": "#/$defs/TimeUnit" - } - ], + "$ref": "#/$defs/TimeUnit", "default": "minute", "title": "Injection duration unit" }, @@ -5101,11 +5383,7 @@ "type": "array" }, "injection_coordinate_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "millimeter", "title": "Injection coordinate unit" }, @@ -5138,11 +5416,7 @@ "title": "Bregma to lambda (mm)" }, "bregma_to_lambda_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "millimeter", "title": "Bregma to lambda unit" }, @@ -5158,11 +5432,7 @@ "title": "Injection angle (deg)" }, "injection_angle_unit": { - "allOf": [ - { - "$ref": "#/$defs/AngleUnit" - } - ], + "$ref": "#/$defs/AngleUnit", "default": "degrees", "title": "Injection angle unit" }, @@ -5211,11 +5481,7 @@ "title": "Injection current (uA)" }, "injection_current_unit": { - "allOf": [ - { - "$ref": "#/$defs/CurrentUnit" - } - ], + "$ref": "#/$defs/CurrentUnit", "default": "microamps", "title": "Injection current unit" }, @@ -5377,6 +5643,37 @@ "title": "JULABO", "type": "object" }, + "LATERAL_HEAD_OF_TRICEPS_BRACHII": { + "properties": { + "name": { + "const": "lateral head of triceps brachii", + "default": "lateral head of triceps brachii", + "enum": [ + "lateral head of triceps brachii" + ], + "title": "Name", + "type": "string" + }, + "registry": { + "$ref": "#/$defs/RegistryModel", + "default": { + "name": "Edinburgh Mouse Atlas Project", + "abbreviation": "EMAPA" + } + }, + "registry_identifier": { + "const": "EMAPA_36184", + "default": "EMAPA_36184", + "enum": [ + "EMAPA_36184" + ], + "title": "Registry Identifier", + "type": "string" + } + }, + "title": "LATERAL_HEAD_OF_TRICEPS_BRACHII", + "type": "object" + }, "LEICA": { "properties": { "name": { @@ -5504,6 +5801,68 @@ "title": "LIFECANVAS", "type": "object" }, + "LONG_HEAD_OF_BICEPS_BRACHII": { + "properties": { + "name": { + "const": "long head of biceps brachii", + "default": "long head of biceps brachii", + "enum": [ + "long head of biceps brachii" + ], + "title": "Name", + "type": "string" + }, + "registry": { + "$ref": "#/$defs/RegistryModel", + "default": { + "name": "Edinburgh Mouse Atlas Project", + "abbreviation": "EMAPA" + } + }, + "registry_identifier": { + "const": "EMAPA_25054", + "default": "EMAPA_25054", + "enum": [ + "EMAPA_25054" + ], + "title": "Registry Identifier", + "type": "string" + } + }, + "title": "LONG_HEAD_OF_BICEPS_BRACHII", + "type": "object" + }, + "LONG_HEAD_OF_TRICEPS_BRACHII": { + "properties": { + "name": { + "const": "long head of triceps brachii", + "default": "long head of triceps brachii", + "enum": [ + "long head of triceps brachii" + ], + "title": "Name", + "type": "string" + }, + "registry": { + "$ref": "#/$defs/RegistryModel", + "default": { + "name": "Edinburgh Mouse Atlas Project", + "abbreviation": "EMAPA" + } + }, + "registry_identifier": { + "const": "EMAPA_36185", + "default": "EMAPA_36185", + "enum": [ + "EMAPA_36185" + ], + "title": "Registry Identifier", + "type": "string" + } + }, + "title": "LONG_HEAD_OF_TRICEPS_BRACHII", + "type": "object" + }, "LUMEN_DYNAMICS": { "properties": { "name": { @@ -5686,6 +6045,37 @@ "title": "MEADOWLARK_OPTICS", "type": "object" }, + "MEDIAL_HEAD_OF_TRICEPS_BRACHII": { + "properties": { + "name": { + "const": "medial head of triceps brachii", + "default": "medial head of triceps brachii", + "enum": [ + "medial head of triceps brachii" + ], + "title": "Name", + "type": "string" + }, + "registry": { + "$ref": "#/$defs/RegistryModel", + "default": { + "name": "Edinburgh Mouse Atlas Project", + "abbreviation": "EMAPA" + } + }, + "registry_identifier": { + "const": "EMAPA_36186", + "default": "EMAPA_36186", + "enum": [ + "EMAPA_36186" + ], + "title": "Registry Identifier", + "type": "string" + } + }, + "title": "MEDIAL_HEAD_OF_TRICEPS_BRACHII", + "type": "object" + }, "MIDOPT": { "properties": { "name": { @@ -5956,36 +6346,755 @@ "title": "MassUnit", "type": "string" }, - "NATIONAL_INSTRUMENTS": { + "MyomatrixArray": { + "additionalProperties": false, + "description": "Description of a Myomatrix array", "properties": { - "name": { - "const": "National Instruments", - "default": "National Instruments", + "device_type": { + "const": "Myomatrix Array", + "default": "Myomatrix Array", "enum": [ - "National Instruments" + "Myomatrix Array" ], - "title": "Name", + "title": "Device Type", "type": "string" }, - "abbreviation": { - "const": null, - "default": null, - "enum": [ - null - ], - "title": "Abbreviation", - "type": "null" + "name": { + "title": "Device name", + "type": "string" }, - "registry": { - "default": { - "name": "Research Organization Registry", - "abbreviation": "ROR" - }, - "discriminator": { - "mapping": { - "Research Organization Registry": "#/$defs/ROR" + "serial_number": { + "anyOf": [ + { + "type": "string" }, - "propertyName": "name" + { + "type": "null" + } + ], + "default": null, + "title": "Serial number" + }, + "manufacturer": { + "anyOf": [ + { + "discriminator": { + "mapping": { + "AA Opto Electronic": "#/$defs/AA_OPTO_ELECTRONIC", + "ASUS": "#/$defs/ASUS", + "Abcam": "#/$defs/ABCAM", + "Addgene": "#/$defs/ADDGENE", + "Ailipu Technology Co": "#/$defs/AILIPU", + "Allen Institute": "#/$defs/AI", + "Allen Institute for Brain Science": "#/$defs/AIBS", + "Allen Institute for Neural Dynamics": "#/$defs/AIND", + "Allied": "#/$defs/ALLIED", + "Applied Scientific Instrumentation": "#/$defs/ASI", + "Arecont Vision Costar": "#/$defs/ARECONT_VISION_COSTAR", + "Basler": "#/$defs/BASLER", + "Cambridge Technology": "#/$defs/CAMBRIDGE_TECHNOLOGY", + "Carl Zeiss": "#/$defs/CARL_ZEISS", + "Champalimaud Foundation": "#/$defs/CHAMPALIMAUD", + "Chan Zuckerberg Initiative": "#/$defs/CZI", + "Chroma": "#/$defs/CHROMA", + "Coherent Scientific": "#/$defs/COHERENT_SCIENTIFIC", + "Columbia University": "#/$defs/COLUMBIA", + "Computar": "#/$defs/COMPUTAR", + "Conoptics": "#/$defs/CONOPTICS", + "Custom": "#/$defs/CUSTOM", + "Dodotronic": "#/$defs/DODOTRONIC", + "Doric": "#/$defs/DORIC", + "Ealing": "#/$defs/EALING", + "Edmund Optics": "#/$defs/EDMUND_OPTICS", + "Emory University": "#/$defs/EMORY", + "Euresys": "#/$defs/EURESYS", + "Fujinon": "#/$defs/FUJINON", + "Hamamatsu": "#/$defs/HAMAMATSU", + "Hamilton": "#/$defs/HAMILTON", + "Huazhong University of Science and Technology": "#/$defs/HUST", + "IR Robot Co": "#/$defs/IR_ROBOT_CO", + "ISL Products International": "#/$defs/ISL", + "Infinity Photo-Optical": "#/$defs/INFINITY_PHOTO_OPTICAL", + "Integrated DNA Technologies": "#/$defs/IDT", + "Interuniversity Microelectronics Center": "#/$defs/IMEC", + "Invitrogen": "#/$defs/INVITROGEN", + "Jackson Laboratory": "#/$defs/JAX", + "Janelia Research Campus": "#/$defs/JANELIA", + "Julabo": "#/$defs/JULABO", + "LG": "#/$defs/LG", + "Leica": "#/$defs/LEICA", + "LifeCanvas": "#/$defs/LIFECANVAS", + "Lumen Dynamics": "#/$defs/LUMEN_DYNAMICS", + "MBF Bioscience": "#/$defs/MBF", + "MKS Newport": "#/$defs/MKS_NEWPORT", + "MPI": "#/$defs/MPI", + "Meadowlark Optics": "#/$defs/MEADOWLARK_OPTICS", + "Michael J. Fox Foundation for Parkinson's Research": "#/$defs/MJFF", + "Midwest Optical Systems, Inc.": "#/$defs/MIDOPT", + "Mitutuyo": "#/$defs/MITUTUYO", + "NResearch Inc": "#/$defs/NRESEARCH_INC", + "National Center for Complementary and Integrative Health": "#/$defs/NCCIH", + "National Institute of Mental Health": "#/$defs/NIMH", + "National Institute of Neurological Disorders and Stroke": "#/$defs/NINDS", + "National Instruments": "#/$defs/NATIONAL_INSTRUMENTS", + "Navitar": "#/$defs/NAVITAR", + "Neurophotometrics": "#/$defs/NEUROPHOTOMETRICS", + "New Scale Technologies": "#/$defs/NEW_SCALE_TECHNOLOGIES", + "New York University": "#/$defs/NYU", + "Nikon": "#/$defs/NIKON", + "Olympus": "#/$defs/OLYMPUS", + "Open Ephys Production Site": "#/$defs/OEPS", + "Optotune": "#/$defs/OPTOTUNE", + "Other": "#/$defs/OTHER", + "Oxxius": "#/$defs/OXXIUS", + "Prizmatix": "#/$defs/PRIZMATIX", + "Quantifi": "#/$defs/QUANTIFI", + "Raspberry Pi": "#/$defs/RASPBERRY_PI", + "SICGEN": "#/$defs/SICGEN", + "Schneider-Kreuznach": "#/$defs/SCHNEIDER_KREUZNACH", + "Second Order Effects": "#/$defs/SECOND_ORDER_EFFECTS", + "Semrock": "#/$defs/SEMROCK", + "Sigma-Aldritch": "#/$defs/SIGMA_ALDRITCH", + "Simons Foundation": "#/$defs/SIMONS_FOUNDATION", + "Spinnaker": "#/$defs/SPINNAKER", + "Tamron": "#/$defs/TAMRON", + "Technical Manufacturing Corporation": "#/$defs/TMC", + "Teledyne FLIR": "#/$defs/FLIR", + "Templeton World Charity Foundation": "#/$defs/TWCF", + "The Imaging Source": "#/$defs/THE_IMAGING_SOURCE", + "The Lee Company": "#/$defs/THE_LEE_COMPANY", + "Thermo Fisher Scientific": "#/$defs/THERMO_FISHER_SCIENTIFIC", + "Thorlabs": "#/$defs/THORLABS", + "Tymphany": "#/$defs/TYMPHANY", + "Vieworks": "#/$defs/VIEWORKS", + "Vortran": "#/$defs/VORTRAN", + "ams OSRAM": "#/$defs/AMS_OSRAM" + }, + "propertyName": "name" + }, + "oneOf": [ + { + "$ref": "#/$defs/AA_OPTO_ELECTRONIC" + }, + { + "$ref": "#/$defs/ASUS" + }, + { + "$ref": "#/$defs/ABCAM" + }, + { + "$ref": "#/$defs/ADDGENE" + }, + { + "$ref": "#/$defs/AILIPU" + }, + { + "$ref": "#/$defs/AI" + }, + { + "$ref": "#/$defs/AIBS" + }, + { + "$ref": "#/$defs/AIND" + }, + { + "$ref": "#/$defs/ALLIED" + }, + { + "$ref": "#/$defs/ASI" + }, + { + "$ref": "#/$defs/ARECONT_VISION_COSTAR" + }, + { + "$ref": "#/$defs/BASLER" + }, + { + "$ref": "#/$defs/CAMBRIDGE_TECHNOLOGY" + }, + { + "$ref": "#/$defs/CARL_ZEISS" + }, + { + "$ref": "#/$defs/CHAMPALIMAUD" + }, + { + "$ref": "#/$defs/CZI" + }, + { + "$ref": "#/$defs/CHROMA" + }, + { + "$ref": "#/$defs/COHERENT_SCIENTIFIC" + }, + { + "$ref": "#/$defs/COLUMBIA" + }, + { + "$ref": "#/$defs/COMPUTAR" + }, + { + "$ref": "#/$defs/CONOPTICS" + }, + { + "$ref": "#/$defs/CUSTOM" + }, + { + "$ref": "#/$defs/DODOTRONIC" + }, + { + "$ref": "#/$defs/DORIC" + }, + { + "$ref": "#/$defs/EALING" + }, + { + "$ref": "#/$defs/EDMUND_OPTICS" + }, + { + "$ref": "#/$defs/EMORY" + }, + { + "$ref": "#/$defs/EURESYS" + }, + { + "$ref": "#/$defs/FUJINON" + }, + { + "$ref": "#/$defs/HAMAMATSU" + }, + { + "$ref": "#/$defs/HAMILTON" + }, + { + "$ref": "#/$defs/HUST" + }, + { + "$ref": "#/$defs/IR_ROBOT_CO" + }, + { + "$ref": "#/$defs/ISL" + }, + { + "$ref": "#/$defs/INFINITY_PHOTO_OPTICAL" + }, + { + "$ref": "#/$defs/IDT" + }, + { + "$ref": "#/$defs/IMEC" + }, + { + "$ref": "#/$defs/INVITROGEN" + }, + { + "$ref": "#/$defs/JAX" + }, + { + "$ref": "#/$defs/JANELIA" + }, + { + "$ref": "#/$defs/JULABO" + }, + { + "$ref": "#/$defs/LG" + }, + { + "$ref": "#/$defs/LEICA" + }, + { + "$ref": "#/$defs/LUMEN_DYNAMICS" + }, + { + "$ref": "#/$defs/LIFECANVAS" + }, + { + "$ref": "#/$defs/MBF" + }, + { + "$ref": "#/$defs/MKS_NEWPORT" + }, + { + "$ref": "#/$defs/MPI" + }, + { + "$ref": "#/$defs/MEADOWLARK_OPTICS" + }, + { + "$ref": "#/$defs/MJFF" + }, + { + "$ref": "#/$defs/MIDOPT" + }, + { + "$ref": "#/$defs/MITUTUYO" + }, + { + "$ref": "#/$defs/NRESEARCH_INC" + }, + { + "$ref": "#/$defs/NCCIH" + }, + { + "$ref": "#/$defs/NIMH" + }, + { + "$ref": "#/$defs/NINDS" + }, + { + "$ref": "#/$defs/NATIONAL_INSTRUMENTS" + }, + { + "$ref": "#/$defs/NAVITAR" + }, + { + "$ref": "#/$defs/NEUROPHOTOMETRICS" + }, + { + "$ref": "#/$defs/NEW_SCALE_TECHNOLOGIES" + }, + { + "$ref": "#/$defs/NYU" + }, + { + "$ref": "#/$defs/NIKON" + }, + { + "$ref": "#/$defs/OLYMPUS" + }, + { + "$ref": "#/$defs/OEPS" + }, + { + "$ref": "#/$defs/OPTOTUNE" + }, + { + "$ref": "#/$defs/OTHER" + }, + { + "$ref": "#/$defs/OXXIUS" + }, + { + "$ref": "#/$defs/PRIZMATIX" + }, + { + "$ref": "#/$defs/QUANTIFI" + }, + { + "$ref": "#/$defs/RASPBERRY_PI" + }, + { + "$ref": "#/$defs/SICGEN" + }, + { + "$ref": "#/$defs/SCHNEIDER_KREUZNACH" + }, + { + "$ref": "#/$defs/SECOND_ORDER_EFFECTS" + }, + { + "$ref": "#/$defs/SEMROCK" + }, + { + "$ref": "#/$defs/SIGMA_ALDRITCH" + }, + { + "$ref": "#/$defs/SIMONS_FOUNDATION" + }, + { + "$ref": "#/$defs/SPINNAKER" + }, + { + "$ref": "#/$defs/TAMRON" + }, + { + "$ref": "#/$defs/TMC" + }, + { + "$ref": "#/$defs/FLIR" + }, + { + "$ref": "#/$defs/TWCF" + }, + { + "$ref": "#/$defs/THE_IMAGING_SOURCE" + }, + { + "$ref": "#/$defs/THE_LEE_COMPANY" + }, + { + "$ref": "#/$defs/THERMO_FISHER_SCIENTIFIC" + }, + { + "$ref": "#/$defs/THORLABS" + }, + { + "$ref": "#/$defs/TYMPHANY" + }, + { + "$ref": "#/$defs/VIEWORKS" + }, + { + "$ref": "#/$defs/VORTRAN" + }, + { + "$ref": "#/$defs/AMS_OSRAM" + } + ] + }, + { + "type": "null" + } + ], + "default": null, + "title": "Manufacturer" + }, + "model": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Model" + }, + "path_to_cad": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "For CUSTOM manufactured devices", + "title": "Path to CAD diagram" + }, + "port_index": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Port index" + }, + "additional_settings": { + "$ref": "#/$defs/AindGeneric", + "default": {}, + "title": "Additional parameters" + }, + "notes": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Notes" + }, + "array_type": { + "$ref": "#/$defs/MyomatrixArrayType", + "title": "Array type" + } + }, + "required": [ + "name", + "array_type" + ], + "title": "MyomatrixArray", + "type": "object" + }, + "MyomatrixArrayType": { + "description": "Type of Myomatrix array", + "enum": [ + "Injected", + "Sutured" + ], + "title": "MyomatrixArrayType", + "type": "string" + }, + "MyomatrixContact": { + "additionalProperties": false, + "description": "\"Description of a contact on a myomatrix thread", + "properties": { + "body_part": { + "discriminator": { + "mapping": { + "forelimb": "#/$defs/FORELIMB", + "head": "#/$defs/HEAD", + "hindlimb": "#/$defs/HINDLIMB", + "neck": "#/$defs/NECK", + "tail": "#/$defs/TAIL", + "trunk": "#/$defs/TRUNK" + }, + "propertyName": "name" + }, + "oneOf": [ + { + "$ref": "#/$defs/FORELIMB" + }, + { + "$ref": "#/$defs/HEAD" + }, + { + "$ref": "#/$defs/HINDLIMB" + }, + { + "$ref": "#/$defs/NECK" + }, + { + "$ref": "#/$defs/TAIL" + }, + { + "$ref": "#/$defs/TRUNK" + } + ], + "title": "Body part of contact insertion" + }, + "side": { + "$ref": "#/$defs/Side", + "title": "Body side" + }, + "muscle": { + "discriminator": { + "mapping": { + "biceps brachii": "#/$defs/BICEPS_BRACHII", + "deltoid": "#/$defs/DELTOID", + "extensor carpi radialis longus": "#/$defs/EXTENSOR_CARPI_RADIALIS_LONGUS", + "extensor carpi ulnaris": "#/$defs/EXTENSOR_CARPI_ULNARIS", + "extensor digitorum communis": "#/$defs/EXTENSOR_DIGITORUM_COMMUNIS", + "extensor digitorum lateralis": "#/$defs/EXTENSOR_DIGITORUM_LATERALIS", + "flexor carpi radialis": "#/$defs/FLEXOR_CARPI_RADIALIS", + "flexor carpi ulnaris": "#/$defs/FLEXOR_CARPI_ULNARIS", + "flexor digitorum profundus": "#/$defs/FLEXOR_DIGITORUM_PROFUNDUS", + "lateral head of triceps brachii": "#/$defs/LATERAL_HEAD_OF_TRICEPS_BRACHII", + "long head of biceps brachii": "#/$defs/LONG_HEAD_OF_BICEPS_BRACHII", + "long head of triceps brachii": "#/$defs/LONG_HEAD_OF_TRICEPS_BRACHII", + "medial head of triceps brachii": "#/$defs/MEDIAL_HEAD_OF_TRICEPS_BRACHII", + "pars scapularis of deltoid": "#/$defs/PARS_SCAPULARIS_OF_DELTOID", + "pectoralis major": "#/$defs/PECTORALIS_MAJOR", + "short head of biceps brachii": "#/$defs/SHORT_HEAD_OF_BICEPS_BRACHII", + "tendon of biceps brachii": "#/$defs/TENDON_OF_BICEPS_BRACHII", + "triceps brachii": "#/$defs/TRICEPS_BRACHII" + }, + "propertyName": "name" + }, + "oneOf": [ + { + "$ref": "#/$defs/DELTOID" + }, + { + "$ref": "#/$defs/PECTORALIS_MAJOR" + }, + { + "$ref": "#/$defs/TRICEPS_BRACHII" + }, + { + "$ref": "#/$defs/LATERAL_HEAD_OF_TRICEPS_BRACHII" + }, + { + "$ref": "#/$defs/LONG_HEAD_OF_TRICEPS_BRACHII" + }, + { + "$ref": "#/$defs/MEDIAL_HEAD_OF_TRICEPS_BRACHII" + }, + { + "$ref": "#/$defs/BICEPS_BRACHII" + }, + { + "$ref": "#/$defs/LONG_HEAD_OF_BICEPS_BRACHII" + }, + { + "$ref": "#/$defs/SHORT_HEAD_OF_BICEPS_BRACHII" + }, + { + "$ref": "#/$defs/TENDON_OF_BICEPS_BRACHII" + }, + { + "$ref": "#/$defs/PARS_SCAPULARIS_OF_DELTOID" + }, + { + "$ref": "#/$defs/EXTENSOR_CARPI_RADIALIS_LONGUS" + }, + { + "$ref": "#/$defs/EXTENSOR_DIGITORUM_COMMUNIS" + }, + { + "$ref": "#/$defs/EXTENSOR_DIGITORUM_LATERALIS" + }, + { + "$ref": "#/$defs/EXTENSOR_CARPI_ULNARIS" + }, + { + "$ref": "#/$defs/FLEXOR_CARPI_RADIALIS" + }, + { + "$ref": "#/$defs/FLEXOR_CARPI_ULNARIS" + }, + { + "$ref": "#/$defs/FLEXOR_DIGITORUM_PROFUNDUS" + } + ], + "title": "Muscle of contact insertion" + }, + "in_muscle": { + "title": "In muscle", + "type": "boolean" + }, + "notes": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Notes" + } + }, + "required": [ + "body_part", + "side", + "muscle", + "in_muscle" + ], + "title": "MyomatrixContact", + "type": "object" + }, + "MyomatrixInsertion": { + "additionalProperties": false, + "description": "Description of a Myomatrix array insertion for EMG", + "properties": { + "procedure_type": { + "const": "Myomatrix_Insertion", + "default": "Myomatrix_Insertion", + "enum": [ + "Myomatrix_Insertion" + ], + "title": "Procedure Type", + "type": "string" + }, + "protocol_id": { + "description": "DOI for protocols.io", + "title": "Protocol ID", + "type": "string" + }, + "myomatrix_array": { + "$ref": "#/$defs/MyomatrixArray", + "title": "Myomatrix array" + }, + "threads": { + "items": { + "$ref": "#/$defs/MyomatrixThread" + }, + "title": "Array threads", + "type": "array" + } + }, + "required": [ + "protocol_id", + "myomatrix_array", + "threads" + ], + "title": "MyomatrixInsertion", + "type": "object" + }, + "MyomatrixThread": { + "additionalProperties": false, + "description": "Description of a thread of a myomatrix array", + "properties": { + "ground_electrode_location": { + "discriminator": { + "mapping": { + "forelimb": "#/$defs/FORELIMB", + "head": "#/$defs/HEAD", + "hindlimb": "#/$defs/HINDLIMB", + "neck": "#/$defs/NECK", + "tail": "#/$defs/TAIL", + "trunk": "#/$defs/TRUNK" + }, + "propertyName": "name" + }, + "oneOf": [ + { + "$ref": "#/$defs/FORELIMB" + }, + { + "$ref": "#/$defs/HEAD" + }, + { + "$ref": "#/$defs/HINDLIMB" + }, + { + "$ref": "#/$defs/NECK" + }, + { + "$ref": "#/$defs/TAIL" + }, + { + "$ref": "#/$defs/TRUNK" + } + ], + "title": "Location of ground electrode" + }, + "contacts": { + "items": { + "$ref": "#/$defs/MyomatrixContact" + }, + "title": "Contacts", + "type": "array" + } + }, + "required": [ + "ground_electrode_location", + "contacts" + ], + "title": "MyomatrixThread", + "type": "object" + }, + "NATIONAL_INSTRUMENTS": { + "properties": { + "name": { + "const": "National Instruments", + "default": "National Instruments", + "enum": [ + "National Instruments" + ], + "title": "Name", + "type": "string" + }, + "abbreviation": { + "const": null, + "default": null, + "enum": [ + null + ], + "title": "Abbreviation", + "type": "null" + }, + "registry": { + "default": { + "name": "Research Organization Registry", + "abbreviation": "ROR" + }, + "discriminator": { + "mapping": { + "Research Organization Registry": "#/$defs/ROR" + }, + "propertyName": "name" }, "oneOf": [ { @@ -6121,6 +7230,37 @@ "title": "NCCIH", "type": "object" }, + "NECK": { + "properties": { + "name": { + "const": "neck", + "default": "neck", + "enum": [ + "neck" + ], + "title": "Name", + "type": "string" + }, + "registry": { + "$ref": "#/$defs/RegistryModel", + "default": { + "name": "Edinburgh Mouse Atlas Project", + "abbreviation": "EMAPA" + } + }, + "registry_identifier": { + "const": "EMAPA_35587", + "default": "EMAPA_35587", + "enum": [ + "EMAPA_35587" + ], + "title": "Registry Identifier", + "type": "string" + } + }, + "title": "NECK", + "type": "object" + }, "NEUROPHOTOMETRICS": { "properties": { "name": { @@ -6445,7 +7585,14 @@ "properties": { "injection_materials": { "items": { - "anyOf": [ + "discriminator": { + "mapping": { + "Reagent": "#/$defs/NonViralMaterial", + "Virus": "#/$defs/ViralMaterial" + }, + "propertyName": "material_type" + }, + "oneOf": [ { "$ref": "#/$defs/ViralMaterial" }, @@ -6474,11 +7621,7 @@ "title": "Recovery time" }, "recovery_time_unit": { - "allOf": [ - { - "$ref": "#/$defs/TimeUnit" - } - ], + "$ref": "#/$defs/TimeUnit", "default": "minute", "title": "Recovery time unit" }, @@ -6498,11 +7641,7 @@ "title": "Injection duration" }, "injection_duration_unit": { - "allOf": [ - { - "$ref": "#/$defs/TimeUnit" - } - ], + "$ref": "#/$defs/TimeUnit", "default": "minute", "title": "Injection duration unit" }, @@ -6558,13 +7697,9 @@ }, "title": "Injection coordinate depth (mm)", "type": "array" - }, - "injection_coordinate_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + }, + "injection_coordinate_unit": { + "$ref": "#/$defs/SizeUnit", "default": "millimeter", "title": "Injection coordinate unit" }, @@ -6597,11 +7732,7 @@ "title": "Bregma to lambda (mm)" }, "bregma_to_lambda_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "millimeter", "title": "Bregma to lambda unit" }, @@ -6617,11 +7748,7 @@ "title": "Injection angle (deg)" }, "injection_angle_unit": { - "allOf": [ - { - "$ref": "#/$defs/AngleUnit" - } - ], + "$ref": "#/$defs/AngleUnit", "default": "degrees", "title": "Injection angle unit" }, @@ -6674,11 +7801,7 @@ "type": "array" }, "injection_volume_unit": { - "allOf": [ - { - "$ref": "#/$defs/VolumeUnit" - } - ], + "$ref": "#/$defs/VolumeUnit", "default": "nanoliter", "title": "Injection volume unit" } @@ -7787,11 +8910,7 @@ "title": "Species" }, "gene": { - "allOf": [ - { - "$ref": "#/$defs/PIDName" - } - ], + "$ref": "#/$defs/PIDName", "title": "Gene name, accession number, and registry" }, "probe_sequences": { @@ -7822,11 +8941,7 @@ "description": "Description of an implanted ophys probe", "properties": { "ophys_probe": { - "allOf": [ - { - "$ref": "#/$defs/FiberProbe" - } - ], + "$ref": "#/$defs/FiberProbe", "title": "Fiber probe" }, "targeted_structure": { @@ -7867,11 +8982,7 @@ "title": "Stereotactic coordinate D/V (mm)" }, "stereotactic_coordinate_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "millimeter", "title": "Sterotactic coordinate unit" }, @@ -7904,11 +9015,7 @@ "title": "Bregma to lambda (mm)" }, "bregma_to_lambda_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "millimeter", "title": "Bregma to lambda unit" }, @@ -7924,11 +9031,7 @@ "title": "Angle (deg)" }, "angle_unit": { - "allOf": [ - { - "$ref": "#/$defs/AngleUnit" - } - ], + "$ref": "#/$defs/AngleUnit", "default": "degrees", "title": "Angle unit" }, @@ -8005,6 +9108,68 @@ "title": "OtherSubjectProcedure", "type": "object" }, + "PARS_SCAPULARIS_OF_DELTOID": { + "properties": { + "name": { + "const": "pars scapularis of deltoid", + "default": "pars scapularis of deltoid", + "enum": [ + "pars scapularis of deltoid" + ], + "title": "Name", + "type": "string" + }, + "registry": { + "$ref": "#/$defs/RegistryModel", + "default": { + "name": "Edinburgh Mouse Atlas Project", + "abbreviation": "EMAPA" + } + }, + "registry_identifier": { + "const": "EMAPA_36163", + "default": "EMAPA_36163", + "enum": [ + "EMAPA_36163" + ], + "title": "Registry Identifier", + "type": "string" + } + }, + "title": "PARS_SCAPULARIS_OF_DELTOID", + "type": "object" + }, + "PECTORALIS_MAJOR": { + "properties": { + "name": { + "const": "pectoralis major", + "default": "pectoralis major", + "enum": [ + "pectoralis major" + ], + "title": "Name", + "type": "string" + }, + "registry": { + "$ref": "#/$defs/RegistryModel", + "default": { + "name": "Edinburgh Mouse Atlas Project", + "abbreviation": "EMAPA" + } + }, + "registry_identifier": { + "const": "EMAPA_18179", + "default": "EMAPA_18179", + "enum": [ + "EMAPA_18179" + ], + "title": "Registry Identifier", + "type": "string" + } + }, + "title": "PECTORALIS_MAJOR", + "type": "object" + }, "PIDName": { "additionalProperties": false, "description": "Model for associate a name with a persistent identifier (PID),\nthe registry for that PID, and abbreviation for that registry", @@ -8160,11 +9325,7 @@ "type": "string" }, "protective_material": { - "allOf": [ - { - "$ref": "#/$defs/ProtectiveMaterial" - } - ], + "$ref": "#/$defs/ProtectiveMaterial", "description": "New material being applied", "title": "Protective material" }, @@ -8208,11 +9369,7 @@ "title": "Ground wire diameter" }, "ground_wire_diameter_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "inch", "title": "Ground wire diameter unit" }, @@ -8802,20 +9959,12 @@ "type": "integer" }, "excitation_wavelength_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "nanometer", "title": "Excitation wavelength unit" }, "stain_type": { - "allOf": [ - { - "$ref": "#/$defs/StainType" - } - ], + "$ref": "#/$defs/StainType", "title": "Stain type" } }, @@ -9242,13 +10391,40 @@ "title": "Reagent", "type": "object" }, + "RegistryModel": { + "additionalProperties": false, + "description": "Base model config", + "properties": { + "name": { + "title": "Registry name", + "type": "string" + }, + "abbreviation": { + "title": "Registry abbreviation", + "type": "string" + } + }, + "required": [ + "name", + "abbreviation" + ], + "title": "RegistryModel", + "type": "object" + }, "RetroOrbitalInjection": { "additionalProperties": false, "description": "Description of a retro-orbital injection procedure", "properties": { "injection_materials": { "items": { - "anyOf": [ + "discriminator": { + "mapping": { + "Reagent": "#/$defs/NonViralMaterial", + "Virus": "#/$defs/ViralMaterial" + }, + "propertyName": "material_type" + }, + "oneOf": [ { "$ref": "#/$defs/ViralMaterial" }, @@ -9277,11 +10453,7 @@ "title": "Recovery time" }, "recovery_time_unit": { - "allOf": [ - { - "$ref": "#/$defs/TimeUnit" - } - ], + "$ref": "#/$defs/TimeUnit", "default": "minute", "title": "Recovery time unit" }, @@ -9301,11 +10473,7 @@ "title": "Injection duration" }, "injection_duration_unit": { - "allOf": [ - { - "$ref": "#/$defs/TimeUnit" - } - ], + "$ref": "#/$defs/TimeUnit", "default": "minute", "title": "Injection duration unit" }, @@ -9347,20 +10515,12 @@ "title": "Injection volume (uL)" }, "injection_volume_unit": { - "allOf": [ - { - "$ref": "#/$defs/VolumeUnit" - } - ], + "$ref": "#/$defs/VolumeUnit", "default": "microliter", "title": "Injection volume unit" }, "injection_eye": { - "allOf": [ - { - "$ref": "#/$defs/Side" - } - ], + "$ref": "#/$defs/Side", "title": "Injection eye" } }, @@ -9487,6 +10647,37 @@ "title": "SEMROCK", "type": "object" }, + "SHORT_HEAD_OF_BICEPS_BRACHII": { + "properties": { + "name": { + "const": "short head of biceps brachii", + "default": "short head of biceps brachii", + "enum": [ + "short head of biceps brachii" + ], + "title": "Name", + "type": "string" + }, + "registry": { + "$ref": "#/$defs/RegistryModel", + "default": { + "name": "Edinburgh Mouse Atlas Project", + "abbreviation": "EMAPA" + } + }, + "registry_identifier": { + "const": "EMAPA_25055", + "default": "EMAPA_25055", + "enum": [ + "EMAPA_25055" + ], + "title": "Registry Identifier", + "type": "string" + } + }, + "title": "SHORT_HEAD_OF_BICEPS_BRACHII", + "type": "object" + }, "SICGEN": { "properties": { "name": { @@ -9697,11 +10888,7 @@ "type": "array" }, "section_orientation": { - "allOf": [ - { - "$ref": "#/$defs/SectionOrientation" - } - ], + "$ref": "#/$defs/SectionOrientation", "title": "Sectioning orientation" }, "section_thickness": { @@ -9716,11 +10903,7 @@ "title": "Section thickness" }, "section_thickness_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "millimeter", "title": "Section thickness unit" }, @@ -9736,28 +10919,16 @@ "title": "Section distance from reference" }, "section_distance_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "millimeter", "title": "Distance unit" }, "reference_location": { - "allOf": [ - { - "$ref": "#/$defs/CoordinateReferenceLocation" - } - ], + "$ref": "#/$defs/CoordinateReferenceLocation", "title": "Reference location for distance measurement" }, "section_strategy": { - "allOf": [ - { - "$ref": "#/$defs/SectionStrategy" - } - ], + "$ref": "#/$defs/SectionStrategy", "title": "Slice strategy" }, "targeted_structure": { @@ -9783,7 +10954,8 @@ "description": "Side of animal", "enum": [ "Left", - "Right" + "Right", + "Midline" ], "title": "Side", "type": "string" @@ -9807,11 +10979,7 @@ "description": "Description of surgical or other procedure performed on a specimen", "properties": { "procedure_type": { - "allOf": [ - { - "$ref": "#/$defs/SpecimenProcedureType" - } - ], + "$ref": "#/$defs/SpecimenProcedureType", "title": "Procedure type" }, "procedure_name": { @@ -10353,19 +11521,11 @@ "title": "Lot expiration date" }, "stain_type": { - "allOf": [ - { - "$ref": "#/$defs/StainType" - } - ], + "$ref": "#/$defs/StainType", "title": "Stain type" }, "concentration": { - "allOf": [ - { - "$ref": "#/$defs/concentration" - } - ], + "$ref": "#/$defs/concentration", "title": "Concentration (uM)" } }, @@ -10462,11 +11622,7 @@ "title": "Animal weight (g)" }, "weight_unit": { - "allOf": [ - { - "$ref": "#/$defs/MassUnit" - } - ], + "$ref": "#/$defs/MassUnit", "default": "gram", "title": "Weight unit" }, @@ -10506,6 +11662,7 @@ "ICV injection": "#/$defs/IntraCerebellarVentricleInjection", "Intraperitoneal injection": "#/$defs/IntraperitonealInjection", "Iontophoresis injection": "#/$defs/IontophoresisInjection", + "Myomatrix_Insertion": "#/$defs/MyomatrixInsertion", "Nanoject injection": "#/$defs/NanojectInjection", "Other Subject Procedure": "#/$defs/OtherSubjectProcedure", "Perfusion": "#/$defs/Perfusion", @@ -10535,6 +11692,9 @@ { "$ref": "#/$defs/IontophoresisInjection" }, + { + "$ref": "#/$defs/MyomatrixInsertion" + }, { "$ref": "#/$defs/NanojectInjection" }, @@ -10578,6 +11738,37 @@ "title": "Surgery", "type": "object" }, + "TAIL": { + "properties": { + "name": { + "const": "tail", + "default": "tail", + "enum": [ + "tail" + ], + "title": "Name", + "type": "string" + }, + "registry": { + "$ref": "#/$defs/RegistryModel", + "default": { + "name": "Edinburgh Mouse Atlas Project", + "abbreviation": "EMAPA" + } + }, + "registry_identifier": { + "const": "EMAPA_16748", + "default": "EMAPA_16748", + "enum": [ + "EMAPA_16748" + ], + "title": "Registry Identifier", + "type": "string" + } + }, + "title": "TAIL", + "type": "object" + }, "TAMRON": { "properties": { "name": { @@ -10616,6 +11807,37 @@ "title": "TAMRON", "type": "object" }, + "TENDON_OF_BICEPS_BRACHII": { + "properties": { + "name": { + "const": "tendon of biceps brachii", + "default": "tendon of biceps brachii", + "enum": [ + "tendon of biceps brachii" + ], + "title": "Name", + "type": "string" + }, + "registry": { + "$ref": "#/$defs/RegistryModel", + "default": { + "name": "Edinburgh Mouse Atlas Project", + "abbreviation": "EMAPA" + } + }, + "registry_identifier": { + "const": "EMAPA_25053", + "default": "EMAPA_25053", + "enum": [ + "EMAPA_25053" + ], + "title": "Registry Identifier", + "type": "string" + } + }, + "title": "TENDON_OF_BICEPS_BRACHII", + "type": "object" + }, "THERMO_FISHER_SCIENTIFIC": { "properties": { "name": { @@ -10832,6 +12054,68 @@ "title": "TMC", "type": "object" }, + "TRICEPS_BRACHII": { + "properties": { + "name": { + "const": "triceps brachii", + "default": "triceps brachii", + "enum": [ + "triceps brachii" + ], + "title": "Name", + "type": "string" + }, + "registry": { + "$ref": "#/$defs/RegistryModel", + "default": { + "name": "Edinburgh Mouse Atlas Project", + "abbreviation": "EMAPA" + } + }, + "registry_identifier": { + "const": "EMAPA_19111", + "default": "EMAPA_19111", + "enum": [ + "EMAPA_19111" + ], + "title": "Registry Identifier", + "type": "string" + } + }, + "title": "TRICEPS_BRACHII", + "type": "object" + }, + "TRUNK": { + "properties": { + "name": { + "const": "trunk", + "default": "trunk", + "enum": [ + "trunk" + ], + "title": "Name", + "type": "string" + }, + "registry": { + "$ref": "#/$defs/RegistryModel", + "default": { + "name": "Edinburgh Mouse Atlas Project", + "abbreviation": "EMAPA" + } + }, + "registry_identifier": { + "const": "EMAPA_31857", + "default": "EMAPA_31857", + "enum": [ + "EMAPA_31857" + ], + "title": "Registry Identifier", + "type": "string" + } + }, + "title": "TRUNK", + "type": "object" + }, "TWCF": { "properties": { "name": { @@ -11268,11 +12552,7 @@ "type": "integer" }, "target_fraction_weight_unit": { - "allOf": [ - { - "$ref": "#/$defs/UnitlessUnit" - } - ], + "$ref": "#/$defs/UnitlessUnit", "default": "percent", "title": "Target fraction weight unit" }, @@ -11288,11 +12568,7 @@ "title": "Minimum water per day (mL)" }, "minimum_water_per_day_unit": { - "allOf": [ - { - "$ref": "#/$defs/VolumeUnit" - } - ], + "$ref": "#/$defs/VolumeUnit", "default": "milliliter", "title": "Minimum water per day unit" }, @@ -11309,11 +12585,7 @@ "title": "Baseline weight (g)" }, "weight_unit": { - "allOf": [ - { - "$ref": "#/$defs/MassUnit" - } - ], + "$ref": "#/$defs/MassUnit", "default": "gram", "title": "Weight unit" }, @@ -11360,11 +12632,7 @@ "title": "Value" }, "unit": { - "allOf": [ - { - "$ref": "#/$defs/ConcentrationUnit" - } - ], + "$ref": "#/$defs/ConcentrationUnit", "default": "micromolar" } }, @@ -11385,10 +12653,10 @@ "type": "string" }, "schema_version": { - "const": "1.0.0", - "default": "1.0.0", + "const": "1.0.1", + "default": "1.0.1", "enum": [ - "1.0.0" + "1.0.1" ], "title": "Schema Version", "type": "string" diff --git a/schemas/processing_schema.json b/schemas/processing_schema.json index d9c46ed4..f4a37181 100644 --- a/schemas/processing_schema.json +++ b/schemas/processing_schema.json @@ -12,11 +12,7 @@ "description": "Description of an Analysis", "properties": { "name": { - "allOf": [ - { - "$ref": "#/$defs/ProcessName" - } - ], + "$ref": "#/$defs/ProcessName", "default": "Analysis", "title": "Process name" }, @@ -64,19 +60,11 @@ "title": "Code version" }, "parameters": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "title": "Parameters" }, "outputs": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "description": "Output parameters", "title": "Outputs" @@ -93,6 +81,18 @@ "default": null, "title": "Notes" }, + "resources": { + "anyOf": [ + { + "$ref": "#/$defs/ResourceUsage" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Process resource usage" + }, "analyst_full_name": { "description": "Name of person responsible for running analysis", "title": "Analyst Full Name", @@ -122,11 +122,7 @@ "description": "Description of a single processing step", "properties": { "name": { - "allOf": [ - { - "$ref": "#/$defs/ProcessName" - } - ], + "$ref": "#/$defs/ProcessName", "title": "Name" }, "software_version": { @@ -173,19 +169,11 @@ "title": "Code version" }, "parameters": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "title": "Parameters" }, "outputs": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "description": "Output parameters", "title": "Outputs" @@ -201,6 +189,18 @@ ], "default": null, "title": "Notes" + }, + "resources": { + "anyOf": [ + { + "$ref": "#/$defs/ResourceUsage" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Process resource usage" } }, "required": [ @@ -216,6 +216,20 @@ "title": "DataProcess", "type": "object" }, + "MemoryUnit": { + "description": "Computer memory units", + "enum": [ + "Byte", + "Kilobyte", + "Megabyte", + "Gigabyte", + "Terabyte", + "Petabyte", + "Exabyte" + ], + "title": "MemoryUnit", + "type": "string" + }, "PipelineProcess": { "additionalProperties": false, "description": "Description of a Processing Pipeline", @@ -304,10 +318,8 @@ "Image tile alignment", "Image tile fusing", "Image tile projection", - "Manual annotation", "Neuropil subtraction", "Other", - "Quality control and assessment", "Simulation", "Skull stripping", "Spatial timeseries demixing", @@ -315,11 +327,187 @@ "Video motion correction", "Video plane decrosstalk", "Video ROI classification", + "Video ROI cross session matching", "Video ROI segmentation", "Video ROI timeseries extraction" ], "title": "ProcessName", "type": "string" + }, + "ResourceTimestamped": { + "additionalProperties": false, + "description": "Description of resource usage at a moment in time", + "properties": { + "timestamp": { + "format": "date-time", + "title": "Timestamp", + "type": "string" + }, + "usage": { + "title": "Usage", + "type": "number" + } + }, + "required": [ + "timestamp", + "usage" + ], + "title": "ResourceTimestamped", + "type": "object" + }, + "ResourceUsage": { + "additionalProperties": false, + "description": "Description of resources used by a process", + "properties": { + "os": { + "title": "Operating system", + "type": "string" + }, + "architecture": { + "title": "Architecture", + "type": "string" + }, + "cpu": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "CPU name" + }, + "cpu_cores": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "title": "CPU cores" + }, + "gpu": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "GPU name" + }, + "system_memory": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null, + "title": "System memory" + }, + "system_memory_unit": { + "anyOf": [ + { + "$ref": "#/$defs/MemoryUnit" + }, + { + "type": "null" + } + ], + "default": null, + "title": "System memory unit" + }, + "ram": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null, + "title": "System RAM" + }, + "ram_unit": { + "anyOf": [ + { + "$ref": "#/$defs/MemoryUnit" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Ram unit" + }, + "cpu_usage": { + "anyOf": [ + { + "items": { + "$ref": "#/$defs/ResourceTimestamped" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "title": "CPU usage" + }, + "gpu_usage": { + "anyOf": [ + { + "items": { + "$ref": "#/$defs/ResourceTimestamped" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "title": "GPU usage" + }, + "ram_usage": { + "anyOf": [ + { + "items": { + "$ref": "#/$defs/ResourceTimestamped" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "title": "RAM usage" + }, + "usage_unit": { + "default": "percent", + "title": "Usage unit", + "type": "string" + } + }, + "required": [ + "os", + "architecture" + ], + "title": "ResourceUsage", + "type": "object" } }, "additionalProperties": false, @@ -332,20 +520,16 @@ "type": "string" }, "schema_version": { - "const": "1.0.0", - "default": "1.0.0", + "const": "1.0.1", + "default": "1.0.1", "enum": [ - "1.0.0" + "1.0.1" ], "title": "Schema Version", "type": "string" }, "processing_pipeline": { - "allOf": [ - { - "$ref": "#/$defs/PipelineProcess" - } - ], + "$ref": "#/$defs/PipelineProcess", "description": "Pipeline used to process data", "title": "Processing Pipeline" }, diff --git a/schemas/quality_control_schema.json b/schemas/quality_control_schema.json index e67d2a96..7f321f40 100644 --- a/schemas/quality_control_schema.json +++ b/schemas/quality_control_schema.json @@ -1,12 +1,5 @@ { "$defs": { - "AindGeneric": { - "additionalProperties": true, - "description": "Base class for generic types that can be used in AIND schema", - "properties": {}, - "title": "AindGeneric", - "type": "object" - }, "BEHAVIOR": { "additionalProperties": false, "properties": { @@ -309,9 +302,9 @@ }, "QCEvaluation": { "additionalProperties": false, - "description": "Description of one evaluation stage", + "description": "Description of one evaluation stage, with one or more metrics", "properties": { - "evaluation_modality": { + "modality": { "discriminator": { "mapping": { "EMG": "#/$defs/EMG", @@ -377,37 +370,84 @@ ], "title": "Modality" }, - "evaluation_stage": { - "title": "Evaluation stage", - "type": "string" + "stage": { + "$ref": "#/$defs/Stage", + "title": "Evaluation stage" }, - "evaluator_full_name": { - "title": "Evaluator full name", + "name": { + "title": "Evaluation name", "type": "string" }, - "evaluation_date": { - "format": "date", - "title": "Evaluation date", - "type": "string" + "description": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Evaluation description" }, - "qc_metrics": { - "allOf": [ + "metrics": { + "items": { + "$ref": "#/$defs/QCMetric" + }, + "title": "QC metrics", + "type": "array" + }, + "notes": { + "anyOf": [ { - "$ref": "#/$defs/AindGeneric" + "type": "string" + }, + { + "type": "null" } ], - "default": {}, - "title": "QC metrics" + "default": null, + "title": "Notes" + }, + "allow_failed_metrics": { + "default": false, + "description": "Set to true for evaluations that are not critical to the overall state of QC for a data asset, this will allow individual metrics to fail while still passing the evaluation.", + "title": "Allow metrics to fail", + "type": "boolean" + } + }, + "required": [ + "modality", + "stage", + "name", + "metrics" + ], + "title": "QCEvaluation", + "type": "object" + }, + "QCMetric": { + "description": "Description of a single quality control metric", + "properties": { + "name": { + "title": "Metric name", + "type": "string" }, - "stage_status": { - "allOf": [ + "value": { + "title": "Metric value" + }, + "description": { + "anyOf": [ + { + "type": "string" + }, { - "$ref": "#/$defs/Status" + "type": "null" } ], - "title": "Stage status" + "default": null, + "title": "Metric description" }, - "notes": { + "reference": { "anyOf": [ { "type": "string" @@ -417,17 +457,46 @@ } ], "default": null, - "title": "Notes" + "title": "Metric reference image URL or plot type" + }, + "status_history": { + "default": [], + "items": { + "$ref": "#/$defs/QCStatus" + }, + "title": "Metric status history", + "type": "array" } }, "required": [ - "evaluation_modality", - "evaluation_stage", - "evaluator_full_name", - "evaluation_date", - "stage_status" + "name", + "value" ], - "title": "QCEvaluation", + "title": "QCMetric", + "type": "object" + }, + "QCStatus": { + "description": "Description of a QC status, set by an evaluator", + "properties": { + "evaluator": { + "title": "Status evaluator full name", + "type": "string" + }, + "status": { + "$ref": "#/$defs/Status" + }, + "timestamp": { + "format": "date-time", + "title": "Status date", + "type": "string" + } + }, + "required": [ + "evaluator", + "status", + "timestamp" + ], + "title": "QCStatus", "type": "object" }, "SLAP": { @@ -480,11 +549,22 @@ "title": "SPIM", "type": "object" }, + "Stage": { + "description": "QCEvaluation Stage\n\nWhen during data processing the QC metrics were derived.", + "enum": [ + "Raw data", + "Processing", + "Analysis" + ], + "title": "Stage", + "type": "string" + }, "Status": { "description": "QC Status", "enum": [ "Fail", - "Pass" + "Pass", + "Pending" ], "title": "Status", "type": "string" @@ -494,33 +574,20 @@ "description": "Description of quality metrics for a data asset", "properties": { "describedBy": { - "const": "https://raw.githubusercontent.com/AllenNeuralDynamics/aind-data-schema/main/src/aind_data_schema/core/quality_metrics.py", - "default": "https://raw.githubusercontent.com/AllenNeuralDynamics/aind-data-schema/main/src/aind_data_schema/core/quality_metrics.py", + "const": "https://raw.githubusercontent.com/AllenNeuralDynamics/aind-data-schema/main/src/aind_data_schema/core/quality_control.py", + "default": "https://raw.githubusercontent.com/AllenNeuralDynamics/aind-data-schema/main/src/aind_data_schema/core/quality_control.py", "title": "Describedby", "type": "string" }, "schema_version": { - "const": "1.0.0", - "default": "1.0.0", + "const": "1.0.1", + "default": "1.0.1", "enum": [ - "1.0.0" + "1.0.1" ], "title": "Schema Version", "type": "string" }, - "overall_status": { - "allOf": [ - { - "$ref": "#/$defs/Status" - } - ], - "title": "Overall status" - }, - "overall_status_date": { - "format": "date", - "title": "Date of status", - "type": "string" - }, "evaluations": { "items": { "$ref": "#/$defs/QCEvaluation" @@ -542,8 +609,6 @@ } }, "required": [ - "overall_status", - "overall_status_date", "evaluations" ], "title": "QualityControl", diff --git a/schemas/rig_schema.json b/schemas/rig_schema.json index 7f67c392..de782e44 100644 --- a/schemas/rig_schema.json +++ b/schemas/rig_schema.json @@ -995,11 +995,7 @@ "title": "Port index" }, "additional_settings": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "title": "Additional parameters" }, @@ -1041,11 +1037,7 @@ "title": "Date surface replaced" }, "size": { - "allOf": [ - { - "$ref": "#/$defs/Size3d" - } - ], + "$ref": "#/$defs/Size3d", "title": "3D Size" }, "objects_in_arena": { @@ -1069,11 +1061,7 @@ "description": "Description of an axis", "properties": { "name": { - "allOf": [ - { - "$ref": "#/$defs/AxisName" - } - ], + "$ref": "#/$defs/AxisName", "title": "Axis" }, "direction": { @@ -1733,21 +1721,13 @@ "type": "string" }, "input": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "description": "Calibration input", "title": "inputs" }, "output": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "description": "Calibration output", "title": "outputs" @@ -1898,11 +1878,7 @@ "title": "Port index" }, "additional_settings": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "title": "Additional parameters" }, @@ -1919,29 +1895,16 @@ "title": "Notes" }, "detector_type": { - "allOf": [ - { - "$ref": "#/$defs/DetectorType" - } - ], + "$ref": "#/$defs/DetectorType", "title": "Detector Type" }, "data_interface": { - "allOf": [ - { - "$ref": "#/$defs/DataInterface" - } - ], + "$ref": "#/$defs/DataInterface", "title": "Data interface" }, "cooling": { - "allOf": [ - { - "$ref": "#/$defs/Cooling" - } - ], - "default": "None", - "title": "Cooling" + "$ref": "#/$defs/Cooling", + "default": "None" }, "computer_name": { "anyOf": [ @@ -1972,11 +1935,7 @@ "title": "Frame rate (Hz)" }, "frame_rate_unit": { - "allOf": [ - { - "$ref": "#/$defs/FrequencyUnit" - } - ], + "$ref": "#/$defs/FrequencyUnit", "default": "hertz", "title": "Frame rate unit" }, @@ -2029,11 +1988,7 @@ "title": "Height of the sensor (pixels)" }, "size_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "pixel", "title": "Size unit" }, @@ -2074,11 +2029,7 @@ "title": "Bit depth" }, "bin_mode": { - "allOf": [ - { - "$ref": "#/$defs/BinMode" - } - ], + "$ref": "#/$defs/BinMode", "default": "None", "title": "Detector binning mode" }, @@ -2107,11 +2058,7 @@ "title": "Bin height" }, "bin_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "pixel", "title": "Bin size unit" }, @@ -2179,11 +2126,7 @@ "title": "Crop width" }, "crop_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "pixel", "title": "Crop size unit" }, @@ -2242,27 +2185,15 @@ "type": "string" }, "camera_target": { - "allOf": [ - { - "$ref": "#/$defs/CameraTarget" - } - ], + "$ref": "#/$defs/CameraTarget", "title": "Camera target" }, "camera": { - "allOf": [ - { - "$ref": "#/$defs/Camera" - } - ], + "$ref": "#/$defs/Camera", "title": "Camera" }, "lens": { - "allOf": [ - { - "$ref": "#/$defs/Lens" - } - ], + "$ref": "#/$defs/Lens", "title": "Lens" }, "filter": { @@ -2369,11 +2300,7 @@ "type": "string" }, "channel_type": { - "allOf": [ - { - "$ref": "#/$defs/DaqChannelType" - } - ], + "$ref": "#/$defs/DaqChannelType", "title": "DAQ channel type" }, "port": { @@ -2416,11 +2343,7 @@ "title": "DAQ channel sample rate (Hz)" }, "sample_rate_unit": { - "allOf": [ - { - "$ref": "#/$defs/FrequencyUnit" - } - ], + "$ref": "#/$defs/FrequencyUnit", "default": "hertz", "title": "Sample rate unit" }, @@ -2550,11 +2473,7 @@ "title": "Port index" }, "additional_settings": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "title": "Additional parameters" }, @@ -2571,11 +2490,7 @@ "title": "Notes" }, "data_interface": { - "allOf": [ - { - "$ref": "#/$defs/DataInterface" - } - ], + "$ref": "#/$defs/DataInterface", "title": "Type of connection to PC" }, "computer_name": { @@ -2863,11 +2778,7 @@ "title": "Port index" }, "additional_settings": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "title": "Additional parameters" }, @@ -2884,29 +2795,16 @@ "title": "Notes" }, "detector_type": { - "allOf": [ - { - "$ref": "#/$defs/DetectorType" - } - ], + "$ref": "#/$defs/DetectorType", "title": "Detector Type" }, "data_interface": { - "allOf": [ - { - "$ref": "#/$defs/DataInterface" - } - ], + "$ref": "#/$defs/DataInterface", "title": "Data interface" }, "cooling": { - "allOf": [ - { - "$ref": "#/$defs/Cooling" - } - ], - "default": "None", - "title": "Cooling" + "$ref": "#/$defs/Cooling", + "default": "None" }, "computer_name": { "anyOf": [ @@ -2937,11 +2835,7 @@ "title": "Frame rate (Hz)" }, "frame_rate_unit": { - "allOf": [ - { - "$ref": "#/$defs/FrequencyUnit" - } - ], + "$ref": "#/$defs/FrequencyUnit", "default": "hertz", "title": "Frame rate unit" }, @@ -2994,11 +2888,7 @@ "title": "Height of the sensor (pixels)" }, "size_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "pixel", "title": "Size unit" }, @@ -3039,11 +2929,7 @@ "title": "Bit depth" }, "bin_mode": { - "allOf": [ - { - "$ref": "#/$defs/BinMode" - } - ], + "$ref": "#/$defs/BinMode", "default": "None", "title": "Detector binning mode" }, @@ -3072,11 +2958,7 @@ "title": "Bin height" }, "bin_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "pixel", "title": "Bin size unit" }, @@ -3144,11 +3026,7 @@ "title": "Crop width" }, "crop_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "pixel", "title": "Crop size unit" }, @@ -3644,11 +3522,7 @@ "title": "Port index" }, "additional_settings": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "title": "Additional parameters" }, @@ -4123,11 +3997,7 @@ "title": "Port index" }, "additional_settings": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "title": "Additional parameters" }, @@ -4164,11 +4034,7 @@ "type": "integer" }, "padding_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "pixel", "title": "Padding unit" }, @@ -4184,11 +4050,7 @@ "title": "DMD Pixel size" }, "pixel_size_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "micrometer", "title": "Pixel size unit" }, @@ -4222,11 +4084,7 @@ "type": "array" }, "dmd_curtain_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "pixel", "title": "dmd_curtain_unit" }, @@ -4238,11 +4096,7 @@ "type": "array" }, "line_shear_units": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "pixel", "title": "Line shear units" } @@ -4704,11 +4558,7 @@ "title": "Port index" }, "additional_settings": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "title": "Additional parameters" }, @@ -4762,11 +4612,7 @@ "title": "Radius (cm)" }, "radius_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "centimeter", "title": "radius unit" }, @@ -5498,11 +5344,7 @@ "title": "Port index" }, "additional_settings": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "title": "Additional parameters" }, @@ -5519,11 +5361,7 @@ "title": "Notes" }, "size": { - "allOf": [ - { - "$ref": "#/$defs/Size3d" - } - ], + "$ref": "#/$defs/Size3d", "title": "Size" }, "internal_material": { @@ -6027,11 +5865,7 @@ "title": "Port index" }, "additional_settings": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "title": "Additional parameters" }, @@ -6048,11 +5882,7 @@ "title": "Notes" }, "probe_model": { - "allOf": [ - { - "$ref": "#/$defs/ProbeModel" - } - ], + "$ref": "#/$defs/ProbeModel", "title": "Probe model" }, "lasers": { @@ -6699,11 +6529,7 @@ "title": "Port index" }, "additional_settings": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "title": "Additional parameters" }, @@ -6731,11 +6557,7 @@ "title": "Core diameter (um)" }, "core_diameter_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "micrometer", "title": "Core diameter unit" }, @@ -6790,11 +6612,7 @@ "title": "Total length (mm)" }, "length_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "millimeter", "title": "Length unit" } @@ -6909,11 +6727,7 @@ "title": "Port index" }, "additional_settings": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "title": "Additional parameters" }, @@ -6930,11 +6744,7 @@ "title": "Notes" }, "filter_type": { - "allOf": [ - { - "$ref": "#/$defs/FilterType" - } - ], + "$ref": "#/$defs/FilterType", "title": "Type of filter" }, "diameter": { @@ -6983,17 +6793,14 @@ "title": "Height (mm)" }, "size_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "millimeter", "title": "Size unit" }, "thickness": { "anyOf": [ { + "minimum": 0.0, "type": "number" }, { @@ -7007,11 +6814,7 @@ "title": "Thickness (mm)" }, "thickness_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "millimeter", "title": "Thickness unit" }, @@ -7064,11 +6867,7 @@ "title": "Center wavelength (nm)" }, "wavelength_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "nanometer", "title": "Wavelength unit" }, @@ -7396,11 +7195,7 @@ "title": "Port index" }, "additional_settings": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "title": "Additional parameters" }, @@ -7417,11 +7212,7 @@ "title": "Notes" }, "data_interface": { - "allOf": [ - { - "$ref": "#/$defs/DataInterface" - } - ], + "$ref": "#/$defs/DataInterface", "default": "USB", "title": "Data interface" }, @@ -8014,11 +7805,7 @@ "title": "Port index" }, "additional_settings": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "title": "Additional parameters" }, @@ -9192,11 +8979,7 @@ "title": "Port index" }, "additional_settings": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "title": "Additional parameters" }, @@ -9237,11 +9020,7 @@ "title": "Wavelength maximum (nm)" }, "wavelength_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "nanometer", "title": "Wavelength unit" }, @@ -9258,11 +9037,7 @@ "title": "Temperature (K)" }, "temperature_unit": { - "allOf": [ - { - "$ref": "#/$defs/TemperatureUnit" - } - ], + "$ref": "#/$defs/TemperatureUnit", "default": "Kelvin", "title": "Temperature unit" } @@ -9374,11 +9149,7 @@ "title": "Port index" }, "additional_settings": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "title": "Additional parameters" }, @@ -9399,11 +9170,7 @@ "type": "integer" }, "wavelength_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "nanometer", "title": "Wavelength unit" }, @@ -9423,11 +9190,7 @@ "title": "Maximum power (mW)" }, "power_unit": { - "allOf": [ - { - "$ref": "#/$defs/PowerUnit" - } - ], + "$ref": "#/$defs/PowerUnit", "default": "milliwatt", "title": "Power unit" }, @@ -9446,6 +9209,8 @@ "coupling_efficiency": { "anyOf": [ { + "maximum": 100.0, + "minimum": 0.0, "type": "number" }, { @@ -9507,19 +9272,11 @@ "type": "array" }, "collimator": { - "allOf": [ - { - "$ref": "#/$defs/Device" - } - ], + "$ref": "#/$defs/Device", "title": "Collimator" }, "fiber": { - "allOf": [ - { - "$ref": "#/$defs/Patch" - } - ], + "$ref": "#/$defs/Patch", "title": "Fiber patch" } }, @@ -9666,11 +9423,7 @@ "title": "Port index" }, "additional_settings": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "title": "Additional parameters" }, @@ -9702,11 +9455,7 @@ "title": "Focal length of the lens (mm)" }, "focal_length_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "millimeter", "title": "Focal length unit" }, @@ -9723,11 +9472,7 @@ "title": "Size (inches)" }, "lens_size_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "inch", "title": "Lens size unit" }, @@ -9744,11 +9489,7 @@ "title": "Optimized wavelength range (nm)" }, "wavelength_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "nanometer", "title": "Wavelength unit" }, @@ -9887,11 +9628,7 @@ "title": "Port index" }, "additional_settings": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "title": "Additional parameters" }, @@ -9912,11 +9649,7 @@ "type": "integer" }, "wavelength_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "nanometer", "title": "Wavelength unit" }, @@ -9933,11 +9666,7 @@ "title": "Bandwidth (FWHM)" }, "bandwidth_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "nanometer", "title": "Bandwidth unit" } @@ -10403,11 +10132,7 @@ "title": "Port index" }, "additional_settings": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "title": "Additional parameters" }, @@ -10520,11 +10245,7 @@ "title": "Port index" }, "additional_settings": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "title": "Additional parameters" }, @@ -10554,11 +10275,7 @@ "type": "integer" }, "size_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "pixel", "title": "Size unit" }, @@ -10574,11 +10291,7 @@ "title": "Viewing distance (cm)" }, "viewing_distance_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "centimeter", "title": "Viewing distance unit" }, @@ -11077,11 +10790,7 @@ "title": "Port index" }, "additional_settings": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "title": "Additional parameters" }, @@ -11109,11 +10818,7 @@ "title": "Travel of device (mm)" }, "travel_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "millimeter", "title": "Travel unit" }, @@ -11685,11 +11390,7 @@ "title": "Port index" }, "additional_settings": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "title": "Additional parameters" }, @@ -12462,11 +12163,7 @@ "title": "Port index" }, "additional_settings": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "title": "Additional parameters" }, @@ -12505,11 +12202,7 @@ "title": "Magnification" }, "immersion": { - "allOf": [ - { - "$ref": "#/$defs/ImmersionMedium" - } - ], + "$ref": "#/$defs/ImmersionMedium", "title": "Immersion" }, "objective_type": { @@ -12657,11 +12350,7 @@ "title": "Port index" }, "additional_settings": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "title": "Additional parameters" }, @@ -12678,11 +12367,7 @@ "title": "Notes" }, "data_interface": { - "allOf": [ - { - "$ref": "#/$defs/DataInterface" - } - ], + "$ref": "#/$defs/DataInterface", "default": "USB", "title": "Data interface" }, @@ -12786,11 +12471,7 @@ "type": "integer" }, "channel_type": { - "allOf": [ - { - "$ref": "#/$defs/ChannelType" - } - ], + "$ref": "#/$defs/ChannelType", "default": "Odor", "title": "Channel type" }, @@ -12929,11 +12610,7 @@ "title": "Port index" }, "additional_settings": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "title": "Additional parameters" }, @@ -13524,11 +13201,7 @@ "title": "Port index" }, "additional_settings": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "title": "Additional parameters" }, @@ -14029,11 +13702,7 @@ "title": "Port index" }, "additional_settings": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "title": "Additional parameters" }, @@ -14093,11 +13762,7 @@ "title": "Off time (fraction of cycle)" }, "time_setting_unit": { - "allOf": [ - { - "$ref": "#/$defs/UnitlessUnit" - } - ], + "$ref": "#/$defs/UnitlessUnit", "default": "fraction of cycle", "title": "Time setting unit" }, @@ -14117,11 +13782,7 @@ "title": "Beam modulation (V)" }, "beam_modulation_unit": { - "allOf": [ - { - "$ref": "#/$defs/VoltageUnit" - } - ], + "$ref": "#/$defs/VoltageUnit", "default": "Volts", "title": "Beam modulation unit" } @@ -14573,11 +14234,7 @@ "title": "Port index" }, "additional_settings": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "title": "Additional parameters" }, @@ -14598,11 +14255,7 @@ "type": "integer" }, "speed_unit": { - "allOf": [ - { - "$ref": "#/$defs/SpeedUnit" - } - ], + "$ref": "#/$defs/SpeedUnit", "default": "rotations per minute", "title": "Speed unit" }, @@ -15309,11 +14962,7 @@ "title": "Port index" }, "additional_settings": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "title": "Additional parameters" }, @@ -15330,11 +14979,7 @@ "title": "Notes" }, "side": { - "allOf": [ - { - "$ref": "#/$defs/SpoutSide" - } - ], + "$ref": "#/$defs/SpoutSide", "description": "If Other use notes", "title": "Spout side" }, @@ -15350,11 +14995,7 @@ "title": "Spout diameter (mm)" }, "spout_diameter_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "millimeter", "title": "Spout diameter unit" }, @@ -15371,23 +15012,11 @@ "title": "Spout stage position" }, "solenoid_valve": { - "allOf": [ - { - "$ref": "#/$defs/Device" - } - ], + "$ref": "#/$defs/Device", "title": "Solenoid valve" }, "lick_sensor": { - "anyOf": [ - { - "$ref": "#/$defs/Device" - }, - { - "type": "null" - } - ], - "default": null, + "$ref": "#/$defs/Device", "title": "Lick sensor" }, "lick_sensor_type": { @@ -15407,7 +15036,8 @@ "name", "side", "spout_diameter", - "solenoid_valve" + "solenoid_valve", + "lick_sensor" ], "title": "RewardSpout", "type": "object" @@ -15890,11 +15520,7 @@ "type": "integer" }, "unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "meter", "title": "Size unit" } @@ -15946,11 +15572,7 @@ "title": "URL to commit being used" }, "parameters": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "title": "Software parameters" } @@ -16051,11 +15673,7 @@ "title": "Port index" }, "additional_settings": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "title": "Additional parameters" }, @@ -17012,11 +16630,7 @@ "title": "Port index" }, "additional_settings": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "title": "Additional parameters" }, @@ -17069,11 +16683,7 @@ "title": "Width of treadmill (mm)" }, "width_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "centimeter", "title": "Width unit" } @@ -17526,11 +17136,7 @@ "title": "Port index" }, "additional_settings": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "title": "Additional parameters" }, @@ -17584,11 +17190,7 @@ "title": "Diameter" }, "diameter_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "centimeter", "title": "Diameter unit" } @@ -18135,11 +17737,7 @@ "title": "Port index" }, "additional_settings": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "title": "Additional parameters" }, @@ -18203,20 +17801,12 @@ "title": "Width (mm)" }, "size_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "millimeter", "title": "Size unit" }, "encoder": { - "allOf": [ - { - "$ref": "#/$defs/Device" - } - ], + "$ref": "#/$defs/Device", "title": "Encoder" }, "encoder_output": { @@ -18236,11 +17826,7 @@ "type": "integer" }, "magnetic_brake": { - "allOf": [ - { - "$ref": "#/$defs/Device" - } - ], + "$ref": "#/$defs/Device", "title": "Magnetic brake" }, "brake_output": { @@ -18256,11 +17842,7 @@ "title": "Brake DAQ channel" }, "torque_sensor": { - "allOf": [ - { - "$ref": "#/$defs/Device" - } - ], + "$ref": "#/$defs/Device", "title": "Torque sensor" }, "torque_output": { @@ -18348,10 +17930,10 @@ "type": "string" }, "schema_version": { - "const": "1.0.0", - "default": "1.0.0", + "const": "1.0.1", + "default": "1.0.1", "enum": [ - "1.0.0" + "1.0.1" ], "title": "Schema Version", "type": "string" diff --git a/schemas/session_schema.json b/schemas/session_schema.json index 57bcd105..c09aa9f8 100644 --- a/schemas/session_schema.json +++ b/schemas/session_schema.json @@ -610,17 +610,15 @@ "title": "Duration" }, "duration_unit": { - "allOf": [ - { - "$ref": "#/$defs/TimeUnit" - } - ], + "$ref": "#/$defs/TimeUnit", "default": "minute", "title": "Duration unit" }, "level": { "anyOf": [ { + "maximum": 5.0, + "minimum": 1.0, "type": "number" }, { @@ -691,11 +689,7 @@ "title": "Amplitude modulation frequency" }, "frequency_unit": { - "allOf": [ - { - "$ref": "#/$defs/FrequencyUnit" - } - ], + "$ref": "#/$defs/FrequencyUnit", "default": "hertz", "title": "Tone frequency unit" }, @@ -778,11 +772,7 @@ "description": "Description of an axis", "properties": { "name": { - "allOf": [ - { - "$ref": "#/$defs/AxisName" - } - ], + "$ref": "#/$defs/AxisName", "title": "Axis" }, "direction": { @@ -1412,21 +1402,13 @@ "type": "string" }, "input": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "description": "Calibration input", "title": "inputs" }, "output": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "description": "Calibration output", "title": "outputs" @@ -1490,20 +1472,12 @@ "title": "DV" }, "unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "micrometer", "title": "Coordinate unit" }, "ccf_version": { - "allOf": [ - { - "$ref": "#/$defs/CcfVersion" - } - ], + "$ref": "#/$defs/CcfVersion", "default": "CCFv3", "title": "CCF version" } @@ -1575,11 +1549,7 @@ "title": "Position Z" }, "unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "micrometer", "title": "Position unit" } @@ -1701,20 +1671,12 @@ "title": "Exposure time (ms)" }, "exposure_time_unit": { - "allOf": [ - { - "$ref": "#/$defs/TimeUnit" - } - ], + "$ref": "#/$defs/TimeUnit", "default": "millisecond", "title": "Exposure time unit" }, "trigger_type": { - "allOf": [ - { - "$ref": "#/$defs/TriggerType" - } - ], + "$ref": "#/$defs/TriggerType", "title": "Trigger type" } }, @@ -1757,11 +1719,7 @@ "title": "Module Angle (deg)" }, "angle_unit": { - "allOf": [ - { - "$ref": "#/$defs/AngleUnit" - } - ], + "$ref": "#/$defs/AngleUnit", "default": "degrees", "title": "Angle unit" }, @@ -2214,11 +2172,7 @@ "title": "Output power (uW)" }, "output_power_unit": { - "allOf": [ - { - "$ref": "#/$defs/PowerUnit" - } - ], + "$ref": "#/$defs/PowerUnit", "default": "microwatt", "title": "Output power unit" }, @@ -2266,11 +2220,7 @@ "title": "Module Angle (deg)" }, "angle_unit": { - "allOf": [ - { - "$ref": "#/$defs/AngleUnit" - } - ], + "$ref": "#/$defs/AngleUnit", "default": "degrees", "title": "Angle unit" }, @@ -2355,11 +2305,7 @@ "type": "array" }, "manipulator_coordinates": { - "allOf": [ - { - "$ref": "#/$defs/Coordinates3d" - } - ], + "$ref": "#/$defs/Coordinates3d", "title": "Manipulator coordinates" }, "anatomical_coordinates": { @@ -2406,11 +2352,7 @@ "title": "Surface z" }, "surface_z_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "micrometer", "title": "Surface z unit" }, @@ -2470,11 +2412,7 @@ "type": "integer" }, "imaging_depth_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "micrometer", "title": "Imaging depth unit" }, @@ -2505,11 +2443,7 @@ "title": "FOV coordinate AP" }, "fov_coordinate_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "micrometer", "title": "FOV coordinate unit" }, @@ -2527,11 +2461,7 @@ "type": "integer" }, "fov_size_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "pixel", "title": "FOV size unit" }, @@ -2571,11 +2501,7 @@ "title": "Frame rate (Hz)" }, "frame_rate_unit": { - "allOf": [ - { - "$ref": "#/$defs/FrequencyUnit" - } - ], + "$ref": "#/$defs/FrequencyUnit", "default": "hertz", "title": "Frame rate unit" }, @@ -2609,11 +2535,7 @@ "title": "Power" }, "power_unit": { - "allOf": [ - { - "$ref": "#/$defs/PowerUnit" - } - ], + "$ref": "#/$defs/PowerUnit", "default": "percent", "title": "Power unit" }, @@ -2645,11 +2567,7 @@ "title": "Z stage position of the fastz actuator for a given targeted depth" }, "scanfield_z_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "micrometer", "title": "Z stage position unit" }, @@ -3497,11 +3415,7 @@ "type": "integer" }, "wavelength_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "nanometer", "title": "Wavelength unit" }, @@ -3521,11 +3435,7 @@ "title": "Excitation power (mW)" }, "excitation_power_unit": { - "allOf": [ - { - "$ref": "#/$defs/PowerUnit" - } - ], + "$ref": "#/$defs/PowerUnit", "default": "milliwatt", "title": "Excitation power unit" } @@ -3570,11 +3480,7 @@ "title": "Excitation power (mW)" }, "excitation_power_unit": { - "allOf": [ - { - "$ref": "#/$defs/PowerUnit" - } - ], + "$ref": "#/$defs/PowerUnit", "default": "milliwatt", "title": "Excitation power unit" } @@ -3962,11 +3868,7 @@ "type": "integer" }, "scan_type": { - "allOf": [ - { - "$ref": "#/$defs/ScanType" - } - ], + "$ref": "#/$defs/ScanType", "title": "Scan type" }, "primary_scan": { @@ -3987,11 +3889,7 @@ "title": "MRI scanner" }, "scan_sequence_type": { - "allOf": [ - { - "$ref": "#/$defs/MriScanSequence" - } - ], + "$ref": "#/$defs/MriScanSequence", "title": "Scan sequence" }, "rare_factor": { @@ -4033,11 +3931,7 @@ "title": "Effective echo time (ms)" }, "echo_time_unit": { - "allOf": [ - { - "$ref": "#/$defs/TimeUnit" - } - ], + "$ref": "#/$defs/TimeUnit", "default": "millisecond", "title": "Echo time unit" }, @@ -4053,11 +3947,7 @@ "title": "Repetition time (ms)" }, "repetition_time_unit": { - "allOf": [ - { - "$ref": "#/$defs/TimeUnit" - } - ], + "$ref": "#/$defs/TimeUnit", "default": "millisecond", "title": "Repetition time unit" }, @@ -4086,11 +3976,7 @@ "title": "Scan position" }, "subject_position": { - "allOf": [ - { - "$ref": "#/$defs/SubjectPosition" - } - ], + "$ref": "#/$defs/SubjectPosition", "title": "Subject position" }, "voxel_sizes": { @@ -4120,11 +4006,7 @@ "type": "array" }, "additional_scan_parameters": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "title": "Parameters" }, "notes": { @@ -4253,11 +4135,7 @@ "title": "Module Angle (deg)" }, "angle_unit": { - "allOf": [ - { - "$ref": "#/$defs/AngleUnit" - } - ], + "$ref": "#/$defs/AngleUnit", "default": "degrees", "title": "Angle unit" }, @@ -4342,11 +4220,7 @@ "type": "array" }, "manipulator_coordinates": { - "allOf": [ - { - "$ref": "#/$defs/Coordinates3d" - } - ], + "$ref": "#/$defs/Coordinates3d", "title": "Manipulator coordinates" }, "anatomical_coordinates": { @@ -4393,11 +4267,7 @@ "title": "Surface z" }, "surface_z_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "micrometer", "title": "Surface z unit" }, @@ -5155,11 +5025,7 @@ "title": "Odorant dilution" }, "odorant_dilution_unit": { - "allOf": [ - { - "$ref": "#/$defs/ConcentrationUnit" - } - ], + "$ref": "#/$defs/ConcentrationUnit", "default": "% v/v", "title": "Dilution unit" }, @@ -5246,11 +5112,7 @@ "type": "string" }, "pulse_shape": { - "allOf": [ - { - "$ref": "#/$defs/PulseShape" - } - ], + "$ref": "#/$defs/PulseShape", "title": "Pulse shape" }, "pulse_frequency": { @@ -5268,11 +5130,7 @@ "type": "array" }, "pulse_frequency_unit": { - "allOf": [ - { - "$ref": "#/$defs/FrequencyUnit" - } - ], + "$ref": "#/$defs/FrequencyUnit", "default": "hertz", "title": "Pulse frequency unit" }, @@ -5291,11 +5149,7 @@ "type": "array" }, "pulse_width_unit": { - "allOf": [ - { - "$ref": "#/$defs/TimeUnit" - } - ], + "$ref": "#/$defs/TimeUnit", "default": "millisecond", "title": "Pulse width unit" }, @@ -5314,11 +5168,7 @@ "type": "array" }, "pulse_train_duration_unit": { - "allOf": [ - { - "$ref": "#/$defs/TimeUnit" - } - ], + "$ref": "#/$defs/TimeUnit", "default": "second", "title": "Pulse train duration unit" }, @@ -5343,11 +5193,7 @@ "title": "Pulse train interval (s)" }, "pulse_train_interval_unit": { - "allOf": [ - { - "$ref": "#/$defs/TimeUnit" - } - ], + "$ref": "#/$defs/TimeUnit", "default": "second", "title": "Pulse train interval unit" }, @@ -5364,20 +5210,12 @@ "title": "Baseline duration (s)" }, "baseline_duration_unit": { - "allOf": [ - { - "$ref": "#/$defs/TimeUnit" - } - ], + "$ref": "#/$defs/TimeUnit", "default": "second", "title": "Baseline duration unit" }, "other_parameters": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "title": "Other parameters" }, @@ -5561,20 +5399,12 @@ "title": "Inter trial interval (s)" }, "inter_trial_interval_unit": { - "allOf": [ - { - "$ref": "#/$defs/TimeUnit" - } - ], + "$ref": "#/$defs/TimeUnit", "default": "second", "title": "Inter trial interval unit" }, "other_parameters": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "title": "Other parameters" }, @@ -5624,11 +5454,7 @@ "title": "Stimulation laser power (mW)" }, "stimulation_laser_power_unit": { - "allOf": [ - { - "$ref": "#/$defs/PowerUnit" - } - ], + "$ref": "#/$defs/PowerUnit", "default": "milliwatt", "title": "Stimulation laser power unit" }, @@ -5652,11 +5478,7 @@ "title": "Spiral duration (s)" }, "spiral_duration_unit": { - "allOf": [ - { - "$ref": "#/$defs/TimeUnit" - } - ], + "$ref": "#/$defs/TimeUnit", "default": "second", "title": "Spiral duration unit" }, @@ -5672,20 +5494,12 @@ "title": "Inter trial interval (s)" }, "inter_spiral_interval_unit": { - "allOf": [ - { - "$ref": "#/$defs/TimeUnit" - } - ], + "$ref": "#/$defs/TimeUnit", "default": "second", "title": "Inter trial interval unit" }, "other_parameters": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "title": "Other parameters" }, @@ -6312,11 +6126,7 @@ "description": "Description of reward delivery configuration", "properties": { "reward_solution": { - "allOf": [ - { - "$ref": "#/$defs/RewardSolution" - } - ], + "$ref": "#/$defs/RewardSolution", "description": "If Other use notes", "title": "Reward solution" }, @@ -6361,20 +6171,12 @@ "description": "Reward spout session information", "properties": { "side": { - "allOf": [ - { - "$ref": "#/$defs/SpoutSide" - } - ], + "$ref": "#/$defs/SpoutSide", "description": "Must match rig", "title": "Spout side" }, "starting_position": { - "allOf": [ - { - "$ref": "#/$defs/RelativePosition" - } - ], + "$ref": "#/$defs/RelativePosition", "title": "Starting position" }, "variable_position": { @@ -7242,11 +7044,7 @@ "title": "Port index" }, "additional_settings": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "title": "Additional parameters" }, @@ -7263,19 +7061,11 @@ "title": "Notes" }, "scanner_location": { - "allOf": [ - { - "$ref": "#/$defs/ScannerLocation" - } - ], + "$ref": "#/$defs/ScannerLocation", "title": "Scanner location" }, "magnetic_strength": { - "allOf": [ - { - "$ref": "#/$defs/MagneticStrength" - } - ], + "$ref": "#/$defs/MagneticStrength", "title": "Magnetic strength (T)" }, "magnetic_strength_unit": { @@ -7328,11 +7118,7 @@ "type": "integer" }, "imaging_depth_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "micrometer", "title": "Imaging depth unit" }, @@ -7363,11 +7149,7 @@ "title": "FOV coordinate AP" }, "fov_coordinate_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "micrometer", "title": "FOV coordinate unit" }, @@ -7385,11 +7167,7 @@ "type": "integer" }, "fov_size_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "pixel", "title": "FOV size unit" }, @@ -7429,11 +7207,7 @@ "title": "Frame rate (Hz)" }, "frame_rate_unit": { - "allOf": [ - { - "$ref": "#/$defs/FrequencyUnit" - } - ], + "$ref": "#/$defs/FrequencyUnit", "default": "hertz", "title": "Frame rate unit" }, @@ -7467,11 +7241,7 @@ "title": "Power" }, "power_unit": { - "allOf": [ - { - "$ref": "#/$defs/PowerUnit" - } - ], + "$ref": "#/$defs/PowerUnit", "default": "percent", "title": "Power unit" }, @@ -7503,11 +7273,7 @@ "title": "Z stage position of the fastz actuator for a given targeted depth" }, "scanfield_z_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "micrometer", "title": "Z stage position unit" }, @@ -7536,11 +7302,7 @@ "title": "Notes" }, "session_type": { - "allOf": [ - { - "$ref": "#/$defs/SlapSessionType" - } - ], + "$ref": "#/$defs/SlapSessionType", "title": "Session type" }, "dmd_dilation_x": { @@ -7552,11 +7314,7 @@ "type": "integer" }, "dilation_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "pixel", "title": "Dilation unit" }, @@ -7642,11 +7400,7 @@ "title": "URL to commit being used" }, "parameters": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "title": "Software parameters" } @@ -7692,11 +7446,7 @@ "title": "Volume (dB)" }, "volume_unit": { - "allOf": [ - { - "$ref": "#/$defs/SoundIntensityUnit" - } - ], + "$ref": "#/$defs/SoundIntensityUnit", "default": "decibels", "title": "Volume unit" } @@ -7738,11 +7488,7 @@ "type": "number" }, "step_size_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "micrometer", "title": "Step size unit" }, @@ -7763,11 +7509,7 @@ "type": "number" }, "fov_coordinate_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "micrometer", "title": "FOV coordinate unit" }, @@ -7785,11 +7527,7 @@ "type": "integer" }, "fov_size_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "pixel", "title": "FOV size unit" }, @@ -7826,11 +7564,7 @@ "title": "Frame rate (Hz)" }, "frame_rate_unit": { - "allOf": [ - { - "$ref": "#/$defs/FrequencyUnit" - } - ], + "$ref": "#/$defs/FrequencyUnit", "default": "hertz", "title": "Frame rate unit" }, @@ -7905,11 +7639,7 @@ "type": "integer" }, "excitation_wavelength_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "nanometer", "title": "Laser wavelength unit" }, @@ -7919,11 +7649,7 @@ "type": "number" }, "excitation_power_unit": { - "allOf": [ - { - "$ref": "#/$defs/PowerUnit" - } - ], + "$ref": "#/$defs/PowerUnit", "default": "milliwatt", "title": "Laser power unit" }, @@ -7944,11 +7670,7 @@ "title": "Dilation (pixels)" }, "dilation_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "pixel", "title": "Dilation unit" }, @@ -7973,11 +7695,7 @@ "type": "integer" }, "depth_unit": { - "allOf": [ - { - "$ref": "#/$defs/SizeUnit" - } - ], + "$ref": "#/$defs/SizeUnit", "default": "micrometer", "title": "Depth unit" } @@ -8156,11 +7874,7 @@ "title": "Light source config" }, "output_parameters": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "title": "Performance metrics" }, @@ -8180,11 +7894,7 @@ "title": "Reward consumed during training (uL)" }, "reward_consumed_unit": { - "allOf": [ - { - "$ref": "#/$defs/VolumeUnit" - } - ], + "$ref": "#/$defs/VolumeUnit", "default": "microliter", "title": "Reward consumed unit" }, @@ -9006,11 +8716,7 @@ "type": "string" }, "stimulus_parameters": { - "allOf": [ - { - "$ref": "#/$defs/AindGeneric" - } - ], + "$ref": "#/$defs/AindGeneric", "default": {}, "description": "Define and list the parameter values used (e.g. all TF or orientation values)", "title": "Stimulus parameters" @@ -9065,10 +8771,10 @@ "type": "string" }, "schema_version": { - "const": "1.0.0", - "default": "1.0.0", + "const": "1.0.1", + "default": "1.0.1", "enum": [ - "1.0.0" + "1.0.1" ], "title": "Schema Version", "type": "string" @@ -9183,11 +8889,7 @@ "title": "Animal weight (g)" }, "weight_unit": { - "allOf": [ - { - "$ref": "#/$defs/MassUnit" - } - ], + "$ref": "#/$defs/MassUnit", "default": "gram", "title": "Weight unit" }, @@ -9269,11 +8971,7 @@ "title": "Total reward consumed (mL)" }, "reward_consumed_unit": { - "allOf": [ - { - "$ref": "#/$defs/VolumeUnit" - } - ], + "$ref": "#/$defs/VolumeUnit", "default": "milliliter", "title": "Reward consumed unit" }, diff --git a/src/aind_data_schema/core/acquisition.py b/src/aind_data_schema/core/acquisition.py index 838dd1ba..c908afd2 100644 --- a/src/aind_data_schema/core/acquisition.py +++ b/src/aind_data_schema/core/acquisition.py @@ -45,7 +45,7 @@ class Acquisition(AindCoreModel): _DESCRIBED_BY_URL = AindCoreModel._DESCRIBED_BY_BASE_URL.default + "aind_data_schema/core/acquisition.py" describedBy: str = Field(_DESCRIBED_BY_URL, json_schema_extra={"const": _DESCRIBED_BY_URL}) - schema_version: Literal["1.0.0"] = Field("1.0.0") + schema_version: Literal["1.0.1"] = Field("1.0.1") protocol_id: List[str] = Field(default=[], title="Protocol ID", description="DOI for protocols.io") experimenter_full_name: List[str] = Field( ..., diff --git a/src/aind_data_schema/core/data_description.py b/src/aind_data_schema/core/data_description.py index 9397e1f9..e5d5cbfd 100644 --- a/src/aind_data_schema/core/data_description.py +++ b/src/aind_data_schema/core/data_description.py @@ -40,7 +40,7 @@ class DataDescription(AindCoreModel): _DESCRIBED_BY_URL = AindCoreModel._DESCRIBED_BY_BASE_URL.default + "aind_data_schema/core/data_description.py" describedBy: str = Field(_DESCRIBED_BY_URL, json_schema_extra={"const": _DESCRIBED_BY_URL}) - schema_version: Literal["1.0.0"] = Field("1.0.0") + schema_version: Literal["1.0.1"] = Field("1.0.1") license: Literal["CC-BY-4.0"] = Field("CC-BY-4.0", title="License") platform: Platform.ONE_OF = Field( diff --git a/src/aind_data_schema/core/instrument.py b/src/aind_data_schema/core/instrument.py index d622cd2d..0bb40a45 100644 --- a/src/aind_data_schema/core/instrument.py +++ b/src/aind_data_schema/core/instrument.py @@ -35,7 +35,7 @@ class Instrument(AindCoreModel): _DESCRIBED_BY_URL = AindCoreModel._DESCRIBED_BY_BASE_URL.default + "aind_data_schema/core/instrument.py" describedBy: str = Field(_DESCRIBED_BY_URL, json_schema_extra={"const": _DESCRIBED_BY_URL}) - schema_version: Literal["1.0.0"] = Field("1.0.0") + schema_version: Literal["1.0.1"] = Field("1.0.1") instrument_id: Optional[str] = Field( default=None, diff --git a/src/aind_data_schema/core/metadata.py b/src/aind_data_schema/core/metadata.py index 747b442f..670aea6e 100644 --- a/src/aind_data_schema/core/metadata.py +++ b/src/aind_data_schema/core/metadata.py @@ -48,7 +48,7 @@ class Metadata(AindCoreModel): _DESCRIBED_BY_URL = AindCoreModel._DESCRIBED_BY_BASE_URL.default + "aind_data_schema/core/metadata.py" describedBy: str = Field(_DESCRIBED_BY_URL, json_schema_extra={"const": _DESCRIBED_BY_URL}) - schema_version: Literal["1.0.0"] = Field("1.0.0") + schema_version: Literal["1.0.1"] = Field("1.0.1") id: UUID = Field( default_factory=uuid4, alias="_id", diff --git a/src/aind_data_schema/core/procedures.py b/src/aind_data_schema/core/procedures.py index 11b5dddc..ef162f3d 100644 --- a/src/aind_data_schema/core/procedures.py +++ b/src/aind_data_schema/core/procedures.py @@ -649,7 +649,7 @@ class Procedures(AindCoreModel): _DESCRIBED_BY_URL = AindCoreModel._DESCRIBED_BY_BASE_URL.default + "aind_data_schema/core/procedures.py" describedBy: str = Field(_DESCRIBED_BY_URL, json_schema_extra={"const": _DESCRIBED_BY_URL}) - schema_version: Literal["1.0.0"] = Field("1.0.0") + schema_version: Literal["1.0.1"] = Field("1.0.1") subject_id: str = Field( ..., description="Unique identifier for the subject. If this is not a Allen LAS ID, indicate this in the Notes.", diff --git a/src/aind_data_schema/core/processing.py b/src/aind_data_schema/core/processing.py index e516fa7c..1a6f6235 100644 --- a/src/aind_data_schema/core/processing.py +++ b/src/aind_data_schema/core/processing.py @@ -124,7 +124,7 @@ class Processing(AindCoreModel): _DESCRIBED_BY_URL: str = AindCoreModel._DESCRIBED_BY_BASE_URL.default + "aind_data_schema/core/processing.py" describedBy: str = Field(_DESCRIBED_BY_URL, json_schema_extra={"const": _DESCRIBED_BY_URL}) - schema_version: Literal["1.0.0"] = Field("1.0.0") + schema_version: Literal["1.0.1"] = Field("1.0.1") processing_pipeline: PipelineProcess = Field( ..., description="Pipeline used to process data", title="Processing Pipeline" diff --git a/src/aind_data_schema/core/quality_control.py b/src/aind_data_schema/core/quality_control.py index b4879ff4..d3d1b797 100644 --- a/src/aind_data_schema/core/quality_control.py +++ b/src/aind_data_schema/core/quality_control.py @@ -131,7 +131,7 @@ class QualityControl(AindCoreModel): _DESCRIBED_BY_URL = AindCoreModel._DESCRIBED_BY_BASE_URL.default + "aind_data_schema/core/quality_control.py" describedBy: str = Field(_DESCRIBED_BY_URL, json_schema_extra={"const": _DESCRIBED_BY_URL}) - schema_version: Literal["1.0.0"] = Field("1.0.0") + schema_version: Literal["1.0.1"] = Field("1.0.1") evaluations: List[QCEvaluation] = Field(..., title="Evaluations") notes: Optional[str] = Field(default=None, title="Notes") diff --git a/src/aind_data_schema/core/rig.py b/src/aind_data_schema/core/rig.py index 5c074bbf..555e19c2 100644 --- a/src/aind_data_schema/core/rig.py +++ b/src/aind_data_schema/core/rig.py @@ -51,7 +51,7 @@ class Rig(AindCoreModel): _DESCRIBED_BY_URL = AindCoreModel._DESCRIBED_BY_BASE_URL.default + "aind_data_schema/core/rig.py" describedBy: str = Field(_DESCRIBED_BY_URL, json_schema_extra={"const": _DESCRIBED_BY_URL}) - schema_version: Literal["1.0.0"] = Field("1.0.0") + schema_version: Literal["1.0.1"] = Field("1.0.1") rig_id: str = Field( ..., description="Unique rig identifier, name convention: --", diff --git a/src/aind_data_schema/core/session.py b/src/aind_data_schema/core/session.py index 71114004..c8003f9f 100644 --- a/src/aind_data_schema/core/session.py +++ b/src/aind_data_schema/core/session.py @@ -534,7 +534,7 @@ class Session(AindCoreModel): _DESCRIBED_BY_URL = AindCoreModel._DESCRIBED_BY_BASE_URL.default + "aind_data_schema/core/session.py" describedBy: str = Field(_DESCRIBED_BY_URL, json_schema_extra={"const": _DESCRIBED_BY_URL}) - schema_version: Literal["1.0.0"] = Field("1.0.0") + schema_version: Literal["1.0.1"] = Field("1.0.1") protocol_id: List[str] = Field(default=[], title="Protocol ID", description="DOI for protocols.io") experimenter_full_name: List[str] = Field( ..., From 799267aa610cb50cb4d34c58337a8e66eb81fda1 Mon Sep 17 00:00:00 2001 From: Dan Birman Date: Fri, 4 Oct 2024 11:20:43 -0700 Subject: [PATCH 22/23] chore: version bump for schemas (#1094) * chore: version bump for schemas * tests: example updates --- examples/aibs_smartspim_procedures.json | 2 +- examples/ophys_procedures.json | 2 +- examples/procedures.json | 2 +- examples/processing.json | 2 +- examples/quality_control.json | 2 +- src/aind_data_schema/core/procedures.py | 2 +- src/aind_data_schema/core/processing.py | 2 +- src/aind_data_schema/core/quality_control.py | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/examples/aibs_smartspim_procedures.json b/examples/aibs_smartspim_procedures.json index f8e1e823..48bc54d7 100644 --- a/examples/aibs_smartspim_procedures.json +++ b/examples/aibs_smartspim_procedures.json @@ -1,6 +1,6 @@ { "describedBy": "https://raw.githubusercontent.com/AllenNeuralDynamics/aind-data-schema/main/src/aind_data_schema/core/procedures.py", - "schema_version": "1.0.1", + "schema_version": "1.1.0", "subject_id": "651286", "subject_procedures": [ { diff --git a/examples/ophys_procedures.json b/examples/ophys_procedures.json index 92ce4006..36039e73 100644 --- a/examples/ophys_procedures.json +++ b/examples/ophys_procedures.json @@ -1,6 +1,6 @@ { "describedBy": "https://raw.githubusercontent.com/AllenNeuralDynamics/aind-data-schema/main/src/aind_data_schema/core/procedures.py", - "schema_version": "1.0.1", + "schema_version": "1.1.0", "subject_id": "625100", "subject_procedures": [ { diff --git a/examples/procedures.json b/examples/procedures.json index 666c5157..503e179d 100644 --- a/examples/procedures.json +++ b/examples/procedures.json @@ -1,6 +1,6 @@ { "describedBy": "https://raw.githubusercontent.com/AllenNeuralDynamics/aind-data-schema/main/src/aind_data_schema/core/procedures.py", - "schema_version": "1.0.1", + "schema_version": "1.1.0", "subject_id": "625100", "subject_procedures": [ { diff --git a/examples/processing.json b/examples/processing.json index 75cb8a97..774b4dbe 100644 --- a/examples/processing.json +++ b/examples/processing.json @@ -1,6 +1,6 @@ { "describedBy": "https://raw.githubusercontent.com/AllenNeuralDynamics/aind-data-schema/main/src/aind_data_schema/core/processing.py", - "schema_version": "1.0.1", + "schema_version": "1.1.0", "processing_pipeline": { "data_processes": [ { diff --git a/examples/quality_control.json b/examples/quality_control.json index 4da23817..3a82b2ef 100644 --- a/examples/quality_control.json +++ b/examples/quality_control.json @@ -1,6 +1,6 @@ { "describedBy": "https://raw.githubusercontent.com/AllenNeuralDynamics/aind-data-schema/main/src/aind_data_schema/core/quality_control.py", - "schema_version": "1.0.1", + "schema_version": "1.1.0", "evaluations": [ { "modality": { diff --git a/src/aind_data_schema/core/procedures.py b/src/aind_data_schema/core/procedures.py index ef162f3d..1c32a3b3 100644 --- a/src/aind_data_schema/core/procedures.py +++ b/src/aind_data_schema/core/procedures.py @@ -649,7 +649,7 @@ class Procedures(AindCoreModel): _DESCRIBED_BY_URL = AindCoreModel._DESCRIBED_BY_BASE_URL.default + "aind_data_schema/core/procedures.py" describedBy: str = Field(_DESCRIBED_BY_URL, json_schema_extra={"const": _DESCRIBED_BY_URL}) - schema_version: Literal["1.0.1"] = Field("1.0.1") + schema_version: Literal["1.1.0"] = Field("1.1.0") subject_id: str = Field( ..., description="Unique identifier for the subject. If this is not a Allen LAS ID, indicate this in the Notes.", diff --git a/src/aind_data_schema/core/processing.py b/src/aind_data_schema/core/processing.py index 1a6f6235..4f571e47 100644 --- a/src/aind_data_schema/core/processing.py +++ b/src/aind_data_schema/core/processing.py @@ -124,7 +124,7 @@ class Processing(AindCoreModel): _DESCRIBED_BY_URL: str = AindCoreModel._DESCRIBED_BY_BASE_URL.default + "aind_data_schema/core/processing.py" describedBy: str = Field(_DESCRIBED_BY_URL, json_schema_extra={"const": _DESCRIBED_BY_URL}) - schema_version: Literal["1.0.1"] = Field("1.0.1") + schema_version: Literal["1.1.0"] = Field("1.1.0") processing_pipeline: PipelineProcess = Field( ..., description="Pipeline used to process data", title="Processing Pipeline" diff --git a/src/aind_data_schema/core/quality_control.py b/src/aind_data_schema/core/quality_control.py index d3d1b797..3ba9580f 100644 --- a/src/aind_data_schema/core/quality_control.py +++ b/src/aind_data_schema/core/quality_control.py @@ -131,7 +131,7 @@ class QualityControl(AindCoreModel): _DESCRIBED_BY_URL = AindCoreModel._DESCRIBED_BY_BASE_URL.default + "aind_data_schema/core/quality_control.py" describedBy: str = Field(_DESCRIBED_BY_URL, json_schema_extra={"const": _DESCRIBED_BY_URL}) - schema_version: Literal["1.0.1"] = Field("1.0.1") + schema_version: Literal["1.1.0"] = Field("1.1.0") evaluations: List[QCEvaluation] = Field(..., title="Evaluations") notes: Optional[str] = Field(default=None, title="Notes") From 038a7ff83cb6a2249460324da82c000024103e2d Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 4 Oct 2024 18:24:02 +0000 Subject: [PATCH 23/23] bump schema version [skip actions] --- examples/aibs_smartspim_procedures.json | 2 +- examples/ophys_procedures.json | 2 +- examples/procedures.json | 2 +- examples/processing.json | 2 +- examples/quality_control.json | 2 +- schemas/metadata_schema.json | 24 ++++++++++---------- schemas/procedures_schema.json | 6 ++--- schemas/processing_schema.json | 6 ++--- schemas/quality_control_schema.json | 6 ++--- src/aind_data_schema/core/metadata.py | 2 +- src/aind_data_schema/core/procedures.py | 2 +- src/aind_data_schema/core/processing.py | 2 +- src/aind_data_schema/core/quality_control.py | 2 +- 13 files changed, 30 insertions(+), 30 deletions(-) diff --git a/examples/aibs_smartspim_procedures.json b/examples/aibs_smartspim_procedures.json index 48bc54d7..87359c40 100644 --- a/examples/aibs_smartspim_procedures.json +++ b/examples/aibs_smartspim_procedures.json @@ -1,6 +1,6 @@ { "describedBy": "https://raw.githubusercontent.com/AllenNeuralDynamics/aind-data-schema/main/src/aind_data_schema/core/procedures.py", - "schema_version": "1.1.0", + "schema_version": "1.1.1", "subject_id": "651286", "subject_procedures": [ { diff --git a/examples/ophys_procedures.json b/examples/ophys_procedures.json index 36039e73..127b1600 100644 --- a/examples/ophys_procedures.json +++ b/examples/ophys_procedures.json @@ -1,6 +1,6 @@ { "describedBy": "https://raw.githubusercontent.com/AllenNeuralDynamics/aind-data-schema/main/src/aind_data_schema/core/procedures.py", - "schema_version": "1.1.0", + "schema_version": "1.1.1", "subject_id": "625100", "subject_procedures": [ { diff --git a/examples/procedures.json b/examples/procedures.json index 503e179d..f032e22b 100644 --- a/examples/procedures.json +++ b/examples/procedures.json @@ -1,6 +1,6 @@ { "describedBy": "https://raw.githubusercontent.com/AllenNeuralDynamics/aind-data-schema/main/src/aind_data_schema/core/procedures.py", - "schema_version": "1.1.0", + "schema_version": "1.1.1", "subject_id": "625100", "subject_procedures": [ { diff --git a/examples/processing.json b/examples/processing.json index 774b4dbe..8a8bad1d 100644 --- a/examples/processing.json +++ b/examples/processing.json @@ -1,6 +1,6 @@ { "describedBy": "https://raw.githubusercontent.com/AllenNeuralDynamics/aind-data-schema/main/src/aind_data_schema/core/processing.py", - "schema_version": "1.1.0", + "schema_version": "1.1.1", "processing_pipeline": { "data_processes": [ { diff --git a/examples/quality_control.json b/examples/quality_control.json index 3a82b2ef..7f0f9b29 100644 --- a/examples/quality_control.json +++ b/examples/quality_control.json @@ -1,6 +1,6 @@ { "describedBy": "https://raw.githubusercontent.com/AllenNeuralDynamics/aind-data-schema/main/src/aind_data_schema/core/quality_control.py", - "schema_version": "1.1.0", + "schema_version": "1.1.1", "evaluations": [ { "modality": { diff --git a/schemas/metadata_schema.json b/schemas/metadata_schema.json index 14ac83e7..4868168e 100644 --- a/schemas/metadata_schema.json +++ b/schemas/metadata_schema.json @@ -24819,10 +24819,10 @@ "type": "string" }, "schema_version": { - "const": "1.0.1", - "default": "1.0.1", + "const": "1.1.1", + "default": "1.1.1", "enum": [ - "1.0.1" + "1.1.1" ], "title": "Schema Version", "type": "string" @@ -24942,10 +24942,10 @@ "type": "string" }, "schema_version": { - "const": "1.0.1", - "default": "1.0.1", + "const": "1.1.1", + "default": "1.1.1", "enum": [ - "1.0.1" + "1.1.1" ], "title": "Schema Version", "type": "string" @@ -25388,10 +25388,10 @@ "type": "string" }, "schema_version": { - "const": "1.0.1", - "default": "1.0.1", + "const": "1.1.1", + "default": "1.1.1", "enum": [ - "1.0.1" + "1.1.1" ], "title": "Schema Version", "type": "string" @@ -35143,10 +35143,10 @@ "type": "string" }, "schema_version": { - "const": "1.0.1", - "default": "1.0.1", + "const": "1.0.2", + "default": "1.0.2", "enum": [ - "1.0.1" + "1.0.2" ], "title": "Schema Version", "type": "string" diff --git a/schemas/procedures_schema.json b/schemas/procedures_schema.json index d2c03a6a..d407fd43 100644 --- a/schemas/procedures_schema.json +++ b/schemas/procedures_schema.json @@ -12653,10 +12653,10 @@ "type": "string" }, "schema_version": { - "const": "1.0.1", - "default": "1.0.1", + "const": "1.1.1", + "default": "1.1.1", "enum": [ - "1.0.1" + "1.1.1" ], "title": "Schema Version", "type": "string" diff --git a/schemas/processing_schema.json b/schemas/processing_schema.json index f4a37181..4c2b223a 100644 --- a/schemas/processing_schema.json +++ b/schemas/processing_schema.json @@ -520,10 +520,10 @@ "type": "string" }, "schema_version": { - "const": "1.0.1", - "default": "1.0.1", + "const": "1.1.1", + "default": "1.1.1", "enum": [ - "1.0.1" + "1.1.1" ], "title": "Schema Version", "type": "string" diff --git a/schemas/quality_control_schema.json b/schemas/quality_control_schema.json index 7f321f40..568a2257 100644 --- a/schemas/quality_control_schema.json +++ b/schemas/quality_control_schema.json @@ -580,10 +580,10 @@ "type": "string" }, "schema_version": { - "const": "1.0.1", - "default": "1.0.1", + "const": "1.1.1", + "default": "1.1.1", "enum": [ - "1.0.1" + "1.1.1" ], "title": "Schema Version", "type": "string" diff --git a/src/aind_data_schema/core/metadata.py b/src/aind_data_schema/core/metadata.py index 670aea6e..6881187f 100644 --- a/src/aind_data_schema/core/metadata.py +++ b/src/aind_data_schema/core/metadata.py @@ -48,7 +48,7 @@ class Metadata(AindCoreModel): _DESCRIBED_BY_URL = AindCoreModel._DESCRIBED_BY_BASE_URL.default + "aind_data_schema/core/metadata.py" describedBy: str = Field(_DESCRIBED_BY_URL, json_schema_extra={"const": _DESCRIBED_BY_URL}) - schema_version: Literal["1.0.1"] = Field("1.0.1") + schema_version: Literal["1.0.2"] = Field("1.0.2") id: UUID = Field( default_factory=uuid4, alias="_id", diff --git a/src/aind_data_schema/core/procedures.py b/src/aind_data_schema/core/procedures.py index 1c32a3b3..d55e044c 100644 --- a/src/aind_data_schema/core/procedures.py +++ b/src/aind_data_schema/core/procedures.py @@ -649,7 +649,7 @@ class Procedures(AindCoreModel): _DESCRIBED_BY_URL = AindCoreModel._DESCRIBED_BY_BASE_URL.default + "aind_data_schema/core/procedures.py" describedBy: str = Field(_DESCRIBED_BY_URL, json_schema_extra={"const": _DESCRIBED_BY_URL}) - schema_version: Literal["1.1.0"] = Field("1.1.0") + schema_version: Literal["1.1.1"] = Field("1.1.1") subject_id: str = Field( ..., description="Unique identifier for the subject. If this is not a Allen LAS ID, indicate this in the Notes.", diff --git a/src/aind_data_schema/core/processing.py b/src/aind_data_schema/core/processing.py index 4f571e47..aeb88c94 100644 --- a/src/aind_data_schema/core/processing.py +++ b/src/aind_data_schema/core/processing.py @@ -124,7 +124,7 @@ class Processing(AindCoreModel): _DESCRIBED_BY_URL: str = AindCoreModel._DESCRIBED_BY_BASE_URL.default + "aind_data_schema/core/processing.py" describedBy: str = Field(_DESCRIBED_BY_URL, json_schema_extra={"const": _DESCRIBED_BY_URL}) - schema_version: Literal["1.1.0"] = Field("1.1.0") + schema_version: Literal["1.1.1"] = Field("1.1.1") processing_pipeline: PipelineProcess = Field( ..., description="Pipeline used to process data", title="Processing Pipeline" diff --git a/src/aind_data_schema/core/quality_control.py b/src/aind_data_schema/core/quality_control.py index 3ba9580f..73629f87 100644 --- a/src/aind_data_schema/core/quality_control.py +++ b/src/aind_data_schema/core/quality_control.py @@ -131,7 +131,7 @@ class QualityControl(AindCoreModel): _DESCRIBED_BY_URL = AindCoreModel._DESCRIBED_BY_BASE_URL.default + "aind_data_schema/core/quality_control.py" describedBy: str = Field(_DESCRIBED_BY_URL, json_schema_extra={"const": _DESCRIBED_BY_URL}) - schema_version: Literal["1.1.0"] = Field("1.1.0") + schema_version: Literal["1.1.1"] = Field("1.1.1") evaluations: List[QCEvaluation] = Field(..., title="Evaluations") notes: Optional[str] = Field(default=None, title="Notes")