molstar
Version:
A comprehensive macromolecular library.
96 lines (95 loc) • 5.88 kB
JavaScript
/**
* Copyright (c) 2018-2020 mol* contributors, licensed under MIT, See LICENSE file for more info.
*
* @author Alexander Rose <alexander.rose@weirdbyte.de>
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.Ccp4Format = exports.volumeFromCcp4 = exports.getCcp4Origin = void 0;
var tslib_1 = require("tslib");
var mol_task_1 = require("../../mol-task");
var geometry_1 = require("../../mol-math/geometry");
var linear_algebra_1 = require("../../mol-math/linear-algebra");
var misc_1 = require("../../mol-math/misc");
var parser_1 = require("../../mol-io/reader/ccp4/parser");
var typed_array_1 = require("../../mol-io/common/typed-array");
var array_1 = require("../../mol-util/array");
var custom_property_1 = require("../../mol-model/custom-property");
/** When available (e.g. in MRC files) use ORIGIN records instead of N[CRS]START */
function getCcp4Origin(header) {
if (header.originX === 0.0 && header.originY === 0.0 && header.originZ === 0.0) {
return linear_algebra_1.Vec3.create(header.NCSTART, header.NRSTART, header.NSSTART);
}
else {
return linear_algebra_1.Vec3.create(header.originX / (header.xLength / header.NX), header.originY / (header.yLength / header.NY), header.originZ / (header.zLength / header.NZ));
}
}
exports.getCcp4Origin = getCcp4Origin;
function getTypedArrayCtor(header) {
var valueType = (0, parser_1.getCcp4ValueType)(header);
switch (valueType) {
case typed_array_1.TypedArrayValueType.Float32: return Float32Array;
case typed_array_1.TypedArrayValueType.Int8: return Int8Array;
case typed_array_1.TypedArrayValueType.Int16: return Int16Array;
case typed_array_1.TypedArrayValueType.Uint16: return Uint16Array;
}
throw Error("".concat(valueType, " is not a supported value format."));
}
function volumeFromCcp4(source, params) {
var _this = this;
return mol_task_1.Task.create('Create Volume', function (ctx) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
var header, values, size, angles, spacegroup, cell, axis_order_fast_to_slow, normalizeOrder, grid, extent, origin, gridOrigin, origin_frac, dimensions_frac, space, data, calcStats;
return tslib_1.__generator(this, function (_a) {
header = source.header, values = source.values;
size = linear_algebra_1.Vec3.create(header.xLength, header.yLength, header.zLength);
if (params && params.voxelSize)
linear_algebra_1.Vec3.mul(size, size, params.voxelSize);
angles = linear_algebra_1.Vec3.create((0, misc_1.degToRad)(header.alpha), (0, misc_1.degToRad)(header.beta), (0, misc_1.degToRad)(header.gamma));
spacegroup = header.ISPG > 65536 ? 0 : header.ISPG;
cell = geometry_1.SpacegroupCell.create(spacegroup || 'P 1', size, angles);
axis_order_fast_to_slow = linear_algebra_1.Vec3.create(header.MAPC - 1, header.MAPR - 1, header.MAPS - 1);
normalizeOrder = linear_algebra_1.Tensor.convertToCanonicalAxisIndicesFastToSlow(axis_order_fast_to_slow);
grid = [header.NX, header.NY, header.NZ];
extent = normalizeOrder([header.NC, header.NR, header.NS]);
origin = getCcp4Origin(header);
if (params === null || params === void 0 ? void 0 : params.offset)
linear_algebra_1.Vec3.add(origin, origin, params.offset);
gridOrigin = normalizeOrder(origin);
origin_frac = linear_algebra_1.Vec3.create(gridOrigin[0] / grid[0], gridOrigin[1] / grid[1], gridOrigin[2] / grid[2]);
dimensions_frac = linear_algebra_1.Vec3.create(extent[0] / grid[0], extent[1] / grid[1], extent[2] / grid[2]);
space = linear_algebra_1.Tensor.Space(extent, linear_algebra_1.Tensor.invertAxisOrder(axis_order_fast_to_slow), getTypedArrayCtor(header));
data = linear_algebra_1.Tensor.create(space, linear_algebra_1.Tensor.Data1(values));
calcStats = header.AMIN === 0 && header.AMAX === 0 && header.AMEAN === 0 && header.ARMS === 0;
return [2 /*return*/, {
label: params === null || params === void 0 ? void 0 : params.label,
entryId: params === null || params === void 0 ? void 0 : params.entryId,
grid: {
transform: { kind: 'spacegroup', cell: cell, fractionalBox: geometry_1.Box3D.create(origin_frac, linear_algebra_1.Vec3.add(linear_algebra_1.Vec3.zero(), origin_frac, dimensions_frac)) },
cells: data,
stats: {
min: (isNaN(header.AMIN) || calcStats) ? (0, array_1.arrayMin)(values) : header.AMIN,
max: (isNaN(header.AMAX) || calcStats) ? (0, array_1.arrayMax)(values) : header.AMAX,
mean: (isNaN(header.AMEAN) || calcStats) ? (0, array_1.arrayMean)(values) : header.AMEAN,
sigma: (isNaN(header.ARMS) || header.ARMS === 0) ? (0, array_1.arrayRms)(values) : header.ARMS
},
},
sourceData: Ccp4Format.create(source),
customProperties: new custom_property_1.CustomProperties(),
_propertyData: Object.create(null),
}];
});
}); });
}
exports.volumeFromCcp4 = volumeFromCcp4;
var Ccp4Format;
(function (Ccp4Format) {
function is(x) {
return (x === null || x === void 0 ? void 0 : x.kind) === 'ccp4';
}
Ccp4Format.is = is;
function create(ccp4) {
return { kind: 'ccp4', name: ccp4.name, data: ccp4 };
}
Ccp4Format.create = create;
})(Ccp4Format || (Ccp4Format = {}));
exports.Ccp4Format = Ccp4Format;
;