diff --git a/docs/interesting-pdb-entries.md b/docs/interesting-pdb-entries.md index 3295669921d7c5251ef6d7779bcd950361b6e4e9..a1323f898887e0ea8320dcc240c0c612ded816e4 100644 --- a/docs/interesting-pdb-entries.md +++ b/docs/interesting-pdb-entries.md @@ -29,6 +29,11 @@ * Long linear sugar chain (4HG6) * Anisotropic B-factors/Ellipsoids (1EJG) * NOS bridges (LYS-CSO in 7B0L, 6ZWJ, 6ZWH) +* Non-polymer components in polymer entities + * PN2 in 1F80 + * ACE (many, e.g. 5AGU, 1E1X) + * ACY in 7ABY + * NH2 (many, e.g. 6Y13) Assembly symmetries * 5M30 (Assembly 1, C3 local and pseudo) diff --git a/src/mol-model/structure/model/types.ts b/src/mol-model/structure/model/types.ts index da3f5333c7d0b284d6be524ed8fdff0270a682bf..e6c7b808075a350065b169655ee8ee8090d59fc2 100644 --- a/src/mol-model/structure/model/types.ts +++ b/src/mol-model/structure/model/types.ts @@ -321,6 +321,12 @@ export function getMoleculeType(compType: string, compId: string): MoleculeType if (SaccharideCompIdMap.has(compId)) { // trust our saccharide table more than given 'non-polymer' or 'other' component type return MoleculeType.Saccharide; + } else if (AminoAcidNames.has(compId)) { + return MoleculeType.Protein; + } else if (RnaBaseNames.has(compId)) { + return MoleculeType.RNA; + } else if (DnaBaseNames.has(compId)) { + return MoleculeType.DNA; } else { return MoleculeType.Other; } diff --git a/src/mol-plugin-state/helpers/structure-selection-query.ts b/src/mol-plugin-state/helpers/structure-selection-query.ts index a969a5f065da113470f0b1eca9d99527c812f386..a8d3505aa3549f4bad81e5ef09ad9198c9aa6bb9 100644 --- a/src/mol-plugin-state/helpers/structure-selection-query.ts +++ b/src/mol-plugin-state/helpers/structure-selection-query.ts @@ -7,7 +7,7 @@ import { CustomProperty } from '../../mol-model-props/common/custom-property'; import { QueryContext, Structure, StructureQuery, StructureSelection, StructureProperties, StructureElement } from '../../mol-model/structure'; -import { BondType, NucleicBackboneAtoms, ProteinBackboneAtoms, SecondaryStructureType, AminoAcidNamesL, RnaBaseNames, DnaBaseNames, WaterNames, ElementSymbol } from '../../mol-model/structure/model/types'; +import { BondType, NucleicBackboneAtoms, ProteinBackboneAtoms, SecondaryStructureType, AminoAcidNamesL, RnaBaseNames, DnaBaseNames, WaterNames, ElementSymbol, PolymerNames } from '../../mol-model/structure/model/types'; import { PluginContext } from '../../mol-plugin/context'; import { MolScriptBuilder as MS } from '../../mol-script/language/builder'; import { Expression } from '../../mol-script/language/expression'; @@ -320,33 +320,46 @@ const branchedConnectedOnly = StructureSelectionQuery('Connected to Carbohydrate ]), { category: StructureSelectionCategory.Internal, isHidden: true }); const ligand = StructureSelectionQuery('Ligand', MS.struct.modifier.union([ - MS.struct.combinator.merge([ - MS.struct.modifier.union([ - MS.struct.generator.atomGroups({ - 'entity-test': MS.core.logic.and([ - MS.core.logic.or([ - MS.core.rel.eq([MS.ammp('entityType'), 'non-polymer']), - MS.core.rel.neq([MS.ammp('entityPrdId'), '']) - ]), - MS.core.logic.not([MS.core.str.match([ - MS.re('(oligosaccharide|lipid|ion)', 'i'), - MS.ammp('entitySubtype') - ])]) + MS.struct.modifier.exceptBy({ + 0: MS.struct.modifier.union([ + MS.struct.combinator.merge([ + MS.struct.modifier.union([ + MS.struct.generator.atomGroups({ + 'entity-test': MS.core.logic.and([ + MS.core.logic.or([ + MS.core.rel.eq([MS.ammp('entityType'), 'non-polymer']), + MS.core.rel.neq([MS.ammp('entityPrdId'), '']) + ]), + MS.core.logic.not([MS.core.str.match([ + MS.re('(oligosaccharide|lipid|ion)', 'i'), + MS.ammp('entitySubtype') + ])]) + ]), + 'chain-test': MS.core.rel.eq([MS.ammp('objectPrimitive'), 'atomistic']), + 'residue-test': MS.core.logic.not([ + MS.core.str.match([MS.re('saccharide', 'i'), MS.ammp('chemCompType')]) + ]) + }) ]), - 'chain-test': MS.core.rel.eq([MS.ammp('objectPrimitive'), 'atomistic']), - 'residue-test': MS.core.logic.not([ - MS.core.str.match([MS.re('saccharide', 'i'), MS.ammp('chemCompType')]) + MS.struct.modifier.union([ + MS.struct.generator.atomGroups({ + 'entity-test': MS.core.rel.eq([MS.ammp('entityType'), 'polymer']), + 'chain-test': MS.core.rel.eq([MS.ammp('objectPrimitive'), 'atomistic']), + 'residue-test': _nonPolymerResidueTest + }) ]) - }) + ]), ]), - MS.struct.modifier.union([ + by: MS.struct.modifier.union([ MS.struct.generator.atomGroups({ 'entity-test': MS.core.rel.eq([MS.ammp('entityType'), 'polymer']), 'chain-test': MS.core.rel.eq([MS.ammp('objectPrimitive'), 'atomistic']), - 'residue-test': _nonPolymerResidueTest + 'residue-test': MS.core.set.has([ + MS.set(...SetUtils.toArray(PolymerNames)), MS.ammp('label_comp_id') + ]) }) ]) - ]), + }) ]), { category: StructureSelectionCategory.Type }); // don't include branched entities as they have their own link representation