molstar
Version:
A comprehensive macromolecular library.
125 lines • 6.47 kB
JavaScript
"use strict";
/**
* Copyright (c) 2020 mol* contributors, licensed under MIT, See LICENSE file for more info.
*
* @author Sebastian Bittrich <sebastian.bittrich@rcsb.org>
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.MolEncoder = void 0;
var tslib_1 = require("tslib");
var mol_util_1 = require("../../../mol-util");
var util_1 = require("../cif/encoder/util");
var ligand_encoder_1 = require("../ligand-encoder");
// specification: http://c4.cabrillo.edu/404/ctfile.pdf
// SDF wraps MOL and allows for multiple molecules per file as well as additional properties
var MolEncoder = /** @class */ (function (_super) {
(0, tslib_1.__extends)(MolEncoder, _super);
function MolEncoder(encoder, metaInformation, hydrogens, terminator) {
if (terminator === void 0) { terminator = ''; }
var _this = _super.call(this, encoder, metaInformation, hydrogens) || this;
_this.terminator = terminator;
if (metaInformation && !terminator) {
throw new Error('meta-information cannot be written for MOL files');
}
return _this;
}
MolEncoder.prototype._writeCategory = function (category, context) {
var _this = this;
// use separate builder because we still need to write Counts and Bonds line
var ctab = mol_util_1.StringBuilder.create();
var bonds = mol_util_1.StringBuilder.create();
// write Atom block and gather data for Bonds and Charges
var _a = (0, util_1.getCategoryInstanceData)(category, context), instance = _a.instance, source = _a.source;
// write header
var name = this.getName(instance, source);
// 3rd lines must be present and can contain comments
mol_util_1.StringBuilder.writeSafe(this.builder, name + "\n " + this.encoder + "\n\n");
var atomMap = this.componentAtomData.entries.get(name);
var bondMap = this.componentBondData.entries.get(name);
var bondCount = 0;
var chiral = false;
// traverse once to determine all actually present atoms
var atoms = this.getAtoms(instance, source);
atoms.forEach(function (atom1, label_atom_id1) {
var i1 = atom1.index;
var _a = atomMap.map.get(label_atom_id1), charge = _a.charge, stereo_config = _a.stereo_config;
mol_util_1.StringBuilder.writePadLeft(ctab, atom1.Cartn_x.toFixed(4), 10);
mol_util_1.StringBuilder.writePadLeft(ctab, atom1.Cartn_y.toFixed(4), 10);
mol_util_1.StringBuilder.writePadLeft(ctab, atom1.Cartn_z.toFixed(4), 10);
mol_util_1.StringBuilder.whitespace1(ctab);
mol_util_1.StringBuilder.writePadRight(ctab, atom1.type_symbol, 2);
mol_util_1.StringBuilder.writeSafe(ctab, ' 0');
mol_util_1.StringBuilder.writeIntegerPadLeft(ctab, _this.mapCharge(charge), 3);
mol_util_1.StringBuilder.writeSafe(ctab, ' 0 0 0 0 0 0 0 0 0 0\n');
if (stereo_config !== 'N')
chiral = true;
// no data for metal ions
if (!(bondMap === null || bondMap === void 0 ? void 0 : bondMap.map))
return;
bondMap.map.get(label_atom_id1).forEach(function (bond, label_atom_id2) {
var atom2 = atoms.get(label_atom_id2);
if (!atom2)
return;
var i2 = atom2.index, type_symbol2 = atom2.type_symbol;
if (i1 < i2 && !_this.skipHydrogen(type_symbol2)) {
var order = bond.order;
mol_util_1.StringBuilder.writeIntegerPadLeft(bonds, i1 + 1, 3);
mol_util_1.StringBuilder.writeIntegerPadLeft(bonds, i2 + 1, 3);
mol_util_1.StringBuilder.writeIntegerPadLeft(bonds, order, 3);
mol_util_1.StringBuilder.writeSafe(bonds, ' 0 0 0 0\n');
bondCount++;
}
});
});
// write counts line
mol_util_1.StringBuilder.writeIntegerPadLeft(this.builder, atoms.size, 3);
mol_util_1.StringBuilder.writeIntegerPadLeft(this.builder, bondCount, 3);
mol_util_1.StringBuilder.writeSafe(this.builder, " 0 0 " + (chiral ? 1 : 0) + " 0 0 0 0 0 0\n");
mol_util_1.StringBuilder.writeSafe(this.builder, mol_util_1.StringBuilder.getString(ctab));
mol_util_1.StringBuilder.writeSafe(this.builder, mol_util_1.StringBuilder.getString(bonds));
mol_util_1.StringBuilder.writeSafe(this.builder, 'M END\n');
};
MolEncoder.prototype.mapCharge = function (raw) {
// 0 = uncharged or value other than these, 1 = +3, 2 = +2, 3 = +1, 4 = doublet radical, 5 = -1, 6 = -2, 7 = -3
switch (raw) {
case 3: return 1;
case 2: return 2;
case 1: return 3;
case -1: return 5;
case -2: return 6;
case -3: return 7;
default: return 0;
}
};
MolEncoder.prototype.writeFullCategory = function (sb, category, context) {
var _a = (0, util_1.getCategoryInstanceData)(category, context), instance = _a.instance, source = _a.source;
var fields = instance.fields;
var src = source[0];
if (!src)
return;
var data = src.data;
var it = src.keys();
var key = it.move();
for (var _f = 0; _f < fields.length; _f++) {
var f = fields[_f];
mol_util_1.StringBuilder.writeSafe(sb, "> <" + category.name + "." + f.name + ">\n");
var val = f.value(key, data, 0);
mol_util_1.StringBuilder.writeSafe(sb, val);
mol_util_1.StringBuilder.writeSafe(sb, '\n\n');
}
};
MolEncoder.prototype.encode = function () {
// write meta-information, do so after ctab
if (this.error || this.metaInformation) {
mol_util_1.StringBuilder.writeSafe(this.builder, mol_util_1.StringBuilder.getString(this.meta));
}
// terminate file (needed for SDF only)
if (!!this.terminator) {
mol_util_1.StringBuilder.writeSafe(this.builder, this.terminator + "\n");
}
this.encoded = true;
};
return MolEncoder;
}(ligand_encoder_1.LigandEncoder));
exports.MolEncoder = MolEncoder;
//# sourceMappingURL=encoder.js.map