molstar
Version:
A comprehensive macromolecular library.
93 lines (92 loc) • 3.9 kB
JavaScript
/**
* Copyright (c) 2021-2022 mol* contributors, licensed under MIT, See LICENSE file for more info.
*
* @author Jason Pattle <jpattle@exscientia.co.uk>
* @author Panagiotis Tourlas <panagiot_tourlov@hotmail.com>
*/
import { Column } from '../../../mol-data/db';
import { Tokenizer, TokenBuilder } from '../common/text/tokenizer';
import { TokenColumnProvider as TokenColumn } from '../common/text/column/token';
export function isV3(versionLine) {
return versionLine.trim().endsWith('V3000');
}
export function handleCountsV3(tokenizer) {
const atomCount = TokenBuilder.create(tokenizer.data, 1);
const bondCount = TokenBuilder.create(tokenizer.data, 1);
Tokenizer.eatLine(tokenizer); // BEGIN CTAB
skipSingleValue(tokenizer); // M
skipSingleValue(tokenizer); // V30
skipSingleValue(tokenizer); // COUNTS
addSingleValue(tokenizer, atomCount);
addSingleValue(tokenizer, bondCount);
Tokenizer.eatLine(tokenizer);
return {
atomCount: TokenColumn(atomCount)(Column.Schema.int).value(0),
bondCount: TokenColumn(bondCount)(Column.Schema.int).value(0)
};
}
export function handleAtomsV3(tokenizer, atomCount) {
const x = TokenBuilder.create(tokenizer.data, atomCount * 2);
const y = TokenBuilder.create(tokenizer.data, atomCount * 2);
const z = TokenBuilder.create(tokenizer.data, atomCount * 2);
const type_symbol = TokenBuilder.create(tokenizer.data, atomCount * 2);
for (let i = 0; i < atomCount; ++i) {
Tokenizer.markLine(tokenizer);
skipSingleValue(tokenizer); // M
skipSingleValue(tokenizer); // V30
skipSingleValue(tokenizer); // Index
const { position } = tokenizer;
addSingleValue(tokenizer, type_symbol);
addSingleValue(tokenizer, x);
addSingleValue(tokenizer, y);
addSingleValue(tokenizer, z);
tokenizer.position = position;
}
Tokenizer.eatLine(tokenizer); // Previous Line
Tokenizer.eatLine(tokenizer); // END ATOM
return {
count: atomCount,
x: TokenColumn(x)(Column.Schema.float),
y: TokenColumn(y)(Column.Schema.float),
z: TokenColumn(z)(Column.Schema.float),
type_symbol: TokenColumn(type_symbol)(Column.Schema.str),
/* No support for formal charge parsing in V3000 molfiles at the moment,
so all charges default to 0.*/
formal_charge: Column.ofConst(0, atomCount, Column.Schema.int)
};
}
export function handleBondsV3(tokenizer, bondCount) {
const atomIdxA = TokenBuilder.create(tokenizer.data, bondCount * 2);
const atomIdxB = TokenBuilder.create(tokenizer.data, bondCount * 2);
const order = TokenBuilder.create(tokenizer.data, bondCount * 2);
for (let i = 0; i < bondCount; ++i) {
Tokenizer.markLine(tokenizer);
skipSingleValue(tokenizer); // M
skipSingleValue(tokenizer); // V30
skipSingleValue(tokenizer); // Index
const { position } = tokenizer;
addSingleValue(tokenizer, order);
addSingleValue(tokenizer, atomIdxA);
addSingleValue(tokenizer, atomIdxB);
tokenizer.position = position;
}
Tokenizer.eatLine(tokenizer); // Previous Line
Tokenizer.eatLine(tokenizer); // END BOND
return {
count: bondCount,
atomIdxA: TokenColumn(atomIdxA)(Column.Schema.float),
atomIdxB: TokenColumn(atomIdxB)(Column.Schema.float),
order: TokenColumn(order)(Column.Schema.float),
};
}
function skipSingleValue(tokenizer) {
Tokenizer.skipWhitespace(tokenizer);
Tokenizer.eatValue(tokenizer);
}
function addSingleValue(tokenizer, tokens) {
const { position: valueStart } = tokenizer;
Tokenizer.skipWhitespace(tokenizer);
Tokenizer.eatValue(tokenizer);
Tokenizer.trim(tokenizer, valueStart, tokenizer.position);
TokenBuilder.addUnchecked(tokens, tokenizer.tokenStart, tokenizer.tokenEnd);
}