UniteLabs

Liquid Classes

Using and customizing liquid classes for the Tecan Freedom EVO.
The Freedom EVO is supported in liquid handling SDK versions >=0.35.0.

Liquid classes define the plunger physics — calibration, per-phase speeds, and air gaps — used during aspirate and dispense. EvoLiquidClass is shared by both EVO arms (the MCA and, for instruments with one, the LiHA); today only the MCA96 head is implemented in the SDK, so in practice every liquid class you use targets it. The labware library also ships 42 of EVOware's own liquid classes, importable from unitelabs.labware.tecan.liquids — it's often easier to start with one of these than to build your own from scratch (see Using a Predefined Liquid Class).

Prerequisites

Default Liquid Class

If no liquid_class is passed to aspirate()/dispense(), an uncalibrated EvoLiquidClass() is applied — factor 1.0, offset 0.0, and the class's own default speeds.

from unitelabs.labware.tecan import EvoLiquidClass

await evo.mca.aspirate(source_trough, volume=100, liquid_class=EvoLiquidClass())

Using a Predefined Liquid Class

Import one of the 42 liquid classes shipped in unitelabs.labware.tecan.liquids instead of writing your own. Each is a direct import of one EVOware <SubClass>, so its tip/min_volume/max_volume band is already set correctly for that class — pick the one matching the liquid, tip family, and volume you're pipetting.

from unitelabs.labware.tecan.liquids import Evo_Water_WetContact_MCA_DiTi_20p01_200p01

await evo.mca.aspirate(
    source_trough,
    volume=100,
    liquid_class=Evo_Water_WetContact_MCA_DiTi_20p01_200p01(),
)
Naming follows EVOware's own convention: liquid, contact mode (WetContact or FreeDispense), tip family (MCA_DiTi/MCA_Fixed/MC96HPBlock), and the volume band in µL with p standing in for the decimal point (20p01_200p01 → 20.01–200.01 µL).

Volume Calibration

EvoLiquidClass applies an affine correction to the sample volume only — never to air gaps or the excess volume:

corrected = target_volume * calibration_factor + calibration_offset
import dataclasses
from unitelabs.labware.tecan import EvoLiquidClass
from unitelabs.labware.math import Decimal


@dataclasses.dataclass
class WaterHighVolume(EvoLiquidClass):
    calibration_factor: Decimal = dataclasses.field(default=Decimal("1.0074"))
    calibration_offset: Decimal = dataclasses.field(default=Decimal("0.0"))


await evo.mca.aspirate(source_trough, volume=100, liquid_class=WaterHighVolume())
Only override the parameters that differ from the default — every other attribute inherits EvoLiquidClass's own defaults.

Restricting to a Tip Type and Volume Band

tip, min_volume, and max_volume are metadata only — nothing auto-selects a liquid class based on them. Passing a class whose band or tip doesn't match what's mounted produces a warning, never a substitution.

import dataclasses
from unitelabs.labware.tecan import EvoLiquidClass, EvoTip_MCA_DiTi_200
from unitelabs.labware.math import Decimal


@dataclasses.dataclass
class Water200uL(EvoLiquidClass):
    tip: type = EvoTip_MCA_DiTi_200
    min_volume: Decimal = dataclasses.field(default=Decimal("2.0"))
    max_volume: Decimal = dataclasses.field(default=Decimal("220.0"))
liquid_class = Water200uL()
liquid_class.check_tip(mounted_tip)  # warns if mounted_tip isn't an EvoTip_MCA_DiTi_200
liquid_class.compute_corrected_volume(target_volume=250)
# UserWarning: Water200uL is calibrated for volumes in [2.0, 220.0) µL, received 250 µL.

Aspirate Parameters

Every liquid class defines the following parameters, consumed via aspirate_parameters when a pipetting step compiles:

