UNPKG

molstar

Version:

A comprehensive macromolecular library.

698 lines 40.4 kB
"use strict"; /** * Copyright (c) 2019-2020 mol* contributors, licensed under MIT, See LICENSE file for more info. * * @author Alexander Rose <alexander.rose@weirdbyte.de> * @author David Sehnal <david.sehnal@gmail.com> */ Object.defineProperty(exports, "__esModule", { value: true }); exports.StructureSelectionQueryRegistry = exports.StructureSelectionQueries = exports.applyBuiltInSelection = exports.getPolymerAndBranchedEntityQueries = exports.getNonStandardResidueQueries = exports.getElementQueries = exports.EntityDescriptionQuery = exports.ElementSymbolQuery = exports.ResidueQuery = exports.StructureSelectionQuery = exports.StructureSelectionCategory = void 0; var tslib_1 = require("tslib"); var structure_1 = require("../../mol-model/structure"); var types_1 = require("../../mol-model/structure/model/types"); var builder_1 = require("../../mol-script/language/builder"); var compiler_1 = require("../../mol-script/runtime/query/compiler"); var set_1 = require("../../mol-util/set"); var transforms_1 = require("../transforms"); var types_2 = require("../../mol-model/structure/model/properties/atomic/types"); var StructureSelectionCategory; (function (StructureSelectionCategory) { StructureSelectionCategory["Type"] = "Type"; StructureSelectionCategory["Structure"] = "Structure Property"; StructureSelectionCategory["Atom"] = "Atom Property"; StructureSelectionCategory["Bond"] = "Bond Property"; StructureSelectionCategory["Residue"] = "Residue Property"; StructureSelectionCategory["AminoAcid"] = "Amino Acid"; StructureSelectionCategory["NucleicBase"] = "Nucleic Base"; StructureSelectionCategory["Manipulate"] = "Manipulate Selection"; StructureSelectionCategory["Validation"] = "Validation"; StructureSelectionCategory["Misc"] = "Miscellaneous"; StructureSelectionCategory["Internal"] = "Internal"; })(StructureSelectionCategory = exports.StructureSelectionCategory || (exports.StructureSelectionCategory = {})); function StructureSelectionQuery(label, expression, props) { var _a; if (props === void 0) { props = {}; } var _query; return { label: label, expression: expression, description: props.description || '', category: (_a = props.category) !== null && _a !== void 0 ? _a : StructureSelectionCategory.Misc, isHidden: !!props.isHidden, priority: props.priority || 0, referencesCurrent: !!props.referencesCurrent, get query() { if (!_query) _query = (0, compiler_1.compile)(expression); return _query; }, ensureCustomProperties: props.ensureCustomProperties, getSelection: function (plugin, runtime, structure) { return (0, tslib_1.__awaiter)(this, void 0, void 0, function () { var current, currentSelection; return (0, tslib_1.__generator)(this, function (_a) { switch (_a.label) { case 0: current = plugin.managers.structure.selection.getStructure(structure); currentSelection = current ? structure_1.StructureSelection.Sequence(structure, [current]) : structure_1.StructureSelection.Empty(structure); if (!props.ensureCustomProperties) return [3 /*break*/, 2]; return [4 /*yield*/, props.ensureCustomProperties({ runtime: runtime, assetManager: plugin.managers.asset }, structure)]; case 1: _a.sent(); _a.label = 2; case 2: if (!_query) _query = (0, compiler_1.compile)(expression); return [2 /*return*/, _query(new structure_1.QueryContext(structure, { currentSelection: currentSelection }))]; } }); }); } }; } exports.StructureSelectionQuery = StructureSelectionQuery; var all = StructureSelectionQuery('All', builder_1.MolScriptBuilder.struct.generator.all(), { category: '', priority: 1000 }); var current = StructureSelectionQuery('Current Selection', builder_1.MolScriptBuilder.internal.generator.current(), { category: '', referencesCurrent: true }); var polymer = StructureSelectionQuery('Polymer', builder_1.MolScriptBuilder.struct.modifier.union([ builder_1.MolScriptBuilder.struct.generator.atomGroups({ 'entity-test': builder_1.MolScriptBuilder.core.logic.and([ builder_1.MolScriptBuilder.core.rel.eq([builder_1.MolScriptBuilder.ammp('entityType'), 'polymer']), builder_1.MolScriptBuilder.core.str.match([ builder_1.MolScriptBuilder.re('(polypeptide|cyclic-pseudo-peptide|peptide-like|nucleotide|peptide nucleic acid)', 'i'), builder_1.MolScriptBuilder.ammp('entitySubtype') ]) ]) }) ]), { category: StructureSelectionCategory.Type }); var trace = StructureSelectionQuery('Trace', builder_1.MolScriptBuilder.struct.modifier.union([ builder_1.MolScriptBuilder.struct.combinator.merge([ builder_1.MolScriptBuilder.struct.modifier.union([ builder_1.MolScriptBuilder.struct.generator.atomGroups({ 'entity-test': builder_1.MolScriptBuilder.core.rel.eq([builder_1.MolScriptBuilder.ammp('entityType'), 'polymer']), 'chain-test': builder_1.MolScriptBuilder.core.set.has([ builder_1.MolScriptBuilder.set('sphere', 'gaussian'), builder_1.MolScriptBuilder.ammp('objectPrimitive') ]) }) ]), builder_1.MolScriptBuilder.struct.modifier.union([ builder_1.MolScriptBuilder.struct.generator.atomGroups({ 'entity-test': builder_1.MolScriptBuilder.core.rel.eq([builder_1.MolScriptBuilder.ammp('entityType'), 'polymer']), 'chain-test': builder_1.MolScriptBuilder.core.rel.eq([builder_1.MolScriptBuilder.ammp('objectPrimitive'), 'atomistic']), 'atom-test': builder_1.MolScriptBuilder.core.set.has([builder_1.MolScriptBuilder.set('CA', 'P'), builder_1.MolScriptBuilder.ammp('label_atom_id')]) }) ]) ]) ]), { category: StructureSelectionCategory.Structure }); var _proteinEntityTest = builder_1.MolScriptBuilder.core.logic.and([ builder_1.MolScriptBuilder.core.rel.eq([builder_1.MolScriptBuilder.ammp('entityType'), 'polymer']), builder_1.MolScriptBuilder.core.str.match([ builder_1.MolScriptBuilder.re('(polypeptide|cyclic-pseudo-peptide|peptide-like)', 'i'), builder_1.MolScriptBuilder.ammp('entitySubtype') ]) ]); var _nucleiEntityTest = builder_1.MolScriptBuilder.core.logic.and([ builder_1.MolScriptBuilder.core.rel.eq([builder_1.MolScriptBuilder.ammp('entityType'), 'polymer']), builder_1.MolScriptBuilder.core.str.match([ builder_1.MolScriptBuilder.re('(nucleotide|peptide nucleic acid)', 'i'), builder_1.MolScriptBuilder.ammp('entitySubtype') ]) ]); /** * this is to get non-polymer and peptide terminus components in polymer entities, * - non-polymer, e.g. PXZ in 4HIV or generally ACE * - carboxy terminus, e.g. FC0 in 4BP9, or ETA in 6DDE * - amino terminus, e.g. ARF in 3K4V, or 4MM in 3EGV */ var _nonPolymerResidueTest = builder_1.MolScriptBuilder.core.str.match([ builder_1.MolScriptBuilder.re('non-polymer|(amino|carboxy) terminus|peptide-like', 'i'), builder_1.MolScriptBuilder.ammp('chemCompType') ]); // TODO maybe pre-calculate backbone atom properties var backbone = StructureSelectionQuery('Backbone', builder_1.MolScriptBuilder.struct.modifier.union([ builder_1.MolScriptBuilder.struct.combinator.merge([ builder_1.MolScriptBuilder.struct.modifier.union([ builder_1.MolScriptBuilder.struct.generator.atomGroups({ 'entity-test': _proteinEntityTest, 'chain-test': builder_1.MolScriptBuilder.core.rel.eq([builder_1.MolScriptBuilder.ammp('objectPrimitive'), 'atomistic']), 'residue-test': builder_1.MolScriptBuilder.core.logic.not([_nonPolymerResidueTest]), 'atom-test': builder_1.MolScriptBuilder.core.set.has([builder_1.MolScriptBuilder.set.apply(builder_1.MolScriptBuilder, set_1.SetUtils.toArray(types_1.ProteinBackboneAtoms)), builder_1.MolScriptBuilder.ammp('label_atom_id')]) }) ]), builder_1.MolScriptBuilder.struct.modifier.union([ builder_1.MolScriptBuilder.struct.generator.atomGroups({ 'entity-test': _nucleiEntityTest, 'chain-test': builder_1.MolScriptBuilder.core.rel.eq([builder_1.MolScriptBuilder.ammp('objectPrimitive'), 'atomistic']), 'residue-test': builder_1.MolScriptBuilder.core.logic.not([_nonPolymerResidueTest]), 'atom-test': builder_1.MolScriptBuilder.core.set.has([builder_1.MolScriptBuilder.set.apply(builder_1.MolScriptBuilder, set_1.SetUtils.toArray(types_1.NucleicBackboneAtoms)), builder_1.MolScriptBuilder.ammp('label_atom_id')]) }) ]) ]) ]), { category: StructureSelectionCategory.Structure }); // TODO maybe pre-calculate sidechain atom property var sidechain = StructureSelectionQuery('Sidechain', builder_1.MolScriptBuilder.struct.modifier.union([ builder_1.MolScriptBuilder.struct.combinator.merge([ builder_1.MolScriptBuilder.struct.modifier.union([ builder_1.MolScriptBuilder.struct.generator.atomGroups({ 'entity-test': _proteinEntityTest, 'chain-test': builder_1.MolScriptBuilder.core.rel.eq([builder_1.MolScriptBuilder.ammp('objectPrimitive'), 'atomistic']), 'residue-test': builder_1.MolScriptBuilder.core.logic.not([_nonPolymerResidueTest]), 'atom-test': builder_1.MolScriptBuilder.core.logic.or([ builder_1.MolScriptBuilder.core.logic.not([ builder_1.MolScriptBuilder.core.set.has([builder_1.MolScriptBuilder.set.apply(builder_1.MolScriptBuilder, set_1.SetUtils.toArray(types_1.ProteinBackboneAtoms)), builder_1.MolScriptBuilder.ammp('label_atom_id')]) ]) ]) }) ]), builder_1.MolScriptBuilder.struct.modifier.union([ builder_1.MolScriptBuilder.struct.generator.atomGroups({ 'entity-test': _nucleiEntityTest, 'chain-test': builder_1.MolScriptBuilder.core.rel.eq([builder_1.MolScriptBuilder.ammp('objectPrimitive'), 'atomistic']), 'residue-test': builder_1.MolScriptBuilder.core.logic.not([_nonPolymerResidueTest]), 'atom-test': builder_1.MolScriptBuilder.core.logic.or([ builder_1.MolScriptBuilder.core.logic.not([ builder_1.MolScriptBuilder.core.set.has([builder_1.MolScriptBuilder.set.apply(builder_1.MolScriptBuilder, set_1.SetUtils.toArray(types_1.NucleicBackboneAtoms)), builder_1.MolScriptBuilder.ammp('label_atom_id')]) ]) ]) }) ]) ]) ]), { category: StructureSelectionCategory.Structure }); // TODO maybe pre-calculate sidechain atom property var sidechainWithTrace = StructureSelectionQuery('Sidechain with Trace', builder_1.MolScriptBuilder.struct.modifier.union([ builder_1.MolScriptBuilder.struct.combinator.merge([ builder_1.MolScriptBuilder.struct.modifier.union([ builder_1.MolScriptBuilder.struct.generator.atomGroups({ 'entity-test': _proteinEntityTest, 'chain-test': builder_1.MolScriptBuilder.core.rel.eq([builder_1.MolScriptBuilder.ammp('objectPrimitive'), 'atomistic']), 'residue-test': builder_1.MolScriptBuilder.core.logic.not([_nonPolymerResidueTest]), 'atom-test': builder_1.MolScriptBuilder.core.logic.or([ builder_1.MolScriptBuilder.core.logic.not([ builder_1.MolScriptBuilder.core.set.has([builder_1.MolScriptBuilder.set.apply(builder_1.MolScriptBuilder, set_1.SetUtils.toArray(types_1.ProteinBackboneAtoms)), builder_1.MolScriptBuilder.ammp('label_atom_id')]) ]), builder_1.MolScriptBuilder.core.rel.eq([builder_1.MolScriptBuilder.ammp('label_atom_id'), 'CA']), builder_1.MolScriptBuilder.core.logic.and([ builder_1.MolScriptBuilder.core.rel.eq([builder_1.MolScriptBuilder.ammp('auth_comp_id'), 'PRO']), builder_1.MolScriptBuilder.core.rel.eq([builder_1.MolScriptBuilder.ammp('label_atom_id'), 'N']) ]) ]) }) ]), builder_1.MolScriptBuilder.struct.modifier.union([ builder_1.MolScriptBuilder.struct.generator.atomGroups({ 'entity-test': _nucleiEntityTest, 'chain-test': builder_1.MolScriptBuilder.core.rel.eq([builder_1.MolScriptBuilder.ammp('objectPrimitive'), 'atomistic']), 'residue-test': builder_1.MolScriptBuilder.core.logic.not([_nonPolymerResidueTest]), 'atom-test': builder_1.MolScriptBuilder.core.logic.or([ builder_1.MolScriptBuilder.core.logic.not([ builder_1.MolScriptBuilder.core.set.has([builder_1.MolScriptBuilder.set.apply(builder_1.MolScriptBuilder, set_1.SetUtils.toArray(types_1.NucleicBackboneAtoms)), builder_1.MolScriptBuilder.ammp('label_atom_id')]) ]), builder_1.MolScriptBuilder.core.rel.eq([builder_1.MolScriptBuilder.ammp('label_atom_id'), 'P']) ]) }) ]) ]) ]), { category: StructureSelectionCategory.Structure }); var protein = StructureSelectionQuery('Protein', builder_1.MolScriptBuilder.struct.modifier.union([ builder_1.MolScriptBuilder.struct.generator.atomGroups({ 'entity-test': _proteinEntityTest }) ]), { category: StructureSelectionCategory.Type }); var nucleic = StructureSelectionQuery('Nucleic', builder_1.MolScriptBuilder.struct.modifier.union([ builder_1.MolScriptBuilder.struct.generator.atomGroups({ 'entity-test': _nucleiEntityTest }) ]), { category: StructureSelectionCategory.Type }); var helix = StructureSelectionQuery('Helix', builder_1.MolScriptBuilder.struct.modifier.union([ builder_1.MolScriptBuilder.struct.generator.atomGroups({ 'entity-test': _proteinEntityTest, 'residue-test': builder_1.MolScriptBuilder.core.flags.hasAny([ builder_1.MolScriptBuilder.ammp('secondaryStructureFlags'), builder_1.MolScriptBuilder.core.type.bitflags([2 /* Helix */]) ]) }) ]), { category: StructureSelectionCategory.Structure }); var beta = StructureSelectionQuery('Beta Strand/Sheet', builder_1.MolScriptBuilder.struct.modifier.union([ builder_1.MolScriptBuilder.struct.generator.atomGroups({ 'entity-test': _proteinEntityTest, 'residue-test': builder_1.MolScriptBuilder.core.flags.hasAny([ builder_1.MolScriptBuilder.ammp('secondaryStructureFlags'), builder_1.MolScriptBuilder.core.type.bitflags([4 /* Beta */]) ]) }) ]), { category: StructureSelectionCategory.Structure }); var water = StructureSelectionQuery('Water', builder_1.MolScriptBuilder.struct.modifier.union([ builder_1.MolScriptBuilder.struct.generator.atomGroups({ 'entity-test': builder_1.MolScriptBuilder.core.rel.eq([builder_1.MolScriptBuilder.ammp('entityType'), 'water']) }) ]), { category: StructureSelectionCategory.Type }); var ion = StructureSelectionQuery('Ion', builder_1.MolScriptBuilder.struct.modifier.union([ builder_1.MolScriptBuilder.struct.generator.atomGroups({ 'entity-test': builder_1.MolScriptBuilder.core.rel.eq([builder_1.MolScriptBuilder.ammp('entitySubtype'), 'ion']) }) ]), { category: StructureSelectionCategory.Type }); var lipid = StructureSelectionQuery('Lipid', builder_1.MolScriptBuilder.struct.modifier.union([ builder_1.MolScriptBuilder.struct.generator.atomGroups({ 'entity-test': builder_1.MolScriptBuilder.core.rel.eq([builder_1.MolScriptBuilder.ammp('entitySubtype'), 'lipid']) }) ]), { category: StructureSelectionCategory.Type }); var branched = StructureSelectionQuery('Carbohydrate', builder_1.MolScriptBuilder.struct.modifier.union([ builder_1.MolScriptBuilder.struct.generator.atomGroups({ 'entity-test': builder_1.MolScriptBuilder.core.logic.or([ builder_1.MolScriptBuilder.core.rel.eq([builder_1.MolScriptBuilder.ammp('entityType'), 'branched']), builder_1.MolScriptBuilder.core.logic.and([ builder_1.MolScriptBuilder.core.rel.eq([builder_1.MolScriptBuilder.ammp('entityType'), 'non-polymer']), builder_1.MolScriptBuilder.core.str.match([ builder_1.MolScriptBuilder.re('oligosaccharide', 'i'), builder_1.MolScriptBuilder.ammp('entitySubtype') ]) ]) ]) }) ]), { category: StructureSelectionCategory.Type }); var branchedPlusConnected = StructureSelectionQuery('Carbohydrate with Connected', builder_1.MolScriptBuilder.struct.modifier.union([ builder_1.MolScriptBuilder.struct.modifier.includeConnected({ 0: branched.expression, 'layer-count': 1, 'as-whole-residues': true }) ]), { category: StructureSelectionCategory.Internal, isHidden: true }); var branchedConnectedOnly = StructureSelectionQuery('Connected to Carbohydrate', builder_1.MolScriptBuilder.struct.modifier.union([ builder_1.MolScriptBuilder.struct.modifier.exceptBy({ 0: branchedPlusConnected.expression, by: branched.expression }) ]), { category: StructureSelectionCategory.Internal, isHidden: true }); var ligand = StructureSelectionQuery('Ligand', builder_1.MolScriptBuilder.struct.modifier.union([ builder_1.MolScriptBuilder.struct.combinator.merge([ builder_1.MolScriptBuilder.struct.modifier.union([ builder_1.MolScriptBuilder.struct.generator.atomGroups({ 'entity-test': builder_1.MolScriptBuilder.core.logic.and([ builder_1.MolScriptBuilder.core.logic.or([ builder_1.MolScriptBuilder.core.rel.eq([builder_1.MolScriptBuilder.ammp('entityType'), 'non-polymer']), builder_1.MolScriptBuilder.core.rel.neq([builder_1.MolScriptBuilder.ammp('entityPrdId'), '']) ]), builder_1.MolScriptBuilder.core.logic.not([builder_1.MolScriptBuilder.core.str.match([ builder_1.MolScriptBuilder.re('(oligosaccharide|lipid|ion)', 'i'), builder_1.MolScriptBuilder.ammp('entitySubtype') ])]) ]), 'chain-test': builder_1.MolScriptBuilder.core.rel.eq([builder_1.MolScriptBuilder.ammp('objectPrimitive'), 'atomistic']), 'residue-test': builder_1.MolScriptBuilder.core.logic.not([ builder_1.MolScriptBuilder.core.str.match([builder_1.MolScriptBuilder.re('saccharide', 'i'), builder_1.MolScriptBuilder.ammp('chemCompType')]) ]) }) ]), builder_1.MolScriptBuilder.struct.modifier.union([ builder_1.MolScriptBuilder.struct.generator.atomGroups({ 'entity-test': builder_1.MolScriptBuilder.core.rel.eq([builder_1.MolScriptBuilder.ammp('entityType'), 'polymer']), 'chain-test': builder_1.MolScriptBuilder.core.rel.eq([builder_1.MolScriptBuilder.ammp('objectPrimitive'), 'atomistic']), 'residue-test': _nonPolymerResidueTest }) ]) ]), ]), { category: StructureSelectionCategory.Type }); // don't include branched entities as they have their own link representation var ligandPlusConnected = StructureSelectionQuery('Ligand with Connected', builder_1.MolScriptBuilder.struct.modifier.union([ builder_1.MolScriptBuilder.struct.modifier.exceptBy({ 0: builder_1.MolScriptBuilder.struct.modifier.union([ builder_1.MolScriptBuilder.struct.modifier.includeConnected({ 0: ligand.expression, 'layer-count': 1, 'as-whole-residues': true, 'bond-test': builder_1.MolScriptBuilder.core.flags.hasAny([ builder_1.MolScriptBuilder.struct.bondProperty.flags(), builder_1.MolScriptBuilder.core.type.bitflags([ 1 /* Covalent */ | 2 /* MetallicCoordination */ ]) ]) }) ]), by: branched.expression }) ]), { category: StructureSelectionCategory.Internal, isHidden: true }); var ligandConnectedOnly = StructureSelectionQuery('Connected to Ligand', builder_1.MolScriptBuilder.struct.modifier.union([ builder_1.MolScriptBuilder.struct.modifier.exceptBy({ 0: ligandPlusConnected.expression, by: ligand.expression }) ]), { category: StructureSelectionCategory.Internal, isHidden: true }); // residues connected to ligands or branched entities var connectedOnly = StructureSelectionQuery('Connected to Ligand or Carbohydrate', builder_1.MolScriptBuilder.struct.modifier.union([ builder_1.MolScriptBuilder.struct.combinator.merge([ branchedConnectedOnly.expression, ligandConnectedOnly.expression ]), ]), { category: StructureSelectionCategory.Internal, isHidden: true }); var disulfideBridges = StructureSelectionQuery('Disulfide Bridges', builder_1.MolScriptBuilder.struct.modifier.union([ builder_1.MolScriptBuilder.struct.combinator.merge([ builder_1.MolScriptBuilder.struct.modifier.union([ builder_1.MolScriptBuilder.struct.modifier.wholeResidues([ builder_1.MolScriptBuilder.struct.filter.isConnectedTo({ 0: builder_1.MolScriptBuilder.struct.generator.atomGroups({ 'residue-test': builder_1.MolScriptBuilder.core.set.has([builder_1.MolScriptBuilder.set('CYS'), builder_1.MolScriptBuilder.ammp('auth_comp_id')]), 'atom-test': builder_1.MolScriptBuilder.core.set.has([builder_1.MolScriptBuilder.set('SG'), builder_1.MolScriptBuilder.ammp('label_atom_id')]) }), target: builder_1.MolScriptBuilder.struct.generator.atomGroups({ 'residue-test': builder_1.MolScriptBuilder.core.set.has([builder_1.MolScriptBuilder.set('CYS'), builder_1.MolScriptBuilder.ammp('auth_comp_id')]), 'atom-test': builder_1.MolScriptBuilder.core.set.has([builder_1.MolScriptBuilder.set('SG'), builder_1.MolScriptBuilder.ammp('label_atom_id')]) }), 'bond-test': true }) ]) ]), builder_1.MolScriptBuilder.struct.modifier.union([ builder_1.MolScriptBuilder.struct.modifier.wholeResidues([ builder_1.MolScriptBuilder.struct.modifier.union([ builder_1.MolScriptBuilder.struct.generator.bondedAtomicPairs({ 0: builder_1.MolScriptBuilder.core.flags.hasAny([ builder_1.MolScriptBuilder.struct.bondProperty.flags(), builder_1.MolScriptBuilder.core.type.bitflags([8 /* Disulfide */]) ]) }) ]) ]) ]) ]) ]), { category: StructureSelectionCategory.Bond }); var nosBridges = StructureSelectionQuery('NOS Bridges', builder_1.MolScriptBuilder.struct.modifier.union([ builder_1.MolScriptBuilder.struct.modifier.wholeResidues([ builder_1.MolScriptBuilder.struct.filter.isConnectedTo({ 0: builder_1.MolScriptBuilder.struct.generator.atomGroups({ 'residue-test': builder_1.MolScriptBuilder.core.set.has([builder_1.MolScriptBuilder.set('CSO', 'LYS'), builder_1.MolScriptBuilder.ammp('auth_comp_id')]), 'atom-test': builder_1.MolScriptBuilder.core.set.has([builder_1.MolScriptBuilder.set('OD', 'NZ'), builder_1.MolScriptBuilder.ammp('label_atom_id')]) }), target: builder_1.MolScriptBuilder.struct.generator.atomGroups({ 'residue-test': builder_1.MolScriptBuilder.core.set.has([builder_1.MolScriptBuilder.set('CSO', 'LYS'), builder_1.MolScriptBuilder.ammp('auth_comp_id')]), 'atom-test': builder_1.MolScriptBuilder.core.set.has([builder_1.MolScriptBuilder.set('OD', 'NZ'), builder_1.MolScriptBuilder.ammp('label_atom_id')]) }), 'bond-test': true }) ]) ]), { category: StructureSelectionCategory.Bond }); var nonStandardPolymer = StructureSelectionQuery('Non-standard Residues in Polymers', builder_1.MolScriptBuilder.struct.modifier.union([ builder_1.MolScriptBuilder.struct.generator.atomGroups({ 'entity-test': builder_1.MolScriptBuilder.core.rel.eq([builder_1.MolScriptBuilder.ammp('entityType'), 'polymer']), 'chain-test': builder_1.MolScriptBuilder.core.rel.eq([builder_1.MolScriptBuilder.ammp('objectPrimitive'), 'atomistic']), 'residue-test': builder_1.MolScriptBuilder.ammp('isNonStandard') }) ]), { category: StructureSelectionCategory.Residue }); var coarse = StructureSelectionQuery('Coarse Elements', builder_1.MolScriptBuilder.struct.modifier.union([ builder_1.MolScriptBuilder.struct.generator.atomGroups({ 'chain-test': builder_1.MolScriptBuilder.core.set.has([ builder_1.MolScriptBuilder.set('sphere', 'gaussian'), builder_1.MolScriptBuilder.ammp('objectPrimitive') ]) }) ]), { category: StructureSelectionCategory.Type }); var ring = StructureSelectionQuery('Rings in Residues', builder_1.MolScriptBuilder.struct.modifier.union([ builder_1.MolScriptBuilder.struct.generator.rings() ]), { category: StructureSelectionCategory.Residue }); var aromaticRing = StructureSelectionQuery('Aromatic Rings in Residues', builder_1.MolScriptBuilder.struct.modifier.union([ builder_1.MolScriptBuilder.struct.generator.rings({ 'only-aromatic': true }) ]), { category: StructureSelectionCategory.Residue }); var surroundings = StructureSelectionQuery('Surrounding Residues (5 \u212B) of Selection', builder_1.MolScriptBuilder.struct.modifier.union([ builder_1.MolScriptBuilder.struct.modifier.exceptBy({ 0: builder_1.MolScriptBuilder.struct.modifier.includeSurroundings({ 0: builder_1.MolScriptBuilder.internal.generator.current(), radius: 5, 'as-whole-residues': true }), by: builder_1.MolScriptBuilder.internal.generator.current() }) ]), { description: 'Select residues within 5 \u212B of the current selection.', category: StructureSelectionCategory.Manipulate, referencesCurrent: true }); var surroundingLigands = StructureSelectionQuery('Surrounding Ligands (5 \u212B) of Selection', builder_1.MolScriptBuilder.struct.modifier.union([ builder_1.MolScriptBuilder.struct.modifier.surroundingLigands({ 0: builder_1.MolScriptBuilder.internal.generator.current(), radius: 5, 'include-water': true }) ]), { description: 'Select ligand components within 5 \u212B of the current selection.', category: StructureSelectionCategory.Manipulate, referencesCurrent: true }); var surroundingAtoms = StructureSelectionQuery('Surrounding Atoms (5 \u212B) of Selection', builder_1.MolScriptBuilder.struct.modifier.union([ builder_1.MolScriptBuilder.struct.modifier.exceptBy({ 0: builder_1.MolScriptBuilder.struct.modifier.includeSurroundings({ 0: builder_1.MolScriptBuilder.internal.generator.current(), radius: 5, 'as-whole-residues': false }), by: builder_1.MolScriptBuilder.internal.generator.current() }) ]), { description: 'Select atoms within 5 \u212B of the current selection.', category: StructureSelectionCategory.Manipulate, referencesCurrent: true }); var complement = StructureSelectionQuery('Inverse / Complement of Selection', builder_1.MolScriptBuilder.struct.modifier.union([ builder_1.MolScriptBuilder.struct.modifier.exceptBy({ 0: builder_1.MolScriptBuilder.struct.generator.all(), by: builder_1.MolScriptBuilder.internal.generator.current() }) ]), { description: 'Select everything not in the current selection.', category: StructureSelectionCategory.Manipulate, referencesCurrent: true }); var covalentlyBonded = StructureSelectionQuery('Residues Covalently Bonded to Selection', builder_1.MolScriptBuilder.struct.modifier.union([ builder_1.MolScriptBuilder.struct.modifier.includeConnected({ 0: builder_1.MolScriptBuilder.internal.generator.current(), 'layer-count': 1, 'as-whole-residues': true }) ]), { description: 'Select residues covalently bonded to current selection.', category: StructureSelectionCategory.Manipulate, referencesCurrent: true }); var covalentlyBondedComponent = StructureSelectionQuery('Covalently Bonded Component', builder_1.MolScriptBuilder.struct.modifier.union([ builder_1.MolScriptBuilder.struct.modifier.includeConnected({ 0: builder_1.MolScriptBuilder.internal.generator.current(), 'fixed-point': true }) ]), { description: 'Select covalently bonded component based on current selection.', category: StructureSelectionCategory.Manipulate, referencesCurrent: true }); var covalentlyOrMetallicBonded = StructureSelectionQuery('Residues with Cov. or Metallic Bond to Selection', builder_1.MolScriptBuilder.struct.modifier.union([ builder_1.MolScriptBuilder.struct.modifier.includeConnected({ 0: builder_1.MolScriptBuilder.internal.generator.current(), 'layer-count': 1, 'as-whole-residues': true, 'bond-test': builder_1.MolScriptBuilder.core.flags.hasAny([ builder_1.MolScriptBuilder.struct.bondProperty.flags(), builder_1.MolScriptBuilder.core.type.bitflags([ 1 /* Covalent */ | 2 /* MetallicCoordination */ ]) ]) }) ]), { description: 'Select residues with covalent or metallic bond to current selection.', category: StructureSelectionCategory.Manipulate, referencesCurrent: true }); var wholeResidues = StructureSelectionQuery('Whole Residues of Selection', builder_1.MolScriptBuilder.struct.modifier.union([ builder_1.MolScriptBuilder.struct.modifier.wholeResidues({ 0: builder_1.MolScriptBuilder.internal.generator.current() }) ]), { description: 'Expand current selection to whole residues.', category: StructureSelectionCategory.Manipulate, referencesCurrent: true }); var StandardAminoAcids = [ [['HIS'], 'Histidine'], [['ARG'], 'Arginine'], [['LYS'], 'Lysine'], [['ILE'], 'Isoleucine'], [['PHE'], 'Phenylalanine'], [['LEU'], 'Leucine'], [['TRP'], 'Tryptophan'], [['ALA'], 'Alanine'], [['MET'], 'Methionine'], [['PRO'], 'Proline'], [['CYS'], 'Cysteine'], [['ASN'], 'Asparagine'], [['VAL'], 'Valine'], [['GLY'], 'Glycine'], [['SER'], 'Serine'], [['GLN'], 'Glutamine'], [['TYR'], 'Tyrosine'], [['ASP'], 'Aspartic Acid'], [['GLU'], 'Glutamic Acid'], [['THR'], 'Threonine'], [['SEC'], 'Selenocysteine'], [['PYL'], 'Pyrrolysine'], [['UNK'], 'Unknown'], ].sort(function (a, b) { return a[1] < b[1] ? -1 : a[1] > b[1] ? 1 : 0; }); var StandardNucleicBases = [ [['A', 'DA'], 'Adenosine'], [['C', 'DC'], 'Cytidine'], [['T', 'DT'], 'Thymidine'], [['G', 'DG'], 'Guanosine'], [['I', 'DI'], 'Inosine'], [['U', 'DU'], 'Uridine'], [['N', 'DN'], 'Unknown'], ].sort(function (a, b) { return a[1] < b[1] ? -1 : a[1] > b[1] ? 1 : 0; }); function ResidueQuery(_a, category, priority) { var names = _a[0], label = _a[1]; if (priority === void 0) { priority = 0; } var description = names.length === 1 && !StandardResidues.has(names[0]) ? "[" + names[0] + "] " + label : label + " (" + names.join(', ') + ")"; return StructureSelectionQuery(description, builder_1.MolScriptBuilder.struct.modifier.union([ builder_1.MolScriptBuilder.struct.generator.atomGroups({ 'residue-test': builder_1.MolScriptBuilder.core.set.has([builder_1.MolScriptBuilder.set.apply(builder_1.MolScriptBuilder, names), builder_1.MolScriptBuilder.ammp('auth_comp_id')]) }) ]), { category: category, priority: priority, description: description }); } exports.ResidueQuery = ResidueQuery; function ElementSymbolQuery(_a, category, priority) { var names = _a[0], label = _a[1]; var description = label + " (" + names.join(', ') + ")"; return StructureSelectionQuery(description, builder_1.MolScriptBuilder.struct.modifier.union([ builder_1.MolScriptBuilder.struct.generator.atomGroups({ 'atom-test': builder_1.MolScriptBuilder.core.set.has([builder_1.MolScriptBuilder.set.apply(builder_1.MolScriptBuilder, names), builder_1.MolScriptBuilder.acp('elementSymbol')]) }) ]), { category: category, priority: priority, description: description }); } exports.ElementSymbolQuery = ElementSymbolQuery; function EntityDescriptionQuery(_a, category, priority) { var names = _a[0], label = _a[1]; var description = "" + label; return StructureSelectionQuery("" + label, builder_1.MolScriptBuilder.struct.modifier.union([ builder_1.MolScriptBuilder.struct.generator.atomGroups({ 'entity-test': builder_1.MolScriptBuilder.core.list.equal([builder_1.MolScriptBuilder.list.apply(builder_1.MolScriptBuilder, names), builder_1.MolScriptBuilder.ammp('entityDescription')]) }) ]), { category: category, priority: priority, description: description }); } exports.EntityDescriptionQuery = EntityDescriptionQuery; var StandardResidues = set_1.SetUtils.unionMany(types_1.AminoAcidNamesL, types_1.RnaBaseNames, types_1.DnaBaseNames, types_1.WaterNames); function getElementQueries(structures) { var uniqueElements = new Set(); for (var _i = 0, structures_1 = structures; _i < structures_1.length; _i++) { var structure = structures_1[_i]; structure.uniqueElementSymbols.forEach(function (e) { return uniqueElements.add(e); }); } var queries = []; uniqueElements.forEach(function (e) { var label = types_2.ElementNames[e] || e; queries.push(ElementSymbolQuery([[e], label], 'Element Symbol', 0)); }); return queries; } exports.getElementQueries = getElementQueries; function getNonStandardResidueQueries(structures) { var residueLabels = new Map(); var uniqueResidues = new Set(); for (var _i = 0, structures_2 = structures; _i < structures_2.length; _i++) { var structure = structures_2[_i]; structure.uniqueResidueNames.forEach(function (r) { return uniqueResidues.add(r); }); var _loop_1 = function (m) { structure.uniqueResidueNames.forEach(function (r) { var comp = m.properties.chemicalComponentMap.get(r); if (comp) residueLabels.set(r, comp.name); }); }; for (var _a = 0, _b = structure.models; _a < _b.length; _a++) { var m = _b[_a]; _loop_1(m); } } var queries = []; set_1.SetUtils.difference(uniqueResidues, StandardResidues).forEach(function (r) { var label = residueLabels.get(r) || r; queries.push(ResidueQuery([[r], label], 'Ligand/Non-standard Residue', 200)); }); return queries; } exports.getNonStandardResidueQueries = getNonStandardResidueQueries; function getPolymerAndBranchedEntityQueries(structures) { var uniqueEntities = new Map(); var l = structure_1.StructureElement.Location.create(); for (var _i = 0, structures_3 = structures; _i < structures_3.length; _i++) { var structure = structures_3[_i]; l.structure = structure; for (var _a = 0, _b = structure.unitSymmetryGroups; _a < _b.length; _a++) { var ug = _b[_a]; l.unit = ug.units[0]; l.element = ug.elements[0]; var entityType = structure_1.StructureProperties.entity.type(l); if (entityType === 'polymer' || entityType === 'branched') { var description = structure_1.StructureProperties.entity.pdbx_description(l); uniqueEntities.set(description.join(', '), description); } } } var queries = []; uniqueEntities.forEach(function (v, k) { queries.push(EntityDescriptionQuery([v, k], 'Polymer/Carbohydrate Entities', 300)); }); return queries; } exports.getPolymerAndBranchedEntityQueries = getPolymerAndBranchedEntityQueries; function applyBuiltInSelection(to, query, customTag) { return to.apply(transforms_1.StateTransforms.Model.StructureSelectionFromExpression, { expression: exports.StructureSelectionQueries[query].expression, label: exports.StructureSelectionQueries[query].label }, { tags: customTag ? [query, customTag] : [query] }); } exports.applyBuiltInSelection = applyBuiltInSelection; exports.StructureSelectionQueries = { all: all, current: current, polymer: polymer, trace: trace, backbone: backbone, sidechain: sidechain, sidechainWithTrace: sidechainWithTrace, protein: protein, nucleic: nucleic, helix: helix, beta: beta, water: water, ion: ion, lipid: lipid, branched: branched, branchedPlusConnected: branchedPlusConnected, branchedConnectedOnly: branchedConnectedOnly, ligand: ligand, ligandPlusConnected: ligandPlusConnected, ligandConnectedOnly: ligandConnectedOnly, connectedOnly: connectedOnly, disulfideBridges: disulfideBridges, nosBridges: nosBridges, nonStandardPolymer: nonStandardPolymer, coarse: coarse, ring: ring, aromaticRing: aromaticRing, surroundings: surroundings, surroundingLigands: surroundingLigands, surroundingAtoms: surroundingAtoms, complement: complement, covalentlyBonded: covalentlyBonded, covalentlyOrMetallicBonded: covalentlyOrMetallicBonded, covalentlyBondedComponent: covalentlyBondedComponent, wholeResidues: wholeResidues, }; var StructureSelectionQueryRegistry = /** @class */ (function () { function StructureSelectionQueryRegistry() { var _a, _b; this.list = []; this.options = []; this.version = 1; // add built-in (_a = this.list).push.apply(_a, (0, tslib_1.__spreadArray)((0, tslib_1.__spreadArray)((0, tslib_1.__spreadArray)([], Object.values(exports.StructureSelectionQueries), false), StandardAminoAcids.map(function (v) { return ResidueQuery(v, StructureSelectionCategory.AminoAcid); }), false), StandardNucleicBases.map(function (v) { return ResidueQuery(v, StructureSelectionCategory.NucleicBase); }), false)); (_b = this.options).push.apply(_b, this.list.map(function (q) { return [q, q.label, q.category]; })); } StructureSelectionQueryRegistry.prototype.add = function (q) { this.list.push(q); this.options.push([q, q.label, q.category]); this.version += 1; }; StructureSelectionQueryRegistry.prototype.remove = function (q) { var idx = this.list.indexOf(q); if (idx !== -1) { this.list.splice(idx, 1); this.options.splice(idx, 1); this.version += 1; } }; return StructureSelectionQueryRegistry; }()); exports.StructureSelectionQueryRegistry = StructureSelectionQueryRegistry; //# sourceMappingURL=structure-selection-query.js.map