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,171 @@
|
|
|
1
|
+
"""Command models to execute a Thermocycler profile."""
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
from typing import List, Optional, TYPE_CHECKING, overload, Union, Any
|
|
4
|
+
from typing_extensions import Literal, Type
|
|
5
|
+
|
|
6
|
+
from pydantic import BaseModel, Field
|
|
7
|
+
from pydantic.json_schema import SkipJsonSchema
|
|
8
|
+
|
|
9
|
+
from opentrons.hardware_control.modules.types import ThermocyclerStep, ThermocyclerCycle
|
|
10
|
+
|
|
11
|
+
from ..command import AbstractCommandImpl, BaseCommand, BaseCommandCreate, SuccessData
|
|
12
|
+
from ...errors.error_occurrence import ErrorOccurrence
|
|
13
|
+
|
|
14
|
+
if TYPE_CHECKING:
|
|
15
|
+
from opentrons.protocol_engine.state.state import StateView
|
|
16
|
+
from opentrons.protocol_engine.execution import EquipmentHandler
|
|
17
|
+
from opentrons.protocol_engine.state.module_substates.thermocycler_module_substate import (
|
|
18
|
+
ThermocyclerModuleSubState,
|
|
19
|
+
)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
RunExtendedProfileCommandType = Literal["thermocycler/runExtendedProfile"]
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def _remove_default(s: dict[str, Any]) -> None:
|
|
26
|
+
s.pop("default", None)
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class ProfileStep(BaseModel):
|
|
30
|
+
"""An individual step in a Thermocycler extended profile."""
|
|
31
|
+
|
|
32
|
+
celsius: float = Field(..., description="Target temperature in °C.")
|
|
33
|
+
holdSeconds: float = Field(
|
|
34
|
+
..., description="Time to hold target temperature in seconds."
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
class ProfileCycle(BaseModel):
|
|
39
|
+
"""An individual cycle in a Thermocycler extended profile."""
|
|
40
|
+
|
|
41
|
+
steps: List[ProfileStep] = Field(..., description="Steps to repeat.")
|
|
42
|
+
repetitions: int = Field(..., description="Number of times to repeat the steps.")
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
class RunExtendedProfileParams(BaseModel):
|
|
46
|
+
"""Input parameters for an individual Thermocycler profile step."""
|
|
47
|
+
|
|
48
|
+
moduleId: str = Field(..., description="Unique ID of the Thermocycler.")
|
|
49
|
+
profileElements: List[Union[ProfileStep, ProfileCycle]] = Field(
|
|
50
|
+
...,
|
|
51
|
+
description="Elements of the profile. Each can be either a step or a cycle.",
|
|
52
|
+
)
|
|
53
|
+
blockMaxVolumeUl: float | SkipJsonSchema[None] = Field(
|
|
54
|
+
None,
|
|
55
|
+
description="Amount of liquid in uL of the most-full well"
|
|
56
|
+
" in labware loaded onto the thermocycler.",
|
|
57
|
+
json_schema_extra=_remove_default,
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
class RunExtendedProfileResult(BaseModel):
|
|
62
|
+
"""Result data from running a Thermocycler profile."""
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def _transform_profile_step(
|
|
66
|
+
step: ProfileStep, thermocycler_state: ThermocyclerModuleSubState
|
|
67
|
+
) -> ThermocyclerStep:
|
|
68
|
+
return ThermocyclerStep(
|
|
69
|
+
temperature=thermocycler_state.validate_target_block_temperature(step.celsius),
|
|
70
|
+
hold_time_seconds=step.holdSeconds,
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
@overload
|
|
75
|
+
def _transform_profile_element(
|
|
76
|
+
element: ProfileStep, thermocycler_state: ThermocyclerModuleSubState
|
|
77
|
+
) -> ThermocyclerStep:
|
|
78
|
+
...
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
@overload
|
|
82
|
+
def _transform_profile_element(
|
|
83
|
+
element: ProfileCycle, thermocycler_state: ThermocyclerModuleSubState
|
|
84
|
+
) -> ThermocyclerCycle:
|
|
85
|
+
...
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
def _transform_profile_element(
|
|
89
|
+
element: Union[ProfileStep, ProfileCycle],
|
|
90
|
+
thermocycler_state: ThermocyclerModuleSubState,
|
|
91
|
+
) -> Union[ThermocyclerStep, ThermocyclerCycle]:
|
|
92
|
+
if isinstance(element, ProfileStep):
|
|
93
|
+
return _transform_profile_step(element, thermocycler_state)
|
|
94
|
+
else:
|
|
95
|
+
return ThermocyclerCycle(
|
|
96
|
+
steps=[
|
|
97
|
+
_transform_profile_step(step, thermocycler_state)
|
|
98
|
+
for step in element.steps
|
|
99
|
+
],
|
|
100
|
+
repetitions=element.repetitions,
|
|
101
|
+
)
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
class RunExtendedProfileImpl(
|
|
105
|
+
AbstractCommandImpl[RunExtendedProfileParams, SuccessData[RunExtendedProfileResult]]
|
|
106
|
+
):
|
|
107
|
+
"""Execution implementation of a Thermocycler's run profile command."""
|
|
108
|
+
|
|
109
|
+
def __init__(
|
|
110
|
+
self,
|
|
111
|
+
state_view: StateView,
|
|
112
|
+
equipment: EquipmentHandler,
|
|
113
|
+
**unused_dependencies: object,
|
|
114
|
+
) -> None:
|
|
115
|
+
self._state_view = state_view
|
|
116
|
+
self._equipment = equipment
|
|
117
|
+
|
|
118
|
+
async def execute(
|
|
119
|
+
self, params: RunExtendedProfileParams
|
|
120
|
+
) -> SuccessData[RunExtendedProfileResult]:
|
|
121
|
+
"""Run a Thermocycler profile."""
|
|
122
|
+
thermocycler_state = self._state_view.modules.get_thermocycler_module_substate(
|
|
123
|
+
params.moduleId
|
|
124
|
+
)
|
|
125
|
+
thermocycler_hardware = self._equipment.get_module_hardware_api(
|
|
126
|
+
thermocycler_state.module_id
|
|
127
|
+
)
|
|
128
|
+
|
|
129
|
+
profile = [
|
|
130
|
+
_transform_profile_element(element, thermocycler_state)
|
|
131
|
+
for element in params.profileElements
|
|
132
|
+
]
|
|
133
|
+
target_volume: Optional[float]
|
|
134
|
+
if params.blockMaxVolumeUl is not None:
|
|
135
|
+
target_volume = thermocycler_state.validate_max_block_volume(
|
|
136
|
+
params.blockMaxVolumeUl
|
|
137
|
+
)
|
|
138
|
+
else:
|
|
139
|
+
target_volume = None
|
|
140
|
+
|
|
141
|
+
if thermocycler_hardware is not None:
|
|
142
|
+
# TODO(jbl 2022-06-27) hardcoded constant 1 for `repetitions` should be
|
|
143
|
+
# moved from HardwareControlAPI to the Python ProtocolContext
|
|
144
|
+
await thermocycler_hardware.execute_profile(
|
|
145
|
+
profile=profile, volume=target_volume
|
|
146
|
+
)
|
|
147
|
+
|
|
148
|
+
return SuccessData(
|
|
149
|
+
public=RunExtendedProfileResult(),
|
|
150
|
+
)
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
class RunExtendedProfile(
|
|
154
|
+
BaseCommand[RunExtendedProfileParams, RunExtendedProfileResult, ErrorOccurrence]
|
|
155
|
+
):
|
|
156
|
+
"""A command to execute a Thermocycler profile run."""
|
|
157
|
+
|
|
158
|
+
commandType: RunExtendedProfileCommandType = "thermocycler/runExtendedProfile"
|
|
159
|
+
params: RunExtendedProfileParams
|
|
160
|
+
result: Optional[RunExtendedProfileResult] = None
|
|
161
|
+
|
|
162
|
+
_ImplementationCls: Type[RunExtendedProfileImpl] = RunExtendedProfileImpl
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
class RunExtendedProfileCreate(BaseCommandCreate[RunExtendedProfileParams]):
|
|
166
|
+
"""A request to execute a Thermocycler profile run."""
|
|
167
|
+
|
|
168
|
+
commandType: RunExtendedProfileCommandType = "thermocycler/runExtendedProfile"
|
|
169
|
+
params: RunExtendedProfileParams
|
|
170
|
+
|
|
171
|
+
_CommandCls: Type[RunExtendedProfile] = RunExtendedProfile
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
"""Command models to execute a Thermocycler profile."""
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
from typing import List, Optional, TYPE_CHECKING, Any
|
|
4
|
+
from typing_extensions import Literal, Type
|
|
5
|
+
|
|
6
|
+
from pydantic import BaseModel, Field
|
|
7
|
+
from pydantic.json_schema import SkipJsonSchema
|
|
8
|
+
|
|
9
|
+
from opentrons.hardware_control.modules.types import ThermocyclerStep
|
|
10
|
+
|
|
11
|
+
from ..command import AbstractCommandImpl, BaseCommand, BaseCommandCreate, SuccessData
|
|
12
|
+
from ...errors.error_occurrence import ErrorOccurrence
|
|
13
|
+
|
|
14
|
+
if TYPE_CHECKING:
|
|
15
|
+
from opentrons.protocol_engine.state.state import StateView
|
|
16
|
+
from opentrons.protocol_engine.execution import EquipmentHandler
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
RunProfileCommandType = Literal["thermocycler/runProfile"]
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def _remove_default(s: dict[str, Any]) -> None:
|
|
23
|
+
s.pop("default", None)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class RunProfileStepParams(BaseModel):
|
|
27
|
+
"""Input parameters for an individual Thermocycler profile step."""
|
|
28
|
+
|
|
29
|
+
celsius: float = Field(..., description="Target temperature in °C.")
|
|
30
|
+
holdSeconds: float = Field(
|
|
31
|
+
..., description="Time to hold target temperature at in seconds."
|
|
32
|
+
)
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
class RunProfileParams(BaseModel):
|
|
36
|
+
"""Input parameters to run a Thermocycler profile."""
|
|
37
|
+
|
|
38
|
+
moduleId: str = Field(..., description="Unique ID of the Thermocycler.")
|
|
39
|
+
profile: List[RunProfileStepParams] = Field(
|
|
40
|
+
...,
|
|
41
|
+
description="Array of profile steps with target temperature and temperature hold time.",
|
|
42
|
+
)
|
|
43
|
+
blockMaxVolumeUl: float | SkipJsonSchema[None] = Field(
|
|
44
|
+
None,
|
|
45
|
+
description="Amount of liquid in uL of the most-full well"
|
|
46
|
+
" in labware loaded onto the thermocycler.",
|
|
47
|
+
json_schema_extra=_remove_default,
|
|
48
|
+
)
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
class RunProfileResult(BaseModel):
|
|
52
|
+
"""Result data from running a Thermocycler profile."""
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
class RunProfileImpl(
|
|
56
|
+
AbstractCommandImpl[RunProfileParams, SuccessData[RunProfileResult]]
|
|
57
|
+
):
|
|
58
|
+
"""Execution implementation of a Thermocycler's run profile command."""
|
|
59
|
+
|
|
60
|
+
def __init__(
|
|
61
|
+
self,
|
|
62
|
+
state_view: StateView,
|
|
63
|
+
equipment: EquipmentHandler,
|
|
64
|
+
**unused_dependencies: object,
|
|
65
|
+
) -> None:
|
|
66
|
+
self._state_view = state_view
|
|
67
|
+
self._equipment = equipment
|
|
68
|
+
|
|
69
|
+
async def execute(self, params: RunProfileParams) -> SuccessData[RunProfileResult]:
|
|
70
|
+
"""Run a Thermocycler profile."""
|
|
71
|
+
thermocycler_state = self._state_view.modules.get_thermocycler_module_substate(
|
|
72
|
+
params.moduleId
|
|
73
|
+
)
|
|
74
|
+
thermocycler_hardware = self._equipment.get_module_hardware_api(
|
|
75
|
+
thermocycler_state.module_id
|
|
76
|
+
)
|
|
77
|
+
|
|
78
|
+
steps = [
|
|
79
|
+
ThermocyclerStep(
|
|
80
|
+
temperature=thermocycler_state.validate_target_block_temperature(
|
|
81
|
+
profile_step.celsius
|
|
82
|
+
),
|
|
83
|
+
hold_time_seconds=profile_step.holdSeconds,
|
|
84
|
+
)
|
|
85
|
+
for profile_step in params.profile
|
|
86
|
+
]
|
|
87
|
+
|
|
88
|
+
target_volume: Optional[float]
|
|
89
|
+
if params.blockMaxVolumeUl is not None:
|
|
90
|
+
target_volume = thermocycler_state.validate_max_block_volume(
|
|
91
|
+
params.blockMaxVolumeUl
|
|
92
|
+
)
|
|
93
|
+
else:
|
|
94
|
+
target_volume = None
|
|
95
|
+
|
|
96
|
+
if thermocycler_hardware is not None:
|
|
97
|
+
# TODO(jbl 2022-06-27) hardcoded constant 1 for `repetitions` should be
|
|
98
|
+
# moved from HardwareControlAPI to the Python ProtocolContext
|
|
99
|
+
await thermocycler_hardware.cycle_temperatures(
|
|
100
|
+
steps=steps, repetitions=1, volume=target_volume
|
|
101
|
+
)
|
|
102
|
+
|
|
103
|
+
return SuccessData(
|
|
104
|
+
public=RunProfileResult(),
|
|
105
|
+
)
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
class RunProfile(BaseCommand[RunProfileParams, RunProfileResult, ErrorOccurrence]):
|
|
109
|
+
"""A command to execute a Thermocycler profile run."""
|
|
110
|
+
|
|
111
|
+
commandType: RunProfileCommandType = "thermocycler/runProfile"
|
|
112
|
+
params: RunProfileParams
|
|
113
|
+
result: Optional[RunProfileResult] = None
|
|
114
|
+
|
|
115
|
+
_ImplementationCls: Type[RunProfileImpl] = RunProfileImpl
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
class RunProfileCreate(BaseCommandCreate[RunProfileParams]):
|
|
119
|
+
"""A request to execute a Thermocycler profile run."""
|
|
120
|
+
|
|
121
|
+
commandType: RunProfileCommandType = "thermocycler/runProfile"
|
|
122
|
+
params: RunProfileParams
|
|
123
|
+
|
|
124
|
+
_CommandCls: Type[RunProfile] = RunProfile
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
"""Command models to start heating a Thermocycler's block."""
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
from typing import Optional, TYPE_CHECKING, Any
|
|
4
|
+
from typing_extensions import Literal, Type
|
|
5
|
+
|
|
6
|
+
from pydantic import BaseModel, Field
|
|
7
|
+
from pydantic.json_schema import SkipJsonSchema
|
|
8
|
+
|
|
9
|
+
from ..command import AbstractCommandImpl, BaseCommand, BaseCommandCreate, SuccessData
|
|
10
|
+
from ...errors.error_occurrence import ErrorOccurrence
|
|
11
|
+
|
|
12
|
+
if TYPE_CHECKING:
|
|
13
|
+
from opentrons.protocol_engine.state.state import StateView
|
|
14
|
+
from opentrons.protocol_engine.execution import EquipmentHandler
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
SetTargetBlockTemperatureCommandType = Literal["thermocycler/setTargetBlockTemperature"]
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def _remove_default(s: dict[str, Any]) -> None:
|
|
21
|
+
s.pop("default", None)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class SetTargetBlockTemperatureParams(BaseModel):
|
|
25
|
+
"""Input parameters to set a Thermocycler's target block temperature."""
|
|
26
|
+
|
|
27
|
+
moduleId: str = Field(..., description="Unique ID of the Thermocycler Module.")
|
|
28
|
+
celsius: float = Field(..., description="Target temperature in °C.")
|
|
29
|
+
blockMaxVolumeUl: float | SkipJsonSchema[None] = Field(
|
|
30
|
+
None,
|
|
31
|
+
description="Amount of liquid in uL of the most-full well"
|
|
32
|
+
" in labware loaded onto the thermocycler.",
|
|
33
|
+
json_schema_extra=_remove_default,
|
|
34
|
+
)
|
|
35
|
+
holdTimeSeconds: float | SkipJsonSchema[None] = Field(
|
|
36
|
+
None,
|
|
37
|
+
description="Amount of time, in seconds, to hold the temperature for."
|
|
38
|
+
" If specified, a waitForBlockTemperature command will block until"
|
|
39
|
+
" the given hold time has elapsed.",
|
|
40
|
+
json_schema_extra=_remove_default,
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
class SetTargetBlockTemperatureResult(BaseModel):
|
|
45
|
+
"""Result data from setting a Thermocycler's target block temperature."""
|
|
46
|
+
|
|
47
|
+
targetBlockTemperature: float = Field(
|
|
48
|
+
...,
|
|
49
|
+
description="The target block temperature that was set after validation.",
|
|
50
|
+
)
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
class SetTargetBlockTemperatureImpl(
|
|
54
|
+
AbstractCommandImpl[
|
|
55
|
+
SetTargetBlockTemperatureParams,
|
|
56
|
+
SuccessData[SetTargetBlockTemperatureResult],
|
|
57
|
+
]
|
|
58
|
+
):
|
|
59
|
+
"""Execution implementation of a Thermocycler's set block temperature command."""
|
|
60
|
+
|
|
61
|
+
def __init__(
|
|
62
|
+
self,
|
|
63
|
+
state_view: StateView,
|
|
64
|
+
equipment: EquipmentHandler,
|
|
65
|
+
**unused_dependencies: object,
|
|
66
|
+
) -> None:
|
|
67
|
+
self._state_view = state_view
|
|
68
|
+
self._equipment = equipment
|
|
69
|
+
|
|
70
|
+
async def execute(
|
|
71
|
+
self,
|
|
72
|
+
params: SetTargetBlockTemperatureParams,
|
|
73
|
+
) -> SuccessData[SetTargetBlockTemperatureResult]:
|
|
74
|
+
"""Set a Thermocycler's target block temperature."""
|
|
75
|
+
thermocycler_state = self._state_view.modules.get_thermocycler_module_substate(
|
|
76
|
+
params.moduleId
|
|
77
|
+
)
|
|
78
|
+
target_temperature = thermocycler_state.validate_target_block_temperature(
|
|
79
|
+
params.celsius
|
|
80
|
+
)
|
|
81
|
+
target_volume: Optional[float]
|
|
82
|
+
if params.blockMaxVolumeUl is not None:
|
|
83
|
+
target_volume = thermocycler_state.validate_max_block_volume(
|
|
84
|
+
params.blockMaxVolumeUl
|
|
85
|
+
)
|
|
86
|
+
else:
|
|
87
|
+
target_volume = None
|
|
88
|
+
hold_time: Optional[float]
|
|
89
|
+
if params.holdTimeSeconds is not None:
|
|
90
|
+
hold_time = thermocycler_state.validate_hold_time(params.holdTimeSeconds)
|
|
91
|
+
else:
|
|
92
|
+
hold_time = None
|
|
93
|
+
|
|
94
|
+
thermocycler_hardware = self._equipment.get_module_hardware_api(
|
|
95
|
+
thermocycler_state.module_id
|
|
96
|
+
)
|
|
97
|
+
|
|
98
|
+
if thermocycler_hardware is not None:
|
|
99
|
+
await thermocycler_hardware.set_target_block_temperature(
|
|
100
|
+
target_temperature, volume=target_volume, hold_time_seconds=hold_time
|
|
101
|
+
)
|
|
102
|
+
|
|
103
|
+
return SuccessData(
|
|
104
|
+
public=SetTargetBlockTemperatureResult(
|
|
105
|
+
targetBlockTemperature=target_temperature
|
|
106
|
+
),
|
|
107
|
+
)
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
class SetTargetBlockTemperature(
|
|
111
|
+
BaseCommand[
|
|
112
|
+
SetTargetBlockTemperatureParams,
|
|
113
|
+
SetTargetBlockTemperatureResult,
|
|
114
|
+
ErrorOccurrence,
|
|
115
|
+
]
|
|
116
|
+
):
|
|
117
|
+
"""A command to set a Thermocycler's target block temperature."""
|
|
118
|
+
|
|
119
|
+
commandType: SetTargetBlockTemperatureCommandType = (
|
|
120
|
+
"thermocycler/setTargetBlockTemperature"
|
|
121
|
+
)
|
|
122
|
+
params: SetTargetBlockTemperatureParams
|
|
123
|
+
result: Optional[SetTargetBlockTemperatureResult] = None
|
|
124
|
+
|
|
125
|
+
_ImplementationCls: Type[
|
|
126
|
+
SetTargetBlockTemperatureImpl
|
|
127
|
+
] = SetTargetBlockTemperatureImpl
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
class SetTargetBlockTemperatureCreate(
|
|
131
|
+
BaseCommandCreate[SetTargetBlockTemperatureParams]
|
|
132
|
+
):
|
|
133
|
+
"""A request to create a Thermocycler's set block temperature command."""
|
|
134
|
+
|
|
135
|
+
commandType: SetTargetBlockTemperatureCommandType = (
|
|
136
|
+
"thermocycler/setTargetBlockTemperature"
|
|
137
|
+
)
|
|
138
|
+
params: SetTargetBlockTemperatureParams
|
|
139
|
+
|
|
140
|
+
_CommandCls: Type[SetTargetBlockTemperature] = SetTargetBlockTemperature
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
"""Command models to start heating a Thermocycler's lid."""
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
from typing import Optional, TYPE_CHECKING
|
|
4
|
+
from typing_extensions import Literal, 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
|
+
|
|
11
|
+
if TYPE_CHECKING:
|
|
12
|
+
from opentrons.protocol_engine.state.state import StateView
|
|
13
|
+
from opentrons.protocol_engine.execution import EquipmentHandler
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
SetTargetLidTemperatureCommandType = Literal["thermocycler/setTargetLidTemperature"]
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class SetTargetLidTemperatureParams(BaseModel):
|
|
20
|
+
"""Input parameters to set a Thermocycler's target lid temperature."""
|
|
21
|
+
|
|
22
|
+
moduleId: str = Field(..., description="Unique ID of the Thermocycler Module.")
|
|
23
|
+
celsius: float = Field(..., description="Target temperature in °C.")
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class SetTargetLidTemperatureResult(BaseModel):
|
|
27
|
+
"""Result data from setting a Thermocycler's target lid temperature."""
|
|
28
|
+
|
|
29
|
+
targetLidTemperature: float = Field(
|
|
30
|
+
...,
|
|
31
|
+
description="The target lid temperature that was set after validation.",
|
|
32
|
+
)
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
class SetTargetLidTemperatureImpl(
|
|
36
|
+
AbstractCommandImpl[
|
|
37
|
+
SetTargetLidTemperatureParams, SuccessData[SetTargetLidTemperatureResult]
|
|
38
|
+
]
|
|
39
|
+
):
|
|
40
|
+
"""Execution implementation of a Thermocycler's set lid temperature command."""
|
|
41
|
+
|
|
42
|
+
def __init__(
|
|
43
|
+
self,
|
|
44
|
+
state_view: StateView,
|
|
45
|
+
equipment: EquipmentHandler,
|
|
46
|
+
**unused_dependencies: object,
|
|
47
|
+
) -> None:
|
|
48
|
+
self._state_view = state_view
|
|
49
|
+
self._equipment = equipment
|
|
50
|
+
|
|
51
|
+
async def execute(
|
|
52
|
+
self,
|
|
53
|
+
params: SetTargetLidTemperatureParams,
|
|
54
|
+
) -> SuccessData[SetTargetLidTemperatureResult]:
|
|
55
|
+
"""Set a Thermocycler's target lid temperature."""
|
|
56
|
+
thermocycler_state = self._state_view.modules.get_thermocycler_module_substate(
|
|
57
|
+
params.moduleId
|
|
58
|
+
)
|
|
59
|
+
target_temperature = thermocycler_state.validate_target_lid_temperature(
|
|
60
|
+
params.celsius
|
|
61
|
+
)
|
|
62
|
+
thermocycler_hardware = self._equipment.get_module_hardware_api(
|
|
63
|
+
thermocycler_state.module_id
|
|
64
|
+
)
|
|
65
|
+
|
|
66
|
+
if thermocycler_hardware is not None:
|
|
67
|
+
await thermocycler_hardware.set_target_lid_temperature(target_temperature)
|
|
68
|
+
|
|
69
|
+
return SuccessData(
|
|
70
|
+
public=SetTargetLidTemperatureResult(
|
|
71
|
+
targetLidTemperature=target_temperature
|
|
72
|
+
),
|
|
73
|
+
)
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
class SetTargetLidTemperature(
|
|
77
|
+
BaseCommand[
|
|
78
|
+
SetTargetLidTemperatureParams, SetTargetLidTemperatureResult, ErrorOccurrence
|
|
79
|
+
]
|
|
80
|
+
):
|
|
81
|
+
"""A command to set a Thermocycler's target lid temperature."""
|
|
82
|
+
|
|
83
|
+
commandType: SetTargetLidTemperatureCommandType = (
|
|
84
|
+
"thermocycler/setTargetLidTemperature"
|
|
85
|
+
)
|
|
86
|
+
params: SetTargetLidTemperatureParams
|
|
87
|
+
result: Optional[SetTargetLidTemperatureResult] = None
|
|
88
|
+
|
|
89
|
+
_ImplementationCls: Type[SetTargetLidTemperatureImpl] = SetTargetLidTemperatureImpl
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
class SetTargetLidTemperatureCreate(BaseCommandCreate[SetTargetLidTemperatureParams]):
|
|
93
|
+
"""A request to create a Thermocycler's set lid temperature command."""
|
|
94
|
+
|
|
95
|
+
commandType: SetTargetLidTemperatureCommandType = (
|
|
96
|
+
"thermocycler/setTargetLidTemperature"
|
|
97
|
+
)
|
|
98
|
+
params: SetTargetLidTemperatureParams
|
|
99
|
+
|
|
100
|
+
_CommandCls: Type[SetTargetLidTemperature] = SetTargetLidTemperature
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
"""Command models to wait for heating a Thermocycler's block."""
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
from typing import Optional, TYPE_CHECKING
|
|
4
|
+
from typing_extensions import Literal, 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
|
+
|
|
11
|
+
if TYPE_CHECKING:
|
|
12
|
+
from opentrons.protocol_engine.state.state import StateView
|
|
13
|
+
from opentrons.protocol_engine.execution import EquipmentHandler
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
WaitForBlockTemperatureCommandType = Literal["thermocycler/waitForBlockTemperature"]
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class WaitForBlockTemperatureParams(BaseModel):
|
|
20
|
+
"""Input parameters to wait for Thermocycler's target block temperature."""
|
|
21
|
+
|
|
22
|
+
moduleId: str = Field(..., description="Unique ID of the Thermocycler Module.")
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class WaitForBlockTemperatureResult(BaseModel):
|
|
26
|
+
"""Result data from wait for Thermocycler's target block temperature."""
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class WaitForBlockTemperatureImpl(
|
|
30
|
+
AbstractCommandImpl[
|
|
31
|
+
WaitForBlockTemperatureParams, SuccessData[WaitForBlockTemperatureResult]
|
|
32
|
+
]
|
|
33
|
+
):
|
|
34
|
+
"""Execution implementation of Thermocycler's wait for block temperature command."""
|
|
35
|
+
|
|
36
|
+
def __init__(
|
|
37
|
+
self,
|
|
38
|
+
state_view: StateView,
|
|
39
|
+
equipment: EquipmentHandler,
|
|
40
|
+
**unused_dependencies: object,
|
|
41
|
+
) -> None:
|
|
42
|
+
self._state_view = state_view
|
|
43
|
+
self._equipment = equipment
|
|
44
|
+
|
|
45
|
+
async def execute(
|
|
46
|
+
self,
|
|
47
|
+
params: WaitForBlockTemperatureParams,
|
|
48
|
+
) -> SuccessData[WaitForBlockTemperatureResult]:
|
|
49
|
+
"""Wait for a Thermocycler's target block temperature."""
|
|
50
|
+
thermocycler_state = self._state_view.modules.get_thermocycler_module_substate(
|
|
51
|
+
params.moduleId
|
|
52
|
+
)
|
|
53
|
+
|
|
54
|
+
# Raises error if no target temperature
|
|
55
|
+
thermocycler_state.get_target_block_temperature()
|
|
56
|
+
|
|
57
|
+
thermocycler_hardware = self._equipment.get_module_hardware_api(
|
|
58
|
+
thermocycler_state.module_id
|
|
59
|
+
)
|
|
60
|
+
|
|
61
|
+
if thermocycler_hardware is not None:
|
|
62
|
+
await thermocycler_hardware.wait_for_block_target()
|
|
63
|
+
|
|
64
|
+
return SuccessData(
|
|
65
|
+
public=WaitForBlockTemperatureResult(),
|
|
66
|
+
)
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
class WaitForBlockTemperature(
|
|
70
|
+
BaseCommand[
|
|
71
|
+
WaitForBlockTemperatureParams, WaitForBlockTemperatureResult, ErrorOccurrence
|
|
72
|
+
]
|
|
73
|
+
):
|
|
74
|
+
"""A command to wait for a Thermocycler's target block temperature."""
|
|
75
|
+
|
|
76
|
+
commandType: WaitForBlockTemperatureCommandType = (
|
|
77
|
+
"thermocycler/waitForBlockTemperature"
|
|
78
|
+
)
|
|
79
|
+
params: WaitForBlockTemperatureParams
|
|
80
|
+
result: Optional[WaitForBlockTemperatureResult] = None
|
|
81
|
+
|
|
82
|
+
_ImplementationCls: Type[WaitForBlockTemperatureImpl] = WaitForBlockTemperatureImpl
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
class WaitForBlockTemperatureCreate(BaseCommandCreate[WaitForBlockTemperatureParams]):
|
|
86
|
+
"""A request to create Thermocycler's wait for block temperature command."""
|
|
87
|
+
|
|
88
|
+
commandType: WaitForBlockTemperatureCommandType = (
|
|
89
|
+
"thermocycler/waitForBlockTemperature"
|
|
90
|
+
)
|
|
91
|
+
params: WaitForBlockTemperatureParams
|
|
92
|
+
|
|
93
|
+
_CommandCls: Type[WaitForBlockTemperature] = WaitForBlockTemperature
|