diff --git a/api/src/opentrons/protocol_api/_liquid.py b/api/src/opentrons/protocol_api/_liquid.py index f5a6029e19d..ee6c9459480 100644 --- a/api/src/opentrons/protocol_api/_liquid.py +++ b/api/src/opentrons/protocol_api/_liquid.py @@ -54,7 +54,11 @@ def create(cls, liquid_class_definition: LiquidClassSchemaV1) -> "LiquidClass": for by_pipette in liquid_class_definition.byPipette: tip_settings: Dict[str, TransferProperties] = {} for tip_type in by_pipette.byTipType: - tip_settings[tip_type.tiprack] = build_transfer_properties(tip_type) + # TODO having these refer to the same transfer property object + # but this may change IDK + transfer_props = build_transfer_properties(tip_type) + for tiprack in tip_type.tiprack: + tip_settings[tiprack] = transfer_props by_pipette_settings[by_pipette.pipetteModel] = tip_settings return cls( diff --git a/api/src/opentrons/protocol_engine/types/liquid_class.py b/api/src/opentrons/protocol_engine/types/liquid_class.py index 6c6da968d2a..5f4f06440e0 100644 --- a/api/src/opentrons/protocol_engine/types/liquid_class.py +++ b/api/src/opentrons/protocol_engine/types/liquid_class.py @@ -3,11 +3,11 @@ from pydantic import Field from opentrons_shared_data.liquid_classes.liquid_class_definition import ( - ByTipTypeSetting, + TransferProperties, ) -class LiquidClassRecord(ByTipTypeSetting, frozen=True): +class LiquidClassRecord(TransferProperties, frozen=True): """LiquidClassRecord is our internal representation of an (immutable) liquid class. Conceptually, a liquid class record is the tuple (name, pipette, tip, transfer properties). @@ -17,6 +17,11 @@ class LiquidClassRecord(ByTipTypeSetting, frozen=True): This class defines the tuple via inheritance so that we can reuse the definitions from shared_data. """ + tiprack: str = Field( + ..., + description="The name of tiprack whose tip will be used" + " when handling this specific liquid class with this pipette", + ) liquidClassName: str = Field( ..., description="Identifier for the liquid of this liquid class, e.g. glycerol50.", @@ -25,7 +30,7 @@ class LiquidClassRecord(ByTipTypeSetting, frozen=True): ..., description="Identifier for the pipette of this liquid class.", ) - # The other fields like tiprack ID, aspirate properties, etc. are pulled in from ByTipTypeSetting. + # The other liquid class properties are pulled in from TransferProperties. def __hash__(self) -> int: """Hash function for LiquidClassRecord.""" diff --git a/api/tests/opentrons/conftest.py b/api/tests/opentrons/conftest.py index 0e7fed1daf0..5470bb78d9b 100755 --- a/api/tests/opentrons/conftest.py +++ b/api/tests/opentrons/conftest.py @@ -825,7 +825,7 @@ def minimal_liquid_class_def2() -> LiquidClassSchemaV1: pipetteModel="flex_1channel_50", byTipType=[ ByTipTypeSetting( - tiprack="opentrons_flex_96_tiprack_50ul", + tiprack=["opentrons_flex_96_tiprack_50ul"], aspirate=AspirateProperties( submerge=Submerge( startPosition=TipPosition( @@ -912,7 +912,7 @@ def maximal_liquid_class_def() -> LiquidClassSchemaV1: pipetteModel="flex_1channel_50", byTipType=[ ByTipTypeSetting( - tiprack="opentrons_flex_96_tiprack_50ul", + tiprack=["opentrons_flex_96_tiprack_50ul"], aspirate=AspirateProperties( submerge=Submerge( startPosition=TipPosition( diff --git a/api/tests/opentrons/protocol_engine/commands/test_load_liquid_class.py b/api/tests/opentrons/protocol_engine/commands/test_load_liquid_class.py index c89899853d5..85f74be59cf 100644 --- a/api/tests/opentrons/protocol_engine/commands/test_load_liquid_class.py +++ b/api/tests/opentrons/protocol_engine/commands/test_load_liquid_class.py @@ -31,7 +31,7 @@ def liquid_class_record( return LiquidClassRecord( liquidClassName=minimal_liquid_class_def2.liquidClassName, pipetteModel=pipette_0.pipetteModel, - tiprack=by_tip_type_0.tiprack, + tiprack=by_tip_type_0.tiprack[0], aspirate=by_tip_type_0.aspirate, singleDispense=by_tip_type_0.singleDispense, multiDispense=by_tip_type_0.multiDispense, diff --git a/api/tests/opentrons/protocol_engine/state/test_liquid_class_store_old.py b/api/tests/opentrons/protocol_engine/state/test_liquid_class_store_old.py index 67e910ec962..257d5a34ae2 100644 --- a/api/tests/opentrons/protocol_engine/state/test_liquid_class_store_old.py +++ b/api/tests/opentrons/protocol_engine/state/test_liquid_class_store_old.py @@ -32,7 +32,7 @@ def test_handles_add_liquid_class( liquid_class_record = LiquidClassRecord( liquidClassName=minimal_liquid_class_def2.liquidClassName, pipetteModel=pipette_0.pipetteModel, - tiprack=by_tip_type_0.tiprack, + tiprack=by_tip_type_0.tiprack[0], aspirate=by_tip_type_0.aspirate, singleDispense=by_tip_type_0.singleDispense, multiDispense=by_tip_type_0.multiDispense, diff --git a/api/tests/opentrons/protocol_engine/state/test_liquid_class_view_old.py b/api/tests/opentrons/protocol_engine/state/test_liquid_class_view_old.py index f28438b3756..95de25998c7 100644 --- a/api/tests/opentrons/protocol_engine/state/test_liquid_class_view_old.py +++ b/api/tests/opentrons/protocol_engine/state/test_liquid_class_view_old.py @@ -27,7 +27,7 @@ def liquid_class_record( return LiquidClassRecord( liquidClassName=minimal_liquid_class_def2.liquidClassName, pipetteModel=pipette_0.pipetteModel, - tiprack=by_tip_type_0.tiprack, + tiprack=by_tip_type_0.tiprack[0], aspirate=by_tip_type_0.aspirate, singleDispense=by_tip_type_0.singleDispense, multiDispense=by_tip_type_0.multiDispense, diff --git a/shared-data/liquid-class/definitions/1/ethanol_80/1.json b/shared-data/liquid-class/definitions/1/ethanol_80/1.json index e1df4d811e2..afde8921ebf 100644 --- a/shared-data/liquid-class/definitions/1/ethanol_80/1.json +++ b/shared-data/liquid-class/definitions/1/ethanol_80/1.json @@ -10,7 +10,10 @@ "pipetteModel": "flex_1channel_50", "byTipType": [ { - "tiprack": "opentrons/opentrons_flex_96_tiprack_50ul/1", + "tiprack": [ + "opentrons/opentrons_flex_96_tiprack_50ul/1", + "opentrons/opentrons_flex_96_tiprack_50ul/2" + ], "aspirate": { "submerge": { "startPosition": { @@ -269,7 +272,10 @@ } }, { - "tiprack": "opentrons/opentrons_flex_96_filtertiprack_50ul/1", + "tiprack": [ + "opentrons/opentrons_flex_96_filtertiprack_50ul/1", + "opentrons/opentrons_flex_96_filtertiprack_50ul/2" + ], "aspirate": { "submerge": { "startPosition": { @@ -533,7 +539,10 @@ "pipetteModel": "flex_8channel_50", "byTipType": [ { - "tiprack": "opentrons/opentrons_flex_96_tiprack_50ul/1", + "tiprack": [ + "opentrons/opentrons_flex_96_tiprack_50ul/1", + "opentrons/opentrons_flex_96_tiprack_50ul/2" + ], "aspirate": { "submerge": { "startPosition": { @@ -792,7 +801,10 @@ } }, { - "tiprack": "opentrons/opentrons_flex_96_filtertiprack_50ul/1", + "tiprack": [ + "opentrons/opentrons_flex_96_filtertiprack_50ul/1", + "opentrons/opentrons_flex_96_filtertiprack_50ul/2" + ], "aspirate": { "submerge": { "startPosition": { @@ -1056,7 +1068,10 @@ "pipetteModel": "flex_1channel_1000", "byTipType": [ { - "tiprack": "opentrons/opentrons_flex_96_tiprack_50ul/1", + "tiprack": [ + "opentrons/opentrons_flex_96_tiprack_50ul/1", + "opentrons/opentrons_flex_96_tiprack_50ul/2" + ], "aspirate": { "submerge": { "startPosition": { @@ -1320,7 +1335,10 @@ } }, { - "tiprack": "opentrons/opentrons_flex_96_filtertiprack_50ul/1", + "tiprack": [ + "opentrons/opentrons_flex_96_filtertiprack_50ul/1", + "opentrons/opentrons_flex_96_filtertiprack_50ul/2" + ], "aspirate": { "submerge": { "startPosition": { @@ -1584,7 +1602,10 @@ } }, { - "tiprack": "opentrons/opentrons_flex_96_tiprack_200ul/1", + "tiprack": [ + "opentrons/opentrons_flex_96_tiprack_200ul/1", + "opentrons/opentrons_flex_96_tiprack_200ul/2" + ], "aspirate": { "submerge": { "startPosition": { @@ -1847,7 +1868,10 @@ } }, { - "tiprack": "opentrons/opentrons_flex_96_filtertiprack_200ul/1", + "tiprack": [ + "opentrons/opentrons_flex_96_filtertiprack_200ul/1", + "opentrons/opentrons_flex_96_filtertiprack_200ul/2" + ], "aspirate": { "submerge": { "startPosition": { @@ -2110,7 +2134,10 @@ } }, { - "tiprack": "opentrons/opentrons_flex_96_tiprack_1000ul/1", + "tiprack": [ + "opentrons/opentrons_flex_96_tiprack_1000ul/1", + "opentrons/opentrons_flex_96_tiprack_1000ul/2" + ], "aspirate": { "submerge": { "startPosition": { @@ -2373,7 +2400,10 @@ } }, { - "tiprack": "opentrons/opentrons_flex_96_filtertiprack_1000ul/1", + "tiprack": [ + "opentrons/opentrons_flex_96_filtertiprack_1000ul/1", + "opentrons/opentrons_flex_96_filtertiprack_1000ul/2" + ], "aspirate": { "submerge": { "startPosition": { @@ -2641,7 +2671,10 @@ "pipetteModel": "flex_8channel_1000", "byTipType": [ { - "tiprack": "opentrons/opentrons_flex_96_tiprack_50ul/1", + "tiprack": [ + "opentrons/opentrons_flex_96_tiprack_50ul/1", + "opentrons/opentrons_flex_96_tiprack_50ul/2" + ], "aspirate": { "submerge": { "startPosition": { @@ -2905,7 +2938,10 @@ } }, { - "tiprack": "opentrons/opentrons_flex_96_filtertiprack_50ul/1", + "tiprack": [ + "opentrons/opentrons_flex_96_filtertiprack_50ul/1", + "opentrons/opentrons_flex_96_filtertiprack_50ul/2" + ], "aspirate": { "submerge": { "startPosition": { @@ -3169,7 +3205,10 @@ } }, { - "tiprack": "opentrons/opentrons_flex_96_tiprack_200ul/1", + "tiprack": [ + "opentrons/opentrons_flex_96_tiprack_200ul/1", + "opentrons/opentrons_flex_96_tiprack_200ul/2" + ], "aspirate": { "submerge": { "startPosition": { @@ -3432,7 +3471,10 @@ } }, { - "tiprack": "opentrons/opentrons_flex_96_filtertiprack_200ul/1", + "tiprack": [ + "opentrons/opentrons_flex_96_filtertiprack_200ul/1", + "opentrons/opentrons_flex_96_filtertiprack_200ul/2" + ], "aspirate": { "submerge": { "startPosition": { @@ -3695,7 +3737,10 @@ } }, { - "tiprack": "opentrons/opentrons_flex_96_tiprack_1000ul/1", + "tiprack": [ + "opentrons/opentrons_flex_96_tiprack_1000ul/1", + "opentrons/opentrons_flex_96_tiprack_1000ul/2" + ], "aspirate": { "submerge": { "startPosition": { @@ -3958,7 +4003,10 @@ } }, { - "tiprack": "opentrons/opentrons_flex_96_filtertiprack_1000ul/1", + "tiprack": [ + "opentrons/opentrons_flex_96_filtertiprack_1000ul/1", + "opentrons/opentrons_flex_96_filtertiprack_1000ul/2" + ], "aspirate": { "submerge": { "startPosition": { @@ -4226,7 +4274,10 @@ "pipetteModel": "flex_96channel_1000", "byTipType": [ { - "tiprack": "opentrons/opentrons_flex_96_tiprack_50ul/1", + "tiprack": [ + "opentrons/opentrons_flex_96_tiprack_50ul/1", + "opentrons/opentrons_flex_96_tiprack_50ul/2" + ], "aspirate": { "submerge": { "startPosition": { @@ -4490,7 +4541,10 @@ } }, { - "tiprack": "opentrons/opentrons_flex_96_filtertiprack_50ul/1", + "tiprack": [ + "opentrons/opentrons_flex_96_filtertiprack_50ul/1", + "opentrons/opentrons_flex_96_filtertiprack_50ul/2" + ], "aspirate": { "submerge": { "startPosition": { @@ -4754,7 +4808,10 @@ } }, { - "tiprack": "opentrons/opentrons_flex_96_tiprack_200ul/1", + "tiprack": [ + "opentrons/opentrons_flex_96_tiprack_200ul/1", + "opentrons/opentrons_flex_96_tiprack_200ul/2" + ], "aspirate": { "submerge": { "startPosition": { @@ -5017,7 +5074,10 @@ } }, { - "tiprack": "opentrons/opentrons_flex_96_filtertiprack_200ul/1", + "tiprack": [ + "opentrons/opentrons_flex_96_filtertiprack_200ul/1", + "opentrons/opentrons_flex_96_filtertiprack_200ul/2" + ], "aspirate": { "submerge": { "startPosition": { @@ -5280,7 +5340,10 @@ } }, { - "tiprack": "opentrons/opentrons_flex_96_tiprack_1000ul/1", + "tiprack": [ + "opentrons/opentrons_flex_96_tiprack_1000ul/1", + "opentrons/opentrons_flex_96_tiprack_1000ul/2" + ], "aspirate": { "submerge": { "startPosition": { @@ -5543,7 +5606,10 @@ } }, { - "tiprack": "opentrons/opentrons_flex_96_filtertiprack_1000ul/1", + "tiprack": [ + "opentrons/opentrons_flex_96_filtertiprack_1000ul/1", + "opentrons/opentrons_flex_96_filtertiprack_1000ul/2" + ], "aspirate": { "submerge": { "startPosition": { diff --git a/shared-data/liquid-class/definitions/1/glycerol_50/1.json b/shared-data/liquid-class/definitions/1/glycerol_50/1.json index ec2b0b09186..d10416a578d 100644 --- a/shared-data/liquid-class/definitions/1/glycerol_50/1.json +++ b/shared-data/liquid-class/definitions/1/glycerol_50/1.json @@ -10,7 +10,10 @@ "pipetteModel": "flex_1channel_50", "byTipType": [ { - "tiprack": "opentrons/opentrons_flex_96_tiprack_50ul/1", + "tiprack": [ + "opentrons/opentrons_flex_96_tiprack_50ul/1", + "opentrons/opentrons_flex_96_tiprack_50ul/2" + ], "aspirate": { "submerge": { "startPosition": { @@ -262,7 +265,10 @@ } }, { - "tiprack": "opentrons/opentrons_flex_96_filtertiprack_50ul/1", + "tiprack": [ + "opentrons/opentrons_flex_96_filtertiprack_50ul/1", + "opentrons/opentrons_flex_96_filtertiprack_50ul/2" + ], "aspirate": { "submerge": { "startPosition": { @@ -519,7 +525,10 @@ "pipetteModel": "flex_8channel_50", "byTipType": [ { - "tiprack": "opentrons/opentrons_flex_96_tiprack_50ul/1", + "tiprack": [ + "opentrons/opentrons_flex_96_tiprack_50ul/1", + "opentrons/opentrons_flex_96_tiprack_50ul/2" + ], "aspirate": { "submerge": { "startPosition": { @@ -771,7 +780,10 @@ } }, { - "tiprack": "opentrons/opentrons_flex_96_filtertiprack_50ul/1", + "tiprack": [ + "opentrons/opentrons_flex_96_filtertiprack_50ul/1", + "opentrons/opentrons_flex_96_filtertiprack_50ul/2" + ], "aspirate": { "submerge": { "startPosition": { @@ -1028,7 +1040,10 @@ "pipetteModel": "flex_1channel_1000", "byTipType": [ { - "tiprack": "opentrons/opentrons_flex_96_tiprack_50ul/1", + "tiprack": [ + "opentrons/opentrons_flex_96_tiprack_50ul/1", + "opentrons/opentrons_flex_96_tiprack_50ul/2" + ], "aspirate": { "submerge": { "startPosition": { @@ -1279,7 +1294,10 @@ } }, { - "tiprack": "opentrons/opentrons_flex_96_filtertiprack_50ul/1", + "tiprack": [ + "opentrons/opentrons_flex_96_filtertiprack_50ul/1", + "opentrons/opentrons_flex_96_filtertiprack_50ul/2" + ], "aspirate": { "submerge": { "startPosition": { @@ -1530,7 +1548,10 @@ } }, { - "tiprack": "opentrons/opentrons_flex_96_tiprack_200ul/1", + "tiprack": [ + "opentrons/opentrons_flex_96_tiprack_200ul/1", + "opentrons/opentrons_flex_96_tiprack_200ul/2" + ], "aspirate": { "submerge": { "startPosition": { @@ -1777,7 +1798,10 @@ } }, { - "tiprack": "opentrons/opentrons_flex_96_filtertiprack_200ul/1", + "tiprack": [ + "opentrons/opentrons_flex_96_filtertiprack_200ul/1", + "opentrons/opentrons_flex_96_filtertiprack_200ul/2" + ], "aspirate": { "submerge": { "startPosition": { @@ -2024,7 +2048,10 @@ } }, { - "tiprack": "opentrons/opentrons_flex_96_tiprack_1000ul/1", + "tiprack": [ + "opentrons/opentrons_flex_96_tiprack_1000ul/1", + "opentrons/opentrons_flex_96_tiprack_1000ul/2" + ], "aspirate": { "submerge": { "startPosition": { @@ -2271,7 +2298,10 @@ } }, { - "tiprack": "opentrons/opentrons_flex_96_filtertiprack_1000ul/1", + "tiprack": [ + "opentrons/opentrons_flex_96_filtertiprack_1000ul/1", + "opentrons/opentrons_flex_96_filtertiprack_1000ul/2" + ], "aspirate": { "submerge": { "startPosition": { @@ -2523,7 +2553,10 @@ "pipetteModel": "flex_8channel_1000", "byTipType": [ { - "tiprack": "opentrons/opentrons_flex_96_tiprack_50ul/1", + "tiprack": [ + "opentrons/opentrons_flex_96_tiprack_50ul/1", + "opentrons/opentrons_flex_96_tiprack_50ul/2" + ], "aspirate": { "submerge": { "startPosition": { @@ -2774,7 +2807,10 @@ } }, { - "tiprack": "opentrons/opentrons_flex_96_filtertiprack_50ul/1", + "tiprack": [ + "opentrons/opentrons_flex_96_filtertiprack_50ul/1", + "opentrons/opentrons_flex_96_filtertiprack_50ul/2" + ], "aspirate": { "submerge": { "startPosition": { @@ -3025,7 +3061,10 @@ } }, { - "tiprack": "opentrons/opentrons_flex_96_tiprack_200ul/1", + "tiprack": [ + "opentrons/opentrons_flex_96_tiprack_200ul/1", + "opentrons/opentrons_flex_96_tiprack_200ul/2" + ], "aspirate": { "submerge": { "startPosition": { @@ -3272,7 +3311,10 @@ } }, { - "tiprack": "opentrons/opentrons_flex_96_filtertiprack_200ul/1", + "tiprack": [ + "opentrons/opentrons_flex_96_filtertiprack_200ul/1", + "opentrons/opentrons_flex_96_filtertiprack_200ul/2" + ], "aspirate": { "submerge": { "startPosition": { @@ -3519,7 +3561,10 @@ } }, { - "tiprack": "opentrons/opentrons_flex_96_tiprack_1000ul/1", + "tiprack": [ + "opentrons/opentrons_flex_96_tiprack_1000ul/1", + "opentrons/opentrons_flex_96_tiprack_1000ul/2" + ], "aspirate": { "submerge": { "startPosition": { @@ -3766,7 +3811,10 @@ } }, { - "tiprack": "opentrons/opentrons_flex_96_filtertiprack_1000ul/1", + "tiprack": [ + "opentrons/opentrons_flex_96_filtertiprack_1000ul/1", + "opentrons/opentrons_flex_96_filtertiprack_1000ul/2" + ], "aspirate": { "submerge": { "startPosition": { @@ -4018,7 +4066,10 @@ "pipetteModel": "flex_96channel_1000", "byTipType": [ { - "tiprack": "opentrons/opentrons_flex_96_tiprack_50ul/1", + "tiprack": [ + "opentrons/opentrons_flex_96_tiprack_50ul/1", + "opentrons/opentrons_flex_96_tiprack_50ul/2" + ], "aspirate": { "submerge": { "startPosition": { @@ -4277,7 +4328,10 @@ } }, { - "tiprack": "opentrons/opentrons_flex_96_filtertiprack_50ul/1", + "tiprack": [ + "opentrons/opentrons_flex_96_filtertiprack_50ul/1", + "opentrons/opentrons_flex_96_filtertiprack_50ul/2" + ], "aspirate": { "submerge": { "startPosition": { @@ -4536,7 +4590,10 @@ } }, { - "tiprack": "opentrons/opentrons_flex_96_tiprack_200ul/1", + "tiprack": [ + "opentrons/opentrons_flex_96_tiprack_200ul/1", + "opentrons/opentrons_flex_96_tiprack_200ul/2" + ], "aspirate": { "submerge": { "startPosition": { @@ -4783,7 +4840,10 @@ } }, { - "tiprack": "opentrons/opentrons_flex_96_filtertiprack_200ul/1", + "tiprack": [ + "opentrons/opentrons_flex_96_filtertiprack_200ul/1", + "opentrons/opentrons_flex_96_filtertiprack_200ul/2" + ], "aspirate": { "submerge": { "startPosition": { @@ -5030,7 +5090,10 @@ } }, { - "tiprack": "opentrons/opentrons_flex_96_tiprack_1000ul/1", + "tiprack": [ + "opentrons/opentrons_flex_96_tiprack_1000ul/1", + "opentrons/opentrons_flex_96_tiprack_1000ul/2" + ], "aspirate": { "submerge": { "startPosition": { @@ -5278,7 +5341,10 @@ } }, { - "tiprack": "opentrons/opentrons_flex_96_filtertiprack_1000ul/1", + "tiprack": [ + "opentrons/opentrons_flex_96_filtertiprack_1000ul/1", + "opentrons/opentrons_flex_96_filtertiprack_1000ul/2" + ], "aspirate": { "submerge": { "startPosition": { diff --git a/shared-data/liquid-class/definitions/1/water/1.json b/shared-data/liquid-class/definitions/1/water/1.json index 358313748df..93ef74cec64 100644 --- a/shared-data/liquid-class/definitions/1/water/1.json +++ b/shared-data/liquid-class/definitions/1/water/1.json @@ -10,7 +10,10 @@ "pipetteModel": "flex_1channel_50", "byTipType": [ { - "tiprack": "opentrons/opentrons_flex_96_tiprack_50ul/1", + "tiprack": [ + "opentrons/opentrons_flex_96_tiprack_50ul/1", + "opentrons/opentrons_flex_96_tiprack_50ul/2" + ], "aspirate": { "submerge": { "startPosition": { @@ -258,7 +261,10 @@ } }, { - "tiprack": "opentrons/opentrons_flex_96_filtertiprack_50ul/1", + "tiprack": [ + "opentrons/opentrons_flex_96_filtertiprack_50ul/1", + "opentrons/opentrons_flex_96_filtertiprack_50ul/2" + ], "aspirate": { "submerge": { "startPosition": { @@ -511,7 +517,10 @@ "pipetteModel": "flex_8channel_50", "byTipType": [ { - "tiprack": "opentrons/opentrons_flex_96_tiprack_50ul/1", + "tiprack": [ + "opentrons/opentrons_flex_96_tiprack_50ul/1", + "opentrons/opentrons_flex_96_tiprack_50ul/2" + ], "aspirate": { "submerge": { "startPosition": { @@ -759,7 +768,10 @@ } }, { - "tiprack": "opentrons/opentrons_flex_96_filtertiprack_50ul/1", + "tiprack": [ + "opentrons/opentrons_flex_96_filtertiprack_50ul/1", + "opentrons/opentrons_flex_96_filtertiprack_50ul/2" + ], "aspirate": { "submerge": { "startPosition": { @@ -1012,7 +1024,10 @@ "pipetteModel": "flex_1channel_1000", "byTipType": [ { - "tiprack": "opentrons/opentrons_flex_96_tiprack_50ul/1", + "tiprack": [ + "opentrons/opentrons_flex_96_tiprack_50ul/1", + "opentrons/opentrons_flex_96_tiprack_50ul/2" + ], "aspirate": { "submerge": { "startPosition": { @@ -1262,7 +1277,10 @@ } }, { - "tiprack": "opentrons/opentrons_flex_96_filtertiprack_50ul/1", + "tiprack": [ + "opentrons/opentrons_flex_96_filtertiprack_50ul/1", + "opentrons/opentrons_flex_96_filtertiprack_50ul/2" + ], "aspirate": { "submerge": { "startPosition": { @@ -1512,7 +1530,10 @@ } }, { - "tiprack": "opentrons/opentrons_flex_96_tiprack_200ul/1", + "tiprack": [ + "opentrons/opentrons_flex_96_tiprack_200ul/1", + "opentrons/opentrons_flex_96_tiprack_200ul/2" + ], "aspirate": { "submerge": { "startPosition": { @@ -1750,7 +1771,10 @@ } }, { - "tiprack": "opentrons/opentrons_flex_96_filtertiprack_200ul/1", + "tiprack": [ + "opentrons/opentrons_flex_96_filtertiprack_200ul/1", + "opentrons/opentrons_flex_96_filtertiprack_200ul/2" + ], "aspirate": { "submerge": { "startPosition": { @@ -1988,7 +2012,10 @@ } }, { - "tiprack": "opentrons/opentrons_flex_96_tiprack_1000ul/1", + "tiprack": [ + "opentrons/opentrons_flex_96_tiprack_1000ul/1", + "opentrons/opentrons_flex_96_tiprack_1000ul/2" + ], "aspirate": { "submerge": { "startPosition": { @@ -2226,7 +2253,10 @@ } }, { - "tiprack": "opentrons/opentrons_flex_96_filtertiprack_1000ul/1", + "tiprack": [ + "opentrons/opentrons_flex_96_filtertiprack_1000ul/1", + "opentrons/opentrons_flex_96_filtertiprack_1000ul/2" + ], "aspirate": { "submerge": { "startPosition": { @@ -2469,7 +2499,10 @@ "pipetteModel": "flex_8channel_1000", "byTipType": [ { - "tiprack": "opentrons/opentrons_flex_96_tiprack_50ul/1", + "tiprack": [ + "opentrons/opentrons_flex_96_tiprack_50ul/1", + "opentrons/opentrons_flex_96_tiprack_50ul/2" + ], "aspirate": { "submerge": { "startPosition": { @@ -2719,7 +2752,10 @@ } }, { - "tiprack": "opentrons/opentrons_flex_96_filtertiprack_50ul/1", + "tiprack": [ + "opentrons/opentrons_flex_96_filtertiprack_50ul/1", + "opentrons/opentrons_flex_96_filtertiprack_50ul/2" + ], "aspirate": { "submerge": { "startPosition": { @@ -2969,7 +3005,10 @@ } }, { - "tiprack": "opentrons/opentrons_flex_96_tiprack_200ul/1", + "tiprack": [ + "opentrons/opentrons_flex_96_tiprack_200ul/1", + "opentrons/opentrons_flex_96_tiprack_200ul/2" + ], "aspirate": { "submerge": { "startPosition": { @@ -3207,7 +3246,10 @@ } }, { - "tiprack": "opentrons/opentrons_flex_96_filtertiprack_200ul/1", + "tiprack": [ + "opentrons/opentrons_flex_96_filtertiprack_200ul/1", + "opentrons/opentrons_flex_96_filtertiprack_200ul/2" + ], "aspirate": { "submerge": { "startPosition": { @@ -3445,7 +3487,10 @@ } }, { - "tiprack": "opentrons/opentrons_flex_96_tiprack_1000ul/1", + "tiprack": [ + "opentrons/opentrons_flex_96_tiprack_1000ul/1", + "opentrons/opentrons_flex_96_tiprack_1000ul/2" + ], "aspirate": { "submerge": { "startPosition": { @@ -3683,7 +3728,10 @@ } }, { - "tiprack": "opentrons/opentrons_flex_96_filtertiprack_1000ul/1", + "tiprack": [ + "opentrons/opentrons_flex_96_filtertiprack_1000ul/1", + "opentrons/opentrons_flex_96_filtertiprack_1000ul/2" + ], "aspirate": { "submerge": { "startPosition": { @@ -3926,7 +3974,10 @@ "pipetteModel": "flex_96channel_1000", "byTipType": [ { - "tiprack": "opentrons/opentrons_flex_96_tiprack_50ul/1", + "tiprack": [ + "opentrons/opentrons_flex_96_tiprack_50ul/1", + "opentrons/opentrons_flex_96_tiprack_50ul/2" + ], "aspirate": { "submerge": { "startPosition": { @@ -4164,7 +4215,10 @@ } }, { - "tiprack": "opentrons/opentrons_flex_96_filtertiprack_50ul/1", + "tiprack": [ + "opentrons/opentrons_flex_96_filtertiprack_50ul/1", + "opentrons/opentrons_flex_96_filtertiprack_50ul/2" + ], "aspirate": { "submerge": { "startPosition": { @@ -4402,7 +4456,10 @@ } }, { - "tiprack": "opentrons/opentrons_flex_96_tiprack_200ul/1", + "tiprack": [ + "opentrons/opentrons_flex_96_tiprack_200ul/1", + "opentrons/opentrons_flex_96_tiprack_200ul/2" + ], "aspirate": { "submerge": { "startPosition": { @@ -4640,7 +4697,10 @@ } }, { - "tiprack": "opentrons/opentrons_flex_96_filtertiprack_200ul/1", + "tiprack": [ + "opentrons/opentrons_flex_96_filtertiprack_200ul/1", + "opentrons/opentrons_flex_96_filtertiprack_200ul/2" + ], "aspirate": { "submerge": { "startPosition": { @@ -4878,7 +4938,10 @@ } }, { - "tiprack": "opentrons/opentrons_flex_96_tiprack_1000ul/1", + "tiprack": [ + "opentrons/opentrons_flex_96_tiprack_1000ul/1", + "opentrons/opentrons_flex_96_tiprack_1000ul/2" + ], "aspirate": { "submerge": { "startPosition": { @@ -5116,7 +5179,10 @@ } }, { - "tiprack": "opentrons/opentrons_flex_96_filtertiprack_1000ul/1", + "tiprack": [ + "opentrons/opentrons_flex_96_filtertiprack_1000ul/1", + "opentrons/opentrons_flex_96_filtertiprack_1000ul/2" + ], "aspirate": { "submerge": { "startPosition": { diff --git a/shared-data/liquid-class/fixtures/1/fixture_glycerol50.json b/shared-data/liquid-class/fixtures/1/fixture_glycerol50.json index 0f6c7ff7b0e..e7dea07bb81 100644 --- a/shared-data/liquid-class/fixtures/1/fixture_glycerol50.json +++ b/shared-data/liquid-class/fixtures/1/fixture_glycerol50.json @@ -10,7 +10,7 @@ "pipetteModel": "p20_single_gen2", "byTipType": [ { - "tiprack": "opentrons_96_tiprack_20ul", + "tiprack": ["opentrons_96_tiprack_20ul"], "aspirate": { "submerge": { "startPosition": { diff --git a/shared-data/liquid-class/schemas/1.json b/shared-data/liquid-class/schemas/1.json index d64bb4118cb..f5aa1f30470 100644 --- a/shared-data/liquid-class/schemas/1.json +++ b/shared-data/liquid-class/schemas/1.json @@ -469,8 +469,11 @@ "type": "object", "properties": { "tiprack": { - "type": "string", - "description": "The tiprack name whose tip will be used when handling this specific liquid class with this pipette" + "type": "array", + "items": { + "type": "string" + }, + "description": "The tiprack name(s) whose tip will be used when handling this specific liquid class with this pipette" }, "aspirate": { "$ref": "#/definitions/aspirateParams" diff --git a/shared-data/python/opentrons_shared_data/liquid_classes/liquid_class_definition.py b/shared-data/python/opentrons_shared_data/liquid_classes/liquid_class_definition.py index 155f4d14642..83071a10c35 100644 --- a/shared-data/python/opentrons_shared_data/liquid_classes/liquid_class_definition.py +++ b/shared-data/python/opentrons_shared_data/liquid_classes/liquid_class_definition.py @@ -517,9 +517,9 @@ class TransferProperties(BaseLiquidClassModel): class ByTipTypeSetting(TransferProperties): """Settings for each kind of tip this pipette can use.""" - tiprack: str = Field( + tiprack: Sequence[str] = Field( ..., - description="The name of tiprack whose tip will be used when handling this specific liquid class with this pipette", + description="The name(s) of tiprack whose tip will be used when handling this specific liquid class with this pipette", ) diff --git a/shared-data/python_tests/liquid_classes/test_validations.py b/shared-data/python_tests/liquid_classes/test_validations.py index 110850512d6..fb9fa5aaf1b 100644 --- a/shared-data/python_tests/liquid_classes/test_validations.py +++ b/shared-data/python_tests/liquid_classes/test_validations.py @@ -36,7 +36,8 @@ def test_validate_unique_tip_keys(liquid_class_name: str) -> None: definition_dict = load_definition(liquid_class_name, version=1, schema_version=1) for by_pip_prop in definition_dict.byPipette: - tipracks = [tip_prop.tiprack for tip_prop in by_pip_prop.byTipType] + # TODO fix this to check all tipracks + tipracks = [tip_prop.tiprack[0] for tip_prop in by_pip_prop.byTipType] assert len(tipracks) == len(set(tipracks))