From f8d085a0348cc139ed39ca120663cb6080e78bc2 Mon Sep 17 00:00:00 2001 From: Sebastian Bittrich <bittrich@hs-mittweida.de> Date: Fri, 7 Jun 2019 15:38:06 -0700 Subject: [PATCH] white-/blacklist filtering --- src/mol-io/writer/_spec/cif.spec.ts | 169 +++++++++++++++++++--------- 1 file changed, 116 insertions(+), 53 deletions(-) diff --git a/src/mol-io/writer/_spec/cif.spec.ts b/src/mol-io/writer/_spec/cif.spec.ts index 7231c5d82..b0c3bfc61 100644 --- a/src/mol-io/writer/_spec/cif.spec.ts +++ b/src/mol-io/writer/_spec/cif.spec.ts @@ -2,17 +2,20 @@ import * as Data from '../../reader/cif/data-model' import { CifWriter } from '../cif'; import decodeMsgPack from '../../common/msgpack/decode' import { EncodedFile, EncodedCategory } from '../../common/binary-cif'; -import Field from '../../reader/cif/binary/field' +import Field from '../../reader/cif/binary/field'; +import * as C from '../cif/encoder'; const cartn_x = Data.CifField.ofNumbers([1.001, 1.002, 1.003, 1.004, 1.005, 1.006, 1.007, 1.008, 1.009]); const cartn_y = Data.CifField.ofNumbers([-3.0, -2.666, -2.3333, -2.0, -1.666, -1.333, -1.0, -0.666, -0.333]); const cartn_z = Data.CifField.ofNumbers([1, 2, 3, 4, 5, 6, 7, 8, 9].map(i => Math.sqrt(i))); const label_seq_id = Data.CifField.ofNumbers([1, 2, 3, 6, 11, 23, 47, 106, 235]); const 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 }); +const field1 = Data.CifField.ofNumbers([1, 2, 3, 6, 11, 23, 47, 106, 235]); +const field2 = Data.CifField.ofNumbers([-1, -2, -3, -6, -11, -23, -47, -106, -235]); +const other_fields = Data.CifCategory.ofFields('other_fields', { 'field1': field1, 'field2': field2 }); -const encoder = CifWriter.createEncoder({ +const encoding_aware_encoder = CifWriter.createEncoder({ binary: true, - encoderName: 'mol*', binaryAutoClassifyEncoding: true, binaryEncodingPovider: CifWriter.createEncodingProviderFromJsonConfig([ { @@ -35,6 +38,115 @@ const encoder = CifWriter.createEncoder({ ]) }); +describe('encoding-config', () => { + const decoded = process(encoding_aware_encoder); + + const decoded_atom_site = decoded.blocks[0].categories['atom_site']; + const decoded_cartn_x = decoded_atom_site.getField('Cartn_x')!; + const decoded_cartn_y = decoded_atom_site.getField('Cartn_y')!; + const decoded_cartn_z = decoded_atom_site.getField('Cartn_z')!; + const decoded_label_seq_id = decoded_atom_site.getField('label_seq_id')!; + + const delta = 0.001; + function assert(e: ArrayLike<number>, a: ArrayLike<number>) { + expect(e.length).toBe(a.length); + for (let i = 0; i < e.length; i++) { + expect(Math.abs(e[i] - a[i])).toBeLessThan(delta); + } + } + + function join(field: Data.CifField) { + return field.binaryEncoding!.map(e => e.kind).join(); + } + + it('strategy', () => { + 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', () => { + assert(decoded_cartn_x.toFloatArray(), cartn_x.toFloatArray()); + assert(decoded_cartn_y.toFloatArray(), cartn_y.toFloatArray().map(d => Math.round(d))); + assert(decoded_cartn_z.toFloatArray(), cartn_z.toFloatArray().map(d => Math.round(d * 10) / 10)); + assert(decoded_label_seq_id.toIntArray(), label_seq_id.toIntArray()); + }); +}); + +const filter_aware_encoder1 = CifWriter.createEncoder({ + binary: true, + binaryAutoClassifyEncoding: true +}); +filter_aware_encoder1.setFilter(C.Category.whitelistBlacklistFilter(['atom_site'], // allow only category atom_site + [], // blacklist no categories + ['atom_site.Cartn_x', 'atom_site.Cartn_y'], // for atom_site: allow only Cartn_x and Cartn_y + [])); // blacklist no fields + +const filter_aware_encoder2 = CifWriter.createEncoder({ + binary: true +}); +filter_aware_encoder2.setFilter(C.Category.whitelistBlacklistFilter([], + ['atom_site'], // ignore atom_site category + [], + ['other_fields.field2'])); // exclude field2 + +describe('filtering-config', () => { + const decoded1 = process(filter_aware_encoder1); + + const atom_site1 = decoded1.blocks[0].categories['atom_site']; + const cartn_x1 = atom_site1.getField('Cartn_x'); + const cartn_y1 = atom_site1.getField('Cartn_y'); + const cartn_z1 = atom_site1.getField('Cartn_z'); + const label_seq_id1 = atom_site1.getField('label_seq_id'); + const fields1 = decoded1.blocks[0].categories['other_fields']; + + it('whitelist-filtering', () => { + expect(atom_site1).toBeDefined(); + expect(cartn_x1).toBeDefined(); + expect(cartn_y1).toBeDefined(); + expect(cartn_z1).toBeUndefined(); + expect(label_seq_id1).toBeUndefined(); + expect(fields1).toBeUndefined(); + }); + + const decoded2 = process(filter_aware_encoder2); + + const atom_site2 = decoded2.blocks[0].categories['atom_site']; + const fields2 = decoded2.blocks[0].categories['other_fields']; + const field12 = fields2.getField('field1'); + const field22 = fields2.getField('field2'); + + it('blacklist-filtering', () => { + expect(atom_site2).toBeUndefined(); + expect(fields2).toBeDefined(); + expect(field12).toBeDefined(); + expect(field22).toBeUndefined(); + }); +}); + +function process(encoder: C.Encoder) { + encoder.startDataBlock('test'); + + for (const cat of [atom_site, other_fields]) { + const fields: CifWriter.Field[] = []; + for (const f of cat.fieldNames) { + fields.push(wrap(f, cat.getField(f)!)) + } + encoder.writeCategory(getCategoryInstanceProvider(cat, fields)); + } + + const encoded = encoder.getData() as Uint8Array; + + const unpacked = decodeMsgPack(encoded) as EncodedFile; + return Data.CifFile(unpacked.dataBlocks.map(block => { + const cats = Object.create(null); + for (const cat of block.categories) cats[cat.name.substr(1)] = Category(cat); + return Data.CifBlock(block.categories.map(c => c.name.substr(1)), cats, block.header); + })); +} + + function getCategoryInstanceProvider(cat: Data.CifCategory, fields: CifWriter.Field[]): CifWriter.Category { return { name: cat.name, @@ -69,53 +181,4 @@ function Category(data: EncodedCategory): Data.CifCategory { return cache[name]; } } -} -describe('config', () => { - encoder.startDataBlock('test'); - const fields: CifWriter.Field[] = []; - for (const f of atom_site.fieldNames) { - fields.push(wrap(f, atom_site.getField(f)!)) - } - - encoder.writeCategory(getCategoryInstanceProvider(atom_site, fields)); - const encoded = encoder.getData() as Uint8Array; - - const unpacked = decodeMsgPack(encoded) as EncodedFile; - const decoded = Data.CifFile(unpacked.dataBlocks.map(block => { - const cats = Object.create(null); - for (const cat of block.categories) cats[cat.name.substr(1)] = Category(cat); - return Data.CifBlock(block.categories.map(c => c.name.substr(1)), cats, block.header); - })); - - const decoded_atom_site = decoded.blocks[0].categories['atom_site']; - const decoded_cartn_x = decoded_atom_site.getField('Cartn_x')!; - const decoded_cartn_y = decoded_atom_site.getField('Cartn_y')!; - const decoded_cartn_z = decoded_atom_site.getField('Cartn_z')!; - const decoded_label_seq_id = decoded_atom_site.getField('label_seq_id')!; - - const delta = 0.001; - function assert(e: ArrayLike<number>, a: ArrayLike<number>) { - expect(e.length).toBe(a.length); - for (let i = 0; i < e.length; i++) { - expect(Math.abs(e[i] - a[i])).toBeLessThan(delta); - } - } - - function join(field: Data.CifField) { - return field.binaryEncoding!.map(e => e.kind).join(); - } - - it('strategy', () => { - 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', () => { - assert(decoded_cartn_x.toFloatArray(), cartn_x.toFloatArray()); - assert(decoded_cartn_y.toFloatArray(), cartn_y.toFloatArray().map(d => Math.round(d))); - assert(decoded_cartn_z.toFloatArray(), cartn_z.toFloatArray().map(d => Math.round(d * 10) / 10)); - assert(decoded_label_seq_id.toIntArray(), label_seq_id.toIntArray()); - }); -}) \ No newline at end of file +} \ No newline at end of file -- GitLab