Browse Source

cif2bcif tweak

David Sehnal 6 years ago
parent
commit
087fe949eb

+ 15 - 2
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);

+ 0 - 38
src/apps/cif2bcif/field-classifier.ts

@@ -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;

+ 1 - 0
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 }