Skip to content
Snippets Groups Projects
Commit 70fc1a95 authored by Alexander Rose's avatar Alexander Rose
Browse files

support residue ranges in jmol atom expressions

parent f27ec4d6
No related merge requests found
...@@ -81,6 +81,12 @@ const general = { ...@@ -81,6 +81,12 @@ const general = {
'20', '20',
// within in the head or the middle of sentence // within in the head or the middle of sentence
'within ( 5 , [HEM] ) and backbone', 'within ( 5 , [HEM] ) and backbone',
// atom expressions with ranges
'19-32:A',
'-2-32:B',
'-10--2:C',
'[1FO]19-32:A',
], ],
unsupported: [ unsupported: [
// values outside of comparisons // values outside of comparisons
......
...@@ -86,7 +86,7 @@ const valueOperators: OperatorList = [ ...@@ -86,7 +86,7 @@ const valueOperators: OperatorList = [
]; ];
function atomExpressionQuery(x: any[]) { function atomExpressionQuery(x: any[]) {
const [resname, resno, inscode, chainname, atomname, altloc] = x[1]; const [resname, resnoRange, resno, inscode, chainname, atomname, altloc] = x[1];
const tests: AtomGroupArgs = {}; const tests: AtomGroupArgs = {};
if (chainname) { if (chainname) {
...@@ -96,6 +96,10 @@ function atomExpressionQuery(x: any[]) { ...@@ -96,6 +96,10 @@ function atomExpressionQuery(x: any[]) {
const resProps = []; const resProps = [];
if (resname) resProps.push(B.core.rel.eq([B.ammp('label_comp_id'), resname])); if (resname) resProps.push(B.core.rel.eq([B.ammp('label_comp_id'), resname]));
if (resnoRange) resProps.push(B.core.logic.and([
B.core.rel.gre([B.ammp('auth_seq_id'), resnoRange[0]]),
B.core.rel.lte([B.ammp('auth_seq_id'), resnoRange[1]])
]));
if (resno) resProps.push(B.core.rel.eq([B.ammp('auth_seq_id'), resno])); if (resno) resProps.push(B.core.rel.eq([B.ammp('auth_seq_id'), resno]));
if (inscode) resProps.push(B.core.rel.eq([B.ammp('pdbx_PDB_ins_code'), inscode])); if (inscode) resProps.push(B.core.rel.eq([B.ammp('pdbx_PDB_ins_code'), inscode]));
if (resProps.length) tests['residue-test'] = h.andExpr(resProps); if (resProps.length) tests['residue-test'] = h.andExpr(resProps);
...@@ -123,15 +127,6 @@ const lang = P.MonadicParser.createLanguage({ ...@@ -123,15 +127,6 @@ const lang = P.MonadicParser.createLanguage({
return P.MonadicParser.alt( return P.MonadicParser.alt(
r.Keywords, r.Keywords,
r.ResnoRange.map((x: [number, number]) => B.struct.generator.atomGroups({
'residue-test': B.core.logic.and([
B.core.rel.gre([B.ammp('auth_seq_id'), x[0]]),
B.core.rel.lte([B.ammp('auth_seq_id'), x[1]])
])
})),
r.Resno.lookahead(P.MonadicParser.regexp(/\s*(?!(LIKE|>=|<=|!=|[\[:^%/.=><]))/i)).map((x: number) => B.struct.generator.atomGroups({
'residue-test': B.core.rel.eq([B.ammp('auth_seq_id'), x])
})),
r.AtomExpression.map(atomExpressionQuery), r.AtomExpression.map(atomExpressionQuery),
r.Within.map((x: [number, Expression]) => B.struct.modifier.includeSurroundings({ 0: x[1], radius: x[0] })), r.Within.map((x: [number, Expression]) => B.struct.modifier.includeSurroundings({ 0: x[1], radius: x[0] })),
...@@ -155,6 +150,7 @@ const lang = P.MonadicParser.createLanguage({ ...@@ -155,6 +150,7 @@ const lang = P.MonadicParser.createLanguage({
P.MonadicParser.lookahead(r.AtomPrefix), P.MonadicParser.lookahead(r.AtomPrefix),
P.MonadicParser.seq( P.MonadicParser.seq(
r.BracketedResname.or(P.MonadicParser.of(null)), r.BracketedResname.or(P.MonadicParser.of(null)),
r.ResnoRange.or(P.MonadicParser.of(null)),
r.Resno.or(P.MonadicParser.of(null)), r.Resno.or(P.MonadicParser.of(null)),
r.Inscode.or(P.MonadicParser.of(null)), r.Inscode.or(P.MonadicParser.of(null)),
r.Chainname.or(P.MonadicParser.of(null)), r.Chainname.or(P.MonadicParser.of(null)),
...@@ -165,7 +161,7 @@ const lang = P.MonadicParser.createLanguage({ ...@@ -165,7 +161,7 @@ const lang = P.MonadicParser.createLanguage({
).desc('expression'); ).desc('expression');
}, },
AtomPrefix: () => P.MonadicParser.regexp(/[\[0-9:^%/.]/).desc('atom-prefix'), AtomPrefix: () => P.MonadicParser.regexp(/[\[0-9:^%/.-]/).desc('atom-prefix'),
Chainname: () => P.MonadicParser.regexp(/:([A-Za-z]{1,3})/, 1).desc('chainname'), Chainname: () => P.MonadicParser.regexp(/:([A-Za-z]{1,3})/, 1).desc('chainname'),
Model: () => P.MonadicParser.regexp(/\/([0-9]+)/, 1).map(Number).desc('model'), Model: () => P.MonadicParser.regexp(/\/([0-9]+)/, 1).map(Number).desc('model'),
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment