Revision: 20739 http://sourceforge.net/p/jmol/code/20739 Author: hansonr Date: 2015-08-28 15:13:16 +0000 (Fri, 28 Aug 2015) Log Message: ----------- Jmol.___JmolVersion="14.3.16_2015.08.28"
new feature: Gaussian fchk reader reads vibrational modes -- Gaussian command deck must include Freq=(SaveNormalModes,Raman,VibRot) Modified Paths: -------------- trunk/Jmol/src/org/jmol/adapter/readers/quantum/GaussianFchkReader.java trunk/Jmol/src/org/jmol/adapter/readers/quantum/GaussianReader.java trunk/Jmol/src/org/jmol/scriptext/MathExt.java trunk/Jmol/src/org/jmol/scriptext/SmilesExt.java trunk/Jmol/src/org/jmol/smiles/SmilesGenerator.java trunk/Jmol/src/org/jmol/smiles/SmilesMatcher.java trunk/Jmol/src/org/jmol/viewer/JC.java trunk/Jmol/src/org/jmol/viewer/Jmol.properties trunk/Jmol/src/org/jmol/viewer/Viewer.java Modified: trunk/Jmol/src/org/jmol/adapter/readers/quantum/GaussianFchkReader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/quantum/GaussianFchkReader.java 2015-08-26 14:39:24 UTC (rev 20738) +++ trunk/Jmol/src/org/jmol/adapter/readers/quantum/GaussianFchkReader.java 2015-08-28 15:13:16 UTC (rev 20739) @@ -42,9 +42,12 @@ /** * Reader for Gaussian fchk files - * also allows appended frequency info from the log file + * for vibrational modes, add Freq=(SaveNormalModes,Raman,VibRot) * * + * also allows appended freq data + * + * * @author hansonr Bob Hanson hans...@stolaf.edu * **/ @@ -69,15 +72,77 @@ readPartialCharges(); readBasis(); readMolecularObitals(); - readFrequencies("NumFreq", false); // if log frequency info is appended + checkForFreq(); continuing = false; } + private void checkForFreq() throws Exception { + Integer n = (Integer) fileData.get("Vib-NDim"); + if (n == null) { +// NumAtom 9 +// NumFreq 21 +// 1 2 3 +// A2 B1 A2 +// Frequencies -- 613.8891 622.9996 722.2497 +// Red. masses -- 3.1195 3.8445 1.3156 +// Frc consts -- 0.6927 0.8791 0.4043 + readFrequencies("NumFreq", false); // if freq file appended + return; + } + try { + int nModes = n.intValue(); + float[] vibE2 = (float[]) fileData.get("Vib-E2"); + float[] modes = (float[]) fileData.get("Vib-Modes"); + float[] frequencies = fillFloat(vibE2, 0, nModes); + float[] red_masses = fillFloat(vibE2, nModes, nModes); + float[] frc_consts = fillFloat(vibE2, nModes * 2, nModes); + float[] intensities = fillFloat(vibE2, nModes * 3, nModes); + int ac = asc.getLastAtomSetAtomCount(); + boolean[] ignore = new boolean[nModes]; + int fpt = 0; + for (int i = 0; i < nModes; ++i) { + ignore[i] = !doGetVibration(++vibrationNumber); + if (ignore[i]) + continue; + int iAtom0 = asc.ac; + asc.cloneAtomSetWithBonds(true); + // set the properties + String name = asc.setAtomSetFrequency("Calculation " + calculationNumber, null, "" + frequencies[i], null); + appendLoadNote("model " + asc.atomSetCount + ": " + name); + namedSets.set(asc.iSet); + asc.setAtomSetModelProperty("ReducedMass", + red_masses[i]+" AMU"); + asc.setAtomSetModelProperty("ForceConstant", + frc_consts[i]+" mDyne/A"); + asc.setAtomSetModelProperty("IRIntensity", + intensities[i]+" KM/Mole"); + for (int iAtom = 0; iAtom < ac; iAtom++) { + asc.addVibrationVectorWithSymmetry(iAtom0 + + iAtom, modes[fpt++], modes[fpt++], modes[fpt++], false); + } + } + } catch (Exception e) { + Logger.error("Could not read Vib-E2 section: " + e.getMessage()); + } + + } + + private float[] fillFloat(float[] f0, int i, int n) { + float[] f = new float[n]; + for (int i1 = 0, ilast = i + n; i < ilast; i++, i1++) + f[i1] = f0[i]; + return f; + } + private void readAllData() throws Exception { while ((line == null ? rd() : line) != null) { if (line.length() < 40) { - if (line.indexOf("NumAtom") == 0) + if (line.indexOf("NumAtom") == 0) { + // freq file appended +// NumAtom 9 +// NumFreq 21 return; + } continue; } String name = PT.rep(line.substring(0, 40).trim(), " ", ""); Modified: trunk/Jmol/src/org/jmol/adapter/readers/quantum/GaussianReader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/quantum/GaussianReader.java 2015-08-26 14:39:24 UTC (rev 20738) +++ trunk/Jmol/src/org/jmol/adapter/readers/quantum/GaussianReader.java 2015-08-28 15:13:16 UTC (rev 20739) @@ -65,7 +65,7 @@ private String energyKey = ""; /** The number of the calculation being interpreted. */ - private int calculationNumber = 1; + protected int calculationNumber = 1; /** The scan point, where -1 denotes no scan information. */ private int scanPoint = -1; @@ -78,7 +78,7 @@ private int stepNumber; private int moModelSet = -1; - private BS namedSets = new BS(); + protected BS namedSets = new BS(); /** Modified: trunk/Jmol/src/org/jmol/scriptext/MathExt.java =================================================================== --- trunk/Jmol/src/org/jmol/scriptext/MathExt.java 2015-08-26 14:39:24 UTC (rev 20738) +++ trunk/Jmol/src/org/jmol/scriptext/MathExt.java 2015-08-28 15:13:16 UTC (rev 20739) @@ -429,14 +429,14 @@ return mp.addXStr("NONE"); if (bs1 != null) smiles1 = (String) e.getSmilesExt().getSmilesMatches("", null, bs1, - null, false, true, false); + null, JC.SMILES_TYPE_SMILES, true, false); boolean check; if (bs2 == null) { // note: find smiles1 IN smiles2 here check = (vwr.getSmilesMatcher().areEqual(smiles2, smiles1) > 0); } else { check = (((BS) e.getSmilesExt().getSmilesMatches(smiles1, null, bs2, - null, false, true, false)).nextSetBit(0) >= 0); + null, JC.SMILES_TYPE_SMILES, true, false)).nextSetBit(0) >= 0); } if (!check) { // MF matched, but didn't match SMILES @@ -451,7 +451,7 @@ check = (vwr.getSmilesMatcher().areEqual(smiles1, smiles2) > 0); } else { check = (((BS) e.getSmilesExt().getSmilesMatches(smiles1, null, - bs2, null, false, true, false)).nextSetBit(0) >= 0); + bs2, null, JC.SMILES_TYPE_SMILES, true, false)).nextSetBit(0) >= 0); } if (check) return mp.addXStr("ENANTIOMERS"); @@ -462,7 +462,7 @@ smiles1) > 0); } else { Object ret = e.getSmilesExt().getSmilesMatches( - "/nostereo/" + smiles1, null, bs2, null, false, true, false); + "/nostereo/" + smiles1, null, bs2, null, JC.SMILES_TYPE_SMILES, true, false); check = (((BS) ret).nextSetBit(0) >= 0); } if (check) @@ -515,7 +515,7 @@ pattern = "/noaromatic" + (allMaps || bestMap ? "/" : " nostereo/") + e.getSmilesExt().getSmilesMatches((hMaps ? "H" : ""), null, - bs1, null, false, true, false); + bs1, null, JC.SMILES_TYPE_SMILES, true, false); } else { allMaps = true; } @@ -1110,7 +1110,9 @@ } try { ret = e.getSmilesExt().getSmilesMatches(pattern, smiles, null, - null, isSMARTS, !asMap, !allMappings); + null, + isSMARTS ? JC.SMILES_TYPE_SMARTS : JC.SMILES_TYPE_SMILES, + !asMap, !allMappings); } catch (Exception e) { return mp.addXInt(-1); } @@ -1149,8 +1151,12 @@ | JC.SMILES_RETURN_FIRST); ret = (map.length > 0 ? vwr.ms.getDihedralMap(map[0]) : new int[0]); } else { + int smilesFlags = (isSmiles ? JC.SMILES_TYPE_SMILES + : JC.SMILES_TYPE_SMARTS) + | (isON && sFind.length() == 0 ? JC.SMILES_BIO + | JC.SMILES_BIO_COMMENT : 0); ret = e.getSmilesExt().getSmilesMatches(sFind, null, (BS) x1.value, - bsMatch3D, !isSmiles, !isAll, false); + bsMatch3D, smilesFlags, !isON, false); } break; } @@ -2782,8 +2788,8 @@ RadiusData rd = null; switch (tok) { case T.branch: - return (i == 3 && args[1].value instanceof BS - && args[2].value instanceof BS && mp.addXBs(vwr.getBranchBitSet( + return (i == 3 && args[1].value instanceof BS + && args[2].value instanceof BS && mp.addXBs(vwr.getBranchBitSet( ((BS) args[2].value).nextSetBit(0), ((BS) args[1].value).nextSetBit(0), true))); case T.smiles: @@ -2806,8 +2812,10 @@ } if (!isOK) e.invArg(); - return mp.addXObj(e.getSmilesExt().getSmilesMatches(SV.sValue(args[1]), null, bsSelected, - null, tok == T.search, mp.asBitSet, false)); + return mp.addXObj(e.getSmilesExt().getSmilesMatches(SV.sValue(args[1]), + null, bsSelected, null, + tok == T.search ? JC.SMILES_TYPE_SMARTS : JC.SMILES_TYPE_SMILES, + mp.asBitSet, false)); } if (withinSpec instanceof String) { if (tok == T.nada) { @@ -2835,13 +2843,13 @@ return mp.addXBs(getAtomsNearSurface(distance, s.substring(1))); isWithinGroup = (s.equalsIgnoreCase("group")); isVdw = (!isWithinGroup && s.equalsIgnoreCase("vanderwaals")); - isWithinUnitcell = (!isWithinGroup && s.equalsIgnoreCase("unitcell")); + isWithinUnitcell = (!isWithinGroup && s.equalsIgnoreCase("unitcell")); if (isVdw) { withinSpec = null; tok = T.vanderwaals; } else if (isWithinUnitcell) { - tok = T.unitcell; - } else { + tok = T.unitcell; + } else { tok = T.group; } break; @@ -2881,8 +2889,8 @@ case T.rna3d: case T.domains: case T.validation: - return mp.addXBs(vwr.ms.getAtoms(tok, - SV.sValue(args[args.length - 1]))); + return mp + .addXBs(vwr.ms.getAtoms(tok, SV.sValue(args[args.length - 1]))); } break; case 3: @@ -2926,11 +2934,12 @@ bs = (args[i].tok == T.bitset ? SV.bsSelectVar(args[i]) : null); if (tok == T.unitcell) { boolean asMap = isWithinModelSet; - return mp.addXObj(vwr.ms.getUnitCellPointsWithin(distance, bs, pt, asMap)); + return mp + .addXObj(vwr.ms.getUnitCellPointsWithin(distance, bs, pt, asMap)); } if (pt != null) return mp.addXBs(vwr.getAtomsNearPt(distance, pt)); - + if (tok == T.sequence) return mp.addXBs(vwr.ms.getSequenceBits(withinStr, bs)); if (bs == null) Modified: trunk/Jmol/src/org/jmol/scriptext/SmilesExt.java =================================================================== --- trunk/Jmol/src/org/jmol/scriptext/SmilesExt.java 2015-08-26 14:39:24 UTC (rev 20738) +++ trunk/Jmol/src/org/jmol/scriptext/SmilesExt.java 2015-08-28 15:13:16 UTC (rev 20739) @@ -24,25 +24,21 @@ package org.jmol.scriptext; +import javajs.util.AU; +import javajs.util.Lst; +import javajs.util.M4; +import javajs.util.Measure; +import javajs.util.P3; + import org.jmol.api.Interface; import org.jmol.api.SmilesMatcherInterface; import org.jmol.java.BS; import org.jmol.modelset.Atom; -import org.jmol.modelset.BondSet; import org.jmol.script.ScriptEval; import org.jmol.script.ScriptException; -import org.jmol.util.BSUtil; - -import javajs.util.AU; -import javajs.util.Lst; -import javajs.util.Measure; - import org.jmol.util.Logger; import org.jmol.viewer.JC; -import javajs.util.M4; -import javajs.util.P3; - public class SmilesExt { private ScriptEval e; @@ -160,52 +156,47 @@ } /** - * @param pattern e - * @param smiles - * @param bsSelected - * @param bsMatch3D - * @param isSmarts - * @param asOneBitset - * @param firstMatchOnly - * @return - * @throws ScriptException + * @param pattern + * e + * @param smiles + * @param bsSelected + * @param bsMatch3D + * @param flags + * @param asOneBitset + * @param firstMatchOnly + * @return Object + * @throws ScriptException */ public Object getSmilesMatches(String pattern, String smiles, BS bsSelected, - BS bsMatch3D, boolean isSmarts, - boolean asOneBitset, boolean firstMatchOnly) throws ScriptException { + BS bsMatch3D, int flags, boolean asOneBitset, + boolean firstMatchOnly) throws ScriptException { // just retrieving the SMILES or bioSMILES string - if (pattern.length() == 0 || pattern.equals("H") || pattern.equals("*")) { - boolean isBioSmiles = (!asOneBitset); try { return e.vwr.getSmilesOpt( bsSelected, 0, 0, - (pattern.equals("H") ? JC.SMILES_EXPLICIT_H : 0) - | (pattern.equals("*") ? JC.SMILES_TOPOLOGY : 0) - | (isBioSmiles ? JC.SMILES_BIO | JC.SMILES_BIO_CROSSLINK - | JC.SMILES_BIO_COMMENT : 0)); + flags | (pattern.equals("H") ? JC.SMILES_EXPLICIT_H : 0) + | (pattern.equals("*") ? JC.SMILES_TOPOLOGY : 0)); } catch (Exception ex) { e.evalError(ex.getMessage(), null); } } - BS[] b; if (bsMatch3D == null) { - // getting a BitSet or BitSet[] from a set of atoms or a pattern. - + boolean isSmarts = JC.checkFlag(flags, JC.SMILES_TYPE_SMARTS); try { if (smiles == null) { b = sm.getSubstructureSetArray(pattern, e.vwr.ms.at, e.vwr.ms.ac, - bsSelected, null, isSmarts ? JC.SMILES_TYPE_SMARTS - : JC.SMILES_TYPE_SMILES); + bsSelected, null, flags); } else { int[][] map = sm.find(pattern, smiles, isSmarts, firstMatchOnly); if (!asOneBitset) - return (!firstMatchOnly ? map : map.length == 0 ? new int[0] : map[0]); + return (!firstMatchOnly ? map : map.length == 0 ? new int[0] + : map[0]); BS bs = new BS(); for (int j = 0; j < map.length; j++) { int[] a = map[j]; @@ -232,13 +223,9 @@ Lst<BS> vReturn = new Lst<BS>(); float stddev = getSmilesCorrelation(bsMatch3D, bsSelected, pattern, null, - null, null, vReturn, false, null, null, false, - isSmarts ? JC.SMILES_TYPE_SMARTS : JC.SMILES_TYPE_SMILES); - if (Float.isNaN(stddev)) { - if (asOneBitset) - return new BS(); - return new String[] {}; - } + null, null, vReturn, false, null, null, false, flags); + if (Float.isNaN(stddev)) + return (asOneBitset ? new BS() : new String[] {}); e.showString("RMSD " + stddev + " Angstroms"); b = vReturn.toArray(new BS[vReturn.size()]); } Modified: trunk/Jmol/src/org/jmol/smiles/SmilesGenerator.java =================================================================== --- trunk/Jmol/src/org/jmol/smiles/SmilesGenerator.java 2015-08-26 14:39:24 UTC (rev 20738) +++ trunk/Jmol/src/org/jmol/smiles/SmilesGenerator.java 2015-08-28 15:13:16 UTC (rev 20739) @@ -84,10 +84,11 @@ private BS bsIncludingH; private boolean topologyOnly; boolean getAromatic = true; + private boolean addAtomComment; // generation of SMILES strings - String getSmiles(Node[] atoms, int ac, BS bsSelected, boolean explicitH, boolean topologyOnly, boolean getAromatic) + String getSmiles(Node[] atoms, int ac, BS bsSelected, boolean explicitH, boolean topologyOnly, boolean getAromatic, boolean addAtomComment) throws InvalidSmilesException { int i = bsSelected.nextSetBit(0); if (i < 0) @@ -98,6 +99,7 @@ this.explicitH = explicitH; this.topologyOnly = topologyOnly; this.getAromatic = getAromatic; + this.addAtomComment = addAtomComment; return getSmilesComponent(atoms[i], bsSelected, true, false); } @@ -122,7 +124,7 @@ BNode a = atoms[i]; String ch = a.getGroup1('?'); String bioStructureName = a.getBioStructureTypeName(); - boolean unknown = (ch.equals("?")); + boolean unknown = (ch == ch.toLowerCase()); if (end != null) { if (sb.length() > 0) sb.append(end); @@ -135,7 +137,7 @@ len = s.length(); sb.append(s); } - sb.append("~").appendC(bioStructureName.charAt(0)).append("~"); + sb.append("~").appendC(bioStructureName.toLowerCase().charAt(0)).append("~"); len++; } else { s = getSmilesComponent(a, bs, false, true); @@ -157,7 +159,7 @@ len = 2; } if (unknown) { - addBracketedBioName(sb, a, bioStructureName.length() > 0 ? ".0" : null); + addBracketedBioName(sb, a, bioStructureName.length() > 0 ? ".0" : null, false); } else { sb.append(ch); } @@ -199,7 +201,7 @@ return s; } - private void addBracketedBioName(SB sb, Node atom, String atomName) { + private void addBracketedBioName(SB sb, Node atom, String atomName, boolean addComment) { sb.append("["); if (atomName != null && atom instanceof BNode) { BNode a = (BNode) atom; @@ -207,11 +209,13 @@ sb.append(a.getGroup3(false)); if (!atomName.equals(".0")) sb.append(atomName).append("#").appendI(a.getElementNumber()); + if (addComment) { sb.append("//* ").appendI( a.getResno()); if (chain.length() > 0) sb.append(":").append(chain); sb.append(" *//"); + } } else { sb.append(Elements.elementNameFromNumber(atom.getElementNumber())); } @@ -662,12 +666,12 @@ // for bioSMARTS we provide the connecting atom if // present. For example, in 1BLU we have // .[CYS.SG#16] could match either the atom number or the element number - if (Logger.debugging) + if (addAtomComment) sb.append("\n//* " + atom + " *//\t"); if (topologyOnly) sb.append("*"); else if (isExtension && groupType.length() != 0 && atomName.length() != 0) - addBracketedBioName(sb, atom, "." + atomName); + addBracketedBioName(sb, atom, "." + atomName, false); else sb.append(SmilesAtom .getAtomLabel(atomicNumber, isotope, valence, charge, nH, isAromatic, Modified: trunk/Jmol/src/org/jmol/smiles/SmilesMatcher.java =================================================================== --- trunk/Jmol/src/org/jmol/smiles/SmilesMatcher.java 2015-08-26 14:39:24 UTC (rev 20738) +++ trunk/Jmol/src/org/jmol/smiles/SmilesMatcher.java 2015-08-28 15:13:16 UTC (rev 20739) @@ -106,10 +106,6 @@ private final static int SMILES_MODE_MASK = 0x00F000; - private boolean checkFlag(int flags, int flag) { - return (flags & flag) == flag; - } - @Override public String getLastException() { return InvalidSmilesException.getLastError(); @@ -149,19 +145,20 @@ String bioComment, int flags) throws Exception { // boolean asBioSmiles, boolean bioAllowUnmatchedRings, boolean bioAddCrossLinks, boolean explicitH InvalidSmilesException.clear(); - if (checkFlag(flags, JC.SMILES_BIO)) { - boolean bioAllowUnmatchedRings = checkFlag(flags, + if (JC.checkFlag(flags, JC.SMILES_BIO)) { + boolean bioAllowUnmatchedRings = JC.checkFlag(flags, JC.SMILES_BIO_ALLOW_UNMACHED_RINGS); - boolean bioAddCrossLinks = checkFlag(flags, JC.SMILES_BIO_CROSSLINK); + boolean bioAddCrossLinks = JC.checkFlag(flags, JC.SMILES_BIO_CROSSLINK); return (new SmilesGenerator()).getBioSmiles((BNode[]) atoms, ac, bsSelected, bioAllowUnmatchedRings, bioAddCrossLinks, bioComment); } - boolean explicitH = checkFlag(flags, JC.SMILES_EXPLICIT_H); - boolean topologyOnly = checkFlag(flags, JC.SMILES_TOPOLOGY); - boolean getAromatic = !checkFlag(flags, JC.SMILES_NOAROMATIC); + boolean explicitH = JC.checkFlag(flags, JC.SMILES_EXPLICIT_H); + boolean topologyOnly = JC.checkFlag(flags, JC.SMILES_TOPOLOGY); + boolean getAromatic = !JC.checkFlag(flags, JC.SMILES_NOAROMATIC); + boolean addAtomComment = JC.checkFlag(flags, JC.SMILES_ATOM_COMMENT); return (new SmilesGenerator()).getSmiles(atoms, ac, bsSelected, explicitH, - topologyOnly, getAromatic); + topologyOnly, getAromatic, addAtomComment); } @Override @@ -452,7 +449,7 @@ BS bsAromatic, int flags) throws Exception { InvalidSmilesException.clear(); try { - SmilesSearch search = SmilesParser.getMolecule(pattern, checkFlag(flags, JC.SMILES_TYPE_SMARTS)); + SmilesSearch search = SmilesParser.getMolecule(pattern, JC.checkFlag(flags, JC.SMILES_TYPE_SMARTS)); search.jmolAtoms = atoms; if (atoms instanceof BNode[]) search.bioAtoms = (BNode[]) atoms; @@ -463,8 +460,8 @@ search.getSelections(); search.bsRequired = null;//(bsRequired != null && bsRequired.cardinality() > 0 ? bsRequired : null); search.setRingData(bsAromatic); - search.firstMatchOnly = checkFlag(flags, JC.SMILES_RETURN_FIRST); - search.matchAllAtoms = checkFlag(flags, JC.SMILES_MATCH_ALL); + search.firstMatchOnly = JC.checkFlag(flags, JC.SMILES_RETURN_FIRST); + search.matchAllAtoms = JC.checkFlag(flags, JC.SMILES_MATCH_ALL); switch (flags & SMILES_MODE_MASK) { case SMILES_MODE_BITSET: search.asVector = false; Modified: trunk/Jmol/src/org/jmol/viewer/JC.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/JC.java 2015-08-26 14:39:24 UTC (rev 20738) +++ trunk/Jmol/src/org/jmol/viewer/JC.java 2015-08-28 15:13:16 UTC (rev 20739) @@ -1032,22 +1032,22 @@ return hAlignNames[(align >> TEXT_ALIGN_SHIFT) & 3]; } - public static final int SMILES_EXPLICIT_H = 0x001; - public static final int SMILES_TOPOLOGY = 0x002; - public static final int SMILES_NOAROMATIC = 0x004; - public static final int SMILES_BIO = 0x100; - public static final int SMILES_BIO_ALLOW_UNMACHED_RINGS = 0x101; - public static final int SMILES_BIO_CROSSLINK = 0x102; - public static final int SMILES_BIO_COMMENT = 0x104; + public static final int SMILES_TYPE_SMILES = 0x1; + public static final int SMILES_TYPE_SMARTS = 0x2; - public static final int SMILES_TYPE_SMILES = 0x010000; - public static final int SMILES_TYPE_SMARTS = 0x020000; - public static final int SMILES_MATCH_ALL = 0x100000; - public static final int SMILES_MATCH_ONE = 0x200000; - public static final int SMILES_RETURN_FIRST = 0x400000; + public static final int SMILES_MATCH_ALL = 0x10; + public static final int SMILES_MATCH_ONE = 0x20; + public static final int SMILES_RETURN_FIRST = 0x40; - - + public static final int SMILES_EXPLICIT_H = 0x00100; + public static final int SMILES_TOPOLOGY = 0x00200; + public static final int SMILES_NOAROMATIC = 0x00400; + public static final int SMILES_BIO = 0x10000; + public static final int SMILES_BIO_ALLOW_UNMACHED_RINGS = 0x10100; + public static final int SMILES_BIO_CROSSLINK = 0x10200; + public static final int SMILES_BIO_COMMENT = 0x10400; + public static final int SMILES_ATOM_COMMENT = 0x20000; + public static final int JSV_NOT = -1; public static final int JSV_SEND_JDXMOL = 0; public static final int JSV_SETPEAKS = 7; @@ -1079,4 +1079,8 @@ public static String READER_NOT_FOUND = "File reader was not found:"; + public static boolean checkFlag(int flags, int flag) { + return (flags & flag) == flag; + } + } Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2015-08-26 14:39:24 UTC (rev 20738) +++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2015-08-28 15:13:16 UTC (rev 20739) @@ -60,8 +60,12 @@ TODO: Rolf's errors in Safari due to move + zoomto +Jmol.___JmolVersion="14.3.16_2015.08.28" + +new feature: Gaussian fchk reader reads vibrational modes +-- Gaussian command deck must include Freq=(SaveNormalModes,Raman,VibRot) -Jmol.___JmolVersion="14.3.16_2015.08.26" +JmolVersion="14.3.16_2015.08.26" new feature: SMARTS conformational search no longer limited to one range. -- example: Modified: trunk/Jmol/src/org/jmol/viewer/Viewer.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Viewer.java 2015-08-26 14:39:24 UTC (rev 20738) +++ trunk/Jmol/src/org/jmol/viewer/Viewer.java 2015-08-28 15:13:16 UTC (rev 20739) @@ -8620,7 +8620,7 @@ @Override public String getSmiles(BS bs) throws Exception { - return getSmilesOpt(bs, -1, -1, 0); + return getSmilesOpt(bs, -1, -1, Logger.debugging ? JC.SMILES_ATOM_COMMENT : 0); } /** This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. ------------------------------------------------------------------------------ _______________________________________________ Jmol-commits mailing list Jmol-commits@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/jmol-commits