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

state.ts

Blame
  • mmcif.ts 2.61 KiB
    /**
     * Copyright (c) 2017-2018 mol* contributors, licensed under MIT, See LICENSE file for more info.
     *
     * @author David Sehnal <david.sehnal@gmail.com>
     * @author Alexander Rose <alexander.rose@weirdbyte.de>
     */
    
    import { CifWriter } from 'mol-io/writer/cif'
    import { mmCIF_Schema } from 'mol-io/reader/cif/schema/mmcif'
    import { Structure } from '../structure'
    import { Model } from '../model'
    import { _atom_site } from './categories/atom_site';
    
    export interface CifExportContext {
        structure: Structure,
        model: Model
    }
    
    import CifCategory = CifWriter.Category
    
    function copy_mmCif_category(name: keyof mmCIF_Schema) {
        return ({ model }: CifExportContext) => {
            if (model.sourceData.kind !== 'mmCIF') return CifCategory.Empty;
            const table = model.sourceData.data[name];
            if (!table || !table._rowCount) return CifCategory.Empty;
            return CifCategory.ofTable(name, table);
        };
    }
    
    function _entity({ model, structure }: CifExportContext): CifCategory {
        const keys = Structure.getEntityKeys(structure);
        return CifCategory.ofTable('entity', model.entities.data, keys);
    }
    
    const Categories = [
        copy_mmCif_category('entry'),
        copy_mmCif_category('exptl'),
        copy_mmCif_category('cell'),
        copy_mmCif_category('symmetry'),
        _entity,
        _atom_site
    ];
    
    namespace _Filters {
        export const AtomSitePositionsFieldNames = new Set<string>(<(keyof typeof mmCIF_Schema.atom_site)[]>['id', 'Cartn_x', 'Cartn_y', 'Cartn_z']);
    }
    
    export const mmCIF_Export_Filters = {
        onlyPositions: <CifWriter.Category.Filter>{
            includeCategory(name) { return name === 'atom_site'; },
            includeField(cat, field) { return _Filters.AtomSitePositionsFieldNames.has(field); }
        }
    }
    
    /** Doesn't start a data block */
    export function encode_mmCIF_categories(encoder: CifWriter.Encoder, structure: Structure) {
        const models = Structure.getModels(structure);
        if (models.length !== 1) throw 'Can\'t export stucture composed from multiple models.';
        const model = models[0];
    
        const ctx: CifExportContext[] = [{ structure, model }];
    
        for (const cat of Categories) {
            encoder.writeCategory(cat, ctx);
        }
        for (const customProp of model.customProperties.all) {
            const cats = customProp.cifExport.categoryProvider(ctx[0]);
            for (const cat of cats) {
                encoder.writeCategory(cat, ctx);
            }
        }
    }
    
    function to_mmCIF(name: string, structure: Structure, asBinary = false) {
        const enc = CifWriter.createEncoder({ binary: asBinary });
        enc.startDataBlock(name);
        encode_mmCIF_categories(enc, structure);
        return enc.getData();
    }
    
    export default to_mmCIF