diff --git a/src/reader/cif/binary-field.ts b/src/reader/cif/binary/field.ts similarity index 100% rename from src/reader/cif/binary-field.ts rename to src/reader/cif/binary/field.ts diff --git a/src/reader/cif/binary-parser.ts b/src/reader/cif/binary/parser.ts similarity index 100% rename from src/reader/cif/binary-parser.ts rename to src/reader/cif/binary/parser.ts diff --git a/src/reader/cif/index.ts b/src/reader/cif/index.ts index c7ba6c3d50525b954b86d4e77d8d22435a6b9d52..c3882b9e823fadc6954691f9adc8f0a61bbde936 100644 --- a/src/reader/cif/index.ts +++ b/src/reader/cif/index.ts @@ -4,12 +4,15 @@ * @author David Sehnal <david.sehnal@gmail.com> */ -import parseText from './text-parser' +import parseText from './text/parser' +import { Block } from './data-model' import { apply as applySchema } from './schema' import mmCIF from './schema/mmcif' export default { parseText, applySchema, - schema: { mmCIF } + schema: { + mmCIF: (block: Block) => applySchema(mmCIF, block) + } } \ No newline at end of file diff --git a/src/reader/cif/schema.ts b/src/reader/cif/schema.ts index aea1576e91b845a1f3de7a5584b4369ac2b24dab..f6c058f58978af794f5b14fe610cf2a2f37b5ead 100644 --- a/src/reader/cif/schema.ts +++ b/src/reader/cif/schema.ts @@ -71,6 +71,7 @@ export namespace Field { rowCount: field.rowCount, value, isValueDefined: row => presence(row) === Data.ValuePresence.Present, + stringEquals: field.stringEquals, areValuesEqual: field.areValuesEqual, toArray }; diff --git a/src/reader/cif/text-field.ts b/src/reader/cif/text/field.ts similarity index 89% rename from src/reader/cif/text-field.ts rename to src/reader/cif/text/field.ts index c67cc8cf7542fe82bb88517d5087a761c6955ce6..7f0951fb1b5cac66e6ec8afc163fb0d806082207 100644 --- a/src/reader/cif/text-field.ts +++ b/src/reader/cif/text/field.ts @@ -4,11 +4,11 @@ * @author David Sehnal <david.sehnal@gmail.com> */ -import * as Column from '../common/column' -import * as TokenColumn from '../common/text/column/token' -import { Tokens } from '../common/text/tokenizer' -import * as Data from './data-model' -import { parseInt as fastParseInt, parseFloat as fastParseFloat } from '../common/text/number-parser' +import * as Column from '../../common/column' +import * as TokenColumn from '../../common/text/column/token' +import { Tokens } from '../../common/text/tokenizer' +import * as Data from '../data-model' +import { parseInt as fastParseInt, parseFloat as fastParseFloat } from '../../common/text/number-parser' export default function CifTextField(tokens: Tokens, rowCount: number): Data.Field { const { data, indices } = tokens; diff --git a/src/reader/cif/text-parser.ts b/src/reader/cif/text/parser.ts similarity index 99% rename from src/reader/cif/text-parser.ts rename to src/reader/cif/text/parser.ts index 4e37ddb56f5ba53a202962861d8fe407ab161314..606fc02f79a4cd30f97694262715953c6b04576f 100644 --- a/src/reader/cif/text-parser.ts +++ b/src/reader/cif/text/parser.ts @@ -22,10 +22,10 @@ * */ -import * as Data from './data-model' -import Field from './text-field' -import { Tokens, TokenBuilder } from '../common/text/tokenizer' -import Result from '../result' +import * as Data from '../data-model' +import Field from './field' +import { Tokens, TokenBuilder } from '../../common/text/tokenizer' +import Result from '../../result' /** * Types of supported mmCIF tokens. diff --git a/src/reader/common/column.ts b/src/reader/common/column.ts index 1c27a911e42b7ebeda57236e20891b610755c352..5f9fb03cd1cd8fa4fe1c24d8a6f488d2c5102354 100644 --- a/src/reader/common/column.ts +++ b/src/reader/common/column.ts @@ -27,6 +27,7 @@ export interface Column<T> { value(row: number): T, isValueDefined(row: number): boolean, toArray(params?: ToArrayParams): ReadonlyArray<T>, + stringEquals(row: number, value: string): boolean, areValuesEqual(rowA: number, rowB: number): boolean } @@ -42,7 +43,8 @@ export function UndefinedColumn<T extends ColumnType>(rowCount: number, type: T) for (let i = 0, _i = array.length; i < _i; i++) array[i] = value(0) return array; }, - areValuesEqual() { return true; } + stringEquals(row, value) { return !value; }, + areValuesEqual(rowA, rowB) { return true; } } } diff --git a/src/reader/common/text/column/fixed.ts b/src/reader/common/text/column/fixed.ts index 7caf97e35044cde2cee3941b2f8e1f614cf8712f..84a0f561ca37b0a0545b1da5a10c2f3c2b2b4d2c 100644 --- a/src/reader/common/text/column/fixed.ts +++ b/src/reader/common/text/column/fixed.ts @@ -47,6 +47,7 @@ export function FixedColumn<T extends ColumnType>(lines: Tokens, offset: number, value, isValueDefined(row) { return true; }, toArray(params) { return createAndFillArray(rowCount, value, params); }, + stringEquals(row, v) { return value(row) === v; }, areValuesEqual(rowA, rowB) { return value(rowA) === value(rowB); } diff --git a/src/reader/common/text/column/token.ts b/src/reader/common/text/column/token.ts index c78ccc794c83d0847b3a9894858c0330b21ebf79..0c5bb682f0e00a8fa402d945eba8dc3b575f852e 100644 --- a/src/reader/common/text/column/token.ts +++ b/src/reader/common/text/column/token.ts @@ -35,6 +35,16 @@ export function TokenColumn<T extends ColumnType>(tokens: Tokens, type: T): Colu value, isValueDefined(row) { return true; }, toArray(params) { return createAndFillArray(rowCount, value, params); }, + stringEquals(row, v) { + const s = indices[2 * row]; + const value = v || ''; + const len = value.length; + if (len !== indices[2 * row + 1] - s) return false; + for (let i = 0; i < len; i++) { + if (data.charCodeAt(i + s) !== value.charCodeAt(i)) return false; + } + return true; + }, areValuesEqual: areValuesEqualProvider(tokens) }; } diff --git a/src/reader/spec/cif.spec.ts b/src/reader/spec/cif.spec.ts index 8a9cf827777ac7f635c95dc9df9a50a05d7d22b9..6e3824bd8e4d4857168565322da023d31e97c65e 100644 --- a/src/reader/spec/cif.spec.ts +++ b/src/reader/spec/cif.spec.ts @@ -5,7 +5,7 @@ */ import * as Data from '../cif/data-model' -import TextField from '../cif/text-field' +import TextField from '../cif/text/field' import * as Schema from '../cif/schema' const columnData = `123abc`; diff --git a/src/script.ts b/src/script.ts index 06615a362203dfae6bba808ce5d30fc745ee0911..0ac94deb95fa56d622535aa3b3075a89da19ad86 100644 --- a/src/script.ts +++ b/src/script.ts @@ -94,7 +94,7 @@ export function _cif() { console.log(atom_site.getField('Cartn_x')!.float(0)); //console.log(atom_site.getField('label_atom_id')!.toStringArray()); - const mmcif = CIF.applySchema(CIF.schema.mmCIF, data); + const mmcif = CIF.schema.mmCIF(data); console.log(mmcif.atom_site.Cartn_x.value(0)); console.log(mmcif.entity.type.toArray()); console.log(mmcif.pdbx_struct_oper_list.matrix.value(0));