opentrons 8.6.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of opentrons might be problematic. Click here for more details.

Files changed (601) 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 +557 -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 +187 -0
  45. opentrons/drivers/asyncio/communication/errors.py +88 -0
  46. opentrons/drivers/asyncio/communication/serial_connection.py +557 -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/scripts/update_module_fw.py +274 -0
  200. opentrons/hardware_control/simulator_setup.py +260 -0
  201. opentrons/hardware_control/thread_manager.py +431 -0
  202. opentrons/hardware_control/threaded_async_lock.py +97 -0
  203. opentrons/hardware_control/types.py +792 -0
  204. opentrons/hardware_control/util.py +234 -0
  205. opentrons/legacy_broker.py +53 -0
  206. opentrons/legacy_commands/__init__.py +1 -0
  207. opentrons/legacy_commands/commands.py +483 -0
  208. opentrons/legacy_commands/helpers.py +153 -0
  209. opentrons/legacy_commands/module_commands.py +276 -0
  210. opentrons/legacy_commands/protocol_commands.py +54 -0
  211. opentrons/legacy_commands/publisher.py +155 -0
  212. opentrons/legacy_commands/robot_commands.py +51 -0
  213. opentrons/legacy_commands/types.py +1186 -0
  214. opentrons/motion_planning/__init__.py +32 -0
  215. opentrons/motion_planning/adjacent_slots_getters.py +168 -0
  216. opentrons/motion_planning/deck_conflict.py +501 -0
  217. opentrons/motion_planning/errors.py +35 -0
  218. opentrons/motion_planning/types.py +42 -0
  219. opentrons/motion_planning/waypoints.py +218 -0
  220. opentrons/ordered_set.py +138 -0
  221. opentrons/protocol_api/__init__.py +105 -0
  222. opentrons/protocol_api/_liquid.py +157 -0
  223. opentrons/protocol_api/_liquid_properties.py +814 -0
  224. opentrons/protocol_api/_nozzle_layout.py +31 -0
  225. opentrons/protocol_api/_parameter_context.py +300 -0
  226. opentrons/protocol_api/_parameters.py +31 -0
  227. opentrons/protocol_api/_transfer_liquid_validation.py +108 -0
  228. opentrons/protocol_api/_types.py +43 -0
  229. opentrons/protocol_api/config.py +23 -0
  230. opentrons/protocol_api/core/__init__.py +23 -0
  231. opentrons/protocol_api/core/common.py +33 -0
  232. opentrons/protocol_api/core/core_map.py +74 -0
  233. opentrons/protocol_api/core/engine/__init__.py +22 -0
  234. opentrons/protocol_api/core/engine/_default_labware_versions.py +179 -0
  235. opentrons/protocol_api/core/engine/deck_conflict.py +400 -0
  236. opentrons/protocol_api/core/engine/exceptions.py +19 -0
  237. opentrons/protocol_api/core/engine/instrument.py +2391 -0
  238. opentrons/protocol_api/core/engine/labware.py +238 -0
  239. opentrons/protocol_api/core/engine/load_labware_params.py +73 -0
  240. opentrons/protocol_api/core/engine/module_core.py +1027 -0
  241. opentrons/protocol_api/core/engine/overlap_versions.py +20 -0
  242. opentrons/protocol_api/core/engine/pipette_movement_conflict.py +358 -0
  243. opentrons/protocol_api/core/engine/point_calculations.py +64 -0
  244. opentrons/protocol_api/core/engine/protocol.py +1153 -0
  245. opentrons/protocol_api/core/engine/robot.py +139 -0
  246. opentrons/protocol_api/core/engine/stringify.py +74 -0
  247. opentrons/protocol_api/core/engine/transfer_components_executor.py +1006 -0
  248. opentrons/protocol_api/core/engine/well.py +241 -0
  249. opentrons/protocol_api/core/instrument.py +459 -0
  250. opentrons/protocol_api/core/labware.py +151 -0
  251. opentrons/protocol_api/core/legacy/__init__.py +11 -0
  252. opentrons/protocol_api/core/legacy/_labware_geometry.py +37 -0
  253. opentrons/protocol_api/core/legacy/deck.py +369 -0
  254. opentrons/protocol_api/core/legacy/labware_offset_provider.py +108 -0
  255. opentrons/protocol_api/core/legacy/legacy_instrument_core.py +709 -0
  256. opentrons/protocol_api/core/legacy/legacy_labware_core.py +235 -0
  257. opentrons/protocol_api/core/legacy/legacy_module_core.py +592 -0
  258. opentrons/protocol_api/core/legacy/legacy_protocol_core.py +612 -0
  259. opentrons/protocol_api/core/legacy/legacy_well_core.py +162 -0
  260. opentrons/protocol_api/core/legacy/load_info.py +67 -0
  261. opentrons/protocol_api/core/legacy/module_geometry.py +547 -0
  262. opentrons/protocol_api/core/legacy/well_geometry.py +148 -0
  263. opentrons/protocol_api/core/legacy_simulator/__init__.py +16 -0
  264. opentrons/protocol_api/core/legacy_simulator/legacy_instrument_core.py +624 -0
  265. opentrons/protocol_api/core/legacy_simulator/legacy_protocol_core.py +85 -0
  266. opentrons/protocol_api/core/module.py +484 -0
  267. opentrons/protocol_api/core/protocol.py +311 -0
  268. opentrons/protocol_api/core/robot.py +51 -0
  269. opentrons/protocol_api/core/well.py +116 -0
  270. opentrons/protocol_api/core/well_grid.py +45 -0
  271. opentrons/protocol_api/create_protocol_context.py +177 -0
  272. opentrons/protocol_api/deck.py +223 -0
  273. opentrons/protocol_api/disposal_locations.py +244 -0
  274. opentrons/protocol_api/instrument_context.py +3272 -0
  275. opentrons/protocol_api/labware.py +1579 -0
  276. opentrons/protocol_api/module_contexts.py +1447 -0
  277. opentrons/protocol_api/module_validation_and_errors.py +61 -0
  278. opentrons/protocol_api/protocol_context.py +1688 -0
  279. opentrons/protocol_api/robot_context.py +303 -0
  280. opentrons/protocol_api/validation.py +761 -0
  281. opentrons/protocol_engine/__init__.py +155 -0
  282. opentrons/protocol_engine/actions/__init__.py +65 -0
  283. opentrons/protocol_engine/actions/action_dispatcher.py +30 -0
  284. opentrons/protocol_engine/actions/action_handler.py +13 -0
  285. opentrons/protocol_engine/actions/actions.py +302 -0
  286. opentrons/protocol_engine/actions/get_state_update.py +38 -0
  287. opentrons/protocol_engine/clients/__init__.py +5 -0
  288. opentrons/protocol_engine/clients/sync_client.py +174 -0
  289. opentrons/protocol_engine/clients/transports.py +197 -0
  290. opentrons/protocol_engine/commands/__init__.py +757 -0
  291. opentrons/protocol_engine/commands/absorbance_reader/__init__.py +61 -0
  292. opentrons/protocol_engine/commands/absorbance_reader/close_lid.py +154 -0
  293. opentrons/protocol_engine/commands/absorbance_reader/common.py +6 -0
  294. opentrons/protocol_engine/commands/absorbance_reader/initialize.py +151 -0
  295. opentrons/protocol_engine/commands/absorbance_reader/open_lid.py +154 -0
  296. opentrons/protocol_engine/commands/absorbance_reader/read.py +226 -0
  297. opentrons/protocol_engine/commands/air_gap_in_place.py +162 -0
  298. opentrons/protocol_engine/commands/aspirate.py +244 -0
  299. opentrons/protocol_engine/commands/aspirate_in_place.py +184 -0
  300. opentrons/protocol_engine/commands/aspirate_while_tracking.py +211 -0
  301. opentrons/protocol_engine/commands/blow_out.py +146 -0
  302. opentrons/protocol_engine/commands/blow_out_in_place.py +119 -0
  303. opentrons/protocol_engine/commands/calibration/__init__.py +60 -0
  304. opentrons/protocol_engine/commands/calibration/calibrate_gripper.py +166 -0
  305. opentrons/protocol_engine/commands/calibration/calibrate_module.py +117 -0
  306. opentrons/protocol_engine/commands/calibration/calibrate_pipette.py +96 -0
  307. opentrons/protocol_engine/commands/calibration/move_to_maintenance_position.py +156 -0
  308. opentrons/protocol_engine/commands/command.py +308 -0
  309. opentrons/protocol_engine/commands/command_unions.py +974 -0
  310. opentrons/protocol_engine/commands/comment.py +57 -0
  311. opentrons/protocol_engine/commands/configure_for_volume.py +108 -0
  312. opentrons/protocol_engine/commands/configure_nozzle_layout.py +115 -0
  313. opentrons/protocol_engine/commands/custom.py +67 -0
  314. opentrons/protocol_engine/commands/dispense.py +194 -0
  315. opentrons/protocol_engine/commands/dispense_in_place.py +179 -0
  316. opentrons/protocol_engine/commands/dispense_while_tracking.py +204 -0
  317. opentrons/protocol_engine/commands/drop_tip.py +232 -0
  318. opentrons/protocol_engine/commands/drop_tip_in_place.py +205 -0
  319. opentrons/protocol_engine/commands/flex_stacker/__init__.py +64 -0
  320. opentrons/protocol_engine/commands/flex_stacker/common.py +900 -0
  321. opentrons/protocol_engine/commands/flex_stacker/empty.py +293 -0
  322. opentrons/protocol_engine/commands/flex_stacker/fill.py +281 -0
  323. opentrons/protocol_engine/commands/flex_stacker/retrieve.py +339 -0
  324. opentrons/protocol_engine/commands/flex_stacker/set_stored_labware.py +328 -0
  325. opentrons/protocol_engine/commands/flex_stacker/store.py +339 -0
  326. opentrons/protocol_engine/commands/generate_command_schema.py +61 -0
  327. opentrons/protocol_engine/commands/get_next_tip.py +134 -0
  328. opentrons/protocol_engine/commands/get_tip_presence.py +87 -0
  329. opentrons/protocol_engine/commands/hash_command_params.py +38 -0
  330. opentrons/protocol_engine/commands/heater_shaker/__init__.py +102 -0
  331. opentrons/protocol_engine/commands/heater_shaker/close_labware_latch.py +83 -0
  332. opentrons/protocol_engine/commands/heater_shaker/deactivate_heater.py +82 -0
  333. opentrons/protocol_engine/commands/heater_shaker/deactivate_shaker.py +84 -0
  334. opentrons/protocol_engine/commands/heater_shaker/open_labware_latch.py +110 -0
  335. opentrons/protocol_engine/commands/heater_shaker/set_and_wait_for_shake_speed.py +125 -0
  336. opentrons/protocol_engine/commands/heater_shaker/set_target_temperature.py +90 -0
  337. opentrons/protocol_engine/commands/heater_shaker/wait_for_temperature.py +102 -0
  338. opentrons/protocol_engine/commands/home.py +100 -0
  339. opentrons/protocol_engine/commands/identify_module.py +86 -0
  340. opentrons/protocol_engine/commands/labware_handling_common.py +29 -0
  341. opentrons/protocol_engine/commands/liquid_probe.py +464 -0
  342. opentrons/protocol_engine/commands/load_labware.py +210 -0
  343. opentrons/protocol_engine/commands/load_lid.py +154 -0
  344. opentrons/protocol_engine/commands/load_lid_stack.py +272 -0
  345. opentrons/protocol_engine/commands/load_liquid.py +95 -0
  346. opentrons/protocol_engine/commands/load_liquid_class.py +144 -0
  347. opentrons/protocol_engine/commands/load_module.py +223 -0
  348. opentrons/protocol_engine/commands/load_pipette.py +167 -0
  349. opentrons/protocol_engine/commands/magnetic_module/__init__.py +32 -0
  350. opentrons/protocol_engine/commands/magnetic_module/disengage.py +97 -0
  351. opentrons/protocol_engine/commands/magnetic_module/engage.py +119 -0
  352. opentrons/protocol_engine/commands/move_labware.py +546 -0
  353. opentrons/protocol_engine/commands/move_relative.py +102 -0
  354. opentrons/protocol_engine/commands/move_to_addressable_area.py +176 -0
  355. opentrons/protocol_engine/commands/move_to_addressable_area_for_drop_tip.py +198 -0
  356. opentrons/protocol_engine/commands/move_to_coordinates.py +107 -0
  357. opentrons/protocol_engine/commands/move_to_well.py +119 -0
  358. opentrons/protocol_engine/commands/movement_common.py +338 -0
  359. opentrons/protocol_engine/commands/pick_up_tip.py +241 -0
  360. opentrons/protocol_engine/commands/pipetting_common.py +443 -0
  361. opentrons/protocol_engine/commands/prepare_to_aspirate.py +121 -0
  362. opentrons/protocol_engine/commands/pressure_dispense.py +155 -0
  363. opentrons/protocol_engine/commands/reload_labware.py +90 -0
  364. opentrons/protocol_engine/commands/retract_axis.py +75 -0
  365. opentrons/protocol_engine/commands/robot/__init__.py +70 -0
  366. opentrons/protocol_engine/commands/robot/close_gripper_jaw.py +96 -0
  367. opentrons/protocol_engine/commands/robot/common.py +18 -0
  368. opentrons/protocol_engine/commands/robot/move_axes_relative.py +101 -0
  369. opentrons/protocol_engine/commands/robot/move_axes_to.py +100 -0
  370. opentrons/protocol_engine/commands/robot/move_to.py +94 -0
  371. opentrons/protocol_engine/commands/robot/open_gripper_jaw.py +86 -0
  372. opentrons/protocol_engine/commands/save_position.py +109 -0
  373. opentrons/protocol_engine/commands/seal_pipette_to_tip.py +353 -0
  374. opentrons/protocol_engine/commands/set_rail_lights.py +67 -0
  375. opentrons/protocol_engine/commands/set_status_bar.py +89 -0
  376. opentrons/protocol_engine/commands/temperature_module/__init__.py +46 -0
  377. opentrons/protocol_engine/commands/temperature_module/deactivate.py +86 -0
  378. opentrons/protocol_engine/commands/temperature_module/set_target_temperature.py +97 -0
  379. opentrons/protocol_engine/commands/temperature_module/wait_for_temperature.py +104 -0
  380. opentrons/protocol_engine/commands/thermocycler/__init__.py +152 -0
  381. opentrons/protocol_engine/commands/thermocycler/close_lid.py +87 -0
  382. opentrons/protocol_engine/commands/thermocycler/deactivate_block.py +80 -0
  383. opentrons/protocol_engine/commands/thermocycler/deactivate_lid.py +80 -0
  384. opentrons/protocol_engine/commands/thermocycler/open_lid.py +87 -0
  385. opentrons/protocol_engine/commands/thermocycler/run_extended_profile.py +171 -0
  386. opentrons/protocol_engine/commands/thermocycler/run_profile.py +124 -0
  387. opentrons/protocol_engine/commands/thermocycler/set_target_block_temperature.py +140 -0
  388. opentrons/protocol_engine/commands/thermocycler/set_target_lid_temperature.py +100 -0
  389. opentrons/protocol_engine/commands/thermocycler/wait_for_block_temperature.py +93 -0
  390. opentrons/protocol_engine/commands/thermocycler/wait_for_lid_temperature.py +89 -0
  391. opentrons/protocol_engine/commands/touch_tip.py +189 -0
  392. opentrons/protocol_engine/commands/unsafe/__init__.py +161 -0
  393. opentrons/protocol_engine/commands/unsafe/unsafe_blow_out_in_place.py +100 -0
  394. opentrons/protocol_engine/commands/unsafe/unsafe_drop_tip_in_place.py +121 -0
  395. opentrons/protocol_engine/commands/unsafe/unsafe_engage_axes.py +82 -0
  396. opentrons/protocol_engine/commands/unsafe/unsafe_place_labware.py +208 -0
  397. opentrons/protocol_engine/commands/unsafe/unsafe_stacker_close_latch.py +94 -0
  398. opentrons/protocol_engine/commands/unsafe/unsafe_stacker_manual_retrieve.py +295 -0
  399. opentrons/protocol_engine/commands/unsafe/unsafe_stacker_open_latch.py +91 -0
  400. opentrons/protocol_engine/commands/unsafe/unsafe_stacker_prepare_shuttle.py +136 -0
  401. opentrons/protocol_engine/commands/unsafe/unsafe_ungrip_labware.py +77 -0
  402. opentrons/protocol_engine/commands/unsafe/update_position_estimators.py +90 -0
  403. opentrons/protocol_engine/commands/unseal_pipette_from_tip.py +153 -0
  404. opentrons/protocol_engine/commands/verify_tip_presence.py +100 -0
  405. opentrons/protocol_engine/commands/wait_for_duration.py +76 -0
  406. opentrons/protocol_engine/commands/wait_for_resume.py +75 -0
  407. opentrons/protocol_engine/create_protocol_engine.py +193 -0
  408. opentrons/protocol_engine/engine_support.py +28 -0
  409. opentrons/protocol_engine/error_recovery_policy.py +81 -0
  410. opentrons/protocol_engine/errors/__init__.py +191 -0
  411. opentrons/protocol_engine/errors/error_occurrence.py +182 -0
  412. opentrons/protocol_engine/errors/exceptions.py +1308 -0
  413. opentrons/protocol_engine/execution/__init__.py +50 -0
  414. opentrons/protocol_engine/execution/command_executor.py +216 -0
  415. opentrons/protocol_engine/execution/create_queue_worker.py +102 -0
  416. opentrons/protocol_engine/execution/door_watcher.py +119 -0
  417. opentrons/protocol_engine/execution/equipment.py +819 -0
  418. opentrons/protocol_engine/execution/error_recovery_hardware_state_synchronizer.py +101 -0
  419. opentrons/protocol_engine/execution/gantry_mover.py +686 -0
  420. opentrons/protocol_engine/execution/hardware_stopper.py +147 -0
  421. opentrons/protocol_engine/execution/heater_shaker_movement_flagger.py +207 -0
  422. opentrons/protocol_engine/execution/labware_movement.py +297 -0
  423. opentrons/protocol_engine/execution/movement.py +350 -0
  424. opentrons/protocol_engine/execution/pipetting.py +607 -0
  425. opentrons/protocol_engine/execution/queue_worker.py +86 -0
  426. opentrons/protocol_engine/execution/rail_lights.py +25 -0
  427. opentrons/protocol_engine/execution/run_control.py +33 -0
  428. opentrons/protocol_engine/execution/status_bar.py +34 -0
  429. opentrons/protocol_engine/execution/thermocycler_movement_flagger.py +188 -0
  430. opentrons/protocol_engine/execution/thermocycler_plate_lifter.py +81 -0
  431. opentrons/protocol_engine/execution/tip_handler.py +550 -0
  432. opentrons/protocol_engine/labware_offset_standardization.py +194 -0
  433. opentrons/protocol_engine/notes/__init__.py +17 -0
  434. opentrons/protocol_engine/notes/notes.py +59 -0
  435. opentrons/protocol_engine/plugins.py +104 -0
  436. opentrons/protocol_engine/protocol_engine.py +683 -0
  437. opentrons/protocol_engine/resources/__init__.py +26 -0
  438. opentrons/protocol_engine/resources/deck_configuration_provider.py +232 -0
  439. opentrons/protocol_engine/resources/deck_data_provider.py +94 -0
  440. opentrons/protocol_engine/resources/file_provider.py +161 -0
  441. opentrons/protocol_engine/resources/fixture_validation.py +68 -0
  442. opentrons/protocol_engine/resources/labware_data_provider.py +106 -0
  443. opentrons/protocol_engine/resources/labware_validation.py +73 -0
  444. opentrons/protocol_engine/resources/model_utils.py +32 -0
  445. opentrons/protocol_engine/resources/module_data_provider.py +44 -0
  446. opentrons/protocol_engine/resources/ot3_validation.py +21 -0
  447. opentrons/protocol_engine/resources/pipette_data_provider.py +379 -0
  448. opentrons/protocol_engine/slot_standardization.py +128 -0
  449. opentrons/protocol_engine/state/__init__.py +1 -0
  450. opentrons/protocol_engine/state/_abstract_store.py +27 -0
  451. opentrons/protocol_engine/state/_axis_aligned_bounding_box.py +50 -0
  452. opentrons/protocol_engine/state/_labware_origin_math.py +636 -0
  453. opentrons/protocol_engine/state/_move_types.py +83 -0
  454. opentrons/protocol_engine/state/_well_math.py +193 -0
  455. opentrons/protocol_engine/state/addressable_areas.py +699 -0
  456. opentrons/protocol_engine/state/command_history.py +309 -0
  457. opentrons/protocol_engine/state/commands.py +1164 -0
  458. opentrons/protocol_engine/state/config.py +39 -0
  459. opentrons/protocol_engine/state/files.py +57 -0
  460. opentrons/protocol_engine/state/fluid_stack.py +138 -0
  461. opentrons/protocol_engine/state/geometry.py +2408 -0
  462. opentrons/protocol_engine/state/inner_well_math_utils.py +548 -0
  463. opentrons/protocol_engine/state/labware.py +1432 -0
  464. opentrons/protocol_engine/state/liquid_classes.py +82 -0
  465. opentrons/protocol_engine/state/liquids.py +73 -0
  466. opentrons/protocol_engine/state/module_substates/__init__.py +45 -0
  467. opentrons/protocol_engine/state/module_substates/absorbance_reader_substate.py +35 -0
  468. opentrons/protocol_engine/state/module_substates/flex_stacker_substate.py +112 -0
  469. opentrons/protocol_engine/state/module_substates/heater_shaker_module_substate.py +115 -0
  470. opentrons/protocol_engine/state/module_substates/magnetic_block_substate.py +17 -0
  471. opentrons/protocol_engine/state/module_substates/magnetic_module_substate.py +65 -0
  472. opentrons/protocol_engine/state/module_substates/temperature_module_substate.py +67 -0
  473. opentrons/protocol_engine/state/module_substates/thermocycler_module_substate.py +163 -0
  474. opentrons/protocol_engine/state/modules.py +1515 -0
  475. opentrons/protocol_engine/state/motion.py +373 -0
  476. opentrons/protocol_engine/state/pipettes.py +905 -0
  477. opentrons/protocol_engine/state/state.py +421 -0
  478. opentrons/protocol_engine/state/state_summary.py +36 -0
  479. opentrons/protocol_engine/state/tips.py +420 -0
  480. opentrons/protocol_engine/state/update_types.py +904 -0
  481. opentrons/protocol_engine/state/wells.py +290 -0
  482. opentrons/protocol_engine/types/__init__.py +310 -0
  483. opentrons/protocol_engine/types/automatic_tip_selection.py +39 -0
  484. opentrons/protocol_engine/types/command_annotations.py +53 -0
  485. opentrons/protocol_engine/types/deck_configuration.py +81 -0
  486. opentrons/protocol_engine/types/execution.py +96 -0
  487. opentrons/protocol_engine/types/hardware_passthrough.py +25 -0
  488. opentrons/protocol_engine/types/instrument.py +47 -0
  489. opentrons/protocol_engine/types/instrument_sensors.py +47 -0
  490. opentrons/protocol_engine/types/labware.py +131 -0
  491. opentrons/protocol_engine/types/labware_movement.py +22 -0
  492. opentrons/protocol_engine/types/labware_offset_location.py +111 -0
  493. opentrons/protocol_engine/types/labware_offset_vector.py +16 -0
  494. opentrons/protocol_engine/types/liquid.py +40 -0
  495. opentrons/protocol_engine/types/liquid_class.py +59 -0
  496. opentrons/protocol_engine/types/liquid_handling.py +13 -0
  497. opentrons/protocol_engine/types/liquid_level_detection.py +191 -0
  498. opentrons/protocol_engine/types/location.py +194 -0
  499. opentrons/protocol_engine/types/module.py +310 -0
  500. opentrons/protocol_engine/types/partial_tip_configuration.py +76 -0
  501. opentrons/protocol_engine/types/run_time_parameters.py +133 -0
  502. opentrons/protocol_engine/types/tip.py +18 -0
  503. opentrons/protocol_engine/types/util.py +21 -0
  504. opentrons/protocol_engine/types/well_position.py +124 -0
  505. opentrons/protocol_reader/__init__.py +37 -0
  506. opentrons/protocol_reader/extract_labware_definitions.py +66 -0
  507. opentrons/protocol_reader/file_format_validator.py +152 -0
  508. opentrons/protocol_reader/file_hasher.py +27 -0
  509. opentrons/protocol_reader/file_identifier.py +284 -0
  510. opentrons/protocol_reader/file_reader_writer.py +90 -0
  511. opentrons/protocol_reader/input_file.py +16 -0
  512. opentrons/protocol_reader/protocol_files_invalid_error.py +6 -0
  513. opentrons/protocol_reader/protocol_reader.py +188 -0
  514. opentrons/protocol_reader/protocol_source.py +124 -0
  515. opentrons/protocol_reader/role_analyzer.py +86 -0
  516. opentrons/protocol_runner/__init__.py +26 -0
  517. opentrons/protocol_runner/create_simulating_orchestrator.py +118 -0
  518. opentrons/protocol_runner/json_file_reader.py +55 -0
  519. opentrons/protocol_runner/json_translator.py +314 -0
  520. opentrons/protocol_runner/legacy_command_mapper.py +852 -0
  521. opentrons/protocol_runner/legacy_context_plugin.py +116 -0
  522. opentrons/protocol_runner/protocol_runner.py +530 -0
  523. opentrons/protocol_runner/python_protocol_wrappers.py +179 -0
  524. opentrons/protocol_runner/run_orchestrator.py +496 -0
  525. opentrons/protocol_runner/task_queue.py +95 -0
  526. opentrons/protocols/__init__.py +6 -0
  527. opentrons/protocols/advanced_control/__init__.py +0 -0
  528. opentrons/protocols/advanced_control/common.py +38 -0
  529. opentrons/protocols/advanced_control/mix.py +60 -0
  530. opentrons/protocols/advanced_control/transfers/__init__.py +0 -0
  531. opentrons/protocols/advanced_control/transfers/common.py +180 -0
  532. opentrons/protocols/advanced_control/transfers/transfer.py +972 -0
  533. opentrons/protocols/advanced_control/transfers/transfer_liquid_utils.py +231 -0
  534. opentrons/protocols/api_support/__init__.py +0 -0
  535. opentrons/protocols/api_support/constants.py +8 -0
  536. opentrons/protocols/api_support/deck_type.py +110 -0
  537. opentrons/protocols/api_support/definitions.py +18 -0
  538. opentrons/protocols/api_support/instrument.py +151 -0
  539. opentrons/protocols/api_support/labware_like.py +233 -0
  540. opentrons/protocols/api_support/tip_tracker.py +175 -0
  541. opentrons/protocols/api_support/types.py +32 -0
  542. opentrons/protocols/api_support/util.py +403 -0
  543. opentrons/protocols/bundle.py +89 -0
  544. opentrons/protocols/duration/__init__.py +4 -0
  545. opentrons/protocols/duration/errors.py +5 -0
  546. opentrons/protocols/duration/estimator.py +628 -0
  547. opentrons/protocols/execution/__init__.py +0 -0
  548. opentrons/protocols/execution/dev_types.py +181 -0
  549. opentrons/protocols/execution/errors.py +40 -0
  550. opentrons/protocols/execution/execute.py +84 -0
  551. opentrons/protocols/execution/execute_json_v3.py +275 -0
  552. opentrons/protocols/execution/execute_json_v4.py +359 -0
  553. opentrons/protocols/execution/execute_json_v5.py +28 -0
  554. opentrons/protocols/execution/execute_python.py +169 -0
  555. opentrons/protocols/execution/json_dispatchers.py +87 -0
  556. opentrons/protocols/execution/types.py +7 -0
  557. opentrons/protocols/geometry/__init__.py +0 -0
  558. opentrons/protocols/geometry/planning.py +297 -0
  559. opentrons/protocols/labware.py +312 -0
  560. opentrons/protocols/models/__init__.py +0 -0
  561. opentrons/protocols/models/json_protocol.py +679 -0
  562. opentrons/protocols/parameters/__init__.py +0 -0
  563. opentrons/protocols/parameters/csv_parameter_definition.py +77 -0
  564. opentrons/protocols/parameters/csv_parameter_interface.py +96 -0
  565. opentrons/protocols/parameters/exceptions.py +34 -0
  566. opentrons/protocols/parameters/parameter_definition.py +272 -0
  567. opentrons/protocols/parameters/types.py +17 -0
  568. opentrons/protocols/parameters/validation.py +267 -0
  569. opentrons/protocols/parse.py +671 -0
  570. opentrons/protocols/types.py +159 -0
  571. opentrons/py.typed +0 -0
  572. opentrons/resources/scripts/lpc21isp +0 -0
  573. opentrons/resources/smoothie-edge-8414642.hex +23010 -0
  574. opentrons/simulate.py +1065 -0
  575. opentrons/system/__init__.py +6 -0
  576. opentrons/system/camera.py +51 -0
  577. opentrons/system/log_control.py +59 -0
  578. opentrons/system/nmcli.py +856 -0
  579. opentrons/system/resin.py +24 -0
  580. opentrons/system/smoothie_update.py +15 -0
  581. opentrons/system/wifi.py +204 -0
  582. opentrons/tools/__init__.py +0 -0
  583. opentrons/tools/args_handler.py +22 -0
  584. opentrons/tools/write_pipette_memory.py +157 -0
  585. opentrons/types.py +618 -0
  586. opentrons/util/__init__.py +1 -0
  587. opentrons/util/async_helpers.py +166 -0
  588. opentrons/util/broker.py +84 -0
  589. opentrons/util/change_notifier.py +47 -0
  590. opentrons/util/entrypoint_util.py +278 -0
  591. opentrons/util/get_union_elements.py +26 -0
  592. opentrons/util/helpers.py +6 -0
  593. opentrons/util/linal.py +178 -0
  594. opentrons/util/logging_config.py +265 -0
  595. opentrons/util/logging_queue_handler.py +61 -0
  596. opentrons/util/performance_helpers.py +157 -0
  597. opentrons-8.6.0.dist-info/METADATA +37 -0
  598. opentrons-8.6.0.dist-info/RECORD +601 -0
  599. opentrons-8.6.0.dist-info/WHEEL +4 -0
  600. opentrons-8.6.0.dist-info/entry_points.txt +3 -0
  601. opentrons-8.6.0.dist-info/licenses/LICENSE +202 -0
