Tecan Infinite 200
The Tecan Infinite 200 connector connects the reader over USB without running Tecan's i-control software. Use GroundControl to check the available read actions, then read a plate from a notebook in the platform's IDE.
What you need
| Item | Detail |
|---|---|
| Instrument | A Tecan Infinite 200, powered on, with room in front for the carrier and the plate you want to read. |
| Cable | A cable connecting the reader to the GroundControl machine via USB. |
| Connector | Tecan Infinite 200, package unitelabs-tecan-infinite-200. |
| Vendor software | On Windows: the USB driver supplied with i-control. Linux and macOS need no vendor software. |
| Machine | Windows, Linux or macOS running GroundControl. Linux needs a udev rule for USB access. |
| Access | A tenant and a user account for the UniteLabs platform and GroundControl. |
| Notebook | The IDE in the UniteLabs platform, with the UniteLabs SDK installed on your tenant. |
Install and configure the connector
- In GroundControl, add a connector and search for Tecan Infinite 200 (connector configuration).
- Prepare USB access for your operating system:
- Windows: Install i-control for its USB driver, then close it before starting the connector. If the reader already uses a Zadig driver, see
usbiobelow. - macOS: Connect the reader by USB and leave
usbiounset to use libusb. - Linux: Have the host administrator create
/etc/udev/rules.d/99-tecan-infinite.ruleswith the line below. Runsudo udevadm control --reload-rules && sudo udevadm trigger, then unplug and reconnect the reader. Run the connector as your normal user.SUBSYSTEM=="usb", ATTRS{idVendor}=="0c47", MODE="0666"
This rule grants USB access to all Tecan devices with vendor id0c47on the host.lsusb -d 0c47:lists matching devices.
- Windows: Install i-control for its USB driver, then close it before starting the connector. If the reader already uses a Zadig driver, see
- Fill in the connector configuration:
Field Value simulation_modeDefaults to true: measurements return synthetic data and the reader does not move. Set tofalseto use the reader.deviceAvailable from connector version 0.2.0. Leave unset for automatic selection, or set the reader's USB product id ( 0x8001, decimal 32769, for the F200;0x8007, decimal 32775, for the M200 Pro).usbioLeave unset to use the vendor USB driver on Windows and libusb elsewhere. Set to falseon Windows if the reader was rebound with Zadig. Settingtrueoutside Windows prevents connection. - Start the connector with
simulation_modeset tofalseand enable platform connectivity. In GroundControl, inspect the instrument capabilities under Device Provider and note the service name for Python.
Simulation mode registers every module regardless of what is attached. With simulation_mode set to false, the connector registers only the modules the reader has: without a heater there is no TemperatureController; M-series readers have no FilterController. A read action appears only if the reader supports that measurement type. Readers with the same model name can differ. Check the modules in GroundControl or, once connected from Python, with print(reader.modules.keys()).
Under Measurement Controller in GroundControl, check whether Read Absorbance, Read Fluorescence Intensity, or both are available. For F-series readers, also run Get All Filter Definitions to find the installed filters for that read type.
First successful test
Sign in to the UniteLabs platform in the browser and open IDE. Create a notebook and paste each block into its own cell. The notebook signs in with your platform account, so the blocks need no credentials. If the first line, from unitelabs.sdk import AsyncApiClient, fails, the SDK is not installed on your tenant yet; ask your UniteLabs contact to install it.
Before running a script, extend the carrier and place a 96-well plate on it. In GroundControl, use Carrier Controller, then Extend. If you already have a connected Python variable named reader, you can instead run await reader.carrier_controller.extend(). The script retracts the carrier with the plate before it reads.
Select the tab for your type of reader below. Each script connects, retracts the carrier, and reads well A1. Adjust the measurement settings for your assay.
Replace the service name with the one shown in GroundControl. Keep all shown parameters explicit: omitting wells selects the whole plate.
Wavelengths and bandwidths are in nanometres. settle_time is in milliseconds; lag_time and integration_time are in microseconds.
Each script reads with the values of one installed filter. To let the script select the filter, use the F-series (automatic filter selection) tab.
Fluorescence intensity
Before you run the block:
- In GroundControl, run Measurement Controller, then Get All Filter Definitions.
- Pick the entry with
Usagefluorescence intensity. Copy itsExcitationWavelength,ExcitationBandwidth,EmissionWavelengthandEmissionBandwidthinto the call, in place of 430, 20, 535 and 25.
from unitelabs.sdk import AsyncApiClient
client = AsyncApiClient()
# "Tecan Infinite 200" is the service name you set in GroundControl
reader = await client.get_service_by_name(name="Tecan Infinite 200")
measurement = reader.measurement_controller
await reader.carrier_controller.retract()
print(await measurement.read_fluorescence_intensity(
excitation_wavelength=430, excitation_bandwidth=20, # ExcitationWavelength, ExcitationBandwidth
emission_wavelength=535, emission_bandwidth=25, # EmissionWavelength, EmissionBandwidth
mode="top", flashes=10, settle_time=0, gain_value=30, lag_time=0,
integration_time=20, plate_layout="96", wells=["A1"], z_position=0,
))
Expected: the carrier retracts. The read returns WellIds and Intensities for A1. Values that match no installed filter fail with a message that lists the installed filters.
Absorbance
Before you run the block:
- In GroundControl, run Measurement Controller, then Get All Filter Definitions.
- Pick the entry with
Usageabsorbance. Copy itsExcitationWavelengthandExcitationBandwidthinto the call, in place of 600 and 10. Without such an entry, the slide cannot read absorbance.
from unitelabs.sdk import AsyncApiClient
client = AsyncApiClient()
# "Tecan Infinite 200" is the service name you set in GroundControl
reader = await client.get_service_by_name(name="Tecan Infinite 200")
measurement = reader.measurement_controller
await reader.carrier_controller.retract()
print(await measurement.read_absorbance(
wavelength=600, bandwidth=10, # ExcitationWavelength, ExcitationBandwidth
reference_wavelength=0, flashes=10, settle_time=0, plate_layout="96", wells=["A1"],
))
Expected: the carrier retracts. The read returns WellIds and Absorbances for A1. reference_wavelength=0 disables reference correction.
Use this when you do not know what the slide carries. The script reads the filter list itself, takes the absorbance filter if there is one and otherwise the first fluorescence intensity filter, and reads with that filter's values.
from unitelabs.sdk import AsyncApiClient
client = AsyncApiClient()
# "Tecan Infinite 200" is the service name you set in GroundControl
reader = await client.get_service_by_name(name="Tecan Infinite 200")
measurement = reader.measurement_controller
filters = await measurement.get_all_filter_definitions()
abs_filter = next((f for f in filters if f["Usage"] == "absorbance"), None)
fi_filter = next((f for f in filters if f["Usage"] == "fluorescence intensity"), None)
await reader.carrier_controller.retract()
if abs_filter:
print("Absorbance with slot", abs_filter["Slot"])
print(await measurement.read_absorbance(
wavelength=abs_filter["ExcitationWavelength"],
bandwidth=abs_filter["ExcitationBandwidth"],
reference_wavelength=0, flashes=10, settle_time=0, plate_layout="96", wells=["A1"],
))
elif fi_filter:
print("Fluorescence intensity with slot", fi_filter["Slot"])
print(await measurement.read_fluorescence_intensity(
excitation_wavelength=fi_filter["ExcitationWavelength"],
excitation_bandwidth=fi_filter["ExcitationBandwidth"],
emission_wavelength=fi_filter["EmissionWavelength"],
emission_bandwidth=fi_filter["EmissionBandwidth"],
mode="top", flashes=10, settle_time=0, gain_value=30, lag_time=0,
integration_time=20, plate_layout="96", wells=["A1"], z_position=0,
))
else:
print("No absorbance or fluorescence intensity filter on the slide:", filters)
Expected: the script names the slot it picked, the carrier retracts, and the read returns WellIds with Absorbances or Intensities for A1. A slide without either filter type ends with the filter list instead of a read.
M-series readers select wavelengths with a monochromator. Use the example whose read action is available under Measurement Controller in GroundControl. The connector accepts 230 to 1000 nm for absorbance, 230 to 850 nm excitation and 280 to 850 nm emission for fluorescence intensity, with bandwidths from 0 to 50 nm.
Absorbance
Pick a wavelength and a bandwidth within the ranges above.
from unitelabs.sdk import AsyncApiClient
client = AsyncApiClient()
# "Tecan Infinite 200" is the service name you set in GroundControl
reader = await client.get_service_by_name(name="Tecan Infinite 200")
measurement = reader.measurement_controller
await reader.carrier_controller.retract()
print(await measurement.read_absorbance(
wavelength=600, reference_wavelength=0, bandwidth=10,
flashes=10, settle_time=0, plate_layout="96", wells=["A1"],
))
Expected: the carrier retracts. The read returns WellIds and Absorbances for A1. reference_wavelength=0 disables reference correction.
Fluorescence intensity
z_position is the measurement head height above the plate in micrometres; 20000 is the usual value on monochromator readers.
from unitelabs.sdk import AsyncApiClient
client = AsyncApiClient()
# "Tecan Infinite 200" is the service name you set in GroundControl
reader = await client.get_service_by_name(name="Tecan Infinite 200")
measurement = reader.measurement_controller
await reader.carrier_controller.retract()
print(await measurement.read_fluorescence_intensity(
excitation_wavelength=485, excitation_bandwidth=9,
emission_wavelength=535, emission_bandwidth=20,
mode="top", flashes=10, settle_time=0, gain_value=30, lag_time=0,
integration_time=20, plate_layout="96", wells=["A1"], z_position=20000,
))
Expected: the carrier retracts. The read returns WellIds and Intensities for A1.
From your own IDE
You can also write the code on your own computer, for example to turn it into a workflow that runs on the platform. This needs a development machine with the SDK installed and authenticated, which includes API client credentials in a .env file.
A Python file cannot use await at the top level. Put the lines of a block into an async function and start it with asyncio, as in Send your first request:
import asyncio
from dotenv import load_dotenv
from unitelabs.sdk import AsyncApiClient
async def main():
client = AsyncApiClient()
reader = await client.get_service_by_name(name="Tecan Infinite 200")
... # the remaining lines of the block, indented
if __name__ == "__main__":
load_dotenv()
asyncio.run(main())
To run the code on the platform, package it as a workflow. Automate your workflows writes a workflow in one file and runs it locally, and Deploy a workflow ships it to the platform.
Known quirks and errors
| You see | It means | Do this |
|---|---|---|
| Calls succeed, but the reader never moves | Simulation mode is on. | Set simulation_mode to false and restart the connector. |
| Permission denied on Linux | The connector lacks USB access. | Apply the udev rule above, reload the rules and reconnect the reader. |
| No device found on Windows | The connector cannot find the reader through the selected USB driver. | Check that the reader is powered on and connected by USB. Then check the driver and usbio setting above. |
No Fluorescence Intensity (FI) filter defined at ... or No Absorbance (ABS) filter defined at ..., ending in Installed filters: ... | F-series: no installed filter has exactly the wavelength and bandwidth you passed, or none is defined for that read type. | Use the values the message lists, or call get_all_filter_definitions(). |
Value '...' is not in the set of allowed values., or a value reported as outside its range | The named parameter is outside the reader's allowed values. | Check that parameter's constraints in GroundControl. For M-series wavelengths and bandwidths, use the ranges above. |
Command execution not accepted: '...ReadFluorescenceIntensity' is already executing. | A read is still running. Closing the script or notebook cell does not stop it. | Wait, or run await reader.measurement_controller.stop_reading(). |
The reader is busy with a different operation (e.g. shaking or reading), wait for it to finish. | Another operation is running. | Wait for it to finish. To end a shake, run await reader.shaker_controller.stop(). |
A filter message with excitation wavelengths of 0, for example Installed filters: 0/20 nm ex, 535/25 nm em, ... | F-series: this can occur when a read starts with the carrier out. | Run await reader.carrier_controller.retract() and read again. |
filter_controller.subscribe_is_inserted() reports whether the slide is in.More snippets
- Unload the plate:
await reader.carrier_controller.extend()after a completed read. - Stop a read:
await reader.measurement_controller.stop_reading(). - Choose wells: pass
["A1"], a list, a range such as["A1-C7"], or["ALL"]. Results follow plate order. Pair returnedWellIdswith returnedIntensitiesorAbsorbances. - Watch the reader:
device_provider.subscribe_state(),carrier_controller.subscribe_is_extended()and, on F-series readers,filter_controller.subscribe_is_inserted()report current state when you subscribe, then updates. Measurement streamssubscribe_fluorescence_intensity_readings()andsubscribe_absorbance_readings()emit values as each plate row completes. - Plate layouts: set
plate_layoutto"96","384"or"custom". Define a custom layout first withdefine_custom_plate_layout()under Measurement Controller. - Shake: if Shaker Controller is available,
await reader.shaker_controller.start(mode="orbital", amplitude=2.0, duration=10)shakes for 10 seconds at a 2 mm amplitude and returns when finished. - Heat: on readers with a heater, the temperature controller offers
start,stopand a target temperature up to 42 °C. Its sensor reports the target, with no live temperature read-back. - Timing: on an F200, fluorescence at 25 flashes and 20 microseconds integration takes about 15 s for three wells and 85 s for 96 wells through the platform. Timing varies with the reader and settings.
One read handles one wavelength, or one excitation and emission pair; there is no spectral-scan action. For multiple wavelengths, run separate reads at the settings you need.
Connector reference
print(reader.modules.keys()) and print(reader.measurement_controller.actions.keys()).Vendor documentation
Tecan's i-control Instructions for Use covers operating the reader through the vendor software. Use the instrument's own manual for operating limits, plate handling, maintenance and safety. This page covers the UniteLabs connection and first Python read.
Last updated