opentrons 8.6.0a1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of opentrons might be problematic. Click here for more details.
- opentrons/__init__.py +150 -0
- opentrons/_version.py +34 -0
- opentrons/calibration_storage/__init__.py +54 -0
- opentrons/calibration_storage/deck_configuration.py +62 -0
- opentrons/calibration_storage/encoder_decoder.py +31 -0
- opentrons/calibration_storage/file_operators.py +142 -0
- opentrons/calibration_storage/helpers.py +103 -0
- opentrons/calibration_storage/ot2/__init__.py +34 -0
- opentrons/calibration_storage/ot2/deck_attitude.py +85 -0
- opentrons/calibration_storage/ot2/mark_bad_calibration.py +27 -0
- opentrons/calibration_storage/ot2/models/__init__.py +0 -0
- opentrons/calibration_storage/ot2/models/v1.py +149 -0
- opentrons/calibration_storage/ot2/pipette_offset.py +129 -0
- opentrons/calibration_storage/ot2/tip_length.py +281 -0
- opentrons/calibration_storage/ot3/__init__.py +31 -0
- opentrons/calibration_storage/ot3/deck_attitude.py +83 -0
- opentrons/calibration_storage/ot3/gripper_offset.py +156 -0
- opentrons/calibration_storage/ot3/models/__init__.py +0 -0
- opentrons/calibration_storage/ot3/models/v1.py +122 -0
- opentrons/calibration_storage/ot3/module_offset.py +138 -0
- opentrons/calibration_storage/ot3/pipette_offset.py +95 -0
- opentrons/calibration_storage/types.py +45 -0
- opentrons/cli/__init__.py +21 -0
- opentrons/cli/__main__.py +5 -0
- opentrons/cli/analyze.py +501 -0
- opentrons/config/__init__.py +631 -0
- opentrons/config/advanced_settings.py +871 -0
- opentrons/config/defaults_ot2.py +214 -0
- opentrons/config/defaults_ot3.py +499 -0
- opentrons/config/feature_flags.py +86 -0
- opentrons/config/gripper_config.py +55 -0
- opentrons/config/reset.py +203 -0
- opentrons/config/robot_configs.py +187 -0
- opentrons/config/types.py +183 -0
- opentrons/drivers/__init__.py +0 -0
- opentrons/drivers/absorbance_reader/__init__.py +11 -0
- opentrons/drivers/absorbance_reader/abstract.py +72 -0
- opentrons/drivers/absorbance_reader/async_byonoy.py +352 -0
- opentrons/drivers/absorbance_reader/driver.py +81 -0
- opentrons/drivers/absorbance_reader/hid_protocol.py +161 -0
- opentrons/drivers/absorbance_reader/simulator.py +84 -0
- opentrons/drivers/asyncio/__init__.py +0 -0
- opentrons/drivers/asyncio/communication/__init__.py +22 -0
- opentrons/drivers/asyncio/communication/async_serial.py +183 -0
- opentrons/drivers/asyncio/communication/errors.py +88 -0
- opentrons/drivers/asyncio/communication/serial_connection.py +552 -0
- opentrons/drivers/command_builder.py +102 -0
- opentrons/drivers/flex_stacker/__init__.py +13 -0
- opentrons/drivers/flex_stacker/abstract.py +214 -0
- opentrons/drivers/flex_stacker/driver.py +768 -0
- opentrons/drivers/flex_stacker/errors.py +68 -0
- opentrons/drivers/flex_stacker/simulator.py +309 -0
- opentrons/drivers/flex_stacker/types.py +367 -0
- opentrons/drivers/flex_stacker/utils.py +19 -0
- opentrons/drivers/heater_shaker/__init__.py +5 -0
- opentrons/drivers/heater_shaker/abstract.py +76 -0
- opentrons/drivers/heater_shaker/driver.py +204 -0
- opentrons/drivers/heater_shaker/simulator.py +94 -0
- opentrons/drivers/mag_deck/__init__.py +6 -0
- opentrons/drivers/mag_deck/abstract.py +44 -0
- opentrons/drivers/mag_deck/driver.py +208 -0
- opentrons/drivers/mag_deck/simulator.py +63 -0
- opentrons/drivers/rpi_drivers/__init__.py +33 -0
- opentrons/drivers/rpi_drivers/dev_types.py +94 -0
- opentrons/drivers/rpi_drivers/gpio.py +282 -0
- opentrons/drivers/rpi_drivers/gpio_simulator.py +127 -0
- opentrons/drivers/rpi_drivers/interfaces.py +15 -0
- opentrons/drivers/rpi_drivers/types.py +364 -0
- opentrons/drivers/rpi_drivers/usb.py +102 -0
- opentrons/drivers/rpi_drivers/usb_simulator.py +22 -0
- opentrons/drivers/serial_communication.py +151 -0
- opentrons/drivers/smoothie_drivers/__init__.py +4 -0
- opentrons/drivers/smoothie_drivers/connection.py +51 -0
- opentrons/drivers/smoothie_drivers/constants.py +121 -0
- opentrons/drivers/smoothie_drivers/driver_3_0.py +1933 -0
- opentrons/drivers/smoothie_drivers/errors.py +49 -0
- opentrons/drivers/smoothie_drivers/parse_utils.py +143 -0
- opentrons/drivers/smoothie_drivers/simulator.py +99 -0
- opentrons/drivers/smoothie_drivers/types.py +16 -0
- opentrons/drivers/temp_deck/__init__.py +10 -0
- opentrons/drivers/temp_deck/abstract.py +54 -0
- opentrons/drivers/temp_deck/driver.py +197 -0
- opentrons/drivers/temp_deck/simulator.py +57 -0
- opentrons/drivers/thermocycler/__init__.py +12 -0
- opentrons/drivers/thermocycler/abstract.py +99 -0
- opentrons/drivers/thermocycler/driver.py +395 -0
- opentrons/drivers/thermocycler/simulator.py +126 -0
- opentrons/drivers/types.py +107 -0
- opentrons/drivers/utils.py +222 -0
- opentrons/execute.py +742 -0
- opentrons/hardware_control/__init__.py +65 -0
- opentrons/hardware_control/__main__.py +77 -0
- opentrons/hardware_control/adapters.py +98 -0
- opentrons/hardware_control/api.py +1347 -0
- opentrons/hardware_control/backends/__init__.py +7 -0
- opentrons/hardware_control/backends/controller.py +400 -0
- opentrons/hardware_control/backends/errors.py +9 -0
- opentrons/hardware_control/backends/estop_state.py +164 -0
- opentrons/hardware_control/backends/flex_protocol.py +497 -0
- opentrons/hardware_control/backends/ot3controller.py +1930 -0
- opentrons/hardware_control/backends/ot3simulator.py +900 -0
- opentrons/hardware_control/backends/ot3utils.py +664 -0
- opentrons/hardware_control/backends/simulator.py +442 -0
- opentrons/hardware_control/backends/status_bar_state.py +240 -0
- opentrons/hardware_control/backends/subsystem_manager.py +431 -0
- opentrons/hardware_control/backends/tip_presence_manager.py +173 -0
- opentrons/hardware_control/backends/types.py +14 -0
- opentrons/hardware_control/constants.py +6 -0
- opentrons/hardware_control/dev_types.py +125 -0
- opentrons/hardware_control/emulation/__init__.py +0 -0
- opentrons/hardware_control/emulation/abstract_emulator.py +21 -0
- opentrons/hardware_control/emulation/app.py +56 -0
- opentrons/hardware_control/emulation/connection_handler.py +38 -0
- opentrons/hardware_control/emulation/heater_shaker.py +150 -0
- opentrons/hardware_control/emulation/magdeck.py +60 -0
- opentrons/hardware_control/emulation/module_server/__init__.py +8 -0
- opentrons/hardware_control/emulation/module_server/client.py +78 -0
- opentrons/hardware_control/emulation/module_server/helpers.py +130 -0
- opentrons/hardware_control/emulation/module_server/models.py +31 -0
- opentrons/hardware_control/emulation/module_server/server.py +110 -0
- opentrons/hardware_control/emulation/parser.py +74 -0
- opentrons/hardware_control/emulation/proxy.py +241 -0
- opentrons/hardware_control/emulation/run_emulator.py +68 -0
- opentrons/hardware_control/emulation/scripts/__init__.py +0 -0
- opentrons/hardware_control/emulation/scripts/run_app.py +54 -0
- opentrons/hardware_control/emulation/scripts/run_module_emulator.py +72 -0
- opentrons/hardware_control/emulation/scripts/run_smoothie.py +37 -0
- opentrons/hardware_control/emulation/settings.py +119 -0
- opentrons/hardware_control/emulation/simulations.py +133 -0
- opentrons/hardware_control/emulation/smoothie.py +192 -0
- opentrons/hardware_control/emulation/tempdeck.py +69 -0
- opentrons/hardware_control/emulation/thermocycler.py +128 -0
- opentrons/hardware_control/emulation/types.py +10 -0
- opentrons/hardware_control/emulation/util.py +38 -0
- opentrons/hardware_control/errors.py +43 -0
- opentrons/hardware_control/execution_manager.py +164 -0
- opentrons/hardware_control/instruments/__init__.py +5 -0
- opentrons/hardware_control/instruments/instrument_abc.py +39 -0
- opentrons/hardware_control/instruments/ot2/__init__.py +0 -0
- opentrons/hardware_control/instruments/ot2/instrument_calibration.py +152 -0
- opentrons/hardware_control/instruments/ot2/pipette.py +777 -0
- opentrons/hardware_control/instruments/ot2/pipette_handler.py +995 -0
- opentrons/hardware_control/instruments/ot3/__init__.py +0 -0
- opentrons/hardware_control/instruments/ot3/gripper.py +420 -0
- opentrons/hardware_control/instruments/ot3/gripper_handler.py +173 -0
- opentrons/hardware_control/instruments/ot3/instrument_calibration.py +214 -0
- opentrons/hardware_control/instruments/ot3/pipette.py +858 -0
- opentrons/hardware_control/instruments/ot3/pipette_handler.py +1030 -0
- opentrons/hardware_control/module_control.py +332 -0
- opentrons/hardware_control/modules/__init__.py +69 -0
- opentrons/hardware_control/modules/absorbance_reader.py +373 -0
- opentrons/hardware_control/modules/errors.py +7 -0
- opentrons/hardware_control/modules/flex_stacker.py +948 -0
- opentrons/hardware_control/modules/heater_shaker.py +426 -0
- opentrons/hardware_control/modules/lid_temp_status.py +35 -0
- opentrons/hardware_control/modules/magdeck.py +233 -0
- opentrons/hardware_control/modules/mod_abc.py +245 -0
- opentrons/hardware_control/modules/module_calibration.py +93 -0
- opentrons/hardware_control/modules/plate_temp_status.py +61 -0
- opentrons/hardware_control/modules/tempdeck.py +299 -0
- opentrons/hardware_control/modules/thermocycler.py +731 -0
- opentrons/hardware_control/modules/types.py +417 -0
- opentrons/hardware_control/modules/update.py +255 -0
- opentrons/hardware_control/modules/utils.py +73 -0
- opentrons/hardware_control/motion_utilities.py +318 -0
- opentrons/hardware_control/nozzle_manager.py +422 -0
- opentrons/hardware_control/ot3_calibration.py +1171 -0
- opentrons/hardware_control/ot3api.py +3227 -0
- opentrons/hardware_control/pause_manager.py +31 -0
- opentrons/hardware_control/poller.py +112 -0
- opentrons/hardware_control/protocols/__init__.py +106 -0
- opentrons/hardware_control/protocols/asyncio_configurable.py +11 -0
- opentrons/hardware_control/protocols/calibratable.py +45 -0
- opentrons/hardware_control/protocols/chassis_accessory_manager.py +90 -0
- opentrons/hardware_control/protocols/configurable.py +48 -0
- opentrons/hardware_control/protocols/event_sourcer.py +18 -0
- opentrons/hardware_control/protocols/execution_controllable.py +33 -0
- opentrons/hardware_control/protocols/flex_calibratable.py +96 -0
- opentrons/hardware_control/protocols/flex_instrument_configurer.py +52 -0
- opentrons/hardware_control/protocols/gripper_controller.py +55 -0
- opentrons/hardware_control/protocols/hardware_manager.py +51 -0
- opentrons/hardware_control/protocols/identifiable.py +16 -0
- opentrons/hardware_control/protocols/instrument_configurer.py +206 -0
- opentrons/hardware_control/protocols/liquid_handler.py +266 -0
- opentrons/hardware_control/protocols/module_provider.py +16 -0
- opentrons/hardware_control/protocols/motion_controller.py +243 -0
- opentrons/hardware_control/protocols/position_estimator.py +45 -0
- opentrons/hardware_control/protocols/simulatable.py +10 -0
- opentrons/hardware_control/protocols/stoppable.py +9 -0
- opentrons/hardware_control/protocols/types.py +27 -0
- opentrons/hardware_control/robot_calibration.py +224 -0
- opentrons/hardware_control/scripts/README.md +28 -0
- opentrons/hardware_control/scripts/__init__.py +1 -0
- opentrons/hardware_control/scripts/gripper_control.py +208 -0
- opentrons/hardware_control/scripts/ot3gripper +7 -0
- opentrons/hardware_control/scripts/ot3repl +7 -0
- opentrons/hardware_control/scripts/repl.py +187 -0
- opentrons/hardware_control/scripts/tc_control.py +97 -0
- opentrons/hardware_control/simulator_setup.py +260 -0
- opentrons/hardware_control/thread_manager.py +431 -0
- opentrons/hardware_control/threaded_async_lock.py +97 -0
- opentrons/hardware_control/types.py +792 -0
- opentrons/hardware_control/util.py +234 -0
- opentrons/legacy_broker.py +53 -0
- opentrons/legacy_commands/__init__.py +1 -0
- opentrons/legacy_commands/commands.py +483 -0
- opentrons/legacy_commands/helpers.py +153 -0
- opentrons/legacy_commands/module_commands.py +215 -0
- opentrons/legacy_commands/protocol_commands.py +54 -0
- opentrons/legacy_commands/publisher.py +155 -0
- opentrons/legacy_commands/robot_commands.py +51 -0
- opentrons/legacy_commands/types.py +1115 -0
- opentrons/motion_planning/__init__.py +32 -0
- opentrons/motion_planning/adjacent_slots_getters.py +168 -0
- opentrons/motion_planning/deck_conflict.py +396 -0
- opentrons/motion_planning/errors.py +35 -0
- opentrons/motion_planning/types.py +42 -0
- opentrons/motion_planning/waypoints.py +218 -0
- opentrons/ordered_set.py +138 -0
- opentrons/protocol_api/__init__.py +105 -0
- opentrons/protocol_api/_liquid.py +157 -0
- opentrons/protocol_api/_liquid_properties.py +814 -0
- opentrons/protocol_api/_nozzle_layout.py +31 -0
- opentrons/protocol_api/_parameter_context.py +300 -0
- opentrons/protocol_api/_parameters.py +31 -0
- opentrons/protocol_api/_transfer_liquid_validation.py +108 -0
- opentrons/protocol_api/_types.py +43 -0
- opentrons/protocol_api/config.py +23 -0
- opentrons/protocol_api/core/__init__.py +23 -0
- opentrons/protocol_api/core/common.py +33 -0
- opentrons/protocol_api/core/core_map.py +74 -0
- opentrons/protocol_api/core/engine/__init__.py +22 -0
- opentrons/protocol_api/core/engine/_default_labware_versions.py +179 -0
- opentrons/protocol_api/core/engine/deck_conflict.py +348 -0
- opentrons/protocol_api/core/engine/exceptions.py +19 -0
- opentrons/protocol_api/core/engine/instrument.py +2391 -0
- opentrons/protocol_api/core/engine/labware.py +238 -0
- opentrons/protocol_api/core/engine/load_labware_params.py +73 -0
- opentrons/protocol_api/core/engine/module_core.py +1025 -0
- opentrons/protocol_api/core/engine/overlap_versions.py +20 -0
- opentrons/protocol_api/core/engine/pipette_movement_conflict.py +358 -0
- opentrons/protocol_api/core/engine/point_calculations.py +64 -0
- opentrons/protocol_api/core/engine/protocol.py +1153 -0
- opentrons/protocol_api/core/engine/robot.py +139 -0
- opentrons/protocol_api/core/engine/stringify.py +74 -0
- opentrons/protocol_api/core/engine/transfer_components_executor.py +990 -0
- opentrons/protocol_api/core/engine/well.py +241 -0
- opentrons/protocol_api/core/instrument.py +459 -0
- opentrons/protocol_api/core/labware.py +151 -0
- opentrons/protocol_api/core/legacy/__init__.py +11 -0
- opentrons/protocol_api/core/legacy/_labware_geometry.py +37 -0
- opentrons/protocol_api/core/legacy/deck.py +369 -0
- opentrons/protocol_api/core/legacy/labware_offset_provider.py +108 -0
- opentrons/protocol_api/core/legacy/legacy_instrument_core.py +709 -0
- opentrons/protocol_api/core/legacy/legacy_labware_core.py +235 -0
- opentrons/protocol_api/core/legacy/legacy_module_core.py +592 -0
- opentrons/protocol_api/core/legacy/legacy_protocol_core.py +612 -0
- opentrons/protocol_api/core/legacy/legacy_well_core.py +162 -0
- opentrons/protocol_api/core/legacy/load_info.py +67 -0
- opentrons/protocol_api/core/legacy/module_geometry.py +547 -0
- opentrons/protocol_api/core/legacy/well_geometry.py +148 -0
- opentrons/protocol_api/core/legacy_simulator/__init__.py +16 -0
- opentrons/protocol_api/core/legacy_simulator/legacy_instrument_core.py +624 -0
- opentrons/protocol_api/core/legacy_simulator/legacy_protocol_core.py +85 -0
- opentrons/protocol_api/core/module.py +484 -0
- opentrons/protocol_api/core/protocol.py +311 -0
- opentrons/protocol_api/core/robot.py +51 -0
- opentrons/protocol_api/core/well.py +116 -0
- opentrons/protocol_api/core/well_grid.py +45 -0
- opentrons/protocol_api/create_protocol_context.py +177 -0
- opentrons/protocol_api/deck.py +223 -0
- opentrons/protocol_api/disposal_locations.py +244 -0
- opentrons/protocol_api/instrument_context.py +3212 -0
- opentrons/protocol_api/labware.py +1579 -0
- opentrons/protocol_api/module_contexts.py +1425 -0
- opentrons/protocol_api/module_validation_and_errors.py +61 -0
- opentrons/protocol_api/protocol_context.py +1688 -0
- opentrons/protocol_api/robot_context.py +303 -0
- opentrons/protocol_api/validation.py +761 -0
- opentrons/protocol_engine/__init__.py +155 -0
- opentrons/protocol_engine/actions/__init__.py +65 -0
- opentrons/protocol_engine/actions/action_dispatcher.py +30 -0
- opentrons/protocol_engine/actions/action_handler.py +13 -0
- opentrons/protocol_engine/actions/actions.py +302 -0
- opentrons/protocol_engine/actions/get_state_update.py +38 -0
- opentrons/protocol_engine/clients/__init__.py +5 -0
- opentrons/protocol_engine/clients/sync_client.py +174 -0
- opentrons/protocol_engine/clients/transports.py +197 -0
- opentrons/protocol_engine/commands/__init__.py +757 -0
- opentrons/protocol_engine/commands/absorbance_reader/__init__.py +61 -0
- opentrons/protocol_engine/commands/absorbance_reader/close_lid.py +154 -0
- opentrons/protocol_engine/commands/absorbance_reader/common.py +6 -0
- opentrons/protocol_engine/commands/absorbance_reader/initialize.py +151 -0
- opentrons/protocol_engine/commands/absorbance_reader/open_lid.py +154 -0
- opentrons/protocol_engine/commands/absorbance_reader/read.py +226 -0
- opentrons/protocol_engine/commands/air_gap_in_place.py +162 -0
- opentrons/protocol_engine/commands/aspirate.py +244 -0
- opentrons/protocol_engine/commands/aspirate_in_place.py +184 -0
- opentrons/protocol_engine/commands/aspirate_while_tracking.py +211 -0
- opentrons/protocol_engine/commands/blow_out.py +146 -0
- opentrons/protocol_engine/commands/blow_out_in_place.py +119 -0
- opentrons/protocol_engine/commands/calibration/__init__.py +60 -0
- opentrons/protocol_engine/commands/calibration/calibrate_gripper.py +166 -0
- opentrons/protocol_engine/commands/calibration/calibrate_module.py +117 -0
- opentrons/protocol_engine/commands/calibration/calibrate_pipette.py +96 -0
- opentrons/protocol_engine/commands/calibration/move_to_maintenance_position.py +156 -0
- opentrons/protocol_engine/commands/command.py +308 -0
- opentrons/protocol_engine/commands/command_unions.py +974 -0
- opentrons/protocol_engine/commands/comment.py +57 -0
- opentrons/protocol_engine/commands/configure_for_volume.py +108 -0
- opentrons/protocol_engine/commands/configure_nozzle_layout.py +115 -0
- opentrons/protocol_engine/commands/custom.py +67 -0
- opentrons/protocol_engine/commands/dispense.py +194 -0
- opentrons/protocol_engine/commands/dispense_in_place.py +179 -0
- opentrons/protocol_engine/commands/dispense_while_tracking.py +204 -0
- opentrons/protocol_engine/commands/drop_tip.py +232 -0
- opentrons/protocol_engine/commands/drop_tip_in_place.py +205 -0
- opentrons/protocol_engine/commands/flex_stacker/__init__.py +64 -0
- opentrons/protocol_engine/commands/flex_stacker/common.py +900 -0
- opentrons/protocol_engine/commands/flex_stacker/empty.py +293 -0
- opentrons/protocol_engine/commands/flex_stacker/fill.py +281 -0
- opentrons/protocol_engine/commands/flex_stacker/retrieve.py +339 -0
- opentrons/protocol_engine/commands/flex_stacker/set_stored_labware.py +328 -0
- opentrons/protocol_engine/commands/flex_stacker/store.py +326 -0
- opentrons/protocol_engine/commands/generate_command_schema.py +61 -0
- opentrons/protocol_engine/commands/get_next_tip.py +134 -0
- opentrons/protocol_engine/commands/get_tip_presence.py +87 -0
- opentrons/protocol_engine/commands/hash_command_params.py +38 -0
- opentrons/protocol_engine/commands/heater_shaker/__init__.py +102 -0
- opentrons/protocol_engine/commands/heater_shaker/close_labware_latch.py +83 -0
- opentrons/protocol_engine/commands/heater_shaker/deactivate_heater.py +82 -0
- opentrons/protocol_engine/commands/heater_shaker/deactivate_shaker.py +84 -0
- opentrons/protocol_engine/commands/heater_shaker/open_labware_latch.py +110 -0
- opentrons/protocol_engine/commands/heater_shaker/set_and_wait_for_shake_speed.py +125 -0
- opentrons/protocol_engine/commands/heater_shaker/set_target_temperature.py +90 -0
- opentrons/protocol_engine/commands/heater_shaker/wait_for_temperature.py +102 -0
- opentrons/protocol_engine/commands/home.py +100 -0
- opentrons/protocol_engine/commands/identify_module.py +86 -0
- opentrons/protocol_engine/commands/labware_handling_common.py +29 -0
- opentrons/protocol_engine/commands/liquid_probe.py +464 -0
- opentrons/protocol_engine/commands/load_labware.py +210 -0
- opentrons/protocol_engine/commands/load_lid.py +154 -0
- opentrons/protocol_engine/commands/load_lid_stack.py +272 -0
- opentrons/protocol_engine/commands/load_liquid.py +95 -0
- opentrons/protocol_engine/commands/load_liquid_class.py +144 -0
- opentrons/protocol_engine/commands/load_module.py +223 -0
- opentrons/protocol_engine/commands/load_pipette.py +167 -0
- opentrons/protocol_engine/commands/magnetic_module/__init__.py +32 -0
- opentrons/protocol_engine/commands/magnetic_module/disengage.py +97 -0
- opentrons/protocol_engine/commands/magnetic_module/engage.py +119 -0
- opentrons/protocol_engine/commands/move_labware.py +546 -0
- opentrons/protocol_engine/commands/move_relative.py +102 -0
- opentrons/protocol_engine/commands/move_to_addressable_area.py +176 -0
- opentrons/protocol_engine/commands/move_to_addressable_area_for_drop_tip.py +198 -0
- opentrons/protocol_engine/commands/move_to_coordinates.py +107 -0
- opentrons/protocol_engine/commands/move_to_well.py +119 -0
- opentrons/protocol_engine/commands/movement_common.py +338 -0
- opentrons/protocol_engine/commands/pick_up_tip.py +241 -0
- opentrons/protocol_engine/commands/pipetting_common.py +443 -0
- opentrons/protocol_engine/commands/prepare_to_aspirate.py +121 -0
- opentrons/protocol_engine/commands/pressure_dispense.py +155 -0
- opentrons/protocol_engine/commands/reload_labware.py +90 -0
- opentrons/protocol_engine/commands/retract_axis.py +75 -0
- opentrons/protocol_engine/commands/robot/__init__.py +70 -0
- opentrons/protocol_engine/commands/robot/close_gripper_jaw.py +96 -0
- opentrons/protocol_engine/commands/robot/common.py +18 -0
- opentrons/protocol_engine/commands/robot/move_axes_relative.py +101 -0
- opentrons/protocol_engine/commands/robot/move_axes_to.py +100 -0
- opentrons/protocol_engine/commands/robot/move_to.py +94 -0
- opentrons/protocol_engine/commands/robot/open_gripper_jaw.py +86 -0
- opentrons/protocol_engine/commands/save_position.py +109 -0
- opentrons/protocol_engine/commands/seal_pipette_to_tip.py +353 -0
- opentrons/protocol_engine/commands/set_rail_lights.py +67 -0
- opentrons/protocol_engine/commands/set_status_bar.py +89 -0
- opentrons/protocol_engine/commands/temperature_module/__init__.py +46 -0
- opentrons/protocol_engine/commands/temperature_module/deactivate.py +86 -0
- opentrons/protocol_engine/commands/temperature_module/set_target_temperature.py +97 -0
- opentrons/protocol_engine/commands/temperature_module/wait_for_temperature.py +104 -0
- opentrons/protocol_engine/commands/thermocycler/__init__.py +152 -0
- opentrons/protocol_engine/commands/thermocycler/close_lid.py +87 -0
- opentrons/protocol_engine/commands/thermocycler/deactivate_block.py +80 -0
- opentrons/protocol_engine/commands/thermocycler/deactivate_lid.py +80 -0
- opentrons/protocol_engine/commands/thermocycler/open_lid.py +87 -0
- opentrons/protocol_engine/commands/thermocycler/run_extended_profile.py +171 -0
- opentrons/protocol_engine/commands/thermocycler/run_profile.py +124 -0
- opentrons/protocol_engine/commands/thermocycler/set_target_block_temperature.py +140 -0
- opentrons/protocol_engine/commands/thermocycler/set_target_lid_temperature.py +100 -0
- opentrons/protocol_engine/commands/thermocycler/wait_for_block_temperature.py +93 -0
- opentrons/protocol_engine/commands/thermocycler/wait_for_lid_temperature.py +89 -0
- opentrons/protocol_engine/commands/touch_tip.py +189 -0
- opentrons/protocol_engine/commands/unsafe/__init__.py +161 -0
- opentrons/protocol_engine/commands/unsafe/unsafe_blow_out_in_place.py +100 -0
- opentrons/protocol_engine/commands/unsafe/unsafe_drop_tip_in_place.py +121 -0
- opentrons/protocol_engine/commands/unsafe/unsafe_engage_axes.py +82 -0
- opentrons/protocol_engine/commands/unsafe/unsafe_place_labware.py +208 -0
- opentrons/protocol_engine/commands/unsafe/unsafe_stacker_close_latch.py +94 -0
- opentrons/protocol_engine/commands/unsafe/unsafe_stacker_manual_retrieve.py +295 -0
- opentrons/protocol_engine/commands/unsafe/unsafe_stacker_open_latch.py +91 -0
- opentrons/protocol_engine/commands/unsafe/unsafe_stacker_prepare_shuttle.py +136 -0
- opentrons/protocol_engine/commands/unsafe/unsafe_ungrip_labware.py +77 -0
- opentrons/protocol_engine/commands/unsafe/update_position_estimators.py +90 -0
- opentrons/protocol_engine/commands/unseal_pipette_from_tip.py +153 -0
- opentrons/protocol_engine/commands/verify_tip_presence.py +100 -0
- opentrons/protocol_engine/commands/wait_for_duration.py +76 -0
- opentrons/protocol_engine/commands/wait_for_resume.py +75 -0
- opentrons/protocol_engine/create_protocol_engine.py +193 -0
- opentrons/protocol_engine/engine_support.py +28 -0
- opentrons/protocol_engine/error_recovery_policy.py +81 -0
- opentrons/protocol_engine/errors/__init__.py +191 -0
- opentrons/protocol_engine/errors/error_occurrence.py +182 -0
- opentrons/protocol_engine/errors/exceptions.py +1308 -0
- opentrons/protocol_engine/execution/__init__.py +50 -0
- opentrons/protocol_engine/execution/command_executor.py +216 -0
- opentrons/protocol_engine/execution/create_queue_worker.py +102 -0
- opentrons/protocol_engine/execution/door_watcher.py +119 -0
- opentrons/protocol_engine/execution/equipment.py +819 -0
- opentrons/protocol_engine/execution/error_recovery_hardware_state_synchronizer.py +101 -0
- opentrons/protocol_engine/execution/gantry_mover.py +686 -0
- opentrons/protocol_engine/execution/hardware_stopper.py +147 -0
- opentrons/protocol_engine/execution/heater_shaker_movement_flagger.py +207 -0
- opentrons/protocol_engine/execution/labware_movement.py +297 -0
- opentrons/protocol_engine/execution/movement.py +349 -0
- opentrons/protocol_engine/execution/pipetting.py +607 -0
- opentrons/protocol_engine/execution/queue_worker.py +86 -0
- opentrons/protocol_engine/execution/rail_lights.py +25 -0
- opentrons/protocol_engine/execution/run_control.py +33 -0
- opentrons/protocol_engine/execution/status_bar.py +34 -0
- opentrons/protocol_engine/execution/thermocycler_movement_flagger.py +188 -0
- opentrons/protocol_engine/execution/thermocycler_plate_lifter.py +81 -0
- opentrons/protocol_engine/execution/tip_handler.py +550 -0
- opentrons/protocol_engine/labware_offset_standardization.py +194 -0
- opentrons/protocol_engine/notes/__init__.py +17 -0
- opentrons/protocol_engine/notes/notes.py +59 -0
- opentrons/protocol_engine/plugins.py +104 -0
- opentrons/protocol_engine/protocol_engine.py +683 -0
- opentrons/protocol_engine/resources/__init__.py +26 -0
- opentrons/protocol_engine/resources/deck_configuration_provider.py +232 -0
- opentrons/protocol_engine/resources/deck_data_provider.py +94 -0
- opentrons/protocol_engine/resources/file_provider.py +161 -0
- opentrons/protocol_engine/resources/fixture_validation.py +58 -0
- opentrons/protocol_engine/resources/labware_data_provider.py +106 -0
- opentrons/protocol_engine/resources/labware_validation.py +73 -0
- opentrons/protocol_engine/resources/model_utils.py +32 -0
- opentrons/protocol_engine/resources/module_data_provider.py +44 -0
- opentrons/protocol_engine/resources/ot3_validation.py +21 -0
- opentrons/protocol_engine/resources/pipette_data_provider.py +379 -0
- opentrons/protocol_engine/slot_standardization.py +128 -0
- opentrons/protocol_engine/state/__init__.py +1 -0
- opentrons/protocol_engine/state/_abstract_store.py +27 -0
- opentrons/protocol_engine/state/_axis_aligned_bounding_box.py +50 -0
- opentrons/protocol_engine/state/_labware_origin_math.py +636 -0
- opentrons/protocol_engine/state/_move_types.py +83 -0
- opentrons/protocol_engine/state/_well_math.py +193 -0
- opentrons/protocol_engine/state/addressable_areas.py +699 -0
- opentrons/protocol_engine/state/command_history.py +309 -0
- opentrons/protocol_engine/state/commands.py +1158 -0
- opentrons/protocol_engine/state/config.py +39 -0
- opentrons/protocol_engine/state/files.py +57 -0
- opentrons/protocol_engine/state/fluid_stack.py +138 -0
- opentrons/protocol_engine/state/geometry.py +2359 -0
- opentrons/protocol_engine/state/inner_well_math_utils.py +548 -0
- opentrons/protocol_engine/state/labware.py +1459 -0
- opentrons/protocol_engine/state/liquid_classes.py +82 -0
- opentrons/protocol_engine/state/liquids.py +73 -0
- opentrons/protocol_engine/state/module_substates/__init__.py +45 -0
- opentrons/protocol_engine/state/module_substates/absorbance_reader_substate.py +35 -0
- opentrons/protocol_engine/state/module_substates/flex_stacker_substate.py +112 -0
- opentrons/protocol_engine/state/module_substates/heater_shaker_module_substate.py +115 -0
- opentrons/protocol_engine/state/module_substates/magnetic_block_substate.py +17 -0
- opentrons/protocol_engine/state/module_substates/magnetic_module_substate.py +65 -0
- opentrons/protocol_engine/state/module_substates/temperature_module_substate.py +67 -0
- opentrons/protocol_engine/state/module_substates/thermocycler_module_substate.py +163 -0
- opentrons/protocol_engine/state/modules.py +1500 -0
- opentrons/protocol_engine/state/motion.py +373 -0
- opentrons/protocol_engine/state/pipettes.py +905 -0
- opentrons/protocol_engine/state/state.py +421 -0
- opentrons/protocol_engine/state/state_summary.py +36 -0
- opentrons/protocol_engine/state/tips.py +420 -0
- opentrons/protocol_engine/state/update_types.py +904 -0
- opentrons/protocol_engine/state/wells.py +290 -0
- opentrons/protocol_engine/types/__init__.py +308 -0
- opentrons/protocol_engine/types/automatic_tip_selection.py +39 -0
- opentrons/protocol_engine/types/command_annotations.py +53 -0
- opentrons/protocol_engine/types/deck_configuration.py +81 -0
- opentrons/protocol_engine/types/execution.py +96 -0
- opentrons/protocol_engine/types/hardware_passthrough.py +25 -0
- opentrons/protocol_engine/types/instrument.py +47 -0
- opentrons/protocol_engine/types/instrument_sensors.py +47 -0
- opentrons/protocol_engine/types/labware.py +131 -0
- opentrons/protocol_engine/types/labware_movement.py +22 -0
- opentrons/protocol_engine/types/labware_offset_location.py +111 -0
- opentrons/protocol_engine/types/labware_offset_vector.py +16 -0
- opentrons/protocol_engine/types/liquid.py +40 -0
- opentrons/protocol_engine/types/liquid_class.py +59 -0
- opentrons/protocol_engine/types/liquid_handling.py +13 -0
- opentrons/protocol_engine/types/liquid_level_detection.py +191 -0
- opentrons/protocol_engine/types/location.py +194 -0
- opentrons/protocol_engine/types/module.py +303 -0
- opentrons/protocol_engine/types/partial_tip_configuration.py +76 -0
- opentrons/protocol_engine/types/run_time_parameters.py +133 -0
- opentrons/protocol_engine/types/tip.py +18 -0
- opentrons/protocol_engine/types/util.py +21 -0
- opentrons/protocol_engine/types/well_position.py +124 -0
- opentrons/protocol_reader/__init__.py +37 -0
- opentrons/protocol_reader/extract_labware_definitions.py +66 -0
- opentrons/protocol_reader/file_format_validator.py +152 -0
- opentrons/protocol_reader/file_hasher.py +27 -0
- opentrons/protocol_reader/file_identifier.py +284 -0
- opentrons/protocol_reader/file_reader_writer.py +90 -0
- opentrons/protocol_reader/input_file.py +16 -0
- opentrons/protocol_reader/protocol_files_invalid_error.py +6 -0
- opentrons/protocol_reader/protocol_reader.py +188 -0
- opentrons/protocol_reader/protocol_source.py +124 -0
- opentrons/protocol_reader/role_analyzer.py +86 -0
- opentrons/protocol_runner/__init__.py +26 -0
- opentrons/protocol_runner/create_simulating_orchestrator.py +118 -0
- opentrons/protocol_runner/json_file_reader.py +55 -0
- opentrons/protocol_runner/json_translator.py +314 -0
- opentrons/protocol_runner/legacy_command_mapper.py +848 -0
- opentrons/protocol_runner/legacy_context_plugin.py +116 -0
- opentrons/protocol_runner/protocol_runner.py +530 -0
- opentrons/protocol_runner/python_protocol_wrappers.py +179 -0
- opentrons/protocol_runner/run_orchestrator.py +496 -0
- opentrons/protocol_runner/task_queue.py +95 -0
- opentrons/protocols/__init__.py +6 -0
- opentrons/protocols/advanced_control/__init__.py +0 -0
- opentrons/protocols/advanced_control/common.py +38 -0
- opentrons/protocols/advanced_control/mix.py +60 -0
- opentrons/protocols/advanced_control/transfers/__init__.py +0 -0
- opentrons/protocols/advanced_control/transfers/common.py +180 -0
- opentrons/protocols/advanced_control/transfers/transfer.py +972 -0
- opentrons/protocols/advanced_control/transfers/transfer_liquid_utils.py +231 -0
- opentrons/protocols/api_support/__init__.py +0 -0
- opentrons/protocols/api_support/constants.py +8 -0
- opentrons/protocols/api_support/deck_type.py +110 -0
- opentrons/protocols/api_support/definitions.py +18 -0
- opentrons/protocols/api_support/instrument.py +151 -0
- opentrons/protocols/api_support/labware_like.py +233 -0
- opentrons/protocols/api_support/tip_tracker.py +175 -0
- opentrons/protocols/api_support/types.py +32 -0
- opentrons/protocols/api_support/util.py +403 -0
- opentrons/protocols/bundle.py +89 -0
- opentrons/protocols/duration/__init__.py +4 -0
- opentrons/protocols/duration/errors.py +5 -0
- opentrons/protocols/duration/estimator.py +628 -0
- opentrons/protocols/execution/__init__.py +0 -0
- opentrons/protocols/execution/dev_types.py +181 -0
- opentrons/protocols/execution/errors.py +40 -0
- opentrons/protocols/execution/execute.py +84 -0
- opentrons/protocols/execution/execute_json_v3.py +275 -0
- opentrons/protocols/execution/execute_json_v4.py +359 -0
- opentrons/protocols/execution/execute_json_v5.py +28 -0
- opentrons/protocols/execution/execute_python.py +169 -0
- opentrons/protocols/execution/json_dispatchers.py +87 -0
- opentrons/protocols/execution/types.py +7 -0
- opentrons/protocols/geometry/__init__.py +0 -0
- opentrons/protocols/geometry/planning.py +297 -0
- opentrons/protocols/labware.py +312 -0
- opentrons/protocols/models/__init__.py +0 -0
- opentrons/protocols/models/json_protocol.py +679 -0
- opentrons/protocols/parameters/__init__.py +0 -0
- opentrons/protocols/parameters/csv_parameter_definition.py +77 -0
- opentrons/protocols/parameters/csv_parameter_interface.py +96 -0
- opentrons/protocols/parameters/exceptions.py +34 -0
- opentrons/protocols/parameters/parameter_definition.py +272 -0
- opentrons/protocols/parameters/types.py +17 -0
- opentrons/protocols/parameters/validation.py +267 -0
- opentrons/protocols/parse.py +671 -0
- opentrons/protocols/types.py +159 -0
- opentrons/py.typed +0 -0
- opentrons/resources/scripts/lpc21isp +0 -0
- opentrons/resources/smoothie-edge-8414642.hex +23010 -0
- opentrons/simulate.py +1065 -0
- opentrons/system/__init__.py +6 -0
- opentrons/system/camera.py +51 -0
- opentrons/system/log_control.py +59 -0
- opentrons/system/nmcli.py +856 -0
- opentrons/system/resin.py +24 -0
- opentrons/system/smoothie_update.py +15 -0
- opentrons/system/wifi.py +204 -0
- opentrons/tools/__init__.py +0 -0
- opentrons/tools/args_handler.py +22 -0
- opentrons/tools/write_pipette_memory.py +157 -0
- opentrons/types.py +618 -0
- opentrons/util/__init__.py +1 -0
- opentrons/util/async_helpers.py +166 -0
- opentrons/util/broker.py +84 -0
- opentrons/util/change_notifier.py +47 -0
- opentrons/util/entrypoint_util.py +278 -0
- opentrons/util/get_union_elements.py +26 -0
- opentrons/util/helpers.py +6 -0
- opentrons/util/linal.py +178 -0
- opentrons/util/logging_config.py +265 -0
- opentrons/util/logging_queue_handler.py +61 -0
- opentrons/util/performance_helpers.py +157 -0
- opentrons-8.6.0a1.dist-info/METADATA +37 -0
- opentrons-8.6.0a1.dist-info/RECORD +600 -0
- opentrons-8.6.0a1.dist-info/WHEEL +4 -0
- opentrons-8.6.0a1.dist-info/entry_points.txt +3 -0
- opentrons-8.6.0a1.dist-info/licenses/LICENSE +202 -0
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import json
|
|
2
|
+
from pydantic import ValidationError
|
|
3
|
+
from typing import Optional, Union
|
|
4
|
+
|
|
5
|
+
from opentrons import config, types
|
|
6
|
+
from dataclasses import asdict
|
|
7
|
+
from opentrons.util.helpers import utc_now
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
from .. import file_operators as io, types as local_types
|
|
11
|
+
|
|
12
|
+
from .models import v1
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
# Delete Gripper Offset Calibrations
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def delete_gripper_calibration_file(gripper: str) -> None:
|
|
19
|
+
"""
|
|
20
|
+
Delete gripper calibration offset file based on gripper serial number
|
|
21
|
+
|
|
22
|
+
:param gripper: gripper serial number
|
|
23
|
+
"""
|
|
24
|
+
offset_path = (
|
|
25
|
+
config.get_opentrons_path("gripper_calibration_dir") / f"{gripper}.json"
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
io.delete_file(offset_path)
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def clear_gripper_calibration_offsets() -> None:
|
|
32
|
+
"""
|
|
33
|
+
Delete all gripper calibration data files.
|
|
34
|
+
"""
|
|
35
|
+
|
|
36
|
+
offset_dir = config.get_opentrons_path("gripper_calibration_dir")
|
|
37
|
+
io._remove_json_files_in_directories(offset_dir)
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
# Delete Gripper Jaw Width Calibration
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def delete_gripper_jaw_width_data_file(gripper: str) -> None:
|
|
44
|
+
"""
|
|
45
|
+
Delete gripper jaw width data file based on gripper serial number
|
|
46
|
+
|
|
47
|
+
:param gripper: gripper serial number
|
|
48
|
+
"""
|
|
49
|
+
offset_path = config.get_opentrons_path("gripper_jaw_width_dir") / f"{gripper}.json"
|
|
50
|
+
io.delete_file(offset_path)
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def clear_gripper_jaw_width_data() -> None:
|
|
54
|
+
"""
|
|
55
|
+
Delete all gripper jaw width data files.
|
|
56
|
+
"""
|
|
57
|
+
offset_dir = config.get_opentrons_path("gripper_jaw_width_dir")
|
|
58
|
+
io._remove_json_files_in_directories(offset_dir)
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
# Save Gripper Offset Calibrations
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def save_gripper_calibration(
|
|
65
|
+
offset: types.Point,
|
|
66
|
+
gripper_id: str,
|
|
67
|
+
cal_status: Optional[
|
|
68
|
+
Union[local_types.CalibrationStatus, v1.CalibrationStatus]
|
|
69
|
+
] = None,
|
|
70
|
+
) -> None:
|
|
71
|
+
gripper_dir = config.get_opentrons_path("gripper_calibration_dir")
|
|
72
|
+
|
|
73
|
+
if isinstance(cal_status, local_types.CalibrationStatus):
|
|
74
|
+
cal_status_model = v1.CalibrationStatus(**asdict(cal_status))
|
|
75
|
+
elif isinstance(cal_status, v1.CalibrationStatus):
|
|
76
|
+
cal_status_model = cal_status
|
|
77
|
+
else:
|
|
78
|
+
cal_status_model = v1.CalibrationStatus()
|
|
79
|
+
|
|
80
|
+
gripper_calibration = v1.InstrumentOffsetModel(
|
|
81
|
+
offset=offset,
|
|
82
|
+
lastModified=utc_now(),
|
|
83
|
+
source=local_types.SourceType.user,
|
|
84
|
+
status=cal_status_model,
|
|
85
|
+
)
|
|
86
|
+
io.save_to_file(gripper_dir, gripper_id, gripper_calibration)
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
# Save Gripper Jaw Width Data
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
def save_gripper_jaw_width_data(
|
|
93
|
+
encoder_position_at_jaw_closed: float,
|
|
94
|
+
gripper_id: str,
|
|
95
|
+
cal_status: Optional[
|
|
96
|
+
Union[local_types.CalibrationStatus, v1.CalibrationStatus]
|
|
97
|
+
] = None,
|
|
98
|
+
) -> None:
|
|
99
|
+
gripper_jaw_width_dir = config.get_opentrons_path("gripper_jaw_width_dir")
|
|
100
|
+
|
|
101
|
+
if isinstance(cal_status, local_types.CalibrationStatus):
|
|
102
|
+
cal_status_model = v1.CalibrationStatus(**asdict(cal_status))
|
|
103
|
+
elif isinstance(cal_status, v1.CalibrationStatus):
|
|
104
|
+
cal_status_model = cal_status
|
|
105
|
+
else:
|
|
106
|
+
cal_status_model = v1.CalibrationStatus()
|
|
107
|
+
|
|
108
|
+
gripper_jaw_width = v1.GripperJawWidthModel(
|
|
109
|
+
encoderPositionAtJawClosed=encoder_position_at_jaw_closed,
|
|
110
|
+
lastModified=utc_now(),
|
|
111
|
+
source=local_types.SourceType.user,
|
|
112
|
+
status=cal_status_model,
|
|
113
|
+
)
|
|
114
|
+
io.save_to_file(gripper_jaw_width_dir, gripper_id, gripper_jaw_width)
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
# Get Gripper Offset Calibrations
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
def get_gripper_calibration_offset(
|
|
121
|
+
gripper_id: str,
|
|
122
|
+
) -> Optional[v1.InstrumentOffsetModel]:
|
|
123
|
+
"""
|
|
124
|
+
Return the requested gripper offset data.
|
|
125
|
+
"""
|
|
126
|
+
if not config.feature_flags.enable_ot3_hardware_controller():
|
|
127
|
+
raise NotImplementedError("Gripper calibrations are only valid on the OT-3")
|
|
128
|
+
try:
|
|
129
|
+
gripper_calibration_filepath = (
|
|
130
|
+
config.get_opentrons_path("gripper_calibration_dir") / f"{gripper_id}.json"
|
|
131
|
+
)
|
|
132
|
+
return v1.InstrumentOffsetModel(
|
|
133
|
+
**io.read_cal_file(gripper_calibration_filepath)
|
|
134
|
+
)
|
|
135
|
+
except FileNotFoundError:
|
|
136
|
+
return None
|
|
137
|
+
except (json.JSONDecodeError, ValidationError):
|
|
138
|
+
return None
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
# Get Gripper Jaw Width
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
def get_gripper_jaw_width_data(gripper_id: str) -> Optional[v1.GripperJawWidthModel]:
|
|
145
|
+
"""Return the requested gripper jaw width data."""
|
|
146
|
+
if not config.feature_flags.enable_ot3_hardware_controller():
|
|
147
|
+
raise NotImplementedError("Gripper jaw width data only available on the OT-3.")
|
|
148
|
+
try:
|
|
149
|
+
gripper_jaw_width_filepath = (
|
|
150
|
+
config.get_opentrons_path("gripper_jaw_width_dir") / f"{gripper_id}.json"
|
|
151
|
+
)
|
|
152
|
+
return v1.GripperJawWidthModel(**io.read_cal_file(gripper_jaw_width_filepath))
|
|
153
|
+
except FileNotFoundError:
|
|
154
|
+
return None
|
|
155
|
+
except (json.JSONDecodeError, ValidationError):
|
|
156
|
+
return None
|
|
File without changes
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import typing
|
|
2
|
+
|
|
3
|
+
from typing_extensions import Literal
|
|
4
|
+
from opentrons.hardware_control.modules.types import ModuleType
|
|
5
|
+
from opentrons.hardware_control.types import OT3Mount
|
|
6
|
+
from pydantic import field_validator, BaseModel, Field, PlainSerializer
|
|
7
|
+
from datetime import datetime
|
|
8
|
+
|
|
9
|
+
from opentrons_shared_data.pipette.types import LabwareUri
|
|
10
|
+
|
|
11
|
+
from opentrons.types import Point
|
|
12
|
+
from opentrons.calibration_storage import types
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
DatetimeType = typing.Annotated[
|
|
16
|
+
datetime,
|
|
17
|
+
PlainSerializer(lambda x: x.isoformat(), when_used="json"),
|
|
18
|
+
]
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class CalibrationStatus(BaseModel):
|
|
22
|
+
markedBad: bool = False
|
|
23
|
+
source: typing.Optional[types.SourceType] = None
|
|
24
|
+
markedAt: typing.Optional[DatetimeType] = None
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class TipLengthModel(BaseModel):
|
|
28
|
+
tipLength: float = Field(..., description="Tip length data found from calibration.")
|
|
29
|
+
lastModified: DatetimeType = Field(
|
|
30
|
+
..., description="The last time this tip length was calibrated."
|
|
31
|
+
)
|
|
32
|
+
uri: typing.Union[LabwareUri, Literal[""]] = Field(
|
|
33
|
+
..., description="The tiprack URI associated with the tip length data."
|
|
34
|
+
)
|
|
35
|
+
source: types.SourceType = Field(
|
|
36
|
+
default=types.SourceType.factory, description="The source of calibration."
|
|
37
|
+
)
|
|
38
|
+
status: CalibrationStatus = Field(
|
|
39
|
+
default_factory=CalibrationStatus,
|
|
40
|
+
description="The status of the calibration data.",
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
@field_validator("tipLength")
|
|
44
|
+
@classmethod
|
|
45
|
+
def ensure_tip_length_positive(cls, tipLength: float) -> float:
|
|
46
|
+
if tipLength < 0.0:
|
|
47
|
+
raise ValueError("Tip Length must be a positive number")
|
|
48
|
+
return tipLength
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
class BeltCalibrationModel(BaseModel):
|
|
52
|
+
attitude: types.AttitudeMatrix = Field(
|
|
53
|
+
..., description="Attitude matrix for belts found from calibration."
|
|
54
|
+
)
|
|
55
|
+
lastModified: DatetimeType = Field(
|
|
56
|
+
..., description="The last time this deck was calibrated."
|
|
57
|
+
)
|
|
58
|
+
source: types.SourceType = Field(
|
|
59
|
+
default=types.SourceType.factory, description="The source of calibration."
|
|
60
|
+
)
|
|
61
|
+
pipetteCalibratedWith: typing.Optional[str] = Field(
|
|
62
|
+
default=None, description="The pipette id used to calibrate the deck."
|
|
63
|
+
)
|
|
64
|
+
status: CalibrationStatus = Field(
|
|
65
|
+
default_factory=CalibrationStatus,
|
|
66
|
+
description="The status of the calibration data.",
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
class InstrumentOffsetModel(BaseModel):
|
|
71
|
+
offset: Point = Field(..., description="Instrument offset found from calibration.")
|
|
72
|
+
lastModified: DatetimeType = Field(
|
|
73
|
+
..., description="The last time this instrument was calibrated."
|
|
74
|
+
)
|
|
75
|
+
source: types.SourceType = Field(
|
|
76
|
+
default=types.SourceType.factory, description="The source of calibration."
|
|
77
|
+
)
|
|
78
|
+
status: CalibrationStatus = Field(
|
|
79
|
+
default_factory=CalibrationStatus,
|
|
80
|
+
description="The status of the calibration data.",
|
|
81
|
+
)
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
class GripperJawWidthModel(BaseModel):
|
|
85
|
+
encoderPositionAtJawClosed: float = Field(
|
|
86
|
+
..., description="The encoder position when the gripper jaw is closed."
|
|
87
|
+
)
|
|
88
|
+
lastModified: DatetimeType = Field(
|
|
89
|
+
..., description="The last time this instrument was calibrated."
|
|
90
|
+
)
|
|
91
|
+
source: types.SourceType = Field(
|
|
92
|
+
default=types.SourceType.factory, description="The source of calibration."
|
|
93
|
+
)
|
|
94
|
+
status: CalibrationStatus = Field(
|
|
95
|
+
default_factory=CalibrationStatus,
|
|
96
|
+
description="The status of the calibration data.",
|
|
97
|
+
)
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
class ModuleOffsetModel(BaseModel):
|
|
101
|
+
offset: Point = Field(..., description="Module offset found from calibration.")
|
|
102
|
+
mount: OT3Mount = Field(..., description="The mount used to calibrate this module.")
|
|
103
|
+
slot: str = Field(
|
|
104
|
+
...,
|
|
105
|
+
description=("The slot this module was calibrated in."),
|
|
106
|
+
)
|
|
107
|
+
module: ModuleType = Field(..., description="The module type of this module.")
|
|
108
|
+
module_id: str = Field(..., description="The unique id of this module.")
|
|
109
|
+
instrument_id: str = Field(
|
|
110
|
+
...,
|
|
111
|
+
description="The unique id of the instrument used to calibrate this module.",
|
|
112
|
+
)
|
|
113
|
+
lastModified: DatetimeType = Field(
|
|
114
|
+
..., description="The last time this module was calibrated."
|
|
115
|
+
)
|
|
116
|
+
source: types.SourceType = Field(
|
|
117
|
+
default=types.SourceType.factory, description="The source of calibration."
|
|
118
|
+
)
|
|
119
|
+
status: CalibrationStatus = Field(
|
|
120
|
+
default_factory=CalibrationStatus,
|
|
121
|
+
description="The status of the calibration data.",
|
|
122
|
+
)
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import json
|
|
2
|
+
import logging
|
|
3
|
+
import os
|
|
4
|
+
from functools import lru_cache
|
|
5
|
+
from pathlib import Path
|
|
6
|
+
from opentrons.hardware_control.modules.types import ModuleType
|
|
7
|
+
from opentrons.hardware_control.types import OT3Mount
|
|
8
|
+
from pydantic import ValidationError
|
|
9
|
+
from typing import List, Optional, Union, no_type_check
|
|
10
|
+
from dataclasses import asdict
|
|
11
|
+
|
|
12
|
+
from opentrons import config, types
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
from .. import file_operators as io, types as local_types
|
|
16
|
+
from opentrons.util.helpers import utc_now
|
|
17
|
+
|
|
18
|
+
from .models import v1
|
|
19
|
+
|
|
20
|
+
log = logging.getLogger(__name__)
|
|
21
|
+
# Delete Module Offset Calibrations
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
@no_type_check
|
|
25
|
+
def delete_module_offset_file(module_id: str) -> None:
|
|
26
|
+
"""
|
|
27
|
+
Delete module offset file for the given module id.
|
|
28
|
+
|
|
29
|
+
:param module: module id serial number
|
|
30
|
+
"""
|
|
31
|
+
offset_dir = config.get_opentrons_path("module_calibration_dir")
|
|
32
|
+
offset_path = offset_dir / f"{module_id}.json"
|
|
33
|
+
io.delete_file(offset_path)
|
|
34
|
+
# something changed, clear lru cache
|
|
35
|
+
get_module_offset.cache_clear()
|
|
36
|
+
load_all_module_offsets.cache_clear()
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def clear_module_offset_calibrations() -> None:
|
|
40
|
+
"""
|
|
41
|
+
Delete all module offset calibration files.
|
|
42
|
+
"""
|
|
43
|
+
|
|
44
|
+
offset_dir = config.get_opentrons_path("module_calibration_dir")
|
|
45
|
+
io._remove_json_files_in_directories(offset_dir)
|
|
46
|
+
# something changed, clear lru cache
|
|
47
|
+
get_module_offset.cache_clear()
|
|
48
|
+
load_all_module_offsets.cache_clear()
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
# Save Module Offset Calibrations
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
@no_type_check
|
|
55
|
+
def save_module_calibration(
|
|
56
|
+
offset: types.Point,
|
|
57
|
+
mount: OT3Mount,
|
|
58
|
+
slot: str,
|
|
59
|
+
module: ModuleType,
|
|
60
|
+
module_id: str,
|
|
61
|
+
instrument_id: Optional[str] = None,
|
|
62
|
+
cal_status: Optional[
|
|
63
|
+
Union[local_types.CalibrationStatus, v1.CalibrationStatus]
|
|
64
|
+
] = None,
|
|
65
|
+
) -> None:
|
|
66
|
+
module_dir = config.get_opentrons_path("module_calibration_dir")
|
|
67
|
+
if isinstance(cal_status, local_types.CalibrationStatus):
|
|
68
|
+
cal_status_model = v1.CalibrationStatus(**asdict(cal_status))
|
|
69
|
+
elif isinstance(cal_status, v1.CalibrationStatus):
|
|
70
|
+
cal_status_model = cal_status
|
|
71
|
+
else:
|
|
72
|
+
cal_status_model = v1.CalibrationStatus()
|
|
73
|
+
|
|
74
|
+
module_calibration = v1.ModuleOffsetModel(
|
|
75
|
+
offset=offset,
|
|
76
|
+
mount=mount,
|
|
77
|
+
slot=slot,
|
|
78
|
+
module=module,
|
|
79
|
+
module_id=module_id,
|
|
80
|
+
instrument_id=instrument_id,
|
|
81
|
+
lastModified=utc_now(),
|
|
82
|
+
source=local_types.SourceType.user,
|
|
83
|
+
status=cal_status_model,
|
|
84
|
+
)
|
|
85
|
+
io.save_to_file(module_dir, module_id, module_calibration)
|
|
86
|
+
# something changed, clear lru cache
|
|
87
|
+
get_module_offset.cache_clear()
|
|
88
|
+
load_all_module_offsets.cache_clear()
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
# Get Module Offset Calibrations
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
@no_type_check
|
|
95
|
+
@lru_cache(maxsize=10)
|
|
96
|
+
def get_module_offset(
|
|
97
|
+
module: ModuleType, module_id: str, slot: Optional[str] = None
|
|
98
|
+
) -> Optional[v1.ModuleOffsetModel]:
|
|
99
|
+
try:
|
|
100
|
+
module_calibration_filepath = (
|
|
101
|
+
config.get_opentrons_path("module_calibration_dir") / f"{module_id}.json"
|
|
102
|
+
)
|
|
103
|
+
return v1.ModuleOffsetModel(**io.read_cal_file(module_calibration_filepath))
|
|
104
|
+
except FileNotFoundError:
|
|
105
|
+
log.warning(
|
|
106
|
+
f"Calibrations for {module} {module_id} on slot {slot} does not exist."
|
|
107
|
+
)
|
|
108
|
+
return None
|
|
109
|
+
except (json.JSONDecodeError, ValidationError):
|
|
110
|
+
log.warning(
|
|
111
|
+
f"Malformed calibrations for {module_id} on slot {slot}. Please factory reset your calibrations.",
|
|
112
|
+
exc_info=True,
|
|
113
|
+
)
|
|
114
|
+
return None
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
@lru_cache(maxsize=10)
|
|
118
|
+
def load_all_module_offsets() -> List[v1.ModuleOffsetModel]:
|
|
119
|
+
"""Load all module offsets from the disk."""
|
|
120
|
+
|
|
121
|
+
calibrations: List[v1.ModuleOffsetModel] = []
|
|
122
|
+
files = os.listdir(config.get_opentrons_path("module_calibration_dir"))
|
|
123
|
+
for file in files:
|
|
124
|
+
try:
|
|
125
|
+
calibrations.append(
|
|
126
|
+
v1.ModuleOffsetModel(
|
|
127
|
+
**io.read_cal_file(
|
|
128
|
+
Path(config.get_opentrons_path("module_calibration_dir") / file)
|
|
129
|
+
)
|
|
130
|
+
)
|
|
131
|
+
)
|
|
132
|
+
except (json.JSONDecodeError, ValidationError):
|
|
133
|
+
log.warning(
|
|
134
|
+
f"Malformed module calibrations for {file}. Please factory reset your calibrations.",
|
|
135
|
+
exc_info=True,
|
|
136
|
+
)
|
|
137
|
+
continue
|
|
138
|
+
return calibrations
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import json
|
|
2
|
+
import logging
|
|
3
|
+
from pydantic import ValidationError
|
|
4
|
+
from typing import Optional, Union, no_type_check
|
|
5
|
+
from dataclasses import asdict
|
|
6
|
+
|
|
7
|
+
from opentrons import config, types
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
from .. import file_operators as io, types as local_types
|
|
11
|
+
from opentrons.util.helpers import utc_now
|
|
12
|
+
|
|
13
|
+
from .models import v1
|
|
14
|
+
|
|
15
|
+
log = logging.getLogger(__name__)
|
|
16
|
+
# Delete Pipette Offset Calibrations
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
@no_type_check
|
|
20
|
+
def delete_pipette_offset_file(pipette: str, mount: types.Mount) -> None:
|
|
21
|
+
"""
|
|
22
|
+
Delete pipette offset file based on mount and pipette serial number
|
|
23
|
+
|
|
24
|
+
:param pipette: pipette serial number
|
|
25
|
+
:param mount: pipette mount
|
|
26
|
+
"""
|
|
27
|
+
offset_dir = config.get_opentrons_path("pipette_calibration_dir")
|
|
28
|
+
offset_path = offset_dir / mount.name.lower() / f"{pipette}.json"
|
|
29
|
+
io.delete_file(offset_path)
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def clear_pipette_offset_calibrations() -> None:
|
|
33
|
+
"""
|
|
34
|
+
Delete all pipette offset calibration files.
|
|
35
|
+
"""
|
|
36
|
+
|
|
37
|
+
offset_dir = config.get_opentrons_path("pipette_calibration_dir")
|
|
38
|
+
io._remove_json_files_in_directories(offset_dir)
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
# Save Pipette Offset Calibrations
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
@no_type_check
|
|
45
|
+
def save_pipette_calibration(
|
|
46
|
+
offset: types.Point,
|
|
47
|
+
pip_id: str,
|
|
48
|
+
mount: types.Mount,
|
|
49
|
+
cal_status: Optional[
|
|
50
|
+
Union[local_types.CalibrationStatus, v1.CalibrationStatus]
|
|
51
|
+
] = None,
|
|
52
|
+
) -> None:
|
|
53
|
+
pip_dir = config.get_opentrons_path("pipette_calibration_dir") / mount.name.lower()
|
|
54
|
+
|
|
55
|
+
if isinstance(cal_status, local_types.CalibrationStatus):
|
|
56
|
+
cal_status_model = v1.CalibrationStatus(**asdict(cal_status))
|
|
57
|
+
elif isinstance(cal_status, v1.CalibrationStatus):
|
|
58
|
+
cal_status_model = cal_status
|
|
59
|
+
else:
|
|
60
|
+
cal_status_model = v1.CalibrationStatus()
|
|
61
|
+
|
|
62
|
+
pipette_calibration = v1.InstrumentOffsetModel(
|
|
63
|
+
offset=offset,
|
|
64
|
+
lastModified=utc_now(),
|
|
65
|
+
source=local_types.SourceType.user,
|
|
66
|
+
status=cal_status_model,
|
|
67
|
+
)
|
|
68
|
+
io.save_to_file(pip_dir, pip_id, pipette_calibration)
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
# Get Pipette Offset Calibrations
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
@no_type_check
|
|
75
|
+
def get_pipette_offset(
|
|
76
|
+
pipette_id: str, mount: types.Mount
|
|
77
|
+
) -> Optional[v1.InstrumentOffsetModel]:
|
|
78
|
+
try:
|
|
79
|
+
pipette_calibration_filepath = (
|
|
80
|
+
config.get_opentrons_path("pipette_calibration_dir")
|
|
81
|
+
/ mount.name.lower()
|
|
82
|
+
/ f"{pipette_id}.json"
|
|
83
|
+
)
|
|
84
|
+
return v1.InstrumentOffsetModel(
|
|
85
|
+
**io.read_cal_file(pipette_calibration_filepath)
|
|
86
|
+
)
|
|
87
|
+
except FileNotFoundError:
|
|
88
|
+
log.debug(f"Calibrations for {pipette_id} on {mount} does not exist.")
|
|
89
|
+
return None
|
|
90
|
+
except (json.JSONDecodeError, ValidationError):
|
|
91
|
+
log.warning(
|
|
92
|
+
f"Malformed calibrations for {pipette_id} on {mount}. Please factory reset your calibrations.",
|
|
93
|
+
exc_info=True,
|
|
94
|
+
)
|
|
95
|
+
return None
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import typing
|
|
2
|
+
|
|
3
|
+
from dataclasses import dataclass
|
|
4
|
+
from datetime import datetime
|
|
5
|
+
from enum import Enum
|
|
6
|
+
|
|
7
|
+
AttitudeMatrix = typing.List[typing.List[float]]
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class SourceType(str, Enum):
|
|
11
|
+
"""Calibration source type"""
|
|
12
|
+
|
|
13
|
+
default = "default"
|
|
14
|
+
factory = "factory"
|
|
15
|
+
user = "user"
|
|
16
|
+
calibration_check = "calibration_check"
|
|
17
|
+
legacy = "legacy"
|
|
18
|
+
unknown = "unknown"
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class TipLengthCalNotFound(Exception):
|
|
22
|
+
pass
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
@dataclass
|
|
26
|
+
class CalibrationStatus:
|
|
27
|
+
markedBad: bool = False
|
|
28
|
+
source: typing.Optional[SourceType] = None
|
|
29
|
+
markedAt: typing.Optional[datetime] = None
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
@dataclass
|
|
33
|
+
class UriDetails:
|
|
34
|
+
namespace: str
|
|
35
|
+
load_name: str
|
|
36
|
+
version: int
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
# TODO(mm, 2023-11-20): Deduplicate this with similar types in robot_server
|
|
40
|
+
# and opentrons.protocol_engine.
|
|
41
|
+
@dataclass
|
|
42
|
+
class CutoutFixturePlacement:
|
|
43
|
+
cutout_fixture_id: str
|
|
44
|
+
cutout_id: str
|
|
45
|
+
opentrons_module_serial_number: typing.Optional[str]
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"""Opentrons command-line interface.
|
|
2
|
+
|
|
3
|
+
This CLI application is not yet public-facing.
|
|
4
|
+
It is currently used by the Opentrons App to analyze protocols.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import click
|
|
8
|
+
|
|
9
|
+
from .analyze import analyze
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
@click.group()
|
|
13
|
+
def main() -> None:
|
|
14
|
+
"""Welcome to the `opentrons` command-line application.
|
|
15
|
+
|
|
16
|
+
This application is not yet public facing.
|
|
17
|
+
Please check back in a future software version.
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
main.add_command(analyze)
|