UNPKG

molstar

Version:

A comprehensive macromolecular library.

122 lines 6 kB
/** * Copyright (c) 2020 mol* contributors, licensed under MIT, See LICENSE file for more info. * * @author Sebastian Bittrich <sebastian.bittrich@rcsb.org> */ import { __extends } from "tslib"; import { StringBuilder } from '../../../mol-util'; import { getCategoryInstanceData } from '../cif/encoder/util'; import { LigandEncoder } from '../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) { __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 = StringBuilder.create(); var bonds = StringBuilder.create(); // write Atom block and gather data for Bonds and Charges var _a = 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 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; StringBuilder.writePadLeft(ctab, atom1.Cartn_x.toFixed(4), 10); StringBuilder.writePadLeft(ctab, atom1.Cartn_y.toFixed(4), 10); StringBuilder.writePadLeft(ctab, atom1.Cartn_z.toFixed(4), 10); StringBuilder.whitespace1(ctab); StringBuilder.writePadRight(ctab, atom1.type_symbol, 2); StringBuilder.writeSafe(ctab, ' 0'); StringBuilder.writeIntegerPadLeft(ctab, _this.mapCharge(charge), 3); 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; StringBuilder.writeIntegerPadLeft(bonds, i1 + 1, 3); StringBuilder.writeIntegerPadLeft(bonds, i2 + 1, 3); StringBuilder.writeIntegerPadLeft(bonds, order, 3); StringBuilder.writeSafe(bonds, ' 0 0 0 0\n'); bondCount++; } }); }); // write counts line StringBuilder.writeIntegerPadLeft(this.builder, atoms.size, 3); StringBuilder.writeIntegerPadLeft(this.builder, bondCount, 3); StringBuilder.writeSafe(this.builder, " 0 0 " + (chiral ? 1 : 0) + " 0 0 0 0 0 0\n"); StringBuilder.writeSafe(this.builder, StringBuilder.getString(ctab)); StringBuilder.writeSafe(this.builder, StringBuilder.getString(bonds)); 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 = 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]; StringBuilder.writeSafe(sb, "> <" + category.name + "." + f.name + ">\n"); var val = f.value(key, data, 0); StringBuilder.writeSafe(sb, val); StringBuilder.writeSafe(sb, '\n\n'); } }; MolEncoder.prototype.encode = function () { // write meta-information, do so after ctab if (this.error || this.metaInformation) { StringBuilder.writeSafe(this.builder, StringBuilder.getString(this.meta)); } // terminate file (needed for SDF only) if (!!this.terminator) { StringBuilder.writeSafe(this.builder, this.terminator + "\n"); } this.encoded = true; }; return MolEncoder; }(LigandEncoder)); export { MolEncoder }; //# sourceMappingURL=encoder.js.map