drugflow-molstar
Version:
Molstar implementation for DrugFlow
282 lines (281 loc) • 16.7 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.ModelInfo = exports.QueryHelper = exports.LigandView = exports.AlphafoldView = exports.PDBeVolumes = void 0;
var tslib_1 = require("tslib");
var commands_1 = require("Molstar/mol-plugin/commands");
var builder_1 = require("Molstar/mol-script/language/builder");
var mol_state_1 = require("Molstar/mol-state");
var structure_1 = require("Molstar/mol-model/structure");
var transformers_1 = require("Molstar/mol-plugin/behavior/dynamic/volume-streaming/transformers");
var compiler_1 = require("Molstar/mol-script/runtime/query/compiler");
var structure_2 = require("Molstar/mol-model/structure");
var sifts_mapping_1 = require("./sifts-mapping");
var query_1 = require("Molstar/mol-model/structure/query/query");
var prop_1 = require("Molstar/extensions/model-archive/quality-assessment/prop");
var PDBeVolumes;
(function (PDBeVolumes) {
function mapParams(defaultParams, mapParams, ref) {
var pdbeParams = tslib_1.__assign({}, defaultParams);
pdbeParams.options.behaviorRef = 'volume-streaming' + '' + Math.floor(Math.random() * Math.floor(100));
pdbeParams.options.emContourProvider = 'pdbe';
pdbeParams.options.serverUrl = 'https://www.ebi.ac.uk/pdbe/volume-server';
pdbeParams.options.channelParams['em'] = {
opacity: (mapParams && mapParams.em && mapParams.em.opacity) ? mapParams.em.opacity : 0.49,
wireframe: (mapParams && mapParams.em && mapParams.em.wireframe) ? mapParams.em.wireframe : false
};
pdbeParams.options.channelParams['2fo-fc'] = {
opacity: (mapParams && mapParams['2fo-fc'] && mapParams['2fo-fc'].opacity) ? mapParams['2fo-fc'].opacity : 0.49,
wireframe: (mapParams && mapParams['2fo-fc'] && mapParams['2fo-fc'].wireframe) ? mapParams['2fo-fc'].wireframe : false
};
pdbeParams.options.channelParams['fo-fc(+ve)'] = {
opacity: (mapParams && mapParams['fo-fc(+ve)'] && mapParams['fo-fc(+ve)'].opacity) ? mapParams['fo-fc(+ve)'].opacity : 0.3,
wireframe: (mapParams && mapParams['fo-fc(+ve)'] && mapParams['fo-fc(+ve)'].wireframe) ? mapParams['fo-fc(+ve)'].wireframe : true
};
pdbeParams.options.channelParams['fo-fc(-ve)'] = {
opacity: (mapParams && mapParams['fo-fc(-ve)'] && mapParams['fo-fc(-ve)'].opacity) ? mapParams['fo-fc(-ve)'].opacity : 0.3,
wireframe: (mapParams && mapParams['fo-fc(-ve)'] && mapParams['fo-fc(-ve)'].wireframe) ? mapParams['fo-fc(-ve)'].wireframe : true
};
return pdbeParams;
}
PDBeVolumes.mapParams = mapParams;
function displayUsibilityMessage(plugin) {
commands_1.PluginCommands.Toast.Show(plugin, {
title: 'Volume',
message: 'Streaming enabled, click on a residue or an atom to view the data.',
key: 'toast-1',
timeoutMs: 7000
});
}
PDBeVolumes.displayUsibilityMessage = displayUsibilityMessage;
function toggle(plugin) {
var state = plugin.state.data;
var streamingState = state.select(mol_state_1.StateSelection.Generators.ofTransformer(transformers_1.CreateVolumeStreamingInfo))[0];
if (streamingState) {
commands_1.PluginCommands.State.ToggleVisibility(plugin, { state: state, ref: streamingState.transform.ref });
return;
}
}
PDBeVolumes.toggle = toggle;
})(PDBeVolumes || (exports.PDBeVolumes = PDBeVolumes = {}));
var AlphafoldView;
(function (AlphafoldView) {
function getLociByPLDDT(score, contextData) {
var queryExp = builder_1.MolScriptBuilder.struct.modifier.union([
builder_1.MolScriptBuilder.struct.modifier.wholeResidues([
builder_1.MolScriptBuilder.struct.modifier.union([
builder_1.MolScriptBuilder.struct.generator.atomGroups({
'chain-test': builder_1.MolScriptBuilder.core.rel.eq([builder_1.MolScriptBuilder.ammp('objectPrimitive'), 'atomistic']),
'residue-test': builder_1.MolScriptBuilder.core.rel.gr([prop_1.QualityAssessment.symbols.pLDDT.symbol(), score]),
})
])
])
]);
var query = (0, compiler_1.compile)(queryExp);
var sel = query(new structure_1.QueryContext(contextData));
return structure_1.StructureSelection.toLociWithSourceUnits(sel);
}
AlphafoldView.getLociByPLDDT = getLociByPLDDT;
})(AlphafoldView || (exports.AlphafoldView = AlphafoldView = {}));
var LigandView;
(function (LigandView) {
function query(ligandViewParams) {
var atomGroupsParams = {
'group-by': builder_1.MolScriptBuilder.core.str.concat([builder_1.MolScriptBuilder.struct.atomProperty.core.operatorName(), builder_1.MolScriptBuilder.struct.atomProperty.macromolecular.residueKey()])
};
// Residue Param
var residueParam;
if (ligandViewParams.auth_seq_id) {
residueParam = builder_1.MolScriptBuilder.core.rel.eq([builder_1.MolScriptBuilder.struct.atomProperty.macromolecular.auth_seq_id(), ligandViewParams.auth_seq_id]);
}
else if (ligandViewParams.label_comp_id) {
residueParam = builder_1.MolScriptBuilder.core.rel.eq([builder_1.MolScriptBuilder.struct.atomProperty.macromolecular.label_comp_id(), ligandViewParams.label_comp_id]);
}
if (residueParam)
atomGroupsParams['residue-test'] = residueParam;
// Chain Param
if (ligandViewParams.auth_asym_id) {
atomGroupsParams['chain-test'] = builder_1.MolScriptBuilder.core.rel.eq([builder_1.MolScriptBuilder.struct.atomProperty.macromolecular.auth_asym_id(), ligandViewParams.auth_asym_id]);
}
else if (ligandViewParams.struct_asym_id) {
atomGroupsParams['chain-test'] = builder_1.MolScriptBuilder.core.rel.eq([builder_1.MolScriptBuilder.struct.atomProperty.macromolecular.label_asym_id(), ligandViewParams.struct_asym_id]);
}
// Construct core query
var core = ligandViewParams.show_all ?
builder_1.MolScriptBuilder.struct.generator.atomGroups(atomGroupsParams) :
builder_1.MolScriptBuilder.struct.filter.first([
builder_1.MolScriptBuilder.struct.generator.atomGroups(atomGroupsParams)
]);
// Construct surroundings query
var surroundings = builder_1.MolScriptBuilder.struct.modifier.includeSurroundings({ 0: core, radius: 5, 'as-whole-residues': true });
return {
core: core,
surroundings: surroundings
};
}
LigandView.query = query;
function branchedQuery(params) {
var entityObjArray = [];
params.atom_site.forEach(function (param) {
var qEntities = {
'group-by': builder_1.MolScriptBuilder.core.str.concat([builder_1.MolScriptBuilder.struct.atomProperty.core.operatorName(), builder_1.MolScriptBuilder.struct.atomProperty.macromolecular.residueKey()]),
'residue-test': builder_1.MolScriptBuilder.core.rel.eq([builder_1.MolScriptBuilder.struct.atomProperty.macromolecular.auth_seq_id(), param.auth_seq_id])
};
entityObjArray.push(qEntities);
});
var atmGroupsQueries = [];
entityObjArray.forEach(function (entityObj) {
atmGroupsQueries.push(builder_1.MolScriptBuilder.struct.generator.atomGroups(entityObj));
});
var core = builder_1.MolScriptBuilder.struct.modifier.union([
atmGroupsQueries.length === 1
? atmGroupsQueries[0]
// Need to union before merge for fast performance
: builder_1.MolScriptBuilder.struct.combinator.merge(atmGroupsQueries.map(function (q) { return builder_1.MolScriptBuilder.struct.modifier.union([q]); }))
]);
// Construct surroundings query
var surroundings = builder_1.MolScriptBuilder.struct.modifier.includeSurroundings({ 0: core, radius: 5, 'as-whole-residues': true });
return {
core: core,
surroundings: surroundings
};
}
LigandView.branchedQuery = branchedQuery;
})(LigandView || (exports.LigandView = LigandView = {}));
var QueryHelper;
(function (QueryHelper) {
function getQueryObject(params, contextData) {
var selections = [];
var siftMappings;
var currentAccession;
params.forEach(function (param) {
var selection = {};
// entity
if (param.entity_id)
selection['entityTest'] = function (l) { return structure_1.StructureProperties.entity.id(l.element) === param.entity_id; };
// chain
if (param.struct_asym_id) {
selection['chainTest'] = function (l) { return structure_1.StructureProperties.chain.label_asym_id(l.element) === param.struct_asym_id; };
}
else if (param.auth_asym_id) {
selection['chainTest'] = function (l) { return structure_1.StructureProperties.chain.auth_asym_id(l.element) === param.auth_asym_id; };
}
if (param.group_PDB) {
selection['residueTest'] = function (l) { return structure_1.StructureProperties.residue.group_PDB(l.element) === param.group_PDB; };
}
// residues
if (param.label_comp_id) {
selection['residueTest'] = function (l) { return structure_1.StructureProperties.atom.label_comp_id(l.element) === param.label_comp_id; };
}
else if (param.uniprot_accession && param.uniprot_residue_number) {
selection['residueTest'] = function (l) {
if (!siftMappings || currentAccession !== param.uniprot_accession) {
siftMappings = sifts_mapping_1.SIFTSMapping.Provider.get(contextData.models[0]).value;
currentAccession = param.uniprot_accession;
}
var rI = structure_1.StructureProperties.residue.key(l.element);
return param.uniprot_accession === siftMappings.accession[rI] && param.uniprot_residue_number === +siftMappings.num[rI];
};
}
else if (param.uniprot_accession && param.start_uniprot_residue_number && param.end_uniprot_residue_number) {
selection['residueTest'] = function (l) {
if (!siftMappings || currentAccession !== param.uniprot_accession) {
siftMappings = sifts_mapping_1.SIFTSMapping.Provider.get(contextData.models[0]).value;
currentAccession = param.uniprot_accession;
}
var rI = structure_1.StructureProperties.residue.key(l.element);
return param.uniprot_accession === siftMappings.accession[rI] && (param.start_uniprot_residue_number <= +siftMappings.num[rI] && param.end_uniprot_residue_number >= +siftMappings.num[rI]);
};
}
else if (param.residue_number) {
selection['residueTest'] = function (l) { return structure_1.StructureProperties.residue.label_seq_id(l.element) === param.residue_number; };
}
else if ((param.start_residue_number && param.end_residue_number) && (param.end_residue_number > param.start_residue_number)) {
selection['residueTest'] = function (l) {
var labelSeqId = structure_1.StructureProperties.residue.label_seq_id(l.element);
return labelSeqId >= param.start_residue_number && labelSeqId <= param.end_residue_number;
};
}
else if ((param.start_residue_number && param.end_residue_number) && (param.end_residue_number === param.start_residue_number)) {
selection['residueTest'] = function (l) { return structure_1.StructureProperties.residue.label_seq_id(l.element) === param.start_residue_number; };
}
else if (param.auth_seq_id) {
selection['residueTest'] = function (l) { return structure_1.StructureProperties.residue.auth_seq_id(l.element) === param.auth_seq_id; };
}
else if (param.auth_residue_number && !param.auth_ins_code_id) {
selection['residueTest'] = function (l) { return structure_1.StructureProperties.residue.auth_seq_id(l.element) === param.auth_residue_number; };
}
else if (param.auth_residue_number && param.auth_ins_code_id) {
selection['residueTest'] = function (l) { return structure_1.StructureProperties.residue.auth_seq_id(l.element) === param.auth_residue_number; };
}
else if ((param.start_auth_residue_number && param.end_auth_residue_number) && (param.end_auth_residue_number > param.start_auth_residue_number)) {
selection['residueTest'] = function (l) {
var authSeqId = structure_1.StructureProperties.residue.auth_seq_id(l.element);
return authSeqId >= param.start_auth_residue_number && authSeqId <= param.end_auth_residue_number;
};
}
else if ((param.start_auth_residue_number && param.end_auth_residue_number) && (param.end_auth_residue_number === param.start_auth_residue_number)) {
selection['residueTest'] = function (l) { return structure_1.StructureProperties.residue.auth_seq_id(l.element) === param.start_auth_residue_number; };
}
// atoms
if (param.atoms) {
selection['atomTest'] = function (l) { return param.atoms.includes(structure_1.StructureProperties.atom.label_atom_id(l.element)); };
}
if (param.atom_id) {
selection['atomTest'] = function (l) { return param.atom_id.includes(structure_1.StructureProperties.atom.id(l.element)); };
}
selections.push(selection);
});
var atmGroupsQueries = [];
selections.forEach(function (selection) {
atmGroupsQueries.push(structure_2.Queries.generators.atoms(selection));
});
return structure_2.Queries.combinators.merge(atmGroupsQueries);
}
QueryHelper.getQueryObject = getQueryObject;
function getInteractivityLoci(params, contextData) {
var sel = query_1.StructureQuery.run(QueryHelper.getQueryObject(params, contextData), contextData);
return structure_1.StructureSelection.toLociWithSourceUnits(sel);
}
QueryHelper.getInteractivityLoci = getInteractivityLoci;
function getHetLoci(queryExp, contextData) {
var query = (0, compiler_1.compile)(queryExp);
var sel = query(new structure_1.QueryContext(contextData));
return structure_1.StructureSelection.toLociWithSourceUnits(sel);
}
QueryHelper.getHetLoci = getHetLoci;
})(QueryHelper || (exports.QueryHelper = QueryHelper = {}));
var ModelInfo;
(function (ModelInfo) {
function get(model, structures) {
return tslib_1.__awaiter(this, void 0, void 0, function () {
var residueCount, residueOffsets, chainIndex, hetNames, carbEntityCount, rI, cI, eI, entityType, comp_id;
return tslib_1.__generator(this, function (_a) {
residueCount = model.atomicHierarchy.residues._rowCount;
residueOffsets = model.atomicHierarchy.residueAtomSegments.offsets;
chainIndex = model.atomicHierarchy.chainAtomSegments.index;
hetNames = [];
carbEntityCount = 0;
for (rI = 0; rI < residueCount; rI++) {
cI = chainIndex[residueOffsets[rI]];
eI = model.atomicHierarchy.index.getEntityFromChain(cI);
entityType = model.entities.data.type.value(eI);
if (entityType !== 'non-polymer' && entityType !== 'branched')
continue;
comp_id = model.atomicHierarchy.atoms.label_comp_id.value(residueOffsets[rI]);
if (entityType === 'branched') {
carbEntityCount++;
}
else {
if (hetNames.indexOf(comp_id) === -1)
hetNames.push(comp_id);
}
}
return [2 /*return*/, {
hetNames: hetNames,
carbEntityCount: carbEntityCount
}];
});
});
}
ModelInfo.get = get;
})(ModelInfo || (exports.ModelInfo = ModelInfo = {}));