Calculation Formulas
Calculation Formulas are the building blocks for defining features, which in turn are the building blocks of protocols. One of the primary goals of Phaedra is to provide a flexible platform onto which diverse types of calculation can be defined and performed. To this end, all calculations are modelled into formulas that are clearly defined and controlled through a unique name and version number. Making any kind of change to the formula will result in a new version being generated, and in protocols and resultsets you will always see which version of a formula was used to obtain a calculation result.
The Formula Model
A Calculation Formula has several standard properties, such as a name, description and version number. In addition, it has three settings that together define what kind of calculation the formula can perform.
Language
Is the programming language in which the formula is written.
Currently, two languages are supported: R
and JavaStat
. Future updates will bring support for additional languages
such as Python
and JavaScript
.
Scope
This setting determines how many output values the formula is expected to return.
PLATE
indicates that the formula should return one value per whole plate. This scope is used in plate statistic formulas.WELL
indicates that the formula should return one value per well. This scope is typically used in feature calculation formulas.
Formula
The formula can be written in any one of the supported languages, and is expected to return one or multiple output values, depending on the selected scope. The formula will automatically receive a number of input variables that it can use during its execution.
The table below lists the input variables a formula will receive when configured in the R
language and WELL
scope:
Variable Name | Type | Description |
---|---|---|
input$wellNumbers |
Vector, length is the number of wells in the plate | A vector of numeric values representing the well numbers. |
input$wellTypes |
Vector, length is the number of wells in the plate | A vector of character values representing the well types. |
input$wellRows |
Vector, length is the number of wells in the plate | A vector of numeric values representing the well row numbers. |
input$wellColumns |
Vector, length is the number of wells in the plate | A vector of numeric values representing the well column numbers. |
input$wellStatus |
Vector, length is the number of wells in the plate | A vector of numeric values representing the well status codes. If the value is <0, the well is rejected. |
input$lowWellType |
Character value | The Low Control welltype code as defined in the protocol |
input$highWellType |
Character value | The High Control welltype code as defined in the protocol |
Note: all well-based vectors have the same order.
In addition, if the formula is used for a feature in a protocol, it may define extra variables simply by referencing them from the input
object.
For example:
# This formula computes a %EFFECT normalization using LC and HC controls
lcMedian <- median(input$rawValue[input$wellStatus >= 0 & input$wellTypes == 'LC'], na.rm = TRUE)
hcMedian <- median(input$rawValue[input$wellStatus >= 0 & input$wellTypes == 'HC'], na.rm = TRUE)
output <- 100 * ((input$rawValue - lcMedian) / (hcMedian - lcMedian))
This formula uses several input variables such as input$wellStatus
and input$wellTypes
, but it also references a variable that is not defined in the table above: input$rawValue
.
When this formula is selected for use in a feature, a source for this rawValue
must be configured:
Here, a measurement well column named CellCount_AllRetained
will be used to provide a vector of values for the input$rawValue
variable in the formula.
As you can see, the same formula can be used repeatedly in other features (even other protocols) to compute the same thing, but using other measurement columns or features as rawValue
.
When using a measurement subwell column as the source, the variable will contain a list of vectors. Use the well number to index into the list and get a vector of values, one per cell.
For example, the expression mean(input$rawValues[[5]])
would return the mean value of all subwell items for well nr 5.