From 3d9c485cf1b23d1836e20903a3b0b58c500012f3 Mon Sep 17 00:00:00 2001
From: Alexander Rose <alexander.rose@weirdbyte.de>
Date: Tue, 26 Feb 2019 22:52:10 -0800
Subject: [PATCH] improved coarse backbone trace, e.g. 1jgq

---
 .../structure/visual/polymer-trace-mesh.ts     |  2 +-
 .../visual/util/polymer/trace-iterator.ts      | 18 ++++++++++++++++--
 2 files changed, 17 insertions(+), 3 deletions(-)

diff --git a/src/mol-repr/structure/visual/polymer-trace-mesh.ts b/src/mol-repr/structure/visual/polymer-trace-mesh.ts
index 11ef2c8a6..c30503dc1 100644
--- a/src/mol-repr/structure/visual/polymer-trace-mesh.ts
+++ b/src/mol-repr/structure/visual/polymer-trace-mesh.ts
@@ -89,7 +89,7 @@ function createPolymerTraceMesh(ctx: VisualContext, unit: Unit, structure: Struc
                 h2 = w2
             }
             interpolateSizes(state, w0, w1, w2, h0, h1, h2, shift)
-            addTube(builderState, curvePoints, normalVectors, binormalVectors, linearSegments, radialSegments, widthValues, heightValues, 1, v.secStrucFirst, v.secStrucLast)
+            addTube(builderState, curvePoints, normalVectors, binormalVectors, linearSegments, radialSegments, widthValues, heightValues, 1, v.secStrucFirst || v.coarseBackboneFirst, v.secStrucLast || v.coarseBackboneLast)
         }
 
         ++i
diff --git a/src/mol-repr/structure/visual/util/polymer/trace-iterator.ts b/src/mol-repr/structure/visual/util/polymer/trace-iterator.ts
index 9099462cd..6216c5307 100644
--- a/src/mol-repr/structure/visual/util/polymer/trace-iterator.ts
+++ b/src/mol-repr/structure/visual/util/polymer/trace-iterator.ts
@@ -36,6 +36,7 @@ interface PolymerTraceElement {
     secStrucType: SecondaryStructureType
     moleculeType: MoleculeType
     isCoarseBackbone: boolean
+    coarseBackboneFirst: boolean, coarseBackboneLast: boolean
 
     p0: Vec3, p1: Vec3, p2: Vec3, p3: Vec3, p4: Vec3
     d12: Vec3, d23: Vec3
@@ -52,6 +53,7 @@ function createPolymerTraceElement (unit: Unit): PolymerTraceElement {
         secStrucFirst: false, secStrucLast: false,
         secStrucType: SecStrucTypeNA,
         moleculeType: MoleculeType.unknown,
+        coarseBackboneFirst: false, coarseBackboneLast: false,
         isCoarseBackbone: false,
         p0: Vec3.zero(), p1: Vec3.zero(), p2: Vec3.zero(), p3: Vec3.zero(), p4: Vec3.zero(),
         d12: Vec3.create(1, 0, 0), d23: Vec3.create(1, 0, 0),
@@ -72,6 +74,9 @@ export class AtomicPolymerTraceIterator implements Iterator<PolymerTraceElement>
     private prevSecStrucType: SecondaryStructureType
     private currSecStrucType: SecondaryStructureType
     private nextSecStrucType: SecondaryStructureType
+    private prevCoarseBackbone: boolean
+    private currCoarseBackbone: boolean
+    private nextCoarseBackbone: boolean
     private state: AtomicPolymerTraceIteratorState = AtomicPolymerTraceIteratorState.nextPolymer
     private residueAtomSegments: Segmentation<ElementIndex, ResidueIndex>
     private traceElementIndex: ArrayLike<ElementIndex>
@@ -148,6 +153,8 @@ export class AtomicPolymerTraceIterator implements Iterator<PolymerTraceElement>
                     this.state = AtomicPolymerTraceIteratorState.nextResidue
                     this.currSecStrucType = SecStrucTypeNA
                     this.nextSecStrucType = this.secondaryStructureType[this.residueSegmentMin]
+                    this.currCoarseBackbone = false
+                    this.nextCoarseBackbone = this.directionElementIndex[this.residueSegmentMin] === -1
                     break
                 }
             }
@@ -159,11 +166,18 @@ export class AtomicPolymerTraceIterator implements Iterator<PolymerTraceElement>
             this.currSecStrucType = this.nextSecStrucType
             this.nextSecStrucType = residueIt.hasNext ? this.secondaryStructureType[residueIndex + 1] : SecStrucTypeNA
 
+            this.prevCoarseBackbone = this.currCoarseBackbone
+            this.currCoarseBackbone = this.nextCoarseBackbone
+            this.nextCoarseBackbone = residueIt.hasNext ? this.directionElementIndex[residueIndex + 1] === -1 : false
+
             value.secStrucType = this.currSecStrucType
-            value.first = residueIndex === this.residueSegmentMin
-            value.last = residueIndex === this.residueSegmentMax
             value.secStrucFirst = this.prevSecStrucType !== this.currSecStrucType
             value.secStrucLast = this.currSecStrucType !== this.nextSecStrucType
+            value.isCoarseBackbone = this.currCoarseBackbone
+            value.coarseBackboneFirst = this.prevCoarseBackbone !== this.currCoarseBackbone
+            value.coarseBackboneLast = this.currCoarseBackbone !== this.nextCoarseBackbone
+            value.first = residueIndex === this.residueSegmentMin
+            value.last = residueIndex === this.residueSegmentMax
             value.moleculeType = this.moleculeType[residueIndex]
 
             const residueIndexPrev3 = this.getResidueIndex(residueIndex - 3)
-- 
GitLab