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,22 @@
1
+ """ProtocolEngine-based Protocol API implementation core."""
2
+ from typing_extensions import Final
3
+
4
+ from opentrons.protocols.api_support.types import APIVersion
5
+
6
+ from .protocol import ProtocolCore
7
+ from .instrument import InstrumentCore
8
+ from .labware import LabwareCore
9
+ from .module_core import ModuleCore
10
+ from .well import WellCore
11
+
12
+ ENGINE_CORE_API_VERSION: Final = APIVersion(2, 14)
13
+ SET_OFFSET_RESTORED_API_VERSION: Final = APIVersion(2, 18)
14
+
15
+ __all__ = [
16
+ "ENGINE_CORE_API_VERSION",
17
+ "ProtocolCore",
18
+ "InstrumentCore",
19
+ "LabwareCore",
20
+ "WellCore",
21
+ "ModuleCore",
22
+ ]
@@ -0,0 +1,179 @@
1
+ """The versions of standard labware that the Protocol API should load by default."""
2
+
3
+ from typing import TypeAlias
4
+ from opentrons.protocols.api_support.types import APIVersion
5
+
6
+
7
+ DefaultLabwareVersions: TypeAlias = dict[APIVersion, dict[str, int]]
8
+
9
+
10
+ # This:
11
+ #
12
+ # {
13
+ # APIVersion(2, 100): {
14
+ # "foo_well_plate": 3,
15
+ # },
16
+ # APIVersion(2, 105): {
17
+ # "foo_well_plate": 7
18
+ # }
19
+ # }
20
+ #
21
+ # Means this:
22
+ #
23
+ # apiLevels Load name Default labware version
24
+ # ----------------------------------------------------------
25
+ # <2.100 foo_well_plate 1
26
+ # >=2.100,<2.105 foo_well_plate 3
27
+ # >=2.105 foo_well_plate 7
28
+ # [any] [anything else] 1
29
+ DEFAULT_LABWARE_VERSIONS: DefaultLabwareVersions = {
30
+ APIVersion(2, 14): {
31
+ "armadillo_96_wellplate_200ul_pcr_full_skirt": 2,
32
+ "biorad_384_wellplate_50ul": 2,
33
+ "biorad_96_wellplate_200ul_pcr": 2,
34
+ "corning_12_wellplate_6.9ml_flat": 2,
35
+ "corning_24_wellplate_3.4ml_flat": 2,
36
+ "corning_384_wellplate_112ul_flat": 2,
37
+ "corning_48_wellplate_1.6ml_flat": 2,
38
+ "corning_6_wellplate_16.8ml_flat": 2,
39
+ "corning_96_wellplate_360ul_flat": 2,
40
+ "nest_1_reservoir_195ml": 2,
41
+ "nest_96_wellplate_100ul_pcr_full_skirt": 2,
42
+ "nest_96_wellplate_200ul_flat": 2,
43
+ "nest_96_wellplate_2ml_deep": 2,
44
+ "opentrons_24_aluminumblock_generic_2ml_screwcap": 2,
45
+ "opentrons_96_aluminumblock_generic_pcr_strip_200ul": 2,
46
+ "opentrons_96_wellplate_200ul_pcr_full_skirt": 2,
47
+ },
48
+ APIVersion(2, 23): {
49
+ "agilent_1_reservoir_290ml": 2,
50
+ "appliedbiosystemsmicroamp_384_wellplate_40ul": 2,
51
+ "armadillo_96_wellplate_200ul_pcr_full_skirt": 3,
52
+ "axygen_1_reservoir_90ml": 2,
53
+ "biorad_384_wellplate_50ul": 3,
54
+ "biorad_96_wellplate_200ul_pcr": 3,
55
+ "corning_12_wellplate_6.9ml_flat": 3,
56
+ "corning_24_wellplate_3.4ml_flat": 3,
57
+ "corning_384_wellplate_112ul_flat": 3,
58
+ "corning_48_wellplate_1.6ml_flat": 3,
59
+ "corning_6_wellplate_16.8ml_flat": 3,
60
+ "corning_96_wellplate_360ul_flat": 3,
61
+ "nest_12_reservoir_15ml": 2,
62
+ "nest_1_reservoir_195ml": 3,
63
+ "nest_1_reservoir_290ml": 2,
64
+ "nest_96_wellplate_100ul_pcr_full_skirt": 3,
65
+ "nest_96_wellplate_200ul_flat": 3,
66
+ "nest_96_wellplate_2ml_deep": 3,
67
+ "opentrons_10_tuberack_falcon_4x50ml_6x15ml_conical": 2,
68
+ "opentrons_10_tuberack_nest_4x50ml_6x15ml_conical": 2,
69
+ "opentrons_15_tuberack_falcon_15ml_conical": 2,
70
+ "opentrons_15_tuberack_nest_15ml_conical": 2,
71
+ "opentrons_24_aluminumblock_generic_2ml_screwcap": 3,
72
+ "opentrons_24_aluminumblock_nest_0.5ml_screwcap": 2,
73
+ "opentrons_24_aluminumblock_nest_1.5ml_screwcap": 2,
74
+ "opentrons_24_aluminumblock_nest_1.5ml_snapcap": 2,
75
+ "opentrons_24_aluminumblock_nest_2ml_screwcap": 2,
76
+ "opentrons_24_aluminumblock_nest_2ml_snapcap": 2,
77
+ "opentrons_24_tuberack_eppendorf_1.5ml_safelock_snapcap": 2,
78
+ "opentrons_24_tuberack_eppendorf_2ml_safelock_snapcap": 2,
79
+ "opentrons_24_tuberack_generic_2ml_screwcap": 2,
80
+ "opentrons_24_tuberack_nest_0.5ml_screwcap": 2,
81
+ "opentrons_24_tuberack_nest_1.5ml_screwcap": 2,
82
+ "opentrons_24_tuberack_nest_1.5ml_snapcap": 2,
83
+ "opentrons_24_tuberack_nest_2ml_screwcap": 2,
84
+ "opentrons_24_tuberack_nest_2ml_snapcap": 2,
85
+ "opentrons_6_tuberack_falcon_50ml_conical": 2,
86
+ "opentrons_6_tuberack_nest_50ml_conical": 2,
87
+ "opentrons_96_aluminumblock_generic_pcr_strip_200ul": 3,
88
+ "opentrons_96_wellplate_200ul_pcr_full_skirt": 3,
89
+ "opentrons_tough_pcr_auto_sealing_lid": 2,
90
+ "thermoscientificnunc_96_wellplate_1300ul": 2,
91
+ "thermoscientificnunc_96_wellplate_2000ul": 2,
92
+ "usascientific_12_reservoir_22ml": 2,
93
+ "usascientific_96_wellplate_2.4ml_deep": 2,
94
+ },
95
+ APIVersion(2, 25): {
96
+ "appliedbiosystemsmicroamp_384_wellplate_40ul": 3,
97
+ "axygen_96_wellplate_500ul": 2,
98
+ "biorad_384_wellplate_50ul": 4,
99
+ "biorad_96_wellplate_200ul_pcr": 4,
100
+ "corning_12_wellplate_6.9ml_flat": 4,
101
+ "corning_24_wellplate_3.4ml_flat": 4,
102
+ "corning_48_wellplate_1.6ml_flat": 5,
103
+ "corning_6_wellplate_16.8ml_flat": 4,
104
+ "corning_96_wellplate_360ul_flat": 4,
105
+ "ibidi_96_square_well_plate_300ul": 2,
106
+ "nest_96_wellplate_100ul_pcr_full_skirt": 4,
107
+ "nest_96_wellplate_200ul_flat": 4,
108
+ "nest_96_wellplate_2ml_deep": 4,
109
+ "opentrons_96_wellplate_200ul_pcr_full_skirt": 4,
110
+ "smc_384_read_plate": 2,
111
+ "thermoscientificnunc_96_wellplate_1300ul": 3,
112
+ "thermoscientificnunc_96_wellplate_2000ul": 3,
113
+ "usascientific_96_wellplate_2.4ml_deep": 3,
114
+ },
115
+ }
116
+
117
+
118
+ # Labware where, for whatever reason, we don't want `opentrons.protocol_api` to load
119
+ # the latest available version.
120
+ #
121
+ # Typically, this is because the latest available version of the labware is some kind of
122
+ # unpublicized draft.
123
+ #
124
+ # Beware, though, that users can still load the unpublicized draft if they know how, e.g.
125
+ # by passing an explicit `version` arg to `ProtocolContext.load_labware()`.
126
+ # And non-`opentrons.protocol_api` code like Labware Library, Protocol Designer, and
127
+ # Quick Transfer will still use the unpublicized draft unless you exclude it through
128
+ # other means.
129
+ #
130
+ # This list should not be consumed by production code--it's only for the benefit of tests
131
+ # that make sure every labware is accounted for somehow.
132
+ KNOWN_EXCEPTIONS_FOR_TESTS: set[str] = {
133
+ # Dev testing junk for labware schema 3, not things that users should ever load:
134
+ "schema3test_96_well_aluminum_block",
135
+ "schema3test_96_wellplate_200ul_pcr_full_skirt",
136
+ "schema3test_aluminum_flat_bottom_plate",
137
+ "schema3test_flex_96_tiprack_200ul",
138
+ "schema3test_flex_96_tiprack_adapter",
139
+ "schema3test_flex_tiprack_lid",
140
+ "schema3test_tough_pcr_auto_sealing_lid",
141
+ "schema3test_universal_flat_adapter",
142
+ # These were supposed to be short-lived drafts as part of of a one-two punch of
143
+ # https://github.com/Opentrons/opentrons/pull/18266 + https://github.com/Opentrons/opentrons/pull/18284,
144
+ # but the second punch took a while. We should merge the second punch after v8.6.0
145
+ # and remove these exceptions as part of that.
146
+ "agilent_1_reservoir_290ml",
147
+ "corning_384_wellplate_112ul_flat",
148
+ "nest_1_reservoir_290ml",
149
+ "opentrons_24_aluminumblock_nest_0.5ml_screwcap",
150
+ "opentrons_24_tuberack_nest_0.5ml_screwcap",
151
+ "opentrons_96_aluminumblock_generic_pcr_strip_200ul",
152
+ "usascientific_12_reservoir_22ml",
153
+ }
154
+
155
+
156
+ def get_standard_labware_default_version(
157
+ api_version: APIVersion,
158
+ load_name: str,
159
+ default_labware_versions: DefaultLabwareVersions = DEFAULT_LABWARE_VERSIONS,
160
+ ) -> int:
161
+ """Return what version of a standard labware the Protocol API should load by default.
162
+
163
+ The `default_labware_versions` param is exposed for testability and should be left
164
+ unspecified.
165
+ """
166
+ default_labware_versions_newest_to_oldest = sorted(
167
+ default_labware_versions.items(), key=lambda kv: kv[0], reverse=True
168
+ )
169
+ for (
170
+ breakpoint_api_version,
171
+ breakpoint_labware_versions,
172
+ ) in default_labware_versions_newest_to_oldest:
173
+ if (
174
+ api_version >= breakpoint_api_version
175
+ and load_name in breakpoint_labware_versions
176
+ ):
177
+ return breakpoint_labware_versions[load_name]
178
+
179
+ return 1
@@ -0,0 +1,348 @@
1
+ """A Protocol-Engine-friendly wrapper for opentrons.motion_planning.deck_conflict."""
2
+
3
+ from __future__ import annotations
4
+ import itertools
5
+ import logging
6
+ from typing import (
7
+ Collection,
8
+ Dict,
9
+ Optional,
10
+ Tuple,
11
+ overload,
12
+ Union,
13
+ TYPE_CHECKING,
14
+ )
15
+
16
+ from opentrons_shared_data.errors.exceptions import MotionPlanningFailureError
17
+ from opentrons_shared_data.module import FLEX_TC_LID_COLLISION_ZONE
18
+
19
+ from opentrons.hardware_control.modules.types import ModuleType
20
+ from opentrons.motion_planning import deck_conflict as wrapped_deck_conflict
21
+
22
+ from opentrons.protocol_engine import (
23
+ StateView,
24
+ DeckSlotLocation,
25
+ ModuleLocation,
26
+ OnLabwareLocation,
27
+ AddressableAreaLocation,
28
+ InStackerHopperLocation,
29
+ OFF_DECK_LOCATION,
30
+ SYSTEM_LOCATION,
31
+ )
32
+ from opentrons.protocol_engine.errors.exceptions import LabwareNotLoadedOnModuleError
33
+ from opentrons.types import DeckSlotName, StagingSlotName, Point
34
+ from ...disposal_locations import TrashBin, WasteChute
35
+
36
+ if TYPE_CHECKING:
37
+ from ...labware import Labware
38
+
39
+
40
+ class PartialTipMovementNotAllowedError(MotionPlanningFailureError):
41
+ """Error raised when trying to perform a partial tip movement to an illegal location."""
42
+
43
+ def __init__(self, message: str) -> None:
44
+ super().__init__(
45
+ message=message,
46
+ )
47
+
48
+
49
+ class UnsuitableTiprackForPipetteMotion(MotionPlanningFailureError):
50
+ """Error raised when trying to perform a pipette movement to a tip rack, based on adapter status."""
51
+
52
+ def __init__(self, message: str) -> None:
53
+ super().__init__(
54
+ message=message,
55
+ )
56
+
57
+
58
+ _log = logging.getLogger(__name__)
59
+
60
+ _FLEX_TC_LID_BACK_LEFT_PT = Point(
61
+ x=FLEX_TC_LID_COLLISION_ZONE["back_left"]["x"],
62
+ y=FLEX_TC_LID_COLLISION_ZONE["back_left"]["y"],
63
+ z=FLEX_TC_LID_COLLISION_ZONE["back_left"]["z"],
64
+ )
65
+
66
+ _FLEX_TC_LID_FRONT_RIGHT_PT = Point(
67
+ x=FLEX_TC_LID_COLLISION_ZONE["front_right"]["x"],
68
+ y=FLEX_TC_LID_COLLISION_ZONE["front_right"]["y"],
69
+ z=FLEX_TC_LID_COLLISION_ZONE["front_right"]["z"],
70
+ )
71
+
72
+
73
+ @overload
74
+ def check(
75
+ *,
76
+ engine_state: StateView,
77
+ existing_labware_ids: Collection[str],
78
+ existing_module_ids: Collection[str],
79
+ existing_disposal_locations: Collection[Union[Labware, WasteChute, TrashBin]],
80
+ new_labware_id: str,
81
+ ) -> None:
82
+ pass
83
+
84
+
85
+ @overload
86
+ def check(
87
+ *,
88
+ engine_state: StateView,
89
+ existing_labware_ids: Collection[str],
90
+ existing_module_ids: Collection[str],
91
+ existing_disposal_locations: Collection[Union[Labware, WasteChute, TrashBin]],
92
+ new_module_id: str,
93
+ ) -> None:
94
+ pass
95
+
96
+
97
+ @overload
98
+ def check(
99
+ *,
100
+ engine_state: StateView,
101
+ existing_labware_ids: Collection[str],
102
+ existing_module_ids: Collection[str],
103
+ existing_disposal_locations: Collection[Union[Labware, WasteChute, TrashBin]],
104
+ new_trash_bin: TrashBin,
105
+ ) -> None:
106
+ pass
107
+
108
+
109
+ def check(
110
+ *,
111
+ engine_state: StateView,
112
+ existing_labware_ids: Collection[str],
113
+ existing_module_ids: Collection[str],
114
+ existing_disposal_locations: Collection[Union[Labware, WasteChute, TrashBin]],
115
+ # TODO(mm, 2023-02-23): This interface is impossible to use correctly. In order
116
+ # to have new_labware_id or new_module_id, the caller needs to have already loaded
117
+ # the new item into Protocol Engine--but then, it's too late to do deck conflict.
118
+ # checking. Find a way to do deck conflict checking before the new item is loaded.
119
+ new_labware_id: Optional[str] = None,
120
+ new_module_id: Optional[str] = None,
121
+ new_trash_bin: Optional[TrashBin] = None,
122
+ ) -> None:
123
+ """Check for conflicts between items on the deck.
124
+
125
+ This is a Protocol-Engine-friendly wrapper around
126
+ opentrons.motion_planning.deck_conflict.check().
127
+
128
+ Params:
129
+ engine_state: An interface to retrieve details about the deck items.
130
+ existing_labware_ids: The Protocol Engine IDs of all labware already loaded.
131
+ existing_module_ids: The Protocol Engine IDs of all modules already loaded.
132
+ new_labware_id: The Protocol Engine ID of a new labware you've just added.
133
+ Mutually exclusive with new_module_id.
134
+ new_module_id: The Protocol EngineID of a new module you've just added.
135
+ Mutually exclusive with new_labware_id.
136
+
137
+ Raises:
138
+ opentrons.motion_planning.deck_conflict.DeckConflictError:
139
+ If the newly-added item conflicts with one of the existing items.
140
+ """
141
+
142
+ if new_labware_id is not None:
143
+ new_location_and_item = _map_labware(engine_state, new_labware_id)
144
+ if new_module_id is not None:
145
+ new_location_and_item = _map_module(engine_state, new_module_id)
146
+ if new_trash_bin is not None:
147
+ new_location_and_item = _map_disposal_location(new_trash_bin)
148
+
149
+ if new_location_and_item is None:
150
+ # The new item should be excluded from deck conflict checking. Nothing to do.
151
+ return
152
+
153
+ new_location, new_item = new_location_and_item
154
+
155
+ all_existing_labware = (
156
+ _map_labware(engine_state, labware_id) for labware_id in existing_labware_ids
157
+ )
158
+ mapped_existing_labware = (m for m in all_existing_labware if m is not None)
159
+
160
+ all_existing_modules = (
161
+ _map_module(engine_state, module_id) for module_id in existing_module_ids
162
+ )
163
+ mapped_existing_modules = (m for m in all_existing_modules if m is not None)
164
+
165
+ all_exisiting_disposal_locations = (
166
+ _map_disposal_location(disposal_location)
167
+ for disposal_location in existing_disposal_locations
168
+ )
169
+ mapped_disposal_locations = (
170
+ m for m in all_exisiting_disposal_locations if m is not None
171
+ )
172
+
173
+ existing_items: Dict[
174
+ Union[DeckSlotName, StagingSlotName], wrapped_deck_conflict.DeckItem
175
+ ] = {}
176
+ for existing_location, existing_item in itertools.chain(
177
+ mapped_existing_labware, mapped_existing_modules, mapped_disposal_locations
178
+ ):
179
+ assert existing_location not in existing_items
180
+ existing_items[existing_location] = existing_item
181
+
182
+ wrapped_deck_conflict.check(
183
+ existing_items=existing_items,
184
+ new_item=new_item,
185
+ new_location=new_location,
186
+ robot_type=engine_state.config.robot_type,
187
+ )
188
+
189
+
190
+ def _map_labware(
191
+ engine_state: StateView,
192
+ labware_id: str,
193
+ ) -> Optional[
194
+ Tuple[Union[DeckSlotName, StagingSlotName], wrapped_deck_conflict.DeckItem]
195
+ ]:
196
+ location_from_engine = engine_state.labware.get_location(labware_id=labware_id)
197
+
198
+ if isinstance(location_from_engine, AddressableAreaLocation):
199
+ # This will be guaranteed to be either deck slot name or staging slot name
200
+ slot: Union[DeckSlotName, StagingSlotName]
201
+ try:
202
+ slot = DeckSlotName.from_primitive(location_from_engine.addressableAreaName)
203
+ except ValueError:
204
+ slot = StagingSlotName.from_primitive(
205
+ location_from_engine.addressableAreaName
206
+ )
207
+ return (
208
+ slot,
209
+ wrapped_deck_conflict.Labware(
210
+ name_for_errors=engine_state.labware.get_load_name(
211
+ labware_id=labware_id
212
+ ),
213
+ highest_z=engine_state.geometry.get_labware_highest_z(
214
+ labware_id=labware_id
215
+ ),
216
+ uri=engine_state.labware.get_definition_uri(labware_id=labware_id),
217
+ is_fixed_trash=engine_state.labware.is_fixed_trash(
218
+ labware_id=labware_id
219
+ ),
220
+ ),
221
+ )
222
+
223
+ elif isinstance(location_from_engine, DeckSlotLocation):
224
+ # This labware is loaded directly into a deck slot.
225
+ # Map it to a wrapped_deck_conflict.Labware.
226
+ return (
227
+ location_from_engine.slotName,
228
+ wrapped_deck_conflict.Labware(
229
+ name_for_errors=engine_state.labware.get_load_name(
230
+ labware_id=labware_id
231
+ ),
232
+ highest_z=engine_state.geometry.get_labware_highest_z(
233
+ labware_id=labware_id
234
+ ),
235
+ uri=engine_state.labware.get_definition_uri(labware_id=labware_id),
236
+ is_fixed_trash=engine_state.labware.is_fixed_trash(
237
+ labware_id=labware_id
238
+ ),
239
+ ),
240
+ )
241
+
242
+ elif isinstance(location_from_engine, ModuleLocation):
243
+ # This labware is loaded atop a module. Don't map it to anything here;
244
+ # let _map_module() pick it up.
245
+ return None
246
+
247
+ elif isinstance(location_from_engine, OnLabwareLocation):
248
+ # TODO(jbl 2023-06-08) check if we need to do any logic here or if this is correct
249
+ return None
250
+
251
+ elif (
252
+ location_from_engine == OFF_DECK_LOCATION
253
+ or location_from_engine == SYSTEM_LOCATION
254
+ or isinstance(location_from_engine, InStackerHopperLocation)
255
+ ):
256
+ # This labware is off-deck. Exclude it from conflict checking.
257
+ # todo(mm, 2023-02-23): Move this logic into wrapped_deck_conflict.
258
+ return None
259
+
260
+
261
+ def _map_module(
262
+ engine_state: StateView,
263
+ module_id: str,
264
+ ) -> Optional[Tuple[DeckSlotName, wrapped_deck_conflict.DeckItem]]:
265
+ module_model = engine_state.modules.get_connected_model(module_id=module_id)
266
+ module_type = module_model.as_type()
267
+ mapped_location = engine_state.modules.get_location(module_id=module_id).slotName
268
+
269
+ # Use the module model (e.g. "temperatureModuleV1") as the name for error messages
270
+ # because it's convenient for us. Unfortunately, this won't necessarily match
271
+ # the string that the Python protocol author used to load the module.
272
+ name_for_errors = module_model.value
273
+
274
+ highest_z_including_labware = _get_module_highest_z_including_labware(
275
+ engine_state=engine_state,
276
+ module_id=module_id,
277
+ )
278
+
279
+ if module_type == ModuleType.HEATER_SHAKER:
280
+ return (
281
+ mapped_location,
282
+ wrapped_deck_conflict.HeaterShakerModule(
283
+ name_for_errors=name_for_errors,
284
+ highest_z_including_labware=highest_z_including_labware,
285
+ ),
286
+ )
287
+ elif module_type == ModuleType.MAGNETIC_BLOCK:
288
+ return (
289
+ mapped_location,
290
+ wrapped_deck_conflict.MagneticBlockModule(
291
+ name_for_errors=name_for_errors,
292
+ highest_z_including_labware=highest_z_including_labware,
293
+ ),
294
+ )
295
+ elif module_type == ModuleType.THERMOCYCLER:
296
+ return (
297
+ mapped_location,
298
+ wrapped_deck_conflict.ThermocyclerModule(
299
+ name_for_errors=name_for_errors,
300
+ highest_z_including_labware=highest_z_including_labware,
301
+ # Python Protocol API >=v2.14 never allows loading a Thermocycler in
302
+ # its semi configuration.
303
+ is_semi_configuration=False,
304
+ ),
305
+ )
306
+ elif module_type == ModuleType.FLEX_STACKER:
307
+ # TODO: This is a placeholder. We need to implement this.
308
+ return None
309
+ else:
310
+ return (
311
+ mapped_location,
312
+ wrapped_deck_conflict.OtherModule(
313
+ name_for_errors=name_for_errors,
314
+ highest_z_including_labware=highest_z_including_labware,
315
+ ),
316
+ )
317
+
318
+
319
+ def _map_disposal_location(
320
+ disposal_location: Union[Labware, WasteChute, TrashBin],
321
+ ) -> Optional[Tuple[DeckSlotName, wrapped_deck_conflict.DeckItem]]:
322
+ if isinstance(disposal_location, TrashBin):
323
+ return (
324
+ disposal_location.location,
325
+ wrapped_deck_conflict.TrashBin(
326
+ name_for_errors="trash bin", highest_z=disposal_location.height
327
+ ),
328
+ )
329
+ else:
330
+ return None
331
+
332
+
333
+ def _deck_slot_to_int(deck_slot_location: DeckSlotLocation) -> int:
334
+ return deck_slot_location.slotName.as_int()
335
+
336
+
337
+ def _get_module_highest_z_including_labware(
338
+ engine_state: StateView, module_id: str
339
+ ) -> float:
340
+ try:
341
+ labware_id = engine_state.labware.get_id_by_module(module_id=module_id)
342
+ except LabwareNotLoadedOnModuleError:
343
+ # No labware is loaded atop this module.
344
+ # The height should be just the module itself.
345
+ return engine_state.modules.get_overall_height(module_id=module_id)
346
+ else:
347
+ # This module has a labware loaded atop it. The height should include both.
348
+ return engine_state.geometry.get_labware_highest_z(labware_id=labware_id)
@@ -0,0 +1,19 @@
1
+ from typing import Optional
2
+
3
+
4
+ # TODO(mc, 2022-10-20): move to public ProtocolContext
5
+ # once `Deck` and `ProtocolEngine` play nicely together
6
+ class InvalidModuleLocationError(ValueError):
7
+ """Error raised if a load location for a module is invalid."""
8
+
9
+ def __init__(self, invalid_value: Optional[str], module_name: str) -> None:
10
+ """Initialize the error and message with the invalid value."""
11
+ super().__init__(
12
+ f"{invalid_value} is not a valid load location for {module_name}."
13
+ )
14
+ self.invalid_value = invalid_value
15
+ self.module_name = module_name
16
+
17
+
18
+ class InvalidMagnetEngageHeightError(ValueError):
19
+ """Error raised if a Magnetic Module engage height is invalid."""