Source: commands/absorbanceReader.js

/**
 * Roboliq: Automation for liquid-handling robots
 * @copyright 2017, ETH Zurich, Ellis Whitehead
 * @license GPL-3.0
 */

/**
 * Absorbance Reader commands module.
 * @module commands/absorbanceReader
 * @return {Protocol}
 * @version v1
 */

var _ = require('lodash');
var jmespath = require('jmespath');
import math from 'mathjs';
import yaml from 'yamljs';
var commandHelper = require('../commandHelper.js');
const Design = require('../design.js');
var expect = require('../expect.js');
import {mergeR} from '../mergeR.js';
var misc = require('../misc.js');
import * as simulatedHelpers from './simulatedHelpers.js';
import wellsParser from '../parsers/wellsParser.js';


/**
 * Handlers for {@link absorbanceReader} commands.
 * @static
 */
var commandHandlers = {
	"absorbanceReader.measurePlate": function(params, parsed, data) {
		// console.log(JSON.stringify(parsed));
		var model = commandHelper.getParsedValue(parsed, data, 'object', 'model');
		var location0 = commandHelper.getParsedValue(parsed, data, 'object', 'location');

		var predicates = [
			{"absorbanceReader.canAgentEquipmentModelSite": {
				"agent": parsed.objectName.agent,
				"equipment": parsed.objectName.equipment,
				"model": model,
				"site": parsed.objectName.site
			}}
		];
		var [params2, alternatives] = commandHelper.queryLogic(data, predicates, "absorbanceReader.canAgentEquipmentModelSite");
		// console.log("params2:\n"+JSON.stringify(params2, null, '  '))
		// console.log("parsed.value.outputFile: "+JSON.stringify(parsed.value.outputFile));

		const destinationAfter
			= (parsed.value.destinationAfter === "stay") ? null
			: _.isUndefined(parsed.objectName.destinationAfter) ? location0
			: parsed.objectName.destinationAfter;

		// Program to pass to sub-command
		const program = mergeR({}, parsed.orig.program, {
			wells: (parsed.value.program || {}).wells
		});
		// Handle deprecated parameter names
		const output = mergeR({}, parsed.orig.output, {
			joinKey: _.get(parsed.orig, "program.wellDesignFactor"),
			userValues: _.get(parsed.orig, "program.userValues"),
			writeTo: _.get(parsed.orig, "outputFile"),
			appendTo: _.get(parsed.orig, "outputDataset"),
		});
		// console.log({output})

		var expansion = [
			(params2.site === location0) ? null : {
				command: "transporter.movePlate",
				object: parsed.objectName.object,
				destination: params2.site
			},
			_.merge({}, {
				command: ["equipment.run", params2.agent, params2.equipment].join('|'),
				agent: params2.agent,
				equipment: params2.equipment,
				measurementType: "absorbance",
				program: (_.isEmpty(program)) ? undefined : program,
				programFileTemplate: parsed.value.programFileTemplate,
				programFile: parsed.value.programFile,
				programData: parsed.value.programData,
				object: parsed.objectName.object,
				output: (_.isEmpty(output)) ? undefined : output
			}),
			(destinationAfter === null || destinationAfter === params2.site) ? null : {
				command: "transporter.movePlate",
				object: parsed.objectName.object,
				destination: destinationAfter
			}
		];
		// console.log({expansion1: expansion[0]})
		// console.log({expansion1output: expansion[1].output})

		const result = {expansion};

		if (_.has(parsed.value, ["output", "simulated"])) {
			// Wells are chosen as follows:
			// 1) program.wells
			// 2) output.joinKey
			// 3) all wells on labware
			const wells = (_.has(parsed.value, ["program", "wells"]))
				? commandHelper.asArray(parsed.value.program.wells)
				: (!_.isUndefined(output.joinKey))
					? commandHelper.getDesignFactor(output.joinKey, data.objects.DATA)
					: wellsParser.parse(`${parsed.objectName.object}(all)`, data.objects);
			// console.log({wells})
			simulatedHelpers.simulatedByWells(parsed, data, wells, result);
		}

		// console.log("RESULTS:\n"+JSON.stringify(result))
		return result;
	},
};

module.exports = {
	roboliq: "v1",
	schemas: yaml.load(__dirname+"/../schemas/absorbanceReader.yaml"),
	commandHandlers
};