opentrons 8.6.0a1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of opentrons might be problematic. Click here for more details.
- opentrons/__init__.py +150 -0
- opentrons/_version.py +34 -0
- opentrons/calibration_storage/__init__.py +54 -0
- opentrons/calibration_storage/deck_configuration.py +62 -0
- opentrons/calibration_storage/encoder_decoder.py +31 -0
- opentrons/calibration_storage/file_operators.py +142 -0
- opentrons/calibration_storage/helpers.py +103 -0
- opentrons/calibration_storage/ot2/__init__.py +34 -0
- opentrons/calibration_storage/ot2/deck_attitude.py +85 -0
- opentrons/calibration_storage/ot2/mark_bad_calibration.py +27 -0
- opentrons/calibration_storage/ot2/models/__init__.py +0 -0
- opentrons/calibration_storage/ot2/models/v1.py +149 -0
- opentrons/calibration_storage/ot2/pipette_offset.py +129 -0
- opentrons/calibration_storage/ot2/tip_length.py +281 -0
- opentrons/calibration_storage/ot3/__init__.py +31 -0
- opentrons/calibration_storage/ot3/deck_attitude.py +83 -0
- opentrons/calibration_storage/ot3/gripper_offset.py +156 -0
- opentrons/calibration_storage/ot3/models/__init__.py +0 -0
- opentrons/calibration_storage/ot3/models/v1.py +122 -0
- opentrons/calibration_storage/ot3/module_offset.py +138 -0
- opentrons/calibration_storage/ot3/pipette_offset.py +95 -0
- opentrons/calibration_storage/types.py +45 -0
- opentrons/cli/__init__.py +21 -0
- opentrons/cli/__main__.py +5 -0
- opentrons/cli/analyze.py +501 -0
- opentrons/config/__init__.py +631 -0
- opentrons/config/advanced_settings.py +871 -0
- opentrons/config/defaults_ot2.py +214 -0
- opentrons/config/defaults_ot3.py +499 -0
- opentrons/config/feature_flags.py +86 -0
- opentrons/config/gripper_config.py +55 -0
- opentrons/config/reset.py +203 -0
- opentrons/config/robot_configs.py +187 -0
- opentrons/config/types.py +183 -0
- opentrons/drivers/__init__.py +0 -0
- opentrons/drivers/absorbance_reader/__init__.py +11 -0
- opentrons/drivers/absorbance_reader/abstract.py +72 -0
- opentrons/drivers/absorbance_reader/async_byonoy.py +352 -0
- opentrons/drivers/absorbance_reader/driver.py +81 -0
- opentrons/drivers/absorbance_reader/hid_protocol.py +161 -0
- opentrons/drivers/absorbance_reader/simulator.py +84 -0
- opentrons/drivers/asyncio/__init__.py +0 -0
- opentrons/drivers/asyncio/communication/__init__.py +22 -0
- opentrons/drivers/asyncio/communication/async_serial.py +183 -0
- opentrons/drivers/asyncio/communication/errors.py +88 -0
- opentrons/drivers/asyncio/communication/serial_connection.py +552 -0
- opentrons/drivers/command_builder.py +102 -0
- opentrons/drivers/flex_stacker/__init__.py +13 -0
- opentrons/drivers/flex_stacker/abstract.py +214 -0
- opentrons/drivers/flex_stacker/driver.py +768 -0
- opentrons/drivers/flex_stacker/errors.py +68 -0
- opentrons/drivers/flex_stacker/simulator.py +309 -0
- opentrons/drivers/flex_stacker/types.py +367 -0
- opentrons/drivers/flex_stacker/utils.py +19 -0
- opentrons/drivers/heater_shaker/__init__.py +5 -0
- opentrons/drivers/heater_shaker/abstract.py +76 -0
- opentrons/drivers/heater_shaker/driver.py +204 -0
- opentrons/drivers/heater_shaker/simulator.py +94 -0
- opentrons/drivers/mag_deck/__init__.py +6 -0
- opentrons/drivers/mag_deck/abstract.py +44 -0
- opentrons/drivers/mag_deck/driver.py +208 -0
- opentrons/drivers/mag_deck/simulator.py +63 -0
- opentrons/drivers/rpi_drivers/__init__.py +33 -0
- opentrons/drivers/rpi_drivers/dev_types.py +94 -0
- opentrons/drivers/rpi_drivers/gpio.py +282 -0
- opentrons/drivers/rpi_drivers/gpio_simulator.py +127 -0
- opentrons/drivers/rpi_drivers/interfaces.py +15 -0
- opentrons/drivers/rpi_drivers/types.py +364 -0
- opentrons/drivers/rpi_drivers/usb.py +102 -0
- opentrons/drivers/rpi_drivers/usb_simulator.py +22 -0
- opentrons/drivers/serial_communication.py +151 -0
- opentrons/drivers/smoothie_drivers/__init__.py +4 -0
- opentrons/drivers/smoothie_drivers/connection.py +51 -0
- opentrons/drivers/smoothie_drivers/constants.py +121 -0
- opentrons/drivers/smoothie_drivers/driver_3_0.py +1933 -0
- opentrons/drivers/smoothie_drivers/errors.py +49 -0
- opentrons/drivers/smoothie_drivers/parse_utils.py +143 -0
- opentrons/drivers/smoothie_drivers/simulator.py +99 -0
- opentrons/drivers/smoothie_drivers/types.py +16 -0
- opentrons/drivers/temp_deck/__init__.py +10 -0
- opentrons/drivers/temp_deck/abstract.py +54 -0
- opentrons/drivers/temp_deck/driver.py +197 -0
- opentrons/drivers/temp_deck/simulator.py +57 -0
- opentrons/drivers/thermocycler/__init__.py +12 -0
- opentrons/drivers/thermocycler/abstract.py +99 -0
- opentrons/drivers/thermocycler/driver.py +395 -0
- opentrons/drivers/thermocycler/simulator.py +126 -0
- opentrons/drivers/types.py +107 -0
- opentrons/drivers/utils.py +222 -0
- opentrons/execute.py +742 -0
- opentrons/hardware_control/__init__.py +65 -0
- opentrons/hardware_control/__main__.py +77 -0
- opentrons/hardware_control/adapters.py +98 -0
- opentrons/hardware_control/api.py +1347 -0
- opentrons/hardware_control/backends/__init__.py +7 -0
- opentrons/hardware_control/backends/controller.py +400 -0
- opentrons/hardware_control/backends/errors.py +9 -0
- opentrons/hardware_control/backends/estop_state.py +164 -0
- opentrons/hardware_control/backends/flex_protocol.py +497 -0
- opentrons/hardware_control/backends/ot3controller.py +1930 -0
- opentrons/hardware_control/backends/ot3simulator.py +900 -0
- opentrons/hardware_control/backends/ot3utils.py +664 -0
- opentrons/hardware_control/backends/simulator.py +442 -0
- opentrons/hardware_control/backends/status_bar_state.py +240 -0
- opentrons/hardware_control/backends/subsystem_manager.py +431 -0
- opentrons/hardware_control/backends/tip_presence_manager.py +173 -0
- opentrons/hardware_control/backends/types.py +14 -0
- opentrons/hardware_control/constants.py +6 -0
- opentrons/hardware_control/dev_types.py +125 -0
- opentrons/hardware_control/emulation/__init__.py +0 -0
- opentrons/hardware_control/emulation/abstract_emulator.py +21 -0
- opentrons/hardware_control/emulation/app.py +56 -0
- opentrons/hardware_control/emulation/connection_handler.py +38 -0
- opentrons/hardware_control/emulation/heater_shaker.py +150 -0
- opentrons/hardware_control/emulation/magdeck.py +60 -0
- opentrons/hardware_control/emulation/module_server/__init__.py +8 -0
- opentrons/hardware_control/emulation/module_server/client.py +78 -0
- opentrons/hardware_control/emulation/module_server/helpers.py +130 -0
- opentrons/hardware_control/emulation/module_server/models.py +31 -0
- opentrons/hardware_control/emulation/module_server/server.py +110 -0
- opentrons/hardware_control/emulation/parser.py +74 -0
- opentrons/hardware_control/emulation/proxy.py +241 -0
- opentrons/hardware_control/emulation/run_emulator.py +68 -0
- opentrons/hardware_control/emulation/scripts/__init__.py +0 -0
- opentrons/hardware_control/emulation/scripts/run_app.py +54 -0
- opentrons/hardware_control/emulation/scripts/run_module_emulator.py +72 -0
- opentrons/hardware_control/emulation/scripts/run_smoothie.py +37 -0
- opentrons/hardware_control/emulation/settings.py +119 -0
- opentrons/hardware_control/emulation/simulations.py +133 -0
- opentrons/hardware_control/emulation/smoothie.py +192 -0
- opentrons/hardware_control/emulation/tempdeck.py +69 -0
- opentrons/hardware_control/emulation/thermocycler.py +128 -0
- opentrons/hardware_control/emulation/types.py +10 -0
- opentrons/hardware_control/emulation/util.py +38 -0
- opentrons/hardware_control/errors.py +43 -0
- opentrons/hardware_control/execution_manager.py +164 -0
- opentrons/hardware_control/instruments/__init__.py +5 -0
- opentrons/hardware_control/instruments/instrument_abc.py +39 -0
- opentrons/hardware_control/instruments/ot2/__init__.py +0 -0
- opentrons/hardware_control/instruments/ot2/instrument_calibration.py +152 -0
- opentrons/hardware_control/instruments/ot2/pipette.py +777 -0
- opentrons/hardware_control/instruments/ot2/pipette_handler.py +995 -0
- opentrons/hardware_control/instruments/ot3/__init__.py +0 -0
- opentrons/hardware_control/instruments/ot3/gripper.py +420 -0
- opentrons/hardware_control/instruments/ot3/gripper_handler.py +173 -0
- opentrons/hardware_control/instruments/ot3/instrument_calibration.py +214 -0
- opentrons/hardware_control/instruments/ot3/pipette.py +858 -0
- opentrons/hardware_control/instruments/ot3/pipette_handler.py +1030 -0
- opentrons/hardware_control/module_control.py +332 -0
- opentrons/hardware_control/modules/__init__.py +69 -0
- opentrons/hardware_control/modules/absorbance_reader.py +373 -0
- opentrons/hardware_control/modules/errors.py +7 -0
- opentrons/hardware_control/modules/flex_stacker.py +948 -0
- opentrons/hardware_control/modules/heater_shaker.py +426 -0
- opentrons/hardware_control/modules/lid_temp_status.py +35 -0
- opentrons/hardware_control/modules/magdeck.py +233 -0
- opentrons/hardware_control/modules/mod_abc.py +245 -0
- opentrons/hardware_control/modules/module_calibration.py +93 -0
- opentrons/hardware_control/modules/plate_temp_status.py +61 -0
- opentrons/hardware_control/modules/tempdeck.py +299 -0
- opentrons/hardware_control/modules/thermocycler.py +731 -0
- opentrons/hardware_control/modules/types.py +417 -0
- opentrons/hardware_control/modules/update.py +255 -0
- opentrons/hardware_control/modules/utils.py +73 -0
- opentrons/hardware_control/motion_utilities.py +318 -0
- opentrons/hardware_control/nozzle_manager.py +422 -0
- opentrons/hardware_control/ot3_calibration.py +1171 -0
- opentrons/hardware_control/ot3api.py +3227 -0
- opentrons/hardware_control/pause_manager.py +31 -0
- opentrons/hardware_control/poller.py +112 -0
- opentrons/hardware_control/protocols/__init__.py +106 -0
- opentrons/hardware_control/protocols/asyncio_configurable.py +11 -0
- opentrons/hardware_control/protocols/calibratable.py +45 -0
- opentrons/hardware_control/protocols/chassis_accessory_manager.py +90 -0
- opentrons/hardware_control/protocols/configurable.py +48 -0
- opentrons/hardware_control/protocols/event_sourcer.py +18 -0
- opentrons/hardware_control/protocols/execution_controllable.py +33 -0
- opentrons/hardware_control/protocols/flex_calibratable.py +96 -0
- opentrons/hardware_control/protocols/flex_instrument_configurer.py +52 -0
- opentrons/hardware_control/protocols/gripper_controller.py +55 -0
- opentrons/hardware_control/protocols/hardware_manager.py +51 -0
- opentrons/hardware_control/protocols/identifiable.py +16 -0
- opentrons/hardware_control/protocols/instrument_configurer.py +206 -0
- opentrons/hardware_control/protocols/liquid_handler.py +266 -0
- opentrons/hardware_control/protocols/module_provider.py +16 -0
- opentrons/hardware_control/protocols/motion_controller.py +243 -0
- opentrons/hardware_control/protocols/position_estimator.py +45 -0
- opentrons/hardware_control/protocols/simulatable.py +10 -0
- opentrons/hardware_control/protocols/stoppable.py +9 -0
- opentrons/hardware_control/protocols/types.py +27 -0
- opentrons/hardware_control/robot_calibration.py +224 -0
- opentrons/hardware_control/scripts/README.md +28 -0
- opentrons/hardware_control/scripts/__init__.py +1 -0
- opentrons/hardware_control/scripts/gripper_control.py +208 -0
- opentrons/hardware_control/scripts/ot3gripper +7 -0
- opentrons/hardware_control/scripts/ot3repl +7 -0
- opentrons/hardware_control/scripts/repl.py +187 -0
- opentrons/hardware_control/scripts/tc_control.py +97 -0
- opentrons/hardware_control/simulator_setup.py +260 -0
- opentrons/hardware_control/thread_manager.py +431 -0
- opentrons/hardware_control/threaded_async_lock.py +97 -0
- opentrons/hardware_control/types.py +792 -0
- opentrons/hardware_control/util.py +234 -0
- opentrons/legacy_broker.py +53 -0
- opentrons/legacy_commands/__init__.py +1 -0
- opentrons/legacy_commands/commands.py +483 -0
- opentrons/legacy_commands/helpers.py +153 -0
- opentrons/legacy_commands/module_commands.py +215 -0
- opentrons/legacy_commands/protocol_commands.py +54 -0
- opentrons/legacy_commands/publisher.py +155 -0
- opentrons/legacy_commands/robot_commands.py +51 -0
- opentrons/legacy_commands/types.py +1115 -0
- opentrons/motion_planning/__init__.py +32 -0
- opentrons/motion_planning/adjacent_slots_getters.py +168 -0
- opentrons/motion_planning/deck_conflict.py +396 -0
- opentrons/motion_planning/errors.py +35 -0
- opentrons/motion_planning/types.py +42 -0
- opentrons/motion_planning/waypoints.py +218 -0
- opentrons/ordered_set.py +138 -0
- opentrons/protocol_api/__init__.py +105 -0
- opentrons/protocol_api/_liquid.py +157 -0
- opentrons/protocol_api/_liquid_properties.py +814 -0
- opentrons/protocol_api/_nozzle_layout.py +31 -0
- opentrons/protocol_api/_parameter_context.py +300 -0
- opentrons/protocol_api/_parameters.py +31 -0
- opentrons/protocol_api/_transfer_liquid_validation.py +108 -0
- opentrons/protocol_api/_types.py +43 -0
- opentrons/protocol_api/config.py +23 -0
- opentrons/protocol_api/core/__init__.py +23 -0
- opentrons/protocol_api/core/common.py +33 -0
- opentrons/protocol_api/core/core_map.py +74 -0
- opentrons/protocol_api/core/engine/__init__.py +22 -0
- opentrons/protocol_api/core/engine/_default_labware_versions.py +179 -0
- opentrons/protocol_api/core/engine/deck_conflict.py +348 -0
- opentrons/protocol_api/core/engine/exceptions.py +19 -0
- opentrons/protocol_api/core/engine/instrument.py +2391 -0
- opentrons/protocol_api/core/engine/labware.py +238 -0
- opentrons/protocol_api/core/engine/load_labware_params.py +73 -0
- opentrons/protocol_api/core/engine/module_core.py +1025 -0
- opentrons/protocol_api/core/engine/overlap_versions.py +20 -0
- opentrons/protocol_api/core/engine/pipette_movement_conflict.py +358 -0
- opentrons/protocol_api/core/engine/point_calculations.py +64 -0
- opentrons/protocol_api/core/engine/protocol.py +1153 -0
- opentrons/protocol_api/core/engine/robot.py +139 -0
- opentrons/protocol_api/core/engine/stringify.py +74 -0
- opentrons/protocol_api/core/engine/transfer_components_executor.py +990 -0
- opentrons/protocol_api/core/engine/well.py +241 -0
- opentrons/protocol_api/core/instrument.py +459 -0
- opentrons/protocol_api/core/labware.py +151 -0
- opentrons/protocol_api/core/legacy/__init__.py +11 -0
- opentrons/protocol_api/core/legacy/_labware_geometry.py +37 -0
- opentrons/protocol_api/core/legacy/deck.py +369 -0
- opentrons/protocol_api/core/legacy/labware_offset_provider.py +108 -0
- opentrons/protocol_api/core/legacy/legacy_instrument_core.py +709 -0
- opentrons/protocol_api/core/legacy/legacy_labware_core.py +235 -0
- opentrons/protocol_api/core/legacy/legacy_module_core.py +592 -0
- opentrons/protocol_api/core/legacy/legacy_protocol_core.py +612 -0
- opentrons/protocol_api/core/legacy/legacy_well_core.py +162 -0
- opentrons/protocol_api/core/legacy/load_info.py +67 -0
- opentrons/protocol_api/core/legacy/module_geometry.py +547 -0
- opentrons/protocol_api/core/legacy/well_geometry.py +148 -0
- opentrons/protocol_api/core/legacy_simulator/__init__.py +16 -0
- opentrons/protocol_api/core/legacy_simulator/legacy_instrument_core.py +624 -0
- opentrons/protocol_api/core/legacy_simulator/legacy_protocol_core.py +85 -0
- opentrons/protocol_api/core/module.py +484 -0
- opentrons/protocol_api/core/protocol.py +311 -0
- opentrons/protocol_api/core/robot.py +51 -0
- opentrons/protocol_api/core/well.py +116 -0
- opentrons/protocol_api/core/well_grid.py +45 -0
- opentrons/protocol_api/create_protocol_context.py +177 -0
- opentrons/protocol_api/deck.py +223 -0
- opentrons/protocol_api/disposal_locations.py +244 -0
- opentrons/protocol_api/instrument_context.py +3212 -0
- opentrons/protocol_api/labware.py +1579 -0
- opentrons/protocol_api/module_contexts.py +1425 -0
- opentrons/protocol_api/module_validation_and_errors.py +61 -0
- opentrons/protocol_api/protocol_context.py +1688 -0
- opentrons/protocol_api/robot_context.py +303 -0
- opentrons/protocol_api/validation.py +761 -0
- opentrons/protocol_engine/__init__.py +155 -0
- opentrons/protocol_engine/actions/__init__.py +65 -0
- opentrons/protocol_engine/actions/action_dispatcher.py +30 -0
- opentrons/protocol_engine/actions/action_handler.py +13 -0
- opentrons/protocol_engine/actions/actions.py +302 -0
- opentrons/protocol_engine/actions/get_state_update.py +38 -0
- opentrons/protocol_engine/clients/__init__.py +5 -0
- opentrons/protocol_engine/clients/sync_client.py +174 -0
- opentrons/protocol_engine/clients/transports.py +197 -0
- opentrons/protocol_engine/commands/__init__.py +757 -0
- opentrons/protocol_engine/commands/absorbance_reader/__init__.py +61 -0
- opentrons/protocol_engine/commands/absorbance_reader/close_lid.py +154 -0
- opentrons/protocol_engine/commands/absorbance_reader/common.py +6 -0
- opentrons/protocol_engine/commands/absorbance_reader/initialize.py +151 -0
- opentrons/protocol_engine/commands/absorbance_reader/open_lid.py +154 -0
- opentrons/protocol_engine/commands/absorbance_reader/read.py +226 -0
- opentrons/protocol_engine/commands/air_gap_in_place.py +162 -0
- opentrons/protocol_engine/commands/aspirate.py +244 -0
- opentrons/protocol_engine/commands/aspirate_in_place.py +184 -0
- opentrons/protocol_engine/commands/aspirate_while_tracking.py +211 -0
- opentrons/protocol_engine/commands/blow_out.py +146 -0
- opentrons/protocol_engine/commands/blow_out_in_place.py +119 -0
- opentrons/protocol_engine/commands/calibration/__init__.py +60 -0
- opentrons/protocol_engine/commands/calibration/calibrate_gripper.py +166 -0
- opentrons/protocol_engine/commands/calibration/calibrate_module.py +117 -0
- opentrons/protocol_engine/commands/calibration/calibrate_pipette.py +96 -0
- opentrons/protocol_engine/commands/calibration/move_to_maintenance_position.py +156 -0
- opentrons/protocol_engine/commands/command.py +308 -0
- opentrons/protocol_engine/commands/command_unions.py +974 -0
- opentrons/protocol_engine/commands/comment.py +57 -0
- opentrons/protocol_engine/commands/configure_for_volume.py +108 -0
- opentrons/protocol_engine/commands/configure_nozzle_layout.py +115 -0
- opentrons/protocol_engine/commands/custom.py +67 -0
- opentrons/protocol_engine/commands/dispense.py +194 -0
- opentrons/protocol_engine/commands/dispense_in_place.py +179 -0
- opentrons/protocol_engine/commands/dispense_while_tracking.py +204 -0
- opentrons/protocol_engine/commands/drop_tip.py +232 -0
- opentrons/protocol_engine/commands/drop_tip_in_place.py +205 -0
- opentrons/protocol_engine/commands/flex_stacker/__init__.py +64 -0
- opentrons/protocol_engine/commands/flex_stacker/common.py +900 -0
- opentrons/protocol_engine/commands/flex_stacker/empty.py +293 -0
- opentrons/protocol_engine/commands/flex_stacker/fill.py +281 -0
- opentrons/protocol_engine/commands/flex_stacker/retrieve.py +339 -0
- opentrons/protocol_engine/commands/flex_stacker/set_stored_labware.py +328 -0
- opentrons/protocol_engine/commands/flex_stacker/store.py +326 -0
- opentrons/protocol_engine/commands/generate_command_schema.py +61 -0
- opentrons/protocol_engine/commands/get_next_tip.py +134 -0
- opentrons/protocol_engine/commands/get_tip_presence.py +87 -0
- opentrons/protocol_engine/commands/hash_command_params.py +38 -0
- opentrons/protocol_engine/commands/heater_shaker/__init__.py +102 -0
- opentrons/protocol_engine/commands/heater_shaker/close_labware_latch.py +83 -0
- opentrons/protocol_engine/commands/heater_shaker/deactivate_heater.py +82 -0
- opentrons/protocol_engine/commands/heater_shaker/deactivate_shaker.py +84 -0
- opentrons/protocol_engine/commands/heater_shaker/open_labware_latch.py +110 -0
- opentrons/protocol_engine/commands/heater_shaker/set_and_wait_for_shake_speed.py +125 -0
- opentrons/protocol_engine/commands/heater_shaker/set_target_temperature.py +90 -0
- opentrons/protocol_engine/commands/heater_shaker/wait_for_temperature.py +102 -0
- opentrons/protocol_engine/commands/home.py +100 -0
- opentrons/protocol_engine/commands/identify_module.py +86 -0
- opentrons/protocol_engine/commands/labware_handling_common.py +29 -0
- opentrons/protocol_engine/commands/liquid_probe.py +464 -0
- opentrons/protocol_engine/commands/load_labware.py +210 -0
- opentrons/protocol_engine/commands/load_lid.py +154 -0
- opentrons/protocol_engine/commands/load_lid_stack.py +272 -0
- opentrons/protocol_engine/commands/load_liquid.py +95 -0
- opentrons/protocol_engine/commands/load_liquid_class.py +144 -0
- opentrons/protocol_engine/commands/load_module.py +223 -0
- opentrons/protocol_engine/commands/load_pipette.py +167 -0
- opentrons/protocol_engine/commands/magnetic_module/__init__.py +32 -0
- opentrons/protocol_engine/commands/magnetic_module/disengage.py +97 -0
- opentrons/protocol_engine/commands/magnetic_module/engage.py +119 -0
- opentrons/protocol_engine/commands/move_labware.py +546 -0
- opentrons/protocol_engine/commands/move_relative.py +102 -0
- opentrons/protocol_engine/commands/move_to_addressable_area.py +176 -0
- opentrons/protocol_engine/commands/move_to_addressable_area_for_drop_tip.py +198 -0
- opentrons/protocol_engine/commands/move_to_coordinates.py +107 -0
- opentrons/protocol_engine/commands/move_to_well.py +119 -0
- opentrons/protocol_engine/commands/movement_common.py +338 -0
- opentrons/protocol_engine/commands/pick_up_tip.py +241 -0
- opentrons/protocol_engine/commands/pipetting_common.py +443 -0
- opentrons/protocol_engine/commands/prepare_to_aspirate.py +121 -0
- opentrons/protocol_engine/commands/pressure_dispense.py +155 -0
- opentrons/protocol_engine/commands/reload_labware.py +90 -0
- opentrons/protocol_engine/commands/retract_axis.py +75 -0
- opentrons/protocol_engine/commands/robot/__init__.py +70 -0
- opentrons/protocol_engine/commands/robot/close_gripper_jaw.py +96 -0
- opentrons/protocol_engine/commands/robot/common.py +18 -0
- opentrons/protocol_engine/commands/robot/move_axes_relative.py +101 -0
- opentrons/protocol_engine/commands/robot/move_axes_to.py +100 -0
- opentrons/protocol_engine/commands/robot/move_to.py +94 -0
- opentrons/protocol_engine/commands/robot/open_gripper_jaw.py +86 -0
- opentrons/protocol_engine/commands/save_position.py +109 -0
- opentrons/protocol_engine/commands/seal_pipette_to_tip.py +353 -0
- opentrons/protocol_engine/commands/set_rail_lights.py +67 -0
- opentrons/protocol_engine/commands/set_status_bar.py +89 -0
- opentrons/protocol_engine/commands/temperature_module/__init__.py +46 -0
- opentrons/protocol_engine/commands/temperature_module/deactivate.py +86 -0
- opentrons/protocol_engine/commands/temperature_module/set_target_temperature.py +97 -0
- opentrons/protocol_engine/commands/temperature_module/wait_for_temperature.py +104 -0
- opentrons/protocol_engine/commands/thermocycler/__init__.py +152 -0
- opentrons/protocol_engine/commands/thermocycler/close_lid.py +87 -0
- opentrons/protocol_engine/commands/thermocycler/deactivate_block.py +80 -0
- opentrons/protocol_engine/commands/thermocycler/deactivate_lid.py +80 -0
- opentrons/protocol_engine/commands/thermocycler/open_lid.py +87 -0
- opentrons/protocol_engine/commands/thermocycler/run_extended_profile.py +171 -0
- opentrons/protocol_engine/commands/thermocycler/run_profile.py +124 -0
- opentrons/protocol_engine/commands/thermocycler/set_target_block_temperature.py +140 -0
- opentrons/protocol_engine/commands/thermocycler/set_target_lid_temperature.py +100 -0
- opentrons/protocol_engine/commands/thermocycler/wait_for_block_temperature.py +93 -0
- opentrons/protocol_engine/commands/thermocycler/wait_for_lid_temperature.py +89 -0
- opentrons/protocol_engine/commands/touch_tip.py +189 -0
- opentrons/protocol_engine/commands/unsafe/__init__.py +161 -0
- opentrons/protocol_engine/commands/unsafe/unsafe_blow_out_in_place.py +100 -0
- opentrons/protocol_engine/commands/unsafe/unsafe_drop_tip_in_place.py +121 -0
- opentrons/protocol_engine/commands/unsafe/unsafe_engage_axes.py +82 -0
- opentrons/protocol_engine/commands/unsafe/unsafe_place_labware.py +208 -0
- opentrons/protocol_engine/commands/unsafe/unsafe_stacker_close_latch.py +94 -0
- opentrons/protocol_engine/commands/unsafe/unsafe_stacker_manual_retrieve.py +295 -0
- opentrons/protocol_engine/commands/unsafe/unsafe_stacker_open_latch.py +91 -0
- opentrons/protocol_engine/commands/unsafe/unsafe_stacker_prepare_shuttle.py +136 -0
- opentrons/protocol_engine/commands/unsafe/unsafe_ungrip_labware.py +77 -0
- opentrons/protocol_engine/commands/unsafe/update_position_estimators.py +90 -0
- opentrons/protocol_engine/commands/unseal_pipette_from_tip.py +153 -0
- opentrons/protocol_engine/commands/verify_tip_presence.py +100 -0
- opentrons/protocol_engine/commands/wait_for_duration.py +76 -0
- opentrons/protocol_engine/commands/wait_for_resume.py +75 -0
- opentrons/protocol_engine/create_protocol_engine.py +193 -0
- opentrons/protocol_engine/engine_support.py +28 -0
- opentrons/protocol_engine/error_recovery_policy.py +81 -0
- opentrons/protocol_engine/errors/__init__.py +191 -0
- opentrons/protocol_engine/errors/error_occurrence.py +182 -0
- opentrons/protocol_engine/errors/exceptions.py +1308 -0
- opentrons/protocol_engine/execution/__init__.py +50 -0
- opentrons/protocol_engine/execution/command_executor.py +216 -0
- opentrons/protocol_engine/execution/create_queue_worker.py +102 -0
- opentrons/protocol_engine/execution/door_watcher.py +119 -0
- opentrons/protocol_engine/execution/equipment.py +819 -0
- opentrons/protocol_engine/execution/error_recovery_hardware_state_synchronizer.py +101 -0
- opentrons/protocol_engine/execution/gantry_mover.py +686 -0
- opentrons/protocol_engine/execution/hardware_stopper.py +147 -0
- opentrons/protocol_engine/execution/heater_shaker_movement_flagger.py +207 -0
- opentrons/protocol_engine/execution/labware_movement.py +297 -0
- opentrons/protocol_engine/execution/movement.py +349 -0
- opentrons/protocol_engine/execution/pipetting.py +607 -0
- opentrons/protocol_engine/execution/queue_worker.py +86 -0
- opentrons/protocol_engine/execution/rail_lights.py +25 -0
- opentrons/protocol_engine/execution/run_control.py +33 -0
- opentrons/protocol_engine/execution/status_bar.py +34 -0
- opentrons/protocol_engine/execution/thermocycler_movement_flagger.py +188 -0
- opentrons/protocol_engine/execution/thermocycler_plate_lifter.py +81 -0
- opentrons/protocol_engine/execution/tip_handler.py +550 -0
- opentrons/protocol_engine/labware_offset_standardization.py +194 -0
- opentrons/protocol_engine/notes/__init__.py +17 -0
- opentrons/protocol_engine/notes/notes.py +59 -0
- opentrons/protocol_engine/plugins.py +104 -0
- opentrons/protocol_engine/protocol_engine.py +683 -0
- opentrons/protocol_engine/resources/__init__.py +26 -0
- opentrons/protocol_engine/resources/deck_configuration_provider.py +232 -0
- opentrons/protocol_engine/resources/deck_data_provider.py +94 -0
- opentrons/protocol_engine/resources/file_provider.py +161 -0
- opentrons/protocol_engine/resources/fixture_validation.py +58 -0
- opentrons/protocol_engine/resources/labware_data_provider.py +106 -0
- opentrons/protocol_engine/resources/labware_validation.py +73 -0
- opentrons/protocol_engine/resources/model_utils.py +32 -0
- opentrons/protocol_engine/resources/module_data_provider.py +44 -0
- opentrons/protocol_engine/resources/ot3_validation.py +21 -0
- opentrons/protocol_engine/resources/pipette_data_provider.py +379 -0
- opentrons/protocol_engine/slot_standardization.py +128 -0
- opentrons/protocol_engine/state/__init__.py +1 -0
- opentrons/protocol_engine/state/_abstract_store.py +27 -0
- opentrons/protocol_engine/state/_axis_aligned_bounding_box.py +50 -0
- opentrons/protocol_engine/state/_labware_origin_math.py +636 -0
- opentrons/protocol_engine/state/_move_types.py +83 -0
- opentrons/protocol_engine/state/_well_math.py +193 -0
- opentrons/protocol_engine/state/addressable_areas.py +699 -0
- opentrons/protocol_engine/state/command_history.py +309 -0
- opentrons/protocol_engine/state/commands.py +1158 -0
- opentrons/protocol_engine/state/config.py +39 -0
- opentrons/protocol_engine/state/files.py +57 -0
- opentrons/protocol_engine/state/fluid_stack.py +138 -0
- opentrons/protocol_engine/state/geometry.py +2359 -0
- opentrons/protocol_engine/state/inner_well_math_utils.py +548 -0
- opentrons/protocol_engine/state/labware.py +1459 -0
- opentrons/protocol_engine/state/liquid_classes.py +82 -0
- opentrons/protocol_engine/state/liquids.py +73 -0
- opentrons/protocol_engine/state/module_substates/__init__.py +45 -0
- opentrons/protocol_engine/state/module_substates/absorbance_reader_substate.py +35 -0
- opentrons/protocol_engine/state/module_substates/flex_stacker_substate.py +112 -0
- opentrons/protocol_engine/state/module_substates/heater_shaker_module_substate.py +115 -0
- opentrons/protocol_engine/state/module_substates/magnetic_block_substate.py +17 -0
- opentrons/protocol_engine/state/module_substates/magnetic_module_substate.py +65 -0
- opentrons/protocol_engine/state/module_substates/temperature_module_substate.py +67 -0
- opentrons/protocol_engine/state/module_substates/thermocycler_module_substate.py +163 -0
- opentrons/protocol_engine/state/modules.py +1500 -0
- opentrons/protocol_engine/state/motion.py +373 -0
- opentrons/protocol_engine/state/pipettes.py +905 -0
- opentrons/protocol_engine/state/state.py +421 -0
- opentrons/protocol_engine/state/state_summary.py +36 -0
- opentrons/protocol_engine/state/tips.py +420 -0
- opentrons/protocol_engine/state/update_types.py +904 -0
- opentrons/protocol_engine/state/wells.py +290 -0
- opentrons/protocol_engine/types/__init__.py +308 -0
- opentrons/protocol_engine/types/automatic_tip_selection.py +39 -0
- opentrons/protocol_engine/types/command_annotations.py +53 -0
- opentrons/protocol_engine/types/deck_configuration.py +81 -0
- opentrons/protocol_engine/types/execution.py +96 -0
- opentrons/protocol_engine/types/hardware_passthrough.py +25 -0
- opentrons/protocol_engine/types/instrument.py +47 -0
- opentrons/protocol_engine/types/instrument_sensors.py +47 -0
- opentrons/protocol_engine/types/labware.py +131 -0
- opentrons/protocol_engine/types/labware_movement.py +22 -0
- opentrons/protocol_engine/types/labware_offset_location.py +111 -0
- opentrons/protocol_engine/types/labware_offset_vector.py +16 -0
- opentrons/protocol_engine/types/liquid.py +40 -0
- opentrons/protocol_engine/types/liquid_class.py +59 -0
- opentrons/protocol_engine/types/liquid_handling.py +13 -0
- opentrons/protocol_engine/types/liquid_level_detection.py +191 -0
- opentrons/protocol_engine/types/location.py +194 -0
- opentrons/protocol_engine/types/module.py +303 -0
- opentrons/protocol_engine/types/partial_tip_configuration.py +76 -0
- opentrons/protocol_engine/types/run_time_parameters.py +133 -0
- opentrons/protocol_engine/types/tip.py +18 -0
- opentrons/protocol_engine/types/util.py +21 -0
- opentrons/protocol_engine/types/well_position.py +124 -0
- opentrons/protocol_reader/__init__.py +37 -0
- opentrons/protocol_reader/extract_labware_definitions.py +66 -0
- opentrons/protocol_reader/file_format_validator.py +152 -0
- opentrons/protocol_reader/file_hasher.py +27 -0
- opentrons/protocol_reader/file_identifier.py +284 -0
- opentrons/protocol_reader/file_reader_writer.py +90 -0
- opentrons/protocol_reader/input_file.py +16 -0
- opentrons/protocol_reader/protocol_files_invalid_error.py +6 -0
- opentrons/protocol_reader/protocol_reader.py +188 -0
- opentrons/protocol_reader/protocol_source.py +124 -0
- opentrons/protocol_reader/role_analyzer.py +86 -0
- opentrons/protocol_runner/__init__.py +26 -0
- opentrons/protocol_runner/create_simulating_orchestrator.py +118 -0
- opentrons/protocol_runner/json_file_reader.py +55 -0
- opentrons/protocol_runner/json_translator.py +314 -0
- opentrons/protocol_runner/legacy_command_mapper.py +848 -0
- opentrons/protocol_runner/legacy_context_plugin.py +116 -0
- opentrons/protocol_runner/protocol_runner.py +530 -0
- opentrons/protocol_runner/python_protocol_wrappers.py +179 -0
- opentrons/protocol_runner/run_orchestrator.py +496 -0
- opentrons/protocol_runner/task_queue.py +95 -0
- opentrons/protocols/__init__.py +6 -0
- opentrons/protocols/advanced_control/__init__.py +0 -0
- opentrons/protocols/advanced_control/common.py +38 -0
- opentrons/protocols/advanced_control/mix.py +60 -0
- opentrons/protocols/advanced_control/transfers/__init__.py +0 -0
- opentrons/protocols/advanced_control/transfers/common.py +180 -0
- opentrons/protocols/advanced_control/transfers/transfer.py +972 -0
- opentrons/protocols/advanced_control/transfers/transfer_liquid_utils.py +231 -0
- opentrons/protocols/api_support/__init__.py +0 -0
- opentrons/protocols/api_support/constants.py +8 -0
- opentrons/protocols/api_support/deck_type.py +110 -0
- opentrons/protocols/api_support/definitions.py +18 -0
- opentrons/protocols/api_support/instrument.py +151 -0
- opentrons/protocols/api_support/labware_like.py +233 -0
- opentrons/protocols/api_support/tip_tracker.py +175 -0
- opentrons/protocols/api_support/types.py +32 -0
- opentrons/protocols/api_support/util.py +403 -0
- opentrons/protocols/bundle.py +89 -0
- opentrons/protocols/duration/__init__.py +4 -0
- opentrons/protocols/duration/errors.py +5 -0
- opentrons/protocols/duration/estimator.py +628 -0
- opentrons/protocols/execution/__init__.py +0 -0
- opentrons/protocols/execution/dev_types.py +181 -0
- opentrons/protocols/execution/errors.py +40 -0
- opentrons/protocols/execution/execute.py +84 -0
- opentrons/protocols/execution/execute_json_v3.py +275 -0
- opentrons/protocols/execution/execute_json_v4.py +359 -0
- opentrons/protocols/execution/execute_json_v5.py +28 -0
- opentrons/protocols/execution/execute_python.py +169 -0
- opentrons/protocols/execution/json_dispatchers.py +87 -0
- opentrons/protocols/execution/types.py +7 -0
- opentrons/protocols/geometry/__init__.py +0 -0
- opentrons/protocols/geometry/planning.py +297 -0
- opentrons/protocols/labware.py +312 -0
- opentrons/protocols/models/__init__.py +0 -0
- opentrons/protocols/models/json_protocol.py +679 -0
- opentrons/protocols/parameters/__init__.py +0 -0
- opentrons/protocols/parameters/csv_parameter_definition.py +77 -0
- opentrons/protocols/parameters/csv_parameter_interface.py +96 -0
- opentrons/protocols/parameters/exceptions.py +34 -0
- opentrons/protocols/parameters/parameter_definition.py +272 -0
- opentrons/protocols/parameters/types.py +17 -0
- opentrons/protocols/parameters/validation.py +267 -0
- opentrons/protocols/parse.py +671 -0
- opentrons/protocols/types.py +159 -0
- opentrons/py.typed +0 -0
- opentrons/resources/scripts/lpc21isp +0 -0
- opentrons/resources/smoothie-edge-8414642.hex +23010 -0
- opentrons/simulate.py +1065 -0
- opentrons/system/__init__.py +6 -0
- opentrons/system/camera.py +51 -0
- opentrons/system/log_control.py +59 -0
- opentrons/system/nmcli.py +856 -0
- opentrons/system/resin.py +24 -0
- opentrons/system/smoothie_update.py +15 -0
- opentrons/system/wifi.py +204 -0
- opentrons/tools/__init__.py +0 -0
- opentrons/tools/args_handler.py +22 -0
- opentrons/tools/write_pipette_memory.py +157 -0
- opentrons/types.py +618 -0
- opentrons/util/__init__.py +1 -0
- opentrons/util/async_helpers.py +166 -0
- opentrons/util/broker.py +84 -0
- opentrons/util/change_notifier.py +47 -0
- opentrons/util/entrypoint_util.py +278 -0
- opentrons/util/get_union_elements.py +26 -0
- opentrons/util/helpers.py +6 -0
- opentrons/util/linal.py +178 -0
- opentrons/util/logging_config.py +265 -0
- opentrons/util/logging_queue_handler.py +61 -0
- opentrons/util/performance_helpers.py +157 -0
- opentrons-8.6.0a1.dist-info/METADATA +37 -0
- opentrons-8.6.0a1.dist-info/RECORD +600 -0
- opentrons-8.6.0a1.dist-info/WHEEL +4 -0
- opentrons-8.6.0a1.dist-info/entry_points.txt +3 -0
- opentrons-8.6.0a1.dist-info/licenses/LICENSE +202 -0
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"""Protocol engine types to do with liquid handling."""
|
|
2
|
+
|
|
3
|
+
from dataclasses import dataclass
|
|
4
|
+
from typing import Dict
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
@dataclass
|
|
8
|
+
class FlowRates:
|
|
9
|
+
"""Default and current flow rates for a pipette."""
|
|
10
|
+
|
|
11
|
+
default_blow_out: Dict[str, float]
|
|
12
|
+
default_aspirate: Dict[str, float]
|
|
13
|
+
default_dispense: Dict[str, float]
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
"""Protocol Engine types to do with liquid level detection."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
from dataclasses import dataclass
|
|
5
|
+
from datetime import datetime
|
|
6
|
+
from typing import Optional, List, Any
|
|
7
|
+
from pydantic import BaseModel, model_serializer, model_validator
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class SimulatedProbeResult(BaseModel):
|
|
11
|
+
"""A sentinel value to substitute for the resulting volume/height of a liquid probe during simulation."""
|
|
12
|
+
|
|
13
|
+
operations_after_probe: List[float] = []
|
|
14
|
+
net_liquid_exchanged_after_probe: float = 0.0
|
|
15
|
+
|
|
16
|
+
@model_serializer
|
|
17
|
+
def serialize_model(self) -> str:
|
|
18
|
+
"""Serialize instances of this class as a string."""
|
|
19
|
+
return "SimulatedProbeResult"
|
|
20
|
+
|
|
21
|
+
@model_validator(mode="before")
|
|
22
|
+
@classmethod
|
|
23
|
+
def validate_model(cls, data: object) -> Any:
|
|
24
|
+
"""Handle deserializing from a simulated probe result."""
|
|
25
|
+
if isinstance(data, str) and data == "SimulatedProbeResult":
|
|
26
|
+
return {}
|
|
27
|
+
return data
|
|
28
|
+
|
|
29
|
+
def __add__(
|
|
30
|
+
self, other: float | int | SimulatedProbeResult
|
|
31
|
+
) -> float | SimulatedProbeResult:
|
|
32
|
+
"""Bypass addition and just return self."""
|
|
33
|
+
return self
|
|
34
|
+
|
|
35
|
+
def __sub__(
|
|
36
|
+
self, other: float | int | SimulatedProbeResult
|
|
37
|
+
) -> float | SimulatedProbeResult:
|
|
38
|
+
"""Bypass subtraction and just return self."""
|
|
39
|
+
return self
|
|
40
|
+
|
|
41
|
+
def __radd__(
|
|
42
|
+
self, other: float | int | SimulatedProbeResult
|
|
43
|
+
) -> float | SimulatedProbeResult:
|
|
44
|
+
"""Bypass addition and just return self."""
|
|
45
|
+
return self
|
|
46
|
+
|
|
47
|
+
def __rsub__(
|
|
48
|
+
self, other: float | int | SimulatedProbeResult
|
|
49
|
+
) -> float | SimulatedProbeResult:
|
|
50
|
+
"""Bypass subtraction and just return self."""
|
|
51
|
+
return self
|
|
52
|
+
|
|
53
|
+
def __mul__(
|
|
54
|
+
self, other: float | int | SimulatedProbeResult
|
|
55
|
+
) -> float | SimulatedProbeResult:
|
|
56
|
+
"""Bypass multiplication and just return self."""
|
|
57
|
+
return self
|
|
58
|
+
|
|
59
|
+
def __rmul__(
|
|
60
|
+
self, other: float | int | SimulatedProbeResult
|
|
61
|
+
) -> float | SimulatedProbeResult:
|
|
62
|
+
"""Bypass multiplication and just return self."""
|
|
63
|
+
return self
|
|
64
|
+
|
|
65
|
+
def __truediv__(
|
|
66
|
+
self, other: float | int | SimulatedProbeResult
|
|
67
|
+
) -> float | SimulatedProbeResult:
|
|
68
|
+
"""Bypass division and just return self."""
|
|
69
|
+
return self
|
|
70
|
+
|
|
71
|
+
def __rtruediv__(
|
|
72
|
+
self, other: float | int | SimulatedProbeResult
|
|
73
|
+
) -> float | SimulatedProbeResult:
|
|
74
|
+
"""Bypass division and just return self."""
|
|
75
|
+
return self
|
|
76
|
+
|
|
77
|
+
def __pow__(
|
|
78
|
+
self, other: float | int | SimulatedProbeResult
|
|
79
|
+
) -> float | SimulatedProbeResult:
|
|
80
|
+
"""Bypass exponent math and just return self."""
|
|
81
|
+
return self
|
|
82
|
+
|
|
83
|
+
def __rpow__(
|
|
84
|
+
self, other: float | int | SimulatedProbeResult
|
|
85
|
+
) -> float | SimulatedProbeResult:
|
|
86
|
+
"""Bypass exponent math and just return self."""
|
|
87
|
+
return self
|
|
88
|
+
|
|
89
|
+
def __mod__(
|
|
90
|
+
self, other: float | int | SimulatedProbeResult
|
|
91
|
+
) -> float | SimulatedProbeResult:
|
|
92
|
+
"""Bypass modulus and just return self."""
|
|
93
|
+
return self
|
|
94
|
+
|
|
95
|
+
def __rmod__(
|
|
96
|
+
self, other: float | int | SimulatedProbeResult
|
|
97
|
+
) -> float | SimulatedProbeResult:
|
|
98
|
+
"""Bypass modulus and just return self."""
|
|
99
|
+
return self
|
|
100
|
+
|
|
101
|
+
def __floordiv__(
|
|
102
|
+
self, other: float | int | SimulatedProbeResult
|
|
103
|
+
) -> float | SimulatedProbeResult:
|
|
104
|
+
"""Bypass floor division and just return self."""
|
|
105
|
+
return self
|
|
106
|
+
|
|
107
|
+
def __rfloordiv__(
|
|
108
|
+
self, other: float | int | SimulatedProbeResult
|
|
109
|
+
) -> float | SimulatedProbeResult:
|
|
110
|
+
"""Bypass floor division and just return self."""
|
|
111
|
+
return self
|
|
112
|
+
|
|
113
|
+
def __gt__(self, other: float | int | SimulatedProbeResult) -> bool:
|
|
114
|
+
"""Bypass 'greater than' and just return self."""
|
|
115
|
+
return True
|
|
116
|
+
|
|
117
|
+
def __lt__(self, other: float | int | SimulatedProbeResult) -> bool:
|
|
118
|
+
"""Bypass 'less than' and just return self."""
|
|
119
|
+
return False
|
|
120
|
+
|
|
121
|
+
def __ge__(self, other: float | int | SimulatedProbeResult) -> bool:
|
|
122
|
+
"""Bypass 'greater than or eaqual to' and just return self."""
|
|
123
|
+
return True
|
|
124
|
+
|
|
125
|
+
def __le__(self, other: float | int | SimulatedProbeResult) -> bool:
|
|
126
|
+
"""Bypass 'less than or equal to' and just return self."""
|
|
127
|
+
return False
|
|
128
|
+
|
|
129
|
+
def __eq__(self, other: object) -> bool:
|
|
130
|
+
"""A SimulatedProbeResult should only be equal to the same instance of its class."""
|
|
131
|
+
if not isinstance(other, SimulatedProbeResult):
|
|
132
|
+
return False
|
|
133
|
+
return self is other
|
|
134
|
+
|
|
135
|
+
def __neq__(self, other: object) -> bool:
|
|
136
|
+
"""A SimulatedProbeResult should only be equal to the same instance of its class."""
|
|
137
|
+
if not isinstance(other, SimulatedProbeResult):
|
|
138
|
+
return True
|
|
139
|
+
return self is not other
|
|
140
|
+
|
|
141
|
+
def simulate_probed_aspirate_dispense(self, volume: float) -> None:
|
|
142
|
+
"""Record the current state of aspirate/dispense calls."""
|
|
143
|
+
self.net_liquid_exchanged_after_probe += volume
|
|
144
|
+
self.operations_after_probe.append(volume)
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
# Work around https://github.com/pydantic/pydantic/issues/6830 - do not change the order of
|
|
148
|
+
# this union
|
|
149
|
+
LiquidTrackingType = float | SimulatedProbeResult
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
class LoadedVolumeInfo(BaseModel):
|
|
153
|
+
"""A well's liquid volume, initialized by a LoadLiquid, updated by Aspirate and Dispense."""
|
|
154
|
+
|
|
155
|
+
volume: LiquidTrackingType | None = None
|
|
156
|
+
last_loaded: datetime
|
|
157
|
+
operations_since_load: int
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
class ProbedHeightInfo(BaseModel):
|
|
161
|
+
"""A well's liquid height, initialized by a LiquidProbe, cleared by Aspirate and Dispense."""
|
|
162
|
+
|
|
163
|
+
height: LiquidTrackingType | None = None
|
|
164
|
+
last_probed: datetime
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
class ProbedVolumeInfo(BaseModel):
|
|
168
|
+
"""A well's liquid volume, initialized by a LiquidProbe, updated by Aspirate and Dispense."""
|
|
169
|
+
|
|
170
|
+
volume: LiquidTrackingType | None = None
|
|
171
|
+
last_probed: datetime
|
|
172
|
+
operations_since_probe: int
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
class WellInfoSummary(BaseModel):
|
|
176
|
+
"""Payload for a well's liquid info in StateSummary."""
|
|
177
|
+
|
|
178
|
+
labware_id: str
|
|
179
|
+
well_name: str
|
|
180
|
+
loaded_volume: Optional[float] = None
|
|
181
|
+
probed_height: LiquidTrackingType | None = None
|
|
182
|
+
probed_volume: LiquidTrackingType | None = None
|
|
183
|
+
|
|
184
|
+
|
|
185
|
+
@dataclass
|
|
186
|
+
class WellLiquidInfo:
|
|
187
|
+
"""Tracked and sensed information about liquid in a well."""
|
|
188
|
+
|
|
189
|
+
probed_height: Optional[ProbedHeightInfo]
|
|
190
|
+
loaded_volume: Optional[LoadedVolumeInfo]
|
|
191
|
+
probed_volume: Optional[ProbedVolumeInfo]
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
"""Protocol engine types to deal with locating things on the deck."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
from typing import Literal, Union, TypeGuard
|
|
5
|
+
|
|
6
|
+
from pydantic import BaseModel, Field
|
|
7
|
+
from pydantic.json_schema import SkipJsonSchema
|
|
8
|
+
|
|
9
|
+
from opentrons.types import DeckSlotName, StagingSlotName
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class DeckSlotLocation(BaseModel):
|
|
13
|
+
"""The location of something placed in a single deck slot."""
|
|
14
|
+
|
|
15
|
+
slotName: DeckSlotName = Field(
|
|
16
|
+
...,
|
|
17
|
+
description=(
|
|
18
|
+
# This description should be kept in sync with LegacyLabwareOffsetLocation.slotName.
|
|
19
|
+
"A slot on the robot's deck."
|
|
20
|
+
"\n\n"
|
|
21
|
+
'The plain numbers like `"5"` are for the OT-2,'
|
|
22
|
+
' and the coordinates like `"C2"` are for the Flex.'
|
|
23
|
+
"\n\n"
|
|
24
|
+
"When you provide one of these values, you can use either style."
|
|
25
|
+
" It will automatically be converted to match the robot."
|
|
26
|
+
"\n\n"
|
|
27
|
+
"When one of these values is returned, it will always match the robot."
|
|
28
|
+
),
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
class StagingSlotLocation(BaseModel):
|
|
33
|
+
"""The location of something placed in a single staging slot."""
|
|
34
|
+
|
|
35
|
+
slotName: StagingSlotName = Field(
|
|
36
|
+
...,
|
|
37
|
+
description=(
|
|
38
|
+
# This description should be kept in sync with LegacyLabwareOffsetLocation.slotName.
|
|
39
|
+
"A slot on the robot's staging area."
|
|
40
|
+
"\n\n"
|
|
41
|
+
"These apply only to the Flex. The OT-2 has no staging slots."
|
|
42
|
+
),
|
|
43
|
+
)
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
class AddressableAreaLocation(BaseModel):
|
|
47
|
+
"""The location of something place in an addressable area. This is a superset of deck slots."""
|
|
48
|
+
|
|
49
|
+
addressableAreaName: str = Field(
|
|
50
|
+
...,
|
|
51
|
+
description=(
|
|
52
|
+
"The name of the addressable area that you want to use."
|
|
53
|
+
" Valid values are the `id`s of `addressableArea`s in the"
|
|
54
|
+
" [deck definition](https://github.com/Opentrons/opentrons/tree/edge/shared-data/deck)."
|
|
55
|
+
),
|
|
56
|
+
)
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
class ModuleLocation(BaseModel):
|
|
60
|
+
"""The location of something placed atop a hardware module."""
|
|
61
|
+
|
|
62
|
+
moduleId: str = Field(
|
|
63
|
+
...,
|
|
64
|
+
description="The ID of a loaded module from a prior `loadModule` command.",
|
|
65
|
+
)
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
class OnLabwareLocation(BaseModel):
|
|
69
|
+
"""The location of something placed atop another labware."""
|
|
70
|
+
|
|
71
|
+
labwareId: str = Field(
|
|
72
|
+
...,
|
|
73
|
+
description="The ID of a loaded Labware from a prior `loadLabware` command.",
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
class InStackerHopperLocation(BaseModel):
|
|
78
|
+
"""The location of a labware in a stacker hopper."""
|
|
79
|
+
|
|
80
|
+
kind: Literal["inStackerHopper"] = "inStackerHopper"
|
|
81
|
+
moduleId: str = Field(
|
|
82
|
+
..., description="The ID of the stacker in which this labware is."
|
|
83
|
+
)
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
_OffDeckLocationType = Literal["offDeck"]
|
|
87
|
+
_SystemLocationType = Literal["systemLocation"]
|
|
88
|
+
OFF_DECK_LOCATION: _OffDeckLocationType = "offDeck"
|
|
89
|
+
SYSTEM_LOCATION: _SystemLocationType = "systemLocation"
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
def labware_location_is_off_deck(
|
|
93
|
+
location: LabwareLocation,
|
|
94
|
+
) -> TypeGuard[_OffDeckLocationType]:
|
|
95
|
+
"""Check if a location is an off deck location."""
|
|
96
|
+
return isinstance(location, str) and location == OFF_DECK_LOCATION
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
def labware_location_is_system(
|
|
100
|
+
location: LabwareLocation,
|
|
101
|
+
) -> TypeGuard[_SystemLocationType]:
|
|
102
|
+
"""Check if a location is the system location."""
|
|
103
|
+
return isinstance(location, str) and location == SYSTEM_LOCATION
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
class OnLabwareLocationSequenceComponent(BaseModel):
|
|
107
|
+
"""Labware on another labware."""
|
|
108
|
+
|
|
109
|
+
kind: Literal["onLabware"] = "onLabware"
|
|
110
|
+
labwareId: str
|
|
111
|
+
lidId: str | SkipJsonSchema[None] = Field(None)
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
class OnModuleLocationSequenceComponent(BaseModel):
|
|
115
|
+
"""Labware on a module."""
|
|
116
|
+
|
|
117
|
+
kind: Literal["onModule"] = "onModule"
|
|
118
|
+
moduleId: str
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
class OnAddressableAreaLocationSequenceComponent(BaseModel):
|
|
122
|
+
"""Labware on an addressable area."""
|
|
123
|
+
|
|
124
|
+
kind: Literal["onAddressableArea"] = "onAddressableArea"
|
|
125
|
+
addressableAreaName: str
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
class OnCutoutFixtureLocationSequenceComponent(BaseModel):
|
|
129
|
+
"""Something on a deck cutout fixture."""
|
|
130
|
+
|
|
131
|
+
kind: Literal["onCutoutFixture"] = "onCutoutFixture"
|
|
132
|
+
possibleCutoutFixtureIds: list[str]
|
|
133
|
+
cutoutId: str
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
class NotOnDeckLocationSequenceComponent(BaseModel):
|
|
137
|
+
"""Labware on a system location."""
|
|
138
|
+
|
|
139
|
+
kind: Literal["notOnDeck"] = "notOnDeck"
|
|
140
|
+
logicalLocationName: _OffDeckLocationType | _SystemLocationType
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
LabwareLocationSequence = list[
|
|
144
|
+
OnLabwareLocationSequenceComponent
|
|
145
|
+
| OnModuleLocationSequenceComponent
|
|
146
|
+
| OnAddressableAreaLocationSequenceComponent
|
|
147
|
+
| NotOnDeckLocationSequenceComponent
|
|
148
|
+
| OnCutoutFixtureLocationSequenceComponent
|
|
149
|
+
| InStackerHopperLocation
|
|
150
|
+
]
|
|
151
|
+
"""Labware location specifier."""
|
|
152
|
+
|
|
153
|
+
LabwareLocation = Union[
|
|
154
|
+
DeckSlotLocation,
|
|
155
|
+
ModuleLocation,
|
|
156
|
+
OnLabwareLocation,
|
|
157
|
+
_OffDeckLocationType,
|
|
158
|
+
_SystemLocationType,
|
|
159
|
+
AddressableAreaLocation,
|
|
160
|
+
InStackerHopperLocation,
|
|
161
|
+
]
|
|
162
|
+
"""Union of all locations where it's legal to keep a labware."""
|
|
163
|
+
|
|
164
|
+
LoadableLabwareLocation = Union[
|
|
165
|
+
DeckSlotLocation,
|
|
166
|
+
ModuleLocation,
|
|
167
|
+
OnLabwareLocation,
|
|
168
|
+
_OffDeckLocationType,
|
|
169
|
+
_SystemLocationType,
|
|
170
|
+
AddressableAreaLocation,
|
|
171
|
+
]
|
|
172
|
+
"""Union of all locations where it's legal to load a labware."""
|
|
173
|
+
|
|
174
|
+
OnDeckLabwareLocation = Union[
|
|
175
|
+
DeckSlotLocation, ModuleLocation, OnLabwareLocation, AddressableAreaLocation
|
|
176
|
+
]
|
|
177
|
+
|
|
178
|
+
NonStackedLocation = Union[
|
|
179
|
+
DeckSlotLocation,
|
|
180
|
+
AddressableAreaLocation,
|
|
181
|
+
ModuleLocation,
|
|
182
|
+
_OffDeckLocationType,
|
|
183
|
+
_SystemLocationType,
|
|
184
|
+
]
|
|
185
|
+
"""Union of all locations where it's legal to keep a labware that can't be stacked on another labware"""
|
|
186
|
+
|
|
187
|
+
|
|
188
|
+
# TODO(mm, 2022-11-07): Deduplicate with Vec3f.
|
|
189
|
+
class DeckPoint(BaseModel):
|
|
190
|
+
"""Coordinates of a point in deck space."""
|
|
191
|
+
|
|
192
|
+
x: float
|
|
193
|
+
y: float
|
|
194
|
+
z: float
|
|
@@ -0,0 +1,303 @@
|
|
|
1
|
+
"""Protocol engine types to do with modules."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
from dataclasses import dataclass
|
|
5
|
+
from enum import Enum
|
|
6
|
+
from typing import (
|
|
7
|
+
TypeGuard,
|
|
8
|
+
Literal,
|
|
9
|
+
Optional,
|
|
10
|
+
List,
|
|
11
|
+
Dict,
|
|
12
|
+
Any,
|
|
13
|
+
NamedTuple,
|
|
14
|
+
)
|
|
15
|
+
|
|
16
|
+
from pydantic import BaseModel, Field
|
|
17
|
+
from pydantic.json_schema import SkipJsonSchema
|
|
18
|
+
|
|
19
|
+
from opentrons_shared_data.labware.labware_definition import LabwareDefinition, Extents
|
|
20
|
+
from opentrons_shared_data.labware.types import LocatingFeatures
|
|
21
|
+
|
|
22
|
+
from opentrons.hardware_control.modules import (
|
|
23
|
+
ModuleType as ModuleType,
|
|
24
|
+
)
|
|
25
|
+
|
|
26
|
+
from .location import DeckSlotLocation
|
|
27
|
+
from .labware_offset_vector import LabwareOffsetVector
|
|
28
|
+
from .labware_movement import LabwareMovementOffsetData
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
# TODO(mc, 2022-01-18): use opentrons_shared_data.module.types.ModuleModel
|
|
32
|
+
class ModuleModel(str, Enum):
|
|
33
|
+
"""All available modules' models."""
|
|
34
|
+
|
|
35
|
+
TEMPERATURE_MODULE_V1 = "temperatureModuleV1"
|
|
36
|
+
TEMPERATURE_MODULE_V2 = "temperatureModuleV2"
|
|
37
|
+
MAGNETIC_MODULE_V1 = "magneticModuleV1"
|
|
38
|
+
MAGNETIC_MODULE_V2 = "magneticModuleV2"
|
|
39
|
+
THERMOCYCLER_MODULE_V1 = "thermocyclerModuleV1"
|
|
40
|
+
THERMOCYCLER_MODULE_V2 = "thermocyclerModuleV2"
|
|
41
|
+
HEATER_SHAKER_MODULE_V1 = "heaterShakerModuleV1"
|
|
42
|
+
MAGNETIC_BLOCK_V1 = "magneticBlockV1"
|
|
43
|
+
ABSORBANCE_READER_V1 = "absorbanceReaderV1"
|
|
44
|
+
FLEX_STACKER_MODULE_V1 = "flexStackerModuleV1"
|
|
45
|
+
|
|
46
|
+
def as_type(self) -> ModuleType:
|
|
47
|
+
"""Get the ModuleType of this model."""
|
|
48
|
+
if ModuleModel.is_temperature_module_model(self):
|
|
49
|
+
return ModuleType.TEMPERATURE
|
|
50
|
+
elif ModuleModel.is_magnetic_module_model(self):
|
|
51
|
+
return ModuleType.MAGNETIC
|
|
52
|
+
elif ModuleModel.is_thermocycler_module_model(self):
|
|
53
|
+
return ModuleType.THERMOCYCLER
|
|
54
|
+
elif ModuleModel.is_heater_shaker_module_model(self):
|
|
55
|
+
return ModuleType.HEATER_SHAKER
|
|
56
|
+
elif ModuleModel.is_magnetic_block(self):
|
|
57
|
+
return ModuleType.MAGNETIC_BLOCK
|
|
58
|
+
elif ModuleModel.is_absorbance_reader(self):
|
|
59
|
+
return ModuleType.ABSORBANCE_READER
|
|
60
|
+
elif ModuleModel.is_flex_stacker(self):
|
|
61
|
+
return ModuleType.FLEX_STACKER
|
|
62
|
+
|
|
63
|
+
assert False, f"Invalid ModuleModel {self}"
|
|
64
|
+
|
|
65
|
+
@classmethod
|
|
66
|
+
def is_temperature_module_model(
|
|
67
|
+
cls, model: ModuleModel
|
|
68
|
+
) -> TypeGuard[TemperatureModuleModel]:
|
|
69
|
+
"""Whether a given model is a Temperature Module."""
|
|
70
|
+
return model in [cls.TEMPERATURE_MODULE_V1, cls.TEMPERATURE_MODULE_V2]
|
|
71
|
+
|
|
72
|
+
@classmethod
|
|
73
|
+
def is_magnetic_module_model(
|
|
74
|
+
cls, model: ModuleModel
|
|
75
|
+
) -> TypeGuard[MagneticModuleModel]:
|
|
76
|
+
"""Whether a given model is a Magnetic Module."""
|
|
77
|
+
return model in [cls.MAGNETIC_MODULE_V1, cls.MAGNETIC_MODULE_V2]
|
|
78
|
+
|
|
79
|
+
@classmethod
|
|
80
|
+
def is_thermocycler_module_model(
|
|
81
|
+
cls, model: ModuleModel
|
|
82
|
+
) -> TypeGuard[ThermocyclerModuleModel]:
|
|
83
|
+
"""Whether a given model is a Thermocycler Module."""
|
|
84
|
+
return model in [cls.THERMOCYCLER_MODULE_V1, cls.THERMOCYCLER_MODULE_V2]
|
|
85
|
+
|
|
86
|
+
@classmethod
|
|
87
|
+
def is_heater_shaker_module_model(
|
|
88
|
+
cls, model: ModuleModel
|
|
89
|
+
) -> TypeGuard[HeaterShakerModuleModel]:
|
|
90
|
+
"""Whether a given model is a Heater-Shaker Module."""
|
|
91
|
+
return model == cls.HEATER_SHAKER_MODULE_V1
|
|
92
|
+
|
|
93
|
+
@classmethod
|
|
94
|
+
def is_magnetic_block(cls, model: ModuleModel) -> TypeGuard[MagneticBlockModel]:
|
|
95
|
+
"""Whether a given model is a Magnetic block."""
|
|
96
|
+
return model == cls.MAGNETIC_BLOCK_V1
|
|
97
|
+
|
|
98
|
+
@classmethod
|
|
99
|
+
def is_absorbance_reader(
|
|
100
|
+
cls, model: ModuleModel
|
|
101
|
+
) -> TypeGuard[AbsorbanceReaderModel]:
|
|
102
|
+
"""Whether a given model is an Absorbance Plate Reader."""
|
|
103
|
+
return model == cls.ABSORBANCE_READER_V1
|
|
104
|
+
|
|
105
|
+
@classmethod
|
|
106
|
+
def is_flex_stacker(cls, model: ModuleModel) -> TypeGuard[FlexStackerModuleModel]:
|
|
107
|
+
"""Whether a given model is a Flex Stacker.."""
|
|
108
|
+
return model == cls.FLEX_STACKER_MODULE_V1
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
TemperatureModuleModel = Literal[
|
|
112
|
+
ModuleModel.TEMPERATURE_MODULE_V1, ModuleModel.TEMPERATURE_MODULE_V2
|
|
113
|
+
]
|
|
114
|
+
MagneticModuleModel = Literal[
|
|
115
|
+
ModuleModel.MAGNETIC_MODULE_V1, ModuleModel.MAGNETIC_MODULE_V2
|
|
116
|
+
]
|
|
117
|
+
ThermocyclerModuleModel = Literal[
|
|
118
|
+
ModuleModel.THERMOCYCLER_MODULE_V1, ModuleModel.THERMOCYCLER_MODULE_V2
|
|
119
|
+
]
|
|
120
|
+
HeaterShakerModuleModel = Literal[ModuleModel.HEATER_SHAKER_MODULE_V1]
|
|
121
|
+
MagneticBlockModel = Literal[ModuleModel.MAGNETIC_BLOCK_V1]
|
|
122
|
+
AbsorbanceReaderModel = Literal[ModuleModel.ABSORBANCE_READER_V1]
|
|
123
|
+
FlexStackerModuleModel = Literal[ModuleModel.FLEX_STACKER_MODULE_V1]
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
class ModuleDimensions(BaseModel):
|
|
127
|
+
"""Dimension type for modules."""
|
|
128
|
+
|
|
129
|
+
bareOverallHeight: float
|
|
130
|
+
overLabwareHeight: float
|
|
131
|
+
labwareInterfaceXDimension: Optional[float] = None
|
|
132
|
+
labwareInterfaceYDimension: Optional[float] = None
|
|
133
|
+
lidHeight: Optional[float] = None
|
|
134
|
+
maxStackerFillHeight: Optional[float] = None
|
|
135
|
+
maxStackerRetrievableHeight: Optional[float] = None
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
# TODO(mm, 2022-11-07): Deduplicate with Vec3f.
|
|
139
|
+
class ModuleCalibrationPoint(BaseModel):
|
|
140
|
+
"""Calibration Point type for module definition."""
|
|
141
|
+
|
|
142
|
+
x: float
|
|
143
|
+
y: float
|
|
144
|
+
z: float
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
# TODO(mm, 2023-04-13): Move to shared-data, so this binding can be maintained alongside the JSON
|
|
148
|
+
# schema that it's sourced from. We already do that for labware definitions and JSON protocols.
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
# See underlying JSON schema for documentation.
|
|
152
|
+
class ModuleDefinition(BaseModel):
|
|
153
|
+
"""A module definition conforming to module definition schema v3."""
|
|
154
|
+
|
|
155
|
+
# Note: This field is misleading.
|
|
156
|
+
#
|
|
157
|
+
# This class only models v3 definitions ("module/schemas/3"), not v2 ("module/schemas/2").
|
|
158
|
+
# labwareOffset is required to have a z-component, for example.
|
|
159
|
+
#
|
|
160
|
+
# When parsing from a schema v3 JSON definition into this model,
|
|
161
|
+
# the definition's `"$otSharedSchema": "module/schemas/3"` field will be thrown away
|
|
162
|
+
# because it has a dollar sign, which doesn't match this field.
|
|
163
|
+
# Then, this field will default to "module/schemas/2", because no value was provided.
|
|
164
|
+
#
|
|
165
|
+
# We should fix this field once Jira RSS-221 is resolved. RSS-221 makes it difficult to fix
|
|
166
|
+
# because robot-server has been storing and loading these bad fields in its database.
|
|
167
|
+
otSharedSchema: str = Field("module/schemas/2", description="The current schema.")
|
|
168
|
+
|
|
169
|
+
moduleType: ModuleType = Field(...)
|
|
170
|
+
|
|
171
|
+
model: ModuleModel = Field(...)
|
|
172
|
+
|
|
173
|
+
labwareOffset: LabwareOffsetVector = Field(...)
|
|
174
|
+
|
|
175
|
+
dimensions: ModuleDimensions = Field(...)
|
|
176
|
+
|
|
177
|
+
calibrationPoint: ModuleCalibrationPoint = Field(
|
|
178
|
+
...,
|
|
179
|
+
)
|
|
180
|
+
|
|
181
|
+
displayName: str = Field(...)
|
|
182
|
+
|
|
183
|
+
quirks: List[str] = Field(...)
|
|
184
|
+
|
|
185
|
+
# In releases prior to https://github.com/Opentrons/opentrons/pull/11873 (v6.3.0),
|
|
186
|
+
# the matrices in slotTransforms were 3x3.
|
|
187
|
+
# After, they are 4x4, even though there was no schema version bump.
|
|
188
|
+
#
|
|
189
|
+
# Because old objects of this class, with the 3x3 matrices, were stored in robot-server's
|
|
190
|
+
# database, this field needs to stay typed loosely enough to support both sizes.
|
|
191
|
+
# We can fix this once Jira RSS-221 is resolved.
|
|
192
|
+
slotTransforms: Dict[str, Any] = Field(
|
|
193
|
+
...,
|
|
194
|
+
)
|
|
195
|
+
|
|
196
|
+
compatibleWith: List[ModuleModel] = Field(
|
|
197
|
+
...,
|
|
198
|
+
)
|
|
199
|
+
gripperOffsets: Optional[Dict[str, LabwareMovementOffsetData]] = Field(
|
|
200
|
+
default_factory=lambda: {},
|
|
201
|
+
)
|
|
202
|
+
|
|
203
|
+
features: LocatingFeatures = Field(
|
|
204
|
+
...,
|
|
205
|
+
)
|
|
206
|
+
|
|
207
|
+
extents: Extents = Field(
|
|
208
|
+
...,
|
|
209
|
+
)
|
|
210
|
+
|
|
211
|
+
|
|
212
|
+
class LoadedModule(BaseModel):
|
|
213
|
+
"""A module that has been loaded."""
|
|
214
|
+
|
|
215
|
+
id: str
|
|
216
|
+
model: ModuleModel
|
|
217
|
+
location: Optional[DeckSlotLocation] = None
|
|
218
|
+
serialNumber: Optional[str] = None
|
|
219
|
+
|
|
220
|
+
|
|
221
|
+
class SpeedRange(NamedTuple):
|
|
222
|
+
"""Minimum and maximum allowed speeds for a shaking module."""
|
|
223
|
+
|
|
224
|
+
min: int
|
|
225
|
+
max: int
|
|
226
|
+
|
|
227
|
+
|
|
228
|
+
class TemperatureRange(NamedTuple):
|
|
229
|
+
"""Minimum and maximum allowed temperatures for a heating module."""
|
|
230
|
+
|
|
231
|
+
min: float
|
|
232
|
+
max: float
|
|
233
|
+
|
|
234
|
+
|
|
235
|
+
class HeaterShakerLatchStatus(Enum):
|
|
236
|
+
"""Heater-Shaker latch status for determining pipette and labware movement errors."""
|
|
237
|
+
|
|
238
|
+
CLOSED = "closed"
|
|
239
|
+
OPEN = "open"
|
|
240
|
+
UNKNOWN = "unknown"
|
|
241
|
+
|
|
242
|
+
|
|
243
|
+
@dataclass(frozen=True)
|
|
244
|
+
class HeaterShakerMovementRestrictors:
|
|
245
|
+
"""Shaking status, latch status and slot location for determining movement restrictions."""
|
|
246
|
+
|
|
247
|
+
plate_shaking: bool
|
|
248
|
+
latch_status: HeaterShakerLatchStatus
|
|
249
|
+
deck_slot: int
|
|
250
|
+
|
|
251
|
+
|
|
252
|
+
ABSMeasureMode = Literal["single", "multi"]
|
|
253
|
+
|
|
254
|
+
|
|
255
|
+
# TODO(mm, 2022-11-07): Deduplicate with Vec3f.
|
|
256
|
+
class ModuleOffsetVector(BaseModel):
|
|
257
|
+
"""Offset, in deck coordinates, from nominal to actual position of labware on a module."""
|
|
258
|
+
|
|
259
|
+
x: float
|
|
260
|
+
y: float
|
|
261
|
+
z: float
|
|
262
|
+
|
|
263
|
+
|
|
264
|
+
@dataclass
|
|
265
|
+
class ModuleOffsetData:
|
|
266
|
+
"""Module calibration offset data."""
|
|
267
|
+
|
|
268
|
+
moduleOffsetVector: ModuleOffsetVector
|
|
269
|
+
location: DeckSlotLocation
|
|
270
|
+
|
|
271
|
+
|
|
272
|
+
class StackerFillEmptyStrategy(str, Enum):
|
|
273
|
+
"""Strategy to use for filling or emptying a stacker."""
|
|
274
|
+
|
|
275
|
+
MANUAL_WITH_PAUSE = "manualWithPause"
|
|
276
|
+
LOGICAL = "logical"
|
|
277
|
+
|
|
278
|
+
|
|
279
|
+
class StackerStoredLabwareGroup(BaseModel):
|
|
280
|
+
"""Represents one group of labware stored in a stacker hopper."""
|
|
281
|
+
|
|
282
|
+
primaryLabwareId: str
|
|
283
|
+
adapterLabwareId: str | SkipJsonSchema[None] = None
|
|
284
|
+
lidLabwareId: str | SkipJsonSchema[None] = None
|
|
285
|
+
|
|
286
|
+
|
|
287
|
+
@dataclass
|
|
288
|
+
class StackerPoolDefinition:
|
|
289
|
+
"""Represents an internal configuraiton of stored labware."""
|
|
290
|
+
|
|
291
|
+
primaryLabwareDefinition: LabwareDefinition
|
|
292
|
+
adapterLabwareDefinition: LabwareDefinition | SkipJsonSchema[None] = None
|
|
293
|
+
lidLabwareDefinition: LabwareDefinition | SkipJsonSchema[None] = None
|
|
294
|
+
|
|
295
|
+
|
|
296
|
+
class IdentifyColor(str, Enum):
|
|
297
|
+
"""Module identify color."""
|
|
298
|
+
|
|
299
|
+
WHITE = "white"
|
|
300
|
+
RED = "red"
|
|
301
|
+
GREEN = "green"
|
|
302
|
+
BLUE = "blue"
|
|
303
|
+
YELLOW = "yellow"
|