pylabrobot.opentrons.flex.flex_head.FlexHead96#
- class pylabrobot.opentrons.flex.flex_head.FlexHead96(flex: Flex, mount: str, pipette_id: str, channels: int, pipette_model: str, max_volume: float)#
Bases:
_FlexHead96-channel pipette head, whole-plate-addressed (anchor-well fan-out).
All 96 nozzles are physically fixed – there is no partial/single-tip mode, unlike
FlexHead8. Liquid operations use PLR coordinates; tip commands are anchored at well “A1”. The Flex hardware fans each plunger command out to all 96 physical nozzles. Tip/volume trackers are committed only for the channels/wells that actually held a tip (None-skip), same asFlexHead8’s column ops._channel_tipshas length 96, index i corresponding toplate.get_all_items()[i]/tip_rack.get_all_items()[i](PLR’s column-major A1, B1, …, H1, A2, … order).Reuses the
_FlexHeadbase’s transactional stage -> wire -> verify -> commit/rollback flow and hardware tip-presence verification – the same machineryFlexHead8uses for its column ops, applied to the whole plate/rack instead of one column.Liquid probing (
liquid_probe/try_liquid_probe) is not implemented on this head – only the mount heads (FlexHead1/FlexHead8) expose it.Coded but not yet verified on real 96-channel Flex hardware – Vincent’s bench Flex carries an 8-channel pipette, not a 96-channel head. Every op logs the one-time untested-hardware notice the first time an instance issues it, and this docstring makes no “validated on hardware” claim.
Methods
__init__(flex, mount, pipette_id, channels, ...)air_gap_in_place(volume[, flow_rate])Draw a
volumeuL air gap where the head already is -- oneairGapInPlacecommand.aspirate(target, volume[, flow_rate, ...])Aspirate a whole plate or one single-cavity container using PLR coordinates and in-place aspiration.
aspirate_in_place(volume[, flow_rate])Aspirate
volumeuL where the head already is -- oneaspirateInPlacecommand.blow_out([flow_rate])Blow out at the current position -- one
blowOutInPlacecommand.configure_for_volume(volume)Put the pipette in the volume mode that suits
volumeuL.The robot's own defaults for this pipette and the tip currently on it.
discard_tips(trash)Discard the mounted 96 tips into the trash.
dispense(target, volume[, flow_rate, ...])Dispense to a whole plate or one single-cavity container using PLR coordinates and in-place dispensing.
dispense_in_place(volume[, flow_rate, push_out])Dispense
volumeuL where the head already is -- onedispenseInPlacecommand.drop_tips(target)Drop all 96 tips -- one wire command, fanned to 96 channels.
Per-channel tip state (Case-2: no private-attribute peeking by consumers).
Read this head's tip sensor: "present", "absent" or "unknown".
Query the Flex's hardware tip-presence sensor for THIS head's pipette.
move_relative(axis, distance)Jog one axis by
distancemm from wherever the head is now.move_to([x, y, z, speed, minimum_z_height])Move the head to an absolute deck-frame position, holding any axis left unspecified -- ONE
moveToCoordinatescommand.move_to_addressable_area(addressable_area_name)Move to a named fixture on the deck rather than to labware.
move_to_well(target[, offset, origin, ...])Move to a well, named rather than measured -- ONE
moveToWellcommand.pick_up_tips(tip_rack[, offset])Pick up all 96 tips:
configureNozzleLayout(ALL) then ONEpickUpTip.position()The head's current deck-frame position -- one
savePositionquery.Move the plunger to where an aspirate starts from ("priming").
touch_tip(plate[, radius, offset])Touch the mounted tips to their well walls -- one
touchTipcommand anchored at "A1", fanned to all 96 channels.unsafe_blow_out_in_place(flow_rate)Blow out where the head is, skipping the engine's own checks.
Drop the mounted tip where the head is, skipping the engine's own checks.
verify_tip_presence(expected_state)Have the robot fail the command unless its tip sensor reads
expected_state.