This is a simple browser tool which can be used to generate labware definitions for regular labware (labware that is laid out on a grid, and where all wells have consistent dimensions), or irregular labware.
This is a geometric sense of the word "regular". A labware in which:
- grid shape is uniform (a single regular grid, where each column and each row has a consistent number of wells)
- spacing between columns and rows remains consistent throughout the labware
- the overall height remains consistent throughout the labware
Any labware that does not meet the criteria of 'regular'. A labware is irregular if it has:
- more than one grid defining the x-y position of wells (such as a diamond arrangement)
- differing well dimensions (depth, diameter, shape, etc)
- differing numbers of wells from row to row or column to column
- any other dimensional irregularity
First you should make sure that you run make install
within the opentrons
top level folder.
If you are up-to-date on all other directories you can simply run yarn
instead.
Next you have two options:
- From the top level folder type:
make -C labware-designer dev
- Open your browser and type in:
localhost:8080
OR
- From the top level folder type:
make -C labware-designer
- Open
labware-designer/dist/index.html
in your browser
- In the browser window, open the console (in Chrome, right click in the middle of the page, select "Inspect" and then select the "Console" tab--other browsers vary but are similar).
- In the console, you can use the global variable
sharedData
and use any public functions which are exported in that project.
The generator has the following functions:
sharedData.createRegularLabware
- Generate regular labware definitionsharedData.createIrregularLabware
- Generate irrgular labware definition
To build a regular labware, the options
object should have the following shape:
field | type | required | description |
---|---|---|---|
metadata |
Metadata | yes | Information about the labware |
parameters |
Parameters | yes | Parameters that affect labware functionality |
dimensions |
Dimensions | yes | Overall dimensions of the labware |
offset |
Offset | yes | Distance from labware's top-left corner to well A1 |
grid |
Grid | yes | Number of rows and columns of wells |
spacing |
Spacing | yes | Distance between rows and columns |
well |
Well | yes | Well parameters |
brand |
Brand | no | Labware manufacturer ("generic" if omitted) |
This example generates generic_96_wellplate_380_ul.json:
const options = {
metadata: {
displayName: 'ANSI 96 Standard Microplate',
displayCategory: 'wellPlate',
displayVolumeUnits: 'µL',
tags: ['flat', 'microplate', 'SBS', 'ANSI', 'generic'],
},
parameters: {
format: '96Standard',
isTiprack: false,
isMagneticModuleCompatible: false,
},
offset: { x: 14.38, y: 11.24, z: 14.35 },
dimensions: {
overallLength: 127.76,
overallWidth: 85.48,
overallHeight: 14.35,
},
grid: { row: 8, column: 12 },
spacing: { row: 9, column: 9 },
well: {
depth: 10.54,
shape: 'circular',
diameter: 6.4,
totalLiquidVolume: 380,
},
brand: { brand: 'generic' },
}
const labware = sharedData.createRegularLabware(options)
To build an irregular labware, the options
object should have the following shape:
field | type | required | description |
---|---|---|---|
metadata |
Metadata | yes | Information about the labware |
parameters |
Parameters | yes | Parameters that affect labware functionality |
dimensions |
Dimensions | yes | Overall dimensions of the labware |
offset |
Array<Offset > | yes | Distances from labware's top-left corner to first well of each grid |
grid |
Array<Grid> | yes | Number of rows and columns per grid |
spacing |
Array<Spacing> | yes | Distance between rows and columns per grid |
well |
Array<Well> | yes | Well parameters per grid |
gridStart |
Array<GridStart> | yes | Well naming scheme per grid |
brand |
Brand | no | Labware manufacturer ("generic" if omitted) |
This example generates opentrons_6x15_ml_4x50_ml_tuberack.json
const options = {
metadata: {
displayName: 'Opentrons 6x15mL 4x50mL tube rack',
displayCategory: 'tubeRack',
displayVolumeUnits: 'mL',
tags: ['opentrons', 'modular', 'tuberack', '15', 'mL', '50'],
},
parameters: {
format: 'irregular',
isTiprack: false,
isMagneticModuleCompatible: false,
},
dimensions: {
overallLength: 127.75,
overallWidth: 85.5,
overallHeight: 123.76,
},
offset: [{ x: 13.88, y: 17.75, z: 123.76 }, { x: 71.38, y: 25.25, z: 119.8 }],
grid: [{ row: 3, column: 2 }, { row: 2, column: 2 }],
spacing: [{ row: 25, column: 25 }, { row: 35, column: 35 }],
well: [
{
totalLiquidVolume: 15000,
diameter: 14.5,
shape: 'circular',
depth: 117.98,
},
{
totalLiquidVolume: 50000,
diameter: 26.45,
shape: 'circular',
depth: 113.85,
},
],
gridStart: [
{ rowStart: 'A', colStart: '1', rowStride: 1, colStride: 1 },
{ rowStart: 'A', colStart: '3', rowStride: 1, colStride: 1 },
],
brand: { brand: 'Opentrons', brandId: ['352096', '352070'] },
}
const labware = sharedData.createIrregularLabware(options)
Metadata that affects how the labware is displayed to the user but does not affect labware functionality.
Example:
const metadata = {
displayName: 'ANSI 96 Standard Microplate',
displayCategory: 'wellPlate',
displayVolumeUnits: 'uL', // u will be converted to µ
tags: ['flat', 'microplate', 'SBS', 'ANSI', 'generic'],
}
Fields:
field | type | required | description |
---|---|---|---|
displayName | string | yes | Human-readable labware name |
displayCategory | enum | yes | Labware category in the library (see below) |
displayVolumeUnits | enum | no | Volume units to use for display (default µL) |
tags | Array<string> | no | List of strings to use as search tags |
displayName
is the name of the labware in the Opentrons App, Protocol Designer, and other client appsdisplayCategory
must be one of:wellPlate
tubeRack
tipRack
trough
trash
other
displayVolumeUnits
is the units scale to use in the labware load name and app display; defaults toµL
and must be one of:µL
mL
L
tags
is a list of generic words that a user may search for to find the labware
Parameters that affect how the labware is operated on by the robot
Example:
const parameters = {
format: '96Standard',
isTiprack: false,
isMagneticModuleCompatible: false,
}
Fields:
field | type | required | description |
---|---|---|---|
format | enum | yes | Labware format for pipette access (see below) |
isTiprack | boolean | yes | Whether or not labware is a tiprack |
tipLength | number | no | Length of tips in rack; required if isTiprack: true |
isMagneticModuleCompatible | boolean | yes | Whether labware can be with the Magnetic Module |
magneticModuleEngageHeight | number | no | Engagement height for Magnetic Module use; required if isMagneticModuleCompatible: true |
format
is determines how a multichannel pipette may interact with the labwareirregular
- any type of container a multichannel cannot access; e.g. most tuberacks, irregular labware, etc96Standard
- any labware with an 8x12 grid, well plate or tiprack384Standard
- any labware with a 16x24 grid, well plate or tipracktrough
- labware where all tips of a multichannel access a single well simultaneously
isTiprack
specifies that the labware is a tiprack and all wells are tipstipLength
specifies the length of the tips ifisTiprack
istrue
isMagneticModuleCompatible
specifies that the labware can be used on the Magnetic ModulemagneticModuleEngageHeight
specifies the height at which the Magnetic Module should engage ifisMagneticModuleCompatible
istrue
Note: the full schema for labwareDefinition.parameters
also inlcudes parameters.loadName
. This field should not be set by the user; the program will generate it automatically and insert it into the definition:
loadName = `${brand}_${numWells}_${displayCategory}_${totalVol}_${displayVolumeUnits}`.toLowerCase()
Properties to apply to every well in a given grid.
Example:
const well = {
depth: 10.54,
shape: 'circular',
diameter: 6.4,
totalLiquidVolume: 380,
}
Fields:
field | type | required | description |
---|---|---|---|
depth | number | yes | Depth of the well in mm |
shape | enum | yes | rectangular or circular |
totalLiquidVolume | number | yes | Volume of the well in µL |
diameter | number | no | Diameter of the well in mm; required if shape: 'circular' |
length | number | no | Length (x-axis) of the well in mm; required if shape: 'rectangular' |
width | number | no | Width (y-axis) of the well in mm; required if shape: 'rectangular' |
totalLiquidVolume
must be specified in µL. The generator will convert the value in µL to metadata.displayVolumeUnits
for the loadName
.
Note: The full well schema includes x
, y
, and z
fields, but they should not be set by the user. The generator functions will calculate well positions.
The number of rows and columns in a regular labware or irregular labware grid
Example:
const grid = {
row: 8,
column: 12,
}
Fields:
field | type | required | description |
---|---|---|---|
row | number | yes | Number of rows (running down the y-axis) |
column | number | yes | Number of columns (running down the x-axis) |
Center-to-center distance in mm between rows and columns in a regular labware or irregular labware grid
Example:
const spacing = {
row: 9,
column: 9,
}
Fields:
field | type | required | description |
---|---|---|---|
row | number | yes | Center-to-center distance in mm between rows |
column | number | yes | Center-to-center distance in mm between columns |
The distance in mm from the upper left corner of the labware, flush with the deck to the top-center of well A1
(or the first well in an irregular labware grid).
Example:
const offset = {
x: 14.38,
y: 11.24,
z: 14.35,
}
Fields:
field | type | required | description |
---|---|---|---|
x | number | yes | X-axis distance in mm |
y | number | yes | Y-axis distance in mm |
z | number | yes | Z-axis distance in mm |
Overall dimensions in mm of the labware
Example:
const dimensions = {
overallLength: 127.76,
overallWidth: 85.48,
overallHeight: 14.35,
}
Fields:
field | type | required | description |
---|---|---|---|
overallLength | number | yes | X-axis measurement in mm |
overallWidth | number | yes | Y-axis measurement in mm |
overallHeight | number | yes | Z-axis measurement in mm |
overallLength
is the outer dimension of the labware in the X-axis- Usually equal to the length of the slot (127.76 mm)
overallWidth
is the outer dimension of the labware in the Y-axis- Usually equal to the width of the slot (85.48 mm)
overallHeight
is the outer dimension of the labware in the Z-axis- Usually the same as the top the well
- Can be higher in case of some kind of vertical protrusion.
Used to generate well names for irregular labware. The object represents creating a "range" of well names with step intervals included. For example, starting at well "A1" with a column stride of 2 would result in the grid names being ordered as: "A1", "B1", ...; "A3", "B3", ...; etc.
Example:
// if grid has 3 rows and 3 columns, will produce the following well names:
// B2 B4 B6
// C2 C4 C6
// D2 D4 D6
const gridStart = {
rowStart: 'B',
colStart: '2',
rowStride: 1,
colStride: 2,
}
Fields:
field | type | required | description |
---|---|---|---|
rowStart | string | yes | Row name to start the grid at |
colStart | string | yes | Column name to start the grid at |
rowStride | number | yes | How much to increment the row name when it rolls over |
colStride | number | yes | How much to increment the column when it rolls over |
Brand information for the labware
Example:
const brand = {
brand: 'Opentrons',
brandId: ['352096', '352070'],
}
Fields:
field | type | required | description |
---|---|---|---|
brand | string | yes | Manufacturer/brand name |
brandId | Array | no | Matching product IDs |
If a brand
object not input, the resulting definition will have: "brand": {"brand": "generic"}
.
See diagram below: