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,16 @@
1
+ """Legacy protocol simulation core.
2
+
3
+ One way of simulating a Protocol API v2 protocol (e.g. to detect equipment requirements)
4
+ is to simulate at the level of the hardware API. However, this is slow.
5
+
6
+ To speed things up, these classes can additionally take the place of a
7
+ Protocol API v2 context's implementation, to simulate certain things at the level of
8
+ the Protocol API, avoiding certain calls to the underlying hardware API.
9
+ """
10
+ from .legacy_protocol_core import LegacyProtocolCoreSimulator
11
+ from .legacy_instrument_core import LegacyInstrumentCoreSimulator
12
+
13
+ __all__ = [
14
+ "LegacyProtocolCoreSimulator",
15
+ "LegacyInstrumentCoreSimulator",
16
+ ]
@@ -0,0 +1,624 @@
1
+ from __future__ import annotations
2
+
3
+ import logging
4
+ from typing import TYPE_CHECKING, Optional, Union, List, Tuple, Literal
5
+
6
+ from opentrons import types
7
+ from opentrons.hardware_control.dev_types import PipetteDict
8
+ from opentrons.hardware_control.types import HardwareAction
9
+ from opentrons.protocol_api.core.common import WellCore
10
+ from opentrons.protocols.advanced_control.transfers.common import TransferTipPolicyV2
11
+ from opentrons.protocols.api_support import instrument as instrument_support
12
+ from opentrons.protocols.api_support.labware_like import LabwareLike
13
+ from opentrons.protocols.api_support.types import APIVersion
14
+ from opentrons.protocols.api_support.definitions import MAX_SUPPORTED_VERSION
15
+ from opentrons.protocols.api_support.util import (
16
+ FlowRates,
17
+ PlungerSpeeds,
18
+ APIVersionError,
19
+ )
20
+ from opentrons.protocols.geometry import planning
21
+ from opentrons_shared_data.errors.exceptions import (
22
+ UnexpectedTipRemovalError,
23
+ UnexpectedTipAttachError,
24
+ )
25
+
26
+ from opentrons.protocol_engine.types import LiquidTrackingType
27
+
28
+ from ..legacy.legacy_labware_core import LegacyLabwareCore
29
+ from ...disposal_locations import TrashBin, WasteChute
30
+ from opentrons.protocol_api._nozzle_layout import NozzleLayout
31
+ from opentrons.protocol_api._liquid import LiquidClass
32
+
33
+ from ..instrument import AbstractInstrument
34
+
35
+ from ..legacy.legacy_well_core import LegacyWellCore
36
+ from ..legacy.legacy_module_core import LegacyThermocyclerCore, LegacyHeaterShakerCore
37
+
38
+ if TYPE_CHECKING:
39
+ from .legacy_protocol_core import LegacyProtocolCoreSimulator
40
+
41
+
42
+ _log = logging.getLogger()
43
+
44
+ _PRE_2_2_TIP_DROP_HEIGHT_MM = 10
45
+ """In PAPIv2.1 and below, tips are always dropped 10 mm from the bottom of the well."""
46
+
47
+
48
+ class LegacyInstrumentCoreSimulator(
49
+ AbstractInstrument[LegacyWellCore, LegacyLabwareCore]
50
+ ):
51
+ """A simulation of an instrument context."""
52
+
53
+ def __init__(
54
+ self,
55
+ protocol_interface: LegacyProtocolCoreSimulator,
56
+ pipette_dict: PipetteDict,
57
+ mount: types.Mount,
58
+ instrument_name: str,
59
+ default_speed: float = 400.0,
60
+ api_version: Optional[APIVersion] = None,
61
+ ):
62
+ """Constructor."""
63
+ self._protocol_interface = protocol_interface
64
+ self._mount = mount
65
+ self._pipette_dict = pipette_dict
66
+ self._instrument_name = instrument_name
67
+ self._default_speed = default_speed
68
+ self._api_version = api_version or MAX_SUPPORTED_VERSION
69
+
70
+ self._flow_rate = FlowRates(self)
71
+ pipette_state = self.get_hardware_state()
72
+ self._flow_rate.set_defaults(
73
+ aspirate_defaults=pipette_state["default_aspirate_flow_rates"],
74
+ dispense_defaults=pipette_state["default_dispense_flow_rates"],
75
+ blow_out_defaults=pipette_state["default_blow_out_flow_rates"],
76
+ api_level=self._api_version,
77
+ )
78
+
79
+ self._plunger_speeds = PlungerSpeeds(self)
80
+ # Cache the maximum instrument height
81
+ self._instrument_max_height = (
82
+ protocol_interface.get_hardware().get_instrument_max_height(self._mount)
83
+ )
84
+ self._liquid_presence_detection = False
85
+ self._last_tip_rack_and_well: Optional[
86
+ Tuple[LegacyLabwareCore, LegacyWellCore]
87
+ ] = None
88
+
89
+ def get_default_speed(self) -> float:
90
+ return self._default_speed
91
+
92
+ def set_default_speed(self, speed: float) -> None:
93
+ self._default_speed = speed
94
+
95
+ def air_gap_in_place(
96
+ self, volume: float, flow_rate: float, correction_volume: Optional[float] = None
97
+ ) -> None:
98
+ assert False, "Air gap tracking only available in API version 2.22 and later"
99
+
100
+ def aspirate(
101
+ self,
102
+ location: types.Location,
103
+ well_core: Optional[LegacyWellCore],
104
+ volume: float,
105
+ rate: float,
106
+ flow_rate: float,
107
+ in_place: bool,
108
+ meniscus_tracking: Optional[types.MeniscusTrackingTarget] = None,
109
+ correction_volume: Optional[float] = None,
110
+ ) -> None:
111
+ if self.get_current_volume() == 0:
112
+ # Make sure we're at the top of the labware and clear of any
113
+ # liquid to prepare the pipette for aspiration
114
+ if self._api_version < APIVersion(2, 3) or not self.is_ready_to_aspirate():
115
+ if location.labware.is_well:
116
+ self.move_to(
117
+ location=location.labware.as_well().top(), well_core=well_core
118
+ )
119
+ else:
120
+ # TODO(seth,2019/7/29): This should be a warning exposed
121
+ # via rpc to the runapp
122
+ _log.warning(
123
+ "When aspirate is called on something other than a "
124
+ "well relative position, we can't move to the top of"
125
+ " the well to prepare for aspiration. This might "
126
+ "cause over aspiration if the previous command is a "
127
+ "blow_out."
128
+ )
129
+ self.prepare_to_aspirate()
130
+ self.move_to(location=location, well_core=well_core)
131
+ elif location != self._protocol_interface.get_last_location():
132
+ self.move_to(location=location, well_core=well_core)
133
+
134
+ self._raise_if_no_tip(HardwareAction.ASPIRATE.name)
135
+ new_volume = self.get_current_volume() + volume
136
+ assert (
137
+ new_volume <= self._pipette_dict["working_volume"]
138
+ ), "Cannot aspirate more than pipette max volume"
139
+ self._pipette_dict["ready_to_aspirate"] = True
140
+ self._update_volume(new_volume)
141
+
142
+ def dispense(
143
+ self,
144
+ location: Union[types.Location, TrashBin, WasteChute],
145
+ well_core: Optional[LegacyWellCore],
146
+ volume: float,
147
+ rate: float,
148
+ flow_rate: float,
149
+ in_place: bool,
150
+ push_out: Optional[float],
151
+ meniscus_tracking: Optional[types.MeniscusTrackingTarget] = None,
152
+ correction_volume: Optional[float] = None,
153
+ ) -> None:
154
+ if isinstance(location, (TrashBin, WasteChute)):
155
+ raise APIVersionError(
156
+ api_element="Dispense in Moveable Trash or Waste Chute"
157
+ )
158
+ if not in_place:
159
+ self.move_to(location=location, well_core=well_core)
160
+ self._raise_if_no_tip(HardwareAction.DISPENSE.name)
161
+ self._update_volume(self.get_current_volume() - volume)
162
+
163
+ def blow_out(
164
+ self,
165
+ location: Union[types.Location, TrashBin, WasteChute],
166
+ well_core: Optional[LegacyWellCore],
167
+ in_place: bool,
168
+ ) -> None:
169
+ if isinstance(location, (TrashBin, WasteChute)):
170
+ raise APIVersionError(
171
+ api_element="Blow Out in Moveable Trash or Waste Chute"
172
+ )
173
+ if not in_place:
174
+ self.move_to(location=location, well_core=well_core)
175
+ self._raise_if_no_tip(HardwareAction.BLOWOUT.name)
176
+ self._update_volume(0)
177
+ self._pipette_dict["ready_to_aspirate"] = False
178
+
179
+ def _update_volume(self, vol: float) -> None:
180
+ self._pipette_dict["current_volume"] = vol
181
+ self._pipette_dict["available_volume"] = (
182
+ self._pipette_dict["working_volume"] - vol
183
+ )
184
+
185
+ def touch_tip(
186
+ self,
187
+ location: types.Location,
188
+ well_core: LegacyWellCore,
189
+ radius: float,
190
+ z_offset: float,
191
+ speed: float,
192
+ mm_from_edge: Optional[float] = None,
193
+ ) -> None:
194
+ if mm_from_edge is not None:
195
+ raise APIVersionError(api_element="mm_from_edge argument")
196
+ self.move_to(location)
197
+
198
+ def pick_up_tip(
199
+ self,
200
+ location: types.Location,
201
+ well_core: LegacyWellCore,
202
+ presses: Optional[int],
203
+ increment: Optional[float],
204
+ prep_after: bool = True,
205
+ ) -> None:
206
+ geometry = well_core.geometry
207
+ tip_rack_core = geometry.parent
208
+ tip_length = instrument_support.tip_length_for(
209
+ pipette=self._pipette_dict,
210
+ tip_rack_definition=tip_rack_core.get_definition(),
211
+ )
212
+
213
+ self.move_to(location=location)
214
+ self._raise_if_tip("pick up tip")
215
+ self._pipette_dict["has_tip"] = True
216
+ self._pipette_dict["tip_length"] = tip_length
217
+ self._pipette_dict["current_volume"] = 0
218
+ self._pipette_dict["working_volume"] = min(
219
+ geometry.max_volume, self.get_max_volume()
220
+ )
221
+ self._pipette_dict["available_volume"] = self._pipette_dict["working_volume"]
222
+ if prep_after:
223
+ self._pipette_dict["ready_to_aspirate"] = True
224
+
225
+ tip_rack_core.get_tip_tracker().use_tips(
226
+ start_well=well_core,
227
+ num_channels=self.get_channels(),
228
+ fail_if_full=self._api_version < APIVersion(2, 2),
229
+ )
230
+ self._last_tip_rack_and_well = tip_rack_core, well_core
231
+
232
+ def drop_tip(
233
+ self,
234
+ location: Optional[types.Location],
235
+ well_core: LegacyWellCore,
236
+ home_after: Optional[bool],
237
+ alternate_drop_location: Optional[bool] = False,
238
+ ) -> None:
239
+ if alternate_drop_location:
240
+ raise APIVersionError(api_element="Tip drop alternation")
241
+ labware_core = well_core.geometry.parent
242
+
243
+ if location is None:
244
+ from opentrons.protocol_api.labware import Labware, Well
245
+
246
+ labware = Labware(
247
+ core=labware_core,
248
+ api_version=self._api_version,
249
+ protocol_core=None, # type: ignore[arg-type]
250
+ core_map=None, # type: ignore[arg-type]
251
+ )
252
+ well = Well(parent=labware, core=well_core, api_version=self._api_version)
253
+
254
+ if LabwareLike(labware).is_fixed_trash():
255
+ location = well.top()
256
+ elif self._api_version < APIVersion(2, 2):
257
+ location = well.bottom(z=_PRE_2_2_TIP_DROP_HEIGHT_MM)
258
+ else:
259
+ assert (
260
+ labware_core.is_tip_rack()
261
+ ), "Expected tip drop target to be a tip rack."
262
+
263
+ return_height = self.get_return_height()
264
+ location = well.top(z=-return_height * labware_core.get_tip_length())
265
+
266
+ self.move_to(location=location)
267
+ self._raise_if_no_tip(HardwareAction.DROPTIP.name)
268
+ self._pipette_dict["has_tip"] = False
269
+ self._pipette_dict["tip_length"] = 0.0
270
+ self._update_volume(0)
271
+ self._last_tip_rack_and_well = None
272
+
273
+ if self._api_version < APIVersion(2, 2) and labware_core.is_tip_rack():
274
+ # If this is a tiprack we can try and add the dirty tip back to the tracker
275
+ try:
276
+ labware_core.get_tip_tracker().return_tips(
277
+ start_well=well_core,
278
+ num_channels=self.get_channels(),
279
+ )
280
+ except AssertionError:
281
+ # Similarly to :py:meth:`return_tips`, the failure case here
282
+ # just means the tip can't be reused, so don't actually stop
283
+ # the protocol
284
+ _log.warning(
285
+ f"Could not return tip to {labware_core.get_display_name()}"
286
+ )
287
+
288
+ def drop_tip_in_disposal_location(
289
+ self,
290
+ disposal_location: Union[TrashBin, WasteChute],
291
+ home_after: Optional[bool],
292
+ alternate_tip_drop: bool = False,
293
+ ) -> None:
294
+ raise APIVersionError(api_element="Dropping tips in a trash bin or waste chute")
295
+
296
+ def resin_tip_seal(
297
+ self,
298
+ location: types.Location,
299
+ well_core: WellCore,
300
+ in_place: Optional[bool] = False,
301
+ ) -> None:
302
+ raise APIVersionError(api_element="Sealing resin tips.")
303
+
304
+ def resin_tip_unseal(
305
+ self,
306
+ location: types.Location | None,
307
+ well_core: WellCore,
308
+ ) -> None:
309
+ raise APIVersionError(api_element="Unsealing resin tips.")
310
+
311
+ def resin_tip_dispense(
312
+ self,
313
+ location: types.Location,
314
+ well_core: WellCore,
315
+ volume: Optional[float] = None,
316
+ flow_rate: Optional[float] = None,
317
+ ) -> None:
318
+ raise APIVersionError(api_element="Dispensing liquid from resin tips.")
319
+
320
+ def home(self) -> None:
321
+ self._protocol_interface.set_last_location(None)
322
+
323
+ def home_plunger(self) -> None:
324
+ pass
325
+
326
+ def move_to(
327
+ self,
328
+ location: Union[types.Location, TrashBin, WasteChute],
329
+ well_core: Optional[LegacyWellCore] = None,
330
+ force_direct: bool = False,
331
+ minimum_z_height: Optional[float] = None,
332
+ speed: Optional[float] = None,
333
+ check_for_movement_conflicts: bool = False, # Not used in this implementation
334
+ ) -> None:
335
+ """Simulation of only the motion planning portion of move_to."""
336
+ if isinstance(location, (TrashBin, WasteChute)):
337
+ raise APIVersionError(api_element="Move To Trash Bin and Waste Chute")
338
+
339
+ self.flag_unsafe_move(location)
340
+
341
+ last_location = self._protocol_interface.get_last_location()
342
+ if last_location:
343
+ from_loc = last_location
344
+ else:
345
+ from_loc = types.Location(types.Point(0, 0, 0), LabwareLike(None))
346
+
347
+ # We just want to catch planning errors.
348
+ planning.plan_moves(
349
+ from_loc,
350
+ location,
351
+ self._protocol_interface.get_deck(),
352
+ self._instrument_max_height,
353
+ force_direct=force_direct,
354
+ minimum_z_height=minimum_z_height,
355
+ )
356
+
357
+ self._protocol_interface.set_last_location(location)
358
+
359
+ def get_mount(self) -> types.Mount:
360
+ return self._mount
361
+
362
+ def get_requested_as_name(self) -> str:
363
+ return self._instrument_name
364
+
365
+ def get_pipette_name(self) -> str:
366
+ return self._pipette_dict["name"]
367
+
368
+ def get_model(self) -> str:
369
+ return self._pipette_dict["model"]
370
+
371
+ def get_display_name(self) -> str:
372
+ return self._pipette_dict["display_name"]
373
+
374
+ def get_min_volume(self) -> float:
375
+ return self._pipette_dict["min_volume"]
376
+
377
+ def get_max_volume(self) -> float:
378
+ return self._pipette_dict["max_volume"]
379
+
380
+ def get_working_volume(self) -> float:
381
+ return self._pipette_dict["working_volume"]
382
+
383
+ def get_current_volume(self) -> float:
384
+ return self._pipette_dict["current_volume"]
385
+
386
+ def get_has_clean_tip(self) -> bool:
387
+ return False
388
+
389
+ def get_available_volume(self) -> float:
390
+ return self._pipette_dict["available_volume"]
391
+
392
+ def get_hardware_state(self) -> PipetteDict:
393
+ return self._pipette_dict
394
+
395
+ def get_channels(self) -> int:
396
+ return self._pipette_dict["channels"]
397
+
398
+ def has_tip(self) -> bool:
399
+ return self._pipette_dict["has_tip"]
400
+
401
+ def is_ready_to_aspirate(self) -> bool:
402
+ return self._pipette_dict["ready_to_aspirate"]
403
+
404
+ def prepare_to_aspirate(self) -> None:
405
+ self._raise_if_no_tip(HardwareAction.PREPARE_ASPIRATE.name)
406
+
407
+ def get_return_height(self) -> float:
408
+ return self._pipette_dict["return_tip_height"]
409
+
410
+ def get_speed(self) -> PlungerSpeeds:
411
+ return self._plunger_speeds
412
+
413
+ def get_liquid_presence_detection(self) -> bool:
414
+ return self._liquid_presence_detection
415
+
416
+ def set_liquid_presence_detection(self, enable: bool) -> None:
417
+ self._liquid_presence_detection = enable
418
+
419
+ def get_flow_rate(self) -> FlowRates:
420
+ return self._flow_rate
421
+
422
+ def get_aspirate_flow_rate(self, rate: float = 1.0) -> float:
423
+ return self._pipette_dict["aspirate_flow_rate"] * rate
424
+
425
+ def get_dispense_flow_rate(self, rate: float = 1.0) -> float:
426
+ return self._pipette_dict["dispense_flow_rate"] * rate
427
+
428
+ def get_blow_out_flow_rate(self, rate: float = 1.0) -> float:
429
+ return self._pipette_dict["blow_out_flow_rate"] * rate
430
+
431
+ def get_tip_origin(
432
+ self,
433
+ ) -> Optional[Tuple[LegacyLabwareCore, LegacyWellCore]]:
434
+ return self._last_tip_rack_and_well
435
+
436
+ def set_flow_rate(
437
+ self,
438
+ aspirate: Optional[float] = None,
439
+ dispense: Optional[float] = None,
440
+ blow_out: Optional[float] = None,
441
+ ) -> None:
442
+ self._protocol_interface.get_hardware().set_flow_rate(
443
+ mount=self._mount,
444
+ aspirate=aspirate,
445
+ dispense=dispense,
446
+ blow_out=blow_out,
447
+ )
448
+ self._update_flow_rate()
449
+
450
+ def set_pipette_speed(
451
+ self,
452
+ aspirate: Optional[float] = None,
453
+ dispense: Optional[float] = None,
454
+ blow_out: Optional[float] = None,
455
+ ) -> None:
456
+ self._protocol_interface.get_hardware().set_pipette_speed(
457
+ mount=self._mount,
458
+ aspirate=aspirate,
459
+ dispense=dispense,
460
+ blow_out=blow_out,
461
+ )
462
+ self._update_flow_rate()
463
+
464
+ def flag_unsafe_move(self, location: types.Location) -> None:
465
+ """Check if a movement to a destination is potentially unsafe.
466
+
467
+ Args:
468
+ location: The movement destination.
469
+
470
+ Raises:
471
+ RuntimeError: The movement is unsafe.
472
+ """
473
+ from_loc = self._protocol_interface.get_last_location()
474
+
475
+ if not from_loc:
476
+ from_loc = types.Location(types.Point(0, 0, 0), LabwareLike(None))
477
+
478
+ for mod in self._protocol_interface.get_module_cores():
479
+ if isinstance(mod, LegacyThermocyclerCore):
480
+ mod.flag_unsafe_move(to_loc=location, from_loc=from_loc)
481
+ elif isinstance(mod, LegacyHeaterShakerCore):
482
+ mod.flag_unsafe_move(
483
+ to_loc=location,
484
+ is_multichannel=self.get_channels() > 1,
485
+ )
486
+
487
+ def _update_flow_rate(self) -> None:
488
+ """Update cached speed and flow rates from hardware controller pipette."""
489
+ p = self._protocol_interface.get_hardware().get_attached_instrument(
490
+ self.get_mount()
491
+ )
492
+ self._pipette_dict["aspirate_flow_rate"] = p["aspirate_flow_rate"]
493
+ self._pipette_dict["dispense_flow_rate"] = p["dispense_flow_rate"]
494
+ self._pipette_dict["blow_out_flow_rate"] = p["blow_out_flow_rate"]
495
+ self._pipette_dict["aspirate_speed"] = p["aspirate_speed"]
496
+ self._pipette_dict["dispense_speed"] = p["dispense_speed"]
497
+ self._pipette_dict["blow_out_speed"] = p["blow_out_speed"]
498
+
499
+ def _raise_if_no_tip(self, action: str) -> None:
500
+ """Raise UnexpectedTipRemovalError if no tip."""
501
+ if not self.has_tip():
502
+ raise UnexpectedTipRemovalError(
503
+ action, self._instrument_name, self._mount.name
504
+ )
505
+
506
+ def _raise_if_tip(self, action: str) -> None:
507
+ """Raise UnexpectedTipAttachError if tip."""
508
+ if self.has_tip():
509
+ raise UnexpectedTipAttachError(
510
+ action, self._instrument_name, self._mount.name
511
+ )
512
+
513
+ def configure_for_volume(self, volume: float) -> None:
514
+ """This will never be called because it was added in API 2.15."""
515
+ pass
516
+
517
+ def configure_nozzle_layout(
518
+ self,
519
+ style: NozzleLayout,
520
+ primary_nozzle: Optional[str],
521
+ front_right_nozzle: Optional[str],
522
+ back_left_nozzle: Optional[str],
523
+ ) -> None:
524
+ """This will never be called because it was added in API 2.15."""
525
+ pass
526
+
527
+ def transfer_with_liquid_class(
528
+ self,
529
+ liquid_class: LiquidClass,
530
+ volume: float,
531
+ source: List[Tuple[types.Location, LegacyWellCore]],
532
+ dest: Union[List[Tuple[types.Location, LegacyWellCore]], TrashBin, WasteChute],
533
+ new_tip: TransferTipPolicyV2,
534
+ tip_racks: List[Tuple[types.Location, LegacyLabwareCore]],
535
+ starting_tip: Optional[LegacyWellCore],
536
+ trash_location: Union[types.Location, TrashBin, WasteChute],
537
+ return_tip: bool,
538
+ keep_last_tip: bool,
539
+ ) -> None:
540
+ """This will never be called because it was added in API 2.23."""
541
+ assert False, "transfer_liquid is not supported in legacy context"
542
+
543
+ def distribute_with_liquid_class(
544
+ self,
545
+ liquid_class: LiquidClass,
546
+ volume: float,
547
+ source: Tuple[types.Location, LegacyWellCore],
548
+ dest: List[Tuple[types.Location, LegacyWellCore]],
549
+ new_tip: Literal[TransferTipPolicyV2.NEVER, TransferTipPolicyV2.ONCE],
550
+ tip_racks: List[Tuple[types.Location, LegacyLabwareCore]],
551
+ starting_tip: Optional[LegacyWellCore],
552
+ trash_location: Union[types.Location, TrashBin, WasteChute],
553
+ return_tip: bool,
554
+ keep_last_tip: bool,
555
+ ) -> None:
556
+ """This will never be called because it was added in API 2.23."""
557
+ assert False, "distribute_liquid is not supported in legacy context"
558
+
559
+ def consolidate_with_liquid_class(
560
+ self,
561
+ liquid_class: LiquidClass,
562
+ volume: float,
563
+ source: List[Tuple[types.Location, LegacyWellCore]],
564
+ dest: Union[Tuple[types.Location, LegacyWellCore], TrashBin, WasteChute],
565
+ new_tip: Literal[TransferTipPolicyV2.NEVER, TransferTipPolicyV2.ONCE],
566
+ tip_racks: List[Tuple[types.Location, LegacyLabwareCore]],
567
+ starting_tip: Optional[LegacyWellCore],
568
+ trash_location: Union[types.Location, TrashBin, WasteChute],
569
+ return_tip: bool,
570
+ keep_last_tip: bool,
571
+ ) -> None:
572
+ """This will never be called because it was added in API 2.23."""
573
+ assert False, "consolidate_liquid is not supported in legacy context"
574
+
575
+ def get_active_channels(self) -> int:
576
+ """This will never be called because it was added in API 2.16."""
577
+ assert False, "get_active_channels only supported in API 2.16 & later"
578
+
579
+ def get_nozzle_map(self) -> types.NozzleMapInterface:
580
+ """This will never be called because it was added in API 2.18."""
581
+ assert False, "get_nozzle_map only supported in API 2.18 & later"
582
+
583
+ def is_tip_tracking_available(self) -> bool:
584
+ # Tip tracking is always available in legacy context
585
+ return True
586
+
587
+ def retract(self) -> None:
588
+ """Retract this instrument to the top of the gantry."""
589
+ self._protocol_interface.get_hardware.retract(self._mount) # type: ignore [attr-defined]
590
+
591
+ def detect_liquid_presence(self, well_core: WellCore, loc: types.Location) -> bool:
592
+ """This will never be called because it was added in API 2.20."""
593
+ assert False, "detect_liquid_presence only supported in API 2.20 & later"
594
+
595
+ def liquid_probe_with_recovery(
596
+ self, well_core: WellCore, loc: types.Location
597
+ ) -> None:
598
+ """This will never be called because it was added in API 2.20."""
599
+ assert False, "liquid_probe_with_recovery only supported in API 2.20 & later"
600
+
601
+ def liquid_probe_without_recovery(
602
+ self, well_core: WellCore, loc: types.Location
603
+ ) -> LiquidTrackingType:
604
+ """This will never be called because it was added in API 2.20."""
605
+ assert False, "liquid_probe_without_recovery only supported in API 2.20 & later"
606
+
607
+ def _pressure_supported_by_pipette(self) -> bool:
608
+ return False
609
+
610
+ def nozzle_configuration_valid_for_lld(self) -> bool:
611
+ """Check if the nozzle configuration currently supports LLD."""
612
+ return False
613
+
614
+ def get_minimum_liquid_sense_height(self) -> float:
615
+ return 0.0
616
+
617
+ def estimate_liquid_height(
618
+ self,
619
+ well_core: LegacyWellCore,
620
+ starting_liquid_height: float,
621
+ operation_volume: float,
622
+ ) -> float:
623
+ """This will never be called because it was added in API 2.21."""
624
+ assert False, "estimate_liquid_height only supported in API 2.21 & later"