ソースを参照

added pdbx_nonpoly_scheme category to mmCIF schema and export

David Sehnal 6 年 前
コミット
c91b826f24

+ 11 - 0
data/mmcif-field-names.csv

@@ -123,6 +123,17 @@ pdbx_entity_descriptor.type
 pdbx_entity_descriptor.program
 pdbx_entity_descriptor.program_version
 
+pdbx_nonpoly_scheme.asym_id
+pdbx_nonpoly_scheme.entity_id
+pdbx_nonpoly_scheme.mon_id
+pdbx_nonpoly_scheme.ndb_seq_num
+pdbx_nonpoly_scheme.pdb_seq_num
+pdbx_nonpoly_scheme.auth_seq_num
+pdbx_nonpoly_scheme.pdb_mon_id
+pdbx_nonpoly_scheme.auth_mon_id
+pdbx_nonpoly_scheme.pdb_strand_id
+pdbx_nonpoly_scheme.pdb_ins_code
+
 entry.id
 
 exptl.entry_id

+ 12 - 0
src/mol-io/reader/cif/schema/mmcif.ts

@@ -1950,6 +1950,18 @@ export const mmCIF_Schema = {
          */
         ordinal: int,
     },
+    pdbx_nonpoly_scheme: {
+        asym_id: str,
+        entity_id: str,
+        mon_id: str,
+        ndb_seq_num: int,
+        pdb_seq_num: int,
+        auth_seq_num: int,
+        pdb_mon_id: str,
+        auth_mon_id: str,
+        pdb_strand_id: str,
+        pdb_ins_code: str
+    },
     /**
      * Data items in the IHM_STARTING_MODEL_DETAILS category records the
      * details about structural models used as starting inputs in

+ 10 - 0
src/mol-model/structure/export/categories/misc.ts

@@ -32,4 +32,14 @@ export const _pdbx_chem_comp_identifier: CifCategory<CifExportContext> = {
         const indices = Column.indicesOf(comp_id, id => names.has(id));
         return CifCategory.ofTable(pdbx_chem_comp_identifier, indices);
     }
+}
+
+export const _pdbx_nonpoly_scheme: CifCategory<CifExportContext> = {
+    name: 'pdbx_nonpoly_scheme',
+    instance({ firstModel, structures, cache }) {
+        const pdbx_nonpoly_scheme = getModelMmCifCategory(firstModel, 'pdbx_nonpoly_scheme');
+        if (!pdbx_nonpoly_scheme) return CifCategory.Empty;
+        // TODO: filter?
+        return CifCategory.ofTable(pdbx_nonpoly_scheme);
+    }
 }

+ 17 - 0
src/mol-model/structure/export/categories/utils.ts

@@ -11,6 +11,8 @@ import { Structure } from '../../structure';
 import { EntityIndex } from '../../model/indexing';
 import { UniqueArray } from 'mol-data/generic';
 import { sortArray } from 'mol-data/util';
+import { CifWriter } from 'mol-io/writer/cif';
+import { CifExportContext } from '../mmcif';
 
 export function getModelMmCifCategory<K extends keyof mmCIF_Schema>(model: Model, name: K): mmCIF_Database[K] | undefined {
     if (model.sourceData.kind !== 'mmCIF') return;
@@ -39,4 +41,19 @@ export function getUniqueEntityIndicesFromStructures(structures: Structure[]): R
     }
     sortArray(ret.array);
     return ret.array;
+}
+
+export function copy_mmCif_category(name: keyof mmCIF_Schema, condition?: (model: Model) => boolean): CifWriter.Category<CifExportContext> {
+    return {
+        name,
+        instance({ structures }) {
+            const model = structures[0].model;
+            if (model.sourceData.kind !== 'mmCIF') return CifWriter.Category.Empty;
+            if (condition && !condition(model)) return CifWriter.Category.Empty;
+
+            const table = model.sourceData.data[name];
+            if (!table || !table._rowCount) return CifWriter.Category.Empty;
+            return CifWriter.Category.ofTable(table);
+        }
+    };
 }

+ 3 - 15
src/mol-model/structure/export/mmcif.ts

@@ -12,9 +12,9 @@ import { _atom_site } from './categories/atom_site';
 import CifCategory = CifWriter.Category
 import { _struct_conf, _struct_sheet_range } from './categories/secondary-structure';
 import { _pdbx_struct_mod_residue } from './categories/modified-residues';
-import { _chem_comp, _pdbx_chem_comp_identifier } from './categories/misc';
+import { _chem_comp, _pdbx_chem_comp_identifier, _pdbx_nonpoly_scheme } from './categories/misc';
 import { Model } from '../model';
-import { getUniqueEntityIndicesFromStructures } from './categories/utils';
+import { getUniqueEntityIndicesFromStructures, copy_mmCif_category } from './categories/utils';
 import { _struct_asym, _entity_poly, _entity_poly_seq } from './categories/sequence';
 import { ModelPropertyDescriptor } from '../model/properties/custom';
 
@@ -35,19 +35,6 @@ export namespace CifExportContext {
     }
 }
 
-function copy_mmCif_category(name: keyof mmCIF_Schema): CifCategory<CifExportContext> {
-    return {
-        name,
-        instance({ structures }) {
-            const model = structures[0].model;
-            if (model.sourceData.kind !== 'mmCIF') return CifCategory.Empty;
-            const table = model.sourceData.data[name];
-            if (!table || !table._rowCount) return CifCategory.Empty;
-            return CifCategory.ofTable(table);
-        }
-    };
-}
-
 const _entity: CifCategory<CifExportContext> = {
     name: 'entity',
     instance({ structures }) {
@@ -91,6 +78,7 @@ const Categories = [
     _pdbx_chem_comp_identifier,
     copy_mmCif_category('atom_sites'),
 
+    _pdbx_nonpoly_scheme,
     _pdbx_struct_mod_residue,
 
     // Atoms