Browse Source

refactored pdb format label_seq_id handling

- leave undefined so it can be added later with hierarchy info
- see #72
Alexander Rose 4 years ago
parent
commit
10bd513680

+ 3 - 3
src/mol-model-formats/structure/pdb/atom-site.ts

@@ -9,6 +9,7 @@ import { CifField } from '../../../mol-io/reader/cif';
 import { mmCIF_Schema } from '../../../mol-io/reader/cif/schema/mmcif';
 import { TokenBuilder, Tokenizer } from '../../../mol-io/reader/common/text/tokenizer';
 import { guessElementSymbolTokens } from '../util';
+import { Column } from '../../../mol-data/db';
 
 type AtomSiteTemplate = typeof getAtomSiteTemplate extends (...args: any) => infer T ? T : never
 export function getAtomSiteTemplate(data: string, count: number) {
@@ -42,13 +43,12 @@ export function getAtomSite(sites: AtomSiteTemplate): { [K in keyof mmCIF_Schema
     const auth_asym_id = CifField.ofTokens(sites.auth_asym_id);
     const auth_atom_id = CifField.ofTokens(sites.auth_atom_id);
     const auth_comp_id = CifField.ofTokens(sites.auth_comp_id);
-    const auth_seq_id = CifField.ofTokens(sites.auth_seq_id);
 
     return {
         auth_asym_id,
         auth_atom_id,
         auth_comp_id,
-        auth_seq_id,
+        auth_seq_id: CifField.ofTokens(sites.auth_seq_id),
         B_iso_or_equiv: CifField.ofTokens(sites.B_iso_or_equiv),
         Cartn_x: CifField.ofTokens(sites.Cartn_x),
         Cartn_y: CifField.ofTokens(sites.Cartn_y),
@@ -61,7 +61,7 @@ export function getAtomSite(sites: AtomSiteTemplate): { [K in keyof mmCIF_Schema
         label_asym_id: auth_asym_id,
         label_atom_id: auth_atom_id,
         label_comp_id: auth_comp_id,
-        label_seq_id: auth_seq_id,
+        label_seq_id: CifField.ofUndefined(sites.count, Column.Schema.int),
         label_entity_id: CifField.ofStrings(sites.label_entity_id),
 
         occupancy: CifField.ofTokens(sites.occupancy),

+ 7 - 8
src/mol-model-formats/structure/pdb/secondary-structure.ts

@@ -7,6 +7,7 @@
 import { CifCategory, CifField } from '../../../mol-io/reader/cif';
 import { mmCIF_Schema } from '../../../mol-io/reader/cif/schema/mmcif';
 import { Tokens } from '../../../mol-io/reader/common/text/tokenizer';
+import { Column } from '../../../mol-data/db';
 
 const HelixTypes: {[k: string]: mmCIF_Schema['struct_conf']['conf_type_id']['T']} = {
     // CLASS NUMBER
@@ -99,29 +100,27 @@ export function parseHelix(lines: Tokens, lineStart: number, lineEnd: number): C
 
     const beg_auth_asym_id = CifField.ofStrings(helices.map(h => h.initChainID));
     const beg_auth_comp_id = CifField.ofStrings(helices.map(h => h.initResName));
-    const beg_auth_seq_id = CifField.ofStrings(helices.map(h => h.initSeqNum));
 
     const end_auth_asym_id = CifField.ofStrings(helices.map(h => h.endChainID));
-    const end_auth_comp_id = CifField.ofStrings(helices.map(h => h.endResName));
-    const end_auth_seq_id = CifField.ofStrings(helices.map(h => h.endSeqNum));
+    const end_auth_comp_id = CifField.ofStrings(helices.map(h => h.endResName));;
 
     const struct_conf: CifCategory.Fields<mmCIF_Schema['struct_conf']> = {
         beg_label_asym_id: beg_auth_asym_id,
         beg_label_comp_id: beg_auth_comp_id,
-        beg_label_seq_id: beg_auth_seq_id,
+        beg_label_seq_id: CifField.ofUndefined(helices.length, Column.Schema.int),
         beg_auth_asym_id,
         beg_auth_comp_id,
-        beg_auth_seq_id,
+        beg_auth_seq_id: CifField.ofStrings(helices.map(h => h.initSeqNum)),
 
         conf_type_id: CifField.ofStrings(helices.map(h => getStructConfTypeId(h.helixClass))),
         details: CifField.ofStrings(helices.map(h => h.comment)),
 
         end_label_asym_id: end_auth_asym_id,
-        end_label_comp_id: end_auth_asym_id,
-        end_label_seq_id: end_auth_seq_id,
+        end_label_comp_id: end_auth_comp_id,
+        end_label_seq_id: CifField.ofUndefined(helices.length, Column.Schema.int),
         end_auth_asym_id,
         end_auth_comp_id,
-        end_auth_seq_id,
+        end_auth_seq_id: CifField.ofStrings(helices.map(h => h.endSeqNum)),
 
         id: CifField.ofStrings(helices.map(h => h.serNum)),
         pdbx_beg_PDB_ins_code: CifField.ofStrings(helices.map(h => h.initICode)),

+ 12 - 12
src/mol-model-formats/structure/property/secondary-structure.ts

@@ -62,8 +62,8 @@ type SecondaryStructureData = { type: SecondaryStructureType[], key: number[], e
 function addHelices(cat: StructConf, map: SecondaryStructureMap, elements: SecondaryStructure.Element[]) {
     if (!cat._rowCount) return;
 
-    const { beg_label_asym_id, beg_label_seq_id, pdbx_beg_PDB_ins_code } = cat;
-    const { end_label_seq_id, pdbx_end_PDB_ins_code } = cat;
+    const { beg_label_asym_id, beg_auth_seq_id, pdbx_beg_PDB_ins_code } = cat;
+    const { end_auth_seq_id, pdbx_end_PDB_ins_code } = cat;
     const { pdbx_PDB_helix_class, conf_type_id, details } = cat;
 
     for (let i = 0, _i = cat._rowCount; i < _i; i++) {
@@ -81,9 +81,9 @@ function addHelices(cat: StructConf, map: SecondaryStructureMap, elements: Secon
             details: details.valueKind(i) === Column.ValueKind.Present ? details.value(i) : void 0
         };
         const entry: SecondaryStructureEntry = {
-            startSeqNumber: beg_label_seq_id.value(i),
+            startSeqNumber: beg_auth_seq_id.value(i),
             startInsCode: pdbx_beg_PDB_ins_code.value(i),
-            endSeqNumber: end_label_seq_id.value(i),
+            endSeqNumber: end_auth_seq_id.value(i),
             endInsCode: pdbx_end_PDB_ins_code.value(i),
             type,
             key: elements.length
@@ -108,8 +108,8 @@ function addHelices(cat: StructConf, map: SecondaryStructureMap, elements: Secon
 function addSheets(cat: StructSheetRange, map: SecondaryStructureMap, sheetCount: number, elements: SecondaryStructure.Element[]) {
     if (!cat._rowCount) return;
 
-    const { beg_label_asym_id, beg_label_seq_id, pdbx_beg_PDB_ins_code } = cat;
-    const { end_label_seq_id, pdbx_end_PDB_ins_code } = cat;
+    const { beg_label_asym_id, beg_auth_seq_id, pdbx_beg_PDB_ins_code } = cat;
+    const { end_auth_seq_id, pdbx_end_PDB_ins_code } = cat;
     const { sheet_id } = cat;
 
     const sheet_id_key = new Map<string, number>();
@@ -132,9 +132,9 @@ function addSheets(cat: StructSheetRange, map: SecondaryStructureMap, sheetCount
             symmetry: void 0
         };
         const entry: SecondaryStructureEntry = {
-            startSeqNumber: beg_label_seq_id.value(i),
+            startSeqNumber: beg_auth_seq_id.value(i),
             startInsCode: pdbx_beg_PDB_ins_code.value(i),
-            endSeqNumber: end_label_seq_id.value(i),
+            endSeqNumber: end_auth_seq_id.value(i),
             endInsCode: pdbx_end_PDB_ins_code.value(i),
             type,
             key: elements.length
@@ -159,12 +159,12 @@ function addSheets(cat: StructSheetRange, map: SecondaryStructureMap, sheetCount
 }
 
 function assignSecondaryStructureEntry(hierarchy: AtomicHierarchy, entry: SecondaryStructureEntry, resStart: ResidueIndex, resEnd: ResidueIndex, data: SecondaryStructureData) {
-    const { label_seq_id, pdbx_PDB_ins_code } = hierarchy.residues;
+    const { auth_seq_id, pdbx_PDB_ins_code } = hierarchy.residues;
     const { endSeqNumber, endInsCode, key, type } = entry;
 
     let rI = resStart;
     while (rI < resEnd) {
-        const seqNumber = label_seq_id.value(rI);
+        const seqNumber = auth_seq_id.value(rI);
         data.type[rI] = type;
         data.key[rI] = key;
 
@@ -180,7 +180,7 @@ function assignSecondaryStructureEntry(hierarchy: AtomicHierarchy, entry: Second
 function assignSecondaryStructureRanges(hierarchy: AtomicHierarchy, map: SecondaryStructureMap, data: SecondaryStructureData) {
     const { count: chainCount } = hierarchy.chainAtomSegments;
     const { label_asym_id } = hierarchy.chains;
-    const { label_seq_id, pdbx_PDB_ins_code } = hierarchy.residues;
+    const { auth_seq_id, pdbx_PDB_ins_code } = hierarchy.residues;
 
     for (let cI = 0 as ChainIndex; cI < chainCount; cI++) {
         const resStart = AtomicHierarchy.chainStartResidueIndex(hierarchy, cI), resEnd = AtomicHierarchy.chainEndResidueIndexExcl(hierarchy, cI);
@@ -189,7 +189,7 @@ function assignSecondaryStructureRanges(hierarchy: AtomicHierarchy, map: Seconda
             const entries = map.get(asymId)!;
 
             for (let rI = resStart; rI < resEnd; rI++) {
-                const seqNumber = label_seq_id.value(rI);
+                const seqNumber = auth_seq_id.value(rI);
                 if (entries.has(seqNumber)) {
                     const entryList = entries.get(seqNumber)!;
                     for (const entry of entryList) {