From: <ha...@us...> - 2009-06-30 14:22:41
|
Revision: 11152 http://jmol.svn.sourceforge.net/jmol/?rev=11152&view=rev Author: hansonr Date: 2009-06-30 13:39:34 +0000 (Tue, 30 Jun 2009) Log Message: ----------- version=11.7.46 # argh. FOR broken in 11.7.45 # new feature: helix(resno or {atomExpression},type) # given x = C-alpha, C-carbonyl, or N (depending upon set quaternionFrame) # where type = # "point" -- nearest point to x on local helix axis # "axis" -- quaternion derivative vector normal indicating local helix axis # "angle" -- rotation around local heix axis for resno i --> i+1 # "radius" -- vector normal from local helix point to x # "draw" -- draw command for the local helix vector # note that the axis length is the rise, radius length is the radius, # and 360 / angle is the pitch of the helix # Modified Paths: -------------- trunk/Jmol/src/org/jmol/modelset/Atom.java trunk/Jmol/src/org/jmol/modelset/AtomCollection.java trunk/Jmol/src/org/jmol/modelset/Group.java trunk/Jmol/src/org/jmol/modelset/ModelSet.java trunk/Jmol/src/org/jmol/modelsetbio/AminoMonomer.java trunk/Jmol/src/org/jmol/modelsetbio/BioPolymer.java trunk/Jmol/src/org/jmol/modelsetbio/Monomer.java trunk/Jmol/src/org/jmol/util/Quaternion.java trunk/Jmol/src/org/jmol/viewer/Jmol.properties trunk/Jmol/src/org/jmol/viewer/ScriptCompilationTokenParser.java trunk/Jmol/src/org/jmol/viewer/ScriptEvaluator.java trunk/Jmol/src/org/jmol/viewer/ScriptMathProcessor.java trunk/Jmol/src/org/jmol/viewer/Token.java trunk/Jmol/src/org/jmol/viewer/Viewer.java trunk/Jmol/src/org/openscience/jmol/app/GuiMap.java Modified: trunk/Jmol/src/org/jmol/modelset/Atom.java =================================================================== --- trunk/Jmol/src/org/jmol/modelset/Atom.java 2009-06-29 17:14:11 UTC (rev 11151) +++ trunk/Jmol/src/org/jmol/modelset/Atom.java 2009-06-30 13:39:34 UTC (rev 11152) @@ -1242,7 +1242,6 @@ } return null; } - /* DEVELOPER NOTE -- ATOM/MODEL DELETION -- * Modified: trunk/Jmol/src/org/jmol/modelset/AtomCollection.java =================================================================== --- trunk/Jmol/src/org/jmol/modelset/AtomCollection.java 2009-06-29 17:14:11 UTC (rev 11151) +++ trunk/Jmol/src/org/jmol/modelset/AtomCollection.java 2009-06-30 13:39:34 UTC (rev 11152) @@ -247,6 +247,11 @@ return atoms[i].group.getQuaternion(qtype); } + public Object getHelixData(BitSet bs, int tokType) { + int iatom = BitSetUtil.firstSetBit(bs); + return (iatom < 0 ? "null" : atoms[iatom].group.getHelixData(tokType, viewer.getQuaternionFrame())); + } + protected int getAtomCountInModel(int modelIndex) { int n = 0; for (int i = atomCount; --i >= 0;) Modified: trunk/Jmol/src/org/jmol/modelset/Group.java =================================================================== --- trunk/Jmol/src/org/jmol/modelset/Group.java 2009-06-29 17:14:11 UTC (rev 11151) +++ trunk/Jmol/src/org/jmol/modelset/Group.java 2009-06-30 13:39:34 UTC (rev 11152) @@ -27,10 +27,14 @@ import org.jmol.util.ArrayUtil; import org.jmol.util.Quaternion; import org.jmol.viewer.JmolConstants; +import org.jmol.viewer.Token; import java.util.Hashtable; import java.util.BitSet; +import javax.vecmath.Point3f; +import javax.vecmath.Vector3f; + public class Group { private int groupIndex; @@ -383,5 +387,20 @@ public void setProteinStructureId(int i) { } + + public Object getHelixData(int tokType, char qType) { + switch (tokType) { + case Token.point: + return new Point3f(); + case Token.axis: + case Token.radius: + return new Vector3f(); + case Token.angle: + return new Float(Float.NaN); + case Token.array: + return new String[] {}; + } + return ""; + } } Modified: trunk/Jmol/src/org/jmol/modelset/ModelSet.java =================================================================== --- trunk/Jmol/src/org/jmol/modelset/ModelSet.java 2009-06-29 17:14:11 UTC (rev 11151) +++ trunk/Jmol/src/org/jmol/modelset/ModelSet.java 2009-06-30 13:39:34 UTC (rev 11152) @@ -846,6 +846,6 @@ loadShape(JmolConstants.SHAPE_LABELS); shapes[JmolConstants.SHAPE_LABELS].setProperty("label:"+strLabel, new Integer(i), null); } - + } Modified: trunk/Jmol/src/org/jmol/modelsetbio/AminoMonomer.java =================================================================== --- trunk/Jmol/src/org/jmol/modelsetbio/AminoMonomer.java 2009-06-29 17:14:11 UTC (rev 11151) +++ trunk/Jmol/src/org/jmol/modelsetbio/AminoMonomer.java 2009-06-30 13:39:34 UTC (rev 11152) @@ -31,9 +31,11 @@ import org.jmol.modelset.Atom; import org.jmol.modelset.Bond; import org.jmol.modelset.Chain; +import org.jmol.util.Escape; import org.jmol.util.Logger; import org.jmol.util.Quaternion; import org.jmol.viewer.JmolConstants; +import org.jmol.viewer.Token; public class AminoMonomer extends AlphaMonomer { @@ -234,6 +236,72 @@ } } + public Object getHelixData(int tokType, char qType) { + int iNext = monomerIndex + 1; + AminoMonomer next = (AminoMonomer) (iNext >= bioPolymer.monomers.length ? null + : bioPolymer.monomers[iNext]); + Quaternion q1 = getQuaternion(qType); + Quaternion q2 = (next == null ? null : next.getQuaternion(qType)); + if (q1 == null || q2 == null) + return super.getHelixData(tokType, qType); + + /* + b + | /| + | / | + | / | + |/ c + b'+ / \ + | / \ Vcb = Vab . n + n | / \d Vac = Vab - Vcb + |/theta \ + a'+---------a + r + + * + */ + + Quaternion dq = q2.div(q1);// or reverse? + float theta = dq.getTheta(); + if (tokType == Token.angle) + return new Float(theta); + Vector3f n = dq.getNormal(); + Point3f a = getQuaternionFrameCenter(qType); + Point3f b = next.getQuaternionFrameCenter(qType); + Vector3f vab = new Vector3f(); + vab.sub(b, a); + float v_dot_n = vab.dot(n); + if (tokType == Token.axis) { + n.scale(v_dot_n); + return n; + } + Vector3f vcb = new Vector3f(n); + vcb.scale(v_dot_n); + Vector3f va_prime_d = new Vector3f(); + va_prime_d.cross(vab, n); + va_prime_d.scale(1/vab.length()); + Vector3f vda = new Vector3f(); + vda.sub(vcb, vab); + vda.scale(0.5f); + va_prime_d.scale((float)(vda.length()/Math.tan(theta / 2 / 180 * Math.PI))); + Vector3f r = new Vector3f(va_prime_d); + r.add(vda); + if (tokType == Token.radius) + return r; + Point3f pt_a_prime = new Point3f(a); + pt_a_prime.sub(r); + if (tokType == Token.point) { + return pt_a_prime; + } + n.scale(v_dot_n); + if (tokType == Token.draw) { + String id = getUniqueID(); + return "draw ID helixaxis" + id + " VECTOR " + Escape.escape(pt_a_prime) + " " + Escape.escape(n); + } + //for now... array: + return new String[] {Escape.escape(pt_a_prime) , Escape.escape(n), Escape.escape(r)}; + } + public Quaternion getQuaternion(char qType) { /* * also NucleicMonomer Modified: trunk/Jmol/src/org/jmol/modelsetbio/BioPolymer.java =================================================================== --- trunk/Jmol/src/org/jmol/modelsetbio/BioPolymer.java 2009-06-29 17:14:11 UTC (rev 11151) +++ trunk/Jmol/src/org/jmol/modelsetbio/BioPolymer.java 2009-06-30 13:39:34 UTC (rev 11152) @@ -33,6 +33,7 @@ import org.jmol.util.Logger; import org.jmol.util.Quaternion; import org.jmol.util.TextFormat; +import org.jmol.viewer.Token; import javax.vecmath.Point3f; import javax.vecmath.Vector3f; @@ -566,12 +567,7 @@ Monomer monomer = p.monomers[m]; if (bsAtoms == null || bsAtoms.get(monomer.getLeadAtomIndex())) { Atom a = monomer.getLeadAtom(); - char cid = monomer.getChainID(); - String id = "_" + a.getModelIndex() + "_" + monomer.getResno() - + (cid == '\0' ? "" : "" + cid); - cid = monomer.getLeadAtom().getAlternateLocationID(); - if (cid != '\0') - id += cid; + String id = monomer.getUniqueID(); if (isRamachandran) { x = monomer.getPhi(); y = monomer.getPsi(); @@ -769,6 +765,10 @@ + Escape.escape(ptH) + "\n"); } } + if (derivType == 1 && isAmino) { + pdbATOM.append(monomer.getHelixData(Token.draw, qtype) + " color " + qColor[1]).append('\n'); + continue; + } pdbATOM.append( "draw " + prefix + "a" + id + " VECTOR " + Escape.escape(ptCenter) + " {" + (x * 2) + "," + (y * 2) Modified: trunk/Jmol/src/org/jmol/modelsetbio/Monomer.java =================================================================== --- trunk/Jmol/src/org/jmol/modelsetbio/Monomer.java 2009-06-29 17:14:11 UTC (rev 11151) +++ trunk/Jmol/src/org/jmol/modelsetbio/Monomer.java 2009-06-30 13:39:34 UTC (rev 11152) @@ -325,6 +325,17 @@ public void resetHydrogenPoint() { } + + public String getUniqueID() { + char cid = getChainID(); + Atom a = getLeadAtom(); + String id = (a == null ? "" : "_" + a.getModelIndex()) + "_" + getResno() + + (cid == '\0' ? "" : "" + cid); + cid = (a == null ? '\0' : getLeadAtom().getAlternateLocationID()); + if (cid != '\0') + id += cid; + return id; + } } Modified: trunk/Jmol/src/org/jmol/util/Quaternion.java =================================================================== --- trunk/Jmol/src/org/jmol/util/Quaternion.java 2009-06-29 17:14:11 UTC (rev 11151) +++ trunk/Jmol/src/org/jmol/util/Quaternion.java 2009-06-30 13:39:34 UTC (rev 11152) @@ -417,6 +417,11 @@ return (float) (Math.acos(qTemp.q0) * 2 * 180 / Math.PI); } + public float getThetaRadians() { + fixQ(qTemp); + return (float) (Math.acos(qTemp.q0) * 2); + } + public void getThetaDirected(Point4f axisAngle) { //fills in .w; float theta = getTheta(); Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2009-06-29 17:14:11 UTC (rev 11151) +++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2009-06-30 13:39:34 UTC (rev 11152) @@ -1,8 +1,20 @@ # Developers: to add a description of changes you have made, # add it on a line starting with # below the "version=..." line -version=11.7.46_dev +version=11.7.46 +# argh. FOR broken in 11.7.45 +# new feature: helix(resno or {atomExpression},type) +# given x = C-alpha, C-carbonyl, or N (depending upon set quaternionFrame) +# where type = +# "point" -- nearest point to x on local helix axis +# "axis" -- quaternion derivative vector normal indicating local helix axis +# "angle" -- rotation around local heix axis for resno i --> i+1 +# "radius" -- vector normal from local helix point to x +# "draw" -- draw command for the local helix vector +# note that the axis length is the rise, radius length is the radius, +# and 360 / angle is the pitch of the helix +# # bugfix: gamess readers crashing if keywords missing from basis options or control options # code: findNearestAtomPicked added to JmolViewer # new feature: VRML exporter displays ribbons and cartoons by automatically setting Modified: trunk/Jmol/src/org/jmol/viewer/ScriptCompilationTokenParser.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/ScriptCompilationTokenParser.java 2009-06-29 17:14:11 UTC (rev 11151) +++ trunk/Jmol/src/org/jmol/viewer/ScriptCompilationTokenParser.java 2009-06-30 13:39:34 UTC (rev 11152) @@ -345,6 +345,7 @@ case Token.all: case Token.bitset: case Token.divide: + case Token.helix: case Token.isaromatic: case Token.none: // nothing special Modified: trunk/Jmol/src/org/jmol/viewer/ScriptEvaluator.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/ScriptEvaluator.java 2009-06-29 17:14:11 UTC (rev 11151) +++ trunk/Jmol/src/org/jmol/viewer/ScriptEvaluator.java 2009-06-30 13:39:34 UTC (rev 11152) @@ -3181,7 +3181,7 @@ return bs; } - private BitSet compareInt(int tokWhat, float[] data, int tokOperator, + protected BitSet compareInt(int tokWhat, float[] data, int tokOperator, int comparisonValue) { BitSet bs = new BitSet(); int propertyValue = Integer.MAX_VALUE; @@ -4308,7 +4308,7 @@ case Token.end: case Token.breakcmd: case Token.continuecmd: - flowControl(token.tok, isForCheck); + isForCheck = flowControl(token.tok, isForCheck); break; case Token.backbone: proteinShape(JmolConstants.SHAPE_BACKBONE); @@ -4632,7 +4632,7 @@ } } - private void flowControl(int tok, boolean isForCheck) throws ScriptException { + private boolean flowControl(int tok, boolean isForCheck) throws ScriptException { int pt = statement[0].intValue; boolean isDone = (pt < 0 && !isSyntaxCheck); boolean isOK = true; @@ -4659,7 +4659,7 @@ checkLength(2); if (getToken(1).tok == Token.function) { viewer.addFunction((ScriptFunction) theToken.value); - return; + return isForCheck; } isForCheck = (theTok == Token.forcmd); isOK = (theTok == Token.ifcmd); @@ -4727,6 +4727,7 @@ } if (!isOK && !isSyntaxCheck) pc = Math.abs(pt) - 1; + return isForCheck; } private boolean ifCmd() throws ScriptException { @@ -8426,7 +8427,7 @@ if (isSyntaxCheck) return; if (bs == null) - bs = viewer.getModelAtomBitSet(-1, false); + bs = viewer.getAtomBitSet(null); viewer.calculateStructures(bs); viewer.addStateScript(thisCommand, false, true); return; Modified: trunk/Jmol/src/org/jmol/viewer/ScriptMathProcessor.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/ScriptMathProcessor.java 2009-06-29 17:14:11 UTC (rev 11151) +++ trunk/Jmol/src/org/jmol/viewer/ScriptMathProcessor.java 2009-06-30 13:39:34 UTC (rev 11152) @@ -616,6 +616,8 @@ case Token.mul: case Token.div: return evaluateList(op.intValue, args); + case Token.helix: + return evaluateHelix(args); case Token.label: case Token.format: return evaluateLabel(op.intValue, args); @@ -645,6 +647,37 @@ return false; } + private boolean evaluateHelix(ScriptVariable[] args) { + if (args.length < 1) + return false; + BitSet bs = (args[0].value instanceof BitSet ? (BitSet) args[0].value + : eval.compareInt(Token.resno, null, Token.opEQ, ScriptVariable.iValue(args[0]))); + String type = (args.length == 1 ? "array" : ScriptVariable.sValue(args[1])) + .toLowerCase(); + if (type.equals("point")) + return addX(isSyntaxCheck ? new Point3f() : (Point3f) viewer + .getHelixData(bs, Token.point)); + if (type.equals("axis")) + return addX(isSyntaxCheck ? new Vector3f() : (Vector3f) viewer + .getHelixData(bs, Token.axis)); + if (type.equals("radius")) + return addX(isSyntaxCheck ? new Vector3f() : (Vector3f) viewer + .getHelixData(bs, Token.radius)); + if (type.equals("angle")) + return addX(isSyntaxCheck ? 0 : ((Float) viewer + .getHelixData(bs, Token.angle)).floatValue()); + if (type.equals("draw")) + return addX(isSyntaxCheck ? "" : (String) viewer + .getHelixData(bs, Token.draw)); + if (type.equals("array")) { + String[] data = (String[]) viewer.getHelixData(bs, Token.array); + if (data == null) + return false; + return addX(data); + } + return false; + } + private boolean evaluateDistance(ScriptVariable[] args) throws ScriptException { ScriptVariable x1 = getX(); Modified: trunk/Jmol/src/org/jmol/viewer/Token.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Token.java 2009-06-29 17:14:11 UTC (rev 11151) +++ trunk/Jmol/src/org/jmol/viewer/Token.java 2009-06-30 13:39:34 UTC (rev 11152) @@ -554,7 +554,7 @@ // xxx(a,b,c,d,e,...) - final static int array = 1 | 0 << 9 | mathfunc; + public final static int array = 1 | 0 << 9 | mathfunc; public final static int format = 2 | 0 << 9 | mathfunc | mathproperty | strproperty | settable; public final static int label = 3 | 0 << 9 | mathfunc | mathproperty | strproperty | settable | implicitStringCommand | defaultON | setparam; final static int function = 4 | 0 << 9 | mathfunc | flowCommand | noeval; @@ -586,10 +586,11 @@ // xxx(a,b) - public final static int cross = 1 | 2 << 9 | mathfunc; - final static int load = 2 | 2 << 9 | mathfunc | command; - final static int random = 3 | 2 << 9 | mathfunc; - final static int script = 4 | 2 << 9 | mathfunc | command; + public final static int cross = 1 | 2 << 9 | mathfunc; + final static int helix = 2 | 2 << 9 | mathfunc; + final static int load = 3 | 2 << 9 | mathfunc | command; + final static int random = 4 | 2 << 9 | mathfunc; + final static int script = 5 | 2 << 9 | mathfunc | command; // ___.xxx(a,b) @@ -610,10 +611,10 @@ // xxx(a,b,c,d) - final static int angle = 1 | 4 << 9 | mathfunc; + public final static int angle = 1 | 4 << 9 | mathfunc; public final static int data = 2 | 4 << 9 | mathfunc | command; final static int plane = 3 | 4 << 9 | mathfunc; - final static int point = 4 | 4 << 9 | mathfunc; + public final static int point = 4 | 4 << 9 | mathfunc; final static int quaternion = 5 | 4 << 9 | mathfunc | command; final static int axisangle = 6 | 4 << 9 | mathfunc; @@ -641,7 +642,7 @@ // misc final static int absolute = misc | 1; - final static int axis = misc | 3; + public final static int axis = misc | 3; final static int babel = misc | 4; final static int back = misc | 5; final public static int backlit = misc | 6; @@ -803,6 +804,7 @@ "goto", new Token(gotocmd), "halo", new Token(halo), "halos", null, + "helix", new Token(helix), "hbond", new Token(hbond), "hbonds", null, "help", new Token(help), Modified: trunk/Jmol/src/org/jmol/viewer/Viewer.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Viewer.java 2009-06-29 17:14:11 UTC (rev 11151) +++ trunk/Jmol/src/org/jmol/viewer/Viewer.java 2009-06-30 13:39:34 UTC (rev 11152) @@ -6796,6 +6796,10 @@ return ScriptEvaluator.evaluateExpression(this, stringOrTokens); } + Object getHelixData(BitSet bs, int tokType) { + return modelSet.getHelixData(bs, tokType); + } + public String getPdbData(BitSet bs) { if (bs == null) bs = getSelectionSet(); Modified: trunk/Jmol/src/org/openscience/jmol/app/GuiMap.java =================================================================== --- trunk/Jmol/src/org/openscience/jmol/app/GuiMap.java 2009-06-29 17:14:11 UTC (rev 11151) +++ trunk/Jmol/src/org/openscience/jmol/app/GuiMap.java 2009-06-30 13:39:34 UTC (rev 11152) @@ -53,7 +53,7 @@ labels.put("openTip", GT._("Open a file.")); labels.put("openurl", GT._("Open &URL")); labels.put("editor", GT._("Scrip&t Editor...")); // new %t 11.7.45 - labels.put("console", GT._("Output &Console..."));// was &t + labels.put("console", GT._("Output Conso&le..."));// was &t labels.put("jconsole", GT._("Jmol Java &Console")); labels.put("atomsetchooser", GT._("AtomSet&Chooser...")); labels.put("saveas", GT._("&Save As...")); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |