diff --git a/shared-data/liquid-class/fixtures/fixture_glycerol50.json b/shared-data/liquid-class/fixtures/fixture_glycerol50.json new file mode 100644 index 00000000000..fd655c66a61 --- /dev/null +++ b/shared-data/liquid-class/fixtures/fixture_glycerol50.json @@ -0,0 +1,241 @@ +{ + "liquidName": "Glycerol 50%", + "schemaVersion": 1, + "namespace": "opentrons", + "byPipette": [ + { + "pipetteModel": "p20_single_gen2", + "byTipType": [ + { + "tipType": "p20_tip", + "aspirate": { + "submerge": { + "positionReference": "liquid-meniscus", + "offset": { + "x": 0, + "y": 0, + "z": -5 + }, + "speed": 100, + "delay": { + "enable": true, + "params": { + "duration": 1.5 + } + } + }, + "retract": { + "positionReference": "well-top", + "offset": { + "x": 0, + "y": 0, + "z": 5 + }, + "speed": 100, + "airGapByVolume": { + "default": 2, + "5": 3, + "10": 4 + }, + "touchTip": { + "enable": true, + "params": { + "zOffset": 2, + "mmToEdge": 1, + "speed": 50 + } + }, + "delay": { + "enable": true, + "params": { + "duration": 1 + } + } + }, + "positionReference": "well-bottom", + "offset": { + "x": 0, + "y": 0, + "z": -5 + }, + "flowRateByVolume": { + "default": 50, + "10": 40, + "20": 30 + }, + "preWet": true, + "mix": { + "enable": true, + "params": { + "repetitions": 3, + "volume": 15 + } + }, + "delay": { + "enable": true, + "params": { + "duration": 2 + } + } + }, + "singleDispense": { + "submerge": { + "positionReference": "liquid-meniscus", + "offset": { + "x": 0, + "y": 0, + "z": -5 + }, + "speed": 100, + "delay": { + "enable": true, + "params": { + "duration": 1.5 + } + } + }, + "retract": { + "positionReference": "well-top", + "offset": { + "x": 0, + "y": 0, + "z": 5 + }, + "speed": 100, + "airGapByVolume": { + "default": 2, + "5": 3, + "10": 4 + }, + "blowout": { + "enable": true, + "params": { + "location": "trash", + "flowRate": 100 + } + }, + "touchTip": { + "enable": true, + "params": { + "zOffset": 2, + "mmToEdge": 1, + "speed": 50 + } + }, + "delay": { + "enable": true, + "params": { + "duration": 1 + } + } + }, + "positionReference": "well-bottom", + "offset": { + "x": 0, + "y": 0, + "z": -5 + }, + "flowRateByVolume": { + "default": 50, + "10": 40, + "20": 30 + }, + "mix": { + "enable": true, + "params": { + "repetitions": 3, + "volume": 15 + } + }, + "pushOutByVolume": { + "default": 5, + "10": 7, + "20": 10 + }, + "delay": 1 + }, + "multiDispense": { + "submerge": { + "positionReference": "liquid-meniscus", + "offset": { + "x": 0, + "y": 0, + "z": -5 + }, + "speed": 100, + "delay": { + "enable": true, + "params": { + "duration": 1.5 + } + } + }, + "retract": { + "positionReference": "well-top", + "offset": { + "x": 0, + "y": 0, + "z": 5 + }, + "speed": 100, + "airGapByVolume": { + "default": 2, + "5": 3, + "10": 4 + }, + "touchTip": { + "enable": true, + "params": { + "zOffset": 2, + "mmToEdge": 1, + "speed": 50 + } + }, + "delay": { + "enable": true, + "params": { + "duration": 1 + } + }, + "blowout": { + "enable": false + } + }, + "positionReference": "well-bottom", + "offset": { + "x": 0, + "y": 0, + "z": -5 + }, + "flowRateByVolume": { + "default": 50, + "10": 40, + "20": 30 + }, + "mix": { + "enable": true, + "params": { + "repetitions": 3, + "volume": 15 + } + }, + "conditioningByVolume": { + "default": 10, + "5": 5 + }, + "disposalByVolume": { + "default": 2, + "5": 3 + }, + "delay": { + "enable": true, + "params": { + "duration": 1 + } + } + } + } + ] + } + ] +} diff --git a/shared-data/liquid-class/schemas/1.json b/shared-data/liquid-class/schemas/1.json new file mode 100644 index 00000000000..6af0ff9babe --- /dev/null +++ b/shared-data/liquid-class/schemas/1.json @@ -0,0 +1,480 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "opentronsLiquidClassSchemaV1", + "title": "Liquid Class Schema", + "description": "Schema for defining a single liquid class's properties for liquid handling functions.", + "type": "object", + "definitions": { + "positiveNumber": { + "type": "number", + "minimum": 0 + }, + "safeString": { + "description": "A string safe to use for namespace. Lowercase-only.", + "type": "string", + "pattern": "^[a-z0-9._]+$" + }, + "delay": { + "type": "object", + "properties": { + "enable": { + "type": "boolean", + "description": "Whether delay is enabled." + }, + "params": { + "type": "object", + "properties": { + "duration": { + "#ref": "#/definitions/positiveNumber", + "description": "Duration of delay, in seconds." + } + }, + "required": ["duration"], + "additionalProperties": false + } + }, + "required": ["enable"], + "additionalProperties": false + }, + "positionReference": { + "type": "string", + "description": "Reference point for positioning.", + "enum": ["well-bottom", "well-top", "well-center", "liquid-meniscus"] + }, + "coordinate": { + "type": "object", + "description": "3-dimensional coordinate.", + "properties": { + "x": { + "type": "number" + }, + "y": { + "type": "number" + }, + "z": { + "type": "number" + } + }, + "required": ["x", "y", "z"], + "additionalProperties": false + }, + "touchTip": { + "type": "object", + "description": "Shared properties for the touch-tip function.", + "properties": { + "enable": { + "type": "boolean", + "description": "Whether touch-tip is enabled." + }, + "params": { + "type": "object", + "properties": { + "zOffset": { + "type": "number", + "description": "Offset from the top of the well for touch-tip, in millimeters." + }, + "mmToEdge": { + "type": "number", + "description": "Offset away from the the well edge, in millimeters." + }, + "speed": { + "$ref": "#/definitions/positiveNumber", + "description": "Touch-tip speed, in millimeters per second." + } + }, + "required": ["zOffset", "mmToEdge", "speed"], + "additionalProperties": false + } + }, + "required": ["enable"], + "additionalProperties": false + }, + "airGapByVolume": { + "type": "object", + "description": "Settings for air gap keyed by target aspiration volume.", + "properties": { + "default": { "$ref": "#/definitions/positiveNumber" } + }, + "patternProperties": { + "d+": { "$ref": "#/definitions/positiveNumber" } + }, + "required": ["default"] + }, + "flowRateByVolume": { + "type": "object", + "description": "Settings for flow rate keyed by target aspiration/dispense volume.", + "properties": { + "default": { "$ref": "#/definitions/positiveNumber" } + }, + "patternProperties": { + "d+": { "$ref": "#/definitions/positiveNumber" } + }, + "required": ["default"] + }, + "pushOutByVolume": { + "type": "object", + "description": "Settings for pushout keyed by target aspiration volume.", + "properties": { + "default": { "$ref": "#/definitions/positiveNumber" } + }, + "patternProperties": { + "d+": { "$ref": "#/definitions/positiveNumber" } + }, + "required": ["default"] + }, + "disposalByVolume": { + "type": "object", + "description": "Settings for disposal volume keyed by target dispense volume.", + "properties": { + "default": { "$ref": "#/definitions/positiveNumber" } + }, + "patternProperties": { + "d+": { "$ref": "#/definitions/positiveNumber" } + }, + "required": ["default"] + }, + "conditioningByVolume": { + "type": "object", + "description": "Settings for conditioning volume keyed by target dispense volume.", + "properties": { + "default": { "$ref": "#/definitions/positiveNumber" } + }, + "patternProperties": { + "d+": { "$ref": "#/definitions/positiveNumber" } + }, + "required": ["default"] + }, + "mix": { + "type": "object", + "description": "Mixing properties.", + "properties": { + "enable": { + "type": "boolean", + "description": "Whether mix is enabled." + }, + "params": { + "type": "object", + "properties": { + "repetitions": { + "type": "integer", + "description": "Number of mixing repetitions.", + "minimum": 0 + }, + "volume": { + "$ref": "#/definitions/positiveNumber", + "description": "Volume used for mixing, in microliters." + } + }, + "required": ["repetitions", "volume"], + "additionalProperties": false + } + }, + "required": ["enable"], + "additionalProperties": false + }, + "blowout": { + "type": "object", + "description": "Blowout properties.", + "properties": { + "enable": { + "type": "boolean", + "description": "Whether blow-out is enabled." + }, + "params": { + "type": "object", + "properties": { + "location": { + "type": "string", + "enum": ["source", "destination", "trash"], + "description": "Location well or trash entity for blow out." + }, + "flowRate": { + "$ref": "#/definitions/positiveNumber", + "description": "Flow rate for blow out, in microliters per second." + } + }, + "required": ["location", "flowRate"] + } + }, + "required": ["enable"], + "additionalProperties": false + }, + "submerge": { + "type": "object", + "description": "Shared properties for the submerge function before aspiration or dispense.", + "properties": { + "positionReference": { + "$ref": "#/definitions/positionReference" + }, + "offset": { + "$ref": "#/definitions/coordinate" + }, + "speed": { + "$ref": "#/definitions/positiveNumber", + "description": "Speed of submerging, in millimeters per second." + }, + "delay": { + "$ref": "#/definitions/delay" + } + }, + "required": ["positionReference", "offset", "speed", "delay"], + "additionalProperties": false + }, + "retractAspirate": { + "type": "object", + "description": "Shared properties for the retract function after aspiration or dispense.", + "properties": { + "positionReference": { + "$ref": "#/definitions/positionReference" + }, + "offset": { + "$ref": "#/definitions/coordinate" + }, + "speed": { + "$ref": "#/definitions/positiveNumber", + "description": "Speed of retraction, in millimeters per second." + }, + "airGapByVolume": { + "$ref": "#/definitions/airGapByVolume" + }, + "touchTip": { + "$ref": "#/definitions/touchTip" + }, + "delay": { + "$ref": "#/definitions/delay" + } + }, + "required": [ + "positionReference", + "offset", + "speed", + "airGapByVolume", + "delay" + ], + "additionalProperties": false + }, + "retractDispense": { + "type": "object", + "description": "Shared properties for the retract function after aspiration or dispense.", + "properties": { + "positionReference": { + "$ref": "#/definitions/positionReference" + }, + "offset": { + "$ref": "#/definitions/coordinate" + }, + "speed": { + "$ref": "#/definitions/positiveNumber", + "description": "Speed of retraction, in millimeters per second." + }, + "airGapByVolume": { + "$ref": "#/definitions/airGapByVolume" + }, + "blowout": { + "$ref": "#/definitions/blowout" + }, + "touchTip": { + "$ref": "#/definitions/touchTip" + }, + "delay": { + "$ref": "#/definitions/delay" + } + }, + "required": [ + "positionReference", + "offset", + "speed", + "airGapByVolume", + "blowout", + "touchTip", + "delay" + ], + "additionalProperties": false + }, + "aspirateParams": { + "type": "object", + "description": "Parameters specific to the aspirate function.", + "properties": { + "submerge": { + "$ref": "#/definitions/submerge" + }, + "retract": { + "$ref": "#/definitions/retractAspirate" + }, + "positionReference": { + "$ref": "#/definitions/positionReference" + }, + "offset": { + "$ref": "#/definitions/coordinate" + }, + "flowRateByVolume": { + "$ref": "#/definitions/flowRateByVolume" + }, + "preWet": { + "type": "boolean", + "description": "Whether to perform a pre-wet action." + }, + "mix": { + "$ref": "#/definitions/mix" + }, + "delay": { + "$ref": "#/definitions/delay" + } + }, + "required": [ + "submerge", + "retract", + "positionReference", + "offset", + "flowRateByVolume", + "preWet", + "mix", + "delay" + ], + "additionalProperties": false + }, + "singleDispenseParams": { + "type": "object", + "description": "Parameters specific to the single-dispense function.", + "properties": { + "submerge": { + "$ref": "#/definitions/submerge" + }, + "retract": { + "$ref": "#/definitions/retractDispense" + }, + "positionReference": { + "$ref": "#/definitions/positionReference" + }, + "offset": { + "$ref": "#/definitions/coordinate" + }, + "flowRateByVolume": { + "$ref": "#/definitions/flowRateByVolume" + }, + "mix": { + "$ref": "#/definitions/mix" + }, + "pushOutByVolume": { + "$ref": "#/definitions/pushOutByVolume" + }, + "delay": { + "$ref": "#/definitions/positiveNumber", + "description": "Delay after dispense, in seconds." + } + }, + "required": [ + "submerge", + "retract", + "positionReference", + "offset", + "flowRateByVolume", + "mix", + "pushOutByVolume", + "delay" + ], + "additionalProperties": false + }, + "multiDispenseParams": { + "type": "object", + "description": "Parameters specific to the multi-dispense function.", + "properties": { + "submerge": { + "$ref": "#/definitions/submerge" + }, + "retract": { + "$ref": "#/definitions/retractDispense" + }, + "positionReference": { + "$ref": "#/definitions/positionReference" + }, + "offset": { + "$ref": "#/definitions/coordinate" + }, + "flowRateByVolume": { + "$ref": "#/definitions/flowRateByVolume" + }, + "mix": { + "$ref": "#/definitions/mix" + }, + "conditioningByVolume": { + "$ref": "#/definitions/conditioningByVolume" + }, + "disposalByVolume": { + "$ref": "#/definitions/disposalByVolume" + }, + "delay": { + "$ref": "#/definitions/delay" + } + }, + "required": [ + "submerge", + "retract", + "positionReference", + "offset", + "flowRateByVolume", + "mix", + "conditioningByVolume", + "disposalByVolume", + "delay" + ], + "additionalProperties": false + } + }, + "properties": { + "liquidName": { + "type": "string", + "description": "The name of the liquid (e.g., water, ethanol, serum)." + }, + "schemaVersion": { + "description": "Which schema version a liquid class is using", + "type": "number", + "enum": [1] + }, + "namespace": { + "$ref": "#/definitions/safeString" + }, + "byPipette": { + "type": "array", + "description": "Liquid class settings by each pipette compatible with this liquid class.", + "items": { + "type": "object", + "description": "The settings for a specific kind of pipette when interacting with this liquid class", + "properties": { + "pipetteModel": { + "type": "string", + "description": "The pipette model this applies to" + }, + "byTipType": { + "type": "array", + "description": "Settings for each kind of tip this pipette can use", + "items": { + "type": "object", + "properties": { + "tipType": { + "type": "string", + "description": "The tip type whose properties will be used when handling this specific liquid class with this pipette" + }, + "aspirate": { + "$ref": "#/definitions/aspirateParams" + }, + "singleDispense": { + "$ref": "#/definitions/singleDispenseParams" + }, + "multiDispense": { + "$ref": "#/definitions/multiDispenseParams" + } + }, + "required": ["tipType", "aspirate", "singleDispense"], + "additionalProperties": false + } + } + }, + "required": ["pipetteModel", "byTipType"], + "additionalProperties": false + } + } + }, + "required": ["liquidName", "schemaVersion", "namespace", "byPipette"], + "additionalProperties": false +}