molstar
Version:
A comprehensive macromolecular library.
115 lines (114 loc) • 5.29 kB
JavaScript
/**
* Copyright (c) 2018 mol* contributors, licensed under MIT, See LICENSE file for more info.
*
* @author David Sehnal <david.sehnal@gmail.com>
*/
Object.defineProperty(exports, "__esModule", { value: true });
var tslib_1 = require("tslib");
var fs = tslib_1.__importStar(require("fs"));
var argparse = tslib_1.__importStar(require("argparse"));
var util = tslib_1.__importStar(require("util"));
var volume_1 = require("../../mol-model/volume");
var helpers_1 = require("./helpers");
var cif_1 = require("../../mol-io/reader/cif");
var db_1 = require("../../mol-data/db");
var mol_util_1 = require("../../mol-util");
var mol_task_1 = require("../../mol-task");
var isosurface_1 = require("../../mol-repr/volume/isosurface");
var theme_1 = require("../../mol-theme/theme");
var density_server_1 = require("../../mol-model-formats/volume/density-server");
require('util.promisify').shim();
var writeFileAsync = util.promisify(fs.writeFile);
function getVolume(url) {
return tslib_1.__awaiter(this, void 0, void 0, function () {
var cif, data;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, (0, helpers_1.downloadCif)(url, true)];
case 1:
cif = _a.sent();
data = cif_1.CIF.schema.densityServer(cif.blocks[1]);
return [4 /*yield*/, (0, density_server_1.volumeFromDensityServerData)(data).run()];
case 2: return [2 /*return*/, _a.sent()];
}
});
});
}
function print(volume) {
if (!density_server_1.DscifFormat.is(volume.sourceData))
return;
var volume_data_3d_info = volume.sourceData.data.volume_data_3d_info;
var row = db_1.Table.getRow(volume_data_3d_info, 0);
console.log(row);
console.log(volume.grid.transform);
console.log(volume.grid.stats);
}
function doMesh(volume, filename) {
return tslib_1.__awaiter(this, void 0, void 0, function () {
var mesh, vertexCount, triangleCount, vs, ts, obj, i, i;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, mol_task_1.Task.create('', function (runtime) { return (0, isosurface_1.createVolumeIsosurfaceMesh)({ runtime: runtime }, volume, theme_1.Theme.createEmpty(), { isoValue: volume_1.Volume.IsoValue.absolute(1.5) }); }).run()];
case 1:
mesh = _a.sent();
console.log({ vc: mesh.vertexCount, tc: mesh.triangleCount });
vertexCount = mesh.vertexCount, triangleCount = mesh.triangleCount;
vs = mesh.vertexBuffer.ref.value;
ts = mesh.indexBuffer.ref.value;
obj = mol_util_1.StringBuilder.create();
for (i = 0; i < vertexCount; i++) {
mol_util_1.StringBuilder.write(obj, 'v ');
mol_util_1.StringBuilder.writeFloat(obj, vs[3 * i + 0], 100);
mol_util_1.StringBuilder.whitespace1(obj);
mol_util_1.StringBuilder.writeFloat(obj, vs[3 * i + 1], 100);
mol_util_1.StringBuilder.whitespace1(obj);
mol_util_1.StringBuilder.writeFloat(obj, vs[3 * i + 2], 100);
mol_util_1.StringBuilder.newline(obj);
}
for (i = 0; i < triangleCount; i++) {
mol_util_1.StringBuilder.write(obj, 'f ');
mol_util_1.StringBuilder.writeIntegerAndSpace(obj, ts[3 * i + 0] + 1);
mol_util_1.StringBuilder.writeIntegerAndSpace(obj, ts[3 * i + 1] + 1);
mol_util_1.StringBuilder.writeInteger(obj, ts[3 * i + 2] + 1);
mol_util_1.StringBuilder.newline(obj);
}
return [4 /*yield*/, writeFileAsync(filename, mol_util_1.StringBuilder.getString(obj))];
case 2:
_a.sent();
return [2 /*return*/];
}
});
});
}
function run(url, meshFilename) {
return tslib_1.__awaiter(this, void 0, void 0, function () {
var volume;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, getVolume(url)];
case 1:
volume = _a.sent();
print(volume);
return [4 /*yield*/, doMesh(volume, meshFilename)];
case 2:
_a.sent();
return [2 /*return*/];
}
});
});
}
var parser = new argparse.ArgumentParser({
add_help: true,
description: 'Info about VolumeData from mol-model module'
});
parser.add_argument('--emdb', '-e', {
help: 'EMDB id, for example 8116',
});
parser.add_argument('--mesh', {
help: 'Mesh filename',
required: true
});
var args = parser.parse_args();
run("https://ds.litemol.org/em/emd-".concat(args.emdb, "/cell?detail=4"), args.mesh);
;