molstar
Version:
A comprehensive macromolecular library.
234 lines • 11.3 kB
JavaScript
/**
* 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