Groups and Plate Selectors
Groups represent flat, ordered sets of container references.
They are used for batch transfer, environment targets, and batch readout. They are foundation syntax for addressing many containers, not a separate workflow family.
Explicit Groups
text
let g = group([well_a, well_b, well_c]);Groups are one-level structures. Nested groups are not supported.
Plate Selectors
Plate selectors create groups of wells from a plate-like reference.
text
let row = plate[A1:A12];
let block = plate[A1:D6];
let mix = plate[A1:A6, C1:C6];Selector order is stable. Ranges are row-major, and unions follow region order.
Batch Transfer
A scalar source and quantity can broadcast to a group target:
text
row << [stock:5uL];Ordered mapping uses series(...):
text
let three_wells = group([well_a, well_b, well_c]);
three_wells << [series(stock, [1uL, 2uL, 3uL])];The number of series values must match the group size.
Batch Environment
text
with env(thermal = 37C, duration = 10min) {
hold(sample = row);
}Batch Readout
text
let obs = img(sample = row, quantity = fluorescence);Batch readout returns a data_group_ref aligned with input group order.
Selector Rules
- Duplicate wells are rejected after selector normalization.
- Out-of-range coordinates are rejected.
- A selector belongs to one carrier.
- Plate selectors are a way to construct well groups; they are not a separate runtime object kind.
