opentrons 8.4.0a2__py2.py3-none-any.whl → 8.4.0a4__py2.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.
- opentrons/legacy_commands/commands.py +83 -2
- opentrons/legacy_commands/helpers.py +59 -1
- opentrons/legacy_commands/types.py +30 -0
- opentrons/protocol_api/core/engine/instrument.py +158 -87
- opentrons/protocol_api/core/engine/pipette_movement_conflict.py +6 -14
- opentrons/protocol_api/core/engine/transfer_components_executor.py +12 -23
- opentrons/protocol_api/core/instrument.py +7 -4
- opentrons/protocol_api/core/legacy/legacy_instrument_core.py +7 -30
- opentrons/protocol_api/core/legacy_simulator/legacy_instrument_core.py +7 -4
- opentrons/protocol_api/core/well.py +1 -1
- opentrons/protocol_api/instrument_context.py +189 -75
- opentrons/protocol_api/labware.py +7 -6
- opentrons/protocol_api/protocol_context.py +18 -16
- opentrons/protocol_engine/commands/__init__.py +38 -38
- opentrons/protocol_engine/commands/aspirate_while_tracking.py +0 -6
- opentrons/protocol_engine/commands/command_unions.py +33 -33
- opentrons/protocol_engine/commands/dispense_while_tracking.py +1 -6
- opentrons/protocol_engine/commands/flex_stacker/empty.py +6 -6
- opentrons/protocol_engine/commands/flex_stacker/fill.py +6 -6
- opentrons/protocol_engine/commands/flex_stacker/retrieve.py +6 -6
- opentrons/protocol_engine/commands/flex_stacker/set_stored_labware.py +9 -9
- opentrons/protocol_engine/commands/flex_stacker/store.py +16 -13
- opentrons/protocol_engine/commands/labware_handling_common.py +6 -1
- opentrons/protocol_engine/commands/liquid_probe.py +1 -2
- opentrons/protocol_engine/commands/move_to_well.py +5 -11
- opentrons/protocol_engine/commands/{evotip_dispense.py → pressure_dispense.py} +27 -27
- opentrons/protocol_engine/commands/{evotip_seal_pipette.py → seal_pipette_to_tip.py} +32 -27
- opentrons/protocol_engine/commands/{evotip_unseal_pipette.py → unseal_pipette_from_tip.py} +22 -22
- opentrons/protocol_engine/labware_offset_standardization.py +22 -1
- opentrons/protocol_engine/resources/deck_configuration_provider.py +8 -4
- opentrons/protocol_engine/state/frustum_helpers.py +12 -4
- opentrons/protocol_engine/state/geometry.py +122 -73
- opentrons/protocol_engine/state/update_types.py +1 -1
- opentrons/protocol_engine/state/wells.py +1 -1
- opentrons/protocol_engine/types/__init__.py +6 -0
- opentrons/protocol_engine/types/location.py +2 -1
- opentrons/protocol_engine/types/well_position.py +18 -1
- opentrons/protocols/advanced_control/transfers/transfer_liquid_utils.py +1 -1
- opentrons/protocols/labware.py +23 -18
- {opentrons-8.4.0a2.dist-info → opentrons-8.4.0a4.dist-info}/METADATA +4 -4
- {opentrons-8.4.0a2.dist-info → opentrons-8.4.0a4.dist-info}/RECORD +45 -45
- {opentrons-8.4.0a2.dist-info → opentrons-8.4.0a4.dist-info}/LICENSE +0 -0
- {opentrons-8.4.0a2.dist-info → opentrons-8.4.0a4.dist-info}/WHEEL +0 -0
- {opentrons-8.4.0a2.dist-info → opentrons-8.4.0a4.dist-info}/entry_points.txt +0 -0
- {opentrons-8.4.0a2.dist-info → opentrons-8.4.0a4.dist-info}/top_level.txt +0 -0
|
@@ -11,7 +11,7 @@ from opentrons.protocols.api_support.util import FlowRates
|
|
|
11
11
|
from opentrons.protocols.advanced_control.transfers.common import TransferTipPolicyV2
|
|
12
12
|
from opentrons.protocol_api._nozzle_layout import NozzleLayout
|
|
13
13
|
from opentrons.protocol_api._liquid import LiquidClass
|
|
14
|
-
from opentrons.protocol_engine.types
|
|
14
|
+
from opentrons.protocol_engine.types import LiquidTrackingType
|
|
15
15
|
|
|
16
16
|
from ..disposal_locations import TrashBin, WasteChute
|
|
17
17
|
from .well import WellCoreType
|
|
@@ -359,7 +359,7 @@ class AbstractInstrument(ABC, Generic[WellCoreType, LabwareCoreType]):
|
|
|
359
359
|
...
|
|
360
360
|
|
|
361
361
|
@abstractmethod
|
|
362
|
-
def
|
|
362
|
+
def transfer_with_liquid_class(
|
|
363
363
|
self,
|
|
364
364
|
liquid_class: LiquidClass,
|
|
365
365
|
volume: float,
|
|
@@ -367,6 +367,7 @@ class AbstractInstrument(ABC, Generic[WellCoreType, LabwareCoreType]):
|
|
|
367
367
|
dest: List[Tuple[types.Location, WellCoreType]],
|
|
368
368
|
new_tip: TransferTipPolicyV2,
|
|
369
369
|
tip_racks: List[Tuple[types.Location, LabwareCoreType]],
|
|
370
|
+
starting_tip: Optional[WellCoreType],
|
|
370
371
|
trash_location: Union[types.Location, TrashBin, WasteChute],
|
|
371
372
|
return_tip: bool,
|
|
372
373
|
) -> None:
|
|
@@ -374,7 +375,7 @@ class AbstractInstrument(ABC, Generic[WellCoreType, LabwareCoreType]):
|
|
|
374
375
|
...
|
|
375
376
|
|
|
376
377
|
@abstractmethod
|
|
377
|
-
def
|
|
378
|
+
def distribute_with_liquid_class(
|
|
378
379
|
self,
|
|
379
380
|
liquid_class: LiquidClass,
|
|
380
381
|
volume: float,
|
|
@@ -382,6 +383,7 @@ class AbstractInstrument(ABC, Generic[WellCoreType, LabwareCoreType]):
|
|
|
382
383
|
dest: List[Tuple[types.Location, WellCoreType]],
|
|
383
384
|
new_tip: TransferTipPolicyV2,
|
|
384
385
|
tip_racks: List[Tuple[types.Location, LabwareCoreType]],
|
|
386
|
+
starting_tip: Optional[WellCoreType],
|
|
385
387
|
trash_location: Union[types.Location, TrashBin, WasteChute],
|
|
386
388
|
return_tip: bool,
|
|
387
389
|
) -> None:
|
|
@@ -392,7 +394,7 @@ class AbstractInstrument(ABC, Generic[WellCoreType, LabwareCoreType]):
|
|
|
392
394
|
...
|
|
393
395
|
|
|
394
396
|
@abstractmethod
|
|
395
|
-
def
|
|
397
|
+
def consolidate_with_liquid_class(
|
|
396
398
|
self,
|
|
397
399
|
liquid_class: LiquidClass,
|
|
398
400
|
volume: float,
|
|
@@ -400,6 +402,7 @@ class AbstractInstrument(ABC, Generic[WellCoreType, LabwareCoreType]):
|
|
|
400
402
|
dest: Tuple[types.Location, WellCoreType],
|
|
401
403
|
new_tip: TransferTipPolicyV2,
|
|
402
404
|
tip_racks: List[Tuple[types.Location, LabwareCoreType]],
|
|
405
|
+
starting_tip: Optional[WellCoreType],
|
|
403
406
|
trash_location: Union[types.Location, TrashBin, WasteChute],
|
|
404
407
|
return_tip: bool,
|
|
405
408
|
) -> None:
|
|
@@ -22,7 +22,7 @@ from opentrons.protocols.geometry import planning
|
|
|
22
22
|
from opentrons.protocol_api._nozzle_layout import NozzleLayout
|
|
23
23
|
from opentrons.protocol_api._liquid import LiquidClass
|
|
24
24
|
|
|
25
|
-
from opentrons.protocol_engine.types
|
|
25
|
+
from opentrons.protocol_engine.types import LiquidTrackingType
|
|
26
26
|
|
|
27
27
|
from ...disposal_locations import TrashBin, WasteChute
|
|
28
28
|
from ..instrument import AbstractInstrument
|
|
@@ -438,32 +438,6 @@ class LegacyInstrumentCore(AbstractInstrument[LegacyWellCore, LegacyLabwareCore]
|
|
|
438
438
|
location=location, mount=location_cache_mount
|
|
439
439
|
)
|
|
440
440
|
|
|
441
|
-
def evotip_seal(
|
|
442
|
-
self,
|
|
443
|
-
location: types.Location,
|
|
444
|
-
well_core: LegacyWellCore,
|
|
445
|
-
in_place: Optional[bool] = False,
|
|
446
|
-
) -> None:
|
|
447
|
-
"""This will never be called because it was added in API 2.22."""
|
|
448
|
-
assert False, "evotip_seal only supported in API 2.22 & later"
|
|
449
|
-
|
|
450
|
-
def evotip_unseal(
|
|
451
|
-
self, location: types.Location, well_core: WellCore, home_after: Optional[bool]
|
|
452
|
-
) -> None:
|
|
453
|
-
"""This will never be called because it was added in API 2.22."""
|
|
454
|
-
assert False, "evotip_unseal only supported in API 2.22 & later"
|
|
455
|
-
|
|
456
|
-
def evotip_dispense(
|
|
457
|
-
self,
|
|
458
|
-
location: types.Location,
|
|
459
|
-
well_core: WellCore,
|
|
460
|
-
volume: Optional[float] = None,
|
|
461
|
-
flow_rate: Optional[float] = None,
|
|
462
|
-
push_out: Optional[float] = None,
|
|
463
|
-
) -> None:
|
|
464
|
-
"""This will never be called because it was added in API 2.22."""
|
|
465
|
-
assert False, "evotip_dispense only supported in API 2.22 & later"
|
|
466
|
-
|
|
467
441
|
def get_mount(self) -> types.Mount:
|
|
468
442
|
"""Get the mount this pipette is attached to."""
|
|
469
443
|
return self._mount
|
|
@@ -624,7 +598,7 @@ class LegacyInstrumentCore(AbstractInstrument[LegacyWellCore, LegacyLabwareCore]
|
|
|
624
598
|
"""This will never be called because it was added in API 2.16."""
|
|
625
599
|
pass
|
|
626
600
|
|
|
627
|
-
def
|
|
601
|
+
def transfer_with_liquid_class(
|
|
628
602
|
self,
|
|
629
603
|
liquid_class: LiquidClass,
|
|
630
604
|
volume: float,
|
|
@@ -632,13 +606,14 @@ class LegacyInstrumentCore(AbstractInstrument[LegacyWellCore, LegacyLabwareCore]
|
|
|
632
606
|
dest: List[Tuple[types.Location, LegacyWellCore]],
|
|
633
607
|
new_tip: TransferTipPolicyV2,
|
|
634
608
|
tip_racks: List[Tuple[types.Location, LegacyLabwareCore]],
|
|
609
|
+
starting_tip: Optional[LegacyWellCore],
|
|
635
610
|
trash_location: Union[types.Location, TrashBin, WasteChute],
|
|
636
611
|
return_tip: bool,
|
|
637
612
|
) -> None:
|
|
638
613
|
"""This will never be called because it was added in API 2.23"""
|
|
639
614
|
assert False, "transfer_liquid is not supported in legacy context"
|
|
640
615
|
|
|
641
|
-
def
|
|
616
|
+
def distribute_with_liquid_class(
|
|
642
617
|
self,
|
|
643
618
|
liquid_class: LiquidClass,
|
|
644
619
|
volume: float,
|
|
@@ -646,13 +621,14 @@ class LegacyInstrumentCore(AbstractInstrument[LegacyWellCore, LegacyLabwareCore]
|
|
|
646
621
|
dest: List[Tuple[types.Location, LegacyWellCore]],
|
|
647
622
|
new_tip: TransferTipPolicyV2,
|
|
648
623
|
tip_racks: List[Tuple[types.Location, LegacyLabwareCore]],
|
|
624
|
+
starting_tip: Optional[LegacyWellCore],
|
|
649
625
|
trash_location: Union[types.Location, TrashBin, WasteChute],
|
|
650
626
|
return_tip: bool,
|
|
651
627
|
) -> None:
|
|
652
628
|
"""This will never be called because it was added in API 2.23"""
|
|
653
629
|
assert False, "distribute_liquid is not supported in legacy context"
|
|
654
630
|
|
|
655
|
-
def
|
|
631
|
+
def consolidate_with_liquid_class(
|
|
656
632
|
self,
|
|
657
633
|
liquid_class: LiquidClass,
|
|
658
634
|
volume: float,
|
|
@@ -660,6 +636,7 @@ class LegacyInstrumentCore(AbstractInstrument[LegacyWellCore, LegacyLabwareCore]
|
|
|
660
636
|
dest: Tuple[types.Location, LegacyWellCore],
|
|
661
637
|
new_tip: TransferTipPolicyV2,
|
|
662
638
|
tip_racks: List[Tuple[types.Location, LegacyLabwareCore]],
|
|
639
|
+
starting_tip: Optional[LegacyWellCore],
|
|
663
640
|
trash_location: Union[types.Location, TrashBin, WasteChute],
|
|
664
641
|
return_tip: bool,
|
|
665
642
|
) -> None:
|
|
@@ -23,7 +23,7 @@ from opentrons_shared_data.errors.exceptions import (
|
|
|
23
23
|
UnexpectedTipAttachError,
|
|
24
24
|
)
|
|
25
25
|
|
|
26
|
-
from opentrons.protocol_engine.types
|
|
26
|
+
from opentrons.protocol_engine.types import LiquidTrackingType
|
|
27
27
|
|
|
28
28
|
from ..legacy.legacy_labware_core import LegacyLabwareCore
|
|
29
29
|
from ...disposal_locations import TrashBin, WasteChute
|
|
@@ -513,7 +513,7 @@ class LegacyInstrumentCoreSimulator(
|
|
|
513
513
|
"""This will never be called because it was added in API 2.15."""
|
|
514
514
|
pass
|
|
515
515
|
|
|
516
|
-
def
|
|
516
|
+
def transfer_with_liquid_class(
|
|
517
517
|
self,
|
|
518
518
|
liquid_class: LiquidClass,
|
|
519
519
|
volume: float,
|
|
@@ -521,13 +521,14 @@ class LegacyInstrumentCoreSimulator(
|
|
|
521
521
|
dest: List[Tuple[types.Location, LegacyWellCore]],
|
|
522
522
|
new_tip: TransferTipPolicyV2,
|
|
523
523
|
tip_racks: List[Tuple[types.Location, LegacyLabwareCore]],
|
|
524
|
+
starting_tip: Optional[LegacyWellCore],
|
|
524
525
|
trash_location: Union[types.Location, TrashBin, WasteChute],
|
|
525
526
|
return_tip: bool,
|
|
526
527
|
) -> None:
|
|
527
528
|
"""This will never be called because it was added in API 2.23."""
|
|
528
529
|
assert False, "transfer_liquid is not supported in legacy context"
|
|
529
530
|
|
|
530
|
-
def
|
|
531
|
+
def distribute_with_liquid_class(
|
|
531
532
|
self,
|
|
532
533
|
liquid_class: LiquidClass,
|
|
533
534
|
volume: float,
|
|
@@ -535,13 +536,14 @@ class LegacyInstrumentCoreSimulator(
|
|
|
535
536
|
dest: List[Tuple[types.Location, LegacyWellCore]],
|
|
536
537
|
new_tip: TransferTipPolicyV2,
|
|
537
538
|
tip_racks: List[Tuple[types.Location, LegacyLabwareCore]],
|
|
539
|
+
starting_tip: Optional[LegacyWellCore],
|
|
538
540
|
trash_location: Union[types.Location, TrashBin, WasteChute],
|
|
539
541
|
return_tip: bool,
|
|
540
542
|
) -> None:
|
|
541
543
|
"""This will never be called because it was added in API 2.23."""
|
|
542
544
|
assert False, "distribute_liquid is not supported in legacy context"
|
|
543
545
|
|
|
544
|
-
def
|
|
546
|
+
def consolidate_with_liquid_class(
|
|
545
547
|
self,
|
|
546
548
|
liquid_class: LiquidClass,
|
|
547
549
|
volume: float,
|
|
@@ -549,6 +551,7 @@ class LegacyInstrumentCoreSimulator(
|
|
|
549
551
|
dest: Tuple[types.Location, LegacyWellCore],
|
|
550
552
|
new_tip: TransferTipPolicyV2,
|
|
551
553
|
tip_racks: List[Tuple[types.Location, LegacyLabwareCore]],
|
|
554
|
+
starting_tip: Optional[LegacyWellCore],
|
|
552
555
|
trash_location: Union[types.Location, TrashBin, WasteChute],
|
|
553
556
|
return_tip: bool,
|
|
554
557
|
) -> None:
|
|
@@ -4,7 +4,7 @@ from abc import ABC, abstractmethod
|
|
|
4
4
|
from typing import TypeVar, Optional, Union
|
|
5
5
|
|
|
6
6
|
from opentrons.types import Point
|
|
7
|
-
from opentrons.protocol_engine.types
|
|
7
|
+
from opentrons.protocol_engine.types import LiquidTrackingType
|
|
8
8
|
|
|
9
9
|
from .._liquid import Liquid
|
|
10
10
|
|
|
@@ -42,7 +42,7 @@ from ..protocols.advanced_control.transfers.common import (
|
|
|
42
42
|
TransferTipPolicyV2,
|
|
43
43
|
TransferTipPolicyV2Type,
|
|
44
44
|
)
|
|
45
|
-
from ..protocol_engine.types
|
|
45
|
+
from ..protocol_engine.types import LiquidTrackingType
|
|
46
46
|
|
|
47
47
|
_DEFAULT_ASPIRATE_CLEARANCE = 1.0
|
|
48
48
|
_DEFAULT_DISPENSE_CLEARANCE = 1.0
|
|
@@ -1509,7 +1509,7 @@ class InstrumentContext(publisher.CommandPublisher):
|
|
|
1509
1509
|
getattr(self, cmd["method"])(*cmd["args"], **cmd["kwargs"])
|
|
1510
1510
|
|
|
1511
1511
|
@requires_version(2, 23)
|
|
1512
|
-
def
|
|
1512
|
+
def transfer_with_liquid_class(
|
|
1513
1513
|
self,
|
|
1514
1514
|
liquid_class: LiquidClass,
|
|
1515
1515
|
volume: float,
|
|
@@ -1526,12 +1526,40 @@ class InstrumentContext(publisher.CommandPublisher):
|
|
|
1526
1526
|
return_tip: bool = False,
|
|
1527
1527
|
visit_every_well: bool = False,
|
|
1528
1528
|
) -> InstrumentContext:
|
|
1529
|
-
"""
|
|
1529
|
+
"""Move a particular type of liquid from one well or group of wells to another.
|
|
1530
1530
|
|
|
1531
|
-
|
|
1531
|
+
:param liquid_class: The type of liquid to move. You must specify the liquid class,
|
|
1532
|
+
even if you have used :py:meth:`.load_liquid` to indicate what liquid the
|
|
1533
|
+
source contains.
|
|
1534
|
+
:type liquid_class: :py:class:`.LiquidClass`
|
|
1535
|
+
|
|
1536
|
+
:param volume: The amount, in µL, to aspirate from each source and dispense to
|
|
1537
|
+
each destination.
|
|
1538
|
+
:param source: A single well or a list of wells to aspirate liquid from.
|
|
1539
|
+
:param dest: A single well or a list of wells to dispense liquid into.
|
|
1540
|
+
:param new_tip: When to pick up and drop tips during the command.
|
|
1541
|
+
Defaults to ``"once"``.
|
|
1542
|
+
|
|
1543
|
+
- ``"once"``: Use one tip for the entire command.
|
|
1544
|
+
- ``"always"``: Use a new tip for each set of aspirate and dispense steps.
|
|
1545
|
+
- ``"per source"``: Use one tip for each source well, even if
|
|
1546
|
+
:ref:`tip refilling <complex-tip-refilling>` is required.
|
|
1547
|
+
- ``"never"``: Do not pick up or drop tips at all.
|
|
1548
|
+
|
|
1549
|
+
See :ref:`param-tip-handling` for details.
|
|
1550
|
+
|
|
1551
|
+
:param trash_location: A trash container, well, or other location to dispose of
|
|
1552
|
+
tips. Depending on the liquid class, the pipette may also blow out liquid here.
|
|
1553
|
+
:param return_tip: Whether to drop used tips in their original locations
|
|
1554
|
+
in the tip rack, instead of the trash.
|
|
1555
|
+
"""
|
|
1556
|
+
if volume == 0.0:
|
|
1557
|
+
_log.info(
|
|
1558
|
+
f"Transfer of {liquid_class.name} specified with a volume of 0uL."
|
|
1559
|
+
f" Skipping."
|
|
1560
|
+
)
|
|
1561
|
+
return self
|
|
1532
1562
|
|
|
1533
|
-
:meta private:
|
|
1534
|
-
"""
|
|
1535
1563
|
transfer_args = verify_and_normalize_transfer_args(
|
|
1536
1564
|
source=source,
|
|
1537
1565
|
dest=dest,
|
|
@@ -1552,29 +1580,42 @@ class InstrumentContext(publisher.CommandPublisher):
|
|
|
1552
1580
|
" to transfer liquid onto one destinations from many sources, use 'consolidate_liquid'."
|
|
1553
1581
|
)
|
|
1554
1582
|
|
|
1555
|
-
|
|
1556
|
-
|
|
1557
|
-
|
|
1558
|
-
|
|
1559
|
-
|
|
1560
|
-
|
|
1561
|
-
|
|
1562
|
-
|
|
1563
|
-
|
|
1564
|
-
|
|
1565
|
-
|
|
1566
|
-
|
|
1567
|
-
|
|
1568
|
-
|
|
1569
|
-
|
|
1570
|
-
|
|
1571
|
-
|
|
1572
|
-
|
|
1573
|
-
|
|
1583
|
+
with publisher.publish_context(
|
|
1584
|
+
broker=self.broker,
|
|
1585
|
+
command=cmds.transfer_with_liquid_class(
|
|
1586
|
+
instrument=self,
|
|
1587
|
+
liquid_class=liquid_class,
|
|
1588
|
+
volume=volume,
|
|
1589
|
+
source=source,
|
|
1590
|
+
destination=dest,
|
|
1591
|
+
),
|
|
1592
|
+
):
|
|
1593
|
+
self._core.transfer_with_liquid_class(
|
|
1594
|
+
liquid_class=liquid_class,
|
|
1595
|
+
volume=volume,
|
|
1596
|
+
source=[
|
|
1597
|
+
(types.Location(types.Point(), labware=well), well._core)
|
|
1598
|
+
for well in transfer_args.sources_list
|
|
1599
|
+
],
|
|
1600
|
+
dest=[
|
|
1601
|
+
(types.Location(types.Point(), labware=well), well._core)
|
|
1602
|
+
for well in transfer_args.destinations_list
|
|
1603
|
+
],
|
|
1604
|
+
new_tip=transfer_args.tip_policy,
|
|
1605
|
+
tip_racks=[
|
|
1606
|
+
(types.Location(types.Point(), labware=rack), rack._core)
|
|
1607
|
+
for rack in transfer_args.tip_racks
|
|
1608
|
+
],
|
|
1609
|
+
starting_tip=self.starting_tip._core
|
|
1610
|
+
if self.starting_tip is not None
|
|
1611
|
+
else None,
|
|
1612
|
+
trash_location=transfer_args.trash_location,
|
|
1613
|
+
return_tip=return_tip,
|
|
1614
|
+
)
|
|
1574
1615
|
return self
|
|
1575
1616
|
|
|
1576
1617
|
@requires_version(2, 23)
|
|
1577
|
-
def
|
|
1618
|
+
def distribute_with_liquid_class(
|
|
1578
1619
|
self,
|
|
1579
1620
|
liquid_class: LiquidClass,
|
|
1580
1621
|
volume: float,
|
|
@@ -1590,13 +1631,38 @@ class InstrumentContext(publisher.CommandPublisher):
|
|
|
1590
1631
|
visit_every_well: bool = False,
|
|
1591
1632
|
) -> InstrumentContext:
|
|
1592
1633
|
"""
|
|
1593
|
-
Distribute liquid from
|
|
1594
|
-
|
|
1634
|
+
Distribute a particular type of liquid from one well to a group of wells.
|
|
1635
|
+
|
|
1636
|
+
:param liquid_class: The type of liquid to move. You must specify the liquid class,
|
|
1637
|
+
even if you have used :py:meth:`.load_liquid` to indicate what liquid the
|
|
1638
|
+
source contains.
|
|
1639
|
+
:type liquid_class: :py:class:`.LiquidClass`
|
|
1640
|
+
|
|
1641
|
+
:param volume: The amount, in µL, to aspirate from the source and dispense to
|
|
1642
|
+
each destination.
|
|
1643
|
+
:param source: A single well to aspirate liquid from.
|
|
1644
|
+
:param dest: A list of wells to dispense liquid into.
|
|
1645
|
+
:param new_tip: When to pick up and drop tips during the command.
|
|
1646
|
+
Defaults to ``"once"``.
|
|
1595
1647
|
|
|
1596
|
-
|
|
1648
|
+
- ``"once"`` or ``"per source"``: Use one tip for the entire command.
|
|
1649
|
+
- ``"always"``: Use a new tip for each set of aspirate and dispense steps.
|
|
1650
|
+
- ``"never"``: Do not pick up or drop tips at all.
|
|
1597
1651
|
|
|
1598
|
-
|
|
1652
|
+
See :ref:`param-tip-handling` for details.
|
|
1653
|
+
|
|
1654
|
+
:param trash_location: A trash container, well, or other location to dispose of
|
|
1655
|
+
tips. Depending on the liquid class, the pipette may also blow out liquid here.
|
|
1656
|
+
:param return_tip: Whether to drop used tips in their original locations
|
|
1657
|
+
in the tip rack, instead of the trash.
|
|
1599
1658
|
"""
|
|
1659
|
+
if volume == 0.0:
|
|
1660
|
+
_log.info(
|
|
1661
|
+
f"Distribution of {liquid_class.name} specified with a volume of 0uL."
|
|
1662
|
+
f" Skipping."
|
|
1663
|
+
)
|
|
1664
|
+
return self
|
|
1665
|
+
|
|
1600
1666
|
transfer_args = verify_and_normalize_transfer_args(
|
|
1601
1667
|
source=source,
|
|
1602
1668
|
dest=dest,
|
|
@@ -1621,29 +1687,42 @@ class InstrumentContext(publisher.CommandPublisher):
|
|
|
1621
1687
|
)
|
|
1622
1688
|
|
|
1623
1689
|
verified_source = transfer_args.sources_list[0]
|
|
1624
|
-
|
|
1625
|
-
|
|
1626
|
-
|
|
1627
|
-
|
|
1628
|
-
|
|
1629
|
-
|
|
1690
|
+
with publisher.publish_context(
|
|
1691
|
+
broker=self.broker,
|
|
1692
|
+
command=cmds.distribute_with_liquid_class(
|
|
1693
|
+
instrument=self,
|
|
1694
|
+
liquid_class=liquid_class,
|
|
1695
|
+
volume=volume,
|
|
1696
|
+
source=source,
|
|
1697
|
+
destination=dest,
|
|
1630
1698
|
),
|
|
1631
|
-
|
|
1632
|
-
|
|
1633
|
-
|
|
1634
|
-
|
|
1635
|
-
|
|
1636
|
-
|
|
1637
|
-
|
|
1638
|
-
|
|
1639
|
-
|
|
1640
|
-
|
|
1641
|
-
|
|
1642
|
-
|
|
1699
|
+
):
|
|
1700
|
+
self._core.distribute_with_liquid_class(
|
|
1701
|
+
liquid_class=liquid_class,
|
|
1702
|
+
volume=volume,
|
|
1703
|
+
source=(
|
|
1704
|
+
types.Location(types.Point(), labware=verified_source),
|
|
1705
|
+
verified_source._core,
|
|
1706
|
+
),
|
|
1707
|
+
dest=[
|
|
1708
|
+
(types.Location(types.Point(), labware=well), well._core)
|
|
1709
|
+
for well in transfer_args.destinations_list
|
|
1710
|
+
],
|
|
1711
|
+
new_tip=transfer_args.tip_policy,
|
|
1712
|
+
tip_racks=[
|
|
1713
|
+
(types.Location(types.Point(), labware=rack), rack._core)
|
|
1714
|
+
for rack in transfer_args.tip_racks
|
|
1715
|
+
],
|
|
1716
|
+
starting_tip=self.starting_tip._core
|
|
1717
|
+
if self.starting_tip is not None
|
|
1718
|
+
else None,
|
|
1719
|
+
trash_location=transfer_args.trash_location,
|
|
1720
|
+
return_tip=return_tip,
|
|
1721
|
+
)
|
|
1643
1722
|
return self
|
|
1644
1723
|
|
|
1645
1724
|
@requires_version(2, 23)
|
|
1646
|
-
def
|
|
1725
|
+
def consolidate_with_liquid_class(
|
|
1647
1726
|
self,
|
|
1648
1727
|
liquid_class: LiquidClass,
|
|
1649
1728
|
volume: float,
|
|
@@ -1659,13 +1738,39 @@ class InstrumentContext(publisher.CommandPublisher):
|
|
|
1659
1738
|
visit_every_well: bool = False,
|
|
1660
1739
|
) -> InstrumentContext:
|
|
1661
1740
|
"""
|
|
1662
|
-
Consolidate liquid from
|
|
1663
|
-
using the specified liquid class properties.
|
|
1741
|
+
Consolidate a particular type of liquid from a group of wells to one well.
|
|
1664
1742
|
|
|
1665
|
-
|
|
1743
|
+
:param liquid_class: The type of liquid to move. You must specify the liquid class,
|
|
1744
|
+
even if you have used :py:meth:`.load_liquid` to indicate what liquid the
|
|
1745
|
+
source contains.
|
|
1746
|
+
:type liquid_class: :py:class:`.LiquidClass`
|
|
1666
1747
|
|
|
1667
|
-
:
|
|
1748
|
+
:param volume: The amount, in µL, to aspirate from the source and dispense to
|
|
1749
|
+
each destination.
|
|
1750
|
+
:param source: A list of wells to aspirate liquid from.
|
|
1751
|
+
:param dest: A single well to dispense liquid into.
|
|
1752
|
+
:param new_tip: When to pick up and drop tips during the command.
|
|
1753
|
+
Defaults to ``"once"``.
|
|
1754
|
+
|
|
1755
|
+
- ``"once"``: Use one tip for the entire command.
|
|
1756
|
+
- ``"always"``: Use a new tip for each set of aspirate and dispense steps.
|
|
1757
|
+
- ``"per source"``: Not available when consolidating.
|
|
1758
|
+
- ``"never"``: Do not pick up or drop tips at all.
|
|
1759
|
+
|
|
1760
|
+
See :ref:`param-tip-handling` for details.
|
|
1761
|
+
|
|
1762
|
+
:param trash_location: A trash container, well, or other location to dispose of
|
|
1763
|
+
tips. Depending on the liquid class, the pipette may also blow out liquid here.
|
|
1764
|
+
:param return_tip: Whether to drop used tips in their original locations
|
|
1765
|
+
in the tip rack, instead of the trash.
|
|
1668
1766
|
"""
|
|
1767
|
+
if volume == 0.0:
|
|
1768
|
+
_log.info(
|
|
1769
|
+
f"Consolidation of {liquid_class.name} specified with a volume of 0uL."
|
|
1770
|
+
f" Skipping."
|
|
1771
|
+
)
|
|
1772
|
+
return self
|
|
1773
|
+
|
|
1669
1774
|
transfer_args = verify_and_normalize_transfer_args(
|
|
1670
1775
|
source=source,
|
|
1671
1776
|
dest=dest,
|
|
@@ -1690,25 +1795,38 @@ class InstrumentContext(publisher.CommandPublisher):
|
|
|
1690
1795
|
)
|
|
1691
1796
|
|
|
1692
1797
|
verified_dest = transfer_args.destinations_list[0]
|
|
1693
|
-
|
|
1694
|
-
|
|
1695
|
-
|
|
1696
|
-
|
|
1697
|
-
|
|
1698
|
-
|
|
1699
|
-
|
|
1700
|
-
|
|
1701
|
-
types.Location(types.Point(), labware=verified_dest),
|
|
1702
|
-
verified_dest._core,
|
|
1798
|
+
with publisher.publish_context(
|
|
1799
|
+
broker=self.broker,
|
|
1800
|
+
command=cmds.consolidate_with_liquid_class(
|
|
1801
|
+
instrument=self,
|
|
1802
|
+
liquid_class=liquid_class,
|
|
1803
|
+
volume=volume,
|
|
1804
|
+
source=source,
|
|
1805
|
+
destination=dest,
|
|
1703
1806
|
),
|
|
1704
|
-
|
|
1705
|
-
|
|
1706
|
-
|
|
1707
|
-
|
|
1708
|
-
|
|
1709
|
-
|
|
1710
|
-
|
|
1711
|
-
|
|
1807
|
+
):
|
|
1808
|
+
self._core.consolidate_with_liquid_class(
|
|
1809
|
+
liquid_class=liquid_class,
|
|
1810
|
+
volume=volume,
|
|
1811
|
+
source=[
|
|
1812
|
+
(types.Location(types.Point(), labware=well), well._core)
|
|
1813
|
+
for well in transfer_args.sources_list
|
|
1814
|
+
],
|
|
1815
|
+
dest=(
|
|
1816
|
+
types.Location(types.Point(), labware=verified_dest),
|
|
1817
|
+
verified_dest._core,
|
|
1818
|
+
),
|
|
1819
|
+
new_tip=transfer_args.tip_policy,
|
|
1820
|
+
tip_racks=[
|
|
1821
|
+
(types.Location(types.Point(), labware=rack), rack._core)
|
|
1822
|
+
for rack in transfer_args.tip_racks
|
|
1823
|
+
],
|
|
1824
|
+
starting_tip=self.starting_tip._core
|
|
1825
|
+
if self.starting_tip is not None
|
|
1826
|
+
else None,
|
|
1827
|
+
trash_location=transfer_args.trash_location,
|
|
1828
|
+
return_tip=return_tip,
|
|
1829
|
+
)
|
|
1712
1830
|
return self
|
|
1713
1831
|
|
|
1714
1832
|
@requires_version(2, 0)
|
|
@@ -2522,10 +2640,6 @@ class InstrumentContext(publisher.CommandPublisher):
|
|
|
2522
2640
|
"""Check the height of the liquid within a well.
|
|
2523
2641
|
|
|
2524
2642
|
:returns: The height, in mm, of the liquid from the deck.
|
|
2525
|
-
|
|
2526
|
-
:meta private:
|
|
2527
|
-
|
|
2528
|
-
This is intended for Opentrons internal use only and is not a guaranteed API.
|
|
2529
2643
|
"""
|
|
2530
2644
|
self._raise_if_pressure_not_supported_by_pipette()
|
|
2531
2645
|
loc = well.top()
|
|
@@ -46,7 +46,7 @@ from opentrons.protocols.api_support.util import (
|
|
|
46
46
|
APIVersionError,
|
|
47
47
|
UnsupportedAPIError,
|
|
48
48
|
)
|
|
49
|
-
from opentrons.protocol_engine.types
|
|
49
|
+
from opentrons.protocol_engine.types import LiquidTrackingType
|
|
50
50
|
|
|
51
51
|
# TODO(mc, 2022-09-02): re-exports provided for backwards compatibility
|
|
52
52
|
# remove when their usage is no longer needed
|
|
@@ -684,7 +684,7 @@ class Labware:
|
|
|
684
684
|
version: Optional[int] = None,
|
|
685
685
|
) -> Labware:
|
|
686
686
|
"""
|
|
687
|
-
Load a stack of Lids onto a valid
|
|
687
|
+
Load a stack of Opentrons Tough Auto-Sealing Lids onto a valid deck location or adapter.
|
|
688
688
|
|
|
689
689
|
:param str load_name: A string to use for looking up a lid definition.
|
|
690
690
|
You can find the ``load_name`` for any standard lid on the Opentrons
|
|
@@ -705,9 +705,7 @@ class Labware:
|
|
|
705
705
|
leave this unspecified to let ``load_lid_stack()`` choose a version
|
|
706
706
|
automatically.
|
|
707
707
|
|
|
708
|
-
:return:
|
|
709
|
-
|
|
710
|
-
:meta private:
|
|
708
|
+
:return: The initialized and loaded labware object representing the lid stack.
|
|
711
709
|
"""
|
|
712
710
|
if self._api_version < validation.LID_STACK_VERSION_GATE:
|
|
713
711
|
raise APIVersionError(
|
|
@@ -773,11 +771,14 @@ class Labware:
|
|
|
773
771
|
you must either use ``set_offset()`` on all of them or none of them.
|
|
774
772
|
* - 2.14–2.17
|
|
775
773
|
- ``set_offset()`` is not available, and the API raises an error.
|
|
776
|
-
* - 2.18
|
|
774
|
+
* - 2.18--2.22
|
|
777
775
|
-
|
|
778
776
|
- Offsets apply to any labware of the same type, in the same on-deck location.
|
|
779
777
|
- Offsets can't be set on labware that is currently off-deck.
|
|
780
778
|
- Offsets do not follow a labware instance when using :py:meth:`.move_labware`.
|
|
779
|
+
* - 2.23 and newer
|
|
780
|
+
-
|
|
781
|
+
On Flex, offsets can apply to all labware of the same type, regardless of their on-deck location.
|
|
781
782
|
|
|
782
783
|
.. note::
|
|
783
784
|
|