diff --git a/src/mol-model/structure/model/formats/mmcif/bonds/comp.ts b/src/mol-model/structure/model/formats/mmcif/bonds/comp.ts index 4b7491f960e8341b148b5bbd256bc74086c41e31..7aab5ed22b7853ba712ff7d2dbdcfd29f7f5f676 100644 --- a/src/mol-model/structure/model/formats/mmcif/bonds/comp.ts +++ b/src/mol-model/structure/model/formats/mmcif/bonds/comp.ts @@ -47,11 +47,20 @@ export namespace ComponentBond { if (model.sourceData.kind !== 'mmCIF') return false; const { chem_comp_bond } = model.sourceData.data; if (chem_comp_bond._rowCount === 0) return false; + model.customProperties.add(Descriptor); model._staticPropertyData.__ComponentBondData__ = chem_comp_bond; return true; } + export function attachFromExternalData(model: Model, bonds: ComponentBond, force = false) { + if (!force && model.customProperties.has(Descriptor)) return true; + if (model._staticPropertyData.__ComponentBondData__) delete model._staticPropertyData.__ComponentBondData__; + model.customProperties.add(Descriptor); + model._staticPropertyData[PropName] = bonds; + return true; + } + export class ComponentBondImpl implements ComponentBond { entries: Map<string, ComponentBond.Entry> = new Map(); @@ -62,7 +71,7 @@ export namespace ComponentBond { } } - export class Entry implements Entry { + export class Entry { map: Map<string, Map<string, { order: number, flags: number }>> = new Map(); add(a: string, b: string, order: number, flags: number, swap = true) { @@ -85,24 +94,12 @@ export namespace ComponentBond { } } - function getChemCompBond(model: Model) { - return model._staticPropertyData.__ComponentBondData__ as mmCIF_Database['chem_comp_bond']; - } - - export const PropName = '__ComponentBond__'; - export function get(model: Model): ComponentBond | undefined { - if (model._staticPropertyData[PropName]) return model._staticPropertyData[PropName]; - if (!model.customProperties.has(Descriptor)) return void 0; - const chem_comp_bond = getChemCompBond(model); + export function parseChemCompBond(data: mmCIF_Database['chem_comp_bond']): ComponentBond { + const { comp_id, atom_id_1, atom_id_2, value_order, pdbx_aromatic_flag, _rowCount: rowCount } = data; const compBond = new ComponentBondImpl(); - - const { comp_id, atom_id_1, atom_id_2, value_order, pdbx_aromatic_flag, _rowCount: rowCount } = chem_comp_bond; - let entry = compBond.addEntry(comp_id.value(0)!); - for (let i = 0; i < rowCount; i++) { - const id = comp_id.value(i)!; const nameA = atom_id_1.value(i)!; const nameB = atom_id_2.value(i)!; @@ -128,10 +125,26 @@ export namespace ComponentBond { entry.add(nameA, nameB, ord, flags); } - model._staticPropertyData[PropName] = compBond; return compBond; } + function getChemCompBond(model: Model) { + return model._staticPropertyData.__ComponentBondData__ as mmCIF_Database['chem_comp_bond']; + } + + export const PropName = '__ComponentBond__'; + export function get(model: Model): ComponentBond | undefined { + if (model._staticPropertyData[PropName]) return model._staticPropertyData[PropName]; + if (!model.customProperties.has(Descriptor)) return void 0; + + const chem_comp_bond = getChemCompBond(model); + if (!chem_comp_bond) return void 0; + + const chemComp = parseChemCompBond(chem_comp_bond); + model._staticPropertyData[PropName] = chemComp; + return chemComp; + } + function getUniqueResidueNames(s: Structure) { const prop = StructureProperties.residue.label_comp_id; const names = new Set<string>(); diff --git a/src/mol-model/structure/model/properties/custom/collection.ts b/src/mol-model/structure/model/properties/custom/collection.ts index 371889b8f34034d25fbb6d84f0c59921b2c70303..053131e17042c357582fc401bcdca9d6eecf8aa6 100644 --- a/src/mol-model/structure/model/properties/custom/collection.ts +++ b/src/mol-model/structure/model/properties/custom/collection.ts @@ -15,6 +15,8 @@ export class CustomProperties { } add(desc: ModelPropertyDescriptor) { + if (this._set.has(desc)) return; + this._list.push(desc); this._set.add(desc); }