UNPKG

molstar

Version:

A comprehensive macromolecular library.

234 lines 11.3 kB
/** * Copyright (c) 2018-2020 mol* contributors, licensed under MIT, See LICENSE file for more info. * * @author David Sehnal <david.sehnal@gmail.com> * @author Alexander Rose <alexander.rose@weirdbyte.de> */ import { __assign, __awaiter, __generator } from "tslib"; import { CIF } from '../../mol-io/reader/cif'; import { Vec3 } from '../../mol-math/linear-algebra'; import { volumeFromCcp4 } from '../../mol-model-formats/volume/ccp4'; import { volumeFromDensityServerData } from '../../mol-model-formats/volume/density-server'; import { volumeFromDsn6 } from '../../mol-model-formats/volume/dsn6'; import { Task } from '../../mol-task'; import { ParamDefinition as PD } from '../../mol-util/param-definition'; import { PluginStateObject as SO, PluginStateTransform } from '../objects'; import { volumeFromCube } from '../../mol-model-formats/volume/cube'; import { volumeFromDx } from '../../mol-model-formats/volume/dx'; import { StateSelection } from '../../mol-state'; export { VolumeFromCcp4 }; export { VolumeFromDsn6 }; export { VolumeFromCube }; export { VolumeFromDx }; export { AssignColorVolume }; export { VolumeFromDensityServerCif }; var VolumeFromCcp4 = PluginStateTransform.BuiltIn({ name: 'volume-from-ccp4', display: { name: 'Volume from CCP4/MRC/MAP', description: 'Create Volume from CCP4/MRC/MAP data' }, from: SO.Format.Ccp4, to: SO.Volume.Data, params: function (a) { return { voxelSize: PD.Vec3(Vec3.create(1, 1, 1)), offset: PD.Vec3(Vec3.create(0, 0, 0)), entryId: PD.Text(''), }; } })({ apply: function (_a) { var _this = this; var a = _a.a, params = _a.params; return Task.create('Create volume from CCP4/MRC/MAP', function (ctx) { return __awaiter(_this, void 0, void 0, function () { var volume, props; return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, volumeFromCcp4(a.data, __assign(__assign({}, params), { label: a.data.name || a.label })).runInContext(ctx)]; case 1: volume = _a.sent(); props = { label: volume.label || 'Volume', description: "Volume " + a.data.header.NX + "\u00D7" + a.data.header.NX + "\u00D7" + a.data.header.NX }; return [2 /*return*/, new SO.Volume.Data(volume, props)]; } }); }); }); }, dispose: function (_a) { var b = _a.b; b === null || b === void 0 ? void 0 : b.data.customProperties.dispose(); } }); var VolumeFromDsn6 = PluginStateTransform.BuiltIn({ name: 'volume-from-dsn6', display: { name: 'Volume from DSN6/BRIX', description: 'Create Volume from DSN6/BRIX data' }, from: SO.Format.Dsn6, to: SO.Volume.Data, params: function (a) { return { voxelSize: PD.Vec3(Vec3.create(1, 1, 1)), entryId: PD.Text(''), }; } })({ apply: function (_a) { var _this = this; var a = _a.a, params = _a.params; return Task.create('Create volume from DSN6/BRIX', function (ctx) { return __awaiter(_this, void 0, void 0, function () { var volume, props; return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, volumeFromDsn6(a.data, __assign(__assign({}, params), { label: a.data.name || a.label })).runInContext(ctx)]; case 1: volume = _a.sent(); props = { label: volume.label || 'Volume', description: "Volume " + a.data.header.xExtent + "\u00D7" + a.data.header.yExtent + "\u00D7" + a.data.header.zExtent }; return [2 /*return*/, new SO.Volume.Data(volume, props)]; } }); }); }); }, dispose: function (_a) { var b = _a.b; b === null || b === void 0 ? void 0 : b.data.customProperties.dispose(); } }); var VolumeFromCube = PluginStateTransform.BuiltIn({ name: 'volume-from-cube', display: { name: 'Volume from Cube', description: 'Create Volume from Cube data' }, from: SO.Format.Cube, to: SO.Volume.Data, params: function (a) { var dataIndex = a ? PD.Select(0, a.data.header.dataSetIds.map(function (id, i) { return [i, "" + id]; })) : PD.Numeric(0); return { dataIndex: dataIndex, entryId: PD.Text(''), }; } })({ apply: function (_a) { var _this = this; var a = _a.a, params = _a.params; return Task.create('Create volume from Cube', function (ctx) { return __awaiter(_this, void 0, void 0, function () { var volume, props; return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, volumeFromCube(a.data, __assign(__assign({}, params), { label: a.data.name || a.label })).runInContext(ctx)]; case 1: volume = _a.sent(); props = { label: volume.label || 'Volume', description: "Volume " + a.data.header.dim[0] + "\u00D7" + a.data.header.dim[1] + "\u00D7" + a.data.header.dim[2] }; return [2 /*return*/, new SO.Volume.Data(volume, props)]; } }); }); }); }, dispose: function (_a) { var b = _a.b; b === null || b === void 0 ? void 0 : b.data.customProperties.dispose(); } }); var VolumeFromDx = PluginStateTransform.BuiltIn({ name: 'volume-from-dx', display: { name: 'Parse DX', description: 'Create volume from DX data.' }, from: SO.Format.Dx, to: SO.Volume.Data })({ apply: function (_a) { var _this = this; var a = _a.a; return Task.create('Parse DX', function (ctx) { return __awaiter(_this, void 0, void 0, function () { var volume, props; return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, volumeFromDx(a.data, { label: a.data.name || a.label }).runInContext(ctx)]; case 1: volume = _a.sent(); props = { label: volume.label || 'Volume', description: "Volume " + a.data.header.dim[0] + "\u00D7" + a.data.header.dim[1] + "\u00D7" + a.data.header.dim[2] }; return [2 /*return*/, new SO.Volume.Data(volume, props)]; } }); }); }); }, dispose: function (_a) { var b = _a.b; b === null || b === void 0 ? void 0 : b.data.customProperties.dispose(); } }); var VolumeFromDensityServerCif = PluginStateTransform.BuiltIn({ name: 'volume-from-density-server-cif', display: { name: 'Volume from density-server CIF', description: 'Identify and create all separate models in the specified CIF data block' }, from: SO.Format.Cif, to: SO.Volume.Data, params: function (a) { if (!a) { return { blockHeader: PD.Optional(PD.Text(void 0, { description: 'Header of the block to parse. If none is specifed, the 1st data block in the file is used.' })), entryId: PD.Text(''), }; } var blocks = a.data.blocks.slice(1); // zero block contains query meta-data return { blockHeader: PD.Optional(PD.Select(blocks[0] && blocks[0].header, blocks.map(function (b) { return [b.header, b.header]; }), { description: 'Header of the block to parse' })), entryId: PD.Text(''), }; } })({ isApplicable: function (a) { return a.data.blocks.length > 0; }, apply: function (_a) { var _this = this; var a = _a.a, params = _a.params; return Task.create('Parse density-server CIF', function (ctx) { return __awaiter(_this, void 0, void 0, function () { var header, block, densityServerCif, volume, _a, x, y, z, props; var _b; return __generator(this, function (_c) { switch (_c.label) { case 0: header = params.blockHeader || a.data.blocks[1].header; block = a.data.blocks.find(function (b) { return b.header === header; }); if (!block) throw new Error("Data block '" + [header] + "' not found."); densityServerCif = CIF.schema.densityServer(block); return [4 /*yield*/, volumeFromDensityServerData(densityServerCif, { entryId: params.entryId }).runInContext(ctx)]; case 1: volume = _c.sent(); _a = volume.grid.cells.space.dimensions, x = _a[0], y = _a[1], z = _a[2]; props = { label: (_b = params.entryId) !== null && _b !== void 0 ? _b : densityServerCif.volume_data_3d_info.name.value(0), description: "Volume " + x + "\u00D7" + y + "\u00D7" + z }; return [2 /*return*/, new SO.Volume.Data(volume, props)]; } }); }); }); }, dispose: function (_a) { var b = _a.b; b === null || b === void 0 ? void 0 : b.data.customProperties.dispose(); } }); var AssignColorVolume = PluginStateTransform.BuiltIn({ name: 'assign-color-volume', display: { name: 'Assign Color Volume', description: 'Assigns another volume to be available for coloring.' }, from: SO.Volume.Data, to: SO.Volume.Data, isDecorator: true, params: function (a, plugin) { if (!a) return { ref: PD.Text() }; var cells = plugin.state.data.select(StateSelection.Generators.root.subtree().ofType(SO.Volume.Data).filter(function (cell) { var _a; return !!cell.obj && !((_a = cell.obj) === null || _a === void 0 ? void 0 : _a.data.colorVolume) && cell.obj !== a; })); if (cells.length === 0) return { ref: PD.Text('', { isHidden: true }) }; return { ref: PD.Select(cells[0].transform.ref, cells.map(function (c) { return [c.transform.ref, c.obj.label]; })) }; } })({ apply: function (_a) { var _this = this; var a = _a.a, params = _a.params, dependencies = _a.dependencies; return Task.create('Assign Color Volume', function (ctx) { return __awaiter(_this, void 0, void 0, function () { var colorVolume, volume, props; return __generator(this, function (_a) { if (!dependencies || !dependencies[params.ref]) { throw new Error('Dependency not available.'); } colorVolume = dependencies[params.ref].data; volume = __assign(__assign({}, a.data), { colorVolume: colorVolume }); props = { label: a.label, description: 'Volume + Colors' }; return [2 /*return*/, new SO.Volume.Data(volume, props)]; }); }); }); } }); //# sourceMappingURL=volume.js.map