From 6aa482bd51bb7e12cc102624c3368a5b0cbd0c7c Mon Sep 17 00:00:00 2001
From: David Sehnal <david.sehnal@gmail.com>
Date: Wed, 11 Jul 2018 08:42:34 +0200
Subject: [PATCH] Fix secondary struct assignment

---
 .../formats/mmcif/secondary-structure.ts      | 19 ++++++++++---------
 1 file changed, 10 insertions(+), 9 deletions(-)

diff --git a/src/mol-model/structure/model/formats/mmcif/secondary-structure.ts b/src/mol-model/structure/model/formats/mmcif/secondary-structure.ts
index 0c045f605..af127410e 100644
--- a/src/mol-model/structure/model/formats/mmcif/secondary-structure.ts
+++ b/src/mol-model/structure/model/formats/mmcif/secondary-structure.ts
@@ -37,7 +37,7 @@ type SecondaryStructureEntry = {
     key: number
 }
 type SecondaryStructureMap = Map<string, Map<number, SecondaryStructureEntry>>
-type SecondaryStructureData = { type: SecondaryStructureType[], key: number[], elements: SecondaryStructure.Element[]  }
+type SecondaryStructureData = { type: SecondaryStructureType[], key: number[], elements: SecondaryStructure.Element[] }
 
 function addHelices(cat: mmCIF['struct_conf'], map: SecondaryStructureMap, elements: SecondaryStructure.Element[]) {
     if (!cat._rowCount) return;
@@ -47,11 +47,11 @@ function addHelices(cat: mmCIF['struct_conf'], map: SecondaryStructureMap, eleme
     const { pdbx_PDB_helix_class, conf_type_id, details } = cat;
 
     for (let i = 0, _i = cat._rowCount; i < _i; i++) {
-        const type =  SecondaryStructureType.create(pdbx_PDB_helix_class.valueKind(i) === Column.ValueKind.Present
+        const type = SecondaryStructureType.create(pdbx_PDB_helix_class.valueKind(i) === Column.ValueKind.Present
             ? SecondaryStructureType.SecondaryStructurePdb[pdbx_PDB_helix_class.value(i)]
             : conf_type_id.valueKind(i) === Column.ValueKind.Present
-            ? SecondaryStructureType.SecondaryStructureMmcif[conf_type_id.value(i)]
-            : SecondaryStructureType.Flag.NA);
+                ? SecondaryStructureType.SecondaryStructureMmcif[conf_type_id.value(i)]
+                : SecondaryStructureType.Flag.NA);
 
         const element: SecondaryStructure.Helix = {
             kind: 'helix',
@@ -69,6 +69,7 @@ function addHelices(cat: mmCIF['struct_conf'], map: SecondaryStructureMap, eleme
             key: elements.length
         };
 
+
         elements[elements.length] = element;
 
         const asymId = beg_label_asym_id.value(i)!;
@@ -134,7 +135,7 @@ function assignSecondaryStructureEntry(hierarchy: AtomicHierarchy, entry: Second
     const { endSeqNumber, endInsCode, key, type } = entry;
 
     let rI = resStart;
-    while (rI < resEnd) {
+    while (rI <= resEnd) {
         const seqNumber = label_seq_id.value(rI);
         data.type[rI] = type;
         data.key[rI] = key;
@@ -149,18 +150,18 @@ function assignSecondaryStructureEntry(hierarchy: AtomicHierarchy, entry: Second
 }
 
 function assignSecondaryStructureRanges(hierarchy: AtomicHierarchy, map: SecondaryStructureMap, data: SecondaryStructureData) {
-    const { segments: chainSegments, count: chainCount } = hierarchy.chainSegments;
+    const { segments: chainAtomSegments, count: chainCount } = hierarchy.chainSegments;
+    const { segmentMap: residueIndex } = hierarchy.residueSegments;
     const { label_asym_id } = hierarchy.chains;
     const { label_seq_id, pdbx_PDB_ins_code } = hierarchy.residues;
 
     for (let cI = 0; cI < chainCount; cI++) {
-        const resStart = chainSegments[cI], resEnd = chainSegments[cI + 1];
+        const resStart = residueIndex[chainAtomSegments[cI]], resEnd = residueIndex[chainAtomSegments[cI + 1] - 1];
         const asymId = label_asym_id.value(cI);
-
         if (map.has(asymId)) {
             const entries = map.get(asymId)!;
 
-            for (let rI = resStart; rI < resEnd; rI++) {
+            for (let rI = resStart; rI <= resEnd; rI++) {
                 const seqNumber = label_seq_id.value(rI);
                 if (entries.has(seqNumber)) {
                     const entry = entries.get(seqNumber)!;
-- 
GitLab