opentrons 8.6.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of opentrons might be problematic. Click here for more details.
- opentrons/__init__.py +150 -0
- opentrons/_version.py +34 -0
- opentrons/calibration_storage/__init__.py +54 -0
- opentrons/calibration_storage/deck_configuration.py +62 -0
- opentrons/calibration_storage/encoder_decoder.py +31 -0
- opentrons/calibration_storage/file_operators.py +142 -0
- opentrons/calibration_storage/helpers.py +103 -0
- opentrons/calibration_storage/ot2/__init__.py +34 -0
- opentrons/calibration_storage/ot2/deck_attitude.py +85 -0
- opentrons/calibration_storage/ot2/mark_bad_calibration.py +27 -0
- opentrons/calibration_storage/ot2/models/__init__.py +0 -0
- opentrons/calibration_storage/ot2/models/v1.py +149 -0
- opentrons/calibration_storage/ot2/pipette_offset.py +129 -0
- opentrons/calibration_storage/ot2/tip_length.py +281 -0
- opentrons/calibration_storage/ot3/__init__.py +31 -0
- opentrons/calibration_storage/ot3/deck_attitude.py +83 -0
- opentrons/calibration_storage/ot3/gripper_offset.py +156 -0
- opentrons/calibration_storage/ot3/models/__init__.py +0 -0
- opentrons/calibration_storage/ot3/models/v1.py +122 -0
- opentrons/calibration_storage/ot3/module_offset.py +138 -0
- opentrons/calibration_storage/ot3/pipette_offset.py +95 -0
- opentrons/calibration_storage/types.py +45 -0
- opentrons/cli/__init__.py +21 -0
- opentrons/cli/__main__.py +5 -0
- opentrons/cli/analyze.py +557 -0
- opentrons/config/__init__.py +631 -0
- opentrons/config/advanced_settings.py +871 -0
- opentrons/config/defaults_ot2.py +214 -0
- opentrons/config/defaults_ot3.py +499 -0
- opentrons/config/feature_flags.py +86 -0
- opentrons/config/gripper_config.py +55 -0
- opentrons/config/reset.py +203 -0
- opentrons/config/robot_configs.py +187 -0
- opentrons/config/types.py +183 -0
- opentrons/drivers/__init__.py +0 -0
- opentrons/drivers/absorbance_reader/__init__.py +11 -0
- opentrons/drivers/absorbance_reader/abstract.py +72 -0
- opentrons/drivers/absorbance_reader/async_byonoy.py +352 -0
- opentrons/drivers/absorbance_reader/driver.py +81 -0
- opentrons/drivers/absorbance_reader/hid_protocol.py +161 -0
- opentrons/drivers/absorbance_reader/simulator.py +84 -0
- opentrons/drivers/asyncio/__init__.py +0 -0
- opentrons/drivers/asyncio/communication/__init__.py +22 -0
- opentrons/drivers/asyncio/communication/async_serial.py +187 -0
- opentrons/drivers/asyncio/communication/errors.py +88 -0
- opentrons/drivers/asyncio/communication/serial_connection.py +557 -0
- opentrons/drivers/command_builder.py +102 -0
- opentrons/drivers/flex_stacker/__init__.py +13 -0
- opentrons/drivers/flex_stacker/abstract.py +214 -0
- opentrons/drivers/flex_stacker/driver.py +768 -0
- opentrons/drivers/flex_stacker/errors.py +68 -0
- opentrons/drivers/flex_stacker/simulator.py +309 -0
- opentrons/drivers/flex_stacker/types.py +367 -0
- opentrons/drivers/flex_stacker/utils.py +19 -0
- opentrons/drivers/heater_shaker/__init__.py +5 -0
- opentrons/drivers/heater_shaker/abstract.py +76 -0
- opentrons/drivers/heater_shaker/driver.py +204 -0
- opentrons/drivers/heater_shaker/simulator.py +94 -0
- opentrons/drivers/mag_deck/__init__.py +6 -0
- opentrons/drivers/mag_deck/abstract.py +44 -0
- opentrons/drivers/mag_deck/driver.py +208 -0
- opentrons/drivers/mag_deck/simulator.py +63 -0
- opentrons/drivers/rpi_drivers/__init__.py +33 -0
- opentrons/drivers/rpi_drivers/dev_types.py +94 -0
- opentrons/drivers/rpi_drivers/gpio.py +282 -0
- opentrons/drivers/rpi_drivers/gpio_simulator.py +127 -0
- opentrons/drivers/rpi_drivers/interfaces.py +15 -0
- opentrons/drivers/rpi_drivers/types.py +364 -0
- opentrons/drivers/rpi_drivers/usb.py +102 -0
- opentrons/drivers/rpi_drivers/usb_simulator.py +22 -0
- opentrons/drivers/serial_communication.py +151 -0
- opentrons/drivers/smoothie_drivers/__init__.py +4 -0
- opentrons/drivers/smoothie_drivers/connection.py +51 -0
- opentrons/drivers/smoothie_drivers/constants.py +121 -0
- opentrons/drivers/smoothie_drivers/driver_3_0.py +1933 -0
- opentrons/drivers/smoothie_drivers/errors.py +49 -0
- opentrons/drivers/smoothie_drivers/parse_utils.py +143 -0
- opentrons/drivers/smoothie_drivers/simulator.py +99 -0
- opentrons/drivers/smoothie_drivers/types.py +16 -0
- opentrons/drivers/temp_deck/__init__.py +10 -0
- opentrons/drivers/temp_deck/abstract.py +54 -0
- opentrons/drivers/temp_deck/driver.py +197 -0
- opentrons/drivers/temp_deck/simulator.py +57 -0
- opentrons/drivers/thermocycler/__init__.py +12 -0
- opentrons/drivers/thermocycler/abstract.py +99 -0
- opentrons/drivers/thermocycler/driver.py +395 -0
- opentrons/drivers/thermocycler/simulator.py +126 -0
- opentrons/drivers/types.py +107 -0
- opentrons/drivers/utils.py +222 -0
- opentrons/execute.py +742 -0
- opentrons/hardware_control/__init__.py +65 -0
- opentrons/hardware_control/__main__.py +77 -0
- opentrons/hardware_control/adapters.py +98 -0
- opentrons/hardware_control/api.py +1347 -0
- opentrons/hardware_control/backends/__init__.py +7 -0
- opentrons/hardware_control/backends/controller.py +400 -0
- opentrons/hardware_control/backends/errors.py +9 -0
- opentrons/hardware_control/backends/estop_state.py +164 -0
- opentrons/hardware_control/backends/flex_protocol.py +497 -0
- opentrons/hardware_control/backends/ot3controller.py +1930 -0
- opentrons/hardware_control/backends/ot3simulator.py +900 -0
- opentrons/hardware_control/backends/ot3utils.py +664 -0
- opentrons/hardware_control/backends/simulator.py +442 -0
- opentrons/hardware_control/backends/status_bar_state.py +240 -0
- opentrons/hardware_control/backends/subsystem_manager.py +431 -0
- opentrons/hardware_control/backends/tip_presence_manager.py +173 -0
- opentrons/hardware_control/backends/types.py +14 -0
- opentrons/hardware_control/constants.py +6 -0
- opentrons/hardware_control/dev_types.py +125 -0
- opentrons/hardware_control/emulation/__init__.py +0 -0
- opentrons/hardware_control/emulation/abstract_emulator.py +21 -0
- opentrons/hardware_control/emulation/app.py +56 -0
- opentrons/hardware_control/emulation/connection_handler.py +38 -0
- opentrons/hardware_control/emulation/heater_shaker.py +150 -0
- opentrons/hardware_control/emulation/magdeck.py +60 -0
- opentrons/hardware_control/emulation/module_server/__init__.py +8 -0
- opentrons/hardware_control/emulation/module_server/client.py +78 -0
- opentrons/hardware_control/emulation/module_server/helpers.py +130 -0
- opentrons/hardware_control/emulation/module_server/models.py +31 -0
- opentrons/hardware_control/emulation/module_server/server.py +110 -0
- opentrons/hardware_control/emulation/parser.py +74 -0
- opentrons/hardware_control/emulation/proxy.py +241 -0
- opentrons/hardware_control/emulation/run_emulator.py +68 -0
- opentrons/hardware_control/emulation/scripts/__init__.py +0 -0
- opentrons/hardware_control/emulation/scripts/run_app.py +54 -0
- opentrons/hardware_control/emulation/scripts/run_module_emulator.py +72 -0
- opentrons/hardware_control/emulation/scripts/run_smoothie.py +37 -0
- opentrons/hardware_control/emulation/settings.py +119 -0
- opentrons/hardware_control/emulation/simulations.py +133 -0
- opentrons/hardware_control/emulation/smoothie.py +192 -0
- opentrons/hardware_control/emulation/tempdeck.py +69 -0
- opentrons/hardware_control/emulation/thermocycler.py +128 -0
- opentrons/hardware_control/emulation/types.py +10 -0
- opentrons/hardware_control/emulation/util.py +38 -0
- opentrons/hardware_control/errors.py +43 -0
- opentrons/hardware_control/execution_manager.py +164 -0
- opentrons/hardware_control/instruments/__init__.py +5 -0
- opentrons/hardware_control/instruments/instrument_abc.py +39 -0
- opentrons/hardware_control/instruments/ot2/__init__.py +0 -0
- opentrons/hardware_control/instruments/ot2/instrument_calibration.py +152 -0
- opentrons/hardware_control/instruments/ot2/pipette.py +777 -0
- opentrons/hardware_control/instruments/ot2/pipette_handler.py +995 -0
- opentrons/hardware_control/instruments/ot3/__init__.py +0 -0
- opentrons/hardware_control/instruments/ot3/gripper.py +420 -0
- opentrons/hardware_control/instruments/ot3/gripper_handler.py +173 -0
- opentrons/hardware_control/instruments/ot3/instrument_calibration.py +214 -0
- opentrons/hardware_control/instruments/ot3/pipette.py +858 -0
- opentrons/hardware_control/instruments/ot3/pipette_handler.py +1030 -0
- opentrons/hardware_control/module_control.py +332 -0
- opentrons/hardware_control/modules/__init__.py +69 -0
- opentrons/hardware_control/modules/absorbance_reader.py +373 -0
- opentrons/hardware_control/modules/errors.py +7 -0
- opentrons/hardware_control/modules/flex_stacker.py +948 -0
- opentrons/hardware_control/modules/heater_shaker.py +426 -0
- opentrons/hardware_control/modules/lid_temp_status.py +35 -0
- opentrons/hardware_control/modules/magdeck.py +233 -0
- opentrons/hardware_control/modules/mod_abc.py +245 -0
- opentrons/hardware_control/modules/module_calibration.py +93 -0
- opentrons/hardware_control/modules/plate_temp_status.py +61 -0
- opentrons/hardware_control/modules/tempdeck.py +299 -0
- opentrons/hardware_control/modules/thermocycler.py +731 -0
- opentrons/hardware_control/modules/types.py +417 -0
- opentrons/hardware_control/modules/update.py +255 -0
- opentrons/hardware_control/modules/utils.py +73 -0
- opentrons/hardware_control/motion_utilities.py +318 -0
- opentrons/hardware_control/nozzle_manager.py +422 -0
- opentrons/hardware_control/ot3_calibration.py +1171 -0
- opentrons/hardware_control/ot3api.py +3227 -0
- opentrons/hardware_control/pause_manager.py +31 -0
- opentrons/hardware_control/poller.py +112 -0
- opentrons/hardware_control/protocols/__init__.py +106 -0
- opentrons/hardware_control/protocols/asyncio_configurable.py +11 -0
- opentrons/hardware_control/protocols/calibratable.py +45 -0
- opentrons/hardware_control/protocols/chassis_accessory_manager.py +90 -0
- opentrons/hardware_control/protocols/configurable.py +48 -0
- opentrons/hardware_control/protocols/event_sourcer.py +18 -0
- opentrons/hardware_control/protocols/execution_controllable.py +33 -0
- opentrons/hardware_control/protocols/flex_calibratable.py +96 -0
- opentrons/hardware_control/protocols/flex_instrument_configurer.py +52 -0
- opentrons/hardware_control/protocols/gripper_controller.py +55 -0
- opentrons/hardware_control/protocols/hardware_manager.py +51 -0
- opentrons/hardware_control/protocols/identifiable.py +16 -0
- opentrons/hardware_control/protocols/instrument_configurer.py +206 -0
- opentrons/hardware_control/protocols/liquid_handler.py +266 -0
- opentrons/hardware_control/protocols/module_provider.py +16 -0
- opentrons/hardware_control/protocols/motion_controller.py +243 -0
- opentrons/hardware_control/protocols/position_estimator.py +45 -0
- opentrons/hardware_control/protocols/simulatable.py +10 -0
- opentrons/hardware_control/protocols/stoppable.py +9 -0
- opentrons/hardware_control/protocols/types.py +27 -0
- opentrons/hardware_control/robot_calibration.py +224 -0
- opentrons/hardware_control/scripts/README.md +28 -0
- opentrons/hardware_control/scripts/__init__.py +1 -0
- opentrons/hardware_control/scripts/gripper_control.py +208 -0
- opentrons/hardware_control/scripts/ot3gripper +7 -0
- opentrons/hardware_control/scripts/ot3repl +7 -0
- opentrons/hardware_control/scripts/repl.py +187 -0
- opentrons/hardware_control/scripts/tc_control.py +97 -0
- opentrons/hardware_control/scripts/update_module_fw.py +274 -0
- opentrons/hardware_control/simulator_setup.py +260 -0
- opentrons/hardware_control/thread_manager.py +431 -0
- opentrons/hardware_control/threaded_async_lock.py +97 -0
- opentrons/hardware_control/types.py +792 -0
- opentrons/hardware_control/util.py +234 -0
- opentrons/legacy_broker.py +53 -0
- opentrons/legacy_commands/__init__.py +1 -0
- opentrons/legacy_commands/commands.py +483 -0
- opentrons/legacy_commands/helpers.py +153 -0
- opentrons/legacy_commands/module_commands.py +276 -0
- opentrons/legacy_commands/protocol_commands.py +54 -0
- opentrons/legacy_commands/publisher.py +155 -0
- opentrons/legacy_commands/robot_commands.py +51 -0
- opentrons/legacy_commands/types.py +1186 -0
- opentrons/motion_planning/__init__.py +32 -0
- opentrons/motion_planning/adjacent_slots_getters.py +168 -0
- opentrons/motion_planning/deck_conflict.py +501 -0
- opentrons/motion_planning/errors.py +35 -0
- opentrons/motion_planning/types.py +42 -0
- opentrons/motion_planning/waypoints.py +218 -0
- opentrons/ordered_set.py +138 -0
- opentrons/protocol_api/__init__.py +105 -0
- opentrons/protocol_api/_liquid.py +157 -0
- opentrons/protocol_api/_liquid_properties.py +814 -0
- opentrons/protocol_api/_nozzle_layout.py +31 -0
- opentrons/protocol_api/_parameter_context.py +300 -0
- opentrons/protocol_api/_parameters.py +31 -0
- opentrons/protocol_api/_transfer_liquid_validation.py +108 -0
- opentrons/protocol_api/_types.py +43 -0
- opentrons/protocol_api/config.py +23 -0
- opentrons/protocol_api/core/__init__.py +23 -0
- opentrons/protocol_api/core/common.py +33 -0
- opentrons/protocol_api/core/core_map.py +74 -0
- opentrons/protocol_api/core/engine/__init__.py +22 -0
- opentrons/protocol_api/core/engine/_default_labware_versions.py +179 -0
- opentrons/protocol_api/core/engine/deck_conflict.py +400 -0
- opentrons/protocol_api/core/engine/exceptions.py +19 -0
- opentrons/protocol_api/core/engine/instrument.py +2391 -0
- opentrons/protocol_api/core/engine/labware.py +238 -0
- opentrons/protocol_api/core/engine/load_labware_params.py +73 -0
- opentrons/protocol_api/core/engine/module_core.py +1027 -0
- opentrons/protocol_api/core/engine/overlap_versions.py +20 -0
- opentrons/protocol_api/core/engine/pipette_movement_conflict.py +358 -0
- opentrons/protocol_api/core/engine/point_calculations.py +64 -0
- opentrons/protocol_api/core/engine/protocol.py +1153 -0
- opentrons/protocol_api/core/engine/robot.py +139 -0
- opentrons/protocol_api/core/engine/stringify.py +74 -0
- opentrons/protocol_api/core/engine/transfer_components_executor.py +1006 -0
- opentrons/protocol_api/core/engine/well.py +241 -0
- opentrons/protocol_api/core/instrument.py +459 -0
- opentrons/protocol_api/core/labware.py +151 -0
- opentrons/protocol_api/core/legacy/__init__.py +11 -0
- opentrons/protocol_api/core/legacy/_labware_geometry.py +37 -0
- opentrons/protocol_api/core/legacy/deck.py +369 -0
- opentrons/protocol_api/core/legacy/labware_offset_provider.py +108 -0
- opentrons/protocol_api/core/legacy/legacy_instrument_core.py +709 -0
- opentrons/protocol_api/core/legacy/legacy_labware_core.py +235 -0
- opentrons/protocol_api/core/legacy/legacy_module_core.py +592 -0
- opentrons/protocol_api/core/legacy/legacy_protocol_core.py +612 -0
- opentrons/protocol_api/core/legacy/legacy_well_core.py +162 -0
- opentrons/protocol_api/core/legacy/load_info.py +67 -0
- opentrons/protocol_api/core/legacy/module_geometry.py +547 -0
- opentrons/protocol_api/core/legacy/well_geometry.py +148 -0
- opentrons/protocol_api/core/legacy_simulator/__init__.py +16 -0
- opentrons/protocol_api/core/legacy_simulator/legacy_instrument_core.py +624 -0
- opentrons/protocol_api/core/legacy_simulator/legacy_protocol_core.py +85 -0
- opentrons/protocol_api/core/module.py +484 -0
- opentrons/protocol_api/core/protocol.py +311 -0
- opentrons/protocol_api/core/robot.py +51 -0
- opentrons/protocol_api/core/well.py +116 -0
- opentrons/protocol_api/core/well_grid.py +45 -0
- opentrons/protocol_api/create_protocol_context.py +177 -0
- opentrons/protocol_api/deck.py +223 -0
- opentrons/protocol_api/disposal_locations.py +244 -0
- opentrons/protocol_api/instrument_context.py +3272 -0
- opentrons/protocol_api/labware.py +1579 -0
- opentrons/protocol_api/module_contexts.py +1447 -0
- opentrons/protocol_api/module_validation_and_errors.py +61 -0
- opentrons/protocol_api/protocol_context.py +1688 -0
- opentrons/protocol_api/robot_context.py +303 -0
- opentrons/protocol_api/validation.py +761 -0
- opentrons/protocol_engine/__init__.py +155 -0
- opentrons/protocol_engine/actions/__init__.py +65 -0
- opentrons/protocol_engine/actions/action_dispatcher.py +30 -0
- opentrons/protocol_engine/actions/action_handler.py +13 -0
- opentrons/protocol_engine/actions/actions.py +302 -0
- opentrons/protocol_engine/actions/get_state_update.py +38 -0
- opentrons/protocol_engine/clients/__init__.py +5 -0
- opentrons/protocol_engine/clients/sync_client.py +174 -0
- opentrons/protocol_engine/clients/transports.py +197 -0
- opentrons/protocol_engine/commands/__init__.py +757 -0
- opentrons/protocol_engine/commands/absorbance_reader/__init__.py +61 -0
- opentrons/protocol_engine/commands/absorbance_reader/close_lid.py +154 -0
- opentrons/protocol_engine/commands/absorbance_reader/common.py +6 -0
- opentrons/protocol_engine/commands/absorbance_reader/initialize.py +151 -0
- opentrons/protocol_engine/commands/absorbance_reader/open_lid.py +154 -0
- opentrons/protocol_engine/commands/absorbance_reader/read.py +226 -0
- opentrons/protocol_engine/commands/air_gap_in_place.py +162 -0
- opentrons/protocol_engine/commands/aspirate.py +244 -0
- opentrons/protocol_engine/commands/aspirate_in_place.py +184 -0
- opentrons/protocol_engine/commands/aspirate_while_tracking.py +211 -0
- opentrons/protocol_engine/commands/blow_out.py +146 -0
- opentrons/protocol_engine/commands/blow_out_in_place.py +119 -0
- opentrons/protocol_engine/commands/calibration/__init__.py +60 -0
- opentrons/protocol_engine/commands/calibration/calibrate_gripper.py +166 -0
- opentrons/protocol_engine/commands/calibration/calibrate_module.py +117 -0
- opentrons/protocol_engine/commands/calibration/calibrate_pipette.py +96 -0
- opentrons/protocol_engine/commands/calibration/move_to_maintenance_position.py +156 -0
- opentrons/protocol_engine/commands/command.py +308 -0
- opentrons/protocol_engine/commands/command_unions.py +974 -0
- opentrons/protocol_engine/commands/comment.py +57 -0
- opentrons/protocol_engine/commands/configure_for_volume.py +108 -0
- opentrons/protocol_engine/commands/configure_nozzle_layout.py +115 -0
- opentrons/protocol_engine/commands/custom.py +67 -0
- opentrons/protocol_engine/commands/dispense.py +194 -0
- opentrons/protocol_engine/commands/dispense_in_place.py +179 -0
- opentrons/protocol_engine/commands/dispense_while_tracking.py +204 -0
- opentrons/protocol_engine/commands/drop_tip.py +232 -0
- opentrons/protocol_engine/commands/drop_tip_in_place.py +205 -0
- opentrons/protocol_engine/commands/flex_stacker/__init__.py +64 -0
- opentrons/protocol_engine/commands/flex_stacker/common.py +900 -0
- opentrons/protocol_engine/commands/flex_stacker/empty.py +293 -0
- opentrons/protocol_engine/commands/flex_stacker/fill.py +281 -0
- opentrons/protocol_engine/commands/flex_stacker/retrieve.py +339 -0
- opentrons/protocol_engine/commands/flex_stacker/set_stored_labware.py +328 -0
- opentrons/protocol_engine/commands/flex_stacker/store.py +339 -0
- opentrons/protocol_engine/commands/generate_command_schema.py +61 -0
- opentrons/protocol_engine/commands/get_next_tip.py +134 -0
- opentrons/protocol_engine/commands/get_tip_presence.py +87 -0
- opentrons/protocol_engine/commands/hash_command_params.py +38 -0
- opentrons/protocol_engine/commands/heater_shaker/__init__.py +102 -0
- opentrons/protocol_engine/commands/heater_shaker/close_labware_latch.py +83 -0
- opentrons/protocol_engine/commands/heater_shaker/deactivate_heater.py +82 -0
- opentrons/protocol_engine/commands/heater_shaker/deactivate_shaker.py +84 -0
- opentrons/protocol_engine/commands/heater_shaker/open_labware_latch.py +110 -0
- opentrons/protocol_engine/commands/heater_shaker/set_and_wait_for_shake_speed.py +125 -0
- opentrons/protocol_engine/commands/heater_shaker/set_target_temperature.py +90 -0
- opentrons/protocol_engine/commands/heater_shaker/wait_for_temperature.py +102 -0
- opentrons/protocol_engine/commands/home.py +100 -0
- opentrons/protocol_engine/commands/identify_module.py +86 -0
- opentrons/protocol_engine/commands/labware_handling_common.py +29 -0
- opentrons/protocol_engine/commands/liquid_probe.py +464 -0
- opentrons/protocol_engine/commands/load_labware.py +210 -0
- opentrons/protocol_engine/commands/load_lid.py +154 -0
- opentrons/protocol_engine/commands/load_lid_stack.py +272 -0
- opentrons/protocol_engine/commands/load_liquid.py +95 -0
- opentrons/protocol_engine/commands/load_liquid_class.py +144 -0
- opentrons/protocol_engine/commands/load_module.py +223 -0
- opentrons/protocol_engine/commands/load_pipette.py +167 -0
- opentrons/protocol_engine/commands/magnetic_module/__init__.py +32 -0
- opentrons/protocol_engine/commands/magnetic_module/disengage.py +97 -0
- opentrons/protocol_engine/commands/magnetic_module/engage.py +119 -0
- opentrons/protocol_engine/commands/move_labware.py +546 -0
- opentrons/protocol_engine/commands/move_relative.py +102 -0
- opentrons/protocol_engine/commands/move_to_addressable_area.py +176 -0
- opentrons/protocol_engine/commands/move_to_addressable_area_for_drop_tip.py +198 -0
- opentrons/protocol_engine/commands/move_to_coordinates.py +107 -0
- opentrons/protocol_engine/commands/move_to_well.py +119 -0
- opentrons/protocol_engine/commands/movement_common.py +338 -0
- opentrons/protocol_engine/commands/pick_up_tip.py +241 -0
- opentrons/protocol_engine/commands/pipetting_common.py +443 -0
- opentrons/protocol_engine/commands/prepare_to_aspirate.py +121 -0
- opentrons/protocol_engine/commands/pressure_dispense.py +155 -0
- opentrons/protocol_engine/commands/reload_labware.py +90 -0
- opentrons/protocol_engine/commands/retract_axis.py +75 -0
- opentrons/protocol_engine/commands/robot/__init__.py +70 -0
- opentrons/protocol_engine/commands/robot/close_gripper_jaw.py +96 -0
- opentrons/protocol_engine/commands/robot/common.py +18 -0
- opentrons/protocol_engine/commands/robot/move_axes_relative.py +101 -0
- opentrons/protocol_engine/commands/robot/move_axes_to.py +100 -0
- opentrons/protocol_engine/commands/robot/move_to.py +94 -0
- opentrons/protocol_engine/commands/robot/open_gripper_jaw.py +86 -0
- opentrons/protocol_engine/commands/save_position.py +109 -0
- opentrons/protocol_engine/commands/seal_pipette_to_tip.py +353 -0
- opentrons/protocol_engine/commands/set_rail_lights.py +67 -0
- opentrons/protocol_engine/commands/set_status_bar.py +89 -0
- opentrons/protocol_engine/commands/temperature_module/__init__.py +46 -0
- opentrons/protocol_engine/commands/temperature_module/deactivate.py +86 -0
- opentrons/protocol_engine/commands/temperature_module/set_target_temperature.py +97 -0
- opentrons/protocol_engine/commands/temperature_module/wait_for_temperature.py +104 -0
- opentrons/protocol_engine/commands/thermocycler/__init__.py +152 -0
- opentrons/protocol_engine/commands/thermocycler/close_lid.py +87 -0
- opentrons/protocol_engine/commands/thermocycler/deactivate_block.py +80 -0
- opentrons/protocol_engine/commands/thermocycler/deactivate_lid.py +80 -0
- opentrons/protocol_engine/commands/thermocycler/open_lid.py +87 -0
- opentrons/protocol_engine/commands/thermocycler/run_extended_profile.py +171 -0
- opentrons/protocol_engine/commands/thermocycler/run_profile.py +124 -0
- opentrons/protocol_engine/commands/thermocycler/set_target_block_temperature.py +140 -0
- opentrons/protocol_engine/commands/thermocycler/set_target_lid_temperature.py +100 -0
- opentrons/protocol_engine/commands/thermocycler/wait_for_block_temperature.py +93 -0
- opentrons/protocol_engine/commands/thermocycler/wait_for_lid_temperature.py +89 -0
- opentrons/protocol_engine/commands/touch_tip.py +189 -0
- opentrons/protocol_engine/commands/unsafe/__init__.py +161 -0
- opentrons/protocol_engine/commands/unsafe/unsafe_blow_out_in_place.py +100 -0
- opentrons/protocol_engine/commands/unsafe/unsafe_drop_tip_in_place.py +121 -0
- opentrons/protocol_engine/commands/unsafe/unsafe_engage_axes.py +82 -0
- opentrons/protocol_engine/commands/unsafe/unsafe_place_labware.py +208 -0
- opentrons/protocol_engine/commands/unsafe/unsafe_stacker_close_latch.py +94 -0
- opentrons/protocol_engine/commands/unsafe/unsafe_stacker_manual_retrieve.py +295 -0
- opentrons/protocol_engine/commands/unsafe/unsafe_stacker_open_latch.py +91 -0
- opentrons/protocol_engine/commands/unsafe/unsafe_stacker_prepare_shuttle.py +136 -0
- opentrons/protocol_engine/commands/unsafe/unsafe_ungrip_labware.py +77 -0
- opentrons/protocol_engine/commands/unsafe/update_position_estimators.py +90 -0
- opentrons/protocol_engine/commands/unseal_pipette_from_tip.py +153 -0
- opentrons/protocol_engine/commands/verify_tip_presence.py +100 -0
- opentrons/protocol_engine/commands/wait_for_duration.py +76 -0
- opentrons/protocol_engine/commands/wait_for_resume.py +75 -0
- opentrons/protocol_engine/create_protocol_engine.py +193 -0
- opentrons/protocol_engine/engine_support.py +28 -0
- opentrons/protocol_engine/error_recovery_policy.py +81 -0
- opentrons/protocol_engine/errors/__init__.py +191 -0
- opentrons/protocol_engine/errors/error_occurrence.py +182 -0
- opentrons/protocol_engine/errors/exceptions.py +1308 -0
- opentrons/protocol_engine/execution/__init__.py +50 -0
- opentrons/protocol_engine/execution/command_executor.py +216 -0
- opentrons/protocol_engine/execution/create_queue_worker.py +102 -0
- opentrons/protocol_engine/execution/door_watcher.py +119 -0
- opentrons/protocol_engine/execution/equipment.py +819 -0
- opentrons/protocol_engine/execution/error_recovery_hardware_state_synchronizer.py +101 -0
- opentrons/protocol_engine/execution/gantry_mover.py +686 -0
- opentrons/protocol_engine/execution/hardware_stopper.py +147 -0
- opentrons/protocol_engine/execution/heater_shaker_movement_flagger.py +207 -0
- opentrons/protocol_engine/execution/labware_movement.py +297 -0
- opentrons/protocol_engine/execution/movement.py +350 -0
- opentrons/protocol_engine/execution/pipetting.py +607 -0
- opentrons/protocol_engine/execution/queue_worker.py +86 -0
- opentrons/protocol_engine/execution/rail_lights.py +25 -0
- opentrons/protocol_engine/execution/run_control.py +33 -0
- opentrons/protocol_engine/execution/status_bar.py +34 -0
- opentrons/protocol_engine/execution/thermocycler_movement_flagger.py +188 -0
- opentrons/protocol_engine/execution/thermocycler_plate_lifter.py +81 -0
- opentrons/protocol_engine/execution/tip_handler.py +550 -0
- opentrons/protocol_engine/labware_offset_standardization.py +194 -0
- opentrons/protocol_engine/notes/__init__.py +17 -0
- opentrons/protocol_engine/notes/notes.py +59 -0
- opentrons/protocol_engine/plugins.py +104 -0
- opentrons/protocol_engine/protocol_engine.py +683 -0
- opentrons/protocol_engine/resources/__init__.py +26 -0
- opentrons/protocol_engine/resources/deck_configuration_provider.py +232 -0
- opentrons/protocol_engine/resources/deck_data_provider.py +94 -0
- opentrons/protocol_engine/resources/file_provider.py +161 -0
- opentrons/protocol_engine/resources/fixture_validation.py +68 -0
- opentrons/protocol_engine/resources/labware_data_provider.py +106 -0
- opentrons/protocol_engine/resources/labware_validation.py +73 -0
- opentrons/protocol_engine/resources/model_utils.py +32 -0
- opentrons/protocol_engine/resources/module_data_provider.py +44 -0
- opentrons/protocol_engine/resources/ot3_validation.py +21 -0
- opentrons/protocol_engine/resources/pipette_data_provider.py +379 -0
- opentrons/protocol_engine/slot_standardization.py +128 -0
- opentrons/protocol_engine/state/__init__.py +1 -0
- opentrons/protocol_engine/state/_abstract_store.py +27 -0
- opentrons/protocol_engine/state/_axis_aligned_bounding_box.py +50 -0
- opentrons/protocol_engine/state/_labware_origin_math.py +636 -0
- opentrons/protocol_engine/state/_move_types.py +83 -0
- opentrons/protocol_engine/state/_well_math.py +193 -0
- opentrons/protocol_engine/state/addressable_areas.py +699 -0
- opentrons/protocol_engine/state/command_history.py +309 -0
- opentrons/protocol_engine/state/commands.py +1164 -0
- opentrons/protocol_engine/state/config.py +39 -0
- opentrons/protocol_engine/state/files.py +57 -0
- opentrons/protocol_engine/state/fluid_stack.py +138 -0
- opentrons/protocol_engine/state/geometry.py +2408 -0
- opentrons/protocol_engine/state/inner_well_math_utils.py +548 -0
- opentrons/protocol_engine/state/labware.py +1432 -0
- opentrons/protocol_engine/state/liquid_classes.py +82 -0
- opentrons/protocol_engine/state/liquids.py +73 -0
- opentrons/protocol_engine/state/module_substates/__init__.py +45 -0
- opentrons/protocol_engine/state/module_substates/absorbance_reader_substate.py +35 -0
- opentrons/protocol_engine/state/module_substates/flex_stacker_substate.py +112 -0
- opentrons/protocol_engine/state/module_substates/heater_shaker_module_substate.py +115 -0
- opentrons/protocol_engine/state/module_substates/magnetic_block_substate.py +17 -0
- opentrons/protocol_engine/state/module_substates/magnetic_module_substate.py +65 -0
- opentrons/protocol_engine/state/module_substates/temperature_module_substate.py +67 -0
- opentrons/protocol_engine/state/module_substates/thermocycler_module_substate.py +163 -0
- opentrons/protocol_engine/state/modules.py +1515 -0
- opentrons/protocol_engine/state/motion.py +373 -0
- opentrons/protocol_engine/state/pipettes.py +905 -0
- opentrons/protocol_engine/state/state.py +421 -0
- opentrons/protocol_engine/state/state_summary.py +36 -0
- opentrons/protocol_engine/state/tips.py +420 -0
- opentrons/protocol_engine/state/update_types.py +904 -0
- opentrons/protocol_engine/state/wells.py +290 -0
- opentrons/protocol_engine/types/__init__.py +310 -0
- opentrons/protocol_engine/types/automatic_tip_selection.py +39 -0
- opentrons/protocol_engine/types/command_annotations.py +53 -0
- opentrons/protocol_engine/types/deck_configuration.py +81 -0
- opentrons/protocol_engine/types/execution.py +96 -0
- opentrons/protocol_engine/types/hardware_passthrough.py +25 -0
- opentrons/protocol_engine/types/instrument.py +47 -0
- opentrons/protocol_engine/types/instrument_sensors.py +47 -0
- opentrons/protocol_engine/types/labware.py +131 -0
- opentrons/protocol_engine/types/labware_movement.py +22 -0
- opentrons/protocol_engine/types/labware_offset_location.py +111 -0
- opentrons/protocol_engine/types/labware_offset_vector.py +16 -0
- opentrons/protocol_engine/types/liquid.py +40 -0
- opentrons/protocol_engine/types/liquid_class.py +59 -0
- opentrons/protocol_engine/types/liquid_handling.py +13 -0
- opentrons/protocol_engine/types/liquid_level_detection.py +191 -0
- opentrons/protocol_engine/types/location.py +194 -0
- opentrons/protocol_engine/types/module.py +310 -0
- opentrons/protocol_engine/types/partial_tip_configuration.py +76 -0
- opentrons/protocol_engine/types/run_time_parameters.py +133 -0
- opentrons/protocol_engine/types/tip.py +18 -0
- opentrons/protocol_engine/types/util.py +21 -0
- opentrons/protocol_engine/types/well_position.py +124 -0
- opentrons/protocol_reader/__init__.py +37 -0
- opentrons/protocol_reader/extract_labware_definitions.py +66 -0
- opentrons/protocol_reader/file_format_validator.py +152 -0
- opentrons/protocol_reader/file_hasher.py +27 -0
- opentrons/protocol_reader/file_identifier.py +284 -0
- opentrons/protocol_reader/file_reader_writer.py +90 -0
- opentrons/protocol_reader/input_file.py +16 -0
- opentrons/protocol_reader/protocol_files_invalid_error.py +6 -0
- opentrons/protocol_reader/protocol_reader.py +188 -0
- opentrons/protocol_reader/protocol_source.py +124 -0
- opentrons/protocol_reader/role_analyzer.py +86 -0
- opentrons/protocol_runner/__init__.py +26 -0
- opentrons/protocol_runner/create_simulating_orchestrator.py +118 -0
- opentrons/protocol_runner/json_file_reader.py +55 -0
- opentrons/protocol_runner/json_translator.py +314 -0
- opentrons/protocol_runner/legacy_command_mapper.py +852 -0
- opentrons/protocol_runner/legacy_context_plugin.py +116 -0
- opentrons/protocol_runner/protocol_runner.py +530 -0
- opentrons/protocol_runner/python_protocol_wrappers.py +179 -0
- opentrons/protocol_runner/run_orchestrator.py +496 -0
- opentrons/protocol_runner/task_queue.py +95 -0
- opentrons/protocols/__init__.py +6 -0
- opentrons/protocols/advanced_control/__init__.py +0 -0
- opentrons/protocols/advanced_control/common.py +38 -0
- opentrons/protocols/advanced_control/mix.py +60 -0
- opentrons/protocols/advanced_control/transfers/__init__.py +0 -0
- opentrons/protocols/advanced_control/transfers/common.py +180 -0
- opentrons/protocols/advanced_control/transfers/transfer.py +972 -0
- opentrons/protocols/advanced_control/transfers/transfer_liquid_utils.py +231 -0
- opentrons/protocols/api_support/__init__.py +0 -0
- opentrons/protocols/api_support/constants.py +8 -0
- opentrons/protocols/api_support/deck_type.py +110 -0
- opentrons/protocols/api_support/definitions.py +18 -0
- opentrons/protocols/api_support/instrument.py +151 -0
- opentrons/protocols/api_support/labware_like.py +233 -0
- opentrons/protocols/api_support/tip_tracker.py +175 -0
- opentrons/protocols/api_support/types.py +32 -0
- opentrons/protocols/api_support/util.py +403 -0
- opentrons/protocols/bundle.py +89 -0
- opentrons/protocols/duration/__init__.py +4 -0
- opentrons/protocols/duration/errors.py +5 -0
- opentrons/protocols/duration/estimator.py +628 -0
- opentrons/protocols/execution/__init__.py +0 -0
- opentrons/protocols/execution/dev_types.py +181 -0
- opentrons/protocols/execution/errors.py +40 -0
- opentrons/protocols/execution/execute.py +84 -0
- opentrons/protocols/execution/execute_json_v3.py +275 -0
- opentrons/protocols/execution/execute_json_v4.py +359 -0
- opentrons/protocols/execution/execute_json_v5.py +28 -0
- opentrons/protocols/execution/execute_python.py +169 -0
- opentrons/protocols/execution/json_dispatchers.py +87 -0
- opentrons/protocols/execution/types.py +7 -0
- opentrons/protocols/geometry/__init__.py +0 -0
- opentrons/protocols/geometry/planning.py +297 -0
- opentrons/protocols/labware.py +312 -0
- opentrons/protocols/models/__init__.py +0 -0
- opentrons/protocols/models/json_protocol.py +679 -0
- opentrons/protocols/parameters/__init__.py +0 -0
- opentrons/protocols/parameters/csv_parameter_definition.py +77 -0
- opentrons/protocols/parameters/csv_parameter_interface.py +96 -0
- opentrons/protocols/parameters/exceptions.py +34 -0
- opentrons/protocols/parameters/parameter_definition.py +272 -0
- opentrons/protocols/parameters/types.py +17 -0
- opentrons/protocols/parameters/validation.py +267 -0
- opentrons/protocols/parse.py +671 -0
- opentrons/protocols/types.py +159 -0
- opentrons/py.typed +0 -0
- opentrons/resources/scripts/lpc21isp +0 -0
- opentrons/resources/smoothie-edge-8414642.hex +23010 -0
- opentrons/simulate.py +1065 -0
- opentrons/system/__init__.py +6 -0
- opentrons/system/camera.py +51 -0
- opentrons/system/log_control.py +59 -0
- opentrons/system/nmcli.py +856 -0
- opentrons/system/resin.py +24 -0
- opentrons/system/smoothie_update.py +15 -0
- opentrons/system/wifi.py +204 -0
- opentrons/tools/__init__.py +0 -0
- opentrons/tools/args_handler.py +22 -0
- opentrons/tools/write_pipette_memory.py +157 -0
- opentrons/types.py +618 -0
- opentrons/util/__init__.py +1 -0
- opentrons/util/async_helpers.py +166 -0
- opentrons/util/broker.py +84 -0
- opentrons/util/change_notifier.py +47 -0
- opentrons/util/entrypoint_util.py +278 -0
- opentrons/util/get_union_elements.py +26 -0
- opentrons/util/helpers.py +6 -0
- opentrons/util/linal.py +178 -0
- opentrons/util/logging_config.py +265 -0
- opentrons/util/logging_queue_handler.py +61 -0
- opentrons/util/performance_helpers.py +157 -0
- opentrons-8.6.0.dist-info/METADATA +37 -0
- opentrons-8.6.0.dist-info/RECORD +601 -0
- opentrons-8.6.0.dist-info/WHEEL +4 -0
- opentrons-8.6.0.dist-info/entry_points.txt +3 -0
- opentrons-8.6.0.dist-info/licenses/LICENSE +202 -0
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
"""Protocol source value objects."""
|
|
2
|
+
from enum import Enum
|
|
3
|
+
from dataclasses import dataclass
|
|
4
|
+
from pathlib import Path
|
|
5
|
+
from typing import Any, Dict, List, Optional, Union
|
|
6
|
+
from typing_extensions import Literal
|
|
7
|
+
|
|
8
|
+
from opentrons.protocols.api_support.types import APIVersion
|
|
9
|
+
|
|
10
|
+
from opentrons_shared_data.robot.types import RobotType
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class ProtocolType(str, Enum):
|
|
14
|
+
"""Type of protocol, JSON or Python."""
|
|
15
|
+
|
|
16
|
+
JSON = "json"
|
|
17
|
+
PYTHON = "python"
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
# TODO(mc, 2021-12-07): add python support roles
|
|
21
|
+
class ProtocolFileRole(str, Enum):
|
|
22
|
+
"""The purpose of a given file in a protocol.
|
|
23
|
+
|
|
24
|
+
Args:
|
|
25
|
+
MAIN: The protocol's main file. In a JSON protocol, this is will
|
|
26
|
+
be the JSON file. In a Python protocol, this is the file
|
|
27
|
+
that exports the main `run` method.
|
|
28
|
+
LABWARE: A labware definition file, loadable by a
|
|
29
|
+
Python file in the same protocol.
|
|
30
|
+
DATA: An arbitrary text or csv file for usage in `bundled_data`
|
|
31
|
+
for a Python protool
|
|
32
|
+
"""
|
|
33
|
+
|
|
34
|
+
MAIN = "main"
|
|
35
|
+
LABWARE = "labware"
|
|
36
|
+
DATA = "data"
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
@dataclass(frozen=True)
|
|
40
|
+
class ProtocolSourceFile:
|
|
41
|
+
"""A single file in a protocol.
|
|
42
|
+
|
|
43
|
+
Attributes:
|
|
44
|
+
path: The file's path on disk.
|
|
45
|
+
role: The file's purpose in the protocol.
|
|
46
|
+
"""
|
|
47
|
+
|
|
48
|
+
path: Path
|
|
49
|
+
role: ProtocolFileRole
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
@dataclass(frozen=True)
|
|
53
|
+
class JsonProtocolConfig:
|
|
54
|
+
"""Execution configuration for a JSON protocol.
|
|
55
|
+
|
|
56
|
+
Attributes:
|
|
57
|
+
schema_version: JSON schema version of the JSON protocol.
|
|
58
|
+
protocol_type: Type of protocol
|
|
59
|
+
"""
|
|
60
|
+
|
|
61
|
+
schema_version: int
|
|
62
|
+
protocol_type: Literal[ProtocolType.JSON] = ProtocolType.JSON
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
@dataclass(frozen=True)
|
|
66
|
+
class PythonProtocolConfig:
|
|
67
|
+
"""Execution configuration for a Python protocol.
|
|
68
|
+
|
|
69
|
+
Attributes:
|
|
70
|
+
api_version: Python Protocol API version of the protocol.
|
|
71
|
+
protocol_type: Type of protocol
|
|
72
|
+
"""
|
|
73
|
+
|
|
74
|
+
api_version: APIVersion
|
|
75
|
+
protocol_type: Literal[ProtocolType.PYTHON] = ProtocolType.PYTHON
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
ProtocolConfig = Union[JsonProtocolConfig, PythonProtocolConfig]
|
|
79
|
+
"""Union of all protocol execution configurations."""
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
# TODO(mc, 2021-12-09): Dict[str, Any] is an overly-permissive approximation
|
|
83
|
+
# due to mypy's lack of easy recursive types. Find a more accurate type
|
|
84
|
+
Metadata = Dict[str, Any]
|
|
85
|
+
"""A protocol's metadata (non-essential info, like author and title).
|
|
86
|
+
|
|
87
|
+
Robot software may not change how it executes a protocol based on
|
|
88
|
+
metadata (excepting a Python protocol's API version, which is in
|
|
89
|
+
metadata due to a historical implementation detail).
|
|
90
|
+
|
|
91
|
+
Metadata must be a simple JSON-serializable dictionary.
|
|
92
|
+
"""
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
@dataclass(frozen=True)
|
|
96
|
+
class ProtocolSource:
|
|
97
|
+
"""A value object representing a protocol and its source files on disk.
|
|
98
|
+
|
|
99
|
+
This includes pointers to the files,
|
|
100
|
+
plus some basic information that can be readily inferred from those files.
|
|
101
|
+
(Excluding information that would require in-depth simulation of the protocol.)
|
|
102
|
+
|
|
103
|
+
Attributes:
|
|
104
|
+
directory: The directory containing the protocol files
|
|
105
|
+
(and only the protocol files), or ``None`` if this is unknown.
|
|
106
|
+
main_file: The location of the protocol's main file on disk.
|
|
107
|
+
content_hash: A md5 hex digest of the protocol source combined with
|
|
108
|
+
custom labware that was provided at the time of protocol creation
|
|
109
|
+
files: Descriptions of all files that make up the protocol.
|
|
110
|
+
metadata: Arbitrary metadata specified by the protocols.
|
|
111
|
+
config: Protocol execution configuration.
|
|
112
|
+
labware_definitions: Labware definitions provided by separate
|
|
113
|
+
labware files or the main JSON protocol file, if present.
|
|
114
|
+
This is not necessarily the same set of labware definitions
|
|
115
|
+
that the protocol will actually attempt to load.
|
|
116
|
+
"""
|
|
117
|
+
|
|
118
|
+
directory: Optional[Path]
|
|
119
|
+
main_file: Path
|
|
120
|
+
content_hash: str
|
|
121
|
+
files: List[ProtocolSourceFile]
|
|
122
|
+
metadata: Metadata
|
|
123
|
+
robot_type: RobotType
|
|
124
|
+
config: ProtocolConfig
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"""Input file role analysis."""
|
|
2
|
+
from dataclasses import dataclass
|
|
3
|
+
from typing import List, Sequence, Union
|
|
4
|
+
|
|
5
|
+
from .file_identifier import (
|
|
6
|
+
IdentifiedFile,
|
|
7
|
+
IdentifiedJsonMain,
|
|
8
|
+
IdentifiedPythonMain,
|
|
9
|
+
IdentifiedLabwareDefinition,
|
|
10
|
+
IdentifiedData,
|
|
11
|
+
)
|
|
12
|
+
from .protocol_files_invalid_error import ProtocolFilesInvalidError
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
@dataclass(frozen=True)
|
|
16
|
+
class RoleAnalysis:
|
|
17
|
+
"""Role analysis results."""
|
|
18
|
+
|
|
19
|
+
main_file: Union[IdentifiedJsonMain, IdentifiedPythonMain]
|
|
20
|
+
labware_files: List[IdentifiedLabwareDefinition]
|
|
21
|
+
data_files: List[IdentifiedData]
|
|
22
|
+
|
|
23
|
+
@property
|
|
24
|
+
def all_files(self) -> List[IdentifiedFile]:
|
|
25
|
+
"""Return all contained files."""
|
|
26
|
+
return [self.main_file, *self.labware_files, *self.data_files]
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class RoleAnalysisError(ProtocolFilesInvalidError):
|
|
30
|
+
"""Error raised if the input file list is invalid."""
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class RoleAnalyzer:
|
|
34
|
+
"""Input file role analysis interface."""
|
|
35
|
+
|
|
36
|
+
@staticmethod
|
|
37
|
+
def analyze(files: Sequence[IdentifiedFile]) -> RoleAnalysis:
|
|
38
|
+
"""Analyze a set of input files to determine the role that each one fills.
|
|
39
|
+
|
|
40
|
+
This validates that there is exactly one main protocol file.
|
|
41
|
+
"""
|
|
42
|
+
if len(files) == 0:
|
|
43
|
+
raise RoleAnalysisError(
|
|
44
|
+
message="No files were provided.", detail={"kind": "no-files"}
|
|
45
|
+
)
|
|
46
|
+
|
|
47
|
+
main_file_candidates: List[Union[IdentifiedJsonMain, IdentifiedPythonMain]] = []
|
|
48
|
+
labware_files: List[IdentifiedLabwareDefinition] = []
|
|
49
|
+
bundled_data_files: List[IdentifiedData] = []
|
|
50
|
+
|
|
51
|
+
for f in files:
|
|
52
|
+
if isinstance(f, (IdentifiedJsonMain, IdentifiedPythonMain)):
|
|
53
|
+
main_file_candidates.append(f)
|
|
54
|
+
elif isinstance(f, IdentifiedLabwareDefinition):
|
|
55
|
+
labware_files.append(f)
|
|
56
|
+
else:
|
|
57
|
+
bundled_data_files.append(f)
|
|
58
|
+
|
|
59
|
+
if len(main_file_candidates) == 0:
|
|
60
|
+
if len(files) == 1:
|
|
61
|
+
raise RoleAnalysisError(
|
|
62
|
+
message=f'"{files[0].original_file.name}" is not a valid protocol file.',
|
|
63
|
+
detail={"kind": "protocol-does-not-have-main"},
|
|
64
|
+
)
|
|
65
|
+
else:
|
|
66
|
+
file_list = ", ".join(f'"{f.original_file.name}"' for f in files)
|
|
67
|
+
raise RoleAnalysisError(
|
|
68
|
+
message=f"No valid protocol file found in {file_list}.",
|
|
69
|
+
detail={"kind": "protocol-does-not-have-main"},
|
|
70
|
+
)
|
|
71
|
+
elif len(main_file_candidates) > 1:
|
|
72
|
+
file_list = ", ".join(
|
|
73
|
+
f'"{f.original_file.name}"' for f in main_file_candidates
|
|
74
|
+
)
|
|
75
|
+
raise RoleAnalysisError(
|
|
76
|
+
message=f"Could not pick single main file from {file_list}.",
|
|
77
|
+
detail={"kind": "multiple-main-candidates"},
|
|
78
|
+
)
|
|
79
|
+
else:
|
|
80
|
+
main_file = main_file_candidates[0]
|
|
81
|
+
|
|
82
|
+
return RoleAnalysis(
|
|
83
|
+
main_file=main_file,
|
|
84
|
+
labware_files=labware_files,
|
|
85
|
+
data_files=bundled_data_files,
|
|
86
|
+
)
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"""Protocol run control and management.
|
|
2
|
+
|
|
3
|
+
The main export of this module is the AbstractRunner class. See
|
|
4
|
+
protocol_runner.py for more details.
|
|
5
|
+
"""
|
|
6
|
+
from .protocol_runner import (
|
|
7
|
+
AbstractRunner,
|
|
8
|
+
RunResult,
|
|
9
|
+
create_protocol_runner,
|
|
10
|
+
JsonRunner,
|
|
11
|
+
PythonAndLegacyRunner,
|
|
12
|
+
LiveRunner,
|
|
13
|
+
AnyRunner,
|
|
14
|
+
)
|
|
15
|
+
from .run_orchestrator import RunOrchestrator
|
|
16
|
+
|
|
17
|
+
__all__ = [
|
|
18
|
+
"AbstractRunner",
|
|
19
|
+
"RunResult",
|
|
20
|
+
"create_protocol_runner",
|
|
21
|
+
"JsonRunner",
|
|
22
|
+
"PythonAndLegacyRunner",
|
|
23
|
+
"LiveRunner",
|
|
24
|
+
"AnyRunner",
|
|
25
|
+
"RunOrchestrator",
|
|
26
|
+
]
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
"""Simulating AbstractRunner factory."""
|
|
2
|
+
|
|
3
|
+
from opentrons.hardware_control import API as OT2API, HardwareControlAPI
|
|
4
|
+
from opentrons.protocols.api_support import deck_type
|
|
5
|
+
from opentrons.protocols.api_support.deck_type import should_load_fixed_trash
|
|
6
|
+
from opentrons.protocol_engine import (
|
|
7
|
+
Config as ProtocolEngineConfig,
|
|
8
|
+
DeckType,
|
|
9
|
+
error_recovery_policy,
|
|
10
|
+
)
|
|
11
|
+
from opentrons.protocol_engine.create_protocol_engine import create_protocol_engine
|
|
12
|
+
from opentrons.protocol_reader.protocol_source import ProtocolConfig
|
|
13
|
+
|
|
14
|
+
from opentrons_shared_data.robot.types import RobotType
|
|
15
|
+
|
|
16
|
+
from .python_protocol_wrappers import SimulatingContextCreator
|
|
17
|
+
from .run_orchestrator import RunOrchestrator
|
|
18
|
+
from .protocol_runner import create_protocol_runner, LiveRunner
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
async def create_simulating_orchestrator(
|
|
22
|
+
robot_type: RobotType, protocol_config: ProtocolConfig
|
|
23
|
+
) -> RunOrchestrator:
|
|
24
|
+
"""Create a RunOrchestrator wired to a simulating HardwareControlAPI.
|
|
25
|
+
|
|
26
|
+
Example:
|
|
27
|
+
```python
|
|
28
|
+
from pathlib import Path
|
|
29
|
+
from typing import List
|
|
30
|
+
from opentrons.protocol_engine import Command
|
|
31
|
+
from opentrons.protocol_runner import (
|
|
32
|
+
ProtocolType,
|
|
33
|
+
ProtocolFile,
|
|
34
|
+
AbstractRunner,
|
|
35
|
+
create_simulating_orchestrator,
|
|
36
|
+
)
|
|
37
|
+
|
|
38
|
+
protocol = ProtocolFile(
|
|
39
|
+
protocol_type=ProtocolType.PYTHON,
|
|
40
|
+
files=[Path("/path/to/protocol.py")],
|
|
41
|
+
)
|
|
42
|
+
orchestrator: RunOrchestrator = await create_simulating_orchestrator()
|
|
43
|
+
commands: List[Command] = await orchestrator.run(protocol)
|
|
44
|
+
```
|
|
45
|
+
"""
|
|
46
|
+
simulating_hardware_api = await _build_hardware_simulator_for_robot_type(
|
|
47
|
+
robot_type=robot_type
|
|
48
|
+
)
|
|
49
|
+
|
|
50
|
+
# TODO(mm, 2024-08-06): This home has theoretically been replaced by Protocol Engine
|
|
51
|
+
# `home` commands within the `RunOrchestrator` or `ProtocolRunner`. However, it turns
|
|
52
|
+
# out that this `HardwareControlAPI`-level home is accidentally load-bearing,
|
|
53
|
+
# working around Protocol Engine bugs where *both* layers need to be homed for
|
|
54
|
+
# certain commands to work. https://opentrons.atlassian.net/browse/EXEC-646
|
|
55
|
+
await simulating_hardware_api.home()
|
|
56
|
+
|
|
57
|
+
protocol_engine = await create_protocol_engine(
|
|
58
|
+
hardware_api=simulating_hardware_api,
|
|
59
|
+
config=ProtocolEngineConfig(
|
|
60
|
+
robot_type=robot_type,
|
|
61
|
+
deck_type=DeckType(deck_type.for_simulation(robot_type)),
|
|
62
|
+
ignore_pause=True,
|
|
63
|
+
use_virtual_modules=True,
|
|
64
|
+
use_virtual_gripper=True,
|
|
65
|
+
use_simulated_deck_config=True,
|
|
66
|
+
use_virtual_pipettes=True,
|
|
67
|
+
),
|
|
68
|
+
error_recovery_policy=error_recovery_policy.never_recover,
|
|
69
|
+
load_fixed_trash=should_load_fixed_trash(protocol_config),
|
|
70
|
+
)
|
|
71
|
+
|
|
72
|
+
simulating_context_creator = SimulatingContextCreator(
|
|
73
|
+
hardware_api=simulating_hardware_api,
|
|
74
|
+
protocol_engine=protocol_engine,
|
|
75
|
+
)
|
|
76
|
+
|
|
77
|
+
runner = create_protocol_runner(
|
|
78
|
+
protocol_config=protocol_config,
|
|
79
|
+
protocol_engine=protocol_engine,
|
|
80
|
+
hardware_api=simulating_hardware_api,
|
|
81
|
+
protocol_context_creator=simulating_context_creator,
|
|
82
|
+
)
|
|
83
|
+
|
|
84
|
+
setup_runner = LiveRunner(
|
|
85
|
+
protocol_engine=protocol_engine,
|
|
86
|
+
hardware_api=simulating_hardware_api,
|
|
87
|
+
)
|
|
88
|
+
|
|
89
|
+
fixit_runner = LiveRunner(
|
|
90
|
+
protocol_engine=protocol_engine,
|
|
91
|
+
hardware_api=simulating_hardware_api,
|
|
92
|
+
)
|
|
93
|
+
|
|
94
|
+
protocol_live_runner = LiveRunner(
|
|
95
|
+
protocol_engine=protocol_engine,
|
|
96
|
+
hardware_api=simulating_hardware_api,
|
|
97
|
+
)
|
|
98
|
+
|
|
99
|
+
return RunOrchestrator(
|
|
100
|
+
hardware_api=simulating_hardware_api,
|
|
101
|
+
json_or_python_protocol_runner=runner,
|
|
102
|
+
protocol_engine=protocol_engine,
|
|
103
|
+
setup_runner=setup_runner,
|
|
104
|
+
fixit_runner=fixit_runner,
|
|
105
|
+
protocol_live_runner=protocol_live_runner,
|
|
106
|
+
)
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
async def _build_hardware_simulator_for_robot_type(
|
|
110
|
+
robot_type: RobotType,
|
|
111
|
+
) -> HardwareControlAPI:
|
|
112
|
+
if robot_type == "OT-2 Standard":
|
|
113
|
+
return await OT2API.build_hardware_simulator()
|
|
114
|
+
elif robot_type == "OT-3 Standard":
|
|
115
|
+
# Inline import because OT3API is not present to import on an OT-2 system.
|
|
116
|
+
from opentrons.hardware_control.ot3api import OT3API
|
|
117
|
+
|
|
118
|
+
return await OT3API.build_hardware_simulator()
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"""JSON file reading."""
|
|
2
|
+
from typing import Union
|
|
3
|
+
|
|
4
|
+
from opentrons_shared_data.protocol.models.protocol_schema_v6 import ProtocolSchemaV6
|
|
5
|
+
from opentrons_shared_data.protocol.models.protocol_schema_v7 import ProtocolSchemaV7
|
|
6
|
+
from opentrons_shared_data.protocol.models.protocol_schema_v8 import ProtocolSchemaV8
|
|
7
|
+
from opentrons.protocol_reader import (
|
|
8
|
+
ProtocolSource,
|
|
9
|
+
JsonProtocolConfig,
|
|
10
|
+
ProtocolFilesInvalidError,
|
|
11
|
+
)
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class JsonFileReader:
|
|
15
|
+
"""Reads and parses JSON protocol files."""
|
|
16
|
+
|
|
17
|
+
@staticmethod
|
|
18
|
+
def read(
|
|
19
|
+
protocol_source: ProtocolSource,
|
|
20
|
+
) -> Union[ProtocolSchemaV6, ProtocolSchemaV7, ProtocolSchemaV8]:
|
|
21
|
+
"""Read and parse file into a JsonProtocol model."""
|
|
22
|
+
name = protocol_source.metadata.get("name", protocol_source.main_file.name)
|
|
23
|
+
if not isinstance(protocol_source.config, JsonProtocolConfig):
|
|
24
|
+
raise ProtocolFilesInvalidError(
|
|
25
|
+
message=f"Cannot execute {name} as a JSON protocol",
|
|
26
|
+
detail={
|
|
27
|
+
"kind": "non-json-file-in-json-file-reader",
|
|
28
|
+
"metadata-name": str(protocol_source.metadata.get("name")),
|
|
29
|
+
"file-name": protocol_source.main_file.name,
|
|
30
|
+
},
|
|
31
|
+
)
|
|
32
|
+
if protocol_source.config.schema_version == 6:
|
|
33
|
+
return ProtocolSchemaV6.model_validate_json(
|
|
34
|
+
protocol_source.main_file.read_bytes()
|
|
35
|
+
)
|
|
36
|
+
elif protocol_source.config.schema_version == 7:
|
|
37
|
+
return ProtocolSchemaV7.model_validate_json(
|
|
38
|
+
protocol_source.main_file.read_bytes()
|
|
39
|
+
)
|
|
40
|
+
elif protocol_source.config.schema_version == 8:
|
|
41
|
+
return ProtocolSchemaV8.model_validate_json(
|
|
42
|
+
protocol_source.main_file.read_bytes()
|
|
43
|
+
)
|
|
44
|
+
else:
|
|
45
|
+
raise ProtocolFilesInvalidError(
|
|
46
|
+
message=f"{name} is a JSON protocol v{protocol_source.config.schema_version} which this robot cannot execute",
|
|
47
|
+
detail={
|
|
48
|
+
"kind": "schema-version-unknown",
|
|
49
|
+
"requested-schema-version": str(
|
|
50
|
+
protocol_source.config.schema_version
|
|
51
|
+
),
|
|
52
|
+
"minimum-handled-schema-version": "6",
|
|
53
|
+
"maximum-handled-shcema-version": "8",
|
|
54
|
+
},
|
|
55
|
+
)
|