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: _FlexHead

96-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 as FlexHead8’s column ops. _channel_tips has length 96, index i corresponding to plate.get_all_items()[i] / tip_rack.get_all_items()[i] (PLR’s column-major A1, B1, …, H1, A2, … order).

Reuses the _FlexHead base’s transactional stage -> wire -> verify -> commit/rollback flow and hardware tip-presence verification – the same machinery FlexHead8 uses 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 volume uL air gap where the head already is -- one airGapInPlace command.

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 volume uL where the head already is -- one aspirateInPlace command.

blow_out([flow_rate])

Blow out at the current position -- one blowOutInPlace command.

configure_for_volume(volume)

Put the pipette in the volume mode that suits volume uL.

default_flow_rates()

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 volume uL where the head already is -- one dispenseInPlace command.

drop_tips(target)

Drop all 96 tips -- one wire command, fanned to 96 channels.

get_mounted_tips()

Per-channel tip state (Case-2: no private-attribute peeking by consumers).

get_tip_presence()

Read this head's tip sensor: "present", "absent" or "unknown".

has_tip_on_hardware()

Query the Flex's hardware tip-presence sensor for THIS head's pipette.

move_relative(axis, distance)

Jog one axis by distance mm 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 moveToCoordinates command.

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 moveToWell command.

pick_up_tips(tip_rack[, offset])

Pick up all 96 tips: configureNozzleLayout (ALL) then ONE pickUpTip.

position()

The head's current deck-frame position -- one savePosition query.

prepare_to_aspirate()

Move the plunger to where an aspirate starts from ("priming").

touch_tip(plate[, radius, offset])

Touch the mounted tips to their well walls -- one touchTip command 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.

unsafe_drop_tip_in_place()

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.

Parameters: