/** * Copyright (c) 2019-2026 mol* contributors, licensed under MIT, See LICENSE file for more info. * * @author Alexander Rose */ import { StructureElement, Unit, Structure } from '../../../mol-model/structure/structure.js'; import { GridLookup3D } from '../../../mol-math/geometry.js'; import { OrderedSet } from '../../../mol-data/int.js'; import { FeatureGroup, FeatureType } from './common.js'; import { Vec3 } from '../../../mol-math/linear-algebra.js'; export { Features }; interface Features { /** number of features */ readonly count: number; /** center x coordinate, in invariant coordinate space */ readonly x: ArrayLike; /** center y coordinate, in invariant coordinate space */ readonly y: ArrayLike; /** center z coordinate, in invariant coordinate space */ readonly z: ArrayLike; readonly types: ArrayLike; readonly groups: ArrayLike; readonly offsets: ArrayLike; /** elements of this feature, range for feature i is offsets[i] to offsets[i + 1] */ readonly members: ArrayLike; /** lookup3d based on center coordinates, in invariant coordinate space */ readonly lookup3d: GridLookup3D; /** maps unit elements to features, range for unit element i is offsets[i] to offsets[i + 1] */ readonly elementsIndex: Features.ElementsIndex; subset(types: ReadonlySet): Features.Subset; } declare namespace Features { /** Index into Features data arrays */ type FeatureIndex = { readonly '@type': 'feature-index'; } & number; function setPosition(out: Vec3, unit: Unit, index: FeatureIndex, features: Features): Vec3; /** maps unit elements to features, range for unit element i is offsets[i] to offsets[i + 1] */ type ElementsIndex = { /** feature indices */ readonly indices: ArrayLike; /** range for unit element i is offsets[i] to offsets[i + 1] */ readonly offsets: ArrayLike; }; type Data = { count: number; x: ArrayLike; y: ArrayLike; z: ArrayLike; types: ArrayLike; groups: ArrayLike; offsets: ArrayLike; members: ArrayLike; }; type Subset = { readonly indices: OrderedSet; readonly lookup3d: GridLookup3D; }; function createElementsIndex(data: Data, elementsCount: number): ElementsIndex; function create(elementsCount: number, data: Data): Features; function createSubset(data: Data, types: ReadonlySet): Subset; interface Info { unit: Unit.Atomic; types: ArrayLike; feature: FeatureIndex; x: ArrayLike; y: ArrayLike; z: ArrayLike; members: ArrayLike; offsets: ArrayLike; idealGeometry: Int8Array; } function Info(structure: Structure, unit: Unit.Atomic, features: Features): Info; function position(out: Vec3, info: Info): Vec3; function distance(infoA: Info, infoB: Info): number; interface Provider { types: Set; add: (structure: Structure, unit: Unit.Atomic, featuresBuilder: FeaturesBuilder) => void; } function Provider(types: FeatureType[], add: Provider['add']): Provider; } export { FeaturesBuilder }; interface FeaturesBuilder { startState: () => void; pushMember: (x: number, y: number, z: number, member: StructureElement.UnitIndex) => void; /** Mark an element as part of this feature without contributing to the centroid */ markMember: (member: StructureElement.UnitIndex) => void; finishState: (type: FeatureType, group: FeatureGroup) => void; add: (type: FeatureType, group: FeatureGroup, x: number, y: number, z: number, member: StructureElement.UnitIndex) => void; getFeatures: (elementsCount: number) => Features; } declare namespace FeaturesBuilder { function create(initialCount?: number, chunkSize?: number, features?: Features): FeaturesBuilder; }