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,709 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import logging
|
|
4
|
+
from typing import TYPE_CHECKING, Optional, Union, List, Tuple, Literal
|
|
5
|
+
|
|
6
|
+
from opentrons import types
|
|
7
|
+
from opentrons.hardware_control import CriticalPoint
|
|
8
|
+
from opentrons.hardware_control.dev_types import PipetteDict
|
|
9
|
+
from opentrons.protocol_api.core.common import WellCore
|
|
10
|
+
from opentrons.protocols.advanced_control.transfers.common import TransferTipPolicyV2
|
|
11
|
+
from opentrons.protocols.api_support import instrument as instrument_support
|
|
12
|
+
from opentrons.protocols.api_support.definitions import MAX_SUPPORTED_VERSION
|
|
13
|
+
from opentrons.protocols.api_support.labware_like import LabwareLike
|
|
14
|
+
from opentrons.protocols.api_support.types import APIVersion
|
|
15
|
+
from opentrons.protocols.api_support.util import (
|
|
16
|
+
build_edges,
|
|
17
|
+
FlowRates,
|
|
18
|
+
PlungerSpeeds,
|
|
19
|
+
APIVersionError,
|
|
20
|
+
)
|
|
21
|
+
from opentrons.protocols.geometry import planning
|
|
22
|
+
from opentrons.protocol_api._nozzle_layout import NozzleLayout
|
|
23
|
+
from opentrons.protocol_api._liquid import LiquidClass
|
|
24
|
+
|
|
25
|
+
from opentrons.protocol_engine.types import LiquidTrackingType
|
|
26
|
+
|
|
27
|
+
from ...disposal_locations import TrashBin, WasteChute
|
|
28
|
+
from ..instrument import AbstractInstrument
|
|
29
|
+
from .legacy_well_core import LegacyWellCore
|
|
30
|
+
from .legacy_labware_core import LegacyLabwareCore
|
|
31
|
+
from .legacy_module_core import LegacyThermocyclerCore, LegacyHeaterShakerCore
|
|
32
|
+
|
|
33
|
+
if TYPE_CHECKING:
|
|
34
|
+
from .legacy_protocol_core import LegacyProtocolCore
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
_log = logging.getLogger()
|
|
38
|
+
|
|
39
|
+
_PRE_2_2_TIP_DROP_HEIGHT_MM = 10
|
|
40
|
+
"""In PAPIv2.1 and below, tips are always dropped 10 mm from the bottom of the well."""
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
class LegacyInstrumentCore(AbstractInstrument[LegacyWellCore, LegacyLabwareCore]):
|
|
44
|
+
"""Implementation of the InstrumentContext interface."""
|
|
45
|
+
|
|
46
|
+
def __init__(
|
|
47
|
+
self,
|
|
48
|
+
protocol_interface: LegacyProtocolCore,
|
|
49
|
+
mount: types.Mount,
|
|
50
|
+
instrument_name: str,
|
|
51
|
+
default_speed: float,
|
|
52
|
+
api_version: Optional[APIVersion] = None,
|
|
53
|
+
):
|
|
54
|
+
self._api_version = api_version or MAX_SUPPORTED_VERSION
|
|
55
|
+
self._protocol_interface = protocol_interface
|
|
56
|
+
self._mount = mount
|
|
57
|
+
self._instrument_name = instrument_name
|
|
58
|
+
self._default_speed = default_speed
|
|
59
|
+
self._speeds = PlungerSpeeds(self)
|
|
60
|
+
|
|
61
|
+
pipette_state = self.get_hardware_state()
|
|
62
|
+
self._flow_rates = FlowRates(self)
|
|
63
|
+
self._flow_rates.set_defaults(
|
|
64
|
+
aspirate_defaults=pipette_state["default_aspirate_flow_rates"],
|
|
65
|
+
dispense_defaults=pipette_state["default_dispense_flow_rates"],
|
|
66
|
+
blow_out_defaults=pipette_state["default_blow_out_flow_rates"],
|
|
67
|
+
api_level=self._api_version,
|
|
68
|
+
)
|
|
69
|
+
self._liquid_presence_detection = False
|
|
70
|
+
self._last_tip_rack_and_well: Optional[
|
|
71
|
+
Tuple[LegacyLabwareCore, LegacyWellCore]
|
|
72
|
+
] = None
|
|
73
|
+
|
|
74
|
+
def get_default_speed(self) -> float:
|
|
75
|
+
"""Gets the speed at which the robot's gantry moves."""
|
|
76
|
+
return self._default_speed
|
|
77
|
+
|
|
78
|
+
def set_default_speed(self, speed: float) -> None:
|
|
79
|
+
"""Sets the speed at which the robot's gantry moves."""
|
|
80
|
+
self._default_speed = speed
|
|
81
|
+
|
|
82
|
+
def air_gap_in_place(
|
|
83
|
+
self, volume: float, flow_rate: float, correction_volume: Optional[float] = None
|
|
84
|
+
) -> None:
|
|
85
|
+
assert False, "Air gap tracking only available in API version 2.22 and later"
|
|
86
|
+
|
|
87
|
+
def aspirate(
|
|
88
|
+
self,
|
|
89
|
+
location: types.Location,
|
|
90
|
+
well_core: Optional[LegacyWellCore],
|
|
91
|
+
volume: float,
|
|
92
|
+
rate: float,
|
|
93
|
+
flow_rate: float,
|
|
94
|
+
in_place: bool,
|
|
95
|
+
meniscus_tracking: Optional[types.MeniscusTrackingTarget] = None,
|
|
96
|
+
correction_volume: Optional[float] = None,
|
|
97
|
+
) -> None:
|
|
98
|
+
"""Aspirate a given volume of liquid from the specified location.
|
|
99
|
+
Args:
|
|
100
|
+
volume: The volume of liquid to aspirate, in microliters.
|
|
101
|
+
location: The exact location to aspirate from.
|
|
102
|
+
well_core: The well to aspirate from, if applicable.
|
|
103
|
+
rate: The rate in µL/s to aspirate at.
|
|
104
|
+
flow_rate: Not used in this core.
|
|
105
|
+
in_place: Whether we should move_to location.
|
|
106
|
+
correction_volume: Not used in this core
|
|
107
|
+
meniscus_tracking: Optional data about where to aspirate from.
|
|
108
|
+
"""
|
|
109
|
+
if self.get_current_volume() == 0:
|
|
110
|
+
# Make sure we're at the top of the labware and clear of any
|
|
111
|
+
# liquid to prepare the pipette for aspiration
|
|
112
|
+
if self._api_version < APIVersion(2, 3) or not self.is_ready_to_aspirate():
|
|
113
|
+
if location.labware.is_well:
|
|
114
|
+
self.move_to(location=location.labware.as_well().top())
|
|
115
|
+
else:
|
|
116
|
+
# TODO(seth,2019/7/29): This should be a warning exposed
|
|
117
|
+
# via rpc to the runapp
|
|
118
|
+
_log.warning(
|
|
119
|
+
"When aspirate is called on something other than a "
|
|
120
|
+
"well relative position, we can't move to the top of"
|
|
121
|
+
" the well to prepare for aspiration. This might "
|
|
122
|
+
"cause over aspiration if the previous command is a "
|
|
123
|
+
"blow_out."
|
|
124
|
+
)
|
|
125
|
+
self.prepare_to_aspirate()
|
|
126
|
+
self.move_to(location=location)
|
|
127
|
+
elif not in_place:
|
|
128
|
+
self.move_to(location=location)
|
|
129
|
+
|
|
130
|
+
self._protocol_interface.get_hardware().aspirate(self._mount, volume, rate)
|
|
131
|
+
|
|
132
|
+
def dispense(
|
|
133
|
+
self,
|
|
134
|
+
location: Union[types.Location, TrashBin, WasteChute],
|
|
135
|
+
well_core: Optional[LegacyWellCore],
|
|
136
|
+
volume: float,
|
|
137
|
+
rate: float,
|
|
138
|
+
flow_rate: float,
|
|
139
|
+
in_place: bool,
|
|
140
|
+
push_out: Optional[float],
|
|
141
|
+
meniscus_tracking: Optional[types.MeniscusTrackingTarget] = None,
|
|
142
|
+
correction_volume: Optional[float] = None,
|
|
143
|
+
) -> None:
|
|
144
|
+
"""Dispense a given volume of liquid into the specified location.
|
|
145
|
+
Args:
|
|
146
|
+
volume: The volume of liquid to dispense, in microliters.
|
|
147
|
+
location: The exact location to dispense to.
|
|
148
|
+
well_core: The well to dispense to, if applicable.
|
|
149
|
+
rate: The rate in µL/s to dispense at.
|
|
150
|
+
flow_rate: Not used in this core.
|
|
151
|
+
in_place: Whether we should move_to location.
|
|
152
|
+
correction_volume: Not used in this core.
|
|
153
|
+
push_out: The amount to push the plunger below bottom position.
|
|
154
|
+
meniscus_tracking: Optional data about where to dispense from.
|
|
155
|
+
"""
|
|
156
|
+
if isinstance(location, (TrashBin, WasteChute)):
|
|
157
|
+
raise APIVersionError(
|
|
158
|
+
api_element="Dispense in Moveable Trash or Waste Chute"
|
|
159
|
+
)
|
|
160
|
+
if push_out:
|
|
161
|
+
raise APIVersionError(api_element="push_out")
|
|
162
|
+
if not in_place:
|
|
163
|
+
self.move_to(location=location)
|
|
164
|
+
|
|
165
|
+
self._protocol_interface.get_hardware().dispense(self._mount, volume, rate)
|
|
166
|
+
|
|
167
|
+
def blow_out(
|
|
168
|
+
self,
|
|
169
|
+
location: Union[types.Location, TrashBin, WasteChute],
|
|
170
|
+
well_core: Optional[LegacyWellCore],
|
|
171
|
+
in_place: bool,
|
|
172
|
+
) -> None:
|
|
173
|
+
"""Blow liquid out of the tip.
|
|
174
|
+
|
|
175
|
+
Args:
|
|
176
|
+
location: The location to blow out into.
|
|
177
|
+
well_core: Unused by legacy core.
|
|
178
|
+
in_place: Whether we should move_to location.
|
|
179
|
+
"""
|
|
180
|
+
if isinstance(location, (TrashBin, WasteChute)):
|
|
181
|
+
raise APIVersionError(
|
|
182
|
+
api_element="Blow Out in Moveable Trash or Waste Chute"
|
|
183
|
+
)
|
|
184
|
+
|
|
185
|
+
if not in_place:
|
|
186
|
+
self.move_to(location=location)
|
|
187
|
+
self._protocol_interface.get_hardware().blow_out(self._mount)
|
|
188
|
+
|
|
189
|
+
def touch_tip(
|
|
190
|
+
self,
|
|
191
|
+
location: types.Location,
|
|
192
|
+
well_core: LegacyWellCore,
|
|
193
|
+
radius: float,
|
|
194
|
+
z_offset: float,
|
|
195
|
+
speed: float,
|
|
196
|
+
mm_from_edge: Optional[float] = None,
|
|
197
|
+
) -> None:
|
|
198
|
+
"""
|
|
199
|
+
Touch the pipette tip to the sides of a well, with the intent of
|
|
200
|
+
removing left-over droplets
|
|
201
|
+
"""
|
|
202
|
+
if mm_from_edge is not None:
|
|
203
|
+
raise APIVersionError(api_element="mm_from_edge argument")
|
|
204
|
+
# TODO al 20201110 - build_edges relies on where being a Well. This is
|
|
205
|
+
# an unpleasant compromise until refactoring build_edges to support
|
|
206
|
+
# LegacyWellCore.
|
|
207
|
+
# Also, build_edges should not require api_version.
|
|
208
|
+
from opentrons.protocol_api.labware import Labware, Well
|
|
209
|
+
|
|
210
|
+
self.move_to(location=location)
|
|
211
|
+
|
|
212
|
+
edges = build_edges(
|
|
213
|
+
where=Well(
|
|
214
|
+
parent=Labware(
|
|
215
|
+
core=well_core.geometry.parent,
|
|
216
|
+
api_version=self._api_version,
|
|
217
|
+
protocol_core=None, # type: ignore[arg-type]
|
|
218
|
+
core_map=None, # type: ignore[arg-type]
|
|
219
|
+
),
|
|
220
|
+
core=well_core,
|
|
221
|
+
api_version=self._api_version,
|
|
222
|
+
),
|
|
223
|
+
offset=z_offset,
|
|
224
|
+
mount=self._mount,
|
|
225
|
+
deck=self._protocol_interface.get_deck(),
|
|
226
|
+
radius=radius,
|
|
227
|
+
version=self._api_version,
|
|
228
|
+
)
|
|
229
|
+
for edge in edges:
|
|
230
|
+
self._protocol_interface.get_hardware().move_to(self._mount, edge, speed)
|
|
231
|
+
|
|
232
|
+
def pick_up_tip(
|
|
233
|
+
self,
|
|
234
|
+
location: types.Location,
|
|
235
|
+
well_core: LegacyWellCore,
|
|
236
|
+
presses: Optional[int],
|
|
237
|
+
increment: Optional[float],
|
|
238
|
+
prep_after: bool = True,
|
|
239
|
+
) -> None:
|
|
240
|
+
"""Pick up a tip for the pipette to run liquid-handling commands."""
|
|
241
|
+
hw = self._protocol_interface.get_hardware()
|
|
242
|
+
geometry = well_core.geometry
|
|
243
|
+
tip_rack_core = geometry.parent
|
|
244
|
+
tip_length = instrument_support.tip_length_for(
|
|
245
|
+
pipette=self.get_hardware_state(),
|
|
246
|
+
tip_rack_definition=tip_rack_core.get_definition(),
|
|
247
|
+
)
|
|
248
|
+
|
|
249
|
+
self.move_to(location=location, well_core=well_core)
|
|
250
|
+
hw.set_current_tiprack_diameter(self._mount, geometry.diameter)
|
|
251
|
+
hw.pick_up_tip(self._mount, tip_length, presses, increment, prep_after)
|
|
252
|
+
hw.set_working_volume(self._mount, geometry.max_volume)
|
|
253
|
+
tip_rack_core.get_tip_tracker().use_tips(
|
|
254
|
+
start_well=well_core,
|
|
255
|
+
num_channels=self.get_channels(),
|
|
256
|
+
fail_if_full=self._api_version < APIVersion(2, 2),
|
|
257
|
+
)
|
|
258
|
+
self._last_tip_rack_and_well = tip_rack_core, well_core
|
|
259
|
+
|
|
260
|
+
def drop_tip(
|
|
261
|
+
self,
|
|
262
|
+
location: Optional[types.Location],
|
|
263
|
+
well_core: LegacyWellCore,
|
|
264
|
+
home_after: Optional[bool],
|
|
265
|
+
alternate_drop_location: Optional[bool] = False,
|
|
266
|
+
) -> None:
|
|
267
|
+
"""Move to and drop a tip into a given well.
|
|
268
|
+
|
|
269
|
+
Args:
|
|
270
|
+
location: An absolute location to drop the tip at.
|
|
271
|
+
If unspecified, use the default drop height of the well.
|
|
272
|
+
well_core: The well we're dropping into
|
|
273
|
+
home_after: Whether to home the pipette after the tip is dropped.
|
|
274
|
+
"""
|
|
275
|
+
if alternate_drop_location:
|
|
276
|
+
raise APIVersionError(api_element="Tip drop randomization")
|
|
277
|
+
labware_core = well_core.geometry.parent
|
|
278
|
+
|
|
279
|
+
if location is None:
|
|
280
|
+
from opentrons.protocol_api.labware import Labware, Well
|
|
281
|
+
|
|
282
|
+
labware = Labware(
|
|
283
|
+
core=labware_core,
|
|
284
|
+
api_version=self._api_version,
|
|
285
|
+
protocol_core=None, # type: ignore[arg-type]
|
|
286
|
+
core_map=None, # type: ignore[arg-type]
|
|
287
|
+
)
|
|
288
|
+
well = Well(parent=labware, core=well_core, api_version=self._api_version)
|
|
289
|
+
|
|
290
|
+
if LabwareLike(labware).is_fixed_trash():
|
|
291
|
+
location = well.top()
|
|
292
|
+
elif self._api_version < APIVersion(2, 2):
|
|
293
|
+
location = well.bottom(z=_PRE_2_2_TIP_DROP_HEIGHT_MM)
|
|
294
|
+
else:
|
|
295
|
+
assert (
|
|
296
|
+
labware_core.is_tip_rack()
|
|
297
|
+
), "Expected tip drop target to be a tip rack."
|
|
298
|
+
|
|
299
|
+
return_height = self.get_return_height()
|
|
300
|
+
location = well.top(z=-return_height * labware_core.get_tip_length())
|
|
301
|
+
|
|
302
|
+
hw = self._protocol_interface.get_hardware()
|
|
303
|
+
self.move_to(location=location)
|
|
304
|
+
hw.drop_tip(self._mount, home_after=True if home_after is None else home_after)
|
|
305
|
+
self._last_tip_rack_and_well = None
|
|
306
|
+
|
|
307
|
+
if self._api_version < APIVersion(2, 2) and labware_core.is_tip_rack():
|
|
308
|
+
# If this is a tiprack we can try and add the dirty tip back to the tracker
|
|
309
|
+
try:
|
|
310
|
+
labware_core.get_tip_tracker().return_tips(
|
|
311
|
+
start_well=well_core,
|
|
312
|
+
num_channels=self.get_channels(),
|
|
313
|
+
)
|
|
314
|
+
except AssertionError:
|
|
315
|
+
# Similarly to :py:meth:`return_tips`, the failure case here
|
|
316
|
+
# just means the tip can't be reused, so don't actually stop
|
|
317
|
+
# the protocol
|
|
318
|
+
_log.warning(
|
|
319
|
+
f"Could not return tip to {labware_core.get_display_name()}"
|
|
320
|
+
)
|
|
321
|
+
|
|
322
|
+
def drop_tip_in_disposal_location(
|
|
323
|
+
self,
|
|
324
|
+
disposal_location: Union[TrashBin, WasteChute],
|
|
325
|
+
home_after: Optional[bool],
|
|
326
|
+
alternate_tip_drop: bool = False,
|
|
327
|
+
) -> None:
|
|
328
|
+
raise APIVersionError(api_element="Dropping tips in a trash bin or waste chute")
|
|
329
|
+
|
|
330
|
+
def resin_tip_seal(
|
|
331
|
+
self,
|
|
332
|
+
location: types.Location,
|
|
333
|
+
well_core: WellCore,
|
|
334
|
+
in_place: Optional[bool] = False,
|
|
335
|
+
) -> None:
|
|
336
|
+
raise APIVersionError(api_element="Sealing resin tips.")
|
|
337
|
+
|
|
338
|
+
def resin_tip_unseal(
|
|
339
|
+
self,
|
|
340
|
+
location: types.Location | None,
|
|
341
|
+
well_core: WellCore,
|
|
342
|
+
) -> None:
|
|
343
|
+
raise APIVersionError(api_element="Unsealing resin tips.")
|
|
344
|
+
|
|
345
|
+
def resin_tip_dispense(
|
|
346
|
+
self,
|
|
347
|
+
location: types.Location,
|
|
348
|
+
well_core: WellCore,
|
|
349
|
+
volume: Optional[float] = None,
|
|
350
|
+
flow_rate: Optional[float] = None,
|
|
351
|
+
) -> None:
|
|
352
|
+
raise APIVersionError(api_element="Dispensing liquid from resin tips.")
|
|
353
|
+
|
|
354
|
+
def home(self) -> None:
|
|
355
|
+
"""Home the mount"""
|
|
356
|
+
self._protocol_interface.get_hardware().home_z(
|
|
357
|
+
mount=self._mount,
|
|
358
|
+
# preserve buggy behavior in <= 2.12 for strict back. compat.
|
|
359
|
+
# https://github.com/Opentrons/opentrons/issues/7499
|
|
360
|
+
allow_home_other=self._api_version >= APIVersion(2, 13),
|
|
361
|
+
)
|
|
362
|
+
self.home_plunger()
|
|
363
|
+
|
|
364
|
+
def home_plunger(self) -> None:
|
|
365
|
+
"""Home the plunger associated with this mount."""
|
|
366
|
+
self._protocol_interface.get_hardware().home_plunger(self._mount)
|
|
367
|
+
|
|
368
|
+
def move_to(
|
|
369
|
+
self,
|
|
370
|
+
location: Union[types.Location, TrashBin, WasteChute],
|
|
371
|
+
well_core: Optional[LegacyWellCore] = None,
|
|
372
|
+
force_direct: bool = False,
|
|
373
|
+
minimum_z_height: Optional[float] = None,
|
|
374
|
+
speed: Optional[float] = None,
|
|
375
|
+
check_for_movement_conflicts: bool = False,
|
|
376
|
+
) -> None:
|
|
377
|
+
"""Move the instrument.
|
|
378
|
+
|
|
379
|
+
Args:
|
|
380
|
+
location: The movement destination.
|
|
381
|
+
well_core: Unused in the legacy instrument core.
|
|
382
|
+
force_direct: Force a direct movement instead of an arc.
|
|
383
|
+
minimum_z_height: Set a minimum travel height for a movement arc.
|
|
384
|
+
speed: Override the travel speed in mm/s.
|
|
385
|
+
check_for_movement_conflicts: Not used in legacy implementation
|
|
386
|
+
|
|
387
|
+
Raises:
|
|
388
|
+
LabwareHeightError: An item on the deck is taller than
|
|
389
|
+
the computed safe travel height.
|
|
390
|
+
"""
|
|
391
|
+
if isinstance(location, (TrashBin, WasteChute)):
|
|
392
|
+
raise APIVersionError(api_element="Move To Trash Bin and Waste Chute")
|
|
393
|
+
self.flag_unsafe_move(location)
|
|
394
|
+
|
|
395
|
+
# prevent direct movement bugs in PAPI version >= 2.10
|
|
396
|
+
location_cache_mount = (
|
|
397
|
+
self._mount if self._api_version >= APIVersion(2, 10) else None
|
|
398
|
+
)
|
|
399
|
+
|
|
400
|
+
last_location = self._protocol_interface.get_last_location(
|
|
401
|
+
mount=location_cache_mount
|
|
402
|
+
)
|
|
403
|
+
|
|
404
|
+
if last_location:
|
|
405
|
+
from_lw = last_location.labware
|
|
406
|
+
else:
|
|
407
|
+
from_lw = LabwareLike(None)
|
|
408
|
+
|
|
409
|
+
if not speed:
|
|
410
|
+
speed = self.get_default_speed()
|
|
411
|
+
|
|
412
|
+
hardware = self._protocol_interface.get_hardware()
|
|
413
|
+
|
|
414
|
+
from_center = from_lw.center_multichannel_on_wells() if from_lw else False
|
|
415
|
+
cp_override = CriticalPoint.XY_CENTER if from_center else None
|
|
416
|
+
|
|
417
|
+
from_loc = types.Location(
|
|
418
|
+
hardware.gantry_position(self._mount, critical_point=cp_override), from_lw
|
|
419
|
+
)
|
|
420
|
+
|
|
421
|
+
instr_max_height = hardware.get_instrument_max_height(self._mount)
|
|
422
|
+
moves = planning.plan_moves(
|
|
423
|
+
from_loc,
|
|
424
|
+
location,
|
|
425
|
+
self._protocol_interface.get_deck(),
|
|
426
|
+
instr_max_height,
|
|
427
|
+
force_direct=force_direct,
|
|
428
|
+
minimum_z_height=minimum_z_height,
|
|
429
|
+
)
|
|
430
|
+
|
|
431
|
+
try:
|
|
432
|
+
for move in moves:
|
|
433
|
+
hardware.move_to(
|
|
434
|
+
self._mount,
|
|
435
|
+
move[0],
|
|
436
|
+
critical_point=move[1],
|
|
437
|
+
speed=speed,
|
|
438
|
+
max_speeds=self._protocol_interface.get_max_speeds().data,
|
|
439
|
+
)
|
|
440
|
+
except Exception:
|
|
441
|
+
self._protocol_interface.set_last_location(None)
|
|
442
|
+
raise
|
|
443
|
+
else:
|
|
444
|
+
self._protocol_interface.set_last_location(
|
|
445
|
+
location=location, mount=location_cache_mount
|
|
446
|
+
)
|
|
447
|
+
|
|
448
|
+
def get_mount(self) -> types.Mount:
|
|
449
|
+
"""Get the mount this pipette is attached to."""
|
|
450
|
+
return self._mount
|
|
451
|
+
|
|
452
|
+
def get_instrument_name(self) -> str:
|
|
453
|
+
"""Get the instrument name."""
|
|
454
|
+
return self._instrument_name
|
|
455
|
+
|
|
456
|
+
def get_pipette_name(self) -> str:
|
|
457
|
+
"""Get the pipette name."""
|
|
458
|
+
return self.get_hardware_state()["name"]
|
|
459
|
+
|
|
460
|
+
def get_model(self) -> str:
|
|
461
|
+
"""Get the model name."""
|
|
462
|
+
return self.get_hardware_state()["model"]
|
|
463
|
+
|
|
464
|
+
def get_display_name(self) -> str:
|
|
465
|
+
"""Get the display name"""
|
|
466
|
+
return self.get_hardware_state()["display_name"]
|
|
467
|
+
|
|
468
|
+
def get_min_volume(self) -> float:
|
|
469
|
+
"""Get the min volume."""
|
|
470
|
+
return self.get_hardware_state()["min_volume"]
|
|
471
|
+
|
|
472
|
+
def get_max_volume(self) -> float:
|
|
473
|
+
"""Get the max volume."""
|
|
474
|
+
return self.get_hardware_state()["max_volume"]
|
|
475
|
+
|
|
476
|
+
def get_working_volume(self) -> float:
|
|
477
|
+
"""Get the working volume."""
|
|
478
|
+
return self.get_hardware_state()["working_volume"]
|
|
479
|
+
|
|
480
|
+
def get_current_volume(self) -> float:
|
|
481
|
+
"""Get the current volume."""
|
|
482
|
+
return self.get_hardware_state()["current_volume"]
|
|
483
|
+
|
|
484
|
+
def get_has_clean_tip(self) -> bool:
|
|
485
|
+
"""Get if has a clean tip, only used with LLD and engine commands."""
|
|
486
|
+
return False
|
|
487
|
+
|
|
488
|
+
def get_available_volume(self) -> float:
|
|
489
|
+
"""Get the available volume."""
|
|
490
|
+
return self.get_hardware_state()["available_volume"]
|
|
491
|
+
|
|
492
|
+
def get_hardware_state(self) -> PipetteDict:
|
|
493
|
+
"""Get the hardware pipette dictionary."""
|
|
494
|
+
sync_hw_api = self._protocol_interface.get_hardware()
|
|
495
|
+
pipette: Optional[PipetteDict] = sync_hw_api.get_attached_instrument(
|
|
496
|
+
self._mount
|
|
497
|
+
)
|
|
498
|
+
|
|
499
|
+
if pipette is None:
|
|
500
|
+
raise types.PipetteNotAttachedError()
|
|
501
|
+
|
|
502
|
+
return pipette
|
|
503
|
+
|
|
504
|
+
def get_channels(self) -> int:
|
|
505
|
+
"""Number of channels."""
|
|
506
|
+
return self.get_hardware_state()["channels"]
|
|
507
|
+
|
|
508
|
+
def has_tip(self) -> bool:
|
|
509
|
+
"""Whether a tip is attached."""
|
|
510
|
+
return self.get_hardware_state()["has_tip"]
|
|
511
|
+
|
|
512
|
+
def is_ready_to_aspirate(self) -> bool:
|
|
513
|
+
return self.get_hardware_state()["ready_to_aspirate"]
|
|
514
|
+
|
|
515
|
+
def prepare_to_aspirate(self) -> None:
|
|
516
|
+
self._protocol_interface.get_hardware().prepare_for_aspirate(self._mount)
|
|
517
|
+
|
|
518
|
+
def get_return_height(self) -> float:
|
|
519
|
+
"""The height to return a tip to its tiprack."""
|
|
520
|
+
return self.get_hardware_state().get("return_tip_height", 0.5)
|
|
521
|
+
|
|
522
|
+
def get_flow_rate(self) -> FlowRates:
|
|
523
|
+
return self._flow_rates
|
|
524
|
+
|
|
525
|
+
def get_liquid_presence_detection(self) -> bool:
|
|
526
|
+
return self._liquid_presence_detection
|
|
527
|
+
|
|
528
|
+
def get_aspirate_flow_rate(self, rate: float = 1.0) -> float:
|
|
529
|
+
return self.get_hardware_state()["aspirate_flow_rate"] * rate
|
|
530
|
+
|
|
531
|
+
def get_dispense_flow_rate(self, rate: float = 1.0) -> float:
|
|
532
|
+
return self.get_hardware_state()["dispense_flow_rate"] * rate
|
|
533
|
+
|
|
534
|
+
def get_blow_out_flow_rate(self, rate: float = 1.0) -> float:
|
|
535
|
+
return self.get_hardware_state()["blow_out_flow_rate"] * rate
|
|
536
|
+
|
|
537
|
+
def get_speed(self) -> PlungerSpeeds:
|
|
538
|
+
return self._speeds
|
|
539
|
+
|
|
540
|
+
def get_tip_origin(
|
|
541
|
+
self,
|
|
542
|
+
) -> Optional[Tuple[LegacyLabwareCore, LegacyWellCore]]:
|
|
543
|
+
return self._last_tip_rack_and_well
|
|
544
|
+
|
|
545
|
+
def set_flow_rate(
|
|
546
|
+
self,
|
|
547
|
+
aspirate: Optional[float] = None,
|
|
548
|
+
dispense: Optional[float] = None,
|
|
549
|
+
blow_out: Optional[float] = None,
|
|
550
|
+
) -> None:
|
|
551
|
+
"""Set the flow rates."""
|
|
552
|
+
self._protocol_interface.get_hardware().set_flow_rate(
|
|
553
|
+
mount=self._mount,
|
|
554
|
+
aspirate=aspirate,
|
|
555
|
+
dispense=dispense,
|
|
556
|
+
blow_out=blow_out,
|
|
557
|
+
)
|
|
558
|
+
|
|
559
|
+
def set_liquid_presence_detection(self, enable: bool) -> None:
|
|
560
|
+
self._protocol_interface.get_hardware().set_liquid_presence_detection(enable)
|
|
561
|
+
|
|
562
|
+
def set_pipette_speed(
|
|
563
|
+
self,
|
|
564
|
+
aspirate: Optional[float] = None,
|
|
565
|
+
dispense: Optional[float] = None,
|
|
566
|
+
blow_out: Optional[float] = None,
|
|
567
|
+
) -> None:
|
|
568
|
+
"""Set pipette speeds."""
|
|
569
|
+
self._protocol_interface.get_hardware().set_pipette_speed(
|
|
570
|
+
mount=self._mount,
|
|
571
|
+
aspirate=aspirate,
|
|
572
|
+
dispense=dispense,
|
|
573
|
+
blow_out=blow_out,
|
|
574
|
+
)
|
|
575
|
+
|
|
576
|
+
def flag_unsafe_move(self, location: types.Location) -> None:
|
|
577
|
+
"""Check if a movement to a destination is potentially unsafe.
|
|
578
|
+
|
|
579
|
+
Args:
|
|
580
|
+
location: The movement destination.
|
|
581
|
+
|
|
582
|
+
Raises:
|
|
583
|
+
RuntimeError: The movement is unsafe.
|
|
584
|
+
"""
|
|
585
|
+
from_loc = self._protocol_interface.get_last_location()
|
|
586
|
+
|
|
587
|
+
if not from_loc:
|
|
588
|
+
from_loc = types.Location(types.Point(0, 0, 0), LabwareLike(None))
|
|
589
|
+
|
|
590
|
+
for mod in self._protocol_interface.get_module_cores():
|
|
591
|
+
if isinstance(mod, LegacyThermocyclerCore):
|
|
592
|
+
mod.flag_unsafe_move(to_loc=location, from_loc=from_loc)
|
|
593
|
+
elif isinstance(mod, LegacyHeaterShakerCore):
|
|
594
|
+
mod.flag_unsafe_move(
|
|
595
|
+
to_loc=location,
|
|
596
|
+
is_multichannel=self.get_channels() > 1,
|
|
597
|
+
)
|
|
598
|
+
|
|
599
|
+
def configure_for_volume(self, volume: float) -> None:
|
|
600
|
+
"""This will never be called because it was added in API 2.15."""
|
|
601
|
+
pass
|
|
602
|
+
|
|
603
|
+
def configure_nozzle_layout(
|
|
604
|
+
self,
|
|
605
|
+
style: NozzleLayout,
|
|
606
|
+
primary_nozzle: Optional[str],
|
|
607
|
+
front_right_nozzle: Optional[str],
|
|
608
|
+
back_left_nozzle: Optional[str],
|
|
609
|
+
) -> None:
|
|
610
|
+
"""This will never be called because it was added in API 2.16."""
|
|
611
|
+
pass
|
|
612
|
+
|
|
613
|
+
def transfer_with_liquid_class(
|
|
614
|
+
self,
|
|
615
|
+
liquid_class: LiquidClass,
|
|
616
|
+
volume: float,
|
|
617
|
+
source: List[Tuple[types.Location, LegacyWellCore]],
|
|
618
|
+
dest: Union[List[Tuple[types.Location, LegacyWellCore]], TrashBin, WasteChute],
|
|
619
|
+
new_tip: TransferTipPolicyV2,
|
|
620
|
+
tip_racks: List[Tuple[types.Location, LegacyLabwareCore]],
|
|
621
|
+
starting_tip: Optional[LegacyWellCore],
|
|
622
|
+
trash_location: Union[types.Location, TrashBin, WasteChute],
|
|
623
|
+
return_tip: bool,
|
|
624
|
+
keep_last_tip: bool,
|
|
625
|
+
) -> None:
|
|
626
|
+
"""This will never be called because it was added in API 2.23"""
|
|
627
|
+
assert False, "transfer_liquid is not supported in legacy context"
|
|
628
|
+
|
|
629
|
+
def distribute_with_liquid_class(
|
|
630
|
+
self,
|
|
631
|
+
liquid_class: LiquidClass,
|
|
632
|
+
volume: float,
|
|
633
|
+
source: Tuple[types.Location, LegacyWellCore],
|
|
634
|
+
dest: List[Tuple[types.Location, LegacyWellCore]],
|
|
635
|
+
new_tip: Literal[TransferTipPolicyV2.NEVER, TransferTipPolicyV2.ONCE],
|
|
636
|
+
tip_racks: List[Tuple[types.Location, LegacyLabwareCore]],
|
|
637
|
+
starting_tip: Optional[LegacyWellCore],
|
|
638
|
+
trash_location: Union[types.Location, TrashBin, WasteChute],
|
|
639
|
+
return_tip: bool,
|
|
640
|
+
keep_last_tip: bool,
|
|
641
|
+
) -> None:
|
|
642
|
+
"""This will never be called because it was added in API 2.23"""
|
|
643
|
+
assert False, "distribute_liquid is not supported in legacy context"
|
|
644
|
+
|
|
645
|
+
def consolidate_with_liquid_class(
|
|
646
|
+
self,
|
|
647
|
+
liquid_class: LiquidClass,
|
|
648
|
+
volume: float,
|
|
649
|
+
source: List[Tuple[types.Location, LegacyWellCore]],
|
|
650
|
+
dest: Union[Tuple[types.Location, LegacyWellCore], TrashBin, WasteChute],
|
|
651
|
+
new_tip: Literal[TransferTipPolicyV2.NEVER, TransferTipPolicyV2.ONCE],
|
|
652
|
+
tip_racks: List[Tuple[types.Location, LegacyLabwareCore]],
|
|
653
|
+
starting_tip: Optional[LegacyWellCore],
|
|
654
|
+
trash_location: Union[types.Location, TrashBin, WasteChute],
|
|
655
|
+
return_tip: bool,
|
|
656
|
+
keep_last_tip: bool,
|
|
657
|
+
) -> None:
|
|
658
|
+
"""This will never be called because it was added in API 2.23."""
|
|
659
|
+
assert False, "consolidate_liquid is not supported in legacy context"
|
|
660
|
+
|
|
661
|
+
def get_active_channels(self) -> int:
|
|
662
|
+
"""This will never be called because it was added in API 2.16."""
|
|
663
|
+
assert False, "get_active_channels only supported in API 2.16 & later"
|
|
664
|
+
|
|
665
|
+
def get_nozzle_map(self) -> types.NozzleMapInterface:
|
|
666
|
+
"""This will never be called because it was added in API 2.18."""
|
|
667
|
+
assert False, "get_nozzle_map only supported in API 2.18 & later"
|
|
668
|
+
|
|
669
|
+
def is_tip_tracking_available(self) -> bool:
|
|
670
|
+
# Tip tracking is always available in legacy context
|
|
671
|
+
return True
|
|
672
|
+
|
|
673
|
+
def retract(self) -> None:
|
|
674
|
+
"""Retract this instrument to the top of the gantry."""
|
|
675
|
+
self._protocol_interface.get_hardware.retract(self._mount) # type: ignore [attr-defined]
|
|
676
|
+
|
|
677
|
+
def detect_liquid_presence(self, well_core: WellCore, loc: types.Location) -> bool:
|
|
678
|
+
"""This will never be called because it was added in API 2.20."""
|
|
679
|
+
assert False, "detect_liquid_presence only supported in API 2.20 & later"
|
|
680
|
+
|
|
681
|
+
def liquid_probe_with_recovery(
|
|
682
|
+
self, well_core: WellCore, loc: types.Location
|
|
683
|
+
) -> None:
|
|
684
|
+
"""This will never be called because it was added in API 2.20."""
|
|
685
|
+
assert False, "liquid_probe_with_recovery only supported in API 2.20 & later"
|
|
686
|
+
|
|
687
|
+
def liquid_probe_without_recovery(
|
|
688
|
+
self, well_core: WellCore, loc: types.Location
|
|
689
|
+
) -> LiquidTrackingType:
|
|
690
|
+
"""This will never be called because it was added in API 2.20."""
|
|
691
|
+
assert False, "liquid_probe_without_recovery only supported in API 2.20 & later"
|
|
692
|
+
|
|
693
|
+
def _pressure_supported_by_pipette(self) -> bool:
|
|
694
|
+
return False
|
|
695
|
+
|
|
696
|
+
def nozzle_configuration_valid_for_lld(self) -> bool:
|
|
697
|
+
"""Check if the nozzle configuration currently supports LLD."""
|
|
698
|
+
return False
|
|
699
|
+
|
|
700
|
+
def get_minimum_liquid_sense_height(self) -> float:
|
|
701
|
+
return 0.0
|
|
702
|
+
|
|
703
|
+
def estimate_liquid_height(
|
|
704
|
+
self,
|
|
705
|
+
well_core: LegacyWellCore,
|
|
706
|
+
starting_liquid_height: float,
|
|
707
|
+
operation_volume: float,
|
|
708
|
+
) -> float:
|
|
709
|
+
return 0.0
|