molstar
Version:
A comprehensive macromolecular library.
244 lines • 11 kB
JavaScript
"use strict";
/**
* Copyright (c) 2017-2018 mol* contributors, licensed under MIT, See LICENSE file for more info.
*
* @author David Sehnal <david.sehnal@gmail.com>
* @author Alexander Rose <alexander.rose@weirdbyte.de>
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.to_mmCIF = exports.encode_mmCIF_categories = exports.mmCIF_Export_Filters = exports.CifExportContext = void 0;
var cif_1 = require("../../../mol-io/writer/cif");
var atom_site_1 = require("./categories/atom_site");
var CifCategory = cif_1.CifWriter.Category;
var secondary_structure_1 = require("./categories/secondary-structure");
var misc_1 = require("./categories/misc");
var utils_1 = require("./categories/utils");
var sequence_1 = require("./categories/sequence");
var custom_property_1 = require("../../custom-property");
var atom_site_operator_mapping_1 = require("./categories/atom_site_operator_mapping");
var mmcif_1 = require("../../../mol-model-formats/structure/mmcif");
var CifExportContext;
(function (CifExportContext) {
function create(structures) {
var structureArray = Array.isArray(structures) ? structures : [structures];
return {
structures: structureArray,
firstModel: structureArray[0].model,
cache: Object.create(null)
};
}
CifExportContext.create = create;
})(CifExportContext = exports.CifExportContext || (exports.CifExportContext = {}));
var _entity = {
name: 'entity',
instance: function (_a) {
var structures = _a.structures;
var indices = (0, utils_1.getUniqueEntityIndicesFromStructures)(structures);
return CifCategory.ofTable(structures[0].model.entities.data, indices);
}
};
function isWithoutSymmetry(structure) {
return structure.units.every(function (u) { return u.conformation.operator.isIdentity; });
}
var Categories = [
// Basics
(0, utils_1.copy_mmCif_category)('entry'),
(0, utils_1.copy_mmCif_category)('exptl'),
_entity,
// Symmetry
(0, utils_1.copy_mmCif_category)('cell', isWithoutSymmetry),
(0, utils_1.copy_mmCif_category)('symmetry', isWithoutSymmetry),
// Assemblies
(0, utils_1.copy_mmCif_category)('pdbx_struct_assembly', isWithoutSymmetry),
(0, utils_1.copy_mmCif_category)('pdbx_struct_assembly_gen', isWithoutSymmetry),
(0, utils_1.copy_mmCif_category)('pdbx_struct_oper_list', isWithoutSymmetry),
// Secondary structure
secondary_structure_1._struct_conf,
secondary_structure_1._struct_sheet_range,
// Sequence
sequence_1._struct_asym,
sequence_1._entity_poly,
sequence_1._entity_poly_seq,
// Branch
(0, utils_1.copy_mmCif_category)('pdbx_entity_branch'),
(0, utils_1.copy_mmCif_category)('pdbx_entity_branch_link'),
(0, utils_1.copy_mmCif_category)('pdbx_branch_scheme'),
// Struct conn
(0, utils_1.copy_mmCif_category)('struct_conn'),
// Misc
misc_1._chem_comp,
misc_1._chem_comp_bond,
misc_1._pdbx_chem_comp_identifier,
(0, utils_1.copy_mmCif_category)('atom_sites'),
misc_1._pdbx_nonpoly_scheme,
// Atoms
atom_site_1._atom_site
];
var _Filters;
(function (_Filters) {
_Filters.AtomSitePositionsFieldNames = new Set(['id', 'Cartn_x', 'Cartn_y', 'Cartn_z']);
})(_Filters || (_Filters = {}));
exports.mmCIF_Export_Filters = {
onlyPositions: {
includeCategory: function (name) { return name === 'atom_site'; },
includeField: function (cat, field) { return _Filters.AtomSitePositionsFieldNames.has(field); }
}
};
function getCustomPropCategories(customProp, ctx, params) {
var _a;
if (!customProp.cifExport || customProp.cifExport.categories.length === 0)
return [];
var prefix = customProp.cifExport.prefix;
var cats = customProp.cifExport.categories;
var propCtx = ctx;
if (customProp.cifExport.context) {
var propId = custom_property_1.CustomPropertyDescriptor.getUUID(customProp);
if (ctx.cache[propId + '__ctx'])
propCtx = ctx.cache[propId + '__ctx'];
else {
propCtx = customProp.cifExport.context(ctx) || ctx;
ctx.cache[propId + '__ctx'] = propCtx;
}
}
var ret = [];
for (var _i = 0, cats_1 = cats; _i < cats_1.length; _i++) {
var cat = cats_1[_i];
if ((_a = params === null || params === void 0 ? void 0 : params.skipCategoryNames) === null || _a === void 0 ? void 0 : _a.has(cat.name))
continue;
if (cat.name.indexOf(prefix) !== 0)
throw new Error("Custom category '" + cat.name + "' name must start with prefix '" + prefix + ".'");
ret.push([cat, propCtx]);
}
return ret;
}
/** Doesn't start a data block */
function encode_mmCIF_categories(encoder, structures, params) {
var first = Array.isArray(structures) ? structures[0] : structures;
var models = first.models;
if (models.length !== 1)
throw new Error('Can\'t export stucture composed from multiple models.');
var ctx = (params === null || params === void 0 ? void 0 : params.exportCtx) || CifExportContext.create(structures);
if ((params === null || params === void 0 ? void 0 : params.copyAllCategories) && mmcif_1.MmcifFormat.is(models[0].sourceData)) {
encode_mmCIF_categories_copyAll(encoder, ctx, params);
}
else {
encode_mmCIF_categories_default(encoder, ctx, params);
}
}
exports.encode_mmCIF_categories = encode_mmCIF_categories;
function encode_mmCIF_categories_default(encoder, ctx, params) {
var _a;
for (var _i = 0, Categories_1 = Categories; _i < Categories_1.length; _i++) {
var cat = Categories_1[_i];
if ((params === null || params === void 0 ? void 0 : params.skipCategoryNames) && (params === null || params === void 0 ? void 0 : params.skipCategoryNames.has(cat.name)))
continue;
encoder.writeCategory(cat, ctx);
}
if (!((_a = params === null || params === void 0 ? void 0 : params.skipCategoryNames) === null || _a === void 0 ? void 0 : _a.has('atom_site')) && encoder.isCategoryIncluded('atom_site')) {
var info = (0, atom_site_operator_mapping_1.atom_site_operator_mapping)(ctx);
if (info)
encoder.writeCategory(info[0], info[1], info[2]);
}
var _params = params || {};
for (var _b = 0, _c = ctx.firstModel.customProperties.all; _b < _c.length; _b++) {
var customProp = _c[_b];
for (var _d = 0, _e = getCustomPropCategories(customProp, ctx, _params); _d < _e.length; _d++) {
var _f = _e[_d], cat = _f[0], propCtx = _f[1];
encoder.writeCategory(cat, propCtx);
}
}
if (params === null || params === void 0 ? void 0 : params.customProperties) {
for (var _g = 0, _h = params === null || params === void 0 ? void 0 : params.customProperties; _g < _h.length; _g++) {
var customProp = _h[_g];
for (var _j = 0, _k = getCustomPropCategories(customProp, ctx, _params); _j < _k.length; _j++) {
var _l = _k[_j], cat = _l[0], propCtx = _l[1];
encoder.writeCategory(cat, propCtx);
}
}
}
for (var _m = 0, _o = ctx.structures; _m < _o.length; _m++) {
var s = _o[_m];
if (!s.hasCustomProperties)
continue;
for (var _p = 0, _q = s.customPropertyDescriptors.all; _p < _q.length; _p++) {
var customProp = _q[_p];
for (var _r = 0, _s = getCustomPropCategories(customProp, ctx, _params); _r < _s.length; _r++) {
var _t = _s[_r], cat = _t[0], propCtx = _t[1];
encoder.writeCategory(cat, propCtx);
}
}
}
}
function encode_mmCIF_categories_copyAll(encoder, ctx, params) {
var providedCategories = new Map();
for (var _i = 0, Categories_2 = Categories; _i < Categories_2.length; _i++) {
var cat = Categories_2[_i];
providedCategories.set(cat.name, [cat, ctx]);
}
var mapping = (0, atom_site_operator_mapping_1.atom_site_operator_mapping)(ctx);
if (mapping)
providedCategories.set(mapping[0].name, mapping);
var _params = params || {};
for (var _a = 0, _b = ctx.firstModel.customProperties.all; _a < _b.length; _a++) {
var customProp = _b[_a];
for (var _c = 0, _d = getCustomPropCategories(customProp, ctx, _params); _c < _d.length; _c++) {
var info = _d[_c];
providedCategories.set(info[0].name, info);
}
}
if (params === null || params === void 0 ? void 0 : params.customProperties) {
for (var _e = 0, _f = params === null || params === void 0 ? void 0 : params.customProperties; _e < _f.length; _e++) {
var customProp = _f[_e];
for (var _g = 0, _h = getCustomPropCategories(customProp, ctx, _params); _g < _h.length; _g++) {
var info = _h[_g];
providedCategories.set(info[0].name, info);
}
}
}
for (var _j = 0, _k = ctx.structures; _j < _k.length; _j++) {
var s = _k[_j];
if (!s.hasCustomProperties)
continue;
for (var _l = 0, _m = s.customPropertyDescriptors.all; _l < _m.length; _l++) {
var customProp = _m[_l];
for (var _o = 0, _p = getCustomPropCategories(customProp, ctx); _o < _p.length; _o++) {
var info = _p[_o];
providedCategories.set(info[0].name, info);
}
}
}
var handled = new Set();
var data = ctx.firstModel.sourceData.data;
for (var _q = 0, _r = data.frame.categoryNames; _q < _r.length; _q++) {
var catName = _r[_q];
handled.add(catName);
if (providedCategories.has(catName)) {
var info = providedCategories.get(catName);
encoder.writeCategory(info[0], info[1], info[2]);
}
else {
if (data.db[catName]) {
var cat = (0, utils_1.copy_mmCif_category)(catName);
encoder.writeCategory(cat, ctx);
}
else {
var cat = (0, utils_1.copy_source_mmCifCategory)(encoder, ctx, data.frame.categories[catName]);
if (cat)
encoder.writeCategory(cat);
}
}
}
providedCategories.forEach(function (info, name) {
if (!handled.has(name))
encoder.writeCategory(info[0], info[1], info[2]);
});
}
function to_mmCIF(name, structure, asBinary) {
if (asBinary === void 0) { asBinary = false; }
var enc = cif_1.CifWriter.createEncoder({ binary: asBinary });
enc.startDataBlock(name);
encode_mmCIF_categories(enc, structure);
return enc.getData();
}
exports.to_mmCIF = to_mmCIF;
//# sourceMappingURL=mmcif.js.map