Revision: 20266 http://sourceforge.net/p/jmol/code/20266 Author: hansonr Date: 2015-02-04 12:47:46 +0000 (Wed, 04 Feb 2015) Log Message: ----------- Jmol.___JmolVersion="14.3.12_2015.02.04"
new feature: print data({*},"xyz") -- (lower case) writes only atom data lines new feature: print data({*},"XYZ", true) -- third parameter TRUE writes all trajectories bug fix: show mouse fails in JavaScript -- we cannot test using PT.isAI() in org.jmol.viewer.binding.Binding -- because of a Java2Script compiler creates standard array [...] -- from new int[] {....} whereas it should create Clazz.newArray() and fill it bug fix: writing of file formats was inconsistent between WRITE and data() (not fixed in 14.2) bug fix: Jmol writing of PDB file data did not include TER records (not fixed in 14.2) bug fix: label %r should print "1" for non-PDB file atoms bug fix: 01.30 mutate {xxx} ~... skips first-listed replacement group identifier bug fix: 01.29 breaks loading non-trajectory file after a trajectory is loaded Modified Paths: -------------- trunk/Jmol/src/org/jmol/api/JmolBioResolver.java trunk/Jmol/src/org/jmol/modelset/JmolBioModel.java trunk/Jmol/src/org/jmol/modelsetbio/BioModel.java trunk/Jmol/src/org/jmol/modelsetbio/Resolver.java trunk/Jmol/src/org/jmol/scriptext/CmdExt.java trunk/Jmol/src/org/jmol/viewer/Jmol.properties trunk/Jmol/src/org/jmol/viewer/binding/Binding.java Modified: trunk/Jmol/src/org/jmol/api/JmolBioResolver.java =================================================================== --- trunk/Jmol/src/org/jmol/api/JmolBioResolver.java 2015-02-03 23:27:55 UTC (rev 20265) +++ trunk/Jmol/src/org/jmol/api/JmolBioResolver.java 2015-02-04 12:47:46 UTC (rev 20266) @@ -56,8 +56,6 @@ public short getGroupID(String g3); - public boolean mutate(BS bs, String fileName, String[] sequence); - public String toStdAmino3(String sValue); } Modified: trunk/Jmol/src/org/jmol/modelset/JmolBioModel.java =================================================================== --- trunk/Jmol/src/org/jmol/modelset/JmolBioModel.java 2015-02-03 23:27:55 UTC (rev 20265) +++ trunk/Jmol/src/org/jmol/modelset/JmolBioModel.java 2015-02-04 12:47:46 UTC (rev 20266) @@ -95,4 +95,6 @@ public void resetRasmolBonds(BS bs); + boolean mutate(BS bs, String group, String[] sequence); + } Modified: trunk/Jmol/src/org/jmol/modelsetbio/BioModel.java =================================================================== --- trunk/Jmol/src/org/jmol/modelsetbio/BioModel.java 2015-02-03 23:27:55 UTC (rev 20265) +++ trunk/Jmol/src/org/jmol/modelsetbio/BioModel.java 2015-02-04 12:47:46 UTC (rev 20266) @@ -836,7 +836,133 @@ ms.haveStraightness = true; } + @Override + public boolean mutate(BS bs, String group, String[] sequence) { + + int i0 = bs.nextSetBit(0); + if (sequence == null) + return mutateAtom(i0, group); + boolean isFile = (group == null); + if (isFile) + group = sequence[0]; + Group lastGroup = null; + boolean isOK = true; + for (int i = i0, pt = 0; i >= 0; i = bs.nextSetBit(i + 1)) { + Group g = ms.at[i].group; + if (g == lastGroup) + continue; + lastGroup = g; + if (!isFile) { + group = sequence[pt++ % sequence.length]; + if (group.equals("UNK")) + continue; + group = "==" + group; + } + mutateAtom(i, group); + } + return isOK; + } + + private boolean mutateAtom(int iatom, String fileName) { + // no mutating a trajectory. What would that mean??? + int iModel = ms.at[iatom].mi; + if (ms.isTrajectory(iModel)) + return false; + + String[] info = vwr.fm.getFileInfo(); + boolean b = vwr.getBoolean(T.appendnew); + Group g = ms.at[iatom].group; + //try { + // get the initial group -- protein for now + if (!(g instanceof AminoMonomer)) + return false; + ((BioModel) ms.am[iModel]).isMutated = true; + AminoMonomer res0 = (AminoMonomer) g; + int ac = ms.ac; + BS bsRes0 = new BS(); + res0.setAtomBits(bsRes0); + int r = g.getResno(); + + // just use a script -- it is much easier! + + fileName = PT.esc(fileName); + String script = "" + + "try{\n" + + " var atoms0 = {*}\n" + + " var res0 = " + BS.escape(bsRes0,'(',')') + "\n" + + " set appendNew false\n" + + " load append "+fileName+"\n" + + " set appendNew " + b + "\n" + + " var res1 = {!atoms0};var r1 = res1[1];var r0 = res1[0]\n" + + " if ({r1 & within(group, r0)}){\n" + + " var haveHs = ({_H & connected(res0)} != 0)\n" + + " if (!haveHs) {delete _H & res1}\n" + + " var sm = '[*.N][*.CA][*.C][*.O]'\n" + + " var keyatoms = res1.find(sm)\n" + + " var x = compare(res1,res0,sm,'BONDS')\n" + + " if(x){\n" + + " print 'mutating ' + res0[1].label('%n%r') + ' to ' + "+fileName+".trim('=')\n" + + " rotate branch @x\n" + + " compare res1 res0 SMARTS @sm rotate translate 0\n" + + " var c = {!res0 & connected(res0)}\n" + + " var N2 = {*.N & c}\n" + + " var C0 = {*.C & c}\n" + + " delete res0\n" + + " if (N2) {\n" + + " delete *.OXT and res1\n" + + " connect {N2} {keyatoms & *.C}\n" + + " }\n" + + " if (C0) {\n" + + " connect {C0} {keyatoms & *.N}\n" + + " }\n" + + " }\n" + + " }\n" + + "}catch(e){print e}\n"; + try { + if (Logger.debugging) + Logger.debug(script); + vwr.eval.runScript(script); + } catch (Exception e) { + // TODO + } + if (ms.ac == ac) + return false; + // check for protein monomer + g = ms.at[ms.ac - 1].group; + if (g != ms.at[ac + 1].group || !(g instanceof AminoMonomer)) { + BS bsAtoms = new BS(); + g.setAtomBits(bsAtoms); + vwr.deleteAtoms(bsAtoms, false); + return false; + } + AminoMonomer res1 = (AminoMonomer) g; + + // must get new group into old chain + + Group[] groups = res0.chain.groups; + for (int i = groups.length; --i >= 0;) + if (groups[i] == res0) { + groups[i] = res1; + break; + } + res1.setResno(r); + res1.chain.groupCount = 0; + res1.chain = res0.chain; + BS bsExclude = BSUtil.newBitSet2(0, ms.mc); + bsExclude.clear(res1.chain.model.modelIndex); + res1.chain.model.groupCount = -1; + res1.chain.model.freeze(); + ms.recalculatePolymers(bsExclude); + //} catch (Exception e) { + // System.out.println("" + e); + // } + vwr.setBooleanProperty("appendNew", b); + vwr.fm.setFileInfo(info); + return true; + } + + ///////////////////////////////////////////////////////////////////////// Modified: trunk/Jmol/src/org/jmol/modelsetbio/Resolver.java =================================================================== --- trunk/Jmol/src/org/jmol/modelsetbio/Resolver.java 2015-02-03 23:27:55 UTC (rev 20265) +++ trunk/Jmol/src/org/jmol/modelsetbio/Resolver.java 2015-02-04 12:47:46 UTC (rev 20266) @@ -41,7 +41,6 @@ import org.jmol.modelset.ModelLoader; import org.jmol.modelset.ModelSet; import org.jmol.script.SV; -import org.jmol.script.ScriptException; import org.jmol.script.T; import org.jmol.util.BSUtil; import org.jmol.util.Edge; @@ -1768,132 +1767,6 @@ return (groupID == -1 ? addGroup3Name(group3) : groupID); } - @Override - public boolean mutate(BS bs, String group, String[] sequence) { - - int i0 = bs.nextSetBit(0); - if (sequence == null) - return mutateAtom(i0, group); - boolean isFile = (group == null); - if (isFile) - group = sequence[0]; - Group lastGroup = null; - boolean isOK = true; - for (int i = i0, pt = 0; i >= 0; i = bs.nextSetBit(i + 1)) { - Group g = vwr.ms.at[i].group; - if (g == lastGroup) - continue; - lastGroup = g; - if (!isFile) { - group = sequence[pt++ % sequence.length]; - if (group.equals("UNK")) - continue; - group = "==" + group; - } - mutateAtom(i, group); - } - return isOK; - } - - private boolean mutateAtom(int iatom, String fileName) { - // no mutating a trajectory. What would that mean??? - int iModel = vwr.ms.at[iatom].mi; - if (vwr.ms.isTrajectory(iModel)) - return false; - - String[] info = vwr.fm.getFileInfo(); - boolean b = vwr.getBoolean(T.appendnew); - Group g = vwr.ms.at[iatom].group; - //try { - // get the initial group -- protein for now - if (!(g instanceof AminoMonomer)) - return false; - ((BioModel) vwr.ms.am[iModel]).isMutated = true; - AminoMonomer res0 = (AminoMonomer) g; - int ac = vwr.ms.ac; - BS bsRes0 = new BS(); - res0.setAtomBits(bsRes0); - int r = g.getResno(); - - // just use a script -- it is much easier! - - fileName = PT.esc(fileName); - String script = "" + - "try{\n" - + " var atoms0 = {*}\n" - + " var res0 = " + BS.escape(bsRes0,'(',')') + "\n" - + " set appendNew false\n" - + " load append "+fileName+"\n" - + " set appendNew " + b + "\n" - + " var res1 = {!atoms0};var r1 = res1[1];var r0 = res1[0]\n" - + " if ({r1 & within(group, r0)}){\n" - + " var haveHs = ({_H & connected(res0)} != 0)\n" - + " if (!haveHs) {delete _H & res1}\n" - + " var sm = '[*.N][*.CA][*.C][*.O]'\n" - + " var keyatoms = res1.find(sm)\n" - + " var x = compare(res1,res0,sm,'BONDS')\n" - + " if(x){\n" - + " print 'mutating ' + res0[1].label('%n%r') + ' to ' + "+fileName+".trim('=')\n" - + " rotate branch @x\n" - + " compare res1 res0 SMARTS @sm rotate translate 0\n" - + " var c = {!res0 & connected(res0)}\n" - + " var N2 = {*.N & c}\n" - + " var C0 = {*.C & c}\n" - + " delete res0\n" - + " if (N2) {\n" - + " delete *.OXT and res1\n" - + " connect {N2} {keyatoms & *.C}\n" - + " }\n" - + " if (C0) {\n" - + " connect {C0} {keyatoms & *.N}\n" - + " }\n" - + " }\n" - + " }\n" - + "}catch(e){print e}\n"; - try { - if (Logger.debugging) - Logger.debug(script); - vwr.eval.runScript(script); - } catch (ScriptException e) { - // TODO - } - if (vwr.ms.ac == ac) - return false; - // check for protein monomer - g = vwr.ms.at[vwr.ms.ac - 1].group; - if (g != vwr.ms.at[ac + 1].group || !(g instanceof AminoMonomer)) { - BS bsAtoms = new BS(); - g.setAtomBits(bsAtoms); - vwr.deleteAtoms(bsAtoms, false); - return false; - } - AminoMonomer res1 = (AminoMonomer) g; - - // must get new group into old chain - - Group[] groups = res0.chain.groups; - for (int i = groups.length; --i >= 0;) - if (groups[i] == res0) { - groups[i] = res1; - break; - } - res1.setResno(r); - res1.chain.groupCount = 0; - res1.chain = res0.chain; - BS bsExclude = BSUtil.newBitSet2(0, vwr.ms.mc); - bsExclude.clear(res1.chain.model.modelIndex); - res1.chain.model.groupCount = -1; - res1.chain.model.freeze(); - vwr.ms.recalculatePolymers(bsExclude); - //} catch (Exception e) { - // System.out.println("" + e); - // } - vwr.setBooleanProperty("appendNew", b); - vwr.fm.setFileInfo(info); - return true; - - } - } Modified: trunk/Jmol/src/org/jmol/scriptext/CmdExt.java =================================================================== --- trunk/Jmol/src/org/jmol/scriptext/CmdExt.java 2015-02-03 23:27:55 UTC (rev 20265) +++ trunk/Jmol/src/org/jmol/scriptext/CmdExt.java 2015-02-04 12:47:46 UTC (rev 20266) @@ -2213,7 +2213,7 @@ return; String group = e.optParameterAsString(i); e.checkLast(i); - if (chk) + if (chk || !vwr.ms.am[vwr.ms.mc - 1].isBioModel) return; boolean isFile = (tokAt(i) == T.string && !group.startsWith("~")); String[] list = null; @@ -2223,14 +2223,14 @@ } else { group = PT.replaceAllCharacters(group, ",; \t\n", " ").trim() .toUpperCase(); - if (group.startsWith("~") || group.length() != 3 + boolean isOneLetter = group.startsWith("~"); + if (isOneLetter || group.length() != 3 || !vwr.getJBR().isKnownPDBGroup(group, 20)) - group = vwr.getJBR().toStdAmino3(group); + group = vwr.getJBR().toStdAmino3(isOneLetter ? group.substring(1) : group); } list = PT.getTokens(group); - if (list.length == 0) - return; - vwr.getJBR().mutate(bs, group, list); + if (list.length > 0) + vwr.ms.bioModel.mutate(bs, group, list); } private void navigate() throws ScriptException { Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2015-02-03 23:27:55 UTC (rev 20265) +++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2015-02-04 12:47:46 UTC (rev 20266) @@ -15,7 +15,7 @@ TODO: remove HTML5 dependency on synchronous file loading (check SCRIPT command for problems) TODO: add 2D graphics panel for Ramachandran and NBO-style 2D graphics -- send to browser as data uri? -Jmol.___JmolVersion="14.3.12_2015.01.31" +Jmol.___JmolVersion="14.3.12_2015.02.04" new feature: print data({*},"xyz") -- (lower case) writes only atom data lines @@ -23,9 +23,15 @@ new feature: print data({*},"XYZ", true) -- third parameter TRUE writes all trajectories -bug fix: writing formats was inconsistent -bug fix: Jmol writing of PDB file data did not include TER records +bug fix: show mouse fails in JavaScript + -- we cannot test using PT.isAI() in org.jmol.viewer.binding.Binding + -- because of a Java2Script compiler creates standard array [...] + -- from new int[] {....} whereas it should create Clazz.newArray() and fill it +bug fix: writing of file formats was inconsistent between WRITE and data() (not fixed in 14.2) +bug fix: Jmol writing of PDB file data did not include TER records (not fixed in 14.2) bug fix: label %r should print "1" for non-PDB file atoms +bug fix: 01.30 mutate {xxx} ~... skips first-listed replacement group identifier +bug fix: 01.29 breaks loading non-trajectory file after a trajectory is loaded JmolVersion="14.3.12_2015.01.30b" Modified: trunk/Jmol/src/org/jmol/viewer/binding/Binding.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/binding/Binding.java 2015-02-03 23:27:55 UTC (rev 20265) +++ trunk/Jmol/src/org/jmol/viewer/binding/Binding.java 2015-02-04 12:47:46 UTC (rev 20266) @@ -307,7 +307,16 @@ Lst<String>[] names = new Lst[actionInfo.length]; Lst<String[]> user = new Lst<String[]>(); for (Object obj : bindings.values()) { - if (PT.isAI(obj)) { + if (PT.isAS(obj)) { + String action = ((String[]) obj)[0]; + String script = ((String[]) obj)[1]; + if (qlow == null || qlow.indexOf("user") >= 0 || action.indexOf(qlow) >= 0 || script.indexOf(qlow) >= 0) + user.addLast((String[]) obj); + } else { + + // we cannot test using PT.isAI() here because of a Java2Script compiler error + // in relation to new int[] {.....} BH 2015.02.03 + int[] info = (int[]) obj; int i = info[1]; if (names[i] == null) @@ -316,11 +325,6 @@ if (qlow == null || (actionNames[i] + ";" + actionInfo[i] + ";" + name).toLowerCase().indexOf(qlow) >= 0) names[i].addLast(name); - } else if (PT.isAS(obj)) { - String action = ((String[]) obj)[0]; - String script = ((String[]) obj)[1]; - if (qlow == null || qlow.indexOf("user") >= 0 || action.indexOf(qlow) >= 0 || script.indexOf(qlow) >= 0) - user.addLast((String[]) obj); } } for (int i = 0; i < actionInfo.length; i++) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. ------------------------------------------------------------------------------ Dive into the World of Parallel Programming. The Go Parallel Website, sponsored by Intel and developed in partnership with Slashdot Media, is your hub for all things parallel software development, from weekly thought leadership blogs to news, videos, case studies, tutorials and more. Take a look and join the conversation now. http://goparallel.sourceforge.net/ _______________________________________________ Jmol-commits mailing list Jmol-commits@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/jmol-commits