Repository 'openbabel_remions'
hg clone https://toolshed.g2.bx.psu.edu/repos/bgruening/openbabel_remions

Changeset 0:c9bee3591df9 (2017-05-20)
Next changeset 1:09cd63251df5 (2017-05-20)
Commit message:
planemo upload for repository https://github.com/bgruening/galaxytools/tree/master/chemicaltoolbox/openbabel commit 01da22e4184a5a6f6a3dd4631a7b9c31d1b6d502
added:
__pycache__/cheminfolib.cpython-36.pyc
change_title_to_metadata_value.py
cheminfolib.py
macros.xml
multi_obgrep.py
ob_addh.py
ob_filter.py
ob_genProp.py
ob_remIons.py
ob_remIons.xml
ob_spectrophore_search.py
remove_protonation_state.py
subsearch.py
test-data/2_mol.smi
test-data/3_mol.smi
test-data/8_mol.smi
test-data/CID2244_with_spectrophore.sdf
test-data/CID_2244.can
test-data/CID_2244.inchi
test-data/CID_2244.sdf
test-data/CID_2244.smi
test-data/CID_2244_FP2.fps
test-data/CID_2244_FP3.fps
test-data/CID_2244_FP4.fps
test-data/CID_2244_addh.can
test-data/CID_2244_maccs.fps
test-data/CID_3033.sdf
test-data/change_title_on_CID_3033.sdf
test-data/lib.tabular
test-data/molecule.fs
test-data/molecule.sdf
test-data/ob_convert_on_CID2244.can
test-data/ob_convert_on_CID2244.cml
test-data/ob_convert_on_CID2244.inchi
test-data/ob_convert_on_CID2244.pdb
test-data/ob_convert_on_CID2244.sdf
test-data/ob_convert_on_CID2244.smi
test-data/ob_convert_on_CID2244_obfs.txt
test-data/ob_depiction_svg_on_8_mol.svg
test-data/ob_filter_on_CID2244.sdf
test-data/ob_filter_on_CID2244.smi
test-data/ob_filter_on_CID2244_2.smi
test-data/ob_genprop_on_CID2244.sdf
test-data/ob_genprop_on_CID2244.tabular
test-data/ob_multi_obgrep.smi
test-data/ob_remDuplicates_on_2_mol.smi
test-data/ob_remove_protonation_state.sdf
test-data/ob_spectrophore_search.tabular
test-data/ob_subsearch_with_CID2244.tabular
test-data/obgrep_on_8_mol.smi
test-data/obremsmall_on_3_mol.smi
test-data/obrmions_on_2_mol.smi
test-data/pattern.smarts
b
diff -r 000000000000 -r c9bee3591df9 __pycache__/cheminfolib.cpython-36.pyc
b
Binary file __pycache__/cheminfolib.cpython-36.pyc has changed
b
diff -r 000000000000 -r c9bee3591df9 change_title_to_metadata_value.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/change_title_to_metadata_value.py Sat May 20 08:39:34 2017 -0400
[
@@ -0,0 +1,43 @@
+#!/usr/bin/env python
+# -*- coding: UTF-8 -*-
+
+"""
+    Change the title from a molecule file to metadata
+    value of a given-id of the same molecule file.
+"""
+
+import os
+import sys
+import argparse
+import openbabel
+openbabel.obErrorLog.StopLogging()
+import pybel
+
+
+def main():
+    parser = argparse.ArgumentParser(
+        description="Change the title from a molecule file to metadata \
+value of a given-id of the same molecule file.",
+    )
+    parser.add_argument('--infile', '-i', 
+        required=True, help="path to the input file")
+    parser.add_argument('--outfile', '-o', 
+        required=True, help="path to the output file")
+    parser.add_argument('--key', '-k',
+        required=True, help="the metadata key from the sdf file which should inlcude the new title")
+
+    args = parser.parse_args()
+
+    output = pybel.Outputfile("sdf", args.outfile, overwrite=True)
+
+    for mol in pybel.readfile("sdf", args.infile):
+        if args.key in mol.data:
+            mol.title = mol.data[args.key]
+        output.write( mol )
+
+    output.close()
+
+
+if __name__ == "__main__":
+    main()
+
b
diff -r 000000000000 -r c9bee3591df9 cheminfolib.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/cheminfolib.py Sat May 20 08:39:34 2017 -0400
[
b'@@ -0,0 +1,264 @@\n+#!/usr/bin/env python\n+"""\n+    Small library with cheminformatic functions based on openbabel and pgchem.\n+    Copyright 2012, Bjoern Gruening and Xavier Lucas\n+"""\n+\n+import os, sys\n+\n+try:\n+    from galaxy import eggs\n+    eggs.require(\'psycopg2\')\n+except:\n+    print(\'psycopg2 is not available. It is currently used in the pgchem wrappers, that are not shipped with default CTB\')\n+\n+try:\n+    import pybel\n+    import openbabel\n+except:\n+    print(\'OpenBabel could not be found. A few functions are not available without OpenBabel.\')\n+\n+from multiprocessing import Pool\n+import glob, tempfile, re\n+import subprocess\n+\n+def CountLines( path ):\n+    out = subprocess.Popen([\'wc\', \'-l\', path],\n+                         stdout=subprocess.PIPE,\n+                         stderr=subprocess.STDOUT\n+                         ).communicate()[0]\n+    return int(out.partition(b\' \')[0])\n+\n+def grep(pattern, file_obj):\n+    grepper = re.compile(pattern)\n+    for line in file_obj:\n+        if grepper.search(line):\n+            return True\n+    return False\n+\n+def check_filetype(filepath):\n+    mol = False\n+    possible_inchi = True\n+    for line_counter, line in enumerate(open(filepath)):\n+        if line_counter > 10000:\n+            break\n+        if line.find(\'$$$$\') != -1:\n+            return \'sdf\'\n+        elif line.find(\'@<TRIPOS>MOLECULE\') != -1:\n+            return \'mol2\'\n+        elif line.find(\'ligand id\') != -1:\n+            return \'drf\'\n+        elif possible_inchi and re.findall(\'^InChI=\', line):\n+            return \'inchi\'\n+        elif re.findall(\'^M\\s+END\', line):\n+            mol = True\n+        # first line is not an InChI, so it can\'t be an InChI file\n+        possible_inchi = False\n+\n+    if mol:\n+        # END can occures before $$$$, so and SDF file will \n+        # be recognised as mol, if you not using this hack\'\n+        return \'mol\'\n+    return \'smi\'\n+\n+def db_connect(args):\n+    try:\n+        db_conn = psycopg2.connect("dbname=%s user=%s host=%s password=%s" % (args.dbname, args.dbuser, args.dbhost, args.dbpasswd));\n+        return db_conn\n+    except:\n+        sys.exit(\'Unable to connect to the db\')\n+\n+ColumnNames = {\n+    \'can_smiles\' : \'Canonical SMILES\',\n+    \'can\' : \'Canonical SMILES\',\n+    \'inchi\' : \'InChI\',\n+    \'inchi_key\' : \'InChI key\',\n+    \'inchi_key_first\' : \'InChI key first\',\n+    \'inchi_key_last\' : \'InChI key last\',\n+    \'molwt\' : \'Molecular weight\',\n+    \'hbd\' : \'Hydrogen-bond donors\',\n+    \'donors\' : \'Hydrogen-bond donors\',\n+    \'hba\' : \'Hydrogen-bond acceptors\',\n+    \'acceptors\' : \'Hydrogen-bond acceptors\',\n+    \'rotbonds\' : \'Rotatable bonds\',\n+    \'logp\' : \'logP\',\n+    \'psa\' : \'Polar surface area\',\n+    \'mr\' : \'Molecular refractivity\',\n+    \'atoms\' : \'Number of heavy atoms\',\n+    \'rings\' : \'Number of rings\',\n+    \'set_bits\' : \'FP2 bits\',\n+    \'id\' : \'Internal identifier\',\n+    \'tani\' : \'Tanimoto coefficient\',\n+    \'spectrophore\' : \'Spectrophores(TM)\',\n+    \'dist_spectrophore\' : \'Spectrophores(TM) distance to target\',\n+    \'synonym\' : \'Entry id\',\n+}\n+\n+OBDescriptor = {\n+    \'atoms\': ["atoms","Number of atoms"],\n+    \'hatoms\': ["hatoms","Number of heavy atoms"], # self defined tag hatoms in plugindefines.txt\n+    \'can_smiles\' : ["cansmi","Canonical SMILES"],\n+    \'can_smilesNS\' : ["cansmiNS","Canonical SMILES without isotopes or stereo"],\n+    #["abonds","Number of aromatic bonds"],\n+    #["bonds","Number of bonds"],\n+    #["dbonds","Number of double bonds"],\n+    #["formula","Chemical formula"],\n+    \'hba\': ["HBA1","Number of Hydrogen Bond Acceptors 1 (JoelLib)"],\n+    \'hba2\': ["HBA2","Number of Hydrogen Bond Acceptors 2 (JoelLib)"],\n+    \'hbd\': ["HBD","Number of Hydrogen Bond Donors (JoelLib)"],\n+    \'inchi\': ["InChI","IUPAC InChI identifier"],\n+    \'inchi_key\': ["InChIKey","InChIKey"],\n+    #["L5","Lipinski Rule of Five"],\n+    \'logp\': ["logP","octanol/water partition coefficient"],\n+    \'mr\': ["MR","molar refractivity"],\n+    \'molwt\': ["MW","Molecular Weight filter"],\n+    #["nF","'..b'l.Smarts("[!#6;!H0]")\n+    HBA = pybel.Smarts("[$([$([#8,#16]);!$(*=N~O);" +\n+                       "!$(*~N=O);X1,X2]),$([#7;v3;" +\n+                       "!$([nH]);!$(*(-a)-a)])]"\n+                      )\n+    calc_desc_dict = mol.calcdesc()\n+\n+    try:\n+        logp = calc_desc_dict[\'logP\']\n+    except:\n+        logp = calc_desc_dict[\'LogP\']\n+\n+    return {"molwt": mol.molwt,\n+            "logp": logp,\n+            "donors": len(HBD.findall(mol)),\n+            "acceptors": len(HBA.findall(mol)), \n+            "psa": calc_desc_dict[\'TPSA\'],\n+            "mr": calc_desc_dict[\'MR\'],\n+            "rotbonds": mol.OBMol.NumRotors(),\n+            "can": mol.write("can").split()[0].strip(), ### tthis one works fine for both zinc and chembl (no ZINC code added after can descriptor string)\n+            "inchi": mol.write("inchi").strip(),\n+            "inchi_key": get_inchikey(mol).strip(),\n+            "rings": len(mol.sssr),\n+            "atoms": mol.OBMol.NumHvyAtoms(),\n+            "spectrophore" : OBspectrophore(mol),\n+           }\n+\n+def get_inchikey(mol):\n+    conv = openbabel.OBConversion()\n+    conv.SetInAndOutFormats("mol", "inchi")\n+    conv.SetOptions("K", conv.OUTOPTIONS)\n+    inchikey = conv.WriteString( mol.OBMol )\n+    return inchikey\n+\n+def OBspectrophore(mol):\n+    spectrophore = pybel.ob.OBSpectrophore()\n+    # Parameters: rotation angle = 20, normalization for mean and sd, accuracy = 3.0 A and non-stereospecific cages.\n+    spectrophore.SetNormalization( spectrophore.NormalizationTowardsZeroMeanAndUnitStd )\n+    return \', \'.join( [ "%.3f" % value for value in spectrophore.GetSpectrophore( mol.OBMol ) ] )\n+\n+def squared_euclidean_distance(a, b):\n+    try:\n+        return ((np.asarray( a ) - np.asarray( b ))**2).sum()\n+    except ValueError:\n+        return 0\n+\n+def split_library( lib_path, lib_format = \'sdf\', package_size = None ):\n+    """\n+        Split a library of compounds. Usage: split_library( lib_path, lib_format, package_size )\n+        IT currently ONLY WORKS FOR SD-Files\n+    """\n+    pack = 1\n+    mol_counter = 0\n+\n+    outfile = open(\'/%s/%s_pack_%i.%s\' % ( \'/\'.join(lib_path.split(\'/\')[:-1]), lib_path.split(\'/\')[-1].split(\'.\')[0], pack, \'sdf\'), \'w\' )\n+\n+    for line in open(lib_path, \'r\'):\n+        outfile.write( line )\n+        if line.strip() == \'$$$$\':\n+            mol_counter += 1\n+            if mol_counter % package_size == 0:\n+                outfile.close()\n+                pack += 1\n+                outfile = open(\'/%s/%s_pack_%i.%s\' % ( \'/\'.join(lib_path.split(\'/\')[:-1]), lib_path.split(\'/\')[-1].split(\'.\')[0], pack, \'sdf\'), \'w\' )\n+                if mol_counter*10 % package_size == 0:\n+                    print(\'%i molecules parsed, starting pack nr. %i\' % ( mol_counter, pack - 1 ))\n+    outfile.close()\n+\n+    return True\n+\n+def split_smi_library( smiles_file, structures_in_one_file ):\n+    """\n+        Split a file with SMILES to several files for multiprocessing usage. \n+        Usage: split_smi_library( smiles_file, 10 )\n+    """\n+    output_files = []\n+    tfile = tempfile.NamedTemporaryFile(delete=False)\n+\n+    smiles_handle = open(smiles_file, \'r\')\n+    for count, line in enumerate( smiles_handle ):\n+        if count % structures_in_one_file == 0 and count != 0:\n+            tfile.close()\n+            output_files.append(tfile.name)\n+            tfile = tempfile.NamedTemporaryFile(delete=False)\n+        tfile.write(line)\n+    tfile.close()\n+    output_files.append(tfile.name)\n+    smiles_handle.close()\n+    return output_files\n+\n+\n+def mp_run(input_path, regex, PROCESSES, function_to_call ):\n+    paths = []\n+    [ paths.append(compound_file) for compound_file in glob.glob(str(input_path) + str(regex)) ]\n+    paths.sort()\n+\n+    pool = Pool(processes=PROCESSES)\n+    print(\'Process initialized with\', PROCESSES, \'processors\')\n+    result = pool.map_async(function_to_call, paths)\n+    result.get()\n+\n+    return paths\n+\n+if __name__ == \'__main__\':\n+    print(check_filetype(sys.argv[1]))\n+\n'
b
diff -r 000000000000 -r c9bee3591df9 macros.xml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/macros.xml Sat May 20 08:39:34 2017 -0400
b
@@ -0,0 +1,42 @@
+<macros>
+    <token name="@VERSION@">2.4.1</token>
+
+    <xml name="requirements">
+        <requirements>
+            <requirement type="package" version="2.4.1">openbabel</requirement>
+            <yield />
+        </requirements>
+    </xml>
+
+    <xml name="output_like_input">
+        <data name="outfile" format_source="infile" />
+    </xml>
+
+    <xml name="infile_all_types">
+        <param name="infile" format="sdf,mol,mol2,cml,inchi,smi" type="data" label="Molecular input file"
+        help="Valid file types are: SDF, MOL, MOL2, CML, InChI and SMILES"/>
+    </xml>
+
+    <xml name="2D_3D_opts">
+        <param name="gen2d" type="boolean" truevalue="--gen2d" falsevalue="" checked="false"
+            label="Generate 2D coordinates" help="(--gen2d)" />
+        <param name="gen3d" type="boolean" truevalue="--gen3d" falsevalue="" checked="false"
+            label="Generate 3D coordinates" help="(--gen3d)" />
+    </xml>
+
+    <xml name="stdio">
+        <stdio>
+            <exit_code range="1:" level="fatal" description="Error occurred. Please check Tool Standard Error" />
+        </stdio>
+    </xml>
+
+    <xml name="citations">
+        <citations>
+            <citation type="doi">10.1186/1758-2946-3-33</citation>
+            <yield />
+        </citations>
+    </xml>
+</macros>
+
+
+
b
diff -r 000000000000 -r c9bee3591df9 multi_obgrep.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/multi_obgrep.py Sat May 20 08:39:34 2017 -0400
[
@@ -0,0 +1,101 @@
+#!/usr/bin/env python
+"""
+    Input: Molecules in SDF, SMILES ...
+    Output: Molecule file filtered with obgrep.
+    Copyright 2013, Bjoern Gruening and Xavier Lucas
+"""
+import sys, os
+import argparse
+import openbabel
+openbabel.obErrorLog.StopLogging()
+import pybel
+import multiprocessing
+import tempfile
+import subprocess
+import shutil
+import shlex
+
+def parse_command_line():
+    parser = argparse.ArgumentParser()
+    parser.add_argument('-i', '--infile', required=True, help='Molecule file.')
+    parser.add_argument('-q', '--query',  required=True, help='Query file, containing different SMARTS in each line.')
+    parser.add_argument('-o', '--outfile', required=True, help='Path to the output file.')
+    parser.add_argument("--iformat", help="Input format, like smi, sdf, inchi")
+    parser.add_argument("--n-times", dest="n_times", type=int,
+                    default=0, help="Print a molecule only if the pattern occurs # times inside the molecule.")
+    parser.add_argument('-p', '--processors', type=int, default=multiprocessing.cpu_count())
+    parser.add_argument("--invert-matches", dest="invert_matches", action="store_true",
+                    default=False, help="Invert the matching, print non-matching molecules.")
+    parser.add_argument("--only-name", dest="only_name", action="store_true",
+                    default=False, help="Only print the name of the molecules.")
+    parser.add_argument("--full-match", dest="full_match", action="store_true",
+                    default=False, help="Full match, print matching-molecules only when the number of heavy atoms is also equal to the number of atoms in the SMARTS pattern.")
+    parser.add_argument("--number-of-matches", dest="number_of_matches", action="store_true",
+                    default=False, help="Print the number of matches.")
+    return parser.parse_args()
+
+results = list()
+def mp_callback(res):
+    results.append(res)
+
+def mp_helper( query, args ):
+    """
+        Helper function for multiprocessing.
+        That function is a wrapper around obgrep.
+    """
+
+    cmd_list = []
+    if args.invert_matches:
+        cmd_list.append('-v')
+    if args.only_name:
+        cmd_list.append('-n')
+    if args.full_match:
+        cmd_list.append('-f')
+    if args.number_of_matches:
+        cmd_list.append('-c')
+    if args.n_times:
+        cmd_list.append('-t %s' % str(args.n_times))
+
+    tmp = tempfile.NamedTemporaryFile(delete=False)
+    cmd = 'obgrep %s "%s" %s' % (' '.join(cmd_list), query, args.infile)
+    child = subprocess.Popen(shlex.split(cmd),
+        stdout=open(tmp.name, 'w+'), stderr=subprocess.PIPE)
+
+    stdout, stderr = child.communicate()
+    return (tmp.name, query)
+
+
+def obgrep( args ):
+
+    temp_file = tempfile.NamedTemporaryFile()
+    temp_link = "%s.%s" % (temp_file.name, args.iformat)
+    temp_file.close()
+    os.symlink(args.infile, temp_link)
+    args.infile = temp_link
+
+    pool = multiprocessing.Pool( args.processors )
+    for query in open( args.query ):
+        pool.apply_async(mp_helper, args=(query.strip(), args), callback=mp_callback)
+        #mp_callback( mp_helper(query.strip(), args) )
+    pool.close()
+    pool.join()
+
+    out_handle = open( args.outfile, 'wb' )
+    for result_file, query in results:
+        res_handle = open(result_file,'rb')
+        shutil.copyfileobj( res_handle, out_handle )
+        res_handle.close()
+        os.remove( result_file )
+    out_handle.close()
+
+    os.remove( temp_link )
+
+def __main__():
+    """
+        Multiprocessing obgrep search.
+    """
+    args = parse_command_line()
+    obgrep( args )
+
+if __name__ == "__main__" :
+    __main__()
b
diff -r 000000000000 -r c9bee3591df9 ob_addh.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ob_addh.py Sat May 20 08:39:34 2017 -0400
b
@@ -0,0 +1,38 @@
+#!/usr/bin/env python
+"""
+    Input:  Molecule file
+    Output: Molecule file with hydrogen atoms added at the target pH.
+"""
+import sys, os
+import argparse
+import openbabel
+openbabel.obErrorLog.StopLogging()
+import pybel
+
+def parse_command_line(argv):
+    parser = argparse.ArgumentParser()
+    parser.add_argument('--iformat', type=str, default='sdf' , help='input file format')
+    parser.add_argument('-i', '--input', type=str, required=True, help='input file name')
+    parser.add_argument('-o', '--output', type=str, required=True, help='output file name')
+    parser.add_argument('--polar', action="store_true", default=False, help='Add hydrogen atoms only to polar atoms')
+    parser.add_argument('--pH', type=float, default="7.4", help='Specify target pH value')
+    return parser.parse_args()
+
+def addh(args):
+    outfile = pybel.Outputfile(args.iformat, args.output, overwrite=True)
+    for mol in pybel.readfile(args.iformat, args.input):
+        if mol.OBMol.NumHvyAtoms() > 5:
+            mol.removeh()
+            mol.OBMol.AddHydrogens(args.polar, True, args.pH)
+            outfile.write(mol)
+    outfile.close()
+
+def __main__():
+    """
+        Add hydrogen atoms at a certain pH value
+    """
+    args = parse_command_line(sys.argv)
+    addh(args)
+
+if __name__ == "__main__" :
+    __main__()
b
diff -r 000000000000 -r c9bee3591df9 ob_filter.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ob_filter.py Sat May 20 08:39:34 2017 -0400
[
@@ -0,0 +1,112 @@
+#!/usr/bin/env python
+"""
+    Input: set of molecules with pre-calculated physico-chemical properties
+    Output: set of molecules that pass all the filters
+    Copyright 2012, Bjoern Gruening and Xavier Lucas
+
+    TODO: AND/OR conditions?
+"""
+import sys, os
+import argparse
+import cheminfolib
+import json
+import pybel
+import shlex, subprocess
+
+cheminfolib.pybel_stop_logging()
+
+def parse_command_line():
+    parser = argparse.ArgumentParser()
+    parser.add_argument('-i', '--input', help='Input file name')
+    parser.add_argument('-iformat', help='Input file format')
+    parser.add_argument('-oformat', 
+        default='smi',
+        help='Output file format')
+    parser.add_argument('-o', '--output', 
+        help='Output file name',
+        required=True)
+    parser.add_argument('--filters', 
+        help="Specify the filters to apply",
+        required=True,
+        )
+    return parser.parse_args()
+
+def filter_precalculated_compounds(args, filters):
+    outfile = pybel.Outputfile(args.oformat, args.output, overwrite=True)
+    for mol in pybel.readfile('sdf', args.input):
+        for key, elem in filters.items():
+            # map the short description to the larger metadata names stored in the sdf file
+            property = cheminfolib.ColumnNames[key]
+            min = elem[0]
+            max = elem[1]
+            if float(mol.data[property]) >= float(min) and float(mol.data[property]) <= float(max):
+                pass
+            else:
+                # leave the filter loop, because one filter constrained are not satisfied
+                break
+        else:
+            # if the filter loop terminates in a normal way (no break) all filter rules are satisfied, so save the compound
+            outfile.write(mol)
+    outfile.close()
+
+def filter_new_compounds(args, filters):
+
+    if args.iformat == args.oformat:
+        # use the -ocopy option from openbabel to speed up the filtering, additionally no conversion is carried out
+        # http://openbabel.org/docs/dev/FileFormats/Copy_raw_text.html#copy-raw-text
+        cmd = 'obabel -i%s %s -ocopy -O %s --filter' % (args.iformat, args.input, args.output)
+    else:
+        cmd = 'obabel -i%s %s -o%s -O %s --filter' % (args.iformat, args.input, args.oformat, args.output)
+    filter_cmd = ''
+    # OBDescriptor stores a mapping from our desc shortcut to the OB name [0] and a long description [1]
+    for key, elem in filters.items():
+        ob_descriptor_name = cheminfolib.OBDescriptor[key][0]
+        min = elem[0]
+        max = elem[1]
+        filter_cmd += ' %s>=%s %s<=%s ' % (ob_descriptor_name, min, ob_descriptor_name, max)
+
+    args = shlex.split('%s "%s"' % (cmd, filter_cmd))
+    #print '%s "%s"' % (cmd, filter_cmd)
+    # calling openbabel with subprocess and pipe potential errors occuring in openbabel to stdout
+    child = subprocess.Popen(args,
+        stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+
+    stdout, stderr = child.communicate()
+    return_code = child.returncode
+
+    if return_code:
+        sys.stdout.write(stdout.decode('utf-8'))
+        sys.stderr.write(stderr.decode('utf-8'))
+        sys.stderr.write("Return error code %i from command:\n" % return_code)
+        sys.stderr.write("%s\n" % cmd)
+    else:
+        sys.stdout.write(stdout.decode('utf-8'))
+        sys.stdout.write(stderr.decode('utf-8'))
+
+
+def __main__():
+    """
+        Select compounds with certain properties from a small library
+    """
+    args = parse_command_line()
+    # Its a small trick to get the parameters in an easy way from the xml file.
+    # To keep it readable in the xml file, many white-spaces are included in that string it needs to be removed.
+    # Also the last loop creates a ',{' that is not an valid jason expression.
+    filters = json.loads((args.filters).replace(' ', '').replace(',}', '}'))
+    if args.iformat == 'sdf':
+        # Check if the sdf file contains all of the required metadata to invoke the precalculation filtering
+        mol = pybel.readfile('sdf', args.input).next()
+        for key, elem in filters.items():
+            property = cheminfolib.ColumnNames[key]
+            if not property in mol.data:
+                break
+        else:
+            # if the for loop finishes in a normal way, we should habe all properties at least in the first molecule
+            # assume it is the same for all other molecules and start the precalculated filtering
+            filter_precalculated_compounds(args, filters)
+            return True
+    filter_new_compounds(args, filters)
+
+
+if __name__ == "__main__" :
+    __main__()
b
diff -r 000000000000 -r c9bee3591df9 ob_genProp.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ob_genProp.py Sat May 20 08:39:34 2017 -0400
[
@@ -0,0 +1,52 @@
+#!/usr/bin/env python
+"""
+    Input: Molecular input file.
+    Output: Physico-chemical properties are computed and stored as metadata in the sdf output file.
+    Copyright 2012, Bjoern Gruening and Xavier Lucas
+"""
+import sys, os
+import argparse
+import openbabel
+openbabel.obErrorLog.StopLogging()
+import pybel
+import cheminfolib
+
+
+def parse_command_line(argv):
+    parser = argparse.ArgumentParser()
+    parser.add_argument('--iformat', default='sdf' , help='input file format')
+    parser.add_argument('-i', '--input', required=True, help='input file name')
+    parser.add_argument('--oformat', default='sdf', choices = ['sdf', 'table'] , help='output file format')
+    parser.add_argument('--header', type=bool, help='Include the header as the first line of the output table')
+    parser.add_argument('-o', '--output', required=True, help='output file name')
+    return parser.parse_args()
+
+def compute_properties(args):
+    if args.oformat == 'sdf':
+        outfile = pybel.Outputfile(args.oformat, args.output, overwrite=True)
+    else:
+        outfile = open(args.output, 'w')
+        if args.header:
+            mol = next(pybel.readfile(args.iformat, args.input))
+            metadata = cheminfolib.get_properties_ext(mol)
+            outfile.write( '%s\n' % '\t'.join( [ cheminfolib.ColumnNames[key] for key in metadata ] ) )
+
+    for mol in pybel.readfile(args.iformat, args.input):
+        if mol.OBMol.NumHvyAtoms() > 5:
+            metadata = cheminfolib.get_properties_ext(mol)
+            if args.oformat == 'sdf':
+                [ mol.data.update( { cheminfolib.ColumnNames[key] : metadata[key] } ) for key in metadata ]
+                outfile.write(mol)
+            else:
+                outfile.write( '%s\n' % ('\t'.join( [ str(metadata[key]) for key in metadata ] ) ) )
+    outfile.close()
+
+def __main__():
+    """
+        Physico-chemical properties are computed and stored as metadata in the sdf output file
+    """
+    args = parse_command_line(sys.argv)
+    compute_properties(args)
+
+if __name__ == "__main__" :
+    __main__()
b
diff -r 000000000000 -r c9bee3591df9 ob_remIons.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ob_remIons.py Sat May 20 08:39:34 2017 -0400
b
@@ -0,0 +1,38 @@
+#!/usr/bin/env python
+"""
+    Input: molecular input file.
+    Output: Molecule file with removed ions and fragments.
+    Copyright 2012, Bjoern Gruening and Xavier Lucas
+"""
+import sys, os
+import argparse
+import openbabel
+openbabel.obErrorLog.StopLogging()
+import pybel
+
+def parse_command_line():
+    parser = argparse.ArgumentParser()
+    parser.add_argument('-iformat', default='sdf' , help='input file format')
+    parser.add_argument('-i', '--input', required=True, help='input file name')
+    parser.add_argument('-o', '--output', required=True, help='output file name')
+    return parser.parse_args()
+
+def remove_ions(args):
+    outfile = pybel.Outputfile(args.iformat, args.output, overwrite=True)
+    for mol in pybel.readfile(args.iformat, args.input):
+        if mol.OBMol.NumHvyAtoms() > 5:
+            mol.OBMol.StripSalts(0)
+            # Check if new small fragments have been created and remove them
+            if mol.OBMol.NumHvyAtoms() > 5:
+                outfile.write(mol)
+    outfile.close()
+
+def __main__():
+    """
+        Remove any counterion and delete any fragment but the largest one for each molecule.
+    """
+    args = parse_command_line()
+    remove_ions(args)
+
+if __name__ == "__main__" :
+    __main__()
b
diff -r 000000000000 -r c9bee3591df9 ob_remIons.xml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ob_remIons.xml Sat May 20 08:39:34 2017 -0400
[
@@ -0,0 +1,51 @@
+<tool id="openbabel_remIons" name="Remove counterions and fragments" version="@VERSION@.0">
+    <description></description>
+    <!--parallelism method="multi" split_inputs="infile" split_mode="to_size" split_size="50000" shared_inputs="" merge_outputs="outfile"></parallelism-->
+    <macros>
+        <import>macros.xml</import>
+    </macros>
+    <expand macro="requirements"/>
+    <command detect_errors="aggressive">
+<![CDATA[
+    python '$__tool_directory__/ob_remIons.py'
+      -i '${infile}'
+      -iformat '${infile.ext}'
+      -o '${outfile}'
+]]>
+    </command>
+    <inputs>
+        <expand macro="infile_all_types"/>
+    </inputs>
+    <outputs>
+        <expand macro="output_like_input"/>
+    </outputs>
+    <tests>
+        <test>
+            <param name="infile" ftype="smi" value="2_mol.smi"/>
+            <output name="outfile" ftype="smi" file="obrmions_on_2_mol.smi" />
+        </test>
+    </tests>
+    <help>
+<![CDATA[
+
+.. class:: infomark
+
+**What this tool does**
+
+Parses a multiple molecules file and deletes any present counterions or fragments.
+
+-----
+
+.. class:: warningmark
+
+**Hint**
+
+| Only the **largest fragment** on every molecule is extracted.
+|
+| Only molecules with more than 5 heavy atoms are parsed.
+
+
+]]>
+    </help>
+    <expand macro="citations"/>
+</tool>
b
diff -r 000000000000 -r c9bee3591df9 ob_spectrophore_search.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ob_spectrophore_search.py Sat May 20 08:39:34 2017 -0400
[
@@ -0,0 +1,66 @@
+#!/usr/bin/env python
+"""
+    Input: tabular format file with one column storing the unique id for the compounds and any other with the Spectrophores(TM) descriptors.
+    Output: parse the target file using the same protocol used to generate the databases in our servers. Physico-chemical properties are computed and stored as metadata in the sdf output file.
+    Copyright 2012, Bjoern Gruening and Xavier Lucas
+"""
+import sys, os
+import argparse
+import openbabel
+openbabel.obErrorLog.StopLogging()
+import pybel
+import math
+import numpy as np
+
+#TODO get rid of eval()
+
+global spectrophore
+spectrophore = pybel.ob.OBSpectrophore()
+
+def parse_command_line():
+    parser = argparse.ArgumentParser()
+    parser.add_argument('--target', required=True, help='target file name in sdf format with Spectrophores(TM) descriptors stored as meta-data')
+    parser.add_argument('--library', required=True, help='library of compounds with pre-computed physico-chemical properties, including Spectrophores(TM) in tabular format')
+    parser.add_argument('-c', '--column', required=True, type=int, help='#column containing the Spectrophores(TM) descriptors in the library file')
+    parser.add_argument('-o', '--output', required=True, help='output file name')
+    parser.add_argument('-n', '--normalization', default="ZeroMeanAndUnitStd", choices=['No', 'ZeroMean', 'UnitStd', 'ZeroMeanAndUnitStd'], help='Normalization method')
+    parser.add_argument('-a', '--accuracy', default="20", choices=['1', '2', '5', '10', '15', '20', '30', '36', '45', '60'], help='Accuracy expressed as angular stepsize')
+    parser.add_argument('-s', '--stereo', default="No", choices=['No', 'Unique', 'Mirror', 'All'], help='Stereospecificity of the cage')
+    parser.add_argument('-r', '--resolution', type=float, default="3.0", help='Resolution')
+    return parser.parse_args()
+
+def set_parameters(args):
+    if args.normalization == 'No':
+        spectrophore.SetNormalization( spectrophore.NoNormalization )
+    else:
+        spectrophore.SetNormalization( eval('spectrophore.NormalizationTowards' + args.normalization) )
+    spectrophore.SetAccuracy( eval('spectrophore.AngStepSize' + args.accuracy) )
+    spectrophore.SetStereo( eval('spectrophore.' + args.stereo + 'StereoSpecificProbes') )
+    spectrophore.SetResolution( args.resolution )
+    return True
+
+def Compute_Spectrophores_distance(target_spectrophore, args):
+    outfile = open(args.output, 'w')
+    for mol in open(args.library, 'r'):
+        try:
+            distance = ( ( np.asarray( target_spectrophore, dtype=float ) - np.asarray( mol.split('\t')[ args.column - 1 ].strip().split(', '), dtype=float) )**2).sum()
+        except ValueError:
+            distance = 0
+        outfile.write( '%s\t%f\n' % (mol.strip(), distance ) )
+    outfile.close()
+
+def __main__():
+    """
+        Computation of Spectrophores(TM) distances to a target molecule.
+    """
+    args = parse_command_line()
+    # This sets up the parameters for the Spectrophore generation. Parameters are set to fit those of our standard parsing tool
+    set_parameters(args)
+
+    mol = pybel.readfile('sdf', args.target).next()
+    target_spectrophore = mol.data["Spectrophores(TM)"].strip().split(', ')
+    # Compute the paired-distance between every molecule in the library and the target
+    distances = Compute_Spectrophores_distance(target_spectrophore, args)
+
+if __name__ == "__main__" :
+    __main__()
b
diff -r 000000000000 -r c9bee3591df9 remove_protonation_state.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/remove_protonation_state.py Sat May 20 08:39:34 2017 -0400
[
@@ -0,0 +1,35 @@
+#!/usr/bin/env python
+"""
+    Input: molecular input file.
+    Output: Molecule file with removed ions and fragments.
+    Copyright 2013, Bjoern Gruening and Xavier Lucas
+"""
+import sys, os
+import argparse
+import openbabel
+openbabel.obErrorLog.StopLogging()
+import pybel
+
+def parse_command_line():
+    parser = argparse.ArgumentParser()
+    parser.add_argument('--iformat', default='sdf' , help='input file format')
+    parser.add_argument('-i', '--input', required=True, help='input file name')
+    parser.add_argument('-o', '--output', required=True, help='output file name')
+    return parser.parse_args()
+
+def remove_protonation( args ):
+    outfile = pybel.Outputfile(args.iformat, args.output, overwrite=True)
+    for mol in pybel.readfile(args.iformat, args.input):
+        [atom.OBAtom.SetFormalCharge(0) for atom in mol.atoms]
+        outfile.write( mol )
+    outfile.close()
+
+def __main__():
+    """
+        Remove any protonation state from each atom in each molecule.
+    """
+    args = parse_command_line()
+    remove_protonation( args )
+
+if __name__ == "__main__" :
+    __main__()
b
diff -r 000000000000 -r c9bee3591df9 subsearch.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/subsearch.py Sat May 20 08:39:34 2017 -0400
[
@@ -0,0 +1,116 @@
+#!/usr/bin/env python
+"""
+    Input: Molecules in SDF, SMILES ...
+    Output: Moleculs filtered with specified substructures.
+    Copyright 2013, Bjoern Gruening and Xavier Lucas
+"""
+import sys, os
+import argparse
+import openbabel
+openbabel.obErrorLog.StopLogging()
+import pybel
+import multiprocessing
+import tempfile
+import subprocess
+import shutil
+
+def parse_command_line():
+    parser = argparse.ArgumentParser()
+    parser.add_argument('-i', '--infile', required=True, help='Molecule file.')
+    parser.add_argument('--iformat', help='Input format.')
+    parser.add_argument('--fastsearch-index', dest="fastsearch_index", 
+        required=True, help='Path to the openbabel fastsearch index.')
+    parser.add_argument('-o', '--outfile', required=True, help='Path to the output file.')
+    parser.add_argument('--oformat', 
+        default='smi', help='Output file format')
+    parser.add_argument("--max-candidates", dest="max_candidates", type=int,
+                    default=4000, help="The maximum number of candidates.")
+    parser.add_argument('-p', '--processors', type=int, 
+        default=multiprocessing.cpu_count())
+    return parser.parse_args()
+
+results = list()
+def mp_callback(res):
+    results.append(res)
+
+def mp_helper( query, args ):
+    """
+        Helper function for multiprocessing.
+        That function is a wrapper around the following command:
+        obabel file.fs -s"smarts" -Ooutfile.smi -al 999999999
+    """
+
+    if args.oformat == 'names':
+        opts = '-osmi -xt'
+    else:
+        opts = '-o%s' % args.oformat
+
+    tmp = tempfile.NamedTemporaryFile(delete=False)
+    cmd = 'obabel -ifs %s -O %s %s -s%s -al %s' % (args.fastsearch_index, tmp.name, opts, query, args.max_candidates)
+
+    child = subprocess.Popen(cmd.split(),
+        stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+
+    stdout, stderr = child.communicate()
+    return_code = child.returncode
+
+    if return_code:
+        sys.stdout.write(stdout)
+        sys.stderr.write(stderr)
+        sys.stderr.write("Return error code %i from command:\n" % return_code)
+        sys.stderr.write("%s\n" % cmd)
+    else:
+        sys.stdout.write(stdout)
+        sys.stdout.write(stderr)
+    return (tmp.name, query)
+
+
+def get_smiles_or_smarts( args ):
+    """
+    Wrapper to retrieve a striped SMILES or SMARTS string from different input formats.
+    """
+    if args.iformat in ['smi', 'text', 'tabular']:
+        with open( args.infile ) as text_file:
+            for line in text_file:
+                yield line.split('\t')[0].strip()
+    else:
+        # inchi or sdf files
+        for mol in pybel.readfile( args.iformat, args.infile ):
+            yield mol.write('smiles').split('\t')[0]
+
+def substructure_search( args ):
+
+    pool = multiprocessing.Pool( args.processors )
+    for query in get_smiles_or_smarts( args ):
+        pool.apply_async(mp_helper, args=(query, args), callback=mp_callback)
+        #mp_callback( mp_helper(query, args) )
+    pool.close()
+    pool.join()
+
+    if args.oformat == 'names':
+        out_handle = open( args.outfile, 'w' )
+        for result_file, query in results:
+            with open(result_file) as res_handle:
+                for line in res_handle:
+                    out_handle.write('%s\t%s\n' % ( line.strip(), query ))
+            os.remove( result_file )
+        out_handle.close()
+    else:
+        out_handle = open( args.outfile, 'wb' )
+        for result_file, query in results:
+            res_handle = open(result_file,'rb')
+            shutil.copyfileobj( res_handle, out_handle )
+            res_handle.close()
+            os.remove( result_file )
+        out_handle.close()
+
+
+def __main__():
+    """
+        Multiprocessing Open Babel Substructure Search.
+    """
+    args = parse_command_line()
+    substructure_search( args )
+
+if __name__ == "__main__" :
+    __main__()
b
diff -r 000000000000 -r c9bee3591df9 test-data/2_mol.smi
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/2_mol.smi Sat May 20 08:39:34 2017 -0400
[
@@ -0,0 +1,2 @@
+CC(=O)OC1=CC=CC=C1C(=O)[O-]
+CC(=O)OC1=CC=CC=C1C(=O)[O-]
b
diff -r 000000000000 -r c9bee3591df9 test-data/3_mol.smi
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/3_mol.smi Sat May 20 08:39:34 2017 -0400
[
@@ -0,0 +1,3 @@
+CC(=O)OC1=CC=CC=C1C(=O)[O-]
+CC(=O)OC1=CC=CC=C1C(=O)[O-]
+C
b
diff -r 000000000000 -r c9bee3591df9 test-data/8_mol.smi
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/8_mol.smi Sat May 20 08:39:34 2017 -0400
[
@@ -0,0 +1,8 @@
+C1NC2=CC(=C(C=C2S(=O)(=O)N1)S(=O)(=O)N)Cl
+C1=COC(=C1)CNC2=CC(=C(C=C2C(=O)O)S(=O)(=O)N)Cl
+CO[C@H]1[C@@H](C[C@@H]2CN3CCC4=C([C@H]3C[C@@H]2[C@@H]1C(=O)OC)NC5=C4C=CC(=C5)OC)OC(=O)C6=CC(=C(C(=C6)OC)OC)OC
+CO[C@H]1[C@@H](C[C@@H]2CN3CCC4=C([C@H]3C[C@@H]2[C@@H]1C(=O)OC)NC5=C4C=CC(=C5)OC)OC(=O)C6=CC(=C(C(=C6)OC)OC)OC.C1NC2=CC(=C(C=C2S(=O)(=O)N1)S(=O)(=O)N)Cl
+CCC1(N=C2C=C3C(=NC4=CC=CC=C4N3C5=CC=CC=C5)C=C2N1C6=CC=CC=C6)CC
+CCC1(N=C2C=C3C(=NC4=CC=CC=C4N3C5=CC=CC=C5)C=C2N1C6=CC=CC=C6)C
+CC(=O)OC1=CC=CC=C1C(=O)[O-]
+CC(=O)OC1=CC=CC=C1C(=O)[O-]
b
diff -r 000000000000 -r c9bee3591df9 test-data/CID2244_with_spectrophore.sdf
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/CID2244_with_spectrophore.sdf Sat May 20 08:39:34 2017 -0400
b
@@ -0,0 +1,193 @@
+2244
+ OpenBabel07101216402D
+
+ 21 21  0  0  0  0  0  0  0  0999 V2000
+    3.7320   -0.0600    0.0000 O   0  0  0  0  0  0  0  0  0  0  0  0
+    6.3301    1.4400    0.0000 O   0  0  0  0  0  0  0  0  0  0  0  0
+    4.5981    1.4400    0.0000 O   0  0  0  0  0  0  0  0  0  0  0  0
+    2.8660   -1.5600    0.0000 O   0  0  0  0  0  0  0  0  0  0  0  0
+    4.5981   -0.5600    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
+    5.4641   -0.0600    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
+    4.5981   -1.5600    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
+    6.3301   -0.5600    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
+    5.4641   -2.0600    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
+    6.3301   -1.5600    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
+    5.4641    0.9400    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
+    2.8660   -0.5600    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
+    2.0000   -0.0600    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
+    4.0611   -1.8700    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0
+    6.8671   -0.2500    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0
+    5.4641   -2.6800    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0
+    6.8671   -1.8700    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0
+    2.3100    0.4769    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0
+    1.4631    0.2500    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0
+    1.6900   -0.5969    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0
+    6.3301    2.0600    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0
+  1  5  1  0  0  0  0
+  1 12  1  0  0  0  0
+  2 11  1  0  0  0  0
+  2 21  1  0  0  0  0
+  3 11  2  0  0  0  0
+  4 12  2  0  0  0  0
+  5  6  1  0  0  0  0
+  5  7  2  0  0  0  0
+  6  8  2  0  0  0  0
+  6 11  1  0  0  0  0
+  7  9  1  0  0  0  0
+  7 14  1  0  0  0  0
+  8 10  1  0  0  0  0
+  8 15  1  0  0  0  0
+  9 10  2  0  0  0  0
+  9 16  1  0  0  0  0
+ 10 17  1  0  0  0  0
+ 12 13  1  0  0  0  0
+ 13 18  1  0  0  0  0
+ 13 19  1  0  0  0  0
+ 13 20  1  0  0  0  0
+M  END
+>  <PUBCHEM_COMPOUND_CID>
+2244
+
+>  <PUBCHEM_COMPOUND_CANONICALIZED>
+1
+
+>  <PUBCHEM_CACTVS_COMPLEXITY>
+212
+
+>  <PUBCHEM_CACTVS_HBOND_ACCEPTOR>
+4
+
+>  <PUBCHEM_CACTVS_HBOND_DONOR>
+1
+
+>  <PUBCHEM_CACTVS_ROTATABLE_BOND>
+3
+
+>  <PUBCHEM_CACTVS_SUBSKEYS>
+AAADccBwOAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAABAAAAGgAACAAADASAmAAyDoAABgCIAiDSCAACCAAkIAAIiAEGCMgMJzaENRqCe2Cl4BEIuYeIyCCOAAAAAAAIAAAAAAAAABAAAAAAAAAAAA==
+
+>  <PUBCHEM_IUPAC_OPENEYE_NAME>
+2-acetoxybenzoic acid
+
+>  <PUBCHEM_IUPAC_CAS_NAME>
+2-acetyloxybenzoic acid
+
+>  <PUBCHEM_IUPAC_NAME>
+2-acetyloxybenzoic acid
+
+>  <PUBCHEM_IUPAC_SYSTEMATIC_NAME>
+2-acetyloxybenzoic acid
+
+>  <PUBCHEM_IUPAC_TRADITIONAL_NAME>
+2-acetoxybenzoic acid
+
+>  <PUBCHEM_IUPAC_INCHI>
+InChI=1S/C9H8O4/c1-6(10)13-8-5-3-2-4-7(8)9(11)12/h2-5H,1H3,(H,11,12)
+
+>  <PUBCHEM_IUPAC_INCHIKEY>
+BSYNRYMUTXBXSQ-UHFFFAOYSA-N
+
+>  <PUBCHEM_XLOGP3>
+1.2
+
+>  <PUBCHEM_EXACT_MASS>
+180.042259
+
+>  <PUBCHEM_MOLECULAR_FORMULA>
+C9H8O4
+
+>  <PUBCHEM_MOLECULAR_WEIGHT>
+180.15742
+
+>  <PUBCHEM_OPENEYE_CAN_SMILES>
+CC(=O)OC1=CC=CC=C1C(=O)O
+
+>  <PUBCHEM_OPENEYE_ISO_SMILES>
+CC(=O)OC1=CC=CC=C1C(=O)O
+
+>  <PUBCHEM_CACTVS_TPSA>
+63.6
+
+>  <PUBCHEM_MONOISOTOPIC_WEIGHT>
+180.042259
+
+>  <PUBCHEM_TOTAL_CHARGE>
+0
+
+>  <PUBCHEM_HEAVY_ATOM_COUNT>
+13
+
+>  <PUBCHEM_ATOM_DEF_STEREO_COUNT>
+0
+
+>  <PUBCHEM_ATOM_UDEF_STEREO_COUNT>
+0
+
+>  <PUBCHEM_BOND_DEF_STEREO_COUNT>
+0
+
+>  <PUBCHEM_BOND_UDEF_STEREO_COUNT>
+0
+
+>  <PUBCHEM_ISOTOPIC_ATOM_COUNT>
+0
+
+>  <PUBCHEM_COMPONENT_COUNT>
+1
+
+>  <PUBCHEM_CACTVS_TAUTO_COUNT>
+1
+
+>  <PUBCHEM_COORDINATE_TYPE>
+1
+5
+255
+
+>  <PUBCHEM_BONDANNOTATIONS>
+5  6  8
+5  7  8
+6  8  8
+7  9  8
+8  10  8
+9  10  8
+
+>  <Hydrogen-bond donors>
+1
+
+>  <InChI key>
+BSYNRYMUTXBXSQ-UHFFFAOYSA-N
+
+>  <logP>
+1.3101
+
+>  <Polar surface area>
+63.6
+
+>  <Number of heavy atoms>
+13
+
+>  <Molecular weight>
+180.15742
+
+>  <InChI>
+InChI=1S/C9H8O4/c1-6(10)13-8-5-3-2-4-7(8)9(11)12/h2-5H,1H3,(H,11,12)
+
+>  <Spectrophores(TM)>
+-1.454, -1.106, -1.162, 0.285, 0.369, 1.008, 0.144, -0.956, 0.133, 0.883, 1.828, 0.029, -1.312, -1.424, -1.287, -0.644, 0.59, 0.746, -0.127, 0.535, 0.368, 0.93, 1.721, -0.097, -1.591, -0.888, -1.332, 0.013, 0.889, 0.249, -0.343, -0.346, -0.047, 1.471, 1.595, 0.329, -1.101, -1.186, 0.953, 0.953, -0.644, -0.653, -1.136, 1.547, 0.533, -0.262, -0.274, 1.27
+
+>  <Number of rings>
+1
+
+>  <Canonical SMILES>
+CC(=O)Oc1ccccc1C(=O)O
+
+>  <Molecular refractivity>
+44.9003
+
+>  <Hydrogen-bond acceptors>
+4
+
+>  <Rotatable bonds>
+3
+
+$$$$
b
diff -r 000000000000 -r c9bee3591df9 test-data/CID_2244.can
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/CID_2244.can Sat May 20 08:39:34 2017 -0400
b
@@ -0,0 +1,1 @@
+CC(=O)Oc1ccccc1C(=O)O 2244
b
diff -r 000000000000 -r c9bee3591df9 test-data/CID_2244.inchi
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/CID_2244.inchi Sat May 20 08:39:34 2017 -0400
b
@@ -0,0 +1,1 @@
+InChI=1S/C9H8O4/c1-6(10)13-8-5-3-2-4-7(8)9(11)12/h2-5H,1H3,(H,11,12)
b
diff -r 000000000000 -r c9bee3591df9 test-data/CID_2244.sdf
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/CID_2244.sdf Sat May 20 08:39:34 2017 -0400
b
@@ -0,0 +1,155 @@
+2244
+  -OEChem-05151212332D
+
+ 21 21  0     0  0  0  0  0  0999 V2000
+    3.7320   -0.0600    0.0000 O   0  0  0  0  0  0  0  0  0  0  0  0
+    6.3301    1.4400    0.0000 O   0  0  0  0  0  0  0  0  0  0  0  0
+    4.5981    1.4400    0.0000 O   0  0  0  0  0  0  0  0  0  0  0  0
+    2.8660   -1.5600    0.0000 O   0  0  0  0  0  0  0  0  0  0  0  0
+    4.5981   -0.5600    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
+    5.4641   -0.0600    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
+    4.5981   -1.5600    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
+    6.3301   -0.5600    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
+    5.4641   -2.0600    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
+    6.3301   -1.5600    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
+    5.4641    0.9400    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
+    2.8660   -0.5600    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
+    2.0000   -0.0600    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
+    4.0611   -1.8700    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0
+    6.8671   -0.2500    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0
+    5.4641   -2.6800    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0
+    6.8671   -1.8700    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0
+    2.3100    0.4769    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0
+    1.4631    0.2500    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0
+    1.6900   -0.5969    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0
+    6.3301    2.0600    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0
+  1  5  1  0  0  0  0
+  1 12  1  0  0  0  0
+  2 11  1  0  0  0  0
+  2 21  1  0  0  0  0
+  3 11  2  0  0  0  0
+  4 12  2  0  0  0  0
+  5  6  1  0  0  0  0
+  5  7  2  0  0  0  0
+  6  8  2  0  0  0  0
+  6 11  1  0  0  0  0
+  7  9  1  0  0  0  0
+  7 14  1  0  0  0  0
+  8 10  1  0  0  0  0
+  8 15  1  0  0  0  0
+  9 10  2  0  0  0  0
+  9 16  1  0  0  0  0
+ 10 17  1  0  0  0  0
+ 12 13  1  0  0  0  0
+ 13 18  1  0  0  0  0
+ 13 19  1  0  0  0  0
+ 13 20  1  0  0  0  0
+M  END
+> <PUBCHEM_COMPOUND_CID>
+2244
+
+> <PUBCHEM_COMPOUND_CANONICALIZED>
+1
+
+> <PUBCHEM_CACTVS_COMPLEXITY>
+212
+
+> <PUBCHEM_CACTVS_HBOND_ACCEPTOR>
+4
+
+> <PUBCHEM_CACTVS_HBOND_DONOR>
+1
+
+> <PUBCHEM_CACTVS_ROTATABLE_BOND>
+3
+
+> <PUBCHEM_CACTVS_SUBSKEYS>
+AAADccBwOAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAABAAAAGgAACAAADASAmAAyDoAABgCIAiDSCAACCAAkIAAIiAEGCMgMJzaENRqCe2Cl4BEIuYeIyCCOAAAAAAAIAAAAAAAAABAAAAAAAAAAAA==
+
+> <PUBCHEM_IUPAC_OPENEYE_NAME>
+2-acetoxybenzoic acid
+
+> <PUBCHEM_IUPAC_CAS_NAME>
+2-acetyloxybenzoic acid
+
+> <PUBCHEM_IUPAC_NAME>
+2-acetyloxybenzoic acid
+
+> <PUBCHEM_IUPAC_SYSTEMATIC_NAME>
+2-acetyloxybenzoic acid
+
+> <PUBCHEM_IUPAC_TRADITIONAL_NAME>
+2-acetoxybenzoic acid
+
+> <PUBCHEM_IUPAC_INCHI>
+InChI=1S/C9H8O4/c1-6(10)13-8-5-3-2-4-7(8)9(11)12/h2-5H,1H3,(H,11,12)
+
+> <PUBCHEM_IUPAC_INCHIKEY>
+BSYNRYMUTXBXSQ-UHFFFAOYSA-N
+
+> <PUBCHEM_XLOGP3>
+1.2
+
+> <PUBCHEM_EXACT_MASS>
+180.042259
+
+> <PUBCHEM_MOLECULAR_FORMULA>
+C9H8O4
+
+> <PUBCHEM_MOLECULAR_WEIGHT>
+180.15742
+
+> <PUBCHEM_OPENEYE_CAN_SMILES>
+CC(=O)OC1=CC=CC=C1C(=O)O
+
+> <PUBCHEM_OPENEYE_ISO_SMILES>
+CC(=O)OC1=CC=CC=C1C(=O)O
+
+> <PUBCHEM_CACTVS_TPSA>
+63.6
+
+> <PUBCHEM_MONOISOTOPIC_WEIGHT>
+180.042259
+
+> <PUBCHEM_TOTAL_CHARGE>
+0
+
+> <PUBCHEM_HEAVY_ATOM_COUNT>
+13
+
+> <PUBCHEM_ATOM_DEF_STEREO_COUNT>
+0
+
+> <PUBCHEM_ATOM_UDEF_STEREO_COUNT>
+0
+
+> <PUBCHEM_BOND_DEF_STEREO_COUNT>
+0
+
+> <PUBCHEM_BOND_UDEF_STEREO_COUNT>
+0
+
+> <PUBCHEM_ISOTOPIC_ATOM_COUNT>
+0
+
+> <PUBCHEM_COMPONENT_COUNT>
+1
+
+> <PUBCHEM_CACTVS_TAUTO_COUNT>
+1
+
+> <PUBCHEM_COORDINATE_TYPE>
+1
+5
+255
+
+> <PUBCHEM_BONDANNOTATIONS>
+5  6  8
+5  7  8
+6  8  8
+7  9  8
+8  10  8
+9  10  8
+
+$$$$
+
b
diff -r 000000000000 -r c9bee3591df9 test-data/CID_2244.smi
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/CID_2244.smi Sat May 20 08:39:34 2017 -0400
b
@@ -0,0 +1,1 @@
+O(c1c(cccc1)C(=O)O)C(=O)C 2244
b
diff -r 000000000000 -r c9bee3591df9 test-data/CID_2244_FP2.fps
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/CID_2244_FP2.fps Sat May 20 08:39:34 2017 -0400
b
@@ -0,0 +1,7 @@
+#FPS1
+#num_bits=1021
+#type=OpenBabel-FP2/1
+#software=OpenBabel/2.3.1
+#source=CID_2244.sdf
+#date=2012-05-15T16:40:38
+00000010004000c00000020000030000010000000008000000000080000000000400400000000010200a020800000000000042000000000000800002000002000c200800010001010000000002808002208000400000000040080000000100000008000000000002004002000010000000020100080100200808000000000004 2244
b
diff -r 000000000000 -r c9bee3591df9 test-data/CID_2244_FP3.fps
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/CID_2244_FP3.fps Sat May 20 08:39:34 2017 -0400
b
@@ -0,0 +1,7 @@
+#FPS1
+#num_bits=55
+#type=OpenBabel-FP3/1
+#software=OpenBabel/2.3.1
+#source=CID_2244.sdf
+#date=2012-05-15T16:59:15
+0400000c50b007 2244
b
diff -r 000000000000 -r c9bee3591df9 test-data/CID_2244_FP4.fps
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/CID_2244_FP4.fps Sat May 20 08:39:34 2017 -0400
b
@@ -0,0 +1,7 @@
+#FPS1
+#num_bits=307
+#type=OpenBabel-FP4/1
+#software=OpenBabel/2.3.1
+#source=CID_2244.sdf
+#date=2012-05-15T16:59:22
+010000000000000000009800000000004001000000000000000000000000000000000240402801 2244
b
diff -r 000000000000 -r c9bee3591df9 test-data/CID_2244_addh.can
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/CID_2244_addh.can Sat May 20 08:39:34 2017 -0400
[
@@ -0,0 +1,1 @@
+CC(=O)Oc1ccccc1C(=O)[O-] 2244
b
diff -r 000000000000 -r c9bee3591df9 test-data/CID_2244_maccs.fps
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/CID_2244_maccs.fps Sat May 20 08:39:34 2017 -0400
b
@@ -0,0 +1,7 @@
+#FPS1
+#num_bits=166
+#type=OpenBabel-MACCS/2
+#software=OpenBabel/2.3.1
+#source=CID_2244.sdf
+#date=2012-05-15T17:00:39
+0000000000000000000000010000016480cca2d21e 2244
b
diff -r 000000000000 -r c9bee3591df9 test-data/CID_3033.sdf
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/CID_3033.sdf Sat May 20 08:39:34 2017 -0400
b
@@ -0,0 +1,271 @@
+3033
+  -OEChem-08231107463D
+
+ 30 31  0     0  0  0  0  0  0999 V2000
+    1.9541    1.1500   -2.5078 Cl  0  0  0  0  0  0  0  0  0  0  0  0
+    1.1377   -1.6392    2.1136 Cl  0  0  0  0  0  0  0  0  0  0  0  0
+   -3.2620   -2.9284   -1.0647 O   0  0  0  0  0  0  0  0  0  0  0  0
+   -2.7906   -1.9108    0.9092 O   0  0  0  0  0  0  0  0  0  0  0  0
+    0.2679   -0.2051   -0.3990 N   0  0  0  0  0  0  0  0  0  0  0  0
+   -2.0640    0.5139   -0.3769 C   0  0  0  0  0  0  0  0  0  0  0  0
+   -0.7313    0.7178   -0.0192 C   0  0  0  0  0  0  0  0  0  0  0  0
+   -2.4761   -0.6830   -1.1703 C   0  0  0  0  0  0  0  0  0  0  0  0
+    1.6571   -0.2482   -0.1795 C   0  0  0  0  0  0  0  0  0  0  0  0
+   -3.0382    1.4350    0.0081 C   0  0  0  0  0  0  0  0  0  0  0  0
+   -0.3728    1.8429    0.7234 C   0  0  0  0  0  0  0  0  0  0  0  0
+   -2.6797    2.5600    0.7506 C   0  0  0  0  0  0  0  0  0  0  0  0
+   -1.3470    2.7640    1.1083 C   0  0  0  0  0  0  0  0  0  0  0  0
+    2.5353    0.3477   -1.0918 C   0  0  0  0  0  0  0  0  0  0  0  0
+    2.1740   -0.8865    0.9534 C   0  0  0  0  0  0  0  0  0  0  0  0
+   -2.8480   -1.8749   -0.3123 C   0  0  0  0  0  0  0  0  0  0  0  0
+    3.9124    0.3058   -0.8739 C   0  0  0  0  0  0  0  0  0  0  0  0
+    3.5511   -0.9285    1.1713 C   0  0  0  0  0  0  0  0  0  0  0  0
+    4.4203   -0.3324    0.2576 C   0  0  0  0  0  0  0  0  0  0  0  0
+   -1.7086   -0.9792   -1.8930 H   0  0  0  0  0  0  0  0  0  0  0  0
+   -3.3614   -0.4266   -1.7676 H   0  0  0  0  0  0  0  0  0  0  0  0
+   -0.0861   -1.1146   -0.6780 H   0  0  0  0  0  0  0  0  0  0  0  0
+   -4.0812    1.2885   -0.2604 H   0  0  0  0  0  0  0  0  0  0  0  0
+    0.6569    2.0278    1.0167 H   0  0  0  0  0  0  0  0  0  0  0  0
+   -3.4382    3.2769    1.0511 H   0  0  0  0  0  0  0  0  0  0  0  0
+   -1.0683    3.6399    1.6868 H   0  0  0  0  0  0  0  0  0  0  0  0
+    4.6037    0.7654   -1.5758 H   0  0  0  0  0  0  0  0  0  0  0  0
+    3.9635   -1.4215    2.0480 H   0  0  0  0  0  0  0  0  0  0  0  0
+    5.4925   -0.3651    0.4274 H   0  0  0  0  0  0  0  0  0  0  0  0
+   -3.5025   -3.7011   -0.5102 H   0  0  0  0  0  0  0  0  0  0  0  0
+  1 14  1  0  0  0  0
+  2 15  1  0  0  0  0
+  3 16  1  0  0  0  0
+  3 30  1  0  0  0  0
+  4 16  2  0  0  0  0
+  5  7  1  0  0  0  0
+  5  9  1  0  0  0  0
+  5 22  1  0  0  0  0
+  6  7  1  0  0  0  0
+  6  8  1  0  0  0  0
+  6 10  2  0  0  0  0
+  7 11  2  0  0  0  0
+  8 16  1  0  0  0  0
+  8 20  1  0  0  0  0
+  8 21  1  0  0  0  0
+  9 14  2  0  0  0  0
+  9 15  1  0  0  0  0
+ 10 12  1  0  0  0  0
+ 10 23  1  0  0  0  0
+ 11 13  1  0  0  0  0
+ 11 24  1  0  0  0  0
+ 12 13  2  0  0  0  0
+ 12 25  1  0  0  0  0
+ 13 26  1  0  0  0  0
+ 14 17  1  0  0  0  0
+ 15 18  2  0  0  0  0
+ 17 19  2  0  0  0  0
+ 17 27  1  0  0  0  0
+ 18 19  1  0  0  0  0
+ 18 28  1  0  0  0  0
+ 19 29  1  0  0  0  0
+M  END
+> <PUBCHEM_COMPOUND_CID>
+3033
+
+> <PUBCHEM_CONFORMER_RMSD>
+0.6
+
+> <PUBCHEM_CONFORMER_DIVERSEORDER>
+1
+20
+18
+39
+29
+42
+38
+35
+30
+25
+33
+28
+32
+36
+26
+24
+40
+11
+27
+37
+7
+41
+10
+19
+43
+8
+6
+16
+44
+23
+34
+14
+15
+31
+9
+13
+17
+21
+22
+5
+12
+2
+3
+4
+
+> <PUBCHEM_MMFF94_PARTIAL_CHARGES>
+28
+1 -0.18
+10 -0.15
+11 -0.15
+12 -0.15
+13 -0.15
+14 0.18
+15 0.18
+16 0.66
+17 -0.15
+18 -0.15
+19 -0.15
+2 -0.18
+22 0.4
+23 0.15
+24 0.15
+25 0.15
+26 0.15
+27 0.15
+28 0.15
+29 0.15
+3 -0.65
+30 0.5
+4 -0.57
+5 -0.6
+6 -0.14
+7 0.1
+8 0.2
+9 0.1
+
+> <PUBCHEM_EFFECTIVE_ROTOR_COUNT>
+4
+
+> <PUBCHEM_PHARMACOPHORE_FEATURES>
+7
+1 3 acceptor
+1 4 acceptor
+1 5 cation
+1 5 donor
+3 3 4 16 anion
+6 6 7 10 11 12 13 rings
+6 9 14 15 17 18 19 rings
+
+> <PUBCHEM_HEAVY_ATOM_COUNT>
+19
+
+> <PUBCHEM_ATOM_DEF_STEREO_COUNT>
+0
+
+> <PUBCHEM_ATOM_UDEF_STEREO_COUNT>
+0
+
+> <PUBCHEM_BOND_DEF_STEREO_COUNT>
+0
+
+> <PUBCHEM_BOND_UDEF_STEREO_COUNT>
+0
+
+> <PUBCHEM_ISOTOPIC_ATOM_COUNT>
+0
+
+> <PUBCHEM_COMPONENT_COUNT>
+1
+
+> <PUBCHEM_CACTVS_TAUTO_COUNT>
+1
+
+> <PUBCHEM_CONFORMER_ID>
+00000BD900000001
+
+> <PUBCHEM_MMFF94_ENERGY>
+65.6362
+
+> <PUBCHEM_FEATURE_SELFOVERLAP>
+35.578
+
+> <PUBCHEM_SHAPE_FINGERPRINT>
+10366900 7 17386020514759110480
+114674 6 16903282898360328323
+11578080 2 17913245089295617604
+11582403 64 14544541357940910356
+11640471 11 18127963303313961600
+12236239 1 18272088352834916308
+12363563 72 18042978579496277287
+12553582 1 18190740839094073615
+12596599 1 18201439237582433270
+12788726 201 18410285909464206003
+13032168 30 18201440238019390274
+13140716 1 18187086113919468457
+13538477 17 18339642338307470464
+13583140 156 17241914119188522922
+13764800 53 17895191172601517065
+13965767 371 17259888045752176376
+14115302 16 18342181093776810149
+14787075 74 17907866106787333628
+15279307 12 18198622322777022915
+15375462 189 18270674264943931347
+15669948 3 18336550511731321249
+16752209 62 18336841852664817743
+16945 1 18188484791351783177
+19433438 48 18059583550169763352
+200 152 18130792217719576158
+20645476 183 18270115859187436189
+20905425 154 17970632883131290416
+21452121 199 18046637711133085653
+21639500 275 16988270998321974524
+22112679 90 18342446063036096292
+23419403 2 17835564502519425292
+23493267 7 18115023138028600728
+23526113 38 16660924516543134566
+23557571 272 17821721762863303772
+23559900 14 17896315990920094510
+23598288 3 18411412925846384519
+23598291 2 18059009613384180254
+238 59 16343141308025475526
+4340502 62 17273677940604857177
+6049 1 17240202131864233360
+6992083 37 18058168521433072460
+7615 1 18201433675414973908
+77492 1 18272651289913926852
+81228 2 17968373550240022809
+9709674 26 17896035610527288590
+
+> <PUBCHEM_SHAPE_MULTIPOLES>
+378.03
+7.01
+2.75
+1.77
+0.78
+1.58
+0.3
+0.41
+1.94
+-1.08
+1.9
+-8.69
+11.04
+2.58
+
+> <PUBCHEM_SHAPE_SELFOVERLAP>
+790.335
+
+> <PUBCHEM_SHAPE_VOLUME>
+214.7
+
+> <PUBCHEM_COORDINATE_TYPE>
+2
+5
+255
+
+$$$$
+
b
diff -r 000000000000 -r c9bee3591df9 test-data/change_title_on_CID_3033.sdf
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/change_title_on_CID_3033.sdf Sat May 20 08:39:34 2017 -0400
b
@@ -0,0 +1,270 @@
+214.7
+ OpenBabel06291213403D
+
+ 30 31  0  0  0  0  0  0  0  0999 V2000
+    1.9541    1.1500   -2.5078 Cl  0  0  0  0  0  0  0  0  0  0  0  0
+    1.1377   -1.6392    2.1136 Cl  0  0  0  0  0  0  0  0  0  0  0  0
+   -3.2620   -2.9284   -1.0647 O   0  0  0  0  0  0  0  0  0  0  0  0
+   -2.7906   -1.9108    0.9092 O   0  0  0  0  0  0  0  0  0  0  0  0
+    0.2679   -0.2051   -0.3990 N   0  0  0  0  0  0  0  0  0  0  0  0
+   -2.0640    0.5139   -0.3769 C   0  0  0  0  0  0  0  0  0  0  0  0
+   -0.7313    0.7178   -0.0192 C   0  0  0  0  0  0  0  0  0  0  0  0
+   -2.4761   -0.6830   -1.1703 C   0  0  0  0  0  0  0  0  0  0  0  0
+    1.6571   -0.2482   -0.1795 C   0  0  0  0  0  0  0  0  0  0  0  0
+   -3.0382    1.4350    0.0081 C   0  0  0  0  0  0  0  0  0  0  0  0
+   -0.3728    1.8429    0.7234 C   0  0  0  0  0  0  0  0  0  0  0  0
+   -2.6797    2.5600    0.7506 C   0  0  0  0  0  0  0  0  0  0  0  0
+   -1.3470    2.7640    1.1083 C   0  0  0  0  0  0  0  0  0  0  0  0
+    2.5353    0.3477   -1.0918 C   0  0  0  0  0  0  0  0  0  0  0  0
+    2.1740   -0.8865    0.9534 C   0  0  0  0  0  0  0  0  0  0  0  0
+   -2.8480   -1.8749   -0.3123 C   0  0  0  0  0  0  0  0  0  0  0  0
+    3.9124    0.3058   -0.8739 C   0  0  0  0  0  0  0  0  0  0  0  0
+    3.5511   -0.9285    1.1713 C   0  0  0  0  0  0  0  0  0  0  0  0
+    4.4203   -0.3324    0.2576 C   0  0  0  0  0  0  0  0  0  0  0  0
+   -1.7086   -0.9792   -1.8930 H   0  0  0  0  0  0  0  0  0  0  0  0
+   -3.3614   -0.4266   -1.7676 H   0  0  0  0  0  0  0  0  0  0  0  0
+   -0.0861   -1.1146   -0.6780 H   0  0  0  0  0  0  0  0  0  0  0  0
+   -4.0812    1.2885   -0.2604 H   0  0  0  0  0  0  0  0  0  0  0  0
+    0.6569    2.0278    1.0167 H   0  0  0  0  0  0  0  0  0  0  0  0
+   -3.4382    3.2769    1.0511 H   0  0  0  0  0  0  0  0  0  0  0  0
+   -1.0683    3.6399    1.6868 H   0  0  0  0  0  0  0  0  0  0  0  0
+    4.6037    0.7654   -1.5758 H   0  0  0  0  0  0  0  0  0  0  0  0
+    3.9635   -1.4215    2.0480 H   0  0  0  0  0  0  0  0  0  0  0  0
+    5.4925   -0.3651    0.4274 H   0  0  0  0  0  0  0  0  0  0  0  0
+   -3.5025   -3.7011   -0.5102 H   0  0  0  0  0  0  0  0  0  0  0  0
+  1 14  1  0  0  0  0
+  2 15  1  0  0  0  0
+  3 16  1  0  0  0  0
+  3 30  1  0  0  0  0
+  4 16  2  0  0  0  0
+  5  7  1  0  0  0  0
+  5  9  1  0  0  0  0
+  5 22  1  0  0  0  0
+  6  7  1  0  0  0  0
+  6  8  1  0  0  0  0
+  6 10  2  0  0  0  0
+  7 11  2  0  0  0  0
+  8 16  1  0  0  0  0
+  8 20  1  0  0  0  0
+  8 21  1  0  0  0  0
+  9 14  2  0  0  0  0
+  9 15  1  0  0  0  0
+ 10 12  1  0  0  0  0
+ 10 23  1  0  0  0  0
+ 11 13  1  0  0  0  0
+ 11 24  1  0  0  0  0
+ 12 13  2  0  0  0  0
+ 12 25  1  0  0  0  0
+ 13 26  1  0  0  0  0
+ 14 17  1  0  0  0  0
+ 15 18  2  0  0  0  0
+ 17 19  2  0  0  0  0
+ 17 27  1  0  0  0  0
+ 18 19  1  0  0  0  0
+ 18 28  1  0  0  0  0
+ 19 29  1  0  0  0  0
+M  END
+>  <PUBCHEM_COMPOUND_CID>
+3033
+
+>  <PUBCHEM_CONFORMER_RMSD>
+0.6
+
+>  <PUBCHEM_CONFORMER_DIVERSEORDER>
+1
+20
+18
+39
+29
+42
+38
+35
+30
+25
+33
+28
+32
+36
+26
+24
+40
+11
+27
+37
+7
+41
+10
+19
+43
+8
+6
+16
+44
+23
+34
+14
+15
+31
+9
+13
+17
+21
+22
+5
+12
+2
+3
+4
+
+>  <PUBCHEM_MMFF94_PARTIAL_CHARGES>
+28
+1 -0.18
+10 -0.15
+11 -0.15
+12 -0.15
+13 -0.15
+14 0.18
+15 0.18
+16 0.66
+17 -0.15
+18 -0.15
+19 -0.15
+2 -0.18
+22 0.4
+23 0.15
+24 0.15
+25 0.15
+26 0.15
+27 0.15
+28 0.15
+29 0.15
+3 -0.65
+30 0.5
+4 -0.57
+5 -0.6
+6 -0.14
+7 0.1
+8 0.2
+9 0.1
+
+>  <PUBCHEM_EFFECTIVE_ROTOR_COUNT>
+4
+
+>  <PUBCHEM_PHARMACOPHORE_FEATURES>
+7
+1 3 acceptor
+1 4 acceptor
+1 5 cation
+1 5 donor
+3 3 4 16 anion
+6 6 7 10 11 12 13 rings
+6 9 14 15 17 18 19 rings
+
+>  <PUBCHEM_HEAVY_ATOM_COUNT>
+19
+
+>  <PUBCHEM_ATOM_DEF_STEREO_COUNT>
+0
+
+>  <PUBCHEM_ATOM_UDEF_STEREO_COUNT>
+0
+
+>  <PUBCHEM_BOND_DEF_STEREO_COUNT>
+0
+
+>  <PUBCHEM_BOND_UDEF_STEREO_COUNT>
+0
+
+>  <PUBCHEM_ISOTOPIC_ATOM_COUNT>
+0
+
+>  <PUBCHEM_COMPONENT_COUNT>
+1
+
+>  <PUBCHEM_CACTVS_TAUTO_COUNT>
+1
+
+>  <PUBCHEM_CONFORMER_ID>
+00000BD900000001
+
+>  <PUBCHEM_MMFF94_ENERGY>
+65.6362
+
+>  <PUBCHEM_FEATURE_SELFOVERLAP>
+35.578
+
+>  <PUBCHEM_SHAPE_FINGERPRINT>
+10366900 7 17386020514759110480
+114674 6 16903282898360328323
+11578080 2 17913245089295617604
+11582403 64 14544541357940910356
+11640471 11 18127963303313961600
+12236239 1 18272088352834916308
+12363563 72 18042978579496277287
+12553582 1 18190740839094073615
+12596599 1 18201439237582433270
+12788726 201 18410285909464206003
+13032168 30 18201440238019390274
+13140716 1 18187086113919468457
+13538477 17 18339642338307470464
+13583140 156 17241914119188522922
+13764800 53 17895191172601517065
+13965767 371 17259888045752176376
+14115302 16 18342181093776810149
+14787075 74 17907866106787333628
+15279307 12 18198622322777022915
+15375462 189 18270674264943931347
+15669948 3 18336550511731321249
+16752209 62 18336841852664817743
+16945 1 18188484791351783177
+19433438 48 18059583550169763352
+200 152 18130792217719576158
+20645476 183 18270115859187436189
+20905425 154 17970632883131290416
+21452121 199 18046637711133085653
+21639500 275 16988270998321974524
+22112679 90 18342446063036096292
+23419403 2 17835564502519425292
+23493267 7 18115023138028600728
+23526113 38 16660924516543134566
+23557571 272 17821721762863303772
+23559900 14 17896315990920094510
+23598288 3 18411412925846384519
+23598291 2 18059009613384180254
+238 59 16343141308025475526
+4340502 62 17273677940604857177
+6049 1 17240202131864233360
+6992083 37 18058168521433072460
+7615 1 18201433675414973908
+77492 1 18272651289913926852
+81228 2 17968373550240022809
+9709674 26 17896035610527288590
+
+>  <PUBCHEM_SHAPE_MULTIPOLES>
+378.03
+7.01
+2.75
+1.77
+0.78
+1.58
+0.3
+0.41
+1.94
+-1.08
+1.9
+-8.69
+11.04
+2.58
+
+>  <PUBCHEM_SHAPE_SELFOVERLAP>
+790.335
+
+>  <PUBCHEM_SHAPE_VOLUME>
+214.7
+
+>  <PUBCHEM_COORDINATE_TYPE>
+2
+5
+255
+
+$$$$
b
diff -r 000000000000 -r c9bee3591df9 test-data/lib.tabular
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/lib.tabular Sat May 20 08:39:34 2017 -0400
[
@@ -0,0 +1,9 @@
+Hydrogen-bond donors InChI key logP Polar surface area Number of heavy atoms Molecular weight InChI Spectrophores(TM) Number of rings Canonical SMILES Molecular refractivity Hydrogen-bond acceptors Rotatable bonds
+3 JZUFKLXOESDKRF-UHFFFAOYSA-N 2.9774 135.12 17 297.73912 InChI=1S/C7H8ClN3O4S2/c8-4-1-5-7(2-6(4)16(9,12)13)17(14,15)11-3-10-5/h1-2,10-11H,3H2,(H2,9,12,13) nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, -1.245, -1.245, -0.178, -0.178, -0.178, -0.178, -0.178, -0.178, -0.178, 1.956, 1.956, -0.178, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan 2 Clc1cc2NCNS(=O)(=O)c2cc1S(=O)(=O)N 67.5768 7 1
+3 ZZUFCTLCJUWOSV-UHFFFAOYSA-N 3.7448 131.01 21 330.74414 InChI=1S/C12H11ClN2O5S/c13-9-5-10(15-6-7-2-1-3-20-7)8(12(16)17)4-11(9)21(14,18)19/h1-5,15H,6H2,(H,16,17)(H2,14,18,19) nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, -2.141, -2.141, 0.428, 0.428, 0.428, 0.428, 0.428, 0.428, 0.428, 0.428, 0.428, 0.428, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan 2 OC(=O)c1cc(c(cc1NCc1ccco1)Cl)S(=O)(=O)N 75.4644 7 5
+1 QEVHRUUCFGRFIF-MDEJGZGSSA-N 4.109 117.78 44 608.6787 InChI=1S/C33H40N2O9/c1-38-19-7-8-20-21-9-10-35-16-18-13-27(44-32(36)17-11-25(39-2)30(41-4)26(12-17)40-3)31(42-5)28(33(37)43-6)22(18)15-24(35)29(21)34-23(20)14-19/h7-8,11-12,14,18,22,24,27-28,31,34H,9-10,13,15-16H2,1-6H3/t18-,22+,24-,27-,28+,31+/m1/s1 nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan 6 COc1ccc2c(c1)[nH]c1c2CCN2[C@@H]1C[C@H]1[C@@H](C2)C[C@H]([C@@H]([C@H]1C(=O)OC)OC)OC(=O)c1cc(OC)c(c(c1)OC)OC 165.5222 10 10
+4 NJKRHQRIYAWMRO-BQTSRIDJSA-N 7.0864 252.9 61 906.41782 InChI=1S/C33H40N2O9.C7H8ClN3O4S2/c1-38-19-7-8-20-21-9-10-35-16-18-13-27(44-32(36)17-11-25(39-2)30(41-4)26(12-17)40-3)31(42-5)28(33(37)43-6)22(18)15-24(35)29(21)34-23(20)14-19;8-4-1-5-7(2-6(4)16(9,12)13)17(14,15)11-3-10-5/h7-8,11-12,14,18,22,24,27-28,31,34H,9-10,13,15-16H2,1-6H3;1-2,10-11H,3H2,(H2,9,12,13)/t18-,22+,24-,27-,28+,31+;/m1./s1 nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan 8 Clc1cc2NCNS(=O)(=O)c2cc1S(=O)(=O)N.COc1ccc2c(c1)[nH]c1c2CCN2[C@@H]1C[C@H]1[C@@H](C2)C[C@H]([C@@H]([C@H]1C(=O)OC)OC)OC(=O)c1cc(OC)c(c(c1)OC)OC 233.099 17 11
+0 UOOUPHIKFMZJEA-UHFFFAOYSA-N 6.248 33.42 33 430.54354 InChI=1S/C29H26N4/c1-3-29(4-2)31-25-20-27-24(19-28(25)33(29)22-15-9-6-10-16-22)30-23-17-11-12-18-26(23)32(27)21-13-7-5-8-14-21/h5-20H,3-4H2,1-2H3 nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, -2.141, -2.141, 0.428, 0.428, 0.428, 0.428, 0.428, 0.428, 0.428, 0.428, 0.428, 0.428, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan 6 CCC1(CC)N=c2c(N1c1ccccc1)cc1c(c2)n(c2ccccc2)c2c(n1)cccc2 143.054 3 4
+0 YQCDIJPZZOKCLA-UHFFFAOYSA-N 5.8579 33.42 32 416.51696 InChI=1S/C28H24N4/c1-3-28(2)30-24-19-26-23(18-27(24)32(28)21-14-8-5-9-15-21)29-22-16-10-11-17-25(22)31(26)20-12-6-4-7-13-20/h4-19H,3H2,1-2H3 nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan 6 CCC1(C)N=c2c(N1c1ccccc1)cc1c(c2)n(c2ccccc2)c2c(n1)cccc2 138.247 3 3
+0 BSYNRYMUTXBXSQ-UHFFFAOYSA-M -0.0246 66.43 13 179.14948 InChI=1S/C9H8O4/c1-6(10)13-8-5-3-2-4-7(8)9(11)12/h2-5H,1H3,(H,11,12)/p-1 nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, 2.141, 2.141, -0.428, -0.428, -0.428, -0.428, -0.428, -0.428, -0.428, -0.428, -0.428, -0.428, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan 1 CC(=O)Oc1ccccc1C(=O)[O-] 42.958 4 3
+0 BSYNRYMUTXBXSQ-UHFFFAOYSA-M -0.0246 66.43 13 179.14948 InChI=1S/C9H8O4/c1-6(10)13-8-5-3-2-4-7(8)9(11)12/h2-5H,1H3,(H,11,12)/p-1 nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, 2.141, 2.141, -0.428, -0.428, -0.428, -0.428, -0.428, -0.428, -0.428, -0.428, -0.428, -0.428, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan 1 CC(=O)Oc1ccccc1C(=O)[O-] 42.958 4 3
b
diff -r 000000000000 -r c9bee3591df9 test-data/molecule.fs
b
Binary file test-data/molecule.fs has changed
b
diff -r 000000000000 -r c9bee3591df9 test-data/molecule.sdf
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/molecule.sdf Sat May 20 08:39:34 2017 -0400
b
@@ -0,0 +1,155 @@
+2244
+  -OEChem-05151212332D
+
+ 21 21  0     0  0  0  0  0  0999 V2000
+    3.7320   -0.0600    0.0000 O   0  0  0  0  0  0  0  0  0  0  0  0
+    6.3301    1.4400    0.0000 O   0  0  0  0  0  0  0  0  0  0  0  0
+    4.5981    1.4400    0.0000 O   0  0  0  0  0  0  0  0  0  0  0  0
+    2.8660   -1.5600    0.0000 O   0  0  0  0  0  0  0  0  0  0  0  0
+    4.5981   -0.5600    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
+    5.4641   -0.0600    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
+    4.5981   -1.5600    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
+    6.3301   -0.5600    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
+    5.4641   -2.0600    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
+    6.3301   -1.5600    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
+    5.4641    0.9400    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
+    2.8660   -0.5600    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
+    2.0000   -0.0600    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
+    4.0611   -1.8700    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0
+    6.8671   -0.2500    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0
+    5.4641   -2.6800    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0
+    6.8671   -1.8700    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0
+    2.3100    0.4769    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0
+    1.4631    0.2500    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0
+    1.6900   -0.5969    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0
+    6.3301    2.0600    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0
+  1  5  1  0  0  0  0
+  1 12  1  0  0  0  0
+  2 11  1  0  0  0  0
+  2 21  1  0  0  0  0
+  3 11  2  0  0  0  0
+  4 12  2  0  0  0  0
+  5  6  1  0  0  0  0
+  5  7  2  0  0  0  0
+  6  8  2  0  0  0  0
+  6 11  1  0  0  0  0
+  7  9  1  0  0  0  0
+  7 14  1  0  0  0  0
+  8 10  1  0  0  0  0
+  8 15  1  0  0  0  0
+  9 10  2  0  0  0  0
+  9 16  1  0  0  0  0
+ 10 17  1  0  0  0  0
+ 12 13  1  0  0  0  0
+ 13 18  1  0  0  0  0
+ 13 19  1  0  0  0  0
+ 13 20  1  0  0  0  0
+M  END
+> <PUBCHEM_COMPOUND_CID>
+2244
+
+> <PUBCHEM_COMPOUND_CANONICALIZED>
+1
+
+> <PUBCHEM_CACTVS_COMPLEXITY>
+212
+
+> <PUBCHEM_CACTVS_HBOND_ACCEPTOR>
+4
+
+> <PUBCHEM_CACTVS_HBOND_DONOR>
+1
+
+> <PUBCHEM_CACTVS_ROTATABLE_BOND>
+3
+
+> <PUBCHEM_CACTVS_SUBSKEYS>
+AAADccBwOAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAABAAAAGgAACAAADASAmAAyDoAABgCIAiDSCAACCAAkIAAIiAEGCMgMJzaENRqCe2Cl4BEIuYeIyCCOAAAAAAAIAAAAAAAAABAAAAAAAAAAAA==
+
+> <PUBCHEM_IUPAC_OPENEYE_NAME>
+2-acetoxybenzoic acid
+
+> <PUBCHEM_IUPAC_CAS_NAME>
+2-acetyloxybenzoic acid
+
+> <PUBCHEM_IUPAC_NAME>
+2-acetyloxybenzoic acid
+
+> <PUBCHEM_IUPAC_SYSTEMATIC_NAME>
+2-acetyloxybenzoic acid
+
+> <PUBCHEM_IUPAC_TRADITIONAL_NAME>
+2-acetoxybenzoic acid
+
+> <PUBCHEM_IUPAC_INCHI>
+InChI=1S/C9H8O4/c1-6(10)13-8-5-3-2-4-7(8)9(11)12/h2-5H,1H3,(H,11,12)
+
+> <PUBCHEM_IUPAC_INCHIKEY>
+BSYNRYMUTXBXSQ-UHFFFAOYSA-N
+
+> <PUBCHEM_XLOGP3>
+1.2
+
+> <PUBCHEM_EXACT_MASS>
+180.042259
+
+> <PUBCHEM_MOLECULAR_FORMULA>
+C9H8O4
+
+> <PUBCHEM_MOLECULAR_WEIGHT>
+180.15742
+
+> <PUBCHEM_OPENEYE_CAN_SMILES>
+CC(=O)OC1=CC=CC=C1C(=O)O
+
+> <PUBCHEM_OPENEYE_ISO_SMILES>
+CC(=O)OC1=CC=CC=C1C(=O)O
+
+> <PUBCHEM_CACTVS_TPSA>
+63.6
+
+> <PUBCHEM_MONOISOTOPIC_WEIGHT>
+180.042259
+
+> <PUBCHEM_TOTAL_CHARGE>
+0
+
+> <PUBCHEM_HEAVY_ATOM_COUNT>
+13
+
+> <PUBCHEM_ATOM_DEF_STEREO_COUNT>
+0
+
+> <PUBCHEM_ATOM_UDEF_STEREO_COUNT>
+0
+
+> <PUBCHEM_BOND_DEF_STEREO_COUNT>
+0
+
+> <PUBCHEM_BOND_UDEF_STEREO_COUNT>
+0
+
+> <PUBCHEM_ISOTOPIC_ATOM_COUNT>
+0
+
+> <PUBCHEM_COMPONENT_COUNT>
+1
+
+> <PUBCHEM_CACTVS_TAUTO_COUNT>
+1
+
+> <PUBCHEM_COORDINATE_TYPE>
+1
+5
+255
+
+> <PUBCHEM_BONDANNOTATIONS>
+5  6  8
+5  7  8
+6  8  8
+7  9  8
+8  10  8
+9  10  8
+
+$$$$
+
b
diff -r 000000000000 -r c9bee3591df9 test-data/ob_convert_on_CID2244.can
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/ob_convert_on_CID2244.can Sat May 20 08:39:34 2017 -0400
b
@@ -0,0 +1,1 @@
+CC(=O)Oc1ccccc1C(=O)O 2244
b
diff -r 000000000000 -r c9bee3591df9 test-data/ob_convert_on_CID2244.cml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/ob_convert_on_CID2244.cml Sat May 20 08:39:34 2017 -0400
b
@@ -0,0 +1,49 @@
+<?xml version="1.0"?>
+<molecule id="id2244" xmlns="http://www.xml-cml.org/schema">
+ <atomArray>
+  <atom id="a1" elementType="O" x2="3.732000" y2="-0.060000"/>
+  <atom id="a2" elementType="O" x2="6.330100" y2="1.440000"/>
+  <atom id="a3" elementType="O" x2="4.598100" y2="1.440000"/>
+  <atom id="a4" elementType="O" x2="2.866000" y2="-1.560000"/>
+  <atom id="a5" elementType="C" x2="4.598100" y2="-0.560000"/>
+  <atom id="a6" elementType="C" x2="5.464100" y2="-0.060000"/>
+  <atom id="a7" elementType="C" x2="4.598100" y2="-1.560000"/>
+  <atom id="a8" elementType="C" x2="6.330100" y2="-0.560000"/>
+  <atom id="a9" elementType="C" x2="5.464100" y2="-2.060000"/>
+  <atom id="a10" elementType="C" x2="6.330100" y2="-1.560000"/>
+  <atom id="a11" elementType="C" x2="5.464100" y2="0.940000"/>
+  <atom id="a12" elementType="C" x2="2.866000" y2="-0.560000"/>
+  <atom id="a13" elementType="C" x2="2.000000" y2="-0.060000"/>
+  <atom id="a14" elementType="H" x2="4.061100" y2="-1.870000"/>
+  <atom id="a15" elementType="H" x2="6.867100" y2="-0.250000"/>
+  <atom id="a16" elementType="H" x2="5.464100" y2="-2.680000"/>
+  <atom id="a17" elementType="H" x2="6.867100" y2="-1.870000"/>
+  <atom id="a18" elementType="H" x2="2.310000" y2="0.476900"/>
+  <atom id="a19" elementType="H" x2="1.463100" y2="0.250000"/>
+  <atom id="a20" elementType="H" x2="1.690000" y2="-0.596900"/>
+  <atom id="a21" elementType="H" x2="6.330100" y2="2.060000"/>
+ </atomArray>
+ <bondArray>
+  <bond atomRefs2="a1 a5" order="1"/>
+  <bond atomRefs2="a1 a12" order="1"/>
+  <bond atomRefs2="a2 a11" order="1"/>
+  <bond atomRefs2="a2 a21" order="1"/>
+  <bond atomRefs2="a3 a11" order="2"/>
+  <bond atomRefs2="a4 a12" order="2"/>
+  <bond atomRefs2="a5 a6" order="1"/>
+  <bond atomRefs2="a5 a7" order="2"/>
+  <bond atomRefs2="a6 a8" order="2"/>
+  <bond atomRefs2="a6 a11" order="1"/>
+  <bond atomRefs2="a7 a9" order="1"/>
+  <bond atomRefs2="a7 a14" order="1"/>
+  <bond atomRefs2="a8 a10" order="1"/>
+  <bond atomRefs2="a8 a15" order="1"/>
+  <bond atomRefs2="a9 a10" order="2"/>
+  <bond atomRefs2="a9 a16" order="1"/>
+  <bond atomRefs2="a10 a17" order="1"/>
+  <bond atomRefs2="a12 a13" order="1"/>
+  <bond atomRefs2="a13 a18" order="1"/>
+  <bond atomRefs2="a13 a19" order="1"/>
+  <bond atomRefs2="a13 a20" order="1"/>
+ </bondArray>
+</molecule>
b
diff -r 000000000000 -r c9bee3591df9 test-data/ob_convert_on_CID2244.inchi
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/ob_convert_on_CID2244.inchi Sat May 20 08:39:34 2017 -0400
b
@@ -0,0 +1,1 @@
+InChI=1S/C9H8O4/c1-6(10)13-8-5-3-2-4-7(8)9(11)12/h2-5H,1H3,(H,11,12) 2244
b
diff -r 000000000000 -r c9bee3591df9 test-data/ob_convert_on_CID2244.pdb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/ob_convert_on_CID2244.pdb Sat May 20 08:39:34 2017 -0400
b
@@ -0,0 +1,46 @@
+COMPND    2244 
+AUTHOR    GENERATED BY OPEN BABEL 2.3.90
+HETATM    1  O   UNL     1       3.732  -0.060   0.000  1.00  0.00           O  
+HETATM    2  O   UNL     1       6.330   1.440   0.000  1.00  0.00           O  
+HETATM    3  O   UNL     1       4.598   1.440   0.000  1.00  0.00           O  
+HETATM    4  O   UNL     1       2.866  -1.560   0.000  1.00  0.00           O  
+HETATM    5  C   UNL     1       4.598  -0.560   0.000  1.00  0.00           C  
+HETATM    6  C   UNL     1       5.464  -0.060   0.000  1.00  0.00           C  
+HETATM    7  C   UNL     1       4.598  -1.560   0.000  1.00  0.00           C  
+HETATM    8  C   UNL     1       6.330  -0.560   0.000  1.00  0.00           C  
+HETATM    9  C   UNL     1       5.464  -2.060   0.000  1.00  0.00           C  
+HETATM   10  C   UNL     1       6.330  -1.560   0.000  1.00  0.00           C  
+HETATM   11  C   UNL     1       5.464   0.940   0.000  1.00  0.00           C  
+HETATM   12  C   UNL     1       2.866  -0.560   0.000  1.00  0.00           C  
+HETATM   13  C   UNL     1       2.000  -0.060   0.000  1.00  0.00           C  
+HETATM   14  H   UNL     1       4.061  -1.870   0.000  1.00  0.00           H  
+HETATM   15  H   UNL     1       6.867  -0.250   0.000  1.00  0.00           H  
+HETATM   16  H   UNL     1       5.464  -2.680   0.000  1.00  0.00           H  
+HETATM   17  H   UNL     1       6.867  -1.870   0.000  1.00  0.00           H  
+HETATM   18  H   UNL     1       2.310   0.477   0.000  1.00  0.00           H  
+HETATM   19  H   UNL     1       1.463   0.250   0.000  1.00  0.00           H  
+HETATM   20  H   UNL     1       1.690  -0.597   0.000  1.00  0.00           H  
+HETATM   21  H   UNL     1       6.330   2.060   0.000  1.00  0.00           H  
+CONECT    1    5   12                                                 
+CONECT    2   11   21                                                 
+CONECT    3   11                                                      
+CONECT    4   12                                                      
+CONECT    5    1    6    7                                            
+CONECT    6    5    8   11                                            
+CONECT    7    5    9   14                                            
+CONECT    8    6   10   15                                            
+CONECT    9    7   10   16                                            
+CONECT   10    8    9   17                                            
+CONECT   11    2    3    6                                            
+CONECT   12    1    4   13                                            
+CONECT   13   12   18   19   20                                       
+CONECT   14    7                                                      
+CONECT   15    8                                                      
+CONECT   16    9                                                      
+CONECT   17   10                                                      
+CONECT   18   13                                                      
+CONECT   19   13                                                      
+CONECT   20   13                                                      
+CONECT   21    2                                                      
+MASTER        0    0    0    0    0    0    0    0   21    0   21    0
+END
b
diff -r 000000000000 -r c9bee3591df9 test-data/ob_convert_on_CID2244.sdf
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/ob_convert_on_CID2244.sdf Sat May 20 08:39:34 2017 -0400
b
@@ -0,0 +1,154 @@
+2244
+ OpenBabel03291606592D
+
+ 21 21  0  0  0  0  0  0  0  0999 V2000
+    3.7320   -0.0600    0.0000 O   0  0  0  0  0  0  0  0  0  0  0  0
+    6.3301    1.4400    0.0000 O   0  0  0  0  0  0  0  0  0  0  0  0
+    4.5981    1.4400    0.0000 O   0  0  0  0  0  0  0  0  0  0  0  0
+    2.8660   -1.5600    0.0000 O   0  0  0  0  0  0  0  0  0  0  0  0
+    4.5981   -0.5600    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
+    5.4641   -0.0600    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
+    4.5981   -1.5600    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
+    6.3301   -0.5600    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
+    5.4641   -2.0600    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
+    6.3301   -1.5600    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
+    5.4641    0.9400    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
+    2.8660   -0.5600    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
+    2.0000   -0.0600    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
+    4.0611   -1.8700    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0
+    6.8671   -0.2500    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0
+    5.4641   -2.6800    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0
+    6.8671   -1.8700    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0
+    2.3100    0.4769    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0
+    1.4631    0.2500    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0
+    1.6900   -0.5969    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0
+    6.3301    2.0600    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0
+  1  5  1  0  0  0  0
+  1 12  1  0  0  0  0
+  2 11  1  0  0  0  0
+  2 21  1  0  0  0  0
+  3 11  2  0  0  0  0
+  4 12  2  0  0  0  0
+  5  6  1  0  0  0  0
+  5  7  2  0  0  0  0
+  6  8  2  0  0  0  0
+  6 11  1  0  0  0  0
+  7  9  1  0  0  0  0
+  7 14  1  0  0  0  0
+  8 10  1  0  0  0  0
+  8 15  1  0  0  0  0
+  9 10  2  0  0  0  0
+  9 16  1  0  0  0  0
+ 10 17  1  0  0  0  0
+ 12 13  1  0  0  0  0
+ 13 18  1  0  0  0  0
+ 13 19  1  0  0  0  0
+ 13 20  1  0  0  0  0
+M  END
+>  <PUBCHEM_COMPOUND_CID>
+2244
+
+>  <PUBCHEM_COMPOUND_CANONICALIZED>
+1
+
+>  <PUBCHEM_CACTVS_COMPLEXITY>
+212
+
+>  <PUBCHEM_CACTVS_HBOND_ACCEPTOR>
+4
+
+>  <PUBCHEM_CACTVS_HBOND_DONOR>
+1
+
+>  <PUBCHEM_CACTVS_ROTATABLE_BOND>
+3
+
+>  <PUBCHEM_CACTVS_SUBSKEYS>
+AAADccBwOAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAABAAAAGgAACAAADASAmAAyDoAABgCIAiDSCAACCAAkIAAIiAEGCMgMJzaENRqCe2Cl4BEIuYeIyCCOAAAAAAAIAAAAAAAAABAAAAAAAAAAAA==
+
+>  <PUBCHEM_IUPAC_OPENEYE_NAME>
+2-acetoxybenzoic acid
+
+>  <PUBCHEM_IUPAC_CAS_NAME>
+2-acetyloxybenzoic acid
+
+>  <PUBCHEM_IUPAC_NAME>
+2-acetyloxybenzoic acid
+
+>  <PUBCHEM_IUPAC_SYSTEMATIC_NAME>
+2-acetyloxybenzoic acid
+
+>  <PUBCHEM_IUPAC_TRADITIONAL_NAME>
+2-acetoxybenzoic acid
+
+>  <PUBCHEM_IUPAC_INCHI>
+InChI=1S/C9H8O4/c1-6(10)13-8-5-3-2-4-7(8)9(11)12/h2-5H,1H3,(H,11,12)
+
+>  <PUBCHEM_IUPAC_INCHIKEY>
+BSYNRYMUTXBXSQ-UHFFFAOYSA-N
+
+>  <PUBCHEM_XLOGP3>
+1.2
+
+>  <PUBCHEM_EXACT_MASS>
+180.042259
+
+>  <PUBCHEM_MOLECULAR_FORMULA>
+C9H8O4
+
+>  <PUBCHEM_MOLECULAR_WEIGHT>
+180.15742
+
+>  <PUBCHEM_OPENEYE_CAN_SMILES>
+CC(=O)OC1=CC=CC=C1C(=O)O
+
+>  <PUBCHEM_OPENEYE_ISO_SMILES>
+CC(=O)OC1=CC=CC=C1C(=O)O
+
+>  <PUBCHEM_CACTVS_TPSA>
+63.6
+
+>  <PUBCHEM_MONOISOTOPIC_WEIGHT>
+180.042259
+
+>  <PUBCHEM_TOTAL_CHARGE>
+0
+
+>  <PUBCHEM_HEAVY_ATOM_COUNT>
+13
+
+>  <PUBCHEM_ATOM_DEF_STEREO_COUNT>
+0
+
+>  <PUBCHEM_ATOM_UDEF_STEREO_COUNT>
+0
+
+>  <PUBCHEM_BOND_DEF_STEREO_COUNT>
+0
+
+>  <PUBCHEM_BOND_UDEF_STEREO_COUNT>
+0
+
+>  <PUBCHEM_ISOTOPIC_ATOM_COUNT>
+0
+
+>  <PUBCHEM_COMPONENT_COUNT>
+1
+
+>  <PUBCHEM_CACTVS_TAUTO_COUNT>
+1
+
+>  <PUBCHEM_COORDINATE_TYPE>
+1
+5
+255
+
+>  <PUBCHEM_BONDANNOTATIONS>
+5  6  8
+5  7  8
+6  8  8
+7  9  8
+8  10  8
+9  10  8
+
+$$$$
b
diff -r 000000000000 -r c9bee3591df9 test-data/ob_convert_on_CID2244.smi
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/ob_convert_on_CID2244.smi Sat May 20 08:39:34 2017 -0400
b
@@ -0,0 +1,1 @@
+CC(=O)Oc1ccccc1C(=O)O 2244
b
diff -r 000000000000 -r c9bee3591df9 test-data/ob_depiction_svg_on_8_mol.svg
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/ob_depiction_svg_on_8_mol.svg Sat May 20 08:39:34 2017 -0400
[
b'@@ -0,0 +1,580 @@\n+<?xml version="1.0"?>\n+<svg version="1.1" id="topsvg"\n+xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"\n+xmlns:cml="http://www.xml-cml.org/schema" x="0" y="0" width="100%" height="100%" viewBox="0 0 100 100">\n+<title>Multiple Molecules - Open Babel Depiction</title>\n+<rect x="0" y="0" width="100" height="100" fill="white"/>\n+<g transform="translate(0,0)">\n+<svg width="33.3333" height="33.3333" x="0" y="0" viewBox="0 0 300 258.564"\n+font-family="sans-serif" stroke="rgb(0,0,0)" stroke-width="4"  stroke-linecap="round">\n+<line x1="103.0" y1="191.6" x2="103.0" y2="205.6" stroke="rgb(0,0,0)"  stroke-width="4.0"/>\n+<line x1="97.0" y1="191.6" x2="97.0" y2="205.6" stroke="rgb(0,0,0)"  stroke-width="4.0"/>\n+<line x1="112.8" y1="182.5" x2="124.9" y2="189.5" stroke="rgb(0,0,0)"  stroke-width="4.0"/>\n+<line x1="109.8" y1="187.7" x2="121.9" y2="194.7" stroke="rgb(0,0,0)"  stroke-width="4.0"/>\n+<line x1="180.0" y1="109.3" x2="207.0" y2="109.3" stroke="rgb(0,0,0)"  stroke-width="4.0"/>\n+<line x1="223.0" y1="122.3" x2="223.0" y2="136.3" stroke="rgb(0,0,0)"  stroke-width="4.0"/>\n+<line x1="217.0" y1="122.3" x2="217.0" y2="136.3" stroke="rgb(0,0,0)"  stroke-width="4.0"/>\n+<line x1="233.0" y1="106.3" x2="247.0" y2="106.3" stroke="rgb(0,0,0)"  stroke-width="4.0"/>\n+<line x1="233.0" y1="112.3" x2="247.0" y2="112.3" stroke="rgb(0,0,0)"  stroke-width="4.0"/>\n+<line x1="220.0" y1="96.3" x2="220.0" y2="82.3" stroke="rgb(0,0,0)"  stroke-width="4.0"/>\n+<line x1="160.0" y1="74.6" x2="173.5" y2="51.3" stroke="rgb(0,0,0)"  stroke-width="4.0"/>\n+<line x1="180.0" y1="109.3" x2="160.0" y2="143.9" stroke="rgb(0,0,0)"  stroke-width="4.0"/>\n+<line x1="160.0" y1="143.9" x2="120.0" y2="143.9" stroke="rgb(0,0,0)"  stroke-width="4.0"/>\n+<line x1="154.0" y1="136.7" x2="126.0" y2="136.7" stroke="rgb(0,0,0)"  stroke-width="4.0"/>\n+<line x1="120.0" y1="143.9" x2="100.0" y2="109.3" stroke="rgb(0,0,0)"  stroke-width="4.0"/>\n+<line x1="100.0" y1="109.3" x2="120.0" y2="74.6" stroke="rgb(0,0,0)"  stroke-width="4.0"/>\n+<line x1="109.2" y1="107.7" x2="123.2" y2="83.4" stroke="rgb(0,0,0)"  stroke-width="4.0"/>\n+<line x1="120.0" y1="74.6" x2="160.0" y2="74.6" stroke="rgb(0,0,0)"  stroke-width="4.0"/>\n+<line x1="160.0" y1="74.6" x2="180.0" y2="109.3" stroke="rgb(0,0,0)"  stroke-width="4.0"/>\n+<line x1="156.8" y1="83.4" x2="170.8" y2="107.7" stroke="rgb(0,0,0)"  stroke-width="4.0"/>\n+<line x1="120.0" y1="143.9" x2="106.5" y2="167.3" stroke="rgb(0,0,0)"  stroke-width="4.0"/>\n+<line x1="87.0" y1="178.6" x2="73.0" y2="178.6" stroke="rgb(0,0,0)"  stroke-width="4.0"/>\n+<line x1="53.5" y1="167.3" x2="40.0" y2="143.9" stroke="rgb(0,0,0)"  stroke-width="4.0"/>\n+<line x1="40.0" y1="143.9" x2="53.5" y2="120.5" stroke="rgb(0,0,0)"  stroke-width="4.0"/>\n+<line x1="73.0" y1="109.3" x2="100.0" y2="109.3" stroke="rgb(0,0,0)"  stroke-width="4.0"/>\n+<text x="94.000000" y="186.564065" fill="rgb(178,178,0)"  stroke="rgb(178,178,0)" stroke-width="1" font-size="16" >S</text>\n+<text x="174.000000" y="48.000000" fill="rgb(30,239,30)"  stroke="rgb(30,239,30)" stroke-width="1" font-size="16" >Cl</text>\n+<text x="216.000000" y="77.282032" fill="rgb(12,12,255)"  stroke="rgb(12,12,255)" stroke-width="1" font-size="16" >NH</text>\n+<text x="240.000000" y="80.962032" fill="rgb(12,12,255)"  stroke="rgb(12,12,255)" stroke-width="1" font-size="13" >2</text>\n+<text x="254.000000" y="117.282032" fill="rgb(255,12,12)"  stroke="rgb(255,12,12)" stroke-width="1" font-size="16" >O</text>\n+<text x="214.000000" y="157.282032" fill="rgb(255,12,12)"  stroke="rgb(255,12,12)" stroke-width="1" font-size="16" >O</text>\n+<text x="214.000000" y="117.282032" fill="rgb(178,178,0)"  stroke="rgb(178,178,0)" stroke-width="1" font-size="16" >S</text>\n+<text x="54.000000" y="186.564065" fill="rgb(12,12,255)"  stroke="rgb(12,12,255)" stroke-width="1" font-size="16" >N</text>\n+<text x="54.000000" y="202.564065" fill="rgb(12,12,255)"  stroke="rgb(12,12,255)" stroke-width="1" font-size="16" >H'..b'x2="109.3" y2="120.0" stroke="rgb(0,0,0)"  stroke-width="4.0"/>\n+<line x1="143.9" y1="100.0" x2="178.6" y2="120.0" stroke="rgb(0,0,0)"  stroke-width="4.0"/>\n+<line x1="181.6" y1="120.0" x2="181.6" y2="147.0" stroke="rgb(0,0,0)"  stroke-width="4.0"/>\n+<line x1="175.6" y1="120.0" x2="175.6" y2="147.0" stroke="rgb(0,0,0)"  stroke-width="4.0"/>\n+<line x1="178.6" y1="120.0" x2="201.9" y2="106.5" stroke="rgb(0,0,0)"  stroke-width="4.0"/>\n+<line x1="74.6" y1="60.0" x2="109.3" y2="40.0" stroke="rgb(0,0,0)"  stroke-width="4.0"/>\n+<line x1="83.4" y1="63.2" x2="107.7" y2="49.2" stroke="rgb(0,0,0)"  stroke-width="4.0"/>\n+<line x1="109.3" y1="40.0" x2="143.9" y2="60.0" stroke="rgb(0,0,0)"  stroke-width="4.0"/>\n+<line x1="143.9" y1="60.0" x2="143.9" y2="100.0" stroke="rgb(0,0,0)"  stroke-width="4.0"/>\n+<line x1="136.7" y1="66.0" x2="136.7" y2="94.0" stroke="rgb(0,0,0)"  stroke-width="4.0"/>\n+<line x1="143.9" y1="100.0" x2="109.3" y2="120.0" stroke="rgb(0,0,0)"  stroke-width="4.0"/>\n+<line x1="109.3" y1="120.0" x2="74.6" y2="100.0" stroke="rgb(0,0,0)"  stroke-width="4.0"/>\n+<line x1="107.7" y1="110.8" x2="83.4" y2="96.8" stroke="rgb(0,0,0)"  stroke-width="4.0"/>\n+<line x1="74.6" y1="100.0" x2="74.6" y2="60.0" stroke="rgb(0,0,0)"  stroke-width="4.0"/>\n+<text x="68.641016" y="228.000000" fill="rgb(255,12,12)"  stroke="rgb(255,12,12)" stroke-width="1" font-size="16" >O</text>\n+<text x="103.282032" y="168.000000" fill="rgb(255,12,12)"  stroke="rgb(255,12,12)" stroke-width="1" font-size="16" >O</text>\n+<text x="172.564065" y="168.000000" fill="rgb(255,12,12)"  stroke="rgb(255,12,12)" stroke-width="1" font-size="16" >O</text>\n+<text x="218.005081" y="85.888000" fill="rgb(255,12,12)"  stroke="rgb(255,12,12)" stroke-width="1" font-size="16" >_</text>\n+<text x="207.205081" y="108.000000" fill="rgb(255,12,12)"  stroke="rgb(255,12,12)" stroke-width="1" font-size="16" >O</text>\n+</svg>\n+</g>\n+<text text-anchor="middle" font-size="2.000000" fill ="black" font-family="sans-serif"\n+x="50.000000" y="99.333333" ></text>\n+<script type="text/ecmascript">\n+  <![CDATA[\n+    var svgEl = document.getElementById("topsvg");\n+    svgEl.addEventListener(\'DOMMouseScroll\', wheel, false);\n+    svgEl.addEventListener(\'mousewheel\', wheel, false);\n+    var startx=0;\n+    var starty=0;\n+    function wheel(evt){\n+      evt = evt ? evt : window.event;\n+      var normal = evt.detail ? evt.detail * -1 : evt.wheelDelta / 40;\n+      var vb = new Array(4);\n+      var vbtext = svgEl.getAttributeNS(null,"viewBox");\n+      vb = vbtext.split(" ");\n+      var zoom = (normal<0)? 1.41 : 0.71;\n+      //var dwidth = parseFloat(Math.max(vb[2],vb[3])) * (1-zoom);\n+      vb[0] = parseFloat(vb[0]) + parseFloat(vb[2])*(1-zoom) * evt.clientX/innerWidth;\n+      vb[1] = parseFloat(vb[1]) + parseFloat(vb[3])*(1-zoom) * evt.clientY/innerHeight;\n+      vb[2] = parseFloat(vb[2]) * zoom;\n+      vb[3] = parseFloat(vb[3]) * zoom;\n+      svgEl.setAttributeNS(null, "viewBox", vb.join(" "));\n+      if (evt.preventDefault)\n+        evt.preventDefault(); // Don\'t scroll the page when zooming\n+    }\n+   svgEl.onmousedown = function(evt) {\n+      startx = evt.clientX;\n+      starty = evt.clientY;\n+    }\n+    svgEl.onmousemove=function(evt) {\n+      if(startx!=0 && starty!=0 \n+        && ((evt.clientX - startx)*(evt.clientX - startx)+(evt.clientY - starty)*(evt.clientY - starty)>100))\n+      {\n+        var vbtext = svgEl.getAttributeNS(null,"viewBox");\n+        vb = vbtext.split(" ");\n+        var maxwh = Math.max(parseFloat(vb[2]),parseFloat(vb[3]));\n+        vb[0] = parseFloat(vb[0]) - (evt.clientX - startx)*maxwh/innerWidth;\n+        vb[1] = parseFloat(vb[1]) - (evt.clientY - starty)*maxwh/innerHeight;\n+        svgEl.setAttributeNS(null, "viewBox", vb.join(" "));\n+        startx = evt.clientX;\n+        starty = evt.clientY;\n+      }\n+    } \n+    svgEl.onmouseup=function() {\n+      startx=0;\n+      starty=0;\n+    }\n+    svgEl.ondblclick=function() {\n+      location.reload();\n+    }\n+  ]]>\n+</script>\n+\n+</svg>\n'
b
diff -r 000000000000 -r c9bee3591df9 test-data/ob_filter_on_CID2244.sdf
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/ob_filter_on_CID2244.sdf Sat May 20 08:39:34 2017 -0400
b
@@ -0,0 +1,154 @@
+2244
+ OpenBabel07101213142D
+
+ 21 21  0  0  0  0  0  0  0  0999 V2000
+    3.7320   -0.0600    0.0000 O   0  0  0  0  0  0  0  0  0  0  0  0
+    6.3301    1.4400    0.0000 O   0  0  0  0  0  0  0  0  0  0  0  0
+    4.5981    1.4400    0.0000 O   0  0  0  0  0  0  0  0  0  0  0  0
+    2.8660   -1.5600    0.0000 O   0  0  0  0  0  0  0  0  0  0  0  0
+    4.5981   -0.5600    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
+    5.4641   -0.0600    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
+    4.5981   -1.5600    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
+    6.3301   -0.5600    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
+    5.4641   -2.0600    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
+    6.3301   -1.5600    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
+    5.4641    0.9400    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
+    2.8660   -0.5600    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
+    2.0000   -0.0600    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
+    4.0611   -1.8700    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0
+    6.8671   -0.2500    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0
+    5.4641   -2.6800    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0
+    6.8671   -1.8700    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0
+    2.3100    0.4769    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0
+    1.4631    0.2500    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0
+    1.6900   -0.5969    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0
+    6.3301    2.0600    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0
+  1  5  1  0  0  0  0
+  1 12  1  0  0  0  0
+  2 11  1  0  0  0  0
+  2 21  1  0  0  0  0
+  3 11  2  0  0  0  0
+  4 12  2  0  0  0  0
+  5  6  1  0  0  0  0
+  5  7  2  0  0  0  0
+  6  8  2  0  0  0  0
+  6 11  1  0  0  0  0
+  7  9  1  0  0  0  0
+  7 14  1  0  0  0  0
+  8 10  1  0  0  0  0
+  8 15  1  0  0  0  0
+  9 10  2  0  0  0  0
+  9 16  1  0  0  0  0
+ 10 17  1  0  0  0  0
+ 12 13  1  0  0  0  0
+ 13 18  1  0  0  0  0
+ 13 19  1  0  0  0  0
+ 13 20  1  0  0  0  0
+M  END
+>  <PUBCHEM_COMPOUND_CID>
+2244
+
+>  <PUBCHEM_COMPOUND_CANONICALIZED>
+1
+
+>  <PUBCHEM_CACTVS_COMPLEXITY>
+212
+
+>  <PUBCHEM_CACTVS_HBOND_ACCEPTOR>
+4
+
+>  <PUBCHEM_CACTVS_HBOND_DONOR>
+1
+
+>  <PUBCHEM_CACTVS_ROTATABLE_BOND>
+3
+
+>  <PUBCHEM_CACTVS_SUBSKEYS>
+AAADccBwOAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAABAAAAGgAACAAADASAmAAyDoAABgCIAiDSCAACCAAkIAAIiAEGCMgMJzaENRqCe2Cl4BEIuYeIyCCOAAAAAAAIAAAAAAAAABAAAAAAAAAAAA==
+
+>  <PUBCHEM_IUPAC_OPENEYE_NAME>
+2-acetoxybenzoic acid
+
+>  <PUBCHEM_IUPAC_CAS_NAME>
+2-acetyloxybenzoic acid
+
+>  <PUBCHEM_IUPAC_NAME>
+2-acetyloxybenzoic acid
+
+>  <PUBCHEM_IUPAC_SYSTEMATIC_NAME>
+2-acetyloxybenzoic acid
+
+>  <PUBCHEM_IUPAC_TRADITIONAL_NAME>
+2-acetoxybenzoic acid
+
+>  <PUBCHEM_IUPAC_INCHI>
+InChI=1S/C9H8O4/c1-6(10)13-8-5-3-2-4-7(8)9(11)12/h2-5H,1H3,(H,11,12)
+
+>  <PUBCHEM_IUPAC_INCHIKEY>
+BSYNRYMUTXBXSQ-UHFFFAOYSA-N
+
+>  <PUBCHEM_XLOGP3>
+1.2
+
+>  <PUBCHEM_EXACT_MASS>
+180.042259
+
+>  <PUBCHEM_MOLECULAR_FORMULA>
+C9H8O4
+
+>  <PUBCHEM_MOLECULAR_WEIGHT>
+180.15742
+
+>  <PUBCHEM_OPENEYE_CAN_SMILES>
+CC(=O)OC1=CC=CC=C1C(=O)O
+
+>  <PUBCHEM_OPENEYE_ISO_SMILES>
+CC(=O)OC1=CC=CC=C1C(=O)O
+
+>  <PUBCHEM_CACTVS_TPSA>
+63.6
+
+>  <PUBCHEM_MONOISOTOPIC_WEIGHT>
+180.042259
+
+>  <PUBCHEM_TOTAL_CHARGE>
+0
+
+>  <PUBCHEM_HEAVY_ATOM_COUNT>
+13
+
+>  <PUBCHEM_ATOM_DEF_STEREO_COUNT>
+0
+
+>  <PUBCHEM_ATOM_UDEF_STEREO_COUNT>
+0
+
+>  <PUBCHEM_BOND_DEF_STEREO_COUNT>
+0
+
+>  <PUBCHEM_BOND_UDEF_STEREO_COUNT>
+0
+
+>  <PUBCHEM_ISOTOPIC_ATOM_COUNT>
+0
+
+>  <PUBCHEM_COMPONENT_COUNT>
+1
+
+>  <PUBCHEM_CACTVS_TAUTO_COUNT>
+1
+
+>  <PUBCHEM_COORDINATE_TYPE>
+1
+5
+255
+
+>  <PUBCHEM_BONDANNOTATIONS>
+5  6  8
+5  7  8
+6  8  8
+7  9  8
+8  10  8
+9  10  8
+
+$$$$
b
diff -r 000000000000 -r c9bee3591df9 test-data/ob_filter_on_CID2244.smi
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/ob_filter_on_CID2244.smi Sat May 20 08:39:34 2017 -0400
b
@@ -0,0 +1,1 @@
+O(c1c(cccc1)C(=O)O)C(=O)C 2244
b
diff -r 000000000000 -r c9bee3591df9 test-data/ob_filter_on_CID2244_2.smi
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/ob_filter_on_CID2244_2.smi Sat May 20 08:39:34 2017 -0400
b
@@ -0,0 +1,1 @@
+O(c1c(cccc1)C(=O)O)C(=O)C 2244
b
diff -r 000000000000 -r c9bee3591df9 test-data/ob_genprop_on_CID2244.sdf
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/ob_genprop_on_CID2244.sdf Sat May 20 08:39:34 2017 -0400
b
@@ -0,0 +1,193 @@
+2244
+ OpenBabel05191718512D
+
+ 21 21  0  0  0  0  0  0  0  0999 V2000
+    3.7320   -0.0600    0.0000 O   0  0  0  0  0  0  0  0  0  0  0  0
+    6.3301    1.4400    0.0000 O   0  0  0  0  0  0  0  0  0  0  0  0
+    4.5981    1.4400    0.0000 O   0  0  0  0  0  0  0  0  0  0  0  0
+    2.8660   -1.5600    0.0000 O   0  0  0  0  0  0  0  0  0  0  0  0
+    4.5981   -0.5600    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
+    5.4641   -0.0600    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
+    4.5981   -1.5600    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
+    6.3301   -0.5600    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
+    5.4641   -2.0600    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
+    6.3301   -1.5600    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
+    5.4641    0.9400    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
+    2.8660   -0.5600    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
+    2.0000   -0.0600    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
+    4.0611   -1.8700    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0
+    6.8671   -0.2500    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0
+    5.4641   -2.6800    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0
+    6.8671   -1.8700    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0
+    2.3100    0.4769    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0
+    1.4631    0.2500    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0
+    1.6900   -0.5969    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0
+    6.3301    2.0600    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0
+  1  5  1  0  0  0  0
+  1 12  1  0  0  0  0
+  2 11  1  0  0  0  0
+  2 21  1  0  0  0  0
+  3 11  2  0  0  0  0
+  4 12  2  0  0  0  0
+  5  6  1  0  0  0  0
+  5  7  2  0  0  0  0
+  6  8  2  0  0  0  0
+  6 11  1  0  0  0  0
+  7  9  1  0  0  0  0
+  7 14  1  0  0  0  0
+  8 10  1  0  0  0  0
+  8 15  1  0  0  0  0
+  9 10  2  0  0  0  0
+  9 16  1  0  0  0  0
+ 10 17  1  0  0  0  0
+ 12 13  1  0  0  0  0
+ 13 18  1  0  0  0  0
+ 13 19  1  0  0  0  0
+ 13 20  1  0  0  0  0
+M  END
+>  <PUBCHEM_COMPOUND_CID>
+2244
+
+>  <PUBCHEM_COMPOUND_CANONICALIZED>
+1
+
+>  <PUBCHEM_CACTVS_COMPLEXITY>
+212
+
+>  <PUBCHEM_CACTVS_HBOND_ACCEPTOR>
+4
+
+>  <PUBCHEM_CACTVS_HBOND_DONOR>
+1
+
+>  <PUBCHEM_CACTVS_ROTATABLE_BOND>
+3
+
+>  <PUBCHEM_CACTVS_SUBSKEYS>
+AAADccBwOAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAABAAAAGgAACAAADASAmAAyDoAABgCIAiDSCAACCAAkIAAIiAEGCMgMJzaENRqCe2Cl4BEIuYeIyCCOAAAAAAAIAAAAAAAAABAAAAAAAAAAAA==
+
+>  <PUBCHEM_IUPAC_OPENEYE_NAME>
+2-acetoxybenzoic acid
+
+>  <PUBCHEM_IUPAC_CAS_NAME>
+2-acetyloxybenzoic acid
+
+>  <PUBCHEM_IUPAC_NAME>
+2-acetyloxybenzoic acid
+
+>  <PUBCHEM_IUPAC_SYSTEMATIC_NAME>
+2-acetyloxybenzoic acid
+
+>  <PUBCHEM_IUPAC_TRADITIONAL_NAME>
+2-acetoxybenzoic acid
+
+>  <PUBCHEM_IUPAC_INCHI>
+InChI=1S/C9H8O4/c1-6(10)13-8-5-3-2-4-7(8)9(11)12/h2-5H,1H3,(H,11,12)
+
+>  <PUBCHEM_IUPAC_INCHIKEY>
+BSYNRYMUTXBXSQ-UHFFFAOYSA-N
+
+>  <PUBCHEM_XLOGP3>
+1.2
+
+>  <PUBCHEM_EXACT_MASS>
+180.042259
+
+>  <PUBCHEM_MOLECULAR_FORMULA>
+C9H8O4
+
+>  <PUBCHEM_MOLECULAR_WEIGHT>
+180.15742
+
+>  <PUBCHEM_OPENEYE_CAN_SMILES>
+CC(=O)OC1=CC=CC=C1C(=O)O
+
+>  <PUBCHEM_OPENEYE_ISO_SMILES>
+CC(=O)OC1=CC=CC=C1C(=O)O
+
+>  <PUBCHEM_CACTVS_TPSA>
+63.6
+
+>  <PUBCHEM_MONOISOTOPIC_WEIGHT>
+180.042259
+
+>  <PUBCHEM_TOTAL_CHARGE>
+0
+
+>  <PUBCHEM_HEAVY_ATOM_COUNT>
+13
+
+>  <PUBCHEM_ATOM_DEF_STEREO_COUNT>
+0
+
+>  <PUBCHEM_ATOM_UDEF_STEREO_COUNT>
+0
+
+>  <PUBCHEM_BOND_DEF_STEREO_COUNT>
+0
+
+>  <PUBCHEM_BOND_UDEF_STEREO_COUNT>
+0
+
+>  <PUBCHEM_ISOTOPIC_ATOM_COUNT>
+0
+
+>  <PUBCHEM_COMPONENT_COUNT>
+1
+
+>  <PUBCHEM_CACTVS_TAUTO_COUNT>
+1
+
+>  <PUBCHEM_COORDINATE_TYPE>
+1
+5
+255
+
+>  <PUBCHEM_BONDANNOTATIONS>
+5  6  8
+5  7  8
+6  8  8
+7  9  8
+8  10  8
+9  10  8
+
+>  <Molecular weight>
+180.1574199999999
+
+>  <logP>
+1.3100999999999998
+
+>  <Hydrogen-bond donors>
+1
+
+>  <Hydrogen-bond acceptors>
+4
+
+>  <Polar surface area>
+63.6
+
+>  <Molecular refractivity>
+44.900299999999994
+
+>  <Rotatable bonds>
+3
+
+>  <Canonical SMILES>
+CC(=O)Oc1ccccc1C(=O)O
+
+>  <InChI>
+InChI=1S/C9H8O4/c1-6(10)13-8-5-3-2-4-7(8)9(11)12/h2-5H,1H3,(H,11,12)
+
+>  <InChI key>
+BSYNRYMUTXBXSQ-UHFFFAOYSA-N
+
+>  <Number of rings>
+1
+
+>  <Number of heavy atoms>
+13
+
+>  <Spectrophores(TM)>
+-1.454, -1.106, -1.162, 0.285, 0.369, 1.008, 0.144, -0.956, 0.133, 0.883, 1.828, 0.029, -1.312, -1.424, -1.287, -0.644, 0.590, 0.746, -0.127, 0.535, 0.368, 0.930, 1.721, -0.097, -1.591, -0.888, -1.332, 0.013, 0.889, 0.249, -0.343, -0.346, -0.047, 1.471, 1.595, 0.329, -1.101, -1.186, 0.953, 0.953, -0.644, -0.653, -1.136, 1.547, 0.533, -0.262, -0.274, 1.270
+
+$$$$
b
diff -r 000000000000 -r c9bee3591df9 test-data/ob_genprop_on_CID2244.tabular
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/ob_genprop_on_CID2244.tabular Sat May 20 08:39:34 2017 -0400
b
@@ -0,0 +1,2 @@
+Molecular weight logP Hydrogen-bond donors Hydrogen-bond acceptors Polar surface area Molecular refractivity Rotatable bonds Canonical SMILES InChI InChI key Number of rings Number of heavy atoms Spectrophores(TM)
+180.1574199999999 1.3100999999999998 1 4 63.6 44.900299999999994 3 CC(=O)Oc1ccccc1C(=O)O InChI=1S/C9H8O4/c1-6(10)13-8-5-3-2-4-7(8)9(11)12/h2-5H,1H3,(H,11,12) BSYNRYMUTXBXSQ-UHFFFAOYSA-N 1 13 -1.454, -1.106, -1.162, 0.285, 0.369, 1.008, 0.144, -0.956, 0.133, 0.883, 1.828, 0.029, -1.312, -1.424, -1.287, -0.644, 0.590, 0.746, -0.127, 0.535, 0.368, 0.930, 1.721, -0.097, -1.591, -0.888, -1.332, 0.013, 0.889, 0.249, -0.343, -0.346, -0.047, 1.471, 1.595, 0.329, -1.101, -1.186, 0.953, 0.953, -0.644, -0.653, -1.136, 1.547, 0.533, -0.262, -0.274, 1.270
b
diff -r 000000000000 -r c9bee3591df9 test-data/ob_multi_obgrep.smi
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/ob_multi_obgrep.smi Sat May 20 08:39:34 2017 -0400
[
@@ -0,0 +1,4 @@
+CC(=O)Oc1ccccc1C(=O)[O-]
+CC(=O)Oc1ccccc1C(=O)[O-]
+CC(=O)Oc1ccccc1C(=O)[O-]
+CC(=O)Oc1ccccc1C(=O)[O-]
b
diff -r 000000000000 -r c9bee3591df9 test-data/ob_remDuplicates_on_2_mol.smi
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/ob_remDuplicates_on_2_mol.smi Sat May 20 08:39:34 2017 -0400
[
@@ -0,0 +1,1 @@
+CC(=O)OC1=CC=CC=C1C(=O)[O-]
b
diff -r 000000000000 -r c9bee3591df9 test-data/ob_remove_protonation_state.sdf
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/ob_remove_protonation_state.sdf Sat May 20 08:39:34 2017 -0400
b
@@ -0,0 +1,154 @@
+2244
+ OpenBabel03291607022D
+
+ 21 21  0  0  0  0  0  0  0  0999 V2000
+    3.7320   -0.0600    0.0000 O   0  0  0  0  0  0  0  0  0  0  0  0
+    6.3301    1.4400    0.0000 O   0  0  0  0  0  0  0  0  0  0  0  0
+    4.5981    1.4400    0.0000 O   0  0  0  0  0  0  0  0  0  0  0  0
+    2.8660   -1.5600    0.0000 O   0  0  0  0  0  0  0  0  0  0  0  0
+    4.5981   -0.5600    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
+    5.4641   -0.0600    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
+    4.5981   -1.5600    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
+    6.3301   -0.5600    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
+    5.4641   -2.0600    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
+    6.3301   -1.5600    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
+    5.4641    0.9400    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
+    2.8660   -0.5600    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
+    2.0000   -0.0600    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
+    4.0611   -1.8700    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0
+    6.8671   -0.2500    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0
+    5.4641   -2.6800    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0
+    6.8671   -1.8700    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0
+    2.3100    0.4769    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0
+    1.4631    0.2500    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0
+    1.6900   -0.5969    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0
+    6.3301    2.0600    0.0000 H   0  0  0  0  0  0  0  0  0  0  0  0
+  1  5  1  0  0  0  0
+  1 12  1  0  0  0  0
+  2 11  1  0  0  0  0
+  2 21  1  0  0  0  0
+  3 11  2  0  0  0  0
+  4 12  2  0  0  0  0
+  5  6  1  0  0  0  0
+  5  7  2  0  0  0  0
+  6  8  2  0  0  0  0
+  6 11  1  0  0  0  0
+  7  9  1  0  0  0  0
+  7 14  1  0  0  0  0
+  8 10  1  0  0  0  0
+  8 15  1  0  0  0  0
+  9 10  2  0  0  0  0
+  9 16  1  0  0  0  0
+ 10 17  1  0  0  0  0
+ 12 13  1  0  0  0  0
+ 13 18  1  0  0  0  0
+ 13 19  1  0  0  0  0
+ 13 20  1  0  0  0  0
+M  END
+>  <PUBCHEM_COMPOUND_CID>
+2244
+
+>  <PUBCHEM_COMPOUND_CANONICALIZED>
+1
+
+>  <PUBCHEM_CACTVS_COMPLEXITY>
+212
+
+>  <PUBCHEM_CACTVS_HBOND_ACCEPTOR>
+4
+
+>  <PUBCHEM_CACTVS_HBOND_DONOR>
+1
+
+>  <PUBCHEM_CACTVS_ROTATABLE_BOND>
+3
+
+>  <PUBCHEM_CACTVS_SUBSKEYS>
+AAADccBwOAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAABAAAAGgAACAAADASAmAAyDoAABgCIAiDSCAACCAAkIAAIiAEGCMgMJzaENRqCe2Cl4BEIuYeIyCCOAAAAAAAIAAAAAAAAABAAAAAAAAAAAA==
+
+>  <PUBCHEM_IUPAC_OPENEYE_NAME>
+2-acetoxybenzoic acid
+
+>  <PUBCHEM_IUPAC_CAS_NAME>
+2-acetyloxybenzoic acid
+
+>  <PUBCHEM_IUPAC_NAME>
+2-acetyloxybenzoic acid
+
+>  <PUBCHEM_IUPAC_SYSTEMATIC_NAME>
+2-acetyloxybenzoic acid
+
+>  <PUBCHEM_IUPAC_TRADITIONAL_NAME>
+2-acetoxybenzoic acid
+
+>  <PUBCHEM_IUPAC_INCHI>
+InChI=1S/C9H8O4/c1-6(10)13-8-5-3-2-4-7(8)9(11)12/h2-5H,1H3,(H,11,12)
+
+>  <PUBCHEM_IUPAC_INCHIKEY>
+BSYNRYMUTXBXSQ-UHFFFAOYSA-N
+
+>  <PUBCHEM_XLOGP3>
+1.2
+
+>  <PUBCHEM_EXACT_MASS>
+180.042259
+
+>  <PUBCHEM_MOLECULAR_FORMULA>
+C9H8O4
+
+>  <PUBCHEM_MOLECULAR_WEIGHT>
+180.15742
+
+>  <PUBCHEM_OPENEYE_CAN_SMILES>
+CC(=O)OC1=CC=CC=C1C(=O)O
+
+>  <PUBCHEM_OPENEYE_ISO_SMILES>
+CC(=O)OC1=CC=CC=C1C(=O)O
+
+>  <PUBCHEM_CACTVS_TPSA>
+63.6
+
+>  <PUBCHEM_MONOISOTOPIC_WEIGHT>
+180.042259
+
+>  <PUBCHEM_TOTAL_CHARGE>
+0
+
+>  <PUBCHEM_HEAVY_ATOM_COUNT>
+13
+
+>  <PUBCHEM_ATOM_DEF_STEREO_COUNT>
+0
+
+>  <PUBCHEM_ATOM_UDEF_STEREO_COUNT>
+0
+
+>  <PUBCHEM_BOND_DEF_STEREO_COUNT>
+0
+
+>  <PUBCHEM_BOND_UDEF_STEREO_COUNT>
+0
+
+>  <PUBCHEM_ISOTOPIC_ATOM_COUNT>
+0
+
+>  <PUBCHEM_COMPONENT_COUNT>
+1
+
+>  <PUBCHEM_CACTVS_TAUTO_COUNT>
+1
+
+>  <PUBCHEM_COORDINATE_TYPE>
+1
+5
+255
+
+>  <PUBCHEM_BONDANNOTATIONS>
+5  6  8
+5  7  8
+6  8  8
+7  9  8
+8  10  8
+9  10  8
+
+$$$$
b
diff -r 000000000000 -r c9bee3591df9 test-data/ob_spectrophore_search.tabular
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/ob_spectrophore_search.tabular Sat May 20 08:39:34 2017 -0400
[
@@ -0,0 +1,9 @@
+Hydrogen-bond donors InChI key logP Polar surface area Number of heavy atoms Molecular weight InChI Spectrophores(TM) Number of rings Canonical SMILES Molecular refractivity Hydrogen-bond acceptors Rotatable bonds 0.000000
+3 JZUFKLXOESDKRF-UHFFFAOYSA-N 2.9774 135.12 17 297.73912 InChI=1S/C7H8ClN3O4S2/c8-4-1-5-7(2-6(4)16(9,12)13)17(14,15)11-3-10-5/h1-2,10-11H,3H2,(H2,9,12,13) nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, -1.245, -1.245, -0.178, -0.178, -0.178, -0.178, -0.178, -0.178, -0.178, 1.956, 1.956, -0.178, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan 2 Clc1cc2NCNS(=O)(=O)c2cc1S(=O)(=O)N 67.5768 7 1 nan
+3 ZZUFCTLCJUWOSV-UHFFFAOYSA-N 3.7448 131.01 21 330.74414 InChI=1S/C12H11ClN2O5S/c13-9-5-10(15-6-7-2-1-3-20-7)8(12(16)17)4-11(9)21(14,18)19/h1-5,15H,6H2,(H,16,17)(H2,14,18,19) nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, -2.141, -2.141, 0.428, 0.428, 0.428, 0.428, 0.428, 0.428, 0.428, 0.428, 0.428, 0.428, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan 2 OC(=O)c1cc(c(cc1NCc1ccco1)Cl)S(=O)(=O)N 75.4644 7 5 nan
+1 QEVHRUUCFGRFIF-MDEJGZGSSA-N 4.109 117.78 44 608.6787 InChI=1S/C33H40N2O9/c1-38-19-7-8-20-21-9-10-35-16-18-13-27(44-32(36)17-11-25(39-2)30(41-4)26(12-17)40-3)31(42-5)28(33(37)43-6)22(18)15-24(35)29(21)34-23(20)14-19/h7-8,11-12,14,18,22,24,27-28,31,34H,9-10,13,15-16H2,1-6H3/t18-,22+,24-,27-,28+,31+/m1/s1 nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan 6 COc1ccc2c(c1)[nH]c1c2CCN2[C@@H]1C[C@H]1[C@@H](C2)C[C@H]([C@@H]([C@H]1C(=O)OC)OC)OC(=O)c1cc(OC)c(c(c1)OC)OC 165.5222 10 10 nan
+4 NJKRHQRIYAWMRO-BQTSRIDJSA-N 7.0864 252.9 61 906.41782 InChI=1S/C33H40N2O9.C7H8ClN3O4S2/c1-38-19-7-8-20-21-9-10-35-16-18-13-27(44-32(36)17-11-25(39-2)30(41-4)26(12-17)40-3)31(42-5)28(33(37)43-6)22(18)15-24(35)29(21)34-23(20)14-19;8-4-1-5-7(2-6(4)16(9,12)13)17(14,15)11-3-10-5/h7-8,11-12,14,18,22,24,27-28,31,34H,9-10,13,15-16H2,1-6H3;1-2,10-11H,3H2,(H2,9,12,13)/t18-,22+,24-,27-,28+,31+;/m1./s1 nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan 8 Clc1cc2NCNS(=O)(=O)c2cc1S(=O)(=O)N.COc1ccc2c(c1)[nH]c1c2CCN2[C@@H]1C[C@H]1[C@@H](C2)C[C@H]([C@@H]([C@H]1C(=O)OC)OC)OC(=O)c1cc(OC)c(c(c1)OC)OC 233.099 17 11 nan
+0 UOOUPHIKFMZJEA-UHFFFAOYSA-N 6.248 33.42 33 430.54354 InChI=1S/C29H26N4/c1-3-29(4-2)31-25-20-27-24(19-28(25)33(29)22-15-9-6-10-16-22)30-23-17-11-12-18-26(23)32(27)21-13-7-5-8-14-21/h5-20H,3-4H2,1-2H3 nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, -2.141, -2.141, 0.428, 0.428, 0.428, 0.428, 0.428, 0.428, 0.428, 0.428, 0.428, 0.428, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan 6 CCC1(CC)N=c2c(N1c1ccccc1)cc1c(c2)n(c2ccccc2)c2c(n1)cccc2 143.054 3 4 nan
+0 YQCDIJPZZOKCLA-UHFFFAOYSA-N 5.8579 33.42 32 416.51696 InChI=1S/C28H24N4/c1-3-28(2)30-24-19-26-23(18-27(24)32(28)21-14-8-5-9-15-21)29-22-16-10-11-17-25(22)31(26)20-12-6-4-7-13-20/h4-19H,3H2,1-2H3 nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan 6 CCC1(C)N=c2c(N1c1ccccc1)cc1c(c2)n(c2ccccc2)c2c(n1)cccc2 138.247 3 3 nan
+0 BSYNRYMUTXBXSQ-UHFFFAOYSA-M -0.0246 66.43 13 179.14948 InChI=1S/C9H8O4/c1-6(10)13-8-5-3-2-4-7(8)9(11)12/h2-5H,1H3,(H,11,12)/p-1 nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, 2.141, 2.141, -0.428, -0.428, -0.428, -0.428, -0.428, -0.428, -0.428, -0.428, -0.428, -0.428, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan 1 CC(=O)Oc1ccccc1C(=O)[O-] 42.958 4 3 nan
+0 BSYNRYMUTXBXSQ-UHFFFAOYSA-M -0.0246 66.43 13 179.14948 InChI=1S/C9H8O4/c1-6(10)13-8-5-3-2-4-7(8)9(11)12/h2-5H,1H3,(H,11,12)/p-1 nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, 2.141, 2.141, -0.428, -0.428, -0.428, -0.428, -0.428, -0.428, -0.428, -0.428, -0.428, -0.428, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan 1 CC(=O)Oc1ccccc1C(=O)[O-] 42.958 4 3 nan
b
diff -r 000000000000 -r c9bee3591df9 test-data/obgrep_on_8_mol.smi
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/obgrep_on_8_mol.smi Sat May 20 08:39:34 2017 -0400
[
@@ -0,0 +1,5 @@
+c1coc(c1)CNc1cc(c(cc1C(=O)O)S(=O)(=O)N)Cl
+CO[C@H]1[C@@H](C[C@@H]2CN3CCc4c([C@H]3C[C@@H]2[C@@H]1C(=O)OC)[nH]c1c4ccc(c1)OC)OC(=O)c1cc(c(c(c1)OC)OC)OC
+CO[C@H]1[C@@H](C[C@@H]2CN3CCc4c([C@H]3C[C@@H]2[C@@H]1C(=O)OC)[nH]c1c4ccc(c1)OC)OC(=O)c1cc(c(c(c1)OC)OC)OC.C1Nc2cc(c(cc2S(=O)(=O)N1)S(=O)(=O)N)Cl
+CC(=O)Oc1ccccc1C(=O)[O-]
+CC(=O)Oc1ccccc1C(=O)[O-]
b
diff -r 000000000000 -r c9bee3591df9 test-data/obremsmall_on_3_mol.smi
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/obremsmall_on_3_mol.smi Sat May 20 08:39:34 2017 -0400
[
@@ -0,0 +1,2 @@
+CC(=O)OC1=CC=CC=C1C(=O)[O-]
+CC(=O)OC1=CC=CC=C1C(=O)[O-]
b
diff -r 000000000000 -r c9bee3591df9 test-data/obrmions_on_2_mol.smi
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/obrmions_on_2_mol.smi Sat May 20 08:39:34 2017 -0400
[
@@ -0,0 +1,2 @@
+CC(=O)Oc1ccccc1C(=O)[O-]
+CC(=O)Oc1ccccc1C(=O)[O-]
b
diff -r 000000000000 -r c9bee3591df9 test-data/pattern.smarts
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/pattern.smarts Sat May 20 08:39:34 2017 -0400
b
@@ -0,0 +1,2 @@
+CC
+CO