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,233 @@
|
|
|
1
|
+
from enum import Enum, auto
|
|
2
|
+
from typing import TYPE_CHECKING, Any, Optional, Union, cast, Tuple, List, Set
|
|
3
|
+
|
|
4
|
+
if TYPE_CHECKING:
|
|
5
|
+
from opentrons.protocol_api.labware import Labware, Well
|
|
6
|
+
from opentrons.protocol_api.core.legacy.module_geometry import ModuleGeometry
|
|
7
|
+
from opentrons.protocol_api.module_contexts import ModuleContext
|
|
8
|
+
from opentrons.protocol_api._types import OffDeckType
|
|
9
|
+
|
|
10
|
+
WrappableLabwareLike = Union[
|
|
11
|
+
"Labware",
|
|
12
|
+
"Well",
|
|
13
|
+
str,
|
|
14
|
+
"ModuleGeometry",
|
|
15
|
+
"LabwareLike",
|
|
16
|
+
None,
|
|
17
|
+
"OffDeckType",
|
|
18
|
+
"ModuleContext",
|
|
19
|
+
]
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class LabwareLikeType(int, Enum):
|
|
23
|
+
LABWARE = auto()
|
|
24
|
+
SLOT = auto()
|
|
25
|
+
WELL = auto()
|
|
26
|
+
MODULE = auto()
|
|
27
|
+
NONE = auto()
|
|
28
|
+
OFF_DECK = auto()
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class LabwareLike:
|
|
32
|
+
"""A wrapper for a labware like object."""
|
|
33
|
+
|
|
34
|
+
def __init__(self, labware_like: WrappableLabwareLike):
|
|
35
|
+
"""
|
|
36
|
+
Create a labware like object. Used by Location object's labware field.
|
|
37
|
+
"""
|
|
38
|
+
# Import locally to avoid circular dependency
|
|
39
|
+
from opentrons.protocol_api.labware import Labware, Well
|
|
40
|
+
from opentrons.protocol_api.core.legacy.module_geometry import (
|
|
41
|
+
ModuleGeometry,
|
|
42
|
+
)
|
|
43
|
+
from opentrons.protocol_api.module_contexts import ModuleContext
|
|
44
|
+
from opentrons.protocol_api._types import OffDeckType
|
|
45
|
+
|
|
46
|
+
self._labware_like = labware_like
|
|
47
|
+
self._type = LabwareLikeType.NONE
|
|
48
|
+
|
|
49
|
+
# TODO(mc 2022-10-28): for the love of all that is holy
|
|
50
|
+
# do not use __repr__ or __str__ to do this; it's so confusing
|
|
51
|
+
if isinstance(self._labware_like, Well):
|
|
52
|
+
self._type = LabwareLikeType.WELL
|
|
53
|
+
self._as_str = repr(self._labware_like)
|
|
54
|
+
elif isinstance(self._labware_like, Labware):
|
|
55
|
+
self._type = LabwareLikeType.LABWARE
|
|
56
|
+
self._as_str = repr(self._labware_like)
|
|
57
|
+
elif isinstance(self._labware_like, str):
|
|
58
|
+
self._type = LabwareLikeType.SLOT
|
|
59
|
+
self._as_str = self._labware_like
|
|
60
|
+
elif isinstance(self._labware_like, (ModuleGeometry, ModuleContext)):
|
|
61
|
+
self._type = LabwareLikeType.MODULE
|
|
62
|
+
self._as_str = repr(self._labware_like)
|
|
63
|
+
elif isinstance(self._labware_like, LabwareLike):
|
|
64
|
+
self._type = self._labware_like._type
|
|
65
|
+
self._as_str = self._labware_like._as_str
|
|
66
|
+
self._labware_like = self._labware_like.object
|
|
67
|
+
elif isinstance(self._labware_like, OffDeckType):
|
|
68
|
+
self._type = LabwareLikeType.OFF_DECK
|
|
69
|
+
self._as_str = repr(self._labware_like)
|
|
70
|
+
else:
|
|
71
|
+
self._as_str = ""
|
|
72
|
+
|
|
73
|
+
@property
|
|
74
|
+
def object(self) -> WrappableLabwareLike:
|
|
75
|
+
return self._labware_like
|
|
76
|
+
|
|
77
|
+
@property
|
|
78
|
+
def object_type(self) -> LabwareLikeType:
|
|
79
|
+
return self._type
|
|
80
|
+
|
|
81
|
+
@property
|
|
82
|
+
def has_parent(self) -> bool:
|
|
83
|
+
return self._type in {
|
|
84
|
+
LabwareLikeType.LABWARE,
|
|
85
|
+
LabwareLikeType.WELL,
|
|
86
|
+
LabwareLikeType.MODULE,
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
@property
|
|
90
|
+
def parent(self) -> "LabwareLike":
|
|
91
|
+
# Type ignoring because type checker is not aware that has_parent
|
|
92
|
+
# performs the validation.
|
|
93
|
+
parent = None
|
|
94
|
+
if self.has_parent:
|
|
95
|
+
parent = self.object.parent # type: ignore
|
|
96
|
+
return LabwareLike(parent)
|
|
97
|
+
|
|
98
|
+
@property
|
|
99
|
+
def is_well(self) -> bool:
|
|
100
|
+
return self.object_type == LabwareLikeType.WELL
|
|
101
|
+
|
|
102
|
+
@property
|
|
103
|
+
def is_labware(self) -> bool:
|
|
104
|
+
return self.object_type == LabwareLikeType.LABWARE
|
|
105
|
+
|
|
106
|
+
@property
|
|
107
|
+
def is_slot(self) -> bool:
|
|
108
|
+
return self.object_type == LabwareLikeType.SLOT
|
|
109
|
+
|
|
110
|
+
@property
|
|
111
|
+
def is_empty(self) -> bool:
|
|
112
|
+
return self.object_type == LabwareLikeType.NONE
|
|
113
|
+
|
|
114
|
+
@property
|
|
115
|
+
def is_module(self) -> bool:
|
|
116
|
+
return self.object_type == LabwareLikeType.MODULE
|
|
117
|
+
|
|
118
|
+
def as_well(self) -> "Well":
|
|
119
|
+
# Import locally to avoid circular dependency
|
|
120
|
+
from opentrons.protocol_api.labware import Well
|
|
121
|
+
|
|
122
|
+
return cast(Well, self.object)
|
|
123
|
+
|
|
124
|
+
def as_labware(self) -> "Labware":
|
|
125
|
+
# Import locally to avoid circular dependency
|
|
126
|
+
from opentrons.protocol_api.labware import Labware
|
|
127
|
+
|
|
128
|
+
return cast(Labware, self.object)
|
|
129
|
+
|
|
130
|
+
def as_module(self) -> Union["ModuleContext", "ModuleGeometry"]:
|
|
131
|
+
from opentrons.protocol_api.core.legacy.module_geometry import (
|
|
132
|
+
ModuleGeometry,
|
|
133
|
+
)
|
|
134
|
+
from opentrons.protocol_api.module_contexts import ModuleContext
|
|
135
|
+
|
|
136
|
+
if isinstance(self.object, ModuleContext):
|
|
137
|
+
return self.object
|
|
138
|
+
|
|
139
|
+
return cast(ModuleGeometry, self.object)
|
|
140
|
+
|
|
141
|
+
def get_parent_labware_and_well(
|
|
142
|
+
self,
|
|
143
|
+
) -> Tuple[Optional["Labware"], Optional["Well"]]:
|
|
144
|
+
"""Attempt to split into a labware and well."""
|
|
145
|
+
if self.is_labware:
|
|
146
|
+
return self.as_labware(), None
|
|
147
|
+
elif self.is_well and self.parent:
|
|
148
|
+
return (
|
|
149
|
+
self.parent.as_labware(),
|
|
150
|
+
self.as_well(),
|
|
151
|
+
)
|
|
152
|
+
else:
|
|
153
|
+
return None, None
|
|
154
|
+
|
|
155
|
+
def first_parent(self) -> Optional[str]:
|
|
156
|
+
"""Return the topmost parent of this location. It should be
|
|
157
|
+
either a string naming a slot or a None if the location isn't
|
|
158
|
+
associated with a slot"""
|
|
159
|
+
|
|
160
|
+
# cycle-detecting recursive climbing
|
|
161
|
+
seen: Set[LabwareLike] = set()
|
|
162
|
+
|
|
163
|
+
# internal function to have the cycle detector different per call
|
|
164
|
+
def _fp_recurse(location: LabwareLike) -> Optional[str]:
|
|
165
|
+
if location in seen:
|
|
166
|
+
raise RuntimeError("Cycle in labware parent")
|
|
167
|
+
seen.add(location)
|
|
168
|
+
if location.is_empty:
|
|
169
|
+
return None
|
|
170
|
+
elif location.is_slot:
|
|
171
|
+
return str(location)
|
|
172
|
+
else:
|
|
173
|
+
return location.parent.first_parent()
|
|
174
|
+
|
|
175
|
+
return _fp_recurse(self)
|
|
176
|
+
|
|
177
|
+
def module_parent(self) -> Union["ModuleGeometry", "ModuleContext", None]:
|
|
178
|
+
"""
|
|
179
|
+
Return the closest parent of this LabwareLike (including, possibly,
|
|
180
|
+
the wrapped object) that is a ModuleGeometry
|
|
181
|
+
"""
|
|
182
|
+
|
|
183
|
+
def recursive_get_module_parent(
|
|
184
|
+
obj: LabwareLike,
|
|
185
|
+
) -> Union["ModuleGeometry", "ModuleContext", None]:
|
|
186
|
+
if obj.is_module:
|
|
187
|
+
return obj.as_module()
|
|
188
|
+
next_obj = obj.parent
|
|
189
|
+
if next_obj.is_empty:
|
|
190
|
+
return None
|
|
191
|
+
else:
|
|
192
|
+
return recursive_get_module_parent(obj.parent)
|
|
193
|
+
|
|
194
|
+
if self.is_empty:
|
|
195
|
+
return None
|
|
196
|
+
return recursive_get_module_parent(self)
|
|
197
|
+
|
|
198
|
+
def quirks_from_any_parent(self) -> Set[str]:
|
|
199
|
+
"""Walk the tree of wells and labwares and extract quirks"""
|
|
200
|
+
|
|
201
|
+
def recursive_get_quirks(obj: LabwareLike, found: List[str]) -> List[str]:
|
|
202
|
+
if obj.is_labware:
|
|
203
|
+
return found + obj.as_labware().quirks
|
|
204
|
+
elif obj.is_well:
|
|
205
|
+
return recursive_get_quirks(obj.parent, found)
|
|
206
|
+
else:
|
|
207
|
+
return found
|
|
208
|
+
|
|
209
|
+
return set(recursive_get_quirks(self, []))
|
|
210
|
+
|
|
211
|
+
def is_fixed_trash(self) -> bool:
|
|
212
|
+
"""Check if fixedTrash quirk is in any parent."""
|
|
213
|
+
return "fixedTrash" in self.quirks_from_any_parent()
|
|
214
|
+
|
|
215
|
+
def center_multichannel_on_wells(self) -> bool:
|
|
216
|
+
"""Check if centerMultichannelOnWells quirk is in any parent."""
|
|
217
|
+
return "centerMultichannelOnWells" in self.quirks_from_any_parent()
|
|
218
|
+
|
|
219
|
+
def __str__(self) -> str:
|
|
220
|
+
return self._as_str
|
|
221
|
+
|
|
222
|
+
def __repr__(self) -> str:
|
|
223
|
+
return str(self)
|
|
224
|
+
|
|
225
|
+
def __eq__(self, other: Any) -> bool:
|
|
226
|
+
return (
|
|
227
|
+
other is not None
|
|
228
|
+
and isinstance(other, LabwareLike)
|
|
229
|
+
and self.object == other.object
|
|
230
|
+
)
|
|
231
|
+
|
|
232
|
+
def __hash__(self) -> int:
|
|
233
|
+
return id(self)
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
from itertools import dropwhile, takewhile
|
|
2
|
+
from typing import Optional, Sequence
|
|
3
|
+
|
|
4
|
+
from opentrons.protocol_api.core.well import AbstractWellCore
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
Wells = Sequence[AbstractWellCore]
|
|
8
|
+
WellColumns = Sequence[Wells]
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class TipTracker:
|
|
12
|
+
def __init__(self, columns: WellColumns):
|
|
13
|
+
self._columns = columns
|
|
14
|
+
|
|
15
|
+
def next_tip(
|
|
16
|
+
self, num_tips: int = 1, starting_tip: Optional[AbstractWellCore] = None
|
|
17
|
+
) -> Optional[AbstractWellCore]:
|
|
18
|
+
"""
|
|
19
|
+
Find the next valid well for pick-up.
|
|
20
|
+
|
|
21
|
+
Determines the next valid start tip from which to retrieve the
|
|
22
|
+
specified number of tips. There must be at least `num_tips` sequential
|
|
23
|
+
wells for which all wells have tips, in the same column.
|
|
24
|
+
|
|
25
|
+
:param num_tips: target number of sequential tips in the same column
|
|
26
|
+
:type num_tips: int
|
|
27
|
+
:param starting_tip: The :py:class:`.Well` from which to start search.
|
|
28
|
+
for an available tip.
|
|
29
|
+
:type starting_tip: :py:class:`.Well`
|
|
30
|
+
:return: the :py:class:`.Well` meeting the target criteria, or None
|
|
31
|
+
"""
|
|
32
|
+
columns: WellColumns = self._columns
|
|
33
|
+
if starting_tip:
|
|
34
|
+
# Remove columns preceding the one with the pipette's starting tip
|
|
35
|
+
drop_undefined_columns = list(
|
|
36
|
+
dropwhile(lambda x: starting_tip not in x, columns)
|
|
37
|
+
)
|
|
38
|
+
# Remove tips preceding the starting tip in the first column
|
|
39
|
+
drop_undefined_columns[0] = list(
|
|
40
|
+
dropwhile(lambda w: starting_tip is not w, drop_undefined_columns[0])
|
|
41
|
+
)
|
|
42
|
+
columns = drop_undefined_columns
|
|
43
|
+
|
|
44
|
+
drop_leading_empties = [
|
|
45
|
+
list(dropwhile(lambda x: not x.has_tip(), column)) for column in columns
|
|
46
|
+
]
|
|
47
|
+
drop_at_first_gap = [
|
|
48
|
+
list(takewhile(lambda x: x.has_tip(), column))
|
|
49
|
+
for column in drop_leading_empties
|
|
50
|
+
]
|
|
51
|
+
long_enough = [
|
|
52
|
+
column for column in drop_at_first_gap if len(column) >= num_tips
|
|
53
|
+
]
|
|
54
|
+
|
|
55
|
+
try:
|
|
56
|
+
first_long_enough = long_enough[0]
|
|
57
|
+
result: Optional[AbstractWellCore] = first_long_enough[0]
|
|
58
|
+
except IndexError:
|
|
59
|
+
result = None
|
|
60
|
+
|
|
61
|
+
return result
|
|
62
|
+
|
|
63
|
+
def use_tips(
|
|
64
|
+
self,
|
|
65
|
+
start_well: AbstractWellCore,
|
|
66
|
+
num_channels: int = 1,
|
|
67
|
+
fail_if_full: bool = False,
|
|
68
|
+
) -> None:
|
|
69
|
+
"""
|
|
70
|
+
Removes tips from the tip tracker.
|
|
71
|
+
|
|
72
|
+
This method should be called when a tip is picked up. Generally, it
|
|
73
|
+
will be called with `num_channels=1` or `num_channels=8` for single-
|
|
74
|
+
and multi-channel respectively. If picking up with more than one
|
|
75
|
+
channel, this method will automatically determine which tips are used
|
|
76
|
+
based on the start well, the number of channels, and the geometry of
|
|
77
|
+
the tiprack.
|
|
78
|
+
|
|
79
|
+
:param start_well: The :py:class:`.Well` from which to pick up a tip.
|
|
80
|
+
For a single-channel pipette, this is the well to
|
|
81
|
+
send the pipette to. For a multi-channel pipette,
|
|
82
|
+
this is the well to send the back-most nozzle of the
|
|
83
|
+
pipette to.
|
|
84
|
+
:type start_well: :py:class:`.Well`
|
|
85
|
+
:param num_channels: The number of channels for the current pipette
|
|
86
|
+
:type num_channels: int
|
|
87
|
+
:param fail_if_full: for backwards compatibility
|
|
88
|
+
"""
|
|
89
|
+
# Select the column of the labware that contains the target well
|
|
90
|
+
target_column = [col for col in self._columns if start_well in col][0]
|
|
91
|
+
|
|
92
|
+
well_idx = target_column.index(start_well)
|
|
93
|
+
# Number of tips to pick up is the lesser of (1) the number of tips
|
|
94
|
+
# from the starting well to the end of the column, and (2) the number
|
|
95
|
+
# of channels of the pipette (so a 4-channel pipette would pick up a
|
|
96
|
+
# max of 4 tips, and picking up from the 2nd-to-bottom well in a
|
|
97
|
+
# column would get a maximum of 2 tips)
|
|
98
|
+
num_tips = min(len(target_column) - well_idx, num_channels)
|
|
99
|
+
target_wells = target_column[well_idx : well_idx + num_tips]
|
|
100
|
+
|
|
101
|
+
# In API version 2.2, we no longer reset the tip tracker when a tip
|
|
102
|
+
# is dropped back into a tiprack well. This fixes a behavior where
|
|
103
|
+
# subsequent transfers would reuse the dirty tip. However, sometimes
|
|
104
|
+
# the user explicitly wants to use a dirty tip, and this check would
|
|
105
|
+
# raise an exception if they tried to do so.
|
|
106
|
+
# An extension of work here is to have separate tip trackers for
|
|
107
|
+
# dirty tips and non-present tips; but until then, we can avoid the
|
|
108
|
+
# exception.
|
|
109
|
+
if fail_if_full:
|
|
110
|
+
assert all(
|
|
111
|
+
well.has_tip() for well in target_wells
|
|
112
|
+
), "{} is out of tips".format(str(self))
|
|
113
|
+
|
|
114
|
+
for well in target_wells:
|
|
115
|
+
well.set_has_tip(False)
|
|
116
|
+
|
|
117
|
+
def previous_tip(self, num_tips: int = 1) -> Optional[AbstractWellCore]:
|
|
118
|
+
"""
|
|
119
|
+
Find the best well to drop a tip in.
|
|
120
|
+
|
|
121
|
+
This is the well from which the last tip was picked up, if there's
|
|
122
|
+
room. It can be used to return tips to the tip tracker.
|
|
123
|
+
|
|
124
|
+
:param num_tips: target number of tips to return, sequential in a
|
|
125
|
+
column
|
|
126
|
+
:type num_tips: int
|
|
127
|
+
:return: The :py:class:`.Well` meeting the target criteria, or ``None``
|
|
128
|
+
"""
|
|
129
|
+
columns = self._columns
|
|
130
|
+
drop_leading_filled = [
|
|
131
|
+
list(dropwhile(lambda x: x.has_tip(), column)) for column in columns
|
|
132
|
+
]
|
|
133
|
+
drop_at_first_gap = [
|
|
134
|
+
list(takewhile(lambda x: not x.has_tip(), column))
|
|
135
|
+
for column in drop_leading_filled
|
|
136
|
+
]
|
|
137
|
+
long_enough = [
|
|
138
|
+
column for column in drop_at_first_gap if len(column) >= num_tips
|
|
139
|
+
]
|
|
140
|
+
try:
|
|
141
|
+
return long_enough[0][0]
|
|
142
|
+
except IndexError:
|
|
143
|
+
return None
|
|
144
|
+
|
|
145
|
+
def return_tips(self, start_well: AbstractWellCore, num_channels: int = 1) -> None:
|
|
146
|
+
"""
|
|
147
|
+
Re-adds tips to the tip tracker
|
|
148
|
+
|
|
149
|
+
This method should be called when a tip is dropped in a tiprack. It
|
|
150
|
+
should be called with ``num_channels=1`` or ``num_channels=8`` for
|
|
151
|
+
single- and multi-channel respectively. If returning more than one
|
|
152
|
+
channel, this method will automatically determine which tips are
|
|
153
|
+
returned based on the start well, the number of channels,
|
|
154
|
+
and the tiprack geometry.
|
|
155
|
+
|
|
156
|
+
Note that unlike :py:meth:`use_tips`, calling this method in a way
|
|
157
|
+
that would drop tips into wells with tips in them will raise an
|
|
158
|
+
exception; this should only be called on a valid return of
|
|
159
|
+
:py:meth:`previous_tip`.
|
|
160
|
+
|
|
161
|
+
:param start_well: The :py:class:`.Well` into which to return a tip.
|
|
162
|
+
:type start_well: :py:class:`.Well`
|
|
163
|
+
:param num_channels: The number of channels for the current pipette
|
|
164
|
+
:type num_channels: int
|
|
165
|
+
"""
|
|
166
|
+
# Select the column that contains the target_well
|
|
167
|
+
target_column = [col for col in self._columns if start_well in col][0]
|
|
168
|
+
well_idx = target_column.index(start_well)
|
|
169
|
+
end_idx = min(well_idx + num_channels, len(target_column))
|
|
170
|
+
drop_targets = target_column[well_idx:end_idx]
|
|
171
|
+
for well in drop_targets:
|
|
172
|
+
if well.has_tip():
|
|
173
|
+
raise AssertionError(f"Well {repr(well)} has a tip")
|
|
174
|
+
for well in drop_targets:
|
|
175
|
+
well.set_has_tip(True)
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
from typing import NamedTuple, TypedDict
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
class APIVersion(NamedTuple):
|
|
6
|
+
major: int
|
|
7
|
+
minor: int
|
|
8
|
+
|
|
9
|
+
@classmethod
|
|
10
|
+
def from_string(cls, inp: str) -> APIVersion:
|
|
11
|
+
parts = inp.split(".")
|
|
12
|
+
if len(parts) != 2:
|
|
13
|
+
raise ValueError(inp)
|
|
14
|
+
intparts = [int(p) for p in parts]
|
|
15
|
+
|
|
16
|
+
return cls(major=intparts[0], minor=intparts[1])
|
|
17
|
+
|
|
18
|
+
def __str__(self) -> str:
|
|
19
|
+
return f"{self.major}.{self.minor}"
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class ThermocyclerStepBase(TypedDict):
|
|
23
|
+
"""Required elements of a thermocycler step: the temperature."""
|
|
24
|
+
|
|
25
|
+
temperature: float
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class ThermocyclerStep(ThermocyclerStepBase, total=False):
|
|
29
|
+
"""Optional elements of a thermocycler step: the hold time. One of these must be present."""
|
|
30
|
+
|
|
31
|
+
hold_time_seconds: float
|
|
32
|
+
hold_time_minutes: float
|