molstar
Version:
A comprehensive macromolecular library.
59 lines (58 loc) • 2.13 kB
JavaScript
/**
* 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 };
}