Revision: 20957 http://sourceforge.net/p/jmol/code/20957 Author: hansonr Date: 2016-02-10 02:22:20 +0000 (Wed, 10 Feb 2016) Log Message: ----------- Jmol.___JmolVersion="14.5.2_2016.02.09"
new feature: invertselected ATOMS {ring atoms to invert} -- inverts ring stereochemistry -- requires prior selection of all atoms to be involved in the inversion bug fix: SMARTS pattern [ALA.*] not working without biological polymer type indication bug fix: SMARTS pattern [r500] not working outside of MINIMIZE Revision Links: -------------- http://sourceforge.net/p/jmol/code/500 Modified Paths: -------------- branches/v14_4/Jmol/src/org/jmol/script/ScriptEval.java branches/v14_4/Jmol/src/org/jmol/smiles/SmilesSearch.java branches/v14_4/Jmol/src/org/jmol/viewer/ActionManager.java branches/v14_4/Jmol/src/org/jmol/viewer/JC.java branches/v14_4/Jmol/src/org/jmol/viewer/Jmol.properties branches/v14_4/Jmol/src/org/jmol/viewer/Viewer.java trunk/Jmol/src/org/jmol/script/ScriptEval.java trunk/Jmol/src/org/jmol/smiles/SmilesSearch.java trunk/Jmol/src/org/jmol/viewer/ActionManager.java trunk/Jmol/src/org/jmol/viewer/Jmol.properties trunk/Jmol/src/org/jmol/viewer/Viewer.java Modified: branches/v14_4/Jmol/src/org/jmol/script/ScriptEval.java =================================================================== --- branches/v14_4/Jmol/src/org/jmol/script/ScriptEval.java 2016-02-06 21:26:19 UTC (rev 20956) +++ branches/v14_4/Jmol/src/org/jmol/script/ScriptEval.java 2016-02-10 02:22:20 UTC (rev 20957) @@ -4078,6 +4078,7 @@ // invertSelected PLANE // invertSelected HKL // invertSelected STEREO {sp3Atom} {one or two groups) + // invertSelected ATOM {ring atom sets} P3 pt = null; P4 plane = null; BS bs = null; @@ -4104,6 +4105,14 @@ case T.hkl: plane = hklParameter(2); break; + case T.atoms: + bs = atomExpressionAt(2); + if (!chk) { + for (int i = bs.nextSetBit(0); i >= 0; i = bs.nextSetBit(i + 1)) { + vwr.invertRingAt(i, false); + } + } + return; } checkLengthErrorPt(iToken + 1, 1); if (plane == null && pt == null && iAtom == Integer.MIN_VALUE) Modified: branches/v14_4/Jmol/src/org/jmol/smiles/SmilesSearch.java =================================================================== --- branches/v14_4/Jmol/src/org/jmol/smiles/SmilesSearch.java 2016-02-06 21:26:19 UTC (rev 20956) +++ branches/v14_4/Jmol/src/org/jmol/smiles/SmilesSearch.java 2016-02-10 02:22:20 UTC (rev 20957) @@ -206,7 +206,7 @@ boolean aromaticStrict = ((flags & Edge.FLAG_AROMATIC_STRICT) != 0); boolean aromaticDefined = ((flags & Edge.FLAG_AROMATIC_DEFINED) != 0); if (aromaticStrict && vRings == null) - vRings = AU.createArrayOfArrayList(4); + vRings = AU.createArrayOfArrayList(4); if (aromaticDefined && needAromatic) { // predefined aromatic bonds bsAromatic = SmilesAromatic.checkAromaticDefined(jmolAtoms, bsSelected); @@ -235,10 +235,10 @@ SmilesSearch search = SmilesParser.getMolecule(smarts, true); Lst<Object> vR = (Lst<Object>) subsearch(search, false, true); if (vRings != null && i <= 5) { - Lst<BS> v = new Lst<BS>(); - for (int j = vR.size(); --j >= 0; ) + Lst<BS> v = new Lst<BS>(); + for (int j = vR.size(); --j >= 0;) v.addLast((BS) vR.get(j)); - vRings[i-3] = v; + vRings[i - 3] = v; } if (needAromatic) { if (!aromaticDefined && (!aromaticStrict || i == 5 || i == 6)) @@ -246,8 +246,18 @@ BS bs = (BS) vR.get(r); if (aromaticDefined || SmilesAromatic.isFlatSp2Ring(jmolAtoms, bsSelected, bs, - (aromaticStrict ? 0.1f : 0.01f))) + (aromaticStrict ? 0.1f : 0.01f))) { bsAromatic.or(bs); + if (!aromaticStrict) + switch (i) { + case 5: + bsAromatic5.or(bs); + break; + case 6: + bsAromatic6.or(bs); + break; + } + } } if (aromaticStrict) { switch (i) { @@ -260,7 +270,7 @@ bsAromatic); else SmilesAromatic.checkAromaticStrict(jmolAtoms, bsAromatic, v5, vR); - vRings[3] = new Lst<BS>(); + vRings[3] = new Lst<BS>(); setAromatic56(v5, bsAromatic5, 5, vRings[3]); setAromatic56(vR, bsAromatic6, 6, vRings[3]); break; @@ -859,11 +869,10 @@ if (patternAtom.residueChar != null || patternAtom.elementNumber == -2) { char atype = a.getBioSmilesType(); char ptype = patternAtom.getBioSmilesType(); - char resChar = (patternAtom.residueChar == null ? '*' - : patternAtom.residueChar.charAt(0)); boolean ok = true; boolean isNucleic = false; switch (ptype) { + case '\0': case '*': ok = true; break; @@ -882,6 +891,8 @@ if (!ok) break; String s = a.getGroup1('\0').toUpperCase(); + char resChar = (patternAtom.residueChar == null ? '*' + : patternAtom.residueChar.charAt(0)); boolean isOK = (resChar == s.charAt(0)); switch (resChar) { case '*': Modified: branches/v14_4/Jmol/src/org/jmol/viewer/ActionManager.java =================================================================== --- branches/v14_4/Jmol/src/org/jmol/viewer/ActionManager.java 2016-02-06 21:26:19 UTC (rev 20956) +++ branches/v14_4/Jmol/src/org/jmol/viewer/ActionManager.java 2016-02-10 02:22:20 UTC (rev 20957) @@ -1823,44 +1823,8 @@ } return; case PICKING_INVERT_STEREO: - if (bnd(clickAction, ACTION_assignNew)) { - bs = vwr.getAtomBitSet("connected(atomIndex=" + atomIndex - + ") and !within(SMARTS,'[r50,R]')"); - int nb = bs.cardinality(); - switch (nb) { - case 0: - case 1: - // not enough non-ring atoms - return; - case 2: - break; - case 3: - case 4: - // three or four are not in a ring. So let's find the shortest two - // branches and invert them. - int[] lengths = new int[nb]; - int[] points = new int[nb]; - int ni = 0; - for (int i = bs.nextSetBit(0); i >= 0; i = bs.nextSetBit(i + 1), ni++) { - lengths[ni] = vwr.getBranchBitSet(i, atomIndex, true) - .cardinality(); - points[ni] = i; - } - for (int j = 0; j < nb - 2; j++) { - int max = Integer.MIN_VALUE; - int imax = 0; - for (int i = 0; i < nb; i++) - if (lengths[i] >= max && bs.get(points[i])) { - imax = points[i]; - max = lengths[i]; - } - bs.clear(imax); - } - } - vwr.undoMoveActionClear(atomIndex, AtomCollection.TAINT_COORD, true); - vwr.invertSelected(null, null, atomIndex, bs); - vwr.setStatusAtomPicked(atomIndex, "inverted: " + Escape.eBS(bs), null); - } + if (bnd(clickAction, ACTION_assignNew)) + vwr.invertRingAt(atomIndex), true); return; case PICKING_DELETE_ATOM: if (bnd(clickAction, ACTION_deleteAtom)) { Modified: branches/v14_4/Jmol/src/org/jmol/viewer/JC.java =================================================================== --- branches/v14_4/Jmol/src/org/jmol/viewer/JC.java 2016-02-06 21:26:19 UTC (rev 20956) +++ branches/v14_4/Jmol/src/org/jmol/viewer/JC.java 2016-02-10 02:22:20 UTC (rev 20957) @@ -60,7 +60,7 @@ "cod", "http://www.crystallography.net/cod/cif/%c1/%c2%c3/%c4%c5/%FILE.cif", "nmr", "http://www.nmrdb.org/new_predictor?POST?molfile=", "nmrdb", "http://www.nmrdb.org/service/predictor?POST?molfile=", - "pdb", "http://ftp.wwpdb.org/pub/pdb/data/structures/divided/pdb/%c2%c3/pdb%file.ent.gz", // new Jmol 14.5.0 10/28/2015 + "pdb", "http://ftp.wwpdb.org/pub/pdb/data/structures/divided/pdb/%c2%c3/pdb%file.ent.gz", // new Jmol 14.5.0 10/28/2015 -- not enabled for JavaScript "pdb0", "http://www.rcsb.org/pdb/files/%FILE.pdb.gz", "pdbe", "http://www.ebi.ac.uk/pdbe/entry-files/download/%FILE.cif", "pdbe2", "http://www.ebi.ac.uk/pdbe/static/entry/%FILE_updated.cif", Modified: branches/v14_4/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- branches/v14_4/Jmol/src/org/jmol/viewer/Jmol.properties 2016-02-06 21:26:19 UTC (rev 20956) +++ branches/v14_4/Jmol/src/org/jmol/viewer/Jmol.properties 2016-02-10 02:22:20 UTC (rev 20957) @@ -7,8 +7,13 @@ # see also http://chemapps.stolaf.edu/jmol/zip for daily updates -Jmol.___JmolVersion="14.4.2_2016.02.06" +Jmol.___JmolVersion="14.4.2_2016.02.09" +bug fix: SMARTS pattern [ALA.*] not working without biological polymer type indication +bug fix: SMARTS pattern [r500] not working outside of MINIMIZE + +JmolVersion="14.4.2_2016.02.06" + bug fix: isosurface "==xxxx" not setting default omap cutoff and sigma 3.0 bug fix: small MRC map files mistaken for DELPHI files, which start with the 4-byte integer 20. bug fix: MRC/CCP4 surface/map files still sometimes inside out. Modified: branches/v14_4/Jmol/src/org/jmol/viewer/Viewer.java =================================================================== --- branches/v14_4/Jmol/src/org/jmol/viewer/Viewer.java 2016-02-06 21:26:19 UTC (rev 20956) +++ branches/v14_4/Jmol/src/org/jmol/viewer/Viewer.java 2016-02-10 02:22:20 UTC (rev 20957) @@ -3926,17 +3926,17 @@ return name; } } else { - format = ( - // following is temporary, until issues are resolved for AJAX asych - isJS && g.loadFormat.equals(g.pdbLoadFormat) ? g.pdbLoadFormat0 - : g.loadFormat); + format = ( + // following is temporary, until issues are resolved for AJAX asych + isJS && g.loadFormat.equals(g.pdbLoadFormat) ? g.pdbLoadFormat0 + : g.loadFormat); } //$FALL-THROUGH$ case '#': // ligand if (format == null) format = g.pdbLoadLigandFormat; if (id.indexOf(".") >= 0 && format.equals(g.pdbLoadFormat)) - format = g.pdbLoadFormat0; // older version for =1crn.cif or =1crn.pdb + format = g.pdbLoadFormat0; // older version for =1crn.cif or =1crn.pdb return g.resolveDataBase(null, id, format); case '*': // European Bioinformatics Institute @@ -7435,6 +7435,46 @@ sm.setStatusAtomMoved(bs); } + public void invertRingAt(int atomIndex, boolean isClick) { + // [r50 here just sets the max ring size to 50 + BS bs = getAtomBitSet("connected(atomIndex=" + atomIndex + ") and !within(SMARTS,'[r50,R]')"); + int nb = bs.cardinality(); + switch (nb) { + case 0: + case 1: + // not enough non-ring atoms + return; + case 2: + break; + case 3: + case 4: + // three or four are not in a ring. So let's find the shortest two + // branches and invert them. + int[] lengths = new int[nb]; + int[] points = new int[nb]; + int ni = 0; + for (int i = bs.nextSetBit(0); i >= 0; i = bs.nextSetBit(i + 1), ni++) { + lengths[ni] = getBranchBitSet(i, atomIndex, true).cardinality(); + points[ni] = i; + } + for (int j = 0; j < nb - 2; j++) { + int max = Integer.MIN_VALUE; + int imax = 0; + for (int i = 0; i < nb; i++) + if (lengths[i] >= max && bs.get(points[i])) { + imax = points[i]; + max = lengths[i]; + } + bs.clear(imax); + } + } + if (isClick) + undoMoveActionClear(atomIndex, AtomCollection.TAINT_COORD, true); + invertSelected(null, null, atomIndex, bs); + if (isClick) + setStatusAtomPicked(atomIndex, "inverted: " + Escape.eBS(bs), null); + } + public void invertSelected(P3 pt, P4 plane, int iAtom, BS invAtoms) { // Eval BS bs = bsA(); @@ -9363,4 +9403,5 @@ jsonParser = ((JSJSONParser) Interface.getInterface("javajs.util.JSJSONParser", this, "script")); return jsonParser.parseMap(ann, true); } + } Modified: trunk/Jmol/src/org/jmol/script/ScriptEval.java =================================================================== --- trunk/Jmol/src/org/jmol/script/ScriptEval.java 2016-02-06 21:26:19 UTC (rev 20956) +++ trunk/Jmol/src/org/jmol/script/ScriptEval.java 2016-02-10 02:22:20 UTC (rev 20957) @@ -4078,6 +4078,7 @@ // invertSelected PLANE // invertSelected HKL // invertSelected STEREO {sp3Atom} {one or two groups) + // invertSelected ATOM {ring atom sets} P3 pt = null; P4 plane = null; BS bs = null; @@ -4104,6 +4105,14 @@ case T.hkl: plane = hklParameter(2); break; + case T.atoms: + bs = atomExpressionAt(2); + if (!chk) { + for (int i = bs.nextSetBit(0); i >= 0; i = bs.nextSetBit(i + 1)) { + vwr.invertRingAt(i, false); + } + } + return; } checkLengthErrorPt(iToken + 1, 1); if (plane == null && pt == null && iAtom == Integer.MIN_VALUE) Modified: trunk/Jmol/src/org/jmol/smiles/SmilesSearch.java =================================================================== --- trunk/Jmol/src/org/jmol/smiles/SmilesSearch.java 2016-02-06 21:26:19 UTC (rev 20956) +++ trunk/Jmol/src/org/jmol/smiles/SmilesSearch.java 2016-02-10 02:22:20 UTC (rev 20957) @@ -206,7 +206,7 @@ boolean aromaticStrict = ((flags & Edge.FLAG_AROMATIC_STRICT) != 0); boolean aromaticDefined = ((flags & Edge.FLAG_AROMATIC_DEFINED) != 0); if (aromaticStrict && vRings == null) - vRings = AU.createArrayOfArrayList(4); + vRings = AU.createArrayOfArrayList(4); if (aromaticDefined && needAromatic) { // predefined aromatic bonds bsAromatic = SmilesAromatic.checkAromaticDefined(jmolAtoms, bsSelected); @@ -235,10 +235,10 @@ SmilesSearch search = SmilesParser.getMolecule(smarts, true); Lst<Object> vR = (Lst<Object>) subsearch(search, false, true); if (vRings != null && i <= 5) { - Lst<BS> v = new Lst<BS>(); - for (int j = vR.size(); --j >= 0; ) + Lst<BS> v = new Lst<BS>(); + for (int j = vR.size(); --j >= 0;) v.addLast((BS) vR.get(j)); - vRings[i-3] = v; + vRings[i - 3] = v; } if (needAromatic) { if (!aromaticDefined && (!aromaticStrict || i == 5 || i == 6)) @@ -246,8 +246,18 @@ BS bs = (BS) vR.get(r); if (aromaticDefined || SmilesAromatic.isFlatSp2Ring(jmolAtoms, bsSelected, bs, - (aromaticStrict ? 0.1f : 0.01f))) + (aromaticStrict ? 0.1f : 0.01f))) { bsAromatic.or(bs); + if (!aromaticStrict) + switch (i) { + case 5: + bsAromatic5.or(bs); + break; + case 6: + bsAromatic6.or(bs); + break; + } + } } if (aromaticStrict) { switch (i) { @@ -260,7 +270,7 @@ bsAromatic); else SmilesAromatic.checkAromaticStrict(jmolAtoms, bsAromatic, v5, vR); - vRings[3] = new Lst<BS>(); + vRings[3] = new Lst<BS>(); setAromatic56(v5, bsAromatic5, 5, vRings[3]); setAromatic56(vR, bsAromatic6, 6, vRings[3]); break; @@ -859,11 +869,10 @@ if (patternAtom.residueChar != null || patternAtom.elementNumber == -2) { char atype = a.getBioSmilesType(); char ptype = patternAtom.getBioSmilesType(); - char resChar = (patternAtom.residueChar == null ? '*' - : patternAtom.residueChar.charAt(0)); boolean ok = true; boolean isNucleic = false; switch (ptype) { + case '\0': case '*': ok = true; break; @@ -882,6 +891,8 @@ if (!ok) break; String s = a.getGroup1('\0').toUpperCase(); + char resChar = (patternAtom.residueChar == null ? '*' + : patternAtom.residueChar.charAt(0)); boolean isOK = (resChar == s.charAt(0)); switch (resChar) { case '*': Modified: trunk/Jmol/src/org/jmol/viewer/ActionManager.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/ActionManager.java 2016-02-06 21:26:19 UTC (rev 20956) +++ trunk/Jmol/src/org/jmol/viewer/ActionManager.java 2016-02-10 02:22:20 UTC (rev 20957) @@ -1823,44 +1823,8 @@ } return; case PICKING_INVERT_STEREO: - if (bnd(clickAction, ACTION_assignNew)) { - bs = vwr.getAtomBitSet("connected(atomIndex=" + atomIndex - + ") and !within(SMARTS,'[r50,R]')"); - int nb = bs.cardinality(); - switch (nb) { - case 0: - case 1: - // not enough non-ring atoms - return; - case 2: - break; - case 3: - case 4: - // three or four are not in a ring. So let's find the shortest two - // branches and invert them. - int[] lengths = new int[nb]; - int[] points = new int[nb]; - int ni = 0; - for (int i = bs.nextSetBit(0); i >= 0; i = bs.nextSetBit(i + 1), ni++) { - lengths[ni] = vwr.getBranchBitSet(i, atomIndex, true) - .cardinality(); - points[ni] = i; - } - for (int j = 0; j < nb - 2; j++) { - int max = Integer.MIN_VALUE; - int imax = 0; - for (int i = 0; i < nb; i++) - if (lengths[i] >= max && bs.get(points[i])) { - imax = points[i]; - max = lengths[i]; - } - bs.clear(imax); - } - } - vwr.undoMoveActionClear(atomIndex, AtomCollection.TAINT_COORD, true); - vwr.invertSelected(null, null, atomIndex, bs); - vwr.setStatusAtomPicked(atomIndex, "inverted: " + Escape.eBS(bs), null); - } + if (bnd(clickAction, ACTION_assignNew)) + vwr.invertRingAt(atomIndex), true); return; case PICKING_DELETE_ATOM: if (bnd(clickAction, ACTION_deleteAtom)) { Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2016-02-06 21:26:19 UTC (rev 20956) +++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2016-02-10 02:22:20 UTC (rev 20957) @@ -64,8 +64,18 @@ TODO: isosurface molecular has an issue with 2gb1 -Jmol.___JmolVersion="14.5.2_2016.02.06" +Jmol.___JmolVersion="14.5.2_2016.02.09" +new feature: invertselected ATOMS {ring atoms to invert} + -- inverts ring stereochemistry + -- requires prior selection of all atoms to be involved in the inversion + +bug fix: SMARTS pattern [ALA.*] not working without biological polymer type indication +bug fix: SMARTS pattern [r500] not working outside of MINIMIZE + + +JmolVersion="14.5.2_2016.02.06" + new feature: isosurface BACKSHELL -- displays just the back side of an isosurface -- works by reversing the normals, then showing front only Modified: trunk/Jmol/src/org/jmol/viewer/Viewer.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Viewer.java 2016-02-06 21:26:19 UTC (rev 20956) +++ trunk/Jmol/src/org/jmol/viewer/Viewer.java 2016-02-10 02:22:20 UTC (rev 20957) @@ -7435,6 +7435,46 @@ sm.setStatusAtomMoved(bs); } + public void invertRingAt(int atomIndex, boolean isClick) { + // [r50 here just sets the max ring size to 50 + BS bs = getAtomBitSet("connected(atomIndex=" + atomIndex + ") and !within(SMARTS,'[r50,R]')"); + int nb = bs.cardinality(); + switch (nb) { + case 0: + case 1: + // not enough non-ring atoms + return; + case 2: + break; + case 3: + case 4: + // three or four are not in a ring. So let's find the shortest two + // branches and invert them. + int[] lengths = new int[nb]; + int[] points = new int[nb]; + int ni = 0; + for (int i = bs.nextSetBit(0); i >= 0; i = bs.nextSetBit(i + 1), ni++) { + lengths[ni] = getBranchBitSet(i, atomIndex, true).cardinality(); + points[ni] = i; + } + for (int j = 0; j < nb - 2; j++) { + int max = Integer.MIN_VALUE; + int imax = 0; + for (int i = 0; i < nb; i++) + if (lengths[i] >= max && bs.get(points[i])) { + imax = points[i]; + max = lengths[i]; + } + bs.clear(imax); + } + } + if (isClick) + undoMoveActionClear(atomIndex, AtomCollection.TAINT_COORD, true); + invertSelected(null, null, atomIndex, bs); + if (isClick) + setStatusAtomPicked(atomIndex, "inverted: " + Escape.eBS(bs), null); + } + public void invertSelected(P3 pt, P4 plane, int iAtom, BS invAtoms) { // Eval BS bs = bsA(); @@ -9363,4 +9403,5 @@ jsonParser = ((JSJSONParser) Interface.getInterface("javajs.util.JSJSONParser", this, "script")); return jsonParser.parseMap(ann, true); } + } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. ------------------------------------------------------------------------------ Site24x7 APM Insight: Get Deep Visibility into Application Performance APM + Mobile APM + RUM: Monitor 3 App instances at just $35/Month Monitor end-to-end web transactions and take corrective actions now Troubleshoot faster and improve end-user experience. Signup Now! http://pubads.g.doubleclick.net/gampad/clk?id=272487151&iu=/4140 _______________________________________________ Jmol-commits mailing list Jmol-commits@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/jmol-commits