UNPKG

molstar

Version:

A comprehensive macromolecular library.

101 lines (100 loc) 3.96 kB
/** * Copyright (c) 2017-2018 mol* contributors, licensed under MIT, See LICENSE file for more info. * * @author David Sehnal <david.sehnal@gmail.com> */ import { SetUtils } from '../../../../mol-util/set'; import { UniqueArray } from '../../../../mol-data/generic'; import { sortArray } from '../../../../mol-data/util'; import { CifWriter } from '../../../../mol-io/writer/cif'; import { MmcifFormat } from '../../../../mol-model-formats/structure/mmcif'; import { getCifFieldType } from '../../../../mol-io/reader/cif'; export function getModelMmCifCategory(model, name) { if (!MmcifFormat.is(model.sourceData)) return; return model.sourceData.data.db[name]; } export function getUniqueResidueNamesFromStructures(structures) { return SetUtils.unionMany.apply(SetUtils, structures.map(function (s) { return s.uniqueResidueNames; })); } export function getUniqueEntityIdsFromStructures(structures) { if (structures.length === 0) return new Set(); var names = structures[0].model.entities.data.id; return new Set(getUniqueEntityIndicesFromStructures(structures).map(function (i) { return names.value(i); })); } export function getUniqueEntityIndicesFromStructures(structures) { if (structures.length === 0) return []; if (structures.length === 1) return structures[0].entityIndices; var ret = UniqueArray.create(); for (var _i = 0, structures_1 = structures; _i < structures_1.length; _i++) { var s = structures_1[_i]; for (var _a = 0, _b = s.entityIndices; _a < _b.length; _a++) { var e = _b[_a]; UniqueArray.add(ret, e, e); } } sortArray(ret.array); return ret.array; } export function copy_mmCif_category(name, condition) { return { name: name, instance: function (_a) { var structures = _a.structures; if (condition && !condition(structures[0])) return CifWriter.Category.Empty; var model = structures[0].model; if (!MmcifFormat.is(model.sourceData)) return CifWriter.Category.Empty; var table = model.sourceData.data.db[name]; if (!table || !table._rowCount) return CifWriter.Category.Empty; return CifWriter.Category.ofTable(table); } }; } export function copy_source_mmCifCategory(encoder, ctx, category) { if (!MmcifFormat.is(ctx.firstModel.sourceData)) return; var fs = CifWriter.fields(); if (encoder.isBinary) { for (var _i = 0, _a = category.fieldNames; _i < _a.length; _i++) { var f = _a[_i]; // TODO: this could be optimized var field = classifyField(f, category.getField(f)); fs.add(field); } } else { var _loop_1 = function (f) { var field = category.getField(f); fs.str(f, function (row) { return field.str(row); }); }; for (var _b = 0, _c = category.fieldNames; _b < _c.length; _b++) { var f = _c[_b]; _loop_1(f); } } var fields = fs.getFields(); return { name: category.name, instance: function () { return { fields: fields, source: [{ data: void 0, rowCount: category.rowCount }] }; } }; } function classifyField(name, field) { var type = getCifFieldType(field); if (type['@type'] === 'str') { return { name: name, type: 0 /* CifWriter.Field.Type.Str */, value: field.str, valueKind: field.valueKind }; } else if (type['@type'] === 'float') { return CifWriter.Field.float(name, field.float, { valueKind: field.valueKind, typedArray: Float64Array }); } else { return CifWriter.Field.int(name, field.int, { valueKind: field.valueKind, typedArray: Int32Array }); } }