UNPKG

molstar

Version:

A comprehensive macromolecular library.

115 lines (114 loc) 5.29 kB
#!/usr/bin/env node "use strict"; /** * 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);