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.

Files changed (600) hide show
  1. opentrons/__init__.py +150 -0
  2. opentrons/_version.py +34 -0
  3. opentrons/calibration_storage/__init__.py +54 -0
  4. opentrons/calibration_storage/deck_configuration.py +62 -0
  5. opentrons/calibration_storage/encoder_decoder.py +31 -0
  6. opentrons/calibration_storage/file_operators.py +142 -0
  7. opentrons/calibration_storage/helpers.py +103 -0
  8. opentrons/calibration_storage/ot2/__init__.py +34 -0
  9. opentrons/calibration_storage/ot2/deck_attitude.py +85 -0
  10. opentrons/calibration_storage/ot2/mark_bad_calibration.py +27 -0
  11. opentrons/calibration_storage/ot2/models/__init__.py +0 -0
  12. opentrons/calibration_storage/ot2/models/v1.py +149 -0
  13. opentrons/calibration_storage/ot2/pipette_offset.py +129 -0
  14. opentrons/calibration_storage/ot2/tip_length.py +281 -0
  15. opentrons/calibration_storage/ot3/__init__.py +31 -0
  16. opentrons/calibration_storage/ot3/deck_attitude.py +83 -0
  17. opentrons/calibration_storage/ot3/gripper_offset.py +156 -0
  18. opentrons/calibration_storage/ot3/models/__init__.py +0 -0
  19. opentrons/calibration_storage/ot3/models/v1.py +122 -0
  20. opentrons/calibration_storage/ot3/module_offset.py +138 -0
  21. opentrons/calibration_storage/ot3/pipette_offset.py +95 -0
  22. opentrons/calibration_storage/types.py +45 -0
  23. opentrons/cli/__init__.py +21 -0
  24. opentrons/cli/__main__.py +5 -0
  25. opentrons/cli/analyze.py +501 -0
  26. opentrons/config/__init__.py +631 -0
  27. opentrons/config/advanced_settings.py +871 -0
  28. opentrons/config/defaults_ot2.py +214 -0
  29. opentrons/config/defaults_ot3.py +499 -0
  30. opentrons/config/feature_flags.py +86 -0
  31. opentrons/config/gripper_config.py +55 -0
  32. opentrons/config/reset.py +203 -0
  33. opentrons/config/robot_configs.py +187 -0
  34. opentrons/config/types.py +183 -0
  35. opentrons/drivers/__init__.py +0 -0
  36. opentrons/drivers/absorbance_reader/__init__.py +11 -0
  37. opentrons/drivers/absorbance_reader/abstract.py +72 -0
  38. opentrons/drivers/absorbance_reader/async_byonoy.py +352 -0
  39. opentrons/drivers/absorbance_reader/driver.py +81 -0
  40. opentrons/drivers/absorbance_reader/hid_protocol.py +161 -0
  41. opentrons/drivers/absorbance_reader/simulator.py +84 -0
  42. opentrons/drivers/asyncio/__init__.py +0 -0
  43. opentrons/drivers/asyncio/communication/__init__.py +22 -0
  44. opentrons/drivers/asyncio/communication/async_serial.py +183 -0
  45. opentrons/drivers/asyncio/communication/errors.py +88 -0
  46. opentrons/drivers/asyncio/communication/serial_connection.py +552 -0
  47. opentrons/drivers/command_builder.py +102 -0
  48. opentrons/drivers/flex_stacker/__init__.py +13 -0
  49. opentrons/drivers/flex_stacker/abstract.py +214 -0
  50. opentrons/drivers/flex_stacker/driver.py +768 -0
  51. opentrons/drivers/flex_stacker/errors.py +68 -0
  52. opentrons/drivers/flex_stacker/simulator.py +309 -0
  53. opentrons/drivers/flex_stacker/types.py +367 -0
  54. opentrons/drivers/flex_stacker/utils.py +19 -0
  55. opentrons/drivers/heater_shaker/__init__.py +5 -0
  56. opentrons/drivers/heater_shaker/abstract.py +76 -0
  57. opentrons/drivers/heater_shaker/driver.py +204 -0
  58. opentrons/drivers/heater_shaker/simulator.py +94 -0
  59. opentrons/drivers/mag_deck/__init__.py +6 -0
  60. opentrons/drivers/mag_deck/abstract.py +44 -0
  61. opentrons/drivers/mag_deck/driver.py +208 -0
  62. opentrons/drivers/mag_deck/simulator.py +63 -0
  63. opentrons/drivers/rpi_drivers/__init__.py +33 -0
  64. opentrons/drivers/rpi_drivers/dev_types.py +94 -0
  65. opentrons/drivers/rpi_drivers/gpio.py +282 -0
  66. opentrons/drivers/rpi_drivers/gpio_simulator.py +127 -0
  67. opentrons/drivers/rpi_drivers/interfaces.py +15 -0
  68. opentrons/drivers/rpi_drivers/types.py +364 -0
  69. opentrons/drivers/rpi_drivers/usb.py +102 -0
  70. opentrons/drivers/rpi_drivers/usb_simulator.py +22 -0
  71. opentrons/drivers/serial_communication.py +151 -0
  72. opentrons/drivers/smoothie_drivers/__init__.py +4 -0
  73. opentrons/drivers/smoothie_drivers/connection.py +51 -0
  74. opentrons/drivers/smoothie_drivers/constants.py +121 -0
  75. opentrons/drivers/smoothie_drivers/driver_3_0.py +1933 -0
  76. opentrons/drivers/smoothie_drivers/errors.py +49 -0
  77. opentrons/drivers/smoothie_drivers/parse_utils.py +143 -0
  78. opentrons/drivers/smoothie_drivers/simulator.py +99 -0
  79. opentrons/drivers/smoothie_drivers/types.py +16 -0
  80. opentrons/drivers/temp_deck/__init__.py +10 -0
  81. opentrons/drivers/temp_deck/abstract.py +54 -0
  82. opentrons/drivers/temp_deck/driver.py +197 -0
  83. opentrons/drivers/temp_deck/simulator.py +57 -0
  84. opentrons/drivers/thermocycler/__init__.py +12 -0
  85. opentrons/drivers/thermocycler/abstract.py +99 -0
  86. opentrons/drivers/thermocycler/driver.py +395 -0
  87. opentrons/drivers/thermocycler/simulator.py +126 -0
  88. opentrons/drivers/types.py +107 -0
  89. opentrons/drivers/utils.py +222 -0
  90. opentrons/execute.py +742 -0
  91. opentrons/hardware_control/__init__.py +65 -0
  92. opentrons/hardware_control/__main__.py +77 -0
  93. opentrons/hardware_control/adapters.py +98 -0
  94. opentrons/hardware_control/api.py +1347 -0
  95. opentrons/hardware_control/backends/__init__.py +7 -0
  96. opentrons/hardware_control/backends/controller.py +400 -0
  97. opentrons/hardware_control/backends/errors.py +9 -0
  98. opentrons/hardware_control/backends/estop_state.py +164 -0
  99. opentrons/hardware_control/backends/flex_protocol.py +497 -0
  100. opentrons/hardware_control/backends/ot3controller.py +1930 -0
  101. opentrons/hardware_control/backends/ot3simulator.py +900 -0
  102. opentrons/hardware_control/backends/ot3utils.py +664 -0
  103. opentrons/hardware_control/backends/simulator.py +442 -0
  104. opentrons/hardware_control/backends/status_bar_state.py +240 -0
  105. opentrons/hardware_control/backends/subsystem_manager.py +431 -0
  106. opentrons/hardware_control/backends/tip_presence_manager.py +173 -0
  107. opentrons/hardware_control/backends/types.py +14 -0
  108. opentrons/hardware_control/constants.py +6 -0
  109. opentrons/hardware_control/dev_types.py +125 -0
  110. opentrons/hardware_control/emulation/__init__.py +0 -0
  111. opentrons/hardware_control/emulation/abstract_emulator.py +21 -0
  112. opentrons/hardware_control/emulation/app.py +56 -0
  113. opentrons/hardware_control/emulation/connection_handler.py +38 -0
  114. opentrons/hardware_control/emulation/heater_shaker.py +150 -0
  115. opentrons/hardware_control/emulation/magdeck.py +60 -0
  116. opentrons/hardware_control/emulation/module_server/__init__.py +8 -0
  117. opentrons/hardware_control/emulation/module_server/client.py +78 -0
  118. opentrons/hardware_control/emulation/module_server/helpers.py +130 -0
  119. opentrons/hardware_control/emulation/module_server/models.py +31 -0
  120. opentrons/hardware_control/emulation/module_server/server.py +110 -0
  121. opentrons/hardware_control/emulation/parser.py +74 -0
  122. opentrons/hardware_control/emulation/proxy.py +241 -0
  123. opentrons/hardware_control/emulation/run_emulator.py +68 -0
  124. opentrons/hardware_control/emulation/scripts/__init__.py +0 -0
  125. opentrons/hardware_control/emulation/scripts/run_app.py +54 -0
  126. opentrons/hardware_control/emulation/scripts/run_module_emulator.py +72 -0
  127. opentrons/hardware_control/emulation/scripts/run_smoothie.py +37 -0
  128. opentrons/hardware_control/emulation/settings.py +119 -0
  129. opentrons/hardware_control/emulation/simulations.py +133 -0
  130. opentrons/hardware_control/emulation/smoothie.py +192 -0
  131. opentrons/hardware_control/emulation/tempdeck.py +69 -0
  132. opentrons/hardware_control/emulation/thermocycler.py +128 -0
  133. opentrons/hardware_control/emulation/types.py +10 -0
  134. opentrons/hardware_control/emulation/util.py +38 -0
  135. opentrons/hardware_control/errors.py +43 -0
  136. opentrons/hardware_control/execution_manager.py +164 -0
  137. opentrons/hardware_control/instruments/__init__.py +5 -0
  138. opentrons/hardware_control/instruments/instrument_abc.py +39 -0
  139. opentrons/hardware_control/instruments/ot2/__init__.py +0 -0
  140. opentrons/hardware_control/instruments/ot2/instrument_calibration.py +152 -0
  141. opentrons/hardware_control/instruments/ot2/pipette.py +777 -0
  142. opentrons/hardware_control/instruments/ot2/pipette_handler.py +995 -0
  143. opentrons/hardware_control/instruments/ot3/__init__.py +0 -0
  144. opentrons/hardware_control/instruments/ot3/gripper.py +420 -0
  145. opentrons/hardware_control/instruments/ot3/gripper_handler.py +173 -0
  146. opentrons/hardware_control/instruments/ot3/instrument_calibration.py +214 -0
  147. opentrons/hardware_control/instruments/ot3/pipette.py +858 -0
  148. opentrons/hardware_control/instruments/ot3/pipette_handler.py +1030 -0
  149. opentrons/hardware_control/module_control.py +332 -0
  150. opentrons/hardware_control/modules/__init__.py +69 -0
  151. opentrons/hardware_control/modules/absorbance_reader.py +373 -0
  152. opentrons/hardware_control/modules/errors.py +7 -0
  153. opentrons/hardware_control/modules/flex_stacker.py +948 -0
  154. opentrons/hardware_control/modules/heater_shaker.py +426 -0
  155. opentrons/hardware_control/modules/lid_temp_status.py +35 -0
  156. opentrons/hardware_control/modules/magdeck.py +233 -0
  157. opentrons/hardware_control/modules/mod_abc.py +245 -0
  158. opentrons/hardware_control/modules/module_calibration.py +93 -0
  159. opentrons/hardware_control/modules/plate_temp_status.py +61 -0
  160. opentrons/hardware_control/modules/tempdeck.py +299 -0
  161. opentrons/hardware_control/modules/thermocycler.py +731 -0
  162. opentrons/hardware_control/modules/types.py +417 -0
  163. opentrons/hardware_control/modules/update.py +255 -0
  164. opentrons/hardware_control/modules/utils.py +73 -0
  165. opentrons/hardware_control/motion_utilities.py +318 -0
  166. opentrons/hardware_control/nozzle_manager.py +422 -0
  167. opentrons/hardware_control/ot3_calibration.py +1171 -0
  168. opentrons/hardware_control/ot3api.py +3227 -0
  169. opentrons/hardware_control/pause_manager.py +31 -0
  170. opentrons/hardware_control/poller.py +112 -0
  171. opentrons/hardware_control/protocols/__init__.py +106 -0
  172. opentrons/hardware_control/protocols/asyncio_configurable.py +11 -0
  173. opentrons/hardware_control/protocols/calibratable.py +45 -0
  174. opentrons/hardware_control/protocols/chassis_accessory_manager.py +90 -0
  175. opentrons/hardware_control/protocols/configurable.py +48 -0
  176. opentrons/hardware_control/protocols/event_sourcer.py +18 -0
  177. opentrons/hardware_control/protocols/execution_controllable.py +33 -0
  178. opentrons/hardware_control/protocols/flex_calibratable.py +96 -0
  179. opentrons/hardware_control/protocols/flex_instrument_configurer.py +52 -0
  180. opentrons/hardware_control/protocols/gripper_controller.py +55 -0
  181. opentrons/hardware_control/protocols/hardware_manager.py +51 -0
  182. opentrons/hardware_control/protocols/identifiable.py +16 -0
  183. opentrons/hardware_control/protocols/instrument_configurer.py +206 -0
  184. opentrons/hardware_control/protocols/liquid_handler.py +266 -0
  185. opentrons/hardware_control/protocols/module_provider.py +16 -0
  186. opentrons/hardware_control/protocols/motion_controller.py +243 -0
  187. opentrons/hardware_control/protocols/position_estimator.py +45 -0
  188. opentrons/hardware_control/protocols/simulatable.py +10 -0
  189. opentrons/hardware_control/protocols/stoppable.py +9 -0
  190. opentrons/hardware_control/protocols/types.py +27 -0
  191. opentrons/hardware_control/robot_calibration.py +224 -0
  192. opentrons/hardware_control/scripts/README.md +28 -0
  193. opentrons/hardware_control/scripts/__init__.py +1 -0
  194. opentrons/hardware_control/scripts/gripper_control.py +208 -0
  195. opentrons/hardware_control/scripts/ot3gripper +7 -0
  196. opentrons/hardware_control/scripts/ot3repl +7 -0
  197. opentrons/hardware_control/scripts/repl.py +187 -0
  198. opentrons/hardware_control/scripts/tc_control.py +97 -0
  199. opentrons/hardware_control/simulator_setup.py +260 -0
  200. opentrons/hardware_control/thread_manager.py +431 -0
  201. opentrons/hardware_control/threaded_async_lock.py +97 -0
  202. opentrons/hardware_control/types.py +792 -0
  203. opentrons/hardware_control/util.py +234 -0
  204. opentrons/legacy_broker.py +53 -0
  205. opentrons/legacy_commands/__init__.py +1 -0
  206. opentrons/legacy_commands/commands.py +483 -0
  207. opentrons/legacy_commands/helpers.py +153 -0
  208. opentrons/legacy_commands/module_commands.py +215 -0
  209. opentrons/legacy_commands/protocol_commands.py +54 -0
  210. opentrons/legacy_commands/publisher.py +155 -0
  211. opentrons/legacy_commands/robot_commands.py +51 -0
  212. opentrons/legacy_commands/types.py +1115 -0
  213. opentrons/motion_planning/__init__.py +32 -0
  214. opentrons/motion_planning/adjacent_slots_getters.py +168 -0
  215. opentrons/motion_planning/deck_conflict.py +396 -0
  216. opentrons/motion_planning/errors.py +35 -0
  217. opentrons/motion_planning/types.py +42 -0
  218. opentrons/motion_planning/waypoints.py +218 -0
  219. opentrons/ordered_set.py +138 -0
  220. opentrons/protocol_api/__init__.py +105 -0
  221. opentrons/protocol_api/_liquid.py +157 -0
  222. opentrons/protocol_api/_liquid_properties.py +814 -0
  223. opentrons/protocol_api/_nozzle_layout.py +31 -0
  224. opentrons/protocol_api/_parameter_context.py +300 -0
  225. opentrons/protocol_api/_parameters.py +31 -0
  226. opentrons/protocol_api/_transfer_liquid_validation.py +108 -0
  227. opentrons/protocol_api/_types.py +43 -0
  228. opentrons/protocol_api/config.py +23 -0
  229. opentrons/protocol_api/core/__init__.py +23 -0
  230. opentrons/protocol_api/core/common.py +33 -0
  231. opentrons/protocol_api/core/core_map.py +74 -0
  232. opentrons/protocol_api/core/engine/__init__.py +22 -0
  233. opentrons/protocol_api/core/engine/_default_labware_versions.py +179 -0
  234. opentrons/protocol_api/core/engine/deck_conflict.py +348 -0
  235. opentrons/protocol_api/core/engine/exceptions.py +19 -0
  236. opentrons/protocol_api/core/engine/instrument.py +2391 -0
  237. opentrons/protocol_api/core/engine/labware.py +238 -0
  238. opentrons/protocol_api/core/engine/load_labware_params.py +73 -0
  239. opentrons/protocol_api/core/engine/module_core.py +1025 -0
  240. opentrons/protocol_api/core/engine/overlap_versions.py +20 -0
  241. opentrons/protocol_api/core/engine/pipette_movement_conflict.py +358 -0
  242. opentrons/protocol_api/core/engine/point_calculations.py +64 -0
  243. opentrons/protocol_api/core/engine/protocol.py +1153 -0
  244. opentrons/protocol_api/core/engine/robot.py +139 -0
  245. opentrons/protocol_api/core/engine/stringify.py +74 -0
  246. opentrons/protocol_api/core/engine/transfer_components_executor.py +990 -0
  247. opentrons/protocol_api/core/engine/well.py +241 -0
  248. opentrons/protocol_api/core/instrument.py +459 -0
  249. opentrons/protocol_api/core/labware.py +151 -0
  250. opentrons/protocol_api/core/legacy/__init__.py +11 -0
  251. opentrons/protocol_api/core/legacy/_labware_geometry.py +37 -0
  252. opentrons/protocol_api/core/legacy/deck.py +369 -0
  253. opentrons/protocol_api/core/legacy/labware_offset_provider.py +108 -0
  254. opentrons/protocol_api/core/legacy/legacy_instrument_core.py +709 -0
  255. opentrons/protocol_api/core/legacy/legacy_labware_core.py +235 -0
  256. opentrons/protocol_api/core/legacy/legacy_module_core.py +592 -0
  257. opentrons/protocol_api/core/legacy/legacy_protocol_core.py +612 -0
  258. opentrons/protocol_api/core/legacy/legacy_well_core.py +162 -0
  259. opentrons/protocol_api/core/legacy/load_info.py +67 -0
  260. opentrons/protocol_api/core/legacy/module_geometry.py +547 -0
  261. opentrons/protocol_api/core/legacy/well_geometry.py +148 -0
  262. opentrons/protocol_api/core/legacy_simulator/__init__.py +16 -0
  263. opentrons/protocol_api/core/legacy_simulator/legacy_instrument_core.py +624 -0
  264. opentrons/protocol_api/core/legacy_simulator/legacy_protocol_core.py +85 -0
  265. opentrons/protocol_api/core/module.py +484 -0
  266. opentrons/protocol_api/core/protocol.py +311 -0
  267. opentrons/protocol_api/core/robot.py +51 -0
  268. opentrons/protocol_api/core/well.py +116 -0
  269. opentrons/protocol_api/core/well_grid.py +45 -0
  270. opentrons/protocol_api/create_protocol_context.py +177 -0
  271. opentrons/protocol_api/deck.py +223 -0
  272. opentrons/protocol_api/disposal_locations.py +244 -0
  273. opentrons/protocol_api/instrument_context.py +3212 -0
  274. opentrons/protocol_api/labware.py +1579 -0
  275. opentrons/protocol_api/module_contexts.py +1425 -0
  276. opentrons/protocol_api/module_validation_and_errors.py +61 -0
  277. opentrons/protocol_api/protocol_context.py +1688 -0
  278. opentrons/protocol_api/robot_context.py +303 -0
  279. opentrons/protocol_api/validation.py +761 -0
  280. opentrons/protocol_engine/__init__.py +155 -0
  281. opentrons/protocol_engine/actions/__init__.py +65 -0
  282. opentrons/protocol_engine/actions/action_dispatcher.py +30 -0
  283. opentrons/protocol_engine/actions/action_handler.py +13 -0
  284. opentrons/protocol_engine/actions/actions.py +302 -0
  285. opentrons/protocol_engine/actions/get_state_update.py +38 -0
  286. opentrons/protocol_engine/clients/__init__.py +5 -0
  287. opentrons/protocol_engine/clients/sync_client.py +174 -0
  288. opentrons/protocol_engine/clients/transports.py +197 -0
  289. opentrons/protocol_engine/commands/__init__.py +757 -0
  290. opentrons/protocol_engine/commands/absorbance_reader/__init__.py +61 -0
  291. opentrons/protocol_engine/commands/absorbance_reader/close_lid.py +154 -0
  292. opentrons/protocol_engine/commands/absorbance_reader/common.py +6 -0
  293. opentrons/protocol_engine/commands/absorbance_reader/initialize.py +151 -0
  294. opentrons/protocol_engine/commands/absorbance_reader/open_lid.py +154 -0
  295. opentrons/protocol_engine/commands/absorbance_reader/read.py +226 -0
  296. opentrons/protocol_engine/commands/air_gap_in_place.py +162 -0
  297. opentrons/protocol_engine/commands/aspirate.py +244 -0
  298. opentrons/protocol_engine/commands/aspirate_in_place.py +184 -0
  299. opentrons/protocol_engine/commands/aspirate_while_tracking.py +211 -0
  300. opentrons/protocol_engine/commands/blow_out.py +146 -0
  301. opentrons/protocol_engine/commands/blow_out_in_place.py +119 -0
  302. opentrons/protocol_engine/commands/calibration/__init__.py +60 -0
  303. opentrons/protocol_engine/commands/calibration/calibrate_gripper.py +166 -0
  304. opentrons/protocol_engine/commands/calibration/calibrate_module.py +117 -0
  305. opentrons/protocol_engine/commands/calibration/calibrate_pipette.py +96 -0
  306. opentrons/protocol_engine/commands/calibration/move_to_maintenance_position.py +156 -0
  307. opentrons/protocol_engine/commands/command.py +308 -0
  308. opentrons/protocol_engine/commands/command_unions.py +974 -0
  309. opentrons/protocol_engine/commands/comment.py +57 -0
  310. opentrons/protocol_engine/commands/configure_for_volume.py +108 -0
  311. opentrons/protocol_engine/commands/configure_nozzle_layout.py +115 -0
  312. opentrons/protocol_engine/commands/custom.py +67 -0
  313. opentrons/protocol_engine/commands/dispense.py +194 -0
  314. opentrons/protocol_engine/commands/dispense_in_place.py +179 -0
  315. opentrons/protocol_engine/commands/dispense_while_tracking.py +204 -0
  316. opentrons/protocol_engine/commands/drop_tip.py +232 -0
  317. opentrons/protocol_engine/commands/drop_tip_in_place.py +205 -0
  318. opentrons/protocol_engine/commands/flex_stacker/__init__.py +64 -0
  319. opentrons/protocol_engine/commands/flex_stacker/common.py +900 -0
  320. opentrons/protocol_engine/commands/flex_stacker/empty.py +293 -0
  321. opentrons/protocol_engine/commands/flex_stacker/fill.py +281 -0
  322. opentrons/protocol_engine/commands/flex_stacker/retrieve.py +339 -0
  323. opentrons/protocol_engine/commands/flex_stacker/set_stored_labware.py +328 -0
  324. opentrons/protocol_engine/commands/flex_stacker/store.py +326 -0
  325. opentrons/protocol_engine/commands/generate_command_schema.py +61 -0
  326. opentrons/protocol_engine/commands/get_next_tip.py +134 -0
  327. opentrons/protocol_engine/commands/get_tip_presence.py +87 -0
  328. opentrons/protocol_engine/commands/hash_command_params.py +38 -0
  329. opentrons/protocol_engine/commands/heater_shaker/__init__.py +102 -0
  330. opentrons/protocol_engine/commands/heater_shaker/close_labware_latch.py +83 -0
  331. opentrons/protocol_engine/commands/heater_shaker/deactivate_heater.py +82 -0
  332. opentrons/protocol_engine/commands/heater_shaker/deactivate_shaker.py +84 -0
  333. opentrons/protocol_engine/commands/heater_shaker/open_labware_latch.py +110 -0
  334. opentrons/protocol_engine/commands/heater_shaker/set_and_wait_for_shake_speed.py +125 -0
  335. opentrons/protocol_engine/commands/heater_shaker/set_target_temperature.py +90 -0
  336. opentrons/protocol_engine/commands/heater_shaker/wait_for_temperature.py +102 -0
  337. opentrons/protocol_engine/commands/home.py +100 -0
  338. opentrons/protocol_engine/commands/identify_module.py +86 -0
  339. opentrons/protocol_engine/commands/labware_handling_common.py +29 -0
  340. opentrons/protocol_engine/commands/liquid_probe.py +464 -0
  341. opentrons/protocol_engine/commands/load_labware.py +210 -0
  342. opentrons/protocol_engine/commands/load_lid.py +154 -0
  343. opentrons/protocol_engine/commands/load_lid_stack.py +272 -0
  344. opentrons/protocol_engine/commands/load_liquid.py +95 -0
  345. opentrons/protocol_engine/commands/load_liquid_class.py +144 -0
  346. opentrons/protocol_engine/commands/load_module.py +223 -0
  347. opentrons/protocol_engine/commands/load_pipette.py +167 -0
  348. opentrons/protocol_engine/commands/magnetic_module/__init__.py +32 -0
  349. opentrons/protocol_engine/commands/magnetic_module/disengage.py +97 -0
  350. opentrons/protocol_engine/commands/magnetic_module/engage.py +119 -0
  351. opentrons/protocol_engine/commands/move_labware.py +546 -0
  352. opentrons/protocol_engine/commands/move_relative.py +102 -0
  353. opentrons/protocol_engine/commands/move_to_addressable_area.py +176 -0
  354. opentrons/protocol_engine/commands/move_to_addressable_area_for_drop_tip.py +198 -0
  355. opentrons/protocol_engine/commands/move_to_coordinates.py +107 -0
  356. opentrons/protocol_engine/commands/move_to_well.py +119 -0
  357. opentrons/protocol_engine/commands/movement_common.py +338 -0
  358. opentrons/protocol_engine/commands/pick_up_tip.py +241 -0
  359. opentrons/protocol_engine/commands/pipetting_common.py +443 -0
  360. opentrons/protocol_engine/commands/prepare_to_aspirate.py +121 -0
  361. opentrons/protocol_engine/commands/pressure_dispense.py +155 -0
  362. opentrons/protocol_engine/commands/reload_labware.py +90 -0
  363. opentrons/protocol_engine/commands/retract_axis.py +75 -0
  364. opentrons/protocol_engine/commands/robot/__init__.py +70 -0
  365. opentrons/protocol_engine/commands/robot/close_gripper_jaw.py +96 -0
  366. opentrons/protocol_engine/commands/robot/common.py +18 -0
  367. opentrons/protocol_engine/commands/robot/move_axes_relative.py +101 -0
  368. opentrons/protocol_engine/commands/robot/move_axes_to.py +100 -0
  369. opentrons/protocol_engine/commands/robot/move_to.py +94 -0
  370. opentrons/protocol_engine/commands/robot/open_gripper_jaw.py +86 -0
  371. opentrons/protocol_engine/commands/save_position.py +109 -0
  372. opentrons/protocol_engine/commands/seal_pipette_to_tip.py +353 -0
  373. opentrons/protocol_engine/commands/set_rail_lights.py +67 -0
  374. opentrons/protocol_engine/commands/set_status_bar.py +89 -0
  375. opentrons/protocol_engine/commands/temperature_module/__init__.py +46 -0
  376. opentrons/protocol_engine/commands/temperature_module/deactivate.py +86 -0
  377. opentrons/protocol_engine/commands/temperature_module/set_target_temperature.py +97 -0
  378. opentrons/protocol_engine/commands/temperature_module/wait_for_temperature.py +104 -0
  379. opentrons/protocol_engine/commands/thermocycler/__init__.py +152 -0
  380. opentrons/protocol_engine/commands/thermocycler/close_lid.py +87 -0
  381. opentrons/protocol_engine/commands/thermocycler/deactivate_block.py +80 -0
  382. opentrons/protocol_engine/commands/thermocycler/deactivate_lid.py +80 -0
  383. opentrons/protocol_engine/commands/thermocycler/open_lid.py +87 -0
  384. opentrons/protocol_engine/commands/thermocycler/run_extended_profile.py +171 -0
  385. opentrons/protocol_engine/commands/thermocycler/run_profile.py +124 -0
  386. opentrons/protocol_engine/commands/thermocycler/set_target_block_temperature.py +140 -0
  387. opentrons/protocol_engine/commands/thermocycler/set_target_lid_temperature.py +100 -0
  388. opentrons/protocol_engine/commands/thermocycler/wait_for_block_temperature.py +93 -0
  389. opentrons/protocol_engine/commands/thermocycler/wait_for_lid_temperature.py +89 -0
  390. opentrons/protocol_engine/commands/touch_tip.py +189 -0
  391. opentrons/protocol_engine/commands/unsafe/__init__.py +161 -0
  392. opentrons/protocol_engine/commands/unsafe/unsafe_blow_out_in_place.py +100 -0
  393. opentrons/protocol_engine/commands/unsafe/unsafe_drop_tip_in_place.py +121 -0
  394. opentrons/protocol_engine/commands/unsafe/unsafe_engage_axes.py +82 -0
  395. opentrons/protocol_engine/commands/unsafe/unsafe_place_labware.py +208 -0
  396. opentrons/protocol_engine/commands/unsafe/unsafe_stacker_close_latch.py +94 -0
  397. opentrons/protocol_engine/commands/unsafe/unsafe_stacker_manual_retrieve.py +295 -0
  398. opentrons/protocol_engine/commands/unsafe/unsafe_stacker_open_latch.py +91 -0
  399. opentrons/protocol_engine/commands/unsafe/unsafe_stacker_prepare_shuttle.py +136 -0
  400. opentrons/protocol_engine/commands/unsafe/unsafe_ungrip_labware.py +77 -0
  401. opentrons/protocol_engine/commands/unsafe/update_position_estimators.py +90 -0
  402. opentrons/protocol_engine/commands/unseal_pipette_from_tip.py +153 -0
  403. opentrons/protocol_engine/commands/verify_tip_presence.py +100 -0
  404. opentrons/protocol_engine/commands/wait_for_duration.py +76 -0
  405. opentrons/protocol_engine/commands/wait_for_resume.py +75 -0
  406. opentrons/protocol_engine/create_protocol_engine.py +193 -0
  407. opentrons/protocol_engine/engine_support.py +28 -0
  408. opentrons/protocol_engine/error_recovery_policy.py +81 -0
  409. opentrons/protocol_engine/errors/__init__.py +191 -0
  410. opentrons/protocol_engine/errors/error_occurrence.py +182 -0
  411. opentrons/protocol_engine/errors/exceptions.py +1308 -0
  412. opentrons/protocol_engine/execution/__init__.py +50 -0
  413. opentrons/protocol_engine/execution/command_executor.py +216 -0
  414. opentrons/protocol_engine/execution/create_queue_worker.py +102 -0
  415. opentrons/protocol_engine/execution/door_watcher.py +119 -0
  416. opentrons/protocol_engine/execution/equipment.py +819 -0
  417. opentrons/protocol_engine/execution/error_recovery_hardware_state_synchronizer.py +101 -0
  418. opentrons/protocol_engine/execution/gantry_mover.py +686 -0
  419. opentrons/protocol_engine/execution/hardware_stopper.py +147 -0
  420. opentrons/protocol_engine/execution/heater_shaker_movement_flagger.py +207 -0
  421. opentrons/protocol_engine/execution/labware_movement.py +297 -0
  422. opentrons/protocol_engine/execution/movement.py +349 -0
  423. opentrons/protocol_engine/execution/pipetting.py +607 -0
  424. opentrons/protocol_engine/execution/queue_worker.py +86 -0
  425. opentrons/protocol_engine/execution/rail_lights.py +25 -0
  426. opentrons/protocol_engine/execution/run_control.py +33 -0
  427. opentrons/protocol_engine/execution/status_bar.py +34 -0
  428. opentrons/protocol_engine/execution/thermocycler_movement_flagger.py +188 -0
  429. opentrons/protocol_engine/execution/thermocycler_plate_lifter.py +81 -0
  430. opentrons/protocol_engine/execution/tip_handler.py +550 -0
  431. opentrons/protocol_engine/labware_offset_standardization.py +194 -0
  432. opentrons/protocol_engine/notes/__init__.py +17 -0
  433. opentrons/protocol_engine/notes/notes.py +59 -0
  434. opentrons/protocol_engine/plugins.py +104 -0
  435. opentrons/protocol_engine/protocol_engine.py +683 -0
  436. opentrons/protocol_engine/resources/__init__.py +26 -0
  437. opentrons/protocol_engine/resources/deck_configuration_provider.py +232 -0
  438. opentrons/protocol_engine/resources/deck_data_provider.py +94 -0
  439. opentrons/protocol_engine/resources/file_provider.py +161 -0
  440. opentrons/protocol_engine/resources/fixture_validation.py +58 -0
  441. opentrons/protocol_engine/resources/labware_data_provider.py +106 -0
  442. opentrons/protocol_engine/resources/labware_validation.py +73 -0
  443. opentrons/protocol_engine/resources/model_utils.py +32 -0
  444. opentrons/protocol_engine/resources/module_data_provider.py +44 -0
  445. opentrons/protocol_engine/resources/ot3_validation.py +21 -0
  446. opentrons/protocol_engine/resources/pipette_data_provider.py +379 -0
  447. opentrons/protocol_engine/slot_standardization.py +128 -0
  448. opentrons/protocol_engine/state/__init__.py +1 -0
  449. opentrons/protocol_engine/state/_abstract_store.py +27 -0
  450. opentrons/protocol_engine/state/_axis_aligned_bounding_box.py +50 -0
  451. opentrons/protocol_engine/state/_labware_origin_math.py +636 -0
  452. opentrons/protocol_engine/state/_move_types.py +83 -0
  453. opentrons/protocol_engine/state/_well_math.py +193 -0
  454. opentrons/protocol_engine/state/addressable_areas.py +699 -0
  455. opentrons/protocol_engine/state/command_history.py +309 -0
  456. opentrons/protocol_engine/state/commands.py +1158 -0
  457. opentrons/protocol_engine/state/config.py +39 -0
  458. opentrons/protocol_engine/state/files.py +57 -0
  459. opentrons/protocol_engine/state/fluid_stack.py +138 -0
  460. opentrons/protocol_engine/state/geometry.py +2359 -0
  461. opentrons/protocol_engine/state/inner_well_math_utils.py +548 -0
  462. opentrons/protocol_engine/state/labware.py +1459 -0
  463. opentrons/protocol_engine/state/liquid_classes.py +82 -0
  464. opentrons/protocol_engine/state/liquids.py +73 -0
  465. opentrons/protocol_engine/state/module_substates/__init__.py +45 -0
  466. opentrons/protocol_engine/state/module_substates/absorbance_reader_substate.py +35 -0
  467. opentrons/protocol_engine/state/module_substates/flex_stacker_substate.py +112 -0
  468. opentrons/protocol_engine/state/module_substates/heater_shaker_module_substate.py +115 -0
  469. opentrons/protocol_engine/state/module_substates/magnetic_block_substate.py +17 -0
  470. opentrons/protocol_engine/state/module_substates/magnetic_module_substate.py +65 -0
  471. opentrons/protocol_engine/state/module_substates/temperature_module_substate.py +67 -0
  472. opentrons/protocol_engine/state/module_substates/thermocycler_module_substate.py +163 -0
  473. opentrons/protocol_engine/state/modules.py +1500 -0
  474. opentrons/protocol_engine/state/motion.py +373 -0
  475. opentrons/protocol_engine/state/pipettes.py +905 -0
  476. opentrons/protocol_engine/state/state.py +421 -0
  477. opentrons/protocol_engine/state/state_summary.py +36 -0
  478. opentrons/protocol_engine/state/tips.py +420 -0
  479. opentrons/protocol_engine/state/update_types.py +904 -0
  480. opentrons/protocol_engine/state/wells.py +290 -0
  481. opentrons/protocol_engine/types/__init__.py +308 -0
  482. opentrons/protocol_engine/types/automatic_tip_selection.py +39 -0
  483. opentrons/protocol_engine/types/command_annotations.py +53 -0
  484. opentrons/protocol_engine/types/deck_configuration.py +81 -0
  485. opentrons/protocol_engine/types/execution.py +96 -0
  486. opentrons/protocol_engine/types/hardware_passthrough.py +25 -0
  487. opentrons/protocol_engine/types/instrument.py +47 -0
  488. opentrons/protocol_engine/types/instrument_sensors.py +47 -0
  489. opentrons/protocol_engine/types/labware.py +131 -0
  490. opentrons/protocol_engine/types/labware_movement.py +22 -0
  491. opentrons/protocol_engine/types/labware_offset_location.py +111 -0
  492. opentrons/protocol_engine/types/labware_offset_vector.py +16 -0
  493. opentrons/protocol_engine/types/liquid.py +40 -0
  494. opentrons/protocol_engine/types/liquid_class.py +59 -0
  495. opentrons/protocol_engine/types/liquid_handling.py +13 -0
  496. opentrons/protocol_engine/types/liquid_level_detection.py +191 -0
  497. opentrons/protocol_engine/types/location.py +194 -0
  498. opentrons/protocol_engine/types/module.py +303 -0
  499. opentrons/protocol_engine/types/partial_tip_configuration.py +76 -0
  500. opentrons/protocol_engine/types/run_time_parameters.py +133 -0
  501. opentrons/protocol_engine/types/tip.py +18 -0
  502. opentrons/protocol_engine/types/util.py +21 -0
  503. opentrons/protocol_engine/types/well_position.py +124 -0
  504. opentrons/protocol_reader/__init__.py +37 -0
  505. opentrons/protocol_reader/extract_labware_definitions.py +66 -0
  506. opentrons/protocol_reader/file_format_validator.py +152 -0
  507. opentrons/protocol_reader/file_hasher.py +27 -0
  508. opentrons/protocol_reader/file_identifier.py +284 -0
  509. opentrons/protocol_reader/file_reader_writer.py +90 -0
  510. opentrons/protocol_reader/input_file.py +16 -0
  511. opentrons/protocol_reader/protocol_files_invalid_error.py +6 -0
  512. opentrons/protocol_reader/protocol_reader.py +188 -0
  513. opentrons/protocol_reader/protocol_source.py +124 -0
  514. opentrons/protocol_reader/role_analyzer.py +86 -0
  515. opentrons/protocol_runner/__init__.py +26 -0
  516. opentrons/protocol_runner/create_simulating_orchestrator.py +118 -0
  517. opentrons/protocol_runner/json_file_reader.py +55 -0
  518. opentrons/protocol_runner/json_translator.py +314 -0
  519. opentrons/protocol_runner/legacy_command_mapper.py +848 -0
  520. opentrons/protocol_runner/legacy_context_plugin.py +116 -0
  521. opentrons/protocol_runner/protocol_runner.py +530 -0
  522. opentrons/protocol_runner/python_protocol_wrappers.py +179 -0
  523. opentrons/protocol_runner/run_orchestrator.py +496 -0
  524. opentrons/protocol_runner/task_queue.py +95 -0
  525. opentrons/protocols/__init__.py +6 -0
  526. opentrons/protocols/advanced_control/__init__.py +0 -0
  527. opentrons/protocols/advanced_control/common.py +38 -0
  528. opentrons/protocols/advanced_control/mix.py +60 -0
  529. opentrons/protocols/advanced_control/transfers/__init__.py +0 -0
  530. opentrons/protocols/advanced_control/transfers/common.py +180 -0
  531. opentrons/protocols/advanced_control/transfers/transfer.py +972 -0
  532. opentrons/protocols/advanced_control/transfers/transfer_liquid_utils.py +231 -0
  533. opentrons/protocols/api_support/__init__.py +0 -0
  534. opentrons/protocols/api_support/constants.py +8 -0
  535. opentrons/protocols/api_support/deck_type.py +110 -0
  536. opentrons/protocols/api_support/definitions.py +18 -0
  537. opentrons/protocols/api_support/instrument.py +151 -0
  538. opentrons/protocols/api_support/labware_like.py +233 -0
  539. opentrons/protocols/api_support/tip_tracker.py +175 -0
  540. opentrons/protocols/api_support/types.py +32 -0
  541. opentrons/protocols/api_support/util.py +403 -0
  542. opentrons/protocols/bundle.py +89 -0
  543. opentrons/protocols/duration/__init__.py +4 -0
  544. opentrons/protocols/duration/errors.py +5 -0
  545. opentrons/protocols/duration/estimator.py +628 -0
  546. opentrons/protocols/execution/__init__.py +0 -0
  547. opentrons/protocols/execution/dev_types.py +181 -0
  548. opentrons/protocols/execution/errors.py +40 -0
  549. opentrons/protocols/execution/execute.py +84 -0
  550. opentrons/protocols/execution/execute_json_v3.py +275 -0
  551. opentrons/protocols/execution/execute_json_v4.py +359 -0
  552. opentrons/protocols/execution/execute_json_v5.py +28 -0
  553. opentrons/protocols/execution/execute_python.py +169 -0
  554. opentrons/protocols/execution/json_dispatchers.py +87 -0
  555. opentrons/protocols/execution/types.py +7 -0
  556. opentrons/protocols/geometry/__init__.py +0 -0
  557. opentrons/protocols/geometry/planning.py +297 -0
  558. opentrons/protocols/labware.py +312 -0
  559. opentrons/protocols/models/__init__.py +0 -0
  560. opentrons/protocols/models/json_protocol.py +679 -0
  561. opentrons/protocols/parameters/__init__.py +0 -0
  562. opentrons/protocols/parameters/csv_parameter_definition.py +77 -0
  563. opentrons/protocols/parameters/csv_parameter_interface.py +96 -0
  564. opentrons/protocols/parameters/exceptions.py +34 -0
  565. opentrons/protocols/parameters/parameter_definition.py +272 -0
  566. opentrons/protocols/parameters/types.py +17 -0
  567. opentrons/protocols/parameters/validation.py +267 -0
  568. opentrons/protocols/parse.py +671 -0
  569. opentrons/protocols/types.py +159 -0
  570. opentrons/py.typed +0 -0
  571. opentrons/resources/scripts/lpc21isp +0 -0
  572. opentrons/resources/smoothie-edge-8414642.hex +23010 -0
  573. opentrons/simulate.py +1065 -0
  574. opentrons/system/__init__.py +6 -0
  575. opentrons/system/camera.py +51 -0
  576. opentrons/system/log_control.py +59 -0
  577. opentrons/system/nmcli.py +856 -0
  578. opentrons/system/resin.py +24 -0
  579. opentrons/system/smoothie_update.py +15 -0
  580. opentrons/system/wifi.py +204 -0
  581. opentrons/tools/__init__.py +0 -0
  582. opentrons/tools/args_handler.py +22 -0
  583. opentrons/tools/write_pipette_memory.py +157 -0
  584. opentrons/types.py +618 -0
  585. opentrons/util/__init__.py +1 -0
  586. opentrons/util/async_helpers.py +166 -0
  587. opentrons/util/broker.py +84 -0
  588. opentrons/util/change_notifier.py +47 -0
  589. opentrons/util/entrypoint_util.py +278 -0
  590. opentrons/util/get_union_elements.py +26 -0
  591. opentrons/util/helpers.py +6 -0
  592. opentrons/util/linal.py +178 -0
  593. opentrons/util/logging_config.py +265 -0
  594. opentrons/util/logging_queue_handler.py +61 -0
  595. opentrons/util/performance_helpers.py +157 -0
  596. opentrons-8.6.0a1.dist-info/METADATA +37 -0
  597. opentrons-8.6.0a1.dist-info/RECORD +600 -0
  598. opentrons-8.6.0a1.dist-info/WHEEL +4 -0
  599. opentrons-8.6.0a1.dist-info/entry_points.txt +3 -0
  600. opentrons-8.6.0a1.dist-info/licenses/LICENSE +202 -0
