From d1fbea3b7db68260a80156dc7760af48bd951a10 Mon Sep 17 00:00:00 2001 From: Guangxin Zhang Date: Tue, 6 May 2025 11:01:37 +0800 Subject: [PATCH] 3 High level function of PLR (#17) * Add files via upload Defined 3 high level functions to depict the action of LH, helper functions included (e.g. mix, touch_tip) * Update action_defination.py * Refined function and tests made on chatterbox backend. * Refined the action, ready to use. For now, only the on tip mode is tested. I am a little worried about the move_to function, please pay attention to it. We may need to take the length of tip into account * Update action_definition.py --------- Co-authored-by: Junhan Chang --- .../liquid_handling/action_definition.py | 351 +++++ ...i-lucif-assay4_plr_background_tested.ipynb | 1291 +++++++++++++++++ 2 files changed, 1642 insertions(+) create mode 100644 unilabos/devices/liquid_handling/action_definition.py create mode 100644 unilabos/devices/liquid_handling/converted protocol/sci-lucif-assay4_plr_background_tested.ipynb diff --git a/unilabos/devices/liquid_handling/action_definition.py b/unilabos/devices/liquid_handling/action_definition.py new file mode 100644 index 00000000..9cefa1ce --- /dev/null +++ b/unilabos/devices/liquid_handling/action_definition.py @@ -0,0 +1,351 @@ +from __future__ import annotations + +from typing import List, Sequence, Optional, Literal, Union, Iterator + +import asyncio +import time + +from pylabrobot.liquid_handling import LiquidHandler +from pylabrobot.resources import ( + Resource, + TipRack, + Container, + Coordinate, + Well +) + +class DPLiquidHandler(LiquidHandler): + """Extended LiquidHandler with additional operations.""" + + # --------------------------------------------------------------- + # REMOVE LIQUID -------------------------------------------------- + # --------------------------------------------------------------- + + async def remove_liquid( + self, + vols: List[float], + sources: Sequence[Container], + waste_liquid: Optional[Container] = None, + *, + use_channels: Optional[List[int]] = None, + flow_rates: Optional[List[Optional[float]]] = None, + offsets: Optional[List[Coordinate]] = None, + liquid_height: Optional[List[Optional[float]]] = None, + blow_out_air_volume: Optional[List[Optional[float]]] = None, + spread: Optional[Literal["wide", "tight", "custom"]] = "wide", + delays: Optional[List[int]] = None, + is_96_well: Optional[bool] = False, + top: Optional[List(float)] = None, + ): + """A complete *remove* (aspirate → waste) operation.""" + trash = self.deck.get_trash_area() + try: + if is_96_well: + pass # This mode is not verified + else: + if len(vols) != len(sources): + raise ValueError("Length of `vols` must match `sources`.") + + for src, vol in zip(sources, vols): + self.move_to(src, dis_to_top=top[0] if top else 0) + tip = next(self.current_tip) + await self.pick_up_tips(tip) + await self.aspirate( + resources=[src], + vols=[vol], + use_channels=use_channels, # only aspirate96 used, default to None + flow_rates=[flow_rates[0]] if flow_rates else None, + offsets=[offsets[0]] if offsets else None, + liquid_height=[liquid_height[0]] if liquid_height else None, + blow_out_air_volume=blow_out_air_volume[0] if blow_out_air_volume else None, + spread=spread, + ) + await self.custom_delay(seconds=delays[0] if delays else 0) + await self.dispense( + resources=waste_liquid, + vols=[vol], + use_channels=use_channels, + flow_rates=[flow_rates[1]] if flow_rates else None, + offsets=[offsets[1]] if offsets else None, + liquid_height=[liquid_height[1]] if liquid_height else None, + blow_out_air_volume=blow_out_air_volume[1] if blow_out_air_volume else None, + spread=spread, + ) + await self.discard_tips() # For now, each of tips is discarded after use + + except Exception as e: + raise RuntimeError(f"Liquid removal failed: {e}") from e + + # --------------------------------------------------------------- + # ADD LIQUID ----------------------------------------------------- + # --------------------------------------------------------------- + + async def add_liquid( + self, + asp_vols: Union[List[float], float], + dis_vols: Union[List[float], float], + reagent_sources: Sequence[Container], + targets: Sequence[Container], + *, + use_channels: Optional[List[int]] = None, + flow_rates: Optional[List[Optional[float]]] = None, + offsets: Optional[List[Coordinate]] = None, + liquid_height: Optional[List[Optional[float]]] = None, + blow_out_air_volume: Optional[List[Optional[float]]] = None, + spread: Optional[Literal["wide", "tight", "custom"]] = "wide", + is_96_well: bool = False, + delays: Optional[List[int]] = None, + mix_time: Optional[int] = None, + mix_vol: Optional[int] = None, + mix_rate: Optional[int] = None, + mix_liquid_height: Optional[float] = None + ): + """A complete *add* (aspirate reagent → dispense into targets) operation.""" + + try: + if is_96_well: + pass # This mode is not verified. + else: + if len(asp_vols) != len(targets): + raise ValueError("Length of `vols` must match `targets`.") + tip = next(self.current_tip) + await self.pick_up_tips(tip) + + for _ in range(len(targets)): + await self.aspirate( + resources=reagent_sources, + vols=[asp_vols[_]], + use_channels=use_channels, + flow_rates=[flow_rates[0]] if flow_rates else None, + offsets=[offsets[0]] if offsets else None, + liquid_height=[liquid_height[0]] if liquid_height else None, + blow_out_air_volume=[blow_out_air_volume[0]] if blow_out_air_volume else None, + spread=spread + ) + if delays is not None: + await self.custom_delay(seconds=delays[0]) + await self.dispense( + resources=[targets[_]], + vols=[dis_vols[_]], + use_channels=use_channels, + flow_rates=[flow_rates[1]] if flow_rates else None, + offsets=[offsets[1]] if offsets else None, + blow_out_air_volume=[blow_out_air_volume[1]] if blow_out_air_volume else None, + liquid_height=[liquid_height[1]] if liquid_height else None, + spread=spread, + ) + if delays is not None: + await self.custom_delay(seconds=delays[1]) + await self.mix( + targets=targets[_], + mix_time=mix_time, + mix_vol=mix_vol, + offsets=offsets if offsets else None, + height_to_bottom=mix_liquid_height if mix_liquid_height else None, + mix_rate=mix_rate if mix_rate else None) + if delays is not None: + await self.custom_delay(seconds=delays[1]) + await self.touch_tip(targets[_]) + await self.discard_tips() + + except Exception as e: + raise RuntimeError(f"Liquid addition failed: {e}") from e + + # --------------------------------------------------------------- + # TRANSFER LIQUID ------------------------------------------------ + # --------------------------------------------------------------- + async def transfer_liquid( + self, + asp_vols: Union[List[float], float], + dis_vols: Union[List[float], float], + sources: Sequence[Container], + targets: Sequence[Container], + tip_racks: Sequence[TipRack], + *, + use_channels: Optional[List[int]] = None, + asp_flow_rates: Optional[List[Optional[float]]] = None, + dis_flow_rates: Optional[List[Optional[float]]] = None, + offsets: Optional[List[Coordinate]] = None, + touch_tip: bool = False, + liquid_height: Optional[List[Optional[float]]] = None, + blow_out_air_volume: Optional[List[Optional[float]]] = None, + spread: Literal["wide", "tight", "custom"] = "wide", + is_96_well: bool = False, + mix_stage: Optional[Literal["none", "before", "after", "both"]] = "none", + mix_times: Optional[List(int)] = None, + mix_vol: Optional[int] = None, + mix_rate: Optional[int] = None, + mix_liquid_height: Optional[float] = None, + delays: Optional[List[int]] = None, + ): + """Transfer liquid from each *source* well/plate to the corresponding *target*. + + Parameters + ---------- + asp_vols, dis_vols + Single volume (µL) or list matching the number of transfers. + sources, targets + Same‑length sequences of containers (wells or plates). In 96‑well mode + each must contain exactly one plate. + tip_racks + One or more TipRacks providing fresh tips. + is_96_well + Set *True* to use the 96‑channel head. + """ + + try: + # ------------------------------------------------------------------ + # 96‑channel head mode + # ------------------------------------------------------------------ + if is_96_well: + pass # This mode is not verified + else: + if not (len(asp_vols) == len(sources) and len(dis_vols) == len(targets)): + raise ValueError("`sources`, `targets`, and `vols` must have the same length.") + + tip_iter = self.iter_tips(tip_racks) + for src, tgt, asp_vol, asp_flow_rate, dis_vol, dis_flow_rate in ( + zip(sources, targets, asp_vols, asp_flow_rates, dis_vols, dis_flow_rates)): + tip = next(tip_iter) + await self.pick_up_tips(tip) + # Aspirate from source + await self.aspirate( + resources=[src], + vols=[asp_vol], + use_channels=use_channels, + flow_rates=[asp_flow_rate], + offsets=offsets, + liquid_height=liquid_height, + blow_out_air_volume=blow_out_air_volume, + spread=spread, + ) + self.custom_delay(seconds=delays[0] if delays else 0) + # Dispense into target + await self.dispense( + resources=[tgt], + vols=[dis_vol], + use_channels=use_channels, + flow_rates=[dis_flow_rate], + offsets=offsets, + liquid_height=liquid_height, + blow_out_air_volume=blow_out_air_volume, + spread=spread, + ) + await self.mix( + targets=[tgt], + mix_time=mix_times[0] if mix_times else None, + mix_vol=mix_vol[0] if mix_vol else None, + mix_rate=mix_rate[0] if mix_rate else None, + ) + if touch_tip: + await self.touch_tip(tgt) + await self.discard_tips() + + except Exception as exc: + raise RuntimeError(f"Liquid transfer failed: {exc}") from exc + +# --------------------------------------------------------------- +# Helper utilities +# --------------------------------------------------------------- + + async def custom_delay(self, seconds=0, msg=None): + """ + seconds: seconds to wait + msg: information to be printed + """ + if seconds != None and seconds > 0: + if msg: + print(f"Waiting time: {msg}") + print(f"Current time: {time.strftime('%H:%M:%S')}") + print(f"Time to finish: {time.strftime('%H:%M:%S', time.localtime(time.time() + seconds))}") + await asyncio.sleep(seconds) + if msg: + print(f"Done: {msg}") + print(f"Current time: {time.strftime('%H:%M:%S')}") + + async def touch_tip(self, + targets: Sequence[Container], + ): + """Touch the tip to the side of the well.""" + await self.aspirate( + resources=[targets], + vols=[0], + use_channels=None, + flow_rates=None, + offsets=[Coordinate(x=-targets.get_size_x()/2,y=0,z=0)], + liquid_height=None, + blow_out_air_volume=None + ) + #await self.custom_delay(seconds=1) # In the simulation, we do not need to wait + await self.aspirate( + resources=[targets], + vols=[0], + use_channels=None, + flow_rates=None, + offsets=[Coordinate(x=targets.get_size_x()/2,y=0,z=0)], + liquid_height=None, + blow_out_air_volume=None + ) + + async def mix( + self, + targets: Sequence[Container], + mix_time: int = None, + mix_vol: Optional[int] = None, + height_to_bottom: Optional[float] = None, + offsets: Optional[Coordinate] = None, + mix_rate: Optional[float] = None, + ): + if mix_time is None: # No mixing required + return + """Mix the liquid in the target wells.""" + for _ in range(mix_time): + await self.aspirate( + resources=[targets], + vols=[mix_vol], + flow_rates=[mix_rate] if mix_rate else None, + offsets=[offsets] if offsets else None, + liquid_height=[height_to_bottom] if height_to_bottom else None, + ) + await self.custom_delay(seconds=1) + await self.dispense( + resources=[targets], + vols=[mix_vol], + flow_rates=[mix_rate] if mix_rate else None, + offsets=[offsets] if offsets else None, + liquid_height=[height_to_bottom] if height_to_bottom else None, + ) + + def iter_tips(self, tip_racks: Sequence[TipRack]) -> Iterator[Resource]: + """Yield tips from a list of TipRacks one-by-one until depleted.""" + for rack in tip_racks: + for tip in rack: + yield tip + raise RuntimeError("Out of tips!") + + def set_tiprack(self, tip_racks: Sequence[TipRack]): + """Set the tip racks for the liquid handler.""" + self.tip_racks = tip_racks + tip_iter = self.iter_tips(tip_racks) + self.current_tip = tip_iter + + async def move_to(self, well: Well, dis_to_top: float = 0 , channel: int = 0): + """ + Move a single channel to a specific well with a given z-height. + + Parameters + ---------- + well : Well + The target well. + dis_to_top : float + Height in mm to move to relative to the well top. + channel : int + Pipetting channel to move (default: 0). + """ + await self.prepare_for_manual_channel_operation(channel=channel) + abs_loc = well.get_absolute_location() + well_height = well.get_absolute_size_z() + await self.move_channel_x(channel, abs_loc.x) + await self.move_channel_y(channel, abs_loc.y) + await self.move_channel_z(channel, abs_loc.z + well_height + dis_to_top) + diff --git a/unilabos/devices/liquid_handling/converted protocol/sci-lucif-assay4_plr_background_tested.ipynb b/unilabos/devices/liquid_handling/converted protocol/sci-lucif-assay4_plr_background_tested.ipynb new file mode 100644 index 00000000..daf47e23 --- /dev/null +++ b/unilabos/devices/liquid_handling/converted protocol/sci-lucif-assay4_plr_background_tested.ipynb @@ -0,0 +1,1291 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 9, + "id": "6e581f88", + "metadata": {}, + "outputs": [], + "source": [ + "# NF‑κB Luciferase Reporter Assay – pylabrobot version\n", + "\n", + "import os\n", + "import sys\n", + "os.getcwd()\n", + "sys.path.append('/Users/guangxinzhang/Documents/Deep Potential/pylabrobot/myfile')\n", + "\n", + "from pylabrobot.resources import Coordinate\n", + "from pylabrobot.liquid_handling.backends.chatterbox import LiquidHandlerChatterboxBackend\n", + "from pylabrobot.visualizer.visualizer import Visualizer\n", + "from pylabrobot.resources.opentrons import (\n", + " OTDeck,\n", + " corning_96_wellplate_360ul_flat,\n", + " nest_12_reservoir_15ml,\n", + " nest_1_reservoir_195ml,\n", + " opentrons_96_tiprack_300ul\n", + ")\n", + "from High_level_function.action_definition import DPLiquidHandler" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "c3127d6e", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Setting up the liquid handler.\n", + "Resource deck was assigned to the liquid handler.\n", + "Resource trash_container was assigned to the liquid handler.\n", + "Resource tiprack_1 was assigned to the liquid handler.\n", + "Resource tiprack_4 was assigned to the liquid handler.\n", + "Resource tiprack_8 was assigned to the liquid handler.\n", + "Resource tiprack_11 was assigned to the liquid handler.\n", + "Resource working_plate was assigned to the liquid handler.\n", + "Resource reagent_stock was assigned to the liquid handler.\n", + "Resource waste_liq was assigned to the liquid handler.\n" + ] + } + ], + "source": [ + "# ──────────────────────────────────────\n", + "# User‑configurable constants (µL)\n", + "MEDIUM_VOL = 100 # volume of spent medium to remove\n", + "PBS_VOL = 50 # PBS wash volume\n", + "LYSIS_VOL = 30 # lysis buffer volume\n", + "LUC_VOL = 100 # luciferase reagent volume\n", + "TOTAL_COL = 12 # process A1–A12\n", + "\n", + "\n", + "# ──────────────────────────────────────\n", + "\n", + "lh = DPLiquidHandler(backend=LiquidHandlerChatterboxBackend(), deck=OTDeck())\n", + "await lh.setup()\n", + "#vis = Visualizer(resource=lh)\n", + "#await vis.setup()\n", + "\n", + "tiprack_slots = [1, 4, 8, 11]\n", + "tipracks = {\n", + " f\"tiprack_{slot}\": opentrons_96_tiprack_300ul(name=f\"tiprack_{slot}\")\n", + " for slot in tiprack_slots\n", + "}\n", + "\n", + "for name, tiprack in tipracks.items():\n", + " slot = int(name.split(\"_\")[1])\n", + " lh.deck.assign_child_at_slot(tiprack, slot=slot)\n", + "\n", + "# Working 96‑well plate at slot 6\n", + "working_plate = corning_96_wellplate_360ul_flat(name=\"working_plate\")\n", + "lh.deck.assign_child_at_slot(working_plate, slot=6)\n", + "\n", + "# 12‑channel reservoir (PBS, Lysis, Luciferase) at slot 3\n", + "reagent_stock = nest_12_reservoir_15ml(name='reagent_stock')\n", + "lh.deck.assign_child_at_slot(reagent_stock, slot=3)\n", + "\n", + "# 1‑channel waste reservoir at slot 9\n", + "waste_liq = nest_1_reservoir_195ml(name='waste_liq')\n", + "lh.deck.assign_child_at_slot(waste_liq, slot=9)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "b5313453", + "metadata": {}, + "outputs": [], + "source": [ + "pbs = reagent_stock[0][0]\n", + "lysis = reagent_stock[1][0]\n", + "luciferase = reagent_stock[2][0]\n", + "waste_liq = waste_liq[0]\n", + "wells_name = [f\"A{i}\" for i in range(1, 13)]\n", + "cells_all = working_plate[wells_name] # A1–A12" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "e85d6752", + "metadata": {}, + "outputs": [], + "source": [ + "working_plate_volumes = [\n", + " ('culture medium', MEDIUM_VOL) if i % 8 == 0 else (None, 0)\n", + " for i in range(96)\n", + "]\n", + "working_plate.set_well_liquids(working_plate_volumes)\n", + "reagent_info = [('PBS Buffer', 5000), ('Lysis Buffer', 5000), ('Luciferase Reagent', 5000)]+[ (None, 0) ]* 9\n", + "reagent_stock.set_well_liquids(reagent_info)\n", + "lh.set_tiprack(list(tipracks.values()))" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "9dbfb0e2", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(None, None)" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from pylabrobot.resources import set_tip_tracking, set_volume_tracking\n", + "set_tip_tracking(True), set_volume_tracking(True)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "70094125", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Picking up tips:\n", + "pip# resource offset tip type max volume (µL) fitting depth (mm) tip length (mm) filter \n", + " p0: tiprack_1_A1 0,0,0 Tip 300.0 7.47 59.3 No \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 100.0 working_plate_A1 -2.5,0,0 0.2 None 0.2 \n", + "[Well(name=waste_liq_A1, location=Coordinate(010.480, 007.140, 004.550), size_x=106.8, size_y=71.2, size_z=25, category=well)]\n", + "Dispensing:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 100.0 waste_liq_A1 0,0,-5 3.0 None 0.0 \n", + "Dropping tips:\n", + "pip# resource offset tip type max volume (µL) fitting depth (mm) tip length (mm) filter \n", + " p0: trash 0,0.0,0 Tip 300.0 7.47 59.3 No \n", + "Picking up tips:\n", + "pip# resource offset tip type max volume (µL) fitting depth (mm) tip length (mm) filter \n", + " p0: tiprack_1_B1 0,0,0 Tip 300.0 7.47 59.3 No \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 100.0 working_plate_A2 -2.5,0,0 0.2 None 0.2 \n", + "[Well(name=waste_liq_A1, location=Coordinate(010.480, 007.140, 004.550), size_x=106.8, size_y=71.2, size_z=25, category=well)]\n", + "Dispensing:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 100.0 waste_liq_A1 0,0,-5 3.0 None 0.0 \n", + "Dropping tips:\n", + "pip# resource offset tip type max volume (µL) fitting depth (mm) tip length (mm) filter \n", + " p0: trash 0,0.0,0 Tip 300.0 7.47 59.3 No \n", + "Picking up tips:\n", + "pip# resource offset tip type max volume (µL) fitting depth (mm) tip length (mm) filter \n", + " p0: tiprack_1_C1 0,0,0 Tip 300.0 7.47 59.3 No \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 100.0 working_plate_A3 -2.5,0,0 0.2 None 0.2 \n", + "[Well(name=waste_liq_A1, location=Coordinate(010.480, 007.140, 004.550), size_x=106.8, size_y=71.2, size_z=25, category=well)]\n", + "Dispensing:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 100.0 waste_liq_A1 0,0,-5 3.0 None 0.0 \n", + "Dropping tips:\n", + "pip# resource offset tip type max volume (µL) fitting depth (mm) tip length (mm) filter \n", + " p0: trash 0,0.0,0 Tip 300.0 7.47 59.3 No \n", + "Picking up tips:\n", + "pip# resource offset tip type max volume (µL) fitting depth (mm) tip length (mm) filter \n", + " p0: tiprack_1_D1 0,0,0 Tip 300.0 7.47 59.3 No \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 100.0 working_plate_A4 -2.5,0,0 0.2 None 0.2 \n", + "[Well(name=waste_liq_A1, location=Coordinate(010.480, 007.140, 004.550), size_x=106.8, size_y=71.2, size_z=25, category=well)]\n", + "Dispensing:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 100.0 waste_liq_A1 0,0,-5 3.0 None 0.0 \n", + "Dropping tips:\n", + "pip# resource offset tip type max volume (µL) fitting depth (mm) tip length (mm) filter \n", + " p0: trash 0,0.0,0 Tip 300.0 7.47 59.3 No \n", + "Picking up tips:\n", + "pip# resource offset tip type max volume (µL) fitting depth (mm) tip length (mm) filter \n", + " p0: tiprack_1_E1 0,0,0 Tip 300.0 7.47 59.3 No \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 100.0 working_plate_A5 -2.5,0,0 0.2 None 0.2 \n", + "[Well(name=waste_liq_A1, location=Coordinate(010.480, 007.140, 004.550), size_x=106.8, size_y=71.2, size_z=25, category=well)]\n", + "Dispensing:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 100.0 waste_liq_A1 0,0,-5 3.0 None 0.0 \n", + "Dropping tips:\n", + "pip# resource offset tip type max volume (µL) fitting depth (mm) tip length (mm) filter \n", + " p0: trash 0,0.0,0 Tip 300.0 7.47 59.3 No \n", + "Picking up tips:\n", + "pip# resource offset tip type max volume (µL) fitting depth (mm) tip length (mm) filter \n", + " p0: tiprack_1_F1 0,0,0 Tip 300.0 7.47 59.3 No \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 100.0 working_plate_A6 -2.5,0,0 0.2 None 0.2 \n", + "[Well(name=waste_liq_A1, location=Coordinate(010.480, 007.140, 004.550), size_x=106.8, size_y=71.2, size_z=25, category=well)]\n", + "Dispensing:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 100.0 waste_liq_A1 0,0,-5 3.0 None 0.0 \n", + "Dropping tips:\n", + "pip# resource offset tip type max volume (µL) fitting depth (mm) tip length (mm) filter \n", + " p0: trash 0,0.0,0 Tip 300.0 7.47 59.3 No \n", + "Picking up tips:\n", + "pip# resource offset tip type max volume (µL) fitting depth (mm) tip length (mm) filter \n", + " p0: tiprack_1_G1 0,0,0 Tip 300.0 7.47 59.3 No \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 100.0 working_plate_A7 -2.5,0,0 0.2 None 0.2 \n", + "[Well(name=waste_liq_A1, location=Coordinate(010.480, 007.140, 004.550), size_x=106.8, size_y=71.2, size_z=25, category=well)]\n", + "Dispensing:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 100.0 waste_liq_A1 0,0,-5 3.0 None 0.0 \n", + "Dropping tips:\n", + "pip# resource offset tip type max volume (µL) fitting depth (mm) tip length (mm) filter \n", + " p0: trash 0,0.0,0 Tip 300.0 7.47 59.3 No \n", + "Picking up tips:\n", + "pip# resource offset tip type max volume (µL) fitting depth (mm) tip length (mm) filter \n", + " p0: tiprack_1_H1 0,0,0 Tip 300.0 7.47 59.3 No \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 100.0 working_plate_A8 -2.5,0,0 0.2 None 0.2 \n", + "[Well(name=waste_liq_A1, location=Coordinate(010.480, 007.140, 004.550), size_x=106.8, size_y=71.2, size_z=25, category=well)]\n", + "Dispensing:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 100.0 waste_liq_A1 0,0,-5 3.0 None 0.0 \n", + "Dropping tips:\n", + "pip# resource offset tip type max volume (µL) fitting depth (mm) tip length (mm) filter \n", + " p0: trash 0,0.0,0 Tip 300.0 7.47 59.3 No \n", + "Picking up tips:\n", + "pip# resource offset tip type max volume (µL) fitting depth (mm) tip length (mm) filter \n", + " p0: tiprack_1_A2 0,0,0 Tip 300.0 7.47 59.3 No \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 100.0 working_plate_A9 -2.5,0,0 0.2 None 0.2 \n", + "[Well(name=waste_liq_A1, location=Coordinate(010.480, 007.140, 004.550), size_x=106.8, size_y=71.2, size_z=25, category=well)]\n", + "Dispensing:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 100.0 waste_liq_A1 0,0,-5 3.0 None 0.0 \n", + "Dropping tips:\n", + "pip# resource offset tip type max volume (µL) fitting depth (mm) tip length (mm) filter \n", + " p0: trash 0,0.0,0 Tip 300.0 7.47 59.3 No \n", + "Picking up tips:\n", + "pip# resource offset tip type max volume (µL) fitting depth (mm) tip length (mm) filter \n", + " p0: tiprack_1_B2 0,0,0 Tip 300.0 7.47 59.3 No \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 100.0 working_plate_A10 -2.5,0,0 0.2 None 0.2 \n", + "[Well(name=waste_liq_A1, location=Coordinate(010.480, 007.140, 004.550), size_x=106.8, size_y=71.2, size_z=25, category=well)]\n", + "Dispensing:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 100.0 waste_liq_A1 0,0,-5 3.0 None 0.0 \n", + "Dropping tips:\n", + "pip# resource offset tip type max volume (µL) fitting depth (mm) tip length (mm) filter \n", + " p0: trash 0,0.0,0 Tip 300.0 7.47 59.3 No \n", + "Picking up tips:\n", + "pip# resource offset tip type max volume (µL) fitting depth (mm) tip length (mm) filter \n", + " p0: tiprack_1_C2 0,0,0 Tip 300.0 7.47 59.3 No \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 100.0 working_plate_A11 -2.5,0,0 0.2 None 0.2 \n", + "[Well(name=waste_liq_A1, location=Coordinate(010.480, 007.140, 004.550), size_x=106.8, size_y=71.2, size_z=25, category=well)]\n", + "Dispensing:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 100.0 waste_liq_A1 0,0,-5 3.0 None 0.0 \n", + "Dropping tips:\n", + "pip# resource offset tip type max volume (µL) fitting depth (mm) tip length (mm) filter \n", + " p0: trash 0,0.0,0 Tip 300.0 7.47 59.3 No \n", + "Picking up tips:\n", + "pip# resource offset tip type max volume (µL) fitting depth (mm) tip length (mm) filter \n", + " p0: tiprack_1_D2 0,0,0 Tip 300.0 7.47 59.3 No \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 100.0 working_plate_A12 -2.5,0,0 0.2 None 0.2 \n", + "[Well(name=waste_liq_A1, location=Coordinate(010.480, 007.140, 004.550), size_x=106.8, size_y=71.2, size_z=25, category=well)]\n", + "Dispensing:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 100.0 waste_liq_A1 0,0,-5 3.0 None 0.0 \n", + "Dropping tips:\n", + "pip# resource offset tip type max volume (µL) fitting depth (mm) tip length (mm) filter \n", + " p0: trash 0,0.0,0 Tip 300.0 7.47 59.3 No \n" + ] + } + ], + "source": [ + "await lh.remove_liquid(\n", + " vols=[MEDIUM_VOL]*12,\n", + " sources=cells_all,\n", + " waste_liquid=waste_liq,\n", + " top=[-0.2],\n", + " liquid_height=[0.2,0],\n", + " flow_rates=[0.2,3],\n", + " offsets=[Coordinate(-2.5, 0, 0),Coordinate(0, 0, -5)]\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "91d07db6", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Picking up tips:\n", + "pip# resource offset tip type max volume (µL) fitting depth (mm) tip length (mm) filter \n", + " p0: tiprack_1_E2 0,0,0 Tip 300.0 7.47 59.3 No \n", + "Tracker only has 0uL, please pay attention.\n", + "Container has too little liquid: 75.0uL > 0uL, please pay attention.\n", + "Air bubble detected, please pay attention.\n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 75.0 working_plate_A1 -2.5,0,0 0.2 None 0.2 \n", + "[Well(name=waste_liq_A1, location=Coordinate(010.480, 007.140, 004.550), size_x=106.8, size_y=71.2, size_z=25, category=well)]\n", + "Tracker only has 0uL, please pay attention.\n", + "Container has too little liquid: 75.0uL > 0uL, please pay attention.\n", + "Air bubble detected, please pay attention.\n", + "Dispensing:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 75.0 waste_liq_A1 0,0,-5 3.0 None None \n", + "Dropping tips:\n", + "pip# resource offset tip type max volume (µL) fitting depth (mm) tip length (mm) filter \n", + " p0: trash 0,0.0,0 Tip 300.0 7.47 59.3 No \n", + "Picking up tips:\n", + "pip# resource offset tip type max volume (µL) fitting depth (mm) tip length (mm) filter \n", + " p0: tiprack_1_F2 0,0,0 Tip 300.0 7.47 59.3 No \n", + "Tracker only has 0uL, please pay attention.\n", + "Container has too little liquid: 75.0uL > 0uL, please pay attention.\n", + "Air bubble detected, please pay attention.\n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 75.0 working_plate_A2 -2.5,0,0 0.2 None 0.2 \n", + "[Well(name=waste_liq_A1, location=Coordinate(010.480, 007.140, 004.550), size_x=106.8, size_y=71.2, size_z=25, category=well)]\n", + "Tracker only has 0uL, please pay attention.\n", + "Container has too little liquid: 75.0uL > 0uL, please pay attention.\n", + "Air bubble detected, please pay attention.\n", + "Dispensing:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 75.0 waste_liq_A1 0,0,-5 3.0 None None \n", + "Dropping tips:\n", + "pip# resource offset tip type max volume (µL) fitting depth (mm) tip length (mm) filter \n", + " p0: trash 0,0.0,0 Tip 300.0 7.47 59.3 No \n", + "Picking up tips:\n", + "pip# resource offset tip type max volume (µL) fitting depth (mm) tip length (mm) filter \n", + " p0: tiprack_1_G2 0,0,0 Tip 300.0 7.47 59.3 No \n", + "Tracker only has 0uL, please pay attention.\n", + "Container has too little liquid: 75.0uL > 0uL, please pay attention.\n", + "Air bubble detected, please pay attention.\n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 75.0 working_plate_A3 -2.5,0,0 0.2 None 0.2 \n", + "[Well(name=waste_liq_A1, location=Coordinate(010.480, 007.140, 004.550), size_x=106.8, size_y=71.2, size_z=25, category=well)]\n", + "Tracker only has 0uL, please pay attention.\n", + "Container has too little liquid: 75.0uL > 0uL, please pay attention.\n", + "Air bubble detected, please pay attention.\n", + "Dispensing:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 75.0 waste_liq_A1 0,0,-5 3.0 None None \n", + "Dropping tips:\n", + "pip# resource offset tip type max volume (µL) fitting depth (mm) tip length (mm) filter \n", + " p0: trash 0,0.0,0 Tip 300.0 7.47 59.3 No \n", + "Picking up tips:\n", + "pip# resource offset tip type max volume (µL) fitting depth (mm) tip length (mm) filter \n", + " p0: tiprack_1_H2 0,0,0 Tip 300.0 7.47 59.3 No \n", + "Tracker only has 0uL, please pay attention.\n", + "Container has too little liquid: 75.0uL > 0uL, please pay attention.\n", + "Air bubble detected, please pay attention.\n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 75.0 working_plate_A4 -2.5,0,0 0.2 None 0.2 \n", + "[Well(name=waste_liq_A1, location=Coordinate(010.480, 007.140, 004.550), size_x=106.8, size_y=71.2, size_z=25, category=well)]\n", + "Tracker only has 0uL, please pay attention.\n", + "Container has too little liquid: 75.0uL > 0uL, please pay attention.\n", + "Air bubble detected, please pay attention.\n", + "Dispensing:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 75.0 waste_liq_A1 0,0,-5 3.0 None None \n", + "Dropping tips:\n", + "pip# resource offset tip type max volume (µL) fitting depth (mm) tip length (mm) filter \n", + " p0: trash 0,0.0,0 Tip 300.0 7.47 59.3 No \n", + "Picking up tips:\n", + "pip# resource offset tip type max volume (µL) fitting depth (mm) tip length (mm) filter \n", + " p0: tiprack_1_A3 0,0,0 Tip 300.0 7.47 59.3 No \n", + "Tracker only has 0uL, please pay attention.\n", + "Container has too little liquid: 75.0uL > 0uL, please pay attention.\n", + "Air bubble detected, please pay attention.\n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 75.0 working_plate_A5 -2.5,0,0 0.2 None 0.2 \n", + "[Well(name=waste_liq_A1, location=Coordinate(010.480, 007.140, 004.550), size_x=106.8, size_y=71.2, size_z=25, category=well)]\n", + "Tracker only has 0uL, please pay attention.\n", + "Container has too little liquid: 75.0uL > 0uL, please pay attention.\n", + "Air bubble detected, please pay attention.\n", + "Dispensing:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 75.0 waste_liq_A1 0,0,-5 3.0 None None \n", + "Dropping tips:\n", + "pip# resource offset tip type max volume (µL) fitting depth (mm) tip length (mm) filter \n", + " p0: trash 0,0.0,0 Tip 300.0 7.47 59.3 No \n", + "Picking up tips:\n", + "pip# resource offset tip type max volume (µL) fitting depth (mm) tip length (mm) filter \n", + " p0: tiprack_1_B3 0,0,0 Tip 300.0 7.47 59.3 No \n", + "Tracker only has 0uL, please pay attention.\n", + "Container has too little liquid: 75.0uL > 0uL, please pay attention.\n", + "Air bubble detected, please pay attention.\n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 75.0 working_plate_A6 -2.5,0,0 0.2 None 0.2 \n", + "[Well(name=waste_liq_A1, location=Coordinate(010.480, 007.140, 004.550), size_x=106.8, size_y=71.2, size_z=25, category=well)]\n", + "Tracker only has 0uL, please pay attention.\n", + "Container has too little liquid: 75.0uL > 0uL, please pay attention.\n", + "Air bubble detected, please pay attention.\n", + "Dispensing:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 75.0 waste_liq_A1 0,0,-5 3.0 None None \n", + "Dropping tips:\n", + "pip# resource offset tip type max volume (µL) fitting depth (mm) tip length (mm) filter \n", + " p0: trash 0,0.0,0 Tip 300.0 7.47 59.3 No \n", + "Picking up tips:\n", + "pip# resource offset tip type max volume (µL) fitting depth (mm) tip length (mm) filter \n", + " p0: tiprack_1_C3 0,0,0 Tip 300.0 7.47 59.3 No \n", + "Tracker only has 0uL, please pay attention.\n", + "Container has too little liquid: 75.0uL > 0uL, please pay attention.\n", + "Air bubble detected, please pay attention.\n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 75.0 working_plate_A7 -2.5,0,0 0.2 None 0.2 \n", + "[Well(name=waste_liq_A1, location=Coordinate(010.480, 007.140, 004.550), size_x=106.8, size_y=71.2, size_z=25, category=well)]\n", + "Tracker only has 0uL, please pay attention.\n", + "Container has too little liquid: 75.0uL > 0uL, please pay attention.\n", + "Air bubble detected, please pay attention.\n", + "Dispensing:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 75.0 waste_liq_A1 0,0,-5 3.0 None None \n", + "Dropping tips:\n", + "pip# resource offset tip type max volume (µL) fitting depth (mm) tip length (mm) filter \n", + " p0: trash 0,0.0,0 Tip 300.0 7.47 59.3 No \n", + "Picking up tips:\n", + "pip# resource offset tip type max volume (µL) fitting depth (mm) tip length (mm) filter \n", + " p0: tiprack_1_D3 0,0,0 Tip 300.0 7.47 59.3 No \n", + "Tracker only has 0uL, please pay attention.\n", + "Container has too little liquid: 75.0uL > 0uL, please pay attention.\n", + "Air bubble detected, please pay attention.\n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 75.0 working_plate_A8 -2.5,0,0 0.2 None 0.2 \n", + "[Well(name=waste_liq_A1, location=Coordinate(010.480, 007.140, 004.550), size_x=106.8, size_y=71.2, size_z=25, category=well)]\n", + "Tracker only has 0uL, please pay attention.\n", + "Container has too little liquid: 75.0uL > 0uL, please pay attention.\n", + "Air bubble detected, please pay attention.\n", + "Dispensing:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 75.0 waste_liq_A1 0,0,-5 3.0 None None \n", + "Dropping tips:\n", + "pip# resource offset tip type max volume (µL) fitting depth (mm) tip length (mm) filter \n", + " p0: trash 0,0.0,0 Tip 300.0 7.47 59.3 No \n", + "Picking up tips:\n", + "pip# resource offset tip type max volume (µL) fitting depth (mm) tip length (mm) filter \n", + " p0: tiprack_1_E3 0,0,0 Tip 300.0 7.47 59.3 No \n", + "Tracker only has 0uL, please pay attention.\n", + "Container has too little liquid: 75.0uL > 0uL, please pay attention.\n", + "Air bubble detected, please pay attention.\n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 75.0 working_plate_A9 -2.5,0,0 0.2 None 0.2 \n", + "[Well(name=waste_liq_A1, location=Coordinate(010.480, 007.140, 004.550), size_x=106.8, size_y=71.2, size_z=25, category=well)]\n", + "Tracker only has 0uL, please pay attention.\n", + "Container has too little liquid: 75.0uL > 0uL, please pay attention.\n", + "Air bubble detected, please pay attention.\n", + "Dispensing:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 75.0 waste_liq_A1 0,0,-5 3.0 None None \n", + "Dropping tips:\n", + "pip# resource offset tip type max volume (µL) fitting depth (mm) tip length (mm) filter \n", + " p0: trash 0,0.0,0 Tip 300.0 7.47 59.3 No \n", + "Picking up tips:\n", + "pip# resource offset tip type max volume (µL) fitting depth (mm) tip length (mm) filter \n", + " p0: tiprack_1_F3 0,0,0 Tip 300.0 7.47 59.3 No \n", + "Tracker only has 0uL, please pay attention.\n", + "Container has too little liquid: 75.0uL > 0uL, please pay attention.\n", + "Air bubble detected, please pay attention.\n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 75.0 working_plate_A10 -2.5,0,0 0.2 None 0.2 \n", + "[Well(name=waste_liq_A1, location=Coordinate(010.480, 007.140, 004.550), size_x=106.8, size_y=71.2, size_z=25, category=well)]\n", + "Tracker only has 0uL, please pay attention.\n", + "Container has too little liquid: 75.0uL > 0uL, please pay attention.\n", + "Air bubble detected, please pay attention.\n", + "Dispensing:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 75.0 waste_liq_A1 0,0,-5 3.0 None None \n", + "Dropping tips:\n", + "pip# resource offset tip type max volume (µL) fitting depth (mm) tip length (mm) filter \n", + " p0: trash 0,0.0,0 Tip 300.0 7.47 59.3 No \n", + "Picking up tips:\n", + "pip# resource offset tip type max volume (µL) fitting depth (mm) tip length (mm) filter \n", + " p0: tiprack_1_G3 0,0,0 Tip 300.0 7.47 59.3 No \n", + "Tracker only has 0uL, please pay attention.\n", + "Container has too little liquid: 75.0uL > 0uL, please pay attention.\n", + "Air bubble detected, please pay attention.\n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 75.0 working_plate_A11 -2.5,0,0 0.2 None 0.2 \n", + "[Well(name=waste_liq_A1, location=Coordinate(010.480, 007.140, 004.550), size_x=106.8, size_y=71.2, size_z=25, category=well)]\n", + "Tracker only has 0uL, please pay attention.\n", + "Container has too little liquid: 75.0uL > 0uL, please pay attention.\n", + "Air bubble detected, please pay attention.\n", + "Dispensing:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 75.0 waste_liq_A1 0,0,-5 3.0 None None \n", + "Dropping tips:\n", + "pip# resource offset tip type max volume (µL) fitting depth (mm) tip length (mm) filter \n", + " p0: trash 0,0.0,0 Tip 300.0 7.47 59.3 No \n", + "Picking up tips:\n", + "pip# resource offset tip type max volume (µL) fitting depth (mm) tip length (mm) filter \n", + " p0: tiprack_1_H3 0,0,0 Tip 300.0 7.47 59.3 No \n", + "Tracker only has 0uL, please pay attention.\n", + "Container has too little liquid: 75.0uL > 0uL, please pay attention.\n", + "Air bubble detected, please pay attention.\n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 75.0 working_plate_A12 -2.5,0,0 0.2 None 0.2 \n", + "[Well(name=waste_liq_A1, location=Coordinate(010.480, 007.140, 004.550), size_x=106.8, size_y=71.2, size_z=25, category=well)]\n", + "Tracker only has 0uL, please pay attention.\n", + "Container has too little liquid: 75.0uL > 0uL, please pay attention.\n", + "Air bubble detected, please pay attention.\n", + "Dispensing:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 75.0 waste_liq_A1 0,0,-5 3.0 None None \n", + "Dropping tips:\n", + "pip# resource offset tip type max volume (µL) fitting depth (mm) tip length (mm) filter \n", + " p0: trash 0,0.0,0 Tip 300.0 7.47 59.3 No \n" + ] + } + ], + "source": [ + "await lh.remove_liquid(\n", + " vols=[PBS_VOL*1.5]*12,\n", + " top=[-0.2],\n", + " liquid_height=[0.2,None],\n", + " offsets=[Coordinate(-2.5,0,0),Coordinate(0,0,-5)],\n", + " flow_rates=[0.2,3],\n", + " sources=cells_all,\n", + " waste_liquid=waste_liq\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "baa8f751", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Picking up tips:\n", + "pip# resource offset tip type max volume (µL) fitting depth (mm) tip length (mm) filter \n", + " p0: tiprack_1_A4 0,0,0 Tip 300.0 7.47 59.3 No \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 30.0 reagent_stock_A2 0,0,0 0.5 None 0.5 \n", + "[Well(name=working_plate_A1, location=Coordinate(011.954, 071.814, 003.550), size_x=4.851, size_y=4.851, size_z=10.67, category=well)]\n", + "Dispensing:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 30.0 working_plate_A1 0,0,0 0.3 None 5.0 \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 0.0 working_plate_A1 -2.4,0,0 None None None \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 0.0 working_plate_A1 2.4,0,0 None None None \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 30.0 reagent_stock_A2 0,0,0 0.5 None 0.5 \n", + "[Well(name=working_plate_A2, location=Coordinate(020.954, 071.814, 003.550), size_x=4.851, size_y=4.851, size_z=10.67, category=well)]\n", + "Dispensing:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 30.0 working_plate_A2 0,0,0 0.3 None 5.0 \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 0.0 working_plate_A2 -2.4,0,0 None None None \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 0.0 working_plate_A2 2.4,0,0 None None None \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 30.0 reagent_stock_A2 0,0,0 0.5 None 0.5 \n", + "[Well(name=working_plate_A3, location=Coordinate(029.954, 071.814, 003.550), size_x=4.851, size_y=4.851, size_z=10.67, category=well)]\n", + "Dispensing:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 30.0 working_plate_A3 0,0,0 0.3 None 5.0 \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 0.0 working_plate_A3 -2.4,0,0 None None None \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 0.0 working_plate_A3 2.4,0,0 None None None \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 30.0 reagent_stock_A2 0,0,0 0.5 None 0.5 \n", + "[Well(name=working_plate_A4, location=Coordinate(038.955, 071.814, 003.550), size_x=4.851, size_y=4.851, size_z=10.67, category=well)]\n", + "Dispensing:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 30.0 working_plate_A4 0,0,0 0.3 None 5.0 \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 0.0 working_plate_A4 -2.4,0,0 None None None \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 0.0 working_plate_A4 2.4,0,0 None None None \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 30.0 reagent_stock_A2 0,0,0 0.5 None 0.5 \n", + "[Well(name=working_plate_A5, location=Coordinate(047.955, 071.814, 003.550), size_x=4.851, size_y=4.851, size_z=10.67, category=well)]\n", + "Dispensing:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 30.0 working_plate_A5 0,0,0 0.3 None 5.0 \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 0.0 working_plate_A5 -2.4,0,0 None None None \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 0.0 working_plate_A5 2.4,0,0 None None None \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 30.0 reagent_stock_A2 0,0,0 0.5 None 0.5 \n", + "[Well(name=working_plate_A6, location=Coordinate(056.955, 071.814, 003.550), size_x=4.851, size_y=4.851, size_z=10.67, category=well)]\n", + "Dispensing:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 30.0 working_plate_A6 0,0,0 0.3 None 5.0 \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 0.0 working_plate_A6 -2.4,0,0 None None None \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 0.0 working_plate_A6 2.4,0,0 None None None \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 30.0 reagent_stock_A2 0,0,0 0.5 None 0.5 \n", + "[Well(name=working_plate_A7, location=Coordinate(065.954, 071.814, 003.550), size_x=4.851, size_y=4.851, size_z=10.67, category=well)]\n", + "Dispensing:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 30.0 working_plate_A7 0,0,0 0.3 None 5.0 \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 0.0 working_plate_A7 -2.4,0,0 None None None \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 0.0 working_plate_A7 2.4,0,0 None None None \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 30.0 reagent_stock_A2 0,0,0 0.5 None 0.5 \n", + "[Well(name=working_plate_A8, location=Coordinate(074.954, 071.814, 003.550), size_x=4.851, size_y=4.851, size_z=10.67, category=well)]\n", + "Dispensing:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 30.0 working_plate_A8 0,0,0 0.3 None 5.0 \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 0.0 working_plate_A8 -2.4,0,0 None None None \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 0.0 working_plate_A8 2.4,0,0 None None None \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 30.0 reagent_stock_A2 0,0,0 0.5 None 0.5 \n", + "[Well(name=working_plate_A9, location=Coordinate(083.954, 071.814, 003.550), size_x=4.851, size_y=4.851, size_z=10.67, category=well)]\n", + "Dispensing:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 30.0 working_plate_A9 0,0,0 0.3 None 5.0 \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 0.0 working_plate_A9 -2.4,0,0 None None None \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 0.0 working_plate_A9 2.4,0,0 None None None \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 30.0 reagent_stock_A2 0,0,0 0.5 None 0.5 \n", + "[Well(name=working_plate_A10, location=Coordinate(092.954, 071.814, 003.550), size_x=4.851, size_y=4.851, size_z=10.67, category=well)]\n", + "Dispensing:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 30.0 working_plate_A10 0,0,0 0.3 None 5.0 \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 0.0 working_plate_A10 -2.4,0,0 None None None \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 0.0 working_plate_A10 2.4,0,0 None None None \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 30.0 reagent_stock_A2 0,0,0 0.5 None 0.5 \n", + "[Well(name=working_plate_A11, location=Coordinate(101.954, 071.814, 003.550), size_x=4.851, size_y=4.851, size_z=10.67, category=well)]\n", + "Dispensing:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 30.0 working_plate_A11 0,0,0 0.3 None 5.0 \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 0.0 working_plate_A11 -2.4,0,0 None None None \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 0.0 working_plate_A11 2.4,0,0 None None None \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 30.0 reagent_stock_A2 0,0,0 0.5 None 0.5 \n", + "[Well(name=working_plate_A12, location=Coordinate(110.954, 071.814, 003.550), size_x=4.851, size_y=4.851, size_z=10.67, category=well)]\n", + "Dispensing:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 30.0 working_plate_A12 0,0,0 0.3 None 5.0 \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 0.0 working_plate_A12 -2.4,0,0 None None None \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 0.0 working_plate_A12 2.4,0,0 None None None \n", + "Dropping tips:\n", + "pip# resource offset tip type max volume (µL) fitting depth (mm) tip length (mm) filter \n", + " p0: trash 0,0.0,0 Tip 300.0 7.47 59.3 No \n" + ] + } + ], + "source": [ + "await lh.add_liquid(\n", + " asp_vols=[LYSIS_VOL]*12,\n", + " dis_vols=[LYSIS_VOL]*12,\n", + " reagent_sources=[lysis],\n", + " targets=cells_all,\n", + " flow_rates=[0.5,0.3],\n", + " liquid_height=[0.5,5],\n", + " delays=[2,2]\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "d55b0875", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "lh.custom_delay(180)" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "20a281d3", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Picking up tips:\n", + "pip# resource offset tip type max volume (µL) fitting depth (mm) tip length (mm) filter \n", + " p0: tiprack_1_B4 0,0,0 Tip 300.0 7.47 59.3 No \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 100.0 reagent_stock_A3 0,0,0 0.75 20.0 0.5 \n", + "[Well(name=working_plate_A1, location=Coordinate(011.954, 071.814, 003.550), size_x=4.851, size_y=4.851, size_z=10.67, category=well)]\n", + "Tracker only has 100.0uL, please pay attention.\n", + "Container has too little liquid: 120.0uL > 100.0uL, please pay attention.\n", + "Air bubble detected, please pay attention.\n", + "Dispensing:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 120.0 working_plate_A1 0,0,0 0.75 None None \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 75.0 working_plate_A1 0,0,0 3.0 None 0.5 \n", + "[Well(name=working_plate_A1, location=Coordinate(011.954, 071.814, 003.550), size_x=4.851, size_y=4.851, size_z=10.67, category=well)]\n", + "Dispensing:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 75.0 working_plate_A1 0,0,0 3.0 None 0.5 \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 75.0 working_plate_A1 0,0,0 3.0 None 0.5 \n", + "[Well(name=working_plate_A1, location=Coordinate(011.954, 071.814, 003.550), size_x=4.851, size_y=4.851, size_z=10.67, category=well)]\n", + "Dispensing:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 75.0 working_plate_A1 0,0,0 3.0 None 0.5 \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 75.0 working_plate_A1 0,0,0 3.0 None 0.5 \n", + "[Well(name=working_plate_A1, location=Coordinate(011.954, 071.814, 003.550), size_x=4.851, size_y=4.851, size_z=10.67, category=well)]\n", + "Dispensing:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 75.0 working_plate_A1 0,0,0 3.0 None 0.5 \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 0.0 working_plate_A1 -2.4,0,0 None None None \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 0.0 working_plate_A1 2.4,0,0 None None None \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 100.0 reagent_stock_A3 0,0,0 0.75 20.0 0.5 \n", + "[Well(name=working_plate_A2, location=Coordinate(020.954, 071.814, 003.550), size_x=4.851, size_y=4.851, size_z=10.67, category=well)]\n", + "Tracker only has 100.0uL, please pay attention.\n", + "Container has too little liquid: 120.0uL > 100.0uL, please pay attention.\n", + "Air bubble detected, please pay attention.\n", + "Dispensing:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 120.0 working_plate_A2 0,0,0 0.75 None None \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 75.0 working_plate_A2 0,0,0 3.0 None 0.5 \n", + "[Well(name=working_plate_A2, location=Coordinate(020.954, 071.814, 003.550), size_x=4.851, size_y=4.851, size_z=10.67, category=well)]\n", + "Dispensing:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 75.0 working_plate_A2 0,0,0 3.0 None 0.5 \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 75.0 working_plate_A2 0,0,0 3.0 None 0.5 \n", + "[Well(name=working_plate_A2, location=Coordinate(020.954, 071.814, 003.550), size_x=4.851, size_y=4.851, size_z=10.67, category=well)]\n", + "Dispensing:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 75.0 working_plate_A2 0,0,0 3.0 None 0.5 \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 75.0 working_plate_A2 0,0,0 3.0 None 0.5 \n", + "[Well(name=working_plate_A2, location=Coordinate(020.954, 071.814, 003.550), size_x=4.851, size_y=4.851, size_z=10.67, category=well)]\n", + "Dispensing:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 75.0 working_plate_A2 0,0,0 3.0 None 0.5 \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 0.0 working_plate_A2 -2.4,0,0 None None None \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 0.0 working_plate_A2 2.4,0,0 None None None \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 100.0 reagent_stock_A3 0,0,0 0.75 20.0 0.5 \n", + "[Well(name=working_plate_A3, location=Coordinate(029.954, 071.814, 003.550), size_x=4.851, size_y=4.851, size_z=10.67, category=well)]\n", + "Tracker only has 100.0uL, please pay attention.\n", + "Container has too little liquid: 120.0uL > 100.0uL, please pay attention.\n", + "Air bubble detected, please pay attention.\n", + "Dispensing:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 120.0 working_plate_A3 0,0,0 0.75 None None \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 75.0 working_plate_A3 0,0,0 3.0 None 0.5 \n", + "[Well(name=working_plate_A3, location=Coordinate(029.954, 071.814, 003.550), size_x=4.851, size_y=4.851, size_z=10.67, category=well)]\n", + "Dispensing:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 75.0 working_plate_A3 0,0,0 3.0 None 0.5 \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 75.0 working_plate_A3 0,0,0 3.0 None 0.5 \n", + "[Well(name=working_plate_A3, location=Coordinate(029.954, 071.814, 003.550), size_x=4.851, size_y=4.851, size_z=10.67, category=well)]\n", + "Dispensing:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 75.0 working_plate_A3 0,0,0 3.0 None 0.5 \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 75.0 working_plate_A3 0,0,0 3.0 None 0.5 \n", + "[Well(name=working_plate_A3, location=Coordinate(029.954, 071.814, 003.550), size_x=4.851, size_y=4.851, size_z=10.67, category=well)]\n", + "Dispensing:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 75.0 working_plate_A3 0,0,0 3.0 None 0.5 \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 0.0 working_plate_A3 -2.4,0,0 None None None \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 0.0 working_plate_A3 2.4,0,0 None None None \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 100.0 reagent_stock_A3 0,0,0 0.75 20.0 0.5 \n", + "[Well(name=working_plate_A4, location=Coordinate(038.955, 071.814, 003.550), size_x=4.851, size_y=4.851, size_z=10.67, category=well)]\n", + "Tracker only has 100.0uL, please pay attention.\n", + "Container has too little liquid: 120.0uL > 100.0uL, please pay attention.\n", + "Air bubble detected, please pay attention.\n", + "Dispensing:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 120.0 working_plate_A4 0,0,0 0.75 None None \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 75.0 working_plate_A4 0,0,0 3.0 None 0.5 \n", + "[Well(name=working_plate_A4, location=Coordinate(038.955, 071.814, 003.550), size_x=4.851, size_y=4.851, size_z=10.67, category=well)]\n", + "Dispensing:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 75.0 working_plate_A4 0,0,0 3.0 None 0.5 \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 75.0 working_plate_A4 0,0,0 3.0 None 0.5 \n", + "[Well(name=working_plate_A4, location=Coordinate(038.955, 071.814, 003.550), size_x=4.851, size_y=4.851, size_z=10.67, category=well)]\n", + "Dispensing:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 75.0 working_plate_A4 0,0,0 3.0 None 0.5 \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 75.0 working_plate_A4 0,0,0 3.0 None 0.5 \n", + "[Well(name=working_plate_A4, location=Coordinate(038.955, 071.814, 003.550), size_x=4.851, size_y=4.851, size_z=10.67, category=well)]\n", + "Dispensing:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 75.0 working_plate_A4 0,0,0 3.0 None 0.5 \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 0.0 working_plate_A4 -2.4,0,0 None None None \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 0.0 working_plate_A4 2.4,0,0 None None None \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 100.0 reagent_stock_A3 0,0,0 0.75 20.0 0.5 \n", + "[Well(name=working_plate_A5, location=Coordinate(047.955, 071.814, 003.550), size_x=4.851, size_y=4.851, size_z=10.67, category=well)]\n", + "Tracker only has 100.0uL, please pay attention.\n", + "Container has too little liquid: 120.0uL > 100.0uL, please pay attention.\n", + "Air bubble detected, please pay attention.\n", + "Dispensing:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 120.0 working_plate_A5 0,0,0 0.75 None None \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 75.0 working_plate_A5 0,0,0 3.0 None 0.5 \n", + "[Well(name=working_plate_A5, location=Coordinate(047.955, 071.814, 003.550), size_x=4.851, size_y=4.851, size_z=10.67, category=well)]\n", + "Dispensing:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 75.0 working_plate_A5 0,0,0 3.0 None 0.5 \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 75.0 working_plate_A5 0,0,0 3.0 None 0.5 \n", + "[Well(name=working_plate_A5, location=Coordinate(047.955, 071.814, 003.550), size_x=4.851, size_y=4.851, size_z=10.67, category=well)]\n", + "Dispensing:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 75.0 working_plate_A5 0,0,0 3.0 None 0.5 \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 75.0 working_plate_A5 0,0,0 3.0 None 0.5 \n", + "[Well(name=working_plate_A5, location=Coordinate(047.955, 071.814, 003.550), size_x=4.851, size_y=4.851, size_z=10.67, category=well)]\n", + "Dispensing:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 75.0 working_plate_A5 0,0,0 3.0 None 0.5 \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 0.0 working_plate_A5 -2.4,0,0 None None None \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 0.0 working_plate_A5 2.4,0,0 None None None \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 100.0 reagent_stock_A3 0,0,0 0.75 20.0 0.5 \n", + "[Well(name=working_plate_A6, location=Coordinate(056.955, 071.814, 003.550), size_x=4.851, size_y=4.851, size_z=10.67, category=well)]\n", + "Tracker only has 100.0uL, please pay attention.\n", + "Container has too little liquid: 120.0uL > 100.0uL, please pay attention.\n", + "Air bubble detected, please pay attention.\n", + "Dispensing:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 120.0 working_plate_A6 0,0,0 0.75 None None \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 75.0 working_plate_A6 0,0,0 3.0 None 0.5 \n", + "[Well(name=working_plate_A6, location=Coordinate(056.955, 071.814, 003.550), size_x=4.851, size_y=4.851, size_z=10.67, category=well)]\n", + "Dispensing:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 75.0 working_plate_A6 0,0,0 3.0 None 0.5 \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 75.0 working_plate_A6 0,0,0 3.0 None 0.5 \n", + "[Well(name=working_plate_A6, location=Coordinate(056.955, 071.814, 003.550), size_x=4.851, size_y=4.851, size_z=10.67, category=well)]\n", + "Dispensing:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 75.0 working_plate_A6 0,0,0 3.0 None 0.5 \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 75.0 working_plate_A6 0,0,0 3.0 None 0.5 \n", + "[Well(name=working_plate_A6, location=Coordinate(056.955, 071.814, 003.550), size_x=4.851, size_y=4.851, size_z=10.67, category=well)]\n", + "Dispensing:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 75.0 working_plate_A6 0,0,0 3.0 None 0.5 \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 0.0 working_plate_A6 -2.4,0,0 None None None \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 0.0 working_plate_A6 2.4,0,0 None None None \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 100.0 reagent_stock_A3 0,0,0 0.75 20.0 0.5 \n", + "[Well(name=working_plate_A7, location=Coordinate(065.954, 071.814, 003.550), size_x=4.851, size_y=4.851, size_z=10.67, category=well)]\n", + "Tracker only has 100.0uL, please pay attention.\n", + "Container has too little liquid: 120.0uL > 100.0uL, please pay attention.\n", + "Air bubble detected, please pay attention.\n", + "Dispensing:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 120.0 working_plate_A7 0,0,0 0.75 None None \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 75.0 working_plate_A7 0,0,0 3.0 None 0.5 \n", + "[Well(name=working_plate_A7, location=Coordinate(065.954, 071.814, 003.550), size_x=4.851, size_y=4.851, size_z=10.67, category=well)]\n", + "Dispensing:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 75.0 working_plate_A7 0,0,0 3.0 None 0.5 \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 75.0 working_plate_A7 0,0,0 3.0 None 0.5 \n", + "[Well(name=working_plate_A7, location=Coordinate(065.954, 071.814, 003.550), size_x=4.851, size_y=4.851, size_z=10.67, category=well)]\n", + "Dispensing:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 75.0 working_plate_A7 0,0,0 3.0 None 0.5 \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 75.0 working_plate_A7 0,0,0 3.0 None 0.5 \n", + "[Well(name=working_plate_A7, location=Coordinate(065.954, 071.814, 003.550), size_x=4.851, size_y=4.851, size_z=10.67, category=well)]\n", + "Dispensing:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 75.0 working_plate_A7 0,0,0 3.0 None 0.5 \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 0.0 working_plate_A7 -2.4,0,0 None None None \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 0.0 working_plate_A7 2.4,0,0 None None None \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 100.0 reagent_stock_A3 0,0,0 0.75 20.0 0.5 \n", + "[Well(name=working_plate_A8, location=Coordinate(074.954, 071.814, 003.550), size_x=4.851, size_y=4.851, size_z=10.67, category=well)]\n", + "Tracker only has 100.0uL, please pay attention.\n", + "Container has too little liquid: 120.0uL > 100.0uL, please pay attention.\n", + "Air bubble detected, please pay attention.\n", + "Dispensing:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 120.0 working_plate_A8 0,0,0 0.75 None None \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 75.0 working_plate_A8 0,0,0 3.0 None 0.5 \n", + "[Well(name=working_plate_A8, location=Coordinate(074.954, 071.814, 003.550), size_x=4.851, size_y=4.851, size_z=10.67, category=well)]\n", + "Dispensing:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 75.0 working_plate_A8 0,0,0 3.0 None 0.5 \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 75.0 working_plate_A8 0,0,0 3.0 None 0.5 \n", + "[Well(name=working_plate_A8, location=Coordinate(074.954, 071.814, 003.550), size_x=4.851, size_y=4.851, size_z=10.67, category=well)]\n", + "Dispensing:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 75.0 working_plate_A8 0,0,0 3.0 None 0.5 \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 75.0 working_plate_A8 0,0,0 3.0 None 0.5 \n", + "[Well(name=working_plate_A8, location=Coordinate(074.954, 071.814, 003.550), size_x=4.851, size_y=4.851, size_z=10.67, category=well)]\n", + "Dispensing:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 75.0 working_plate_A8 0,0,0 3.0 None 0.5 \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 0.0 working_plate_A8 -2.4,0,0 None None None \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 0.0 working_plate_A8 2.4,0,0 None None None \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 100.0 reagent_stock_A3 0,0,0 0.75 20.0 0.5 \n", + "[Well(name=working_plate_A9, location=Coordinate(083.954, 071.814, 003.550), size_x=4.851, size_y=4.851, size_z=10.67, category=well)]\n", + "Tracker only has 100.0uL, please pay attention.\n", + "Container has too little liquid: 120.0uL > 100.0uL, please pay attention.\n", + "Air bubble detected, please pay attention.\n", + "Dispensing:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 120.0 working_plate_A9 0,0,0 0.75 None None \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 75.0 working_plate_A9 0,0,0 3.0 None 0.5 \n", + "[Well(name=working_plate_A9, location=Coordinate(083.954, 071.814, 003.550), size_x=4.851, size_y=4.851, size_z=10.67, category=well)]\n", + "Dispensing:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 75.0 working_plate_A9 0,0,0 3.0 None 0.5 \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 75.0 working_plate_A9 0,0,0 3.0 None 0.5 \n", + "[Well(name=working_plate_A9, location=Coordinate(083.954, 071.814, 003.550), size_x=4.851, size_y=4.851, size_z=10.67, category=well)]\n", + "Dispensing:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 75.0 working_plate_A9 0,0,0 3.0 None 0.5 \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 75.0 working_plate_A9 0,0,0 3.0 None 0.5 \n", + "[Well(name=working_plate_A9, location=Coordinate(083.954, 071.814, 003.550), size_x=4.851, size_y=4.851, size_z=10.67, category=well)]\n", + "Dispensing:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 75.0 working_plate_A9 0,0,0 3.0 None 0.5 \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 0.0 working_plate_A9 -2.4,0,0 None None None \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 0.0 working_plate_A9 2.4,0,0 None None None \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 100.0 reagent_stock_A3 0,0,0 0.75 20.0 0.5 \n", + "[Well(name=working_plate_A10, location=Coordinate(092.954, 071.814, 003.550), size_x=4.851, size_y=4.851, size_z=10.67, category=well)]\n", + "Tracker only has 100.0uL, please pay attention.\n", + "Container has too little liquid: 120.0uL > 100.0uL, please pay attention.\n", + "Air bubble detected, please pay attention.\n", + "Dispensing:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 120.0 working_plate_A10 0,0,0 0.75 None None \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 75.0 working_plate_A10 0,0,0 3.0 None 0.5 \n", + "[Well(name=working_plate_A10, location=Coordinate(092.954, 071.814, 003.550), size_x=4.851, size_y=4.851, size_z=10.67, category=well)]\n", + "Dispensing:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 75.0 working_plate_A10 0,0,0 3.0 None 0.5 \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 75.0 working_plate_A10 0,0,0 3.0 None 0.5 \n", + "[Well(name=working_plate_A10, location=Coordinate(092.954, 071.814, 003.550), size_x=4.851, size_y=4.851, size_z=10.67, category=well)]\n", + "Dispensing:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 75.0 working_plate_A10 0,0,0 3.0 None 0.5 \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 75.0 working_plate_A10 0,0,0 3.0 None 0.5 \n", + "[Well(name=working_plate_A10, location=Coordinate(092.954, 071.814, 003.550), size_x=4.851, size_y=4.851, size_z=10.67, category=well)]\n", + "Dispensing:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 75.0 working_plate_A10 0,0,0 3.0 None 0.5 \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 0.0 working_plate_A10 -2.4,0,0 None None None \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 0.0 working_plate_A10 2.4,0,0 None None None \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 100.0 reagent_stock_A3 0,0,0 0.75 20.0 0.5 \n", + "[Well(name=working_plate_A11, location=Coordinate(101.954, 071.814, 003.550), size_x=4.851, size_y=4.851, size_z=10.67, category=well)]\n", + "Tracker only has 100.0uL, please pay attention.\n", + "Container has too little liquid: 120.0uL > 100.0uL, please pay attention.\n", + "Air bubble detected, please pay attention.\n", + "Dispensing:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 120.0 working_plate_A11 0,0,0 0.75 None None \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 75.0 working_plate_A11 0,0,0 3.0 None 0.5 \n", + "[Well(name=working_plate_A11, location=Coordinate(101.954, 071.814, 003.550), size_x=4.851, size_y=4.851, size_z=10.67, category=well)]\n", + "Dispensing:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 75.0 working_plate_A11 0,0,0 3.0 None 0.5 \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 75.0 working_plate_A11 0,0,0 3.0 None 0.5 \n", + "[Well(name=working_plate_A11, location=Coordinate(101.954, 071.814, 003.550), size_x=4.851, size_y=4.851, size_z=10.67, category=well)]\n", + "Dispensing:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 75.0 working_plate_A11 0,0,0 3.0 None 0.5 \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 75.0 working_plate_A11 0,0,0 3.0 None 0.5 \n", + "[Well(name=working_plate_A11, location=Coordinate(101.954, 071.814, 003.550), size_x=4.851, size_y=4.851, size_z=10.67, category=well)]\n", + "Dispensing:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 75.0 working_plate_A11 0,0,0 3.0 None 0.5 \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 0.0 working_plate_A11 -2.4,0,0 None None None \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 0.0 working_plate_A11 2.4,0,0 None None None \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 100.0 reagent_stock_A3 0,0,0 0.75 20.0 0.5 \n", + "[Well(name=working_plate_A12, location=Coordinate(110.954, 071.814, 003.550), size_x=4.851, size_y=4.851, size_z=10.67, category=well)]\n", + "Tracker only has 100.0uL, please pay attention.\n", + "Container has too little liquid: 120.0uL > 100.0uL, please pay attention.\n", + "Air bubble detected, please pay attention.\n", + "Dispensing:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 120.0 working_plate_A12 0,0,0 0.75 None None \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 75.0 working_plate_A12 0,0,0 3.0 None 0.5 \n", + "[Well(name=working_plate_A12, location=Coordinate(110.954, 071.814, 003.550), size_x=4.851, size_y=4.851, size_z=10.67, category=well)]\n", + "Dispensing:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 75.0 working_plate_A12 0,0,0 3.0 None 0.5 \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 75.0 working_plate_A12 0,0,0 3.0 None 0.5 \n", + "[Well(name=working_plate_A12, location=Coordinate(110.954, 071.814, 003.550), size_x=4.851, size_y=4.851, size_z=10.67, category=well)]\n", + "Dispensing:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 75.0 working_plate_A12 0,0,0 3.0 None 0.5 \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 75.0 working_plate_A12 0,0,0 3.0 None 0.5 \n", + "[Well(name=working_plate_A12, location=Coordinate(110.954, 071.814, 003.550), size_x=4.851, size_y=4.851, size_z=10.67, category=well)]\n", + "Dispensing:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 75.0 working_plate_A12 0,0,0 3.0 None 0.5 \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 0.0 working_plate_A12 -2.4,0,0 None None None \n", + "Aspirating:\n", + "pip# vol(ul) resource offset flow rate blowout lld_z \n", + " p0: 0.0 working_plate_A12 2.4,0,0 None None None \n", + "Dropping tips:\n", + "pip# resource offset tip type max volume (µL) fitting depth (mm) tip length (mm) filter \n", + " p0: trash 0,0.0,0 Tip 300.0 7.47 59.3 No \n" + ] + } + ], + "source": [ + "await lh.add_liquid(\n", + " asp_vols=[LUC_VOL]*12,\n", + " dis_vols=[LUC_VOL+20]*12,\n", + " reagent_sources=[luciferase],\n", + " targets=cells_all,\n", + " liquid_height=[0.5, None],\n", + " mix_time=3,\n", + " mix_vol=75,\n", + " mix_rate=3,\n", + " mix_liquid_height=0.5,\n", + " delays = [2, None],\n", + " blow_out_air_volume=[20,None],\n", + " flow_rates=[0.75,0.75]\n", + ")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "pylabrobot", + "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.10.17" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +}