diff --git a/src/mol-plugin/behavior/dynamic/volume-streaming/util.ts b/src/mol-plugin/behavior/dynamic/volume-streaming/util.ts index 9ad445c750b1b194f9acfba30b70a3627f587d5a..21e21f8f1ec890f2f737937ad802e7aa379d9d37 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 */