# HG changeset patch # User bgruening # Date 1638635971 0 # Node ID 5c501eb8d56c326f4c9b9aeb0e70ddf42f4cbf67 "planemo upload for repository https://github.com/bgruening/galaxytools/tree/master/chemicaltoolbox/rdkit commit c1d813d3f0fec60ea6efe8a11e59d98bfdc1636f" diff -r 000000000000 -r 5c501eb8d56c dimorphite_dl.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/dimorphite_dl.py Sat Dec 04 16:39:31 2021 +0000 @@ -0,0 +1,1311 @@ +# flake8: noqa +# Copyright 2018 Jacob D. Durrant +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +""" +This script identifies and enumerates the possible protonation sites of SMILES +strings. +""" + +from __future__ import print_function + +import argparse +import os +import sys + +try: + # Python2 + from StringIO import StringIO +except ImportError: + # Python3 + from io import StringIO + +# Always let the user know a help file is available. +print("\nFor help, use: python dimorphite_dl.py --help") + +# And always report citation information. +print("\nIf you use Dimorphite-DL in your research, please cite:") +print("Ropp PJ, Kaminsky JC, Yablonski S, Durrant JD (2019) Dimorphite-DL: An") +print("open-source program for enumerating the ionization states of drug-like small") +print("molecules. J Cheminform 11:14. doi:10.1186/s13321-019-0336-9.\n") + +try: + import rdkit + from rdkit import Chem + from rdkit.Chem import AllChem +except Exception: + msg = "Dimorphite-DL requires RDKit. See https://www.rdkit.org/" + print(msg) + raise Exception(msg) + + +def main(params=None): + """The main definition run when you call the script from the commandline. + + :param params: The parameters to use. Entirely optional. If absent, + defaults to None, in which case argments will be taken from + those given at the command line. + :param params: dict, optional + :return: Returns a list of the SMILES strings return_as_list parameter is + True. Otherwise, returns None. + """ + + parser = ArgParseFuncs.get_args() + args = vars(parser.parse_args()) + + # Add in any parameters in params. + if params is not None: + for k, v in params.items(): + args[k] = v + + # If being run from the command line, print out all parameters. + if __name__ == "__main__": + print("\nPARAMETERS:\n") + for k in sorted(args.keys()): + print(k.rjust(13) + ": " + str(args[k])) + print("") + + if args["test"]: + # Run tests. + TestFuncs.test() + else: + # Run protonation + if "output_file" in args and args["output_file"] is not None: + # An output file was specified, so write to that. + with open(args["output_file"], "w") as file: + for protonated_smi in Protonate(args): + file.write(protonated_smi + "\n") + elif "return_as_list" in args and args["return_as_list"]: + return list(Protonate(args)) + else: + # No output file specified. Just print it to the screen. + for protonated_smi in Protonate(args): + print(protonated_smi) + + +class MyParser(argparse.ArgumentParser): + """Overwrite default parse so it displays help file on error. See + https://stackoverflow.com/questions/4042452/display-help-message-with-python-argparse-when-script-is-called-without-any-argu""" + + def error(self, message): + """Overwrites the default error message. + + :param message: The default error message. + """ + + self.print_help() + msg = "ERROR: %s\n\n" % message + print(msg) + raise Exception(msg) + + def print_help(self, file=None): + """Overwrite the default print_help function + + :param file: Output file, defaults to None + """ + + print("") + + if file is None: + file = sys.stdout + self._print_message(self.format_help(), file) + print( + """ +examples: + python dimorphite_dl.py --smiles_file sample_molecules.smi + python dimorphite_dl.py --smiles "CCC(=O)O" --min_ph -3.0 --max_ph -2.0 + python dimorphite_dl.py --smiles "CCCN" --min_ph -3.0 --max_ph -2.0 --output_file output.smi + python dimorphite_dl.py --smiles_file sample_molecules.smi --pka_precision 2.0 --label_states + python dimorphite_dl.py --test""" + ) + print("") + + +class ArgParseFuncs: + """A namespace for storing functions that are useful for processing + command-line arguments. To keep things organized.""" + + @staticmethod + def get_args(): + """Gets the arguments from the command line. + + :return: A parser object. + """ + + parser = MyParser( + description="Dimorphite 1.2: Creates models of " + + "appropriately protonated small moleucles. " + + "Apache 2.0 License. Copyright 2018 Jacob D. " + + "Durrant." + ) + parser.add_argument( + "--min_ph", + metavar="MIN", + type=float, + default=6.4, + help="minimum pH to consider (default: 6.4)", + ) + parser.add_argument( + "--max_ph", + metavar="MAX", + type=float, + default=8.4, + help="maximum pH to consider (default: 8.4)", + ) + parser.add_argument( + "--pka_precision", + metavar="PRE", + type=float, + default=1.0, + help="pKa precision factor (number of standard devations, default: 1.0)", + ) + parser.add_argument( + "--smiles", metavar="SMI", type=str, help="SMILES string to protonate" + ) + parser.add_argument( + "--smiles_file", + metavar="FILE", + type=str, + help="file that contains SMILES strings to protonate", + ) + parser.add_argument( + "--output_file", + metavar="FILE", + type=str, + help="output file to write protonated SMILES (optional)", + ) + parser.add_argument( + "--label_states", + action="store_true", + help="label protonated SMILES with target state " + + '(i.e., "DEPROTONATED", "PROTONATED", or "BOTH").', + ) + parser.add_argument( + "--test", action="store_true", help="run unit tests (for debugging)" + ) + + return parser + + @staticmethod + def clean_args(args): + """Cleans and normalizes input parameters + + :param args: A dictionary containing the arguments. + :type args: dict + :raises Exception: No SMILES in params. + """ + + defaults = { + "min_ph": 6.4, + "max_ph": 8.4, + "pka_precision": 1.0, + "label_states": False, + "test": False, + } + + for key in defaults: + if key not in args: + args[key] = defaults[key] + + keys = list(args.keys()) + for key in keys: + if args[key] is None: + del args[key] + + if not "smiles" in args and not "smiles_file" in args: + msg = "Error: No SMILES in params. Use the -h parameter for help." + print(msg) + raise Exception(msg) + + # If the user provides a smiles string, turn it into a file-like StringIO + # object. + if "smiles" in args: + if isinstance(args["smiles"], str): + args["smiles_file"] = StringIO(args["smiles"]) + + args["smiles_and_data"] = LoadSMIFile(args["smiles_file"]) + + return args + + +class UtilFuncs: + """A namespace to store functions for manipulating mol objects. To keep + things organized.""" + + @staticmethod + def neutralize_mol(mol): + """All molecules should be neuralized to the extent possible. The user + should not be allowed to specify the valence of the atoms in most cases. + + :param rdkit.Chem.rdchem.Mol mol: The rdkit Mol objet to be neutralized. + :return: The neutralized Mol object. + """ + + # Get the reaction data + rxn_data = [ + [ + "[Ov1-1:1]", + "[Ov2+0:1]-[H]", + ], # To handle O- bonded to only one atom (add hydrogen). + [ + "[#7v4+1:1]-[H]", + "[#7v3+0:1]", + ], # To handle N+ bonded to a hydrogen (remove hydrogen). + [ + "[Ov2-:1]", + "[Ov2+0:1]", + ], # To handle O- bonded to two atoms. Should not be Negative. + [ + "[#7v3+1:1]", + "[#7v3+0:1]", + ], # To handle N+ bonded to three atoms. Should not be positive. + [ + "[#7v2-1:1]", + "[#7+0:1]-[H]", + ], # To handle N- Bonded to two atoms. Add hydrogen. + # ['[N:1]=[N+0:2]=[N:3]-[H]', '[N:1]=[N+1:2]=[N+0:3]-[H]'], # To + # handle bad azide. Must be protonated. (Now handled elsewhere, before + # SMILES converted to Mol object.) + [ + "[H]-[N:1]-[N:2]#[N:3]", + "[N:1]=[N+1:2]=[N:3]-[H]", + ], # To handle bad azide. R-N-N#N should be R-N=[N+]=N + ] + + # Add substructures and reactions (initially none) + for i, rxn_datum in enumerate(rxn_data): + rxn_data[i].append(Chem.MolFromSmarts(rxn_datum[0])) + rxn_data[i].append(None) + + # Add hydrogens (respects valence, so incomplete). + # Chem.calcImplicitValence(mol) + mol.UpdatePropertyCache(strict=False) + mol = Chem.AddHs(mol) + + while True: # Keep going until all these issues have been resolved. + current_rxn = None # The reaction to perform. + current_rxn_str = None + + for i, rxn_datum in enumerate(rxn_data): + ( + reactant_smarts, + product_smarts, + substruct_match_mol, + rxn_placeholder, + ) = rxn_datum + if mol.HasSubstructMatch(substruct_match_mol): + if rxn_placeholder is None: + current_rxn_str = reactant_smarts + ">>" + product_smarts + current_rxn = AllChem.ReactionFromSmarts(current_rxn_str) + rxn_data[i][3] = current_rxn # Update the placeholder. + else: + current_rxn = rxn_data[i][3] + break + + # Perform the reaction if necessary + if current_rxn is None: # No reaction left, so break out of while loop. + break + else: + mol = current_rxn.RunReactants((mol,))[0][0] + mol.UpdatePropertyCache(strict=False) # Update valences + + # The mols have been altered from the reactions described above, we need + # to resanitize them. Make sure aromatic rings are shown as such This + # catches all RDKit Errors. without the catchError and sanitizeOps the + # Chem.SanitizeMol can crash the program. + sanitize_string = Chem.SanitizeMol( + mol, + sanitizeOps=rdkit.Chem.rdmolops.SanitizeFlags.SANITIZE_ALL, + catchErrors=True, + ) + + return mol if sanitize_string.name == "SANITIZE_NONE" else None + + @staticmethod + def convert_smiles_str_to_mol(smiles_str): + """Given a SMILES string, check that it is actually a string and not a + None. Then try to convert it to an RDKit Mol Object. + + :param string smiles_str: The SMILES string. + :return: A rdkit.Chem.rdchem.Mol object, or None if it is the wrong type or + if it fails to convert to a Mol Obj + """ + + # Check that there are no type errors, ie Nones or non-string + # A non-string type will cause RDKit to hard crash + if smiles_str is None or type(smiles_str) is not str: + return None + + # Try to fix azides here. They are just tricky to deal with. + smiles_str = smiles_str.replace("N=N=N", "N=[N+]=N") + smiles_str = smiles_str.replace("NN#N", "N=[N+]=N") + + # Now convert to a mol object. Note the trick that is necessary to + # capture RDKit error/warning messages. See + # https://stackoverflow.com/questions/24277488/in-python-how-to-capture-the-stdout-from-a-c-shared-library-to-a-variable + stderr_fileno = sys.stderr.fileno() + stderr_save = os.dup(stderr_fileno) + stderr_pipe = os.pipe() + os.dup2(stderr_pipe[1], stderr_fileno) + os.close(stderr_pipe[1]) + + mol = Chem.MolFromSmiles(smiles_str) + + os.close(stderr_fileno) + os.close(stderr_pipe[0]) + os.dup2(stderr_save, stderr_fileno) + os.close(stderr_save) + + # Check that there are None type errors Chem.MolFromSmiles has sanitize on + # which means if there is even a small error in the SMILES (kekulize, + # nitrogen charge...) then mol=None. ie. + # Chem.MolFromSmiles("C[N]=[N]=[N]") = None this is an example of an + # nitrogen charge error. It is cased in a try statement to be overly + # cautious. + + return None if mol is None else mol + + @staticmethod + def eprint(*args, **kwargs): + """Error messages should be printed to STDERR. See + https://stackoverflow.com/questions/5574702/how-to-print-to-stderr-in-python""" + + print(*args, file=sys.stderr, **kwargs) + + +class LoadSMIFile(object): + """A generator class for loading in the SMILES strings from a file, one at + a time.""" + + def __init__(self, filename): + """Initializes this class. + + :param filename: The filename or file object (i.e., StringIO). + :type filename: str or StringIO + """ + + if type(filename) is str: + # It's a filename + self.f = open(filename, "r") + else: + # It's a file object (i.e., StringIO) + self.f = filename + + def __iter__(self): + """Returns this generator object. + + :return: This generator object. + :rtype: LoadSMIFile + """ + + return self + + def __next__(self): + """Ensure Python3 compatibility. + + :return: A dict, where the "smiles" key contains the canonical SMILES + string and the "data" key contains the remaining information + (e.g., the molecule name). + :rtype: dict + """ + + return self.next() + + def next(self): + """Get the data associated with the next line. + + :raises StopIteration: If there are no more lines left iin the file. + :return: A dict, where the "smiles" key contains the canonical SMILES + string and the "data" key contains the remaining information + (e.g., the molecule name). + :rtype: dict + """ + + line = self.f.readline() + + if line == "": + # EOF + self.f.close() + raise StopIteration() + return + + # Divide line into smi and data + splits = line.split() + if len(splits) != 0: + # Generate mol object + smiles_str = splits[0] + + # Convert from SMILES string to RDKIT Mol. This series of tests is + # to make sure the SMILES string is properly formed and to get it + # into a canonical form. Filter if failed. + mol = UtilFuncs.convert_smiles_str_to_mol(smiles_str) + if mol is None: + UtilFuncs.eprint( + "WARNING: Skipping poorly formed SMILES string: " + line + ) + return self.next() + + # Handle nuetralizing the molecules. Filter if failed. + mol = UtilFuncs.neutralize_mol(mol) + if mol is None: + UtilFuncs.eprint( + "WARNING: Skipping poorly formed SMILES string: " + line + ) + return self.next() + + # Remove the hydrogens. + try: + mol = Chem.RemoveHs(mol) + except Exception: + UtilFuncs.eprint( + "WARNING: Skipping poorly formed SMILES string: " + line + ) + return self.next() + + if mol is None: + UtilFuncs.eprint( + "WARNING: Skipping poorly formed SMILES string: " + line + ) + return self.next() + + # Regenerate the smiles string (to standardize). + new_mol_string = Chem.MolToSmiles(mol, isomericSmiles=True) + + return {"smiles": new_mol_string, "data": splits[1:]} + else: + # Blank line? Go to next one. + return self.next() + + +class Protonate(object): + """A generator class for protonating SMILES strings, one at a time.""" + + def __init__(self, args): + """Initialize the generator. + + :param args: A dictionary containing the arguments. + :type args: dict + """ + + # Make the args an object variable variable. + self.args = args + + # A list to store the protonated SMILES strings associated with a + # single input model. + self.cur_prot_SMI = [] + + # Clean and normalize the args + self.args = ArgParseFuncs.clean_args(args) + + # Load the substructures that can be protonated. + self.subs = ProtSubstructFuncs.load_protonation_substructs_calc_state_for_ph( + self.args["min_ph"], self.args["max_ph"], self.args["pka_precision"] + ) + + def __iter__(self): + """Returns this generator object. + + :return: This generator object. + :rtype: Protonate + """ + + return self + + def __next__(self): + """Ensure Python3 compatibility. + + :return: A dict, where the "smiles" key contains the canonical SMILES + string and the "data" key contains the remaining information + (e.g., the molecule name). + :rtype: dict + """ + + return self.next() + + def next(self): + """Get the next protonated SMILES string. + + :raises StopIteration: If there are no more lines left iin the file. + :return: TODO A dict, where the "smiles" key contains the canonical SMILES + string and the "data" key contains the remaining information + (e.g., the molecule name). + :rtype: dict + """ + + # If there are any SMILES strings in self.cur_prot_SMI, just return + # the first one and update the list to include only the remaining. + if len(self.cur_prot_SMI) > 0: + first, self.cur_prot_SMI = self.cur_prot_SMI[0], self.cur_prot_SMI[1:] + return first + + # self.cur_prot_SMI is empty, so try to add more to it. + + # Get the next SMILES string from the input file. + try: + smile_and_datum = self.args["smiles_and_data"].next() + except StopIteration: + # There are no more input smiles strings... + raise StopIteration() + + smi = smile_and_datum["smiles"] + data = smile_and_datum["data"] # Everything on SMILES line but the + # SMILES string itself (e.g., the + # molecule name). + + # Collect the data associated with this smiles (e.g., the molecule + # name). + tag = " ".join(data) + + # sites is a list of (atom index, "PROTONATED|DEPROTONATED|BOTH"). + # Note that the second entry indicates what state the site SHOULD be + # in (not the one it IS in per the SMILES string). It's calculated + # based on the probablistic distributions obtained during training. + sites = ProtSubstructFuncs.get_prot_sites_and_target_states(smi, self.subs) + + new_smis = [smi] + for site in sites: + # Make a new smiles with the correct protonation state. Note that + # new_smis is a growing list. This is how multiple protonation + # sites are handled. + + # new_smis_to_perhaps_add = ProtSubstructFuncs.protonate_site(new_smis, site) + new_smis = ProtSubstructFuncs.protonate_site(new_smis, site) + # print(site, new_smis) # Good for debugging. + + # Only add new smiles if not already in the list. + # for s in new_smis_to_perhaps_add: + # if not s in new_smis: + # new_smis.append(s) + + # In some cases, the script might generate redundant molecules. + # Phosphonates, when the pH is between the two pKa values and the + # stdev value is big enough, for example, will generate two identical + # BOTH states. Let's remove this redundancy. + new_smis = list(set(new_smis)) + + # Deprotonating protonated aromatic nitrogen gives [nH-]. Change this + # to [n-]. This is a hack. + new_smis = [s.replace("[nH-]", "[n-]") for s in new_smis] + + # Sometimes Dimorphite-DL generates molecules that aren't actually + # possible. Simply convert these to mol objects to eliminate the bad + # ones (that are None). + new_smis = [ + s for s in new_smis if UtilFuncs.convert_smiles_str_to_mol(s) is not None + ] + + # If there are no smi left, return the input one at the very least. + # All generated forms have apparently been judged + # inappropriate/mal-formed. + if len(new_smis) == 0: + new_smis = [smi] + + # If the user wants to see the target states, add those + # to the ends of each line. + if self.args["label_states"]: + states = "\t".join([x[1] for x in sites]) + new_lines = [x + "\t" + tag + "\t" + states for x in new_smis] + else: + new_lines = [x + "\t" + tag for x in new_smis] + + self.cur_prot_SMI = new_lines + + return self.next() + + +class ProtSubstructFuncs: + """A namespace to store functions for loading the substructures that can + be protonated. To keep things organized.""" + + @staticmethod + def load_protonation_substructs_calc_state_for_ph( + min_ph=6.4, max_ph=8.4, pka_std_range=1 + ): + """A pre-calculated list of R-groups with protonation sites, with their + likely pKa bins. + + :param float min_ph: The lower bound on the pH range, defaults to 6.4. + :param float max_ph: The upper bound on the pH range, defaults to 8.4. + :param pka_std_range: Basically the precision (stdev from predicted pKa to + consider), defaults to 1. + :return: A dict of the protonation substructions for the specified pH + range. + """ + + subs = [] + pwd = os.path.dirname(os.path.realpath(__file__)) + + site_structures_file = "{}/{}".format(pwd, "site_substructures.smarts") + with open(site_structures_file, "r") as substruct: + for line in substruct: + line = line.strip() + sub = {} + if line is not "": + splits = line.split() + sub["name"] = splits[0] + sub["smart"] = splits[1] + sub["mol"] = Chem.MolFromSmarts(sub["smart"]) + + # NEED TO DIVIDE THIS BY 3s + pka_ranges = [ + splits[i : i + 3] for i in range(2, len(splits) - 1, 3) + ] + + prot = [] + for pka_range in pka_ranges: + site = pka_range[0] + std = float(pka_range[2]) * pka_std_range + mean = float(pka_range[1]) + protonation_state = ProtSubstructFuncs.define_protonation_state( + mean, std, min_ph, max_ph + ) + + prot.append([site, protonation_state]) + + sub["prot_states_for_pH"] = prot + subs.append(sub) + return subs + + @staticmethod + def define_protonation_state(mean, std, min_ph, max_ph): + """Updates the substructure definitions to include the protonation state + based on the user-given pH range. The size of the pKa range is also based + on the number of standard deviations to be considered by the user param. + + :param float mean: The mean pKa. + :param float std: The precision (stdev). + :param float min_ph: The min pH of the range. + :param float max_ph: The max pH of the range. + :return: A string describing the protonation state. + """ + + min_pka = mean - std + max_pka = mean + std + + # This needs to be reassigned, and 'ERROR' should never make it past the + # next set of checks. + if min_pka <= max_ph and min_ph <= max_pka: + protonation_state = "BOTH" + elif mean > max_ph: + protonation_state = "PROTONATED" + else: + protonation_state = "DEPROTONATED" + + return protonation_state + + @staticmethod + def get_prot_sites_and_target_states(smi, subs): + """For a single molecule, find all possible matches in the protonation + R-group list, subs. Items that are higher on the list will be matched + first, to the exclusion of later items. + + :param string smi: A SMILES string. + :param list subs: Substructure information. + :return: A list of protonation sites and their pKa bin. ('PROTONATED', + 'BOTH', or 'DEPROTONATED') + """ + + # Convert the Smiles string (smi) to an RDKit Mol Obj + mol = UtilFuncs.convert_smiles_str_to_mol(smi) + + # Check Conversion worked + if mol is None: + UtilFuncs.eprint("ERROR: ", smi) + return [] + + # Try to Add hydrogens. if failed return [] + try: + mol = Chem.AddHs(mol) + except Exception: + UtilFuncs.eprint("ERROR: ", smi) + return [] + + # Check adding Hs worked + if mol is None: + UtilFuncs.eprint("ERROR: ", smi) + return [] + + ProtectUnprotectFuncs.unprotect_molecule(mol) + protonation_sites = [] + + for item in subs: + smart = item["mol"] + if mol.HasSubstructMatch(smart): + matches = ProtectUnprotectFuncs.get_unprotected_matches(mol, smart) + prot = item["prot_states_for_pH"] + for match in matches: + # We want to move the site from being relative to the + # substructure, to the index on the main molecule. + for site in prot: + proton = int(site[0]) + category = site[1] + new_site = (match[proton], category, item["name"]) + + if not new_site in protonation_sites: + # Because sites must be unique. + protonation_sites.append(new_site) + + ProtectUnprotectFuncs.protect_molecule(mol, match) + + return protonation_sites + + @staticmethod + def protonate_site(smis, site): + """Given a list of SMILES strings, we protonate the site. + + :param list smis: The list of SMILES strings. + :param tuple site: Information about the protonation site. + (idx, target_prot_state, prot_site_name) + :return: A list of the appropriately protonated SMILES. + """ + + # Decouple the atom index and its target protonation state from the site + # tuple + idx, target_prot_state, prot_site_name = site + + # Initialize the output list + output_smis = [] + + state_to_charge = {"DEPROTONATED": [-1], "PROTONATED": [0], "BOTH": [-1, 0]} + + charges = state_to_charge[target_prot_state] + + # Now make the actual smiles match the target protonation state. + output_smis = ProtSubstructFuncs.set_protonation_charge( + smis, idx, charges, prot_site_name + ) + + return output_smis + + @staticmethod + def set_protonation_charge(smis, idx, charges, prot_site_name): + """Sets the atomic charge on a particular site for a set of SMILES. + + :param list smis: A list of the SMILES strings. + :param int idx: The index of the atom to consider. + :param list charges: A list of the charges (ints) to assign at + this site. + :param string prot_site_name: The name of the protonation site. + :return: A list of the processed SMILES strings. + """ + + # Sets up the output list and the Nitrogen charge + output = [] + + for charge in charges: + # The charge for Nitrogens is 1 higher than others (i.e., protonated + # state is positively charged). + nitro_charge = charge + 1 + + # But there are a few nitrogen moieties where the acidic group is the + # neutral one. Amides are a good example. I gave some thought re. how + # to best flag these. I decided that those nitrogen-containing + # moieties where the acidic group is neutral (rather than positively + # charged) will have "*" in the name. + if "*" in prot_site_name: + nitro_charge = nitro_charge - 1 # Undo what was done previously. + + for smi in smis: + + # Convert smilesstring (smi) into a RDKit Mol + mol = UtilFuncs.convert_smiles_str_to_mol(smi) + + # Check that the conversion worked, skip if it fails + if mol is None: + continue + + atom = mol.GetAtomWithIdx(idx) + + # Assign the protonation charge, with special care for Nitrogens + element = atom.GetAtomicNum() + if element == 7: + atom.SetFormalCharge(nitro_charge) + else: + atom.SetFormalCharge(charge) + + # Convert back to SMILE and add to output + out_smile = Chem.MolToSmiles(mol, isomericSmiles=True, canonical=True) + output.append(out_smile) + + return output + + +class ProtectUnprotectFuncs: + """A namespace for storing functions that are useful for protecting and + unprotecting molecules. To keep things organized. We need to identify and + mark groups that have been matched with a substructure.""" + + @staticmethod + def unprotect_molecule(mol): + """Sets the protected property on all atoms to 0. This also creates the + property for new molecules. + + :param rdkit.Chem.rdchem.Mol mol: The rdkit Mol object. + :type mol: The rdkit Mol object with atoms unprotected. + """ + + for atom in mol.GetAtoms(): + atom.SetProp("_protected", "0") + + @staticmethod + def protect_molecule(mol, match): + """Given a 'match', a list of molecules idx's, we set the protected status + of each atom to 1. This will prevent any matches using that atom in the + future. + + :param rdkit.Chem.rdchem.Mol mol: The rdkit Mol object to protect. + :param list match: A list of molecule idx's. + """ + + for idx in match: + atom = mol.GetAtomWithIdx(idx) + atom.SetProp("_protected", "1") + + @staticmethod + def get_unprotected_matches(mol, substruct): + """Finds substructure matches with atoms that have not been protected. + Returns list of matches, each match a list of atom idxs. + + :param rdkit.Chem.rdchem.Mol mol: The Mol object to consider. + :param string substruct: The SMARTS string of the substructure ot match. + :return: A list of the matches. Each match is itself a list of atom idxs. + """ + + matches = mol.GetSubstructMatches(substruct) + unprotected_matches = [] + for match in matches: + if ProtectUnprotectFuncs.is_match_unprotected(mol, match): + unprotected_matches.append(match) + return unprotected_matches + + @staticmethod + def is_match_unprotected(mol, match): + """Checks a molecule to see if the substructure match contains any + protected atoms. + + :param rdkit.Chem.rdchem.Mol mol: The Mol object to check. + :param list match: The match to check. + :return: A boolean, whether the match is present or not. + """ + + for idx in match: + atom = mol.GetAtomWithIdx(idx) + protected = atom.GetProp("_protected") + if protected == "1": + return False + return True + + +class TestFuncs: + """A namespace for storing functions that perform tests on the code. To + keep things organized.""" + + @staticmethod + def test(): + """Tests all the 38 groups.""" + + smis = [ + # [input smiles, pka, protonated, deprotonated, category] + ["C#CCO", "C#CCO", "C#CC[O-]", "Alcohol"], + ["C(=O)N", "NC=O", "[NH-]C=O", "Amide"], + [ + "CC(=O)NOC(C)=O", + "CC(=O)NOC(C)=O", + "CC(=O)[N-]OC(C)=O", + "Amide_electronegative", + ], + ["COC(=N)N", "COC(N)=[NH2+]", "COC(=N)N", "AmidineGuanidine2"], + [ + "Brc1ccc(C2NCCS2)cc1", + "Brc1ccc(C2[NH2+]CCS2)cc1", + "Brc1ccc(C2NCCS2)cc1", + "Amines_primary_secondary_tertiary", + ], + [ + "CC(=O)[n+]1ccc(N)cc1", + "CC(=O)[n+]1ccc([NH3+])cc1", + "CC(=O)[n+]1ccc(N)cc1", + "Anilines_primary", + ], + ["CCNc1ccccc1", "CC[NH2+]c1ccccc1", "CCNc1ccccc1", "Anilines_secondary"], + [ + "Cc1ccccc1N(C)C", + "Cc1ccccc1[NH+](C)C", + "Cc1ccccc1N(C)C", + "Anilines_tertiary", + ], + [ + "BrC1=CC2=C(C=C1)NC=C2", + "Brc1ccc2[nH]ccc2c1", + "Brc1ccc2[n-]ccc2c1", + "Indole_pyrrole", + ], + [ + "O=c1cc[nH]cc1", + "O=c1cc[nH]cc1", + "O=c1cc[n-]cc1", + "Aromatic_nitrogen_protonated", + ], + ["C-N=[N+]=[N@H]", "CN=[N+]=N", "CN=[N+]=[N-]", "Azide"], + ["BrC(C(O)=O)CBr", "O=C(O)C(Br)CBr", "O=C([O-])C(Br)CBr", "Carboxyl"], + ["NC(NN=O)=N", "NC(=[NH2+])NN=O", "N=C(N)NN=O", "AmidineGuanidine1"], + [ + "C(F)(F)(F)C(=O)NC(=O)C", + "CC(=O)NC(=O)C(F)(F)F", + "CC(=O)[N-]C(=O)C(F)(F)F", + "Imide", + ], + ["O=C(C)NC(C)=O", "CC(=O)NC(C)=O", "CC(=O)[N-]C(C)=O", "Imide2"], + [ + "CC(C)(C)C(N(C)O)=O", + "CN(O)C(=O)C(C)(C)C", + "CN([O-])C(=O)C(C)(C)C", + "N-hydroxyamide", + ], + ["C[N+](O)=O", "C[N+](=O)O", "C[N+](=O)[O-]", "Nitro"], + ["O=C1C=C(O)CC1", "O=C1C=C(O)CC1", "O=C1C=C([O-])CC1", "O=C-C=C-OH"], + ["C1CC1OO", "OOC1CC1", "[O-]OC1CC1", "Peroxide2"], + ["C(=O)OO", "O=COO", "O=CO[O-]", "Peroxide1"], + [ + "Brc1cc(O)cc(Br)c1", + "Oc1cc(Br)cc(Br)c1", + "[O-]c1cc(Br)cc(Br)c1", + "Phenol", + ], + [ + "CC(=O)c1ccc(S)cc1", + "CC(=O)c1ccc(S)cc1", + "CC(=O)c1ccc([S-])cc1", + "Phenyl_Thiol", + ], + [ + "C=CCOc1ccc(C(=O)O)cc1", + "C=CCOc1ccc(C(=O)O)cc1", + "C=CCOc1ccc(C(=O)[O-])cc1", + "Phenyl_carboxyl", + ], + ["COP(=O)(O)OC", "COP(=O)(O)OC", "COP(=O)([O-])OC", "Phosphate_diester"], + ["CP(C)(=O)O", "CP(C)(=O)O", "CP(C)(=O)[O-]", "Phosphinic_acid"], + [ + "CC(C)OP(C)(=O)O", + "CC(C)OP(C)(=O)O", + "CC(C)OP(C)(=O)[O-]", + "Phosphonate_ester", + ], + [ + "CC1(C)OC(=O)NC1=O", + "CC1(C)OC(=O)NC1=O", + "CC1(C)OC(=O)[N-]C1=O", + "Ringed_imide1", + ], + ["O=C(N1)C=CC1=O", "O=C1C=CC(=O)N1", "O=C1C=CC(=O)[N-]1", "Ringed_imide2"], + ["O=S(OC)(O)=O", "COS(=O)(=O)O", "COS(=O)(=O)[O-]", "Sulfate"], + [ + "COc1ccc(S(=O)O)cc1", + "COc1ccc(S(=O)O)cc1", + "COc1ccc(S(=O)[O-])cc1", + "Sulfinic_acid", + ], + ["CS(N)(=O)=O", "CS(N)(=O)=O", "CS([NH-])(=O)=O", "Sulfonamide"], + [ + "CC(=O)CSCCS(O)(=O)=O", + "CC(=O)CSCCS(=O)(=O)O", + "CC(=O)CSCCS(=O)(=O)[O-]", + "Sulfonate", + ], + ["CC(=O)S", "CC(=O)S", "CC(=O)[S-]", "Thioic_acid"], + ["C(C)(C)(C)(S)", "CC(C)(C)S", "CC(C)(C)[S-]", "Thiol"], + [ + "Brc1cc[nH+]cc1", + "Brc1cc[nH+]cc1", + "Brc1ccncc1", + "Aromatic_nitrogen_unprotonated", + ], + [ + "C=C(O)c1c(C)cc(C)cc1C", + "C=C(O)c1c(C)cc(C)cc1C", + "C=C([O-])c1c(C)cc(C)cc1C", + "Vinyl_alcohol", + ], + ["CC(=O)ON", "CC(=O)O[NH3+]", "CC(=O)ON", "Primary_hydroxyl_amine"], + ] + + smis_phos = [ + [ + "O=P(O)(O)OCCCC", + "CCCCOP(=O)(O)O", + "CCCCOP(=O)([O-])O", + "CCCCOP(=O)([O-])[O-]", + "Phosphate", + ], + [ + "CC(P(O)(O)=O)C", + "CC(C)P(=O)(O)O", + "CC(C)P(=O)([O-])O", + "CC(C)P(=O)([O-])[O-]", + "Phosphonate", + ], + ] + + # Load the average pKa values. + average_pkas = { + l.split()[0].replace("*", ""): float(l.split()[3]) + for l in open("site_substructures.smarts") + if l.split()[0] not in ["Phosphate", "Phosphonate"] + } + average_pkas_phos = { + l.split()[0].replace("*", ""): [float(l.split()[3]), float(l.split()[6])] + for l in open("site_substructures.smarts") + if l.split()[0] in ["Phosphate", "Phosphonate"] + } + + print("Running Tests") + print("=============") + print("") + + print("Very Acidic (pH -10000000)") + print("--------------------------") + print("") + + args = { + "min_ph": -10000000, + "max_ph": -10000000, + "pka_precision": 0.5, + "smiles": "", + "label_states": True, + } + + for smi, protonated, deprotonated, category in smis: + args["smiles"] = smi + TestFuncs.test_check(args, [protonated], ["PROTONATED"]) + + for smi, protonated, mix, deprotonated, category in smis_phos: + args["smiles"] = smi + TestFuncs.test_check(args, [protonated], ["PROTONATED"]) + + args["min_ph"] = 10000000 + args["max_ph"] = 10000000 + + print("") + print("Very Basic (pH 10000000)") + print("------------------------") + print("") + + for smi, protonated, deprotonated, category in smis: + args["smiles"] = smi + TestFuncs.test_check(args, [deprotonated], ["DEPROTONATED"]) + + for smi, protonated, mix, deprotonated, category in smis_phos: + args["smiles"] = smi + TestFuncs.test_check(args, [deprotonated], ["DEPROTONATED"]) + + print("") + print("pH is Category pKa") + print("------------------") + print("") + + for smi, protonated, deprotonated, category in smis: + avg_pka = average_pkas[category] + + args["smiles"] = smi + args["min_ph"] = avg_pka + args["max_ph"] = avg_pka + + TestFuncs.test_check(args, [protonated, deprotonated], ["BOTH"]) + + for smi, protonated, mix, deprotonated, category in smis_phos: + args["smiles"] = smi + + avg_pka = average_pkas_phos[category][0] + args["min_ph"] = avg_pka + args["max_ph"] = avg_pka + + TestFuncs.test_check(args, [mix, protonated], ["BOTH"]) + + avg_pka = average_pkas_phos[category][1] + args["min_ph"] = avg_pka + args["max_ph"] = avg_pka + + TestFuncs.test_check( + args, [mix, deprotonated], ["DEPROTONATED", "DEPROTONATED"] + ) + + avg_pka = 0.5 * ( + average_pkas_phos[category][0] + average_pkas_phos[category][1] + ) + args["min_ph"] = avg_pka + args["max_ph"] = avg_pka + args["pka_precision"] = 5 # Should give all three + + TestFuncs.test_check( + args, [mix, deprotonated, protonated], ["BOTH", "BOTH"] + ) + + @staticmethod + def test_check(args, expected_output, labels): + """Tests most ionizable groups. The ones that can only loose or gain a single proton. + + :param args: The arguments to pass to protonate() + :param expected_output: A list of the expected SMILES-strings output. + :param labels: The labels. A list containing combo of BOTH, PROTONATED, + DEPROTONATED. + :raises Exception: Wrong number of states produced. + :raises Exception: Unexpected output SMILES. + :raises Exception: Wrong labels. + """ + + output = list(Protonate(args)) + output = [o.split() for o in output] + + num_states = len(expected_output) + + if len(output) != num_states: + msg = ( + args["smiles"] + + " should have " + + str(num_states) + + " states at at pH " + + str(args["min_ph"]) + + ": " + + str(output) + ) + print(msg) + raise Exception(msg) + + if len(set([l[0] for l in output]) - set(expected_output)) != 0: + msg = ( + args["smiles"] + + " is not " + + " AND ".join(expected_output) + + " at pH " + + str(args["min_ph"]) + + " - " + + str(args["max_ph"]) + + "; it is " + + " AND ".join([l[0] for l in output]) + ) + print(msg) + raise Exception(msg) + + if len(set([l[1] for l in output]) - set(labels)) != 0: + msg = ( + args["smiles"] + + " not labeled as " + + " AND ".join(labels) + + "; it is " + + " AND ".join([l[1] for l in output]) + ) + print(msg) + raise Exception(msg) + + ph_range = sorted(list(set([args["min_ph"], args["max_ph"]]))) + ph_range_str = "(" + " - ".join("{0:.2f}".format(n) for n in ph_range) + ")" + print( + "(CORRECT) " + + ph_range_str.ljust(10) + + " " + + args["smiles"] + + " => " + + " AND ".join([l[0] for l in output]) + ) + + +def run(**kwargs): + """A helpful, importable function for those who want to call Dimorphite-DL + from another Python script rather than the command line. Note that this + function accepts keyword arguments that match the command-line parameters + exactly. If you want to pass and return a list of RDKit Mol objects, import + run_with_mol_list() instead. + + :param **kwargs: For a complete description, run dimorphite_dl.py from the + command line with the -h option. + :type kwargs: dict + """ + + # Run the main function with the specified arguments. + main(kwargs) + + +def run_with_mol_list(mol_lst, **kwargs): + """A helpful, importable function for those who want to call Dimorphite-DL + from another Python script rather than the command line. Note that this + function is for passing Dimorphite-DL a list of RDKit Mol objects, together + with command-line parameters. If you want to use only the same parameters + that you would use from the command line, import run() instead. + + :param mol_lst: A list of rdkit.Chem.rdchem.Mol objects. + :type mol_lst: list + :raises Exception: If the **kwargs includes "smiles", "smiles_file", + "output_file", or "test" parameters. + :return: A list of properly protonated rdkit.Chem.rdchem.Mol objects. + :rtype: list + """ + + # Do a quick check to make sure the user input makes sense. + for bad_arg in ["smiles", "smiles_file", "output_file", "test"]: + if bad_arg in kwargs: + msg = ( + "You're using Dimorphite-DL's run_with_mol_list(mol_lst, " + + '**kwargs) function, but you also passed the "' + + bad_arg + + '" argument. Did you mean to use the ' + + "run(**kwargs) function instead?" + ) + print(msg) + raise Exception(msg) + + # Set the return_as_list flag so main() will return the protonated smiles + # as a list. + kwargs["return_as_list"] = True + + # Having reviewed the code, it will be very difficult to rewrite it so + # that a list of Mol objects can be used directly. Intead, convert this + # list of mols to smiles and pass that. Not efficient, but it will work. + protonated_smiles_and_props = [] + for m in mol_lst: + props = m.GetPropsAsDict() + kwargs["smiles"] = Chem.MolToSmiles(m, isomericSmiles=True) + protonated_smiles_and_props.extend( + [(s.split("\t")[0], props) for s in main(kwargs)] + ) + + # Now convert the list of protonated smiles strings back to RDKit Mol + # objects. Also, add back in the properties from the original mol objects. + mols = [] + for s, props in protonated_smiles_and_props: + m = Chem.MolFromSmiles(s) + if m: + for prop, val in props.items(): + if type(val) is int: + m.SetIntProp(prop, val) + elif type(val) is float: + m.SetDoubleProp(prop, val) + elif type(val) is bool: + m.SetBoolProp(prop, val) + else: + m.SetProp(prop, str(val)) + mols.append(m) + else: + UtilFuncs.eprint( + "WARNING: Could not process molecule with SMILES string " + + s + + " and properties " + + str(props) + ) + + return mols + + +if __name__ == "__main__": + main() diff -r 000000000000 -r 5c501eb8d56c rdconf.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/rdconf.py Sat Dec 04 16:39:31 2021 +0000 @@ -0,0 +1,229 @@ +#!/usr/bin/python3 + +import gzip +import os +import sys +from optparse import OptionParser + +from rdkit.Chem import AllChem as Chem + +""" +This script was originally written by David Koes, University of Pittsburgh: +https://github.com/dkoes/rdkit-scripts/blob/master/rdconf.py +It is licensed under the MIT licence. + +Given a smiles file, generate 3D conformers in output sdf. +Energy minimizes and filters conformers to meet energy window and rms constraints. + +Some time ago I compared this to alternative conformer generators and +it was quite competitive (especially after RDKit's UFF implementation +added OOP terms). +""" + + +# convert smiles to sdf +def getRMS(mol, c1, c2): + rms = Chem.GetBestRMS(mol, mol, c1, c2) + return rms + + +parser = OptionParser(usage="Usage: %prog [options] .smi .sdf") +parser.add_option( + "--maxconfs", + dest="maxconfs", + action="store", + help="maximum number of conformers to generate per a molecule (default 20)", + default="20", + type="int", + metavar="CNT", +) +parser.add_option( + "--sample_multiplier", + dest="sample", + action="store", + help="sample N*maxconfs conformers and choose the maxconformers with lowest energy (default 1)", + default="1", + type="float", + metavar="N", +) +parser.add_option( + "--seed", + dest="seed", + action="store", + help="random seed (default 9162006)", + default="9162006", + type="int", + metavar="s", +) +parser.add_option( + "--rms_threshold", + dest="rms", + action="store", + help="filter based on rms (default 0.7)", + default="0.7", + type="float", + metavar="R", +) +parser.add_option( + "--energy_window", + dest="energy", + action="store", + help="filter based on energy difference with lowest energy conformer", + default="10", + type="float", + metavar="E", +) +parser.add_option( + "-v", + "--verbose", + dest="verbose", + action="store_true", + default=False, + help="verbose output", +) +parser.add_option( + "--mmff", + dest="mmff", + action="store_true", + default=False, + help="use MMFF forcefield instead of UFF", +) +parser.add_option( + "--nomin", + dest="nomin", + action="store_true", + default=False, + help="don't perform energy minimization (bad idea)", +) +parser.add_option( + "--etkdg", + dest="etkdg", + action="store_true", + default=False, + help="use new ETKDG knowledge-based method instead of distance geometry", +) + + +(options, args) = parser.parse_args() + +if len(args) < 2: + parser.error("Need input and output") + sys.exit(-1) + +input = args[0] +output = args[1] +smifile = open(input) +if options.verbose: + print("Generating a maximum of", options.maxconfs, "per a mol") + +if options.etkdg and not Chem.ETKDG: + print("ETKDB does not appear to be implemented. Please upgrade RDKit.") + sys.exit(1) + +split = os.path.splitext(output) +if split[1] == ".gz": + outf = gzip.open(output, "wt+") + output = split[0] # strip .gz +else: + outf = open(output, "w+") + + +if os.path.splitext(output)[1] == ".pdb": + sdwriter = Chem.PDBWriter(outf) +else: + sdwriter = Chem.SDWriter(outf) + +if sdwriter is None: + print("Could not open ".output) + sys.exit(-1) + +for line in smifile: + toks = line.split() + smi = toks[0] + name = " ".join(toks[1:]) + + pieces = smi.split(".") + if len(pieces) > 1: + smi = max(pieces, key=len) # take largest component by length + print("Taking largest component: %s\t%s" % (smi, name)) + + mol = Chem.MolFromSmiles(smi) + if mol is not None: + if options.verbose: + print(smi) + try: + Chem.SanitizeMol(mol) + mol = Chem.AddHs(mol) + mol.SetProp("_Name", name) + + if options.etkdg: + cids = Chem.EmbedMultipleConfs( + mol, int(options.sample * options.maxconfs), Chem.ETKDG() + ) + else: + cids = Chem.EmbedMultipleConfs( + mol, int(options.sample * options.maxconfs), randomSeed=options.seed + ) + if options.verbose: + print(len(cids), "conformers found") + cenergy = [] + for conf in cids: + # not passing confID only minimizes the first conformer + if options.nomin: + cenergy.append(conf) + elif options.mmff: + converged = Chem.MMFFOptimizeMolecule(mol, confId=conf) + mp = Chem.MMFFGetMoleculeProperties(mol) + cenergy.append( + Chem.MMFFGetMoleculeForceField( + mol, mp, confId=conf + ).CalcEnergy() + ) + else: + converged = not Chem.UFFOptimizeMolecule(mol, confId=conf) + cenergy.append( + Chem.UFFGetMoleculeForceField(mol, confId=conf).CalcEnergy() + ) + if options.verbose: + print("Convergence of conformer", conf, converged) + + mol = Chem.RemoveHs(mol) + sortedcids = sorted(cids, key=lambda cid: cenergy[cid]) + if len(sortedcids) > 0: + mine = cenergy[sortedcids[0]] + else: + mine = 0 + if options.rms == 0: + cnt = 0 + for conf in sortedcids: + if cnt >= options.maxconfs: + break + if (options.energy < 0) or cenergy[conf] - mine <= options.energy: + sdwriter.write(mol, conf) + cnt += 1 + else: + written = {} + for conf in sortedcids: + if len(written) >= options.maxconfs: + break + # check rmsd + passed = True + for seenconf in written.keys(): + rms = getRMS(mol, seenconf, conf) + if (rms < options.rms) or ( + options.energy > 0 and cenergy[conf] - mine > options.energy + ): + passed = False + break + if passed: + written[conf] = True + sdwriter.write(mol, conf) + except (KeyboardInterrupt, SystemExit): + raise + except Exception as e: + print("Exception", e) + else: + print("ERROR:", smi) + +sdwriter.close() +outf.close() diff -r 000000000000 -r 5c501eb8d56c rdconf.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/rdconf.xml Sat Dec 04 16:39:31 2021 +0000 @@ -0,0 +1,99 @@ + + using RDKit + + 2020.03.4 + 0 + + + rdkit + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @article{rdkit, + author = {Greg Landrum and others}, + title = {RDKit: Open-source cheminformatics}, + url ={http://www.rdkit.org} + } + + @article{rdconf, + author = {David Koes}, + title = {RDConf: Low-energy ligand conformer search}, + url ={https://github.com/dkoes/rdkit-scripts} + } + + + diff -r 000000000000 -r 5c501eb8d56c rdkit_descriptors.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/rdkit_descriptors.py Sat Dec 04 16:39:31 2021 +0000 @@ -0,0 +1,121 @@ +#!/usr/bin/env python + +import argparse +import inspect +import sys + +from rdkit import Chem +from rdkit.Chem import Descriptors + + +def get_supplier(infile, format="smiles"): + """ + Returns a generator over a SMILES or InChI file. Every element is of RDKit + molecule and has its original string as _Name property. + """ + with open(infile) as handle: + for line in handle: + line = line.strip() + if format == "smiles": + mol = Chem.MolFromSmiles(line, sanitize=True) + elif format == "inchi": + mol = Chem.inchi.MolFromInchi( + line, + sanitize=True, + removeHs=True, + logLevel=None, + treatWarningAsError=False, + ) + if mol is None: + yield False + else: + mol.SetProp("_Name", line.split("\t")[0]) + yield mol + + +def get_rdkit_descriptor_functions(): + """ + Returns all descriptor functions under the Chem.Descriptors Module as tuple of (name, function) + """ + ret = [ + (name, f) + for name, f in inspect.getmembers(Descriptors) + if inspect.isfunction(f) and not name.startswith("_") + ] + # some which are not in the official Descriptors module we need to add manually + ret.extend([("FormalCharge", Chem.GetFormalCharge), ("SSSR", Chem.GetSSSR)]) + ret.sort() + return ret + + +def descriptors(mol, functions): + """ + Calculates the descriptors of a given molecule. + """ + for name, function in functions: + yield (name, function(mol)) + + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument("-i", "--infile", required=True, help="Path to the input file.") + parser.add_argument("--iformat", help="Specify the input file format.") + + parser.add_argument( + "-o", + "--outfile", + type=argparse.FileType("w+"), + default=sys.stdout, + help="path to the result file, default is stdout", + ) + + parser.add_argument( + "-s", + "--select", + default=None, + help="select a subset of comma-separated descriptors to use", + ) + + parser.add_argument( + "--header", + dest="header", + action="store_true", + default=False, + help="Write header line.", + ) + + args = parser.parse_args() + + if args.iformat == "sdf": + supplier = Chem.SDMolSupplier(args.infile) + elif args.iformat == "smi": + supplier = get_supplier(args.infile, format="smiles") + elif args.iformat == "inchi": + supplier = get_supplier(args.infile, format="inchi") + elif args.iformat == "pdb": + supplier = [Chem.MolFromPDBFile(args.infile)] + elif args.iformat == "mol2": + supplier = [Chem.MolFromMol2File(args.infile)] + + functions = get_rdkit_descriptor_functions() + if args.select and args.select != "None": + selected = args.select.split(",") + functions = [(name, f) for name, f in functions if name in selected] + + if args.header: + args.outfile.write( + "%s\n" % "\t".join(["MoleculeID"] + [name for name, f in functions]) + ) + + for mol in supplier: + if not mol: + continue + descs = descriptors(mol, functions) + try: + molecule_id = mol.GetProp("_Name") + except KeyError: + molecule_id = Chem.MolToSmiles(mol) + args.outfile.write( + "%s\n" + % "\t".join([molecule_id] + [str(round(res, 6)) for name, res in descs]) + ) diff -r 000000000000 -r 5c501eb8d56c sdf_to_tab.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sdf_to_tab.py Sat Dec 04 16:39:31 2021 +0000 @@ -0,0 +1,69 @@ +#!/usr/bin/env python3 +import argparse + +import pandas as pd +from rdkit import Chem + + +def sdf_to_tab(vars): + mols = Chem.SDMolSupplier(vars.inp, sanitize=False) + df = pd.DataFrame() # for output + + for n in range(len(mols)): + if mols[n]: + d = mols[n].GetPropsAsDict() + # filter dict for desired props + if vars.props.strip() == "": # none specified, return all + d = { + prop: val + for (prop, val) in d.items() + if not any(x in str(val) for x in ["\n", "\t"]) + } # remove items containing newlines or tabs + else: + d = { + prop: val + for (prop, val) in d.items() + if prop in vars.props.replace(" ", "").split(",") + } # remove items not requested via CLI + if vars.name: + d["SDFMoleculeName"] = mols[n].GetProp("_Name") + if vars.smiles: + d["SMILES"] = Chem.MolToSmiles(mols[n], isomericSmiles=False) + d["Index"] = int(n) + + df = df.append(d, ignore_index=True) + else: + print("Molecule could not be read - skipped.") + + df = df.astype({"Index": int}).set_index("Index") + sorted_cols = sorted(df.columns.values.tolist()) + df.to_csv(vars.out, sep="\t", header=vars.header, columns=sorted_cols) + + +def main(): + parser = argparse.ArgumentParser(description="Convert SDF to tabular") + parser.add_argument("--inp", "-i", help="The input file", required=True) + parser.add_argument("--out", "-o", help="The output file", required=True) + parser.add_argument( + "--props", + "-p", + help="Properties to filter (leave blank for all)", + required=True, + ) + parser.add_argument( + "--header", + "-t", + action="store_true", + help="Write property name as the first row.", + ) + parser.add_argument( + "--smiles", "-s", action="store_true", help="Include SMILES in output." + ) + parser.add_argument( + "--name", "-n", action="store_true", help="Include molecule name in output." + ) + sdf_to_tab(parser.parse_args()) + + +if __name__ == "__main__": + main() diff -r 000000000000 -r 5c501eb8d56c site_substructures.smarts --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/site_substructures.smarts Sat Dec 04 16:39:31 2021 +0000 @@ -0,0 +1,39 @@ +*Azide [N+0:1]=[N+:2]=[N+0:3]-[H] 2 4.65 0.07071067811865513 +Nitro [C,c,N,n,O,o:1]-[NX3:2](=[O:3])-[O:4]-[H] 3 -1000.0 0 +AmidineGuanidine1 [N:1]-[C:2](-[N:3])=[NX2:4]-[H:5] 3 12.025333333333334 1.5941046150769165 +AmidineGuanidine2 [C:1](-[N:2])=[NX2+0:3] 2 10.035538461538462 2.1312826469414716 +Sulfate [SX4:1](=[O:2])(=[O:3])([O:4]-[C,c,N,n:5])-[OX2:6]-[H] 5 -2.36 1.3048043093561141 +Sulfonate [SX4:1](=[O:2])(=[O:3])(-[C,c,N,n:4])-[OX2:5]-[H] 4 -1.8184615384615386 1.4086213481855594 +Sulfinic_acid [SX3:1](=[O:2])-[O:3]-[H] 2 1.7933333333333332 0.4372070447739835 +Phenyl_carboxyl [c,n,o:1]-[C:2](=[O:3])-[O:4]-[H] 3 3.463441968255319 1.2518054407928614 +Carboxyl [C:1](=[O:2])-[O:3]-[H] 2 3.456652971502591 1.2871420886834017 +Thioic_acid [C,c,N,n:1](=[O,S:2])-[SX2,OX2:3]-[H] 2 0.678267 1.497048763660801 +Phenyl_Thiol [c,n:1]-[SX2:2]-[H] 1 4.978235294117647 2.6137000480499806 +Thiol [C,N:1]-[SX2:2]-[H] 1 9.12448275862069 1.3317968158171463 +Phosphate [PX4:1](=[O:2])(-[OX2:3]-[H])(-[O+0:4])-[OX2:5]-[H] 2 2.4182608695652172 1.1091177991945305 5 6.5055 0.9512787792174668 +Phosphonate [PX4:1](=[O:2])(-[OX2:3]-[H])(-[C,c,N,n:4])-[OX2:5]-[H] 2 1.8835714285714287 0.5925999820080644 5 7.247254901960784 0.8511476450801531 +Phenol [c,n,o:1]-[O:2]-[H] 1 7.065359866910526 3.277356122295936 +Peroxide1 [O:1]([$(C=O),$(C[Cl]),$(CF),$(C[Br]),$(CC#N):2])-[O:3]-[H] 2 8.738888888888889 0.7562592839596507 +Peroxide2 [C:1]-[O:2]-[O:3]-[H] 2 11.978235294117647 0.8697645895163075 +O=C-C=C-OH [O:1]=[C;R:2]-[C;R:3]=[C;R:4]-[O:5]-[H] 4 3.554 0.803339458581667 +Vinyl_alcohol [C:1]=[C:2]-[O:3]-[H] 2 8.871850714285713 1.660200255394124 +Alcohol [C:1]-[O:2]-[H] 1 14.780384615384616 2.546464970533435 +N-hydroxyamide [C:1](=[O:2])-[N:3]-[O:4]-[H] 3 9.301904761904762 1.2181897185891002 +*Ringed_imide1 [O,S:1]=[C;R:2]([$([#8]),$([#7]),$([#16]),$([#6][Cl]),$([#6]F),$([#6][Br]):3])-[N;R:4]([C;R:5]=[O,S:6])-[H] 3 6.4525 0.5555627777308341 +*Ringed_imide2 [O,S:1]=[C;R:2]-[N;R:3]([C;R:4]=[O,S:5])-[H] 2 8.681666666666667 1.8657779975741713 +*Imide [F,Cl,Br,S,s,P,p:1][#6:2][CX3:3](=[O,S:4])-[NX3+0:5]([CX3:6]=[O,S:7])-[H] 4 2.466666666666667 1.4843629385474877 +*Imide2 [O,S:1]=[CX3:2]-[NX3+0:3]([CX3:4]=[O,S:5])-[H] 2 10.23 1.1198214143335534 +*Amide_electronegative [C:1](=[O:2])-[N:3](-[Br,Cl,I,F,S,O,N,P:4])-[H] 2 3.4896 2.688124315081677 +*Amide [C:1](=[O:2])-[N:3]-[H] 2 12.00611111111111 4.512491341218857 +*Sulfonamide [SX4:1](=[O:2])(=[O:3])-[NX3+0:4]-[H] 3 7.9160326086956525 1.9842121316708763 +Anilines_primary [c:1]-[NX3+0:2]([H:3])[H:4] 1 3.899298673194805 2.068768503987161 +Anilines_secondary [c:1]-[NX3+0:2]([H:3])[!H:4] 1 4.335408163265306 2.1768842022330843 +Anilines_tertiary [c:1]-[NX3+0:2]([!H:3])[!H:4] 1 4.16690685045614 2.005865735782679 +Aromatic_nitrogen_unprotonated [n+0&H0:1] 0 4.3535441240733945 2.0714072661859584 +Amines_primary_secondary_tertiary [C:1]-[NX3+0:2] 1 8.159107682388349 2.5183597445318147 +Phosphinic_acid [PX4:1](=[O:2])(-[C,c,N,n,F,Cl,Br,I:3])(-[C,c,N,n,F,Cl,Br,I:4])-[OX2:5]-[H] 4 2.9745 0.6867886750744557 +Phosphate_diester [PX4:1](=[O:2])(-[OX2:3]-[C,c,N,n,F,Cl,Br,I:4])(-[O+0:5]-[C,c,N,n,F,Cl,Br,I:4])-[OX2:6]-[H] 6 2.7280434782608696 2.5437448856908316 +Phosphonate_ester [PX4:1](=[O:2])(-[OX2:3]-[C,c,N,n,F,Cl,Br,I:4])(-[C,c,N,n,F,Cl,Br,I:5])-[OX2:6]-[H] 5 2.0868 0.4503028610465036 +Primary_hydroxyl_amine [C,c:1]-[O:2]-[NH2:3] 2 4.035714285714286 0.8463816543155368 +*Indole_pyrrole [c;R:1]1[c;R:2][c;R:3][c;R:4][n;R:5]1[H] 4 14.52875 4.06702491591416 +*Aromatic_nitrogen_protonated [n:1]-[H] 0 7.17 2.94602395490212 diff -r 000000000000 -r 5c501eb8d56c test-data/CID_3037.sdf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test-data/CID_3037.sdf Sat Dec 04 16:39:31 2021 +0000 @@ -0,0 +1,220 @@ +3037 + -OEChem-08231108593D + + 27 28 0 0 0 0 0 0 0999 V2000 + -4.8550 1.3401 0.2120 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8529 -1.3406 0.2121 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + -0.1809 -2.1668 -0.3789 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.1788 2.1664 -0.3787 O 0 0 0 0 0 0 0 0 0 0 0 0 + -0.0011 -0.0002 1.4744 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.2222 -0.2738 0.6597 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.2377 0.2772 0.6480 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.2586 -1.3462 -0.2316 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.2565 1.3457 -0.2314 C 0 0 0 0 0 0 0 0 0 0 0 0 + -2.3343 0.5568 0.7972 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3322 -0.5574 0.7972 C 0 0 0 0 0 0 0 0 0 0 0 0 + -2.4069 -1.5879 -0.9855 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.4048 1.5875 -0.9852 C 0 0 0 0 0 0 0 0 0 0 0 0 + -3.4827 0.3152 0.0433 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4807 -0.3156 0.0435 C 0 0 0 0 0 0 0 0 0 0 0 0 + -3.5190 -0.7571 -0.8481 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5170 0.7568 -0.8478 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.1548 0.8649 2.1342 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.1601 -0.8435 2.1593 H 0 0 0 0 0 0 0 0 0 0 0 0 + -2.3089 1.3938 1.4913 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.3053 -1.3909 1.4943 H 0 0 0 0 0 0 0 0 0 0 0 0 + -2.4415 -2.4213 -1.6818 H 0 0 0 0 0 0 0 0 0 0 0 0 + 2.4469 2.4191 -1.6835 H 0 0 0 0 0 0 0 0 0 0 0 0 + -4.4070 -0.9574 -1.4422 H 0 0 0 0 0 0 0 0 0 0 0 0 + 4.4050 0.9570 -1.4418 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.2961 -2.2262 0.4641 H 0 0 0 0 0 0 0 0 0 0 0 0 + 0.3872 2.8487 -1.0397 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 8 1 0 0 0 0 + 3 26 1 0 0 0 0 + 4 9 1 0 0 0 0 + 4 27 1 0 0 0 0 + 5 6 1 0 0 0 0 + 5 7 1 0 0 0 0 + 5 18 1 0 0 0 0 + 5 19 1 0 0 0 0 + 6 8 2 0 0 0 0 + 6 10 1 0 0 0 0 + 7 9 2 0 0 0 0 + 7 11 1 0 0 0 0 + 8 12 1 0 0 0 0 + 9 13 1 0 0 0 0 + 10 14 2 0 0 0 0 + 10 20 1 0 0 0 0 + 11 15 2 0 0 0 0 + 11 21 1 0 0 0 0 + 12 16 2 0 0 0 0 + 12 22 1 0 0 0 0 + 13 17 2 0 0 0 0 + 13 23 1 0 0 0 0 + 14 16 1 0 0 0 0 + 15 17 1 0 0 0 0 + 16 24 1 0 0 0 0 + 17 25 1 0 0 0 0 +M END +> +3037 + +> +0.6 + +> +8 +10 +12 +1 +7 +5 +11 +3 +6 +9 +4 +2 + +> +25 +1 -0.18 +10 -0.15 +11 -0.15 +12 -0.15 +13 -0.15 +14 0.18 +15 0.18 +16 -0.15 +17 -0.15 +2 -0.18 +20 0.15 +21 0.15 +22 0.15 +23 0.15 +24 0.15 +25 0.15 +26 0.45 +27 0.45 +3 -0.53 +4 -0.53 +5 0.29 +6 -0.14 +7 -0.14 +8 0.08 +9 0.08 + +> +2 + +> +4 +1 3 donor +1 4 donor +6 6 8 10 12 14 16 rings +6 7 9 11 13 15 17 rings + +> +17 + +> +0 + +> +0 + +> +0 + +> +0 + +> +0 + +> +1 + +> +5 + +> +00000BDD00000008 + +> +44.6858 + +> +20.297 + +> +10062212 137 18261117369936506423 +104564 63 17986963035811110412 +11458722 120 18339359768245870841 +11471102 22 5472872458301843344 +11578080 2 18190204380446433792 +116883 192 18265608969609498196 +12236239 1 18410856576819659107 +12592029 89 18338223951597366363 +13549 16 18410575084668353682 +13693222 15 6555421915516066822 +13764800 53 14189033175566991199 +14115302 16 18186237320680093898 +14341114 328 10087642619424135543 +14787075 74 9511159855286719151 +14993402 34 18410855451538227223 +15099037 51 18340768233908588503 +15207287 21 15719111361650760302 +15375358 24 15647053767618106914 +15775835 57 18272650117329930317 +16945 1 17906452130063974618 +17834072 14 15936410035134206066 +18186145 218 17132117918276567720 +19422 9 18271525295227750719 +20279233 1 15719389529571237654 +20645476 183 18339080393619327415 +23402539 116 18186809105365620101 +23402655 69 18342736308283284156 +23559900 14 17603590712323212176 +25 1 17561083592297532664 +26918003 58 6266902359448424189 +296302 2 15213020427345972082 +3082319 5 18338798905472319583 +34934 24 18341891845236497020 +633830 44 17703790310130762689 +74978 22 18266740181857992718 +7832392 63 18340206284835898173 +81228 2 15720767252053392762 +9981440 41 17403743242177431832 + +> +341.85 +8.38 +1.9 +1.1 +0.02 +0 +-1.15 +1.94 +-0.01 +0 +-0.39 +-4.15 +0.01 +0 + +> +722.787 + +> +193 + +> +2 +5 +255 + +$$$$ + diff -r 000000000000 -r 5c501eb8d56c test-data/CID_3037.tab --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test-data/CID_3037.tab Sat Dec 04 16:39:31 2021 +0000 @@ -0,0 +1,2 @@ +Index PUBCHEM_ATOM_DEF_STEREO_COUNT PUBCHEM_ATOM_UDEF_STEREO_COUNT PUBCHEM_BOND_DEF_STEREO_COUNT PUBCHEM_BOND_UDEF_STEREO_COUNT PUBCHEM_CACTVS_TAUTO_COUNT PUBCHEM_COMPONENT_COUNT PUBCHEM_COMPOUND_CID PUBCHEM_CONFORMER_ID PUBCHEM_CONFORMER_RMSD PUBCHEM_EFFECTIVE_ROTOR_COUNT PUBCHEM_FEATURE_SELFOVERLAP PUBCHEM_HEAVY_ATOM_COUNT PUBCHEM_ISOTOPIC_ATOM_COUNT PUBCHEM_MMFF94_ENERGY PUBCHEM_SHAPE_SELFOVERLAP PUBCHEM_SHAPE_VOLUME SDFMoleculeName +0 0.0 0.0 0.0 0.0 5.0 1.0 3037.0 00000BDD00000008 0.6 2.0 20.297 17.0 0.0 44.6858 722.787 193.0 3037 diff -r 000000000000 -r 5c501eb8d56c test-data/ligand.sdf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test-data/ligand.sdf Sat Dec 04 16:39:31 2021 +0000 @@ -0,0 +1,612 @@ +pose1 + OpenBabel09021916093D + + 16 16 0 0 0 0 0 0 0 0999 V2000 + 30.7270 -43.7450 76.1540 C 0 0 0 0 0 0 0 0 0 0 0 0 + 32.2320 -43.8770 76.1820 C 0 0 0 0 0 0 0 0 0 0 0 0 + 32.9030 -44.5770 75.1900 C 0 0 0 0 0 0 0 0 0 0 0 0 + 34.2880 -44.7130 75.1870 C 0 0 0 0 0 0 0 0 0 0 0 0 + 34.9550 -45.4820 74.0800 C 0 0 0 0 0 0 0 0 0 0 0 0 + 35.0120 -44.1090 76.2270 C 0 0 0 0 0 0 0 0 0 0 0 0 + 34.3700 -43.3850 77.2450 C 0 0 0 0 0 0 0 0 0 0 0 0 + 35.1200 -42.7180 78.3740 C 0 0 0 0 0 0 0 0 0 0 0 0 + 32.9820 -43.2890 77.1920 C 0 0 0 0 0 0 0 0 0 0 0 0 + 36.4390 -44.2310 76.2340 N 0 0 0 0 0 0 0 0 0 0 0 0 + 36.8300 -44.9440 76.7890 H 0 0 0 0 0 0 0 0 0 0 0 0 + 37.2890 -43.4500 75.5420 C 0 0 0 0 0 0 0 0 0 0 0 0 + 37.0090 -42.3660 75.0480 O 0 0 0 0 0 0 0 0 0 0 0 0 + 38.6760 -43.9990 75.3480 C 0 0 0 0 0 0 0 0 0 0 0 0 + 38.7980 -44.7930 74.1950 O 0 0 0 0 0 0 0 0 0 0 0 0 + 38.6010 -46.1780 74.4680 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 9 2 0 0 0 0 + 3 2 1 0 0 0 0 + 4 3 2 0 0 0 0 + 4 6 1 0 0 0 0 + 5 4 1 0 0 0 0 + 6 10 1 0 0 0 0 + 6 7 2 0 0 0 0 + 7 8 1 0 0 0 0 + 9 7 1 0 0 0 0 + 10 11 1 0 0 0 0 + 12 10 1 0 0 0 0 + 13 12 2 0 0 0 0 + 14 12 1 0 0 0 0 + 15 16 1 0 0 0 0 + 15 14 1 0 0 0 0 +M END +> +1 + +> + VINA RESULT: -4.9 0.000 0.000 + Name = + 7 active torsions: + status: ('A' for Active; 'I' for Inactive) + 1 A between atoms: C_1 and C_5 + 2 A between atoms: C_2 and C_12 + 3 A between atoms: C_2 and O_15 + 4 A between atoms: C_3 and O_15 + 5 A between atoms: C_4 and C_7 + 6 A between atoms: C_8 and N_13 + 7 A between atoms: C_9 and C_11 + x y z vdW Elec q Type + _______ _______ _______ _____ _____ ______ ____ + +> +F 3 + +> +-4.9 + +> +0.000 + +> +0.000 + +$$$$ +pose2 + OpenBabel09021916093D + + 16 16 0 0 0 0 0 0 0 0999 V2000 + 30.7330 -43.6060 76.3350 C 0 0 0 0 0 0 0 0 0 0 0 0 + 32.2340 -43.7750 76.2880 C 0 0 0 0 0 0 0 0 0 0 0 0 + 33.0410 -43.2270 77.2740 C 0 0 0 0 0 0 0 0 0 0 0 0 + 34.4260 -43.3690 77.2600 C 0 0 0 0 0 0 0 0 0 0 0 0 + 35.2450 -42.7520 78.3610 C 0 0 0 0 0 0 0 0 0 0 0 0 + 35.0040 -44.0990 76.2100 C 0 0 0 0 0 0 0 0 0 0 0 0 + 34.2200 -44.6770 75.1980 C 0 0 0 0 0 0 0 0 0 0 0 0 + 34.8090 -45.4740 74.0590 C 0 0 0 0 0 0 0 0 0 0 0 0 + 32.8400 -44.4960 75.2690 C 0 0 0 0 0 0 0 0 0 0 0 0 + 36.4270 -44.2630 76.1860 N 0 0 0 0 0 0 0 0 0 0 0 0 + 36.8070 -45.0000 76.7160 H 0 0 0 0 0 0 0 0 0 0 0 0 + 37.2860 -43.4900 75.4970 C 0 0 0 0 0 0 0 0 0 0 0 0 + 37.0290 -42.3860 75.0350 O 0 0 0 0 0 0 0 0 0 0 0 0 + 38.6520 -44.0730 75.2620 C 0 0 0 0 0 0 0 0 0 0 0 0 + 38.7120 -44.8940 74.1230 O 0 0 0 0 0 0 0 0 0 0 0 0 + 38.5590 -46.2750 74.4420 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2 1 1 0 0 0 0 + 2 3 2 0 0 0 0 + 4 3 1 0 0 0 0 + 4 5 1 0 0 0 0 + 6 4 2 0 0 0 0 + 7 9 2 0 0 0 0 + 7 6 1 0 0 0 0 + 8 7 1 0 0 0 0 + 9 2 1 0 0 0 0 + 10 6 1 0 0 0 0 + 10 11 1 0 0 0 0 + 12 10 1 0 0 0 0 + 13 12 2 0 0 0 0 + 14 12 1 0 0 0 0 + 15 16 1 0 0 0 0 + 15 14 1 0 0 0 0 +M END +> +2 + +> + VINA RESULT: -4.9 0.118 2.246 + Name = + 7 active torsions: + status: ('A' for Active; 'I' for Inactive) + 1 A between atoms: C_1 and C_5 + 2 A between atoms: C_2 and C_12 + 3 A between atoms: C_2 and O_15 + 4 A between atoms: C_3 and O_15 + 5 A between atoms: C_4 and C_7 + 6 A between atoms: C_8 and N_13 + 7 A between atoms: C_9 and C_11 + x y z vdW Elec q Type + _______ _______ _______ _____ _____ ______ ____ + +> +F 3 + +> +-4.9 + +> +0.118 + +> +2.246 + +$$$$ +pose3 + OpenBabel09021916093D + + 16 16 0 0 0 0 0 0 0 0999 V2000 + 38.0110 -46.2540 74.8060 C 0 0 0 0 0 0 0 0 0 0 0 0 + 36.6410 -45.6700 75.0590 C 0 0 0 0 0 0 0 0 0 0 0 0 + 36.3810 -44.9390 76.2080 C 0 0 0 0 0 0 0 0 0 0 0 0 + 35.1300 -44.3850 76.4670 C 0 0 0 0 0 0 0 0 0 0 0 0 + 34.9150 -43.6000 77.7320 C 0 0 0 0 0 0 0 0 0 0 0 0 + 34.1140 -44.5800 75.5190 C 0 0 0 0 0 0 0 0 0 0 0 0 + 34.3400 -45.3070 74.3390 C 0 0 0 0 0 0 0 0 0 0 0 0 + 33.2700 -45.5280 73.2950 C 0 0 0 0 0 0 0 0 0 0 0 0 + 35.6120 -45.8370 74.1410 C 0 0 0 0 0 0 0 0 0 0 0 0 + 32.8230 -44.0090 75.7650 N 0 0 0 0 0 0 0 0 0 0 0 0 + 32.7200 -43.0420 75.6150 H 0 0 0 0 0 0 0 0 0 0 0 0 + 31.7400 -44.6890 76.1850 C 0 0 0 0 0 0 0 0 0 0 0 0 + 31.7580 -45.8050 76.6870 O 0 0 0 0 0 0 0 0 0 0 0 0 + 30.4150 -44.0110 75.9720 C 0 0 0 0 0 0 0 0 0 0 0 0 + 30.3610 -43.2680 74.7800 O 0 0 0 0 0 0 0 0 0 0 0 0 + 29.8410 -44.0280 73.6910 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 2 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 6 10 1 0 0 0 0 + 6 4 2 0 0 0 0 + 7 6 1 0 0 0 0 + 8 7 1 0 0 0 0 + 9 7 2 0 0 0 0 + 9 2 1 0 0 0 0 + 10 12 1 0 0 0 0 + 11 10 1 0 0 0 0 + 12 13 2 0 0 0 0 + 14 12 1 0 0 0 0 + 15 14 1 0 0 0 0 + 16 15 1 0 0 0 0 +M END +> +3 + +> + VINA RESULT: -4.9 2.960 5.795 + Name = + 7 active torsions: + status: ('A' for Active; 'I' for Inactive) + 1 A between atoms: C_1 and C_5 + 2 A between atoms: C_2 and C_12 + 3 A between atoms: C_2 and O_15 + 4 A between atoms: C_3 and O_15 + 5 A between atoms: C_4 and C_7 + 6 A between atoms: C_8 and N_13 + 7 A between atoms: C_9 and C_11 + x y z vdW Elec q Type + _______ _______ _______ _____ _____ ______ ____ + +> +F 3 + +> +-4.9 + +> +2.960 + +> +5.795 + +$$$$ +pose4 + OpenBabel09021916093D + + 16 16 0 0 0 0 0 0 0 0999 V2000 + 37.9950 -46.2420 74.8040 C 0 0 0 0 0 0 0 0 0 0 0 0 + 36.6310 -45.6410 75.0530 C 0 0 0 0 0 0 0 0 0 0 0 0 + 35.6040 -45.8070 74.1360 C 0 0 0 0 0 0 0 0 0 0 0 0 + 34.3360 -45.2680 74.3380 C 0 0 0 0 0 0 0 0 0 0 0 0 + 33.2650 -45.4860 73.3050 C 0 0 0 0 0 0 0 0 0 0 0 0 + 34.1090 -44.5430 75.5180 C 0 0 0 0 0 0 0 0 0 0 0 0 + 35.1210 -44.3610 76.4750 C 0 0 0 0 0 0 0 0 0 0 0 0 + 34.9070 -43.5920 77.7580 C 0 0 0 0 0 0 0 0 0 0 0 0 + 36.3670 -44.9230 76.2110 C 0 0 0 0 0 0 0 0 0 0 0 0 + 32.8080 -43.9900 75.7470 N 0 0 0 0 0 0 0 0 0 0 0 0 + 32.6920 -43.0240 75.5920 H 0 0 0 0 0 0 0 0 0 0 0 0 + 31.7290 -44.6830 76.1560 C 0 0 0 0 0 0 0 0 0 0 0 0 + 31.7570 -45.7970 76.6620 O 0 0 0 0 0 0 0 0 0 0 0 0 + 30.3970 -44.0250 75.9240 C 0 0 0 0 0 0 0 0 0 0 0 0 + 30.3400 -43.3070 74.7170 O 0 0 0 0 0 0 0 0 0 0 0 0 + 29.7270 -44.0560 73.6700 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 9 2 0 0 0 0 + 3 4 2 0 0 0 0 + 3 2 1 0 0 0 0 + 4 6 1 0 0 0 0 + 5 4 1 0 0 0 0 + 6 10 1 0 0 0 0 + 6 7 2 0 0 0 0 + 7 8 1 0 0 0 0 + 9 7 1 0 0 0 0 + 10 12 1 0 0 0 0 + 11 10 1 0 0 0 0 + 12 13 2 0 0 0 0 + 14 12 1 0 0 0 0 + 15 14 1 0 0 0 0 + 16 15 1 0 0 0 0 +M END +> +4 + +> + VINA RESULT: -4.8 2.958 5.379 + Name = + 7 active torsions: + status: ('A' for Active; 'I' for Inactive) + 1 A between atoms: C_1 and C_5 + 2 A between atoms: C_2 and C_12 + 3 A between atoms: C_2 and O_15 + 4 A between atoms: C_3 and O_15 + 5 A between atoms: C_4 and C_7 + 6 A between atoms: C_8 and N_13 + 7 A between atoms: C_9 and C_11 + x y z vdW Elec q Type + _______ _______ _______ _____ _____ ______ ____ + +> +F 3 + +> +-4.8 + +> +2.958 + +> +5.379 + +$$$$ +pose5 + OpenBabel09021916093D + + 16 16 0 0 0 0 0 0 0 0999 V2000 + 38.0500 -44.6890 74.2080 C 0 0 0 0 0 0 0 0 0 0 0 0 + 36.6310 -44.7300 74.7250 C 0 0 0 0 0 0 0 0 0 0 0 0 + 35.6330 -45.3790 74.0140 C 0 0 0 0 0 0 0 0 0 0 0 0 + 34.3180 -45.4370 74.4670 C 0 0 0 0 0 0 0 0 0 0 0 0 + 33.2830 -46.1590 73.6480 C 0 0 0 0 0 0 0 0 0 0 0 0 + 34.0140 -44.8170 75.6890 C 0 0 0 0 0 0 0 0 0 0 0 0 + 34.9980 -44.1580 76.4430 C 0 0 0 0 0 0 0 0 0 0 0 0 + 34.7050 -43.4880 77.7650 C 0 0 0 0 0 0 0 0 0 0 0 0 + 36.2940 -44.1340 75.9330 C 0 0 0 0 0 0 0 0 0 0 0 0 + 32.6670 -44.8760 76.1740 N 0 0 0 0 0 0 0 0 0 0 0 0 + 32.4200 -45.6500 76.7300 H 0 0 0 0 0 0 0 0 0 0 0 0 + 31.7140 -43.9580 75.9320 C 0 0 0 0 0 0 0 0 0 0 0 0 + 31.7570 -43.1100 75.0500 O 0 0 0 0 0 0 0 0 0 0 0 0 + 30.5300 -43.9780 76.8600 C 0 0 0 0 0 0 0 0 0 0 0 0 + 30.1410 -42.6970 77.2850 O 0 0 0 0 0 0 0 0 0 0 0 0 + 30.9190 -42.2320 78.3850 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 9 2 0 0 0 0 + 3 4 2 0 0 0 0 + 3 2 1 0 0 0 0 + 4 6 1 0 0 0 0 + 5 4 1 0 0 0 0 + 6 10 1 0 0 0 0 + 6 7 2 0 0 0 0 + 7 8 1 0 0 0 0 + 9 7 1 0 0 0 0 + 10 11 1 0 0 0 0 + 12 10 1 0 0 0 0 + 12 14 1 0 0 0 0 + 13 12 2 0 0 0 0 + 14 15 1 0 0 0 0 + 15 16 1 0 0 0 0 +M END +> +5 + +> + VINA RESULT: -4.5 2.763 5.379 + Name = + 7 active torsions: + status: ('A' for Active; 'I' for Inactive) + 1 A between atoms: C_1 and C_5 + 2 A between atoms: C_2 and C_12 + 3 A between atoms: C_2 and O_15 + 4 A between atoms: C_3 and O_15 + 5 A between atoms: C_4 and C_7 + 6 A between atoms: C_8 and N_13 + 7 A between atoms: C_9 and C_11 + x y z vdW Elec q Type + _______ _______ _______ _____ _____ ______ ____ + +> +F 3 + +> +-4.5 + +> +2.763 + +> +5.379 + +$$$$ +pose6 + OpenBabel09021916093D + + 16 16 0 0 0 0 0 0 0 0999 V2000 + 33.2740 -46.1140 73.3890 C 0 0 0 0 0 0 0 0 0 0 0 0 + 33.2350 -45.2530 74.6310 C 0 0 0 0 0 0 0 0 0 0 0 0 + 32.0270 -44.8930 75.2080 C 0 0 0 0 0 0 0 0 0 0 0 0 + 31.9590 -44.1040 76.3530 C 0 0 0 0 0 0 0 0 0 0 0 0 + 30.6150 -43.7500 76.9300 C 0 0 0 0 0 0 0 0 0 0 0 0 + 33.1640 -43.6750 76.9310 C 0 0 0 0 0 0 0 0 0 0 0 0 + 34.4080 -44.0260 76.3810 C 0 0 0 0 0 0 0 0 0 0 0 0 + 35.7220 -43.5880 76.9830 C 0 0 0 0 0 0 0 0 0 0 0 0 + 34.4060 -44.8150 75.2340 C 0 0 0 0 0 0 0 0 0 0 0 0 + 33.1120 -42.8710 78.1150 N 0 0 0 0 0 0 0 0 0 0 0 0 + 33.0600 -43.3400 78.9790 H 0 0 0 0 0 0 0 0 0 0 0 0 + 33.1290 -41.5260 78.1420 C 0 0 0 0 0 0 0 0 0 0 0 0 + 32.9030 -40.7970 77.1840 O 0 0 0 0 0 0 0 0 0 0 0 0 + 33.4950 -40.8990 79.4590 C 0 0 0 0 0 0 0 0 0 0 0 0 + 34.3180 -39.7680 79.3210 O 0 0 0 0 0 0 0 0 0 0 0 0 + 35.5320 -39.8880 80.0580 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 2 0 0 0 0 + 2 9 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 6 2 0 0 0 0 + 6 10 1 0 0 0 0 + 7 6 1 0 0 0 0 + 7 8 1 0 0 0 0 + 9 7 2 0 0 0 0 + 10 12 1 0 0 0 0 + 10 11 1 0 0 0 0 + 12 14 1 0 0 0 0 + 13 12 2 0 0 0 0 + 15 14 1 0 0 0 0 + 15 16 1 0 0 0 0 +M END +> +6 + +> + VINA RESULT: -4.4 3.106 4.850 + Name = + 7 active torsions: + status: ('A' for Active; 'I' for Inactive) + 1 A between atoms: C_1 and C_5 + 2 A between atoms: C_2 and C_12 + 3 A between atoms: C_2 and O_15 + 4 A between atoms: C_3 and O_15 + 5 A between atoms: C_4 and C_7 + 6 A between atoms: C_8 and N_13 + 7 A between atoms: C_9 and C_11 + x y z vdW Elec q Type + _______ _______ _______ _____ _____ ______ ____ + +> +F 3 + +> +-4.4 + +> +3.106 + +> +4.850 + +$$$$ +pose7 + OpenBabel09021916093D + + 16 16 0 0 0 0 0 0 0 0999 V2000 + 37.4790 -45.2240 74.1750 C 0 0 0 0 0 0 0 0 0 0 0 0 + 36.1180 -45.0510 74.8080 C 0 0 0 0 0 0 0 0 0 0 0 0 + 35.9750 -44.3800 76.0130 C 0 0 0 0 0 0 0 0 0 0 0 0 + 34.7340 -44.2020 76.6200 C 0 0 0 0 0 0 0 0 0 0 0 0 + 34.6480 -43.4610 77.9270 C 0 0 0 0 0 0 0 0 0 0 0 0 + 33.6030 -44.7210 75.9710 C 0 0 0 0 0 0 0 0 0 0 0 0 + 33.7050 -45.3990 74.7460 C 0 0 0 0 0 0 0 0 0 0 0 0 + 32.5070 -45.9630 74.0190 C 0 0 0 0 0 0 0 0 0 0 0 0 + 34.9750 -45.5460 74.1940 C 0 0 0 0 0 0 0 0 0 0 0 0 + 32.3180 -44.5390 76.5770 N 0 0 0 0 0 0 0 0 0 0 0 0 + 31.9880 -45.2570 77.1640 H 0 0 0 0 0 0 0 0 0 0 0 0 + 31.5250 -43.4650 76.4090 C 0 0 0 0 0 0 0 0 0 0 0 0 + 31.6380 -42.6370 75.5140 O 0 0 0 0 0 0 0 0 0 0 0 0 + 30.4470 -43.2750 77.4400 C 0 0 0 0 0 0 0 0 0 0 0 0 + 30.4060 -41.9700 77.9600 O 0 0 0 0 0 0 0 0 0 0 0 0 + 31.3500 -41.7760 79.0110 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 2 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 6 10 1 0 0 0 0 + 6 4 2 0 0 0 0 + 7 6 1 0 0 0 0 + 8 7 1 0 0 0 0 + 9 7 2 0 0 0 0 + 9 2 1 0 0 0 0 + 10 11 1 0 0 0 0 + 12 10 1 0 0 0 0 + 12 14 1 0 0 0 0 + 13 12 2 0 0 0 0 + 14 15 1 0 0 0 0 + 15 16 1 0 0 0 0 +M END +> +7 + +> + VINA RESULT: -4.4 2.847 5.816 + Name = + 7 active torsions: + status: ('A' for Active; 'I' for Inactive) + 1 A between atoms: C_1 and C_5 + 2 A between atoms: C_2 and C_12 + 3 A between atoms: C_2 and O_15 + 4 A between atoms: C_3 and O_15 + 5 A between atoms: C_4 and C_7 + 6 A between atoms: C_8 and N_13 + 7 A between atoms: C_9 and C_11 + x y z vdW Elec q Type + _______ _______ _______ _____ _____ ______ ____ + +> +F 3 + +> +-4.4 + +> +2.847 + +> +5.816 + +$$$$ +pose8 + OpenBabel09021916093D + + 16 16 0 0 0 0 0 0 0 0999 V2000 + 29.2690 -46.5680 70.6110 C 0 0 0 0 0 0 0 0 0 0 0 0 + 29.9950 -45.8610 71.7330 C 0 0 0 0 0 0 0 0 0 0 0 0 + 31.2800 -46.2360 72.0950 C 0 0 0 0 0 0 0 0 0 0 0 0 + 31.9750 -45.6010 73.1210 C 0 0 0 0 0 0 0 0 0 0 0 0 + 33.3680 -46.0550 73.4620 C 0 0 0 0 0 0 0 0 0 0 0 0 + 31.3390 -44.5460 73.7940 C 0 0 0 0 0 0 0 0 0 0 0 0 + 30.0420 -44.1320 73.4510 C 0 0 0 0 0 0 0 0 0 0 0 0 + 29.3330 -42.9960 74.1500 C 0 0 0 0 0 0 0 0 0 0 0 0 + 29.4010 -44.8100 72.4170 C 0 0 0 0 0 0 0 0 0 0 0 0 + 32.0440 -43.8770 74.8450 N 0 0 0 0 0 0 0 0 0 0 0 0 + 32.6940 -43.1840 74.5860 H 0 0 0 0 0 0 0 0 0 0 0 0 + 31.8900 -44.1170 76.1600 C 0 0 0 0 0 0 0 0 0 0 0 0 + 31.3600 -45.1120 76.6390 O 0 0 0 0 0 0 0 0 0 0 0 0 + 32.3840 -43.0420 77.0880 C 0 0 0 0 0 0 0 0 0 0 0 0 + 32.0560 -41.7460 76.6550 O 0 0 0 0 0 0 0 0 0 0 0 0 + 32.0630 -40.8000 77.7210 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 0 0 0 0 + 2 3 2 0 0 0 0 + 2 9 1 0 0 0 0 + 3 4 1 0 0 0 0 + 4 5 1 0 0 0 0 + 4 6 2 0 0 0 0 + 6 10 1 0 0 0 0 + 7 6 1 0 0 0 0 + 7 8 1 0 0 0 0 + 9 7 2 0 0 0 0 + 10 12 1 0 0 0 0 + 11 10 1 0 0 0 0 + 12 13 2 0 0 0 0 + 12 14 1 0 0 0 0 + 15 14 1 0 0 0 0 + 15 16 1 0 0 0 0 +M END +> +8 + +> + VINA RESULT: -4.3 3.964 5.892 + Name = + 7 active torsions: + status: ('A' for Active; 'I' for Inactive) + 1 A between atoms: C_1 and C_5 + 2 A between atoms: C_2 and C_12 + 3 A between atoms: C_2 and O_15 + 4 A between atoms: C_3 and O_15 + 5 A between atoms: C_4 and C_7 + 6 A between atoms: C_8 and N_13 + 7 A between atoms: C_9 and C_11 + x y z vdW Elec q Type + _______ _______ _______ _____ _____ ______ ____ + +> +F 3 + +> +-4.3 + +> +3.964 + +> +5.892 + +$$$$ +pose9 + OpenBabel09021916093D + + 16 16 0 0 0 0 0 0 0 0999 V2000 + 36.2810 -45.5880 74.7420 C 0 0 0 0 0 0 0 0 0 0 0 0 + 34.7970 -45.3090 74.6830 C 0 0 0 0 0 0 0 0 0 0 0 0 + 34.0060 -45.8780 73.6960 C 0 0 0 0 0 0 0 0 0 0 0 0 + 32.6360 -45.6430 73.6170 C 0 0 0 0 0 0 0 0 0 0 0 0 + 31.8340 -46.2940 72.5230 C 0 0 0 0 0 0 0 0 0 0 0 0 + 32.0540 -44.8050 74.5810 C 0 0 0 0 0 0 0 0 0 0 0 0 + 32.8200 -44.2170 75.6010 C 0 0 0 0 0 0 0 0 0 0 0 0 + 32.2240 -43.3170 76.6570 C 0 0 0 0 0 0 0 0 0 0 0 0 + 34.1850 -44.4900 75.6220 C 0 0 0 0 0 0 0 0 0 0 0 0 + 30.6450 -44.5600 74.5200 N 0 0 0 0 0 0 0 0 0 0 0 0 + 30.0630 -45.1230 75.0810 H 0 0 0 0 0 0 0 0 0 0 0 0 + 30.0510 -43.6230 73.7590 C 0 0 0 0 0 0 0 0 0 0 0 0 + 30.5710 -43.0480 72.8120 O 0 0 0 0 0 0 0 0 0 0 0 0 + 28.6490 -43.2470 74.1530 C 0 0 0 0 0 0 0 0 0 0 0 0 + 27.7000 -44.2290 73.8180 O 0 0 0 0 0 0 0 0 0 0 0 0 + 27.2950 -44.1460 72.4540 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2 1 1 0 0 0 0 + 2 9 2 0 0 0 0 + 3 2 1 0 0 0 0 + 4 3 2 0 0 0 0 + 4 6 1 0 0 0 0 + 5 4 1 0 0 0 0 + 6 7 2 0 0 0 0 + 7 9 1 0 0 0 0 + 7 8 1 0 0 0 0 + 10 6 1 0 0 0 0 + 10 11 1 0 0 0 0 + 12 14 1 0 0 0 0 + 12 10 1 0 0 0 0 + 13 12 2 0 0 0 0 + 15 14 1 0 0 0 0 + 16 15 1 0 0 0 0 +M END +> +9 + +> + VINA RESULT: -4.3 3.971 6.363 + Name = + 7 active torsions: + status: ('A' for Active; 'I' for Inactive) + 1 A between atoms: C_1 and C_5 + 2 A between atoms: C_2 and C_12 + 3 A between atoms: C_2 and O_15 + 4 A between atoms: C_3 and O_15 + 5 A between atoms: C_4 and C_7 + 6 A between atoms: C_8 and N_13 + 7 A between atoms: C_9 and C_11 + x y z vdW Elec q Type + _______ _______ _______ _____ _____ ______ ____ + +> +F 3 + +> +-4.3 + +> +3.971 + +> +6.363 + +$$$$ diff -r 000000000000 -r 5c501eb8d56c test-data/ligand.tab --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test-data/ligand.tab Sat Dec 04 16:39:31 2021 +0000 @@ -0,0 +1,10 @@ +Index RMSD_LB RMSD_UB SCORE SMILES +0 0.0 0.0 -4.9 [H]N(C(=O)COC)C1=C(C)C=C(C)C=C1C +1 0.118 2.246 -4.9 [H]N(C(=O)COC)C1=C(C)C=C(C)C=C1C +2 2.96 5.795 -4.9 [H]N(C(=O)COC)C1=C(C)C=C(C)C=C1C +3 2.958 5.379 -4.8 [H]N(C(=O)COC)C1=C(C)C=C(C)C=C1C +4 2.763 5.379 -4.5 [H]N(C(=O)COC)C1=C(C)C=C(C)C=C1C +5 3.106 4.85 -4.4 [H]N(C(=O)COC)C1=C(C)C=C(C)C=C1C +6 2.847 5.816 -4.4 [H]N(C(=O)COC)C1=C(C)C=C(C)C=C1C +7 3.964 5.892 -4.3 [H]N(C(=O)COC)C1=C(C)C=C(C)C=C1C +8 3.971 6.363 -4.3 [H]N(C(=O)COC)C1=C(C)C=C(C)C=C1C diff -r 000000000000 -r 5c501eb8d56c test-data/mol.pdb --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test-data/mol.pdb Sat Dec 04 16:39:31 2021 +0000 @@ -0,0 +1,72 @@ +COMPND CNCC(O)CCCc1ccccc1 +AUTHOR GENERATED BY OPEN BABEL 3.1.0 +HETATM 1 C UNL 1 9.206 6.617 23.375 1.00 0.00 C +HETATM 2 N UNL 1 9.288 5.239 22.843 1.00 0.00 N1+ +HETATM 3 C UNL 1 9.901 4.245 23.787 1.00 0.00 C +HETATM 4 C UNL 1 9.552 2.837 23.275 1.00 0.00 C +HETATM 5 O UNL 1 10.280 2.666 22.057 1.00 0.00 O +HETATM 6 C UNL 1 9.877 1.780 24.331 1.00 0.00 C +HETATM 7 C UNL 1 9.398 0.387 23.922 1.00 0.00 C +HETATM 8 C UNL 1 10.424 -0.687 24.293 1.00 0.00 C +HETATM 9 C UNL 1 11.616 -0.605 23.380 1.00 0.00 C +HETATM 10 C UNL 1 11.773 -1.516 22.327 1.00 0.00 C +HETATM 11 C UNL 1 12.918 -1.487 21.533 1.00 0.00 C +HETATM 12 C UNL 1 13.916 -0.552 21.786 1.00 0.00 C +HETATM 13 C UNL 1 13.767 0.367 22.824 1.00 0.00 C +HETATM 14 C UNL 1 12.623 0.342 23.620 1.00 0.00 C +HETATM 15 H UNL 1 8.759 7.256 22.643 1.00 0.00 H +HETATM 16 H UNL 1 10.189 6.970 23.605 1.00 0.00 H +HETATM 17 H UNL 1 8.609 6.620 24.264 1.00 0.00 H +HETATM 18 H UNL 1 9.849 5.259 21.991 1.00 0.00 H +HETATM 19 H UNL 1 8.329 4.932 22.679 1.00 0.00 H +HETATM 20 H UNL 1 9.504 4.384 24.771 1.00 0.00 H +HETATM 21 H UNL 1 10.962 4.375 23.832 1.00 0.00 H +HETATM 22 H UNL 1 8.505 2.722 23.087 1.00 0.00 H +HETATM 23 H UNL 1 11.228 2.771 22.229 1.00 0.00 H +HETATM 24 H UNL 1 9.401 2.052 25.249 1.00 0.00 H +HETATM 25 H UNL 1 10.941 1.741 24.440 1.00 0.00 H +HETATM 26 H UNL 1 9.242 0.370 22.864 1.00 0.00 H +HETATM 27 H UNL 1 8.487 0.178 24.443 1.00 0.00 H +HETATM 28 H UNL 1 9.974 -1.653 24.199 1.00 0.00 H +HETATM 29 H UNL 1 10.746 -0.530 25.301 1.00 0.00 H +HETATM 30 H UNL 1 11.037 -2.214 22.138 1.00 0.00 H +HETATM 31 H UNL 1 13.025 -2.159 20.758 1.00 0.00 H +HETATM 32 H UNL 1 14.769 -0.538 21.204 1.00 0.00 H +HETATM 33 H UNL 1 14.504 1.066 23.003 1.00 0.00 H +HETATM 34 H UNL 1 12.517 1.022 24.389 1.00 0.00 H +CONECT 1 2 15 16 17 +CONECT 2 1 3 18 19 +CONECT 3 2 4 20 21 +CONECT 4 3 5 6 22 +CONECT 5 4 23 +CONECT 6 4 7 24 25 +CONECT 7 6 8 26 27 +CONECT 8 7 9 28 29 +CONECT 9 8 10 10 14 +CONECT 10 9 9 11 30 +CONECT 11 10 12 12 31 +CONECT 12 11 11 13 32 +CONECT 13 12 14 14 33 +CONECT 14 9 13 13 34 +CONECT 15 1 +CONECT 16 1 +CONECT 17 1 +CONECT 18 2 +CONECT 19 2 +CONECT 20 3 +CONECT 21 3 +CONECT 22 4 +CONECT 23 5 +CONECT 24 6 +CONECT 25 6 +CONECT 26 7 +CONECT 27 7 +CONECT 28 8 +CONECT 29 8 +CONECT 30 10 +CONECT 31 11 +CONECT 32 12 +CONECT 33 13 +CONECT 34 14 +MASTER 0 0 0 0 0 0 0 0 34 0 34 0 +END diff -r 000000000000 -r 5c501eb8d56c test-data/mol_pdb_charges.tab --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test-data/mol_pdb_charges.tab Sat Dec 04 16:39:31 2021 +0000 @@ -0,0 +1,1 @@ +CNCC(O)CCCc1ccccc1 1 diff -r 000000000000 -r 5c501eb8d56c test-data/mols.smi --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test-data/mols.smi Sat Dec 04 16:39:31 2021 +0000 @@ -0,0 +1,3 @@ +NCCCCC(N)C(=O)O lysine +O=C(O)C(N)C alanine +N[C@@H](CC1=CC=CC=C1)C(O)=O phenylanaline diff -r 000000000000 -r 5c501eb8d56c test-data/rdconf_output.sdf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test-data/rdconf_output.sdf Sat Dec 04 16:39:31 2021 +0000 @@ -0,0 +1,166 @@ +staurosporine + RDKit 3D + + 35 42 0 0 0 0 0 0 0 0999 V2000 + -2.1656 1.4438 -2.0402 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.5064 0.5224 -1.0006 C 0 0 1 0 0 0 0 0 0 0 0 0 + -2.5333 0.2902 0.0771 C 0 0 1 0 0 0 0 0 0 0 0 0 + -3.0448 -1.1355 -0.1222 C 0 0 1 0 0 0 0 0 0 0 0 0 + -1.8499 -2.0325 0.1086 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.9248 -1.7530 -1.0664 C 0 0 1 0 0 0 0 0 0 0 0 0 + -1.2333 -0.6270 -1.7456 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.4794 -1.8256 -0.6986 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.2443 -2.8970 -0.6134 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.9172 -4.2121 -0.8557 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.8835 -5.2113 -0.7023 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1496 -4.8403 -0.3079 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4981 -3.5086 -0.0573 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5336 -2.5530 -0.2153 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5282 -1.1902 -0.0555 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.4701 -0.2506 0.3363 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.1276 1.0747 0.4177 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.8462 1.4665 0.1077 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.2026 2.7102 0.1107 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.7041 3.9456 0.4421 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.8338 5.0265 0.3768 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.4727 4.8205 -0.0097 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.9490 3.5396 -0.3412 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.0910 2.4739 -0.2786 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.2989 1.1681 -0.5288 N 0 0 0 0 0 0 0 0 0 0 0 0 + 0.9108 0.5646 -0.2791 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.2388 -0.7709 -0.3642 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.2788 1.9083 0.8642 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.3369 0.9521 1.0170 N 0 0 0 0 0 0 0 0 0 0 0 0 + 4.8631 -0.3694 0.7084 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.6279 -1.3464 0.7907 O 0 0 0 0 0 0 0 0 0 0 0 0 + -4.1928 -1.4531 0.6537 N 0 0 0 0 0 0 0 0 0 0 0 0 + -5.2852 -0.5939 0.2385 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.8857 0.2845 1.3121 O 0 0 0 0 0 0 0 0 0 0 0 0 + -2.4801 1.0939 2.2570 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2 1 1 6 + 2 3 1 0 + 3 4 1 0 + 4 5 1 0 + 6 5 1 1 + 6 7 1 0 + 6 8 1 0 + 8 9 1 0 + 9 10 2 0 + 10 11 1 0 + 11 12 2 0 + 12 13 1 0 + 13 14 2 0 + 14 15 1 0 + 15 16 2 0 + 16 17 1 0 + 17 18 2 0 + 18 19 1 0 + 19 20 2 0 + 20 21 1 0 + 21 22 2 0 + 22 23 1 0 + 23 24 2 0 + 24 25 1 0 + 25 26 1 0 + 26 27 2 0 + 17 28 1 0 + 28 29 1 0 + 29 30 1 0 + 30 31 2 0 + 4 32 1 1 + 32 33 1 0 + 3 34 1 1 + 34 35 1 0 + 7 2 1 0 + 25 2 1 0 + 27 8 1 0 + 14 9 1 0 + 27 15 1 0 + 30 16 1 0 + 26 18 1 0 + 24 19 1 0 +M END +$$$$ +staurosporine + RDKit 3D + + 35 42 0 0 0 0 0 0 0 0999 V2000 + -2.3068 0.9355 -2.4621 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.6484 0.1936 -1.2955 C 0 0 1 0 0 0 0 0 0 0 0 0 + -2.6628 -0.4491 -0.4739 C 0 0 1 0 0 0 0 0 0 0 0 0 + -2.1102 -1.3841 0.5829 C 0 0 1 0 0 0 0 0 0 0 0 0 + -1.3580 -2.4343 -0.1341 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.6301 -1.9615 -1.3703 C 0 0 1 0 0 0 0 0 0 0 0 0 + -1.0034 -0.8456 -1.9685 O 0 0 0 0 0 0 0 0 0 0 0 0 + 0.7323 -1.7671 -0.8854 N 0 0 0 0 0 0 0 0 0 0 0 0 + 1.6653 -2.7175 -0.8097 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.6030 -4.0416 -1.1929 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7336 -4.8209 -0.9993 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.8672 -4.2655 -0.4408 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.9097 -2.9234 -0.0599 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.7941 -2.1557 -0.2513 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.5524 -0.8186 0.0257 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.2591 0.2074 0.5765 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2.6138 1.4431 0.6965 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.3053 1.6277 0.2726 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.4639 2.7123 0.2701 C 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6421 4.0028 0.7116 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.3869 4.9173 0.5986 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.5824 4.5165 0.0416 C 0 0 0 0 0 0 0 0 0 0 0 0 + -1.7175 3.2124 -0.3878 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.7245 2.2626 -0.2991 C 0 0 0 0 0 0 0 0 0 0 0 0 + -0.6365 0.9796 -0.6340 N 0 0 0 0 0 0 0 0 0 0 0 0 + 0.6078 0.6133 -0.2727 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1.2251 -0.6244 -0.3999 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3.5496 2.4028 1.3130 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4.7624 1.6652 1.5409 N 0 0 0 0 0 0 0 0 0 0 0 0 + 4.5952 0.3088 1.0910 C 0 0 0 0 0 0 0 0 0 0 0 0 + 5.5219 -0.5061 1.1939 O 0 0 0 0 0 0 0 0 0 0 0 0 + -1.3679 -0.6619 1.5643 N 0 0 0 0 0 0 0 0 0 0 0 0 + -2.2073 0.2673 2.2885 C 0 0 0 0 0 0 0 0 0 0 0 0 + -3.6735 0.2555 0.0846 O 0 0 0 0 0 0 0 0 0 0 0 0 + -4.9519 -0.0773 -0.2685 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2 1 1 6 + 2 3 1 0 + 3 4 1 0 + 4 5 1 0 + 6 5 1 1 + 6 7 1 0 + 6 8 1 0 + 8 9 1 0 + 9 10 2 0 + 10 11 1 0 + 11 12 2 0 + 12 13 1 0 + 13 14 2 0 + 14 15 1 0 + 15 16 2 0 + 16 17 1 0 + 17 18 2 0 + 18 19 1 0 + 19 20 2 0 + 20 21 1 0 + 21 22 2 0 + 22 23 1 0 + 23 24 2 0 + 24 25 1 0 + 25 26 1 0 + 26 27 2 0 + 17 28 1 0 + 28 29 1 0 + 29 30 1 0 + 30 31 2 0 + 4 32 1 1 + 32 33 1 0 + 3 34 1 1 + 34 35 1 0 + 7 2 1 0 + 25 2 1 0 + 27 8 1 0 + 14 9 1 0 + 27 15 1 0 + 30 16 1 0 + 26 18 1 0 + 24 19 1 0 +M END +$$$$ diff -r 000000000000 -r 5c501eb8d56c test-data/rdkit_descriptors_result1.csv --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test-data/rdkit_descriptors_result1.csv Sat Dec 04 16:39:31 2021 +0000 @@ -0,0 +1,2 @@ +BalabanJ BertzCT Chi0 Chi0n Chi0v Chi1 Chi1n Chi1v Chi2n Chi2v Chi3n Chi3v Chi4n Chi4v EState_VSA1 EState_VSA10 EState_VSA11 EState_VSA2 EState_VSA3 EState_VSA4 EState_VSA5 EState_VSA6 EState_VSA7 EState_VSA8 EState_VSA9 ExactMolWt FpDensityMorgan1 FpDensityMorgan2 FpDensityMorgan3 FractionCSP3 HallKierAlpha HeavyAtomCount HeavyAtomMolWt Ipc Kappa1 Kappa2 Kappa3 LabuteASA MaxAbsEStateIndex MaxAbsPartialCharge MaxEStateIndex MaxPartialCharge MinAbsEStateIndex MinAbsPartialCharge MinEStateIndex MinPartialCharge MolLogP MolMR MolWt NHOHCount NOCount NumAliphaticCarbocycles NumAliphaticHeterocycles NumAliphaticRings NumAromaticCarbocycles NumAromaticHeterocycles NumAromaticRings NumHAcceptors NumHDonors NumHeteroatoms NumRadicalElectrons NumRotatableBonds NumSaturatedCarbocycles NumSaturatedHeterocycles NumSaturatedRings NumValenceElectrons PEOE_VSA1 PEOE_VSA10 PEOE_VSA11 PEOE_VSA12 PEOE_VSA13 PEOE_VSA14 PEOE_VSA2 PEOE_VSA3 PEOE_VSA4 PEOE_VSA5 PEOE_VSA6 PEOE_VSA7 PEOE_VSA8 PEOE_VSA9 RingCount SMR_VSA1 SMR_VSA10 SMR_VSA2 SMR_VSA3 SMR_VSA4 SMR_VSA5 SMR_VSA6 SMR_VSA7 SMR_VSA8 SMR_VSA9 SlogP_VSA1 SlogP_VSA10 SlogP_VSA11 SlogP_VSA12 SlogP_VSA2 SlogP_VSA3 SlogP_VSA4 SlogP_VSA5 SlogP_VSA6 SlogP_VSA7 SlogP_VSA8 SlogP_VSA9 TPSA VSA_EState1 VSA_EState10 VSA_EState2 VSA_EState3 VSA_EState4 VSA_EState5 VSA_EState6 VSA_EState7 VSA_EState8 VSA_EState9 fr_Al_COO fr_Al_OH fr_Al_OH_noTert fr_ArN fr_Ar_COO fr_Ar_N fr_Ar_NH fr_Ar_OH fr_COO fr_COO2 fr_C_O fr_C_O_noCOO fr_C_S fr_HOCCN fr_Imine fr_NH0 fr_NH1 fr_NH2 fr_N_O fr_Ndealkylation1 fr_Ndealkylation2 fr_Nhpyrrole fr_SH fr_aldehyde fr_alkyl_carbamate fr_alkyl_halide fr_allylic_oxid fr_amide fr_amidine fr_aniline fr_aryl_methyl fr_azide fr_azo fr_barbitur fr_benzene fr_benzodiazepine fr_bicyclic fr_diazo fr_dihydropyridine fr_epoxide fr_ester fr_ether fr_furan fr_guanido fr_halogen fr_hdrzine fr_hdrzone fr_imidazole fr_imide fr_isocyan fr_isothiocyan fr_ketone fr_ketone_Topliss fr_lactam fr_lactone fr_methoxy fr_morpholine fr_nitrile fr_nitro fr_nitro_arom fr_nitro_arom_nonortho fr_nitroso fr_oxazole fr_oxime fr_para_hydroxylation fr_phenol fr_phenol_noOrthoHbond fr_phos_acid fr_phos_ester fr_piperdine fr_piperzine fr_priamide fr_prisulfonamd fr_pyridine fr_quatN fr_sulfide fr_sulfonamd fr_sulfone fr_term_acetylene fr_tetrazole fr_thiazole fr_thiocyan fr_thiophene fr_unbrch_alkane fr_urea qed +3037 2.370227579270102 503.6108804181844 12.413849083443592 8.821564533342674 10.333422425379583 8.0585506480638 5.008352593120903 5.764281539139358 3.7228452481073373 4.595716809051308 2.463985083856104 2.934179289431582 1.5965258413271721 1.9859262940770028 0.0 10.213054789681411 0.0 11.49902366656781 27.592991233802653 0.0 12.13273413692322 24.26546827384644 0.0 0.0 23.20187978046503 268.00578492 0.7647058823529411 1.1764705882352942 1.588235294117647 0.07692307692307693 -1.38 17 259.04699999999997 6943.445199590422 12.08686679380967 4.861181105580097 2.8426724700782957 109.048439398113 9.68320845930965 0.5076617533400031 9.68320845930965 0.11870889965789788 0.14701436130007584 0.11870889965789788 0.14701436130007584 -0.5076617533400031 3.9954000000000027 69.03960000000004 269.127 2 2 0 0 0 2 0 2 2 2 4 0 2 0 0 0 88 10.213054789681411 11.49902366656781 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 23.20187978046503 47.52510539416365 16.466088250408664 0.0 2 10.213054789681411 23.20187978046503 0.0 0.0 0.0 6.4208216229260096 0.0 57.5703720216463 0.0 11.49902366656781 0.0 0.0 11.49902366656781 23.20187978046503 10.213054789681411 6.4208216229260096 0.0 11.126902983393991 36.39820241076966 10.045266627482652 0.0 0.0 40.46 0.0 11.70886971249405 0.0 0.0 0.0 0.0 0.0 0.0 0.0 32.01335250972817 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.8647127178367139 diff -r 000000000000 -r 5c501eb8d56c test-data/rdkit_descriptors_result1.tab --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test-data/rdkit_descriptors_result1.tab Sat Dec 04 16:39:31 2021 +0000 @@ -0,0 +1,2 @@ +MoleculeID BalabanJ BertzCT Chi0 Chi0n Chi0v Chi1 Chi1n Chi1v Chi2n Chi2v Chi3n Chi3v Chi4n Chi4v EState_VSA1 EState_VSA10 EState_VSA11 EState_VSA2 EState_VSA3 EState_VSA4 EState_VSA5 EState_VSA6 EState_VSA7 EState_VSA8 EState_VSA9 ExactMolWt FormalCharge FpDensityMorgan1 FpDensityMorgan2 FpDensityMorgan3 FractionCSP3 HallKierAlpha HeavyAtomCount HeavyAtomMolWt Ipc Kappa1 Kappa2 Kappa3 LabuteASA MaxAbsEStateIndex MaxAbsPartialCharge MaxEStateIndex MaxPartialCharge MinAbsEStateIndex MinAbsPartialCharge MinEStateIndex MinPartialCharge MolLogP MolMR MolWt NHOHCount NOCount NumAliphaticCarbocycles NumAliphaticHeterocycles NumAliphaticRings NumAromaticCarbocycles NumAromaticHeterocycles NumAromaticRings NumHAcceptors NumHDonors NumHeteroatoms NumRadicalElectrons NumRotatableBonds NumSaturatedCarbocycles NumSaturatedHeterocycles NumSaturatedRings NumValenceElectrons PEOE_VSA1 PEOE_VSA10 PEOE_VSA11 PEOE_VSA12 PEOE_VSA13 PEOE_VSA14 PEOE_VSA2 PEOE_VSA3 PEOE_VSA4 PEOE_VSA5 PEOE_VSA6 PEOE_VSA7 PEOE_VSA8 PEOE_VSA9 RingCount SMR_VSA1 SMR_VSA10 SMR_VSA2 SMR_VSA3 SMR_VSA4 SMR_VSA5 SMR_VSA6 SMR_VSA7 SMR_VSA8 SMR_VSA9 SSSR SlogP_VSA1 SlogP_VSA10 SlogP_VSA11 SlogP_VSA12 SlogP_VSA2 SlogP_VSA3 SlogP_VSA4 SlogP_VSA5 SlogP_VSA6 SlogP_VSA7 SlogP_VSA8 SlogP_VSA9 TPSA VSA_EState1 VSA_EState10 VSA_EState2 VSA_EState3 VSA_EState4 VSA_EState5 VSA_EState6 VSA_EState7 VSA_EState8 VSA_EState9 fr_Al_COO fr_Al_OH fr_Al_OH_noTert fr_ArN fr_Ar_COO fr_Ar_N fr_Ar_NH fr_Ar_OH fr_COO fr_COO2 fr_C_O fr_C_O_noCOO fr_C_S fr_HOCCN fr_Imine fr_NH0 fr_NH1 fr_NH2 fr_N_O fr_Ndealkylation1 fr_Ndealkylation2 fr_Nhpyrrole fr_SH fr_aldehyde fr_alkyl_carbamate fr_alkyl_halide fr_allylic_oxid fr_amide fr_amidine fr_aniline fr_aryl_methyl fr_azide fr_azo fr_barbitur fr_benzene fr_benzodiazepine fr_bicyclic fr_diazo fr_dihydropyridine fr_epoxide fr_ester fr_ether fr_furan fr_guanido fr_halogen fr_hdrzine fr_hdrzone fr_imidazole fr_imide fr_isocyan fr_isothiocyan fr_ketone fr_ketone_Topliss fr_lactam fr_lactone fr_methoxy fr_morpholine fr_nitrile fr_nitro fr_nitro_arom fr_nitro_arom_nonortho fr_nitroso fr_oxazole fr_oxime fr_para_hydroxylation fr_phenol fr_phenol_noOrthoHbond fr_phos_acid fr_phos_ester fr_piperdine fr_piperzine fr_priamide fr_prisulfonamd fr_pyridine fr_quatN fr_sulfide fr_sulfonamd fr_sulfone fr_term_acetylene fr_tetrazole fr_thiazole fr_thiocyan fr_thiophene fr_unbrch_alkane fr_urea qed +3037 2.370228 503.61088 12.413849 8.821565 10.333422 8.058551 5.008353 5.764282 3.722845 4.595717 2.463985 2.934179 1.596526 1.985926 0.0 10.213055 0.0 11.499024 27.592991 0.0 12.132734 24.265468 0.0 0.0 23.20188 268.005785 0 0.764706 1.176471 1.588235 0.076923 -1.38 17 259.047 6943.4452 12.086867 4.861181 2.842672 109.048439 9.683208 0.507662 9.683208 0.118709 0.147014 0.118709 0.147014 -0.507662 3.9954 69.0396 269.127 2 2 0 0 0 2 0 2 2 2 4 0 2 0 0 0 88 10.213055 11.499024 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 23.20188 47.525105 16.466088 0.0 2 10.213055 23.20188 0.0 0.0 0.0 6.420822 0.0 57.570372 0.0 11.499024 2 0.0 0.0 11.499024 23.20188 10.213055 6.420822 0.0 11.126903 36.398202 10.045267 0.0 0.0 40.46 0.0 11.70887 0.0 20.448487 1.29642 0.294029 9.600621 0.373796 0.0 0.0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.864713 diff -r 000000000000 -r 5c501eb8d56c test-data/rdkit_descriptors_subset.tab --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test-data/rdkit_descriptors_subset.tab Sat Dec 04 16:39:31 2021 +0000 @@ -0,0 +1,2 @@ +MoleculeID FormalCharge MolWt qed +3037 0 269.127 0.864713 diff -r 000000000000 -r 5c501eb8d56c test-data/staurosporine.smi --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test-data/staurosporine.smi Sat Dec 04 16:39:31 2021 +0000 @@ -0,0 +1,1 @@ +C[C@@]12[C@@H]([C@@H](C[C@@H](O1)N3C4=CC=CC=C4C5=C6C(=C7C8=CC=CC=C8N2C7=C53)CNC6=O)NC)OC staurosporine diff -r 000000000000 -r 5c501eb8d56c test-data/sucos_cluster.sdf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test-data/sucos_cluster.sdf Sat Dec 04 16:39:31 2021 +0000 @@ -0,0 +1,1384 @@ + + RDKit 3D + + 19 20 0 0 0 0 0 0 0 0999 V2000 + 25.8690 10.6750 17.9260 C 0 0 0 0 0 0 0 0 0 0 0 0 + 24.7660 11.4770 18.5500 C 0 0 0 0 0 0 0 0 0 0 0 0 + 24.1650 12.4880 17.8120 C 0 0 0 0 0 0 0 0 0 0 0 0 + 23.1480 13.2570 18.3640 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.7300 13.0010 19.6620 C 0 0 0 0 0 0 0 0 0 0 0 0 + 21.6190 13.8450 20.2480 C 0 0 0 0 0 0 0 0 0 0 0 0 + 23.3280 11.9670 20.4090 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.9000 11.7560 21.6900 O 0 0 0 0 0 0 0 0 0 0 0 0 + 23.1990 10.4520 22.2010 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.3800 10.3250 23.4930 C 0 0 1 0 0 0 0 0 0 0 0 0 + 22.7510 9.1510 24.2170 O 0 0 0 0 0 0 0 0 0 0 0 0 + 22.5930 11.5910 24.3570 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.2540 11.3630 25.7760 N 0 0 0 0 0 0 0 0 0 0 0 0 + 22.5710 12.5910 26.5330 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.1760 12.4110 28.0100 C 0 0 0 0 0 0 0 0 0 0 0 0 + 20.7810 12.0710 28.1350 O 0 0 0 0 0 0 0 0 0 0 0 0 + 20.5060 10.8660 27.4060 C 0 0 0 0 0 0 0 0 0 0 0 0 + 20.8170 11.0700 25.9210 C 0 0 0 0 0 0 0 0 0 0 0 0 + 24.3600 11.2090 19.8480 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2 1 1 0 + 3 2 2 0 + 4 3 1 0 + 5 4 2 0 + 6 5 1 0 + 7 5 1 0 + 8 7 1 0 + 9 8 1 0 + 10 9 1 0 + 10 11 1 1 + 12 10 1 0 + 13 12 1 0 + 14 13 1 0 + 15 14 1 0 + 16 15 1 0 + 17 16 1 0 + 18 17 1 0 + 18 13 1 0 + 19 7 2 0 + 19 2 1 0 +M END +$$$$ + + RDKit 3D + + 11 12 0 0 0 0 0 0 0 0999 V2000 + 22.8090 9.2070 24.2800 N 0 0 0 0 0 0 0 0 0 0 0 0 + 22.4710 10.1080 23.3190 C 0 0 0 0 0 0 0 0 0 0 0 0 + 21.8900 9.6340 22.1960 N 0 0 0 0 0 0 0 0 0 0 0 0 + 21.5680 10.5170 21.2440 C 0 0 0 0 0 0 0 0 0 0 0 0 + 21.7580 11.8790 21.3690 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.3130 12.3920 22.5320 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.5210 13.7530 22.7260 C 0 0 0 0 0 0 0 0 0 0 0 0 + 23.0810 14.2110 23.9020 C 0 0 0 0 0 0 0 0 0 0 0 0 + 23.4470 13.3190 24.8860 C 0 0 0 0 0 0 0 0 0 0 0 0 + 23.2450 11.9700 24.7110 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.6750 11.4850 23.5440 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2 1 1 0 + 3 2 2 0 + 4 3 1 0 + 5 4 2 0 + 6 5 1 0 + 7 6 2 0 + 8 7 1 0 + 9 8 2 0 + 10 9 1 0 + 11 2 1 0 + 11 10 2 0 + 11 6 1 0 +M END +$$$$ + + RDKit 3D + + 11 12 0 0 0 0 0 0 0 0999 V2000 + 22.7770 9.1670 24.9740 N 0 0 0 0 0 0 0 0 0 0 0 0 + 22.4280 10.0140 24.0880 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.6770 11.3690 24.2670 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.2930 12.2600 23.2950 C 0 0 0 0 0 0 0 0 0 0 0 0 + 21.6430 11.7880 22.1650 C 0 0 0 0 0 0 0 0 0 0 0 0 + 21.2220 12.6270 21.1460 C 0 0 0 0 0 0 0 0 0 0 0 0 + 20.5740 12.1120 20.0440 C 0 0 0 0 0 0 0 0 0 0 0 0 + 20.3400 10.7540 19.9450 C 0 0 0 0 0 0 0 0 0 0 0 0 + 20.7580 9.9010 20.9470 C 0 0 0 0 0 0 0 0 0 0 0 0 + 21.4090 10.3980 22.0610 C 0 0 0 0 0 0 0 0 0 0 0 0 + 21.7960 9.5320 23.0070 N 0 0 0 0 0 0 0 0 0 0 0 0 + 2 1 1 0 + 3 2 2 0 + 4 3 1 0 + 5 4 2 0 + 6 5 1 0 + 7 6 2 0 + 8 7 1 0 + 9 8 2 0 + 10 9 1 0 + 10 5 1 0 + 11 10 2 0 + 11 2 1 0 +M END +$$$$ + + RDKit 3D + + 15 16 0 0 0 0 0 0 0 0999 V2000 + 22.4510 9.0090 24.4670 N 0 0 0 0 0 0 0 0 0 0 0 0 + 22.5180 10.3550 24.1060 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.9990 11.2350 24.9790 N 0 0 0 0 0 0 0 0 0 0 0 0 + 23.1030 12.5320 24.7160 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.7060 13.0330 23.4860 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.1940 12.1570 22.5380 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.0810 10.8000 22.8500 C 0 0 0 0 0 0 0 0 0 0 0 0 + 21.5800 9.9040 21.8960 N 0 0 0 0 0 0 0 0 0 0 0 0 + 21.5550 10.3020 20.4800 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.9570 10.4800 19.9210 C 0 0 0 0 0 0 0 0 0 0 0 0 + 24.0930 10.2030 20.6880 C 0 0 0 0 0 0 0 0 0 0 0 0 + 25.3650 10.3660 20.1600 C 0 0 0 0 0 0 0 0 0 0 0 0 + 25.5090 10.8070 18.8530 C 0 0 0 0 0 0 0 0 0 0 0 0 + 24.3830 11.0830 18.0860 C 0 0 0 0 0 0 0 0 0 0 0 0 + 23.1090 10.9240 18.6170 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2 1 1 0 + 3 2 2 0 + 4 3 1 0 + 5 4 2 0 + 6 5 1 0 + 7 2 1 0 + 7 6 2 0 + 8 7 1 0 + 9 8 1 0 + 10 9 1 0 + 11 10 2 0 + 12 11 1 0 + 13 12 2 0 + 14 13 1 0 + 15 10 1 0 + 15 14 2 0 +M END +$$$$ + + RDKit 3D + + 14 15 0 0 0 0 0 0 0 0999 V2000 + 25.2210 12.3240 18.0720 C 0 0 0 0 0 0 0 0 0 0 0 0 + 25.2950 10.9960 18.4640 C 0 0 0 0 0 0 0 0 0 0 0 0 + 24.3010 10.4520 19.2480 C 0 0 0 0 0 0 0 0 0 0 0 0 + 23.2220 11.2280 19.6570 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.1370 10.6280 20.5110 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.4080 10.7370 21.9940 C 0 0 1 0 0 0 0 0 0 0 0 0 + 21.4270 9.8630 22.7750 C 0 0 0 0 0 0 0 0 0 0 0 0 + 21.7420 9.8660 24.2600 C 0 0 0 0 0 0 0 0 0 0 0 0 + 23.1460 9.4340 24.4920 N 0 0 0 0 0 0 0 0 0 0 0 0 + 24.1030 10.3610 23.8220 C 0 0 0 0 0 0 0 0 0 0 0 0 + 23.8510 10.3500 22.3260 C 0 0 0 0 0 0 0 0 0 0 0 0 + 23.1570 12.5620 19.2690 C 0 0 0 0 0 0 0 0 0 0 0 0 + 24.1500 13.1090 18.4810 C 0 0 0 0 0 0 0 0 0 0 0 0 + 26.1900 12.8500 17.2940 F 0 0 0 0 0 0 0 0 0 0 0 0 + 2 1 2 0 + 3 2 1 0 + 4 3 2 0 + 5 4 1 0 + 6 5 1 6 + 7 6 1 0 + 8 7 1 0 + 9 8 1 0 + 10 9 1 0 + 11 10 1 0 + 11 6 1 0 + 12 4 1 0 + 13 12 2 0 + 13 1 1 0 + 14 1 1 0 +M END +$$$$ + + RDKit 3D + + 18 20 0 0 0 0 0 0 0 0999 V2000 + 22.7740 9.2060 24.7160 N 0 0 0 0 0 0 0 0 0 0 0 0 + 22.6730 10.1680 23.8290 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.6480 11.5040 24.2160 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.5410 12.4950 23.2640 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.4360 12.1560 21.9280 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.4390 10.8180 21.5470 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.3390 10.4160 20.0980 C 0 0 0 0 0 0 0 0 0 0 0 0 + 23.4770 9.5130 19.6670 C 0 0 0 0 0 0 0 0 0 0 0 0 + 24.8250 10.1870 19.6920 C 0 0 0 0 0 0 0 0 0 0 0 0 + 25.0890 11.2540 18.8350 C 0 0 0 0 0 0 0 0 0 0 0 0 + 26.3260 11.8750 18.8250 C 0 0 0 0 0 0 0 0 0 0 0 0 + 27.3220 11.4120 19.6750 C 0 0 0 0 0 0 0 0 0 0 0 0 + 28.6590 11.7950 19.9160 C 0 0 0 0 0 0 0 0 0 0 0 0 + 29.1750 10.9440 20.8960 C 0 0 0 0 0 0 0 0 0 0 0 0 + 28.2120 10.0690 21.2490 N 0 0 0 0 0 0 0 0 0 0 0 0 + 27.0680 10.3360 20.5270 C 0 0 0 0 0 0 0 0 0 0 0 0 + 25.8240 9.7170 20.5400 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.5470 9.8480 22.5050 N 0 0 0 0 0 0 0 0 0 0 0 0 + 2 1 1 0 + 3 2 2 0 + 4 3 1 0 + 5 4 2 0 + 6 5 1 0 + 7 6 1 0 + 8 7 1 0 + 9 8 1 0 + 10 9 2 0 + 11 10 1 0 + 12 11 2 0 + 13 12 1 0 + 14 13 2 0 + 15 14 1 0 + 16 15 1 0 + 16 12 1 0 + 17 16 2 0 + 17 9 1 0 + 18 6 2 0 + 18 2 1 0 +M END +$$$$ + + RDKit 3D + + 21 23 0 0 0 0 0 0 0 0999 V2000 + 22.6900 9.3460 24.4820 N 0 0 0 0 0 0 0 0 0 0 0 0 + 22.7870 10.6500 24.1630 C 0 0 0 0 0 0 0 0 0 0 0 0 + 23.0810 11.5110 25.1640 N 0 0 0 0 0 0 0 0 0 0 0 0 + 23.1550 12.8130 24.8620 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.9370 13.3140 23.5950 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.6290 12.4490 22.5700 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.5360 11.0880 22.8330 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.2030 10.1450 21.8580 N 0 0 0 0 0 0 0 0 0 0 0 0 + 21.9100 10.4610 20.4700 C 0 0 0 0 0 0 0 0 0 0 0 0 + 23.1110 10.8820 19.6530 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.9310 11.3890 18.3770 C 0 0 0 0 0 0 0 0 0 0 0 0 + 24.0150 11.7690 17.6140 C 0 0 0 0 0 0 0 0 0 0 0 0 + 25.2920 11.6680 18.1200 C 0 0 0 0 0 0 0 0 0 0 0 0 + 25.5080 11.1670 19.3990 C 0 0 0 0 0 0 0 0 0 0 0 0 + 24.4040 10.7800 20.1590 C 0 0 0 0 0 0 0 0 0 0 0 0 + 26.8870 11.0930 19.9590 C 0 0 0 0 0 0 0 0 0 0 0 0 + 27.8330 12.0650 19.6660 C 0 0 0 0 0 0 0 0 0 0 0 0 + 29.0910 11.9730 20.2180 C 0 0 0 0 0 0 0 0 0 0 0 0 + 29.3740 10.9330 21.0780 C 0 0 0 0 0 0 0 0 0 0 0 0 + 28.4890 9.9800 21.3850 N 0 0 0 0 0 0 0 0 0 0 0 0 + 27.2660 10.0830 20.8440 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2 1 1 0 + 3 2 2 0 + 4 3 1 0 + 5 4 2 0 + 6 5 1 0 + 7 2 1 0 + 7 6 2 0 + 8 7 1 0 + 9 8 1 0 + 10 9 1 0 + 11 10 2 0 + 12 11 1 0 + 13 12 2 0 + 14 13 1 0 + 15 10 1 0 + 15 14 2 0 + 16 14 1 0 + 17 16 2 0 + 18 17 1 0 + 19 18 2 0 + 20 19 1 0 + 21 16 1 0 + 21 20 2 0 +M END +$$$$ + + RDKit 3D + + 20 21 0 0 0 0 0 0 0 0999 V2000 + 21.2480 11.2160 24.5450 C 0 0 1 0 0 0 0 0 0 0 0 0 + 21.1020 11.0880 25.9790 N 0 0 0 0 0 0 0 0 0 0 0 0 + 20.1520 11.7400 26.6430 C 0 0 0 0 0 0 0 0 0 0 0 0 + 19.2750 12.3940 26.0980 O 0 0 0 0 0 0 0 0 0 0 0 0 + 20.2050 11.6230 28.1500 C 0 0 0 0 0 0 0 0 0 0 0 0 + 20.1270 12.9990 28.8020 C 0 0 0 0 0 0 0 0 0 0 0 0 + 20.9520 13.0380 30.0790 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.6540 13.4720 29.6460 S 0 0 0 0 0 0 0 0 0 0 0 0 + 22.7090 11.4410 24.1690 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.8180 11.5780 22.6520 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.3510 10.3050 22.0930 N 0 0 0 0 0 0 0 0 0 0 0 0 + 20.9200 10.1140 22.3280 C 0 0 0 0 0 0 0 0 0 0 0 0 + 20.7360 9.9660 23.8360 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.5750 10.2440 20.6540 C 0 0 0 0 0 0 0 0 0 0 0 0 + 23.9890 10.6020 20.2540 C 0 0 0 0 0 0 0 0 0 0 0 0 + 25.0820 9.9220 20.7960 C 0 0 0 0 0 0 0 0 0 0 0 0 + 26.3780 10.2710 20.4140 C 0 0 0 0 0 0 0 0 0 0 0 0 + 26.5780 11.2950 19.4850 C 0 0 0 0 0 0 0 0 0 0 0 0 + 25.4840 11.9720 18.9430 C 0 0 0 0 0 0 0 0 0 0 0 0 + 24.1890 11.6250 19.3240 C 0 0 0 0 0 0 0 0 0 0 0 0 + 1 2 1 1 + 3 2 1 0 + 4 3 2 0 + 5 3 1 0 + 6 5 1 0 + 7 6 1 0 + 8 7 1 0 + 9 1 1 0 + 10 9 1 0 + 11 10 1 0 + 12 11 1 0 + 13 12 1 0 + 13 1 1 0 + 14 11 1 0 + 15 14 1 0 + 16 15 2 0 + 17 16 1 0 + 18 17 2 0 + 19 18 1 0 + 20 15 1 0 + 20 19 2 0 +M END +$$$$ + + RDKit 3D + + 20 21 0 0 0 0 0 0 0 0999 V2000 + 23.0110 10.6350 19.8150 C 0 0 0 0 0 0 0 0 0 0 0 0 + 24.2670 11.1650 19.1280 C 0 0 0 0 0 0 0 0 0 0 0 0 + 25.2960 11.1360 20.1630 N 0 0 0 0 0 0 0 0 0 0 0 0 + 24.9890 12.0920 21.2290 C 0 0 0 0 0 0 0 0 0 0 0 0 + 23.7420 11.5350 21.9210 C 0 0 2 0 0 0 0 0 0 0 0 0 + 22.6410 11.4290 20.9740 N 0 0 0 0 0 0 0 0 0 0 0 0 + 26.6000 11.4040 19.5610 C 0 0 0 0 0 0 0 0 0 0 0 0 + 27.7300 10.8900 20.4300 C 0 0 0 0 0 0 0 0 0 0 0 0 + 27.6290 9.6500 21.0680 C 0 0 0 0 0 0 0 0 0 0 0 0 + 28.6700 9.1850 21.8700 C 0 0 0 0 0 0 0 0 0 0 0 0 + 29.8180 9.9600 22.0270 C 0 0 0 0 0 0 0 0 0 0 0 0 + 29.9260 11.1970 21.3880 C 0 0 0 0 0 0 0 0 0 0 0 0 + 28.8800 11.6630 20.5900 C 0 0 0 0 0 0 0 0 0 0 0 0 + 23.3760 12.3720 23.1130 C 0 0 0 0 0 0 0 0 0 0 0 0 + 24.0930 12.1770 24.2210 N 0 0 0 0 0 0 0 0 0 0 0 0 + 22.4610 13.1780 23.0440 O 0 0 0 0 0 0 0 0 0 0 0 0 + 23.8850 12.9460 25.4360 C 0 0 0 0 0 0 0 0 0 0 0 0 + 24.7100 14.2290 25.4520 C 0 0 0 0 0 0 0 0 0 0 0 0 + 26.3830 13.8570 26.0370 S 0 0 0 0 0 0 0 0 0 0 0 0 + 30.8240 9.5080 22.7950 F 0 0 0 0 0 0 0 0 0 0 0 0 + 2 1 1 0 + 3 2 1 0 + 4 3 1 0 + 5 4 1 0 + 6 1 1 0 + 6 5 1 0 + 7 3 1 0 + 8 7 1 0 + 9 8 2 0 + 10 9 1 0 + 11 10 2 0 + 12 11 1 0 + 13 8 1 0 + 13 12 2 0 + 5 14 1 1 + 15 14 1 0 + 16 14 2 0 + 17 15 1 0 + 18 17 1 0 + 19 18 1 0 + 20 11 1 0 +M END +$$$$ + + RDKit 3D + + 10 10 0 0 0 0 0 0 0 0999 V2000 + 24.4730 11.1990 19.8620 C 0 0 0 0 0 0 0 0 0 0 0 0 + 25.5530 12.0600 20.0930 C 0 0 0 0 0 0 0 0 0 0 0 0 + 23.9840 11.0460 18.5670 C 0 0 0 0 0 0 0 0 0 0 0 0 + 23.8330 10.4330 20.9970 C 0 0 0 0 0 0 0 0 0 0 0 0 + 26.1360 12.7690 19.0380 C 0 0 0 0 0 0 0 0 0 0 0 0 + 24.5550 11.7420 17.5050 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.3160 10.6870 21.0270 C 0 0 0 0 0 0 0 0 0 0 0 0 + 25.6290 12.6010 17.7470 C 0 0 0 0 0 0 0 0 0 0 0 0 + 21.6740 10.0940 22.2270 N 0 0 0 0 0 0 0 0 0 0 0 0 + 26.1850 13.2880 16.6940 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2 1 2 0 + 3 1 1 0 + 4 1 1 0 + 5 2 1 0 + 6 3 2 0 + 7 4 1 0 + 8 6 1 0 + 8 5 2 0 + 9 7 1 0 + 10 8 1 0 +M END +$$$$ + + RDKit 3D + + 11 11 0 0 0 0 0 0 0 0999 V2000 + 23.8350 12.2020 19.5760 C 0 0 0 0 0 0 0 0 0 0 0 0 + 23.4520 11.9220 18.2610 C 0 0 0 0 0 0 0 0 0 0 0 0 + 25.0420 12.8700 19.8340 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.9370 11.8100 20.7250 C 0 0 0 0 0 0 0 0 0 0 0 0 + 24.2680 12.2940 17.1940 C 0 0 0 0 0 0 0 0 0 0 0 0 + 25.8750 13.2520 18.7790 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.8350 10.2970 20.9620 C 0 0 1 0 0 0 0 0 0 0 0 0 + 25.4680 12.9560 17.4710 C 0 0 0 0 0 0 0 0 0 0 0 0 + 24.1570 9.7480 21.5040 C 0 0 0 0 0 0 0 0 0 0 0 0 + 21.7030 9.9910 21.9220 N 0 0 0 0 0 0 0 0 0 0 0 0 + 26.2630 13.3220 16.4230 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2 1 2 0 + 3 1 1 0 + 4 1 1 0 + 5 2 1 0 + 6 3 2 0 + 7 4 1 0 + 8 6 1 0 + 8 5 2 0 + 7 9 1 1 + 10 7 1 0 + 11 8 1 0 +M END +$$$$ + + RDKit 3D + + 12 12 0 0 0 0 0 0 0 0999 V2000 + 26.5880 11.6480 19.1670 C 0 0 0 0 0 0 0 0 0 0 0 0 + 25.9260 11.0670 20.2530 C 0 0 0 0 0 0 0 0 0 0 0 0 + 25.8770 11.8420 17.9690 C 0 0 0 0 0 0 0 0 0 0 0 0 + 28.0300 12.0720 19.2730 C 0 0 0 0 0 0 0 0 0 0 0 0 + 24.5820 10.6900 20.1310 C 0 0 0 0 0 0 0 0 0 0 0 0 + 24.5420 11.4720 17.8340 C 0 0 0 0 0 0 0 0 0 0 0 0 + 26.4990 12.4120 16.8870 O 0 0 0 0 0 0 0 0 0 0 0 0 + 28.9860 10.8940 19.5000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 23.8950 10.8910 18.9250 C 0 0 0 0 0 0 0 0 0 0 0 0 + 23.8700 10.0590 21.2980 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.8110 11.0000 21.8820 C 0 0 0 0 0 0 0 0 0 0 0 0 + 21.6380 10.2010 22.3970 N 0 0 0 0 0 0 0 0 0 0 0 0 + 2 1 2 0 + 3 1 1 0 + 4 1 1 0 + 5 2 1 0 + 6 3 2 0 + 7 3 1 0 + 8 4 1 0 + 9 5 2 0 + 9 6 1 0 + 10 5 1 0 + 11 10 1 0 + 12 11 1 0 +M END +$$$$ + + RDKit 3D + + 16 17 0 0 0 0 0 0 0 0999 V2000 + 26.3090 11.5670 19.1200 C 0 0 0 0 0 0 0 0 0 0 0 0 + 27.7750 11.8580 19.3620 C 0 0 1 0 0 0 0 0 0 0 0 0 + 25.5460 10.8930 20.0800 C 0 0 0 0 0 0 0 0 0 0 0 0 + 25.6820 11.9660 17.9260 C 0 0 0 0 0 0 0 0 0 0 0 0 + 27.9150 13.1100 20.2510 C 0 0 0 0 0 0 0 0 0 0 0 0 + 28.4910 10.6030 19.9180 C 0 0 0 0 0 0 0 0 0 0 0 0 + 24.1900 10.6200 19.8540 C 0 0 0 0 0 0 0 0 0 0 0 0 + 24.3290 11.7060 17.6830 C 0 0 0 0 0 0 0 0 0 0 0 0 + 26.3920 12.6330 16.9610 O 0 0 0 0 0 0 0 0 0 0 0 0 + 29.3630 13.3270 20.6990 C 0 0 0 0 0 0 0 0 0 0 0 0 + 29.8080 10.8590 20.6700 C 0 0 0 0 0 0 0 0 0 0 0 0 + 23.5890 11.0260 18.6540 C 0 0 0 0 0 0 0 0 0 0 0 0 + 23.3960 9.8840 20.9090 C 0 0 0 0 0 0 0 0 0 0 0 0 + 29.7810 12.1210 21.5440 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.0220 10.5180 21.1760 C 0 0 0 0 0 0 0 0 0 0 0 0 + 21.2950 9.8120 22.2580 N 0 0 0 0 0 0 0 0 0 0 0 0 + 2 1 1 1 + 3 1 2 0 + 4 1 1 0 + 5 2 1 0 + 6 2 1 0 + 7 3 1 0 + 8 4 2 0 + 9 4 1 0 + 10 5 1 0 + 11 6 1 0 + 12 7 2 0 + 12 8 1 0 + 13 7 1 0 + 14 11 1 0 + 14 10 1 0 + 15 13 1 0 + 16 15 1 0 +M END +$$$$ + + RDKit 3D + + 11 11 0 0 0 0 0 0 0 0999 V2000 + 22.7740 12.1470 21.7380 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.7850 10.8240 21.5130 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.6560 12.6100 23.1270 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.6870 9.8820 22.6510 N 0 0 0 0 0 0 0 0 0 0 0 0 + 22.5650 11.6780 24.1480 N 0 0 0 0 0 0 0 0 0 0 0 0 + 22.5850 10.3170 23.8760 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.4960 9.4180 24.9130 N 0 0 0 0 0 0 0 0 0 0 0 0 + 22.9020 10.2670 20.1120 C 0 0 0 0 0 0 0 0 0 0 0 0 + 24.2600 10.6130 19.4990 C 0 0 0 0 0 0 0 0 0 0 0 0 + 24.3490 10.0260 18.0880 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.6380 13.7910 23.3840 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2 1 2 0 + 3 1 1 0 + 4 2 1 0 + 5 3 1 0 + 6 4 2 0 + 6 5 1 0 + 7 6 1 0 + 8 2 1 0 + 9 8 1 0 + 10 9 1 0 + 11 3 2 0 +M END +$$$$ + + RDKit 3D + + 16 18 0 0 0 0 0 0 0 0999 V2000 + 19.9510 12.4320 19.9980 C 0 0 0 0 0 0 0 0 0 0 0 0 + 20.0820 11.0800 19.7160 C 0 0 0 0 0 0 0 0 0 0 0 0 + 20.2110 12.9210 21.2780 C 0 0 0 0 0 0 0 0 0 0 0 0 + 20.4730 10.2080 20.7160 C 0 0 0 0 0 0 0 0 0 0 0 0 + 20.6070 12.0470 22.2840 C 0 0 0 0 0 0 0 0 0 0 0 0 + 20.7310 10.6920 21.9840 C 0 0 0 0 0 0 0 0 0 0 0 0 + 20.8690 12.5020 23.5750 N 0 0 0 0 0 0 0 0 0 0 0 0 + 21.1210 9.8120 22.9630 N 0 0 0 0 0 0 0 0 0 0 0 0 + 21.2630 11.6100 24.5730 C 0 0 0 0 0 0 0 0 0 0 0 0 + 21.3860 10.2600 24.2390 C 0 0 0 0 0 0 0 0 0 0 0 0 + 21.5170 12.0970 25.8880 N 0 0 0 0 0 0 0 0 0 0 0 0 + 21.7700 9.2670 25.1440 N 0 0 0 0 0 0 0 0 0 0 0 0 + 20.6720 13.9160 27.1880 C 0 0 0 0 0 0 0 0 0 0 0 0 + 20.3000 12.6550 27.9160 C 0 0 0 0 0 0 0 0 0 0 0 0 + 21.7880 13.5100 26.2340 C 0 0 0 0 0 0 0 0 0 0 0 0 + 20.8880 11.5200 27.1000 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2 1 2 0 + 3 1 1 0 + 4 2 1 0 + 5 3 2 0 + 6 4 2 0 + 6 5 1 0 + 7 5 1 0 + 8 6 1 0 + 9 7 2 0 + 10 8 2 0 + 10 9 1 0 + 11 9 1 0 + 12 10 1 0 + 14 13 1 0 + 15 13 1 0 + 15 11 1 0 + 16 11 1 0 + 16 14 1 0 +M END +$$$$ + + RDKit 3D + + 22 25 0 0 0 0 0 0 0 0999 V2000 + 24.9160 11.0760 18.2400 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.3310 13.0460 22.3540 N 0 0 0 0 0 0 0 0 0 0 0 0 + 23.6000 11.5170 18.1200 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.6100 11.1450 23.7870 N 0 0 0 0 0 0 0 0 0 0 0 0 + 22.7140 11.3770 19.1920 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.4280 9.4120 22.3750 N 0 0 0 0 0 0 0 0 0 0 0 0 + 23.1210 10.7880 20.4100 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.7070 8.9480 24.6890 N 0 0 0 0 0 0 0 0 0 0 0 0 + 24.4530 10.3520 20.5060 C 0 0 0 0 0 0 0 0 0 0 0 0 + 25.3350 10.4940 19.4320 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.1050 10.6670 21.5590 C 0 0 2 0 0 0 0 0 0 0 0 0 + 22.2560 11.7850 22.6300 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.7070 13.9200 23.4860 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.4360 13.2790 24.8580 C 0 0 0 0 0 0 0 0 0 0 0 0 + 23.1080 11.9120 24.9130 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.5860 9.7850 23.6220 C 0 0 0 0 0 0 0 0 0 0 0 0 + 20.6480 10.5560 21.0790 C 0 0 0 0 0 0 0 0 0 0 0 0 + 20.2500 9.4650 20.2890 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.9360 9.3320 19.8430 C 0 0 0 0 0 0 0 0 0 0 0 0 + 17.9950 10.2990 20.1770 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.3670 11.3850 20.9630 C 0 0 0 0 0 0 0 0 0 0 0 0 + 19.6840 11.5160 21.4080 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3 1 2 0 + 5 3 1 0 + 7 5 2 0 + 9 7 1 0 + 10 9 2 0 + 10 1 1 0 + 11 7 1 6 + 11 6 1 0 + 12 11 1 0 + 12 4 1 0 + 12 2 2 0 + 13 2 1 0 + 14 13 1 0 + 15 14 1 0 + 15 4 1 0 + 16 8 1 0 + 16 6 2 0 + 16 4 1 0 + 17 11 1 0 + 18 17 2 0 + 19 18 1 0 + 20 19 2 0 + 21 20 1 0 + 22 17 1 0 + 22 21 2 0 +M END +$$$$ + + RDKit 3D + + 17 17 0 0 0 0 0 0 0 0999 V2000 + 23.0570 13.6990 19.0590 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 24.3800 11.5110 19.9730 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.3810 9.0730 24.4570 N 0 0 0 0 0 0 0 0 0 0 0 0 + 25.4910 12.0840 19.3370 O 0 0 0 0 0 0 0 0 0 0 0 0 + 20.3420 10.7790 23.4160 S 0 0 0 0 0 0 0 0 0 0 0 0 + 24.4650 10.2680 20.6830 C 0 0 0 0 0 0 0 0 0 0 0 0 + 21.7190 11.1360 25.5420 N 0 0 0 0 0 0 0 0 0 0 0 0 + 23.3180 9.7250 21.3300 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.0710 10.4120 21.2730 C 0 0 0 0 0 0 0 0 0 0 0 0 + 21.9780 11.6500 20.5700 C 0 0 0 0 0 0 0 0 0 0 0 0 + 23.1280 12.1890 19.9260 C 0 0 0 0 0 0 0 0 0 0 0 0 + 26.6060 11.2010 19.1770 C 0 0 0 0 0 0 0 0 0 0 0 0 + 27.7570 11.6720 20.0630 C 0 0 0 0 0 0 0 0 0 0 0 0 + 28.5900 10.5000 20.5480 C 0 0 0 0 0 0 0 0 0 0 0 0 + 29.4190 10.8450 21.7890 C 0 0 0 0 0 0 0 0 0 0 0 0 + 20.8490 9.8150 21.9440 C 0 0 0 0 0 0 0 0 0 0 0 0 + 21.5960 10.2440 24.5410 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4 2 1 0 + 6 2 2 0 + 8 6 1 0 + 9 8 2 0 + 10 9 1 0 + 11 10 2 0 + 11 2 1 0 + 11 1 1 0 + 12 4 1 0 + 13 12 1 0 + 14 13 1 0 + 15 14 1 0 + 16 5 1 0 + 16 9 1 0 + 17 5 1 0 + 17 7 1 0 + 17 3 2 0 +M END +$$$$ + + RDKit 3D + + 16 17 0 0 0 0 0 0 0 0999 V2000 + 20.7710 13.9090 17.3950 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 21.5990 12.4190 25.6060 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.0370 11.1510 25.4210 N 0 0 0 0 0 0 0 0 0 0 0 0 + 21.8530 10.4770 24.2500 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.3090 9.2030 24.1450 N 0 0 0 0 0 0 0 0 0 0 0 0 + 21.1930 11.0810 23.1610 C 0 0 0 0 0 0 0 0 0 0 0 0 + 20.7230 12.4090 23.3300 C 0 0 0 0 0 0 0 0 0 0 0 0 + 20.9220 13.0940 24.5570 C 0 0 0 0 0 0 0 0 0 0 0 0 + 20.9870 10.3560 21.8360 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.3000 10.3030 20.9850 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.5580 11.6070 20.2350 C 0 0 0 0 0 0 0 0 0 0 0 0 + 23.7250 12.3660 20.5390 C 0 0 0 0 0 0 0 0 0 0 0 0 + 23.9740 13.5980 19.8680 C 0 0 0 0 0 0 0 0 0 0 0 0 + 23.0570 14.0730 18.8890 C 0 0 0 0 0 0 0 0 0 0 0 0 + 21.8900 13.3170 18.5790 C 0 0 0 0 0 0 0 0 0 0 0 0 + 21.6410 12.0820 19.2490 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3 2 2 0 + 4 3 1 0 + 5 4 1 0 + 6 4 2 0 + 7 6 1 0 + 8 7 2 0 + 8 2 1 0 + 9 6 1 0 + 10 9 1 0 + 11 10 1 0 + 12 11 2 0 + 13 12 1 0 + 14 13 2 0 + 15 1 1 0 + 15 14 1 0 + 16 15 2 0 + 16 11 1 0 +M END +$$$$ + + RDKit 3D + + 17 18 0 0 0 0 0 0 0 0999 V2000 + 25.3290 10.4220 19.4450 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 21.8630 10.2850 24.5540 C 0 0 0 0 0 0 0 0 0 0 0 0 + 21.7910 10.8780 25.7630 N 0 0 0 0 0 0 0 0 0 0 0 0 + 19.3810 12.4340 23.7140 O 0 0 0 0 0 0 0 0 0 0 0 0 + 20.2730 11.7550 24.2280 C 0 0 0 0 0 0 0 0 0 0 0 0 + 20.9910 10.7760 23.6530 N 0 0 0 0 0 0 0 0 0 0 0 0 + 20.7520 11.8870 25.6690 C 0 0 1 0 0 0 0 0 0 0 0 0 + 22.7100 9.3050 24.2610 N 0 0 0 0 0 0 0 0 0 0 0 0 + 19.5480 11.5280 26.5490 C 0 0 0 0 0 0 0 0 0 0 0 0 + 21.3220 13.3140 25.8640 C 0 0 0 0 0 0 0 0 0 0 0 0 + 20.8570 10.3260 22.2690 C 0 0 0 0 0 0 0 0 0 0 0 0 + 21.8180 11.0860 21.3800 C 0 0 0 0 0 0 0 0 0 0 0 0 + 21.5520 12.4460 21.0380 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.4570 13.1680 20.2040 C 0 0 0 0 0 0 0 0 0 0 0 0 + 23.6300 12.5320 19.7130 C 0 0 0 0 0 0 0 0 0 0 0 0 + 23.9010 11.1800 20.0500 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.9980 10.4540 20.8840 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3 2 1 0 + 5 4 2 0 + 6 5 1 0 + 6 2 1 0 + 7 3 1 0 + 7 5 1 0 + 8 2 2 0 + 7 9 1 1 + 10 7 1 0 + 11 6 1 0 + 12 11 1 0 + 13 12 2 0 + 14 13 1 0 + 15 14 2 0 + 16 1 1 0 + 16 15 1 0 + 17 16 2 0 + 17 12 1 0 +M END +$$$$ + + RDKit 3D + + 20 21 0 0 0 0 0 0 0 0999 V2000 + 18.0360 15.1780 25.0870 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 22.1580 9.9560 23.5460 C 0 0 0 0 0 0 0 0 0 0 0 0 + 21.7380 9.4450 22.3670 N 0 0 0 0 0 0 0 0 0 0 0 0 + 21.3070 12.9370 22.1820 O 0 0 0 0 0 0 0 0 0 0 0 0 + 21.5180 11.7630 22.4850 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.0160 11.2920 23.6430 N 0 0 0 0 0 0 0 0 0 0 0 0 + 21.2400 10.5640 21.5800 C 0 0 1 0 0 0 0 0 0 0 0 0 + 22.6590 9.2240 24.5370 N 0 0 0 0 0 0 0 0 0 0 0 0 + 22.0010 10.7000 20.2550 C 0 0 0 0 0 0 0 0 0 0 0 0 + 19.7110 10.4760 21.4070 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.3150 12.0980 24.8270 C 0 0 0 0 0 0 0 0 0 0 0 0 + 21.0470 12.4840 25.5530 C 0 0 0 0 0 0 0 0 0 0 0 0 + 20.6470 11.7740 26.7230 C 0 0 0 0 0 0 0 0 0 0 0 0 + 19.4310 12.1180 27.3830 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.6170 13.1760 26.8780 C 0 0 0 0 0 0 0 0 0 0 0 0 + 19.0220 13.8920 25.7120 C 0 0 0 0 0 0 0 0 0 0 0 0 + 20.2380 13.5470 25.0530 C 0 0 0 0 0 0 0 0 0 0 0 0 + 24.3110 9.9210 20.9010 C 0 0 0 0 0 0 0 0 0 0 0 0 + 24.0210 11.7480 19.1870 C 0 0 0 0 0 0 0 0 0 0 0 0 + 23.4670 11.0980 20.4450 C 0 0 1 0 0 0 0 0 0 0 0 0 + 3 2 1 0 + 5 4 2 0 + 6 5 1 0 + 6 2 1 0 + 7 3 1 0 + 7 5 1 0 + 8 2 2 0 + 9 7 1 0 + 7 10 1 6 + 11 6 1 0 + 12 11 1 0 + 13 12 2 0 + 14 13 1 0 + 15 14 2 0 + 16 15 1 0 + 16 1 1 0 + 17 16 2 0 + 17 12 1 0 + 20 18 1 6 + 20 9 1 0 + 20 19 1 0 +M END +$$$$ + + RDKit 3D + + 15 16 0 0 0 0 0 0 0 0999 V2000 + 18.6370 11.5460 19.0470 Cl 0 0 0 0 0 0 0 0 0 0 0 0 + 19.3410 11.4910 20.6100 C 0 0 0 0 0 0 0 0 0 0 0 0 + 19.1300 12.5410 21.5090 C 0 0 0 0 0 0 0 0 0 0 0 0 + 20.1120 10.3920 20.9640 C 0 0 0 0 0 0 0 0 0 0 0 0 + 19.7080 12.5060 22.7780 C 0 0 0 0 0 0 0 0 0 0 0 0 + 20.6710 10.3800 22.2200 C 0 0 0 0 0 0 0 0 0 0 0 0 + 20.4820 11.4070 23.1080 C 0 0 0 0 0 0 0 0 0 0 0 0 + 21.4530 9.4460 22.7560 N 0 0 0 0 0 0 0 0 0 0 0 0 + 21.7320 9.9040 23.9840 C 0 0 0 0 0 0 0 0 0 0 0 0 + 21.1510 11.1000 24.2190 N 0 0 0 0 0 0 0 0 0 0 0 0 + 22.5310 9.1910 24.8790 N 0 0 0 0 0 0 0 0 0 0 0 0 + 21.2170 11.9110 25.4550 C 0 0 0 0 0 0 0 0 0 0 0 0 + 20.4620 11.2450 26.6090 C 0 0 0 0 0 0 0 0 0 0 0 0 + 21.0350 11.5770 27.9760 C 0 0 0 0 0 0 0 0 0 0 0 0 + 20.9480 12.9640 28.2400 O 0 0 0 0 0 0 0 0 0 0 0 0 + 2 1 1 0 + 3 2 2 0 + 4 2 1 0 + 5 3 1 0 + 6 4 2 0 + 7 6 1 0 + 7 5 2 0 + 8 6 1 0 + 9 8 2 0 + 10 9 1 0 + 10 7 1 0 + 11 9 1 0 + 12 10 1 0 + 13 12 1 0 + 14 13 1 0 + 15 14 1 0 +M END +$$$$ + + RDKit 3D + + 16 18 0 0 0 0 0 0 0 0999 V2000 + 20.6710 12.3670 19.5500 C 0 0 0 0 0 0 0 0 0 0 0 0 + 20.3560 11.0080 19.5110 C 0 0 0 0 0 0 0 0 0 0 0 0 + 20.7970 10.1550 20.5260 C 0 0 0 0 0 0 0 0 0 0 0 0 + 21.5490 10.6510 21.5910 C 0 0 0 0 0 0 0 0 0 0 0 0 + 21.8550 12.0130 21.6470 C 0 0 0 0 0 0 0 0 0 0 0 0 + 21.4090 12.8650 20.6370 C 0 0 0 0 0 0 0 0 0 0 0 0 + 20.2040 13.2140 18.5400 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.9460 13.0790 18.0310 C 0 0 0 0 0 0 0 0 0 0 0 0 + 19.8500 14.9600 16.8550 S 0 0 0 0 0 0 0 0 0 0 0 0 + 20.8860 14.2450 18.0080 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.5460 13.9340 17.0770 C 0 0 0 0 0 0 0 0 0 0 0 0 + 21.9520 9.8170 22.5630 N 0 0 0 0 0 0 0 0 0 0 0 0 + 22.6670 10.2610 23.6190 C 0 0 0 0 0 0 0 0 0 0 0 0 + 23.0100 11.6160 23.7210 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.5970 12.5050 22.7210 C 0 0 0 0 0 0 0 0 0 0 0 0 + 23.0640 9.3990 24.5550 N 0 0 0 0 0 0 0 0 0 0 0 0 + 2 1 2 0 + 3 2 1 0 + 4 3 2 0 + 5 4 1 0 + 6 1 1 0 + 6 5 2 0 + 7 1 1 0 + 8 7 1 0 + 10 9 1 0 + 10 7 2 0 + 11 9 1 0 + 11 8 2 0 + 12 4 1 0 + 13 12 2 0 + 14 13 1 0 + 15 5 1 0 + 15 14 2 0 + 16 13 1 0 +M END +$$$$ + + RDKit 3D + + 14 16 0 0 0 0 0 0 0 0999 V2000 + 22.5850 11.1260 22.4670 C 0 0 1 0 0 0 0 0 0 0 0 0 + 22.4650 13.2910 21.5170 N 0 0 0 0 0 0 0 0 0 0 0 0 + 21.5180 12.9300 23.6420 O 0 0 0 0 0 0 0 0 0 0 0 0 + 23.1760 11.1930 21.1020 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.7650 9.4680 24.1810 N 0 0 0 0 0 0 0 0 0 0 0 0 + 22.1720 12.5670 22.6700 C 0 0 0 0 0 0 0 0 0 0 0 0 + 21.3450 10.2690 22.4850 C 0 0 0 0 0 0 0 0 0 0 0 0 + 23.5010 10.6150 23.5600 C 0 0 0 0 0 0 0 0 0 0 0 0 + 23.0740 12.4520 20.5910 C 0 0 0 0 0 0 0 0 0 0 0 0 + 23.7590 10.2030 20.3680 C 0 0 0 0 0 0 0 0 0 0 0 0 + 21.3310 9.5780 23.8310 C 0 0 0 0 0 0 0 0 0 0 0 0 + 23.5150 12.7690 19.3280 C 0 0 0 0 0 0 0 0 0 0 0 0 + 24.2170 10.4950 19.0970 C 0 0 0 0 0 0 0 0 0 0 0 0 + 24.1050 11.7710 18.5900 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4 1 1 0 + 6 3 2 0 + 6 2 1 0 + 6 1 1 0 + 1 7 1 6 + 8 5 1 0 + 8 1 1 0 + 9 4 2 0 + 9 2 1 0 + 10 4 1 0 + 11 7 1 0 + 11 5 1 0 + 12 9 1 0 + 13 10 2 0 + 14 13 1 0 + 14 12 2 0 +M END +$$$$ + + RDKit 3D + + 18 20 0 0 0 0 0 0 0 0999 V2000 + 23.0640 11.1570 21.0690 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.4100 11.1460 22.4090 C 0 0 1 0 0 0 0 0 0 0 0 0 + 23.7250 10.1530 20.4050 C 0 0 0 0 0 0 0 0 0 0 0 0 + 21.1600 10.2940 22.4950 C 0 0 0 0 0 0 0 0 0 0 0 0 + 24.2690 10.4280 19.1660 C 0 0 0 0 0 0 0 0 0 0 0 0 + 23.5300 12.6970 19.2960 C 0 0 0 0 0 0 0 0 0 0 0 0 + 21.1960 9.6620 23.8710 C 0 0 2 0 0 0 0 0 0 0 0 0 + 24.1850 11.6950 18.6250 C 0 0 0 0 0 0 0 0 0 0 0 0 + 20.4560 10.4360 24.9320 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.6380 9.6050 24.2420 N 0 0 0 0 0 0 0 0 0 0 0 0 + 19.1900 10.7600 24.5760 O 0 0 0 0 0 0 0 0 0 0 0 0 + 20.9280 10.7000 26.0230 O 0 0 0 0 0 0 0 0 0 0 0 0 + 23.3740 10.6570 23.4730 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.0160 12.5960 22.5760 C 0 0 0 0 0 0 0 0 0 0 0 0 + 21.3890 13.0490 23.5280 O 0 0 0 0 0 0 0 0 0 0 0 0 + 22.3330 13.2670 21.4050 N 0 0 0 0 0 0 0 0 0 0 0 0 + 22.9950 12.4010 20.5240 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.6260 11.5710 25.6030 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2 1 1 0 + 3 1 2 0 + 2 4 1 6 + 5 3 1 0 + 7 4 1 0 + 8 5 2 0 + 8 6 1 0 + 7 9 1 1 + 10 7 1 0 + 11 9 1 0 + 12 9 2 0 + 13 10 1 0 + 13 2 1 0 + 14 2 1 0 + 15 14 2 0 + 16 14 1 0 + 17 16 1 0 + 17 6 2 0 + 17 1 1 0 + 18 11 1 0 +M END +$$$$ + + RDKit 3D + + 18 20 0 0 0 0 0 0 0 0999 V2000 + 22.3040 13.8190 23.2020 O 0 0 0 0 0 0 0 0 0 0 0 0 + 22.1100 12.5920 23.0660 C 0 0 0 0 0 0 0 0 0 0 0 0 + 21.6750 9.8630 22.7290 N 0 0 0 0 0 0 0 0 0 0 0 0 + 21.3470 12.1200 21.9960 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.6540 11.6650 23.9910 N 0 0 0 0 0 0 0 0 0 0 0 0 + 21.1410 10.7430 21.8240 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.9440 9.3390 24.6410 N 0 0 0 0 0 0 0 0 0 0 0 0 + 22.4280 10.2710 23.7860 C 0 0 0 0 0 0 0 0 0 0 0 0 + 23.4620 12.1740 25.1070 C 0 0 0 0 0 0 0 0 0 0 0 0 + 20.3110 10.2350 20.6900 C 0 0 2 0 0 0 0 0 0 0 0 0 + 20.9600 10.1290 19.2970 C 0 0 2 0 0 0 0 0 0 0 0 0 + 22.4150 10.4540 19.2140 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.8520 11.5900 18.5210 C 0 0 0 0 0 0 0 0 0 0 0 0 + 24.2190 11.8770 18.4460 C 0 0 0 0 0 0 0 0 0 0 0 0 + 25.1550 11.0300 19.0380 C 0 0 0 0 0 0 0 0 0 0 0 0 + 24.7320 9.8880 19.7220 C 0 0 0 0 0 0 0 0 0 0 0 0 + 23.3660 9.6010 19.7990 C 0 0 0 0 0 0 0 0 0 0 0 0 + 20.0560 11.3180 19.6320 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2 1 2 0 + 4 2 1 0 + 5 2 1 0 + 6 3 1 0 + 6 4 2 0 + 8 3 2 0 + 8 7 1 0 + 8 5 1 0 + 9 5 1 0 + 10 6 1 1 + 11 10 1 0 + 11 12 1 1 + 13 12 2 0 + 14 13 1 0 + 15 14 2 0 + 16 15 1 0 + 17 16 2 0 + 17 12 1 0 + 18 11 1 0 + 18 10 1 0 +M END +$$$$ + + RDKit 3D + + 18 19 0 0 0 0 0 0 0 0999 V2000 + 21.7710 13.6180 23.3780 O 0 0 0 0 0 0 0 0 0 0 0 0 + 20.4480 9.9120 20.6830 C 0 0 0 0 0 0 0 0 0 0 0 0 + 21.9580 9.7750 22.5930 N 0 0 0 0 0 0 0 0 0 0 0 0 + 21.4410 10.6590 21.5600 C 0 0 2 0 0 0 0 0 0 0 0 0 + 22.8560 9.3660 24.5700 N 0 0 0 0 0 0 0 0 0 0 0 0 + 22.4110 10.2380 23.6760 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.4690 11.5700 23.9630 N 0 0 0 0 0 0 0 0 0 0 0 0 + 23.3020 12.1300 25.0250 C 0 0 0 0 0 0 0 0 0 0 0 0 + 21.7010 12.4110 23.2450 C 0 0 0 0 0 0 0 0 0 0 0 0 + 20.7420 11.8240 22.2460 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.5740 11.2210 20.6840 C 0 0 0 0 0 0 0 0 0 0 0 0 + 23.6120 10.1510 20.3330 C 0 0 0 0 0 0 0 0 0 0 0 0 + 24.8600 10.7440 19.7070 C 0 0 0 0 0 0 0 0 0 0 0 0 + 26.0870 10.6220 20.3550 C 0 0 0 0 0 0 0 0 0 0 0 0 + 27.2630 11.1540 19.8110 C 0 0 0 0 0 0 0 0 0 0 0 0 + 27.2020 11.8150 18.5900 C 0 0 0 0 0 0 0 0 0 0 0 0 + 25.9830 11.9410 17.9220 C 0 0 0 0 0 0 0 0 0 0 0 0 + 24.8150 11.4010 18.4810 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4 2 1 6 + 4 3 1 0 + 6 5 1 0 + 6 3 2 0 + 7 6 1 0 + 8 7 1 0 + 9 1 2 0 + 9 7 1 0 + 10 4 1 0 + 10 9 1 0 + 11 4 1 0 + 12 11 1 0 + 13 12 1 0 + 14 13 2 0 + 15 14 1 0 + 16 15 2 0 + 17 16 1 0 + 18 13 1 0 + 18 17 2 0 +M END +$$$$ + + RDKit 3D + + 19 21 0 0 0 0 0 0 0 0999 V2000 + 22.0940 13.5060 22.6730 O 0 0 0 0 0 0 0 0 0 0 0 0 + 20.3830 9.5620 20.6190 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.1270 9.6730 22.3260 N 0 0 0 0 0 0 0 0 0 0 0 0 + 21.4940 10.3980 21.2350 C 0 0 2 0 0 0 0 0 0 0 0 0 + 22.6380 9.3820 24.4820 N 0 0 0 0 0 0 0 0 0 0 0 0 + 22.3980 10.1870 23.4480 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.5000 11.5100 23.6070 N 0 0 0 0 0 0 0 0 0 0 0 0 + 23.2840 12.0670 24.7040 C 0 0 0 0 0 0 0 0 0 0 0 0 + 21.8820 12.3070 22.7230 C 0 0 0 0 0 0 0 0 0 0 0 0 + 20.9130 11.7030 21.7420 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.5070 10.7290 20.1430 C 0 0 1 0 0 0 0 0 0 0 0 0 + 23.9330 10.4550 20.6120 C 0 0 1 0 0 0 0 0 0 0 0 0 + 23.2540 9.4980 19.6400 C 0 0 0 0 0 0 0 0 0 0 0 0 + 24.8290 11.4040 19.9200 C 0 0 0 0 0 0 0 0 0 0 0 0 + 24.8820 11.4350 18.5320 C 0 0 0 0 0 0 0 0 0 0 0 0 + 25.7300 12.3320 17.8960 C 0 0 0 0 0 0 0 0 0 0 0 0 + 26.5150 13.2000 18.6430 C 0 0 0 0 0 0 0 0 0 0 0 0 + 26.4580 13.1710 20.0290 C 0 0 0 0 0 0 0 0 0 0 0 0 + 25.6130 12.2730 20.6690 C 0 0 0 0 0 0 0 0 0 0 0 0 + 4 2 1 6 + 4 3 1 0 + 6 5 1 0 + 6 3 2 0 + 7 6 1 0 + 8 7 1 0 + 9 7 1 0 + 9 1 2 0 + 10 4 1 0 + 10 9 1 0 + 11 4 1 0 + 12 11 1 0 + 13 12 1 0 + 11 13 1 6 + 12 14 1 6 + 15 14 2 0 + 16 15 1 0 + 17 16 2 0 + 18 17 1 0 + 19 18 2 0 + 19 14 1 0 +M END +$$$$ + + RDKit 3D + + 16 17 0 0 0 0 0 0 0 0999 V2000 + 21.3640 10.5720 21.8100 C 0 0 1 0 0 0 0 0 0 0 0 0 + 22.5260 10.7940 20.8840 C 0 0 0 0 0 0 0 0 0 0 0 0 + 21.7650 9.7570 22.9510 N 0 0 0 0 0 0 0 0 0 0 0 0 + 20.8520 11.9280 22.2760 C 0 0 0 0 0 0 0 0 0 0 0 0 + 20.2790 9.8280 21.0370 C 0 0 0 0 0 0 0 0 0 0 0 0 + 23.8090 10.3570 21.2290 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.3130 11.4350 19.6600 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.4050 10.1940 23.9570 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.0020 12.7140 22.8990 C 0 0 0 0 0 0 0 0 0 0 0 0 + 24.8880 10.5560 20.3660 C 0 0 0 0 0 0 0 0 0 0 0 0 + 23.3940 11.6280 18.7960 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.6430 11.8420 24.2920 S 0 0 0 0 0 0 0 0 0 0 0 0 + 22.9320 9.2680 24.7800 N 0 0 0 0 0 0 0 0 0 0 0 0 + 24.6750 11.1950 19.1430 C 0 0 0 0 0 0 0 0 0 0 0 0 + 25.7040 11.4130 18.2580 O 0 0 0 0 0 0 0 0 0 0 0 0 + 27.1050 11.3380 18.6380 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2 1 1 0 + 3 1 1 0 + 4 1 1 0 + 1 5 1 6 + 6 2 2 0 + 7 2 1 0 + 8 3 2 0 + 9 4 1 0 + 10 6 1 0 + 11 7 2 0 + 12 8 1 0 + 12 9 1 0 + 13 8 1 0 + 14 10 2 0 + 14 11 1 0 + 15 14 1 0 + 16 15 1 0 +M END +$$$$ + + RDKit 3D + + 20 22 0 0 0 0 0 0 0 0999 V2000 + 21.9670 12.1590 22.5710 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.0870 9.7810 22.3570 N 0 0 0 0 0 0 0 0 0 0 0 0 + 21.7990 13.3470 22.3700 O 0 0 0 0 0 0 0 0 0 0 0 0 + 21.7250 10.9910 21.5730 C 0 0 1 0 0 0 0 0 0 0 0 0 + 22.4050 11.6040 23.7520 N 0 0 0 0 0 0 0 0 0 0 0 0 + 22.4510 10.1860 23.5940 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.8260 9.3810 24.5860 N 0 0 0 0 0 0 0 0 0 0 0 0 + 22.7290 12.3950 24.9450 C 0 0 0 0 0 0 0 0 0 0 0 0 + 20.2460 10.8230 21.1770 C 0 0 0 0 0 0 0 0 0 0 0 0 + 19.8630 9.8830 20.2250 C 0 0 0 0 0 0 0 0 0 0 0 0 + 18.5290 9.7390 19.8610 C 0 0 0 0 0 0 0 0 0 0 0 0 + 17.5600 10.5330 20.4430 C 0 0 0 0 0 0 0 0 0 0 0 0 + 17.9210 11.4590 21.3960 C 0 0 0 0 0 0 0 0 0 0 0 0 + 19.2540 11.6030 21.7650 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.6070 11.2230 20.3330 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.4200 12.3320 19.5090 C 0 0 0 0 0 0 0 0 0 0 0 0 + 23.2410 12.5470 18.4040 C 0 0 0 0 0 0 0 0 0 0 0 0 + 24.2630 11.6640 18.1130 C 0 0 0 0 0 0 0 0 0 0 0 0 + 24.4610 10.5600 18.9190 C 0 0 0 0 0 0 0 0 0 0 0 0 + 23.6360 10.3370 20.0200 C 0 0 0 0 0 0 0 0 0 0 0 0 + 3 1 2 0 + 4 2 1 0 + 4 1 1 0 + 5 1 1 0 + 6 2 1 0 + 6 5 1 0 + 7 6 2 0 + 8 5 1 0 + 4 9 1 6 + 10 9 2 0 + 11 10 1 0 + 12 11 2 0 + 13 12 1 0 + 14 9 1 0 + 14 13 2 0 + 15 4 1 0 + 16 15 2 0 + 17 16 1 0 + 18 17 2 0 + 19 18 1 0 + 20 19 2 0 + 20 15 1 0 +M END +$$$$ + + RDKit 3D + + 8 8 0 0 0 0 0 0 0 0999 V2000 + 43.2120 1.2010 21.1900 N 0 0 0 0 0 0 0 0 0 0 0 0 + 42.0970 1.7030 22.0340 C 0 0 2 0 0 0 0 0 0 0 0 0 + 41.2120 2.6840 21.2450 C 0 0 0 0 0 0 0 0 0 0 0 0 + 41.4260 2.9540 20.0390 O 0 0 0 0 0 0 0 0 0 0 0 0 + 42.6930 2.1910 23.3430 C 0 0 0 0 0 0 0 0 0 0 0 0 + 44.2130 1.9390 23.2340 C 0 0 0 0 0 0 0 0 0 0 0 0 + 44.4930 1.6950 21.7590 C 0 0 0 0 0 0 0 0 0 0 0 0 + 40.1570 3.2440 21.9570 N 0 0 0 0 0 0 0 0 0 0 0 0 + 2 1 1 0 + 2 3 1 6 + 4 3 2 0 + 5 2 1 0 + 6 5 1 0 + 7 1 1 0 + 7 6 1 0 + 8 3 1 0 +M END +$$$$ + + RDKit 3D + + 22 25 0 0 0 0 0 0 0 0999 V2000 + 23.9890 11.5960 18.4360 C 0 0 0 0 0 0 0 0 0 0 0 0 + 25.3210 11.4640 18.7840 C 0 0 0 0 0 0 0 0 0 0 0 0 + 25.6630 11.0960 20.0820 C 0 0 0 0 0 0 0 0 0 0 0 0 + 24.6490 10.8840 21.0220 C 0 0 0 0 0 0 0 0 0 0 0 0 + 23.3190 11.0270 20.6770 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.9880 11.3810 19.3750 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.2440 10.8070 21.7330 C 0 0 2 0 0 0 0 0 0 0 0 0 + 20.8520 10.8680 21.1250 C 0 0 0 0 0 0 0 0 0 0 0 0 + 19.8540 10.6460 22.2900 C 0 0 0 0 0 0 0 0 0 0 0 0 + 20.0450 11.6270 23.3000 O 0 0 0 0 0 0 0 0 0 0 0 0 + 20.9870 12.6610 22.9460 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.3270 11.9770 22.7910 C 0 0 1 0 0 0 0 0 0 0 0 0 + 22.7770 11.3400 23.9760 O 0 0 0 0 0 0 0 0 0 0 0 0 + 22.7260 10.0020 23.7830 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.4730 9.6360 22.5540 N 0 0 0 0 0 0 0 0 0 0 0 0 + 22.9310 9.1250 24.7980 N 0 0 0 0 0 0 0 0 0 0 0 0 + 27.0780 10.9870 20.5190 C 0 0 0 0 0 0 0 0 0 0 0 0 + 27.5170 9.9760 21.3750 C 0 0 0 0 0 0 0 0 0 0 0 0 + 28.7840 9.9640 21.7630 N 0 0 0 0 0 0 0 0 0 0 0 0 + 29.6370 10.8810 21.3400 C 0 0 0 0 0 0 0 0 0 0 0 0 + 29.2680 11.8600 20.5370 N 0 0 0 0 0 0 0 0 0 0 0 0 + 28.0170 11.9450 20.1110 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2 1 2 0 + 3 2 1 0 + 4 3 2 0 + 5 4 1 0 + 6 5 2 0 + 6 1 1 0 + 7 5 1 6 + 8 7 1 0 + 9 8 1 0 + 10 9 1 0 + 11 10 1 0 + 12 11 1 1 + 12 7 1 0 + 13 12 1 0 + 14 13 1 0 + 15 7 1 0 + 15 14 2 0 + 16 14 1 0 + 17 3 1 0 + 18 17 2 0 + 19 18 1 0 + 20 19 2 0 + 21 20 1 0 + 22 17 1 0 + 22 21 2 0 +M END +$$$$ + + RDKit 3D + + 19 21 0 0 0 0 0 0 0 0999 V2000 + 18.6790 10.8940 21.5160 C 0 0 0 0 0 0 0 0 0 0 0 0 + 21.8760 9.6220 22.6190 N 0 0 0 0 0 0 0 0 0 0 0 0 + 19.3450 9.6270 21.1760 O 0 0 0 0 0 0 0 0 0 0 0 0 + 22.4790 11.8080 24.2920 S 0 0 0 0 0 0 0 0 0 0 0 0 + 19.5140 11.7630 22.5130 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.7100 9.2150 24.7670 N 0 0 0 0 0 0 0 0 0 0 0 0 + 20.5550 9.7530 20.5440 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.8590 10.7120 20.6250 C 0 0 0 0 0 0 0 0 0 0 0 0 + 24.1020 10.1890 21.0270 C 0 0 0 0 0 0 0 0 0 0 0 0 + 25.2620 10.3730 20.2980 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.8630 11.5080 19.3970 C 0 0 0 0 0 0 0 0 0 0 0 0 + 21.5800 10.5280 21.4490 C 0 0 2 0 0 0 0 0 0 0 0 0 + 20.9500 11.9060 21.9290 C 0 0 2 0 0 0 0 0 0 0 0 0 + 21.9600 12.7150 22.7910 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.3230 10.0930 23.7780 C 0 0 0 0 0 0 0 0 0 0 0 0 + 24.0040 11.6730 18.6170 C 0 0 0 0 0 0 0 0 0 0 0 0 + 25.2010 11.1170 19.0930 C 0 0 0 0 0 0 0 0 0 0 0 0 + 21.7570 12.0240 18.8700 F 0 0 0 0 0 0 0 0 0 0 0 0 + 26.3200 11.2980 18.4090 F 0 0 0 0 0 0 0 0 0 0 0 0 + 3 1 1 0 + 5 1 1 0 + 7 3 1 0 + 9 8 2 0 + 10 9 1 0 + 11 8 1 0 + 12 7 1 0 + 12 8 1 6 + 12 2 1 0 + 13 12 1 0 + 13 5 1 1 + 14 13 1 0 + 14 4 1 0 + 15 6 1 0 + 15 2 2 0 + 15 4 1 0 + 16 11 2 0 + 17 10 2 0 + 17 16 1 0 + 18 11 1 0 + 19 17 1 0 +M END +$$$$ + + RDKit 3D + + 16 17 0 0 0 0 0 0 0 0999 V2000 + 20.6950 9.9560 20.8820 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.2050 9.8930 22.6900 N 0 0 0 0 0 0 0 0 0 0 0 0 + 23.0060 12.0970 24.2220 S 0 0 0 0 0 0 0 0 0 0 0 0 + 21.8910 10.6980 21.5060 C 0 0 2 0 0 0 0 0 0 0 0 0 + 22.8690 9.5480 24.8150 N 0 0 0 0 0 0 0 0 0 0 0 0 + 21.4800 12.1250 21.9040 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.5630 12.8770 22.6580 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.6270 10.3910 23.7940 C 0 0 0 0 0 0 0 0 0 0 0 0 + 23.1060 10.7640 20.5410 C 0 0 0 0 0 0 0 0 0 0 0 0 + 24.3720 10.2320 20.8590 C 0 0 0 0 0 0 0 0 0 0 0 0 + 25.4690 10.3640 20.0140 C 0 0 0 0 0 0 0 0 0 0 0 0 + 25.3420 11.0350 18.7800 C 0 0 0 0 0 0 0 0 0 0 0 0 + 24.1030 11.5640 18.3850 C 0 0 0 0 0 0 0 0 0 0 0 0 + 23.0130 11.4340 19.2760 C 0 0 0 0 0 0 0 0 0 0 0 0 + 21.8840 12.0230 18.8800 F 0 0 0 0 0 0 0 0 0 0 0 0 + 26.4280 11.2380 18.0020 F 0 0 0 0 0 0 0 0 0 0 0 0 + 4 1 1 6 + 4 2 1 0 + 6 4 1 0 + 7 6 1 0 + 7 3 1 0 + 8 5 1 0 + 8 2 2 0 + 8 3 1 0 + 9 4 1 0 + 10 9 2 0 + 11 10 1 0 + 12 11 2 0 + 13 12 1 0 + 14 9 1 0 + 14 13 2 0 + 15 14 1 0 + 16 12 1 0 +M END +$$$$ + + RDKit 3D + + 11 12 0 0 0 0 0 0 0 0999 V2000 + 23.8920 10.9750 19.7100 C 0 0 0 0 0 0 0 0 0 0 0 0 + 23.1430 9.6540 19.8400 C 0 0 0 0 0 0 0 0 0 0 0 0 + 23.7820 11.7530 20.9950 C 0 0 0 0 0 0 0 0 0 0 0 0 + 21.6770 9.8870 20.1680 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.1750 12.7870 22.6090 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.3660 10.1400 23.6660 C 0 0 0 0 0 0 0 0 0 0 0 0 + 22.3180 11.9530 21.3510 C 0 0 2 0 0 0 0 0 0 0 0 0 + 21.5250 10.6490 21.4640 C 0 0 2 0 0 0 0 0 0 0 0 0 + 22.7380 9.3100 24.6900 N 0 0 0 0 0 0 0 0 0 0 0 0 + 21.9210 9.6990 22.5310 N 0 0 0 0 0 0 0 0 0 0 0 0 + 22.5620 11.8400 24.1130 S 0 0 0 0 0 0 0 0 0 0 0 0 + 2 1 1 0 + 3 1 1 0 + 4 2 1 0 + 7 3 1 1 + 7 5 1 0 + 8 4 1 6 + 8 7 1 0 + 9 6 1 0 + 10 8 1 0 + 10 6 2 0 + 11 6 1 0 + 11 5 1 0 +M END +$$$$ + + RDKit 3D + + 18 20 0 0 0 0 0 0 0 0999 V2000 + 28.6970 10.5240 20.4750 C 0 0 0 0 0 0 0 0 0 0 0 0 + 27.9220 11.6800 20.9560 N 0 0 0 0 0 0 0 0 0 0 0 0 + 28.7880 12.6650 21.6350 C 0 0 0 0 0 0 0 0 0 0 0 0 + 27.0810 12.2010 19.9710 C 0 0 0 0 0 0 0 0 0 0 0 0 + 27.4190 13.2930 19.2740 N 0 0 0 0 0 0 0 0 0 0 0 0 + 26.6450 13.8320 18.3200 C 0 0 0 0 0 0 0 0 0 0 0 0 + 25.4810 13.2870 17.9980 N 0 0 0 0 0 0 0 0 0 0 0 0 + 25.0290 12.1840 18.6310 C 0 0 0 0 0 0 0 0 0 0 0 0 + 23.7860 11.6150 18.3040 C 0 0 0 0 0 0 0 0 0 0 0 0 + 23.3430 10.5040 18.9720 C 0 0 0 0 0 0 0 0 0 0 0 0 + 24.1080 9.9180 19.9810 C 0 0 0 0 0 0 0 0 0 0 0 0 + 25.3250 10.4360 20.3200 C 0 0 0 0 0 0 0 0 0 0 0 0 + 25.8200 11.5870 19.6640 C 0 0 0 0 0 0 0 0 0 0 0 0 + 27.1160 14.9710 17.6690 N 0 0 0 0 0 0 0 0 0 0 0 0 + 27.3480 16.1150 18.5710 C 0 0 0 0 0 0 0 0 0 0 0 0 + 27.6660 17.2890 17.6050 C 0 0 0 0 0 0 0 0 0 0 0 0 + 26.8670 16.9430 16.3140 C 0 0 0 0 0 0 0 0 0 0 0 0 + 26.3130 15.5200 16.5590 C 0 0 0 0 0 0 0 0 0 0 0 0 + 2 1 1 0 + 3 2 1 0 + 4 2 1 0 + 5 4 2 0 + 6 5 1 0 + 7 6 2 0 + 8 7 1 0 + 9 8 2 0 + 10 9 1 0 + 11 10 2 0 + 12 11 1 0 + 13 12 2 0 + 13 8 1 0 + 13 4 1 0 + 14 6 1 0 + 15 14 1 0 + 16 15 1 0 + 17 16 1 0 + 18 14 1 0 + 18 17 1 0 +M END +$$$$