Skip to content
Snippets Groups Projects
Commit 728774f0 authored by Alexander Rose's avatar Alexander Rose
Browse files

added Structure.Loci

parent ac536d22
Branches
Tags
No related merge requests found
......@@ -11,6 +11,7 @@ import { Sphere3D } from 'mol-math/geometry';
import { CentroidHelper } from 'mol-math/geometry/centroid-helper';
import { Vec3 } from 'mol-math/linear-algebra';
import { OrderedSet } from 'mol-data/int';
import { Structure } from './structure/structure';
/** A Loci that includes every loci */
export const EveryLoci = { kind: 'every-loci' as 'every-loci' }
......@@ -29,6 +30,9 @@ export function isEmptyLoci(x: any): x is EmptyLoci {
export function areLociEqual(lociA: Loci, lociB: Loci) {
if (isEveryLoci(lociA) && isEveryLoci(lociB)) return true
if (isEmptyLoci(lociA) && isEmptyLoci(lociB)) return true
if (Structure.isLoci(lociA) && Structure.isLoci(lociB)) {
return Structure.areLociEqual(lociA, lociB)
}
if (StructureElement.isLoci(lociA) && StructureElement.isLoci(lociB)) {
return StructureElement.areLociEqual(lociA, lociB)
}
......@@ -44,7 +48,7 @@ export function areLociEqual(lociA: Loci, lociB: Loci) {
export { Loci }
type Loci = StructureElement.Loci | Link.Loci | EveryLoci | EmptyLoci | Shape.Loci
type Loci = StructureElement.Loci | Structure.Loci | Link.Loci | EveryLoci | EmptyLoci | Shape.Loci
namespace Loci {
......@@ -54,7 +58,9 @@ namespace Loci {
if (loci.kind === 'every-loci' || loci.kind === 'empty-loci') return void 0;
sphereHelper.reset();
if (loci.kind === 'element-loci') {
if (loci.kind === 'structure-loci') {
return Sphere3D.clone(loci.structure.boundary.sphere)
} else if (loci.kind === 'element-loci') {
for (const e of loci.elements) {
const { indices } = e;
const pos = e.unit.conformation.position;
......
......@@ -280,6 +280,23 @@ function getUniqueAtomicResidueIndices(structure: Structure): ReadonlyMap<UUID,
namespace Structure {
export const Empty = new Structure([]);
/** Represents a single structure */
export interface Loci {
readonly kind: 'structure-loci',
readonly structure: Structure,
}
export function Loci(structure: Structure): Loci {
return { kind: 'structure-loci', structure };
}
export function isLoci(x: any): x is Loci {
return !!x && x.kind === 'structure-loci';
}
export function areLociEqual(a: Loci, b: Loci) {
return a.structure === b.structure
}
export function create(units: ReadonlyArray<Unit>): Structure { return new Structure(units); }
/**
......
......@@ -20,6 +20,8 @@ function setElementLocation(loc: StructureElement, unit: Unit, index: StructureE
export function labelFirst(loci: Loci): string {
switch (loci.kind) {
case 'structure-loci':
return loci.structure.models.map(m => m.label).join(', ')
case 'element-loci':
const e = loci.elements[0]
if (e) {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment