Source: commands/simulatedHelpers.js

/**
 * 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;
}