UNPKG

molstar

Version:

A comprehensive macromolecular library.

59 lines (58 loc) 2.13 kB
/** * Copyright (c) 2019 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 { Ccp4Provider } from './format/ccp4'; import { getElementByteSize, createTypedArrayBufferContext } from '../../../mol-io/common/typed-array'; import { Dsn6Provider } from './format/dsn6'; import { fileHandleFromPathOrUrl } from '../../common/file-handle'; export function assignSliceBuffer(data, blockSizeInMB) { const { extent, valueType } = data.header; const maxBlockBytes = blockSizeInMB * 1024 * 1024; const sliceSize = extent[0] * extent[1] * getElementByteSize(valueType); const sliceCapacity = Math.max(1, Math.floor(Math.min(maxBlockBytes, sliceSize * extent[2]) / sliceSize)); const buffer = createTypedArrayBufferContext(sliceCapacity * extent[0] * extent[1], valueType); data.slices = { buffer, maxBlockBytes, sliceCapacity, slicesRead: 0, values: buffer.values, sliceCount: 0, isFinished: false }; } function compareProp(a, b) { if (a instanceof Array && b instanceof Array) { if (a.length !== b.length) return false; for (let i = 0; i < a.length; i++) { if (a[i] !== b[i]) return false; } return true; } return a === b; } export function compareHeaders(a, b) { for (const p of ['grid', 'axisOrder', 'extent', 'origin', 'spacegroupNumber', 'cellSize', 'cellAngles', 'mode']) { if (!compareProp(a[p], b[p])) return false; } return true; } export function getProviderFromType(type) { switch (type) { case 'ccp4': return Ccp4Provider; case 'dsn6': return Dsn6Provider; } } export async function open(name, filename, type) { const provider = getProviderFromType(type); const file = await fileHandleFromPathOrUrl(filename, filename); const header = await provider.readHeader(name, file); const data = { header, file, slices: void 0 }; return { data, provider }; }