INTRODUCTION TO MOLECULAR MATH IN JMOL -- Part I
OK, I think you will find that the "molecular math" that you can do in
Jmol is quite an
advance over 11.0. Basically what you can do is assign variables to all
sorts of quantities -- true/false conditions, integer and real numbers,
strings, atom sets, bond sets, and points and planes in space. That
should cover us!
All the standard math is supported, including +-*/() and % (modulus):
x = (3.0 * ({oxygen} + {hydrogen}) / 2
z = "the number of oxygen atoms is " + {oxygen}.size
isSaturated = ((2.0 * {carbon} + 2 + {nitrogen} - {hydrogen}) == 0)
Note that the simple phrasing {...} means two different things in two
contexts. In a numeric context, it means the number of atoms. In a
string context, it means a listing of the atoms in a special Jmol 11 format:
x = "the oxygen atoms are " + {oxygen}
gives for caffeine:
>>> x = "the oxygen atoms are ({8 10})"
This allows saving of variables such as this in the state - they are
just strings, but they are special strings. Bonds are saved the same
way, but with square brackets instead of parentheses:
set bondMode or; x = "the bonds to oxygen are " + {oxygen}.bonds
>>> x = "the bonds to oxygen are [{10 13}]"
Anything that can be done in a SELECT command can be put between braces
and evaluated:
y = {oxygen and not atomno < 3}
This delivers TWO answers:
y_set = "({8 10})"
y = 2
You can use both of these in later commands:
x = y * 5
xBonds = y_set.bonds
and, especially interesting, you can use the "set" version in SELECT
commands:
select y_set; color red;
select xBonds; color bonds green; # yes, this selects just those bonds
The following functions are available, shown with examples:
Distance(a,b)
Angle(a,b,c)
Angle(a,b,c,d)
------------
the a-b distance, angle a-b-c or dihedral a-b-c-d, where a, b, c, and d
are any combination of expressions that can be evaluated to a point,
including atom expressions, xyz coordinates, fractional coordinates, or
draw objects.
xAB = distance({oxygen}[1],{oxygen}[2])
xAngle = angle({C1},{C2},{C3})
xAngle = angle({C1},{C2},{0 0.5 0.5})
xAngle = angle({carbon}[1],{carbon}[2],{carbon}[3])
draw pt {2 2 2}; xAngle = angle({0 0 0},$pt,{atomno=3})
Data({atoms},"format")
----------------
The Data() function generates XYZ, MOL, or PDB code for the specified
subset of atoms.
xyzData = data({selected},"xyz")
xyzData = data({not solvent},"pdb")
The PDB file format does not include connections at this point.
In conjunction with new DATA and WRITE capabilities, the Data() function
allows for extracting
out specific parts of the model to files using the application:
load 1blu.pdb
x = data({within(5.0, iron)}, "pdb")
write VAR x ironCenter.pdb
or, do display but not save, a new option for the DATA command:
load 1blu.pdb
x = data({within(5.0, iron)}, "pdb")
DATA "model @x"
Note that @x can be used in just about any command as a variable:
xCenter = {0.0 0.0 0.0};
xAtom = {atomno=3}.xyz;
draw line1 @xCenter @xAtom
Load("filename")
----------------
Variables can be loaded with string data from files. Combined with the DATA
command, this allows for a new way to load a model:
x = load("caffeine.xyz")
DATA "model @x"
With the .lines method (given below), this also allows for
loading a file and then displaying only certain lines, or
loading specific lines:
x = load("mydata.dat").lines[1][15] #only the first 15 lines of a file.
x = load("caffeine.xyz")
y = x.lines[x.lines.size-2][x.lines.size] #only the last three lines
Connected(nMin,nMax,"type",{a})
Connected(dMin,dMax,"type",{a},{b})
-----------------------------
As for SELECT, the first of these Connected() function finds all atoms
that are connected to atoms of the specified atom set by the specified
number and type of bonds. All of the parameters
are optional.
x = connected(3,"single",{carbon})
xMethylCarbon = connected(3, {hydrogen})
select connected("double",{carbon})
The second is a new function that mirrors what the CONNECT command does.
In this case, though,
it only selects for the BONDS of the given type (which may be omitted).
Note that the return
from this function is a set of bonds, not atoms. Thus, we have:
select connected(1.2,1.3,{carbon},{oxygen});color bonds green
or:
x = connected(1.2,1.3,{carbon},{oxygen})
connect @x_set red double
Here x_set gets defined as the set of bonds; @x_set is how that is
referenced in the connect command.
Substructure("smiles-string")
-----------------------------
This is the same as in Jmol 10.2. For example:
select substructure("[C]=[O]")
selects four atoms. So does the following, but we can then use modifiers
to get more:
x = substructure("[C]=[O]").bonds.label("%-4a1 %-4a2 %6.3LENGTH")
reports:
O11 C5 1.245
O9 C6 1.251
Within("group|chain|molecule|etc...",a)
Within(distance,a)
Within("plane",{a b c d})
Within("hkl",{h k l})
Within(distance,plane,{a b c d})
Within(distance,hkl,{h k l})
Within("sequenceData")
-------------------------------------
The within() function operates the same as SELECT, delivering an atom
set matching the designation. With 11.1.15, the syntax used in SELECT
for functions is extended to match
the syntax for IF and SET:
select within(group, oxygen) # old way, still usable
select within("group", {oxygen}) # new way -- matches IF and SET:
x = within("group", {oxygen})
This also means that we can use "item selectors" in SELECT:
select within("molecule", {oxygen}[2])
Or, for that last molecule:
select within("molecule", {*}[{*}])
(This works because [n] selects the nth atom, and {*} evaluates to the
number of atoms, so {*}[{*}] evaluates to "the last atom in the model"
-- and then we find its molecule.)
I'll save the modifier functions
.atoms
.bonds
.distance(a)
.find("string")
.ident
.label("formatString")
.length
.lines
.size
.x, .y, .z
.xyz
and all the atom properties such as .temperature, .phi, .bondcount,
etc., for another posting.
Bob
-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys-and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
Jmol-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/jmol-users