Skip to content
Snippets Groups Projects
Select Git revision
  • e8df2a6555e3a7850823ea154dcf0066e85e41d6
  • 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

element-point.ts

Blame
  • cif-core.ts 7.34 KiB
    /**
     * Copyright (c) 2020 mol* contributors, licensed under MIT, See LICENSE file for more info.
     *
     * @author Alexander Rose <alexander.rose@weirdbyte.de>
     */
    
    import { Column, Table } from '../../mol-data/db';
    import { Model, Symmetry } from '../../mol-model/structure/model';
    import { MoleculeType } from '../../mol-model/structure/model/types';
    import { RuntimeContext, Task } from '../../mol-task';
    import { createModels } from './basic/parser';
    import { BasicSchema, createBasic } from './basic/schema';
    import { ComponentBuilder } from './common/component';
    import { EntityBuilder } from './common/entity';
    import { ModelFormat } from './format';
    import { CifCore_Database } from '../../mol-io/reader/cif/schema/cif-core';
    import { CifFrame, CIF } from '../../mol-io/reader/cif';
    import { Spacegroup, SpacegroupCell } from '../../mol-math/geometry';
    import { Vec3 } from '../../mol-math/linear-algebra';
    import { ModelSymmetry } from './property/symmetry';
    import { IndexPairBonds } from './property/bonds/index-pair';
    import { AtomSiteAnisotrop } from './property/anisotropic';
    
    function getSpacegroupNameOrNumber(space_group: CifCore_Database['space_group']) {
        const groupNumber = space_group.IT_number.value(0)
        const groupName = space_group['name_H-M_full'].value(0)
        if (!space_group.IT_number.isDefined) return groupName
        if (!space_group['name_H-M_full'].isDefined) return groupNumber
        return groupNumber
    }
    
    function getSymmetry(db: CifCore_Database): Symmetry {
        const { cell, space_group } = db
        const nameOrNumber = getSpacegroupNameOrNumber(space_group)
        const spaceCell = SpacegroupCell.create(nameOrNumber,
            Vec3.create(cell.length_a.value(0), cell.length_b.value(0), cell.length_c.value(0)),
            Vec3.scale(Vec3.zero(), Vec3.create(cell.angle_alpha.value(0), cell.angle_beta.value(0), cell.angle_gamma.value(0)), Math.PI / 180));
    
        return {
            spacegroup: Spacegroup.create(spaceCell),
            assemblies : [],
            isNonStandardCrytalFrame: false,
            ncsOperators: []
        }
    }
    
    async function getModels(db: CifCore_Database, format: CifCoreFormat, ctx: RuntimeContext): Promise<Model[]> {
    
        const atomCount = db.atom_site._rowCount
        const MOL = Column.ofConst('MOL', atomCount, Column.Schema.str);
        const A = Column.ofConst('A', atomCount, Column.Schema.str);
        const seq_id = Column.ofConst(1, atomCount, Column.Schema.int);
    
        const symmetry = getSymmetry(db)
        const m = symmetry.spacegroup.cell.fromFractional
    
        const { fract_x, fract_y, fract_z } = db.atom_site
        const x = new Float32Array(atomCount)
        const y = new Float32Array(atomCount)
        const z = new Float32Array(atomCount)
        const v = Vec3()
        for (let i = 0; i < atomCount; ++i) {
            Vec3.set(v, fract_x.value(i), fract_y.value(i), fract_z.value(i))
            Vec3.transformMat4(v, v, m)
            x[i] = v[0], y[i] = v[1], z[i] = v[2]
        }
    
        const atom_site = Table.ofPartialColumns(BasicSchema.atom_site, {
            auth_asym_id: A,
            auth_atom_id: db.atom_site.label,