diff --git a/src/mol-model/structure/structure/symmetry.ts b/src/mol-model/structure/structure/symmetry.ts index 5af14696a9e1b5017299ace7cbe5643956a2bc1f..e5ba4aed66c04231e5f7739558982fd7ad294121 100644 --- a/src/mol-model/structure/structure/symmetry.ts +++ b/src/mol-model/structure/structure/symmetry.ts @@ -90,9 +90,28 @@ namespace StructureSymmetry { } function getOperators(symmetry: ModelSymmetry, ijkMin: Vec3, ijkMax: Vec3) { + const operators: SymmetryOperator[] = []; + const { spacegroup } = symmetry; + if (operators.length === 0) { + for (let op = 0; op < spacegroup.operators.length; op++) { + for (let i = ijkMin[0]; i < ijkMax[0]; i++) { + for (let j = ijkMin[1]; j < ijkMax[1]; j++) { + for (let k = ijkMin[2]; k < ijkMax[2]; k++) { + operators[operators.length] = Spacegroup.getSymmetryOperator(spacegroup, op, i, j, k); + } + } + } + } + } + return operators; +} + +function getOperatorsCached333(symmetry: ModelSymmetry) { const operators: SymmetryOperator[] = symmetry._operators_333 || []; const { spacegroup } = symmetry; if (operators.length === 0) { + const ijkMin = Vec3.create(-3, -3, -3) + const ijkMax = Vec3.create(3, 3, 3) operators[0] = Spacegroup.getSymmetryOperator(spacegroup, 0, 0, 0, 0) for (let op = 0; op < spacegroup.operators.length; op++) { for (let i = ijkMin[0]; i < ijkMax[0]; i++) { @@ -150,7 +169,7 @@ async function findMatesRadius(ctx: RuntimeContext, structure: Structure, radius if (SpacegroupCell.isZero(spacegroup.cell)) return structure; if (ctx.shouldUpdate) await ctx.update('Initialing...'); - const operators = getOperators(symmetry, Vec3.create(-3, -3, -3), Vec3.create(3, 3, 3)); + const operators = getOperatorsCached333(symmetry); const lookup = structure.lookup3d; const assembler = Structure.Builder();