molstar
Version:
A comprehensive macromolecular library.
243 lines (242 loc) • 10.7 kB
JavaScript
/**
* 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>
*/
import { CifWriter } from '../../../mol-io/writer/cif';
import { _atom_site } from './categories/atom_site';
var CifCategory = CifWriter.Category;
import { _struct_conf, _struct_sheet_range } from './categories/secondary-structure';
import { _chem_comp, _chem_comp_bond, _pdbx_chem_comp_identifier, _pdbx_nonpoly_scheme } from './categories/misc';
import { getUniqueEntityIndicesFromStructures, copy_mmCif_category, copy_source_mmCifCategory } from './categories/utils';
import { _struct_asym, _entity_poly, _entity_poly_seq } from './categories/sequence';
import { CustomPropertyDescriptor } from '../../custom-property';
import { atom_site_operator_mapping } from './categories/atom_site_operator_mapping';
import { MmcifFormat } from '../../../mol-model-formats/structure/mmcif';
export 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 || (CifExportContext = {}));
var _entity = {
name: 'entity',
instance: function (_a) {
var structures = _a.structures;
var indices = 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; });
}
function isWithoutOperator(structure) {
return isWithoutSymmetry(structure) && structure.units.every(function (u) { return !u.conformation.operator.assembly && !u.conformation.operator.suffix; });
}
var Categories = [
// Basics
copy_mmCif_category('entry'),
copy_mmCif_category('exptl'),
_entity,
// Symmetry
copy_mmCif_category('cell', isWithoutSymmetry),
copy_mmCif_category('symmetry', isWithoutSymmetry),
// Assemblies
copy_mmCif_category('pdbx_struct_assembly', isWithoutOperator),
copy_mmCif_category('pdbx_struct_assembly_gen', isWithoutOperator),
copy_mmCif_category('pdbx_struct_oper_list', isWithoutOperator),
// Secondary structure
_struct_conf,
_struct_sheet_range,
// Sequence
_struct_asym,
_entity_poly,
_entity_poly_seq,
// Branch
copy_mmCif_category('pdbx_entity_branch'),
copy_mmCif_category('pdbx_entity_branch_link'),
copy_mmCif_category('pdbx_branch_scheme'),
// Struct conn
copy_mmCif_category('struct_conn'),
// Misc
_chem_comp,
_chem_comp_bond,
_pdbx_chem_comp_identifier,
copy_mmCif_category('atom_sites'),
_pdbx_nonpoly_scheme,
// Atoms
_atom_site
];
var _Filters;
(function (_Filters) {
_Filters.AtomSitePositionsFieldNames = new Set(['id', 'Cartn_x', 'Cartn_y', 'Cartn_z']);
})(_Filters || (_Filters = {}));
export var 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 = 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 '".concat(cat.name, "' name must start with prefix '").concat(prefix, ".'"));
ret.push([cat, propCtx]);
}
return ret;
}
/** Doesn't start a data block */
export 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) && MmcifFormat.is(models[0].sourceData)) {
encode_mmCIF_categories_copyAll(encoder, ctx, params);
}
else {
encode_mmCIF_categories_default(encoder, ctx, params);
}
}
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 = 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 = 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 = copy_mmCif_category(catName);
encoder.writeCategory(cat, ctx);
}
else {
var cat = 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, params) {
if (asBinary === void 0) { asBinary = false; }
var enc = CifWriter.createEncoder({ binary: asBinary });
enc.startDataBlock(name);
encode_mmCIF_categories(enc, structure, params);
return enc.getData();
}
export { to_mmCIF };