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,171 @@
1
+ """Command models to execute a Thermocycler profile."""
2
+ from __future__ import annotations
3
+ from typing import List, Optional, TYPE_CHECKING, overload, Union, Any
4
+ from typing_extensions import Literal, Type
5
+
6
+ from pydantic import BaseModel, Field
7
+ from pydantic.json_schema import SkipJsonSchema
8
+
9
+ from opentrons.hardware_control.modules.types import ThermocyclerStep, ThermocyclerCycle
10
+
11
+ from ..command import AbstractCommandImpl, BaseCommand, BaseCommandCreate, SuccessData
12
+ from ...errors.error_occurrence import ErrorOccurrence
13
+
14
+ if TYPE_CHECKING:
15
+ from opentrons.protocol_engine.state.state import StateView
16
+ from opentrons.protocol_engine.execution import EquipmentHandler
17
+ from opentrons.protocol_engine.state.module_substates.thermocycler_module_substate import (
18
+ ThermocyclerModuleSubState,
19
+ )
20
+
21
+
22
+ RunExtendedProfileCommandType = Literal["thermocycler/runExtendedProfile"]
23
+
24
+
25
+ def _remove_default(s: dict[str, Any]) -> None:
26
+ s.pop("default", None)
27
+
28
+
29
+ class ProfileStep(BaseModel):
30
+ """An individual step in a Thermocycler extended profile."""
31
+
32
+ celsius: float = Field(..., description="Target temperature in °C.")
33
+ holdSeconds: float = Field(
34
+ ..., description="Time to hold target temperature in seconds."
35
+ )
36
+
37
+
38
+ class ProfileCycle(BaseModel):
39
+ """An individual cycle in a Thermocycler extended profile."""
40
+
41
+ steps: List[ProfileStep] = Field(..., description="Steps to repeat.")
42
+ repetitions: int = Field(..., description="Number of times to repeat the steps.")
43
+
44
+
45
+ class RunExtendedProfileParams(BaseModel):
46
+ """Input parameters for an individual Thermocycler profile step."""
47
+
48
+ moduleId: str = Field(..., description="Unique ID of the Thermocycler.")
49
+ profileElements: List[Union[ProfileStep, ProfileCycle]] = Field(
50
+ ...,
51
+ description="Elements of the profile. Each can be either a step or a cycle.",
52
+ )
53
+ blockMaxVolumeUl: float | SkipJsonSchema[None] = Field(
54
+ None,
55
+ description="Amount of liquid in uL of the most-full well"
56
+ " in labware loaded onto the thermocycler.",
57
+ json_schema_extra=_remove_default,
58
+ )
59
+
60
+
61
+ class RunExtendedProfileResult(BaseModel):
62
+ """Result data from running a Thermocycler profile."""
63
+
64
+
65
+ def _transform_profile_step(
66
+ step: ProfileStep, thermocycler_state: ThermocyclerModuleSubState
67
+ ) -> ThermocyclerStep:
68
+ return ThermocyclerStep(
69
+ temperature=thermocycler_state.validate_target_block_temperature(step.celsius),
70
+ hold_time_seconds=step.holdSeconds,
71
+ )
72
+
73
+
74
+ @overload
75
+ def _transform_profile_element(
76
+ element: ProfileStep, thermocycler_state: ThermocyclerModuleSubState
77
+ ) -> ThermocyclerStep:
78
+ ...
79
+
80
+
81
+ @overload
82
+ def _transform_profile_element(
83
+ element: ProfileCycle, thermocycler_state: ThermocyclerModuleSubState
84
+ ) -> ThermocyclerCycle:
85
+ ...
86
+
87
+
88
+ def _transform_profile_element(
89
+ element: Union[ProfileStep, ProfileCycle],
90
+ thermocycler_state: ThermocyclerModuleSubState,
91
+ ) -> Union[ThermocyclerStep, ThermocyclerCycle]:
92
+ if isinstance(element, ProfileStep):
93
+ return _transform_profile_step(element, thermocycler_state)
94
+ else:
95
+ return ThermocyclerCycle(
96
+ steps=[
97
+ _transform_profile_step(step, thermocycler_state)
98
+ for step in element.steps
99
+ ],
100
+ repetitions=element.repetitions,
101
+ )
102
+
103
+
104
+ class RunExtendedProfileImpl(
105
+ AbstractCommandImpl[RunExtendedProfileParams, SuccessData[RunExtendedProfileResult]]
106
+ ):
107
+ """Execution implementation of a Thermocycler's run profile command."""
108
+
109
+ def __init__(
110
+ self,
111
+ state_view: StateView,
112
+ equipment: EquipmentHandler,
113
+ **unused_dependencies: object,
114
+ ) -> None:
115
+ self._state_view = state_view
116
+ self._equipment = equipment
117
+
118
+ async def execute(
119
+ self, params: RunExtendedProfileParams
120
+ ) -> SuccessData[RunExtendedProfileResult]:
121
+ """Run a Thermocycler profile."""
122
+ thermocycler_state = self._state_view.modules.get_thermocycler_module_substate(
123
+ params.moduleId
124
+ )
125
+ thermocycler_hardware = self._equipment.get_module_hardware_api(
126
+ thermocycler_state.module_id
127
+ )
128
+
129
+ profile = [
130
+ _transform_profile_element(element, thermocycler_state)
131
+ for element in params.profileElements
132
+ ]
133
+ target_volume: Optional[float]
134
+ if params.blockMaxVolumeUl is not None:
135
+ target_volume = thermocycler_state.validate_max_block_volume(
136
+ params.blockMaxVolumeUl
137
+ )
138
+ else:
139
+ target_volume = None
140
+
141
+ if thermocycler_hardware is not None:
142
+ # TODO(jbl 2022-06-27) hardcoded constant 1 for `repetitions` should be
143
+ # moved from HardwareControlAPI to the Python ProtocolContext
144
+ await thermocycler_hardware.execute_profile(
145
+ profile=profile, volume=target_volume
146
+ )
147
+
148
+ return SuccessData(
149
+ public=RunExtendedProfileResult(),
150
+ )
151
+
152
+
153
+ class RunExtendedProfile(
154
+ BaseCommand[RunExtendedProfileParams, RunExtendedProfileResult, ErrorOccurrence]
155
+ ):
156
+ """A command to execute a Thermocycler profile run."""
157
+
158
+ commandType: RunExtendedProfileCommandType = "thermocycler/runExtendedProfile"
159
+ params: RunExtendedProfileParams
160
+ result: Optional[RunExtendedProfileResult] = None
161
+
162
+ _ImplementationCls: Type[RunExtendedProfileImpl] = RunExtendedProfileImpl
163
+
164
+
165
+ class RunExtendedProfileCreate(BaseCommandCreate[RunExtendedProfileParams]):
166
+ """A request to execute a Thermocycler profile run."""
167
+
168
+ commandType: RunExtendedProfileCommandType = "thermocycler/runExtendedProfile"
169
+ params: RunExtendedProfileParams
170
+
171
+ _CommandCls: Type[RunExtendedProfile] = RunExtendedProfile
@@ -0,0 +1,124 @@
1
+ """Command models to execute a Thermocycler profile."""
2
+ from __future__ import annotations
3
+ from typing import List, Optional, TYPE_CHECKING, Any
4
+ from typing_extensions import Literal, Type
5
+
6
+ from pydantic import BaseModel, Field
7
+ from pydantic.json_schema import SkipJsonSchema
8
+
9
+ from opentrons.hardware_control.modules.types import ThermocyclerStep
10
+
11
+ from ..command import AbstractCommandImpl, BaseCommand, BaseCommandCreate, SuccessData
12
+ from ...errors.error_occurrence import ErrorOccurrence
13
+
14
+ if TYPE_CHECKING:
15
+ from opentrons.protocol_engine.state.state import StateView
16
+ from opentrons.protocol_engine.execution import EquipmentHandler
17
+
18
+
19
+ RunProfileCommandType = Literal["thermocycler/runProfile"]
20
+
21
+
22
+ def _remove_default(s: dict[str, Any]) -> None:
23
+ s.pop("default", None)
24
+
25
+
26
+ class RunProfileStepParams(BaseModel):
27
+ """Input parameters for an individual Thermocycler profile step."""
28
+
29
+ celsius: float = Field(..., description="Target temperature in °C.")
30
+ holdSeconds: float = Field(
31
+ ..., description="Time to hold target temperature at in seconds."
32
+ )
33
+
34
+
35
+ class RunProfileParams(BaseModel):
36
+ """Input parameters to run a Thermocycler profile."""
37
+
38
+ moduleId: str = Field(..., description="Unique ID of the Thermocycler.")
39
+ profile: List[RunProfileStepParams] = Field(
40
+ ...,
41
+ description="Array of profile steps with target temperature and temperature hold time.",
42
+ )
43
+ blockMaxVolumeUl: float | SkipJsonSchema[None] = Field(
44
+ None,
45
+ description="Amount of liquid in uL of the most-full well"
46
+ " in labware loaded onto the thermocycler.",
47
+ json_schema_extra=_remove_default,
48
+ )
49
+
50
+
51
+ class RunProfileResult(BaseModel):
52
+ """Result data from running a Thermocycler profile."""
53
+
54
+
55
+ class RunProfileImpl(
56
+ AbstractCommandImpl[RunProfileParams, SuccessData[RunProfileResult]]
57
+ ):
58
+ """Execution implementation of a Thermocycler's run profile command."""
59
+
60
+ def __init__(
61
+ self,
62
+ state_view: StateView,
63
+ equipment: EquipmentHandler,
64
+ **unused_dependencies: object,
65
+ ) -> None:
66
+ self._state_view = state_view
67
+ self._equipment = equipment
68
+
69
+ async def execute(self, params: RunProfileParams) -> SuccessData[RunProfileResult]:
70
+ """Run a Thermocycler profile."""
71
+ thermocycler_state = self._state_view.modules.get_thermocycler_module_substate(
72
+ params.moduleId
73
+ )
74
+ thermocycler_hardware = self._equipment.get_module_hardware_api(
75
+ thermocycler_state.module_id
76
+ )
77
+
78
+ steps = [
79
+ ThermocyclerStep(
80
+ temperature=thermocycler_state.validate_target_block_temperature(
81
+ profile_step.celsius
82
+ ),
83
+ hold_time_seconds=profile_step.holdSeconds,
84
+ )
85
+ for profile_step in params.profile
86
+ ]
87
+
88
+ target_volume: Optional[float]
89
+ if params.blockMaxVolumeUl is not None:
90
+ target_volume = thermocycler_state.validate_max_block_volume(
91
+ params.blockMaxVolumeUl
92
+ )
93
+ else:
94
+ target_volume = None
95
+
96
+ if thermocycler_hardware is not None:
97
+ # TODO(jbl 2022-06-27) hardcoded constant 1 for `repetitions` should be
98
+ # moved from HardwareControlAPI to the Python ProtocolContext
99
+ await thermocycler_hardware.cycle_temperatures(
100
+ steps=steps, repetitions=1, volume=target_volume
101
+ )
102
+
103
+ return SuccessData(
104
+ public=RunProfileResult(),
105
+ )
106
+
107
+
108
+ class RunProfile(BaseCommand[RunProfileParams, RunProfileResult, ErrorOccurrence]):
109
+ """A command to execute a Thermocycler profile run."""
110
+
111
+ commandType: RunProfileCommandType = "thermocycler/runProfile"
112
+ params: RunProfileParams
113
+ result: Optional[RunProfileResult] = None
114
+
115
+ _ImplementationCls: Type[RunProfileImpl] = RunProfileImpl
116
+
117
+
118
+ class RunProfileCreate(BaseCommandCreate[RunProfileParams]):
119
+ """A request to execute a Thermocycler profile run."""
120
+
121
+ commandType: RunProfileCommandType = "thermocycler/runProfile"
122
+ params: RunProfileParams
123
+
124
+ _CommandCls: Type[RunProfile] = RunProfile
@@ -0,0 +1,140 @@
1
+ """Command models to start heating a Thermocycler's block."""
2
+ from __future__ import annotations
3
+ from typing import Optional, TYPE_CHECKING, Any
4
+ from typing_extensions import Literal, Type
5
+
6
+ from pydantic import BaseModel, Field
7
+ from pydantic.json_schema import SkipJsonSchema
8
+
9
+ from ..command import AbstractCommandImpl, BaseCommand, BaseCommandCreate, SuccessData
10
+ from ...errors.error_occurrence import ErrorOccurrence
11
+
12
+ if TYPE_CHECKING:
13
+ from opentrons.protocol_engine.state.state import StateView
14
+ from opentrons.protocol_engine.execution import EquipmentHandler
15
+
16
+
17
+ SetTargetBlockTemperatureCommandType = Literal["thermocycler/setTargetBlockTemperature"]
18
+
19
+
20
+ def _remove_default(s: dict[str, Any]) -> None:
21
+ s.pop("default", None)
22
+
23
+
24
+ class SetTargetBlockTemperatureParams(BaseModel):
25
+ """Input parameters to set a Thermocycler's target block temperature."""
26
+
27
+ moduleId: str = Field(..., description="Unique ID of the Thermocycler Module.")
28
+ celsius: float = Field(..., description="Target temperature in °C.")
29
+ blockMaxVolumeUl: float | SkipJsonSchema[None] = Field(
30
+ None,
31
+ description="Amount of liquid in uL of the most-full well"
32
+ " in labware loaded onto the thermocycler.",
33
+ json_schema_extra=_remove_default,
34
+ )
35
+ holdTimeSeconds: float | SkipJsonSchema[None] = Field(
36
+ None,
37
+ description="Amount of time, in seconds, to hold the temperature for."
38
+ " If specified, a waitForBlockTemperature command will block until"
39
+ " the given hold time has elapsed.",
40
+ json_schema_extra=_remove_default,
41
+ )
42
+
43
+
44
+ class SetTargetBlockTemperatureResult(BaseModel):
45
+ """Result data from setting a Thermocycler's target block temperature."""
46
+
47
+ targetBlockTemperature: float = Field(
48
+ ...,
49
+ description="The target block temperature that was set after validation.",
50
+ )
51
+
52
+
53
+ class SetTargetBlockTemperatureImpl(
54
+ AbstractCommandImpl[
55
+ SetTargetBlockTemperatureParams,
56
+ SuccessData[SetTargetBlockTemperatureResult],
57
+ ]
58
+ ):
59
+ """Execution implementation of a Thermocycler's set block temperature command."""
60
+
61
+ def __init__(
62
+ self,
63
+ state_view: StateView,
64
+ equipment: EquipmentHandler,
65
+ **unused_dependencies: object,
66
+ ) -> None:
67
+ self._state_view = state_view
68
+ self._equipment = equipment
69
+
70
+ async def execute(
71
+ self,
72
+ params: SetTargetBlockTemperatureParams,
73
+ ) -> SuccessData[SetTargetBlockTemperatureResult]:
74
+ """Set a Thermocycler's target block temperature."""
75
+ thermocycler_state = self._state_view.modules.get_thermocycler_module_substate(
76
+ params.moduleId
77
+ )
78
+ target_temperature = thermocycler_state.validate_target_block_temperature(
79
+ params.celsius
80
+ )
81
+ target_volume: Optional[float]
82
+ if params.blockMaxVolumeUl is not None:
83
+ target_volume = thermocycler_state.validate_max_block_volume(
84
+ params.blockMaxVolumeUl
85
+ )
86
+ else:
87
+ target_volume = None
88
+ hold_time: Optional[float]
89
+ if params.holdTimeSeconds is not None:
90
+ hold_time = thermocycler_state.validate_hold_time(params.holdTimeSeconds)
91
+ else:
92
+ hold_time = None
93
+
94
+ thermocycler_hardware = self._equipment.get_module_hardware_api(
95
+ thermocycler_state.module_id
96
+ )
97
+
98
+ if thermocycler_hardware is not None:
99
+ await thermocycler_hardware.set_target_block_temperature(
100
+ target_temperature, volume=target_volume, hold_time_seconds=hold_time
101
+ )
102
+
103
+ return SuccessData(
104
+ public=SetTargetBlockTemperatureResult(
105
+ targetBlockTemperature=target_temperature
106
+ ),
107
+ )
108
+
109
+
110
+ class SetTargetBlockTemperature(
111
+ BaseCommand[
112
+ SetTargetBlockTemperatureParams,
113
+ SetTargetBlockTemperatureResult,
114
+ ErrorOccurrence,
115
+ ]
116
+ ):
117
+ """A command to set a Thermocycler's target block temperature."""
118
+
119
+ commandType: SetTargetBlockTemperatureCommandType = (
120
+ "thermocycler/setTargetBlockTemperature"
121
+ )
122
+ params: SetTargetBlockTemperatureParams
123
+ result: Optional[SetTargetBlockTemperatureResult] = None
124
+
125
+ _ImplementationCls: Type[
126
+ SetTargetBlockTemperatureImpl
127
+ ] = SetTargetBlockTemperatureImpl
128
+
129
+
130
+ class SetTargetBlockTemperatureCreate(
131
+ BaseCommandCreate[SetTargetBlockTemperatureParams]
132
+ ):
133
+ """A request to create a Thermocycler's set block temperature command."""
134
+
135
+ commandType: SetTargetBlockTemperatureCommandType = (
136
+ "thermocycler/setTargetBlockTemperature"
137
+ )
138
+ params: SetTargetBlockTemperatureParams
139
+
140
+ _CommandCls: Type[SetTargetBlockTemperature] = SetTargetBlockTemperature
@@ -0,0 +1,100 @@
1
+ """Command models to start heating a Thermocycler's lid."""
2
+ from __future__ import annotations
3
+ from typing import Optional, TYPE_CHECKING
4
+ from typing_extensions import Literal, Type
5
+
6
+ from pydantic import BaseModel, Field
7
+
8
+ from ..command import AbstractCommandImpl, BaseCommand, BaseCommandCreate, SuccessData
9
+ from ...errors.error_occurrence import ErrorOccurrence
10
+
11
+ if TYPE_CHECKING:
12
+ from opentrons.protocol_engine.state.state import StateView
13
+ from opentrons.protocol_engine.execution import EquipmentHandler
14
+
15
+
16
+ SetTargetLidTemperatureCommandType = Literal["thermocycler/setTargetLidTemperature"]
17
+
18
+
19
+ class SetTargetLidTemperatureParams(BaseModel):
20
+ """Input parameters to set a Thermocycler's target lid temperature."""
21
+
22
+ moduleId: str = Field(..., description="Unique ID of the Thermocycler Module.")
23
+ celsius: float = Field(..., description="Target temperature in °C.")
24
+
25
+
26
+ class SetTargetLidTemperatureResult(BaseModel):
27
+ """Result data from setting a Thermocycler's target lid temperature."""
28
+
29
+ targetLidTemperature: float = Field(
30
+ ...,
31
+ description="The target lid temperature that was set after validation.",
32
+ )
33
+
34
+
35
+ class SetTargetLidTemperatureImpl(
36
+ AbstractCommandImpl[
37
+ SetTargetLidTemperatureParams, SuccessData[SetTargetLidTemperatureResult]
38
+ ]
39
+ ):
40
+ """Execution implementation of a Thermocycler's set lid temperature command."""
41
+
42
+ def __init__(
43
+ self,
44
+ state_view: StateView,
45
+ equipment: EquipmentHandler,
46
+ **unused_dependencies: object,
47
+ ) -> None:
48
+ self._state_view = state_view
49
+ self._equipment = equipment
50
+
51
+ async def execute(
52
+ self,
53
+ params: SetTargetLidTemperatureParams,
54
+ ) -> SuccessData[SetTargetLidTemperatureResult]:
55
+ """Set a Thermocycler's target lid temperature."""
56
+ thermocycler_state = self._state_view.modules.get_thermocycler_module_substate(
57
+ params.moduleId
58
+ )
59
+ target_temperature = thermocycler_state.validate_target_lid_temperature(
60
+ params.celsius
61
+ )
62
+ thermocycler_hardware = self._equipment.get_module_hardware_api(
63
+ thermocycler_state.module_id
64
+ )
65
+
66
+ if thermocycler_hardware is not None:
67
+ await thermocycler_hardware.set_target_lid_temperature(target_temperature)
68
+
69
+ return SuccessData(
70
+ public=SetTargetLidTemperatureResult(
71
+ targetLidTemperature=target_temperature
72
+ ),
73
+ )
74
+
75
+
76
+ class SetTargetLidTemperature(
77
+ BaseCommand[
78
+ SetTargetLidTemperatureParams, SetTargetLidTemperatureResult, ErrorOccurrence
79
+ ]
80
+ ):
81
+ """A command to set a Thermocycler's target lid temperature."""
82
+
83
+ commandType: SetTargetLidTemperatureCommandType = (
84
+ "thermocycler/setTargetLidTemperature"
85
+ )
86
+ params: SetTargetLidTemperatureParams
87
+ result: Optional[SetTargetLidTemperatureResult] = None
88
+
89
+ _ImplementationCls: Type[SetTargetLidTemperatureImpl] = SetTargetLidTemperatureImpl
90
+
91
+
92
+ class SetTargetLidTemperatureCreate(BaseCommandCreate[SetTargetLidTemperatureParams]):
93
+ """A request to create a Thermocycler's set lid temperature command."""
94
+
95
+ commandType: SetTargetLidTemperatureCommandType = (
96
+ "thermocycler/setTargetLidTemperature"
97
+ )
98
+ params: SetTargetLidTemperatureParams
99
+
100
+ _CommandCls: Type[SetTargetLidTemperature] = SetTargetLidTemperature
@@ -0,0 +1,93 @@
1
+ """Command models to wait for heating a Thermocycler's block."""
2
+ from __future__ import annotations
3
+ from typing import Optional, TYPE_CHECKING
4
+ from typing_extensions import Literal, Type
5
+
6
+ from pydantic import BaseModel, Field
7
+
8
+ from ..command import AbstractCommandImpl, BaseCommand, BaseCommandCreate, SuccessData
9
+ from ...errors.error_occurrence import ErrorOccurrence
10
+
11
+ if TYPE_CHECKING:
12
+ from opentrons.protocol_engine.state.state import StateView
13
+ from opentrons.protocol_engine.execution import EquipmentHandler
14
+
15
+
16
+ WaitForBlockTemperatureCommandType = Literal["thermocycler/waitForBlockTemperature"]
17
+
18
+
19
+ class WaitForBlockTemperatureParams(BaseModel):
20
+ """Input parameters to wait for Thermocycler's target block temperature."""
21
+
22
+ moduleId: str = Field(..., description="Unique ID of the Thermocycler Module.")
23
+
24
+
25
+ class WaitForBlockTemperatureResult(BaseModel):
26
+ """Result data from wait for Thermocycler's target block temperature."""
27
+
28
+
29
+ class WaitForBlockTemperatureImpl(
30
+ AbstractCommandImpl[
31
+ WaitForBlockTemperatureParams, SuccessData[WaitForBlockTemperatureResult]
32
+ ]
33
+ ):
34
+ """Execution implementation of Thermocycler's wait for block temperature command."""
35
+
36
+ def __init__(
37
+ self,
38
+ state_view: StateView,
39
+ equipment: EquipmentHandler,
40
+ **unused_dependencies: object,
41
+ ) -> None:
42
+ self._state_view = state_view
43
+ self._equipment = equipment
44
+
45
+ async def execute(
46
+ self,
47
+ params: WaitForBlockTemperatureParams,
48
+ ) -> SuccessData[WaitForBlockTemperatureResult]:
49
+ """Wait for a Thermocycler's target block temperature."""
50
+ thermocycler_state = self._state_view.modules.get_thermocycler_module_substate(
51
+ params.moduleId
52
+ )
53
+
54
+ # Raises error if no target temperature
55
+ thermocycler_state.get_target_block_temperature()
56
+
57
+ thermocycler_hardware = self._equipment.get_module_hardware_api(
58
+ thermocycler_state.module_id
59
+ )
60
+
61
+ if thermocycler_hardware is not None:
62
+ await thermocycler_hardware.wait_for_block_target()
63
+
64
+ return SuccessData(
65
+ public=WaitForBlockTemperatureResult(),
66
+ )
67
+
68
+
69
+ class WaitForBlockTemperature(
70
+ BaseCommand[
71
+ WaitForBlockTemperatureParams, WaitForBlockTemperatureResult, ErrorOccurrence
72
+ ]
73
+ ):
74
+ """A command to wait for a Thermocycler's target block temperature."""
75
+
76
+ commandType: WaitForBlockTemperatureCommandType = (
77
+ "thermocycler/waitForBlockTemperature"
78
+ )
79
+ params: WaitForBlockTemperatureParams
80
+ result: Optional[WaitForBlockTemperatureResult] = None
81
+
82
+ _ImplementationCls: Type[WaitForBlockTemperatureImpl] = WaitForBlockTemperatureImpl
83
+
84
+
85
+ class WaitForBlockTemperatureCreate(BaseCommandCreate[WaitForBlockTemperatureParams]):
86
+ """A request to create Thermocycler's wait for block temperature command."""
87
+
88
+ commandType: WaitForBlockTemperatureCommandType = (
89
+ "thermocycler/waitForBlockTemperature"
90
+ )
91
+ params: WaitForBlockTemperatureParams
92
+
93
+ _CommandCls: Type[WaitForBlockTemperature] = WaitForBlockTemperature