molstar
Version:
A comprehensive macromolecular library.
101 lines (100 loc) • 3.96 kB
JavaScript
/**
* 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 });
}
}