UniteLabs
Labware

Troughs

Define custom reagent troughs using the Trough base class.

Troughs

Troughs are used to store large amounts of liquid such as water, ethanol, or buffer solutions. In contrast to a plate, aspiration from or to a trough with multiple channels work from the same shared container volume.

Conceptually, a trough is a collection of Fillables with a defined number of access points (Hole objects) for pipetting channels. These Fillables and holes can be arranged in any layout. In the example below, a grid of 96 holes is generated — similar to a 96-well plate layout — so that multi-channel heads can access the trough at each column position. cols and rows are hints for the arrangement of the Holes.

import collections.abc
import dataclasses

from unitelabs.labware import (
    Container,
    Cuboid,
    Fillable,
    Hole,
    StandardMicroplateDimensions,
    Trough,
    Vector,
    place_standardized,
)


@dataclasses.dataclass
class StandardTrough(Trough, StandardMicroplateDimensions):
    """A standard trough."""

    cols: int = 12
    rows: int = 8
    dimensions: Vector = dataclasses.field(default_factory=lambda: Vector(z=44))
    children: collections.abc.Sequence[Fillable] = dataclasses.field(
        repr=False,
        default_factory=lambda: [
            Fillable(
                container=Container(max_volume=300_000, sections=[Cuboid(width=108, depth=72, height=40)]),
                children=[
                    Hole(dimensions=dimensions).copy(location=location)
                    for location, dimensions in place_standardized(count=96, boundary_height=44, item_height=40)
                ],
            )
        ],
    )

More complex troughs can have multiple containers, as with "12-column troughs" or "8-row troughs". For consistency across these labware types, troughs' containers are accessed like trough.containers[0], even if there is only one container (i.e. the standard trough above, the most common case).