molstar
Version:
A comprehensive macromolecular library.
76 lines (75 loc) • 3.91 kB
JavaScript
/**
* Copyright (c) 2019 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.Dsn6Provider = exports.readSlices = void 0;
var tslib_1 = require("tslib");
var parser_1 = require("../../../../mol-io/reader/dsn6/parser");
var typed_array_1 = require("../../../../mol-io/common/typed-array");
function readHeader(name, file) {
return tslib_1.__awaiter(this, void 0, void 0, function () {
var _a, dsn6Header, littleEndian, header;
return tslib_1.__generator(this, function (_b) {
switch (_b.label) {
case 0: return [4 /*yield*/, (0, parser_1.readDsn6Header)(file)];
case 1:
_a = _b.sent(), dsn6Header = _a.header, littleEndian = _a.littleEndian;
header = {
name: name,
valueType: typed_array_1.TypedArrayValueType.Float32,
grid: [dsn6Header.xRate, dsn6Header.yRate, dsn6Header.zRate].reverse(),
axisOrder: [0, 1, 2].reverse(),
extent: [dsn6Header.xExtent, dsn6Header.yExtent, dsn6Header.zExtent].reverse(),
origin: [dsn6Header.xStart, dsn6Header.yStart, dsn6Header.zStart].reverse(),
spacegroupNumber: 1,
cellSize: [dsn6Header.xlen, dsn6Header.ylen, dsn6Header.zlen],
cellAngles: [dsn6Header.alpha, dsn6Header.beta, dsn6Header.gamma],
littleEndian: littleEndian,
dataOffset: parser_1.dsn6HeaderSize,
originalHeader: dsn6Header
};
return [2 /*return*/, header];
}
});
});
}
function readSlices(data) {
return tslib_1.__awaiter(this, void 0, void 0, function () {
var slices, header, file, extent, dataOffset, originalHeader, sliceCount, byteCount, buffer;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
slices = data.slices, header = data.header, file = data.file;
if (slices.isFinished) {
return [2 /*return*/];
}
extent = header.extent, dataOffset = header.dataOffset, originalHeader = header.originalHeader;
sliceCount = extent[2];
byteCount = (0, parser_1.getDsn6Counts)(originalHeader).byteCount;
if (byteCount > slices.maxBlockBytes) {
throw new Error("dsn6 file to large, can't read ".concat(byteCount, " bytes at once, increase block size or use another file format"));
}
return [4 /*yield*/, file.readBuffer(dataOffset, byteCount)];
case 1:
buffer = (_a.sent()).buffer;
if (!(slices.values instanceof Float32Array)) {
throw new Error("dsn6 reader only supports Float32Array for output values");
}
return [4 /*yield*/, (0, parser_1.parseDsn6Values)(originalHeader, buffer, slices.values, header.littleEndian)];
case 2:
_a.sent();
slices.slicesRead += sliceCount;
slices.sliceCount = sliceCount;
if (slices.slicesRead >= extent[2]) {
slices.isFinished = true;
}
return [2 /*return*/];
}
});
});
}
exports.readSlices = readSlices;
exports.Dsn6Provider = { readHeader: readHeader, readSlices: readSlices };
;