{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# BioTek EL406\n", "\n", "The BioTek EL406 plate washer is controlled by the {class}`~pylabrobot.plate_washing.biotek.el406.BioTekEL406Backend` class. It communicates via FTDI USB serial.\n", "\n", "The EL406 has three fluid delivery subsystems — manifold, syringe pump, and peristaltic pump — plus an integrated plate shaker. All operations require a {class}`~pylabrobot.resources.Plate` object to configure plate-specific parameters automatically." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Setup" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from pylabrobot.plate_washing.biotek.el406 import ExperimentalBioTekEL406Backend\n", "from pylabrobot.resources import Cor_96_wellplate_360ul_Fb\n", "\n", "backend = ExperimentalBioTekEL406Backend() # ExperimentalBioTekEL406Backend(device_id=\"YOUR_FTDI_ID_HERE\")\n", "await backend.setup()\n", "\n", "plate = Cor_96_wellplate_360ul_Fb(name=\"plate\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Manifold\n", "\n", "The wash manifold is the primary fluid system. Prime the lines before use to fill tubing with buffer." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "await backend.manifold_prime(plate, volume=10000, buffer=\"A\") # 10 mL" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Dispense and aspirate individually, or use `manifold_wash` for repeated dispense-aspirate cycles." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "await backend.manifold_dispense(plate, volume=200, buffer=\"A\")" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "await backend.manifold_aspirate(plate)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "await backend.manifold_wash(plate, cycles=3, buffer=\"A\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "`manifold_wash` supports many options: shake/soak between cycles, secondary aspirate, bottom wash, and per-cycle pre-dispense." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "await backend.manifold_wash(\n", " plate,\n", " cycles=3,\n", " buffer=\"A\",\n", " dispense_volume=300,\n", " soak_duration=10,\n", " shake_duration=5,\n", " shake_intensity=\"Medium\",\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Run an auto-clean cycle to flush the manifold lines." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "await backend.manifold_auto_clean(plate, buffer=\"A\", duration=60)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Syringe pump\n", "\n", "The syringe pump provides precise low-volume dispensing." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "await backend.syringe_prime(plate, syringe=\"A\", volume=5000, flow_rate=5, refills=2)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "await backend.syringe_dispense(plate, volume=50, syringe=\"A\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Peristaltic pump" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "await backend.peristaltic_prime(plate, volume=300, flow_rate=\"High\")" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "await backend.peristaltic_dispense(plate, volume=100, flow_rate=\"High\")" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "await backend.peristaltic_purge(plate, volume=300, flow_rate=\"High\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Shaking" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "await backend.shake(plate, duration=30, intensity=\"Medium\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Batching\n", "\n", "Each step command automatically starts and cleans up a batch. To group multiple steps into a single batch (avoiding repeated start/cleanup overhead), use the `batch()` context manager." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "async with backend.batch(plate):\n", " await backend.manifold_prime(plate, volume=10000, buffer=\"A\")\n", " await backend.manifold_wash(plate, cycles=3, buffer=\"A\")\n", " await backend.manifold_aspirate(plate)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Queries" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "await backend.request_serial_number()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "await backend.request_washer_manifold()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "await backend.request_instrument_settings()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Teardown" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "await backend.stop()" ] } ], "metadata": { "kernelspec": { "display_name": "env", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.25" } }, "nbformat": 4, "nbformat_minor": 4 }