Skip to content

Commit cf8788f

Browse files
committed
Merge branch 'dev' into 1794-isi-instrumentjson
2 parents b368f9f + 2d1edf8 commit cf8788f

15 files changed

Lines changed: 59 additions & 56 deletions

docs/source/acquisition.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,6 @@ while the StimulusEpoch represents all stimuli being presented.
8383
| `acquisition_start_tz` | `int or pydantic_extra_types.timezone_name.TimeZoneName or NoneType` | Acquisition start timezone (Automatically populated by a validator based on acquisition_start_time. Will be a TimeZoneName (IANA name) when the datetime uses a ZoneInfo timezone, or an integer UTC offset in hours for fixed-offset timezones. Use ZoneInfo (from the zoneinfo standard library) to preserve the named timezone.) |
8484
| `acquisition_end_time` | `datetime (timezone-aware)` | Acquisition end time |
8585
| `experimenters` | `List[str]` | experimenter(s) |
86-
| `protocol_id` | `Optional[List[str]]` | Protocol ID (DOI for protocols.io) |
8786
| `ethics_review_id` | `Optional[List[str]]` | Ethics review ID |
8887
| `instrument_id` | `Optional[str]` | Instrument ID (Should match the Instrument.instrument_id. Required when instrument metadata is available.) |
8988
| `acquisition_type` | `str` | Acquisition type (Descriptive string detailing the type of acquisition, should be consistent across similar acquisitions for the same experiment.) |
@@ -95,6 +94,7 @@ while the StimulusEpoch represents all stimuli being presented.
9594
| `stimulus_epochs` | List[[StimulusEpoch](acquisition.md#stimulusepoch)] | Stimulus (A stimulus epoch captures all stimuli being presented during an acquisition. Epochs should be split when the purpose of the stimulus changes.) |
9695
| `manipulations` | List[[Manipulation](acquisition.md#manipulation)] | Manipulations (Procedures performed during the acquisition.) |
9796
| `subject_details` | Optional[[AcquisitionSubjectDetails](acquisition.md#acquisitionsubjectdetails)] | Subject details (Required for in vivo acquisitions.) |
97+
| `protocol_id` | `Optional[List[str]]` | Protocol ID (DOI for protocols.io) |
9898

9999

100100
## Model definitions
@@ -151,9 +151,10 @@ Description of procedures performed during an acquisition.
151151
|-------|------|-------------|
152152
| `start_time` | `datetime (timezone-aware)` | Manipulation start time (Must be between the acquisition start and end times) |
153153
| `end_time` | `datetime (timezone-aware)` | Manipulation end time (Must be between the acquisition start and end times) |
154-
| `procedures` | Optional[List[[Injection](components/injection_procedures.md#injection) or [BrainInjection](components/surgery_procedures.md#braininjection)]] | Procedures (Procedures performed during the manipulation) |
154+
| `procedures` | Optional[List[[Injection](components/injection_procedures.md#injection) or [BrainInjection](components/surgery_procedures.md#braininjection) or [Reagent](components/reagent.md#reagent)]] | Procedures (Procedures performed during the manipulation) |
155155
| `anaesthesia` | Optional[[Anaesthetic](components/surgery_procedures.md#anaesthetic)] | Anaesthesia |
156156
| `notes` | `Optional[str]` | Notes |
157+
| `protocol_id` | `Optional[List[str]]` | Protocol ID (DOI for protocols.io) |
157158

158159

159160
### PerformanceMetrics

docs/source/components/injection_procedures.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ Description of an injection procedure
1212
| `targeted_structure` | Optional[[MouseAnatomyModel](../aind_data_schema_models/external.md#mouseanatomymodel)] | Injection target (Use InjectionTargets) |
1313
| `relative_position` | Optional[List[[AnatomicalRelative](../aind_data_schema_models/coordinates.md#anatomicalrelative)]] | Relative position |
1414
| `dynamics` | List[[InjectionDynamics](#injectiondynamics)] | Injection dynamics (List of injection events, one per location/depth) |
15-
| <del>`protocol_id`</del> | `Optional[str]` | **[DEPRECATED]** Use protocol_id in Surgery or NonSurgicalInjection instead. Protocol ID (DOI for protocols.io) |
15+
| `protocol_id` | `Optional[str]` | Protocol ID (DOI for protocols.io) |
1616

1717

1818
### InjectionDynamics

docs/source/components/measurements.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ Generic calibration class
1010
|-------|------|-------------|
1111
| `calibration_date` | `datetime (timezone-aware)` | Date and time of calibration |
1212
| `description` | `str` | Description (Brief description of what is being calibrated) |
13-
| `protocol_id` | `Optional[str]` | Protocol ID (DOI for protocols.io) |
1413
| `measured_at` | `Optional[str]` | Measurement location |
1514
| `input` | `List[float or str]` | Inputs (Calibration input) |
1615
| `input_unit` | [SizeUnit](../aind_data_schema_models/units.md#sizeunit) or [MassUnit](../aind_data_schema_models/units.md#massunit) or [FrequencyUnit](../aind_data_schema_models/units.md#frequencyunit) or [SpeedUnit](../aind_data_schema_models/units.md#speedunit) or [VolumeUnit](../aind_data_schema_models/units.md#volumeunit) or [AngleUnit](../aind_data_schema_models/units.md#angleunit) or [TimeUnit](../aind_data_schema_models/units.md#timeunit) or [PowerUnit](../aind_data_schema_models/units.md#powerunit) or [CurrentUnit](../aind_data_schema_models/units.md#currentunit) or [ConcentrationUnit](../aind_data_schema_models/units.md#concentrationunit) or [TemperatureUnit](../aind_data_schema_models/units.md#temperatureunit) or [SoundIntensityUnit](../aind_data_schema_models/units.md#soundintensityunit) or [VoltageUnit](../aind_data_schema_models/units.md#voltageunit) or [MemoryUnit](../aind_data_schema_models/units.md#memoryunit) or [UnitlessUnit](../aind_data_schema_models/units.md#unitlessunit) or [MagneticFieldUnit](../aind_data_schema_models/units.md#magneticfieldunit) or [PressureUnit](../aind_data_schema_models/units.md#pressureunit) or {TorqueUnit} | Input unit |
@@ -19,6 +18,7 @@ Generic calibration class
1918
| `output_unit` | [SizeUnit](../aind_data_schema_models/units.md#sizeunit) or [MassUnit](../aind_data_schema_models/units.md#massunit) or [FrequencyUnit](../aind_data_schema_models/units.md#frequencyunit) or [SpeedUnit](../aind_data_schema_models/units.md#speedunit) or [VolumeUnit](../aind_data_schema_models/units.md#volumeunit) or [AngleUnit](../aind_data_schema_models/units.md#angleunit) or [TimeUnit](../aind_data_schema_models/units.md#timeunit) or [PowerUnit](../aind_data_schema_models/units.md#powerunit) or [CurrentUnit](../aind_data_schema_models/units.md#currentunit) or [ConcentrationUnit](../aind_data_schema_models/units.md#concentrationunit) or [TemperatureUnit](../aind_data_schema_models/units.md#temperatureunit) or [SoundIntensityUnit](../aind_data_schema_models/units.md#soundintensityunit) or [VoltageUnit](../aind_data_schema_models/units.md#voltageunit) or [MemoryUnit](../aind_data_schema_models/units.md#memoryunit) or [UnitlessUnit](../aind_data_schema_models/units.md#unitlessunit) or [MagneticFieldUnit](../aind_data_schema_models/units.md#magneticfieldunit) or [PressureUnit](../aind_data_schema_models/units.md#pressureunit) or {TorqueUnit} | Output unit |
2019
| `fit` | Optional[[CalibrationFit](#calibrationfit)] | Fit (Fit equation for the calibration data used during data acquisition) |
2120
| `notes` | `Optional[str]` | Notes |
21+
| `protocol_id` | `Optional[str]` | Protocol ID (DOI for protocols.io) |
2222
| `device_name` | `str` | Device name (Must match a device defined in the instrument.json) |
2323

2424

@@ -51,9 +51,9 @@ Generic maintenance class
5151
|-------|------|-------------|
5252
| `maintenance_date` | `datetime (timezone-aware)` | Date and time of maintenance |
5353
| `description` | `str` | Description (Description on maintenance procedure) |
54-
| `protocol_id` | `Optional[str]` | Protocol ID |
5554
| `reagents` | Optional[List[[Reagent](reagent.md#reagent)]] | Reagents |
5655
| `notes` | `Optional[str]` | Notes |
56+
| `protocol_id` | `Optional[str]` | Protocol ID (DOI for protocols.io) |
5757
| `device_name` | `str` | Device name (Must match a device defined in the instrument.json) |
5858

5959

@@ -69,11 +69,11 @@ Calibration of a device that outputs power based on input strength
6969
| `output_unit` | [PowerUnit](../aind_data_schema_models/units.md#powerunit) | Output unit |
7070
| `description` | `"Power measured for various power or percentage input strengths"` | |
7171
| `calibration_date` | `datetime (timezone-aware)` | Date and time of calibration |
72-
| `protocol_id` | `Optional[str]` | Protocol ID (DOI for protocols.io) |
7372
| `measured_at` | `Optional[str]` | Measurement location |
7473
| `repeats` | `Optional[int]` | Number of repeats (If each input was repeated multiple times, provide the number of repeats) |
7574
| `fit` | Optional[[CalibrationFit](#calibrationfit)] | Fit (Fit equation for the calibration data used during data acquisition) |
7675
| `notes` | `Optional[str]` | Notes |
76+
| `protocol_id` | `Optional[str]` | Protocol ID (DOI for protocols.io) |
7777
| `device_name` | `str` | Device name (Must match a device defined in the instrument.json) |
7878

7979

@@ -90,10 +90,10 @@ Calibration of a liquid delivery device based on solenoid/valve opening times
9090
| `output_unit` | [VolumeUnit](../aind_data_schema_models/units.md#volumeunit) | Output unit |
9191
| `description` | `"Volume measured for various solenoid opening times"` | |
9292
| `calibration_date` | `datetime (timezone-aware)` | Date and time of calibration |
93-
| `protocol_id` | `Optional[str]` | Protocol ID (DOI for protocols.io) |
9493
| `measured_at` | `Optional[str]` | Measurement location |
9594
| `fit` | Optional[[CalibrationFit](#calibrationfit)] | Fit (Fit equation for the calibration data used during data acquisition) |
9695
| `notes` | `Optional[str]` | Notes |
96+
| `protocol_id` | `Optional[str]` | Protocol ID (DOI for protocols.io) |
9797
| `device_name` | `str` | Device name (Must match a device defined in the instrument.json) |
9898

9999

docs/source/components/specimen_procedures.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,9 +106,9 @@ Description of surgical or other procedure performed on a specimen
106106
| `start_date` | `datetime.date` | Start date |
107107
| `end_date` | `datetime.date` | End date |
108108
| `experimenters` | `List[str]` | experimenter(s) |
109-
| `protocol_id` | `Optional[List[str]]` | Protocol ID (DOI for protocols.io) |
110109
| `protocol_parameters` | `Optional[Dict[str, str]]` | Protocol parameters (Parameters defined in the protocol and their value during this procedure) |
111110
| `procedure_details` | List[[HCRSeries](#hcrseries) or [FluorescentStain](reagent.md#fluorescentstain) or [Sectioning](#sectioning) or [PlanarSectioning](#planarsectioning) or [ProbeReagent](reagent.md#probereagent) or [Reagent](reagent.md#reagent) or [GeneProbeSet](reagent.md#geneprobeset) or [Solution](reagent.md#solution)] | Procedure details (Details of the procedures, including reagents and sectioning information.) |
112111
| `notes` | `Optional[str]` | Notes |
112+
| `protocol_id` | `Optional[List[str]]` | Protocol ID (DOI for protocols.io) |
113113

114114

docs/source/components/subject_procedures.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@ Description of a non-surgical procedure performed on a subject
1111
| `start_date` | `datetime.date` | Start date |
1212
| `experimenters` | `Optional[List[str]]` | experimenter(s) |
1313
| `ethics_review_id` | `str` | Ethics review ID |
14-
| `protocol_id` | `Optional[str]` | Protocol ID (DOI for protocols.io) |
1514
| `description` | `str` | Description |
1615
| `notes` | `Optional[str]` | Notes |
16+
| `protocol_id` | `Optional[str]` | Protocol ID (DOI for protocols.io) |
1717

1818

1919
### NonSurgicalInjection
@@ -36,7 +36,6 @@ Description of subject procedures performed at one time
3636

3737
| Field | Type | Title (Description) |
3838
|-------|------|-------------|
39-
| `protocol_id` | `Optional[str]` | Protocol ID (DOI for protocols.io) |
4039
| `start_date` | `datetime.date` | Start date |
4140
| `experimenters` | `Optional[List[str]]` | experimenter(s) |
4241
| `ethics_review_id` | `Optional[str]` | Ethics review ID |
@@ -49,6 +48,7 @@ Description of subject procedures performed at one time
4948
| `measured_coordinates` | Optional[Dict[[Origin](../aind_data_schema_models/coordinates.md#origin), [Translation](coordinates.md#translation)]] | Measured coordinates (Coordinates measured during the procedure, for example Bregma and Lambda) |
5049
| `procedures` | List[[CatheterImplant](surgery_procedures.md#catheterimplant) or [Craniotomy](surgery_procedures.md#craniotomy) or [ProbeImplant](surgery_procedures.md#probeimplant) or [Headframe](surgery_procedures.md#headframe) or [BrainInjection](surgery_procedures.md#braininjection) or [Injection](injection_procedures.md#injection) or [MyomatrixInsertion](surgery_procedures.md#myomatrixinsertion) or [GenericSurgeryProcedure](surgery_procedures.md#genericsurgeryprocedure) or [Perfusion](surgery_procedures.md#perfusion) or [SampleCollection](surgery_procedures.md#samplecollection)] | Procedures |
5150
| `notes` | `Optional[str]` | Notes |
51+
| `protocol_id` | `Optional[str]` | Protocol ID (DOI for protocols.io) |
5252

5353

5454
### TrainingProtocol

docs/source/components/surgery_procedures.md

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ Description of an injection procedure into a brain
2626
| `injection_materials` | List[[ViralMaterial](injection_procedures.md#viralmaterial) or [NonViralMaterial](injection_procedures.md#nonviralmaterial)] | Injection material |
2727
| `relative_position` | Optional[List[[AnatomicalRelative](../aind_data_schema_models/coordinates.md#anatomicalrelative)]] | Relative position |
2828
| `dynamics` | List[[InjectionDynamics](injection_procedures.md#injectiondynamics)] | Injection dynamics (List of injection events, one per location/depth) |
29-
| <del>`protocol_id`</del> | `Optional[str]` | **[DEPRECATED]** Use protocol_id in Surgery or NonSurgicalInjection instead. Protocol ID (DOI for protocols.io) |
29+
| `protocol_id` | `Optional[str]` | Protocol ID (DOI for protocols.io) |
3030

3131

3232
### CatheterImplant
@@ -46,7 +46,6 @@ Description of craniotomy procedure
4646

4747
| Field | Type | Title (Description) |
4848
|-------|------|-------------|
49-
| `protocol_id` | `Optional[str]` | Protocol ID (DOI for protocols.io) |
5049
| `craniotomy_type` | [CraniotomyType](#craniotomytype) | Craniotomy type |
5150
| `coordinate_system_name` | `Optional[str]` | Coordinate system name |
5251
| `position` | [Translation](coordinates.md#translation) or List[[AnatomicalRelative](../aind_data_schema_models/coordinates.md#anatomicalrelative)] or NoneType | Craniotomy position |
@@ -55,6 +54,7 @@ Description of craniotomy procedure
5554
| `protective_material` | Optional[[ProtectiveMaterial](#protectivematerial)] | Protective material |
5655
| `implant_part_number` | `Optional[str]` | Implant part number |
5756
| `dura_removed` | `Optional[bool]` | Dura removed |
57+
| `protocol_id` | `Optional[str]` | Protocol ID (DOI for protocols.io) |
5858

5959

6060
### CraniotomyType
@@ -76,9 +76,9 @@ Description of a surgery procedure performed on a subject
7676

7777
| Field | Type | Title (Description) |
7878
|-------|------|-------------|
79-
| `protocol_id` | `Optional[str]` | Protocol ID (DOI for protocols.io) |
8079
| `description` | `str` | Description |
8180
| `notes` | `Optional[str]` | Notes |
81+
| `protocol_id` | `Optional[str]` | Protocol ID (DOI for protocols.io) |
8282

8383

8484
### GroundWireImplant
@@ -110,12 +110,12 @@ Description of headframe procedure
110110

111111
| Field | Type | Title (Description) |
112112
|-------|------|-------------|
113-
| `protocol_id` | `Optional[str]` | Protocol ID (DOI for protocols.io) |
114113
| `headframe_type` | `str` | Headframe type |
115114
| `headframe_part_number` | `Optional[str]` | Headframe part number |
116115
| `headframe_material` | Optional[[HeadframeMaterial](#headframematerial)] | Headframe material |
117116
| `well_part_number` | `Optional[str]` | Well part number |
118117
| `well_type` | `Optional[str]` | Well type |
118+
| `protocol_id` | `Optional[str]` | Protocol ID (DOI for protocols.io) |
119119

120120

121121
### HeadframeMaterial
@@ -135,9 +135,9 @@ Description of a Myomatrix array insertion for EMG
135135

136136
| Field | Type | Title (Description) |
137137
|-------|------|-------------|
138-
| `protocol_id` | `Optional[str]` | Protocol ID (DOI for protocols.io) |
139138
| `ground_electrode` | [GroundWireImplant](#groundwireimplant) | Ground electrode |
140139
| `implanted_device` | [MyomatrixArray](devices.md#myomatrixarray) | Implanted device |
140+
| `protocol_id` | `Optional[str]` | Protocol ID (DOI for protocols.io) |
141141

142142

143143
### Perfusion
@@ -146,8 +146,8 @@ Description of a perfusion procedure that creates a specimen
146146

147147
| Field | Type | Title (Description) |
148148
|-------|------|-------------|
149-
| `protocol_id` | `Optional[str]` | Protocol ID (DOI for protocols.io) |
150149
| `output_specimen_ids` | `List[str]` | Specimen ID (IDs of specimens resulting from this procedure. Whole brains can use the {subject_id}, partial sections should always include a suffix {subject_id}_###) |
150+
| `protocol_id` | `Optional[str]` | Protocol ID (DOI for protocols.io) |
151151

152152

153153
### ProbeImplant
@@ -156,9 +156,9 @@ Description of a probe (fiber, ephys) implant procedure
156156

157157
| Field | Type | Title (Description) |
158158
|-------|------|-------------|
159-
| `protocol_id` | `Optional[str]` | Protocol ID (DOI for protocols.io) |
160159
| `implanted_device` | [EphysProbe](devices.md#ephysprobe) or [FiberProbe](devices.md#fiberprobe) | Implanted device |
161160
| `device_config` | [ProbeConfig](configs.md#probeconfig) | Device configuration |
161+
| `protocol_id` | `Optional[str]` | Protocol ID (DOI for protocols.io) |
162162

163163

164164
### ProtectiveMaterial

src/aind_data_schema/base.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,11 @@ def default_filename(cls):
201201
"""
202202
Returns standard filename in snakecase
203203
"""
204-
parent_classes = [base_class for base_class in cls.__bases__ if base_class.__name__ != DataCoreModel.__name__]
204+
parent_classes = [
205+
base_class
206+
for base_class in cls.__bases__
207+
if base_class.__name__ != DataCoreModel.__name__ and issubclass(base_class, DataModel)
208+
]
205209

206210
name = cls.__name__
207211

src/aind_data_schema/components/identifiers.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from typing import Dict, List, Optional
66

77
from aind_data_schema_models.registries import Registry
8-
from pydantic import Field, model_validator
8+
from pydantic import Field, BaseModel, model_validator
99
import warnings
1010

1111
from typing import Annotated
@@ -53,6 +53,18 @@ class Person(DataModel):
5353
registry_identifier: Optional[str] = Field(default=None, title="ORCID ID")
5454

5555

56+
class ProtocolMixin(BaseModel):
57+
"""Mixin that adds a protocol_id field (single DOI string)"""
58+
59+
protocol_id: Optional[str] = Field(default=None, title="Protocol ID", description="DOI for protocols.io")
60+
61+
62+
class ProtocolListMixin(BaseModel):
63+
"""Mixin that adds a protocol_id field (list of DOI strings)"""
64+
65+
protocol_id: Optional[List[str]] = Field(default=None, title="Protocol ID", description="DOI for protocols.io")
66+
67+
5668
class Software(DataModel):
5769
"""Software package identifier"""
5870

src/aind_data_schema/components/injection_procedures.py

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
from pydantic import Field, model_validator
1212

1313
from aind_data_schema.base import DataModel, DiscriminatedList
14+
from aind_data_schema.components.identifiers import ProtocolMixin
1415
from aind_data_schema.components.reagent import Reagent
1516

1617

@@ -102,7 +103,7 @@ def check_volume_or_current(self):
102103
return self
103104

104105

105-
class Injection(DataModel):
106+
class Injection(ProtocolMixin, DataModel):
106107
"""Description of an injection procedure"""
107108

108109
injection_materials: DiscriminatedList[ViralMaterial | NonViralMaterial] = Field(
@@ -116,9 +117,3 @@ class Injection(DataModel):
116117
dynamics: List[InjectionDynamics] = Field(
117118
..., title="Injection dynamics", description="List of injection events, one per location/depth"
118119
)
119-
protocol_id: Optional[str] = Field(
120-
default=None,
121-
title="Protocol ID",
122-
description="DOI for protocols.io",
123-
deprecated="Use protocol_id in Surgery or NonSurgicalInjection instead",
124-
)

0 commit comments

Comments
 (0)