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,55 @@
|
|
|
1
|
+
"""Protocol specifying API gripper control."""
|
|
2
|
+
from typing import Optional
|
|
3
|
+
from typing_extensions import Protocol
|
|
4
|
+
|
|
5
|
+
from opentrons.hardware_control.dev_types import GripperDict
|
|
6
|
+
from opentrons.hardware_control.instruments.ot3.gripper import Gripper
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class GripperController(Protocol):
|
|
10
|
+
"""A protocol specifying gripper API functions."""
|
|
11
|
+
|
|
12
|
+
async def grip(
|
|
13
|
+
self, force_newtons: Optional[float] = None, stay_engaged: bool = True
|
|
14
|
+
) -> None:
|
|
15
|
+
...
|
|
16
|
+
|
|
17
|
+
async def home_gripper_jaw(self, recalibrate_jaw_width: bool = False) -> None:
|
|
18
|
+
...
|
|
19
|
+
|
|
20
|
+
async def ungrip(self, force_newtons: Optional[float] = None) -> None:
|
|
21
|
+
"""Release gripped object.
|
|
22
|
+
|
|
23
|
+
To simply open the jaw, use `home_gripper_jaw` instead.
|
|
24
|
+
"""
|
|
25
|
+
...
|
|
26
|
+
|
|
27
|
+
async def idle_gripper(self) -> None:
|
|
28
|
+
"""Move gripper to its idle, gripped position."""
|
|
29
|
+
...
|
|
30
|
+
|
|
31
|
+
def gripper_jaw_can_home(self) -> bool:
|
|
32
|
+
"""Check if it is valid to home the gripper jaw.
|
|
33
|
+
|
|
34
|
+
This should return False if the API believes that the gripper is
|
|
35
|
+
currently holding something.
|
|
36
|
+
"""
|
|
37
|
+
...
|
|
38
|
+
|
|
39
|
+
def raise_error_if_gripper_pickup_failed(
|
|
40
|
+
self,
|
|
41
|
+
expected_grip_width: float,
|
|
42
|
+
grip_width_uncertainty_wider: float,
|
|
43
|
+
grip_width_uncertainty_narrower: float,
|
|
44
|
+
) -> None:
|
|
45
|
+
"""Ensure that a gripper pickup succeeded."""
|
|
46
|
+
|
|
47
|
+
@property
|
|
48
|
+
def attached_gripper(self) -> Optional[GripperDict]:
|
|
49
|
+
"""Get a dict of all attached grippers."""
|
|
50
|
+
...
|
|
51
|
+
|
|
52
|
+
@property
|
|
53
|
+
def hardware_gripper(self) -> Optional[Gripper]:
|
|
54
|
+
"""Get attached gripper, if present."""
|
|
55
|
+
...
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
from typing import Dict, Optional
|
|
2
|
+
from typing_extensions import Protocol
|
|
3
|
+
|
|
4
|
+
from ..types import SubSystem, SubSystemState, Axis
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class HardwareManager(Protocol):
|
|
8
|
+
"""Protocol specifying access to configuration plane elements of hardware."""
|
|
9
|
+
|
|
10
|
+
def get_fw_version(self) -> str:
|
|
11
|
+
"""
|
|
12
|
+
Return the firmware version of the connected hardware.
|
|
13
|
+
"""
|
|
14
|
+
...
|
|
15
|
+
|
|
16
|
+
@property
|
|
17
|
+
def fw_version(self) -> str:
|
|
18
|
+
"""
|
|
19
|
+
Return the firmware version of the connected hardware.
|
|
20
|
+
|
|
21
|
+
The version is a string retrieved directly from the attached hardware
|
|
22
|
+
(or possibly simulator).
|
|
23
|
+
"""
|
|
24
|
+
...
|
|
25
|
+
|
|
26
|
+
@property
|
|
27
|
+
def board_revision(self) -> str:
|
|
28
|
+
"""
|
|
29
|
+
Return the revision of the central hardware.
|
|
30
|
+
"""
|
|
31
|
+
...
|
|
32
|
+
|
|
33
|
+
@property
|
|
34
|
+
def attached_subsystems(self) -> Dict[SubSystem, SubSystemState]:
|
|
35
|
+
"""
|
|
36
|
+
Get a view of the hardware subsystems currently attached to the machine.
|
|
37
|
+
|
|
38
|
+
These subsystems are the programmable parts that underly and provide things like motion
|
|
39
|
+
control and instruments. Depending on the machine, different subsystems may be available.
|
|
40
|
+
In general, callers should not use the presence or absence of a specific subsystem to decide
|
|
41
|
+
whether or not the hardware is operating properly.
|
|
42
|
+
"""
|
|
43
|
+
...
|
|
44
|
+
|
|
45
|
+
async def get_serial_number(self) -> Optional[str]:
|
|
46
|
+
"""Get the robot serial number, if provisioned. If not provisioned, will be None."""
|
|
47
|
+
...
|
|
48
|
+
|
|
49
|
+
def axis_is_present(self, axis: Axis) -> bool:
|
|
50
|
+
"""Get whether a motor axis is present on the machine."""
|
|
51
|
+
...
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
from typing_extensions import Protocol
|
|
2
|
+
|
|
3
|
+
from .types import ProtocolRobotType
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class Identifiable(Protocol[ProtocolRobotType]):
|
|
7
|
+
"""Protocol specifying support for hardware identification."""
|
|
8
|
+
|
|
9
|
+
def get_robot_type(self) -> ProtocolRobotType:
|
|
10
|
+
"""Return the enumerated robot type that this API controls.
|
|
11
|
+
|
|
12
|
+
When a caller needs to determine whether an API function is expected
|
|
13
|
+
to be present on a hardware_control instance, it is preferable to check
|
|
14
|
+
with this function rather than check the exact type via `isinstance`.
|
|
15
|
+
"""
|
|
16
|
+
...
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
from typing import Dict, Optional
|
|
2
|
+
from typing_extensions import Protocol
|
|
3
|
+
|
|
4
|
+
from opentrons_shared_data.pipette.types import PipetteName
|
|
5
|
+
from opentrons.types import Mount
|
|
6
|
+
from .types import MountArgType
|
|
7
|
+
|
|
8
|
+
# TODO (lc 12-05-2022) This protocol has deviated from the OT3 api. We
|
|
9
|
+
# need to figure out how to combine them again in follow-up refactors.
|
|
10
|
+
from opentrons.hardware_control.instruments.ot2.pipette import Pipette
|
|
11
|
+
from ..dev_types import PipetteDict
|
|
12
|
+
from ..types import CriticalPoint
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class InstrumentConfigurer(Protocol[MountArgType]):
|
|
16
|
+
"""A protocol specifying how to interact with instrument presence and detection."""
|
|
17
|
+
|
|
18
|
+
def reset_instrument(self, mount: Optional[MountArgType] = None) -> None:
|
|
19
|
+
"""
|
|
20
|
+
Reset the internal state of a pipette by its mount, without doing
|
|
21
|
+
any lower level reconfiguration. This is useful to make sure that no
|
|
22
|
+
settings changes from a protocol persist.
|
|
23
|
+
|
|
24
|
+
mount: If specified, reset that mount. If not specified, reset both
|
|
25
|
+
"""
|
|
26
|
+
...
|
|
27
|
+
|
|
28
|
+
async def cache_instruments(
|
|
29
|
+
self,
|
|
30
|
+
require: Optional[Dict[Mount, PipetteName]] = None,
|
|
31
|
+
skip_if_would_block: bool = False,
|
|
32
|
+
) -> None:
|
|
33
|
+
"""
|
|
34
|
+
Scan the attached instruments, take necessary configuration actions,
|
|
35
|
+
and set up hardware controller internal state if necessary.
|
|
36
|
+
|
|
37
|
+
require: If specified, the require should be a dict of mounts to
|
|
38
|
+
instrument names describing the instruments expected to be
|
|
39
|
+
present. This can save a subsequent call of attached_instruments
|
|
40
|
+
and also serves as the hook for the hardware simulator to decide
|
|
41
|
+
what is attached.
|
|
42
|
+
raises RuntimeError: If an instrument is expected but not found.
|
|
43
|
+
|
|
44
|
+
This function will only change the things that need to be changed.
|
|
45
|
+
If the same pipette (by serial) or the same lack of pipette is
|
|
46
|
+
observed on a mount before and after the scan, no action will be
|
|
47
|
+
taken. That makes this function appropriate for setting up the
|
|
48
|
+
robot for operation, but not for making sure that any previous
|
|
49
|
+
settings changes have been reset. For the latter use case, use
|
|
50
|
+
reset_instrument.
|
|
51
|
+
"""
|
|
52
|
+
...
|
|
53
|
+
|
|
54
|
+
def get_attached_instruments(self) -> Dict[Mount, PipetteDict]:
|
|
55
|
+
"""Get the status dicts of the cached attached instruments.
|
|
56
|
+
|
|
57
|
+
Also available as :py:meth:`get_attached_instruments`.
|
|
58
|
+
|
|
59
|
+
This returns a dictified version of the
|
|
60
|
+
hardware_control.instruments.pipette.Pipette as a dict keyed by
|
|
61
|
+
the Mount to which the pipette is attached.
|
|
62
|
+
If no pipette is attached on a given mount, the mount key will
|
|
63
|
+
still be present but will have the value ``None``.
|
|
64
|
+
|
|
65
|
+
Note that on the OT-2 this is only a query of a cached value;
|
|
66
|
+
to actively scan for changes, use cache_instruments`. This process
|
|
67
|
+
deactivates the OT-2's motors and should be used sparingly.
|
|
68
|
+
"""
|
|
69
|
+
...
|
|
70
|
+
|
|
71
|
+
def get_attached_instrument(self, mount: MountArgType) -> PipetteDict:
|
|
72
|
+
"""Get the status dict of a single cached instrument.
|
|
73
|
+
|
|
74
|
+
Return values and caveats are as get_attached_instruments.
|
|
75
|
+
"""
|
|
76
|
+
...
|
|
77
|
+
|
|
78
|
+
@property
|
|
79
|
+
def attached_instruments(self) -> Dict[Mount, PipetteDict]:
|
|
80
|
+
return self.get_attached_instruments()
|
|
81
|
+
|
|
82
|
+
def get_attached_pipettes(self) -> Dict[Mount, PipetteDict]:
|
|
83
|
+
"""Get the status dicts of cached attached pipettes.
|
|
84
|
+
|
|
85
|
+
Works like get_attached_instruments but for pipettes only - on the Flex,
|
|
86
|
+
there will be no gripper information here.
|
|
87
|
+
"""
|
|
88
|
+
...
|
|
89
|
+
|
|
90
|
+
@property
|
|
91
|
+
def attached_pipettes(self) -> Dict[Mount, PipetteDict]:
|
|
92
|
+
return self.get_attached_pipettes()
|
|
93
|
+
|
|
94
|
+
def calibrate_plunger(
|
|
95
|
+
self,
|
|
96
|
+
mount: MountArgType,
|
|
97
|
+
top: Optional[float] = None,
|
|
98
|
+
bottom: Optional[float] = None,
|
|
99
|
+
blow_out: Optional[float] = None,
|
|
100
|
+
drop_tip: Optional[float] = None,
|
|
101
|
+
) -> None:
|
|
102
|
+
"""
|
|
103
|
+
Set calibration values for the pipette plunger.
|
|
104
|
+
This can be called multiple times as the user sets each value,
|
|
105
|
+
or you can set them all at once.
|
|
106
|
+
:param top: Touching but not engaging the plunger.
|
|
107
|
+
:param bottom: Must be above the pipette's physical hard-stop, while
|
|
108
|
+
still leaving enough room for 'blow_out'
|
|
109
|
+
:param blow_out: Plunger is pushed down enough to expel all liquids.
|
|
110
|
+
:param drop_tip: Position that causes the tip to be released from the
|
|
111
|
+
pipette
|
|
112
|
+
"""
|
|
113
|
+
...
|
|
114
|
+
|
|
115
|
+
def set_flow_rate(
|
|
116
|
+
self,
|
|
117
|
+
mount: MountArgType,
|
|
118
|
+
aspirate: Optional[float] = None,
|
|
119
|
+
dispense: Optional[float] = None,
|
|
120
|
+
blow_out: Optional[float] = None,
|
|
121
|
+
) -> None:
|
|
122
|
+
"""Set a pipette's rate of liquid handling in flow rate units"""
|
|
123
|
+
...
|
|
124
|
+
|
|
125
|
+
def set_pipette_speed(
|
|
126
|
+
self,
|
|
127
|
+
mount: MountArgType,
|
|
128
|
+
aspirate: Optional[float] = None,
|
|
129
|
+
dispense: Optional[float] = None,
|
|
130
|
+
blow_out: Optional[float] = None,
|
|
131
|
+
) -> None:
|
|
132
|
+
"""Set a pipette's rate of liquid handling in linear speed units."""
|
|
133
|
+
...
|
|
134
|
+
|
|
135
|
+
def get_instrument_max_height(
|
|
136
|
+
self,
|
|
137
|
+
mount: MountArgType,
|
|
138
|
+
critical_point: Optional[CriticalPoint] = None,
|
|
139
|
+
) -> float:
|
|
140
|
+
"""Return max achievable height of the attached instrument
|
|
141
|
+
based on the current critical point
|
|
142
|
+
"""
|
|
143
|
+
...
|
|
144
|
+
|
|
145
|
+
# todo(mm, 2024-10-17): Consider deleting this in favor of cache_tip()
|
|
146
|
+
# if we can do so without breaking anything.
|
|
147
|
+
def add_tip(self, mount: MountArgType, tip_length: float) -> None:
|
|
148
|
+
"""Inform the hardware that a tip is now attached to a pipette.
|
|
149
|
+
|
|
150
|
+
If a tip is already attached, this no-ops.
|
|
151
|
+
|
|
152
|
+
This changes the critical point of the pipette to make sure that
|
|
153
|
+
the end of the tip is what moves around, and allows liquid handling.
|
|
154
|
+
"""
|
|
155
|
+
...
|
|
156
|
+
|
|
157
|
+
def cache_tip(self, mount: MountArgType, tip_length: float) -> None:
|
|
158
|
+
"""Inform the hardware that a tip is now attached to a pipette.
|
|
159
|
+
|
|
160
|
+
This is like `add_tip()`, except that if a tip is already attached,
|
|
161
|
+
this replaces it instead of no-opping.
|
|
162
|
+
"""
|
|
163
|
+
...
|
|
164
|
+
|
|
165
|
+
def remove_tip(self, mount: MountArgType) -> None:
|
|
166
|
+
"""Inform the hardware that a tip is no longer attached to a pipette.
|
|
167
|
+
|
|
168
|
+
This changes the critical point of the system to the end of the
|
|
169
|
+
nozzle and prevents further liquid handling commands.
|
|
170
|
+
"""
|
|
171
|
+
...
|
|
172
|
+
|
|
173
|
+
def set_current_tiprack_diameter(
|
|
174
|
+
self, mount: MountArgType, tiprack_diameter: float
|
|
175
|
+
) -> None:
|
|
176
|
+
"""Inform the hardware of the diameter of the tiprack.
|
|
177
|
+
|
|
178
|
+
This drives the magnitude of the shake commanded for pipettes that need
|
|
179
|
+
a shake after dropping or picking up tips.
|
|
180
|
+
"""
|
|
181
|
+
...
|
|
182
|
+
|
|
183
|
+
def set_working_volume(self, mount: MountArgType, tip_volume: float) -> None:
|
|
184
|
+
"""Inform the hardware how much volume a pipette can aspirate.
|
|
185
|
+
|
|
186
|
+
This will set the limit of aspiration for the pipette, and is
|
|
187
|
+
necessary for backcompatibility.
|
|
188
|
+
"""
|
|
189
|
+
...
|
|
190
|
+
|
|
191
|
+
@property
|
|
192
|
+
def hardware_instruments(self) -> Dict[Mount, Optional[Pipette]]:
|
|
193
|
+
"""Return the underlying hardware representation of the instruments.
|
|
194
|
+
|
|
195
|
+
This should rarely be used. Do not write new code that uses it.
|
|
196
|
+
"""
|
|
197
|
+
...
|
|
198
|
+
|
|
199
|
+
def has_gripper(self) -> bool:
|
|
200
|
+
"""Return whether there is a gripper attached to this instance.
|
|
201
|
+
|
|
202
|
+
- On robots that do not support a gripper, this will always return False.
|
|
203
|
+
- On robots that support a gripper, this will return based on the current
|
|
204
|
+
presence of a gripper.
|
|
205
|
+
"""
|
|
206
|
+
...
|
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
from typing import Optional
|
|
2
|
+
from typing_extensions import Protocol
|
|
3
|
+
|
|
4
|
+
from opentrons.types import Point
|
|
5
|
+
from opentrons.hardware_control.types import CriticalPoint, TipScrapeType
|
|
6
|
+
from .types import MountArgType, CalibrationType, ConfigType
|
|
7
|
+
|
|
8
|
+
from .instrument_configurer import InstrumentConfigurer
|
|
9
|
+
from .motion_controller import MotionController
|
|
10
|
+
from .configurable import Configurable
|
|
11
|
+
from .calibratable import Calibratable
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class LiquidHandler(
|
|
15
|
+
InstrumentConfigurer[MountArgType],
|
|
16
|
+
MotionController[MountArgType],
|
|
17
|
+
Configurable[ConfigType],
|
|
18
|
+
Calibratable[CalibrationType],
|
|
19
|
+
Protocol[CalibrationType, MountArgType, ConfigType],
|
|
20
|
+
):
|
|
21
|
+
def critical_point_for(
|
|
22
|
+
self,
|
|
23
|
+
mount: MountArgType,
|
|
24
|
+
cp_override: Optional[CriticalPoint] = None,
|
|
25
|
+
) -> Point:
|
|
26
|
+
"""
|
|
27
|
+
Determine the current critical point for the specified mount.
|
|
28
|
+
|
|
29
|
+
:param mount: A robot mount that the instrument is on.
|
|
30
|
+
:param cp_override: The critical point override to use.
|
|
31
|
+
|
|
32
|
+
If no critical point override is specified, the robot defaults to nozzle location `A1` or the mount critical point.
|
|
33
|
+
:return: Point.
|
|
34
|
+
"""
|
|
35
|
+
...
|
|
36
|
+
|
|
37
|
+
async def update_nozzle_configuration_for_mount(
|
|
38
|
+
self,
|
|
39
|
+
mount: MountArgType,
|
|
40
|
+
back_left_nozzle: Optional[str],
|
|
41
|
+
front_right_nozzle: Optional[str],
|
|
42
|
+
starting_nozzle: Optional[str] = None,
|
|
43
|
+
) -> None:
|
|
44
|
+
"""
|
|
45
|
+
The expectation of this function is that the back_left_nozzle/front_right_nozzle are the two corners
|
|
46
|
+
of a rectangle of nozzles. A call to this function that does not follow that schema will result
|
|
47
|
+
in an error.
|
|
48
|
+
|
|
49
|
+
:param mount: A robot mount that the instrument is on.
|
|
50
|
+
:param back_left_nozzle: A string representing a nozzle name of the form <LETTER><NUMBER> such as 'A1'.
|
|
51
|
+
:param front_right_nozzle: A string representing a nozzle name of the form <LETTER><NUMBER> such as 'A1'.
|
|
52
|
+
:param starting_nozzle: A string representing the starting nozzle which will be used as the critical point
|
|
53
|
+
of the pipette nozzle configuration. By default, the back left nozzle will be the starting nozzle if
|
|
54
|
+
none is provided.
|
|
55
|
+
|
|
56
|
+
If none of the nozzle parameters are provided, the nozzle configuration will be reset to default.
|
|
57
|
+
:return: None.
|
|
58
|
+
"""
|
|
59
|
+
...
|
|
60
|
+
|
|
61
|
+
async def configure_for_volume(self, mount: MountArgType, volume: float) -> None:
|
|
62
|
+
"""
|
|
63
|
+
Configure a pipette to handle the specified volume.
|
|
64
|
+
|
|
65
|
+
Some pipettes need to switch modes to handle different volumes of liquid. Calling
|
|
66
|
+
this ensures they do so. If the pipette does not need to switch modes, or the pipette
|
|
67
|
+
is already in the specified mode, nothing will happen.
|
|
68
|
+
|
|
69
|
+
If the pipette does need to switch modes, it will likely be unready for aspiration and
|
|
70
|
+
you will need to call :py:meth:`prepare_for_aspirate` afterwards.
|
|
71
|
+
"""
|
|
72
|
+
...
|
|
73
|
+
|
|
74
|
+
async def prepare_for_aspirate(
|
|
75
|
+
self, mount: MountArgType, rate: float = 1.0
|
|
76
|
+
) -> None:
|
|
77
|
+
"""
|
|
78
|
+
Prepare the pipette for aspiration.
|
|
79
|
+
|
|
80
|
+
This must happen after every :py:meth:`blow_out` and should probably be
|
|
81
|
+
called before every :py:meth:`aspirate`, while the pipette tip is not
|
|
82
|
+
immersed in a well. It ensures that the plunger is at the 0-volume
|
|
83
|
+
position of the pipette if necessary (if not necessary, it does
|
|
84
|
+
nothing).
|
|
85
|
+
|
|
86
|
+
If :py:meth:`aspirate` is called immediately after :py:meth:`blow_out`,
|
|
87
|
+
the plunger is left at the ``blow_out`` position, below the ``bottom``
|
|
88
|
+
position, and moving the plunger up during :py:meth:`aspirate` is
|
|
89
|
+
expected to aspirate liquid - :py:meth:`aspirate` is called once the
|
|
90
|
+
pipette tip is already in the well. This will cause a subtle over
|
|
91
|
+
aspiration. To make the problem more obvious, :py:meth:`aspirate` will
|
|
92
|
+
raise an exception if this method has not previously been called.
|
|
93
|
+
"""
|
|
94
|
+
...
|
|
95
|
+
|
|
96
|
+
async def aspirate(
|
|
97
|
+
self,
|
|
98
|
+
mount: MountArgType,
|
|
99
|
+
volume: Optional[float] = None,
|
|
100
|
+
rate: float = 1.0,
|
|
101
|
+
correction_volume: float = 0.0,
|
|
102
|
+
) -> None:
|
|
103
|
+
"""
|
|
104
|
+
Aspirate a volume of liquid (in microliters/uL) using this pipette
|
|
105
|
+
from the *current location*. If no volume is passed, `aspirate` will
|
|
106
|
+
default to max available volume (after taking into account the volume
|
|
107
|
+
already present in the tip).
|
|
108
|
+
|
|
109
|
+
The function :py:meth:`prepare_for_aspirate` must be called prior to
|
|
110
|
+
calling this function, while the tip is above the well. This ensures
|
|
111
|
+
that the pipette tip is in the proper position at the bottom of the
|
|
112
|
+
pipette to begin aspiration, and prevents subtle over-aspiration if
|
|
113
|
+
an aspirate is done immediately after :py:meth:`blow_out`. If
|
|
114
|
+
:py:meth:`prepare_for_aspirate` has not been called since the last
|
|
115
|
+
call to :py:meth:`aspirate`, an exception will be raised.
|
|
116
|
+
|
|
117
|
+
mount : Mount.LEFT or Mount.RIGHT
|
|
118
|
+
volume : [float] The number of microliters to aspirate
|
|
119
|
+
rate : [float] Set plunger speed for this aspirate, where
|
|
120
|
+
speed = rate * aspirate_speed
|
|
121
|
+
correction_volume : Correction volume in uL for the specified aspirate volume
|
|
122
|
+
"""
|
|
123
|
+
...
|
|
124
|
+
|
|
125
|
+
async def aspirate_while_tracking(
|
|
126
|
+
self,
|
|
127
|
+
mount: MountArgType,
|
|
128
|
+
z_distance: float,
|
|
129
|
+
volume: float,
|
|
130
|
+
flow_rate: float = 1.0,
|
|
131
|
+
) -> None:
|
|
132
|
+
"""
|
|
133
|
+
Aspirate a volume of liquid (in microliters/uL) while moving the z axis synchronously.
|
|
134
|
+
|
|
135
|
+
:param mount: A robot mount that the instrument is on.
|
|
136
|
+
:param z_distance: The distance the z axis will move during apsiration.
|
|
137
|
+
:param volume: The volume of liquid to be aspirated.
|
|
138
|
+
:param flow_rate: The flow rate to aspirate with.
|
|
139
|
+
"""
|
|
140
|
+
...
|
|
141
|
+
|
|
142
|
+
async def dispense(
|
|
143
|
+
self,
|
|
144
|
+
mount: MountArgType,
|
|
145
|
+
volume: Optional[float] = None,
|
|
146
|
+
rate: float = 1.0,
|
|
147
|
+
push_out: Optional[float] = None,
|
|
148
|
+
correction_volume: float = 0.0,
|
|
149
|
+
is_full_dispense: bool = False,
|
|
150
|
+
) -> None:
|
|
151
|
+
"""
|
|
152
|
+
Dispense a volume of liquid in microliters(uL) using this pipette
|
|
153
|
+
at the current location. If no volume is specified, `dispense` will
|
|
154
|
+
dispense all volume currently present in pipette
|
|
155
|
+
|
|
156
|
+
mount : Mount.LEFT or Mount.RIGHT
|
|
157
|
+
volume : [float] The number of microliters to dispense
|
|
158
|
+
rate : [float] Set plunger speed for this dispense, where
|
|
159
|
+
speed = rate * dispense_speed
|
|
160
|
+
correction_volume : Correction volume in uL for the specified dispense volume
|
|
161
|
+
"""
|
|
162
|
+
...
|
|
163
|
+
|
|
164
|
+
async def dispense_while_tracking(
|
|
165
|
+
self,
|
|
166
|
+
mount: MountArgType,
|
|
167
|
+
z_distance: float,
|
|
168
|
+
volume: float,
|
|
169
|
+
push_out: Optional[float],
|
|
170
|
+
flow_rate: float = 1.0,
|
|
171
|
+
is_full_dispense: bool = False,
|
|
172
|
+
) -> None:
|
|
173
|
+
"""
|
|
174
|
+
Dispense a volume of liquid (in microliters/uL) while moving the z axis synchronously.
|
|
175
|
+
|
|
176
|
+
:param mount: A robot mount that the instrument is on.
|
|
177
|
+
:param z_distance: The distance the z axis will move during dispensing.
|
|
178
|
+
:param volume: The volume of liquid to be dispensed.
|
|
179
|
+
:param flow_rate: The flow rate to dispense with.
|
|
180
|
+
"""
|
|
181
|
+
...
|
|
182
|
+
|
|
183
|
+
async def blow_out(
|
|
184
|
+
self, mount: MountArgType, volume: Optional[float] = None
|
|
185
|
+
) -> None:
|
|
186
|
+
"""
|
|
187
|
+
Force any remaining liquid to dispense. The liquid will be dispensed at
|
|
188
|
+
the current location of pipette
|
|
189
|
+
"""
|
|
190
|
+
...
|
|
191
|
+
|
|
192
|
+
async def tip_pickup_moves(
|
|
193
|
+
self,
|
|
194
|
+
mount: MountArgType,
|
|
195
|
+
presses: Optional[int] = None,
|
|
196
|
+
increment: Optional[float] = None,
|
|
197
|
+
) -> None:
|
|
198
|
+
...
|
|
199
|
+
|
|
200
|
+
async def pick_up_tip(
|
|
201
|
+
self,
|
|
202
|
+
mount: MountArgType,
|
|
203
|
+
tip_length: float,
|
|
204
|
+
presses: Optional[int] = None,
|
|
205
|
+
increment: Optional[float] = None,
|
|
206
|
+
prep_after: bool = True,
|
|
207
|
+
) -> None:
|
|
208
|
+
"""
|
|
209
|
+
Pick up tip from current location.
|
|
210
|
+
|
|
211
|
+
This is achieved by attempting to move the instrument down by its
|
|
212
|
+
`pick_up_distance`, in a series of presses. This distance is larger
|
|
213
|
+
than the space available in the tip, so the stepper motor will
|
|
214
|
+
eventually skip steps, which is resolved by homing afterwards. The
|
|
215
|
+
pick up operation is done at a current specified in the pipette config,
|
|
216
|
+
which is experimentally determined to skip steps at a level of force
|
|
217
|
+
sufficient to provide a good seal between the pipette nozzle and tip
|
|
218
|
+
while also avoiding attaching the tip so firmly that it can't be
|
|
219
|
+
dropped later.
|
|
220
|
+
|
|
221
|
+
If ``presses`` or ``increment`` is not specified (or is ``None``),
|
|
222
|
+
their value is taken from the pipette configuration.
|
|
223
|
+
"""
|
|
224
|
+
...
|
|
225
|
+
|
|
226
|
+
async def tip_drop_moves(
|
|
227
|
+
self,
|
|
228
|
+
mount: MountArgType,
|
|
229
|
+
home_after: bool = True,
|
|
230
|
+
ignore_plunger: bool = False,
|
|
231
|
+
scrape_type: TipScrapeType = TipScrapeType.NONE,
|
|
232
|
+
) -> None:
|
|
233
|
+
...
|
|
234
|
+
|
|
235
|
+
async def drop_tip(
|
|
236
|
+
self,
|
|
237
|
+
mount: MountArgType,
|
|
238
|
+
home_after: bool = True,
|
|
239
|
+
) -> None:
|
|
240
|
+
"""
|
|
241
|
+
Drop tip at the current location
|
|
242
|
+
|
|
243
|
+
:param Mount mount: The mount to drop a tip from
|
|
244
|
+
:param bool home_after: Home the plunger motor after dropping tip. This
|
|
245
|
+
is used in case the plunger motor skipped while
|
|
246
|
+
dropping the tip, and is also used to recover
|
|
247
|
+
the ejector shroud after a drop.
|
|
248
|
+
"""
|
|
249
|
+
...
|
|
250
|
+
|
|
251
|
+
async def liquid_probe(
|
|
252
|
+
self,
|
|
253
|
+
mount: MountArgType,
|
|
254
|
+
max_z_dist: float,
|
|
255
|
+
) -> float:
|
|
256
|
+
"""Search for and return liquid level height using this pipette
|
|
257
|
+
at the current location.
|
|
258
|
+
|
|
259
|
+
mount : Mount.LEFT or Mount.RIGHT
|
|
260
|
+
max_z_dist : maximum depth to probe for liquid
|
|
261
|
+
"""
|
|
262
|
+
...
|
|
263
|
+
|
|
264
|
+
async def increase_evo_disp_count(self, mount: MountArgType) -> None:
|
|
265
|
+
"""Tell a pipette to increase it's evo-tip-dispense-count in eeprom."""
|
|
266
|
+
...
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
from typing import List
|
|
2
|
+
from typing_extensions import Protocol
|
|
3
|
+
|
|
4
|
+
from ..modules import AbstractModule, ModuleModel
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class ModuleProvider(Protocol):
|
|
8
|
+
"""A protocol specifying access to modules."""
|
|
9
|
+
|
|
10
|
+
@property
|
|
11
|
+
def attached_modules(self) -> List[AbstractModule]:
|
|
12
|
+
"""Return a list of currently-attached modules."""
|
|
13
|
+
...
|
|
14
|
+
|
|
15
|
+
async def create_simulating_module(self, model: ModuleModel) -> AbstractModule:
|
|
16
|
+
"""Create a simulating module hardware interface."""
|