Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feat(shared-data): add the p200_96 #17079

Closed
wants to merge 71 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
71 commits
Select commit Hold shift + click to select a range
9853407
Update 96ch 200ul function for photometric tag
adcooll Oct 19, 2023
a982927
Update P1KH 50ul function
adcooll Oct 24, 2023
a97a68a
Update dispense submerge to 3.0
adcooll Dec 4, 2023
73feaeb
add test 1ul
wweiye Dec 7, 2023
d3893c7
add v36,backlash=3,new function
adcooll Apr 1, 2024
016862f
feat(hardware, shared-data, api): Support LV 96 channel (#16747)
ryanthecoder Nov 12, 2024
e607918
feat(shared-data): add lv96 shared data definitions (#16749)
ryanthecoder Nov 12, 2024
a475d10
make the 200ul 96 match the old schema version
ryanthecoder Nov 14, 2024
86352a0
update v7 schema
ryanthecoder Nov 14, 2024
026b57d
feat(hardware-testing): add the 200ul 96 channel to the gravimetric a…
ryanthecoder Nov 13, 2024
714dafd
add the 1_0.json because this is hella old
ryanthecoder Nov 14, 2024
3c1bfb5
add 20ul tiprack definition
ryanthecoder Jun 12, 2024
4d02734
add filtertips of 20ul
ryanthecoder Jun 12, 2024
274d41a
add definitions to pipettes for 20ul tips
ryanthecoder Jun 12, 2024
b456474
Add 20uL tip option to relevant files
meh-di Jul 18, 2024
9b651f6
Edit 20ul tip length in tiprack definition
meh-di Jul 18, 2024
c0131ca
fix js format
ryanthecoder Jul 18, 2024
f28b480
Resolve key error in gravimetric config
meh-di Jul 18, 2024
3893073
fixups for 20ul tips
ryanthecoder Jul 18, 2024
bf32b2d
placeholder pipette functions
ryanthecoder Jul 19, 2024
de1ba2e
Add 20uL tip compatibility with 96ch config
meh-di Sep 19, 2024
5c3e234
add 20 ul tips to the protocol
ryanthecoder Sep 20, 2024
3545c05
fix some other things for the 96 channel
ryanthecoder Sep 20, 2024
5f95715
fix pick up and dropoffs
ryanthecoder Sep 20, 2024
f4d83a4
Add 20uL tip support for photometric testing
meh-di Oct 18, 2024
75b8260
fix protocol import
ryanthecoder Oct 21, 2024
fe25ab4
fixups from mergeing the 20ul branch and add 20ul tests to the p200
ryanthecoder Nov 14, 2024
82183d6
make increment test work for 200ul 96
ryanthecoder Nov 14, 2024
9a8b2d2
debug liquid class
Andiiiiiiyy Dec 2, 2024
10fefef
debug blow out flow rate
Andiiiiiiyy Dec 2, 2024
3964609
96ch p200 photometric 50ul tips volume to 50
adcooll Dec 3, 2024
6fc69fc
add p200 gravimetric photometric
wweiye Dec 3, 2024
5c238aa
Fix dispense setting bug
adcooll Dec 3, 2024
5276bcb
fix ul/ml for p200 pipette increments
Andiiiiiiyy Dec 4, 2024
b6193eb
fix flow rate
adcooll Dec 4, 2024
26e8ade
modified 96ch p200 dispense plunger speed
Andiiiiiiyy Dec 4, 2024
e6babeb
Merge branch '96ch-200-grav' of https://github.com/Opentrons/opentron…
Andiiiiiiyy Dec 4, 2024
e0e7558
add increments
Andiiiiiiyy Dec 5, 2024
9648a39
Merge branch '96ch-200-grav' into EXEC-1055-96-chan-testing-mergeback
ryanthecoder Dec 10, 2024
bd094b8
merge fixups
ryanthecoder Dec 10, 2024
e358b3a
add p200_96 to the v1 schema so we can see them in analysis and on th…
ryanthecoder Dec 5, 2024
6f16f91
fix the analysis
ryanthecoder Dec 5, 2024
84020c2
try and find all the hardcoded p1000_96
ryanthecoder Dec 5, 2024
f912d44
update p200 96ch increment
Andiiiiiiyy Dec 6, 2024
00106d6
post 96ch 200ul pipette t50 function
adcooll Dec 6, 2024
ad35483
P2HH 200ul increments
Andiiiiiiyy Dec 9, 2024
0474675
cancle print labware offset
Andiiiiiiyy Dec 9, 2024
3addd01
update tip 200 increments
Andiiiiiiyy Dec 9, 2024
21940d2
add some makefile targets for hardware-testing
ryanthecoder Dec 9, 2024
eba36c2
Up P2HH T20 function
adcooll Dec 10, 2024
c9fc112
format
ryanthecoder Dec 10, 2024
11ceac5
fix shared data
ryanthecoder Dec 10, 2024
1bcd719
fix shared data python tests
ryanthecoder Dec 10, 2024
a16173b
format
ryanthecoder Dec 10, 2024
8d3c263
dont try to setup the app/shell
ryanthecoder Dec 10, 2024
465093e
adjustments to accomodate 96ch-low-volume
rclarke0 Dec 10, 2024
b81eae3
add missing CV/%D requirements
ryanthecoder Dec 11, 2024
11aa7ff
up P2HH T200 function
adcooll Dec 11, 2024
3a9f54e
undo makefile change
ryanthecoder Dec 11, 2024
13c778b
removing 20ul tips since they are not in shared-data
rclarke0 Dec 11, 2024
8b91a85
replace the old csv system with a new one
ryanthecoder Dec 11, 2024
8c1fd54
Merge remote-tracking branch 'origin/edge' into EXEC-1055-96-chan-tes…
ryanthecoder Dec 11, 2024
394365e
Merge branch 'hardware-testing-96ch-lowvol-lld' into EXEC-1055-96-cha…
ryanthecoder Dec 11, 2024
fcd5bee
Revert "removing 20ul tips since they are not in shared-data"
ryanthecoder Dec 12, 2024
1026167
cancle print labware does not apply
Andiiiiiiyy Dec 12, 2024
ec43453
format js
ryanthecoder Dec 12, 2024
52dbfcb
format py
ryanthecoder Dec 12, 2024
fae7c37
lint py
ryanthecoder Dec 12, 2024
f99df68
fix the snapshot tests
ryanthecoder Dec 12, 2024
979241b
Merge remote-tracking branch 'origin/edge' into EXEC-1055-96-chan-tes…
ryanthecoder Dec 12, 2024
bf63e7e
Merge remote-tracking branch 'origin/edge' into EXEC-1055-96-chan-tes…
ryanthecoder Dec 13, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions api/src/opentrons/protocol_api/protocol_context.py
Original file line number Diff line number Diff line change
Expand Up @@ -963,6 +963,7 @@ def load_instrument(
"""
instrument_name = validation.ensure_lowercase_name(instrument_name)
checked_instrument_name = validation.ensure_pipette_name(instrument_name)

checked_mount = validation.ensure_mount_for_pipette(
mount, checked_instrument_name
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -76,8 +76,11 @@ export function ProtocolInstrumentMountItem(
[]
)
const [flowType, setFlowType] = useState<string>(FLOWS.ATTACH)
const selectedPipette =
speccedName === 'p1000_96' ? NINETY_SIX_CHANNEL : SINGLE_MOUNT_PIPETTES
const is96ChannelPipette =
speccedName === 'p1000_96' || speccedName === 'p200_96'
const selectedPipette = is96ChannelPipette
? NINETY_SIX_CHANNEL
: SINGLE_MOUNT_PIPETTES

const handleCalibrate: MouseEventHandler = () => {
setFlowType(FLOWS.CALIBRATE)
Expand All @@ -95,7 +98,7 @@ export function ProtocolInstrumentMountItem(
setShowPipetteWizardFlow(true)
}
}
const is96ChannelPipette = speccedName === 'p1000_96'

const isAttachedWithCal =
attachedInstrument != null &&
attachedInstrument.ok &&
Expand Down
5 changes: 4 additions & 1 deletion app/src/organisms/PipetteWizardFlows/BeforeBeginning.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -144,7 +144,10 @@ export const BeforeBeginning = (
const displayName = pipetteDisplayName ?? requiredPipette.pipetteName
bodyTranslationKey = 'remove_labware'

if (requiredPipette.pipetteName === 'p1000_96') {
if (
requiredPipette.pipetteName === 'p1000_96' ||
requiredPipette.pipetteName === 'p200_96'
) {
equipmentList = [
{ ...NINETY_SIX_CHANNEL_PIPETTE, displayName },
CALIBRATION_PROBE,
Expand Down
3 changes: 2 additions & 1 deletion app/src/organisms/PipetteWizardFlows/DetachPipette.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,8 @@ export const DetachPipette = (props: DetachPipetteProps): JSX.Element => {
}
const memoizedAttachedPipettes = useMemo(() => attachedPipettes, [])
const is96ChannelPipette =
memoizedAttachedPipettes[mount]?.instrumentName === 'p1000_96'
memoizedAttachedPipettes[mount]?.instrumentName === 'p1000_96' ||
memoizedAttachedPipettes[mount]?.instrumentName === 'p200_96'
const pipetteName =
attachedPipettes[mount] != null
? attachedPipettes[mount]?.displayName
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -413,8 +413,11 @@ export const getPipetteWizardStepsForProtocol = (
): PipetteWizardStep[] | null => {
const requiredPipette = pipetteInfo.find(pipette => pipette.mount === mount)
const ninetySixChannelAttached =
attachedPipettes[LEFT]?.instrumentName === 'p1000_96'
const ninetySixChannelRequested = requiredPipette?.pipetteName === 'p1000_96'
attachedPipettes[LEFT]?.instrumentName === 'p1000_96' ||
attachedPipettes[LEFT]?.instrumentName === 'p200_96'
const ninetySixChannelRequested =
requiredPipette?.pipetteName === 'p1000_96' ||
requiredPipette?.pipetteName === 'p200_96'

if (requiredPipette == null) {
// return empty array if no pipette is required in the protocol
Expand Down
8 changes: 6 additions & 2 deletions app/src/organisms/PipetteWizardFlows/hooks.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -90,10 +90,14 @@ export function usePipetteFlowWizardHeaderText(
)
} else if (
attachedPipettes[LEFT]?.data.channels === 96 &&
mountPipette?.pipetteName !== 'p1000_96'
mountPipette?.pipetteName !== 'p1000_96' &&
mountPipette?.pipetteName !== 'p200_96'
) {
return t('detach_96_attach_mount', { mount: capitalizedMount })
} else if (leftPipette?.pipetteName === 'p1000_96') {
} else if (
leftPipette?.pipetteName === 'p1000_96' ||
leftPipette?.pipetteName === 'p200_96'
) {
if (isGantryEmpty) {
return t('attach_96_channel')
} else if (
Expand Down
7 changes: 7 additions & 0 deletions hardware-testing/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,7 @@ test-photometric:
$(python) -m hardware_testing.gravimetric --photometric --simulate --pipette 1000 --channels 96 --tip 50 --trials 1
$(python) -m hardware_testing.gravimetric --photometric --simulate --pipette 1000 --channels 96 --tip 200 --trials 1
$(python) -m hardware_testing.gravimetric --photometric --simulate --pipette 200 --channels 96 --tip 50 --trials 1
$(python) -m hardware_testing.gravimetric --photometric --simulate --pipette 200 --channels 96 --tip 20 --trials 1

.PHONY: test-gravimetric-single
test-gravimetric-single:
Expand All @@ -123,6 +124,7 @@ test-gravimetric-multi:
test-gravimetric-96:
$(python) -m hardware_testing.gravimetric --simulate --pipette 1000 --channels 96 --trials 2 --no-blank
$(python) -m hardware_testing.gravimetric --simulate --pipette 200 --channels 96 --trials 2 --no-blank
$(python) -m hardware_testing.gravimetric --simulate --pipette 200 --channels 96 --trials 1 --no-blank --increment --tip 20

.PHONY: test-gravimetric
test-gravimetric:
Expand Down Expand Up @@ -229,6 +231,11 @@ push-no-restart-ot3: sdist Pipfile.lock
.PHONY: push-ot3
push-ot3: push-no-restart-ot3 push-plot-webpage-ot3 push-description-ot3 push-labware-ot3

.PHONE: open-dev-app
open-dev-app:
cd .. && $(MAKE) -C app dev


.PHONY: push-all
push-all: clean wheel push-no-restart push-plot-webpage-ot3

Expand Down
28 changes: 19 additions & 9 deletions hardware-testing/hardware_testing/gravimetric/__main__.py
Original file line number Diff line number Diff line change
Expand Up @@ -70,11 +70,12 @@

GRAVIMETRIC_CFG_INCREMENT = {
50: {
1: {50: gravimetric_ot3_p50_single},
1: {20: gravimetric_ot3_p50_single, 50: gravimetric_ot3_p50_single},
8: {50: gravimetric_ot3_p50_multi_50ul_tip_increment},
},
200: {
96: {
20: gravimetric_ot3_p200_96,
50: gravimetric_ot3_p200_96,
200: gravimetric_ot3_p200_96,
},
Expand Down Expand Up @@ -117,14 +118,19 @@
PHOTOMETRIC_CFG = {
50: {
1: {
20: photometric_ot3_p50_single,
50: photometric_ot3_p50_single,
},
8: {
50: photometric_ot3_p50_multi,
},
},
200: {
96: {50: photometric_ot3_p200_96, 200: photometric_ot3_p200_96},
96: {
20: photometric_ot3_p200_96,
50: photometric_ot3_p200_96,
200: photometric_ot3_p200_96,
},
},
1000: {
1: {
Expand All @@ -137,7 +143,11 @@
200: photometric_ot3_p1000_multi,
1000: photometric_ot3_p1000_multi,
},
96: {50: photometric_ot3_p1000_96, 200: photometric_ot3_p1000_96},
96: {
20: photometric_ot3_p1000_96,
50: photometric_ot3_p1000_96,
200: photometric_ot3_p1000_96,
},
},
}

Expand Down Expand Up @@ -177,11 +187,11 @@ def _get_protocol_context(cls, args: argparse.Namespace) -> ProtocolContext:
"Starting opentrons-robot-server, so we can http GET labware offsets"
)
LABWARE_OFFSETS.extend(workarounds.http_get_all_labware_offsets())
ui.print_info(f"found {len(LABWARE_OFFSETS)} offsets:")
for offset in LABWARE_OFFSETS:
ui.print_info(f"\t{offset.createdAt}:")
ui.print_info(f"\t\t{offset.definitionUri}")
ui.print_info(f"\t\t{offset.vector}")
# ui.print_info(f"found {len(LABWARE_OFFSETS)} offsets:")
# for offset in LABWARE_OFFSETS:
# ui.print_info(f"\t{offset.createdAt}:")
# ui.print_info(f"\t\t{offset.definitionUri}")
# ui.print_info(f"\t\t{offset.vector}")
# gather the custom labware (for simulation)
custom_defs = {}
if args.simulate:
Expand Down Expand Up @@ -572,7 +582,7 @@ def _main(
parser.add_argument("--simulate", action="store_true")
parser.add_argument("--pipette", type=int, choices=[50, 200, 1000], required=True)
parser.add_argument("--channels", type=int, choices=[1, 8, 96], default=1)
parser.add_argument("--tip", type=int, choices=[0, 50, 200, 1000], default=0)
parser.add_argument("--tip", type=int, choices=[0, 20, 50, 200, 1000], default=0)
parser.add_argument("--trials", type=int, default=0)
parser.add_argument("--increment", action="store_true")
parser.add_argument("--return-tip", action="store_true")
Expand Down
66 changes: 51 additions & 15 deletions hardware-testing/hardware_testing/gravimetric/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -88,30 +88,40 @@ class PhotometricConfig(VolumetricConfig):
LIQUID_PROBE_SETTINGS: Dict[int, Dict[int, Dict[int, Dict[str, int]]]] = {
50: {
1: {
20: {
"mount_speed": 5,
"plunger_speed": 15,
"sensor_threshold_pascals": 15,
},
50: {
"mount_speed": 5,
"plunger_speed": 20,
"plunger_speed": 15,
"sensor_threshold_pascals": 15,
},
},
8: {
50: {
"mount_speed": 5,
"plunger_speed": 20,
"plunger_speed": 15,
"sensor_threshold_pascals": 15,
},
},
},
200: {
96: {
20: {
"mount_speed": 5,
"plunger_speed": 5,
"sensor_threshold_pascals": 15,
},
50: {
"mount_speed": 5,
"plunger_speed": 20,
"plunger_speed": 5,
"sensor_threshold_pascals": 15,
},
200: {
"mount_speed": 5,
"plunger_speed": 20,
"plunger_speed": 5,
"sensor_threshold_pascals": 15,
},
}
Expand All @@ -120,51 +130,56 @@ class PhotometricConfig(VolumetricConfig):
1: {
50: {
"mount_speed": 5,
"plunger_speed": 20,
"plunger_speed": 15,
"sensor_threshold_pascals": 15,
},
200: {
"mount_speed": 5,
"plunger_speed": 20,
"plunger_speed": 15,
"sensor_threshold_pascals": 15,
},
1000: {
"mount_speed": 5,
"plunger_speed": 20,
"plunger_speed": 15,
"sensor_threshold_pascals": 15,
},
},
8: {
50: {
"mount_speed": 5,
"plunger_speed": 20,
"plunger_speed": 15,
"sensor_threshold_pascals": 15,
},
200: {
"mount_speed": 5,
"plunger_speed": 20,
"plunger_speed": 15,
"sensor_threshold_pascals": 15,
},
1000: {
"mount_speed": 5,
"plunger_speed": 20,
"plunger_speed": 15,
"sensor_threshold_pascals": 15,
},
},
96: {
20: {
"mount_speed": 5,
"plunger_speed": 5,
"sensor_threshold_pascals": 15,
},
50: {
"mount_speed": 5,
"plunger_speed": 20,
"plunger_speed": 5,
"sensor_threshold_pascals": 15,
},
200: {
"mount_speed": 5,
"plunger_speed": 20,
"plunger_speed": 5,
"sensor_threshold_pascals": 15,
},
1000: {
"mount_speed": 5,
"plunger_speed": 20,
"plunger_speed": 5,
"sensor_threshold_pascals": 15,
},
},
Expand Down Expand Up @@ -194,6 +209,7 @@ def _get_liquid_probe_settings(
QC_VOLUMES_G: Dict[int, Dict[int, List[Tuple[int, List[float]]]]] = {
1: {
50: [ # P50
(20, [1.0, 20.0]),
(50, [1.0, 50.0]), # T50
],
1000: [ # P1000
Expand All @@ -214,10 +230,12 @@ def _get_liquid_probe_settings(
},
96: {
200: [
(20, [0.5, 1.0]), # T20
(50, [1.0, 50.0]), # T50
(200, [200.0]), # T200
],
1000: [ # P1000
(20, [5.0]),
(50, [5.0]), # T50
(200, [200.0]), # T200
(1000, [1000.0]), # T1000
Expand Down Expand Up @@ -279,7 +297,8 @@ def _get_liquid_probe_settings(
},
96: {
200: [
(50, [1.0, 5.0]), # T50
(20, [1.0, 0.5]), # T50
(50, [50.0]), # T50
(200, [200.0]), # T200
],
1000: [ # P1000
Expand Down Expand Up @@ -311,6 +330,11 @@ def _get_liquid_probe_settings(
# channels: [Pipette: [tip: [Volume: (%d, Cv)]]]
1: {
50: { # P50
20: {
1.0: (5.0, 4.0),
10.0: (1.0, 0.5),
20.0: (1, 0.4),
},
50: {
1.0: (5.0, 4.0),
10.0: (1.0, 0.5),
Expand Down Expand Up @@ -363,12 +387,16 @@ def _get_liquid_probe_settings(
},
96: {
200: {
50: { # T50
20: { # T20
0.5: (2.5, 2.0),
1.0: (2.5, 2.0),
2.0: (2.5, 2.0),
3.0: (2.5, 2.0),
5.0: (2.5, 2.0),
10.0: (3.1, 1.7),
},
50: { # T50
1.0: (2.5, 2.0),
50.0: (1.5, 0.75),
},
200: { # T200
Expand All @@ -378,6 +406,14 @@ def _get_liquid_probe_settings(
},
},
1000: { # P1000
20: { # T20
1.0: (2.5, 2.0),
2.0: (2.5, 2.0),
3.0: (2.5, 2.0),
5.0: (2.5, 2.0),
10.0: (3.1, 1.7),
20.0: (3.1, 1.7),
},
50: { # T50
1.0: (2.5, 2.0),
2.0: (2.5, 2.0),
Expand Down
2 changes: 1 addition & 1 deletion hardware-testing/hardware_testing/gravimetric/execute.py
Original file line number Diff line number Diff line change
Expand Up @@ -591,7 +591,7 @@ def run(cfg: config.GravimetricConfig, resources: TestResources) -> None: # noq
assert resources.recorder is not None
recorder = resources.recorder
if resources.ctx.is_simulating():
start_sim_mass = {50: 15, 200: 200, 1000: 200}
start_sim_mass = {20: 5, 50: 15, 200: 200, 1000: 200}
resources.recorder.set_simulation_mass(start_sim_mass[cfg.tip_volume])
os.makedirs(
f"{resources.test_report.parent}/{resources.test_report._run_id}", exist_ok=True
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@
"B": {"min": 10, "max": 49.99},
"C": {"min": 2, "max": 9.999},
"D": {"min": 1, "max": 1.999},
"E": {"min": 0, "max": 0.9999},
}
_MIN_START_VOLUME_UL = {1: 500, 8: 3000, 96: 30000}
_MIN_END_VOLUME_UL = {1: 400, 8: 3000, 96: 10000}
Expand Down
1 change: 1 addition & 0 deletions hardware-testing/hardware_testing/gravimetric/helpers.py
Original file line number Diff line number Diff line change
Expand Up @@ -485,6 +485,7 @@ def _load_tipracks(
)
for slot in cfg.slots_tiprack
]
print(f"LOAD TIPRack{use_adapters}")
for ls in tiprack_load_settings:
ui.print_info(f'Loading tiprack "{ls[1]}" in slot #{ls[0]}')

Expand Down
Loading
Loading