|
@@ -1,3 +1,10 @@
|
|
|
+
|
|
|
+ * Copyright (c) 2017-2018 mol* contributors, licensed under MIT, See LICENSE file for more info.
|
|
|
+ *
|
|
|
+ * @author Zepei Xu <xuzepei19950617@gmail.com>
|
|
|
+ * @author Alexander Rose <alexander.rose@weirdbyte.de>
|
|
|
+ */
|
|
|
+
|
|
|
|
|
|
|
|
|
|
|
@@ -11,6 +18,8 @@ import * as Schema from './schema'
|
|
|
import Result from '../result'
|
|
|
import Computation from 'mol-util/computation'
|
|
|
|
|
|
+const { skipWhitespace, eatValue, markLine, getTokenString, readLine } = Tokenizer;
|
|
|
+
|
|
|
interface State {
|
|
|
tokenizer: Tokenizer,
|
|
|
molecule: Schema.Molecule,
|
|
@@ -40,36 +49,37 @@ function State(tokenizer: Tokenizer, ctx: Computation.Context): State {
|
|
|
};
|
|
|
}
|
|
|
|
|
|
+const reWhitespace = /\s+/g;
|
|
|
+
|
|
|
function handleMolecule(state: State) {
|
|
|
const { tokenizer, molecule } = state;
|
|
|
- Tokenizer.markLine(tokenizer);
|
|
|
- Tokenizer.markLine(tokenizer);
|
|
|
- molecule.mol_name = Tokenizer.getTokenString(tokenizer);
|
|
|
+ markLine(tokenizer);
|
|
|
+ markLine(tokenizer);
|
|
|
+ molecule.mol_name = getTokenString(tokenizer);
|
|
|
|
|
|
- Tokenizer.markLine(tokenizer);
|
|
|
- const values = Tokenizer.getTokenString(tokenizer).trim().split(/\s+/g);
|
|
|
- molecule.num_atoms = parseInt(values[0]) ? parseInt(values[1]) : 0;
|
|
|
+ markLine(tokenizer);
|
|
|
+ const values = getTokenString(tokenizer).trim().split(reWhitespace);
|
|
|
+ molecule.num_atoms = parseInt(values[0]) ? parseInt(values[0]) : 0;
|
|
|
molecule.num_bonds = parseInt(values[1]) ? parseInt(values[1]) : 0;
|
|
|
- molecule.num_subst = parseInt(values[2]) ? parseInt(values[1]) : 0;
|
|
|
- molecule.num_feat = parseInt(values[3]) ? parseInt(values[1]) : 0;
|
|
|
- molecule.num_sets = parseInt(values[4]) ? parseInt(values[1]) : 0;
|
|
|
+ molecule.num_subst = parseInt(values[2]) ? parseInt(values[2]) : 0;
|
|
|
+ molecule.num_feat = parseInt(values[3]) ? parseInt(values[3]) : 0;
|
|
|
+ molecule.num_sets = parseInt(values[4]) ? parseInt(values[4]) : 0;
|
|
|
|
|
|
- Tokenizer.markLine(tokenizer);
|
|
|
- molecule.mol_type = Tokenizer.getTokenString(tokenizer);
|
|
|
+ markLine(tokenizer);
|
|
|
+ molecule.mol_type = getTokenString(tokenizer);
|
|
|
|
|
|
- Tokenizer.markLine(tokenizer);
|
|
|
- molecule.charge_type = Tokenizer.getTokenString(tokenizer);
|
|
|
+ markLine(tokenizer);
|
|
|
+ molecule.charge_type = getTokenString(tokenizer);
|
|
|
|
|
|
- Tokenizer.markLine(tokenizer);
|
|
|
- if (Tokenizer.getTokenString(tokenizer) == '') return
|
|
|
- molecule.status_bits = Tokenizer.getTokenString(tokenizer)
|
|
|
+ markLine(tokenizer);
|
|
|
+ if (getTokenString(tokenizer) === '') return
|
|
|
+ molecule.status_bits = getTokenString(tokenizer)
|
|
|
|
|
|
- Tokenizer.markLine(tokenizer);
|
|
|
- if (Tokenizer.getTokenString(tokenizer) == '') return
|
|
|
- molecule.mol_comment = Tokenizer.getTokenString(tokenizer)
|
|
|
+ markLine(tokenizer);
|
|
|
+ if (getTokenString(tokenizer) === '') return
|
|
|
+ molecule.mol_comment = getTokenString(tokenizer)
|
|
|
}
|
|
|
|
|
|
-
|
|
|
function isStatus_bit(aString: String): Boolean{
|
|
|
if(aString.includes('DSPMOD') || aString.includes('TYPECOL') || aString.includes('CAP')
|
|
|
|| aString.includes('BACKBONE') || aString.includes('DICT') || aString.includes('ESSENTIAL')
|
|
@@ -79,7 +89,6 @@ function isStatus_bit(aString: String): Boolean{
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
-
|
|
|
async function handleAtoms(state: State): Promise<Schema.Atoms> {
|
|
|
const { tokenizer, molecule } = state;
|
|
|
let hasSubst_id = false;
|
|
@@ -88,17 +97,17 @@ async function handleAtoms(state: State): Promise<Schema.Atoms> {
|
|
|
let hasStatus_bit = false;
|
|
|
|
|
|
|
|
|
- while(Tokenizer.getTokenString(tokenizer) != '@<TRIPOS>ATOM'){
|
|
|
- Tokenizer.markLine(tokenizer);
|
|
|
+ while(getTokenString(tokenizer) != '@<TRIPOS>ATOM'){
|
|
|
+ markLine(tokenizer);
|
|
|
}
|
|
|
|
|
|
const initialTokenizerPosition = tokenizer.position;
|
|
|
const initialTokenizerLineNumber = tokenizer.lineNumber;
|
|
|
- const firstLine = Tokenizer.readLine(tokenizer);
|
|
|
+ const firstLine = readLine(tokenizer);
|
|
|
const firstLineArray = firstLine.trim().split(/\s+/g)
|
|
|
const firstLineLength = firstLineArray.length;
|
|
|
|
|
|
-
|
|
|
+
|
|
|
|
|
|
for(let i = 6; i < firstLineLength; i++){
|
|
|
if(!isNaN(Number(firstLineArray[i]))){
|
|
@@ -116,17 +125,13 @@ async function handleAtoms(state: State): Promise<Schema.Atoms> {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+
|
|
|
const atom_idTokens = TokenBuilder.create(tokenizer, molecule.num_atoms * 2);
|
|
|
const atom_nameTokens = TokenBuilder.create(tokenizer, molecule.num_atoms * 2);;
|
|
|
const xTokens = TokenBuilder.create(tokenizer, molecule.num_atoms * 2);
|
|
|
const yTokens = TokenBuilder.create(tokenizer, molecule.num_atoms * 2);
|
|
|
const zTokens = TokenBuilder.create(tokenizer, molecule.num_atoms * 2);
|
|
|
const atom_typeTokens = TokenBuilder.create(tokenizer, molecule.num_atoms * 2);
|
|
|
-
|
|
|
- const subst_idTokens = TokenBuilder.create(tokenizer, molecule.num_atoms * 2);
|
|
|
- const subst_nameTokens = TokenBuilder.create(tokenizer, molecule.num_atoms * 2);
|
|
|
- const chargeTokens = TokenBuilder.create(tokenizer, molecule.num_atoms * 2);
|
|
|
- const status_bitTokens = TokenBuilder.create(tokenizer, molecule.num_atoms * 2);
|
|
|
|
|
|
const atom_idTokenColumn = TokenColumn(atom_idTokens);
|
|
|
const atom_nameTokenColumn = TokenColumn(atom_nameTokens);
|
|
@@ -134,7 +139,13 @@ async function handleAtoms(state: State): Promise<Schema.Atoms> {
|
|
|
const yTokenColumn = TokenColumn(yTokens);
|
|
|
const zTokenColumn = TokenColumn(zTokens);
|
|
|
const atom_typeColumn = TokenColumn(atom_typeTokens);
|
|
|
-
|
|
|
+
|
|
|
+
|
|
|
+ const subst_idTokens = TokenBuilder.create(tokenizer, molecule.num_atoms * 2);
|
|
|
+ const subst_nameTokens = TokenBuilder.create(tokenizer, molecule.num_atoms * 2);
|
|
|
+ const chargeTokens = TokenBuilder.create(tokenizer, molecule.num_atoms * 2);
|
|
|
+ const status_bitTokens = TokenBuilder.create(tokenizer, molecule.num_atoms * 2);
|
|
|
+
|
|
|
const subst_idTokenColumn = TokenColumn(subst_idTokens);
|
|
|
const subst_nameTokenColumn = TokenColumn(subst_nameTokens);
|
|
|
const chargeTokenColumn = TokenColumn(chargeTokens);
|
|
@@ -144,7 +155,7 @@ async function handleAtoms(state: State): Promise<Schema.Atoms> {
|
|
|
const undefInt = Column.Undefined(molecule.num_atoms, Column.Schema.int);
|
|
|
const undefStr = Column.Undefined(molecule.num_atoms, Column.Schema.str);
|
|
|
|
|
|
- let numOfColumn = 5;
|
|
|
+ let numOfColumn = 6;
|
|
|
if(hasSubst_id){numOfColumn++}
|
|
|
if(hasSubst_name){numOfColumn++}
|
|
|
if(hasCharge){numOfColumn++}
|
|
@@ -163,8 +174,9 @@ async function handleAtoms(state: State): Promise<Schema.Atoms> {
|
|
|
let chargeWritten = false;
|
|
|
let status_bitWritten = false;
|
|
|
for(let j = 0; j < numOfColumn; j++){
|
|
|
- Tokenizer.skipWhitespace(tokenizer);
|
|
|
- Tokenizer.eatValue(tokenizer);
|
|
|
+ skipWhitespace(tokenizer);
|
|
|
+ tokenizer.tokenStart = tokenizer.position;
|
|
|
+ eatValue(tokenizer);
|
|
|
switch(j){
|
|
|
case 0:
|
|
|
TokenBuilder.addUnchecked(atom_idTokens, tokenizer.tokenStart, tokenizer.tokenEnd);
|
|
@@ -185,16 +197,16 @@ async function handleAtoms(state: State): Promise<Schema.Atoms> {
|
|
|
TokenBuilder.addUnchecked(atom_typeTokens, tokenizer.tokenStart, tokenizer.tokenEnd);
|
|
|
break;
|
|
|
default:
|
|
|
- if(hasSubst_id == true && subst_idWritten == false){
|
|
|
+ if(hasSubst_id === true && subst_idWritten === false){
|
|
|
TokenBuilder.addUnchecked(subst_idTokens, tokenizer.tokenStart, tokenizer.tokenEnd);
|
|
|
subst_idWritten = true;
|
|
|
- }else if(hasSubst_name == true && subst_nameWritten == false){
|
|
|
+ }else if(hasSubst_name === true && subst_nameWritten === false){
|
|
|
TokenBuilder.addUnchecked(subst_nameTokens, tokenizer.tokenStart, tokenizer.tokenEnd);
|
|
|
subst_nameWritten = true;
|
|
|
- }else if(hasCharge == true && chargeWritten == false){
|
|
|
+ }else if(hasCharge === true && chargeWritten === false){
|
|
|
TokenBuilder.addUnchecked(chargeTokens, tokenizer.tokenStart, tokenizer.tokenEnd);
|
|
|
chargeWritten = true;
|
|
|
- }else if(hasStatus_bit == true && status_bitWritten == false){
|
|
|
+ }else if(hasStatus_bit === true && status_bitWritten === false){
|
|
|
TokenBuilder.addUnchecked(status_bitTokens, tokenizer.tokenStart, tokenizer.tokenEnd);
|
|
|
status_bitWritten = true;
|
|
|
}
|
|
@@ -213,12 +225,12 @@ async function handleAtoms(state: State): Promise<Schema.Atoms> {
|
|
|
y: yTokenColumn(Column.Schema.float),
|
|
|
z: zTokenColumn(Column.Schema.float),
|
|
|
atom_type: atom_typeColumn(Column.Schema.str),
|
|
|
-
|
|
|
+
|
|
|
+
|
|
|
subst_id: hasSubst_id ? subst_idTokenColumn(Column.Schema.int) : undefInt,
|
|
|
subst_name: hasSubst_name ? subst_nameTokenColumn(Column.Schema.str) : undefStr,
|
|
|
charge: hasCharge ? chargeTokenColumn(Column.Schema.float) : undefFloat,
|
|
|
status_bit: hasStatus_bit ? status_bitTokenColumn(Column.Schema.str) : undefStr,
|
|
|
-
|
|
|
};
|
|
|
return ret;
|
|
|
}
|
|
@@ -227,13 +239,13 @@ async function handleBonds(state: State): Promise<Schema.Bonds> {
|
|
|
const { tokenizer, molecule } = state;
|
|
|
let hasStatus_bit = false;
|
|
|
|
|
|
- while(Tokenizer.getTokenString(tokenizer) != '@<TRIPOS>BOND'){
|
|
|
- Tokenizer.markLine(tokenizer);
|
|
|
+ while(getTokenString(tokenizer) !== '@<TRIPOS>BOND'){
|
|
|
+ markLine(tokenizer);
|
|
|
}
|
|
|
|
|
|
const initialTokenizerPosition = tokenizer.position;
|
|
|
const initialTokenizerLineNumber = tokenizer.lineNumber;
|
|
|
- const firstLine = Tokenizer.readLine(tokenizer);
|
|
|
+ const firstLine = readLine(tokenizer);
|
|
|
const firstLineArray = firstLine.trim().split(/\s+/g)
|
|
|
const firstLineLength = firstLineArray.length;
|
|
|
if(firstLineLength === 5){
|
|
@@ -268,8 +280,9 @@ async function handleBonds(state: State): Promise<Schema.Bonds> {
|
|
|
const linesToRead = Math.min(molecule.num_bonds - linesAlreadyRead, chunkSize);
|
|
|
for(let i = 0; i < linesToRead; i++){
|
|
|
for(let j = 0; j < numberOfColumn; j++){
|
|
|
- Tokenizer.skipWhitespace(tokenizer);
|
|
|
- Tokenizer.eatValue(tokenizer);
|
|
|
+ skipWhitespace(tokenizer);
|
|
|
+ tokenizer.tokenStart = tokenizer.position;
|
|
|
+ eatValue(tokenizer);
|
|
|
switch(j){
|
|
|
case 0:
|
|
|
TokenBuilder.addUnchecked(bond_idTokens, tokenizer.tokenStart, tokenizer.tokenEnd);
|