molstar
Version:
A comprehensive macromolecular library.
307 lines • 13.2 kB
JavaScript
/**
* Copyright (c) 2017-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>
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.getCifFieldType = exports.getTensor = exports.tensorFieldNameGetter = exports.CifField = exports.CifCategory = exports.CifSaveFrame = exports.CifBlock = exports.CifFile = void 0;
var tslib_1 = require("tslib");
var db_1 = require("../../../mol-data/db");
var number_parser_1 = require("../common/text/number-parser");
var token_1 = require("../common/text/column/token");
function CifFile(blocks, name) {
return { name: name, blocks: blocks };
}
exports.CifFile = CifFile;
function CifBlock(categoryNames, categories, header, saveFrames) {
if (saveFrames === void 0) { saveFrames = []; }
return {
categoryNames: categoryNames,
header: header,
categories: categories,
saveFrames: saveFrames,
getField: function (name) {
var _a = name.split('.'), category = _a[0], field = _a[1];
return categories[category].getField(field || '');
}
};
}
exports.CifBlock = CifBlock;
function CifSaveFrame(categoryNames, categories, header) {
return { categoryNames: categoryNames, header: header, categories: categories };
}
exports.CifSaveFrame = CifSaveFrame;
function CifCategory(name, rowCount, fieldNames, fields) {
return { rowCount: rowCount, name: name, fieldNames: (0, tslib_1.__spreadArray)([], fieldNames, true), getField: function (name) { return fields[name]; } };
}
exports.CifCategory = CifCategory;
(function (CifCategory) {
function empty(name) {
return { rowCount: 0, name: name, fieldNames: [], getField: function (name) { return void 0; } };
}
CifCategory.empty = empty;
;
function ofFields(name, fields) {
var fieldNames = Object.keys(fields);
return {
rowCount: fieldNames.length > 0 ? fields[fieldNames[0]].rowCount : 0,
name: name,
fieldNames: fieldNames,
getField: function (name) { return fields[name]; }
};
}
CifCategory.ofFields = ofFields;
function ofTable(name, table) {
var fields = {};
for (var _a = 0, _b = table._columns; _a < _b.length; _a++) {
var name_1 = _b[_a];
fields[name_1] = CifField.ofColumn(table[name_1]);
}
return ofFields(name, fields);
}
CifCategory.ofTable = ofTable;
})(CifCategory = exports.CifCategory || (exports.CifCategory = {}));
var CifField;
(function (CifField) {
function ofString(value) {
return ofStrings([value]);
}
CifField.ofString = ofString;
function ofStrings(values) {
var rowCount = values.length;
var str = function (row) { var ret = values[row]; if (!ret || ret === '.' || ret === '?')
return ''; return ret; };
var int = function (row) { var v = values[row]; return (0, number_parser_1.parseInt)(v, 0, v.length) || 0; };
var float = function (row) { var v = values[row]; return (0, number_parser_1.parseFloat)(v, 0, v.length) || 0; };
var valueKind = function (row) {
var v = values[row], l = v.length;
if (l > 1)
return 0 /* Present */;
if (l === 0)
return 1 /* NotPresent */;
var c = v.charCodeAt(0);
if (c === 46 /* . */)
return 1 /* NotPresent */;
if (c === 63 /* ? */)
return 2 /* Unknown */;
return 0 /* Present */;
};
return {
__array: void 0,
binaryEncoding: void 0,
isDefined: true,
rowCount: rowCount,
str: str,
int: int,
float: float,
valueKind: valueKind,
areValuesEqual: function (rowA, rowB) { return values[rowA] === values[rowB]; },
toStringArray: function (params) { return params ? db_1.ColumnHelpers.createAndFillArray(rowCount, str, params) : values; },
toIntArray: function (params) { return db_1.ColumnHelpers.createAndFillArray(rowCount, int, params); },
toFloatArray: function (params) { return db_1.ColumnHelpers.createAndFillArray(rowCount, float, params); }
};
}
CifField.ofStrings = ofStrings;
function ofNumbers(values) {
var rowCount = values.length;
var str = function (row) { return '' + values[row]; };
var float = function (row) { return values[row]; };
var valueKind = function (row) { return 0 /* Present */; };
var toFloatArray = function (params) {
if (!params || params.array && values instanceof params.array) {
return values;
}
else {
return db_1.ColumnHelpers.createAndFillArray(rowCount, float, params);
}
};
return {
__array: void 0,
binaryEncoding: void 0,
isDefined: true,
rowCount: rowCount,
str: str,
int: float,
float: float,
valueKind: valueKind,
areValuesEqual: function (rowA, rowB) { return values[rowA] === values[rowB]; },
toStringArray: function (params) { return db_1.ColumnHelpers.createAndFillArray(rowCount, str, params); },
toIntArray: toFloatArray,
toFloatArray: toFloatArray
};
}
CifField.ofNumbers = ofNumbers;
function ofTokens(tokens) {
var data = tokens.data, indices = tokens.indices, rowCount = tokens.count;
var str = function (row) {
var ret = data.substring(indices[2 * row], indices[2 * row + 1]);
if (ret === '.' || ret === '?')
return '';
return ret;
};
var int = function (row) {
return (0, number_parser_1.parseInt)(data, indices[2 * row], indices[2 * row + 1]) || 0;
};
var float = function (row) {
return (0, number_parser_1.parseFloat)(data, indices[2 * row], indices[2 * row + 1]) || 0;
};
var valueKind = function (row) {
var s = indices[2 * row], l = indices[2 * row + 1] - s;
if (l > 1)
return 0 /* Present */;
if (l === 0)
return 1 /* NotPresent */;
var v = data.charCodeAt(s);
if (v === 46 /* . */)
return 1 /* NotPresent */;
if (v === 63 /* ? */)
return 2 /* Unknown */;
return 0 /* Present */;
};
return {
__array: void 0,
binaryEncoding: void 0,
isDefined: true,
rowCount: rowCount,
str: str,
int: int,
float: float,
valueKind: valueKind,
areValuesEqual: (0, token_1.areValuesEqualProvider)(tokens),
toStringArray: function (params) { return db_1.ColumnHelpers.createAndFillArray(rowCount, str, params); },
toIntArray: function (params) { return db_1.ColumnHelpers.createAndFillArray(rowCount, int, params); },
toFloatArray: function (params) { return db_1.ColumnHelpers.createAndFillArray(rowCount, float, params); }
};
}
CifField.ofTokens = ofTokens;
function ofColumn(column) {
var rowCount = column.rowCount, valueKind = column.valueKind, areValuesEqual = column.areValuesEqual, isDefined = column.isDefined;
var str;
var int;
var float;
switch (column.schema.valueType) {
case 'float':
case 'int':
str = function (row) { return '' + column.value(row); };
int = column.value;
float = column.value;
break;
case 'str':
str = column.value;
int = function (row) { var v = column.value(row); return (0, number_parser_1.parseInt)(v, 0, v.length) || 0; };
float = function (row) { var v = column.value(row); return (0, number_parser_1.parseFloat)(v, 0, v.length) || 0; };
break;
case 'list':
var separator_1 = column.schema.separator;
str = function (row) { return column.value(row).join(separator_1); };
int = function (row) { return NaN; };
float = function (row) { return NaN; };
break;
default:
throw new Error("unsupported valueType '" + column.schema.valueType + "'");
}
return {
__array: void 0,
binaryEncoding: void 0,
isDefined: isDefined,
rowCount: rowCount,
str: str,
int: int,
float: float,
valueKind: valueKind,
areValuesEqual: areValuesEqual,
toStringArray: function (params) { return db_1.ColumnHelpers.createAndFillArray(rowCount, str, params); },
toIntArray: function (params) { return db_1.ColumnHelpers.createAndFillArray(rowCount, int, params); },
toFloatArray: function (params) { return db_1.ColumnHelpers.createAndFillArray(rowCount, float, params); }
};
}
CifField.ofColumn = ofColumn;
function ofUndefined(rowCount, schema) {
return ofColumn(db_1.Column.Undefined(rowCount, schema));
}
CifField.ofUndefined = ofUndefined;
})(CifField = exports.CifField || (exports.CifField = {}));
function tensorFieldNameGetter(field, rank, zeroIndexed, namingVariant) {
var offset = zeroIndexed ? 0 : 1;
switch (rank) {
case 1:
return namingVariant === 'brackets'
? function (i) { return field + "[" + (i + offset) + "]"; }
: function (i) { return field + "_" + (i + offset); };
case 2:
return namingVariant === 'brackets'
? function (i, j) { return field + "[" + (i + offset) + "][" + (j + offset) + "]"; }
: function (i, j) { return field + "_" + (i + offset) + (j + offset); };
case 3:
return namingVariant === 'brackets'
? function (i, j, k) { return field + "[" + (i + offset) + "][" + (j + offset) + "][" + (k + offset) + "]"; }
: function (i, j, k) { return field + "_" + (i + offset) + (j + offset) + (k + offset); };
default:
throw new Error('Tensors with rank > 3 or rank 0 are currently not supported.');
}
}
exports.tensorFieldNameGetter = tensorFieldNameGetter;
function getTensor(category, space, row, getName) {
var ret = space.create();
if (space.rank === 1) {
var rows = space.dimensions[0];
for (var i = 0; i < rows; i++) {
var f = category.getField(getName(i));
space.set(ret, i, !!f ? f.float(row) : 0.0);
}
}
else if (space.rank === 2) {
var rows = space.dimensions[0], cols = space.dimensions[1];
for (var i = 0; i < rows; i++) {
for (var j = 0; j < cols; j++) {
var f = category.getField(getName(i, j));
space.set(ret, i, j, !!f ? f.float(row) : 0.0);
}
}
}
else if (space.rank === 3) {
var d0 = space.dimensions[0], d1 = space.dimensions[1], d2 = space.dimensions[2];
for (var i = 0; i < d0; i++) {
for (var j = 0; j < d1; j++) {
for (var k = 0; k < d2; k++) {
var f = category.getField(getName(i, j, k));
space.set(ret, i, j, k, !!f ? f.float(row) : 0.0);
}
}
}
}
else {
throw new Error('Tensors with rank > 3 or rank 0 are currently not supported.');
}
return ret;
}
exports.getTensor = getTensor;
function getCifFieldType(field) {
var floatCount = 0, hasStringOrScientific = false, undefinedCount = 0;
for (var i = 0, _i = field.rowCount; i < _i; i++) {
var k = field.valueKind(i);
if (k !== 0 /* Present */) {
undefinedCount++;
continue;
}
var type = (0, number_parser_1.getNumberType)(field.str(i));
if (type === 0 /* Int */)
continue;
else if (type === 1 /* Float */)
floatCount++;
else {
hasStringOrScientific = true;
break;
}
}
// numbers in scientific notation and plain text are not distinguishable
if (hasStringOrScientific || undefinedCount === field.rowCount)
return db_1.Column.Schema.str;
if (floatCount > 0)
return db_1.Column.Schema.float;
return db_1.Column.Schema.int;
}
exports.getCifFieldType = getCifFieldType;
//# sourceMappingURL=data-model.js.map
;