@@ -0,0 +1,241 @@
1
+ """ProtocolEngine-based Well core implementations."""
2
+ from typing import Optional, Union
3
+
4
+ from opentrons_shared_data.labware.constants import WELL_NAME_PATTERN
5
+
6
+ from opentrons.types import Point, Mount, MountType
7
+
8
+ from opentrons.protocol_engine import WellLocation, WellOrigin, WellOffset
9
+ from opentrons.protocol_engine import commands as cmd
10
+ from opentrons.protocol_engine.clients import SyncClient as EngineClient
11
+ from opentrons.protocols.api_support.util import UnsupportedAPIError
12
+ from opentrons.protocol_engine.types.liquid_level_detection import (
13
+ SimulatedProbeResult,
14
+ LiquidTrackingType,
15
+ )
16
+ from opentrons.protocol_engine.errors import PipetteNotAttachedError
17
+
18
+ from . import point_calculations
19
+ from . import stringify
20
+ from ..well import AbstractWellCore
21
+ from ..._liquid import Liquid
22
+
23
+
24
+ class WellCore(AbstractWellCore):
25
+ """Well API core using a ProtocolEngine.
26
+
27
+ Args:
28
+ name: The well's name in the labware, e.g. `A1`.
29
+ labware_id: The ProtocolEngine ID of the well's parent labware.
30
+ engine_client: Synchronous ProtocolEngine client.
31
+ """
32
+
33
+ def __init__(self, name: str, labware_id: str, engine_client: EngineClient) -> None:
34
+ self._labware_id = labware_id
35
+ self._engine_client = engine_client
36
+ self._definition = engine_client.state.labware.get_well_definition(
37
+ labware_id=labware_id, well_name=name
38
+ )
39
+
40
+ name_match = WELL_NAME_PATTERN.match(name)
41
+ self._name = name
42
+ self._row_name = name_match.group(1) if name_match is not None else ""
43
+ self._column_name = name_match.group(2) if name_match is not None else ""
44
+
45
+ @property
46
+ def labware_id(self) -> str:
47
+ """Get the ID of the well's parent labware."""
48
+ return self._labware_id
49
+
50
+ @property
51
+ def diameter(self) -> Optional[float]:
52
+ """Get the well's diameter, if circular."""
53
+ return (
54
+ self._definition.diameter if self._definition.shape == "circular" else None
55
+ )
56
+
57
+ @property
58
+ def length(self) -> Optional[float]:
59
+ """Get the well's length, if rectangular."""
60
+ return (
61
+ self._definition.xDimension
62
+ if self._definition.shape == "rectangular"
63
+ else None
64
+ )
65
+
66
+ @property
67
+ def width(self) -> Optional[float]:
68
+ """Get the well's width, if rectangular."""
69
+ return (
70
+ self._definition.yDimension
71
+ if self._definition.shape == "rectangular"
72
+ else None
73
+ )
74
+
75
+ @property
76
+ def depth(self) -> float:
77
+ """Get the well's depth."""
78
+ return self._definition.depth
79
+
80
+ def has_tip(self) -> bool:
81
+ """Whether the well contains a tip."""
82
+ return self._engine_client.state.tips.has_clean_tip(
83
+ self._labware_id, self._name
84
+ )
85
+
86
+ def set_has_tip(self, value: bool) -> None:
87
+ """Set the well as containing or not containing a tip."""
88
+ raise UnsupportedAPIError(
89
+ api_element="Manually setting the tip state of a well in a tip rack",
90
+ )
91
+
92
+ def get_display_name(self) -> str:
93
+ """Get the full display name of the well (e.g. "A1 of Some Labware on 5")."""
94
+ return stringify.well(
95
+ engine_client=self._engine_client,
96
+ well_name=self._name,
97
+ labware_id=self._labware_id,
98
+ )
99
+
100
+ def get_name(self) -> str:
101
+ """Get the name of the well (e.g. "A1")."""
102
+ return self._name
103
+
104
+ def get_column_name(self) -> str:
105
+ """Get the column portion of the well name (e.g. "1")."""
106
+ return self._column_name
107
+
108
+ def get_row_name(self) -> str:
109
+ """Get the row portion of the well name (e.g. "A")."""
110
+ return self._row_name
111
+
112
+ def get_max_volume(self) -> float:
113
+ """Get the well's maximum liquid volume."""
114
+ return self._definition.totalLiquidVolume
115
+
116
+ def get_top(self, z_offset: float) -> Point:
117
+ """Get the coordinate of the well's top, with a z-offset."""
118
+ return self._engine_client.state.geometry.get_well_position(
119
+ well_name=self._name,
120
+ labware_id=self._labware_id,
121
+ well_location=WellLocation(
122
+ origin=WellOrigin.TOP, offset=WellOffset(x=0, y=0, z=z_offset)
123
+ ),
124
+ )
125
+
126
+ def get_bottom(self, z_offset: float) -> Point:
127
+ """Get the coordinate of the well's bottom, with a z-offset."""
128
+ return self._engine_client.state.geometry.get_well_position(
129
+ well_name=self._name,
130
+ labware_id=self._labware_id,
131
+ well_location=WellLocation(
132
+ origin=WellOrigin.BOTTOM, offset=WellOffset(x=0, y=0, z=z_offset)
133
+ ),
134
+ )
135
+
136
+ def get_center(self) -> Point:
137
+ """Get the coordinate of the well's center."""
138
+ return self._engine_client.state.geometry.get_well_position(
139
+ well_name=self._name,
140
+ labware_id=self._labware_id,
141
+ well_location=WellLocation(origin=WellOrigin.CENTER),
142
+ )
143
+
144
+ def get_meniscus(self) -> Union[Point, SimulatedProbeResult]:
145
+ """Get the coordinate of the well's meniscus."""
146
+ current_liquid_height = self.current_liquid_height()
147
+ if isinstance(current_liquid_height, float):
148
+ return self.get_bottom(z_offset=current_liquid_height)
149
+ else:
150
+ return current_liquid_height
151
+
152
+ def load_liquid(
153
+ self,
154
+ liquid: Liquid,
155
+ volume: float,
156
+ ) -> None:
157
+ """Load liquid into a well.
158
+
159
+ If the well is known to be empty, use ``load_empty()`` instead of calling this with a 0.0 volume.
160
+ """
161
+ self._engine_client.execute_command(
162
+ cmd.LoadLiquidParams(
163
+ labwareId=self._labware_id,
164
+ liquidId=liquid._id,
165
+ volumeByWell={self._name: volume},
166
+ )
167
+ )
168
+
169
+ def from_center_cartesian(self, x: float, y: float, z: float) -> Point:
170
+ """Gets point in deck coordinates based on percentage of the radius of each axis."""
171
+ well_size = self._engine_client.state.labware.get_well_size(
172
+ labware_id=self.labware_id, well_name=self._name
173
+ )
174
+
175
+ return point_calculations.get_relative_offset(
176
+ point=self.get_center(),
177
+ size=well_size,
178
+ x_ratio=x,
179
+ y_ratio=y,
180
+ z_ratio=z,
181
+ )
182
+
183
+ def estimate_liquid_height_after_pipetting(
184
+ self,
185
+ mount: Mount | str,
186
+ operation_volume: float,
187
+ ) -> LiquidTrackingType:
188
+ """Return an estimate of liquid height after pipetting without raising an error."""
189
+ labware_id = self.labware_id
190
+ well_name = self._name
191
+ if isinstance(mount, Mount):
192
+ mount_type = MountType.from_hw_mount(mount)
193
+ else:
194
+ mount_type = MountType(mount)
195
+ pipette_from_mount = self._engine_client.state.pipettes.get_by_mount(mount_type)
196
+ if pipette_from_mount is None:
197
+ raise PipetteNotAttachedError(f"No pipette present on mount {mount}")
198
+ pipette_id = pipette_from_mount.id
199
+ starting_liquid_height = self.current_liquid_height()
200
+ projected_final_height = (
201
+ self._engine_client.state.geometry.get_well_height_after_liquid_handling(
202
+ labware_id=labware_id,
203
+ well_name=well_name,
204
+ pipette_id=pipette_id,
205
+ initial_height=starting_liquid_height,
206
+ volume=operation_volume,
207
+ )
208
+ )
209
+ return projected_final_height
210
+
211
+ def current_liquid_height(self) -> LiquidTrackingType:
212
+ """Return the current liquid height within a well."""
213
+ labware_id = self.labware_id
214
+ well_name = self._name
215
+ return self._engine_client.state.geometry.get_meniscus_height(
216
+ labware_id=labware_id, well_name=well_name
217
+ )
218
+
219
+ def get_liquid_volume(self) -> LiquidTrackingType:
220
+ """Return the current volume in a well."""
221
+ labware_id = self.labware_id
222
+ well_name = self._name
223
+ return self._engine_client.state.geometry.get_current_well_volume(
224
+ labware_id=labware_id, well_name=well_name
225
+ )
226
+
227
+ def height_from_volume(self, volume: LiquidTrackingType) -> LiquidTrackingType:
228
+ """Return the height in a well corresponding to a given volume."""
229
+ labware_id = self.labware_id
230
+ well_name = self._name
231
+ return self._engine_client.state.geometry.get_well_height_at_volume(
232
+ labware_id=labware_id, well_name=well_name, volume=volume
233
+ )
234
+
235
+ def volume_from_height(self, height: LiquidTrackingType) -> LiquidTrackingType:
236
+ """Return the volume contained in a well at any height."""
237
+ labware_id = self.labware_id
238
+ well_name = self._name
239
+ return self._engine_client.state.geometry.get_well_volume_at_height(
240
+ labware_id=labware_id, well_name=well_name, height=height
241
+ )
@@ -0,0 +1,459 @@
1
+ """The interface that implements InstrumentContext."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from abc import abstractmethod, ABC
6
+ from typing import Any, Generic, Optional, TypeVar, Union, List, Tuple, Literal
7
+
8
+ from opentrons import types
9
+ from opentrons.hardware_control.dev_types import PipetteDict
10
+ from opentrons.protocols.api_support.util import FlowRates
11
+ from opentrons.protocols.advanced_control.transfers.common import TransferTipPolicyV2
12
+ from opentrons.protocol_api._nozzle_layout import NozzleLayout
13
+ from opentrons.protocol_api._liquid import LiquidClass
14
+ from opentrons.protocol_engine.types import LiquidTrackingType
15
+
16
+ from ..disposal_locations import TrashBin, WasteChute
17
+ from .well import WellCoreType
18
+ from .labware import LabwareCoreType
19
+
20
+
21
+ class AbstractInstrument(ABC, Generic[WellCoreType, LabwareCoreType]):
22
+ @abstractmethod
23
+ def get_default_speed(self) -> float:
24
+ ...
25
+
26
+ @abstractmethod
27
+ def set_default_speed(self, speed: float) -> None:
28
+ ...
29
+
30
+ @abstractmethod
31
+ def air_gap_in_place(
32
+ self, volume: float, flow_rate: float, correction_volume: Optional[float] = None
33
+ ) -> None:
34
+ """Aspirate a given volume of air from the current location of the pipette.
35
+ Args:
36
+ volume: The volume of air to aspirate, in microliters.
37
+ flow_rate: The flow rate of air into the pipette, in microliters.
38
+ correction_volume: The correction volume in uL.
39
+ """
40
+
41
+ @abstractmethod
42
+ def aspirate(
43
+ self,
44
+ location: types.Location,
45
+ well_core: Optional[WellCoreType],
46
+ volume: float,
47
+ rate: float,
48
+ flow_rate: float,
49
+ in_place: bool,
50
+ meniscus_tracking: Optional[types.MeniscusTrackingTarget] = None,
51
+ correction_volume: Optional[float] = None,
52
+ ) -> None:
53
+ """Aspirate a given volume of liquid from the specified location.
54
+ Args:
55
+ volume: The volume of liquid to aspirate, in microliters.
56
+ location: The exact location to aspirate from.
57
+ well_core: The well to aspirate from, if applicable.
58
+ rate: The rate for how quickly to aspirate.
59
+ flow_rate: The flow rate in µL/s to aspirate at.
60
+ in_place: Whether this is in-place.
61
+ meniscus_tracking: Optional data about where to aspirate from.
62
+ correction_volume: The correction volume in uL
63
+ """
64
+ ...
65
+
66
+ @abstractmethod
67
+ def dispense(
68
+ self,
69
+ location: Union[types.Location, TrashBin, WasteChute],
70
+ well_core: Optional[WellCoreType],
71
+ volume: float,
72
+ rate: float,
73
+ flow_rate: float,
74
+ in_place: bool,
75
+ push_out: Optional[float],
76
+ meniscus_tracking: Optional[types.MeniscusTrackingTarget] = None,
77
+ correction_volume: Optional[float] = None,
78
+ ) -> None:
79
+ """Dispense a given volume of liquid into the specified location.
80
+ Args:
81
+ volume: The volume of liquid to dispense, in microliters.
82
+ location: The exact location to dispense to.
83
+ well_core: The well to dispense to, if applicable.
84
+ rate: The rate for how quickly to dispense.
85
+ flow_rate: The flow rate in µL/s to dispense at.
86
+ in_place: Whether this is in-place.
87
+ push_out: The amount to push the plunger below bottom position.
88
+ correction_volume: The correction volume in uL
89
+ meniscus_tracking: Optional data about where to dispense from.
90
+ """
91
+ ...
92
+
93
+ @abstractmethod
94
+ def blow_out(
95
+ self,
96
+ location: Union[types.Location, TrashBin, WasteChute],
97
+ well_core: Optional[WellCoreType],
98
+ in_place: bool,
99
+ ) -> None:
100
+ """Blow liquid out of the tip.
101
+
102
+ Args:
103
+ location: The location to blow out into.
104
+ well_core: The well to blow out into.
105
+ in_place: Whether this is in-place.
106
+ """
107
+ ...
108
+
109
+ @abstractmethod
110
+ def touch_tip(
111
+ self,
112
+ location: types.Location,
113
+ well_core: WellCoreType,
114
+ radius: float,
115
+ z_offset: float,
116
+ speed: float,
117
+ mm_from_edge: Optional[float] = None,
118
+ ) -> None:
119
+ ...
120
+
121
+ @abstractmethod
122
+ def pick_up_tip(
123
+ self,
124
+ location: types.Location,
125
+ well_core: WellCoreType,
126
+ presses: Optional[int],
127
+ increment: Optional[float],
128
+ prep_after: bool = True,
129
+ ) -> None:
130
+ """Move to and pick up a tip from a given well.
131
+
132
+ Args:
133
+ location: The location of the well we're picking up from.
134
+ well_core: The well to pick up from.
135
+ presses: Customize the number of presses the pipette does.
136
+ increment: Customize the movement "distance" of the pipette to press harder.
137
+ prep_after: Move plunger to the "ready to aspirate" position after pick up.
138
+ """
139
+ ...
140
+
141
+ @abstractmethod
142
+ def drop_tip(
143
+ self,
144
+ location: Optional[types.Location],
145
+ well_core: WellCoreType,
146
+ home_after: Optional[bool],
147
+ alternate_drop_location: Optional[bool] = False,
148
+ ) -> None:
149
+ """Move to and drop a tip into a given well.
150
+
151
+ Args:
152
+ location: The location of the well we're dropping to.
153
+ If unspecified, the default drop location of the well will be used.
154
+ well_core: The well we're dropping into
155
+ home_after: Whether to home the pipette after the tip is dropped.
156
+ alternate_drop_location: Whether to randomize the exact location to drop tip
157
+ within the specified well.
158
+ """
159
+ ...
160
+
161
+ @abstractmethod
162
+ def drop_tip_in_disposal_location(
163
+ self,
164
+ disposal_location: Union[TrashBin, WasteChute],
165
+ home_after: Optional[bool],
166
+ alternate_tip_drop: bool = False,
167
+ ) -> None:
168
+ """Move to and drop tip into a TrashBin or WasteChute.
169
+
170
+ Args:
171
+ disposal_location: The disposal location object we're dropping to.
172
+ home_after: Whether to home the pipette after the tip is dropped.
173
+ alternate_tip_drop: Whether to alternate tip drop location in a trash bin.
174
+ """
175
+ ...
176
+
177
+ @abstractmethod
178
+ def home(self) -> None:
179
+ ...
180
+
181
+ @abstractmethod
182
+ def home_plunger(self) -> None:
183
+ ...
184
+
185
+ @abstractmethod
186
+ def move_to(
187
+ self,
188
+ location: Union[types.Location, TrashBin, WasteChute],
189
+ well_core: Optional[WellCoreType],
190
+ force_direct: bool,
191
+ minimum_z_height: Optional[float],
192
+ speed: Optional[float],
193
+ check_for_movement_conflicts: bool,
194
+ ) -> None:
195
+ ...
196
+
197
+ @abstractmethod
198
+ def resin_tip_seal(
199
+ self,
200
+ location: types.Location,
201
+ well_core: WellCoreType,
202
+ in_place: Optional[bool] = False,
203
+ ) -> None:
204
+ ...
205
+
206
+ @abstractmethod
207
+ def resin_tip_unseal(
208
+ self,
209
+ location: types.Location | None,
210
+ well_core: WellCoreType,
211
+ ) -> None:
212
+ ...
213
+
214
+ @abstractmethod
215
+ def resin_tip_dispense(
216
+ self,
217
+ location: types.Location,
218
+ well_core: WellCoreType,
219
+ volume: Optional[float] = None,
220
+ flow_rate: Optional[float] = None,
221
+ ) -> None:
222
+ ...
223
+
224
+ @abstractmethod
225
+ def get_mount(self) -> types.Mount:
226
+ ...
227
+
228
+ @abstractmethod
229
+ def get_pipette_name(self) -> str:
230
+ ...
231
+
232
+ @abstractmethod
233
+ def get_model(self) -> str:
234
+ ...
235
+
236
+ @abstractmethod
237
+ def get_display_name(self) -> str:
238
+ ...
239
+
240
+ @abstractmethod
241
+ def get_min_volume(self) -> float:
242
+ ...
243
+
244
+ @abstractmethod
245
+ def get_max_volume(self) -> float:
246
+ ...
247
+
248
+ @abstractmethod
249
+ def get_working_volume(self) -> float:
250
+ ...
251
+
252
+ @abstractmethod
253
+ def get_current_volume(self) -> float:
254
+ ...
255
+
256
+ @abstractmethod
257
+ def get_has_clean_tip(self) -> bool:
258
+ ...
259
+
260
+ @abstractmethod
261
+ def get_available_volume(self) -> float:
262
+ ...
263
+
264
+ @abstractmethod
265
+ def get_minimum_liquid_sense_height(self) -> float:
266
+ ...
267
+
268
+ @abstractmethod
269
+ def get_hardware_state(self) -> PipetteDict:
270
+ """Get the current state of the pipette hardware as a dictionary."""
271
+ ...
272
+
273
+ @abstractmethod
274
+ def get_channels(self) -> int:
275
+ ...
276
+
277
+ @abstractmethod
278
+ def get_active_channels(self) -> int:
279
+ ...
280
+
281
+ @abstractmethod
282
+ def get_nozzle_map(self) -> types.NozzleMapInterface:
283
+ ...
284
+
285
+ @abstractmethod
286
+ def has_tip(self) -> bool:
287
+ ...
288
+
289
+ @abstractmethod
290
+ def get_return_height(self) -> float:
291
+ ...
292
+
293
+ @abstractmethod
294
+ def get_flow_rate(self) -> FlowRates:
295
+ ...
296
+
297
+ @abstractmethod
298
+ def get_aspirate_flow_rate(self, rate: float = 1.0) -> float:
299
+ ...
300
+
301
+ @abstractmethod
302
+ def get_dispense_flow_rate(self, rate: float = 1.0) -> float:
303
+ ...
304
+
305
+ @abstractmethod
306
+ def get_blow_out_flow_rate(self, rate: float = 1.0) -> float:
307
+ ...
308
+
309
+ @abstractmethod
310
+ def get_liquid_presence_detection(self) -> bool:
311
+ ...
312
+
313
+ @abstractmethod
314
+ def get_tip_origin(
315
+ self,
316
+ ) -> Optional[Tuple[LabwareCoreType, WellCoreType]]:
317
+ ...
318
+
319
+ @abstractmethod
320
+ def _pressure_supported_by_pipette(self) -> bool:
321
+ ...
322
+
323
+ @abstractmethod
324
+ def set_liquid_presence_detection(self, enable: bool) -> None:
325
+ ...
326
+
327
+ @abstractmethod
328
+ def set_flow_rate(
329
+ self,
330
+ aspirate: Optional[float] = None,
331
+ dispense: Optional[float] = None,
332
+ blow_out: Optional[float] = None,
333
+ ) -> None:
334
+ ...
335
+
336
+ @abstractmethod
337
+ def configure_for_volume(self, volume: float) -> None:
338
+ """Configure the pipette for a specific volume.
339
+
340
+ Args:
341
+ volume: The volume to prepare to handle.
342
+ """
343
+ ...
344
+
345
+ @abstractmethod
346
+ def prepare_to_aspirate(self) -> None:
347
+ """Prepare the pipette to aspirate."""
348
+ ...
349
+
350
+ @abstractmethod
351
+ def configure_nozzle_layout(
352
+ self,
353
+ style: NozzleLayout,
354
+ primary_nozzle: Optional[str],
355
+ front_right_nozzle: Optional[str],
356
+ back_left_nozzle: Optional[str],
357
+ ) -> None:
358
+ """Configure the pipette to a specific nozzle layout.
359
+
360
+ Args:
361
+ style: The type of configuration you wish to build.
362
+ primary_nozzle: The nozzle that will determine a pipette's critical point.
363
+ front_right_nozzle: The front right most nozzle in the requested layout.
364
+ back_left_nozzle: The back left most nozzle in the requested layout.
365
+ """
366
+ ...
367
+
368
+ @abstractmethod
369
+ def transfer_with_liquid_class(
370
+ self,
371
+ liquid_class: LiquidClass,
372
+ volume: float,
373
+ source: List[Tuple[types.Location, WellCoreType]],
374
+ dest: Union[List[Tuple[types.Location, WellCoreType]], TrashBin, WasteChute],
375
+ new_tip: TransferTipPolicyV2,
376
+ tip_racks: List[Tuple[types.Location, LabwareCoreType]],
377
+ starting_tip: Optional[WellCoreType],
378
+ trash_location: Union[types.Location, TrashBin, WasteChute],
379
+ return_tip: bool,
380
+ keep_last_tip: bool,
381
+ ) -> None:
382
+ """Transfer a liquid from source to dest according to liquid class properties."""
383
+ ...
384
+
385
+ @abstractmethod
386
+ def distribute_with_liquid_class(
387
+ self,
388
+ liquid_class: LiquidClass,
389
+ volume: float,
390
+ source: Tuple[types.Location, WellCoreType],
391
+ dest: List[Tuple[types.Location, WellCoreType]],
392
+ new_tip: Literal[TransferTipPolicyV2.NEVER, TransferTipPolicyV2.ONCE],
393
+ tip_racks: List[Tuple[types.Location, LabwareCoreType]],
394
+ starting_tip: Optional[WellCoreType],
395
+ trash_location: Union[types.Location, TrashBin, WasteChute],
396
+ return_tip: bool,
397
+ keep_last_tip: bool,
398
+ ) -> None:
399
+ """
400
+ Distribute a liquid from single source to multiple destinations
401
+ according to liquid class properties.
402
+ """
403
+ ...
404
+
405
+ @abstractmethod
406
+ def consolidate_with_liquid_class(
407
+ self,
408
+ liquid_class: LiquidClass,
409
+ volume: float,
410
+ source: List[Tuple[types.Location, WellCoreType]],
411
+ dest: Union[Tuple[types.Location, WellCoreType], TrashBin, WasteChute],
412
+ new_tip: Literal[TransferTipPolicyV2.NEVER, TransferTipPolicyV2.ONCE],
413
+ tip_racks: List[Tuple[types.Location, LabwareCoreType]],
414
+ starting_tip: Optional[WellCoreType],
415
+ trash_location: Union[types.Location, TrashBin, WasteChute],
416
+ return_tip: bool,
417
+ keep_last_tip: bool,
418
+ ) -> None:
419
+ """
420
+ Consolidate liquid from multiple sources to a single destination
421
+ using the specified liquid class properties.
422
+ """
423
+ ...
424
+
425
+ @abstractmethod
426
+ def is_tip_tracking_available(self) -> bool:
427
+ """Return whether auto tip tracking is available for the pipette's current nozzle configuration."""
428
+
429
+ @abstractmethod
430
+ def retract(self) -> None:
431
+ """Retract this instrument to the top of the gantry."""
432
+ ...
433
+
434
+ @abstractmethod
435
+ def detect_liquid_presence(
436
+ self, well_core: WellCoreType, loc: types.Location
437
+ ) -> bool:
438
+ """Do a liquid probe to detect whether there is liquid in the well."""
439
+
440
+ @abstractmethod
441
+ def liquid_probe_with_recovery(
442
+ self, well_core: WellCoreType, loc: types.Location
443
+ ) -> None:
444
+ """Do a liquid probe to detect the presence of liquid in the well."""
445
+ ...
446
+
447
+ @abstractmethod
448
+ def liquid_probe_without_recovery(
449
+ self, well_core: WellCoreType, loc: types.Location
450
+ ) -> LiquidTrackingType:
451
+ """Do a liquid probe to find the level of the liquid in the well."""
452
+ ...
453
+
454
+ @abstractmethod
455
+ def nozzle_configuration_valid_for_lld(self) -> bool:
456
+ """Check if the nozzle configuration currently supports LLD."""
457
+
458
+
459
+ InstrumentCoreType = TypeVar("InstrumentCoreType", bound=AbstractInstrument[Any, Any])