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

added Structure.Loci

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