Skip to content
Snippets Groups Projects
Commit c2882b3e authored by David Sehnal's avatar David Sehnal
Browse files

Coarse unit tweaks, string hash

parent 31eb9ae4
No related branches found
No related tags found
No related merge requests found
......@@ -96,7 +96,7 @@ export function printUnits(structure: Structure) {
if (Unit.isAtomic(l.unit)) {
console.log(`Atomic unit ${unitId}: ${size} elements`);
} else if (Unit.isCoarse(l.unit)) {
console.log(`Coarse unit ${unitId} (${Unit.isCoarseSpheres(l.unit) ? 'spheres' : 'gaussians'}): ${size} elements.`);
console.log(`Coarse unit ${unitId} (${Unit.isSpheres(l.unit) ? 'spheres' : 'gaussians'}): ${size} elements.`);
const props = Queries.props.coarse_grained;
const seq = l.unit.model.sequence;
......
......@@ -45,6 +45,14 @@ export function hash4(i: number, j: number, k: number, l: number) {
return a;
}
export function hashString(s: string) {
let h = 0;
for (let i = 0, l = s.length; i < l; i++) {
h = (h << 5) - h + s.charCodeAt(i++) | 0;
}
return h;
}
/**
* A unique number for each pair of integers
* Biggest representable pair is (67108863, 67108863) (limit imposed by Number.MAX_SAFE_INTEGER)
......
......@@ -60,6 +60,7 @@ const chain = {
}
const coarse_grained = {
key: atom.key,
modelKey: Element.property(l => !Unit.isCoarse(l.unit) ? notCoarse() : l.unit.sites.modelKey[l.element]),
entityKey: Element.property(l => !Unit.isCoarse(l.unit) ? notCoarse() : l.unit.sites.entityKey[l.element]),
......@@ -71,11 +72,11 @@ const coarse_grained = {
seq_id_begin: Element.property(l => !Unit.isCoarse(l.unit) ? notCoarse() : l.unit.sites.seq_id_begin.value(l.element)),
seq_id_end: Element.property(l => !Unit.isCoarse(l.unit) ? notCoarse() : l.unit.sites.seq_id_end.value(l.element)),
sphere_radius: Element.property(l => !Unit.isCoarseSpheres(l.unit) ? notCoarse('spheres') : l.unit.sites.radius.value(l.element)),
sphere_rmsf: Element.property(l => !Unit.isCoarseSpheres(l.unit) ? notCoarse('spheres') : l.unit.sites.rmsf.value(l.element)),
sphere_radius: Element.property(l => !Unit.isSpheres(l.unit) ? notCoarse('spheres') : l.unit.sites.radius.value(l.element)),
sphere_rmsf: Element.property(l => !Unit.isSpheres(l.unit) ? notCoarse('spheres') : l.unit.sites.rmsf.value(l.element)),
gaussian_weight: Element.property(l => !Unit.isCoarseGaussians(l.unit) ? notCoarse('gaussians') : l.unit.sites.weight.value(l.element)),
gaussian_covariance_matrix: Element.property(l => !Unit.isCoarseGaussians(l.unit) ? notCoarse('gaussians') : l.unit.sites.covariance_matrix.value(l.element))
gaussian_weight: Element.property(l => !Unit.isGaussians(l.unit) ? notCoarse('gaussians') : l.unit.sites.weight.value(l.element)),
gaussian_covariance_matrix: Element.property(l => !Unit.isGaussians(l.unit) ? notCoarse('gaussians') : l.unit.sites.covariance_matrix.value(l.element))
}
function eK(l: Element.Location) { return !Unit.isAtomic(l.unit) ? notAtomic() : l.unit.hierarchy.entityKey.value(l.unit.chainIndex[l.element]); }
......
......@@ -43,12 +43,12 @@ namespace Structure {
if (cs.isDefined) {
if (cs.spheres.count > 0) {
const group = ElementGroup.createNew(OrderedSet.ofBounds(0, cs.spheres.count));
const unit = Unit.create(Unit.Kind.CoarseSpheres, model, SymmetryOperator.Default, group);
const unit = Unit.create(Unit.Kind.Spheres, model, SymmetryOperator.Default, group);
builder.add(unit, unit.fullGroup);
}
if (cs.gaussians.count > 0) {
const group = ElementGroup.createNew(OrderedSet.ofBounds(0, cs.gaussians.count));
const unit = Unit.create(Unit.Kind.CoarseGaussians, model, SymmetryOperator.Default, group);
const unit = Unit.create(Unit.Kind.Gaussians, model, SymmetryOperator.Default, group);
builder.add(unit, unit.fullGroup);
}
}
......
......@@ -13,15 +13,15 @@ import CoarseGrained from '../model/properties/coarse-grained';
// A building block of a structure that corresponds to an atomic or a coarse grained representation
// 'conveniently grouped together'.
type Unit = Unit.Atomic | Unit.CoarseSpheres | Unit.CoarseGaussians
type Unit = Unit.Atomic | Unit.Spheres | Unit.Gaussians
namespace Unit {
export const enum Kind { Atomic, CoarseSpheres, CoarseGaussians }
export const enum Kind { Atomic, Spheres, Gaussians }
export function isAtomic(u: Unit): u is Atomic { return u.kind === Kind.Atomic; }
export function isCoarse(u: Unit): u is CoarseSpheres | CoarseGaussians { return u.kind === Kind.CoarseSpheres || u.kind === Kind.CoarseGaussians; }
export function isCoarseSpheres(u: Unit): u is CoarseSpheres { return u.kind === Kind.CoarseSpheres; }
export function isCoarseGaussians(u: Unit): u is CoarseGaussians { return u.kind === Kind.CoarseGaussians; }
export function isCoarse(u: Unit): u is Spheres | Gaussians { return u.kind === Kind.Spheres || u.kind === Kind.Gaussians; }
export function isSpheres(u: Unit): u is Spheres { return u.kind === Kind.Spheres; }
export function isGaussians(u: Unit): u is Gaussians { return u.kind === Kind.Gaussians; }
export interface Base extends SymmetryOperator.ArrayMapping {
// Provides access to the underlying data.
......@@ -58,14 +58,14 @@ namespace Unit {
readonly sites: S
}
export interface CoarseSpheres extends CoarseBase<Kind.CoarseSpheres, CoarseGrained.Spheres> { }
export interface CoarseGaussians extends CoarseBase<Kind.CoarseGaussians, CoarseGrained.Gaussians> { }
export interface Spheres extends CoarseBase<Kind.Spheres, CoarseGrained.Spheres> { }
export interface Gaussians extends CoarseBase<Kind.Gaussians, CoarseGrained.Gaussians> { }
export function create(kind: Kind, model: Model, operator: SymmetryOperator, fullGroup: ElementGroup): Unit {
switch (kind) {
case Kind.Atomic: return createAtomic(model, operator, fullGroup);
case Kind.CoarseSpheres: return createCoarseSpheres(model, operator, fullGroup);
case Kind.CoarseGaussians: return createCoarseGaussians(model, operator, fullGroup);
case Kind.Spheres: return createSpheres(model, operator, fullGroup);
case Kind.Gaussians: return createGaussians(model, operator, fullGroup);
}
}
......@@ -88,12 +88,12 @@ namespace Unit {
};
}
function createCoarseSpheres(model: Model, operator: SymmetryOperator, fullGroup: ElementGroup): Unit.CoarseSpheres {
function createSpheres(model: Model, operator: SymmetryOperator, fullGroup: ElementGroup): Unit.Spheres {
const { invariantPosition, position, x, y, z } = SymmetryOperator.createMapping(operator, model.coarseGrained.spheres);
return {
model,
kind: Kind.CoarseSpheres,
kind: Kind.Spheres,
sites: model.coarseGrained.spheres,
operator,
fullGroup,
......@@ -103,12 +103,12 @@ namespace Unit {
};
}
function createCoarseGaussians(model: Model, operator: SymmetryOperator, fullGroup: ElementGroup): Unit.CoarseGaussians {
function createGaussians(model: Model, operator: SymmetryOperator, fullGroup: ElementGroup): Unit.Gaussians {
const { invariantPosition, position, x, y, z } = SymmetryOperator.createMapping(operator, model.coarseGrained.gaussians);
return {
model,
kind: Kind.CoarseGaussians,
kind: Kind.Gaussians,
sites: model.coarseGrained.gaussians,
operator,
fullGroup,
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment