Skip to content
Snippets Groups Projects
Select Git revision
  • 9954e7e7662a1007b13b2a879e4422c997a7b6c1
  • master default protected
  • rednatco-v2
  • rednatco
  • test
  • ntc-tube-uniform-color
  • ntc-tube-missing-atoms
  • restore-vertex-array-per-program
  • watlas2
  • dnatco_new
  • cleanup-old-nodejs
  • webmmb
  • fix_auth_seq_id
  • update_deps
  • ext_dev
  • ntc_balls
  • nci-2
  • plugin
  • bugfix-0.4.5
  • nci
  • servers
  • v0.5.0-dev.1
  • v0.4.5
  • v0.4.4
  • v0.4.3
  • v0.4.2
  • v0.4.1
  • v0.4.0
  • v0.3.12
  • v0.3.11
  • v0.3.10
  • v0.3.9
  • v0.3.8
  • v0.3.7
  • v0.3.6
  • v0.3.5
  • v0.3.4
  • v0.3.3
  • v0.3.2
  • v0.3.1
  • v0.3.0
41 results

cif-encoder.ts

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]> }
    }