/**
* Roboliq: Automation for liquid-handling robots
* @copyright 2017, ETH Zurich, Ellis Whitehead
* @license GPL-3.0
*/
/**
* Helper functions for simulating measurements.
* @module commands/simulatedHelpers
*/
var _ = require('lodash');
import math from 'mathjs';
var commandHelper = require('../commandHelper.js');
const Design = require('../design.js');
import wellsParser from '../parsers/wellsParser.js';
export function simulatedByWells(parsed, data, wells0, result) {
// console.log(JSON.stringify(parsed, null, '\t'))
// console.log({SCOPE: data.objects.SCOPE})
let simulatedOutput;
if (_.has(parsed.value, ["output", "simulated"])) {
const joinKey = _.get(parsed.value, ["output", "joinKey"]);
const userValues = _.get(parsed.value, ["output", "userValues"], {});
const wells = _.uniq(_.map(wells0, x => x.replace(/.*\(([^)]*)\)/, "$1")));
const common = (_.isEmpty(joinKey)) ? data.objects.SCOPE : {};
// console.log({common})
// console.log("DATA:\n"+JSON.stringify(data.objects.DATA))
simulatedOutput = _.map(wells, (well, i) => {
const row0 = (!_.isUndefined(joinKey))
? _.find(data.objects.DATA, row => (row[joinKey].replace(/.*\(([^)]*)\)/, "$1") === well)) || {}
: common;
const scope = _.defaults({}, row0, data.objects.SCOPE);
// console.log({i, row0, simulated: parsed.value.output.simulated})
const value = Design.calculate(parsed.value.output.simulated, scope);
const row = _.merge({RUNID: "simulated", object: parsed.objectName.object}, row0, userValues, {well, value_type: "absorbance", value});
// console.log("row: "+JSON.stringify(row))
return row;
});
if (_.has(parsed.value, ["output", "units"])) {
_.forEach(simulatedOutput, row => {
_.forEach(parsed.value.output.units, (units, key) => {
if (_.has(row, key)) {
// console.log(row)
// console.log({key, units, value: row[key]});
// console.log({a: math.eval(row[key])})
row[key] = math.eval(row[key]).toNumber(units);
}
});
});
}
}
if (simulatedOutput) {
if (_.has(parsed.value, ["output", "writeTo"])) {
_.set(result, ["simulatedOutput", parsed.value.output.writeTo+".json"], simulatedOutput);
}
if (_.has(parsed.value, ["output", "appendTo"])) {
_.set(result, ["simulatedOutput", parsed.value.output.appendTo+".jsonl"], _.get(data, ["simulatedOutput", parsed.value.output.appendTo+".jsonl"], []).concat(simulatedOutput));
}
}
return simulatedOutput;
}
export function simulatedByLabware(parsed, data, labwares0, result) {
// console.log(JSON.stringify(parsed, null, '\t'))
// console.log({SCOPE: data.objects.SCOPE})
let simulatedOutput;
if (_.has(parsed.value, ["output", "simulated"])) {
const joinKey = _.get(parsed.value, ["output", "joinKey"]);
const userValues = _.get(parsed.value, ["output", "userValues"], {});
const labwares = _.uniq(_.map(labwares0, x => x.replace(/.*\(([^)]*)\)/, "$1")));
const common = (_.isEmpty(joinKey)) ? data.objects.SCOPE : {};
// console.log({common})
// console.log("DATA:\n"+JSON.stringify(data.objects.DATA))
simulatedOutput = _.map(labwares, labware => {
const row0 = (!_.isUndefined(joinKey))
? _.find(data.objects.DATA, row => (row[joinKey].replace(/.*\(([^)]*)\)/, "$1") === labware)) || {}
: common;
const scope = _.defaults({}, row0, data.objects.SCOPE);
// console.log({row0, row1, simulated: parsed.value.output.simulated})
const value = Design.calculate(parsed.value.output.simulated, scope);
const row = _.merge({RUNID: "simulated", object: parsed.objectName.object}, row0, userValues, {labware, value_type: "absorbance", value});
// console.log("row: "+JSON.stringify(row))
return row;
});
if (_.has(parsed.value, ["output", "units"])) {
_.forEach(simulatedOutput, row => {
_.forEach(parsed.value.output.units, (units, key) => {
if (_.has(row, key)) {
// console.log(row)
// console.log({key, units, value: row[key]});
// console.log({a: math.eval(row[key])})
row[key] = math.eval(row[key]).toNumber(units);
}
});
});
}
}
if (simulatedOutput) {
if (_.has(parsed.value, ["output", "writeTo"])) {
_.set(result, ["simulatedOutput", parsed.value.output.writeTo+".json"], simulatedOutput);
}
if (_.has(parsed.value, ["output", "appendTo"])) {
_.set(result, ["simulatedOutput", parsed.value.output.appendTo+".jsonl"], _.get(data, ["simulatedOutput", parsed.value.output.appendTo+".jsonl"], []).concat(simulatedOutput));
}
}
return simulatedOutput;
}