UNPKG

molstar

Version:

A comprehensive macromolecular library.

158 lines (157 loc) 8.37 kB
/** * Copyright (c) 2018 mol* contributors, licensed under MIT, See LICENSE file for more info. * * Taken/adapted from DensityServer (https://github.com/dsehnal/DensityServer) * * @author David Sehnal <david.sehnal@gmail.com> */ import { CifWriter } from '../../../../mol-io/writer/cif'; import { VOLUME_SERVER_VERSION as VERSION } from '../version'; import { ArrayEncoding } from '../../../../mol-io/common/binary-cif'; import { TypedArrayValueType } from '../../../../mol-io/common/typed-array'; export function encode(query, output) { var w = CifWriter.createEncoder({ binary: query.params.asBinary, encoderName: "VolumeServer ".concat(VERSION) }); write(w, query); w.encode(); w.writeTo(output); } function string(name, str, isSpecified) { if (isSpecified) { return CifWriter.Field.str(name, function (i, d) { return str(d); }, { valueKind: function (i, d) { return isSpecified(d) ? 0 /* Column.ValueKind.Present */ : 1 /* Column.ValueKind.NotPresent */; } }); } return CifWriter.Field.str(name, function (i, d) { return str(d); }); } function int32(name, value) { return CifWriter.Field.int(name, function (i, d) { return value(d); }); } function float64(name, value, digitCount) { if (digitCount === void 0) { digitCount = 6; } return CifWriter.Field.float(name, function (i, d) { return value(d); }, { digitCount: digitCount, typedArray: Float64Array }); } var _volume_data_3d_info_fields = [ string('name', function (ctx) { return ctx.header.channels[ctx.channelIndex]; }), int32('axis_order[0]', function (ctx) { return ctx.header.axisOrder[0]; }), int32('axis_order[1]', function (ctx) { return ctx.header.axisOrder[1]; }), int32('axis_order[2]', function (ctx) { return ctx.header.axisOrder[2]; }), float64('origin[0]', function (ctx) { return ctx.grid.origin[0]; }), float64('origin[1]', function (ctx) { return ctx.grid.origin[1]; }), float64('origin[2]', function (ctx) { return ctx.grid.origin[2]; }), float64('dimensions[0]', function (ctx) { return ctx.grid.dimensions[0]; }), float64('dimensions[1]', function (ctx) { return ctx.grid.dimensions[1]; }), float64('dimensions[2]', function (ctx) { return ctx.grid.dimensions[2]; }), int32('sample_rate', function (ctx) { return ctx.sampleRate; }), int32('sample_count[0]', function (ctx) { return ctx.grid.sampleCount[0]; }), int32('sample_count[1]', function (ctx) { return ctx.grid.sampleCount[1]; }), int32('sample_count[2]', function (ctx) { return ctx.grid.sampleCount[2]; }), int32('spacegroup_number', function (ctx) { return ctx.header.spacegroup.number; }), float64('spacegroup_cell_size[0]', function (ctx) { return ctx.header.spacegroup.size[0]; }, 3), float64('spacegroup_cell_size[1]', function (ctx) { return ctx.header.spacegroup.size[1]; }, 3), float64('spacegroup_cell_size[2]', function (ctx) { return ctx.header.spacegroup.size[2]; }, 3), float64('spacegroup_cell_angles[0]', function (ctx) { return ctx.header.spacegroup.angles[0]; }, 3), float64('spacegroup_cell_angles[1]', function (ctx) { return ctx.header.spacegroup.angles[1]; }, 3), float64('spacegroup_cell_angles[2]', function (ctx) { return ctx.header.spacegroup.angles[2]; }, 3), float64('mean_source', function (ctx) { return ctx.globalValuesInfo.mean; }), float64('mean_sampled', function (ctx) { return ctx.sampledValuesInfo.mean; }), float64('sigma_source', function (ctx) { return ctx.globalValuesInfo.sigma; }), float64('sigma_sampled', function (ctx) { return ctx.sampledValuesInfo.sigma; }), float64('min_source', function (ctx) { return ctx.globalValuesInfo.min; }), float64('min_sampled', function (ctx) { return ctx.sampledValuesInfo.min; }), float64('max_source', function (ctx) { return ctx.globalValuesInfo.max; }), float64('max_sampled', function (ctx) { return ctx.sampledValuesInfo.max; }) ]; var _volume_data_3d_info = { name: 'volume_data_3d_info', instance: function (result) { var ctx = { header: result.query.data.header, channelIndex: result.channelIndex, grid: result.query.samplingInfo.gridDomain, sampleRate: result.query.samplingInfo.sampling.rate, globalValuesInfo: result.query.data.header.sampling[0].valuesInfo[result.channelIndex], sampledValuesInfo: result.query.data.header.sampling[result.query.samplingInfo.sampling.index].valuesInfo[result.channelIndex] }; return { fields: _volume_data_3d_info_fields, source: [{ data: ctx, rowCount: 1 }] }; } }; function _volume_data_3d_number(i, ctx) { return ctx[i]; } var _volume_data_3d = { name: 'volume_data_3d', instance: function (ctx) { var data = ctx.query.values[ctx.channelIndex]; var E = ArrayEncoding; var encoder; var typedArray; if (ctx.query.data.header.valueType === TypedArrayValueType.Float32 || ctx.query.data.header.valueType === TypedArrayValueType.Int16) { var min = void 0, max = void 0; min = data[0], max = data[0]; for (var i = 0, n = data.length; i < n; i++) { var v = data[i]; if (v < min) min = v; else if (v > max) max = v; } typedArray = Float32Array; // encode into 255 steps and store each value in 1 byte. encoder = E.by(E.intervalQuantizaiton(min, max, 255, Uint8Array)).and(E.byteArray); } else { typedArray = Int8Array; // just encode the bytes encoder = E.by(E.byteArray); } var fields = [CifWriter.Field.float('values', _volume_data_3d_number, { encoder: encoder, typedArray: typedArray, digitCount: 6 })]; return CifWriter.categoryInstance(fields, { data: data, rowCount: data.length }); } }; function pickQueryBoxDimension(ctx, e, d) { var box = ctx.params.box; switch (box.kind) { case 'Cartesian': case 'Fractional': return "".concat(Math.round(1000000 * box[e][d]) / 1000000); default: return ''; } } function queryBoxDimension(e, d) { return string("query_box_".concat(e, "[").concat(d, "]"), function (ctx) { return pickQueryBoxDimension(ctx, e, d); }, function (ctx) { return ctx.params.box.kind !== 'Cell'; }); } var _density_server_result_fields = [ string('server_version', function (ctx) { return VERSION; }), string('datetime_utc', function (ctx) { return new Date().toISOString().replace(/T/, ' ').replace(/\..+/, ''); }), string('guid', function (ctx) { return ctx.guid; }), string('is_empty', function (ctx) { return ctx.kind === 'Empty' || ctx.kind === 'Error' ? 'yes' : 'no'; }), string('has_error', function (ctx) { return ctx.kind === 'Error' ? 'yes' : 'no'; }), string('error', function (ctx) { return ctx.kind === 'Error' ? ctx.message : ''; }, function (ctx) { return ctx.kind === 'Error'; }), string('query_source_id', function (ctx) { return ctx.params.sourceId; }), string('query_type', function (ctx) { return 'box'; }), string('query_box_type', function (ctx) { return ctx.params.box.kind.toLowerCase(); }), queryBoxDimension('a', 0), queryBoxDimension('a', 1), queryBoxDimension('a', 2), queryBoxDimension('b', 0), queryBoxDimension('b', 1), queryBoxDimension('b', 2) ]; var _density_server_result = { name: 'density_server_result', instance: function (ctx) { return CifWriter.categoryInstance(_density_server_result_fields, { data: ctx, rowCount: 1 }); } }; function write(encoder, query) { encoder.startDataBlock('SERVER'); encoder.writeCategory(_density_server_result, query); switch (query.kind) { case 'Data': } if (query.kind === 'Data') { var header = query.data.header; for (var i = 0; i < header.channels.length; i++) { encoder.startDataBlock(header.channels[i]); var ctx = { query: query, channelIndex: i }; encoder.writeCategory(_volume_data_3d_info, ctx); encoder.writeCategory(_volume_data_3d, ctx); } } }