From eea1137abce095994a716be53fd8a16edbb85736 Mon Sep 17 00:00:00 2001
From: Alexander Rose <alex.rose@rcsb.org>
Date: Tue, 12 Nov 2019 11:44:46 -0800
Subject: [PATCH] prefer EMDB map for 'ELECTRON CRYSTALLOGRAPHY' entries

---
 .../behavior/dynamic/volume-streaming/util.ts | 22 +++++++++++++++----
 1 file changed, 18 insertions(+), 4 deletions(-)

diff --git a/src/mol-plugin/behavior/dynamic/volume-streaming/util.ts b/src/mol-plugin/behavior/dynamic/volume-streaming/util.ts
index 9ad445c75..21e21f8f1 100644
--- a/src/mol-plugin/behavior/dynamic/volume-streaming/util.ts
+++ b/src/mol-plugin/behavior/dynamic/volume-streaming/util.ts
@@ -17,12 +17,26 @@ export function getStreamingMethod(s?: Structure, defaultKind: VolumeServerInfo.
     const model = s.models[0];
     if (model.sourceData.kind !== 'mmCIF') return defaultKind;
 
-    const data = model.sourceData.data.exptl.method;
-    for (let i = 0; i < data.rowCount; i++) {
-        const v = data.value(i).toUpperCase();
+    const { data } = model.sourceData;
+
+    // prefer EMDB entries over structure-factors (SF) e.g. for 'ELECTRON CRYSTALLOGRAPHY' entries
+    // like 6axz or 6kj3 for which EMDB entries are available but map calculation from SF is hard
+    for (let i = 0, il = data.pdbx_database_related._rowCount; i < il; ++i) {
+        if (data.pdbx_database_related.db_name.value(i).toUpperCase() === 'EMDB') {
+            return 'em'
+        }
+    }
+
+    if (data.pdbx_database_status.status_code_sf.isDefined && data.pdbx_database_status.status_code_sf.value(0) === 'REL') {
+        return 'x-ray'
+    }
+
+    // fallbacks
+    for (let i = 0; i < data.exptl.method.rowCount; i++) {
+        const v = data.exptl.method.value(i).toUpperCase();
         if (v.indexOf('MICROSCOPY') >= 0) return 'em';
     }
-    return 'x-ray';
+    return defaultKind;
 }
 
 /** Returns EMD ID when available, otherwise falls back to PDB ID */
-- 
GitLab