Hamilton trough center support interference

When aspirating from a 60ml hamilton trough there is a center plastic support. This is fine for even number of channels but causes issues with odd number of channels hitting the support. My solution is to set spread to ‘custom’ and define the position of each channel. Is this the best solution for all?

2 Likes

I think so…

if you have suggestions for a better api im all ears

1 Like

Hi @david.nedrud,

I actually don’t know what spread=”custom” really does?

But regardless of that, I just use:

...

if max_no_channels % 2 != 0:
    y_offset = 5.5 # offset when using odd number of channels
else:
    y_offset = 0

await liquid_handler.aspirate(
    resources=[source_container] * max_no_channels,
    vols=[aspiration_vol] * max_no_channels,
    use_channels=use_channels[:max_no_channels],
    hamilton_liquid_classes=[hlc] * max_no_channels,
    offsets=[Coordinate(x=0, y=y_offset, z=0)] * max_no_channels,
    lld_mode=[liquid_handler.backend.LLDMode(1)] * max_no_channels,
    immersion_depth=[2] * max_no_channels,
    surface_following_distance=[1.0] * max_no_channels,
    minimum_height=[source_container.get_absolute_location(z="cavity_bottom").z]
            * max_no_channels,
    )

...

i.e. dynamically adjust offset based on odd/even number of channels needed.

Note: offset only has to be a bit wider than half of a tip to ensure splash guard/central trough support does not even touch the channel, which could cause premature cLLD activation.

1 Like

That is helpful. I was just wondering if we could prevent this for others instead of requiring an if statement. To “fix” this issue, I just warned the user when loading this trough.

My solution was to generate offsets for 8 channels and then use the offsets for just the channels of interest. spread=”custom” means offsets are all set to 0 so the user is required to specify offsets.

eight_offsets = get_wide_single_resource_liquid_op_offsets(resource_container, num_channels=8)

await lh.aspirate(
    [resource_container]*len(channels_to_use), 
    vols=[volume]*len(channels_to_use), 
    use_channels=channels_to_use, 
    offsets=[x for i, x in enumerate(eight_offsets) if i in channels_to_use], 
    spread='custom'
    )

I don’t think so, and I think it is good that it needs it; it’s explicit:

It is “odd” that a single container has an obstacle in its center - even though structurally (gives rigidity) and safety-wise (provides anti-splash effect) it makes sense. From a Container-perspective it is an outlier.

And outliers require explicit declaration of how to handle them :man_shrugging:

Thank you; I will test some more: I didn’t see any change with “custom” set or not set in my initial testing.

smart

this is relevant for single-container, multi-channel aspiration/dispense

with either wide and tight, the offsets specified by the user are wrt the following points (no offset means it is exactly at those points):

with “custom”, all offsets, for every channel, are wrt the center of the container. this makes it easier for the user to specify custom offsets that don’t rely on wide/tight spacing.

I would say, theoretically we can encode this information and automatically do it correctly. it would require updating container to specify “no go zones” or something like that. kind of annoying, but not hacky imo.

1 Like