UNPKG

molstar

Version:

A comprehensive macromolecular library.

282 lines 12.5 kB
#!/usr/bin/env node "use strict"; /** * 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 }); var tslib_1 = require("tslib"); var argparse = (0, tslib_1.__importStar)(require("argparse")); var util = (0, tslib_1.__importStar)(require("util")); var path = (0, tslib_1.__importStar)(require("path")); var fs = (0, tslib_1.__importStar)(require("fs")); require('util.promisify').shim(); var writeFile = util.promisify(fs.writeFile); var db_1 = require("../../mol-data/db"); var set_1 = require("../../mol-util/set"); var map_1 = require("../../mol-util/map"); var mmcif_extras_1 = require("../../mol-io/reader/cif/schema/mmcif-extras"); var ccd_extras_1 = require("../../mol-io/reader/cif/schema/ccd-extras"); var util_1 = require("./util"); function ccbKey(compId, atomId1, atomId2) { return atomId1 < atomId2 ? compId + ":" + atomId1 + "-" + atomId2 : compId + ":" + atomId2 + "-" + atomId1; } function ccaKey(compId, atomId) { return compId + ":" + atomId; } function addChemCompBondToSet(set, ccb) { for (var i = 0, il = ccb._rowCount; i < il; ++i) { set.add(ccbKey(ccb.comp_id.value(i), ccb.atom_id_1.value(i), ccb.atom_id_2.value(i))); } return set; } function addChemCompAtomToSet(set, cca) { for (var i = 0, il = cca._rowCount; i < il; ++i) { set.add(ccaKey(cca.comp_id.value(i), cca.atom_id.value(i))); } return set; } function checkAddingBondsFromPVCD(pvcd) { var ccbSetByParent = (0, map_1.DefaultMap)(function () { return new Set(); }); for (var k in pvcd) { var _a = pvcd[k], chem_comp = _a.chem_comp, chem_comp_bond = _a.chem_comp_bond; if (chem_comp_bond._rowCount) { var parentIds = chem_comp.mon_nstd_parent_comp_id.value(0); if (parentIds.length === 0) { var set = ccbSetByParent.getDefault(chem_comp.id.value(0)); addChemCompBondToSet(set, chem_comp_bond); } else { for (var i = 0, il = parentIds.length; i < il; ++i) { var parentId = parentIds[i]; var set = ccbSetByParent.getDefault(parentId); addChemCompBondToSet(set, chem_comp_bond); } } } } var _loop_1 = function (k) { var _b = pvcd[k], chem_comp = _b.chem_comp, chem_comp_atom = _b.chem_comp_atom, chem_comp_bond = _b.chem_comp_bond; if (chem_comp_bond._rowCount) { var parentIds = chem_comp.mon_nstd_parent_comp_id.value(0); if (parentIds.length > 0) { var _loop_2 = function (i, il) { var entryBonds = addChemCompBondToSet(new Set(), chem_comp_bond); var entryAtoms = addChemCompAtomToSet(new Set(), chem_comp_atom); var extraBonds = set_1.SetUtils.difference(ccbSetByParent.get(parentIds[i]), entryBonds); extraBonds.forEach(function (bk) { var _a = bk.split('|'), a1 = _a[0], a2 = _a[1]; if (entryAtoms.has(a1) && entryAtoms.has(a2)) { console.error("Adding all PVCD bonds would wrongly add bond " + bk + " for " + k); } }); }; for (var i = 0, il = parentIds.length; i < il; ++i) { _loop_2(i, il); } } } }; for (var k in pvcd) { _loop_1(k); } } function checkAddingAtomsFromPVCD(pvcd) { var ccaSetByParent = (0, map_1.DefaultMap)(function () { return new Set(); }); for (var k in pvcd) { var _a = pvcd[k], chem_comp = _a.chem_comp, chem_comp_atom = _a.chem_comp_atom; if (chem_comp_atom._rowCount) { var parentIds = chem_comp.mon_nstd_parent_comp_id.value(0); if (parentIds.length === 0) { var set = ccaSetByParent.getDefault(chem_comp.id.value(0)); addChemCompAtomToSet(set, chem_comp_atom); } else { for (var i = 0, il = parentIds.length; i < il; ++i) { var parentId = parentIds[i]; var set = ccaSetByParent.getDefault(parentId); addChemCompAtomToSet(set, chem_comp_atom); } } } } } function createBonds(ccd, pvcd, atomsRequested) { return (0, tslib_1.__awaiter)(this, void 0, void 0, function () { function addBonds(compId, ccb, protonationVariant) { for (var i = 0, il = ccb._rowCount; i < il; ++i) { var atomId1 = ccb.atom_id_1.value(i); var atomId2 = ccb.atom_id_2.value(i); var k = ccbKey(compId, atomId1, atomId2); if (!ccbSet.has(k)) { atom_id_1.push(atomId1); atom_id_2.push(atomId2); comp_id.push(compId); value_order.push(ccb.value_order.value(i)); pdbx_aromatic_flag.push(ccb.pdbx_aromatic_flag.value(i)); pdbx_stereo_config.push(ccb.pdbx_stereo_config.value(i)); molstar_protonation_variant.push(protonationVariant ? 'Y' : 'N'); ccbSet.add(k); } } } var ccbSet, comp_id, atom_id_1, atom_id_2, value_order, pdbx_aromatic_flag, pdbx_stereo_config, molstar_protonation_variant, k, _a, chem_comp, chem_comp_bond, parentIds, i, il, k, _b, chem_comp, chem_comp_bond, bondTable, bondDatabase; return (0, tslib_1.__generator)(this, function (_c) { ccbSet = new Set(); comp_id = []; atom_id_1 = []; atom_id_2 = []; value_order = []; pdbx_aromatic_flag = []; pdbx_stereo_config = []; molstar_protonation_variant = []; // check adding bonds from PVCD checkAddingBondsFromPVCD(pvcd); // add bonds from PVCD for (k in pvcd) { _a = pvcd[k], chem_comp = _a.chem_comp, chem_comp_bond = _a.chem_comp_bond; if (chem_comp_bond._rowCount) { parentIds = chem_comp.mon_nstd_parent_comp_id.value(0); if (parentIds.length === 0) { addBonds(chem_comp.id.value(0), chem_comp_bond, false); } else { for (i = 0, il = parentIds.length; i < il; ++i) { addBonds(parentIds[i], chem_comp_bond, true); } } } } // add bonds from CCD for (k in ccd) { _b = ccd[k], chem_comp = _b.chem_comp, chem_comp_bond = _b.chem_comp_bond; if (chem_comp_bond._rowCount) { addBonds(chem_comp.id.value(0), chem_comp_bond, false); } } bondTable = db_1.Table.ofArrays(mmcif_extras_1.mmCIF_chemCompBond_schema, { comp_id: comp_id, atom_id_1: atom_id_1, atom_id_2: atom_id_2, value_order: value_order, pdbx_aromatic_flag: pdbx_aromatic_flag, pdbx_stereo_config: pdbx_stereo_config, molstar_protonation_variant: molstar_protonation_variant }); bondDatabase = db_1.Database.ofTables(CCB_TABLE_NAME, { chem_comp_bond: mmcif_extras_1.mmCIF_chemCompBond_schema }, { chem_comp_bond: bondTable }); return [2 /*return*/, { bonds: bondDatabase, atoms: atomsRequested ? createAtoms(ccd, pvcd) : void 0 }]; }); }); } function createAtoms(ccd, pvcd) { var ccaSet = new Set(); var comp_id = []; var atom_id = []; var charge = []; var pdbx_stereo_config = []; function addAtoms(compId, cca) { for (var i = 0, il = cca._rowCount; i < il; ++i) { var atomId = cca.atom_id.value(i); var k = ccaKey(compId, atomId); if (!ccaSet.has(k)) { atom_id.push(atomId); comp_id.push(compId); charge.push(cca.charge.value(i)); pdbx_stereo_config.push(cca.pdbx_stereo_config.value(i)); ccaSet.add(k); } } } // check adding atoms from PVCD checkAddingAtomsFromPVCD(pvcd); // add atoms from PVCD for (var k in pvcd) { var _a = pvcd[k], chem_comp = _a.chem_comp, chem_comp_atom = _a.chem_comp_atom; if (chem_comp_atom._rowCount) { var parentIds = chem_comp.mon_nstd_parent_comp_id.value(0); if (parentIds.length === 0) { addAtoms(chem_comp.id.value(0), chem_comp_atom); } else { for (var i = 0, il = parentIds.length; i < il; ++i) { addAtoms(parentIds[i], chem_comp_atom); } } } } // add atoms from CCD for (var k in ccd) { var _b = ccd[k], chem_comp = _b.chem_comp, chem_comp_atom = _b.chem_comp_atom; if (chem_comp_atom._rowCount) { addAtoms(chem_comp.id.value(0), chem_comp_atom); } } var atomTable = db_1.Table.ofArrays(ccd_extras_1.ccd_chemCompAtom_schema, { comp_id: comp_id, atom_id: atom_id, charge: charge, pdbx_stereo_config: pdbx_stereo_config }); return db_1.Database.ofTables(CCA_TABLE_NAME, { chem_comp_atom: ccd_extras_1.ccd_chemCompAtom_schema }, { chem_comp_atom: atomTable }); } function run(out, binary, forceDownload, ccaOut) { if (binary === void 0) { binary = false; } if (forceDownload === void 0) { forceDownload = false; } return (0, tslib_1.__awaiter)(this, void 0, void 0, function () { var ccd, pvcd, _a, bonds, atoms, ccbCif, ccaCif; return (0, tslib_1.__generator)(this, function (_b) { switch (_b.label) { case 0: return [4 /*yield*/, (0, util_1.ensureDataAvailable)(forceDownload)]; case 1: _b.sent(); return [4 /*yield*/, (0, util_1.readCCD)()]; case 2: ccd = _b.sent(); return [4 /*yield*/, (0, util_1.readPVCD)()]; case 3: pvcd = _b.sent(); return [4 /*yield*/, createBonds(ccd, pvcd, !!ccaOut)]; case 4: _a = _b.sent(), bonds = _a.bonds, atoms = _a.atoms; ccbCif = (0, util_1.getEncodedCif)(CCB_TABLE_NAME, bonds, binary); if (!fs.existsSync(path.dirname(out))) { fs.mkdirSync(path.dirname(out)); } writeFile(out, ccbCif); if (!!ccaOut) { ccaCif = (0, util_1.getEncodedCif)(CCA_TABLE_NAME, atoms, binary); if (!fs.existsSync(path.dirname(ccaOut))) { fs.mkdirSync(path.dirname(ccaOut)); } writeFile(ccaOut, ccaCif); } return [2 /*return*/]; } }); }); } var CCB_TABLE_NAME = 'CHEM_COMP_BONDS'; var CCA_TABLE_NAME = 'CHEM_COMP_ATOMS'; var parser = new argparse.ArgumentParser({ add_help: true, description: 'Create a cif file with one big table of all chem_comp_bond entries from the CCD and PVCD.' }); parser.add_argument('out', { help: 'Generated file output path.' }); parser.add_argument('--forceDownload', '-f', { action: 'store_true', help: 'Force download of CCD and PVCD.' }); parser.add_argument('--binary', '-b', { action: 'store_true', help: 'Output as BinaryCIF.' }); parser.add_argument('--ccaOut', '-a', { help: 'Optional generated file output path for chem_comp_atom data.', required: false }); var args = parser.parse_args(); run(args.out, args.binary, args.forceDownload, args.ccaOut); //# sourceMappingURL=create-table.js.map