molstar
Version:
A comprehensive macromolecular library.
80 lines (79 loc) • 4.14 kB
JavaScript
"use strict";
/**
* Copyright (c) 2024 mol* contributors, licensed under MIT, See LICENSE file for more info.
*
* @author Alex Chan <smalldirkalex@gmail.com>
*
* Thanks to @author Adam Midlik <midlik@gmail.com> for the example code ../image-renderer and https://github.com/midlik/surface-calculator i can make reference to,
*
* Example command-line application generating and exporting PubChem SDF structures
* Build: npm install --no-save gl // these packages are not listed in dependencies for performance reasons
* npm run build
* Run: node lib/commonjs/examples/glb-export 2519 ../outputs_2519/
*/
Object.defineProperty(exports, "__esModule", { value: true });
const tslib_1 = require("tslib");
const argparse_1 = require("argparse");
const fs_1 = tslib_1.__importDefault(require("fs"));
const path_1 = tslib_1.__importDefault(require("path"));
const gl_1 = tslib_1.__importDefault(require("gl"));
const mol_task_1 = require("../../mol-task");
const data_1 = require("../../mol-plugin-state/transforms/data");
const glb_exporter_1 = require("../../extensions/geo-export/glb-exporter");
const geometry_1 = require("../../mol-math/geometry");
const model_1 = require("../../mol-plugin-state/transforms/model");
const representation_1 = require("../../mol-plugin-state/transforms/representation");
const headless_plugin_context_1 = require("../../mol-plugin/headless-plugin-context");
const spec_1 = require("../../mol-plugin/spec");
const data_source_1 = require("../../mol-util/data-source");
(0, data_source_1.setFSModule)(fs_1.default);
function parseArguments() {
const parser = new argparse_1.ArgumentParser({ description: 'Example command-line application exporting .glb file of SDF structures from PubChem' });
parser.add_argument('cid', { help: 'PubChem identifier' });
parser.add_argument('outDirectory', { help: 'Directory for outputs' });
const args = parser.parse_args();
return { ...args };
}
async function main() {
var _a;
const args = parseArguments();
const root = 'https://pubchem.ncbi.nlm.nih.gov/rest';
const url = `${root}/pug/compound/cid/${args.cid}/sdf?record_type=3d`;
console.log('PubChem CID:', args.cid);
console.log('Source URL:', url);
console.log('Outputs:', args.outDirectory);
// Create a headless plugin
const externalModules = { gl: gl_1.default };
const plugin = new headless_plugin_context_1.HeadlessPluginContext(externalModules, (0, spec_1.DefaultPluginSpec)());
await plugin.init();
// Download and visualize data in the plugin
const update = plugin.build();
const structure = await update.toRoot()
.apply(data_1.Download, { url, isBinary: false })
.apply(model_1.TrajectoryFromSDF)
.apply(model_1.ModelFromTrajectory)
.apply(model_1.StructureFromModel)
.apply(representation_1.StructureRepresentation3D, {
type: { name: 'ball-and-stick', params: { size: 'physical' } },
colorTheme: { name: 'element-symbol', params: { carbonColor: { name: 'element-symbol', params: {} } } },
sizeTheme: { name: 'physical', params: {} },
})
.commit();
const meshes = structure.data.repr.renderObjects.filter(obj => obj.type === 'mesh');
const boundingSphere = (_a = plugin.canvas3d) === null || _a === void 0 ? void 0 : _a.boundingSphereVisible;
const boundingBox = geometry_1.Box3D.fromSphere3D((0, geometry_1.Box3D)(), boundingSphere);
const renderObjectExporter = new glb_exporter_1.GlbExporter(boundingBox);
await plugin.runTask(mol_task_1.Task.create('Export Geometry', async (ctx) => {
var _a;
for (let i = 0, il = meshes.length; i < il; ++i) {
await renderObjectExporter.add(meshes[i], (_a = plugin.canvas3d) === null || _a === void 0 ? void 0 : _a.webgl, ctx);
}
const blob = await renderObjectExporter.getBlob(ctx);
const buffer = await blob.arrayBuffer();
await fs_1.default.promises.writeFile(path_1.default.join(args.outDirectory, `${args.cid}.glb`), Buffer.from(buffer));
}));
// Cleanup
await plugin.clear();
plugin.dispose();
}
main();