Revision: 20985 http://sourceforge.net/p/jmol/code/20985 Author: hansonr Date: 2016-03-09 02:01:42 +0000 (Wed, 09 Mar 2016) Log Message: ----------- JmolVersion="14.4.3_2016.03.08"
new feature: WRITE MOL0 xxx.mol -- MOL format with no bonds of type 6 or 7 (aromatic single/double) -- needed for http://metamolecular.com/inchi-js bug fix: OpenSMILES even-atom cumulene stereochemistry not implemented -- examples (reporting "DIASTEREOMERS") print compare("F/C=C=C=C/F","F/C=C=C=C\\F","isomer") load $F-C=C=C=C-F;print compare("F/C=C=C=C\\F",{1.1},"isomer") bug fix: SMILES generator unnecessarily over-expressing double-bond / and \. bug fix: SMILES generator aromaticity should not make ring atoms of quinone aromatic bug fix: SMILES generator aromaticity not recognizing issue with exocyclic double bonds bug fix: SMILES generator aromaticity is too broadly defined -- updated aromatic for generation purposes only: (a) the atom is in a 6-membered ring containing only C, N, or O and matching SMARTS [#6X3+0,#6X2+1,#6X2-1,#7X2+0,#7X3+1,#8X2+1] (b) the atom is not doubly bonded to any nonaromatic atom (prevents case of exocyclic double bonds) (c) the atom connects with at least two other aromatic atoms new feature: (JSmol) standard InChI generator (see inchi.htm, inchi/*) -- JavaScript library for generation of InChIs -- runs completely in JavaScript -- equivalent to SHOW CHEMICAL stdinchi -- about 900 KB new feature: optional processing of OpenSMILES [CH2:002] ":<n>" atom class. -- positive integer value only -- checks the atom property property_osclass -- for SMARTS, [:0] means "without an osclass" -- for SMARTS, [!:0] means "any non-zero osclass" -- for SMARTS, same as [$(select property_osclass=n)] -- only enabled with Jmol SMILES directive "/opensmiles/"; otherwise ignored -- for example: $ load $2-butanol $ show smiles C[C@H](O)CC $ @2.property_osclass=2 $ @3.property_osclass=3 $ @5.property_osclass=5 $ select * 15 atoms selected $ select on search("/opensmiles/[:3]") 1 atoms selected $ select on search("/opensmiles/[!:3]") 14 atoms selected $ select on search("/opensmiles/[:0]") 12 atoms selected $ select on search("/opensmiles/[!:0]") 3 atoms selected $ select on search("/opensmiles/[!:3 & !:0]") 2 atoms selected new feature: {*}.find("OPENSMILES") -- adds atom class if property_osclass is nonzero -- for example: $ load $2-butanol $ @2.property_osclass=2 $ @3.property_osclass=3 $ @5.property_osclass=5 $ print {*}.find("opensmiles") C[C@H:2]([OH:5])[CH2:3]C Modified Paths: -------------- branches/v14_4/Jmol/src/org/jmol/scriptext/CmdExt.java branches/v14_4/Jmol/src/org/jmol/viewer/Jmol.properties branches/v14_4/Jmol/src/org/jmol/viewer/PropertyManager.java trunk/Jmol/src/org/jmol/scriptext/CmdExt.java trunk/Jmol/src/org/jmol/viewer/Jmol.properties trunk/Jmol/src/org/jmol/viewer/PropertyManager.java Modified: branches/v14_4/Jmol/src/org/jmol/scriptext/CmdExt.java =================================================================== --- branches/v14_4/Jmol/src/org/jmol/scriptext/CmdExt.java 2016-03-08 20:49:29 UTC (rev 20984) +++ branches/v14_4/Jmol/src/org/jmol/scriptext/CmdExt.java 2016-03-09 02:01:42 UTC (rev 20985) @@ -3777,7 +3777,7 @@ && !PT .isOneOf( type, - ";SCENE;JMOL;ZIP;ZIPALL;SPT;HISTORY;MO;NBO;ISOSURFACE;MESH;PMESH;VAR;FILE;FUNCTION;CML;JSON;XYZ;XYZRN;XYZVIB;MENU;MOL;PDB;PGRP;PQR;QUAT;RAMA;SDF;V2000;V3000;INLINE;")) + ";SCENE;JMOL;ZIP;ZIPALL;SPT;HISTORY;MO;NBO;ISOSURFACE;MESH;PMESH;VAR;FILE;FUNCTION;CML;JSON;XYZ;XYZRN;XYZVIB;MENU;MOL;MOL0;PDB;PGRP;PQR;QUAT;RAMA;SDF;V2000;V3000;INLINE;")) eval.errorStr2( ScriptError.ERROR_writeWhat, "COORDS|FILE|FUNCTIONS|HISTORY|IMAGE|INLINE|ISOSURFACE|JMOL|MENU|MO|NBO|POINTGROUP|QUATERNION [w,x,y,z] [derivative]" @@ -3861,7 +3861,7 @@ data = vwr.getCurrentFileAsString("script"); else writeFileData = true; - } else if (data == "SDF" || data == "MOL" || data == "V2000" + } else if (data == "SDF" || data == "MOL" || data == "MOL0" || data == "V2000" || data == "V3000" || data == "CD" || data == "JSON" || data == "XYZ" || data == "XYZRN" || data == "XYZVIB" || data == "CML") { data = vwr.getModelExtract("selected", isCoord, false, data); Modified: branches/v14_4/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- branches/v14_4/Jmol/src/org/jmol/viewer/Jmol.properties 2016-03-08 20:49:29 UTC (rev 20984) +++ branches/v14_4/Jmol/src/org/jmol/viewer/Jmol.properties 2016-03-09 02:01:42 UTC (rev 20985) @@ -10,6 +10,10 @@ JmolVersion="14.4.3_2016.03.08" +new feature: WRITE MOL0 xxx.mol + -- MOL format with no bonds of type 6 or 7 (aromatic single/double) + -- needed for http://metamolecular.com/inchi-js + bug fix: OpenSMILES even-atom cumulene stereochemistry not implemented -- examples (reporting "DIASTEREOMERS") print compare("F/C=C=C=C/F","F/C=C=C=C\\F","isomer") Modified: branches/v14_4/Jmol/src/org/jmol/viewer/PropertyManager.java =================================================================== --- branches/v14_4/Jmol/src/org/jmol/viewer/PropertyManager.java 2016-03-08 20:49:29 UTC (rev 20984) +++ branches/v14_4/Jmol/src/org/jmol/viewer/PropertyManager.java 2016-03-09 02:01:42 UTC (rev 20985) @@ -1125,8 +1125,10 @@ /** * - * V3000, SDF, JSON, CD, XYZ, XYZVIB, XYZRN, CML, PDB, PQR + * V3000, SDF, MOL, JSON, CD, XYZ, XYZVIB, XYZRN, CML, PDB, PQR, * + * MOL0 is MOL with no bonds of type 6 or 7 (aromatic single/double) + * */ @Override public String getModelExtract(BS bs, boolean doTransform, boolean isModelKit, @@ -1140,6 +1142,7 @@ boolean asV3000 = type.equalsIgnoreCase("V3000"); boolean asSDF = type.equalsIgnoreCase("SDF"); + boolean noAromatic = type.equalsIgnoreCase("MOL0"); boolean asXYZVIB = (!doTransform && type.equalsIgnoreCase("XYZVIB")); boolean asXYZRN = type.equalsIgnoreCase("XYZRN"); boolean isXYZ = type.toUpperCase().startsWith("XYZ"); @@ -1200,7 +1203,7 @@ BS bsTemp = BSUtil.copy(bsAtoms); bsTemp.and(ms.getModelAtomBitSetIncludingDeleted(i, false)); bsBonds = getCovalentBondsForAtoms(ms.bo, ms.bondCount, bsTemp); - if (!(isOK = addMolFile(i, mol, bsTemp, bsBonds, false, false, q))) + if (!(isOK = addMolFile(i, mol, bsTemp, bsBonds, false, false, noAromatic, q))) break; mol.append("$$$$\n"); } @@ -1253,14 +1256,14 @@ } } } else { - isOK = addMolFile(-1, mol, bsAtoms, bsBonds, asV3000, asJSON, q); + isOK = addMolFile(-1, mol, bsAtoms, bsBonds, asV3000, asJSON, noAromatic, q); } return (isOK ? mol.toString() : "ERROR: Too many atoms or bonds -- use V3000 format."); } private boolean addMolFile(int iModel, SB mol, BS bsAtoms, BS bsBonds, - boolean asV3000, boolean asJSON, Quat q) { + boolean asV3000, boolean asJSON, boolean noAromatic, Quat q) { int nAtoms = bsAtoms.cardinality(); int nBonds = bsBonds.cardinality(); if (!asV3000 && !asJSON && (nAtoms > 999 || nBonds > 999)) @@ -1295,7 +1298,7 @@ } for (int i = bsBonds.nextSetBit(0), n = 0; i >= 0; i = bsBonds .nextSetBit(i + 1)) - getBondRecordMOL(mol, ++n, ms.bo[i], atomMap, asV3000, asJSON); + getBondRecordMOL(mol, ++n, ms.bo[i], atomMap, asV3000, asJSON, noAromatic); // 21 21 0 0 0 if (asV3000) { mol.append("M V30 END BOND\nM V30 END CTAB\n"); @@ -1420,7 +1423,7 @@ } private void getBondRecordMOL(SB mol, int n, Bond b, int[] atomMap, - boolean asV3000, boolean asJSON) { + boolean asV3000, boolean asJSON, boolean noAromatic) { // 1 2 1 0 int a1 = atomMap[b.atom1.i]; int a2 = atomMap[b.atom2.i]; @@ -1435,10 +1438,10 @@ order = (asJSON ? -3 : 5); break; case Edge.BOND_AROMATIC_SINGLE: - order = (asJSON ? 1: 6); + order = (asJSON || noAromatic ? 1: 6); break; case Edge.BOND_AROMATIC_DOUBLE: - order = (asJSON ? 2: 7); + order = (asJSON || noAromatic ? 2: 7); break; case Edge.BOND_PARTIAL01: order = (asJSON ? -1: 8); @@ -2292,7 +2295,8 @@ if (nAtoms == 0) return ""; // creating an instance prevents pre-loading by JavaScript - Interface.getInterface("javajs.util.XmlUtil", vwr, "file"); + if (vwr.isJS) + Interface.getInterface("javajs.util.XmlUtil", vwr, "file"); XmlUtil.openTag(sb, "molecule"); XmlUtil.openTag(sb, "atomArray"); BS bsAtoms = new BS(); Modified: trunk/Jmol/src/org/jmol/scriptext/CmdExt.java =================================================================== --- trunk/Jmol/src/org/jmol/scriptext/CmdExt.java 2016-03-08 20:49:29 UTC (rev 20984) +++ trunk/Jmol/src/org/jmol/scriptext/CmdExt.java 2016-03-09 02:01:42 UTC (rev 20985) @@ -3777,7 +3777,7 @@ && !PT .isOneOf( type, - ";SCENE;JMOL;ZIP;ZIPALL;SPT;HISTORY;MO;NBO;ISOSURFACE;MESH;PMESH;VAR;FILE;FUNCTION;CML;JSON;XYZ;XYZRN;XYZVIB;MENU;MOL;PDB;PGRP;PQR;QUAT;RAMA;SDF;V2000;V3000;INLINE;")) + ";SCENE;JMOL;ZIP;ZIPALL;SPT;HISTORY;MO;NBO;ISOSURFACE;MESH;PMESH;VAR;FILE;FUNCTION;CML;JSON;XYZ;XYZRN;XYZVIB;MENU;MOL;MOL0;PDB;PGRP;PQR;QUAT;RAMA;SDF;V2000;V3000;INLINE;")) eval.errorStr2( ScriptError.ERROR_writeWhat, "COORDS|FILE|FUNCTIONS|HISTORY|IMAGE|INLINE|ISOSURFACE|JMOL|MENU|MO|NBO|POINTGROUP|QUATERNION [w,x,y,z] [derivative]" @@ -3861,7 +3861,7 @@ data = vwr.getCurrentFileAsString("script"); else writeFileData = true; - } else if (data == "SDF" || data == "MOL" || data == "V2000" + } else if (data == "SDF" || data == "MOL" || data == "MOL0" || data == "V2000" || data == "V3000" || data == "CD" || data == "JSON" || data == "XYZ" || data == "XYZRN" || data == "XYZVIB" || data == "CML") { data = vwr.getModelExtract("selected", isCoord, false, data); Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2016-03-08 20:49:29 UTC (rev 20984) +++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2016-03-09 02:01:42 UTC (rev 20985) @@ -68,6 +68,10 @@ JmolVersion="14.5.3_2016.03.08" +new feature: WRITE MOL0 xxx.mol + -- MOL format with no bonds of type 6 or 7 (aromatic single/double) + -- needed for http://metamolecular.com/inchi-js + bug fix: OpenSMILES even-atom cumulene stereochemistry not implemented -- examples (reporting "DIASTEREOMERS") print compare("F/C=C=C=C/F","F/C=C=C=C\\F","isomer") Modified: trunk/Jmol/src/org/jmol/viewer/PropertyManager.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/PropertyManager.java 2016-03-08 20:49:29 UTC (rev 20984) +++ trunk/Jmol/src/org/jmol/viewer/PropertyManager.java 2016-03-09 02:01:42 UTC (rev 20985) @@ -1125,8 +1125,10 @@ /** * - * V3000, SDF, JSON, CD, XYZ, XYZVIB, XYZRN, CML, PDB, PQR + * V3000, SDF, MOL, JSON, CD, XYZ, XYZVIB, XYZRN, CML, PDB, PQR, * + * MOL0 is MOL with no bonds of type 6 or 7 (aromatic single/double) + * */ @Override public String getModelExtract(BS bs, boolean doTransform, boolean isModelKit, @@ -1140,6 +1142,7 @@ boolean asV3000 = type.equalsIgnoreCase("V3000"); boolean asSDF = type.equalsIgnoreCase("SDF"); + boolean noAromatic = type.equalsIgnoreCase("MOL0"); boolean asXYZVIB = (!doTransform && type.equalsIgnoreCase("XYZVIB")); boolean asXYZRN = type.equalsIgnoreCase("XYZRN"); boolean isXYZ = type.toUpperCase().startsWith("XYZ"); @@ -1200,7 +1203,7 @@ BS bsTemp = BSUtil.copy(bsAtoms); bsTemp.and(ms.getModelAtomBitSetIncludingDeleted(i, false)); bsBonds = getCovalentBondsForAtoms(ms.bo, ms.bondCount, bsTemp); - if (!(isOK = addMolFile(i, mol, bsTemp, bsBonds, false, false, q))) + if (!(isOK = addMolFile(i, mol, bsTemp, bsBonds, false, false, noAromatic, q))) break; mol.append("$$$$\n"); } @@ -1253,14 +1256,14 @@ } } } else { - isOK = addMolFile(-1, mol, bsAtoms, bsBonds, asV3000, asJSON, q); + isOK = addMolFile(-1, mol, bsAtoms, bsBonds, asV3000, asJSON, noAromatic, q); } return (isOK ? mol.toString() : "ERROR: Too many atoms or bonds -- use V3000 format."); } private boolean addMolFile(int iModel, SB mol, BS bsAtoms, BS bsBonds, - boolean asV3000, boolean asJSON, Quat q) { + boolean asV3000, boolean asJSON, boolean noAromatic, Quat q) { int nAtoms = bsAtoms.cardinality(); int nBonds = bsBonds.cardinality(); if (!asV3000 && !asJSON && (nAtoms > 999 || nBonds > 999)) @@ -1295,7 +1298,7 @@ } for (int i = bsBonds.nextSetBit(0), n = 0; i >= 0; i = bsBonds .nextSetBit(i + 1)) - getBondRecordMOL(mol, ++n, ms.bo[i], atomMap, asV3000, asJSON); + getBondRecordMOL(mol, ++n, ms.bo[i], atomMap, asV3000, asJSON, noAromatic); // 21 21 0 0 0 if (asV3000) { mol.append("M V30 END BOND\nM V30 END CTAB\n"); @@ -1420,7 +1423,7 @@ } private void getBondRecordMOL(SB mol, int n, Bond b, int[] atomMap, - boolean asV3000, boolean asJSON) { + boolean asV3000, boolean asJSON, boolean noAromatic) { // 1 2 1 0 int a1 = atomMap[b.atom1.i]; int a2 = atomMap[b.atom2.i]; @@ -1435,10 +1438,10 @@ order = (asJSON ? -3 : 5); break; case Edge.BOND_AROMATIC_SINGLE: - order = (asJSON ? 1: 6); + order = (asJSON || noAromatic ? 1: 6); break; case Edge.BOND_AROMATIC_DOUBLE: - order = (asJSON ? 2: 7); + order = (asJSON || noAromatic ? 2: 7); break; case Edge.BOND_PARTIAL01: order = (asJSON ? -1: 8); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. ------------------------------------------------------------------------------ Transform Data into Opportunity. Accelerate data analysis in your applications with Intel Data Analytics Acceleration Library. Click to learn more. http://pubads.g.doubleclick.net/gampad/clk?id=278785111&iu=/4140 _______________________________________________ Jmol-commits mailing list Jmol-commits@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/jmol-commits