Skip to content
Snippets Groups Projects
Commit 087fe949 authored by David Sehnal's avatar David Sehnal
Browse files

cif2bcif tweak

parent e3fa3561
Branches
Tags
No related merge requests found
......@@ -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);
......
/**
* 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
......@@ -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
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment