molstar
Version:
A comprehensive macromolecular library.
111 lines (110 loc) • 4.96 kB
JavaScript
/**
* Copyright (c) 2020-2022 mol* contributors, licensed under MIT, See LICENSE file for more info.
*
* @author Sebastian Bittrich <sebastian.bittrich@rcsb.org>
* @author Alexander Rose <alexander.rose@weirdbyte.de>
* @author Jason Pattle <jpattle@exscientia.co.uk>
* @author Panagiotis Tourlas <panagiot_tourlov@hotmail.com>
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.parseSdf = void 0;
var tslib_1 = require("tslib");
var db_1 = require("../../../mol-data/db");
var parser_1 = require("../mol/parser");
var mol_task_1 = require("../../../mol-task");
var result_1 = require("../result");
var tokenizer_1 = require("../common/text/tokenizer");
var token_1 = require("../common/text/column/token");
var parser_v3_util_1 = require("./parser-v3-util");
var delimiter = '$$$$';
function handleDataItems(tokenizer) {
var dataHeader = tokenizer_1.TokenBuilder.create(tokenizer.data, 32);
var data = tokenizer_1.TokenBuilder.create(tokenizer.data, 32);
while (tokenizer.position < tokenizer.length) {
var line = tokenizer_1.Tokenizer.readLine(tokenizer);
if (line.startsWith(delimiter))
break;
if (!line)
continue;
if (line.startsWith('> ')) {
tokenizer_1.TokenBuilder.add(dataHeader, tokenizer.tokenStart + 2, tokenizer.tokenEnd);
tokenizer_1.Tokenizer.markLine(tokenizer);
var start = tokenizer.tokenStart;
var end = tokenizer.tokenEnd;
var added = false;
while (tokenizer.position < tokenizer.length) {
var line2 = tokenizer_1.Tokenizer.readLine(tokenizer);
if (!line2 || line2.startsWith(delimiter) || line2.startsWith('> ')) {
tokenizer_1.TokenBuilder.add(data, start, end);
added = true;
break;
}
end = tokenizer.tokenEnd;
}
if (!added) {
tokenizer_1.TokenBuilder.add(data, start, end);
}
}
}
return {
dataHeader: (0, token_1.TokenColumnProvider)(dataHeader)(db_1.Column.Schema.str),
data: (0, token_1.TokenColumnProvider)(data)(db_1.Column.Schema.str)
};
}
function handleCountsV2(countsAndVersion) {
return {
atomCount: +countsAndVersion.substr(0, 3),
bondCount: +countsAndVersion.substr(3, 3)
};
}
function handleMolFile(tokenizer) {
var title = tokenizer_1.Tokenizer.readLine(tokenizer).trim();
var program = tokenizer_1.Tokenizer.readLine(tokenizer).trim();
var comment = tokenizer_1.Tokenizer.readLine(tokenizer).trim();
var countsAndVersion = tokenizer_1.Tokenizer.readLine(tokenizer);
var molIsV3 = (0, parser_v3_util_1.isV3)(countsAndVersion);
var _a = molIsV3 ? (0, parser_v3_util_1.handleCountsV3)(tokenizer) : handleCountsV2(countsAndVersion), atomCount = _a.atomCount, bondCount = _a.bondCount;
if (Number.isNaN(atomCount) || Number.isNaN(bondCount)) {
// try to skip to next molecule
while (tokenizer.position < tokenizer.length) {
var line = tokenizer_1.Tokenizer.readLine(tokenizer);
if (line.startsWith(delimiter))
break;
}
return;
}
/* No support for formal charge parsing in V3000 molfiles at the moment,
so all charges default to 0.*/
var nullFormalCharges = {
atomIdx: db_1.Column.ofConst(0, atomCount, db_1.Column.Schema.int),
charge: db_1.Column.ofConst(0, atomCount, db_1.Column.Schema.int)
};
var atoms = molIsV3 ? (0, parser_v3_util_1.handleAtomsV3)(tokenizer, atomCount) : (0, parser_1.handleAtoms)(tokenizer, atomCount);
var bonds = molIsV3 ? (0, parser_v3_util_1.handleBondsV3)(tokenizer, bondCount) : (0, parser_1.handleBonds)(tokenizer, bondCount);
var formalCharges = molIsV3 ? nullFormalCharges : (0, parser_1.handlePropertiesBlock)(tokenizer);
var dataItems = handleDataItems(tokenizer);
return {
molFile: { title: title, program: program, comment: comment, atoms: atoms, bonds: bonds, formalCharges: formalCharges },
dataItems: dataItems
};
}
function parseInternal(data) {
var tokenizer = (0, tokenizer_1.Tokenizer)(data);
var compounds = [];
while (tokenizer.position < tokenizer.length) {
var c = handleMolFile(tokenizer);
if (c)
compounds.push(c);
}
return result_1.ReaderResult.success({ compounds: compounds });
}
function parseSdf(data) {
var _this = this;
return mol_task_1.Task.create('Parse Sdf', function () { return tslib_1.__awaiter(_this, void 0, void 0, function () {
return tslib_1.__generator(this, function (_a) {
return [2 /*return*/, parseInternal(data)];
});
}); });
}
exports.parseSdf = parseSdf;
;