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,31 @@
|
|
|
1
|
+
from typing_extensions import Final
|
|
2
|
+
import enum
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
class NozzleLayout(enum.Enum):
|
|
6
|
+
COLUMN = "COLUMN"
|
|
7
|
+
PARTIAL_COLUMN = "PARTIAL_COLUMN"
|
|
8
|
+
SINGLE = "SINGLE"
|
|
9
|
+
ROW = "ROW"
|
|
10
|
+
QUADRANT = "QUADRANT"
|
|
11
|
+
ALL = "ALL"
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
COLUMN: Final = NozzleLayout.COLUMN
|
|
15
|
+
PARTIAL_COLUMN: Final = NozzleLayout.PARTIAL_COLUMN
|
|
16
|
+
SINGLE: Final = NozzleLayout.SINGLE
|
|
17
|
+
ROW: Final = NozzleLayout.ROW
|
|
18
|
+
ALL: Final = NozzleLayout.ALL
|
|
19
|
+
|
|
20
|
+
# Set __doc__ manually as a workaround. When this docstring is written the normal way, right after
|
|
21
|
+
# the constant definition, Sphinx has trouble picking it up.
|
|
22
|
+
COLUMN.__doc__ = """\
|
|
23
|
+
A special nozzle configuration type indicating a full single column pick up. Predominantly meant for the 96 channel.
|
|
24
|
+
|
|
25
|
+
See <ADD REFERENCE HERE> for details on using ``COLUMN`` with :py:obj:`InstrumentContext.configure_nozzle_layout()`.
|
|
26
|
+
"""
|
|
27
|
+
ALL.__doc__ = """\
|
|
28
|
+
A special nozzle configuration type indicating a reset back to default where the pipette will pick up its max capacity of tips.
|
|
29
|
+
|
|
30
|
+
See <ADD REFERENCE HERE> for details on using ``ALL`` with :py:obj:`InstrumentContext.configure_nozzle_layout()`.
|
|
31
|
+
"""
|
|
@@ -0,0 +1,300 @@
|
|
|
1
|
+
"""Parameter context for python protocols."""
|
|
2
|
+
import uuid
|
|
3
|
+
from typing import List, Optional, Union, Dict
|
|
4
|
+
|
|
5
|
+
from opentrons.protocols.api_support.types import APIVersion
|
|
6
|
+
from opentrons.protocols.api_support.util import requires_version
|
|
7
|
+
from opentrons.protocols.parameters import (
|
|
8
|
+
parameter_definition,
|
|
9
|
+
csv_parameter_definition,
|
|
10
|
+
validation,
|
|
11
|
+
)
|
|
12
|
+
from opentrons.protocols.parameters.types import (
|
|
13
|
+
ParameterChoice,
|
|
14
|
+
UserFacingTypes,
|
|
15
|
+
)
|
|
16
|
+
from opentrons.protocols.parameters.exceptions import (
|
|
17
|
+
ParameterDefinitionError,
|
|
18
|
+
ParameterValueError,
|
|
19
|
+
IncompatibleParameterError,
|
|
20
|
+
)
|
|
21
|
+
from opentrons.protocol_engine.types import (
|
|
22
|
+
RunTimeParameter,
|
|
23
|
+
PrimitiveRunTimeParamValuesType,
|
|
24
|
+
CSVRuntimeParamPaths,
|
|
25
|
+
FileInfo,
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
from ._parameters import Parameters
|
|
29
|
+
|
|
30
|
+
_ParameterDefinitionTypes = Union[
|
|
31
|
+
parameter_definition.ParameterDefinition,
|
|
32
|
+
csv_parameter_definition.CSVParameterDefinition,
|
|
33
|
+
]
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
class ParameterContext:
|
|
37
|
+
"""Public context for adding parameters to a protocol."""
|
|
38
|
+
|
|
39
|
+
def __init__(self, api_version: APIVersion) -> None:
|
|
40
|
+
"""Initializes a parameter context for user-set parameters."""
|
|
41
|
+
self._api_version = api_version
|
|
42
|
+
self._parameters: Dict[str, _ParameterDefinitionTypes] = {}
|
|
43
|
+
|
|
44
|
+
def add_int(
|
|
45
|
+
self,
|
|
46
|
+
display_name: str,
|
|
47
|
+
variable_name: str,
|
|
48
|
+
default: int,
|
|
49
|
+
minimum: Optional[int] = None,
|
|
50
|
+
maximum: Optional[int] = None,
|
|
51
|
+
choices: Optional[List[ParameterChoice]] = None,
|
|
52
|
+
description: Optional[str] = None,
|
|
53
|
+
unit: Optional[str] = None,
|
|
54
|
+
) -> None:
|
|
55
|
+
"""Creates an integer parameter, settable within a given range or list of choices.
|
|
56
|
+
|
|
57
|
+
Arguments:
|
|
58
|
+
display_name: The display name of the int parameter as it would show up on the frontend.
|
|
59
|
+
variable_name: The variable name the int parameter will be referred to in the run context.
|
|
60
|
+
default: The default value the int parameter will be set to. This will be used in initial analysis.
|
|
61
|
+
minimum: The minimum value the int parameter can be set to (inclusive). Mutually exclusive with choices.
|
|
62
|
+
maximum: The maximum value the int parameter can be set to (inclusive). Mutually exclusive with choices.
|
|
63
|
+
choices: A list of possible choices that this parameter can be set to.
|
|
64
|
+
Mutually exclusive with minimum and maximum.
|
|
65
|
+
description: A description of the parameter as it will show up on the frontend.
|
|
66
|
+
unit: An optional unit to be appended to the end of the integer as it shown on the frontend.
|
|
67
|
+
"""
|
|
68
|
+
validation.validate_variable_name_unique(variable_name, set(self._parameters))
|
|
69
|
+
parameter = parameter_definition.create_int_parameter(
|
|
70
|
+
display_name=display_name,
|
|
71
|
+
variable_name=variable_name,
|
|
72
|
+
default=default,
|
|
73
|
+
minimum=minimum,
|
|
74
|
+
maximum=maximum,
|
|
75
|
+
choices=choices,
|
|
76
|
+
description=description,
|
|
77
|
+
unit=unit,
|
|
78
|
+
)
|
|
79
|
+
self._parameters[parameter.variable_name] = parameter
|
|
80
|
+
|
|
81
|
+
def add_float(
|
|
82
|
+
self,
|
|
83
|
+
display_name: str,
|
|
84
|
+
variable_name: str,
|
|
85
|
+
default: float,
|
|
86
|
+
minimum: Optional[float] = None,
|
|
87
|
+
maximum: Optional[float] = None,
|
|
88
|
+
choices: Optional[List[ParameterChoice]] = None,
|
|
89
|
+
description: Optional[str] = None,
|
|
90
|
+
unit: Optional[str] = None,
|
|
91
|
+
) -> None:
|
|
92
|
+
"""Creates a float parameter, settable within a given range or list of choices.
|
|
93
|
+
|
|
94
|
+
Arguments:
|
|
95
|
+
display_name: The display name of the float parameter as it would show up on the frontend.
|
|
96
|
+
variable_name: The variable name the float parameter will be referred to in the run context.
|
|
97
|
+
default: The default value the float parameter will be set to. This will be used in initial analysis.
|
|
98
|
+
minimum: The minimum value the float parameter can be set to (inclusive). Mutually exclusive with choices.
|
|
99
|
+
maximum: The maximum value the float parameter can be set to (inclusive). Mutually exclusive with choices.
|
|
100
|
+
choices: A list of possible choices that this parameter can be set to.
|
|
101
|
+
Mutually exclusive with minimum and maximum.
|
|
102
|
+
description: A description of the parameter as it will show up on the frontend.
|
|
103
|
+
unit: An optional unit to be appended to the end of the float as it shown on the frontend.
|
|
104
|
+
"""
|
|
105
|
+
validation.validate_variable_name_unique(variable_name, set(self._parameters))
|
|
106
|
+
parameter = parameter_definition.create_float_parameter(
|
|
107
|
+
display_name=display_name,
|
|
108
|
+
variable_name=variable_name,
|
|
109
|
+
default=validation.ensure_float_value(default),
|
|
110
|
+
minimum=validation.ensure_optional_float_value(minimum),
|
|
111
|
+
maximum=validation.ensure_optional_float_value(maximum),
|
|
112
|
+
choices=validation.ensure_float_choices(choices),
|
|
113
|
+
description=description,
|
|
114
|
+
unit=unit,
|
|
115
|
+
)
|
|
116
|
+
self._parameters[parameter.variable_name] = parameter
|
|
117
|
+
|
|
118
|
+
def add_bool(
|
|
119
|
+
self,
|
|
120
|
+
display_name: str,
|
|
121
|
+
variable_name: str,
|
|
122
|
+
default: bool,
|
|
123
|
+
description: Optional[str] = None,
|
|
124
|
+
) -> None:
|
|
125
|
+
"""Creates a boolean parameter with allowable values of "On" (True) or "Off" (False).
|
|
126
|
+
|
|
127
|
+
Arguments:
|
|
128
|
+
display_name: The display name of the boolean parameter as it would show up on the frontend.
|
|
129
|
+
variable_name: The variable name the boolean parameter will be referred to in the run context.
|
|
130
|
+
default: The default value the boolean parameter will be set to. This will be used in initial analysis.
|
|
131
|
+
description: A description of the parameter as it will show up on the frontend.
|
|
132
|
+
"""
|
|
133
|
+
validation.validate_variable_name_unique(variable_name, set(self._parameters))
|
|
134
|
+
parameter = parameter_definition.create_bool_parameter(
|
|
135
|
+
display_name=display_name,
|
|
136
|
+
variable_name=variable_name,
|
|
137
|
+
default=default,
|
|
138
|
+
choices=[
|
|
139
|
+
{"display_name": "On", "value": True},
|
|
140
|
+
{"display_name": "Off", "value": False},
|
|
141
|
+
],
|
|
142
|
+
description=description,
|
|
143
|
+
)
|
|
144
|
+
self._parameters[parameter.variable_name] = parameter
|
|
145
|
+
|
|
146
|
+
def add_str(
|
|
147
|
+
self,
|
|
148
|
+
display_name: str,
|
|
149
|
+
variable_name: str,
|
|
150
|
+
default: str,
|
|
151
|
+
choices: Optional[List[ParameterChoice]] = None,
|
|
152
|
+
description: Optional[str] = None,
|
|
153
|
+
) -> None:
|
|
154
|
+
"""Creates a string parameter, settable among given choices.
|
|
155
|
+
|
|
156
|
+
Arguments:
|
|
157
|
+
display_name: The display name of the string parameter as it would show up on the frontend.
|
|
158
|
+
variable_name: The variable name the string parameter will be referred to in the run context.
|
|
159
|
+
default: The default value the string parameter will be set to. This will be used in initial analysis.
|
|
160
|
+
choices: A list of possible choices that this parameter can be set to.
|
|
161
|
+
Mutually exclusive with minimum and maximum.
|
|
162
|
+
description: A description of the parameter as it will show up on the frontend.
|
|
163
|
+
"""
|
|
164
|
+
validation.validate_variable_name_unique(variable_name, set(self._parameters))
|
|
165
|
+
parameter = parameter_definition.create_str_parameter(
|
|
166
|
+
display_name=display_name,
|
|
167
|
+
variable_name=variable_name,
|
|
168
|
+
default=default,
|
|
169
|
+
choices=choices,
|
|
170
|
+
description=description,
|
|
171
|
+
)
|
|
172
|
+
self._parameters[parameter.variable_name] = parameter
|
|
173
|
+
|
|
174
|
+
@requires_version(2, 20)
|
|
175
|
+
def add_csv_file(
|
|
176
|
+
self,
|
|
177
|
+
display_name: str,
|
|
178
|
+
variable_name: str,
|
|
179
|
+
description: Optional[str] = None,
|
|
180
|
+
) -> None:
|
|
181
|
+
"""Creates a CSV parameter that can be set to any CSV file via the Flex ODD or a local computer.
|
|
182
|
+
|
|
183
|
+
Arguments:
|
|
184
|
+
display_name: The display name of the CSV parameter as it would show up on the frontend.
|
|
185
|
+
variable_name: The variable name the CSV parameter will be referred to in the run context.
|
|
186
|
+
description: A description of the parameter as it will show up on the frontend.
|
|
187
|
+
"""
|
|
188
|
+
if any(
|
|
189
|
+
isinstance(parameter, csv_parameter_definition.CSVParameterDefinition)
|
|
190
|
+
for parameter in self._parameters.values()
|
|
191
|
+
):
|
|
192
|
+
raise IncompatibleParameterError(
|
|
193
|
+
"Only one CSV File parameter can be defined per protocol."
|
|
194
|
+
)
|
|
195
|
+
|
|
196
|
+
validation.validate_variable_name_unique(variable_name, set(self._parameters))
|
|
197
|
+
parameter = csv_parameter_definition.create_csv_parameter(
|
|
198
|
+
display_name=display_name,
|
|
199
|
+
variable_name=variable_name,
|
|
200
|
+
description=description,
|
|
201
|
+
)
|
|
202
|
+
self._parameters[parameter.variable_name] = parameter
|
|
203
|
+
|
|
204
|
+
def set_parameters(
|
|
205
|
+
self, parameter_overrides: PrimitiveRunTimeParamValuesType
|
|
206
|
+
) -> None:
|
|
207
|
+
"""Sets parameters to values given by client, validating them as well.
|
|
208
|
+
|
|
209
|
+
:meta private:
|
|
210
|
+
|
|
211
|
+
This is intended for Opentrons internal use only and is not a guaranteed API.
|
|
212
|
+
"""
|
|
213
|
+
for variable_name, override_value in parameter_overrides.items():
|
|
214
|
+
try:
|
|
215
|
+
parameter = self._parameters[variable_name]
|
|
216
|
+
except KeyError:
|
|
217
|
+
raise ParameterDefinitionError(
|
|
218
|
+
f"Parameter {variable_name} is not defined as a parameter for this protocol."
|
|
219
|
+
)
|
|
220
|
+
if isinstance(parameter, csv_parameter_definition.CSVParameterDefinition):
|
|
221
|
+
raise ParameterValueError(
|
|
222
|
+
f"A primitive param value was provided for the parameter '{variable_name}',"
|
|
223
|
+
f" but '{variable_name}' is a CSV parameter that can only accept file IDs."
|
|
224
|
+
)
|
|
225
|
+
else:
|
|
226
|
+
validated_value = validation.ensure_value_type(
|
|
227
|
+
override_value, parameter.parameter_type
|
|
228
|
+
)
|
|
229
|
+
parameter.value = validated_value
|
|
230
|
+
|
|
231
|
+
def initialize_csv_files(
|
|
232
|
+
self, run_time_param_file_overrides: CSVRuntimeParamPaths
|
|
233
|
+
) -> None:
|
|
234
|
+
"""Initializes the files for CSV parameters.
|
|
235
|
+
|
|
236
|
+
:meta private:
|
|
237
|
+
|
|
238
|
+
This is intended for Opentrons internal use only and is not a guaranteed API.
|
|
239
|
+
"""
|
|
240
|
+
for variable_name, file_path in run_time_param_file_overrides.items():
|
|
241
|
+
try:
|
|
242
|
+
parameter = self._parameters[variable_name]
|
|
243
|
+
except KeyError:
|
|
244
|
+
raise ParameterDefinitionError(
|
|
245
|
+
f"Parameter {variable_name} is not defined as a parameter for this protocol."
|
|
246
|
+
)
|
|
247
|
+
if not isinstance(
|
|
248
|
+
parameter, csv_parameter_definition.CSVParameterDefinition
|
|
249
|
+
):
|
|
250
|
+
raise ParameterValueError(
|
|
251
|
+
f"File Id was provided for the parameter '{variable_name}',"
|
|
252
|
+
f" but '{variable_name}' is not a CSV parameter."
|
|
253
|
+
)
|
|
254
|
+
|
|
255
|
+
# TODO(jbl 2024-09-30) Refactor this so file ID is passed as its own argument and not assumed from the path
|
|
256
|
+
# If this is running on a robot, the parent folder in the path will be the file ID
|
|
257
|
+
# If it is running locally, most likely the parent folder will not be a UUID, so instead we will change
|
|
258
|
+
# this to be an empty string
|
|
259
|
+
file_id = file_path.parent.name
|
|
260
|
+
try:
|
|
261
|
+
uuid.UUID(file_id, version=4)
|
|
262
|
+
except ValueError:
|
|
263
|
+
file_id = ""
|
|
264
|
+
|
|
265
|
+
file_name = file_path.name
|
|
266
|
+
|
|
267
|
+
with file_path.open("rb") as fh:
|
|
268
|
+
contents = fh.read()
|
|
269
|
+
|
|
270
|
+
parameter.file_info = FileInfo(id=file_id, name=file_name)
|
|
271
|
+
parameter.value = contents
|
|
272
|
+
|
|
273
|
+
def export_parameters_for_analysis(self) -> List[RunTimeParameter]:
|
|
274
|
+
"""Exports all parameters into a protocol engine models for reporting in analysis.
|
|
275
|
+
|
|
276
|
+
:meta private:
|
|
277
|
+
|
|
278
|
+
This is intended for Opentrons internal use only and is not a guaranteed API.
|
|
279
|
+
"""
|
|
280
|
+
return [
|
|
281
|
+
parameter.as_protocol_engine_type()
|
|
282
|
+
for parameter in self._parameters.values()
|
|
283
|
+
]
|
|
284
|
+
|
|
285
|
+
def export_parameters_for_protocol(self) -> Parameters:
|
|
286
|
+
"""Exports all parameters into a protocol run usable parameters object.
|
|
287
|
+
|
|
288
|
+
:meta private:
|
|
289
|
+
|
|
290
|
+
This is intended for Opentrons internal use only and is not a guaranteed API.
|
|
291
|
+
"""
|
|
292
|
+
parameters_for_protocol: Dict[str, UserFacingTypes] = {}
|
|
293
|
+
for parameter in self._parameters.values():
|
|
294
|
+
value: UserFacingTypes
|
|
295
|
+
if isinstance(parameter, csv_parameter_definition.CSVParameterDefinition):
|
|
296
|
+
value = parameter.as_csv_parameter_interface(self._api_version)
|
|
297
|
+
else:
|
|
298
|
+
value = parameter.value
|
|
299
|
+
parameters_for_protocol[parameter.variable_name] = value
|
|
300
|
+
return Parameters(parameters=parameters_for_protocol)
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
from typing import Dict, Optional, Any
|
|
2
|
+
|
|
3
|
+
from opentrons.protocols.parameters.types import UserFacingTypes
|
|
4
|
+
from opentrons.protocols.parameters.exceptions import ParameterNameError
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class Parameters:
|
|
8
|
+
def __init__(self, parameters: Optional[Dict[str, UserFacingTypes]] = None) -> None:
|
|
9
|
+
super().__setattr__("_values", {})
|
|
10
|
+
self._values: Dict[str, UserFacingTypes] = {}
|
|
11
|
+
if parameters is not None:
|
|
12
|
+
for name, value in parameters.items():
|
|
13
|
+
self._initialize_parameter(name, value)
|
|
14
|
+
|
|
15
|
+
def __setattr__(self, key: str, value: Any) -> None:
|
|
16
|
+
if key in self._values:
|
|
17
|
+
raise AttributeError(f"Cannot overwrite protocol defined parameter {key}")
|
|
18
|
+
super().__setattr__(key, value)
|
|
19
|
+
|
|
20
|
+
def _initialize_parameter(self, variable_name: str, value: UserFacingTypes) -> None:
|
|
21
|
+
if not hasattr(self, variable_name):
|
|
22
|
+
setattr(self, variable_name, value)
|
|
23
|
+
self._values[variable_name] = value
|
|
24
|
+
else:
|
|
25
|
+
raise ParameterNameError(
|
|
26
|
+
f"Cannot use {variable_name} as a variable name, either duplicates another"
|
|
27
|
+
f" parameter name, Opentrons reserved function, or Python built-in"
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
def get_all(self) -> Dict[str, UserFacingTypes]:
|
|
31
|
+
return self._values
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
from dataclasses import dataclass
|
|
2
|
+
from typing import List, Union, Sequence, Optional
|
|
3
|
+
|
|
4
|
+
from opentrons.types import Location, NozzleMapInterface
|
|
5
|
+
from opentrons.protocols.api_support import instrument
|
|
6
|
+
from opentrons.protocols.advanced_control.transfers import (
|
|
7
|
+
transfer_liquid_utils as tx_liquid_utils,
|
|
8
|
+
)
|
|
9
|
+
from opentrons.protocols.advanced_control.transfers.common import (
|
|
10
|
+
TransferTipPolicyV2,
|
|
11
|
+
TransferTipPolicyV2Type,
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
from .disposal_locations import TrashBin, WasteChute
|
|
15
|
+
from .labware import Labware, Well
|
|
16
|
+
from . import validation
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
@dataclass
|
|
20
|
+
class TransferInfo:
|
|
21
|
+
|
|
22
|
+
source: List[Well]
|
|
23
|
+
dest: Union[List[Well], TrashBin, WasteChute]
|
|
24
|
+
tip_policy: TransferTipPolicyV2
|
|
25
|
+
tip_racks: List[Labware]
|
|
26
|
+
trash_location: Union[Location, TrashBin, WasteChute]
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def verify_and_normalize_transfer_args(
|
|
30
|
+
source: Union[Well, Sequence[Well], Sequence[Sequence[Well]]],
|
|
31
|
+
dest: Union[Well, Sequence[Well], Sequence[Sequence[Well]], TrashBin, WasteChute],
|
|
32
|
+
tip_policy: TransferTipPolicyV2Type,
|
|
33
|
+
last_tip_well: Optional[Well],
|
|
34
|
+
tip_racks: List[Labware],
|
|
35
|
+
nozzle_map: NozzleMapInterface,
|
|
36
|
+
group_wells_for_multi_channel: bool,
|
|
37
|
+
current_volume: float,
|
|
38
|
+
trash_location: Union[Location, Well, Labware, TrashBin, WasteChute],
|
|
39
|
+
) -> TransferInfo:
|
|
40
|
+
flat_sources_list = validation.ensure_valid_flat_wells_list_for_transfer_v2(source)
|
|
41
|
+
if not isinstance(dest, (TrashBin, WasteChute)):
|
|
42
|
+
flat_dests_list = validation.ensure_valid_flat_wells_list_for_transfer_v2(dest)
|
|
43
|
+
else:
|
|
44
|
+
# If trash bin or waste chute, set this to empty to have less isinstance checks after this
|
|
45
|
+
flat_dests_list = []
|
|
46
|
+
if group_wells_for_multi_channel and nozzle_map.tip_count > 1:
|
|
47
|
+
flat_sources_list = tx_liquid_utils.group_wells_for_multi_channel_transfer(
|
|
48
|
+
flat_sources_list, nozzle_map, "source"
|
|
49
|
+
)
|
|
50
|
+
flat_dests_list = tx_liquid_utils.group_wells_for_multi_channel_transfer(
|
|
51
|
+
flat_dests_list, nozzle_map, "destination"
|
|
52
|
+
)
|
|
53
|
+
for well in flat_sources_list + flat_dests_list:
|
|
54
|
+
instrument.validate_takes_liquid(
|
|
55
|
+
location=well.top(),
|
|
56
|
+
reject_module=True,
|
|
57
|
+
reject_adapter=True,
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
valid_new_tip = validation.ensure_new_tip_policy(tip_policy)
|
|
61
|
+
if valid_new_tip == TransferTipPolicyV2.NEVER:
|
|
62
|
+
if last_tip_well is None:
|
|
63
|
+
raise RuntimeError(
|
|
64
|
+
"Pipette has no tip attached to perform transfer."
|
|
65
|
+
" Either do a pick_up_tip beforehand or specify a new_tip parameter"
|
|
66
|
+
" of 'once' or 'always'."
|
|
67
|
+
)
|
|
68
|
+
else:
|
|
69
|
+
valid_tip_racks = [last_tip_well.parent]
|
|
70
|
+
else:
|
|
71
|
+
valid_tip_racks = tip_racks
|
|
72
|
+
if current_volume != 0:
|
|
73
|
+
raise RuntimeError(
|
|
74
|
+
"A transfer on a liquid class cannot start with liquid already in the tip."
|
|
75
|
+
" Ensure that all previously aspirated liquid is dispensed before starting"
|
|
76
|
+
" a new transfer."
|
|
77
|
+
)
|
|
78
|
+
|
|
79
|
+
_trash_location: Union[Location, Well, TrashBin, WasteChute]
|
|
80
|
+
if isinstance(trash_location, Labware):
|
|
81
|
+
_trash_location = trash_location.wells()[0]
|
|
82
|
+
else:
|
|
83
|
+
_trash_location = trash_location
|
|
84
|
+
|
|
85
|
+
valid_trash_location = validation.ensure_valid_trash_location_for_transfer_v2(
|
|
86
|
+
trash_location=_trash_location
|
|
87
|
+
)
|
|
88
|
+
|
|
89
|
+
return TransferInfo(
|
|
90
|
+
source=flat_sources_list,
|
|
91
|
+
dest=flat_dests_list if not isinstance(dest, (TrashBin, WasteChute)) else dest,
|
|
92
|
+
tip_policy=valid_new_tip,
|
|
93
|
+
tip_racks=valid_tip_racks,
|
|
94
|
+
trash_location=valid_trash_location,
|
|
95
|
+
)
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
def resolve_keep_last_tip(
|
|
99
|
+
keep_last_tip: Optional[bool], tip_strategy: TransferTipPolicyV2
|
|
100
|
+
) -> bool:
|
|
101
|
+
"""Resolve the liquid class transfer argument `keep_last_tip`
|
|
102
|
+
|
|
103
|
+
If set to a boolean value, maintains that setting. Otherwise, default to
|
|
104
|
+
`True` if tip policy is `NEVER`, otherwise default to `False`
|
|
105
|
+
"""
|
|
106
|
+
if keep_last_tip is not None:
|
|
107
|
+
return keep_last_tip
|
|
108
|
+
return tip_strategy == TransferTipPolicyV2.NEVER
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
from typing_extensions import Final
|
|
3
|
+
import enum
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
# TODO (tz, 5-18-23): think about a better name for it that would also work when we include staging area slots in the type.
|
|
7
|
+
class OffDeckType(enum.Enum):
|
|
8
|
+
OFF_DECK = "off-deck"
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
OFF_DECK: Final = OffDeckType.OFF_DECK
|
|
12
|
+
|
|
13
|
+
# Set __doc__ manually as a workaround. When this docstring is written the normal way, right after
|
|
14
|
+
# the constant definition, Sphinx has trouble picking it up.
|
|
15
|
+
OFF_DECK.__doc__ = """\
|
|
16
|
+
A special location value, indicating that a labware is not currently on the robot's deck.
|
|
17
|
+
|
|
18
|
+
See :ref:`off-deck-location` for details on using ``OFF_DECK`` with :py:obj:`ProtocolContext.move_labware()`.
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class PlungerPositionTypes(enum.Enum):
|
|
23
|
+
PLUNGER_TOP = "top"
|
|
24
|
+
PLUNGER_BOTTOM = "bottom"
|
|
25
|
+
PLUNGER_BLOWOUT = "blow_out"
|
|
26
|
+
PLUNGER_DROPTIP = "drop_tip"
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
PLUNGER_TOP: Final = PlungerPositionTypes.PLUNGER_TOP
|
|
30
|
+
PLUNGER_BOTTOM: Final = PlungerPositionTypes.PLUNGER_BOTTOM
|
|
31
|
+
PLUNGER_BLOWOUT: Final = PlungerPositionTypes.PLUNGER_BLOWOUT
|
|
32
|
+
PLUNGER_DROPTIP: Final = PlungerPositionTypes.PLUNGER_DROPTIP
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
class PipetteActionTypes(enum.Enum):
|
|
36
|
+
ASPIRATE_ACTION = "aspirate"
|
|
37
|
+
DISPENSE_ACTION = "dispense"
|
|
38
|
+
BLOWOUT_ACTION = "blowout"
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
ASPIRATE_ACTION: Final = PipetteActionTypes.ASPIRATE_ACTION
|
|
42
|
+
DISPENSE_ACTION: Final = PipetteActionTypes.DISPENSE_ACTION
|
|
43
|
+
BLOWOUT_ACTION: Final = PipetteActionTypes.BLOWOUT_ACTION
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"""Contains configuration related classes for Protocol API."""
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class Clearances:
|
|
5
|
+
def __init__(self, default_aspirate: float, default_dispense: float) -> None:
|
|
6
|
+
self._aspirate = default_aspirate
|
|
7
|
+
self._dispense = default_dispense
|
|
8
|
+
|
|
9
|
+
@property
|
|
10
|
+
def aspirate(self) -> float:
|
|
11
|
+
return self._aspirate
|
|
12
|
+
|
|
13
|
+
@aspirate.setter
|
|
14
|
+
def aspirate(self, new_val: float) -> None:
|
|
15
|
+
self._aspirate = float(new_val)
|
|
16
|
+
|
|
17
|
+
@property
|
|
18
|
+
def dispense(self) -> float:
|
|
19
|
+
return self._dispense
|
|
20
|
+
|
|
21
|
+
@dispense.setter
|
|
22
|
+
def dispense(self, new_val: float) -> None:
|
|
23
|
+
self._dispense = float(new_val)
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"""Core protocol logic interfaces and implementations.
|
|
2
|
+
|
|
3
|
+
This module provide facades to different protocol execution cores,
|
|
4
|
+
and is an internal implementation detail of the Python Protocol API.
|
|
5
|
+
|
|
6
|
+
Nothing defined in `opentrons.protocol_api.core` may be considered public.
|
|
7
|
+
"""
|
|
8
|
+
# TODO(mc, 2022-08-22): uncomment when import cycles can be resolved
|
|
9
|
+
# from .protocol import AbstractProtocol
|
|
10
|
+
# from .labware_offset_provider import (
|
|
11
|
+
# AbstractLabwareOffsetProvider,
|
|
12
|
+
# LabwareOffsetProvider,
|
|
13
|
+
# NullLabwareOffsetProvider,
|
|
14
|
+
# ProvidedLabwareOffset,
|
|
15
|
+
# )
|
|
16
|
+
|
|
17
|
+
# __all__ = [
|
|
18
|
+
# "AbstractProtocol",
|
|
19
|
+
# "AbstractLabwareOffsetProvider",
|
|
20
|
+
# "LabwareOffsetProvider",
|
|
21
|
+
# "NullLabwareOffsetProvider",
|
|
22
|
+
# "ProvidedLabwareOffset",
|
|
23
|
+
# ]
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"""Common APIs for protocol core interfaces."""
|
|
2
|
+
|
|
3
|
+
# TODO(mc, 2022-08-22): move to __init__ when dependency cycles are resolved
|
|
4
|
+
from .instrument import AbstractInstrument
|
|
5
|
+
from .labware import AbstractLabware
|
|
6
|
+
from .module import (
|
|
7
|
+
AbstractModuleCore,
|
|
8
|
+
AbstractTemperatureModuleCore,
|
|
9
|
+
AbstractMagneticModuleCore,
|
|
10
|
+
AbstractThermocyclerCore,
|
|
11
|
+
AbstractHeaterShakerCore,
|
|
12
|
+
AbstractMagneticBlockCore,
|
|
13
|
+
AbstractAbsorbanceReaderCore,
|
|
14
|
+
AbstractFlexStackerCore,
|
|
15
|
+
)
|
|
16
|
+
from .protocol import AbstractProtocol
|
|
17
|
+
from .well import AbstractWellCore
|
|
18
|
+
from .robot import AbstractRobot
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
WellCore = AbstractWellCore
|
|
22
|
+
LabwareCore = AbstractLabware[WellCore]
|
|
23
|
+
InstrumentCore = AbstractInstrument[WellCore, LabwareCore]
|
|
24
|
+
ModuleCore = AbstractModuleCore[LabwareCore]
|
|
25
|
+
TemperatureModuleCore = AbstractTemperatureModuleCore[LabwareCore]
|
|
26
|
+
MagneticModuleCore = AbstractMagneticModuleCore[LabwareCore]
|
|
27
|
+
ThermocyclerCore = AbstractThermocyclerCore[LabwareCore]
|
|
28
|
+
HeaterShakerCore = AbstractHeaterShakerCore[LabwareCore]
|
|
29
|
+
MagneticBlockCore = AbstractMagneticBlockCore[LabwareCore]
|
|
30
|
+
AbsorbanceReaderCore = AbstractAbsorbanceReaderCore[LabwareCore]
|
|
31
|
+
FlexStackerCore = AbstractFlexStackerCore[LabwareCore]
|
|
32
|
+
RobotCore = AbstractRobot
|
|
33
|
+
ProtocolCore = AbstractProtocol[InstrumentCore, LabwareCore, ModuleCore]
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"""Map equipment cores to public PAPI objects."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import TYPE_CHECKING, Dict, Union
|
|
6
|
+
from typing import overload, Callable
|
|
7
|
+
|
|
8
|
+
from .common import ModuleCore, LabwareCore
|
|
9
|
+
|
|
10
|
+
if TYPE_CHECKING:
|
|
11
|
+
from ..labware import Labware
|
|
12
|
+
from ..protocol_context import ModuleTypes
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class LoadedCoreMap:
|
|
16
|
+
"""A map of equipment (labware, modules) cores to public PAPI instances.
|
|
17
|
+
|
|
18
|
+
This object keeps track of every core instance that has been created
|
|
19
|
+
so that later, those cores can be used to look up the public PAPI objects
|
|
20
|
+
they represent.
|
|
21
|
+
|
|
22
|
+
This linkage creates a circular dependency, but keeps it contained to this instance.
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
def __init__(self) -> None:
|
|
26
|
+
self._contexts_by_core: Dict[
|
|
27
|
+
Union[LabwareCore, ModuleCore],
|
|
28
|
+
Union[Labware, ModuleTypes],
|
|
29
|
+
] = {}
|
|
30
|
+
|
|
31
|
+
@overload
|
|
32
|
+
def add(self, core: LabwareCore, context: Labware) -> None:
|
|
33
|
+
...
|
|
34
|
+
|
|
35
|
+
@overload
|
|
36
|
+
def add(self, core: ModuleCore, context: ModuleTypes) -> None:
|
|
37
|
+
...
|
|
38
|
+
|
|
39
|
+
def add(
|
|
40
|
+
self,
|
|
41
|
+
core: Union[LabwareCore, ModuleCore],
|
|
42
|
+
context: Union[Labware, ModuleTypes],
|
|
43
|
+
) -> None:
|
|
44
|
+
"""Add a core and its associated public PAPI object."""
|
|
45
|
+
self._contexts_by_core[core] = context
|
|
46
|
+
|
|
47
|
+
@overload
|
|
48
|
+
def get(self, core: LabwareCore) -> Labware:
|
|
49
|
+
...
|
|
50
|
+
|
|
51
|
+
@overload
|
|
52
|
+
def get(self, core: ModuleCore) -> ModuleTypes:
|
|
53
|
+
...
|
|
54
|
+
|
|
55
|
+
@overload
|
|
56
|
+
def get(self, core: None) -> None:
|
|
57
|
+
...
|
|
58
|
+
|
|
59
|
+
def get(
|
|
60
|
+
self, core: Union[LabwareCore, ModuleCore, None]
|
|
61
|
+
) -> Union[Labware, ModuleTypes, None]:
|
|
62
|
+
"""Given a core, get the public PAPI object it represents."""
|
|
63
|
+
return self._contexts_by_core[core] if core is not None else None
|
|
64
|
+
|
|
65
|
+
def get_or_add(
|
|
66
|
+
self, core: LabwareCore, context_builder: Callable[[LabwareCore], Labware]
|
|
67
|
+
) -> Labware:
|
|
68
|
+
try:
|
|
69
|
+
return self.get(core)
|
|
70
|
+
except KeyError:
|
|
71
|
+
pass
|
|
72
|
+
context = context_builder(core)
|
|
73
|
+
self.add(core, context)
|
|
74
|
+
return context
|