diff --git a/api/src/opentrons/hardware_control/instruments/ot3/pipette.py b/api/src/opentrons/hardware_control/instruments/ot3/pipette.py index cc0a03b9a77..a7a9c57988b 100644 --- a/api/src/opentrons/hardware_control/instruments/ot3/pipette.py +++ b/api/src/opentrons/hardware_control/instruments/ot3/pipette.py @@ -511,6 +511,7 @@ def as_dict(self) -> "Pipette.DictType": "fw_update_required": self._fw_update_info.update_required, "fw_current_version": self._fw_update_info.current_version, "fw_next_version": self._fw_update_info.next_version, + "back_compat_names": self._config.pipette_backcompat_names, } ) return self._config_as_dict diff --git a/api/src/opentrons/hardware_control/instruments/ot3/pipette_handler.py b/api/src/opentrons/hardware_control/instruments/ot3/pipette_handler.py index 8671021ecb4..5298b9e4c66 100644 --- a/api/src/opentrons/hardware_control/instruments/ot3/pipette_handler.py +++ b/api/src/opentrons/hardware_control/instruments/ot3/pipette_handler.py @@ -215,6 +215,7 @@ def get_attached_instrument(self, mount: OT3Mount) -> PipetteDict: "default_aspirate_flow_rates", "default_blow_out_flow_rates", "default_dispense_flow_rates", + "back_compat_names", ] instr_dict = instr.as_dict() diff --git a/shared-data/pipette/definitions/2/general/eight_channel/p10/1_0.json b/shared-data/pipette/definitions/2/general/eight_channel/p10/1_0.json index caee3114ff4..adbf5ac7347 100644 --- a/shared-data/pipette/definitions/2/general/eight_channel/p10/1_0.json +++ b/shared-data/pipette/definitions/2/general/eight_channel/p10/1_0.json @@ -31,5 +31,6 @@ }, "channels": 8, "shaftDiameter": 1.0, - "shaftULperMM": 0.785 + "shaftULperMM": 0.785, + "backCompatNames": [] } diff --git a/shared-data/pipette/definitions/2/general/eight_channel/p10/1_3.json b/shared-data/pipette/definitions/2/general/eight_channel/p10/1_3.json index 05028f91de8..44c041157f5 100644 --- a/shared-data/pipette/definitions/2/general/eight_channel/p10/1_3.json +++ b/shared-data/pipette/definitions/2/general/eight_channel/p10/1_3.json @@ -31,5 +31,6 @@ }, "channels": 8, "shaftDiameter": 1.0, - "shaftULperMM": 0.785 + "shaftULperMM": 0.785, + "backCompatNames": [] } diff --git a/shared-data/pipette/definitions/2/general/eight_channel/p10/1_4.json b/shared-data/pipette/definitions/2/general/eight_channel/p10/1_4.json index 8a14090914a..659f6dea62a 100644 --- a/shared-data/pipette/definitions/2/general/eight_channel/p10/1_4.json +++ b/shared-data/pipette/definitions/2/general/eight_channel/p10/1_4.json @@ -31,5 +31,6 @@ }, "channels": 8, "shaftDiameter": 1.0, - "shaftULperMM": 0.785 + "shaftULperMM": 0.785, + "backCompatNames": [] } diff --git a/shared-data/pipette/definitions/2/general/eight_channel/p10/1_5.json b/shared-data/pipette/definitions/2/general/eight_channel/p10/1_5.json index b36af883e78..373ce0e293b 100644 --- a/shared-data/pipette/definitions/2/general/eight_channel/p10/1_5.json +++ b/shared-data/pipette/definitions/2/general/eight_channel/p10/1_5.json @@ -31,5 +31,6 @@ }, "channels": 8, "shaftDiameter": 1.0, - "shaftULperMM": 0.785 + "shaftULperMM": 0.785, + "backCompatNames": [] } diff --git a/shared-data/pipette/definitions/2/general/eight_channel/p10/1_6.json b/shared-data/pipette/definitions/2/general/eight_channel/p10/1_6.json index b36af883e78..373ce0e293b 100644 --- a/shared-data/pipette/definitions/2/general/eight_channel/p10/1_6.json +++ b/shared-data/pipette/definitions/2/general/eight_channel/p10/1_6.json @@ -31,5 +31,6 @@ }, "channels": 8, "shaftDiameter": 1.0, - "shaftULperMM": 0.785 + "shaftULperMM": 0.785, + "backCompatNames": [] } diff --git a/shared-data/pipette/definitions/2/general/eight_channel/p1000/1_0.json b/shared-data/pipette/definitions/2/general/eight_channel/p1000/1_0.json index b7fb96e674a..4914eef285a 100644 --- a/shared-data/pipette/definitions/2/general/eight_channel/p1000/1_0.json +++ b/shared-data/pipette/definitions/2/general/eight_channel/p1000/1_0.json @@ -28,6 +28,7 @@ "partialTipSupported": true, "availableConfigurations": [1, 2, 3, 4, 5, 6, 7, 8] }, + "backCompatNames": [], "channels": 8, "shaftDiameter": 9.0, "shaftULperMM": 63.617 diff --git a/shared-data/pipette/definitions/2/general/eight_channel/p1000/3_0.json b/shared-data/pipette/definitions/2/general/eight_channel/p1000/3_0.json index 0fff9ccba69..06c047a319d 100644 --- a/shared-data/pipette/definitions/2/general/eight_channel/p1000/3_0.json +++ b/shared-data/pipette/definitions/2/general/eight_channel/p1000/3_0.json @@ -28,6 +28,7 @@ "partialTipSupported": true, "availableConfigurations": [1, 2, 3, 4, 5, 6, 7, 8] }, + "backCompatNames": [], "channels": 8, "shaftDiameter": 4.5, "shaftULperMM": 15.904 diff --git a/shared-data/pipette/definitions/2/general/eight_channel/p1000/3_3.json b/shared-data/pipette/definitions/2/general/eight_channel/p1000/3_3.json index 0fff9ccba69..06c047a319d 100644 --- a/shared-data/pipette/definitions/2/general/eight_channel/p1000/3_3.json +++ b/shared-data/pipette/definitions/2/general/eight_channel/p1000/3_3.json @@ -28,6 +28,7 @@ "partialTipSupported": true, "availableConfigurations": [1, 2, 3, 4, 5, 6, 7, 8] }, + "backCompatNames": [], "channels": 8, "shaftDiameter": 4.5, "shaftULperMM": 15.904 diff --git a/shared-data/pipette/definitions/2/general/eight_channel/p1000/3_4.json b/shared-data/pipette/definitions/2/general/eight_channel/p1000/3_4.json index d54b8453781..c934a8ae11d 100644 --- a/shared-data/pipette/definitions/2/general/eight_channel/p1000/3_4.json +++ b/shared-data/pipette/definitions/2/general/eight_channel/p1000/3_4.json @@ -28,6 +28,7 @@ "partialTipSupported": true, "availableConfigurations": [1, 2, 3, 4, 5, 6, 7, 8] }, + "backCompatNames": [], "channels": 8, "shaftDiameter": 4.5, "shaftULperMM": 15.904 diff --git a/shared-data/pipette/definitions/2/general/eight_channel/p20/2_0.json b/shared-data/pipette/definitions/2/general/eight_channel/p20/2_0.json index 78250b629ea..1995822b92d 100644 --- a/shared-data/pipette/definitions/2/general/eight_channel/p20/2_0.json +++ b/shared-data/pipette/definitions/2/general/eight_channel/p20/2_0.json @@ -31,5 +31,6 @@ }, "channels": 8, "shaftDiameter": 1.0, - "shaftULperMM": 0.785 + "shaftULperMM": 0.785, + "backCompatNames": ["p10_multi"] } diff --git a/shared-data/pipette/definitions/2/general/eight_channel/p20/2_1.json b/shared-data/pipette/definitions/2/general/eight_channel/p20/2_1.json index 78250b629ea..1995822b92d 100644 --- a/shared-data/pipette/definitions/2/general/eight_channel/p20/2_1.json +++ b/shared-data/pipette/definitions/2/general/eight_channel/p20/2_1.json @@ -31,5 +31,6 @@ }, "channels": 8, "shaftDiameter": 1.0, - "shaftULperMM": 0.785 + "shaftULperMM": 0.785, + "backCompatNames": ["p10_multi"] } diff --git a/shared-data/pipette/definitions/2/general/eight_channel/p300/1_0.json b/shared-data/pipette/definitions/2/general/eight_channel/p300/1_0.json index 96bef5933dd..d6c81a22585 100644 --- a/shared-data/pipette/definitions/2/general/eight_channel/p300/1_0.json +++ b/shared-data/pipette/definitions/2/general/eight_channel/p300/1_0.json @@ -31,5 +31,6 @@ }, "channels": 8, "shaftDiameter": 5.0, - "shaftULperMM": 19.635 + "shaftULperMM": 19.635, + "backCompatNames": [] } diff --git a/shared-data/pipette/definitions/2/general/eight_channel/p300/1_3.json b/shared-data/pipette/definitions/2/general/eight_channel/p300/1_3.json index a9c166b9de7..cf4d0012efe 100644 --- a/shared-data/pipette/definitions/2/general/eight_channel/p300/1_3.json +++ b/shared-data/pipette/definitions/2/general/eight_channel/p300/1_3.json @@ -31,5 +31,6 @@ }, "channels": 8, "shaftDiameter": 5.0, - "shaftULperMM": 19.635 + "shaftULperMM": 19.635, + "backCompatNames": [] } diff --git a/shared-data/pipette/definitions/2/general/eight_channel/p300/1_4.json b/shared-data/pipette/definitions/2/general/eight_channel/p300/1_4.json index a9c166b9de7..cf4d0012efe 100644 --- a/shared-data/pipette/definitions/2/general/eight_channel/p300/1_4.json +++ b/shared-data/pipette/definitions/2/general/eight_channel/p300/1_4.json @@ -31,5 +31,6 @@ }, "channels": 8, "shaftDiameter": 5.0, - "shaftULperMM": 19.635 + "shaftULperMM": 19.635, + "backCompatNames": [] } diff --git a/shared-data/pipette/definitions/2/general/eight_channel/p300/1_5.json b/shared-data/pipette/definitions/2/general/eight_channel/p300/1_5.json index fb1caa9160c..7a339f8ffeb 100644 --- a/shared-data/pipette/definitions/2/general/eight_channel/p300/1_5.json +++ b/shared-data/pipette/definitions/2/general/eight_channel/p300/1_5.json @@ -31,5 +31,6 @@ }, "channels": 8, "shaftDiameter": 5.0, - "shaftULperMM": 19.635 + "shaftULperMM": 19.635, + "backCompatNames": [] } diff --git a/shared-data/pipette/definitions/2/general/eight_channel/p300/2_0.json b/shared-data/pipette/definitions/2/general/eight_channel/p300/2_0.json index 3baa4ec2bb3..77e7fdfc11b 100644 --- a/shared-data/pipette/definitions/2/general/eight_channel/p300/2_0.json +++ b/shared-data/pipette/definitions/2/general/eight_channel/p300/2_0.json @@ -31,5 +31,6 @@ }, "channels": 8, "shaftDiameter": 3.5, - "shaftULperMM": 9.621 + "shaftULperMM": 9.621, + "backCompatNames": ["p300_multi"] } diff --git a/shared-data/pipette/definitions/2/general/eight_channel/p300/2_1.json b/shared-data/pipette/definitions/2/general/eight_channel/p300/2_1.json index 3baa4ec2bb3..77e7fdfc11b 100644 --- a/shared-data/pipette/definitions/2/general/eight_channel/p300/2_1.json +++ b/shared-data/pipette/definitions/2/general/eight_channel/p300/2_1.json @@ -31,5 +31,6 @@ }, "channels": 8, "shaftDiameter": 3.5, - "shaftULperMM": 9.621 + "shaftULperMM": 9.621, + "backCompatNames": ["p300_multi"] } diff --git a/shared-data/pipette/definitions/2/general/eight_channel/p50/1_0.json b/shared-data/pipette/definitions/2/general/eight_channel/p50/1_0.json index 42c902659a0..3a0cddd7f2c 100644 --- a/shared-data/pipette/definitions/2/general/eight_channel/p50/1_0.json +++ b/shared-data/pipette/definitions/2/general/eight_channel/p50/1_0.json @@ -31,5 +31,6 @@ }, "channels": 8, "shaftDiameter": 2.0, - "shaftULperMM": 3.142 + "shaftULperMM": 3.142, + "backCompatNames": [] } diff --git a/shared-data/pipette/definitions/2/general/eight_channel/p50/1_3.json b/shared-data/pipette/definitions/2/general/eight_channel/p50/1_3.json index d9336064c11..7235179f4fb 100644 --- a/shared-data/pipette/definitions/2/general/eight_channel/p50/1_3.json +++ b/shared-data/pipette/definitions/2/general/eight_channel/p50/1_3.json @@ -31,5 +31,6 @@ }, "channels": 8, "shaftDiameter": 2.0, - "shaftULperMM": 3.142 + "shaftULperMM": 3.142, + "backCompatNames": [] } diff --git a/shared-data/pipette/definitions/2/general/eight_channel/p50/1_4.json b/shared-data/pipette/definitions/2/general/eight_channel/p50/1_4.json index b14f4991bab..891922b5925 100644 --- a/shared-data/pipette/definitions/2/general/eight_channel/p50/1_4.json +++ b/shared-data/pipette/definitions/2/general/eight_channel/p50/1_4.json @@ -31,5 +31,6 @@ }, "channels": 8, "shaftDiameter": 2.0, - "shaftULperMM": 3.142 + "shaftULperMM": 3.142, + "backCompatNames": [] } diff --git a/shared-data/pipette/definitions/2/general/eight_channel/p50/1_5.json b/shared-data/pipette/definitions/2/general/eight_channel/p50/1_5.json index 119b0caac3e..9bb10d6c0e3 100644 --- a/shared-data/pipette/definitions/2/general/eight_channel/p50/1_5.json +++ b/shared-data/pipette/definitions/2/general/eight_channel/p50/1_5.json @@ -31,5 +31,6 @@ }, "channels": 8, "shaftDiameter": 2.0, - "shaftULperMM": 3.142 + "shaftULperMM": 3.142, + "backCompatNames": [] } diff --git a/shared-data/pipette/definitions/2/general/eight_channel/p50/3_0.json b/shared-data/pipette/definitions/2/general/eight_channel/p50/3_0.json index 7b706e6ecf1..1d09f6f6331 100644 --- a/shared-data/pipette/definitions/2/general/eight_channel/p50/3_0.json +++ b/shared-data/pipette/definitions/2/general/eight_channel/p50/3_0.json @@ -28,6 +28,7 @@ "partialTipSupported": true, "availableConfigurations": [1, 2, 3, 4, 5, 6, 7, 8] }, + "backCompatNames": [], "channels": 8, "shaftDiameter": 1.0, "shaftULperMM": 0.785 diff --git a/shared-data/pipette/definitions/2/general/eight_channel/p50/3_3.json b/shared-data/pipette/definitions/2/general/eight_channel/p50/3_3.json index 7b706e6ecf1..1d09f6f6331 100644 --- a/shared-data/pipette/definitions/2/general/eight_channel/p50/3_3.json +++ b/shared-data/pipette/definitions/2/general/eight_channel/p50/3_3.json @@ -28,6 +28,7 @@ "partialTipSupported": true, "availableConfigurations": [1, 2, 3, 4, 5, 6, 7, 8] }, + "backCompatNames": [], "channels": 8, "shaftDiameter": 1.0, "shaftULperMM": 0.785 diff --git a/shared-data/pipette/definitions/2/general/eight_channel/p50/3_4.json b/shared-data/pipette/definitions/2/general/eight_channel/p50/3_4.json index 1b1e56f29b8..dedd3badb71 100644 --- a/shared-data/pipette/definitions/2/general/eight_channel/p50/3_4.json +++ b/shared-data/pipette/definitions/2/general/eight_channel/p50/3_4.json @@ -28,6 +28,7 @@ "partialTipSupported": true, "availableConfigurations": [1, 2, 3, 4, 5, 6, 7, 8] }, + "backCompatNames": [], "channels": 8, "shaftDiameter": 1.0, "shaftULperMM": 0.785 diff --git a/shared-data/pipette/definitions/2/general/ninety_six_channel/p1000/1_0.json b/shared-data/pipette/definitions/2/general/ninety_six_channel/p1000/1_0.json index 63f69872041..d751ae08d51 100644 --- a/shared-data/pipette/definitions/2/general/ninety_six_channel/p1000/1_0.json +++ b/shared-data/pipette/definitions/2/general/ninety_six_channel/p1000/1_0.json @@ -28,6 +28,7 @@ "partialTipSupported": true, "availableConfigurations": [1, 8, 12, 96] }, + "backCompatNames": [], "channels": 96, "shaftDiameter": 9.0, "shaftULperMM": 63.617 diff --git a/shared-data/pipette/definitions/2/general/ninety_six_channel/p1000/3_0.json b/shared-data/pipette/definitions/2/general/ninety_six_channel/p1000/3_0.json index a56461d3ed8..ed67b258a5c 100644 --- a/shared-data/pipette/definitions/2/general/ninety_six_channel/p1000/3_0.json +++ b/shared-data/pipette/definitions/2/general/ninety_six_channel/p1000/3_0.json @@ -28,6 +28,7 @@ "partialTipSupported": true, "availableConfigurations": [1, 8, 12, 96] }, + "backCompatNames": [], "channels": 96, "shaftDiameter": 4.5, "shaftULperMM": 15.904 diff --git a/shared-data/pipette/definitions/2/general/ninety_six_channel/p1000/3_3.json b/shared-data/pipette/definitions/2/general/ninety_six_channel/p1000/3_3.json index a56461d3ed8..ed67b258a5c 100644 --- a/shared-data/pipette/definitions/2/general/ninety_six_channel/p1000/3_3.json +++ b/shared-data/pipette/definitions/2/general/ninety_six_channel/p1000/3_3.json @@ -28,6 +28,7 @@ "partialTipSupported": true, "availableConfigurations": [1, 8, 12, 96] }, + "backCompatNames": [], "channels": 96, "shaftDiameter": 4.5, "shaftULperMM": 15.904 diff --git a/shared-data/pipette/definitions/2/general/ninety_six_channel/p1000/3_4.json b/shared-data/pipette/definitions/2/general/ninety_six_channel/p1000/3_4.json index 20d27c0e8c0..fab8391cb2b 100644 --- a/shared-data/pipette/definitions/2/general/ninety_six_channel/p1000/3_4.json +++ b/shared-data/pipette/definitions/2/general/ninety_six_channel/p1000/3_4.json @@ -35,6 +35,7 @@ "partialTipSupported": true, "availableConfigurations": [1, 8, 12, 96] }, + "backCompatNames": [], "channels": 96, "shaftDiameter": 4.5, "shaftULperMM": 15.904 diff --git a/shared-data/pipette/definitions/2/general/single_channel/p10/1_0.json b/shared-data/pipette/definitions/2/general/single_channel/p10/1_0.json index ee2ff754e06..cb0144c9b58 100644 --- a/shared-data/pipette/definitions/2/general/single_channel/p10/1_0.json +++ b/shared-data/pipette/definitions/2/general/single_channel/p10/1_0.json @@ -31,5 +31,6 @@ }, "channels": 1, "shaftDiameter": 1.0, - "shaftULperMM": 0.785 + "shaftULperMM": 0.785, + "backCompatNames": [] } diff --git a/shared-data/pipette/definitions/2/general/single_channel/p10/1_3.json b/shared-data/pipette/definitions/2/general/single_channel/p10/1_3.json index 26c8d2e46e3..858d31f64c1 100644 --- a/shared-data/pipette/definitions/2/general/single_channel/p10/1_3.json +++ b/shared-data/pipette/definitions/2/general/single_channel/p10/1_3.json @@ -31,5 +31,6 @@ }, "channels": 1, "shaftDiameter": 1.0, - "shaftULperMM": 0.785 + "shaftULperMM": 0.785, + "backCompatNames": [] } diff --git a/shared-data/pipette/definitions/2/general/single_channel/p10/1_4.json b/shared-data/pipette/definitions/2/general/single_channel/p10/1_4.json index 7c62eacab7b..a99d42e4ec1 100644 --- a/shared-data/pipette/definitions/2/general/single_channel/p10/1_4.json +++ b/shared-data/pipette/definitions/2/general/single_channel/p10/1_4.json @@ -31,5 +31,6 @@ }, "channels": 1, "shaftDiameter": 1.0, - "shaftULperMM": 0.785 + "shaftULperMM": 0.785, + "backCompatNames": [] } diff --git a/shared-data/pipette/definitions/2/general/single_channel/p10/1_5.json b/shared-data/pipette/definitions/2/general/single_channel/p10/1_5.json index 7c62eacab7b..a99d42e4ec1 100644 --- a/shared-data/pipette/definitions/2/general/single_channel/p10/1_5.json +++ b/shared-data/pipette/definitions/2/general/single_channel/p10/1_5.json @@ -31,5 +31,6 @@ }, "channels": 1, "shaftDiameter": 1.0, - "shaftULperMM": 0.785 + "shaftULperMM": 0.785, + "backCompatNames": [] } diff --git a/shared-data/pipette/definitions/2/general/single_channel/p1000/1_0.json b/shared-data/pipette/definitions/2/general/single_channel/p1000/1_0.json index 604ac171e5e..967b86e373b 100644 --- a/shared-data/pipette/definitions/2/general/single_channel/p1000/1_0.json +++ b/shared-data/pipette/definitions/2/general/single_channel/p1000/1_0.json @@ -31,5 +31,6 @@ }, "channels": 1, "shaftDiameter": 9.0, - "shaftULperMM": 63.617 + "shaftULperMM": 63.617, + "backCompatNames": [] } diff --git a/shared-data/pipette/definitions/2/general/single_channel/p1000/1_3.json b/shared-data/pipette/definitions/2/general/single_channel/p1000/1_3.json index a91cbc4e32d..4dcfbb4816d 100644 --- a/shared-data/pipette/definitions/2/general/single_channel/p1000/1_3.json +++ b/shared-data/pipette/definitions/2/general/single_channel/p1000/1_3.json @@ -31,5 +31,6 @@ }, "channels": 1, "shaftDiameter": 9.0, - "shaftULperMM": 63.617 + "shaftULperMM": 63.617, + "backCompatNames": [] } diff --git a/shared-data/pipette/definitions/2/general/single_channel/p1000/1_4.json b/shared-data/pipette/definitions/2/general/single_channel/p1000/1_4.json index a91cbc4e32d..4dcfbb4816d 100644 --- a/shared-data/pipette/definitions/2/general/single_channel/p1000/1_4.json +++ b/shared-data/pipette/definitions/2/general/single_channel/p1000/1_4.json @@ -31,5 +31,6 @@ }, "channels": 1, "shaftDiameter": 9.0, - "shaftULperMM": 63.617 + "shaftULperMM": 63.617, + "backCompatNames": [] } diff --git a/shared-data/pipette/definitions/2/general/single_channel/p1000/1_5.json b/shared-data/pipette/definitions/2/general/single_channel/p1000/1_5.json index e654b65ebb1..6f800a569d0 100644 --- a/shared-data/pipette/definitions/2/general/single_channel/p1000/1_5.json +++ b/shared-data/pipette/definitions/2/general/single_channel/p1000/1_5.json @@ -31,5 +31,6 @@ }, "channels": 1, "shaftDiameter": 9.0, - "shaftULperMM": 63.617 + "shaftULperMM": 63.617, + "backCompatNames": [] } diff --git a/shared-data/pipette/definitions/2/general/single_channel/p1000/2_0.json b/shared-data/pipette/definitions/2/general/single_channel/p1000/2_0.json index 1fa31a26a16..a07d9bdf916 100644 --- a/shared-data/pipette/definitions/2/general/single_channel/p1000/2_0.json +++ b/shared-data/pipette/definitions/2/general/single_channel/p1000/2_0.json @@ -31,5 +31,6 @@ }, "channels": 1, "shaftDiameter": 6.0, - "shaftULperMM": 28.274 + "shaftULperMM": 28.274, + "backCompatNames": ["p1000_single"] } diff --git a/shared-data/pipette/definitions/2/general/single_channel/p1000/2_1.json b/shared-data/pipette/definitions/2/general/single_channel/p1000/2_1.json index 0cf8ef63949..2d7c3d7d777 100644 --- a/shared-data/pipette/definitions/2/general/single_channel/p1000/2_1.json +++ b/shared-data/pipette/definitions/2/general/single_channel/p1000/2_1.json @@ -31,5 +31,6 @@ }, "channels": 1, "shaftDiameter": 6.0, - "shaftULperMM": 28.274 + "shaftULperMM": 28.274, + "backCompatNames": ["p1000_single"] } diff --git a/shared-data/pipette/definitions/2/general/single_channel/p1000/2_2.json b/shared-data/pipette/definitions/2/general/single_channel/p1000/2_2.json index 0cf8ef63949..2d7c3d7d777 100644 --- a/shared-data/pipette/definitions/2/general/single_channel/p1000/2_2.json +++ b/shared-data/pipette/definitions/2/general/single_channel/p1000/2_2.json @@ -31,5 +31,6 @@ }, "channels": 1, "shaftDiameter": 6.0, - "shaftULperMM": 28.274 + "shaftULperMM": 28.274, + "backCompatNames": ["p1000_single"] } diff --git a/shared-data/pipette/definitions/2/general/single_channel/p1000/3_0.json b/shared-data/pipette/definitions/2/general/single_channel/p1000/3_0.json index e263f792510..77c27448bf9 100644 --- a/shared-data/pipette/definitions/2/general/single_channel/p1000/3_0.json +++ b/shared-data/pipette/definitions/2/general/single_channel/p1000/3_0.json @@ -25,6 +25,7 @@ "environment": { "count": 1 } }, "partialTipConfigurations": { "partialTipSupported": false }, + "backCompatNames": [], "channels": 1, "shaftDiameter": 4.5, "shaftULperMM": 15.904 diff --git a/shared-data/pipette/definitions/2/general/single_channel/p1000/3_3.json b/shared-data/pipette/definitions/2/general/single_channel/p1000/3_3.json index e263f792510..77c27448bf9 100644 --- a/shared-data/pipette/definitions/2/general/single_channel/p1000/3_3.json +++ b/shared-data/pipette/definitions/2/general/single_channel/p1000/3_3.json @@ -25,6 +25,7 @@ "environment": { "count": 1 } }, "partialTipConfigurations": { "partialTipSupported": false }, + "backCompatNames": [], "channels": 1, "shaftDiameter": 4.5, "shaftULperMM": 15.904 diff --git a/shared-data/pipette/definitions/2/general/single_channel/p1000/3_4.json b/shared-data/pipette/definitions/2/general/single_channel/p1000/3_4.json index b529bcc62cf..47b908fb920 100644 --- a/shared-data/pipette/definitions/2/general/single_channel/p1000/3_4.json +++ b/shared-data/pipette/definitions/2/general/single_channel/p1000/3_4.json @@ -25,6 +25,7 @@ "environment": { "count": 1 } }, "partialTipConfigurations": { "partialTipSupported": false }, + "backCompatNames": [], "channels": 1, "shaftDiameter": 4.5, "shaftULperMM": 15.904 diff --git a/shared-data/pipette/definitions/2/general/single_channel/p20/2_0.json b/shared-data/pipette/definitions/2/general/single_channel/p20/2_0.json index daf99638aa5..355d86bc3a0 100644 --- a/shared-data/pipette/definitions/2/general/single_channel/p20/2_0.json +++ b/shared-data/pipette/definitions/2/general/single_channel/p20/2_0.json @@ -31,5 +31,6 @@ }, "channels": 1, "shaftDiameter": 1.0, - "shaftULperMM": 0.785 + "shaftULperMM": 0.785, + "backCompatNames": ["p10_single"] } diff --git a/shared-data/pipette/definitions/2/general/single_channel/p20/2_1.json b/shared-data/pipette/definitions/2/general/single_channel/p20/2_1.json index aa8ee0d531a..c1248c2a8b0 100644 --- a/shared-data/pipette/definitions/2/general/single_channel/p20/2_1.json +++ b/shared-data/pipette/definitions/2/general/single_channel/p20/2_1.json @@ -31,5 +31,6 @@ }, "channels": 1, "shaftDiameter": 1.0, - "shaftULperMM": 0.785 + "shaftULperMM": 0.785, + "backCompatNames": ["p10_single"] } diff --git a/shared-data/pipette/definitions/2/general/single_channel/p20/2_2.json b/shared-data/pipette/definitions/2/general/single_channel/p20/2_2.json index aa8ee0d531a..c1248c2a8b0 100644 --- a/shared-data/pipette/definitions/2/general/single_channel/p20/2_2.json +++ b/shared-data/pipette/definitions/2/general/single_channel/p20/2_2.json @@ -31,5 +31,6 @@ }, "channels": 1, "shaftDiameter": 1.0, - "shaftULperMM": 0.785 + "shaftULperMM": 0.785, + "backCompatNames": ["p10_single"] } diff --git a/shared-data/pipette/definitions/2/general/single_channel/p300/1_0.json b/shared-data/pipette/definitions/2/general/single_channel/p300/1_0.json index 2e625412fc5..e04a72cf7c5 100644 --- a/shared-data/pipette/definitions/2/general/single_channel/p300/1_0.json +++ b/shared-data/pipette/definitions/2/general/single_channel/p300/1_0.json @@ -31,5 +31,6 @@ }, "channels": 1, "shaftDiameter": 5.0, - "shaftULperMM": 19.635 + "shaftULperMM": 19.635, + "backCompatNames": [] } diff --git a/shared-data/pipette/definitions/2/general/single_channel/p300/1_3.json b/shared-data/pipette/definitions/2/general/single_channel/p300/1_3.json index 39ccecdaa9c..1a150c11e74 100644 --- a/shared-data/pipette/definitions/2/general/single_channel/p300/1_3.json +++ b/shared-data/pipette/definitions/2/general/single_channel/p300/1_3.json @@ -31,5 +31,6 @@ }, "channels": 1, "shaftDiameter": 5.0, - "shaftULperMM": 19.635 + "shaftULperMM": 19.635, + "backCompatNames": [] } diff --git a/shared-data/pipette/definitions/2/general/single_channel/p300/1_4.json b/shared-data/pipette/definitions/2/general/single_channel/p300/1_4.json index d2f2161cfe6..fca4873fb0f 100644 --- a/shared-data/pipette/definitions/2/general/single_channel/p300/1_4.json +++ b/shared-data/pipette/definitions/2/general/single_channel/p300/1_4.json @@ -31,5 +31,6 @@ }, "channels": 1, "shaftDiameter": 5.0, - "shaftULperMM": 19.635 + "shaftULperMM": 19.635, + "backCompatNames": [] } diff --git a/shared-data/pipette/definitions/2/general/single_channel/p300/1_5.json b/shared-data/pipette/definitions/2/general/single_channel/p300/1_5.json index d2f2161cfe6..fca4873fb0f 100644 --- a/shared-data/pipette/definitions/2/general/single_channel/p300/1_5.json +++ b/shared-data/pipette/definitions/2/general/single_channel/p300/1_5.json @@ -31,5 +31,6 @@ }, "channels": 1, "shaftDiameter": 5.0, - "shaftULperMM": 19.635 + "shaftULperMM": 19.635, + "backCompatNames": [] } diff --git a/shared-data/pipette/definitions/2/general/single_channel/p300/2_0.json b/shared-data/pipette/definitions/2/general/single_channel/p300/2_0.json index dde0a377afb..725bc1a774e 100644 --- a/shared-data/pipette/definitions/2/general/single_channel/p300/2_0.json +++ b/shared-data/pipette/definitions/2/general/single_channel/p300/2_0.json @@ -31,5 +31,6 @@ }, "channels": 1, "shaftDiameter": 3.5, - "shaftULperMM": 9.621 + "shaftULperMM": 9.621, + "backCompatNames": ["p300_single"] } diff --git a/shared-data/pipette/definitions/2/general/single_channel/p300/2_1.json b/shared-data/pipette/definitions/2/general/single_channel/p300/2_1.json index ed4258593da..7d89898d8d8 100644 --- a/shared-data/pipette/definitions/2/general/single_channel/p300/2_1.json +++ b/shared-data/pipette/definitions/2/general/single_channel/p300/2_1.json @@ -31,5 +31,6 @@ }, "channels": 1, "shaftDiameter": 3.5, - "shaftULperMM": 9.621 + "shaftULperMM": 9.621, + "backCompatNames": ["p300_single"] } diff --git a/shared-data/pipette/definitions/2/general/single_channel/p50/1_0.json b/shared-data/pipette/definitions/2/general/single_channel/p50/1_0.json index 523f8ee1836..a07b48410a9 100644 --- a/shared-data/pipette/definitions/2/general/single_channel/p50/1_0.json +++ b/shared-data/pipette/definitions/2/general/single_channel/p50/1_0.json @@ -31,5 +31,6 @@ }, "channels": 1, "shaftDiameter": 2.0, - "shaftULperMM": 3.142 + "shaftULperMM": 3.142, + "backCompatNames": [] } diff --git a/shared-data/pipette/definitions/2/general/single_channel/p50/1_3.json b/shared-data/pipette/definitions/2/general/single_channel/p50/1_3.json index a6ccfff43d4..7637e10d2d7 100644 --- a/shared-data/pipette/definitions/2/general/single_channel/p50/1_3.json +++ b/shared-data/pipette/definitions/2/general/single_channel/p50/1_3.json @@ -31,5 +31,6 @@ }, "channels": 1, "shaftDiameter": 2.0, - "shaftULperMM": 3.142 + "shaftULperMM": 3.142, + "backCompatNames": [] } diff --git a/shared-data/pipette/definitions/2/general/single_channel/p50/1_4.json b/shared-data/pipette/definitions/2/general/single_channel/p50/1_4.json index b5871f837a0..4024a503fc6 100644 --- a/shared-data/pipette/definitions/2/general/single_channel/p50/1_4.json +++ b/shared-data/pipette/definitions/2/general/single_channel/p50/1_4.json @@ -31,5 +31,6 @@ }, "channels": 1, "shaftDiameter": 2.0, - "shaftULperMM": 3.142 + "shaftULperMM": 3.142, + "backCompatNames": [] } diff --git a/shared-data/pipette/definitions/2/general/single_channel/p50/1_5.json b/shared-data/pipette/definitions/2/general/single_channel/p50/1_5.json index 83be335683b..c06ec20c669 100644 --- a/shared-data/pipette/definitions/2/general/single_channel/p50/1_5.json +++ b/shared-data/pipette/definitions/2/general/single_channel/p50/1_5.json @@ -33,5 +33,6 @@ }, "channels": 1, "shaftDiameter": 2.0, - "shaftULperMM": 3.142 + "shaftULperMM": 3.142, + "backCompatNames": [] } diff --git a/shared-data/pipette/definitions/2/general/single_channel/p50/3_0.json b/shared-data/pipette/definitions/2/general/single_channel/p50/3_0.json index b893b5a7abd..950bf6f6bc1 100644 --- a/shared-data/pipette/definitions/2/general/single_channel/p50/3_0.json +++ b/shared-data/pipette/definitions/2/general/single_channel/p50/3_0.json @@ -25,6 +25,7 @@ "environment": { "count": 1 } }, "partialTipConfigurations": { "partialTipSupported": false }, + "backCompatNames": [], "channels": 1, "shaftDiameter": 1.0, "shaftULperMM": 0.785 diff --git a/shared-data/pipette/definitions/2/general/single_channel/p50/3_3.json b/shared-data/pipette/definitions/2/general/single_channel/p50/3_3.json index b893b5a7abd..950bf6f6bc1 100644 --- a/shared-data/pipette/definitions/2/general/single_channel/p50/3_3.json +++ b/shared-data/pipette/definitions/2/general/single_channel/p50/3_3.json @@ -25,6 +25,7 @@ "environment": { "count": 1 } }, "partialTipConfigurations": { "partialTipSupported": false }, + "backCompatNames": [], "channels": 1, "shaftDiameter": 1.0, "shaftULperMM": 0.785 diff --git a/shared-data/pipette/definitions/2/general/single_channel/p50/3_4.json b/shared-data/pipette/definitions/2/general/single_channel/p50/3_4.json index 00a5304f701..cb2a6dd0f0e 100644 --- a/shared-data/pipette/definitions/2/general/single_channel/p50/3_4.json +++ b/shared-data/pipette/definitions/2/general/single_channel/p50/3_4.json @@ -25,6 +25,7 @@ "environment": { "count": 1 } }, "partialTipConfigurations": { "partialTipSupported": false }, + "backCompatNames": [], "channels": 1, "shaftDiameter": 1.0, "shaftULperMM": 0.785 diff --git a/shared-data/pipette/schemas/2/pipettePropertiesSchema.json b/shared-data/pipette/schemas/2/pipettePropertiesSchema.json index 2cb2cb4cd89..5effe9400a0 100644 --- a/shared-data/pipette/schemas/2/pipettePropertiesSchema.json +++ b/shared-data/pipette/schemas/2/pipettePropertiesSchema.json @@ -83,7 +83,8 @@ "displayCategory", "channels", "model", - "displayName" + "displayName", + "backCompatNames" ], "properties": { "additionalProperties": false, @@ -91,6 +92,11 @@ "type": "string", "description": "The path to a valid Opentrons shared schema relative to the shared-data directory, without its extension. For instance, #/pipette/schemas/2/pipettePropertiesSchema.json is a reference to this schema." }, + "backCompatNames": { + "type": "array", + "description": "Array of pipette names that are compatible with the given pipette", + "items": { "type": "string" } + }, "channels": { "$ref": "#/definitions/channels" }, "partialTipConfigurations": { "type": "object", diff --git a/shared-data/python/opentrons_shared_data/pipette/pipette_definition.py b/shared-data/python/opentrons_shared_data/pipette/pipette_definition.py index 7ffc2c6bd6a..100f7a71d24 100644 --- a/shared-data/python/opentrons_shared_data/pipette/pipette_definition.py +++ b/shared-data/python/opentrons_shared_data/pipette/pipette_definition.py @@ -213,6 +213,11 @@ class PipettePhysicalPropertiesDefinition(BaseModel): description="The display or full product name of the pipette.", alias="displayName", ) + pipette_backcompat_names: List[str] = Field( + ..., + description="A list of pipette names that are compatible with this pipette.", + alias="backCompatNames", + ) pipette_type: PipetteModelType = Field( ..., description="The pipette model type (related to number of channels).", diff --git a/shared-data/python/opentrons_shared_data/pipette/scripts/build_json_script.py b/shared-data/python/opentrons_shared_data/pipette/scripts/build_json_script.py index 74266790ad8..7be1171b960 100644 --- a/shared-data/python/opentrons_shared_data/pipette/scripts/build_json_script.py +++ b/shared-data/python/opentrons_shared_data/pipette/scripts/build_json_script.py @@ -2,27 +2,25 @@ import csv import json from ast import literal_eval -from typing import Optional, Dict, Union, Any, cast, List +from typing import Optional, Dict, Union, Any, List from pathlib import Path from pydantic import BaseModel import math from ... import get_shared_data_root -from .. import name_config, model_config from ..pipette_definition import ( PipetteGeometryDefinition, PipetteLiquidPropertiesDefinition, PipettePhysicalPropertiesDefinition, TipHandlingConfigurations, PlungerPositions, - PipetteTipType, SupportedTipsDefinition, MotorConfigurations, PartialTipDefinition, AvailableSensorDefinition, ) -from ..dev_types import PipetteModelSpec, PipetteNameSpec, PipetteName +from ..dev_types import PipetteModelSpec PIPETTE_DEFINITION_ROOT = Path("pipette") / "definitions" / "2" @@ -35,58 +33,6 @@ GEOMETRY_SCHEMA = "#/pipette/schemas/2/pipetteGeometryPropertiesSchema.json" -def _migrate_liquid_model_v1( - model_configurations: PipetteModelSpec, name_configurations: PipetteNameSpec -) -> PipetteLiquidPropertiesDefinition: - return build_liquid_model_v2( - { - "maxVolume": name_configurations["maxVolume"], - "minVolume": name_configurations["minVolume"], - "defaultTipracks": name_configurations["defaultTipracks"], - }, - _migrate_supported_tips(model_configurations, name_configurations), - ) - - -def _migrate_physical_model_v1( - pipette_type: str, - model_configurations: PipetteModelSpec, - name_configurations: PipetteNameSpec, -) -> PipettePhysicalPropertiesDefinition: - channels = name_configurations["channels"] - pick_up_tip_configurations = _build_tip_handling_configurations( - "pickup", model_configurations - ) - drop_tip_configurations = _build_tip_handling_configurations( - "drop", model_configurations - ) - plunger_positions = _build_plunger_positions(model_configurations) - plunger_motor_configurations = _build_motor_configurations(model_configurations) - partial_tip_configurations = _build_partial_tip_configurations(int(channels)) - return build_physical_model_v2( - { - "displayName": name_configurations["displayName"], - "model": pipette_type, - "displayCategory": name_configurations["displayCategory"], - "pickUpTipConfigurations": pick_up_tip_configurations, - "dropTipConfigurations": drop_tip_configurations, - "plungerMotorConfigurations": plunger_motor_configurations, - "plungerPositionsConfigurations": plunger_positions, - "partialTipConfigurations": partial_tip_configurations, - "channels": channels, - } - ) - - -def _migrate_geometry_model_v1( - path_to_3d: str, model_configurations: PipetteModelSpec -) -> PipetteGeometryDefinition: - - return build_geometry_model_v2( - {"nozzleOffset": model_configurations["nozzleOffset"], "pathTo3D": path_to_3d} - ) - - def _build_tip_handling_configurations( tip_handling_type: str, model_configurations: Optional[PipetteModelSpec] = None ) -> TipHandlingConfigurations: @@ -224,8 +170,13 @@ def build_physical_model_v2( available_sensors = AvailableSensorDefinition( sensors=input_dictionary.pop("availableSensors", []) ) + back_compat_names = input_dictionary.pop("backCompatNames", []) return PipettePhysicalPropertiesDefinition.parse_obj( - {**input_dictionary, "availableSensors": available_sensors} + { + **input_dictionary, + "availableSensors": available_sensors, + "backCompatNames": back_compat_names, + } ) print(f"Handling general pipette information for {pipette_type}\n") display_name = input("please provide the product name of the pipette\n") @@ -245,6 +196,13 @@ def build_physical_model_v2( plunger_motor_configurations = _build_motor_configurations() partial_tip_configurations = _build_partial_tip_configurations(int(channels)) + back_compat_names_str = input( + "Please list compatible pipette names separated by commas or hit enter if none" + ) + if back_compat_names_str: + back_compat_names = [i.strip() for i in back_compat_names_str.split(",")] + else: + back_compat_names = [] return PipettePhysicalPropertiesDefinition.parse_obj( { "displayName": display_name, @@ -261,62 +219,11 @@ def build_physical_model_v2( "channels": channels, "shaftDiameter": shaft_diam, "shaftULperMM": shaft_ul_per_mm, + "backCompatNames": back_compat_names, } ) -def _migrate_supported_tips( - model_configurations: PipetteModelSpec, name_configurations: PipetteNameSpec -) -> Dict[str, SupportedTipsDefinition]: - - ul_per_mm = model_configurations["ulPerMm"][0] - - tip_overlap_dict = model_configurations["tipOverlap"] - - tip_volumes = set() - tip_overlap_tiprack_set: Dict[str, Any] = {} - for tiprack, overlap in tip_overlap_dict.items(): - split_value = tiprack.split("ul")[0].split("_") - if len(split_value) == 1: - continue - current_tip_volume = split_value[-1] - tip_volumes.add(current_tip_volume) - if tip_overlap_tiprack_set.get(current_tip_volume, None): - tip_overlap_tiprack_set[current_tip_volume][tiprack] = overlap - else: - tip_overlap_tiprack_set[current_tip_volume] = {tiprack: overlap} - return { - PipetteTipType(int(volume)).name: build_supported_tips( - { - "aspirate": { - tiprack: ul_per_mm["aspirate"] - for tiprack in tip_overlap_tiprack_set[volume] - }, - "dispense": { - tiprack: ul_per_mm["dispense"] - for tiprack in tip_overlap_tiprack_set[volume] - }, - "defaultReturnTipHeight": model_configurations.get( - "returnTipHeight", None - ), - "defaultAspirateFlowRate": name_configurations[ - "defaultAspirateFlowRate" - ]["value"], - "defaultBlowOurFlowRate": name_configurations[ - "defaultDispenseFlowRate" - ]["value"], - "defaultDispenseFlowRate": name_configurations[ - "defaultDispenseFlowRate" - ]["value"], - "defaultTipLength": model_configurations["tipLength"]["value"], - "defaultTipOverlap": tip_overlap_dict["default"], - "defaultTipOverlapDictionary": tip_overlap_tiprack_set[volume], - } - ) - for volume in tip_volumes - } - - def build_supported_tips(input_dictionary: Dict[str, Any]) -> SupportedTipsDefinition: return SupportedTipsDefinition.parse_obj(input_dictionary) @@ -351,73 +258,6 @@ def save_to_file( filepath.write_text(json.dumps(data, ensure_ascii=False), encoding="utf-8") -def migrate_v1_to_v2() -> None: - """ - Migrate pipette config data from v1 to v2 schema version. - """ - all_models = model_config()["config"] - config_models_ot2 = [ - k for k in all_models.keys() if "v3" not in k and "v4" not in k - ] - - quirks_list = {} - for model in config_models_ot2: - base_name, full_version = model.split("_v") - generation = "_gen2" if float(full_version) >= 2.0 else "" - name = cast(PipetteName, f"{base_name}{generation}") - - name_configurations = name_config()[name] - model_configurations = all_models[model] - - liquid_model = _migrate_liquid_model_v1( - model_configurations, name_configurations - ) - pipette_type = f"p{liquid_model.max_volume}" - physical_model = _migrate_physical_model_v1( - pipette_type, model_configurations, name_configurations - ) - - quirks_list[model] = model_configurations["quirks"] - split_version = full_version.split(".") - file_name = ( - f"{split_version[0]}_{split_version[1] if len(split_version) > 1 else 0}" - ) - current_pipette_path = Path(physical_model.channels.name.lower()) / pipette_type - - path_to_3d = PIPETTE_DEFINITION_ROOT / current_pipette_path / "placeholder.gltf" - geometry_model = _migrate_geometry_model_v1( - str(path_to_3d), model_configurations - ) - - # workaround to better serialize nested dicts in pydantic - dict_liquid_model = liquid_model.dict(by_alias=True) - dict_liquid_model["supportedTips"] = { - k.name: v for k, v in dict_liquid_model["supportedTips"].items() - } - - save_to_file( - GEOMETRY_ROOT / current_pipette_path, - file_name, - geometry_model, - GEOMETRY_SCHEMA, - ) - save_to_file( - GENERAL_ROOT / current_pipette_path, - file_name, - physical_model, - GENERAL_SCHEMA, - ) - save_to_file( - LIQUID_ROOT / current_pipette_path, - file_name, - dict_liquid_model, - LIQUID_SCHEMA, - ) - - for key, items in quirks_list.items(): - print(f"Quirks list for {key}: {items}") - - def migrate_new_blow_out_configs_v2() -> None: pipette_volumes = { 1: ["p10", "p50", "p300", "p1000"], @@ -574,12 +414,6 @@ def main() -> None: parser = argparse.ArgumentParser( description="96 channel tip handling testing script." ) - parser.add_argument( - "--new_pipette_model", - type=bool, - help="If true, build a new pipette model from scratch", - default=False, - ) parser.add_argument( "--path_to_pipette_model", type=str, @@ -594,7 +428,9 @@ def main() -> None: ) args = parser.parse_args() - if args.new_pipette_model: + if args.migrate_blowout_configs: + migrate_new_blow_out_configs_v2() + else: using_csv = "" if args.path_to_pipette_model else "out" print(f"Building new pipette function with{using_csv} using csv") @@ -648,11 +484,6 @@ def main() -> None: build_new_pipette_model_v2( converted_pipette_functions_dict, args.path_to_pipette_model ) - elif args.migrate_blowout_configs: - migrate_new_blow_out_configs_v2() - else: - print("Migrating schema v1 files...") - migrate_v1_to_v2() if __name__ == "__main__":