From 4cc0754f11b21c52c9924689487f36d756c59a52 Mon Sep 17 00:00:00 2001
From: Alexander Rose <alex.rose@rcsb.org>
Date: Wed, 30 Oct 2019 11:30:37 -0700
Subject: [PATCH] add isNonStandard atom prop, use polymer repr preset

---
 src/mol-model/structure/structure/properties.ts         | 1 +
 src/mol-plugin/util/structure-representation-helper.ts  | 1 +
 src/mol-plugin/util/structure-selection-helper.ts       | 9 +++++++++
 src/mol-script/language/symbol-table/structure-query.ts | 3 ++-
 src/mol-script/runtime/query/table.ts                   | 1 +
 5 files changed, 14 insertions(+), 1 deletion(-)

diff --git a/src/mol-model/structure/structure/properties.ts b/src/mol-model/structure/structure/properties.ts
index 5cca0f63d..067a95704 100644
--- a/src/mol-model/structure/structure/properties.ts
+++ b/src/mol-model/structure/structure/properties.ts
@@ -100,6 +100,7 @@ const residue = {
         const id = compId(l)
         return l.unit.model.properties.modifiedResidues.parentId.get(id) || id
     }),
+    isNonStandard: p(l => !Unit.isAtomic(l.unit) ? notAtomic() : l.unit.model.properties.chemicalComponentMap.get(compId(l))!.mon_nstd_flag[0] !== 'y'),
     hasMicroheterogeneity: p(hasMicroheterogeneity),
     microheterogeneityCompIds: p(microheterogeneityCompIds),
     secondary_structure_type: p(l => !Unit.isAtomic(l.unit) ? notAtomic() : l.unit.model.properties.secondaryStructure.type[l.unit.residueIndex[l.element]]),
diff --git a/src/mol-plugin/util/structure-representation-helper.ts b/src/mol-plugin/util/structure-representation-helper.ts
index c34f32dd9..b84bce22b 100644
--- a/src/mol-plugin/util/structure-representation-helper.ts
+++ b/src/mol-plugin/util/structure-representation-helper.ts
@@ -205,6 +205,7 @@ async function polymerAndLigand(r: StructureRepresentationHelper) {
         MS.struct.combinator.merge([
             Q.ligandPlusConnected.expression,
             Q.branchedConnectedOnly.expression,
+            Q.nonStandardPolymer.expression,
             Q.water.expression
         ])
     ]))
diff --git a/src/mol-plugin/util/structure-selection-helper.ts b/src/mol-plugin/util/structure-selection-helper.ts
index 29ff94678..59dab706f 100644
--- a/src/mol-plugin/util/structure-selection-helper.ts
+++ b/src/mol-plugin/util/structure-selection-helper.ts
@@ -188,6 +188,14 @@ const modified = StructureSelectionQuery('Modified Residues', MS.struct.modifier
     })
 ]))
 
+const nonStandardPolymer = StructureSelectionQuery('Non-standard Residues in Polymers', 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': MS.ammp('isNonStandard')
+    })
+]))
+
 const coarse = StructureSelectionQuery('Coarse Elements', MS.struct.modifier.union([
     MS.struct.generator.atomGroups({
         'chain-test': MS.core.set.has([
@@ -230,6 +238,7 @@ export const StructureSelectionQueries = {
     ligandConnectedOnly,
     connectedOnly,
     modified,
+    nonStandardPolymer,
     coarse,
     surroundings,
     complement,
diff --git a/src/mol-script/language/symbol-table/structure-query.ts b/src/mol-script/language/symbol-table/structure-query.ts
index d9d079244..fbe722d3b 100644
--- a/src/mol-script/language/symbol-table/structure-query.ts
+++ b/src/mol-script/language/symbol-table/structure-query.ts
@@ -303,8 +303,9 @@ const atomProperty = {
 
         secondaryStructureKey: atomProp(Type.AnyValue, 'Unique value for each secondary structure element.'),
         secondaryStructureFlags: atomProp(Types.SecondaryStructureFlags),
-        isModified: atomProp(Type.Bool, 'True if the atom bolongs to modification of a standard residue.'),
+        isModified: atomProp(Type.Bool, 'True if the atom belongs to modification of a standard residue.'),
         modifiedParentName: atomProp(Type.Str, `'3-letter' code of the modifed parent residue.`),
+        isNonStandard: atomProp(Type.Bool, 'True if this is a non-standard residue.'),
         chemCompType: atomProp(Type.Str, `Type of the chemical component as defined in mmCIF.`),
     }
 }
diff --git a/src/mol-script/runtime/query/table.ts b/src/mol-script/runtime/query/table.ts
index 3f59a9da7..d16b114cb 100644
--- a/src/mol-script/runtime/query/table.ts
+++ b/src/mol-script/runtime/query/table.ts
@@ -314,6 +314,7 @@ const symbols = [
 
     D(MolScript.structureQuery.atomProperty.macromolecular.isModified, atomProp(StructureProperties.residue.isModified)),
     D(MolScript.structureQuery.atomProperty.macromolecular.modifiedParentName, atomProp(StructureProperties.residue.modifiedParentName)),
+    D(MolScript.structureQuery.atomProperty.macromolecular.isNonStandard, atomProp(StructureProperties.residue.isNonStandard)),
     D(MolScript.structureQuery.atomProperty.macromolecular.secondaryStructureKey, atomProp(StructureProperties.residue.secondary_structure_key)),
     D(MolScript.structureQuery.atomProperty.macromolecular.secondaryStructureFlags, atomProp(StructureProperties.residue.secondary_structure_type)),
     D(MolScript.structureQuery.atomProperty.macromolecular.chemCompType, atomProp(StructureProperties.residue.chem_comp_type)),
-- 
GitLab