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,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,400 @@
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
+ if existing_location not in existing_items:
180
+ existing_items[existing_location] = existing_item
181
+ else:
182
+ existing_items[existing_location] = _check_pair_compatibility(
183
+ existing_items[existing_location], existing_item, existing_location
184
+ )
185
+
186
+ wrapped_deck_conflict.check(
187
+ existing_items=existing_items,
188
+ new_item=new_item,
189
+ new_location=new_location,
190
+ robot_type=engine_state.config.robot_type,
191
+ )
192
+
193
+
194
+ def _check_pair_compatibility(
195
+ item1: wrapped_deck_conflict.DeckItem,
196
+ item2: wrapped_deck_conflict.DeckItem,
197
+ location: Union[DeckSlotName, StagingSlotName],
198
+ ) -> wrapped_deck_conflict.DeckItem:
199
+ # if this is a stacker and something that can also "go" where a stacker "goes" (like a labware or magblock)
200
+ # then we build a combo; otherwise, we raise an error. this error in theory should never happen because to
201
+ # have the configuration that causes the error, it has to have passed the wrapped deck conflict checking,
202
+ # so there would be a bug in there, which is of course impossible.
203
+
204
+ def _check_pair_compat_once(
205
+ item1: wrapped_deck_conflict.DeckItem, item2: wrapped_deck_conflict.DeckItem
206
+ ) -> bool:
207
+ if isinstance(item1, wrapped_deck_conflict.FlexStackerModule) and isinstance(
208
+ item2,
209
+ (wrapped_deck_conflict.MagneticBlockModule, wrapped_deck_conflict.Labware),
210
+ ):
211
+ return True
212
+ return False
213
+
214
+ if _check_pair_compat_once(item1, item2) or _check_pair_compat_once(item2, item1):
215
+ not_stacker = (
216
+ item1
217
+ if not isinstance(item1, wrapped_deck_conflict.FlexStackerModule)
218
+ else item2
219
+ )
220
+ # type-only assertion: trash bins are not alowed in _check_pair_compat_once and
221
+ # so we would never get here
222
+ assert not isinstance(not_stacker, wrapped_deck_conflict.TrashBin)
223
+ return wrapped_deck_conflict.FlexStackerModuleKindaButSomethingElseReally(
224
+ name_for_errors=not_stacker.name_for_errors,
225
+ highest_z_including_labware=(
226
+ not_stacker.highest_z
227
+ if isinstance(not_stacker, wrapped_deck_conflict.Labware)
228
+ else not_stacker.highest_z_including_labware
229
+ ),
230
+ original_item=not_stacker,
231
+ )
232
+ raise wrapped_deck_conflict.DeckConflictError(
233
+ f"{item1.name_for_errors} and {item2.name_for_errors} cannot both be loaded in {location}"
234
+ )
235
+
236
+
237
+ def _map_labware(
238
+ engine_state: StateView,
239
+ labware_id: str,
240
+ ) -> Optional[
241
+ Tuple[Union[DeckSlotName, StagingSlotName], wrapped_deck_conflict.DeckItem]
242
+ ]:
243
+ location_from_engine = engine_state.labware.get_location(labware_id=labware_id)
244
+
245
+ if isinstance(location_from_engine, AddressableAreaLocation):
246
+ # This will be guaranteed to be either deck slot name or staging slot name
247
+ slot: Union[DeckSlotName, StagingSlotName]
248
+ try:
249
+ slot = DeckSlotName.from_primitive(location_from_engine.addressableAreaName)
250
+ except ValueError:
251
+ slot = StagingSlotName.from_primitive(
252
+ location_from_engine.addressableAreaName
253
+ )
254
+ return (
255
+ slot,
256
+ wrapped_deck_conflict.Labware(
257
+ name_for_errors=engine_state.labware.get_load_name(
258
+ labware_id=labware_id
259
+ ),
260
+ highest_z=engine_state.geometry.get_labware_highest_z(
261
+ labware_id=labware_id
262
+ ),
263
+ uri=engine_state.labware.get_definition_uri(labware_id=labware_id),
264
+ is_fixed_trash=engine_state.labware.is_fixed_trash(
265
+ labware_id=labware_id
266
+ ),
267
+ ),
268
+ )
269
+
270
+ elif isinstance(location_from_engine, DeckSlotLocation):
271
+ # This labware is loaded directly into a deck slot.
272
+ # Map it to a wrapped_deck_conflict.Labware.
273
+ return (
274
+ location_from_engine.slotName,
275
+ wrapped_deck_conflict.Labware(
276
+ name_for_errors=engine_state.labware.get_load_name(
277
+ labware_id=labware_id
278
+ ),
279
+ highest_z=engine_state.geometry.get_labware_highest_z(
280
+ labware_id=labware_id
281
+ ),
282
+ uri=engine_state.labware.get_definition_uri(labware_id=labware_id),
283
+ is_fixed_trash=engine_state.labware.is_fixed_trash(
284
+ labware_id=labware_id
285
+ ),
286
+ ),
287
+ )
288
+
289
+ elif isinstance(location_from_engine, ModuleLocation):
290
+ # This labware is loaded atop a module. Don't map it to anything here;
291
+ # let _map_module() pick it up.
292
+ return None
293
+
294
+ elif isinstance(location_from_engine, OnLabwareLocation):
295
+ # TODO(jbl 2023-06-08) check if we need to do any logic here or if this is correct
296
+ return None
297
+
298
+ elif (
299
+ location_from_engine == OFF_DECK_LOCATION
300
+ or location_from_engine == SYSTEM_LOCATION
301
+ or isinstance(location_from_engine, InStackerHopperLocation)
302
+ ):
303
+ # This labware is off-deck. Exclude it from conflict checking.
304
+ # todo(mm, 2023-02-23): Move this logic into wrapped_deck_conflict.
305
+ return None
306
+
307
+
308
+ def _map_module(
309
+ engine_state: StateView,
310
+ module_id: str,
311
+ ) -> Optional[Tuple[DeckSlotName, wrapped_deck_conflict.DeckItem]]:
312
+ module_model = engine_state.modules.get_connected_model(module_id=module_id)
313
+ module_type = module_model.as_type()
314
+ mapped_location = engine_state.modules.get_location(module_id=module_id).slotName
315
+
316
+ # Use the module model (e.g. "temperatureModuleV1") as the name for error messages
317
+ # because it's convenient for us. Unfortunately, this won't necessarily match
318
+ # the string that the Python protocol author used to load the module.
319
+ name_for_errors = module_model.value
320
+
321
+ highest_z_including_labware = _get_module_highest_z_including_labware(
322
+ engine_state=engine_state,
323
+ module_id=module_id,
324
+ )
325
+
326
+ if module_type == ModuleType.HEATER_SHAKER:
327
+ return (
328
+ mapped_location,
329
+ wrapped_deck_conflict.HeaterShakerModule(
330
+ name_for_errors=name_for_errors,
331
+ highest_z_including_labware=highest_z_including_labware,
332
+ ),
333
+ )
334
+ elif module_type == ModuleType.MAGNETIC_BLOCK:
335
+ return (
336
+ mapped_location,
337
+ wrapped_deck_conflict.MagneticBlockModule(
338
+ name_for_errors=name_for_errors,
339
+ highest_z_including_labware=highest_z_including_labware,
340
+ ),
341
+ )
342
+ elif module_type == ModuleType.THERMOCYCLER:
343
+ return (
344
+ mapped_location,
345
+ wrapped_deck_conflict.ThermocyclerModule(
346
+ name_for_errors=name_for_errors,
347
+ highest_z_including_labware=highest_z_including_labware,
348
+ # Python Protocol API >=v2.14 never allows loading a Thermocycler in
349
+ # its semi configuration.
350
+ is_semi_configuration=False,
351
+ ),
352
+ )
353
+ elif module_type == ModuleType.FLEX_STACKER:
354
+ return (
355
+ mapped_location,
356
+ wrapped_deck_conflict.FlexStackerModule(
357
+ name_for_errors=name_for_errors,
358
+ highest_z_including_labware=highest_z_including_labware,
359
+ ),
360
+ )
361
+ else:
362
+ return (
363
+ mapped_location,
364
+ wrapped_deck_conflict.OtherModule(
365
+ name_for_errors=name_for_errors,
366
+ highest_z_including_labware=highest_z_including_labware,
367
+ ),
368
+ )
369
+
370
+
371
+ def _map_disposal_location(
372
+ disposal_location: Union[Labware, WasteChute, TrashBin],
373
+ ) -> Optional[Tuple[DeckSlotName, wrapped_deck_conflict.DeckItem]]:
374
+ if isinstance(disposal_location, TrashBin):
375
+ return (
376
+ disposal_location.location,
377
+ wrapped_deck_conflict.TrashBin(
378
+ name_for_errors="trash bin", highest_z=disposal_location.height
379
+ ),
380
+ )
381
+ else:
382
+ return None
383
+
384
+
385
+ def _deck_slot_to_int(deck_slot_location: DeckSlotLocation) -> int:
386
+ return deck_slot_location.slotName.as_int()
387
+
388
+
389
+ def _get_module_highest_z_including_labware(
390
+ engine_state: StateView, module_id: str
391
+ ) -> float:
392
+ try:
393
+ labware_id = engine_state.labware.get_id_by_module(module_id=module_id)
394
+ except LabwareNotLoadedOnModuleError:
395
+ # No labware is loaded atop this module.
396
+ # The height should be just the module itself.
397
+ return engine_state.modules.get_overall_height(module_id=module_id)
398
+ else:
399
+ # This module has a labware loaded atop it. The height should include both.
400
+ 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."""