Jmol 11.1.14 represents a major step forward in script processing
ability in Jmol.
The history of variables in Jmol goes something like this:
Jmol 10.2 -- only a select few values determined by Jmol
SET loglevel 5
SET testflag1 true
Jmol 11.0 -- user-settable True/False variables and IF/ELSE/ENDIF syntax
SET myVariable True
IF (myVariable);...;else;...;endif;
Jmol 11.1.14 -- full range of arithmetic operations on user-defined
variables of six different types:
boolean, integer, decimal, string, point, and atomExpression (see
below) and a more natural
"x = ..." equivalent to SET:
degUnsat = ({carbon} * 2 + {nitrogen} + 2 - {hydrogen}) / 2
11.1.14 NEW FEATURES
--------------------
"UNSPECIFIED" and "QUADRUPLE" BOND TYPES
An additional bond type is now avaiable: "UNSPECIFIED".
This shows up in the MOL2 reader and may be selected for and modified
using, for example:
select connected(unspecified)
color bonds red
or
select connected(unspecified)
connect (selected) single modify
In addition, we now can depict quadruple bonds.
DYNAMIC MEASUREMENTS
Now that we can move atoms so easily, we don't want those
measurements getting stale.
set dynamicMeasurements
allows measurements to be recalculated on the fly.
MATH OPERATOR PRECEDENCE AND PARENTHESES
Jmol 11.1.14 supports full standard operator precedence and parentheses
in IF, SET, and %{} expressions
degUnsat = ({carbon} * 2 + {nitrogen} + 2 - {hydrogen}) / 2
BRACES INDICATE ATOM EXPRESSIONS
Use {} in IF, SET and %{} for designating atom expressions.
We are still using () for "embedded expressions" in all other commands.
nOxygen = {oxygen}
xOxygen = {oxygen}.x
ptOxygen = {oxygen.xyz}
a = {oxygen}.temperature
message %{{carbon}.x}
if {O22}.bondCount > 2;goto ...
but (still)
draw line1 (atomno=2) {1.0 1.3 1.5)
ATOM EXPRESSION ITEM SELECTOR [n]
In SET, IF, and %{ } in MESSAGE and ECHO you can now specify a subset
of the
atom expression.
x = {carbon}[3] # the third carbon atom
x = {carbon}[3][5] # the third through fifth carbon atoms
x = {carbon}[3][0] # the third through last carbon atoms
ATOM EXPRESSION AUTOMATIC DEFINE
When you set a variable to a value, and that value is a point or atom
expression,
then Jmol automatically registers the result as follows:
points:
a "DRAW varName {x y z} off" command is effected
atom expressions:
a "DEFINE ~varName ...." is effected
Thus we have:
set x = {oxygen}.xyz
set y = {carbon}.xyz
draw x on; draw y on
draw x off; draw y off
draw line1 $x $y
and
set x = {carbon}[3][5]
select ~x
color geen
POINTS IN IF, SET, and %{}
Points in IF, SET, and %{} can be designated using the standard {x y z}
notation WITHOUT commas. This is because we have to distinguish between
atom expressions {1,2,3} and coordinates {x y z}, and this seems to
me the
simplest way to do it. (Comma means "or" in atom expressions.) In all
other
instances, the commas are fine, including "SET UNITCELL" and "SET
DEFAULTLATTICE".
x = {1 1 0} + {oxygen}.xyz
{ }.distance ATOM PROPERTY FOR SET, IF, and %{}
d = {oxygen and * /1}.distance{oxygen and * /2}
set echo top left
echo the O-O distance is %{{oxygen and * /1}.distance{oxygen and * /2}}
message %{{atomno=3}.distance{atomno=4}}
message %{{atomno=3}.distance{1/2 1/2 1/2}}
Note that when more than one atom is involved in a set,
the following are different:
x1 = {molecule=1}.distance{molecule=2}
x2 = {molecule=1}.xyz - {molecule=2}.xyz
x1 is a NUMBER that is the "average distance measured
from each molecule 1 atom to the average molecule 2 position"
x2 is a point representing the VECTOR from the "average position of
molecule 2"
to the "average position of molecule 1"
x3 = {molecule=1}.xyz.distance{molecule=2}
x4 = 0.0 + ({molecule=1}.xyz - {molecule=2}.xyz)
x5 = ({molecule=1}.xyz - {molecule=2}.xyz).distance{0 0 0}
These are all equivalent -- the distance from the center of molecule 1
to the center of molecule 2
SELECTED ATOMS FROM ATOM EXPRESSIONS
You can selecte atoms from an atom expression using [n].
"[0]" means "and everything after".
x = {atom expression}[3].ident
x = {atom expression}[3][0].xyz # 3 and after (average position)
x = {atom expression}[3][5].x # 3-5 (average x)
TYPE CONVERSION
We have six different variable types now:
boolean True/False
integer 0, 1, 2, ....
decimal 3.5, 3.25E-3
string "test" "3.5"
point3f {2.3 3.4 5.6} {0 1/2 1}
bitset {oxygen}
These can be mixed and matched to good effect. Certain relatively
intuitive rules apply. Usually the operand on the left sets
the overall type, allowing for easy type conversion depending upon
operand order:
int + float:
0 + 3.6 ==> 3 (int on left rounds float on right)
3.6 + 0 ==> 3.6 (float on left sets result)
int/float + string:
0.0 + "3.5" ==> 3.5 (string converted to float)
0 + "3.5" ==> 3 (string converted to float, then int)
"3.5" + 0 ==> "3.50" (integer converted to string)
"3.5" + 0.0 ==> "3.50.0" (float converted to string)
1.0 + {carbon}.xyz ==> 1 + distance from {0 0 0} to {carbon}
center
{carbon}.xyz + 1 ==> {carbon} center point offset by {1 1 1}
x = {carbon}.xyz * {1 0 0} ==> (dot product)
Now x is the average x coordinate of carbon
Boolean expressions are a bit different in that the operators
AND, OR, XOR, and NOT all require conversion to boolean UNLESS both
operands are atom expressions, in which case these operate directly
on the
atom sets and return a new atom set, just like in SELECT.
3 and 0.5 ==> TRUE (both are nonzero)
false OR 2.0 ==> true (2.0 is not 0, so it is TRUE)
{oxygen} and {molecule=1} ==> all oxygen atoms in the first molecule
x = ({oxygen} and {molecule=1}).xyz
x is now the center point of all oxygen atoms in the first molecule
In standard math, boolean TRUE evaluates to 1.0; FALSE evaluates to 0.0
true + 2.0 ==> 3.0 ("TRUE" evaluates to 1.0 in math operations)
2 + true ==> 3 ("TRUE" evaluates to 1.0 and is then turned into an
integer)
EXPANDED MODULUS % OPERATOR IN IF, SET, AND %{}
Usually modulus is reserved for integer math, so we
extend that here to add some useful "modulus-like" capability:
string modulus for trimming and padding
"test" %3 ==> left trim: "tes"
"test" %6 ==> right pad: "test "
"test" %-3 ==> right trim: "est"
"test" %-6 ==> left pad: " test"
float modulus for rounding and scientific notation
3.5456 %3 ==> "3.546" (STRING!)
3545.6 %-3 ==> "3.55E+3" (STRING!)
0.0 + 3.5456 %3 ==> 3.546 (float)
0.0 + 3545.6 %-3 ==> 3550.0
point modulus for getting base unit cell equivalent position
{3/2 1/2 1/1} % 0 ==> {1/2 1/2 0}
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