message: added Structure.uniqueElementSymbols
diff: @@ -29,6 +29,7 @@ import { CustomProperties } from '../common/custom-property';
  import { AtomicHierarchy } from '../model/properties/atomic';
  import { StructureSelection } from '../query/selection';
  import { getBoundary } from '../../../mol-math/geometry/boundary';
  +import { ElementSymbol } from '../model/types';
  class Structure {
  /** Maps unit.id to unit */
  @@ -50,6 +51,7 @@ class Structure {
  masterModel?: Model,
  representativeModel?: Model,
  uniqueResidueNames?: Set<string>,
  + uniqueElementSymbols?: Set<ElementSymbol>,
  entityIndices?: ReadonlyArray<EntityIndex>,
  uniqueAtomicResidueIndices?: ReadonlyMap<UUID, ReadonlyArray<ResidueIndex>>,
  serialMapping?: SerialMapping,
  @@ -265,6 +267,11 @@ class Structure {
  || (this._props.uniqueResidueNames = getUniqueResidueNames(this));
  }
  + get uniqueElementSymbols() {
  + return this._props.uniqueElementSymbols
  + || (this._props.uniqueElementSymbols = getUniqueElementSymbols(this));
  + }
  +
  get entityIndices() {
  return this._props.entityIndices
  || (this._props.entityIndices = getEntityIndices(this));
  @@ -403,7 +410,8 @@ function getUniqueResidueNames(s: Structure) {
  const prop = StructureProperties.residue.label_comp_id;
  const names = new Set<string>();
  const loc = StructureElement.Location.create(s);
  - for (const unit of s.units) {
  + for (const unitGroup of s.unitSymmetryGroups) {
  + const unit = unitGroup.units[0];
  // TODO: support coarse unit?
  if (!Unit.isAtomic(unit)) continue;
  const residues = Segmentation.transientSegments(unit.model.atomicHierarchy.residueAtomSegments, unit.elements);
  @@ -417,6 +425,21 @@ function getUniqueResidueNames(s: Structure) {
  return names;
  }
  +function getUniqueElementSymbols(s: Structure) {
  + const prop = StructureProperties.atom.type_symbol;
  + const symbols = new Set<ElementSymbol>();
  + const loc = StructureElement.Location.create(s);
  + for (const unit of s.units) {
  + if (!Unit.isAtomic(unit)) continue;
  + loc.unit = unit;
  + for (let i = 0, il = unit.elements.length; i < il; ++i) {
  + loc.element = unit.elements[i];
  + symbols.add(prop(loc));
  + }
  + }
  + return symbols;
  +}
  +
  function getEntityIndices(structure: Structure): ReadonlyArray<EntityIndex> {
  const { units } = structure;
  const l = StructureElement.Location.create(structure);
  