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,709 @@
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 import CriticalPoint
8
+ from opentrons.hardware_control.dev_types import PipetteDict
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.definitions import MAX_SUPPORTED_VERSION
13
+ from opentrons.protocols.api_support.labware_like import LabwareLike
14
+ from opentrons.protocols.api_support.types import APIVersion
15
+ from opentrons.protocols.api_support.util import (
16
+ build_edges,
17
+ FlowRates,
18
+ PlungerSpeeds,
19
+ APIVersionError,
20
+ )
21
+ from opentrons.protocols.geometry import planning
22
+ from opentrons.protocol_api._nozzle_layout import NozzleLayout
23
+ from opentrons.protocol_api._liquid import LiquidClass
24
+
25
+ from opentrons.protocol_engine.types import LiquidTrackingType
26
+
27
+ from ...disposal_locations import TrashBin, WasteChute
28
+ from ..instrument import AbstractInstrument
29
+ from .legacy_well_core import LegacyWellCore
30
+ from .legacy_labware_core import LegacyLabwareCore
31
+ from .legacy_module_core import LegacyThermocyclerCore, LegacyHeaterShakerCore
32
+
33
+ if TYPE_CHECKING:
34
+ from .legacy_protocol_core import LegacyProtocolCore
35
+
36
+
37
+ _log = logging.getLogger()
38
+
39
+ _PRE_2_2_TIP_DROP_HEIGHT_MM = 10
40
+ """In PAPIv2.1 and below, tips are always dropped 10 mm from the bottom of the well."""
41
+
42
+
43
+ class LegacyInstrumentCore(AbstractInstrument[LegacyWellCore, LegacyLabwareCore]):
44
+ """Implementation of the InstrumentContext interface."""
45
+
46
+ def __init__(
47
+ self,
48
+ protocol_interface: LegacyProtocolCore,
49
+ mount: types.Mount,
50
+ instrument_name: str,
51
+ default_speed: float,
52
+ api_version: Optional[APIVersion] = None,
53
+ ):
54
+ self._api_version = api_version or MAX_SUPPORTED_VERSION
55
+ self._protocol_interface = protocol_interface
56
+ self._mount = mount
57
+ self._instrument_name = instrument_name
58
+ self._default_speed = default_speed
59
+ self._speeds = PlungerSpeeds(self)
60
+
61
+ pipette_state = self.get_hardware_state()
62
+ self._flow_rates = FlowRates(self)
63
+ self._flow_rates.set_defaults(
64
+ aspirate_defaults=pipette_state["default_aspirate_flow_rates"],
65
+ dispense_defaults=pipette_state["default_dispense_flow_rates"],
66
+ blow_out_defaults=pipette_state["default_blow_out_flow_rates"],
67
+ api_level=self._api_version,
68
+ )
69
+ self._liquid_presence_detection = False
70
+ self._last_tip_rack_and_well: Optional[
71
+ Tuple[LegacyLabwareCore, LegacyWellCore]
72
+ ] = None
73
+
74
+ def get_default_speed(self) -> float:
75
+ """Gets the speed at which the robot's gantry moves."""
76
+ return self._default_speed
77
+
78
+ def set_default_speed(self, speed: float) -> None:
79
+ """Sets the speed at which the robot's gantry moves."""
80
+ self._default_speed = speed
81
+
82
+ def air_gap_in_place(
83
+ self, volume: float, flow_rate: float, correction_volume: Optional[float] = None
84
+ ) -> None:
85
+ assert False, "Air gap tracking only available in API version 2.22 and later"
86
+
87
+ def aspirate(
88
+ self,
89
+ location: types.Location,
90
+ well_core: Optional[LegacyWellCore],
91
+ volume: float,
92
+ rate: float,
93
+ flow_rate: float,
94
+ in_place: bool,
95
+ meniscus_tracking: Optional[types.MeniscusTrackingTarget] = None,
96
+ correction_volume: Optional[float] = None,
97
+ ) -> None:
98
+ """Aspirate a given volume of liquid from the specified location.
99
+ Args:
100
+ volume: The volume of liquid to aspirate, in microliters.
101
+ location: The exact location to aspirate from.
102
+ well_core: The well to aspirate from, if applicable.
103
+ rate: The rate in µL/s to aspirate at.
104
+ flow_rate: Not used in this core.
105
+ in_place: Whether we should move_to location.
106
+ correction_volume: Not used in this core
107
+ meniscus_tracking: Optional data about where to aspirate from.
108
+ """
109
+ if self.get_current_volume() == 0:
110
+ # Make sure we're at the top of the labware and clear of any
111
+ # liquid to prepare the pipette for aspiration
112
+ if self._api_version < APIVersion(2, 3) or not self.is_ready_to_aspirate():
113
+ if location.labware.is_well:
114
+ self.move_to(location=location.labware.as_well().top())
115
+ else:
116
+ # TODO(seth,2019/7/29): This should be a warning exposed
117
+ # via rpc to the runapp
118
+ _log.warning(
119
+ "When aspirate is called on something other than a "
120
+ "well relative position, we can't move to the top of"
121
+ " the well to prepare for aspiration. This might "
122
+ "cause over aspiration if the previous command is a "
123
+ "blow_out."
124
+ )
125
+ self.prepare_to_aspirate()
126
+ self.move_to(location=location)
127
+ elif not in_place:
128
+ self.move_to(location=location)
129
+
130
+ self._protocol_interface.get_hardware().aspirate(self._mount, volume, rate)
131
+
132
+ def dispense(
133
+ self,
134
+ location: Union[types.Location, TrashBin, WasteChute],
135
+ well_core: Optional[LegacyWellCore],
136
+ volume: float,
137
+ rate: float,
138
+ flow_rate: float,
139
+ in_place: bool,
140
+ push_out: Optional[float],
141
+ meniscus_tracking: Optional[types.MeniscusTrackingTarget] = None,
142
+ correction_volume: Optional[float] = None,
143
+ ) -> None:
144
+ """Dispense a given volume of liquid into the specified location.
145
+ Args:
146
+ volume: The volume of liquid to dispense, in microliters.
147
+ location: The exact location to dispense to.
148
+ well_core: The well to dispense to, if applicable.
149
+ rate: The rate in µL/s to dispense at.
150
+ flow_rate: Not used in this core.
151
+ in_place: Whether we should move_to location.
152
+ correction_volume: Not used in this core.
153
+ push_out: The amount to push the plunger below bottom position.
154
+ meniscus_tracking: Optional data about where to dispense from.
155
+ """
156
+ if isinstance(location, (TrashBin, WasteChute)):
157
+ raise APIVersionError(
158
+ api_element="Dispense in Moveable Trash or Waste Chute"
159
+ )
160
+ if push_out:
161
+ raise APIVersionError(api_element="push_out")
162
+ if not in_place:
163
+ self.move_to(location=location)
164
+
165
+ self._protocol_interface.get_hardware().dispense(self._mount, volume, rate)
166
+
167
+ def blow_out(
168
+ self,
169
+ location: Union[types.Location, TrashBin, WasteChute],
170
+ well_core: Optional[LegacyWellCore],
171
+ in_place: bool,
172
+ ) -> None:
173
+ """Blow liquid out of the tip.
174
+
175
+ Args:
176
+ location: The location to blow out into.
177
+ well_core: Unused by legacy core.
178
+ in_place: Whether we should move_to location.
179
+ """
180
+ if isinstance(location, (TrashBin, WasteChute)):
181
+ raise APIVersionError(
182
+ api_element="Blow Out in Moveable Trash or Waste Chute"
183
+ )
184
+
185
+ if not in_place:
186
+ self.move_to(location=location)
187
+ self._protocol_interface.get_hardware().blow_out(self._mount)
188
+
189
+ def touch_tip(
190
+ self,
191
+ location: types.Location,
192
+ well_core: LegacyWellCore,
193
+ radius: float,
194
+ z_offset: float,
195
+ speed: float,
196
+ mm_from_edge: Optional[float] = None,
197
+ ) -> None:
198
+ """
199
+ Touch the pipette tip to the sides of a well, with the intent of
200
+ removing left-over droplets
201
+ """
202
+ if mm_from_edge is not None:
203
+ raise APIVersionError(api_element="mm_from_edge argument")
204
+ # TODO al 20201110 - build_edges relies on where being a Well. This is
205
+ # an unpleasant compromise until refactoring build_edges to support
206
+ # LegacyWellCore.
207
+ # Also, build_edges should not require api_version.
208
+ from opentrons.protocol_api.labware import Labware, Well
209
+
210
+ self.move_to(location=location)
211
+
212
+ edges = build_edges(
213
+ where=Well(
214
+ parent=Labware(
215
+ core=well_core.geometry.parent,
216
+ api_version=self._api_version,
217
+ protocol_core=None, # type: ignore[arg-type]
218
+ core_map=None, # type: ignore[arg-type]
219
+ ),
220
+ core=well_core,
221
+ api_version=self._api_version,
222
+ ),
223
+ offset=z_offset,
224
+ mount=self._mount,
225
+ deck=self._protocol_interface.get_deck(),
226
+ radius=radius,
227
+ version=self._api_version,
228
+ )
229
+ for edge in edges:
230
+ self._protocol_interface.get_hardware().move_to(self._mount, edge, speed)
231
+
232
+ def pick_up_tip(
233
+ self,
234
+ location: types.Location,
235
+ well_core: LegacyWellCore,
236
+ presses: Optional[int],
237
+ increment: Optional[float],
238
+ prep_after: bool = True,
239
+ ) -> None:
240
+ """Pick up a tip for the pipette to run liquid-handling commands."""
241
+ hw = self._protocol_interface.get_hardware()
242
+ geometry = well_core.geometry
243
+ tip_rack_core = geometry.parent
244
+ tip_length = instrument_support.tip_length_for(
245
+ pipette=self.get_hardware_state(),
246
+ tip_rack_definition=tip_rack_core.get_definition(),
247
+ )
248
+
249
+ self.move_to(location=location, well_core=well_core)
250
+ hw.set_current_tiprack_diameter(self._mount, geometry.diameter)
251
+ hw.pick_up_tip(self._mount, tip_length, presses, increment, prep_after)
252
+ hw.set_working_volume(self._mount, geometry.max_volume)
253
+ tip_rack_core.get_tip_tracker().use_tips(
254
+ start_well=well_core,
255
+ num_channels=self.get_channels(),
256
+ fail_if_full=self._api_version < APIVersion(2, 2),
257
+ )
258
+ self._last_tip_rack_and_well = tip_rack_core, well_core
259
+
260
+ def drop_tip(
261
+ self,
262
+ location: Optional[types.Location],
263
+ well_core: LegacyWellCore,
264
+ home_after: Optional[bool],
265
+ alternate_drop_location: Optional[bool] = False,
266
+ ) -> None:
267
+ """Move to and drop a tip into a given well.
268
+
269
+ Args:
270
+ location: An absolute location to drop the tip at.
271
+ If unspecified, use the default drop height of the well.
272
+ well_core: The well we're dropping into
273
+ home_after: Whether to home the pipette after the tip is dropped.
274
+ """
275
+ if alternate_drop_location:
276
+ raise APIVersionError(api_element="Tip drop randomization")
277
+ labware_core = well_core.geometry.parent
278
+
279
+ if location is None:
280
+ from opentrons.protocol_api.labware import Labware, Well
281
+
282
+ labware = Labware(
283
+ core=labware_core,
284
+ api_version=self._api_version,
285
+ protocol_core=None, # type: ignore[arg-type]
286
+ core_map=None, # type: ignore[arg-type]
287
+ )
288
+ well = Well(parent=labware, core=well_core, api_version=self._api_version)
289
+
290
+ if LabwareLike(labware).is_fixed_trash():
291
+ location = well.top()
292
+ elif self._api_version < APIVersion(2, 2):
293
+ location = well.bottom(z=_PRE_2_2_TIP_DROP_HEIGHT_MM)
294
+ else:
295
+ assert (
296
+ labware_core.is_tip_rack()
297
+ ), "Expected tip drop target to be a tip rack."
298
+
299
+ return_height = self.get_return_height()
300
+ location = well.top(z=-return_height * labware_core.get_tip_length())
301
+
302
+ hw = self._protocol_interface.get_hardware()
303
+ self.move_to(location=location)
304
+ hw.drop_tip(self._mount, home_after=True if home_after is None else home_after)
305
+ self._last_tip_rack_and_well = None
306
+
307
+ if self._api_version < APIVersion(2, 2) and labware_core.is_tip_rack():
308
+ # If this is a tiprack we can try and add the dirty tip back to the tracker
309
+ try:
310
+ labware_core.get_tip_tracker().return_tips(
311
+ start_well=well_core,
312
+ num_channels=self.get_channels(),
313
+ )
314
+ except AssertionError:
315
+ # Similarly to :py:meth:`return_tips`, the failure case here
316
+ # just means the tip can't be reused, so don't actually stop
317
+ # the protocol
318
+ _log.warning(
319
+ f"Could not return tip to {labware_core.get_display_name()}"
320
+ )
321
+
322
+ def drop_tip_in_disposal_location(
323
+ self,
324
+ disposal_location: Union[TrashBin, WasteChute],
325
+ home_after: Optional[bool],
326
+ alternate_tip_drop: bool = False,
327
+ ) -> None:
328
+ raise APIVersionError(api_element="Dropping tips in a trash bin or waste chute")
329
+
330
+ def resin_tip_seal(
331
+ self,
332
+ location: types.Location,
333
+ well_core: WellCore,
334
+ in_place: Optional[bool] = False,
335
+ ) -> None:
336
+ raise APIVersionError(api_element="Sealing resin tips.")
337
+
338
+ def resin_tip_unseal(
339
+ self,
340
+ location: types.Location | None,
341
+ well_core: WellCore,
342
+ ) -> None:
343
+ raise APIVersionError(api_element="Unsealing resin tips.")
344
+
345
+ def resin_tip_dispense(
346
+ self,
347
+ location: types.Location,
348
+ well_core: WellCore,
349
+ volume: Optional[float] = None,
350
+ flow_rate: Optional[float] = None,
351
+ ) -> None:
352
+ raise APIVersionError(api_element="Dispensing liquid from resin tips.")
353
+
354
+ def home(self) -> None:
355
+ """Home the mount"""
356
+ self._protocol_interface.get_hardware().home_z(
357
+ mount=self._mount,
358
+ # preserve buggy behavior in <= 2.12 for strict back. compat.
359
+ # https://github.com/Opentrons/opentrons/issues/7499
360
+ allow_home_other=self._api_version >= APIVersion(2, 13),
361
+ )
362
+ self.home_plunger()
363
+
364
+ def home_plunger(self) -> None:
365
+ """Home the plunger associated with this mount."""
366
+ self._protocol_interface.get_hardware().home_plunger(self._mount)
367
+
368
+ def move_to(
369
+ self,
370
+ location: Union[types.Location, TrashBin, WasteChute],
371
+ well_core: Optional[LegacyWellCore] = None,
372
+ force_direct: bool = False,
373
+ minimum_z_height: Optional[float] = None,
374
+ speed: Optional[float] = None,
375
+ check_for_movement_conflicts: bool = False,
376
+ ) -> None:
377
+ """Move the instrument.
378
+
379
+ Args:
380
+ location: The movement destination.
381
+ well_core: Unused in the legacy instrument core.
382
+ force_direct: Force a direct movement instead of an arc.
383
+ minimum_z_height: Set a minimum travel height for a movement arc.
384
+ speed: Override the travel speed in mm/s.
385
+ check_for_movement_conflicts: Not used in legacy implementation
386
+
387
+ Raises:
388
+ LabwareHeightError: An item on the deck is taller than
389
+ the computed safe travel height.
390
+ """
391
+ if isinstance(location, (TrashBin, WasteChute)):
392
+ raise APIVersionError(api_element="Move To Trash Bin and Waste Chute")
393
+ self.flag_unsafe_move(location)
394
+
395
+ # prevent direct movement bugs in PAPI version >= 2.10
396
+ location_cache_mount = (
397
+ self._mount if self._api_version >= APIVersion(2, 10) else None
398
+ )
399
+
400
+ last_location = self._protocol_interface.get_last_location(
401
+ mount=location_cache_mount
402
+ )
403
+
404
+ if last_location:
405
+ from_lw = last_location.labware
406
+ else:
407
+ from_lw = LabwareLike(None)
408
+
409
+ if not speed:
410
+ speed = self.get_default_speed()
411
+
412
+ hardware = self._protocol_interface.get_hardware()
413
+
414
+ from_center = from_lw.center_multichannel_on_wells() if from_lw else False
415
+ cp_override = CriticalPoint.XY_CENTER if from_center else None
416
+
417
+ from_loc = types.Location(
418
+ hardware.gantry_position(self._mount, critical_point=cp_override), from_lw
419
+ )
420
+
421
+ instr_max_height = hardware.get_instrument_max_height(self._mount)
422
+ moves = planning.plan_moves(
423
+ from_loc,
424
+ location,
425
+ self._protocol_interface.get_deck(),
426
+ instr_max_height,
427
+ force_direct=force_direct,
428
+ minimum_z_height=minimum_z_height,
429
+ )
430
+
431
+ try:
432
+ for move in moves:
433
+ hardware.move_to(
434
+ self._mount,
435
+ move[0],
436
+ critical_point=move[1],
437
+ speed=speed,
438
+ max_speeds=self._protocol_interface.get_max_speeds().data,
439
+ )
440
+ except Exception:
441
+ self._protocol_interface.set_last_location(None)
442
+ raise
443
+ else:
444
+ self._protocol_interface.set_last_location(
445
+ location=location, mount=location_cache_mount
446
+ )
447
+
448
+ def get_mount(self) -> types.Mount:
449
+ """Get the mount this pipette is attached to."""
450
+ return self._mount
451
+
452
+ def get_instrument_name(self) -> str:
453
+ """Get the instrument name."""
454
+ return self._instrument_name
455
+
456
+ def get_pipette_name(self) -> str:
457
+ """Get the pipette name."""
458
+ return self.get_hardware_state()["name"]
459
+
460
+ def get_model(self) -> str:
461
+ """Get the model name."""
462
+ return self.get_hardware_state()["model"]
463
+
464
+ def get_display_name(self) -> str:
465
+ """Get the display name"""
466
+ return self.get_hardware_state()["display_name"]
467
+
468
+ def get_min_volume(self) -> float:
469
+ """Get the min volume."""
470
+ return self.get_hardware_state()["min_volume"]
471
+
472
+ def get_max_volume(self) -> float:
473
+ """Get the max volume."""
474
+ return self.get_hardware_state()["max_volume"]
475
+
476
+ def get_working_volume(self) -> float:
477
+ """Get the working volume."""
478
+ return self.get_hardware_state()["working_volume"]
479
+
480
+ def get_current_volume(self) -> float:
481
+ """Get the current volume."""
482
+ return self.get_hardware_state()["current_volume"]
483
+
484
+ def get_has_clean_tip(self) -> bool:
485
+ """Get if has a clean tip, only used with LLD and engine commands."""
486
+ return False
487
+
488
+ def get_available_volume(self) -> float:
489
+ """Get the available volume."""
490
+ return self.get_hardware_state()["available_volume"]
491
+
492
+ def get_hardware_state(self) -> PipetteDict:
493
+ """Get the hardware pipette dictionary."""
494
+ sync_hw_api = self._protocol_interface.get_hardware()
495
+ pipette: Optional[PipetteDict] = sync_hw_api.get_attached_instrument(
496
+ self._mount
497
+ )
498
+
499
+ if pipette is None:
500
+ raise types.PipetteNotAttachedError()
501
+
502
+ return pipette
503
+
504
+ def get_channels(self) -> int:
505
+ """Number of channels."""
506
+ return self.get_hardware_state()["channels"]
507
+
508
+ def has_tip(self) -> bool:
509
+ """Whether a tip is attached."""
510
+ return self.get_hardware_state()["has_tip"]
511
+
512
+ def is_ready_to_aspirate(self) -> bool:
513
+ return self.get_hardware_state()["ready_to_aspirate"]
514
+
515
+ def prepare_to_aspirate(self) -> None:
516
+ self._protocol_interface.get_hardware().prepare_for_aspirate(self._mount)
517
+
518
+ def get_return_height(self) -> float:
519
+ """The height to return a tip to its tiprack."""
520
+ return self.get_hardware_state().get("return_tip_height", 0.5)
521
+
522
+ def get_flow_rate(self) -> FlowRates:
523
+ return self._flow_rates
524
+
525
+ def get_liquid_presence_detection(self) -> bool:
526
+ return self._liquid_presence_detection
527
+
528
+ def get_aspirate_flow_rate(self, rate: float = 1.0) -> float:
529
+ return self.get_hardware_state()["aspirate_flow_rate"] * rate
530
+
531
+ def get_dispense_flow_rate(self, rate: float = 1.0) -> float:
532
+ return self.get_hardware_state()["dispense_flow_rate"] * rate
533
+
534
+ def get_blow_out_flow_rate(self, rate: float = 1.0) -> float:
535
+ return self.get_hardware_state()["blow_out_flow_rate"] * rate
536
+
537
+ def get_speed(self) -> PlungerSpeeds:
538
+ return self._speeds
539
+
540
+ def get_tip_origin(
541
+ self,
542
+ ) -> Optional[Tuple[LegacyLabwareCore, LegacyWellCore]]:
543
+ return self._last_tip_rack_and_well
544
+
545
+ def set_flow_rate(
546
+ self,
547
+ aspirate: Optional[float] = None,
548
+ dispense: Optional[float] = None,
549
+ blow_out: Optional[float] = None,
550
+ ) -> None:
551
+ """Set the flow rates."""
552
+ self._protocol_interface.get_hardware().set_flow_rate(
553
+ mount=self._mount,
554
+ aspirate=aspirate,
555
+ dispense=dispense,
556
+ blow_out=blow_out,
557
+ )
558
+
559
+ def set_liquid_presence_detection(self, enable: bool) -> None:
560
+ self._protocol_interface.get_hardware().set_liquid_presence_detection(enable)
561
+
562
+ def set_pipette_speed(
563
+ self,
564
+ aspirate: Optional[float] = None,
565
+ dispense: Optional[float] = None,
566
+ blow_out: Optional[float] = None,
567
+ ) -> None:
568
+ """Set pipette speeds."""
569
+ self._protocol_interface.get_hardware().set_pipette_speed(
570
+ mount=self._mount,
571
+ aspirate=aspirate,
572
+ dispense=dispense,
573
+ blow_out=blow_out,
574
+ )
575
+
576
+ def flag_unsafe_move(self, location: types.Location) -> None:
577
+ """Check if a movement to a destination is potentially unsafe.
578
+
579
+ Args:
580
+ location: The movement destination.
581
+
582
+ Raises:
583
+ RuntimeError: The movement is unsafe.
584
+ """
585
+ from_loc = self._protocol_interface.get_last_location()
586
+
587
+ if not from_loc:
588
+ from_loc = types.Location(types.Point(0, 0, 0), LabwareLike(None))
589
+
590
+ for mod in self._protocol_interface.get_module_cores():
591
+ if isinstance(mod, LegacyThermocyclerCore):
592
+ mod.flag_unsafe_move(to_loc=location, from_loc=from_loc)
593
+ elif isinstance(mod, LegacyHeaterShakerCore):
594
+ mod.flag_unsafe_move(
595
+ to_loc=location,
596
+ is_multichannel=self.get_channels() > 1,
597
+ )
598
+
599
+ def configure_for_volume(self, volume: float) -> None:
600
+ """This will never be called because it was added in API 2.15."""
601
+ pass
602
+
603
+ def configure_nozzle_layout(
604
+ self,
605
+ style: NozzleLayout,
606
+ primary_nozzle: Optional[str],
607
+ front_right_nozzle: Optional[str],
608
+ back_left_nozzle: Optional[str],
609
+ ) -> None:
610
+ """This will never be called because it was added in API 2.16."""
611
+ pass
612
+
613
+ def transfer_with_liquid_class(
614
+ self,
615
+ liquid_class: LiquidClass,
616
+ volume: float,
617
+ source: List[Tuple[types.Location, LegacyWellCore]],
618
+ dest: Union[List[Tuple[types.Location, LegacyWellCore]], TrashBin, WasteChute],
619
+ new_tip: TransferTipPolicyV2,
620
+ tip_racks: List[Tuple[types.Location, LegacyLabwareCore]],
621
+ starting_tip: Optional[LegacyWellCore],
622
+ trash_location: Union[types.Location, TrashBin, WasteChute],
623
+ return_tip: bool,
624
+ keep_last_tip: bool,
625
+ ) -> None:
626
+ """This will never be called because it was added in API 2.23"""
627
+ assert False, "transfer_liquid is not supported in legacy context"
628
+
629
+ def distribute_with_liquid_class(
630
+ self,
631
+ liquid_class: LiquidClass,
632
+ volume: float,
633
+ source: Tuple[types.Location, LegacyWellCore],
634
+ dest: List[Tuple[types.Location, LegacyWellCore]],
635
+ new_tip: Literal[TransferTipPolicyV2.NEVER, TransferTipPolicyV2.ONCE],
636
+ tip_racks: List[Tuple[types.Location, LegacyLabwareCore]],
637
+ starting_tip: Optional[LegacyWellCore],
638
+ trash_location: Union[types.Location, TrashBin, WasteChute],
639
+ return_tip: bool,
640
+ keep_last_tip: bool,
641
+ ) -> None:
642
+ """This will never be called because it was added in API 2.23"""
643
+ assert False, "distribute_liquid is not supported in legacy context"
644
+
645
+ def consolidate_with_liquid_class(
646
+ self,
647
+ liquid_class: LiquidClass,
648
+ volume: float,
649
+ source: List[Tuple[types.Location, LegacyWellCore]],
650
+ dest: Union[Tuple[types.Location, LegacyWellCore], TrashBin, WasteChute],
651
+ new_tip: Literal[TransferTipPolicyV2.NEVER, TransferTipPolicyV2.ONCE],
652
+ tip_racks: List[Tuple[types.Location, LegacyLabwareCore]],
653
+ starting_tip: Optional[LegacyWellCore],
654
+ trash_location: Union[types.Location, TrashBin, WasteChute],
655
+ return_tip: bool,
656
+ keep_last_tip: bool,
657
+ ) -> None:
658
+ """This will never be called because it was added in API 2.23."""
659
+ assert False, "consolidate_liquid is not supported in legacy context"
660
+
661
+ def get_active_channels(self) -> int:
662
+ """This will never be called because it was added in API 2.16."""
663
+ assert False, "get_active_channels only supported in API 2.16 & later"
664
+
665
+ def get_nozzle_map(self) -> types.NozzleMapInterface:
666
+ """This will never be called because it was added in API 2.18."""
667
+ assert False, "get_nozzle_map only supported in API 2.18 & later"
668
+
669
+ def is_tip_tracking_available(self) -> bool:
670
+ # Tip tracking is always available in legacy context
671
+ return True
672
+
673
+ def retract(self) -> None:
674
+ """Retract this instrument to the top of the gantry."""
675
+ self._protocol_interface.get_hardware.retract(self._mount) # type: ignore [attr-defined]
676
+
677
+ def detect_liquid_presence(self, well_core: WellCore, loc: types.Location) -> bool:
678
+ """This will never be called because it was added in API 2.20."""
679
+ assert False, "detect_liquid_presence only supported in API 2.20 & later"
680
+
681
+ def liquid_probe_with_recovery(
682
+ self, well_core: WellCore, loc: types.Location
683
+ ) -> None:
684
+ """This will never be called because it was added in API 2.20."""
685
+ assert False, "liquid_probe_with_recovery only supported in API 2.20 & later"
686
+
687
+ def liquid_probe_without_recovery(
688
+ self, well_core: WellCore, loc: types.Location
689
+ ) -> LiquidTrackingType:
690
+ """This will never be called because it was added in API 2.20."""
691
+ assert False, "liquid_probe_without_recovery only supported in API 2.20 & later"
692
+
693
+ def _pressure_supported_by_pipette(self) -> bool:
694
+ return False
695
+
696
+ def nozzle_configuration_valid_for_lld(self) -> bool:
697
+ """Check if the nozzle configuration currently supports LLD."""
698
+ return False
699
+
700
+ def get_minimum_liquid_sense_height(self) -> float:
701
+ return 0.0
702
+
703
+ def estimate_liquid_height(
704
+ self,
705
+ well_core: LegacyWellCore,
706
+ starting_liquid_height: float,
707
+ operation_volume: float,
708
+ ) -> float:
709
+ return 0.0