ParameterDefaultDescription
aspirate_speed50.0 µL/sSample-draw plunger speed.
aspirate_delay500 msWait time after the sample is aspirated before moving the tips.
aspirate_leading_air_gap5.0 µLAir drawn above the liquid before submerging; dispensed with the sample to blow out the tip.
aspirate_leading_air_gap_speed10.0 µL/sPlunger speed for the leading air gap.
aspirate_leading_air_gap_delay0 msWait time after the leading air gap is drawn.
aspirate_tracking_speed20.0 mm/sSpeed to track the liquid level during aspiration (used with follow_liquid).
aspirate_trailing_air_gap5.0 µLAir drawn after withdrawing from the liquid, to stop dripping while the arm moves.
aspirate_trailing_air_gap_speed20.0 µL/sPlunger speed for the trailing air gap.
aspirate_trailing_air_gap_delay0 msWait time after the trailing air gap is drawn.
aspirate_system_trailing_air_gap0.0 µLExtra system air gap after the trailing air gap, keeping system liquid away from the sample.
aspirate_system_trailing_air_gap_speed20.0 µL/sPlunger speed for the system trailing air gap.
aspirate_system_trailing_air_gap_delay0 msWait time after the system trailing air gap is drawn.
aspirate_excess_volume0.0 µLVolume drawn on top of the sample. Not discarded automatically — dispense it explicitly.
aspirate_retract_speed10.0 mm/sSlow Z withdrawal speed out of the liquid after aspirating.
aspirate_retract_offset0.0 mmHeight above the container the tips retract to after aspirating. Unread.
aspirate_plunger_accel5760 µL/s²Plunger acceleration for the sample draw (air gaps use the drive's own defaults).
aspirate_plunger_decel16000 µL/s²Plunger deceleration for the sample draw.
aspirate_lld_detection_sensitivitySTANDARDLiHA only — liquid-level detection sensitivity. The MCA has no LLD; ignored on the MCA head.

Dispense Parameters

ParameterDefaultDescription
dispense_speed50.0 µL/sDispense plunger speed.
dispense_breakoff_speed150.0 µL/sLiHA only — final speed as the plunger stops, for a clean free-dispense break-off. Ignored on the MCA.
dispense_delay0 msWait time after the sample is dispensed.
dispense_delay_before0 msWait time after the tips lower and before the dispense starts.
dispense_trailing_air_gap_afterFalseWhether to draw a trailing air gap after dispensing (volume/speed from the aspirate attributes).
dispense_tip_touch_speed10.0 mm/sTip-touch speed after dispensing.
dispense_tip_touch_delay0 msTip-touch delay after dispensing.
dispense_retract_speed10.0 mm/sSlow Z withdrawal speed out of the liquid after dispensing.
dispense_retract_offset0.0 mmHeight above the container the tips retract to after dispensing. Unread.
dispense_plunger_accel5760 µL/s²Plunger acceleration for the dispense.
dispense_plunger_decel16000 µL/s²Plunger deceleration for the dispense.
Deliberately absent: mixing, tip-touch geometry, and liquid-level-detection protocol settings are not modeled on EvoLiquidClass, even though EVOware stores them per sub-class. These are properties of the pipetting step, not of the liquid — the same liquid is mixed in one protocol and not the next — so they're passed as arguments to aspirate()/dispense() instead (mix_cycles, touch_side, etc.). See Basic Pipetting.

Mapping from EVOware

One EvoLiquidClass instance corresponds to one EVOware <SubClass>. EVOware groups several sub-classes — each valid for one tip type and one volume band — under a single named liquid class; this SDK flattens that structure into tip + min_volume/max_volume on separate classes, one per sub-class. Only <Single> (single-pipetting-mode) values are modeled; EVOware's multi-pipetting mode is not supported.

Checking Tip Compatibility

tip = evo.mca.get()
liquid_class = Water200uL()
liquid_class.check_tip(tip)
# UserWarning: Water200uL is calibrated for EvoTip_MCA_DiTi_200, received EvoTip_MCA_DiTi_50.

check_tip() is informational only — pipetting proceeds regardless of a mismatch; it does not raise.