UNPKG

molstar

Version:

A comprehensive macromolecular library.

204 lines 9.2 kB
import { __awaiter, __generator } from "tslib"; import * as Data from '../../reader/cif/data-model'; import { CifWriter } from '../cif'; import { decodeMsgPack } from '../../common/msgpack/decode'; import { Field } from '../../reader/cif/binary/field'; import { TextEncoder } from '../cif/encoder/text'; import * as C from '../cif/encoder'; import { Column, Database, Table } from '../../../mol-data/db'; import { parseCifText } from '../../reader/cif/text/parser'; var cartn_x = Data.CifField.ofNumbers([1.001, 1.002, 1.003, 1.004, 1.005, 1.006, 1.007, 1.008, 1.009]); var cartn_y = Data.CifField.ofNumbers([-3.0, -2.666, -2.3333, -2.0, -1.666, -1.333, -1.0, -0.666, -0.333]); var cartn_z = Data.CifField.ofNumbers([1, 2, 3, 4, 5, 6, 7, 8, 9].map(function (i) { return Math.sqrt(i); })); var label_seq_id = Data.CifField.ofNumbers([1, 2, 3, 6, 11, 23, 47, 106, 235]); var atom_site = Data.CifCategory.ofFields('atom_site', { 'Cartn_x': cartn_x, 'Cartn_y': cartn_y, 'Cartn_z': cartn_z, 'label_seq_id': label_seq_id }); var field1 = Data.CifField.ofNumbers([1, 2, 3, 6, 11, 23, 47, 106, 235]); var field2 = Data.CifField.ofNumbers([-1, -2, -3, -6, -11, -23, -47, -106, -235]); var other_fields = Data.CifCategory.ofFields('other_fields', { 'field1': field1, 'field2': field2 }); var encoding_aware_encoder = CifWriter.createEncoder({ binary: true, binaryAutoClassifyEncoding: true, binaryEncodingPovider: CifWriter.createEncodingProviderFromJsonConfig([ { 'categoryName': 'atom_site', 'columnName': 'Cartn_y', 'encoding': 'rle', 'precision': 0 }, { 'categoryName': 'atom_site', 'columnName': 'Cartn_z', 'encoding': 'delta', 'precision': 1 }, { 'categoryName': 'atom_site', 'columnName': 'label_seq_id', 'encoding': 'delta-rle' } ]) }); test('cif writer value escaping', function () { return __awaiter(void 0, void 0, void 0, function () { var values, table, encoder, data, result, cat, parsed, i; var _a; return __generator(this, function (_b) { switch (_b.label) { case 0: values = ['1', ' ', ' ', " ' ", "a'", "b\"", "\"", ' a ', "\"'\"", "'\"", "\na"]; table = Table.ofArrays({ values: Column.Schema.str }, { values: values }); encoder = new TextEncoder(); C.Encoder.writeDatabase(encoder, 'test', Database.ofTables('test', { test: table._schema }, { test: table })); encoder.encode(); data = encoder.getData(); return [4 /*yield*/, parseCifText(data).run()]; case 1: result = _b.sent(); if (result.isError) { expect(false).toBe(true); return [2 /*return*/]; } cat = result.result.blocks[0].categories['test']; parsed = (_a = cat.getField('values')) === null || _a === void 0 ? void 0 : _a.toStringArray(); expect(values.length).toBe(parsed === null || parsed === void 0 ? void 0 : parsed.length); for (i = 0; i < values.length; i++) { expect(values[i]).toBe(parsed === null || parsed === void 0 ? void 0 : parsed[i]); } return [2 /*return*/]; } }); }); }); describe('encoding-config', function () { var decoded = process(encoding_aware_encoder); var decoded_atom_site = decoded.blocks[0].categories['atom_site']; var decoded_cartn_x = decoded_atom_site.getField('Cartn_x'); var decoded_cartn_y = decoded_atom_site.getField('Cartn_y'); var decoded_cartn_z = decoded_atom_site.getField('Cartn_z'); var decoded_label_seq_id = decoded_atom_site.getField('label_seq_id'); var delta = 0.001; function assert(e, a) { expect(e.length).toBe(a.length); for (var i = 0; i < e.length; i++) { expect(Math.abs(e[i] - a[i])).toBeLessThan(delta); } } function join(field) { return field.binaryEncoding.map(function (e) { return e.kind; }).join(); } it('strategy', function () { expect(join(decoded_cartn_x)).toBe('FixedPoint,Delta,IntegerPacking,ByteArray'); expect(join(decoded_cartn_y)).toBe('FixedPoint,RunLength,IntegerPacking,ByteArray'); expect(join(decoded_cartn_z)).toBe('FixedPoint,Delta,IntegerPacking,ByteArray'); expect(join(decoded_label_seq_id)).toBe('Delta,RunLength,IntegerPacking,ByteArray'); }); it('precision', function () { assert(decoded_cartn_x.toFloatArray(), cartn_x.toFloatArray()); assert(decoded_cartn_y.toFloatArray(), cartn_y.toFloatArray().map(function (d) { return Math.round(d); })); assert(decoded_cartn_z.toFloatArray(), cartn_z.toFloatArray().map(function (d) { return Math.round(d * 10) / 10; })); assert(decoded_label_seq_id.toIntArray(), label_seq_id.toIntArray()); }); }); var filter_aware_encoder1 = CifWriter.createEncoder({ binary: true, binaryAutoClassifyEncoding: true }); filter_aware_encoder1.setFilter(C.Category.filterOf('atom_site\n' + '\n' + 'atom_site.Cartn_x\n' + 'atom_site.Cartn_y\n')); var filter_aware_encoder2 = CifWriter.createEncoder({ binary: true }); filter_aware_encoder2.setFilter(C.Category.filterOf('!atom_site\n' + '\n' + '!other_fields.field2\n')); describe('filtering-config', function () { var decoded1 = process(filter_aware_encoder1); var atom_site1 = decoded1.blocks[0].categories['atom_site']; var cartn_x1 = atom_site1.getField('Cartn_x'); var cartn_y1 = atom_site1.getField('Cartn_y'); var cartn_z1 = atom_site1.getField('Cartn_z'); var label_seq_id1 = atom_site1.getField('label_seq_id'); var fields1 = decoded1.blocks[0].categories['other_fields']; it('whitelist-filtering', function () { expect(atom_site1).toBeDefined(); expect(cartn_x1).toBeDefined(); expect(cartn_y1).toBeDefined(); expect(cartn_z1).toBeUndefined(); expect(label_seq_id1).toBeUndefined(); expect(fields1).toBeUndefined(); }); var decoded2 = process(filter_aware_encoder2); var atom_site2 = decoded2.blocks[0].categories['atom_site']; var fields2 = decoded2.blocks[0].categories['other_fields']; var field12 = fields2.getField('field1'); var field22 = fields2.getField('field2'); it('blacklist-filtering', function () { expect(atom_site2).toBeUndefined(); expect(fields2).toBeDefined(); expect(field12).toBeDefined(); expect(field22).toBeUndefined(); }); }); function process(encoder) { encoder.startDataBlock('test'); for (var _i = 0, _a = [atom_site, other_fields]; _i < _a.length; _i++) { var cat = _a[_i]; var fields = []; for (var _b = 0, _c = cat.fieldNames; _b < _c.length; _b++) { var f = _c[_b]; fields.push(wrap(f, cat.getField(f))); } encoder.writeCategory(getCategoryInstanceProvider(cat, fields)); } var encoded = encoder.getData(); var unpacked = decodeMsgPack(encoded); return Data.CifFile(unpacked.dataBlocks.map(function (block) { var cats = Object.create(null); for (var _i = 0, _a = block.categories; _i < _a.length; _i++) { var cat = _a[_i]; cats[cat.name.substr(1)] = Category(cat); } return Data.CifBlock(block.categories.map(function (c) { return c.name.substr(1); }), cats, block.header); })); } function getCategoryInstanceProvider(cat, fields) { return { name: cat.name, instance: function () { return CifWriter.categoryInstance(fields, { data: cat, rowCount: cat.rowCount }); } }; } function wrap(name, field) { var type = Data.getCifFieldType(field); if (type['@type'] === 'str') { return { name: name, type: 0 /* Str */, value: field.str, valueKind: field.valueKind }; } else if (type['@type'] === 'float') { return { name: name, type: 2 /* Float */, value: field.float, valueKind: field.valueKind }; } else { return { name: name, type: 1 /* Int */, value: field.int, valueKind: field.valueKind }; } } function Category(data) { var map = Object.create(null); var cache = Object.create(null); for (var _i = 0, _a = data.columns; _i < _a.length; _i++) { var col = _a[_i]; map[col.name] = col; } return { rowCount: data.rowCount, name: data.name.substr(1), fieldNames: data.columns.map(function (c) { return c.name; }), getField: function (name) { var col = map[name]; if (!col) return void 0; if (!!cache[name]) return cache[name]; cache[name] = Field(col); return cache[name]; } }; } //# sourceMappingURL=cif.spec.js.map