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,61 @@
|
|
|
1
|
+
"""Command models for Absorbance Reader commands."""
|
|
2
|
+
from .close_lid import (
|
|
3
|
+
CloseLidCommandType,
|
|
4
|
+
CloseLidParams,
|
|
5
|
+
CloseLidResult,
|
|
6
|
+
CloseLid,
|
|
7
|
+
CloseLidCreate,
|
|
8
|
+
)
|
|
9
|
+
|
|
10
|
+
from .open_lid import (
|
|
11
|
+
OpenLidCommandType,
|
|
12
|
+
OpenLidParams,
|
|
13
|
+
OpenLidResult,
|
|
14
|
+
OpenLid,
|
|
15
|
+
OpenLidCreate,
|
|
16
|
+
)
|
|
17
|
+
|
|
18
|
+
from .initialize import (
|
|
19
|
+
InitializeCommandType,
|
|
20
|
+
InitializeParams,
|
|
21
|
+
InitializeResult,
|
|
22
|
+
Initialize,
|
|
23
|
+
InitializeCreate,
|
|
24
|
+
)
|
|
25
|
+
|
|
26
|
+
from .read import (
|
|
27
|
+
ReadAbsorbanceCommandType,
|
|
28
|
+
ReadAbsorbanceParams,
|
|
29
|
+
ReadAbsorbanceResult,
|
|
30
|
+
ReadAbsorbance,
|
|
31
|
+
ReadAbsorbanceCreate,
|
|
32
|
+
)
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
__all__ = [
|
|
36
|
+
# absorbanace_reader/closeLid
|
|
37
|
+
"CloseLidCommandType",
|
|
38
|
+
"CloseLidParams",
|
|
39
|
+
"CloseLidResult",
|
|
40
|
+
"CloseLid",
|
|
41
|
+
"CloseLidCreate",
|
|
42
|
+
# absorbanace_reader/openLid
|
|
43
|
+
"OpenLidCommandType",
|
|
44
|
+
"OpenLidParams",
|
|
45
|
+
"OpenLidResult",
|
|
46
|
+
"OpenLid",
|
|
47
|
+
"OpenLidCreate",
|
|
48
|
+
# absorbanace_reader/initialize
|
|
49
|
+
"InitializeCommandType",
|
|
50
|
+
"InitializeParams",
|
|
51
|
+
"InitializeResult",
|
|
52
|
+
"Initialize",
|
|
53
|
+
"InitializeCreate",
|
|
54
|
+
# absorbanace_reader/measure
|
|
55
|
+
"ReadAbsorbanceCommandType",
|
|
56
|
+
"ReadAbsorbanceParams",
|
|
57
|
+
"ReadAbsorbanceResult",
|
|
58
|
+
"ReadAbsorbance",
|
|
59
|
+
"ReadAbsorbanceCreate",
|
|
60
|
+
# union type
|
|
61
|
+
]
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
"""Command models to close the lid on an Absorbance Reader."""
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
from typing import Optional, Literal, TYPE_CHECKING
|
|
4
|
+
from typing_extensions import Type
|
|
5
|
+
|
|
6
|
+
from pydantic import BaseModel, Field
|
|
7
|
+
|
|
8
|
+
from ..command import AbstractCommandImpl, BaseCommand, BaseCommandCreate, SuccessData
|
|
9
|
+
from ...errors.error_occurrence import ErrorOccurrence
|
|
10
|
+
from ...errors import CannotPerformModuleAction
|
|
11
|
+
from opentrons.protocol_engine.types import AddressableAreaLocation
|
|
12
|
+
|
|
13
|
+
from ...state.update_types import StateUpdate
|
|
14
|
+
|
|
15
|
+
from .common import LID_Z_CLEARANCE
|
|
16
|
+
|
|
17
|
+
from opentrons.types import Point
|
|
18
|
+
|
|
19
|
+
from opentrons.drivers.types import AbsorbanceReaderLidStatus
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
if TYPE_CHECKING:
|
|
23
|
+
from opentrons.protocol_engine.state.state import StateView
|
|
24
|
+
from opentrons.protocol_engine.execution import (
|
|
25
|
+
EquipmentHandler,
|
|
26
|
+
LabwareMovementHandler,
|
|
27
|
+
)
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
CloseLidCommandType = Literal["absorbanceReader/closeLid"]
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class CloseLidParams(BaseModel):
|
|
34
|
+
"""Input parameters to close the lid on an absorbance reading."""
|
|
35
|
+
|
|
36
|
+
moduleId: str = Field(..., description="Unique ID of the absorbance reader.")
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
class CloseLidResult(BaseModel):
|
|
40
|
+
"""Result data from closing the lid on an aborbance reading."""
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
class CloseLidImpl(AbstractCommandImpl[CloseLidParams, SuccessData[CloseLidResult]]):
|
|
44
|
+
"""Execution implementation of closing the lid on an Absorbance Reader."""
|
|
45
|
+
|
|
46
|
+
def __init__(
|
|
47
|
+
self,
|
|
48
|
+
state_view: StateView,
|
|
49
|
+
equipment: EquipmentHandler,
|
|
50
|
+
labware_movement: LabwareMovementHandler,
|
|
51
|
+
**unused_dependencies: object,
|
|
52
|
+
) -> None:
|
|
53
|
+
self._state_view = state_view
|
|
54
|
+
self._equipment = equipment
|
|
55
|
+
self._labware_movement = labware_movement
|
|
56
|
+
|
|
57
|
+
async def execute(self, params: CloseLidParams) -> SuccessData[CloseLidResult]:
|
|
58
|
+
"""Execute the close lid command."""
|
|
59
|
+
state_update = StateUpdate()
|
|
60
|
+
mod_substate = self._state_view.modules.get_absorbance_reader_substate(
|
|
61
|
+
module_id=params.moduleId
|
|
62
|
+
)
|
|
63
|
+
|
|
64
|
+
hardware_lid_status = AbsorbanceReaderLidStatus.OFF
|
|
65
|
+
if not self._state_view.config.use_virtual_modules:
|
|
66
|
+
abs_reader = self._equipment.get_module_hardware_api(mod_substate.module_id)
|
|
67
|
+
if abs_reader is not None:
|
|
68
|
+
hardware_lid_status = await abs_reader.get_current_lid_status()
|
|
69
|
+
else:
|
|
70
|
+
raise CannotPerformModuleAction(
|
|
71
|
+
"Could not reach the Hardware API for Opentrons Plate Reader Module."
|
|
72
|
+
)
|
|
73
|
+
|
|
74
|
+
if hardware_lid_status is AbsorbanceReaderLidStatus.ON:
|
|
75
|
+
# The lid is already physically ON, so we can no-op physically closing it
|
|
76
|
+
state_update.set_absorbance_reader_lid(
|
|
77
|
+
module_id=mod_substate.module_id, is_lid_on=True
|
|
78
|
+
)
|
|
79
|
+
else:
|
|
80
|
+
# Allow propagation of ModuleNotAttachedError.
|
|
81
|
+
_ = self._equipment.get_module_hardware_api(mod_substate.module_id)
|
|
82
|
+
|
|
83
|
+
lid_definition = (
|
|
84
|
+
self._state_view.labware.get_absorbance_reader_lid_definition()
|
|
85
|
+
)
|
|
86
|
+
|
|
87
|
+
current_location = self._state_view.modules.absorbance_reader_dock_location(
|
|
88
|
+
params.moduleId
|
|
89
|
+
)
|
|
90
|
+
|
|
91
|
+
# we need to move the lid onto the module reader
|
|
92
|
+
absorbance_model = self._state_view.modules.get_requested_model(
|
|
93
|
+
params.moduleId
|
|
94
|
+
)
|
|
95
|
+
assert absorbance_model is not None
|
|
96
|
+
new_location = AddressableAreaLocation(
|
|
97
|
+
addressableAreaName=self._state_view.modules.ensure_and_convert_module_fixture_location(
|
|
98
|
+
deck_slot=self._state_view.modules.get_location(
|
|
99
|
+
params.moduleId
|
|
100
|
+
).slotName,
|
|
101
|
+
model=absorbance_model,
|
|
102
|
+
)
|
|
103
|
+
)
|
|
104
|
+
|
|
105
|
+
# The lid's labware definition stores gripper offsets for itself in the
|
|
106
|
+
# space normally meant for offsets for labware stacked atop it.
|
|
107
|
+
lid_gripper_offsets = self._state_view.labware.get_child_gripper_offsets(
|
|
108
|
+
labware_definition=lid_definition,
|
|
109
|
+
slot_name=None,
|
|
110
|
+
)
|
|
111
|
+
if lid_gripper_offsets is None:
|
|
112
|
+
raise ValueError(
|
|
113
|
+
"Gripper Offset values for Absorbance Reader Lid labware must not be None."
|
|
114
|
+
)
|
|
115
|
+
|
|
116
|
+
await self._labware_movement.move_labware_with_gripper(
|
|
117
|
+
labware_definition=lid_definition,
|
|
118
|
+
current_location=current_location,
|
|
119
|
+
new_location=new_location,
|
|
120
|
+
user_pick_up_offset=Point.from_xyz_attrs(
|
|
121
|
+
lid_gripper_offsets.pickUpOffset
|
|
122
|
+
),
|
|
123
|
+
user_drop_offset=Point.from_xyz_attrs(lid_gripper_offsets.dropOffset),
|
|
124
|
+
post_drop_slide_offset=None,
|
|
125
|
+
gripper_z_offset=LID_Z_CLEARANCE,
|
|
126
|
+
)
|
|
127
|
+
state_update.set_absorbance_reader_lid(
|
|
128
|
+
module_id=mod_substate.module_id,
|
|
129
|
+
is_lid_on=True,
|
|
130
|
+
)
|
|
131
|
+
|
|
132
|
+
return SuccessData(
|
|
133
|
+
public=CloseLidResult(),
|
|
134
|
+
state_update=state_update,
|
|
135
|
+
)
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
class CloseLid(BaseCommand[CloseLidParams, CloseLidResult, ErrorOccurrence]):
|
|
139
|
+
"""A command to close the lid on an Absorbance Reader."""
|
|
140
|
+
|
|
141
|
+
commandType: CloseLidCommandType = "absorbanceReader/closeLid"
|
|
142
|
+
params: CloseLidParams
|
|
143
|
+
result: Optional[CloseLidResult] = None
|
|
144
|
+
|
|
145
|
+
_ImplementationCls: Type[CloseLidImpl] = CloseLidImpl
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
class CloseLidCreate(BaseCommandCreate[CloseLidParams]):
|
|
149
|
+
"""A request to execute an Absorbance Reader close lid command."""
|
|
150
|
+
|
|
151
|
+
commandType: CloseLidCommandType = "absorbanceReader/closeLid"
|
|
152
|
+
params: CloseLidParams
|
|
153
|
+
|
|
154
|
+
_CommandCls: Type[CloseLid] = CloseLid
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"""Common absorbance reader defines."""
|
|
2
|
+
|
|
3
|
+
# This needs to be re-defined because of circular imports
|
|
4
|
+
_PLATE_READER_MAX_LABWARE_Z_MM = 16.0
|
|
5
|
+
# Distance to home the gripper when moving the plate reader lid to/from the dock.
|
|
6
|
+
LID_Z_CLEARANCE = _PLATE_READER_MAX_LABWARE_Z_MM + 40.0
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
"""Command models to initialize an Absorbance Reader."""
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
from typing import List, Optional, Literal, TYPE_CHECKING, Any
|
|
4
|
+
from typing_extensions import Type
|
|
5
|
+
|
|
6
|
+
from pydantic import BaseModel, Field
|
|
7
|
+
from pydantic.json_schema import SkipJsonSchema
|
|
8
|
+
|
|
9
|
+
from opentrons.drivers.types import ABSMeasurementMode
|
|
10
|
+
from opentrons.protocol_engine.types import ABSMeasureMode
|
|
11
|
+
|
|
12
|
+
from ..command import AbstractCommandImpl, BaseCommand, BaseCommandCreate, SuccessData
|
|
13
|
+
from ...errors.error_occurrence import ErrorOccurrence
|
|
14
|
+
from ...errors import InvalidWavelengthError
|
|
15
|
+
from ...state import update_types
|
|
16
|
+
|
|
17
|
+
if TYPE_CHECKING:
|
|
18
|
+
from opentrons.protocol_engine.state.state import StateView
|
|
19
|
+
from opentrons.protocol_engine.execution import EquipmentHandler
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
InitializeCommandType = Literal["absorbanceReader/initialize"]
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def _remove_default(s: dict[str, Any]) -> None:
|
|
26
|
+
s.pop("default", None)
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class InitializeParams(BaseModel):
|
|
30
|
+
"""Input parameters to initialize an absorbance reading."""
|
|
31
|
+
|
|
32
|
+
moduleId: str = Field(..., description="Unique ID of the absorbance reader.")
|
|
33
|
+
measureMode: ABSMeasureMode = Field(
|
|
34
|
+
..., description="Initialize single or multi measurement mode."
|
|
35
|
+
)
|
|
36
|
+
sampleWavelengths: List[int] = Field(..., description="Sample wavelengths in nm.")
|
|
37
|
+
referenceWavelength: int | SkipJsonSchema[None] = Field(
|
|
38
|
+
None,
|
|
39
|
+
description="Optional reference wavelength in nm.",
|
|
40
|
+
json_schema_extra=_remove_default,
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
class InitializeResult(BaseModel):
|
|
45
|
+
"""Result data from initializing an aborbance reading."""
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
class InitializeImpl(
|
|
49
|
+
AbstractCommandImpl[InitializeParams, SuccessData[InitializeResult]]
|
|
50
|
+
):
|
|
51
|
+
"""Execution implementation of initializing an Absorbance Reader."""
|
|
52
|
+
|
|
53
|
+
def __init__(
|
|
54
|
+
self,
|
|
55
|
+
state_view: StateView,
|
|
56
|
+
equipment: EquipmentHandler,
|
|
57
|
+
**unused_dependencies: object,
|
|
58
|
+
) -> None:
|
|
59
|
+
self._state_view = state_view
|
|
60
|
+
self._equipment = equipment
|
|
61
|
+
|
|
62
|
+
async def execute(self, params: InitializeParams) -> SuccessData[InitializeResult]:
|
|
63
|
+
"""Initiate a single absorbance measurement."""
|
|
64
|
+
state_update = update_types.StateUpdate()
|
|
65
|
+
abs_reader_substate = self._state_view.modules.get_absorbance_reader_substate(
|
|
66
|
+
module_id=params.moduleId
|
|
67
|
+
)
|
|
68
|
+
# Allow propagation of ModuleNotAttachedError.
|
|
69
|
+
abs_reader = self._equipment.get_module_hardware_api(
|
|
70
|
+
abs_reader_substate.module_id
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
if abs_reader is not None:
|
|
74
|
+
# Validate the parameters before initializing.
|
|
75
|
+
sample_wavelengths = set(params.sampleWavelengths)
|
|
76
|
+
sample_wavelengths_len = len(params.sampleWavelengths)
|
|
77
|
+
reference_wavelength = params.referenceWavelength
|
|
78
|
+
supported_wavelengths = set(abs_reader.supported_wavelengths)
|
|
79
|
+
unsupported_wavelengths = sample_wavelengths.difference(
|
|
80
|
+
supported_wavelengths
|
|
81
|
+
)
|
|
82
|
+
sample_wl_str = ", ".join([str(w) + "nm" for w in sample_wavelengths])
|
|
83
|
+
supported_wl_str = ", ".join([str(w) + "nm" for w in supported_wavelengths])
|
|
84
|
+
unsupported_wl_str = ", ".join(
|
|
85
|
+
[str(w) + "nm" for w in unsupported_wavelengths]
|
|
86
|
+
)
|
|
87
|
+
if unsupported_wavelengths:
|
|
88
|
+
raise InvalidWavelengthError(
|
|
89
|
+
f"Unsupported wavelengths: {unsupported_wl_str}. "
|
|
90
|
+
f" Use one of {supported_wl_str} instead."
|
|
91
|
+
)
|
|
92
|
+
|
|
93
|
+
if params.measureMode == "single":
|
|
94
|
+
if sample_wavelengths_len != 1:
|
|
95
|
+
raise ValueError(
|
|
96
|
+
f"Measure mode `single` requires one sample wavelength,"
|
|
97
|
+
f" {sample_wl_str} provided instead."
|
|
98
|
+
)
|
|
99
|
+
if (
|
|
100
|
+
reference_wavelength is not None
|
|
101
|
+
and reference_wavelength not in supported_wavelengths
|
|
102
|
+
):
|
|
103
|
+
raise InvalidWavelengthError(
|
|
104
|
+
f"Reference wavelength {reference_wavelength}nm is not supported."
|
|
105
|
+
f" Use one of {supported_wl_str} instead."
|
|
106
|
+
)
|
|
107
|
+
|
|
108
|
+
if params.measureMode == "multi":
|
|
109
|
+
if sample_wavelengths_len < 1 or sample_wavelengths_len > 6:
|
|
110
|
+
raise ValueError(
|
|
111
|
+
f"Measure mode `multi` requires 1-6 sample wavelengths,"
|
|
112
|
+
f" {sample_wl_str} provided instead."
|
|
113
|
+
)
|
|
114
|
+
if reference_wavelength is not None:
|
|
115
|
+
raise ValueError(
|
|
116
|
+
"Reference wavelength cannot be used with Measure mode `multi`."
|
|
117
|
+
)
|
|
118
|
+
|
|
119
|
+
await abs_reader.set_sample_wavelength(
|
|
120
|
+
ABSMeasurementMode(params.measureMode),
|
|
121
|
+
params.sampleWavelengths,
|
|
122
|
+
reference_wavelength=params.referenceWavelength,
|
|
123
|
+
)
|
|
124
|
+
|
|
125
|
+
state_update.initialize_absorbance_reader(
|
|
126
|
+
abs_reader_substate.module_id,
|
|
127
|
+
params.measureMode,
|
|
128
|
+
params.sampleWavelengths,
|
|
129
|
+
params.referenceWavelength,
|
|
130
|
+
)
|
|
131
|
+
|
|
132
|
+
return SuccessData(public=InitializeResult(), state_update=state_update)
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
class Initialize(BaseCommand[InitializeParams, InitializeResult, ErrorOccurrence]):
|
|
136
|
+
"""A command to initialize an Absorbance Reader."""
|
|
137
|
+
|
|
138
|
+
commandType: InitializeCommandType = "absorbanceReader/initialize"
|
|
139
|
+
params: InitializeParams
|
|
140
|
+
result: Optional[InitializeResult] = None
|
|
141
|
+
|
|
142
|
+
_ImplementationCls: Type[InitializeImpl] = InitializeImpl
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
class InitializeCreate(BaseCommandCreate[InitializeParams]):
|
|
146
|
+
"""A request to execute an Absorbance Reader measurement."""
|
|
147
|
+
|
|
148
|
+
commandType: InitializeCommandType = "absorbanceReader/initialize"
|
|
149
|
+
params: InitializeParams
|
|
150
|
+
|
|
151
|
+
_CommandCls: Type[Initialize] = Initialize
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
"""Command models to close the lid on an Absorbance Reader."""
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
from typing import Optional, Literal, TYPE_CHECKING
|
|
4
|
+
from typing_extensions import Type
|
|
5
|
+
|
|
6
|
+
from pydantic import BaseModel, Field
|
|
7
|
+
|
|
8
|
+
from ..command import AbstractCommandImpl, BaseCommand, BaseCommandCreate, SuccessData
|
|
9
|
+
from ...errors.error_occurrence import ErrorOccurrence
|
|
10
|
+
from ...errors import CannotPerformModuleAction
|
|
11
|
+
|
|
12
|
+
from opentrons.protocol_engine.types import AddressableAreaLocation
|
|
13
|
+
from opentrons.types import Point
|
|
14
|
+
|
|
15
|
+
from opentrons.drivers.types import AbsorbanceReaderLidStatus
|
|
16
|
+
|
|
17
|
+
from .common import LID_Z_CLEARANCE
|
|
18
|
+
|
|
19
|
+
from ...state.update_types import StateUpdate
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
if TYPE_CHECKING:
|
|
23
|
+
from opentrons.protocol_engine.state.state import StateView
|
|
24
|
+
from opentrons.protocol_engine.execution import (
|
|
25
|
+
EquipmentHandler,
|
|
26
|
+
LabwareMovementHandler,
|
|
27
|
+
)
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
OpenLidCommandType = Literal["absorbanceReader/openLid"]
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class OpenLidParams(BaseModel):
|
|
34
|
+
"""Input parameters to open the lid on an absorbance reading."""
|
|
35
|
+
|
|
36
|
+
moduleId: str = Field(..., description="Unique ID of the absorbance reader.")
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
class OpenLidResult(BaseModel):
|
|
40
|
+
"""Result data from opening the lid on an aborbance reading."""
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
class OpenLidImpl(AbstractCommandImpl[OpenLidParams, SuccessData[OpenLidResult]]):
|
|
44
|
+
"""Execution implementation of opening the lid on an Absorbance Reader."""
|
|
45
|
+
|
|
46
|
+
def __init__(
|
|
47
|
+
self,
|
|
48
|
+
state_view: StateView,
|
|
49
|
+
equipment: EquipmentHandler,
|
|
50
|
+
labware_movement: LabwareMovementHandler,
|
|
51
|
+
**unused_dependencies: object,
|
|
52
|
+
) -> None:
|
|
53
|
+
self._state_view = state_view
|
|
54
|
+
self._equipment = equipment
|
|
55
|
+
self._labware_movement = labware_movement
|
|
56
|
+
|
|
57
|
+
async def execute(self, params: OpenLidParams) -> SuccessData[OpenLidResult]:
|
|
58
|
+
"""Move the absorbance reader lid from the module to the lid dock."""
|
|
59
|
+
state_update = StateUpdate()
|
|
60
|
+
mod_substate = self._state_view.modules.get_absorbance_reader_substate(
|
|
61
|
+
module_id=params.moduleId
|
|
62
|
+
)
|
|
63
|
+
|
|
64
|
+
hardware_lid_status = AbsorbanceReaderLidStatus.ON
|
|
65
|
+
if not self._state_view.config.use_virtual_modules:
|
|
66
|
+
abs_reader = self._equipment.get_module_hardware_api(mod_substate.module_id)
|
|
67
|
+
|
|
68
|
+
if abs_reader is not None:
|
|
69
|
+
hardware_lid_status = await abs_reader.get_current_lid_status()
|
|
70
|
+
else:
|
|
71
|
+
raise CannotPerformModuleAction(
|
|
72
|
+
"Could not reach the Hardware API for Opentrons Plate Reader Module."
|
|
73
|
+
)
|
|
74
|
+
|
|
75
|
+
if hardware_lid_status is AbsorbanceReaderLidStatus.OFF:
|
|
76
|
+
# The lid is already physically OFF, so we can no-op physically closing it
|
|
77
|
+
state_update.set_absorbance_reader_lid(
|
|
78
|
+
module_id=mod_substate.module_id, is_lid_on=False
|
|
79
|
+
)
|
|
80
|
+
else:
|
|
81
|
+
# Allow propagation of ModuleNotAttachedError.
|
|
82
|
+
_ = self._equipment.get_module_hardware_api(mod_substate.module_id)
|
|
83
|
+
|
|
84
|
+
lid_definition = (
|
|
85
|
+
self._state_view.labware.get_absorbance_reader_lid_definition()
|
|
86
|
+
)
|
|
87
|
+
|
|
88
|
+
absorbance_model = self._state_view.modules.get_requested_model(
|
|
89
|
+
params.moduleId
|
|
90
|
+
)
|
|
91
|
+
assert absorbance_model is not None
|
|
92
|
+
current_location = AddressableAreaLocation(
|
|
93
|
+
addressableAreaName=self._state_view.modules.ensure_and_convert_module_fixture_location(
|
|
94
|
+
deck_slot=self._state_view.modules.get_location(
|
|
95
|
+
params.moduleId
|
|
96
|
+
).slotName,
|
|
97
|
+
model=absorbance_model,
|
|
98
|
+
)
|
|
99
|
+
)
|
|
100
|
+
|
|
101
|
+
# we need to move the lid to the lid dock
|
|
102
|
+
new_location = self._state_view.modules.absorbance_reader_dock_location(
|
|
103
|
+
mod_substate.module_id
|
|
104
|
+
)
|
|
105
|
+
|
|
106
|
+
# The lid's labware definition stores gripper offsets for itself in the
|
|
107
|
+
# space normally meant for offsets for labware stacked atop it.
|
|
108
|
+
lid_gripper_offsets = self._state_view.labware.get_child_gripper_offsets(
|
|
109
|
+
labware_definition=lid_definition,
|
|
110
|
+
slot_name=None,
|
|
111
|
+
)
|
|
112
|
+
if lid_gripper_offsets is None:
|
|
113
|
+
raise ValueError(
|
|
114
|
+
"Gripper Offset values for Absorbance Reader Lid labware must not be None."
|
|
115
|
+
)
|
|
116
|
+
|
|
117
|
+
await self._labware_movement.move_labware_with_gripper(
|
|
118
|
+
labware_definition=lid_definition,
|
|
119
|
+
current_location=current_location,
|
|
120
|
+
new_location=new_location,
|
|
121
|
+
user_pick_up_offset=Point.from_xyz_attrs(
|
|
122
|
+
lid_gripper_offsets.pickUpOffset
|
|
123
|
+
),
|
|
124
|
+
user_drop_offset=Point.from_xyz_attrs(lid_gripper_offsets.dropOffset),
|
|
125
|
+
post_drop_slide_offset=None,
|
|
126
|
+
gripper_z_offset=LID_Z_CLEARANCE,
|
|
127
|
+
)
|
|
128
|
+
state_update.set_absorbance_reader_lid(
|
|
129
|
+
module_id=mod_substate.module_id, is_lid_on=False
|
|
130
|
+
)
|
|
131
|
+
|
|
132
|
+
return SuccessData(
|
|
133
|
+
public=OpenLidResult(),
|
|
134
|
+
state_update=state_update,
|
|
135
|
+
)
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
class OpenLid(BaseCommand[OpenLidParams, OpenLidResult, ErrorOccurrence]):
|
|
139
|
+
"""A command to open the lid on an Absorbance Reader."""
|
|
140
|
+
|
|
141
|
+
commandType: OpenLidCommandType = "absorbanceReader/openLid"
|
|
142
|
+
params: OpenLidParams
|
|
143
|
+
result: Optional[OpenLidResult] = None
|
|
144
|
+
|
|
145
|
+
_ImplementationCls: Type[OpenLidImpl] = OpenLidImpl
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
class OpenLidCreate(BaseCommandCreate[OpenLidParams]):
|
|
149
|
+
"""A request to execute an Absorbance Reader open lid command."""
|
|
150
|
+
|
|
151
|
+
commandType: OpenLidCommandType = "absorbanceReader/openLid"
|
|
152
|
+
params: OpenLidParams
|
|
153
|
+
|
|
154
|
+
_CommandCls: Type[OpenLid] = OpenLid
|