opentrons 8.6.0__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 +557 -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 +187 -0
- opentrons/drivers/asyncio/communication/errors.py +88 -0
- opentrons/drivers/asyncio/communication/serial_connection.py +557 -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/scripts/update_module_fw.py +274 -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 +276 -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 +1186 -0
- opentrons/motion_planning/__init__.py +32 -0
- opentrons/motion_planning/adjacent_slots_getters.py +168 -0
- opentrons/motion_planning/deck_conflict.py +501 -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 +400 -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 +1027 -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 +1006 -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 +3272 -0
- opentrons/protocol_api/labware.py +1579 -0
- opentrons/protocol_api/module_contexts.py +1447 -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 +339 -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 +350 -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 +68 -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 +1164 -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 +2408 -0
- opentrons/protocol_engine/state/inner_well_math_utils.py +548 -0
- opentrons/protocol_engine/state/labware.py +1432 -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 +1515 -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 +310 -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 +310 -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 +852 -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.0.dist-info/METADATA +37 -0
- opentrons-8.6.0.dist-info/RECORD +601 -0
- opentrons-8.6.0.dist-info/WHEEL +4 -0
- opentrons-8.6.0.dist-info/entry_points.txt +3 -0
- opentrons-8.6.0.dist-info/licenses/LICENSE +202 -0
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
"""ProtocolEngine-based Well core implementations."""
|
|
2
|
+
from typing import Optional, Union
|
|
3
|
+
|
|
4
|
+
from opentrons_shared_data.labware.constants import WELL_NAME_PATTERN
|
|
5
|
+
|
|
6
|
+
from opentrons.types import Point, Mount, MountType
|
|
7
|
+
|
|
8
|
+
from opentrons.protocol_engine import WellLocation, WellOrigin, WellOffset
|
|
9
|
+
from opentrons.protocol_engine import commands as cmd
|
|
10
|
+
from opentrons.protocol_engine.clients import SyncClient as EngineClient
|
|
11
|
+
from opentrons.protocols.api_support.util import UnsupportedAPIError
|
|
12
|
+
from opentrons.protocol_engine.types.liquid_level_detection import (
|
|
13
|
+
SimulatedProbeResult,
|
|
14
|
+
LiquidTrackingType,
|
|
15
|
+
)
|
|
16
|
+
from opentrons.protocol_engine.errors import PipetteNotAttachedError
|
|
17
|
+
|
|
18
|
+
from . import point_calculations
|
|
19
|
+
from . import stringify
|
|
20
|
+
from ..well import AbstractWellCore
|
|
21
|
+
from ..._liquid import Liquid
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class WellCore(AbstractWellCore):
|
|
25
|
+
"""Well API core using a ProtocolEngine.
|
|
26
|
+
|
|
27
|
+
Args:
|
|
28
|
+
name: The well's name in the labware, e.g. `A1`.
|
|
29
|
+
labware_id: The ProtocolEngine ID of the well's parent labware.
|
|
30
|
+
engine_client: Synchronous ProtocolEngine client.
|
|
31
|
+
"""
|
|
32
|
+
|
|
33
|
+
def __init__(self, name: str, labware_id: str, engine_client: EngineClient) -> None:
|
|
34
|
+
self._labware_id = labware_id
|
|
35
|
+
self._engine_client = engine_client
|
|
36
|
+
self._definition = engine_client.state.labware.get_well_definition(
|
|
37
|
+
labware_id=labware_id, well_name=name
|
|
38
|
+
)
|
|
39
|
+
|
|
40
|
+
name_match = WELL_NAME_PATTERN.match(name)
|
|
41
|
+
self._name = name
|
|
42
|
+
self._row_name = name_match.group(1) if name_match is not None else ""
|
|
43
|
+
self._column_name = name_match.group(2) if name_match is not None else ""
|
|
44
|
+
|
|
45
|
+
@property
|
|
46
|
+
def labware_id(self) -> str:
|
|
47
|
+
"""Get the ID of the well's parent labware."""
|
|
48
|
+
return self._labware_id
|
|
49
|
+
|
|
50
|
+
@property
|
|
51
|
+
def diameter(self) -> Optional[float]:
|
|
52
|
+
"""Get the well's diameter, if circular."""
|
|
53
|
+
return (
|
|
54
|
+
self._definition.diameter if self._definition.shape == "circular" else None
|
|
55
|
+
)
|
|
56
|
+
|
|
57
|
+
@property
|
|
58
|
+
def length(self) -> Optional[float]:
|
|
59
|
+
"""Get the well's length, if rectangular."""
|
|
60
|
+
return (
|
|
61
|
+
self._definition.xDimension
|
|
62
|
+
if self._definition.shape == "rectangular"
|
|
63
|
+
else None
|
|
64
|
+
)
|
|
65
|
+
|
|
66
|
+
@property
|
|
67
|
+
def width(self) -> Optional[float]:
|
|
68
|
+
"""Get the well's width, if rectangular."""
|
|
69
|
+
return (
|
|
70
|
+
self._definition.yDimension
|
|
71
|
+
if self._definition.shape == "rectangular"
|
|
72
|
+
else None
|
|
73
|
+
)
|
|
74
|
+
|
|
75
|
+
@property
|
|
76
|
+
def depth(self) -> float:
|
|
77
|
+
"""Get the well's depth."""
|
|
78
|
+
return self._definition.depth
|
|
79
|
+
|
|
80
|
+
def has_tip(self) -> bool:
|
|
81
|
+
"""Whether the well contains a tip."""
|
|
82
|
+
return self._engine_client.state.tips.has_clean_tip(
|
|
83
|
+
self._labware_id, self._name
|
|
84
|
+
)
|
|
85
|
+
|
|
86
|
+
def set_has_tip(self, value: bool) -> None:
|
|
87
|
+
"""Set the well as containing or not containing a tip."""
|
|
88
|
+
raise UnsupportedAPIError(
|
|
89
|
+
api_element="Manually setting the tip state of a well in a tip rack",
|
|
90
|
+
)
|
|
91
|
+
|
|
92
|
+
def get_display_name(self) -> str:
|
|
93
|
+
"""Get the full display name of the well (e.g. "A1 of Some Labware on 5")."""
|
|
94
|
+
return stringify.well(
|
|
95
|
+
engine_client=self._engine_client,
|
|
96
|
+
well_name=self._name,
|
|
97
|
+
labware_id=self._labware_id,
|
|
98
|
+
)
|
|
99
|
+
|
|
100
|
+
def get_name(self) -> str:
|
|
101
|
+
"""Get the name of the well (e.g. "A1")."""
|
|
102
|
+
return self._name
|
|
103
|
+
|
|
104
|
+
def get_column_name(self) -> str:
|
|
105
|
+
"""Get the column portion of the well name (e.g. "1")."""
|
|
106
|
+
return self._column_name
|
|
107
|
+
|
|
108
|
+
def get_row_name(self) -> str:
|
|
109
|
+
"""Get the row portion of the well name (e.g. "A")."""
|
|
110
|
+
return self._row_name
|
|
111
|
+
|
|
112
|
+
def get_max_volume(self) -> float:
|
|
113
|
+
"""Get the well's maximum liquid volume."""
|
|
114
|
+
return self._definition.totalLiquidVolume
|
|
115
|
+
|
|
116
|
+
def get_top(self, z_offset: float) -> Point:
|
|
117
|
+
"""Get the coordinate of the well's top, with a z-offset."""
|
|
118
|
+
return self._engine_client.state.geometry.get_well_position(
|
|
119
|
+
well_name=self._name,
|
|
120
|
+
labware_id=self._labware_id,
|
|
121
|
+
well_location=WellLocation(
|
|
122
|
+
origin=WellOrigin.TOP, offset=WellOffset(x=0, y=0, z=z_offset)
|
|
123
|
+
),
|
|
124
|
+
)
|
|
125
|
+
|
|
126
|
+
def get_bottom(self, z_offset: float) -> Point:
|
|
127
|
+
"""Get the coordinate of the well's bottom, with a z-offset."""
|
|
128
|
+
return self._engine_client.state.geometry.get_well_position(
|
|
129
|
+
well_name=self._name,
|
|
130
|
+
labware_id=self._labware_id,
|
|
131
|
+
well_location=WellLocation(
|
|
132
|
+
origin=WellOrigin.BOTTOM, offset=WellOffset(x=0, y=0, z=z_offset)
|
|
133
|
+
),
|
|
134
|
+
)
|
|
135
|
+
|
|
136
|
+
def get_center(self) -> Point:
|
|
137
|
+
"""Get the coordinate of the well's center."""
|
|
138
|
+
return self._engine_client.state.geometry.get_well_position(
|
|
139
|
+
well_name=self._name,
|
|
140
|
+
labware_id=self._labware_id,
|
|
141
|
+
well_location=WellLocation(origin=WellOrigin.CENTER),
|
|
142
|
+
)
|
|
143
|
+
|
|
144
|
+
def get_meniscus(self) -> Union[Point, SimulatedProbeResult]:
|
|
145
|
+
"""Get the coordinate of the well's meniscus."""
|
|
146
|
+
current_liquid_height = self.current_liquid_height()
|
|
147
|
+
if isinstance(current_liquid_height, float):
|
|
148
|
+
return self.get_bottom(z_offset=current_liquid_height)
|
|
149
|
+
else:
|
|
150
|
+
return current_liquid_height
|
|
151
|
+
|
|
152
|
+
def load_liquid(
|
|
153
|
+
self,
|
|
154
|
+
liquid: Liquid,
|
|
155
|
+
volume: float,
|
|
156
|
+
) -> None:
|
|
157
|
+
"""Load liquid into a well.
|
|
158
|
+
|
|
159
|
+
If the well is known to be empty, use ``load_empty()`` instead of calling this with a 0.0 volume.
|
|
160
|
+
"""
|
|
161
|
+
self._engine_client.execute_command(
|
|
162
|
+
cmd.LoadLiquidParams(
|
|
163
|
+
labwareId=self._labware_id,
|
|
164
|
+
liquidId=liquid._id,
|
|
165
|
+
volumeByWell={self._name: volume},
|
|
166
|
+
)
|
|
167
|
+
)
|
|
168
|
+
|
|
169
|
+
def from_center_cartesian(self, x: float, y: float, z: float) -> Point:
|
|
170
|
+
"""Gets point in deck coordinates based on percentage of the radius of each axis."""
|
|
171
|
+
well_size = self._engine_client.state.labware.get_well_size(
|
|
172
|
+
labware_id=self.labware_id, well_name=self._name
|
|
173
|
+
)
|
|
174
|
+
|
|
175
|
+
return point_calculations.get_relative_offset(
|
|
176
|
+
point=self.get_center(),
|
|
177
|
+
size=well_size,
|
|
178
|
+
x_ratio=x,
|
|
179
|
+
y_ratio=y,
|
|
180
|
+
z_ratio=z,
|
|
181
|
+
)
|
|
182
|
+
|
|
183
|
+
def estimate_liquid_height_after_pipetting(
|
|
184
|
+
self,
|
|
185
|
+
mount: Mount | str,
|
|
186
|
+
operation_volume: float,
|
|
187
|
+
) -> LiquidTrackingType:
|
|
188
|
+
"""Return an estimate of liquid height after pipetting without raising an error."""
|
|
189
|
+
labware_id = self.labware_id
|
|
190
|
+
well_name = self._name
|
|
191
|
+
if isinstance(mount, Mount):
|
|
192
|
+
mount_type = MountType.from_hw_mount(mount)
|
|
193
|
+
else:
|
|
194
|
+
mount_type = MountType(mount)
|
|
195
|
+
pipette_from_mount = self._engine_client.state.pipettes.get_by_mount(mount_type)
|
|
196
|
+
if pipette_from_mount is None:
|
|
197
|
+
raise PipetteNotAttachedError(f"No pipette present on mount {mount}")
|
|
198
|
+
pipette_id = pipette_from_mount.id
|
|
199
|
+
starting_liquid_height = self.current_liquid_height()
|
|
200
|
+
projected_final_height = (
|
|
201
|
+
self._engine_client.state.geometry.get_well_height_after_liquid_handling(
|
|
202
|
+
labware_id=labware_id,
|
|
203
|
+
well_name=well_name,
|
|
204
|
+
pipette_id=pipette_id,
|
|
205
|
+
initial_height=starting_liquid_height,
|
|
206
|
+
volume=operation_volume,
|
|
207
|
+
)
|
|
208
|
+
)
|
|
209
|
+
return projected_final_height
|
|
210
|
+
|
|
211
|
+
def current_liquid_height(self) -> LiquidTrackingType:
|
|
212
|
+
"""Return the current liquid height within a well."""
|
|
213
|
+
labware_id = self.labware_id
|
|
214
|
+
well_name = self._name
|
|
215
|
+
return self._engine_client.state.geometry.get_meniscus_height(
|
|
216
|
+
labware_id=labware_id, well_name=well_name
|
|
217
|
+
)
|
|
218
|
+
|
|
219
|
+
def get_liquid_volume(self) -> LiquidTrackingType:
|
|
220
|
+
"""Return the current volume in a well."""
|
|
221
|
+
labware_id = self.labware_id
|
|
222
|
+
well_name = self._name
|
|
223
|
+
return self._engine_client.state.geometry.get_current_well_volume(
|
|
224
|
+
labware_id=labware_id, well_name=well_name
|
|
225
|
+
)
|
|
226
|
+
|
|
227
|
+
def height_from_volume(self, volume: LiquidTrackingType) -> LiquidTrackingType:
|
|
228
|
+
"""Return the height in a well corresponding to a given volume."""
|
|
229
|
+
labware_id = self.labware_id
|
|
230
|
+
well_name = self._name
|
|
231
|
+
return self._engine_client.state.geometry.get_well_height_at_volume(
|
|
232
|
+
labware_id=labware_id, well_name=well_name, volume=volume
|
|
233
|
+
)
|
|
234
|
+
|
|
235
|
+
def volume_from_height(self, height: LiquidTrackingType) -> LiquidTrackingType:
|
|
236
|
+
"""Return the volume contained in a well at any height."""
|
|
237
|
+
labware_id = self.labware_id
|
|
238
|
+
well_name = self._name
|
|
239
|
+
return self._engine_client.state.geometry.get_well_volume_at_height(
|
|
240
|
+
labware_id=labware_id, well_name=well_name, height=height
|
|
241
|
+
)
|
|
@@ -0,0 +1,459 @@
|
|
|
1
|
+
"""The interface that implements InstrumentContext."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from abc import abstractmethod, ABC
|
|
6
|
+
from typing import Any, Generic, Optional, TypeVar, Union, List, Tuple, Literal
|
|
7
|
+
|
|
8
|
+
from opentrons import types
|
|
9
|
+
from opentrons.hardware_control.dev_types import PipetteDict
|
|
10
|
+
from opentrons.protocols.api_support.util import FlowRates
|
|
11
|
+
from opentrons.protocols.advanced_control.transfers.common import TransferTipPolicyV2
|
|
12
|
+
from opentrons.protocol_api._nozzle_layout import NozzleLayout
|
|
13
|
+
from opentrons.protocol_api._liquid import LiquidClass
|
|
14
|
+
from opentrons.protocol_engine.types import LiquidTrackingType
|
|
15
|
+
|
|
16
|
+
from ..disposal_locations import TrashBin, WasteChute
|
|
17
|
+
from .well import WellCoreType
|
|
18
|
+
from .labware import LabwareCoreType
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class AbstractInstrument(ABC, Generic[WellCoreType, LabwareCoreType]):
|
|
22
|
+
@abstractmethod
|
|
23
|
+
def get_default_speed(self) -> float:
|
|
24
|
+
...
|
|
25
|
+
|
|
26
|
+
@abstractmethod
|
|
27
|
+
def set_default_speed(self, speed: float) -> None:
|
|
28
|
+
...
|
|
29
|
+
|
|
30
|
+
@abstractmethod
|
|
31
|
+
def air_gap_in_place(
|
|
32
|
+
self, volume: float, flow_rate: float, correction_volume: Optional[float] = None
|
|
33
|
+
) -> None:
|
|
34
|
+
"""Aspirate a given volume of air from the current location of the pipette.
|
|
35
|
+
Args:
|
|
36
|
+
volume: The volume of air to aspirate, in microliters.
|
|
37
|
+
flow_rate: The flow rate of air into the pipette, in microliters.
|
|
38
|
+
correction_volume: The correction volume in uL.
|
|
39
|
+
"""
|
|
40
|
+
|
|
41
|
+
@abstractmethod
|
|
42
|
+
def aspirate(
|
|
43
|
+
self,
|
|
44
|
+
location: types.Location,
|
|
45
|
+
well_core: Optional[WellCoreType],
|
|
46
|
+
volume: float,
|
|
47
|
+
rate: float,
|
|
48
|
+
flow_rate: float,
|
|
49
|
+
in_place: bool,
|
|
50
|
+
meniscus_tracking: Optional[types.MeniscusTrackingTarget] = None,
|
|
51
|
+
correction_volume: Optional[float] = None,
|
|
52
|
+
) -> None:
|
|
53
|
+
"""Aspirate a given volume of liquid from the specified location.
|
|
54
|
+
Args:
|
|
55
|
+
volume: The volume of liquid to aspirate, in microliters.
|
|
56
|
+
location: The exact location to aspirate from.
|
|
57
|
+
well_core: The well to aspirate from, if applicable.
|
|
58
|
+
rate: The rate for how quickly to aspirate.
|
|
59
|
+
flow_rate: The flow rate in µL/s to aspirate at.
|
|
60
|
+
in_place: Whether this is in-place.
|
|
61
|
+
meniscus_tracking: Optional data about where to aspirate from.
|
|
62
|
+
correction_volume: The correction volume in uL
|
|
63
|
+
"""
|
|
64
|
+
...
|
|
65
|
+
|
|
66
|
+
@abstractmethod
|
|
67
|
+
def dispense(
|
|
68
|
+
self,
|
|
69
|
+
location: Union[types.Location, TrashBin, WasteChute],
|
|
70
|
+
well_core: Optional[WellCoreType],
|
|
71
|
+
volume: float,
|
|
72
|
+
rate: float,
|
|
73
|
+
flow_rate: float,
|
|
74
|
+
in_place: bool,
|
|
75
|
+
push_out: Optional[float],
|
|
76
|
+
meniscus_tracking: Optional[types.MeniscusTrackingTarget] = None,
|
|
77
|
+
correction_volume: Optional[float] = None,
|
|
78
|
+
) -> None:
|
|
79
|
+
"""Dispense a given volume of liquid into the specified location.
|
|
80
|
+
Args:
|
|
81
|
+
volume: The volume of liquid to dispense, in microliters.
|
|
82
|
+
location: The exact location to dispense to.
|
|
83
|
+
well_core: The well to dispense to, if applicable.
|
|
84
|
+
rate: The rate for how quickly to dispense.
|
|
85
|
+
flow_rate: The flow rate in µL/s to dispense at.
|
|
86
|
+
in_place: Whether this is in-place.
|
|
87
|
+
push_out: The amount to push the plunger below bottom position.
|
|
88
|
+
correction_volume: The correction volume in uL
|
|
89
|
+
meniscus_tracking: Optional data about where to dispense from.
|
|
90
|
+
"""
|
|
91
|
+
...
|
|
92
|
+
|
|
93
|
+
@abstractmethod
|
|
94
|
+
def blow_out(
|
|
95
|
+
self,
|
|
96
|
+
location: Union[types.Location, TrashBin, WasteChute],
|
|
97
|
+
well_core: Optional[WellCoreType],
|
|
98
|
+
in_place: bool,
|
|
99
|
+
) -> None:
|
|
100
|
+
"""Blow liquid out of the tip.
|
|
101
|
+
|
|
102
|
+
Args:
|
|
103
|
+
location: The location to blow out into.
|
|
104
|
+
well_core: The well to blow out into.
|
|
105
|
+
in_place: Whether this is in-place.
|
|
106
|
+
"""
|
|
107
|
+
...
|
|
108
|
+
|
|
109
|
+
@abstractmethod
|
|
110
|
+
def touch_tip(
|
|
111
|
+
self,
|
|
112
|
+
location: types.Location,
|
|
113
|
+
well_core: WellCoreType,
|
|
114
|
+
radius: float,
|
|
115
|
+
z_offset: float,
|
|
116
|
+
speed: float,
|
|
117
|
+
mm_from_edge: Optional[float] = None,
|
|
118
|
+
) -> None:
|
|
119
|
+
...
|
|
120
|
+
|
|
121
|
+
@abstractmethod
|
|
122
|
+
def pick_up_tip(
|
|
123
|
+
self,
|
|
124
|
+
location: types.Location,
|
|
125
|
+
well_core: WellCoreType,
|
|
126
|
+
presses: Optional[int],
|
|
127
|
+
increment: Optional[float],
|
|
128
|
+
prep_after: bool = True,
|
|
129
|
+
) -> None:
|
|
130
|
+
"""Move to and pick up a tip from a given well.
|
|
131
|
+
|
|
132
|
+
Args:
|
|
133
|
+
location: The location of the well we're picking up from.
|
|
134
|
+
well_core: The well to pick up from.
|
|
135
|
+
presses: Customize the number of presses the pipette does.
|
|
136
|
+
increment: Customize the movement "distance" of the pipette to press harder.
|
|
137
|
+
prep_after: Move plunger to the "ready to aspirate" position after pick up.
|
|
138
|
+
"""
|
|
139
|
+
...
|
|
140
|
+
|
|
141
|
+
@abstractmethod
|
|
142
|
+
def drop_tip(
|
|
143
|
+
self,
|
|
144
|
+
location: Optional[types.Location],
|
|
145
|
+
well_core: WellCoreType,
|
|
146
|
+
home_after: Optional[bool],
|
|
147
|
+
alternate_drop_location: Optional[bool] = False,
|
|
148
|
+
) -> None:
|
|
149
|
+
"""Move to and drop a tip into a given well.
|
|
150
|
+
|
|
151
|
+
Args:
|
|
152
|
+
location: The location of the well we're dropping to.
|
|
153
|
+
If unspecified, the default drop location of the well will be used.
|
|
154
|
+
well_core: The well we're dropping into
|
|
155
|
+
home_after: Whether to home the pipette after the tip is dropped.
|
|
156
|
+
alternate_drop_location: Whether to randomize the exact location to drop tip
|
|
157
|
+
within the specified well.
|
|
158
|
+
"""
|
|
159
|
+
...
|
|
160
|
+
|
|
161
|
+
@abstractmethod
|
|
162
|
+
def drop_tip_in_disposal_location(
|
|
163
|
+
self,
|
|
164
|
+
disposal_location: Union[TrashBin, WasteChute],
|
|
165
|
+
home_after: Optional[bool],
|
|
166
|
+
alternate_tip_drop: bool = False,
|
|
167
|
+
) -> None:
|
|
168
|
+
"""Move to and drop tip into a TrashBin or WasteChute.
|
|
169
|
+
|
|
170
|
+
Args:
|
|
171
|
+
disposal_location: The disposal location object we're dropping to.
|
|
172
|
+
home_after: Whether to home the pipette after the tip is dropped.
|
|
173
|
+
alternate_tip_drop: Whether to alternate tip drop location in a trash bin.
|
|
174
|
+
"""
|
|
175
|
+
...
|
|
176
|
+
|
|
177
|
+
@abstractmethod
|
|
178
|
+
def home(self) -> None:
|
|
179
|
+
...
|
|
180
|
+
|
|
181
|
+
@abstractmethod
|
|
182
|
+
def home_plunger(self) -> None:
|
|
183
|
+
...
|
|
184
|
+
|
|
185
|
+
@abstractmethod
|
|
186
|
+
def move_to(
|
|
187
|
+
self,
|
|
188
|
+
location: Union[types.Location, TrashBin, WasteChute],
|
|
189
|
+
well_core: Optional[WellCoreType],
|
|
190
|
+
force_direct: bool,
|
|
191
|
+
minimum_z_height: Optional[float],
|
|
192
|
+
speed: Optional[float],
|
|
193
|
+
check_for_movement_conflicts: bool,
|
|
194
|
+
) -> None:
|
|
195
|
+
...
|
|
196
|
+
|
|
197
|
+
@abstractmethod
|
|
198
|
+
def resin_tip_seal(
|
|
199
|
+
self,
|
|
200
|
+
location: types.Location,
|
|
201
|
+
well_core: WellCoreType,
|
|
202
|
+
in_place: Optional[bool] = False,
|
|
203
|
+
) -> None:
|
|
204
|
+
...
|
|
205
|
+
|
|
206
|
+
@abstractmethod
|
|
207
|
+
def resin_tip_unseal(
|
|
208
|
+
self,
|
|
209
|
+
location: types.Location | None,
|
|
210
|
+
well_core: WellCoreType,
|
|
211
|
+
) -> None:
|
|
212
|
+
...
|
|
213
|
+
|
|
214
|
+
@abstractmethod
|
|
215
|
+
def resin_tip_dispense(
|
|
216
|
+
self,
|
|
217
|
+
location: types.Location,
|
|
218
|
+
well_core: WellCoreType,
|
|
219
|
+
volume: Optional[float] = None,
|
|
220
|
+
flow_rate: Optional[float] = None,
|
|
221
|
+
) -> None:
|
|
222
|
+
...
|
|
223
|
+
|
|
224
|
+
@abstractmethod
|
|
225
|
+
def get_mount(self) -> types.Mount:
|
|
226
|
+
...
|
|
227
|
+
|
|
228
|
+
@abstractmethod
|
|
229
|
+
def get_pipette_name(self) -> str:
|
|
230
|
+
...
|
|
231
|
+
|
|
232
|
+
@abstractmethod
|
|
233
|
+
def get_model(self) -> str:
|
|
234
|
+
...
|
|
235
|
+
|
|
236
|
+
@abstractmethod
|
|
237
|
+
def get_display_name(self) -> str:
|
|
238
|
+
...
|
|
239
|
+
|
|
240
|
+
@abstractmethod
|
|
241
|
+
def get_min_volume(self) -> float:
|
|
242
|
+
...
|
|
243
|
+
|
|
244
|
+
@abstractmethod
|
|
245
|
+
def get_max_volume(self) -> float:
|
|
246
|
+
...
|
|
247
|
+
|
|
248
|
+
@abstractmethod
|
|
249
|
+
def get_working_volume(self) -> float:
|
|
250
|
+
...
|
|
251
|
+
|
|
252
|
+
@abstractmethod
|
|
253
|
+
def get_current_volume(self) -> float:
|
|
254
|
+
...
|
|
255
|
+
|
|
256
|
+
@abstractmethod
|
|
257
|
+
def get_has_clean_tip(self) -> bool:
|
|
258
|
+
...
|
|
259
|
+
|
|
260
|
+
@abstractmethod
|
|
261
|
+
def get_available_volume(self) -> float:
|
|
262
|
+
...
|
|
263
|
+
|
|
264
|
+
@abstractmethod
|
|
265
|
+
def get_minimum_liquid_sense_height(self) -> float:
|
|
266
|
+
...
|
|
267
|
+
|
|
268
|
+
@abstractmethod
|
|
269
|
+
def get_hardware_state(self) -> PipetteDict:
|
|
270
|
+
"""Get the current state of the pipette hardware as a dictionary."""
|
|
271
|
+
...
|
|
272
|
+
|
|
273
|
+
@abstractmethod
|
|
274
|
+
def get_channels(self) -> int:
|
|
275
|
+
...
|
|
276
|
+
|
|
277
|
+
@abstractmethod
|
|
278
|
+
def get_active_channels(self) -> int:
|
|
279
|
+
...
|
|
280
|
+
|
|
281
|
+
@abstractmethod
|
|
282
|
+
def get_nozzle_map(self) -> types.NozzleMapInterface:
|
|
283
|
+
...
|
|
284
|
+
|
|
285
|
+
@abstractmethod
|
|
286
|
+
def has_tip(self) -> bool:
|
|
287
|
+
...
|
|
288
|
+
|
|
289
|
+
@abstractmethod
|
|
290
|
+
def get_return_height(self) -> float:
|
|
291
|
+
...
|
|
292
|
+
|
|
293
|
+
@abstractmethod
|
|
294
|
+
def get_flow_rate(self) -> FlowRates:
|
|
295
|
+
...
|
|
296
|
+
|
|
297
|
+
@abstractmethod
|
|
298
|
+
def get_aspirate_flow_rate(self, rate: float = 1.0) -> float:
|
|
299
|
+
...
|
|
300
|
+
|
|
301
|
+
@abstractmethod
|
|
302
|
+
def get_dispense_flow_rate(self, rate: float = 1.0) -> float:
|
|
303
|
+
...
|
|
304
|
+
|
|
305
|
+
@abstractmethod
|
|
306
|
+
def get_blow_out_flow_rate(self, rate: float = 1.0) -> float:
|
|
307
|
+
...
|
|
308
|
+
|
|
309
|
+
@abstractmethod
|
|
310
|
+
def get_liquid_presence_detection(self) -> bool:
|
|
311
|
+
...
|
|
312
|
+
|
|
313
|
+
@abstractmethod
|
|
314
|
+
def get_tip_origin(
|
|
315
|
+
self,
|
|
316
|
+
) -> Optional[Tuple[LabwareCoreType, WellCoreType]]:
|
|
317
|
+
...
|
|
318
|
+
|
|
319
|
+
@abstractmethod
|
|
320
|
+
def _pressure_supported_by_pipette(self) -> bool:
|
|
321
|
+
...
|
|
322
|
+
|
|
323
|
+
@abstractmethod
|
|
324
|
+
def set_liquid_presence_detection(self, enable: bool) -> None:
|
|
325
|
+
...
|
|
326
|
+
|
|
327
|
+
@abstractmethod
|
|
328
|
+
def set_flow_rate(
|
|
329
|
+
self,
|
|
330
|
+
aspirate: Optional[float] = None,
|
|
331
|
+
dispense: Optional[float] = None,
|
|
332
|
+
blow_out: Optional[float] = None,
|
|
333
|
+
) -> None:
|
|
334
|
+
...
|
|
335
|
+
|
|
336
|
+
@abstractmethod
|
|
337
|
+
def configure_for_volume(self, volume: float) -> None:
|
|
338
|
+
"""Configure the pipette for a specific volume.
|
|
339
|
+
|
|
340
|
+
Args:
|
|
341
|
+
volume: The volume to prepare to handle.
|
|
342
|
+
"""
|
|
343
|
+
...
|
|
344
|
+
|
|
345
|
+
@abstractmethod
|
|
346
|
+
def prepare_to_aspirate(self) -> None:
|
|
347
|
+
"""Prepare the pipette to aspirate."""
|
|
348
|
+
...
|
|
349
|
+
|
|
350
|
+
@abstractmethod
|
|
351
|
+
def configure_nozzle_layout(
|
|
352
|
+
self,
|
|
353
|
+
style: NozzleLayout,
|
|
354
|
+
primary_nozzle: Optional[str],
|
|
355
|
+
front_right_nozzle: Optional[str],
|
|
356
|
+
back_left_nozzle: Optional[str],
|
|
357
|
+
) -> None:
|
|
358
|
+
"""Configure the pipette to a specific nozzle layout.
|
|
359
|
+
|
|
360
|
+
Args:
|
|
361
|
+
style: The type of configuration you wish to build.
|
|
362
|
+
primary_nozzle: The nozzle that will determine a pipette's critical point.
|
|
363
|
+
front_right_nozzle: The front right most nozzle in the requested layout.
|
|
364
|
+
back_left_nozzle: The back left most nozzle in the requested layout.
|
|
365
|
+
"""
|
|
366
|
+
...
|
|
367
|
+
|
|
368
|
+
@abstractmethod
|
|
369
|
+
def transfer_with_liquid_class(
|
|
370
|
+
self,
|
|
371
|
+
liquid_class: LiquidClass,
|
|
372
|
+
volume: float,
|
|
373
|
+
source: List[Tuple[types.Location, WellCoreType]],
|
|
374
|
+
dest: Union[List[Tuple[types.Location, WellCoreType]], TrashBin, WasteChute],
|
|
375
|
+
new_tip: TransferTipPolicyV2,
|
|
376
|
+
tip_racks: List[Tuple[types.Location, LabwareCoreType]],
|
|
377
|
+
starting_tip: Optional[WellCoreType],
|
|
378
|
+
trash_location: Union[types.Location, TrashBin, WasteChute],
|
|
379
|
+
return_tip: bool,
|
|
380
|
+
keep_last_tip: bool,
|
|
381
|
+
) -> None:
|
|
382
|
+
"""Transfer a liquid from source to dest according to liquid class properties."""
|
|
383
|
+
...
|
|
384
|
+
|
|
385
|
+
@abstractmethod
|
|
386
|
+
def distribute_with_liquid_class(
|
|
387
|
+
self,
|
|
388
|
+
liquid_class: LiquidClass,
|
|
389
|
+
volume: float,
|
|
390
|
+
source: Tuple[types.Location, WellCoreType],
|
|
391
|
+
dest: List[Tuple[types.Location, WellCoreType]],
|
|
392
|
+
new_tip: Literal[TransferTipPolicyV2.NEVER, TransferTipPolicyV2.ONCE],
|
|
393
|
+
tip_racks: List[Tuple[types.Location, LabwareCoreType]],
|
|
394
|
+
starting_tip: Optional[WellCoreType],
|
|
395
|
+
trash_location: Union[types.Location, TrashBin, WasteChute],
|
|
396
|
+
return_tip: bool,
|
|
397
|
+
keep_last_tip: bool,
|
|
398
|
+
) -> None:
|
|
399
|
+
"""
|
|
400
|
+
Distribute a liquid from single source to multiple destinations
|
|
401
|
+
according to liquid class properties.
|
|
402
|
+
"""
|
|
403
|
+
...
|
|
404
|
+
|
|
405
|
+
@abstractmethod
|
|
406
|
+
def consolidate_with_liquid_class(
|
|
407
|
+
self,
|
|
408
|
+
liquid_class: LiquidClass,
|
|
409
|
+
volume: float,
|
|
410
|
+
source: List[Tuple[types.Location, WellCoreType]],
|
|
411
|
+
dest: Union[Tuple[types.Location, WellCoreType], TrashBin, WasteChute],
|
|
412
|
+
new_tip: Literal[TransferTipPolicyV2.NEVER, TransferTipPolicyV2.ONCE],
|
|
413
|
+
tip_racks: List[Tuple[types.Location, LabwareCoreType]],
|
|
414
|
+
starting_tip: Optional[WellCoreType],
|
|
415
|
+
trash_location: Union[types.Location, TrashBin, WasteChute],
|
|
416
|
+
return_tip: bool,
|
|
417
|
+
keep_last_tip: bool,
|
|
418
|
+
) -> None:
|
|
419
|
+
"""
|
|
420
|
+
Consolidate liquid from multiple sources to a single destination
|
|
421
|
+
using the specified liquid class properties.
|
|
422
|
+
"""
|
|
423
|
+
...
|
|
424
|
+
|
|
425
|
+
@abstractmethod
|
|
426
|
+
def is_tip_tracking_available(self) -> bool:
|
|
427
|
+
"""Return whether auto tip tracking is available for the pipette's current nozzle configuration."""
|
|
428
|
+
|
|
429
|
+
@abstractmethod
|
|
430
|
+
def retract(self) -> None:
|
|
431
|
+
"""Retract this instrument to the top of the gantry."""
|
|
432
|
+
...
|
|
433
|
+
|
|
434
|
+
@abstractmethod
|
|
435
|
+
def detect_liquid_presence(
|
|
436
|
+
self, well_core: WellCoreType, loc: types.Location
|
|
437
|
+
) -> bool:
|
|
438
|
+
"""Do a liquid probe to detect whether there is liquid in the well."""
|
|
439
|
+
|
|
440
|
+
@abstractmethod
|
|
441
|
+
def liquid_probe_with_recovery(
|
|
442
|
+
self, well_core: WellCoreType, loc: types.Location
|
|
443
|
+
) -> None:
|
|
444
|
+
"""Do a liquid probe to detect the presence of liquid in the well."""
|
|
445
|
+
...
|
|
446
|
+
|
|
447
|
+
@abstractmethod
|
|
448
|
+
def liquid_probe_without_recovery(
|
|
449
|
+
self, well_core: WellCoreType, loc: types.Location
|
|
450
|
+
) -> LiquidTrackingType:
|
|
451
|
+
"""Do a liquid probe to find the level of the liquid in the well."""
|
|
452
|
+
...
|
|
453
|
+
|
|
454
|
+
@abstractmethod
|
|
455
|
+
def nozzle_configuration_valid_for_lld(self) -> bool:
|
|
456
|
+
"""Check if the nozzle configuration currently supports LLD."""
|
|
457
|
+
|
|
458
|
+
|
|
459
|
+
InstrumentCoreType = TypeVar("InstrumentCoreType", bound=AbstractInstrument[Any, Any])
|