Browse Source

occupancy handling improvements

- add occ of 1 to cif-core if not defined
- check if occ is defined before disallowing bonds
Alexander Rose 5 years ago
parent
commit
67a26e93e4

+ 3 - 1
src/mol-model-formats/structure/cif-core.ts

@@ -119,7 +119,9 @@ async function getModels(db: CifCore_Database, format: CifCoreFormat, ctx: Runti
         label_seq_id: seq_id,
         label_entity_id: Column.ofConst('1', atomCount, Column.Schema.str),
 
-        occupancy: db.atom_site.occupancy,
+        occupancy: db.atom_site.occupancy.isDefined
+            ? db.atom_site.occupancy
+            : Column.ofConst(1, atomCount, Column.Schema.float),
         type_symbol: typeSymbol,
         pdbx_formal_charge: formalCharge,
 

+ 2 - 1
src/mol-model/structure/structure/unit/bonds/inter-compute.ts

@@ -44,6 +44,7 @@ function findPairBonds(unitA: Unit.Atomic, unitB: Unit.Atomic, props: BondComput
     const { label_comp_id: label_comp_idB, auth_seq_id: auth_seq_idB } = unitB.model.atomicHierarchy.residues;
     const { occupancy: occupancyA } = unitA.model.atomicConformation;
     const { occupancy: occupancyB } = unitB.model.atomicConformation;
+    const hasOccupancy = occupancyA.isDefined && occupancyB.isDefined;
 
     const { lookup3d } = unitB;
     const structConn = unitA.model === unitB.model && StructConn.Provider.get(unitA.model);
@@ -124,7 +125,7 @@ function findPairBonds(unitA: Unit.Atomic, unitB: Unit.Atomic, props: BondComput
             // TODO: is this condition good enough?
             // - It works for cases like 3WQJ (label_asym_id: I) which have partial occupancy.
             // - Does NOT work for cases like 1RB8 (DC 7) with full occupancy.
-            if (occupancyB.value(bI) < 1 && occA < 1)  {
+            if (hasOccupancy && occupancyB.value(bI) < 1 && occA < 1)  {
                 if (auth_seq_idA.value(aI) === auth_seq_idB.value(bI)) {
                     continue;
                 }