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,16 @@
|
|
|
1
|
+
"""Legacy protocol simulation core.
|
|
2
|
+
|
|
3
|
+
One way of simulating a Protocol API v2 protocol (e.g. to detect equipment requirements)
|
|
4
|
+
is to simulate at the level of the hardware API. However, this is slow.
|
|
5
|
+
|
|
6
|
+
To speed things up, these classes can additionally take the place of a
|
|
7
|
+
Protocol API v2 context's implementation, to simulate certain things at the level of
|
|
8
|
+
the Protocol API, avoiding certain calls to the underlying hardware API.
|
|
9
|
+
"""
|
|
10
|
+
from .legacy_protocol_core import LegacyProtocolCoreSimulator
|
|
11
|
+
from .legacy_instrument_core import LegacyInstrumentCoreSimulator
|
|
12
|
+
|
|
13
|
+
__all__ = [
|
|
14
|
+
"LegacyProtocolCoreSimulator",
|
|
15
|
+
"LegacyInstrumentCoreSimulator",
|
|
16
|
+
]
|
|
@@ -0,0 +1,624 @@
|
|
|
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.dev_types import PipetteDict
|
|
8
|
+
from opentrons.hardware_control.types import HardwareAction
|
|
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.labware_like import LabwareLike
|
|
13
|
+
from opentrons.protocols.api_support.types import APIVersion
|
|
14
|
+
from opentrons.protocols.api_support.definitions import MAX_SUPPORTED_VERSION
|
|
15
|
+
from opentrons.protocols.api_support.util import (
|
|
16
|
+
FlowRates,
|
|
17
|
+
PlungerSpeeds,
|
|
18
|
+
APIVersionError,
|
|
19
|
+
)
|
|
20
|
+
from opentrons.protocols.geometry import planning
|
|
21
|
+
from opentrons_shared_data.errors.exceptions import (
|
|
22
|
+
UnexpectedTipRemovalError,
|
|
23
|
+
UnexpectedTipAttachError,
|
|
24
|
+
)
|
|
25
|
+
|
|
26
|
+
from opentrons.protocol_engine.types import LiquidTrackingType
|
|
27
|
+
|
|
28
|
+
from ..legacy.legacy_labware_core import LegacyLabwareCore
|
|
29
|
+
from ...disposal_locations import TrashBin, WasteChute
|
|
30
|
+
from opentrons.protocol_api._nozzle_layout import NozzleLayout
|
|
31
|
+
from opentrons.protocol_api._liquid import LiquidClass
|
|
32
|
+
|
|
33
|
+
from ..instrument import AbstractInstrument
|
|
34
|
+
|
|
35
|
+
from ..legacy.legacy_well_core import LegacyWellCore
|
|
36
|
+
from ..legacy.legacy_module_core import LegacyThermocyclerCore, LegacyHeaterShakerCore
|
|
37
|
+
|
|
38
|
+
if TYPE_CHECKING:
|
|
39
|
+
from .legacy_protocol_core import LegacyProtocolCoreSimulator
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
_log = logging.getLogger()
|
|
43
|
+
|
|
44
|
+
_PRE_2_2_TIP_DROP_HEIGHT_MM = 10
|
|
45
|
+
"""In PAPIv2.1 and below, tips are always dropped 10 mm from the bottom of the well."""
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
class LegacyInstrumentCoreSimulator(
|
|
49
|
+
AbstractInstrument[LegacyWellCore, LegacyLabwareCore]
|
|
50
|
+
):
|
|
51
|
+
"""A simulation of an instrument context."""
|
|
52
|
+
|
|
53
|
+
def __init__(
|
|
54
|
+
self,
|
|
55
|
+
protocol_interface: LegacyProtocolCoreSimulator,
|
|
56
|
+
pipette_dict: PipetteDict,
|
|
57
|
+
mount: types.Mount,
|
|
58
|
+
instrument_name: str,
|
|
59
|
+
default_speed: float = 400.0,
|
|
60
|
+
api_version: Optional[APIVersion] = None,
|
|
61
|
+
):
|
|
62
|
+
"""Constructor."""
|
|
63
|
+
self._protocol_interface = protocol_interface
|
|
64
|
+
self._mount = mount
|
|
65
|
+
self._pipette_dict = pipette_dict
|
|
66
|
+
self._instrument_name = instrument_name
|
|
67
|
+
self._default_speed = default_speed
|
|
68
|
+
self._api_version = api_version or MAX_SUPPORTED_VERSION
|
|
69
|
+
|
|
70
|
+
self._flow_rate = FlowRates(self)
|
|
71
|
+
pipette_state = self.get_hardware_state()
|
|
72
|
+
self._flow_rate.set_defaults(
|
|
73
|
+
aspirate_defaults=pipette_state["default_aspirate_flow_rates"],
|
|
74
|
+
dispense_defaults=pipette_state["default_dispense_flow_rates"],
|
|
75
|
+
blow_out_defaults=pipette_state["default_blow_out_flow_rates"],
|
|
76
|
+
api_level=self._api_version,
|
|
77
|
+
)
|
|
78
|
+
|
|
79
|
+
self._plunger_speeds = PlungerSpeeds(self)
|
|
80
|
+
# Cache the maximum instrument height
|
|
81
|
+
self._instrument_max_height = (
|
|
82
|
+
protocol_interface.get_hardware().get_instrument_max_height(self._mount)
|
|
83
|
+
)
|
|
84
|
+
self._liquid_presence_detection = False
|
|
85
|
+
self._last_tip_rack_and_well: Optional[
|
|
86
|
+
Tuple[LegacyLabwareCore, LegacyWellCore]
|
|
87
|
+
] = None
|
|
88
|
+
|
|
89
|
+
def get_default_speed(self) -> float:
|
|
90
|
+
return self._default_speed
|
|
91
|
+
|
|
92
|
+
def set_default_speed(self, speed: float) -> None:
|
|
93
|
+
self._default_speed = speed
|
|
94
|
+
|
|
95
|
+
def air_gap_in_place(
|
|
96
|
+
self, volume: float, flow_rate: float, correction_volume: Optional[float] = None
|
|
97
|
+
) -> None:
|
|
98
|
+
assert False, "Air gap tracking only available in API version 2.22 and later"
|
|
99
|
+
|
|
100
|
+
def aspirate(
|
|
101
|
+
self,
|
|
102
|
+
location: types.Location,
|
|
103
|
+
well_core: Optional[LegacyWellCore],
|
|
104
|
+
volume: float,
|
|
105
|
+
rate: float,
|
|
106
|
+
flow_rate: float,
|
|
107
|
+
in_place: bool,
|
|
108
|
+
meniscus_tracking: Optional[types.MeniscusTrackingTarget] = None,
|
|
109
|
+
correction_volume: Optional[float] = None,
|
|
110
|
+
) -> None:
|
|
111
|
+
if self.get_current_volume() == 0:
|
|
112
|
+
# Make sure we're at the top of the labware and clear of any
|
|
113
|
+
# liquid to prepare the pipette for aspiration
|
|
114
|
+
if self._api_version < APIVersion(2, 3) or not self.is_ready_to_aspirate():
|
|
115
|
+
if location.labware.is_well:
|
|
116
|
+
self.move_to(
|
|
117
|
+
location=location.labware.as_well().top(), well_core=well_core
|
|
118
|
+
)
|
|
119
|
+
else:
|
|
120
|
+
# TODO(seth,2019/7/29): This should be a warning exposed
|
|
121
|
+
# via rpc to the runapp
|
|
122
|
+
_log.warning(
|
|
123
|
+
"When aspirate is called on something other than a "
|
|
124
|
+
"well relative position, we can't move to the top of"
|
|
125
|
+
" the well to prepare for aspiration. This might "
|
|
126
|
+
"cause over aspiration if the previous command is a "
|
|
127
|
+
"blow_out."
|
|
128
|
+
)
|
|
129
|
+
self.prepare_to_aspirate()
|
|
130
|
+
self.move_to(location=location, well_core=well_core)
|
|
131
|
+
elif location != self._protocol_interface.get_last_location():
|
|
132
|
+
self.move_to(location=location, well_core=well_core)
|
|
133
|
+
|
|
134
|
+
self._raise_if_no_tip(HardwareAction.ASPIRATE.name)
|
|
135
|
+
new_volume = self.get_current_volume() + volume
|
|
136
|
+
assert (
|
|
137
|
+
new_volume <= self._pipette_dict["working_volume"]
|
|
138
|
+
), "Cannot aspirate more than pipette max volume"
|
|
139
|
+
self._pipette_dict["ready_to_aspirate"] = True
|
|
140
|
+
self._update_volume(new_volume)
|
|
141
|
+
|
|
142
|
+
def dispense(
|
|
143
|
+
self,
|
|
144
|
+
location: Union[types.Location, TrashBin, WasteChute],
|
|
145
|
+
well_core: Optional[LegacyWellCore],
|
|
146
|
+
volume: float,
|
|
147
|
+
rate: float,
|
|
148
|
+
flow_rate: float,
|
|
149
|
+
in_place: bool,
|
|
150
|
+
push_out: Optional[float],
|
|
151
|
+
meniscus_tracking: Optional[types.MeniscusTrackingTarget] = None,
|
|
152
|
+
correction_volume: Optional[float] = None,
|
|
153
|
+
) -> None:
|
|
154
|
+
if isinstance(location, (TrashBin, WasteChute)):
|
|
155
|
+
raise APIVersionError(
|
|
156
|
+
api_element="Dispense in Moveable Trash or Waste Chute"
|
|
157
|
+
)
|
|
158
|
+
if not in_place:
|
|
159
|
+
self.move_to(location=location, well_core=well_core)
|
|
160
|
+
self._raise_if_no_tip(HardwareAction.DISPENSE.name)
|
|
161
|
+
self._update_volume(self.get_current_volume() - volume)
|
|
162
|
+
|
|
163
|
+
def blow_out(
|
|
164
|
+
self,
|
|
165
|
+
location: Union[types.Location, TrashBin, WasteChute],
|
|
166
|
+
well_core: Optional[LegacyWellCore],
|
|
167
|
+
in_place: bool,
|
|
168
|
+
) -> None:
|
|
169
|
+
if isinstance(location, (TrashBin, WasteChute)):
|
|
170
|
+
raise APIVersionError(
|
|
171
|
+
api_element="Blow Out in Moveable Trash or Waste Chute"
|
|
172
|
+
)
|
|
173
|
+
if not in_place:
|
|
174
|
+
self.move_to(location=location, well_core=well_core)
|
|
175
|
+
self._raise_if_no_tip(HardwareAction.BLOWOUT.name)
|
|
176
|
+
self._update_volume(0)
|
|
177
|
+
self._pipette_dict["ready_to_aspirate"] = False
|
|
178
|
+
|
|
179
|
+
def _update_volume(self, vol: float) -> None:
|
|
180
|
+
self._pipette_dict["current_volume"] = vol
|
|
181
|
+
self._pipette_dict["available_volume"] = (
|
|
182
|
+
self._pipette_dict["working_volume"] - vol
|
|
183
|
+
)
|
|
184
|
+
|
|
185
|
+
def touch_tip(
|
|
186
|
+
self,
|
|
187
|
+
location: types.Location,
|
|
188
|
+
well_core: LegacyWellCore,
|
|
189
|
+
radius: float,
|
|
190
|
+
z_offset: float,
|
|
191
|
+
speed: float,
|
|
192
|
+
mm_from_edge: Optional[float] = None,
|
|
193
|
+
) -> None:
|
|
194
|
+
if mm_from_edge is not None:
|
|
195
|
+
raise APIVersionError(api_element="mm_from_edge argument")
|
|
196
|
+
self.move_to(location)
|
|
197
|
+
|
|
198
|
+
def pick_up_tip(
|
|
199
|
+
self,
|
|
200
|
+
location: types.Location,
|
|
201
|
+
well_core: LegacyWellCore,
|
|
202
|
+
presses: Optional[int],
|
|
203
|
+
increment: Optional[float],
|
|
204
|
+
prep_after: bool = True,
|
|
205
|
+
) -> None:
|
|
206
|
+
geometry = well_core.geometry
|
|
207
|
+
tip_rack_core = geometry.parent
|
|
208
|
+
tip_length = instrument_support.tip_length_for(
|
|
209
|
+
pipette=self._pipette_dict,
|
|
210
|
+
tip_rack_definition=tip_rack_core.get_definition(),
|
|
211
|
+
)
|
|
212
|
+
|
|
213
|
+
self.move_to(location=location)
|
|
214
|
+
self._raise_if_tip("pick up tip")
|
|
215
|
+
self._pipette_dict["has_tip"] = True
|
|
216
|
+
self._pipette_dict["tip_length"] = tip_length
|
|
217
|
+
self._pipette_dict["current_volume"] = 0
|
|
218
|
+
self._pipette_dict["working_volume"] = min(
|
|
219
|
+
geometry.max_volume, self.get_max_volume()
|
|
220
|
+
)
|
|
221
|
+
self._pipette_dict["available_volume"] = self._pipette_dict["working_volume"]
|
|
222
|
+
if prep_after:
|
|
223
|
+
self._pipette_dict["ready_to_aspirate"] = True
|
|
224
|
+
|
|
225
|
+
tip_rack_core.get_tip_tracker().use_tips(
|
|
226
|
+
start_well=well_core,
|
|
227
|
+
num_channels=self.get_channels(),
|
|
228
|
+
fail_if_full=self._api_version < APIVersion(2, 2),
|
|
229
|
+
)
|
|
230
|
+
self._last_tip_rack_and_well = tip_rack_core, well_core
|
|
231
|
+
|
|
232
|
+
def drop_tip(
|
|
233
|
+
self,
|
|
234
|
+
location: Optional[types.Location],
|
|
235
|
+
well_core: LegacyWellCore,
|
|
236
|
+
home_after: Optional[bool],
|
|
237
|
+
alternate_drop_location: Optional[bool] = False,
|
|
238
|
+
) -> None:
|
|
239
|
+
if alternate_drop_location:
|
|
240
|
+
raise APIVersionError(api_element="Tip drop alternation")
|
|
241
|
+
labware_core = well_core.geometry.parent
|
|
242
|
+
|
|
243
|
+
if location is None:
|
|
244
|
+
from opentrons.protocol_api.labware import Labware, Well
|
|
245
|
+
|
|
246
|
+
labware = Labware(
|
|
247
|
+
core=labware_core,
|
|
248
|
+
api_version=self._api_version,
|
|
249
|
+
protocol_core=None, # type: ignore[arg-type]
|
|
250
|
+
core_map=None, # type: ignore[arg-type]
|
|
251
|
+
)
|
|
252
|
+
well = Well(parent=labware, core=well_core, api_version=self._api_version)
|
|
253
|
+
|
|
254
|
+
if LabwareLike(labware).is_fixed_trash():
|
|
255
|
+
location = well.top()
|
|
256
|
+
elif self._api_version < APIVersion(2, 2):
|
|
257
|
+
location = well.bottom(z=_PRE_2_2_TIP_DROP_HEIGHT_MM)
|
|
258
|
+
else:
|
|
259
|
+
assert (
|
|
260
|
+
labware_core.is_tip_rack()
|
|
261
|
+
), "Expected tip drop target to be a tip rack."
|
|
262
|
+
|
|
263
|
+
return_height = self.get_return_height()
|
|
264
|
+
location = well.top(z=-return_height * labware_core.get_tip_length())
|
|
265
|
+
|
|
266
|
+
self.move_to(location=location)
|
|
267
|
+
self._raise_if_no_tip(HardwareAction.DROPTIP.name)
|
|
268
|
+
self._pipette_dict["has_tip"] = False
|
|
269
|
+
self._pipette_dict["tip_length"] = 0.0
|
|
270
|
+
self._update_volume(0)
|
|
271
|
+
self._last_tip_rack_and_well = None
|
|
272
|
+
|
|
273
|
+
if self._api_version < APIVersion(2, 2) and labware_core.is_tip_rack():
|
|
274
|
+
# If this is a tiprack we can try and add the dirty tip back to the tracker
|
|
275
|
+
try:
|
|
276
|
+
labware_core.get_tip_tracker().return_tips(
|
|
277
|
+
start_well=well_core,
|
|
278
|
+
num_channels=self.get_channels(),
|
|
279
|
+
)
|
|
280
|
+
except AssertionError:
|
|
281
|
+
# Similarly to :py:meth:`return_tips`, the failure case here
|
|
282
|
+
# just means the tip can't be reused, so don't actually stop
|
|
283
|
+
# the protocol
|
|
284
|
+
_log.warning(
|
|
285
|
+
f"Could not return tip to {labware_core.get_display_name()}"
|
|
286
|
+
)
|
|
287
|
+
|
|
288
|
+
def drop_tip_in_disposal_location(
|
|
289
|
+
self,
|
|
290
|
+
disposal_location: Union[TrashBin, WasteChute],
|
|
291
|
+
home_after: Optional[bool],
|
|
292
|
+
alternate_tip_drop: bool = False,
|
|
293
|
+
) -> None:
|
|
294
|
+
raise APIVersionError(api_element="Dropping tips in a trash bin or waste chute")
|
|
295
|
+
|
|
296
|
+
def resin_tip_seal(
|
|
297
|
+
self,
|
|
298
|
+
location: types.Location,
|
|
299
|
+
well_core: WellCore,
|
|
300
|
+
in_place: Optional[bool] = False,
|
|
301
|
+
) -> None:
|
|
302
|
+
raise APIVersionError(api_element="Sealing resin tips.")
|
|
303
|
+
|
|
304
|
+
def resin_tip_unseal(
|
|
305
|
+
self,
|
|
306
|
+
location: types.Location | None,
|
|
307
|
+
well_core: WellCore,
|
|
308
|
+
) -> None:
|
|
309
|
+
raise APIVersionError(api_element="Unsealing resin tips.")
|
|
310
|
+
|
|
311
|
+
def resin_tip_dispense(
|
|
312
|
+
self,
|
|
313
|
+
location: types.Location,
|
|
314
|
+
well_core: WellCore,
|
|
315
|
+
volume: Optional[float] = None,
|
|
316
|
+
flow_rate: Optional[float] = None,
|
|
317
|
+
) -> None:
|
|
318
|
+
raise APIVersionError(api_element="Dispensing liquid from resin tips.")
|
|
319
|
+
|
|
320
|
+
def home(self) -> None:
|
|
321
|
+
self._protocol_interface.set_last_location(None)
|
|
322
|
+
|
|
323
|
+
def home_plunger(self) -> None:
|
|
324
|
+
pass
|
|
325
|
+
|
|
326
|
+
def move_to(
|
|
327
|
+
self,
|
|
328
|
+
location: Union[types.Location, TrashBin, WasteChute],
|
|
329
|
+
well_core: Optional[LegacyWellCore] = None,
|
|
330
|
+
force_direct: bool = False,
|
|
331
|
+
minimum_z_height: Optional[float] = None,
|
|
332
|
+
speed: Optional[float] = None,
|
|
333
|
+
check_for_movement_conflicts: bool = False, # Not used in this implementation
|
|
334
|
+
) -> None:
|
|
335
|
+
"""Simulation of only the motion planning portion of move_to."""
|
|
336
|
+
if isinstance(location, (TrashBin, WasteChute)):
|
|
337
|
+
raise APIVersionError(api_element="Move To Trash Bin and Waste Chute")
|
|
338
|
+
|
|
339
|
+
self.flag_unsafe_move(location)
|
|
340
|
+
|
|
341
|
+
last_location = self._protocol_interface.get_last_location()
|
|
342
|
+
if last_location:
|
|
343
|
+
from_loc = last_location
|
|
344
|
+
else:
|
|
345
|
+
from_loc = types.Location(types.Point(0, 0, 0), LabwareLike(None))
|
|
346
|
+
|
|
347
|
+
# We just want to catch planning errors.
|
|
348
|
+
planning.plan_moves(
|
|
349
|
+
from_loc,
|
|
350
|
+
location,
|
|
351
|
+
self._protocol_interface.get_deck(),
|
|
352
|
+
self._instrument_max_height,
|
|
353
|
+
force_direct=force_direct,
|
|
354
|
+
minimum_z_height=minimum_z_height,
|
|
355
|
+
)
|
|
356
|
+
|
|
357
|
+
self._protocol_interface.set_last_location(location)
|
|
358
|
+
|
|
359
|
+
def get_mount(self) -> types.Mount:
|
|
360
|
+
return self._mount
|
|
361
|
+
|
|
362
|
+
def get_requested_as_name(self) -> str:
|
|
363
|
+
return self._instrument_name
|
|
364
|
+
|
|
365
|
+
def get_pipette_name(self) -> str:
|
|
366
|
+
return self._pipette_dict["name"]
|
|
367
|
+
|
|
368
|
+
def get_model(self) -> str:
|
|
369
|
+
return self._pipette_dict["model"]
|
|
370
|
+
|
|
371
|
+
def get_display_name(self) -> str:
|
|
372
|
+
return self._pipette_dict["display_name"]
|
|
373
|
+
|
|
374
|
+
def get_min_volume(self) -> float:
|
|
375
|
+
return self._pipette_dict["min_volume"]
|
|
376
|
+
|
|
377
|
+
def get_max_volume(self) -> float:
|
|
378
|
+
return self._pipette_dict["max_volume"]
|
|
379
|
+
|
|
380
|
+
def get_working_volume(self) -> float:
|
|
381
|
+
return self._pipette_dict["working_volume"]
|
|
382
|
+
|
|
383
|
+
def get_current_volume(self) -> float:
|
|
384
|
+
return self._pipette_dict["current_volume"]
|
|
385
|
+
|
|
386
|
+
def get_has_clean_tip(self) -> bool:
|
|
387
|
+
return False
|
|
388
|
+
|
|
389
|
+
def get_available_volume(self) -> float:
|
|
390
|
+
return self._pipette_dict["available_volume"]
|
|
391
|
+
|
|
392
|
+
def get_hardware_state(self) -> PipetteDict:
|
|
393
|
+
return self._pipette_dict
|
|
394
|
+
|
|
395
|
+
def get_channels(self) -> int:
|
|
396
|
+
return self._pipette_dict["channels"]
|
|
397
|
+
|
|
398
|
+
def has_tip(self) -> bool:
|
|
399
|
+
return self._pipette_dict["has_tip"]
|
|
400
|
+
|
|
401
|
+
def is_ready_to_aspirate(self) -> bool:
|
|
402
|
+
return self._pipette_dict["ready_to_aspirate"]
|
|
403
|
+
|
|
404
|
+
def prepare_to_aspirate(self) -> None:
|
|
405
|
+
self._raise_if_no_tip(HardwareAction.PREPARE_ASPIRATE.name)
|
|
406
|
+
|
|
407
|
+
def get_return_height(self) -> float:
|
|
408
|
+
return self._pipette_dict["return_tip_height"]
|
|
409
|
+
|
|
410
|
+
def get_speed(self) -> PlungerSpeeds:
|
|
411
|
+
return self._plunger_speeds
|
|
412
|
+
|
|
413
|
+
def get_liquid_presence_detection(self) -> bool:
|
|
414
|
+
return self._liquid_presence_detection
|
|
415
|
+
|
|
416
|
+
def set_liquid_presence_detection(self, enable: bool) -> None:
|
|
417
|
+
self._liquid_presence_detection = enable
|
|
418
|
+
|
|
419
|
+
def get_flow_rate(self) -> FlowRates:
|
|
420
|
+
return self._flow_rate
|
|
421
|
+
|
|
422
|
+
def get_aspirate_flow_rate(self, rate: float = 1.0) -> float:
|
|
423
|
+
return self._pipette_dict["aspirate_flow_rate"] * rate
|
|
424
|
+
|
|
425
|
+
def get_dispense_flow_rate(self, rate: float = 1.0) -> float:
|
|
426
|
+
return self._pipette_dict["dispense_flow_rate"] * rate
|
|
427
|
+
|
|
428
|
+
def get_blow_out_flow_rate(self, rate: float = 1.0) -> float:
|
|
429
|
+
return self._pipette_dict["blow_out_flow_rate"] * rate
|
|
430
|
+
|
|
431
|
+
def get_tip_origin(
|
|
432
|
+
self,
|
|
433
|
+
) -> Optional[Tuple[LegacyLabwareCore, LegacyWellCore]]:
|
|
434
|
+
return self._last_tip_rack_and_well
|
|
435
|
+
|
|
436
|
+
def set_flow_rate(
|
|
437
|
+
self,
|
|
438
|
+
aspirate: Optional[float] = None,
|
|
439
|
+
dispense: Optional[float] = None,
|
|
440
|
+
blow_out: Optional[float] = None,
|
|
441
|
+
) -> None:
|
|
442
|
+
self._protocol_interface.get_hardware().set_flow_rate(
|
|
443
|
+
mount=self._mount,
|
|
444
|
+
aspirate=aspirate,
|
|
445
|
+
dispense=dispense,
|
|
446
|
+
blow_out=blow_out,
|
|
447
|
+
)
|
|
448
|
+
self._update_flow_rate()
|
|
449
|
+
|
|
450
|
+
def set_pipette_speed(
|
|
451
|
+
self,
|
|
452
|
+
aspirate: Optional[float] = None,
|
|
453
|
+
dispense: Optional[float] = None,
|
|
454
|
+
blow_out: Optional[float] = None,
|
|
455
|
+
) -> None:
|
|
456
|
+
self._protocol_interface.get_hardware().set_pipette_speed(
|
|
457
|
+
mount=self._mount,
|
|
458
|
+
aspirate=aspirate,
|
|
459
|
+
dispense=dispense,
|
|
460
|
+
blow_out=blow_out,
|
|
461
|
+
)
|
|
462
|
+
self._update_flow_rate()
|
|
463
|
+
|
|
464
|
+
def flag_unsafe_move(self, location: types.Location) -> None:
|
|
465
|
+
"""Check if a movement to a destination is potentially unsafe.
|
|
466
|
+
|
|
467
|
+
Args:
|
|
468
|
+
location: The movement destination.
|
|
469
|
+
|
|
470
|
+
Raises:
|
|
471
|
+
RuntimeError: The movement is unsafe.
|
|
472
|
+
"""
|
|
473
|
+
from_loc = self._protocol_interface.get_last_location()
|
|
474
|
+
|
|
475
|
+
if not from_loc:
|
|
476
|
+
from_loc = types.Location(types.Point(0, 0, 0), LabwareLike(None))
|
|
477
|
+
|
|
478
|
+
for mod in self._protocol_interface.get_module_cores():
|
|
479
|
+
if isinstance(mod, LegacyThermocyclerCore):
|
|
480
|
+
mod.flag_unsafe_move(to_loc=location, from_loc=from_loc)
|
|
481
|
+
elif isinstance(mod, LegacyHeaterShakerCore):
|
|
482
|
+
mod.flag_unsafe_move(
|
|
483
|
+
to_loc=location,
|
|
484
|
+
is_multichannel=self.get_channels() > 1,
|
|
485
|
+
)
|
|
486
|
+
|
|
487
|
+
def _update_flow_rate(self) -> None:
|
|
488
|
+
"""Update cached speed and flow rates from hardware controller pipette."""
|
|
489
|
+
p = self._protocol_interface.get_hardware().get_attached_instrument(
|
|
490
|
+
self.get_mount()
|
|
491
|
+
)
|
|
492
|
+
self._pipette_dict["aspirate_flow_rate"] = p["aspirate_flow_rate"]
|
|
493
|
+
self._pipette_dict["dispense_flow_rate"] = p["dispense_flow_rate"]
|
|
494
|
+
self._pipette_dict["blow_out_flow_rate"] = p["blow_out_flow_rate"]
|
|
495
|
+
self._pipette_dict["aspirate_speed"] = p["aspirate_speed"]
|
|
496
|
+
self._pipette_dict["dispense_speed"] = p["dispense_speed"]
|
|
497
|
+
self._pipette_dict["blow_out_speed"] = p["blow_out_speed"]
|
|
498
|
+
|
|
499
|
+
def _raise_if_no_tip(self, action: str) -> None:
|
|
500
|
+
"""Raise UnexpectedTipRemovalError if no tip."""
|
|
501
|
+
if not self.has_tip():
|
|
502
|
+
raise UnexpectedTipRemovalError(
|
|
503
|
+
action, self._instrument_name, self._mount.name
|
|
504
|
+
)
|
|
505
|
+
|
|
506
|
+
def _raise_if_tip(self, action: str) -> None:
|
|
507
|
+
"""Raise UnexpectedTipAttachError if tip."""
|
|
508
|
+
if self.has_tip():
|
|
509
|
+
raise UnexpectedTipAttachError(
|
|
510
|
+
action, self._instrument_name, self._mount.name
|
|
511
|
+
)
|
|
512
|
+
|
|
513
|
+
def configure_for_volume(self, volume: float) -> None:
|
|
514
|
+
"""This will never be called because it was added in API 2.15."""
|
|
515
|
+
pass
|
|
516
|
+
|
|
517
|
+
def configure_nozzle_layout(
|
|
518
|
+
self,
|
|
519
|
+
style: NozzleLayout,
|
|
520
|
+
primary_nozzle: Optional[str],
|
|
521
|
+
front_right_nozzle: Optional[str],
|
|
522
|
+
back_left_nozzle: Optional[str],
|
|
523
|
+
) -> None:
|
|
524
|
+
"""This will never be called because it was added in API 2.15."""
|
|
525
|
+
pass
|
|
526
|
+
|
|
527
|
+
def transfer_with_liquid_class(
|
|
528
|
+
self,
|
|
529
|
+
liquid_class: LiquidClass,
|
|
530
|
+
volume: float,
|
|
531
|
+
source: List[Tuple[types.Location, LegacyWellCore]],
|
|
532
|
+
dest: Union[List[Tuple[types.Location, LegacyWellCore]], TrashBin, WasteChute],
|
|
533
|
+
new_tip: TransferTipPolicyV2,
|
|
534
|
+
tip_racks: List[Tuple[types.Location, LegacyLabwareCore]],
|
|
535
|
+
starting_tip: Optional[LegacyWellCore],
|
|
536
|
+
trash_location: Union[types.Location, TrashBin, WasteChute],
|
|
537
|
+
return_tip: bool,
|
|
538
|
+
keep_last_tip: bool,
|
|
539
|
+
) -> None:
|
|
540
|
+
"""This will never be called because it was added in API 2.23."""
|
|
541
|
+
assert False, "transfer_liquid is not supported in legacy context"
|
|
542
|
+
|
|
543
|
+
def distribute_with_liquid_class(
|
|
544
|
+
self,
|
|
545
|
+
liquid_class: LiquidClass,
|
|
546
|
+
volume: float,
|
|
547
|
+
source: Tuple[types.Location, LegacyWellCore],
|
|
548
|
+
dest: List[Tuple[types.Location, LegacyWellCore]],
|
|
549
|
+
new_tip: Literal[TransferTipPolicyV2.NEVER, TransferTipPolicyV2.ONCE],
|
|
550
|
+
tip_racks: List[Tuple[types.Location, LegacyLabwareCore]],
|
|
551
|
+
starting_tip: Optional[LegacyWellCore],
|
|
552
|
+
trash_location: Union[types.Location, TrashBin, WasteChute],
|
|
553
|
+
return_tip: bool,
|
|
554
|
+
keep_last_tip: bool,
|
|
555
|
+
) -> None:
|
|
556
|
+
"""This will never be called because it was added in API 2.23."""
|
|
557
|
+
assert False, "distribute_liquid is not supported in legacy context"
|
|
558
|
+
|
|
559
|
+
def consolidate_with_liquid_class(
|
|
560
|
+
self,
|
|
561
|
+
liquid_class: LiquidClass,
|
|
562
|
+
volume: float,
|
|
563
|
+
source: List[Tuple[types.Location, LegacyWellCore]],
|
|
564
|
+
dest: Union[Tuple[types.Location, LegacyWellCore], TrashBin, WasteChute],
|
|
565
|
+
new_tip: Literal[TransferTipPolicyV2.NEVER, TransferTipPolicyV2.ONCE],
|
|
566
|
+
tip_racks: List[Tuple[types.Location, LegacyLabwareCore]],
|
|
567
|
+
starting_tip: Optional[LegacyWellCore],
|
|
568
|
+
trash_location: Union[types.Location, TrashBin, WasteChute],
|
|
569
|
+
return_tip: bool,
|
|
570
|
+
keep_last_tip: bool,
|
|
571
|
+
) -> None:
|
|
572
|
+
"""This will never be called because it was added in API 2.23."""
|
|
573
|
+
assert False, "consolidate_liquid is not supported in legacy context"
|
|
574
|
+
|
|
575
|
+
def get_active_channels(self) -> int:
|
|
576
|
+
"""This will never be called because it was added in API 2.16."""
|
|
577
|
+
assert False, "get_active_channels only supported in API 2.16 & later"
|
|
578
|
+
|
|
579
|
+
def get_nozzle_map(self) -> types.NozzleMapInterface:
|
|
580
|
+
"""This will never be called because it was added in API 2.18."""
|
|
581
|
+
assert False, "get_nozzle_map only supported in API 2.18 & later"
|
|
582
|
+
|
|
583
|
+
def is_tip_tracking_available(self) -> bool:
|
|
584
|
+
# Tip tracking is always available in legacy context
|
|
585
|
+
return True
|
|
586
|
+
|
|
587
|
+
def retract(self) -> None:
|
|
588
|
+
"""Retract this instrument to the top of the gantry."""
|
|
589
|
+
self._protocol_interface.get_hardware.retract(self._mount) # type: ignore [attr-defined]
|
|
590
|
+
|
|
591
|
+
def detect_liquid_presence(self, well_core: WellCore, loc: types.Location) -> bool:
|
|
592
|
+
"""This will never be called because it was added in API 2.20."""
|
|
593
|
+
assert False, "detect_liquid_presence only supported in API 2.20 & later"
|
|
594
|
+
|
|
595
|
+
def liquid_probe_with_recovery(
|
|
596
|
+
self, well_core: WellCore, loc: types.Location
|
|
597
|
+
) -> None:
|
|
598
|
+
"""This will never be called because it was added in API 2.20."""
|
|
599
|
+
assert False, "liquid_probe_with_recovery only supported in API 2.20 & later"
|
|
600
|
+
|
|
601
|
+
def liquid_probe_without_recovery(
|
|
602
|
+
self, well_core: WellCore, loc: types.Location
|
|
603
|
+
) -> LiquidTrackingType:
|
|
604
|
+
"""This will never be called because it was added in API 2.20."""
|
|
605
|
+
assert False, "liquid_probe_without_recovery only supported in API 2.20 & later"
|
|
606
|
+
|
|
607
|
+
def _pressure_supported_by_pipette(self) -> bool:
|
|
608
|
+
return False
|
|
609
|
+
|
|
610
|
+
def nozzle_configuration_valid_for_lld(self) -> bool:
|
|
611
|
+
"""Check if the nozzle configuration currently supports LLD."""
|
|
612
|
+
return False
|
|
613
|
+
|
|
614
|
+
def get_minimum_liquid_sense_height(self) -> float:
|
|
615
|
+
return 0.0
|
|
616
|
+
|
|
617
|
+
def estimate_liquid_height(
|
|
618
|
+
self,
|
|
619
|
+
well_core: LegacyWellCore,
|
|
620
|
+
starting_liquid_height: float,
|
|
621
|
+
operation_volume: float,
|
|
622
|
+
) -> float:
|
|
623
|
+
"""This will never be called because it was added in API 2.21."""
|
|
624
|
+
assert False, "estimate_liquid_height only supported in API 2.21 & later"
|