EVO development

Hello, I recently acquired a Tecan EVO from another group in my company but the computer that was attached to the machine is missing. When I tried to install evoware on another computer, the computer doesnt detect the machine and I am assuming I need a dongle for the software to work. Thank you so much for making this, so I can get around using evoware. Unfortunately, not having evoware makes development hard since I dont have access to log files from EVO.

I have a few questions. First, this machine uses liquid pumps for aspirating and dispensing instead of a plunger with air. Are there maintenance scripts for priming the system and controlling the MPO unit under the deck? Does someone have a log file for this from evoware?

I would also like to slow down the flow rate, but that argument doesnt seem to change anything when aspirating or dispensing.

Finally, I would like to add a tube holder and trough holder. I copied over the code from Hamilton resources and tried to modify that. I can get the resources on the deck in the simulation mode, but I am running into errors with z_travel not set in parent when trying to aspirate from the tubes.

from typing import Dict, Optional
from pylabrobot.resources.carrier import (
  Coordinate,
  ResourceHolder,
  TubeCarrier,
  create_homogeneous_resources,
)
from pylabrobot.resources.tecan.tecan_resource import TecanResource


class TecanTubeCarrier(TubeCarrier, TecanResource):
  """Base class for Tecan tube carriers."""

  def __init__(
    self,
    name: str,
    size_x: float,
    size_y: float,
    size_z: float,
    off_x: float,
    off_y: float,
    z_travel: float,
    roma_x: Optional[float] = None,
    roma_y: Optional[float] = None,
    roma_z_safe: Optional[float] = None,
    roma_z_travel: Optional[float] = None,
    roma_z_end: Optional[float] = None,
    sites: Optional[Dict[int, ResourceHolder]] = None,
    category="tecan_trough_carrier",
    model: Optional[str] = None,
  ):
    super().__init__(
      name,
      size_x,
      size_y,
      size_z,
      sites,
      category=category,
      model=model,
    )

    self.off_x: float = off_x
    self.off_y: float = off_y
    self.roma_x = roma_x
    self.roma_y = roma_y
    self.roma_z_safe = roma_z_safe
    self.roma_z_travel = roma_z_travel
    self.roma_z_end = roma_z_end


def Tube_CAR_16(name: str) -> TecanTubeCarrier:
  """Tecan cat. no.: 
  'Sample' carrier for 24 tubes sizes 14.5x60 – 18x120mm.
  1 track(T) wide.
  """
  return TecanTubeCarrier(
    name=name,
    size_x=25,
    size_y=318.0,
    size_z=71.5,
    off_x=12.5,
    off_y=15,
    z_travel=1938,
    roma_x=1876,
    roma_y=423,
    roma_z_safe=946,
    roma_z_travel=1938,
    roma_z_end=2566,
    sites=create_homogeneous_resources(
      klass=ResourceHolder,
      locations=[
        Coordinate(3.0, 7.5 + x * 18.5, 5.75) for x in range(16)
      ],  # TODO: +1.2 to account for the Tube.material_z_thickness, fix container
      resource_size_x=18.0,
      resource_size_y=18.0,
      name_prefix=name,
    ),
    model="Tube_CAR_16",
  )

welcome to the forum!

please note that the EVO backend in PLR is a little bit underdeveloped compared to the Hamitons, but with a bit of work I think we can make it a lot better. in my lab we don’t have an evo right now, the only user on this forum who does is @VilhelmKM.

@VilhelmKM do you know this?

one example that isn’t yet implemented for the evo.

currently, it’s inferred from the liquid class:

but, it should be overridden when the user specifically specifies it. (over time i hope to remove liquid classes.)

do you want to make a PR for this?

z_travel is kind of a mysterious attribute.

screenshot from evoware:

i think it’s like “traversal height” in hamiltons: the minimum height the channels and other components need to be when moving over this resource. if that’s the case, we can just set a global z_travel height that’s used for everything (like the hamiltons) instead of this. but i could be wrong about what z_travel actually is.

in any case, this attribute is not used right now so I think it should be possible to actually remove it from TecanResource. @VilhelmKM could you weigh in here?

i had codex make a PR for the flow rates: Implement flow rate for Tecan EVO backend by rickwierenga · Pull Request #549 · PyLabRobot/pylabrobot · GitHub. I think I need to make a change before it’s ready to be tested.

i also made a PR for removing z travel height from the resources: remove z_travel from tecan resources by rickwierenga · Pull Request #553 · PyLabRobot/pylabrobot · GitHub. Currently the last comment in this thread has a request for someone to kindly test on real hardware.

and also made a more general issue for tracking the state of removing specialized tecan resource classes: Remove Tecan-Specific Attributes from resource model · Issue #552 · PyLabRobot/pylabrobot · GitHub

Thanks for your quick response! The change for specifying flow rate works for me.

I also want to note, when pipetting 100uL I get an error. The tecan liquid class I am using is (15.01, 200.01, Liquid.WATER, TipType.DITI). That sets the dispense_speed to 600 and when multiplied by 12 that gives 7,200 which is above the 6000 max 1/2 steps per second. Is the *12 a conversion of uL to half steps? I saw you have a question mark for 6. When I set it to 6 it correctly aspirates (close to) 100uL and doesn’t throw an error for dispensing. I have the liquid based LiHa, perhaps this is different than air LiHa? I am assuming there is no difference since they use the same commands.

I will test out the PR for z travel height soon.

Thanks again!