diff --git a/data/mmcif-field-names.csv b/data/mmcif-field-names.csv index 45602d31ed609b3422c9bff19906fd5ffe8f1ce8..fba153c636ab478f0cdf50ec74a25b7e2245bfa5 100644 --- a/data/mmcif-field-names.csv +++ b/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 diff --git a/src/mol-io/reader/cif/schema/mmcif.ts b/src/mol-io/reader/cif/schema/mmcif.ts index b0799e894d3049013f18076b7fe913df6b2df5fd..d2565a478cdb4bb7a9deebaacf3afec883279d59 100644 --- a/src/mol-io/reader/cif/schema/mmcif.ts +++ b/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 diff --git a/src/mol-model/structure/export/categories/misc.ts b/src/mol-model/structure/export/categories/misc.ts index 39d3d40f2b1f0202235618e09c81e6634972b8ca..bd4772a45cdb33d7ebc43296dd19b7f69f003967 100644 --- a/src/mol-model/structure/export/categories/misc.ts +++ b/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); + } } \ No newline at end of file diff --git a/src/mol-model/structure/export/categories/utils.ts b/src/mol-model/structure/export/categories/utils.ts index be0276c94ae628f647ececf34c75e5acf2ac505b..d33f72fac0c523a630fa4bda0b9266691ea116c6 100644 --- a/src/mol-model/structure/export/categories/utils.ts +++ b/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); + } + }; } \ No newline at end of file diff --git a/src/mol-model/structure/export/mmcif.ts b/src/mol-model/structure/export/mmcif.ts index 40dd6985cc83b2a7ea4f1d14c7347f93083a917d..5ed7dd4a455898c40aa327adff0270326dda1868 100644 --- a/src/mol-model/structure/export/mmcif.ts +++ b/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