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

cif2bcif tweak

parent e3fa3561
No related branches found
No related tags found
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.
Finish editing this message first!
Please register or to comment