public static string RDKit_Smiles(string text,
                                          object isomericSmiles = null, bool kekuleSmiles   = false,
                                          object rootedAtAtom   = null, object canonical    = null,
                                          bool allBondsExplicit = false, bool allHsExplicit = false,
                                          bool doRandom         = false)
        {
            var _isomericSmiles = ExcelDnaUtility.ToBoolean(isomericSmiles, true);
            var _rootedAtAtom   = ExcelDnaUtility.ToInt32(rootedAtAtom, -1);
            var _canonical      = ExcelDnaUtility.ToBoolean(canonical, true);

            if (_isomericSmiles &&
                !kekuleSmiles &&
                _rootedAtAtom == -1 &&
                _canonical &&
                !allBondsExplicit &&
                !allHsExplicit &&
                !doRandom)
            {
                return(RDKit_CalcDesc(text, "RDKit_Smiles", mol => RDKit.Chem.MolToSmiles(mol)));
            }
            {
                ROMol mol;
                if (kekuleSmiles)
                {
                    var _mol = RWMol.MolFromSmiles(text);
                    RDKFuncs.Kekulize(_mol);
                    mol = _mol;
                }
                else
                {
                    mol = Parse(text);
                }
                return(RDKit.Chem.MolToSmiles(mol, _isomericSmiles, kekuleSmiles, _rootedAtAtom, _canonical, allBondsExplicit, allHsExplicit, doRandom));
            }
        }
        public static string RDKit_Smarts(string text, object isomericSmiles = null)
        {
            var _isomericSmiles = ExcelDnaUtility.ToBoolean(isomericSmiles, true);

            if (_isomericSmiles)
            {
                return(RDKit_CalcDesc(text, "RDKit_Smarts", mol => RDKit.Chem.MolToSmarts(mol)));
            }
            return(RDKit.Chem.MolToSmarts(Parse(text), _isomericSmiles));
        }