Skip to content
Snippets Groups Projects
Select Git revision
  • 2a79b201c23a8d6aad1b88a2f9cf436356a3d24e
  • master default protected
  • devel
  • hruska-feature-clients-api
  • malostik-#5066-deduplicate-idea-ids
  • warden-postgresql-port
  • hruska-feature-#6799-filter-keys
  • hruska-feature-5066-duplicateIdeaID
  • warden-client-3.0-beta3
  • warden-server-3.0-beta3
  • warden-client-2.2-final
  • warden-server-2.2-final
  • warden-client-3.0-beta2
  • warden-server-3.0-beta2
  • warden-client-2.2
  • warden-server-2.2-patch3
  • warden-client-3.0-beta1
  • warden-server-3.0-beta1
  • warden-server-2.2-patch1
  • warden-client-3.0-beta0
  • warden-server-3.0-beta0
  • warden-server-2.2
  • warden-server-2.1-patch1
  • warden-client-2.1
  • warden-server-2.1
  • warden-server-2.1-beta6
  • warden-server-2.1-beta5
  • warden-server-2.1-beta4
28 results

meta-nodes

Blame
  • model.ts 5.43 KiB
    /**
     * Copyright (c) 2017 molio contributors, licensed under MIT, See LICENSE file for more info.
     *
     * @author David Sehnal <david.sehnal@gmail.com>
     */
    
    import * as Data from './data'
    import { Selectors } from './selectors'
    import { Vec3, Mat4 } from '../../mol-base/math/linear-algebra'
    
    let _uid = 0;
    /** Model-related unique identifiers */
    export function getUid() { return _uid++; }
    
    /** Unit = essentially a list of residues (usually a chain) */
    export interface Unit extends Readonly<{
        operator: Unit.Operator,
        /** The static part (essentially residue annotations) */
        structure: Unit.Structure,
        /** 3D arrangement that often changes with time. */
        conformation: Unit.Conformation,
        /** Position of i-th atom. Special function for this because it's the only one that depends on "operator" */
        atomPosition(i: number, p: Vec3): Vec3,
        /** Property access */
        selectors: Selectors
    }> { }
    
    export namespace Unit {
        export interface Structure extends Readonly<{
            /** A globally unique identifier for this instance (to easily determine unique structures within a model) */
            id: number,
            /** Source data for this structure */
            data: Data.Structure,
            /** Reference to the data.entities table */
            entity: number,
            /** Reference to the data.chains table */
            chain: number,
            /** Indices into the data.residues table. */
            residues: ArrayLike<number>,
            /** Offsets of atoms in the residue layer. start = offsets[i], endExclusive = offsets[i + 1] */
            atomOffsets: ArrayLike<number>,
            /** Indices into data.atoms table */
            atoms: ArrayLike<number>
            /** Index of a residue in the corresponding residues array. */
            atomResidue: ArrayLike<number>
        }> { }
    
        export interface Conformation extends Readonly<{
            /** A globally unique identifier for this instance (to easily determine unique structures within a model) */
            id: number,
    
            positions: Data.Positions,
    
            /** Per residue secondary structure assignment. */
            secondaryStructure: Data.SecondaryStructures
        }> {
            '@spatialLookup': any, // TODO
            '@boundingSphere': Readonly<{ center: Vec3, radius: number }>,
            '@bonds': Data.Bonds
        }
    
        export namespace Conformation {
            export function spatialLookup(conformation: Conformation): any {
                throw 'not implemented'
            }
    
            export function boundingSphere(conformation: Conformation): any {
                throw 'not implemented'
            }
    
            export function bonds(conformation: Conformation): any {
                throw 'not implemented'
            }
        }
    
        export type OperatorKind =
            | { kind: 'identity' }
            | { kind: 'symmetry', id: string, hkl: Vec3 }
            | { kind: 'assembly', index: number }
            | { kind: 'custom' }
    
        export interface Operator extends Readonly<{
            kind: OperatorKind,
            transform: Mat4,
            inverse: Mat4
        }> { }
    
        export interface SpatialLookup {
            // TODO
        }
    }
    
    export interface Model extends Readonly<{
        units: Unit[],
    
        structure: { [id: number]: Unit.Structure },
        conformation: { [id: number]: Unit.Conformation }
    }> {
        '@unitLookup'?: Unit.SpatialLookup,
        /** bonds between units */
        '@unitBonds'?: Data.Bonds
    }
    
    export namespace Model {
        export function unitLookup(model: Model): Unit.SpatialLookup {
            throw 'not implemented';
        }
    
        export function unitBonds(model: Model): Data.Bonds {
            throw 'not implemented';
        }
    
        export function join(a: Model, b: Model): Model {
            return {
                units: [...a.units, ...b.units],
                structure: { ...a.structure, ...b.structure },
                conformation: { ...a.conformation, ...b.conformation }
            }
        }
    }
    
    export namespace Atom {
        /**
         * Represents a "packed reference" to an atom.
         * This is because selections can then be represented
         * a both number[] and Float64Array(), making it much
         * more efficient than storing an array of objects.
         */
        export type PackedReference = number
        export interface Reference { unit: number, atom: number }
        export type Selection = ArrayLike<PackedReference>
    
        const { _uint32, _float64 } = (function() {
            const data = new ArrayBuffer(8);
            return { _uint32: new Uint32Array(data), _float64: new Float64Array(data) };
        }());
    
        export function emptyRef(): Reference { return { unit: 0, atom: 0 }; }
    
        export function packRef(location: Reference) {
            _uint32[0] = location.unit;
            _uint32[1] = location.atom;
            return _float64[0];
        }
    
        export function unpackRef(ref: PackedReference) {
            return updateRef(ref, emptyRef());
        }
    
        export function updateRef(ref: PackedReference, location: Reference): Reference {
            _float64[0] = ref;
            location.unit = _uint32[0];
            location.atom = _uint32[1];
            return location;
        }
    }
    
    export interface Selector<T> {
        '@type': T,
        create(m: Model, u: number): Selector.Field<T>
    }
    
    export function Selector<T>(create: (m: Model, u: number) => (a: number, v?: T) => T): Selector<T> {
        return { create } as Selector<T>;
    }
    
    export namespace Selector {
        export type Field<T> = (a: number, v?: T) => T;
    
        export type Category = { [s: string]: Selector<any> };
        export type Unit<C extends Category> = { [F in keyof C]: Field<C[F]['@type']> }
    
        export type Set<S extends { [n: string]: Category }> = { [C in keyof S]: Unit<S[C]> }
    }