diff --git a/src/apps/cif2bcif/converter.ts b/src/apps/cif2bcif/converter.ts index d50e9acefdd6d28d79b03c7f582f96c345f8bcd9..b17e126c44e1337b487ca8d9d54ade549303b192 100644 --- a/src/apps/cif2bcif/converter.ts +++ b/src/apps/cif2bcif/converter.ts @@ -4,11 +4,11 @@ * @author David Sehnal <david.sehnal@gmail.com> */ -import CIF, { CifCategory } from 'mol-io/reader/cif' +import CIF, { CifCategory, getCifFieldType, CifField } from 'mol-io/reader/cif' import { CifWriter } from 'mol-io/writer/cif' import * as fs from 'fs' -import classify from './field-classifier' import { Progress, Task, RuntimeContext } from 'mol-task'; +import { classifyFloatArray, classifyIntArray } from 'mol-io/common/binary-cif'; function showProgress(p: Progress) { process.stdout.write(`\r${new Array(80).join(' ')}`); @@ -31,6 +31,19 @@ function getCategoryInstanceProvider(cat: CifCategory, fields: CifWriter.Field[] }; } +function classify(name: string, field: CifField): CifWriter.Field { + const type = getCifFieldType(field); + if (type['@type'] === 'str') { + return { name, type: CifWriter.Field.Type.Str, value: field.str, valueKind: field.valueKind }; + } else if (type['@type'] === 'float') { + const encoder = classifyFloatArray(field.toFloatArray({ array: Float64Array })); + return CifWriter.Field.float(name, field.float, { valueKind: field.valueKind, encoder, typedArray: Float64Array }); + } else { + const encoder = classifyIntArray(field.toIntArray({ array: Int32Array })); + return CifWriter.Field.int(name, field.int, { valueKind: field.valueKind, encoder, typedArray: Int32Array }); + } +} + export default function convert(path: string, asText = false) { return Task.create<Uint8Array>('BinaryCIF', async ctx => { const cif = await getCIF(ctx, path); diff --git a/src/apps/cif2bcif/field-classifier.ts b/src/apps/cif2bcif/field-classifier.ts deleted file mode 100644 index 560d1dbe79aabb524a9f8e7e489811afd75c76b1..0000000000000000000000000000000000000000 --- a/src/apps/cif2bcif/field-classifier.ts +++ /dev/null @@ -1,38 +0,0 @@ -/** - * Copyright (c) 2017 mol* contributors, licensed under MIT, See LICENSE file for more info. - * - * @author David Sehnal <david.sehnal@gmail.com> - */ - -import { Column } from 'mol-data/db' -import { CifField } from 'mol-io/reader/cif/data-model' -import { CifWriter } from 'mol-io/writer/cif' -import { classifyFloatArray, classifyIntArray } from 'mol-io/common/binary-cif/classifier'; - -const intRegex = /^-?\d+$/ -const floatRegex = /^-?(([0-9]+)[.]?|([0-9]*[.][0-9]+))([(][0-9]+[)])?([eE][+-]?[0-9]+)?$/ - -// Classify a cif field as str, int or float based the data it contains. -// To classify a field as int or float all items are checked. -function classify(name: string, field: CifField): CifWriter.Field { - let floatCount = 0, hasString = false; - for (let i = 0, _i = field.rowCount; i < _i; i++) { - const k = field.valueKind(i); - if (k !== Column.ValueKind.Present) continue; - const v = field.str(i); - if (intRegex.test(v)) continue; - else if (floatRegex.test(v)) floatCount++; - else { hasString = true; break; } - } - - if (hasString) return { name, type: CifWriter.Field.Type.Str, value: field.str, valueKind: field.valueKind }; - if (floatCount > 0) { - const encoder = classifyFloatArray(field.toFloatArray({ array: Float64Array })); - return CifWriter.Field.float(name, field.float, { valueKind: field.valueKind, encoder, typedArray: Float64Array }); - } else { - const encoder = classifyIntArray(field.toIntArray({ array: Int32Array })); - return CifWriter.Field.int(name, field.int, { valueKind: field.valueKind, encoder, typedArray: Int32Array }); - } -} - -export default classify; \ No newline at end of file diff --git a/src/mol-io/common/binary-cif.ts b/src/mol-io/common/binary-cif.ts index f63c05d25981e1eb1abf07ec27ce0c67696cccd9..37d43e536be58a278b4fcad798bc5d26e66b530b 100644 --- a/src/mol-io/common/binary-cif.ts +++ b/src/mol-io/common/binary-cif.ts @@ -8,4 +8,5 @@ import decode from './binary-cif/decoder' export * from './binary-cif/encoding' export * from './binary-cif/array-encoder' +export * from './binary-cif/classifier' export { decode } \ No newline at end of file