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) { ...@@ -96,7 +96,7 @@ export function printUnits(structure: Structure) {
if (Unit.isAtomic(l.unit)) { if (Unit.isAtomic(l.unit)) {
console.log(`Atomic unit ${unitId}: ${size} elements`); console.log(`Atomic unit ${unitId}: ${size} elements`);
} else if (Unit.isCoarse(l.unit)) { } 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 props = Queries.props.coarse_grained;
const seq = l.unit.model.sequence; const seq = l.unit.model.sequence;
......
...@@ -45,6 +45,14 @@ export function hash4(i: number, j: number, k: number, l: number) { ...@@ -45,6 +45,14 @@ export function hash4(i: number, j: number, k: number, l: number) {
return a; 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 * A unique number for each pair of integers
* Biggest representable pair is (67108863, 67108863) (limit imposed by Number.MAX_SAFE_INTEGER) * Biggest representable pair is (67108863, 67108863) (limit imposed by Number.MAX_SAFE_INTEGER)
......
...@@ -60,6 +60,7 @@ const chain = { ...@@ -60,6 +60,7 @@ const chain = {
} }
const coarse_grained = { const coarse_grained = {
key: atom.key,
modelKey: Element.property(l => !Unit.isCoarse(l.unit) ? notCoarse() : l.unit.sites.modelKey[l.element]), 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]), entityKey: Element.property(l => !Unit.isCoarse(l.unit) ? notCoarse() : l.unit.sites.entityKey[l.element]),
...@@ -71,11 +72,11 @@ const coarse_grained = { ...@@ -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_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)), 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_radius: Element.property(l => !Unit.isSpheres(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_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_weight: Element.property(l => !Unit.isGaussians(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_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]); } 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 { ...@@ -43,12 +43,12 @@ namespace Structure {
if (cs.isDefined) { if (cs.isDefined) {
if (cs.spheres.count > 0) { if (cs.spheres.count > 0) {
const group = ElementGroup.createNew(OrderedSet.ofBounds(0, cs.spheres.count)); 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); builder.add(unit, unit.fullGroup);
} }
if (cs.gaussians.count > 0) { if (cs.gaussians.count > 0) {
const group = ElementGroup.createNew(OrderedSet.ofBounds(0, cs.gaussians.count)); 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); builder.add(unit, unit.fullGroup);
} }
} }
......
...@@ -13,15 +13,15 @@ import CoarseGrained from '../model/properties/coarse-grained'; ...@@ -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 // A building block of a structure that corresponds to an atomic or a coarse grained representation
// 'conveniently grouped together'. // 'conveniently grouped together'.
type Unit = Unit.Atomic | Unit.CoarseSpheres | Unit.CoarseGaussians type Unit = Unit.Atomic | Unit.Spheres | Unit.Gaussians
namespace Unit { 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 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 isCoarse(u: Unit): u is Spheres | Gaussians { return u.kind === Kind.Spheres || u.kind === Kind.Gaussians; }
export function isCoarseSpheres(u: Unit): u is CoarseSpheres { return u.kind === Kind.CoarseSpheres; } export function isSpheres(u: Unit): u is Spheres { return u.kind === Kind.Spheres; }
export function isCoarseGaussians(u: Unit): u is CoarseGaussians { return u.kind === Kind.CoarseGaussians; } export function isGaussians(u: Unit): u is Gaussians { return u.kind === Kind.Gaussians; }
export interface Base extends SymmetryOperator.ArrayMapping { export interface Base extends SymmetryOperator.ArrayMapping {
// Provides access to the underlying data. // Provides access to the underlying data.
...@@ -58,14 +58,14 @@ namespace Unit { ...@@ -58,14 +58,14 @@ namespace Unit {
readonly sites: S readonly sites: S
} }
export interface CoarseSpheres extends CoarseBase<Kind.CoarseSpheres, CoarseGrained.Spheres> { } export interface Spheres extends CoarseBase<Kind.Spheres, CoarseGrained.Spheres> { }
export interface CoarseGaussians extends CoarseBase<Kind.CoarseGaussians, CoarseGrained.Gaussians> { } export interface Gaussians extends CoarseBase<Kind.Gaussians, CoarseGrained.Gaussians> { }
export function create(kind: Kind, model: Model, operator: SymmetryOperator, fullGroup: ElementGroup): Unit { export function create(kind: Kind, model: Model, operator: SymmetryOperator, fullGroup: ElementGroup): Unit {
switch (kind) { switch (kind) {
case Kind.Atomic: return createAtomic(model, operator, fullGroup); case Kind.Atomic: return createAtomic(model, operator, fullGroup);
case Kind.CoarseSpheres: return createCoarseSpheres(model, operator, fullGroup); case Kind.Spheres: return createSpheres(model, operator, fullGroup);
case Kind.CoarseGaussians: return createCoarseGaussians(model, operator, fullGroup); case Kind.Gaussians: return createGaussians(model, operator, fullGroup);
} }
} }
...@@ -88,12 +88,12 @@ namespace Unit { ...@@ -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); const { invariantPosition, position, x, y, z } = SymmetryOperator.createMapping(operator, model.coarseGrained.spheres);
return { return {
model, model,
kind: Kind.CoarseSpheres, kind: Kind.Spheres,
sites: model.coarseGrained.spheres, sites: model.coarseGrained.spheres,
operator, operator,
fullGroup, fullGroup,
...@@ -103,12 +103,12 @@ namespace Unit { ...@@ -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); const { invariantPosition, position, x, y, z } = SymmetryOperator.createMapping(operator, model.coarseGrained.gaussians);
return { return {
model, model,
kind: Kind.CoarseGaussians, kind: Kind.Gaussians,
sites: model.coarseGrained.gaussians, sites: model.coarseGrained.gaussians,
operator, operator,
fullGroup, 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