|
12 | 12 | from aind_data_schema.coordinates import RelativePosition |
13 | 13 | from aind_data_schema.manufacturers import Manufacturer |
14 | 14 | from aind_data_schema.procedures import Reagent |
15 | | -from aind_data_schema.utils.units import FrequencyUnit, PowerUnit, SizeUnit, TemperatureUnit |
| 15 | +from aind_data_schema.utils.units import FrequencyUnit, PowerUnit, SizeUnit, SpeedUnit, TemperatureUnit, UnitlessUnit |
16 | 16 |
|
17 | 17 |
|
18 | 18 | class DeviceDriver(Enum): |
@@ -245,13 +245,21 @@ class Immersion(Enum): |
245 | 245 | OTHER = "other" |
246 | 246 |
|
247 | 247 |
|
| 248 | +class ObjectiveType(Enum): |
| 249 | + """Objective type for Slap2""" |
| 250 | + |
| 251 | + REMOTE = "Remote" |
| 252 | + PRIMARY = "Primary" |
| 253 | + |
| 254 | + |
248 | 255 | class Objective(Device): |
249 | 256 | """Description of an objective device""" |
250 | 257 |
|
251 | 258 | device_type: Literal["Objective"] = Field("Objective", const=True, readOnly=True) |
252 | 259 | numerical_aperture: Decimal = Field(..., title="Numerical aperture (in air)") |
253 | 260 | magnification: Decimal = Field(..., title="Magnification") |
254 | 261 | immersion: Immersion = Field(..., title="Immersion") |
| 262 | + objective_type: Optional[ObjectiveType] = Field(None, title="Objective type") |
255 | 263 |
|
256 | 264 |
|
257 | 265 | class CameraTarget(Enum): |
@@ -560,6 +568,45 @@ class Patch(Device): |
560 | 568 | photobleaching_date: Optional[date] = Field(None, title="Photobleaching date") |
561 | 569 |
|
562 | 570 |
|
| 571 | +class DigitalMicromirrorDevice(Device): |
| 572 | + """Description of a Digital Micromirror Device (DMD)""" |
| 573 | + |
| 574 | + device_type: Literal["Digital Micromirror Device"] = Field("Digital Micromirror Device", const=True, readOnly=True) |
| 575 | + max_dmd_patterns: int = Field(..., title="Max DMD patterns") |
| 576 | + double_bounce_design: bool = Field(..., title="Double bounce design") |
| 577 | + invert_pixel_values: bool = Field(..., title="Invert pixel values") |
| 578 | + motion_padding_x: int = Field(..., title="Motion padding X (pixels)") |
| 579 | + motion_padding_y: int = Field(..., title="Motion padding Y (pixels)") |
| 580 | + padding_unit: SizeUnit = Field(SizeUnit.PX, title="Padding unit") |
| 581 | + pixel_size: Decimal = Field(..., title="DMD Pixel size") |
| 582 | + pixel_size_unit: SizeUnit = Field(SizeUnit.UM, title="Pixel size unit") |
| 583 | + start_phase: Decimal = Field(..., title="DMD Start phase (fraction of cycle)") |
| 584 | + dmd_flip: bool = Field(..., title="DMD Flip") |
| 585 | + dmd_curtain: List[Decimal] = Field(..., title="DMD Curtain") |
| 586 | + dmd_curtain_unit: SizeUnit = Field(SizeUnit.PX, title="dmd_curtain_unit") |
| 587 | + line_shear: List[int] = Field(..., title="Line shear (pixels)") |
| 588 | + line_shear_units: SizeUnit = Field(SizeUnit.PX, title="Line shear units") |
| 589 | + |
| 590 | + |
| 591 | +class PolygonalScanner(Device): |
| 592 | + """Description of a Polygonal scanner""" |
| 593 | + |
| 594 | + device_type: Literal["Polygonal Scanner"] = Field("Polygonal Scanner", const=True, readOnly=True) |
| 595 | + speed: int = Field(..., title="Speed (rpm)") |
| 596 | + speed_unit: SpeedUnit = Field(SpeedUnit.RPM, title="Speed unit") |
| 597 | + number_faces: int = Field(..., title="Number of faces") |
| 598 | + |
| 599 | + |
| 600 | +class PockelsCell(Device): |
| 601 | + """Description of a Pockels Cell""" |
| 602 | + |
| 603 | + device_type: Literal["Pockels Cell"] = Field("Pockels Cell", const=True, readOnly=True) |
| 604 | + polygonal_scanner: str = Field(..., title="Polygonal scanner", description="Must match name of Polygonal scanner") |
| 605 | + on_time: Decimal = Field(..., title="On time (fraction of cycle)") |
| 606 | + off_time: Decimal = Field(..., title="Off time (fraction of cycle)") |
| 607 | + time_setting_unit: UnitlessUnit = Field(UnitlessUnit.FC, title="time setting unit") |
| 608 | + |
| 609 | + |
563 | 610 | class MousePlatform(Device): |
564 | 611 | """Description of a mouse platform""" |
565 | 612 |
|
|
0 commit comments