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

Reply via email to