UNPKG

molstar

Version:

A comprehensive macromolecular library.

244 lines 11 kB
"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