diff --git a/CHANGELOG.md b/CHANGELOG.md index df9e74a1a8e2a6dcb840208b36c3a0acd0a6bbba..eb9fbc9add54061527d6ab6063098edd7b13ebb0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -28,6 +28,9 @@ Note that since we don't clearly distinguish between a public and private interf - Support ``onBeforeUIRender`` to make sure initial UI works with custom presets and similar features. - [Breaking] Removed ``createPlugin`` and ``createPluginAsync`` from ``mol-plugin-ui`` - Please use ``createPluginUI`` instead +- Improve aromatic bonds handling + - Don't detect aromatic bonds for rings < 5 atoms based on planarity + - Prefer atoms in aromatic rings as bond reference positions ## [v3.0.0-dev.5] - 2021-12-16 diff --git a/src/mol-model/structure/structure/unit/rings.ts b/src/mol-model/structure/structure/unit/rings.ts index 99501fc6db76e9f1bd5631586d79e04dd57ab266..519b57274185975a9e9ad4b3ccf008f7b57987c9 100644 --- a/src/mol-model/structure/structure/unit/rings.ts +++ b/src/mol-model/structure/structure/unit/rings.ts @@ -122,6 +122,7 @@ namespace UnitRing { } if (aromaticBondCount === 2 * ring.length) return true; if (!hasAromaticRingElement) return false; + if (ring.length < 5) return false; const ma = PrincipalAxes.calculateMomentsAxes(getPositions(unit, ring)); return Vec3.magnitude(ma.dirC) < AromaticRingPlanarityThreshold; diff --git a/src/mol-repr/structure/visual/bond-intra-unit-cylinder.ts b/src/mol-repr/structure/visual/bond-intra-unit-cylinder.ts index abd5d82a7282c0f403faec6fbb92597030c134f5..6a7db30142e4c8b2954d145df5e0a7b56f55473d 100644 --- a/src/mol-repr/structure/visual/bond-intra-unit-cylinder.ts +++ b/src/mol-repr/structure/visual/bond-intra-unit-cylinder.ts @@ -88,14 +88,14 @@ function getIntraUnitBondCylinderBuilderProps(unit: Unit.Atomic, structure: Stru if (aI > bI) [aI, bI] = [bI, aI]; if (offset[aI + 1] - offset[aI] === 1) [aI, bI] = [bI, aI]; - const aR = elementRingIndices.get(aI); + const aR = elementAromaticRingIndices.get(aI) || elementRingIndices.get(aI); let maxSize = 0; for (let i = offset[aI], il = offset[aI + 1]; i < il; ++i) { const _bI = b[i]; if (_bI !== bI && _bI !== aI) { if (aR) { - const _bR = elementRingIndices.get(_bI); + const _bR = elementAromaticRingIndices.get(_bI) || elementRingIndices.get(_bI); if (!_bR) continue; const size = arrayIntersectionSize(aR, _bR); diff --git a/src/mol-repr/structure/visual/bond-intra-unit-line.ts b/src/mol-repr/structure/visual/bond-intra-unit-line.ts index 1ad1fa45f7bbbad9eda44e63e311bd0e995925a4..df34bfba5e1600715a360ddc9e96eee74e8ca163 100644 --- a/src/mol-repr/structure/visual/bond-intra-unit-line.ts +++ b/src/mol-repr/structure/visual/bond-intra-unit-line.ts @@ -61,14 +61,14 @@ function createIntraUnitBondLines(ctx: VisualContext, unit: Unit, structure: Str if (aI > bI) [aI, bI] = [bI, aI]; if (offset[aI + 1] - offset[aI] === 1) [aI, bI] = [bI, aI]; - const aR = elementRingIndices.get(aI); + const aR = elementAromaticRingIndices.get(aI) || elementRingIndices.get(aI); let maxSize = 0; for (let i = offset[aI], il = offset[aI + 1]; i < il; ++i) { const _bI = b[i]; if (_bI !== bI && _bI !== aI) { if (aR) { - const _bR = elementRingIndices.get(_bI); + const _bR = elementAromaticRingIndices.get(_bI) || elementRingIndices.get(_bI); if (!_bR) continue; const size = arrayIntersectionSize(aR, _bR);