diff --git a/src/mol-model/structure/query/queries/generators.ts b/src/mol-model/structure/query/queries/generators.ts index 34ce3fd620119edf4ce852b80bd19e146f205489..64c4451e125b0bc9372142b76214bd8557f58a6e 100644 --- a/src/mol-model/structure/query/queries/generators.ts +++ b/src/mol-model/structure/query/queries/generators.ts @@ -171,7 +171,7 @@ function atomGroupsGrouped({ entityTest, chainTest, residueTest, atomTest, group function getRingStructure(unit: Unit.Atomic, ring: UnitRing) { const elements = new Int32Array(ring.length) as any as ElementIndex[]; for (let i = 0, _i = ring.length; i < _i; i++) elements[i] = unit.elements[ring[i]]; - return Structure.create([unit.getChild(SortedArray.ofSortedArray(elements))]) + return Structure.create([unit.getChild(SortedArray.ofSortedArray(elements))], '') } export function rings(fingerprints?: ArrayLike<UnitRing.Fingerprint>): StructureQuery { diff --git a/src/mol-model/structure/query/queries/internal.ts b/src/mol-model/structure/query/queries/internal.ts index 8cf1078110a6c3c929f56bada9d17a1e2ea8d8bf..5188c1397c3d1272d06b1e58c3c071501cd67893 100644 --- a/src/mol-model/structure/query/queries/internal.ts +++ b/src/mol-model/structure/query/queries/internal.ts @@ -35,7 +35,7 @@ export function atomicSequence(): StructureQuery { units.push(unit); } - return StructureSelection.Singletons(inputStructure, new Structure(units)); + return StructureSelection.Singletons(inputStructure, new Structure(units, inputStructure.assemblyName)); }; } @@ -54,7 +54,7 @@ export function water(): StructureQuery { if (P.entity.type(l) !== 'water') continue; units.push(unit); } - return StructureSelection.Singletons(inputStructure, new Structure(units)); + return StructureSelection.Singletons(inputStructure, new Structure(units, inputStructure.assemblyName)); }; } @@ -84,7 +84,7 @@ export function atomicHet(): StructureQuery { units.push(unit); } - return StructureSelection.Singletons(inputStructure, new Structure(units)); + return StructureSelection.Singletons(inputStructure, new Structure(units, inputStructure.assemblyName)); }; } @@ -97,6 +97,6 @@ export function spheres(): StructureQuery { if (unit.kind !== Unit.Kind.Spheres) continue; units.push(unit); } - return StructureSelection.Singletons(inputStructure, new Structure(units)); + return StructureSelection.Singletons(inputStructure, new Structure(units, inputStructure.assemblyName)); }; } diff --git a/src/mol-model/structure/query/selection.ts b/src/mol-model/structure/query/selection.ts index b257170712dc78158da19a0787c0f4718a8a615f..69aba9fa26d271667a1f485b2e3d547e67d43ae1 100644 --- a/src/mol-model/structure/query/selection.ts +++ b/src/mol-model/structure/query/selection.ts @@ -109,7 +109,7 @@ namespace StructureSelection { const { elements } = unit; for (let i = 0, _i = elements.length; i < _i; i++) { // TODO: optimize this somehow??? - const s = Structure.create([unit.getChild(SortedArray.ofSingleton(elements[i]))]); + const s = Structure.create([unit.getChild(SortedArray.ofSingleton(elements[i]))], sel.structure.assemblyName); fn(s, idx++); } } diff --git a/src/mol-model/structure/query/utils/structure-set.ts b/src/mol-model/structure/query/utils/structure-set.ts index 85867419505a8e3494e2f7a9e70838f140c0a00c..46a5c0f43aeb2dfa57e30d6b35e240e34e83528b 100644 --- a/src/mol-model/structure/query/utils/structure-set.ts +++ b/src/mol-model/structure/query/utils/structure-set.ts @@ -80,7 +80,7 @@ export function structureIntersect(sA: Structure, sB: Structure): Structure { } } - return Structure.create(units); + return Structure.create(units, sA.assemblyName === sB.assemblyName ? sA.assemblyName : ''); } export function structureSubtract(a: Structure, b: Structure): Structure { @@ -100,5 +100,5 @@ export function structureSubtract(a: Structure, b: Structure): Structure { } } - return Structure.create(units); + return Structure.create(units, a.assemblyName === b.assemblyName ? a.assemblyName : ''); } \ No newline at end of file diff --git a/src/mol-model/structure/structure/structure.ts b/src/mol-model/structure/structure/structure.ts index cab555fd9d249bf85d853329843356c6c3658d3b..a61046ff27bd68452ccdf371f599046897d73b6a 100644 --- a/src/mol-model/structure/structure/structure.ts +++ b/src/mol-model/structure/structure/structure.ts @@ -2,6 +2,7 @@ * Copyright (c) 2017-2018 mol* contributors, licensed under MIT, See LICENSE file for more info. * * @author David Sehnal <david.sehnal@gmail.com> + * @author Alexander Rose <alexander.rose@weirdbyte.de> */ import { IntMap, SortedArray, Iterator, Segmentation } from 'mol-data/int' @@ -48,7 +49,8 @@ class Structure { transformHash: number, elementCount: number, polymerResidueCount: number, - } = { hashCode: -1, transformHash: -1, elementCount: 0, polymerResidueCount: 0 }; + assemblyName: string + } = { hashCode: -1, transformHash: -1, elementCount: 0, polymerResidueCount: 0, assemblyName: '' }; subsetBuilder(isSorted: boolean) { return new StructureSubsetBuilder(this, isSorted); @@ -64,6 +66,11 @@ class Structure { return this._props.polymerResidueCount; } + /** Name of the assembly given by `_pdbx_struct_assembly.id` when applicable */ + get assemblyName() { + return this._props.assemblyName; + } + /** Coarse structure, defined as Containing less than twice as many elements as polymer residues */ get isCoarse() { const ec = this.elementCount @@ -169,7 +176,7 @@ class Structure { return SortedArray.has(this.unitMap.get(e.unit.id).elements, e.element); } - constructor(units: ArrayLike<Unit>) { + constructor(units: ArrayLike<Unit>, assemblyName: string) { const map = IntMap.Mutable<Unit>(); let elementCount = 0; let polymerResidueCount = 0; @@ -188,6 +195,7 @@ class Structure { this.units = units as ReadonlyArray<Unit>; this._props.elementCount = elementCount; this._props.polymerResidueCount = polymerResidueCount; + this._props.assemblyName = assemblyName } } @@ -278,7 +286,7 @@ function getUniqueAtomicResidueIndices(structure: Structure): ReadonlyMap<UUID, } namespace Structure { - export const Empty = new Structure([]); + export const Empty = new Structure([], ''); /** Represents a single structure */ export interface Loci { @@ -297,7 +305,7 @@ namespace Structure { return a.structure === b.structure } - export function create(units: ReadonlyArray<Unit>): Structure { return new Structure(units); } + export function create(units: ReadonlyArray<Unit>, assemblyName: string): Structure { return new Structure(units, assemblyName); } /** * Construct a Structure from a model. @@ -338,7 +346,7 @@ namespace Structure { } } - return builder.getStructure(); + return builder.getStructure('deposited'); } function isWaterChain(model: Model, chainIndex: ChainIndex, indices: SortedArray) { @@ -380,7 +388,7 @@ namespace Structure { units.push(u.applyOperator(u.id, op)); } - return new Structure(units); + return new Structure(units, s.assemblyName); } export class StructureBuilder { @@ -399,8 +407,8 @@ namespace Structure { return newUnit; } - getStructure(): Structure { - return create(this.units); + getStructure(assemblyName: string): Structure { + return create(this.units, assemblyName); } get isEmpty() { diff --git a/src/mol-model/structure/structure/symmetry.ts b/src/mol-model/structure/structure/symmetry.ts index 5af14696a9e1b5017299ace7cbe5643956a2bc1f..2acbf7d87ff2c96e0fa81f5c466d885e4ce1d050 100644 --- a/src/mol-model/structure/structure/symmetry.ts +++ b/src/mol-model/structure/structure/symmetry.ts @@ -42,7 +42,7 @@ namespace StructureSymmetry { } } - return assembler.getStructure(); + return assembler.getStructure(asmName); }); } @@ -118,7 +118,7 @@ function assembleOperators(structure: Structure, operators: ReadonlyArray<Symmet assembler.addWithOperator(unit, oper); } } - return assembler.getStructure(); + return assembler.getStructure(structure.assemblyName); } async function _buildNCS(ctx: RuntimeContext, structure: Structure) { @@ -173,7 +173,7 @@ async function findMatesRadius(ctx: RuntimeContext, structure: Structure, radius } - return assembler.getStructure(); + return assembler.getStructure(structure.assemblyName); } export default StructureSymmetry; \ No newline at end of file diff --git a/src/mol-model/structure/structure/util/subset-builder.ts b/src/mol-model/structure/structure/util/subset-builder.ts index 77c228902fc14c27a75e070df1868498ca68057a..608bae0de74bdb702773f6b24f77d516ecdfe5f1 100644 --- a/src/mol-model/structure/structure/util/subset-builder.ts +++ b/src/mol-model/structure/structure/util/subset-builder.ts @@ -90,7 +90,7 @@ export class StructureSubsetBuilder { newUnits[newUnits.length] = child; } - return Structure.create(newUnits); + return Structure.create(newUnits, this.parent.assemblyName); } getStructure() { diff --git a/src/mol-model/structure/structure/util/unique-subset-builder.ts b/src/mol-model/structure/structure/util/unique-subset-builder.ts index bc18e6519217570f2bb6e6b8097e5baa3e2d6f96..f19ecace755931cd759e6c12e62a992a872fa59b 100644 --- a/src/mol-model/structure/structure/util/unique-subset-builder.ts +++ b/src/mol-model/structure/structure/util/unique-subset-builder.ts @@ -85,7 +85,7 @@ export class StructureUniqueSubsetBuilder { newUnits[newUnits.length] = child; } - return Structure.create(newUnits); + return Structure.create(newUnits, this.parent.assemblyName); } get isEmpty() {