Skip to content
Snippets Groups Projects
density-server.ts 1.65 KiB
/**
 * Copyright (c) 2018 mol* contributors, licensed under MIT, See LICENSE file for more info.
 *
 * @author David Sehnal <david.sehnal@gmail.com>
 */

import { DensityServer_Data_Database } from 'mol-io/reader/cif/schema/density-server'
import { VolumeData } from '../data'
import { Task } from 'mol-task';
import { SpacegroupCell, Box3D } from 'mol-math/geometry';
import { Tensor, Vec3 } from 'mol-math/linear-algebra';

function parseDensityServerData(source: DensityServer_Data_Database): Task<VolumeData> {
    return Task.create<VolumeData>('Parse Volume Data', async ctx => {
        const { volume_data_3d_info: info, volume_data_3d: values } = source;
        const cell = SpacegroupCell.create(
            info.spacegroup_number.value(0),
            Vec3.ofArray(info.spacegroup_cell_size.value(0)),
            Vec3.scale(Vec3.zero(), Vec3.ofArray(info.spacegroup_cell_angles.value(0)), Math.PI / 180)
        );

        const tensorSpace = Tensor.Space(info.sample_count.value(0), info.axis_order.value(0), Float32Array);
        const data = Tensor.create(tensorSpace, Tensor.Data1(values.values.toArray()));

        const origin = Vec3.ofArray(info.origin.value(0))
        const dimensions = Vec3.ofArray(info.dimensions.value(0));

        return {
            cell,
            fractionalBox: Box3D.create(origin, Vec3.add(Vec3.zero(), origin, dimensions)),
            data,
            dataStats: {
                min: info.min_sampled.value(0),
                max: info.max_sampled.value(0),
                mean: info.mean_sampled.value(0),
                sigma: info.sigma_sampled.value(0)
            }
        };
    });
}

export { parseDensityServerData }