molstar
Version:
A comprehensive macromolecular library.
282 lines • 12.5 kB
JavaScript
/**
* 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
;