@@ -0,0 +1,290 @@
1
+ """Basic well data state and store."""
2
+
3
+ from dataclasses import dataclass
4
+ from typing import (
5
+ Dict,
6
+ List,
7
+ Union,
8
+ Iterator,
9
+ Optional,
10
+ Tuple,
11
+ overload,
12
+ )
13
+ from datetime import datetime
14
+
15
+ from opentrons.protocol_engine.types import (
16
+ ProbedHeightInfo,
17
+ ProbedVolumeInfo,
18
+ LoadedVolumeInfo,
19
+ WellInfoSummary,
20
+ WellLiquidInfo,
21
+ )
22
+ from opentrons.protocol_engine.types.liquid_level_detection import (
23
+ SimulatedProbeResult,
24
+ LiquidTrackingType,
25
+ )
26
+
27
+ from . import update_types
28
+ from ._abstract_store import HasState, HandlesActions
29
+ from ..actions import Action
30
+ from ..actions.get_state_update import get_state_updates
31
+
32
+
33
+ LabwareId = str
34
+ WellName = str
35
+
36
+
37
+ @dataclass
38
+ class WellState:
39
+ """State of all wells."""
40
+
41
+ loaded_volumes: Dict[LabwareId, Dict[WellName, LoadedVolumeInfo]]
42
+ probed_heights: Dict[LabwareId, Dict[WellName, ProbedHeightInfo]]
43
+ probed_volumes: Dict[LabwareId, Dict[WellName, ProbedVolumeInfo]]
44
+
45
+
46
+ class WellStore(HasState[WellState], HandlesActions):
47
+ """Well state container."""
48
+
49
+ _state: WellState
50
+
51
+ def __init__(self) -> None:
52
+ """Initialize a well store and its state."""
53
+ self._state = WellState(loaded_volumes={}, probed_heights={}, probed_volumes={})
54
+
55
+ def handle_action(self, action: Action) -> None:
56
+ """Modify state in reaction to an action."""
57
+ for state_update in get_state_updates(action):
58
+ if state_update.liquid_loaded != update_types.NO_CHANGE:
59
+ self._handle_liquid_loaded_update(state_update.liquid_loaded)
60
+ if state_update.liquid_probed != update_types.NO_CHANGE:
61
+ self._handle_liquid_probed_update(state_update.liquid_probed)
62
+ if state_update.liquid_operated != update_types.NO_CHANGE:
63
+ self._handle_liquid_operated_update(state_update.liquid_operated)
64
+
65
+ def _handle_liquid_loaded_update(
66
+ self, state_update: update_types.LiquidLoadedUpdate
67
+ ) -> None:
68
+ labware_id = state_update.labware_id
69
+ if labware_id not in self._state.loaded_volumes:
70
+ self._state.loaded_volumes[labware_id] = {}
71
+ for well, volume in state_update.volumes.items():
72
+ self._state.loaded_volumes[labware_id][well] = LoadedVolumeInfo(
73
+ volume=_none_from_clear(volume),
74
+ last_loaded=state_update.last_loaded,
75
+ operations_since_load=0,
76
+ )
77
+
78
+ def _handle_liquid_probed_update(
79
+ self, state_update: update_types.LiquidProbedUpdate
80
+ ) -> None:
81
+ labware_id = state_update.labware_id
82
+ well_name = state_update.well_name
83
+ if labware_id not in self._state.probed_heights:
84
+ self._state.probed_heights[labware_id] = {}
85
+ if labware_id not in self._state.probed_volumes:
86
+ self._state.probed_volumes[labware_id] = {}
87
+ self._state.probed_heights[labware_id][well_name] = ProbedHeightInfo(
88
+ height=_none_from_clear(state_update.height),
89
+ last_probed=state_update.last_probed,
90
+ )
91
+ self._state.probed_volumes[labware_id][well_name] = ProbedVolumeInfo(
92
+ volume=_none_from_clear(state_update.volume),
93
+ last_probed=state_update.last_probed,
94
+ operations_since_probe=0,
95
+ )
96
+
97
+ def _handle_liquid_operated_update(
98
+ self, state_update: update_types.LiquidOperatedUpdate
99
+ ) -> None:
100
+ for well_name in state_update.well_names:
101
+ self._handle_well_operated(
102
+ state_update.labware_id, well_name, state_update.volume_added
103
+ )
104
+
105
+ def _handle_well_operated(
106
+ self,
107
+ labware_id: str,
108
+ well_name: str,
109
+ volume_added: float | update_types.ClearType,
110
+ ) -> None:
111
+ if (
112
+ labware_id in self._state.loaded_volumes
113
+ and well_name in self._state.loaded_volumes[labware_id]
114
+ ):
115
+ if volume_added is update_types.CLEAR:
116
+ del self._state.loaded_volumes[labware_id][well_name]
117
+ else:
118
+ prev_loaded_vol_info = self._state.loaded_volumes[labware_id][well_name]
119
+ assert prev_loaded_vol_info.volume is not None, "volume info not loaded"
120
+ self._state.loaded_volumes[labware_id][well_name] = LoadedVolumeInfo(
121
+ volume=prev_loaded_vol_info.volume + volume_added,
122
+ last_loaded=prev_loaded_vol_info.last_loaded,
123
+ operations_since_load=prev_loaded_vol_info.operations_since_load
124
+ + 1,
125
+ )
126
+ if (
127
+ labware_id in self._state.probed_heights
128
+ and well_name in self._state.probed_heights[labware_id]
129
+ ):
130
+ del self._state.probed_heights[labware_id][well_name]
131
+ if (
132
+ labware_id in self._state.probed_volumes
133
+ and well_name in self._state.probed_volumes[labware_id]
134
+ ):
135
+ prev_probed_vol_info = self._state.probed_volumes[labware_id][well_name]
136
+ if volume_added is update_types.CLEAR:
137
+ del self._state.probed_volumes[labware_id][well_name]
138
+ elif isinstance(
139
+ prev_probed_vol_info.volume,
140
+ SimulatedProbeResult,
141
+ ):
142
+ prev_probed_vol_info.volume.simulate_probed_aspirate_dispense(
143
+ volume_added
144
+ )
145
+ self._state.probed_volumes[labware_id][well_name] = ProbedVolumeInfo(
146
+ volume=prev_probed_vol_info.volume,
147
+ last_probed=prev_probed_vol_info.last_probed,
148
+ operations_since_probe=prev_probed_vol_info.operations_since_probe
149
+ + 1,
150
+ )
151
+ return
152
+ else:
153
+ if prev_probed_vol_info.volume is None:
154
+ new_vol_info: float | None = None
155
+ else:
156
+ assert isinstance(prev_probed_vol_info.volume, float)
157
+ new_vol_info = prev_probed_vol_info.volume + volume_added
158
+ self._state.probed_volumes[labware_id][well_name] = ProbedVolumeInfo(
159
+ volume=new_vol_info,
160
+ last_probed=prev_probed_vol_info.last_probed,
161
+ operations_since_probe=prev_probed_vol_info.operations_since_probe
162
+ + 1,
163
+ )
164
+
165
+
166
+ class WellView:
167
+ """Read-only well state view."""
168
+
169
+ _state: WellState
170
+
171
+ def __init__(self, state: WellState) -> None:
172
+ """Initialize the computed view of well state.
173
+
174
+ Arguments:
175
+ state: Well state dataclass used for all calculations.
176
+ """
177
+ self._state = state
178
+
179
+ def get_well_liquid_info(self, labware_id: str, well_name: str) -> WellLiquidInfo:
180
+ """Return all the liquid info for a well."""
181
+ if (
182
+ labware_id not in self._state.loaded_volumes
183
+ or well_name not in self._state.loaded_volumes[labware_id]
184
+ ):
185
+ loaded_volume_info = None
186
+ else:
187
+ loaded_volume_info = self._state.loaded_volumes[labware_id][well_name]
188
+ if (
189
+ labware_id not in self._state.probed_heights
190
+ or well_name not in self._state.probed_heights[labware_id]
191
+ ):
192
+ probed_height_info = None
193
+ else:
194
+ probed_height_info = self._state.probed_heights[labware_id][well_name]
195
+ if (
196
+ labware_id not in self._state.probed_volumes
197
+ or well_name not in self._state.probed_volumes[labware_id]
198
+ ):
199
+ probed_volume_info = None
200
+ else:
201
+ probed_volume_info = self._state.probed_volumes[labware_id][well_name]
202
+ return WellLiquidInfo(
203
+ loaded_volume=loaded_volume_info,
204
+ probed_height=probed_height_info,
205
+ probed_volume=probed_volume_info,
206
+ )
207
+
208
+ def get_last_liquid_update(
209
+ self, labware_id: str, well_name: str
210
+ ) -> Optional[datetime]:
211
+ """Return the timestamp of the last load or probe done on the well."""
212
+ info = self.get_well_liquid_info(labware_id, well_name)
213
+ update_times: List[datetime] = []
214
+ if info.loaded_volume is not None and info.loaded_volume.volume is not None:
215
+ update_times.append(info.loaded_volume.last_loaded)
216
+ if info.probed_height is not None and info.probed_height.height is not None:
217
+ update_times.append(info.probed_height.last_probed)
218
+ if info.probed_volume is not None and info.probed_volume.volume is not None:
219
+ update_times.append(info.probed_volume.last_probed)
220
+ if len(update_times) > 0:
221
+ return max(update_times)
222
+ return None
223
+
224
+ def get_all(self) -> List[WellInfoSummary]:
225
+ """Get all well liquid info summaries."""
226
+
227
+ def _all_well_combos() -> Iterator[Tuple[str, str, str]]:
228
+ for labware, lv_wells in self._state.loaded_volumes.items():
229
+ for well_name in lv_wells.keys():
230
+ yield f"{labware}{well_name}", labware, well_name
231
+ for labware, ph_wells in self._state.probed_heights.items():
232
+ for well_name in ph_wells.keys():
233
+ yield f"{labware}{well_name}", labware, well_name
234
+ for labware, pv_wells in self._state.probed_volumes.items():
235
+ for well_name in pv_wells.keys():
236
+ yield f"{labware}{well_name}", labware, well_name
237
+
238
+ wells = {
239
+ key: (labware_id, well_name)
240
+ for key, labware_id, well_name in _all_well_combos()
241
+ }
242
+ return [
243
+ self._summarize_well(labware_id, well_name)
244
+ for labware_id, well_name in wells.values()
245
+ ]
246
+
247
+ def _summarize_well(self, labware_id: str, well_name: str) -> WellInfoSummary:
248
+ well_liquid_info = self.get_well_liquid_info(labware_id, well_name)
249
+ return WellInfoSummary(
250
+ labware_id=labware_id,
251
+ well_name=well_name,
252
+ loaded_volume=_volume_from_info(well_liquid_info.loaded_volume),
253
+ probed_volume=_volume_from_info(well_liquid_info.probed_volume),
254
+ probed_height=_height_from_info(well_liquid_info.probed_height),
255
+ )
256
+
257
+
258
+ @overload
259
+ def _volume_from_info(info: Optional[ProbedVolumeInfo]) -> Optional[float]:
260
+ ...
261
+
262
+
263
+ @overload
264
+ def _volume_from_info(info: Optional[LoadedVolumeInfo]) -> Optional[float]:
265
+ ...
266
+
267
+
268
+ def _volume_from_info(
269
+ info: Union[ProbedVolumeInfo, LoadedVolumeInfo, None],
270
+ ) -> Union[LiquidTrackingType, None]:
271
+ if info is None:
272
+ return None
273
+ return info.volume
274
+
275
+
276
+ def _height_from_info(
277
+ info: Optional[ProbedHeightInfo],
278
+ ) -> Union[LiquidTrackingType, None]:
279
+ if info is None:
280
+ return None
281
+ return info.height
282
+
283
+
284
+ def _none_from_clear(
285
+ inval: LiquidTrackingType | update_types.ClearType,
286
+ ) -> LiquidTrackingType | None:
287
+ if inval == update_types.CLEAR:
288
+ return None
289
+ assert isinstance(inval, (SimulatedProbeResult, float, int))
290
+ return inval
@@ -0,0 +1,310 @@
1
+ """Public protocol engine value types and models."""
2
+
3
+ from __future__ import annotations
4
+
5
+
6
+ from opentrons_shared_data.pipette.types import LabwareUri
7
+ from opentrons.hardware_control.modules import ModuleType
8
+
9
+
10
+ from .run_time_parameters import (
11
+ NumberParameter,
12
+ BooleanParameter,
13
+ EnumParameter,
14
+ CSVParameter,
15
+ RunTimeParameter,
16
+ PrimitiveRunTimeParamValuesType,
17
+ CSVRunTimeParamFilesType,
18
+ CSVRuntimeParamPaths,
19
+ FileInfo,
20
+ EnumChoice,
21
+ )
22
+
23
+ from .command_annotations import (
24
+ SecondOrderCommandAnnotation,
25
+ CustomCommandAnnotation,
26
+ CommandAnnotation,
27
+ )
28
+ from .partial_tip_configuration import (
29
+ AllNozzleLayoutConfiguration,
30
+ SingleNozzleLayoutConfiguration,
31
+ RowNozzleLayoutConfiguration,
32
+ ColumnNozzleLayoutConfiguration,
33
+ QuadrantNozzleLayoutConfiguration,
34
+ NozzleLayoutConfigurationType,
35
+ PRIMARY_NOZZLE_LITERAL,
36
+ )
37
+ from .automatic_tip_selection import NextTipInfo, NoTipReason, NoTipAvailable
38
+ from .instrument_sensors import InstrumentSensorId, TipPresenceStatus
39
+ from .deck_configuration import (
40
+ AddressableOffsetVector,
41
+ PotentialCutoutFixture,
42
+ AreaType,
43
+ AddressableArea,
44
+ DeckConfigurationType,
45
+ DeckType,
46
+ DeckLocationDefinition,
47
+ )
48
+ from .liquid_class import LiquidClassRecord, LiquidClassRecordWithId
49
+ from .module import (
50
+ ModuleModel,
51
+ TemperatureModuleModel,
52
+ MagneticModuleModel,
53
+ ThermocyclerModuleModel,
54
+ HeaterShakerModuleModel,
55
+ MagneticBlockModel,
56
+ AbsorbanceReaderModel,
57
+ FlexStackerModuleModel,
58
+ ModuleDimensions,
59
+ ModuleCalibrationPoint,
60
+ ModuleDefinition,
61
+ LoadedModule,
62
+ SpeedRange,
63
+ TemperatureRange,
64
+ HeaterShakerLatchStatus,
65
+ HeaterShakerMovementRestrictors,
66
+ ABSMeasureMode,
67
+ ModuleOffsetVector,
68
+ ModuleOffsetData,
69
+ StackerFillEmptyStrategy,
70
+ StackerStoredLabwareGroup,
71
+ StackerLabwareMovementStrategy,
72
+ )
73
+ from .location import (
74
+ DeckSlotLocation,
75
+ StagingSlotLocation,
76
+ AddressableAreaLocation,
77
+ ModuleLocation,
78
+ OnLabwareLocation,
79
+ OFF_DECK_LOCATION,
80
+ SYSTEM_LOCATION,
81
+ LabwareLocation,
82
+ OnDeckLabwareLocation,
83
+ NonStackedLocation,
84
+ DeckPoint,
85
+ InStackerHopperLocation,
86
+ OnLabwareLocationSequenceComponent,
87
+ OnModuleLocationSequenceComponent,
88
+ OnAddressableAreaLocationSequenceComponent,
89
+ NotOnDeckLocationSequenceComponent,
90
+ OnCutoutFixtureLocationSequenceComponent,
91
+ LabwareLocationSequence,
92
+ LoadableLabwareLocation,
93
+ labware_location_is_system,
94
+ labware_location_is_off_deck,
95
+ )
96
+ from .labware import (
97
+ OverlapOffset,
98
+ LabwareOffset,
99
+ LabwareOffsetCreate,
100
+ LegacyLabwareOffsetCreate,
101
+ LabwareOffsetCreateInternal,
102
+ LoadedLabware,
103
+ LabwareParentDefinition,
104
+ LabwareWellId,
105
+ )
106
+ from .liquid import HexColor, EmptyLiquidId, LiquidId, Liquid, FluidKind, AspiratedFluid
107
+ from .labware_offset_location import (
108
+ LegacyLabwareOffsetLocation,
109
+ LabwareOffsetLocationSequence,
110
+ OnLabwareOffsetLocationSequenceComponent,
111
+ OnModuleOffsetLocationSequenceComponent,
112
+ OnAddressableAreaOffsetLocationSequenceComponent,
113
+ LabwareOffsetLocationSequenceComponents,
114
+ )
115
+ from .labware_offset_vector import LabwareOffsetVector
116
+ from .well_position import (
117
+ WellOrigin,
118
+ PickUpTipWellOrigin,
119
+ DropTipWellOrigin,
120
+ WellOffset,
121
+ WellLocation,
122
+ LiquidHandlingWellLocation,
123
+ PickUpTipWellLocation,
124
+ DropTipWellLocation,
125
+ WellLocationType,
126
+ WellLocationFunction,
127
+ )
128
+ from .instrument import (
129
+ LoadedPipette,
130
+ CurrentAddressableArea,
131
+ CurrentWell,
132
+ CurrentPipetteLocation,
133
+ InstrumentOffsetVector,
134
+ )
135
+ from .execution import EngineStatus, PostRunHardwareState
136
+ from .liquid_level_detection import (
137
+ LoadedVolumeInfo,
138
+ ProbedHeightInfo,
139
+ ProbedVolumeInfo,
140
+ WellInfoSummary,
141
+ WellLiquidInfo,
142
+ LiquidTrackingType,
143
+ SimulatedProbeResult,
144
+ )
145
+ from .liquid_handling import FlowRates
146
+ from .labware_movement import LabwareMovementStrategy, LabwareMovementOffsetData
147
+ from .tip import TipGeometry
148
+ from .hardware_passthrough import MovementAxis, MotorAxis
149
+ from .util import Vec3f, Dimensions
150
+
151
+ __all__ = [
152
+ # Runtime parameters
153
+ "NumberParameter",
154
+ "BooleanParameter",
155
+ "EnumParameter",
156
+ "EnumChoice",
157
+ "CSVParameter",
158
+ "PrimitiveRunTimeParamValuesType",
159
+ "CSVRunTimeParamFilesType",
160
+ "CSVRuntimeParamPaths",
161
+ "FileInfo",
162
+ "RunTimeParameter",
163
+ # Command annotations
164
+ "SecondOrderCommandAnnotation",
165
+ "CustomCommandAnnotation",
166
+ "CommandAnnotation",
167
+ # Partial tip handling
168
+ "AllNozzleLayoutConfiguration",
169
+ "SingleNozzleLayoutConfiguration",
170
+ "RowNozzleLayoutConfiguration",
171
+ "ColumnNozzleLayoutConfiguration",
172
+ "QuadrantNozzleLayoutConfiguration",
173
+ "NozzleLayoutConfigurationType",
174
+ "PRIMARY_NOZZLE_LITERAL",
175
+ # Automatic tip selection
176
+ "NextTipInfo",
177
+ "NoTipReason",
178
+ "NoTipAvailable",
179
+ # Instrument sensors
180
+ "InstrumentSensorId",
181
+ "TipPresenceStatus",
182
+ # Deck configuration
183
+ "AddressableOffsetVector",
184
+ "PotentialCutoutFixture",
185
+ "AreaType",
186
+ "AddressableArea",
187
+ "DeckConfigurationType",
188
+ "DeckType",
189
+ "DeckLocationDefinition",
190
+ # Liquid classes
191
+ "LiquidClassRecord",
192
+ "LiquidClassRecordWithId",
193
+ # Modules
194
+ "ModuleModel",
195
+ "ModuleType",
196
+ "TemperatureModuleModel",
197
+ "MagneticModuleModel",
198
+ "ThermocyclerModuleModel",
199
+ "HeaterShakerModuleModel",
200
+ "MagneticBlockModel",
201
+ "AbsorbanceReaderModel",
202
+ "FlexStackerModuleModel",
203
+ "ModuleDimensions",
204
+ "ModuleCalibrationPoint",
205
+ "ModuleDefinition",
206
+ "LoadedModule",
207
+ "SpeedRange",
208
+ "TemperatureRange",
209
+ "HeaterShakerLatchStatus",
210
+ "HeaterShakerMovementRestrictors",
211
+ "ABSMeasureMode",
212
+ "ModuleOffsetVector",
213
+ "ModuleOffsetData",
214
+ "StackerFillEmptyStrategy",
215
+ "StackerStoredLabwareGroup",
216
+ "StackerLabwareMovementStrategy",
217
+ # Locations of things on deck
218
+ "DeckSlotLocation",
219
+ "StagingSlotLocation",
220
+ "AddressableAreaLocation",
221
+ "ModuleLocation",
222
+ "OnLabwareLocation",
223
+ "OFF_DECK_LOCATION",
224
+ "SYSTEM_LOCATION",
225
+ "LabwareLocation",
226
+ "OnDeckLabwareLocation",
227
+ "NonStackedLocation",
228
+ "DeckPoint",
229
+ "OffDeckLocationType",
230
+ "SystemLocationType",
231
+ "InStackerHopperLocation",
232
+ "OnLabwareLocationSequenceComponent",
233
+ "OnModuleLocationSequenceComponent",
234
+ "OnAddressableAreaLocationSequenceComponent",
235
+ "NotOnDeckLocationSequenceComponent",
236
+ "OnCutoutFixtureLocationSequenceComponent",
237
+ "LabwareLocationSequence",
238
+ "LoadableLabwareLocation",
239
+ "labware_location_is_off_deck",
240
+ "labware_location_is_system",
241
+ # Labware offset location
242
+ "LegacyLabwareOffsetLocation",
243
+ "LabwareOffsetLocationSequence",
244
+ "LabwareOffsetLocationSequenceComponents",
245
+ "OnLabwareOffsetLocationSequenceComponent",
246
+ "OnModuleOffsetLocationSequenceComponent",
247
+ "OnAddressableAreaOffsetLocationSequenceComponent",
248
+ # Labware offset vector
249
+ "LabwareOffsetVector",
250
+ # Labware
251
+ "OverlapOffset",
252
+ "LabwareOffset",
253
+ "LabwareOffsetCreate",
254
+ "LegacyLabwareOffsetCreate",
255
+ "LabwareOffsetCreateInternal",
256
+ "LoadedLabware",
257
+ "LabwareOffsetVector",
258
+ "LabwareParentDefinition",
259
+ "LabwareWellId",
260
+ # Liquids
261
+ "HexColor",
262
+ "EmptyLiquidId",
263
+ "LiquidId",
264
+ "Liquid",
265
+ "FluidKind",
266
+ "AspiratedFluid",
267
+ # Well locations
268
+ "WellOrigin",
269
+ "PickUpTipWellOrigin",
270
+ "DropTipWellOrigin",
271
+ "WellOffset",
272
+ "WellLocation",
273
+ "LiquidHandlingWellLocation",
274
+ "PickUpTipWellLocation",
275
+ "DropTipWellLocation",
276
+ "WellLocationType",
277
+ "WellLocationFunction",
278
+ # Execution
279
+ "EngineStatus",
280
+ "PostRunHardwareState",
281
+ # Instruments
282
+ "LoadedPipette",
283
+ "CurrentAddressableArea",
284
+ "CurrentWell",
285
+ "CurrentPipetteLocation",
286
+ "InstrumentOffsetVector",
287
+ # Liquid level detection types
288
+ "LoadedVolumeInfo",
289
+ "ProbedHeightInfo",
290
+ "ProbedVolumeInfo",
291
+ "WellInfoSummary",
292
+ "WellLiquidInfo",
293
+ "LiquidTrackingType",
294
+ "SimulatedProbeResult",
295
+ # Liquid handling
296
+ "FlowRates",
297
+ # Labware movement
298
+ "LabwareMovementStrategy",
299
+ "LabwareMovementOffsetData",
300
+ # Tips
301
+ "TipGeometry",
302
+ # Hardware passthrough
303
+ "MovementAxis",
304
+ "MotorAxis",
305
+ # Utility types
306
+ "Vec3f",
307
+ "Dimensions",
308
+ # Convenience re-export
309
+ "LabwareUri",
310
+ ]
@@ -0,0 +1,39 @@
1
+ """Protocol engine types dealing with automatic tip selection."""
2
+ from enum import Enum
3
+ from typing import Optional
4
+
5
+ from pydantic import (
6
+ BaseModel,
7
+ Field,
8
+ )
9
+
10
+
11
+ class NextTipInfo(BaseModel):
12
+ """Next available tip labware and well name data."""
13
+
14
+ labwareId: str = Field(
15
+ ...,
16
+ description="The labware ID of the tip rack where the next available tip(s) are located.",
17
+ )
18
+ tipStartingWell: str = Field(
19
+ ..., description="The (starting) well name of the next available tip(s)."
20
+ )
21
+
22
+
23
+ class NoTipReason(Enum):
24
+ """The cause of no tip being available for a pipette and tip rack(s)."""
25
+
26
+ NO_AVAILABLE_TIPS = "noAvailableTips"
27
+ STARTING_TIP_WITH_PARTIAL = "startingTipWithPartial"
28
+ INCOMPATIBLE_CONFIGURATION = "incompatibleConfiguration"
29
+
30
+
31
+ class NoTipAvailable(BaseModel):
32
+ """No available next tip data."""
33
+
34
+ noTipReason: NoTipReason = Field(
35
+ ..., description="The reason why no next available tip could be provided."
36
+ )
37
+ message: Optional[str] = Field(
38
+ None, description="Optional message explaining why a tip wasn't available."
39
+ )
@@ -0,0 +1,53 @@
1
+ """Protocol Engine types dealing with command annotations."""
2
+
3
+ from typing import List, Literal, Dict, Any, Optional, Union
4
+ from pydantic import (
5
+ ConfigDict,
6
+ BaseModel,
7
+ Field,
8
+ )
9
+
10
+
11
+ class BaseCommandAnnotation(BaseModel):
12
+ """Optional annotations for protocol engine commands."""
13
+
14
+ commandKeys: List[str] = Field(
15
+ ..., description="Command keys to which this annotation applies"
16
+ )
17
+ annotationType: str = Field(
18
+ ..., description="The type of annotation (for machine parsing)"
19
+ )
20
+
21
+
22
+ class SecondOrderCommandAnnotation(BaseCommandAnnotation):
23
+ """Annotates a group of atomic commands which were the direct result of a second order command.
24
+
25
+ Examples of second order commands would be transfer, consolidate, mix, etc.
26
+ """
27
+
28
+ annotationType: Literal["secondOrderCommand"] = "secondOrderCommand"
29
+ params: Dict[str, Any] = Field(
30
+ ...,
31
+ description="Key value pairs of the parameters passed to the second order command that this annotates.",
32
+ )
33
+ machineReadableName: str = Field(
34
+ ...,
35
+ description="The name of the second order command in the form that the generating software refers to it",
36
+ )
37
+ userSpecifiedName: Optional[str] = Field(
38
+ None, description="The optional user-specified name of the second order command"
39
+ )
40
+ userSpecifiedDescription: Optional[str] = Field(
41
+ None,
42
+ description="The optional user-specified description of the second order command",
43
+ )
44
+
45
+
46
+ class CustomCommandAnnotation(BaseCommandAnnotation):
47
+ """Annotates a group of atomic commands in some manner that Opentrons software does not anticipate or originate."""
48
+
49
+ annotationType: Literal["custom"] = "custom"
50
+ model_config = ConfigDict(extra="allow")
51
+
52
+
53
+ CommandAnnotation = Union[SecondOrderCommandAnnotation, CustomCommandAnnotation]