Explorar el Código

more efficient representation for aligned residues

Yana Rose hace 4 años
padre
commit
042b8296a3
Se han modificado 2 ficheros con 21 adiciones y 20 borrados
  1. 20 19
      src/viewer/helpers/preset.ts
  2. 1 1
      src/viewer/helpers/superpose/flexible-structure.ts

+ 20 - 19
src/viewer/helpers/preset.ts

@@ -80,12 +80,8 @@ type BaseProps = {
 
 type ColorProp = {
     name: 'color',
-    value: number
-};
-
-type PropSet = {
-    args: ColorProp,
-    positions: number[]
+    value: number,
+    positions: Range[]
 };
 
 export type PropsetProps = {
@@ -93,10 +89,7 @@ export type PropsetProps = {
     selection?: (Range & {
         matrix?: Mat4
     })[],
-    representation: {
-        asymId: string,
-        propset: PropSet[]
-    }[]
+    representation: ColorProp[]
 } & BaseProps
 
 type ValidationProps = {
@@ -244,16 +237,20 @@ export const RcsbPreset = TrajectoryHierarchyPresetProvider({
 
             // adding coloring lookup scheme
             structure.data!.inheritedPropertyData.colors = {};
-            for (const reprProp of p.representation) {
-                const colorLookup = structure.data!.inheritedPropertyData.colors[reprProp.asymId] || new Map();
-                reprProp.propset.forEach(prop => {
-                    if (prop.args.name === 'color') {
-                        for (let i = 0; i < prop.positions.length; i++) {
-                            colorLookup.set(prop.positions[i], prop.args.value);
+            for (const repr of p.representation) {
+                if (repr.name === 'color') {
+                    const colorValue = repr.value;
+                    const positions = repr.positions;
+                    for (const range of positions) {
+                        if (!structure.data!.inheritedPropertyData.colors[range.asymId])
+                            structure.data!.inheritedPropertyData.colors[range.asymId] = new Map()
+                        const residues: number[] = (range.beg && range.end) ? toRange(range.beg, range.end) : [];
+                        if (range.beg && !range.end) residues.push(range.beg)
+                        for (const num of residues) {
+                            structure.data!.inheritedPropertyData.colors[range.asymId].set(num, colorValue);
                         }
                     }
-                });
-                structure.data!.inheritedPropertyData.colors[reprProp.asymId] = colorLookup;
+                }
             }
 
             // At this we have a structure that contains only the transformed substructres,
@@ -387,7 +384,11 @@ export const selectionTest = (asymId: string, residues: number[]) => {
     }
 }
 
-export const toRange = (start: number, end: number) => [...Array(end - start + 1)].map((_, i) => start + i);
+export const toRange = (start: number, end: number) => {
+    const b = start < end ? start : end
+    const e = start < end ? end : start
+    return [...Array(e - b + 1)].map((_, i) => b + i);
+}
 
 const labelFromProps = (entryId: string, range: Range) => {
     return entryId +(range.asymId ? `.${range.asymId}` : '') +

+ 1 - 1
src/viewer/helpers/superpose/flexible-structure.ts

@@ -35,6 +35,7 @@ const FlexibleStructureFromModel = PluginStateTransform.BuiltIn({
                 const expression = MS.struct.generator.atomGroups(test);
                 const { selection: sele } = StructureQueryHelper.createAndRun(base.data, expression);
                 const s = StructureSelection.unionStructure(sele);
+
                 if (!p.matrix) {
                     blocks.push(s);
                 } else {
@@ -42,7 +43,6 @@ const FlexibleStructureFromModel = PluginStateTransform.BuiltIn({
                     blocks.push(ts);
                 }
             }
-
             const builder = Structure.Builder()
             for (const b of blocks) {
                 for (const u of b.units) {