diff --git a/src/mol-model/structure/structure/structure.ts b/src/mol-model/structure/structure/structure.ts index 4a13c21689d1db9ba2a73b39b6f1f01ef762d426..0bac89820c5cb757e9ba31cc21e26894220ecd73 100644 --- a/src/mol-model/structure/structure/structure.ts +++ b/src/mol-model/structure/structure/structure.ts @@ -56,7 +56,9 @@ class Structure { /** Hash based on all unit.id values in the structure, reflecting the units transformation */ transformHash: number, elementCount: number, + uniqueElementCount: number, polymerResidueCount: number, + polymerUnitCount: number, coordinateSystem: SymmetryOperator, label: string, propertyData?: any, @@ -65,7 +67,9 @@ class Structure { hashCode: -1, transformHash: -1, elementCount: -1, + uniqueElementCount: -1, polymerResidueCount: -1, + polymerUnitCount: -1, coordinateSystem: SymmetryOperator.Default, label: '' }; @@ -106,15 +110,25 @@ class Structure { /** Count of all polymer residues in the structure */ get polymerResidueCount() { if (this._props.polymerResidueCount === -1) { - let polymerResidueCount = 0 - for (let i = 0, _i = this.units.length; i < _i; i++) { - polymerResidueCount += this.units[i].polymerElements.length; - } - this._props.polymerResidueCount = polymerResidueCount + this._props.polymerResidueCount = getPolymerResidueCount(this) } return this._props.polymerResidueCount; } + get polymerUnitCount() { + if (this._props.polymerUnitCount === -1) { + this._props.polymerUnitCount = getPolymerUnitCount(this) + } + return this._props.polymerUnitCount; + } + + get uniqueElementCount() { + if (this._props.uniqueElementCount === -1) { + this._props.uniqueElementCount = getUniqueElementCount(this) + } + return this._props.uniqueElementCount; + } + /** Coarse structure, defined as Containing less than twice as many elements as polymer residues */ get isCoarse() { const ec = this.elementCount @@ -131,6 +145,7 @@ class Structure { return this.computeHash(); } + /** Hash based on all unit.id values in the structure, reflecting the units transformation */ get transformHash() { if (this._props.transformHash !== -1) return this._props.transformHash; this._props.transformHash = hashFnv32a(this.units.map(u => u.id)) @@ -408,6 +423,33 @@ function getUniqueAtomicResidueIndices(structure: Structure): ReadonlyMap<UUID, return ret; } +function getUniqueElementCount(structure: Structure): number { + const { unitSymmetryGroups } = structure + let uniqueElementCount = 0 + for (let i = 0, _i = unitSymmetryGroups.length; i < _i; i++) { + uniqueElementCount += unitSymmetryGroups[i].elements.length + } + return uniqueElementCount +} + +function getPolymerResidueCount(structure: Structure): number { + const { units } = structure + let polymerResidueCount = 0 + for (let i = 0, _i = units.length; i < _i; i++) { + polymerResidueCount += units[i].polymerElements.length; + } + return polymerResidueCount +} + +function getPolymerUnitCount(structure: Structure): number { + const { units } = structure + let polymerUnitCount = 0 + for (let i = 0, _i = units.length; i < _i; i++) { + if (units[i].polymerElements.length > 0) polymerUnitCount += 1 + } + return polymerUnitCount +} + interface SerialMapping { /** Cummulative count of elements for each unit */ unitElementCount: ArrayLike<number>