diff --git a/src/mol-model/structure/structure/element.ts b/src/mol-model/structure/structure/element.ts index a4995dc94a0d60e831e7d830d7c8387f057be642..d1e7d090a5c5c67933bb2117aa94d6a60405c217 100644 --- a/src/mol-model/structure/structure/element.ts +++ b/src/mol-model/structure/structure/element.ts @@ -114,15 +114,8 @@ namespace StructureElement { } export function entityIndex(l: StructureElement) { - switch (l.unit.kind) { - case Unit.Kind.Atomic: - return l.unit.model.atomicHierarchy.index.getEntityFromChain(l.unit.chainIndex[l.element]) - case Unit.Kind.Spheres: - return l.unit.model.coarseHierarchy.spheres.entityKey[l.element] - case Unit.Kind.Gaussians: - return l.unit.model.coarseHierarchy.gaussians.entityKey[l.element] + return StructureProperties.entity.key(l) } - } export namespace Loci { export function size(loci: Loci) { diff --git a/src/mol-model/structure/structure/properties.ts b/src/mol-model/structure/structure/properties.ts index 5c6a70a0d22a6e395eb26ed31c53c639cd9c77b6..2f6f437adad97d4bafaf1c4aab97fa5bff7505d6 100644 --- a/src/mol-model/structure/structure/properties.ts +++ b/src/mol-model/structure/structure/properties.ts @@ -8,10 +8,12 @@ import StructureElement from './element' import Unit from './unit' import { VdwRadius } from '../model/properties/atomic'; +function p<T>(p: StructureElement.Property<T>) { return p; } + const constant = { - true: StructureElement.property(l => true), - false: StructureElement.property(l => false), - zero: StructureElement.property(l => 0) + true: p(l => true), + false: p(l => false), + zero: p(l => 0) } function notAtomic(): never { @@ -26,102 +28,111 @@ function notCoarse(kind?: string): never { // TODO: remove the type checks? const atom = { - key: StructureElement.property(l => l.element), + key: p(l => l.element), // Conformation - x: StructureElement.property(l => l.unit.conformation.x(l.element)), - y: StructureElement.property(l => l.unit.conformation.y(l.element)), - z: StructureElement.property(l => l.unit.conformation.z(l.element)), - id: StructureElement.property(l => !Unit.isAtomic(l.unit) ? notAtomic() : l.unit.model.atomicConformation.atomId.value(l.element)), - occupancy: StructureElement.property(l => !Unit.isAtomic(l.unit) ? notAtomic() : l.unit.model.atomicConformation.occupancy.value(l.element)), - B_iso_or_equiv: StructureElement.property(l => !Unit.isAtomic(l.unit) ? notAtomic() : l.unit.model.atomicConformation.B_iso_or_equiv.value(l.element)), - sourceIndex: StructureElement.property(l => Unit.isAtomic(l.unit) + x: p(l => l.unit.conformation.x(l.element)), + y: p(l => l.unit.conformation.y(l.element)), + z: p(l => l.unit.conformation.z(l.element)), + id: p(l => !Unit.isAtomic(l.unit) ? notAtomic() : l.unit.model.atomicConformation.atomId.value(l.element)), + occupancy: p(l => !Unit.isAtomic(l.unit) ? notAtomic() : l.unit.model.atomicConformation.occupancy.value(l.element)), + B_iso_or_equiv: p(l => !Unit.isAtomic(l.unit) ? notAtomic() : l.unit.model.atomicConformation.B_iso_or_equiv.value(l.element)), + sourceIndex: p(l => Unit.isAtomic(l.unit) ? l.unit.model.atomicHierarchy.atoms.sourceIndex.value(l.element) // TODO: when implemented, this should map to the source index. : l.element), // Hierarchy - type_symbol: StructureElement.property(l => !Unit.isAtomic(l.unit) ? notAtomic() : l.unit.model.atomicHierarchy.atoms.type_symbol.value(l.element)), - label_atom_id: StructureElement.property(l => !Unit.isAtomic(l.unit) ? notAtomic() : l.unit.model.atomicHierarchy.atoms.label_atom_id.value(l.element)), - auth_atom_id: StructureElement.property(l => !Unit.isAtomic(l.unit) ? notAtomic() : l.unit.model.atomicHierarchy.atoms.auth_atom_id.value(l.element)), - label_alt_id: StructureElement.property(l => !Unit.isAtomic(l.unit) ? notAtomic() : l.unit.model.atomicHierarchy.atoms.label_alt_id.value(l.element)), - pdbx_formal_charge: StructureElement.property(l => !Unit.isAtomic(l.unit) ? notAtomic() : l.unit.model.atomicHierarchy.atoms.pdbx_formal_charge.value(l.element)), + type_symbol: p(l => !Unit.isAtomic(l.unit) ? notAtomic() : l.unit.model.atomicHierarchy.atoms.type_symbol.value(l.element)), + label_atom_id: p(l => !Unit.isAtomic(l.unit) ? notAtomic() : l.unit.model.atomicHierarchy.atoms.label_atom_id.value(l.element)), + auth_atom_id: p(l => !Unit.isAtomic(l.unit) ? notAtomic() : l.unit.model.atomicHierarchy.atoms.auth_atom_id.value(l.element)), + label_alt_id: p(l => !Unit.isAtomic(l.unit) ? notAtomic() : l.unit.model.atomicHierarchy.atoms.label_alt_id.value(l.element)), + pdbx_formal_charge: p(l => !Unit.isAtomic(l.unit) ? notAtomic() : l.unit.model.atomicHierarchy.atoms.pdbx_formal_charge.value(l.element)), // Derived - vdw_radius: StructureElement.property(l => !Unit.isAtomic(l.unit) ? notAtomic() : VdwRadius(l.unit.model.atomicHierarchy.atoms.type_symbol.value(l.element))), + vdw_radius: p(l => !Unit.isAtomic(l.unit) ? notAtomic() : VdwRadius(l.unit.model.atomicHierarchy.atoms.type_symbol.value(l.element))), } const residue = { - key: StructureElement.property(l => !Unit.isAtomic(l.unit) ? notAtomic() : l.unit.residueIndex[l.element]), + key: p(l => !Unit.isAtomic(l.unit) ? notAtomic() : l.unit.residueIndex[l.element]), - group_PDB: StructureElement.property(l => !Unit.isAtomic(l.unit) ? notAtomic() : l.unit.model.atomicHierarchy.residues.group_PDB.value(l.unit.residueIndex[l.element])), - label_comp_id: StructureElement.property(l => !Unit.isAtomic(l.unit) ? notAtomic() : l.unit.model.atomicHierarchy.residues.label_comp_id.value(l.unit.residueIndex[l.element])), - auth_comp_id: StructureElement.property(l => !Unit.isAtomic(l.unit) ? notAtomic() : l.unit.model.atomicHierarchy.residues.auth_comp_id.value(l.unit.residueIndex[l.element])), - label_seq_id: StructureElement.property(l => !Unit.isAtomic(l.unit) ? notAtomic() : l.unit.model.atomicHierarchy.residues.label_seq_id.value(l.unit.residueIndex[l.element])), - auth_seq_id: StructureElement.property(l => !Unit.isAtomic(l.unit) ? notAtomic() : l.unit.model.atomicHierarchy.residues.auth_seq_id.value(l.unit.residueIndex[l.element])), - pdbx_PDB_ins_code: StructureElement.property(l => !Unit.isAtomic(l.unit) ? notAtomic() : l.unit.model.atomicHierarchy.residues.pdbx_PDB_ins_code.value(l.unit.residueIndex[l.element])), + group_PDB: p(l => !Unit.isAtomic(l.unit) ? notAtomic() : l.unit.model.atomicHierarchy.residues.group_PDB.value(l.unit.residueIndex[l.element])), + label_comp_id: p(l => !Unit.isAtomic(l.unit) ? notAtomic() : l.unit.model.atomicHierarchy.residues.label_comp_id.value(l.unit.residueIndex[l.element])), + auth_comp_id: p(l => !Unit.isAtomic(l.unit) ? notAtomic() : l.unit.model.atomicHierarchy.residues.auth_comp_id.value(l.unit.residueIndex[l.element])), + label_seq_id: p(l => !Unit.isAtomic(l.unit) ? notAtomic() : l.unit.model.atomicHierarchy.residues.label_seq_id.value(l.unit.residueIndex[l.element])), + auth_seq_id: p(l => !Unit.isAtomic(l.unit) ? notAtomic() : l.unit.model.atomicHierarchy.residues.auth_seq_id.value(l.unit.residueIndex[l.element])), + pdbx_PDB_ins_code: p(l => !Unit.isAtomic(l.unit) ? notAtomic() : l.unit.model.atomicHierarchy.residues.pdbx_PDB_ins_code.value(l.unit.residueIndex[l.element])), // Properties - secondary_structure_type: StructureElement.property(l => !Unit.isAtomic(l.unit) ? notAtomic() : l.unit.model.properties.secondaryStructure.type[l.unit.residueIndex[l.element]]), - secondary_structure_key: StructureElement.property(l => !Unit.isAtomic(l.unit) ? notAtomic() : l.unit.model.properties.secondaryStructure.key[l.unit.residueIndex[l.element]]), + secondary_structure_type: p(l => !Unit.isAtomic(l.unit) ? notAtomic() : l.unit.model.properties.secondaryStructure.type[l.unit.residueIndex[l.element]]), + secondary_structure_key: p(l => !Unit.isAtomic(l.unit) ? notAtomic() : l.unit.model.properties.secondaryStructure.key[l.unit.residueIndex[l.element]]), } const chain = { - key: StructureElement.property(l => !Unit.isAtomic(l.unit) ? notAtomic() : l.unit.chainIndex[l.element]), + key: p(l => !Unit.isAtomic(l.unit) ? notAtomic() : l.unit.chainIndex[l.element]), - label_asym_id: StructureElement.property(l => !Unit.isAtomic(l.unit) ? notAtomic() : l.unit.model.atomicHierarchy.chains.label_asym_id.value(l.unit.chainIndex[l.element])), - auth_asym_id: StructureElement.property(l => !Unit.isAtomic(l.unit) ? notAtomic() : l.unit.model.atomicHierarchy.chains.auth_asym_id.value(l.unit.chainIndex[l.element])), - label_entity_id: StructureElement.property(l => !Unit.isAtomic(l.unit) ? notAtomic() : l.unit.model.atomicHierarchy.chains.label_entity_id.value(l.unit.chainIndex[l.element])) + label_asym_id: p(l => !Unit.isAtomic(l.unit) ? notAtomic() : l.unit.model.atomicHierarchy.chains.label_asym_id.value(l.unit.chainIndex[l.element])), + auth_asym_id: p(l => !Unit.isAtomic(l.unit) ? notAtomic() : l.unit.model.atomicHierarchy.chains.auth_asym_id.value(l.unit.chainIndex[l.element])), + label_entity_id: p(l => !Unit.isAtomic(l.unit) ? notAtomic() : l.unit.model.atomicHierarchy.chains.label_entity_id.value(l.unit.chainIndex[l.element])) } const coarse = { key: atom.key, - entityKey: StructureElement.property(l => !Unit.isCoarse(l.unit) ? notCoarse() : l.unit.coarseElements.entityKey[l.element]), + entityKey: p(l => !Unit.isCoarse(l.unit) ? notCoarse() : l.unit.coarseElements.entityKey[l.element]), x: atom.x, y: atom.y, z: atom.z, - asym_id: StructureElement.property(l => !Unit.isCoarse(l.unit) ? notCoarse() : l.unit.coarseElements.asym_id.value(l.element)), - seq_id_begin: StructureElement.property(l => !Unit.isCoarse(l.unit) ? notCoarse() : l.unit.coarseElements.seq_id_begin.value(l.element)), - seq_id_end: StructureElement.property(l => !Unit.isCoarse(l.unit) ? notCoarse() : l.unit.coarseElements.seq_id_end.value(l.element)), + asym_id: p(l => !Unit.isCoarse(l.unit) ? notCoarse() : l.unit.coarseElements.asym_id.value(l.element)), + seq_id_begin: p(l => !Unit.isCoarse(l.unit) ? notCoarse() : l.unit.coarseElements.seq_id_begin.value(l.element)), + seq_id_end: p(l => !Unit.isCoarse(l.unit) ? notCoarse() : l.unit.coarseElements.seq_id_end.value(l.element)), - sphere_radius: StructureElement.property(l => !Unit.isSpheres(l.unit) ? notCoarse('spheres') : l.unit.coarseConformation.radius[l.element]), - sphere_rmsf: StructureElement.property(l => !Unit.isSpheres(l.unit) ? notCoarse('spheres') : l.unit.coarseConformation.rmsf[l.element]), + sphere_radius: p(l => !Unit.isSpheres(l.unit) ? notCoarse('spheres') : l.unit.coarseConformation.radius[l.element]), + sphere_rmsf: p(l => !Unit.isSpheres(l.unit) ? notCoarse('spheres') : l.unit.coarseConformation.rmsf[l.element]), - gaussian_weight: StructureElement.property(l => !Unit.isGaussians(l.unit) ? notCoarse('gaussians') : l.unit.coarseConformation.weight[l.element]), - gaussian_covariance_matrix: StructureElement.property(l => !Unit.isGaussians(l.unit) ? notCoarse('gaussians') : l.unit.coarseConformation.covariance_matrix[l.element]) + gaussian_weight: p(l => !Unit.isGaussians(l.unit) ? notCoarse('gaussians') : l.unit.coarseConformation.weight[l.element]), + gaussian_covariance_matrix: p(l => !Unit.isGaussians(l.unit) ? notCoarse('gaussians') : l.unit.coarseConformation.covariance_matrix[l.element]) } -const eK = StructureElement.entityIndex +function eK(l: StructureElement) { + switch (l.unit.kind) { + case Unit.Kind.Atomic: + return l.unit.model.atomicHierarchy.index.getEntityFromChain(l.unit.chainIndex[l.element]) + case Unit.Kind.Spheres: + return l.unit.model.coarseHierarchy.spheres.entityKey[l.element] + case Unit.Kind.Gaussians: + return l.unit.model.coarseHierarchy.gaussians.entityKey[l.element] + } +} const entity = { key: eK, - id: StructureElement.property(l => l.unit.model.entities.data.id.value(eK(l))), - type: StructureElement.property(l => l.unit.model.entities.data.type.value(eK(l))), - src_method: StructureElement.property(l => l.unit.model.entities.data.src_method.value(eK(l))), - pdbx_description: StructureElement.property(l => l.unit.model.entities.data.pdbx_description.value(eK(l))), - formula_weight: StructureElement.property(l => l.unit.model.entities.data.formula_weight.value(eK(l))), - pdbx_number_of_molecules: StructureElement.property(l => l.unit.model.entities.data.pdbx_number_of_molecules.value(eK(l))), - details: StructureElement.property(l => l.unit.model.entities.data.details.value(eK(l))), - pdbx_mutation: StructureElement.property(l => l.unit.model.entities.data.pdbx_mutation.value(eK(l))), - pdbx_fragment: StructureElement.property(l => l.unit.model.entities.data.pdbx_fragment.value(eK(l))), - pdbx_ec: StructureElement.property(l => l.unit.model.entities.data.pdbx_ec.value(eK(l))) + id: p(l => l.unit.model.entities.data.id.value(eK(l))), + type: p(l => l.unit.model.entities.data.type.value(eK(l))), + src_method: p(l => l.unit.model.entities.data.src_method.value(eK(l))), + pdbx_description: p(l => l.unit.model.entities.data.pdbx_description.value(eK(l))), + formula_weight: p(l => l.unit.model.entities.data.formula_weight.value(eK(l))), + pdbx_number_of_molecules: p(l => l.unit.model.entities.data.pdbx_number_of_molecules.value(eK(l))), + details: p(l => l.unit.model.entities.data.details.value(eK(l))), + pdbx_mutation: p(l => l.unit.model.entities.data.pdbx_mutation.value(eK(l))), + pdbx_fragment: p(l => l.unit.model.entities.data.pdbx_fragment.value(eK(l))), + pdbx_ec: p(l => l.unit.model.entities.data.pdbx_ec.value(eK(l))) } const unit = { - id: StructureElement.property(l => l.unit.id), - operator_name: StructureElement.property(l => l.unit.conformation.operator.name), - model_index: StructureElement.property(l => l.unit.model.modelNum), - model_label: StructureElement.property(l => l.unit.model.label), - hkl: StructureElement.property(l => l.unit.conformation.operator.hkl), - spgrOp: StructureElement.property(l => l.unit.conformation.operator.spgrOp), - - model_num: StructureElement.property(l => l.unit.model.modelNum), - pdbx_struct_assembly_id: StructureElement.property(l => l.unit.conformation.operator.assembly.id), - pdbx_struct_oper_list_ids: StructureElement.property(l => l.unit.conformation.operator.assembly.operList), - struct_ncs_oper_id: StructureElement.property(l => l.unit.conformation.operator.ncsId), + id: p(l => l.unit.id), + operator_name: p(l => l.unit.conformation.operator.name), + model_index: p(l => l.unit.model.modelNum), + model_label: p(l => l.unit.model.label), + hkl: p(l => l.unit.conformation.operator.hkl), + spgrOp: p(l => l.unit.conformation.operator.spgrOp), + + model_num: p(l => l.unit.model.modelNum), + pdbx_struct_assembly_id: p(l => l.unit.conformation.operator.assembly.id), + pdbx_struct_oper_list_ids: p(l => l.unit.conformation.operator.assembly.operList), + struct_ncs_oper_id: p(l => l.unit.conformation.operator.ncsId), } const StructureProperties = {