From 26e355196d6aa2caf531d909d3876717a3bed641 Mon Sep 17 00:00:00 2001 From: Dan Birman Date: Fri, 15 May 2026 21:37:54 -0700 Subject: [PATCH 1/9] refactor: remove all Organization.X groups --- src/aind_data_schema/components/devices.py | 19 ++----------------- src/aind_data_schema/components/subjects.py | 6 +++--- .../components/surgery_procedures.py | 2 +- src/aind_data_schema/core/data_description.py | 4 ++-- 4 files changed, 8 insertions(+), 23 deletions(-) diff --git a/src/aind_data_schema/components/devices.py b/src/aind_data_schema/components/devices.py index 74460ebf9..d2b543ab1 100644 --- a/src/aind_data_schema/components/devices.py +++ b/src/aind_data_schema/components/devices.py @@ -144,7 +144,6 @@ class Detector(Device): """Description of a generic detector""" detector_type: DetectorType = Field(..., title="Detector Type") - manufacturer: Organization.DETECTOR_MANUFACTURERS data_interface: DataInterface = Field(..., title="Data interface") cooling: Cooling = Field(default=Cooling.NO_COOLING, title="Cooling") frame_rate: Optional[Decimal] = Field(default=None, title="Frame rate (Hz)", description="Frame rate being used") @@ -206,7 +205,6 @@ class Filter(Device): # required fields filter_type: FilterType = Field(..., title="Type of filter") - manufacturer: Organization.FILTER_MANUFACTURERS # optional fields cut_off_wavelength: Optional[int] = Field(default=None, title="Cut-off wavelength (nm)") @@ -239,9 +237,6 @@ def validate_multi_filters(self): class Lens(Device): """Lens""" - # required fields - manufacturer: Organization.LENS_MANUFACTURERS - class MotorizedStage(Device): """Description of motorized stage""" @@ -316,7 +311,6 @@ class DAQDevice(Device): # required fields data_interface: DataInterface = Field(..., title="Type of connection to PC") - manufacturer: Organization.DAQ_DEVICE_MANUFACTURERS # optional fields channels: List[DAQChannel] = Field(default=[], title="DAQ channels") @@ -328,7 +322,6 @@ class HarpDevice(DAQDevice): """DAQ that uses the Harp protocol for synchronization and data transmission""" # required fields - manufacturer: Organization.ONE_OF = Field(default=Organization.OEPS) harp_device_type: HarpDeviceType.ONE_OF = Field(..., title="Type of Harp device") core_version: Optional[str] = Field(default=None, title="Core version") tag_version: Optional[str] = Field(default=None, title="Tag version") @@ -351,7 +344,6 @@ class Laser(Device): """Laser module with a specific wavelength (may be a sub-component of a larger assembly)""" # required fields - manufacturer: Organization.LASER_MANUFACTURERS wavelength: int = Field(..., title="Wavelength (nm)") wavelength_unit: SizeUnit = Field(default=SizeUnit.NM, title="Wavelength unit") @@ -369,7 +361,6 @@ class Laser(Device): class LightEmittingDiode(Device): """Description of a Light Emitting Diode (LED) device""" - manufacturer: Organization.LED_MANUFACTURERS wavelength: int = Field(..., title="Wavelength (nm)") wavelength_unit: SizeUnit = Field(default=SizeUnit.NM, title="Wavelength unit") bandwidth: Optional[int] = Field(default=None, title="Bandwidth (FWHM)") @@ -416,7 +407,7 @@ class NeuropixelsBasestation(DAQDevice): # fixed values data_interface: DataInterface = DataInterface.PXI - manufacturer: Organization.DAQ_DEVICE_MANUFACTURERS = Organization.IMEC + manufacturer: Organization.ONE_OF = Organization.IMEC class OpenEphysAcquisitionBoard(DAQDevice): @@ -427,14 +418,12 @@ class OpenEphysAcquisitionBoard(DAQDevice): # fixed values data_interface: Literal[DataInterface.USB] = DataInterface.USB - manufacturer: Organization.DAQ_DEVICE_MANUFACTURERS = Field(default=Organization.OEPS) + manufacturer: Organization.ONE_OF = Field(default=Organization.OEPS) class Manipulator(Device): """Manipulator used on a dome module""" - manufacturer: Organization.MANIPULATOR_MANUFACTURERS - class FiberPatchCord(Device): """Description of a patch cord""" @@ -600,7 +589,6 @@ class Arena(Device): class Monitor(Device, DevicePosition): """Description of visual display for visual stimuli""" - manufacturer: Organization.MONITOR_MANUFACTURERS refresh_rate: int = Field(..., title="Refresh rate (Hz)", ge=60) width: int = Field(..., title="Width (pixels)") height: int = Field(..., title="Height (pixels)") @@ -673,7 +661,6 @@ class AirPuffDevice(Device): class Speaker(Device, DevicePosition): """Description of a speaker for auditory stimuli""" - manufacturer: Organization.SPEAKER_MANUFACTURERS class OlfactometerChannelType(Enum): @@ -695,8 +682,6 @@ class OlfactometerChannel(DataModel): class Olfactometer(HarpDevice): """Description of an olfactometer for odor stimuli""" - manufacturer: Organization.DAQ_DEVICE_MANUFACTURERS = Field(default=Organization.CHAMPALIMAUD) - harp_device_type: HarpDeviceType.ONE_OF = Field( HarpDeviceType.OLFACTOMETER, frozen=True, title="Type of Harp device" ) diff --git a/src/aind_data_schema/components/subjects.py b/src/aind_data_schema/components/subjects.py index 02bd8026c..2070bf163 100644 --- a/src/aind_data_schema/components/subjects.py +++ b/src/aind_data_schema/components/subjects.py @@ -117,7 +117,7 @@ class MouseSubject(DataModel): breeding_info: Optional[BreedingInfo] = Field(default=None, title="Breeding Info") wellness_reports: List[WellnessReport] = Field(default=[], title="Wellness Report") housing: Optional[Housing] = Field(default=None, title="Housing") - source: Organization.SUBJECT_SOURCES = Field( + source: Organization.ONE_OF = Field( ..., description="Where the subject was acquired from. If bred in-house, use Allen Institute.", title="Source", @@ -159,7 +159,7 @@ class HumanSubject(DataModel): species: SpeciesModel = Field(default=Species.HUMAN, title="Species") sex: Sex = Field(..., title="Sex") year_of_birth: int = Field(..., title="Year of birth") - source: Organization.SUBJECT_SOURCES = Field( + source: Organization.ONE_OF = Field( ..., description="Where the subject was acquired from.", title="Source", @@ -181,7 +181,7 @@ class NonHumanPrimateSubject(DataModel): date_of_birth: Optional[Annotated[date_type, TimeValidation.BEFORE]] = Field(default=None, title="Date of birth") year_of_birth: int = Field(..., title="Year of birth") mating_status: MatingStatus = Field(..., title="Mating status") - source: Organization.SUBJECT_SOURCES = Field( + source: Organization.ONE_OF = Field( ..., description="Where the subject was acquired from.", title="Source", diff --git a/src/aind_data_schema/components/surgery_procedures.py b/src/aind_data_schema/components/surgery_procedures.py index c1e14482a..ec60a5a22 100644 --- a/src/aind_data_schema/components/surgery_procedures.py +++ b/src/aind_data_schema/components/surgery_procedures.py @@ -63,7 +63,7 @@ class HeadframeMaterial(str, Enum): class CatheterImplant(DataModel): """Description of a catheter implant procedure""" - where_performed: Organization.CATHETER_IMPLANT_INSTITUTIONS = Field(..., title="Where performed") + where_performed: Organization.ONE_OF = Field(..., title="Where performed") implanted_device: Catheter = Field( ..., title="Implanted device", diff --git a/src/aind_data_schema/core/data_description.py b/src/aind_data_schema/core/data_description.py index 5f233ddfd..33a1d64fa 100644 --- a/src/aind_data_schema/core/data_description.py +++ b/src/aind_data_schema/core/data_description.py @@ -25,7 +25,7 @@ class Funding(DataModel): """Description of funding sources""" - funder: Organization.FUNDERS = Field(..., title="Funder") + funder: Organization.ONE_OF = Field(..., title="Funder") grant_number: Optional[str] = Field(default=None, title="Grant number") fundee: Optional[List[Person]] = Field( default=None, title="Fundee", description="Person(s) funded by this mechanism" @@ -65,7 +65,7 @@ class DataDescription(DataCoreModel): title="Data asset name", validate_default=True, ) - institution: Organization.RESEARCH_INSTITUTIONS = Field( + institution: Organization.ONE_OF = Field( ..., description="An established society, corporation, foundation or other organization that collected this data", title="Institution", From 924c49faeac1816674cd0a64334f686c1b9691f4 Mon Sep 17 00:00:00 2001 From: Dan Birman Date: Fri, 15 May 2026 21:39:55 -0700 Subject: [PATCH 2/9] chore: lint --- src/aind_data_schema/components/devices.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/aind_data_schema/components/devices.py b/src/aind_data_schema/components/devices.py index d2b543ab1..4d9b8e39b 100644 --- a/src/aind_data_schema/components/devices.py +++ b/src/aind_data_schema/components/devices.py @@ -662,7 +662,6 @@ class Speaker(Device, DevicePosition): """Description of a speaker for auditory stimuli""" - class OlfactometerChannelType(Enum): """Olfactometer channel types""" From 190428344c12465bd692741da0bb6e9e3ea215c9 Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 16 May 2026 04:40:44 +0000 Subject: [PATCH 3/9] update docs --- .../aind_data_schema_models/process_names.md | 1 + docs/source/components/devices.md | 24 +++++++++---------- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/docs/source/aind_data_schema_models/process_names.md b/docs/source/aind_data_schema_models/process_names.md index 557b8d904..1bafd1836 100644 --- a/docs/source/aind_data_schema_models/process_names.md +++ b/docs/source/aind_data_schema_models/process_names.md @@ -37,6 +37,7 @@ Process names | `IMAGE_TILE_ALIGNMENT` | `Image tile alignment` | | `IMAGE_TILE_FUSING` | `Image tile fusing` | | `IMAGE_TILE_PROJECTION` | `Image tile projection` | +| `MANUAL_CURATION` | `Manual curation` | | `MODEL_EVALUATION` | `Model evaluation` | | `MODEL_TRAINING` | `Model training` | | `NEURON_SKELETON_PROCESSING` | `Neuron skeleton processing` | diff --git a/docs/source/components/devices.md b/docs/source/components/devices.md index 2c42105f4..4fba2cba1 100644 --- a/docs/source/components/devices.md +++ b/docs/source/components/devices.md @@ -57,7 +57,6 @@ Camera Detector | Field | Type | Title (Description) | |-------|------|-------------| | `detector_type` | [DetectorType](../aind_data_schema_models/devices.md#detectortype) | | -| `manufacturer` | [Organization](../aind_data_schema_models/organizations.md#organization) | | | `data_interface` | [DataInterface](../aind_data_schema_models/devices.md#datainterface) | Data interface | | `cooling` | [Cooling](../aind_data_schema_models/devices.md#cooling) | Cooling | | `frame_rate` | `Optional[decimal.Decimal]` | Frame rate (Hz) (Frame rate being used) | @@ -85,6 +84,7 @@ Camera Detector | `driver_version` | `Optional[str]` | Driver version | | `name` | `str` | Device name | | `serial_number` | `Optional[str]` | Serial number | +| `manufacturer` | Optional[[Organization](../aind_data_schema_models/organizations.md#organization)] | Manufacturer | | `model` | `Optional[str]` | Model | | `additional_settings` | `Optional[dict]` | Additional parameters | | `notes` | `Optional[str]` | Notes | @@ -192,12 +192,12 @@ Data acquisition device containing multiple I/O channels | Field | Type | Title (Description) | |-------|------|-------------| | `data_interface` | [DataInterface](../aind_data_schema_models/devices.md#datainterface) | Type of connection to PC | -| `manufacturer` | [Organization](../aind_data_schema_models/organizations.md#organization) | | | `channels` | List[[DAQChannel](#daqchannel)] | DAQ channels | | `firmware_version` | `Optional[str]` | Firmware version | | `hardware_version` | `Optional[str]` | Hardware version | | `name` | `str` | Device name | | `serial_number` | `Optional[str]` | Serial number | +| `manufacturer` | Optional[[Organization](../aind_data_schema_models/organizations.md#organization)] | Manufacturer | | `model` | `Optional[str]` | Model | | `additional_settings` | `Optional[dict]` | Additional parameters | | `notes` | `Optional[str]` | Notes | @@ -210,7 +210,6 @@ Description of a generic detector | Field | Type | Title (Description) | |-------|------|-------------| | `detector_type` | [DetectorType](../aind_data_schema_models/devices.md#detectortype) | Detector Type | -| `manufacturer` | [Organization](../aind_data_schema_models/organizations.md#organization) | | | `data_interface` | [DataInterface](../aind_data_schema_models/devices.md#datainterface) | Data interface | | `cooling` | [Cooling](../aind_data_schema_models/devices.md#cooling) | Cooling | | `frame_rate` | `Optional[decimal.Decimal]` | Frame rate (Hz) (Frame rate being used) | @@ -238,6 +237,7 @@ Description of a generic detector | `driver_version` | `Optional[str]` | Driver version | | `name` | `str` | Device name | | `serial_number` | `Optional[str]` | Serial number | +| `manufacturer` | Optional[[Organization](../aind_data_schema_models/organizations.md#organization)] | Manufacturer | | `model` | `Optional[str]` | Model | | `additional_settings` | `Optional[dict]` | Additional parameters | | `notes` | `Optional[str]` | Notes | @@ -417,13 +417,13 @@ Filter used in a light path | Field | Type | Title (Description) | |-------|------|-------------| | `filter_type` | [FilterType](../aind_data_schema_models/devices.md#filtertype) | Type of filter | -| `manufacturer` | [Organization](../aind_data_schema_models/organizations.md#organization) | | | `cut_off_wavelength` | `Optional[int]` | Cut-off wavelength (nm) | | `cut_on_wavelength` | `Optional[int]` | Cut-on wavelength (nm) | | `center_wavelength` | `int or List[int] or NoneType` | Center wavelength (nm) (Single wavelength or list of wavelengths for MULTIBAND or MULTI_NOTCH filters) | | `wavelength_unit` | [SizeUnit](../aind_data_schema_models/units.md#sizeunit) | Wavelength unit | | `name` | `str` | Device name | | `serial_number` | `Optional[str]` | Serial number | +| `manufacturer` | Optional[[Organization](../aind_data_schema_models/organizations.md#organization)] | Manufacturer | | `model` | `Optional[str]` | Model | | `additional_settings` | `Optional[dict]` | Additional parameters | | `notes` | `Optional[str]` | Notes | @@ -435,7 +435,6 @@ DAQ that uses the Harp protocol for synchronization and data transmission | Field | Type | Title (Description) | |-------|------|-------------| -| `manufacturer` | [Organization](../aind_data_schema_models/organizations.md#organization) | | | `harp_device_type` | [HarpDeviceType](../aind_data_schema_models/harp_types.md#harpdevicetype) | Type of Harp device | | `core_version` | `Optional[str]` | Core version | | `tag_version` | `Optional[str]` | Tag version | @@ -446,6 +445,7 @@ DAQ that uses the Harp protocol for synchronization and data transmission | `hardware_version` | `Optional[str]` | Hardware version | | `name` | `str` | Device name | | `serial_number` | `Optional[str]` | Serial number | +| `manufacturer` | Optional[[Organization](../aind_data_schema_models/organizations.md#organization)] | Manufacturer | | `model` | `Optional[str]` | Model | | `additional_settings` | `Optional[dict]` | Additional parameters | | `notes` | `Optional[str]` | Notes | @@ -476,7 +476,6 @@ Laser module with a specific wavelength (may be a sub-component of a larger asse | Field | Type | Title (Description) | |-------|------|-------------| -| `manufacturer` | [Organization](../aind_data_schema_models/organizations.md#organization) | | | `wavelength` | `int` | Wavelength (nm) | | `wavelength_unit` | [SizeUnit](../aind_data_schema_models/units.md#sizeunit) | Wavelength unit | | `coupling` | Optional[[Coupling](../aind_data_schema_models/devices.md#coupling)] | Coupling | @@ -484,6 +483,7 @@ Laser module with a specific wavelength (may be a sub-component of a larger asse | `coupling_efficiency_unit` | `"percent"` | Coupling efficiency unit | | `name` | `str` | Device name | | `serial_number` | `Optional[str]` | Serial number | +| `manufacturer` | Optional[[Organization](../aind_data_schema_models/organizations.md#organization)] | Manufacturer | | `model` | `Optional[str]` | Model | | `additional_settings` | `Optional[dict]` | Additional parameters | | `notes` | `Optional[str]` | Notes | @@ -508,9 +508,9 @@ Lens | Field | Type | Title (Description) | |-------|------|-------------| -| `manufacturer` | [Organization](../aind_data_schema_models/organizations.md#organization) | | | `name` | `str` | Device name | | `serial_number` | `Optional[str]` | Serial number | +| `manufacturer` | Optional[[Organization](../aind_data_schema_models/organizations.md#organization)] | Manufacturer | | `model` | `Optional[str]` | Model | | `additional_settings` | `Optional[dict]` | Additional parameters | | `notes` | `Optional[str]` | Notes | @@ -564,13 +564,13 @@ Description of a Light Emitting Diode (LED) device | Field | Type | Title (Description) | |-------|------|-------------| -| `manufacturer` | [Organization](../aind_data_schema_models/organizations.md#organization) | | | `wavelength` | `int` | Wavelength (nm) | | `wavelength_unit` | [SizeUnit](../aind_data_schema_models/units.md#sizeunit) | Wavelength unit | | `bandwidth` | `Optional[int]` | Bandwidth (FWHM) | | `bandwidth_unit` | Optional[[SizeUnit](../aind_data_schema_models/units.md#sizeunit)] | Bandwidth unit | | `name` | `str` | Device name | | `serial_number` | `Optional[str]` | Serial number | +| `manufacturer` | Optional[[Organization](../aind_data_schema_models/organizations.md#organization)] | Manufacturer | | `model` | `Optional[str]` | Model | | `additional_settings` | `Optional[dict]` | Additional parameters | | `notes` | `Optional[str]` | Notes | @@ -582,9 +582,9 @@ Manipulator used on a dome module | Field | Type | Title (Description) | |-------|------|-------------| -| `manufacturer` | [Organization](../aind_data_schema_models/organizations.md#organization) | | | `name` | `str` | Device name | | `serial_number` | `Optional[str]` | Serial number | +| `manufacturer` | Optional[[Organization](../aind_data_schema_models/organizations.md#organization)] | Manufacturer | | `model` | `Optional[str]` | Model | | `additional_settings` | `Optional[dict]` | Additional parameters | | `notes` | `Optional[str]` | Notes | @@ -610,7 +610,6 @@ Description of visual display for visual stimuli | Field | Type | Title (Description) | |-------|------|-------------| -| `manufacturer` | [Organization](../aind_data_schema_models/organizations.md#organization) | | | `refresh_rate` | `int` | Refresh rate (Hz) | | `width` | `int` | Width (pixels) | | `height` | `int` | Height (pixels) | @@ -623,6 +622,7 @@ Description of visual display for visual stimuli | `brightness_unit` | Optional[[UnitlessUnit](../aind_data_schema_models/units.md#unitlessunit)] | Brightness unit | | `name` | `str` | Device name | | `serial_number` | `Optional[str]` | Serial number | +| `manufacturer` | Optional[[Organization](../aind_data_schema_models/organizations.md#organization)] | Manufacturer | | `model` | `Optional[str]` | Model | | `additional_settings` | `Optional[dict]` | Additional parameters | | `notes` | `Optional[str]` | Notes | @@ -732,7 +732,6 @@ Description of an olfactometer for odor stimuli | Field | Type | Title (Description) | |-------|------|-------------| -| `manufacturer` | [Organization](../aind_data_schema_models/organizations.md#organization) | | | `harp_device_type` | [HarpDeviceType](../aind_data_schema_models/harp_types.md#harpdevicetype) | Type of Harp device | | `channels` | List[[OlfactometerChannel](#olfactometerchannel)] | | | `core_version` | `Optional[str]` | Core version | @@ -743,6 +742,7 @@ Description of an olfactometer for odor stimuli | `hardware_version` | `Optional[str]` | Hardware version | | `name` | `str` | Device name | | `serial_number` | `Optional[str]` | Serial number | +| `manufacturer` | Optional[[Organization](../aind_data_schema_models/organizations.md#organization)] | Manufacturer | | `model` | `Optional[str]` | Model | | `additional_settings` | `Optional[dict]` | Additional parameters | | `notes` | `Optional[str]` | Notes | @@ -888,9 +888,9 @@ Description of a speaker for auditory stimuli | Field | Type | Title (Description) | |-------|------|-------------| -| `manufacturer` | [Organization](../aind_data_schema_models/organizations.md#organization) | | | `name` | `str` | Device name | | `serial_number` | `Optional[str]` | Serial number | +| `manufacturer` | Optional[[Organization](../aind_data_schema_models/organizations.md#organization)] | Manufacturer | | `model` | `Optional[str]` | Model | | `additional_settings` | `Optional[dict]` | Additional parameters | | `notes` | `Optional[str]` | Notes | From 6ff60b590dc208b122e3431dc224530f9df967a0 Mon Sep 17 00:00:00 2001 From: Dan Birman Date: Wed, 20 May 2026 10:08:22 -0700 Subject: [PATCH 4/9] refactor: make sure manufacturer is REQUIRED for subclasses --- src/aind_data_schema/components/devices.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/aind_data_schema/components/devices.py b/src/aind_data_schema/components/devices.py index 4d9b8e39b..9ea4cdef3 100644 --- a/src/aind_data_schema/components/devices.py +++ b/src/aind_data_schema/components/devices.py @@ -144,6 +144,7 @@ class Detector(Device): """Description of a generic detector""" detector_type: DetectorType = Field(..., title="Detector Type") + manufacturer: Organization.ONE_OF = Field(..., title="Manufacturer") data_interface: DataInterface = Field(..., title="Data interface") cooling: Cooling = Field(default=Cooling.NO_COOLING, title="Cooling") frame_rate: Optional[Decimal] = Field(default=None, title="Frame rate (Hz)", description="Frame rate being used") @@ -205,6 +206,7 @@ class Filter(Device): # required fields filter_type: FilterType = Field(..., title="Type of filter") + manufacturer: Organization.ONE_OF = Field(..., title="Manufacturer") # optional fields cut_off_wavelength: Optional[int] = Field(default=None, title="Cut-off wavelength (nm)") @@ -237,6 +239,8 @@ def validate_multi_filters(self): class Lens(Device): """Lens""" + manufacturer: Organization.ONE_OF = Field(..., title="Manufacturer") + class MotorizedStage(Device): """Description of motorized stage""" @@ -311,6 +315,7 @@ class DAQDevice(Device): # required fields data_interface: DataInterface = Field(..., title="Type of connection to PC") + manufacturer: Organization.ONE_OF = Field(..., title="Manufacturer") # optional fields channels: List[DAQChannel] = Field(default=[], title="DAQ channels") @@ -322,6 +327,7 @@ class HarpDevice(DAQDevice): """DAQ that uses the Harp protocol for synchronization and data transmission""" # required fields + manufacturer: Organization.ONE_OF = Field(default=Organization.OEPS, title="Manufacturer") harp_device_type: HarpDeviceType.ONE_OF = Field(..., title="Type of Harp device") core_version: Optional[str] = Field(default=None, title="Core version") tag_version: Optional[str] = Field(default=None, title="Tag version") @@ -344,6 +350,7 @@ class Laser(Device): """Laser module with a specific wavelength (may be a sub-component of a larger assembly)""" # required fields + manufacturer: Organization.ONE_OF = Field(..., title="Manufacturer") wavelength: int = Field(..., title="Wavelength (nm)") wavelength_unit: SizeUnit = Field(default=SizeUnit.NM, title="Wavelength unit") @@ -424,6 +431,7 @@ class OpenEphysAcquisitionBoard(DAQDevice): class Manipulator(Device): """Manipulator used on a dome module""" + manufacturer: Organization.ONE_OF = Field(..., title="Manufacturer") class FiberPatchCord(Device): """Description of a patch cord""" @@ -661,6 +669,8 @@ class AirPuffDevice(Device): class Speaker(Device, DevicePosition): """Description of a speaker for auditory stimuli""" + manufacturer: Organization.ONE_OF = Field(..., title="Manufacturer") + class OlfactometerChannelType(Enum): """Olfactometer channel types""" @@ -681,6 +691,7 @@ class OlfactometerChannel(DataModel): class Olfactometer(HarpDevice): """Description of an olfactometer for odor stimuli""" + manufacturer: Organization.ONE_OF = Field(..., title="Manufacturer") harp_device_type: HarpDeviceType.ONE_OF = Field( HarpDeviceType.OLFACTOMETER, frozen=True, title="Type of Harp device" ) From fcf9178875513440706d88364ca2017106e63ee0 Mon Sep 17 00:00:00 2001 From: Dan Birman Date: Wed, 20 May 2026 10:09:20 -0700 Subject: [PATCH 5/9] chore: lint --- src/aind_data_schema/components/devices.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/aind_data_schema/components/devices.py b/src/aind_data_schema/components/devices.py index 9ea4cdef3..670048387 100644 --- a/src/aind_data_schema/components/devices.py +++ b/src/aind_data_schema/components/devices.py @@ -433,6 +433,7 @@ class Manipulator(Device): manufacturer: Organization.ONE_OF = Field(..., title="Manufacturer") + class FiberPatchCord(Device): """Description of a patch cord""" From 939af8e5bd9569f7f9f945bc32644506a68d8e88 Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 20 May 2026 17:10:31 +0000 Subject: [PATCH 6/9] update docs --- docs/source/components/devices.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/docs/source/components/devices.md b/docs/source/components/devices.md index 4fba2cba1..2f3e6522e 100644 --- a/docs/source/components/devices.md +++ b/docs/source/components/devices.md @@ -57,6 +57,7 @@ Camera Detector | Field | Type | Title (Description) | |-------|------|-------------| | `detector_type` | [DetectorType](../aind_data_schema_models/devices.md#detectortype) | | +| `manufacturer` | [Organization](../aind_data_schema_models/organizations.md#organization) | Manufacturer | | `data_interface` | [DataInterface](../aind_data_schema_models/devices.md#datainterface) | Data interface | | `cooling` | [Cooling](../aind_data_schema_models/devices.md#cooling) | Cooling | | `frame_rate` | `Optional[decimal.Decimal]` | Frame rate (Hz) (Frame rate being used) | @@ -84,7 +85,6 @@ Camera Detector | `driver_version` | `Optional[str]` | Driver version | | `name` | `str` | Device name | | `serial_number` | `Optional[str]` | Serial number | -| `manufacturer` | Optional[[Organization](../aind_data_schema_models/organizations.md#organization)] | Manufacturer | | `model` | `Optional[str]` | Model | | `additional_settings` | `Optional[dict]` | Additional parameters | | `notes` | `Optional[str]` | Notes | @@ -192,12 +192,12 @@ Data acquisition device containing multiple I/O channels | Field | Type | Title (Description) | |-------|------|-------------| | `data_interface` | [DataInterface](../aind_data_schema_models/devices.md#datainterface) | Type of connection to PC | +| `manufacturer` | [Organization](../aind_data_schema_models/organizations.md#organization) | Manufacturer | | `channels` | List[[DAQChannel](#daqchannel)] | DAQ channels | | `firmware_version` | `Optional[str]` | Firmware version | | `hardware_version` | `Optional[str]` | Hardware version | | `name` | `str` | Device name | | `serial_number` | `Optional[str]` | Serial number | -| `manufacturer` | Optional[[Organization](../aind_data_schema_models/organizations.md#organization)] | Manufacturer | | `model` | `Optional[str]` | Model | | `additional_settings` | `Optional[dict]` | Additional parameters | | `notes` | `Optional[str]` | Notes | @@ -210,6 +210,7 @@ Description of a generic detector | Field | Type | Title (Description) | |-------|------|-------------| | `detector_type` | [DetectorType](../aind_data_schema_models/devices.md#detectortype) | Detector Type | +| `manufacturer` | [Organization](../aind_data_schema_models/organizations.md#organization) | Manufacturer | | `data_interface` | [DataInterface](../aind_data_schema_models/devices.md#datainterface) | Data interface | | `cooling` | [Cooling](../aind_data_schema_models/devices.md#cooling) | Cooling | | `frame_rate` | `Optional[decimal.Decimal]` | Frame rate (Hz) (Frame rate being used) | @@ -237,7 +238,6 @@ Description of a generic detector | `driver_version` | `Optional[str]` | Driver version | | `name` | `str` | Device name | | `serial_number` | `Optional[str]` | Serial number | -| `manufacturer` | Optional[[Organization](../aind_data_schema_models/organizations.md#organization)] | Manufacturer | | `model` | `Optional[str]` | Model | | `additional_settings` | `Optional[dict]` | Additional parameters | | `notes` | `Optional[str]` | Notes | @@ -417,13 +417,13 @@ Filter used in a light path | Field | Type | Title (Description) | |-------|------|-------------| | `filter_type` | [FilterType](../aind_data_schema_models/devices.md#filtertype) | Type of filter | +| `manufacturer` | [Organization](../aind_data_schema_models/organizations.md#organization) | Manufacturer | | `cut_off_wavelength` | `Optional[int]` | Cut-off wavelength (nm) | | `cut_on_wavelength` | `Optional[int]` | Cut-on wavelength (nm) | | `center_wavelength` | `int or List[int] or NoneType` | Center wavelength (nm) (Single wavelength or list of wavelengths for MULTIBAND or MULTI_NOTCH filters) | | `wavelength_unit` | [SizeUnit](../aind_data_schema_models/units.md#sizeunit) | Wavelength unit | | `name` | `str` | Device name | | `serial_number` | `Optional[str]` | Serial number | -| `manufacturer` | Optional[[Organization](../aind_data_schema_models/organizations.md#organization)] | Manufacturer | | `model` | `Optional[str]` | Model | | `additional_settings` | `Optional[dict]` | Additional parameters | | `notes` | `Optional[str]` | Notes | @@ -435,6 +435,7 @@ DAQ that uses the Harp protocol for synchronization and data transmission | Field | Type | Title (Description) | |-------|------|-------------| +| `manufacturer` | [Organization](../aind_data_schema_models/organizations.md#organization) | Manufacturer | | `harp_device_type` | [HarpDeviceType](../aind_data_schema_models/harp_types.md#harpdevicetype) | Type of Harp device | | `core_version` | `Optional[str]` | Core version | | `tag_version` | `Optional[str]` | Tag version | @@ -445,7 +446,6 @@ DAQ that uses the Harp protocol for synchronization and data transmission | `hardware_version` | `Optional[str]` | Hardware version | | `name` | `str` | Device name | | `serial_number` | `Optional[str]` | Serial number | -| `manufacturer` | Optional[[Organization](../aind_data_schema_models/organizations.md#organization)] | Manufacturer | | `model` | `Optional[str]` | Model | | `additional_settings` | `Optional[dict]` | Additional parameters | | `notes` | `Optional[str]` | Notes | @@ -476,6 +476,7 @@ Laser module with a specific wavelength (may be a sub-component of a larger asse | Field | Type | Title (Description) | |-------|------|-------------| +| `manufacturer` | [Organization](../aind_data_schema_models/organizations.md#organization) | Manufacturer | | `wavelength` | `int` | Wavelength (nm) | | `wavelength_unit` | [SizeUnit](../aind_data_schema_models/units.md#sizeunit) | Wavelength unit | | `coupling` | Optional[[Coupling](../aind_data_schema_models/devices.md#coupling)] | Coupling | @@ -483,7 +484,6 @@ Laser module with a specific wavelength (may be a sub-component of a larger asse | `coupling_efficiency_unit` | `"percent"` | Coupling efficiency unit | | `name` | `str` | Device name | | `serial_number` | `Optional[str]` | Serial number | -| `manufacturer` | Optional[[Organization](../aind_data_schema_models/organizations.md#organization)] | Manufacturer | | `model` | `Optional[str]` | Model | | `additional_settings` | `Optional[dict]` | Additional parameters | | `notes` | `Optional[str]` | Notes | @@ -508,9 +508,9 @@ Lens | Field | Type | Title (Description) | |-------|------|-------------| +| `manufacturer` | [Organization](../aind_data_schema_models/organizations.md#organization) | Manufacturer | | `name` | `str` | Device name | | `serial_number` | `Optional[str]` | Serial number | -| `manufacturer` | Optional[[Organization](../aind_data_schema_models/organizations.md#organization)] | Manufacturer | | `model` | `Optional[str]` | Model | | `additional_settings` | `Optional[dict]` | Additional parameters | | `notes` | `Optional[str]` | Notes | @@ -582,9 +582,9 @@ Manipulator used on a dome module | Field | Type | Title (Description) | |-------|------|-------------| +| `manufacturer` | [Organization](../aind_data_schema_models/organizations.md#organization) | Manufacturer | | `name` | `str` | Device name | | `serial_number` | `Optional[str]` | Serial number | -| `manufacturer` | Optional[[Organization](../aind_data_schema_models/organizations.md#organization)] | Manufacturer | | `model` | `Optional[str]` | Model | | `additional_settings` | `Optional[dict]` | Additional parameters | | `notes` | `Optional[str]` | Notes | @@ -732,6 +732,7 @@ Description of an olfactometer for odor stimuli | Field | Type | Title (Description) | |-------|------|-------------| +| `manufacturer` | [Organization](../aind_data_schema_models/organizations.md#organization) | Manufacturer | | `harp_device_type` | [HarpDeviceType](../aind_data_schema_models/harp_types.md#harpdevicetype) | Type of Harp device | | `channels` | List[[OlfactometerChannel](#olfactometerchannel)] | | | `core_version` | `Optional[str]` | Core version | @@ -742,7 +743,6 @@ Description of an olfactometer for odor stimuli | `hardware_version` | `Optional[str]` | Hardware version | | `name` | `str` | Device name | | `serial_number` | `Optional[str]` | Serial number | -| `manufacturer` | Optional[[Organization](../aind_data_schema_models/organizations.md#organization)] | Manufacturer | | `model` | `Optional[str]` | Model | | `additional_settings` | `Optional[dict]` | Additional parameters | | `notes` | `Optional[str]` | Notes | @@ -888,9 +888,9 @@ Description of a speaker for auditory stimuli | Field | Type | Title (Description) | |-------|------|-------------| +| `manufacturer` | [Organization](../aind_data_schema_models/organizations.md#organization) | Manufacturer | | `name` | `str` | Device name | | `serial_number` | `Optional[str]` | Serial number | -| `manufacturer` | Optional[[Organization](../aind_data_schema_models/organizations.md#organization)] | Manufacturer | | `model` | `Optional[str]` | Model | | `additional_settings` | `Optional[dict]` | Additional parameters | | `notes` | `Optional[str]` | Notes | From 9434cc5dfa8fb618790a54666436bb649c64df8b Mon Sep 17 00:00:00 2001 From: Dan Birman Date: Wed, 20 May 2026 10:11:34 -0700 Subject: [PATCH 7/9] fix: LED manufacturer got lost --- src/aind_data_schema/components/devices.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/aind_data_schema/components/devices.py b/src/aind_data_schema/components/devices.py index 670048387..238db997b 100644 --- a/src/aind_data_schema/components/devices.py +++ b/src/aind_data_schema/components/devices.py @@ -368,6 +368,7 @@ class Laser(Device): class LightEmittingDiode(Device): """Description of a Light Emitting Diode (LED) device""" + manufacturer: Organization.ONE_OF = Field(..., title="Manufacturer") wavelength: int = Field(..., title="Wavelength (nm)") wavelength_unit: SizeUnit = Field(default=SizeUnit.NM, title="Wavelength unit") bandwidth: Optional[int] = Field(default=None, title="Bandwidth (FWHM)") From 42447be3d380332c62e7888c85b4a0f9eed5c33b Mon Sep 17 00:00:00 2001 From: Dan Birman Date: Wed, 20 May 2026 10:12:06 -0700 Subject: [PATCH 8/9] fix: one more --- src/aind_data_schema/components/devices.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/aind_data_schema/components/devices.py b/src/aind_data_schema/components/devices.py index 238db997b..fcbda70da 100644 --- a/src/aind_data_schema/components/devices.py +++ b/src/aind_data_schema/components/devices.py @@ -599,6 +599,7 @@ class Arena(Device): class Monitor(Device, DevicePosition): """Description of visual display for visual stimuli""" + manufacturer: Organization.ONE_OF = Field(..., title="Manufacturer") refresh_rate: int = Field(..., title="Refresh rate (Hz)", ge=60) width: int = Field(..., title="Width (pixels)") height: int = Field(..., title="Height (pixels)") From 3fef548fa192d2d352adc9cb12659ddb7cf8d356 Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 20 May 2026 17:13:34 +0000 Subject: [PATCH 9/9] update docs --- docs/source/components/devices.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/source/components/devices.md b/docs/source/components/devices.md index 2f3e6522e..6e2b5f4b5 100644 --- a/docs/source/components/devices.md +++ b/docs/source/components/devices.md @@ -564,13 +564,13 @@ Description of a Light Emitting Diode (LED) device | Field | Type | Title (Description) | |-------|------|-------------| +| `manufacturer` | [Organization](../aind_data_schema_models/organizations.md#organization) | Manufacturer | | `wavelength` | `int` | Wavelength (nm) | | `wavelength_unit` | [SizeUnit](../aind_data_schema_models/units.md#sizeunit) | Wavelength unit | | `bandwidth` | `Optional[int]` | Bandwidth (FWHM) | | `bandwidth_unit` | Optional[[SizeUnit](../aind_data_schema_models/units.md#sizeunit)] | Bandwidth unit | | `name` | `str` | Device name | | `serial_number` | `Optional[str]` | Serial number | -| `manufacturer` | Optional[[Organization](../aind_data_schema_models/organizations.md#organization)] | Manufacturer | | `model` | `Optional[str]` | Model | | `additional_settings` | `Optional[dict]` | Additional parameters | | `notes` | `Optional[str]` | Notes | @@ -610,6 +610,7 @@ Description of visual display for visual stimuli | Field | Type | Title (Description) | |-------|------|-------------| +| `manufacturer` | [Organization](../aind_data_schema_models/organizations.md#organization) | Manufacturer | | `refresh_rate` | `int` | Refresh rate (Hz) | | `width` | `int` | Width (pixels) | | `height` | `int` | Height (pixels) | @@ -622,7 +623,6 @@ Description of visual display for visual stimuli | `brightness_unit` | Optional[[UnitlessUnit](../aind_data_schema_models/units.md#unitlessunit)] | Brightness unit | | `name` | `str` | Device name | | `serial_number` | `Optional[str]` | Serial number | -| `manufacturer` | Optional[[Organization](../aind_data_schema_models/organizations.md#organization)] | Manufacturer | | `model` | `Optional[str]` | Model | | `additional_settings` | `Optional[dict]` | Additional parameters | | `notes` | `Optional[str]` | Notes |