Parcourir la source

added AtomSiteAnisotrop support for cifCore

Alexander Rose il y a 5 ans
Parent
commit
4221067f8f

+ 17 - 0
src/mol-model-formats/structure/cif-core.ts

@@ -19,6 +19,7 @@ import { Spacegroup, SpacegroupCell } from '../../mol-math/geometry';
 import { Vec3 } from '../../mol-math/linear-algebra';
 import { ModelSymmetry } from './property/symmetry';
 import { IndexPairBonds } from './property/bonds/index-pair';
+import { AtomSiteAnisotrop } from './property/anisotropic';
 
 function getSpacegroupNameOrNumber(space_group: CifCore_Database['space_group']) {
     const groupNumber = space_group.IT_number.value(0)
@@ -144,6 +145,22 @@ async function getModels(db: CifCore_Database, format: CifCoreFormat, ctx: Runti
     return models;
 }
 
+function atomSiteAnisotropFromCifCore(model: Model) {
+    if (!CifCoreFormat.is(model.sourceData)) return;
+    const { atom_site, atom_site_aniso } = model.sourceData.data.db
+    const data = Table.ofPartialColumns(AtomSiteAnisotrop.Schema, {
+        U: atom_site_aniso.U,
+        U_esd: atom_site_aniso.U_su
+    }, atom_site_aniso._rowCount);
+    const elementToAnsiotrop = AtomSiteAnisotrop.getElementToAnsiotropFromLabel(atom_site.label, atom_site_aniso.label)
+    return { data, elementToAnsiotrop }
+}
+function atomSiteAnisotropApplicableCifCore(model: Model) {
+    if (!CifCoreFormat.is(model.sourceData)) return false;
+    return model.sourceData.data.db.atom_site_aniso.U.isDefined
+}
+AtomSiteAnisotrop.Provider.formatRegistry.add('cifCore', atomSiteAnisotropFromCifCore, atomSiteAnisotropApplicableCifCore)
+
 //
 
 export { CifCoreFormat };

+ 16 - 0
src/mol-model-formats/structure/property/anisotropic.ts

@@ -63,4 +63,20 @@ namespace AtomSiteAnisotrop {
 
         return elementToAnsiotrop
     }
+
+    export function getElementToAnsiotropFromLabel(atomLabel: Column<string>, ansioLabel: Column<string>) {
+        const atomLabelToElement: { [k: string]: number | undefined } = {}
+        for (let i = 0, il = atomLabel.rowCount; i < il; i++) {
+            atomLabelToElement[atomLabel.value(i)] = i
+        }
+
+        const elementToAnsiotrop = new Int32Array(atomLabel.rowCount)
+        elementToAnsiotrop.fill(-1)
+        for (let i = 0, il = ansioLabel.rowCount; i < il; ++i) {
+            const ei = atomLabelToElement[ansioLabel.value(i)]
+            if (ei !== undefined) elementToAnsiotrop[ei] = i
+        }
+
+        return elementToAnsiotrop
+    }
 }