molstar
Version:
A comprehensive macromolecular library.
59 lines • 2.51 kB
JavaScript
/**
* Copyright (c) 2021 mol* contributors, licensed under MIT, See LICENSE file for more info.
*
* @author David Sehnal <david.sehnal@gmail.com>
*/
import { MolScriptBuilder as MS } from '../language/builder';
import { compile } from '../runtime/query/base';
function entriesToQuery(xs, kind) {
var _a;
var groups = [];
var asym_id_key = kind === 'auth' ? 'auth_asym_id' : 'label_asym_id';
var seq_id_key = kind === 'auth' ? 'auth_seq_id' : 'label_seq_id';
for (var _i = 0, xs_1 = xs; _i < xs_1.length; _i++) {
var x = xs_1[_i];
if (x.kind === 'range') {
groups.push(MS.struct.generator.atomGroups({
'chain-test': MS.core.rel.eq([MS.ammp(asym_id_key), x.asym_id]),
'residue-test': MS.core.rel.inRange([MS.ammp(seq_id_key), x.seq_id_beg, x.seq_id_end])
}));
}
else {
var ins_code = ((_a = x.ins_code) !== null && _a !== void 0 ? _a : '').trim();
groups.push(MS.struct.generator.atomGroups({
'chain-test': MS.core.rel.eq([MS.ammp(asym_id_key), x.asym_id]),
'residue-test': MS.core.logic.and([
MS.core.rel.eq([MS.ammp(seq_id_key), x.seq_id]),
MS.core.rel.eq([MS.ammp('pdbx_PDB_ins_code'), ins_code])
])
}));
}
}
var query = MS.struct.combinator.merge(groups);
return compile(query);
}
function parseRange(c, s, e) {
if (!c || s.length === 0 || Number.isNaN(+s[0]))
return;
if (Number.isNaN(e)) {
return { kind: 'single', asym_id: c, seq_id: +s[0], ins_code: s[1] };
}
return { kind: 'range', asym_id: c, seq_id_beg: +s[0], seq_id_end: e };
}
function parseInsCode(e) {
if (!e)
return [];
return e.split(':');
}
function parseResidueListSelection(input) {
return input.split(',') // A 1-3, B 3 => [A 1-3, B 3]
.map(function (e) { return e.trim().split(/\s+|[-]/g).filter(function (e) { return !!e; }); }) // [A 1-3, B 3] => [[A, 1, 3], [B, 3]]
.map(function (e) { return parseRange(e[0], parseInsCode(e[1]), +e[2]); })
.filter(function (e) { return !!e; });
}
// parses a list of residue ranges, e.g. A 10-100, B 30, C 12:i
export function compileResidueListSelection(input, idType) {
var entries = parseResidueListSelection(input);
return entriesToQuery(entries, idType);
}
//# sourceMappingURL=residue-list.js.map