molstar
Version:
A comprehensive macromolecular library.
236 lines • 11.7 kB
JavaScript
/**
* Copyright (c) 2017-2020 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.createModels = void 0;
var tslib_1 = require("tslib");
var db_1 = require("../../../mol-data/db");
var uuid_1 = require("../../../mol-util/uuid");
var model_1 = require("../../../mol-model/structure/model/model");
var custom_property_1 = require("../../../mol-model/custom-property");
var atomic_1 = require("./atomic");
var coarse_1 = require("./coarse");
var sequence_1 = require("./sequence");
var sort_1 = require("./sort");
var atomic_ranges_1 = require("../../../mol-model/structure/model/properties/utils/atomic-ranges");
var properties_1 = require("./properties");
var entities_1 = require("./entities");
var util_1 = require("./util");
var trajectory_1 = require("../../../mol-model/structure/trajectory");
function createModels(data, format, ctx) {
return (0, tslib_1.__awaiter)(this, void 0, void 0, function () {
var properties, models, _a, i;
return (0, tslib_1.__generator)(this, function (_b) {
switch (_b.label) {
case 0:
properties = (0, properties_1.getProperties)(data);
if (!(data.ihm_model_list._rowCount > 0)) return [3 /*break*/, 2];
return [4 /*yield*/, readIntegrative(ctx, data, properties, format)];
case 1:
_a = _b.sent();
return [3 /*break*/, 4];
case 2: return [4 /*yield*/, readStandard(ctx, data, properties, format)];
case 3:
_a = _b.sent();
_b.label = 4;
case 4:
models = _a;
for (i = 0; i < models.length; i++) {
model_1.Model.TrajectoryInfo.set(models[i], { index: i, size: models.length });
}
return [2 /*return*/, new trajectory_1.ArrayTrajectory(models)];
}
});
});
}
exports.createModels = createModels;
/** Standard atomic model */
function createStandardModel(data, atom_site, sourceIndex, entities, properties, format, previous) {
var atomic = (0, atomic_1.getAtomicHierarchyAndConformation)(atom_site, sourceIndex, entities, properties.chemicalComponentMap, format, previous);
var modelNum = atom_site.pdbx_PDB_model_num.value(0);
if (previous && atomic.sameAsPrevious) {
return (0, tslib_1.__assign)((0, tslib_1.__assign)({}, previous), { id: uuid_1.UUID.create22(), modelNum: modelNum, atomicConformation: atomic.conformation, _dynamicPropertyData: Object.create(null) });
}
var coarse = coarse_1.EmptyCoarse;
var sequence = (0, sequence_1.getSequence)(data, entities, atomic.hierarchy, coarse.hierarchy);
var atomicRanges = (0, atomic_ranges_1.getAtomicRanges)(atomic.hierarchy, entities, atomic.conformation, sequence);
var entry = data.entry.id.valueKind(0) === 0 /* Present */
? data.entry.id.value(0) : format.name;
var label = [];
if (entry)
label.push(entry);
if (data.struct.title.valueKind(0) === 0 /* Present */)
label.push(data.struct.title.value(0));
return {
id: uuid_1.UUID.create22(),
entryId: entry,
label: label.join(' | '),
entry: entry,
sourceData: format,
modelNum: modelNum,
parent: undefined,
entities: entities,
sequence: sequence,
atomicHierarchy: atomic.hierarchy,
atomicConformation: atomic.conformation,
atomicRanges: atomicRanges,
atomicChainOperatorMappinng: atomic.chainOperatorMapping,
coarseHierarchy: coarse.hierarchy,
coarseConformation: coarse.conformation,
properties: properties,
customProperties: new custom_property_1.CustomProperties(),
_staticPropertyData: Object.create(null),
_dynamicPropertyData: Object.create(null)
};
}
/** Integrative model with atomic/coarse parts */
function createIntegrativeModel(data, ihm, properties, format) {
var atomic = (0, atomic_1.getAtomicHierarchyAndConformation)(ihm.atom_site, ihm.atom_site_sourceIndex, ihm.entities, properties.chemicalComponentMap, format);
var coarse = (0, coarse_1.getCoarse)(ihm, properties);
var sequence = (0, sequence_1.getSequence)(data, ihm.entities, atomic.hierarchy, coarse.hierarchy);
var atomicRanges = (0, atomic_ranges_1.getAtomicRanges)(atomic.hierarchy, ihm.entities, atomic.conformation, sequence);
var entry = data.entry.id.valueKind(0) === 0 /* Present */
? data.entry.id.value(0) : format.name;
var label = [];
if (entry)
label.push(entry);
if (data.struct.title.valueKind(0) === 0 /* Present */)
label.push(data.struct.title.value(0));
if (ihm.model_name)
label.push(ihm.model_name);
if (ihm.model_group_name)
label.push(ihm.model_group_name);
return {
id: uuid_1.UUID.create22(),
entryId: entry,
label: label.join(' | '),
entry: entry,
sourceData: format,
modelNum: ihm.model_id,
parent: undefined,
entities: ihm.entities,
sequence: sequence,
atomicHierarchy: atomic.hierarchy,
atomicConformation: atomic.conformation,
atomicRanges: atomicRanges,
atomicChainOperatorMappinng: atomic.chainOperatorMapping,
coarseHierarchy: coarse.hierarchy,
coarseConformation: coarse.conformation,
properties: properties,
customProperties: new custom_property_1.CustomProperties(),
_staticPropertyData: Object.create(null),
_dynamicPropertyData: Object.create(null)
};
}
function findModelEnd(num, startIndex) {
var rowCount = num.rowCount;
if (!num.isDefined)
return rowCount;
var endIndex = startIndex + 1;
while (endIndex < rowCount && num.areValuesEqual(startIndex, endIndex))
endIndex++;
return endIndex;
}
function readStandard(ctx, data, properties, format) {
return (0, tslib_1.__awaiter)(this, void 0, void 0, function () {
var models, atomCount, entities, modelStart, modelEnd, _a, atom_site, sourceIndex, model;
return (0, tslib_1.__generator)(this, function (_b) {
switch (_b.label) {
case 0:
models = [];
if (!data.atom_site) return [3 /*break*/, 3];
atomCount = data.atom_site.id.rowCount;
entities = (0, entities_1.getEntities)(data, properties);
modelStart = 0;
_b.label = 1;
case 1:
if (!(modelStart < atomCount)) return [3 /*break*/, 3];
modelEnd = findModelEnd(data.atom_site.pdbx_PDB_model_num, modelStart);
return [4 /*yield*/, (0, sort_1.sortAtomSite)(ctx, data.atom_site, modelStart, modelEnd)];
case 2:
_a = _b.sent(), atom_site = _a.atom_site, sourceIndex = _a.sourceIndex;
model = createStandardModel(data, atom_site, sourceIndex, entities, properties, format, models.length > 0 ? models[models.length - 1] : void 0);
models.push(model);
modelStart = modelEnd;
return [3 /*break*/, 1];
case 3: return [2 /*return*/, models];
}
});
});
}
function splitTable(table, col) {
var ret = new Map();
var rowCount = table._rowCount;
var modelStart = 0;
while (modelStart < rowCount) {
var modelEnd = findModelEnd(col, modelStart);
var id = col.value(modelStart);
ret.set(id, {
table: db_1.Table.window(table, table._schema, modelStart, modelEnd),
start: modelStart,
end: modelEnd
});
modelStart = modelEnd;
}
return ret;
}
function readIntegrative(ctx, data, properties, format) {
return (0, tslib_1.__awaiter)(this, void 0, void 0, function () {
var entities, atom_sites_modelColumn, atom_sites, sphere_sites, gauss_sites, models, _a, model_id, model_name, i, id, atom_site, atom_site_sourceIndex, e, _b, sorted, sourceIndex, ihm, model;
return (0, tslib_1.__generator)(this, function (_c) {
switch (_c.label) {
case 0:
entities = (0, entities_1.getEntities)(data, properties);
atom_sites_modelColumn = data.atom_site.ihm_model_id.isDefined
? data.atom_site.ihm_model_id : data.atom_site.pdbx_PDB_model_num;
atom_sites = splitTable(data.atom_site, atom_sites_modelColumn);
sphere_sites = splitTable(data.ihm_sphere_obj_site, data.ihm_sphere_obj_site.model_id);
gauss_sites = splitTable(data.ihm_gaussian_obj_site, data.ihm_gaussian_obj_site.model_id);
models = [];
if (!data.ihm_model_list) return [3 /*break*/, 6];
_a = data.ihm_model_list, model_id = _a.model_id, model_name = _a.model_name;
i = 0;
_c.label = 1;
case 1:
if (!(i < data.ihm_model_list._rowCount)) return [3 /*break*/, 6];
id = model_id.value(i);
atom_site = void 0, atom_site_sourceIndex = void 0;
if (!atom_sites.has(id)) return [3 /*break*/, 3];
e = atom_sites.get(id);
return [4 /*yield*/, (0, sort_1.sortAtomSite)(ctx, data.atom_site, e.start, e.end)];
case 2:
_b = _c.sent(), sorted = _b.atom_site, sourceIndex = _b.sourceIndex;
atom_site = sorted;
atom_site_sourceIndex = sourceIndex;
return [3 /*break*/, 4];
case 3:
atom_site = db_1.Table.window(data.atom_site, data.atom_site._schema, 0, 0);
atom_site_sourceIndex = db_1.Column.ofIntArray([]);
_c.label = 4;
case 4:
ihm = {
model_id: id,
model_name: model_name.value(i),
model_group_name: (0, util_1.getModelGroupName)(id, data),
entities: entities,
atom_site: atom_site,
atom_site_sourceIndex: atom_site_sourceIndex,
ihm_sphere_obj_site: sphere_sites.has(id) ? sphere_sites.get(id).table : db_1.Table.window(data.ihm_sphere_obj_site, data.ihm_sphere_obj_site._schema, 0, 0),
ihm_gaussian_obj_site: gauss_sites.has(id) ? gauss_sites.get(id).table : db_1.Table.window(data.ihm_gaussian_obj_site, data.ihm_gaussian_obj_site._schema, 0, 0)
};
model = createIntegrativeModel(data, ihm, properties, format);
models.push(model);
_c.label = 5;
case 5:
i++;
return [3 /*break*/, 1];
case 6: return [2 /*return*/, models];
}
});
});
}
//# sourceMappingURL=parser.js.map
;