molstar
Version:
A comprehensive macromolecular library.
603 lines • 26.6 kB
JavaScript
/**
* Copyright (c) 2018-2020 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 { __awaiter, __generator } from "tslib";
import * as CCP4 from '../../mol-io/reader/ccp4/parser';
import { CIF } from '../../mol-io/reader/cif';
import * as DSN6 from '../../mol-io/reader/dsn6/parser';
import * as PLY from '../../mol-io/reader/ply/parser';
import { parsePsf } from '../../mol-io/reader/psf/parser';
import { StateObject, StateTransformer } from '../../mol-state';
import { Task } from '../../mol-task';
import { ajaxGetMany } from '../../mol-util/data-source';
import { ParamDefinition as PD } from '../../mol-util/param-definition';
import { PluginStateObject as SO, PluginStateTransform } from '../objects';
import { Asset } from '../../mol-util/assets';
import { parseCube } from '../../mol-io/reader/cube/parser';
import { parseDx } from '../../mol-io/reader/dx/parser';
import { ColorNames } from '../../mol-util/color/names';
export { Download };
export { DownloadBlob };
export { RawData };
export { ReadFile };
export { ParseBlob };
export { ParseCif };
export { ParseCube };
export { ParsePsf };
export { ParsePly };
export { ParseCcp4 };
export { ParseDsn6 };
export { ParseDx };
export { ImportString };
export { ImportJson };
export { ParseJson };
export { LazyVolume };
var Download = PluginStateTransform.BuiltIn({
name: 'download',
display: { name: 'Download', description: 'Download string or binary data from the specified URL' },
from: [SO.Root],
to: [SO.Data.String, SO.Data.Binary],
params: {
url: PD.Url('https://www.ebi.ac.uk/pdbe/static/entry/1cbs_updated.cif', { description: 'Resource URL. Must be the same domain or support CORS.' }),
label: PD.Optional(PD.Text('')),
isBinary: PD.Optional(PD.Boolean(false, { description: 'If true, download data as binary (string otherwise)' }))
}
})({
apply: function (_a, plugin) {
var _this = this;
var p = _a.params, cache = _a.cache;
return Task.create('Download', function (ctx) { return __awaiter(_this, void 0, void 0, function () {
var url, asset;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
url = Asset.getUrlAsset(plugin.managers.asset, p.url);
return [4 /*yield*/, plugin.managers.asset.resolve(url, p.isBinary ? 'binary' : 'string').runInContext(ctx)];
case 1:
asset = _a.sent();
cache.asset = asset;
return [2 /*return*/, p.isBinary
? new SO.Data.Binary(asset.data, { label: p.label ? p.label : url.url })
: new SO.Data.String(asset.data, { label: p.label ? p.label : url.url })];
}
});
}); });
},
dispose: function (_a) {
var _b, _c;
var cache = _a.cache;
(_c = (_b = cache) === null || _b === void 0 ? void 0 : _b.asset) === null || _c === void 0 ? void 0 : _c.dispose();
},
update: function (_a) {
var oldParams = _a.oldParams, newParams = _a.newParams, b = _a.b;
if (oldParams.url !== newParams.url || oldParams.isBinary !== newParams.isBinary)
return StateTransformer.UpdateResult.Recreate;
if (oldParams.label !== newParams.label) {
b.label = newParams.label || ((typeof newParams.url === 'string') ? newParams.url : newParams.url.url);
return StateTransformer.UpdateResult.Updated;
}
return StateTransformer.UpdateResult.Unchanged;
}
});
var DownloadBlob = PluginStateTransform.BuiltIn({
name: 'download-blob',
display: { name: 'Download Blob', description: 'Download multiple string or binary data from the specified URLs.' },
from: SO.Root,
to: SO.Data.Blob,
params: {
sources: PD.ObjectList({
id: PD.Text('', { label: 'Unique ID' }),
url: PD.Url('https://www.ebi.ac.uk/pdbe/static/entry/1cbs_updated.cif', { description: 'Resource URL. Must be the same domain or support CORS.' }),
isBinary: PD.Optional(PD.Boolean(false, { description: 'If true, download data as binary (string otherwise)' })),
canFail: PD.Optional(PD.Boolean(false, { description: 'Indicate whether the download can fail and not be included in the blob as a result.' }))
}, function (e) { return e.id + ": " + e.url; }),
maxConcurrency: PD.Optional(PD.Numeric(4, { min: 1, max: 12, step: 1 }, { description: 'The maximum number of concurrent downloads.' }))
}
})({
apply: function (_a, plugin) {
var _this = this;
var params = _a.params, cache = _a.cache;
return Task.create('Download Blob', function (ctx) { return __awaiter(_this, void 0, void 0, function () {
var entries, data, assets, i, r, src;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
entries = [];
return [4 /*yield*/, ajaxGetMany(ctx, plugin.managers.asset, params.sources, params.maxConcurrency || 4)];
case 1:
data = _a.sent();
assets = [];
for (i = 0; i < data.length; i++) {
r = data[i], src = params.sources[i];
if (r.kind === 'error')
plugin.log.warn("Download " + r.id + " (" + src.url + ") failed: " + r.error);
else {
assets.push(r.result);
entries.push(src.isBinary
? { id: r.id, kind: 'binary', data: r.result.data }
: { id: r.id, kind: 'string', data: r.result.data });
}
}
cache.assets = assets;
return [2 /*return*/, new SO.Data.Blob(entries, { label: 'Data Blob', description: entries.length + " " + (entries.length === 1 ? 'entry' : 'entries') })];
}
});
}); });
},
dispose: function (_a, plugin) {
var _b;
var cache = _a.cache;
var assets = (_b = cache) === null || _b === void 0 ? void 0 : _b.assets;
if (!assets)
return;
for (var _c = 0, assets_1 = assets; _c < assets_1.length; _c++) {
var a = assets_1[_c];
a.dispose();
}
}
// TODO: ??
// update({ oldParams, newParams, b }) {
// return 0 as any;
// // if (oldParams.url !== newParams.url || oldParams.isBinary !== newParams.isBinary) return StateTransformer.UpdateResult.Recreate;
// // if (oldParams.label !== newParams.label) {
// // (b.label as string) = newParams.label || newParams.url;
// // return StateTransformer.UpdateResult.Updated;
// // }
// // return StateTransformer.UpdateResult.Unchanged;
// }
});
var RawData = PluginStateTransform.BuiltIn({
name: 'raw-data',
display: { name: 'Raw Data', description: 'Raw data supplied by value.' },
from: [SO.Root],
to: [SO.Data.String, SO.Data.Binary],
params: {
data: PD.Value('', { isHidden: true }),
label: PD.Optional(PD.Text(''))
}
})({
apply: function (_a) {
var _this = this;
var p = _a.params;
return Task.create('Raw Data', function () { return __awaiter(_this, void 0, void 0, function () {
return __generator(this, function (_a) {
if (typeof p.data === 'string') {
return [2 /*return*/, new SO.Data.String(p.data, { label: p.label ? p.label : 'String' })];
}
else if (Array.isArray(p.data)) {
return [2 /*return*/, new SO.Data.Binary(new Uint8Array(p.data), { label: p.label ? p.label : 'Binary' })];
}
else if (p.data instanceof ArrayBuffer) {
return [2 /*return*/, new SO.Data.Binary(new Uint8Array(p.data), { label: p.label ? p.label : 'Binary' })];
}
else if (p.data instanceof Uint8Array) {
return [2 /*return*/, new SO.Data.Binary(p.data, { label: p.label ? p.label : 'Binary' })];
}
else {
throw new Error('Supplied binary data must be a plain array, ArrayBuffer, or Uint8Array.');
}
return [2 /*return*/];
});
}); });
},
update: function (_a) {
var oldParams = _a.oldParams, newParams = _a.newParams, b = _a.b;
if (oldParams.data !== newParams.data)
return StateTransformer.UpdateResult.Recreate;
if (oldParams.label !== newParams.label) {
b.label = newParams.label || b.label;
return StateTransformer.UpdateResult.Updated;
}
return StateTransformer.UpdateResult.Unchanged;
},
customSerialization: {
toJSON: function (p) {
if (typeof p.data === 'string' || Array.isArray(p.data)) {
return p;
}
else if (p.data instanceof ArrayBuffer) {
var v = new Uint8Array(p.data);
var data = new Array(v.length);
for (var i = 0, _i = v.length; i < _i; i++)
data[i] = v[i];
return { data: data, label: p.label };
}
else if (p.data instanceof Uint8Array) {
var data = new Array(p.data.length);
for (var i = 0, _i = p.data.length; i < _i; i++)
data[i] = p.data[i];
return { data: data, label: p.label };
}
},
fromJSON: function (data) {
return data;
}
}
});
var ReadFile = PluginStateTransform.BuiltIn({
name: 'read-file',
display: { name: 'Read File', description: 'Read string or binary data from the specified file' },
from: SO.Root,
to: [SO.Data.String, SO.Data.Binary],
params: {
file: PD.File(),
label: PD.Optional(PD.Text('')),
isBinary: PD.Optional(PD.Boolean(false, { description: 'If true, open file as as binary (string otherwise)' }))
}
})({
apply: function (_a, plugin) {
var _this = this;
var p = _a.params, cache = _a.cache;
return Task.create('Open File', function (ctx) { return __awaiter(_this, void 0, void 0, function () {
var asset, o;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
if (p.file === null) {
plugin.log.error('No file(s) selected');
return [2 /*return*/, StateObject.Null];
}
return [4 /*yield*/, plugin.managers.asset.resolve(p.file, p.isBinary ? 'binary' : 'string').runInContext(ctx)];
case 1:
asset = _a.sent();
cache.asset = asset;
o = p.isBinary
? new SO.Data.Binary(asset.data, { label: p.label ? p.label : p.file.name })
: new SO.Data.String(asset.data, { label: p.label ? p.label : p.file.name });
return [2 /*return*/, o];
}
});
}); });
},
dispose: function (_a) {
var _b, _c;
var cache = _a.cache;
(_c = (_b = cache) === null || _b === void 0 ? void 0 : _b.asset) === null || _c === void 0 ? void 0 : _c.dispose();
},
update: function (_a) {
var _b;
var oldParams = _a.oldParams, newParams = _a.newParams, b = _a.b;
if (oldParams.label !== newParams.label) {
b.label = newParams.label || ((_b = oldParams.file) === null || _b === void 0 ? void 0 : _b.name) || '';
return StateTransformer.UpdateResult.Updated;
}
return StateTransformer.UpdateResult.Unchanged;
},
isSerializable: function () { return ({ isSerializable: false, reason: 'Cannot serialize user loaded files.' }); }
});
var ParseBlob = PluginStateTransform.BuiltIn({
name: 'parse-blob',
display: { name: 'Parse Blob', description: 'Parse multiple data enties' },
from: SO.Data.Blob,
to: SO.Format.Blob,
params: {
formats: PD.ObjectList({
id: PD.Text('', { label: 'Unique ID' }),
format: PD.Select('cif', [['cif', 'cif']])
}, function (e) { return e.id + ": " + e.format; })
}
})({
apply: function (_a, plugin) {
var _this = this;
var a = _a.a, params = _a.params;
return Task.create('Parse Blob', function (ctx) { return __awaiter(_this, void 0, void 0, function () {
var map, _a, _b, f, entries, _c, _d, e, parsed;
return __generator(this, function (_e) {
switch (_e.label) {
case 0:
map = new Map();
for (_a = 0, _b = params.formats; _a < _b.length; _a++) {
f = _b[_a];
map.set(f.id, f.format);
}
entries = [];
_c = 0, _d = a.data;
_e.label = 1;
case 1:
if (!(_c < _d.length)) return [3 /*break*/, 4];
e = _d[_c];
if (!map.has(e.id))
return [3 /*break*/, 3];
return [4 /*yield*/, (e.kind === 'string' ? CIF.parse(e.data) : CIF.parseBinary(e.data)).runInContext(ctx)];
case 2:
parsed = _e.sent();
if (parsed.isError)
throw new Error(e.id + ": " + parsed.message);
entries.push({ id: e.id, kind: 'cif', data: parsed.result });
_e.label = 3;
case 3:
_c++;
return [3 /*break*/, 1];
case 4: return [2 /*return*/, new SO.Format.Blob(entries, { label: 'Format Blob', description: entries.length + " " + (entries.length === 1 ? 'entry' : 'entries') })];
}
});
}); });
},
// TODO: ??
// update({ oldParams, newParams, b }) {
// return 0 as any;
// // if (oldParams.url !== newParams.url || oldParams.isBinary !== newParams.isBinary) return StateTransformer.UpdateResult.Recreate;
// // if (oldParams.label !== newParams.label) {
// // (b.label as string) = newParams.label || newParams.url;
// // return StateTransformer.UpdateResult.Updated;
// // }
// // return StateTransformer.UpdateResult.Unchanged;
// }
});
var ParseCif = PluginStateTransform.BuiltIn({
name: 'parse-cif',
display: { name: 'Parse CIF', description: 'Parse CIF from String or Binary data' },
from: [SO.Data.String, SO.Data.Binary],
to: SO.Format.Cif
})({
apply: function (_a) {
var _this = this;
var a = _a.a;
return Task.create('Parse CIF', function (ctx) { return __awaiter(_this, void 0, void 0, function () {
var parsed;
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, (SO.Data.String.is(a) ? CIF.parse(a.data) : CIF.parseBinary(a.data)).runInContext(ctx)];
case 1:
parsed = _a.sent();
if (parsed.isError)
throw new Error(parsed.message);
return [2 /*return*/, new SO.Format.Cif(parsed.result)];
}
});
}); });
}
});
var ParseCube = PluginStateTransform.BuiltIn({
name: 'parse-cube',
display: { name: 'Parse Cube', description: 'Parse Cube from String data' },
from: SO.Data.String,
to: SO.Format.Cube
})({
apply: function (_a) {
var _this = this;
var a = _a.a;
return Task.create('Parse Cube', function (ctx) { return __awaiter(_this, void 0, void 0, function () {
var parsed;
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, parseCube(a.data, a.label).runInContext(ctx)];
case 1:
parsed = _a.sent();
if (parsed.isError)
throw new Error(parsed.message);
return [2 /*return*/, new SO.Format.Cube(parsed.result)];
}
});
}); });
}
});
var ParsePsf = PluginStateTransform.BuiltIn({
name: 'parse-psf',
display: { name: 'Parse PSF', description: 'Parse PSF from String data' },
from: [SO.Data.String],
to: SO.Format.Psf
})({
apply: function (_a) {
var _this = this;
var a = _a.a;
return Task.create('Parse PSF', function (ctx) { return __awaiter(_this, void 0, void 0, function () {
var parsed;
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, parsePsf(a.data).runInContext(ctx)];
case 1:
parsed = _a.sent();
if (parsed.isError)
throw new Error(parsed.message);
return [2 /*return*/, new SO.Format.Psf(parsed.result)];
}
});
}); });
}
});
var ParsePly = PluginStateTransform.BuiltIn({
name: 'parse-ply',
display: { name: 'Parse PLY', description: 'Parse PLY from String data' },
from: [SO.Data.String],
to: SO.Format.Ply
})({
apply: function (_a) {
var _this = this;
var a = _a.a;
return Task.create('Parse PLY', function (ctx) { return __awaiter(_this, void 0, void 0, function () {
var parsed;
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, PLY.parsePly(a.data).runInContext(ctx)];
case 1:
parsed = _a.sent();
if (parsed.isError)
throw new Error(parsed.message);
return [2 /*return*/, new SO.Format.Ply(parsed.result, { label: parsed.result.comments[0] || 'PLY Data' })];
}
});
}); });
}
});
var ParseCcp4 = PluginStateTransform.BuiltIn({
name: 'parse-ccp4',
display: { name: 'Parse CCP4/MRC/MAP', description: 'Parse CCP4/MRC/MAP from Binary data' },
from: [SO.Data.Binary],
to: SO.Format.Ccp4
})({
apply: function (_a) {
var _this = this;
var a = _a.a;
return Task.create('Parse CCP4/MRC/MAP', function (ctx) { return __awaiter(_this, void 0, void 0, function () {
var parsed;
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, CCP4.parse(a.data, a.label).runInContext(ctx)];
case 1:
parsed = _a.sent();
if (parsed.isError)
throw new Error(parsed.message);
return [2 /*return*/, new SO.Format.Ccp4(parsed.result)];
}
});
}); });
}
});
var ParseDsn6 = PluginStateTransform.BuiltIn({
name: 'parse-dsn6',
display: { name: 'Parse DSN6/BRIX', description: 'Parse CCP4/BRIX from Binary data' },
from: [SO.Data.Binary],
to: SO.Format.Dsn6
})({
apply: function (_a) {
var _this = this;
var a = _a.a;
return Task.create('Parse DSN6/BRIX', function (ctx) { return __awaiter(_this, void 0, void 0, function () {
var parsed;
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, DSN6.parse(a.data, a.label).runInContext(ctx)];
case 1:
parsed = _a.sent();
if (parsed.isError)
throw new Error(parsed.message);
return [2 /*return*/, new SO.Format.Dsn6(parsed.result)];
}
});
}); });
}
});
var ParseDx = PluginStateTransform.BuiltIn({
name: 'parse-dx',
display: { name: 'Parse DX', description: 'Parse DX from Binary/String data' },
from: [SO.Data.Binary, SO.Data.String],
to: SO.Format.Dx
})({
apply: function (_a) {
var _this = this;
var a = _a.a;
return Task.create('Parse DX', function (ctx) { return __awaiter(_this, void 0, void 0, function () {
var parsed;
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, parseDx(a.data, a.label).runInContext(ctx)];
case 1:
parsed = _a.sent();
if (parsed.isError)
throw new Error(parsed.message);
return [2 /*return*/, new SO.Format.Dx(parsed.result)];
}
});
}); });
}
});
var ImportString = PluginStateTransform.BuiltIn({
name: 'import-string',
display: { name: 'Import String', description: 'Import given data as a string' },
from: SO.Root,
to: SO.Data.String,
params: {
data: PD.Value(''),
label: PD.Optional(PD.Text('')),
}
})({
apply: function (_a) {
var _b = _a.params, data = _b.data, label = _b.label;
return new SO.Data.String(data, { label: label || '' });
},
update: function (_a) {
var oldParams = _a.oldParams, newParams = _a.newParams, b = _a.b;
if (oldParams.data !== newParams.data)
return StateTransformer.UpdateResult.Recreate;
if (oldParams.label !== newParams.label) {
b.label = newParams.label || '';
return StateTransformer.UpdateResult.Updated;
}
return StateTransformer.UpdateResult.Unchanged;
},
isSerializable: function () { return ({ isSerializable: false, reason: 'Cannot serialize user imported strings.' }); }
});
var ImportJson = PluginStateTransform.BuiltIn({
name: 'import-json',
display: { name: 'Import JSON', description: 'Import given data as a JSON' },
from: SO.Root,
to: SO.Format.Json,
params: {
data: PD.Value({}),
label: PD.Optional(PD.Text('')),
}
})({
apply: function (_a) {
var _b = _a.params, data = _b.data, label = _b.label;
return new SO.Format.Json(data, { label: label || '' });
},
update: function (_a) {
var oldParams = _a.oldParams, newParams = _a.newParams, b = _a.b;
if (oldParams.data !== newParams.data)
return StateTransformer.UpdateResult.Recreate;
if (oldParams.label !== newParams.label) {
b.label = newParams.label || '';
return StateTransformer.UpdateResult.Updated;
}
return StateTransformer.UpdateResult.Unchanged;
},
isSerializable: function () { return ({ isSerializable: false, reason: 'Cannot serialize user imported JSON.' }); }
});
var ParseJson = PluginStateTransform.BuiltIn({
name: 'parse-json',
display: { name: 'Parse JSON', description: 'Parse JSON from String data' },
from: [SO.Data.String],
to: SO.Format.Json
})({
apply: function (_a) {
var _this = this;
var a = _a.a;
return Task.create('Parse JSON', function (ctx) { return __awaiter(_this, void 0, void 0, function () {
var json;
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, (new Response(a.data)).json()];
case 1:
json = _a.sent();
return [2 /*return*/, new SO.Format.Json(json)];
}
});
}); });
}
});
var LazyVolume = PluginStateTransform.BuiltIn({
name: 'lazy-volume',
display: { name: 'Lazy Volume', description: 'A placeholder for lazy loaded volume representation' },
from: SO.Root,
to: SO.Volume.Lazy,
params: {
url: PD.Url(''),
isBinary: PD.Boolean(false),
format: PD.Text('ccp4'),
entryId: PD.Value('', { isHidden: true }),
isovalues: PD.ObjectList({
type: PD.Text('relative'),
value: PD.Numeric(0),
color: PD.Color(ColorNames.black),
alpha: PD.Numeric(1, { min: 0, max: 1, step: 0.01 }),
volumeIndex: PD.Numeric(0),
}, function (e) { return e.type + " " + e.value; })
}
})({
apply: function (_a) {
var _this = this;
var a = _a.a, params = _a.params;
return Task.create('Lazy Volume', function (ctx) { return __awaiter(_this, void 0, void 0, function () {
var entryId;
return __generator(this, function (_a) {
entryId = Array.isArray(params.entryId) ? params.entryId.join(', ') : params.entryId;
return [2 /*return*/, new SO.Volume.Lazy(params, { label: "" + (entryId || params.url), description: 'Lazy Volume' })];
});
}); });
}
});
//# sourceMappingURL=data.js.map