├── README.md ├── rdsim.py ├── LICENSE ├── rdmin.py ├── applysdfcoordstopdb.py ├── alignmcs.py ├── uffminimize.py ├── flipchiral.py ├── shape.py ├── extractmatch.py ├── extractmatches.py ├── corerxnscaffold.py ├── clustermatches.py ├── rdconf.py ├── rdallconf.py └── pains.py /README.md: -------------------------------------------------------------------------------- 1 | # rdkit-scripts -------------------------------------------------------------------------------- /rdsim.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | import sys,string,argparse 4 | from rdkit.Chem import AllChem as Chem 5 | from optparse import OptionParser 6 | import os, gzip 7 | from rdkit import DataStructs 8 | 9 | parser = argparse.ArgumentParser(description='Compute similarity to query ligand') 10 | parser.add_argument('query',metavar='query ligand') 11 | parser.add_argument('test',metavar='test ligands') 12 | 13 | args = parser.parse_args() 14 | 15 | query = open(args.query).readline().split()[0].replace('$','') 16 | qmol = Chem.MolFromSmiles(query) 17 | qfp = Chem.RDKFingerprint(qmol) 18 | 19 | for line in open(args.test): 20 | try: 21 | smi = line.split()[0].replace('$','') 22 | mol = Chem.MolFromSmiles(smi) 23 | fp = Chem.RDKFingerprint(mol) 24 | print smi,DataStructs.FingerprintSimilarity(qfp,fp) 25 | except: 26 | pass #ignore rdkit errors 27 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2016 David Koes 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /rdmin.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | from rdkit.Chem import AllChem as Chem 3 | import numpy as np 4 | import sys, gzip, re 5 | 6 | rname = sys.argv[1] 7 | lname = sys.argv[2] 8 | rec = Chem.MolFromPDBFile(rname) 9 | 10 | if lname.endswith('.gz'): 11 | lig = next(Chem.ForwardSDMolSupplier(gzip.open(lname),sanitize=False)) 12 | else: 13 | lig = next(Chem.SDMolSupplier(sys.argv[2],sanitize=False)) 14 | 15 | complex = Chem.CombineMols(rec,lig) 16 | Chem.SanitizeMol(complex) 17 | 18 | ff = Chem.UFFGetMoleculeForceField(complex,ignoreInterfragInteractions=False) 19 | print("Before:",ff.CalcEnergy()) 20 | 21 | for p in range(rec.GetNumAtoms()): 22 | ff.AddFixedPoint(p) 23 | 24 | ff.Minimize() 25 | 26 | print("After:",ff.CalcEnergy()) 27 | 28 | cpos = complex.GetConformer().GetPositions() 29 | conf = lig.GetConformer() 30 | for (i,xyz) in enumerate(cpos[-lig.GetNumAtoms():]): 31 | conf.SetAtomPosition(i,xyz) 32 | 33 | m = m = re.search(r'(.*)_(\d+).sdf(.gz)?',lname) 34 | if m: 35 | outname = '%s_rec_uff_%s.sdf.gz'%(m.group(1),m.group(2)) 36 | else: 37 | outname = lname.replace('.gz','').replace('.sdf','')+'_rec_uff.sdf.gz' 38 | outfile = gzip.open(outname,'wt') 39 | out = Chem.SDWriter(outfile) 40 | out.write(lig) 41 | out.close() 42 | outfile.close() 43 | 44 | 45 | 46 | 47 | -------------------------------------------------------------------------------- /applysdfcoordstopdb.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | '''Given a pdb file and an sdf file of the same ligand, find the correspondance 4 | between the atoms and output a pdb with the same atom names as the pdb input 5 | but with the coordinates of the sdf file. Atoms missing in the sdf 6 | will not have their coordinates changed, but note that hydrogens are stripped''' 7 | 8 | import sys 9 | from rdkit.Chem import AllChem 10 | 11 | if len(sys.argv) != 3: 12 | print "Need sdf and pdb files" 13 | sys.exit(1) 14 | 15 | sdf = sys.argv[1] 16 | pdb = sys.argv[2] 17 | 18 | #figure out starting atom number 19 | startnum = 1 20 | for line in open(pdb): 21 | if line.startswith('ATOM') or line.startswith('HETATM'): 22 | startnum = int(line[6:11]) 23 | break 24 | 25 | pmol = AllChem.MolFromPDBFile(pdb) 26 | smol = AllChem.SDMolSupplier("newsnappy.sdf").next() 27 | pmol = AllChem.AssignBondOrdersFromTemplate(smol,pmol) 28 | 29 | if smol.HasSubstructMatch(pmol): 30 | m = smol.GetSubstructMatch(pmol) 31 | pconf = pmol.GetConformer() 32 | sconf = smol.GetConformer() 33 | for (pi, si) in enumerate(m): 34 | pconf.SetAtomPosition(pi, sconf.GetAtomPosition(si)) 35 | pdbout = AllChem.MolToPDBBlock(pmol, flavor=2).split('\n') 36 | num = startnum 37 | for line in pdbout: 38 | if line.startswith('ATOM') or line.startswith('HETATM'): 39 | print '%s%5d%s' % (line[:6],num,line[11:]) 40 | num += 1 41 | else: 42 | print "Could not matchup pdb and sdf" 43 | sys.exit(1) 44 | -------------------------------------------------------------------------------- /alignmcs.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | import argparse, sys, rdkit, collections 4 | from rdkit.Chem import AllChem as Chem 5 | from rdkit.Chem import rdMolAlign 6 | from rdkit.Chem.rdMolAlign import AlignMol 7 | from rdkit.Chem import rdMolAlign 8 | from rdkit.Chem import rdFMCS 9 | from rdkit.Chem import rdMolTransforms 10 | 11 | if __name__ == "__main__": 12 | parser = argparse.ArgumentParser(description='Align query molecules to a reference molecule using their maximum common substructure. May produce multiple alignments per an input.') 13 | parser.add_argument('ref',help='Reference SDF file for comparison') 14 | parser.add_argument('query',help="SDF file to compare with") 15 | parser.add_argument('out',help='Output SDF') 16 | parser.add_argument('-s','--strict',action='store_true',help='Use strict atom/bond matching') 17 | args = parser.parse_args() 18 | 19 | #load reference file molecules 20 | refmols = [mol for mol in Chem.SDMolSupplier(args.ref)] 21 | 22 | if len(refmols) > 1: 23 | print("Only using first reference molecule") 24 | refmol = refmols[0] 25 | 26 | out = Chem.SDWriter(args.out) 27 | for mol in Chem.SDMolSupplier(args.query): 28 | if args.strict: 29 | mcs = rdFMCS.FindMCS([refmol,mol]) 30 | else: 31 | mcs = rdFMCS.FindMCS([refmol,mol],atomCompare=rdFMCS.AtomCompare.CompareAny,bondCompare=rdFMCS.BondCompare.CompareAny) 32 | 33 | submol = Chem.MolFromSmarts(mcs.smartsString) 34 | 35 | for refmatch in refmol.GetSubstructMatches(submol): 36 | for qmatch in mol.GetSubstructMatches(submol): 37 | AlignMol(mol, refmol, atomMap=list(zip(qmatch,refmatch))) 38 | out.write(mol) 39 | -------------------------------------------------------------------------------- /uffminimize.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python 2 | 3 | import sys,string 4 | from rdkit.Chem import AllChem as Chem 5 | from optparse import OptionParser 6 | 7 | #minimize sdf structures with the UFF forcefiled and rdkit 8 | 9 | parser = OptionParser(usage="Usage: %prog [options] .sdf .sdf") 10 | parser.add_option("-v","--verbose", dest="verbose",action="store_true",default=False, 11 | help="verbose output") 12 | parser.add_option("-a","--add_hydrogens", dest="addh",action="store_true",default=False, 13 | help="add hydrogens") 14 | 15 | 16 | (options, args) = parser.parse_args() 17 | input = args[0] 18 | output = args[1] 19 | 20 | inmols = Chem.SDMolSupplier(input) 21 | if inmols is None: 22 | print("Could not open ".input) 23 | sys.exit(-1) 24 | 25 | sdwriter = Chem.SDWriter(output) 26 | if sdwriter is None: 27 | print("Could not open ".output) 28 | sys.exit(-1) 29 | 30 | for mol in inmols: 31 | if mol is not None: 32 | try: 33 | if options.addh: 34 | mol = Chem.AddHs(mol,addCoords=True) 35 | orig = Chem.UFFGetMoleculeForceField(mol).CalcEnergy() 36 | a=Chem.UFFOptimizeMolecule(mol) 37 | 38 | #sometimes the UFF Optimization does not converge (returns a 1 instead of 0) 39 | if a==1: 40 | a=Chem.UFFOptimizeMolecule(mol, maxIters=1000) 41 | 42 | if options.verbose: 43 | e = Chem.UFFGetMoleculeForceField(mol).CalcEnergy() 44 | print(mol.GetProp('_Name'),orig,"->",e) 45 | sdwriter.write(mol) 46 | except (KeyboardInterrupt, SystemExit): 47 | raise 48 | except: 49 | print("Exception occurred",mol.GetProp('_Name')) 50 | else: 51 | print("ERROR") 52 | -------------------------------------------------------------------------------- /flipchiral.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | '''A script for enumerate all possible stereo-isomers around chiral centers. 4 | Stereo bonds are not enumerate currently since they are more problematic 5 | to deal with in RDKit.''' 6 | 7 | import rdkit 8 | from rdkit.Chem import AllChem as Chem 9 | import itertools,sys 10 | 11 | def make_iso_smiles(mol): 12 | '''enumerate chiral centers and return list of smiles''' 13 | #for some reason rdkit can't detect chiral centers without a structure 14 | Chem.EmbedMultipleConfs(mol) 15 | Chem.rdmolops.AssignAtomChiralTagsFromStructure(mol) 16 | chirals = [] # chiral atoms 17 | Chem.rdmolops.AssignStereochemistry(mol) #make sure this is done 18 | for a in mol.GetAtoms(): 19 | if a.GetChiralTag() == Chem.rdchem.CHI_TETRAHEDRAL_CCW or a.GetChiralTag() == Chem.rdchem.CHI_TETRAHEDRAL_CW: 20 | chirals.append(a) 21 | cmask = itertools.product(*[[0,1]]*len(chirals)) 22 | if len(chirals) == 0: 23 | return [Chem.MolToSmiles(mol)] 24 | else: 25 | ret = [] 26 | for m in cmask: 27 | for i in xrange(len(chirals)): 28 | if m[i]: 29 | chirals[i].SetChiralTag(Chem.rdchem.CHI_TETRAHEDRAL_CCW) 30 | else: 31 | chirals[i].SetChiralTag(Chem.rdchem.CHI_TETRAHEDRAL_CW) 32 | ret.append(Chem.MolToSmiles(mol,True)) 33 | return ret 34 | 35 | 36 | if len(sys.argv) < 2: 37 | print "Need smiles file(s)" 38 | sys.exit(1) 39 | 40 | for f in sys.argv[1:]: 41 | for line in open(f): 42 | vals = line.split() 43 | smi = vals[0] 44 | name = '' 45 | if len(vals) > 1: 46 | name = ' '.join(vals[1:]) 47 | mol = Chem.MolFromSmiles(smi) 48 | smis = make_iso_smiles(mol) 49 | for smi in smis: 50 | print smi,name 51 | -------------------------------------------------------------------------------- /shape.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | import argparse, sys, rdkit, collections 4 | from rdkit.Chem import AllChem as Chem 5 | from rdkit.Chem import rdMolAlign 6 | from rdkit.Chem.rdShape import Align 7 | from rdkit.Chem.rdMolAlign import AlignMol 8 | from rdkit.Chem import rdMolAlign, rdShapeHelpers 9 | 10 | if __name__ == "__main__": 11 | parser = argparse.ArgumentParser(description='Molecular shape comparison') 12 | parser.add_argument('ref',help='Reference sdf file for comparison') 13 | parser.add_argument('test',help="SDF file to compare with") 14 | parser.add_argument('-c','--collate',action='store_true',help='Only output a single value per unique mol name') 15 | parser.add_argument('-t','--tanimoto',action='store_true',help='Output Tanimoto distance') 16 | args = parser.parse_args() 17 | 18 | #load reference file molecules 19 | refmols = [mol for mol in Chem.SDMolSupplier(args.ref)] 20 | 21 | collated = collections.defaultdict(list) 22 | #for each test mol compare to all refmols 23 | for mol in Chem.SDMolSupplier(args.test): 24 | try: 25 | vals = [] 26 | for r in refmols: 27 | o3a = rdMolAlign.GetO3A(r, mol) 28 | o3a.Align() 29 | if args.tanimoto: 30 | score = 1.0 - rdShapeHelpers.ShapeTanimotoDist(r, mol) 31 | else: 32 | score = o3a.Score() 33 | vals.append(score) 34 | tc = max(vals) 35 | if args.collate: 36 | collated[mol.GetProp("_Name")].append(tc) 37 | else: 38 | print mol.GetProp("_Name"), tc 39 | except: 40 | pass 41 | 42 | if args.collate: 43 | namevals = [ (name, max(vals)) for (name, vals) in collated.iteritems()] 44 | namevals.sort(key=lambda (n,v): v) 45 | 46 | for (n,v) in namevals: 47 | print n,v 48 | -------------------------------------------------------------------------------- /extractmatch.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python 2 | 3 | #given a smarts rxn file, a core scaffold smarts file and an sdf file, extract 4 | #the matching scaffolds from of the sdf file 5 | 6 | import sys,gzip 7 | from rdkit.Chem import AllChem 8 | 9 | def subMol(mol, match): 10 | #not sure why this functionality isn't implemented natively 11 | #but get the interconnected bonds for the match 12 | atoms = set(match) 13 | bonds = set() 14 | for a in atoms: 15 | atom = mol.GetAtomWithIdx(a) 16 | for b in atom.GetBonds(): 17 | if b.GetOtherAtomIdx(a) in atoms: 18 | bonds.add(b.GetIdx()) 19 | return AllChem.PathToSubmol(mol,list(bonds)) 20 | 21 | if len(sys.argv) < 5: 22 | print "Need reaction file, core scaffold file, sdf input file and sdf output" 23 | sys.exit(1) 24 | 25 | rxnf = open(sys.argv[1]) 26 | rxnsm = rxnf.readline() 27 | rxn = AllChem.ReactionFromSmarts(rxnsm) 28 | rxn.Initialize() 29 | 30 | if rxn.GetNumProductTemplates() == 1: 31 | product = rxn.GetProductTemplate(0) 32 | reactants = list() 33 | for i in xrange(rxn.GetNumReactantTemplates()): 34 | reactants.append(rxn.GetReactantTemplate(i)) 35 | elif rxn.GetNumReactantTemplates() == 1: 36 | product = rxn.GetReactantTemplate(0) 37 | reactants = list() 38 | for i in xrange(rxn.GetNumProductTemplates()): 39 | reactants.append(rxn.GetProductTemplate(i)) 40 | else: 41 | print "Can have only one product" 42 | sys.exit(1) 43 | 44 | coref = open(sys.argv[2]) 45 | core = AllChem.MolFromSmarts(coref.readline()) 46 | 47 | inmols = AllChem.SDMolSupplier(sys.argv[3]) 48 | if inmols is None: 49 | print "Could not open ",sys.argv[3] 50 | sys.exit(-1) 51 | 52 | outf = gzip.open(sys.argv[4],'w') 53 | sdwriter = AllChem.SDWriter(outf) 54 | if sdwriter is None: 55 | print "Could not open ",sys.argv[4] 56 | sys.exit(-1) 57 | 58 | smart = AllChem.MolToSmarts(core) 59 | pattern = AllChem.MolFromSmarts(smart) 60 | #read through input 61 | for mol in inmols: 62 | if mol is not None: 63 | try: 64 | mol = AllChem.AddHs(mol) 65 | match = mol.GetSubstructMatch(pattern) #just one? why not, we're only sampling 66 | if match: 67 | sub = subMol(mol, match) 68 | cmatch = sub.GetSubstructMatch(core) 69 | if cmatch: 70 | sub = AllChem.RemoveHs(subMol(sub,cmatch)) 71 | sdwriter.write(sub) 72 | except (KeyboardInterrupt, SystemExit): 73 | raise 74 | except Exception as e: 75 | print "Exception occurred",mol.GetProp('_Name'),e 76 | else: 77 | print "ERROR" 78 | 79 | sdwriter.close() 80 | outf.close() 81 | 82 | -------------------------------------------------------------------------------- /extractmatches.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python 2 | 3 | #given a smarts rxn file (backwards), a core scaffold smarts file (with name containing connecting atoms) 4 | # an sdf file with the results of clustering scaffolds and an input sdf file and an 5 | #output prefix, output the extracted reactant conformations aligned to their scaffold 6 | 7 | import sys,gzip,argparse 8 | from rdkit.Chem import AllChem 9 | 10 | def subMol(mol, match): 11 | #not sure why this functionality isn't implemented natively 12 | #but get the interconnected bonds for the match 13 | atoms = set(match) 14 | bonds = set() 15 | for a in atoms: 16 | atom = mol.GetAtomWithIdx(a) 17 | for b in atom.GetBonds(): 18 | if b.GetOtherAtomIdx(a) in atoms: 19 | bonds.add(b.GetIdx()) 20 | return AllChem.PathToSubmol(mol,list(bonds)) 21 | 22 | #return index of closest scaffold in scaffold to mol 23 | def closestScaffold(scaffolds, pattern, core, mol): 24 | ret = -1 25 | match = mol.GetSubstructMatch(pattern) 26 | if match: 27 | sub = subMol(mol, match) 28 | cmatch = sub.GetSubstructMatch(core) 29 | if cmatch: 30 | min = float('inf') 31 | for (i,(s,smatch)) in enumerate(scaffolds): 32 | r = AllChem.GetBestRMS(s, sub, maps=[zip(cmatch,smatch)]) 33 | if r < min: 34 | min = r 35 | ret = i 36 | mmatch = mol.GetSubstructMatch(core) 37 | AllChem.GetBestRMS(s,mol,maps=[zip(mmatch,smatch)]) 38 | return ret 39 | 40 | #MAIN 41 | 42 | parser = argparse.ArgumentParser() 43 | parser.add_argument('-r','--rxn', help="Reaction file") 44 | parser.add_argument('-c','--core',help="Core scaffold with connecting atoms in name") 45 | parser.add_argument('-i','--input',help="Input conformers") 46 | parser.add_argument('-s','--scaffolds',help="Scaffold conformers") 47 | parser.add_argument('-o','--output',help="Output prefix") 48 | 49 | args = parser.parse_args() 50 | 51 | rxnf = open(args.rxn) 52 | rxnsm = rxnf.readline().split()[0] #ignore any name 53 | rxn = AllChem.ReactionFromSmarts(rxnsm) 54 | rxn.Initialize() 55 | 56 | if rxn.GetNumReactantTemplates() != 1: 57 | print "Need backwards reaction" 58 | sys.exit(-1) 59 | 60 | 61 | coref = open(args.core) 62 | corel = coref.readline() 63 | coreconnects = corel.split()[1:] 64 | core = AllChem.MolFromSmarts(corel.split()[0]) 65 | 66 | inscaffolds = AllChem.SDMolSupplier(args.scaffolds,False) 67 | if inscaffolds is None: 68 | print "Could not open ",args.scaffolds 69 | sys.exit(-1) 70 | 71 | inmols = AllChem.SDMolSupplier(args.input) 72 | if inmols is None: 73 | print "Could not open ",args.input 74 | sys.exit(-1) 75 | 76 | smart = AllChem.MolToSmarts(rxn.GetReactantTemplate(0)) 77 | pattern = AllChem.MolFromSmarts(smart) 78 | 79 | #read in scaffolds 80 | scaffolds = list() 81 | for mol in inscaffolds: 82 | #compute match of core 83 | cmatch = mol.GetSubstructMatch(core) 84 | scaffolds.append((mol,cmatch)) 85 | 86 | #setup output file, one for each reactant product 87 | outputs = list() 88 | for i in xrange(rxn.GetNumProductTemplates()): 89 | outputs.append(list()) 90 | for j in xrange(len(scaffolds)): 91 | sdwriter = AllChem.SDWriter("%s_%d_%d.sdf" % (args.output,i,j)) 92 | outputs[i].append(sdwriter) 93 | 94 | for mol in inmols: 95 | #for each mol, decompose it into its reactants 96 | mol = AllChem.AddHs(mol) 97 | #figure out which scaffold conformation is closest 98 | c = closestScaffold(scaffolds, pattern, core, mol) 99 | prods = rxn.RunReactants([mol]) 100 | if c >= 0: 101 | for p in prods: #there may be multiple possible products 102 | for (i,react) in enumerate(p): 103 | react = AllChem.RemoveHs(react) 104 | react.SetProp('_Name',AllChem.MolToSmiles(react)) 105 | outputs[i][c].write(react) 106 | 107 | -------------------------------------------------------------------------------- /corerxnscaffold.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python 2 | 3 | #given a rxn smarts (either forward or backwards, but there is assumed to be 4 | #only one product) identify a minimal core scaffold that has every connecting atom 5 | #from each reactant and only those scaffold atoms that are necessary to minimally 6 | #connect these atoms 7 | #this assume the input smarts is fully annoated with atom mappings for the heavy atoms 8 | #output the smarts (with atom numbers) of the core scaffold 9 | 10 | import sys 11 | from rdkit.Chem import AllChem 12 | import igraph 13 | 14 | Debug = False 15 | 16 | if len(sys.argv) < 1: 17 | print "Need reaction file" 18 | sys.exit(1) 19 | if len(sys.argv) > 2: 20 | Debug = True 21 | 22 | rxnf = open(sys.argv[1]) 23 | rxnsm = rxnf.readline() 24 | rxn = AllChem.ReactionFromSmarts(rxnsm) 25 | rxn.Initialize() 26 | 27 | if rxn.GetNumProductTemplates() == 1: 28 | product = rxn.GetProductTemplate(0) 29 | reactants = list() 30 | for i in xrange(rxn.GetNumReactantTemplates()): 31 | reactants.append(rxn.GetReactantTemplate(i)) 32 | elif rxn.GetNumReactantTemplates() == 1: 33 | product = rxn.GetReactantTemplate(0) 34 | reactants = list() 35 | for i in xrange(rxn.GetNumProductTemplates()): 36 | reactants.append(rxn.GetProductTemplate(i)) 37 | else: 38 | print "Can have only one product" 39 | sys.exit(1) 40 | 41 | #record what atom mapping number belong to each reactant 42 | reactantMapNumbers = dict() 43 | for (i, react) in enumerate(reactants): 44 | for a in react.GetAtoms(): 45 | if a.HasProp('molAtomMapNumber'): 46 | mapnum = a.GetProp('molAtomMapNumber') 47 | reactantMapNumbers[mapnum] = i 48 | 49 | #now create an igraph from the product 50 | molgraph = igraph.Graph() 51 | molgraph.add_vertices(product.GetNumAtoms()) 52 | 53 | for a in product.GetAtoms(): 54 | s = a.GetIdx() 55 | v = molgraph.vs[s] 56 | v['react'] = -1 #reactant this atom belongs to, -1 if none 57 | v['heavy'] = a.GetAtomicNum() != 1 #note this things [#1,#6] is H only, but that should be okay - if H can go there, no need to worry about scaffold connectivity 58 | if a.HasProp('molAtomMapNumber'): 59 | mapnum = a.GetProp('molAtomMapNumber') 60 | if mapnum in reactantMapNumbers: 61 | v['react'] = reactantMapNumbers[mapnum] 62 | for na in a.GetNeighbors(): 63 | t = na.GetIdx() 64 | molgraph.add_edge(s,t) 65 | 66 | #now identify the connecting heavy atoms for reactants 67 | connecting = list() 68 | for v in molgraph.vs: 69 | if v['react'] >= 0 and v['heavy']: 70 | r = v['react'] 71 | for nv in v.neighbors(): 72 | if nv['react'] != r and nv['heavy']: 73 | connecting.append(v.index) 74 | break 75 | 76 | if Debug: 77 | for i in connecting: 78 | print product.GetAtomWithIdx(i).GetSmarts(),molgraph.vs[i]['react'] 79 | 80 | #compute the shortest paths between all these connecting atoms 81 | #the atoms along these paths make the minimal scaffold 82 | scaffold = set() 83 | for i in connecting: 84 | paths = molgraph.get_all_shortest_paths(i,connecting,mode=igraph.ALL) 85 | for p in paths: 86 | for v in p: 87 | scaffold.add(v) 88 | 89 | if Debug: 90 | print "\nScaffold" 91 | for i in scaffold: 92 | print product.GetAtomWithIdx(i).GetSmarts(),molgraph.vs[i]['react'] 93 | 94 | #need to identify the bonds between the scaffold atoms 95 | bonds = set() 96 | for i in scaffold: 97 | a = product.GetAtomWithIdx(i) 98 | for b in a.GetBonds(): 99 | end = b.GetOtherAtomIdx(i) 100 | if end in scaffold: 101 | bonds.add(b.GetIdx()) 102 | 103 | if Debug: 104 | print "Bonds",list(bonds) 105 | 106 | subMol = AllChem.PathToSubmol(product,list(bonds)) 107 | print AllChem.MolToSmarts(subMol), 108 | for i in connecting: 109 | print product.GetAtomWithIdx(i).GetSmarts(), 110 | print "" -------------------------------------------------------------------------------- /clustermatches.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python 2 | 3 | #given a smarts rxn file, a core scaffold smarts file (with name containing connecting atoms) 4 | # and an sdf file, extract the matching scaffolds from of the sdf file and cluster 5 | #them greedily to identify a set of scaffold conformations 6 | 7 | import sys,gzip,argparse 8 | from rdkit.Chem import AllChem 9 | 10 | def subMol(mol, match): 11 | #not sure why this functionality isn't implemented natively 12 | #but get the interconnected bonds for the match 13 | atoms = set(match) 14 | bonds = set() 15 | for a in atoms: 16 | atom = mol.GetAtomWithIdx(a) 17 | for b in atom.GetBonds(): 18 | if b.GetOtherAtomIdx(a) in atoms: 19 | bonds.add(b.GetIdx()) 20 | return AllChem.PathToSubmol(mol,list(bonds)) 21 | 22 | #compute the distances between the matching connecting atoms 23 | #and return true if all distance are small enough 24 | def checkConnect(center, cmatch, mol, match, connectIndices, connect): 25 | cconf = center.GetConformer(0) 26 | mconf = mol.GetConformer(0) 27 | for i in connectIndices: 28 | cidx = cmatch[i] 29 | midx = match[i] 30 | cpt = cconf.GetAtomPosition(cidx) 31 | mpt = mconf.GetAtomPosition(midx) 32 | dist = cpt.Distance(mpt) 33 | if dist > connect: 34 | return False 35 | return True 36 | 37 | #find all the scaffolds in mols that are within rmsd of center and where the connecting 38 | #atoms are within connect, return new cluster and new mols 39 | def createCluster(center,cmatch, mols, pattern, core, rmsd, connectIndices, connect): 40 | cluster = list() 41 | newmols = list() 42 | for (mol,match) in mols: 43 | r = AllChem.GetBestRMS(mol,center,maps=[zip(cmatch,match)]) 44 | if r < rmsd and checkConnect(center, cmatch, mol,match,connectIndices, connect): 45 | cluster.append((mol,match,r)) 46 | else: 47 | newmols.append((mol,match)) 48 | cluster.sort(key = lambda (m,mtch,r): r ) 49 | return (cluster, newmols) 50 | 51 | #find the mol in mols that has the maximum minimum distance between the first 52 | #mol in each cluster 53 | #ACTUALLY, for the tight tolerances we need, this really doesn't make a difference 54 | #and just slows things down, so just pick the first available conformer 55 | def computeNext(clusters,mols): 56 | if len(mols) > 0: 57 | return mols[0] 58 | else: 59 | return (None,None) 60 | max = 0 61 | best = (None,None) 62 | for (mol,match) in mols: 63 | min = float('inf') 64 | for cl in clusters: 65 | cmol = cl[0][0] 66 | cmatch = cl[0][1] 67 | r = AllChem.GetBestRMS(cmol,mol,maps=[zip(match,cmatch)]) 68 | if r < min: 69 | min = r 70 | if min > max: 71 | max = min 72 | best = (mol,match) 73 | return best 74 | 75 | #MAIN 76 | if len(sys.argv) < 5: 77 | print "Need reaction file, core scaffold file, sdf input file and sdf output" 78 | sys.exit(1) 79 | 80 | parser = argparse.ArgumentParser() 81 | parser.add_argument('-r','--rxn', help="Reaction file") 82 | parser.add_argument('-c','--core',help="Core scaffold with connecting atoms in name") 83 | parser.add_argument('-i','--input',help="Input conformers") 84 | parser.add_argument('-o','--output',help="Clustered core scaffold output") 85 | parser.add_argument("--rmsd",type=float,default=0.5,help="Maximum RMSD for cluster membership") 86 | parser.add_argument("--connect",type=float,default=0.1,help="Maximum allowed deviation of connecting atoms for cluster membership") 87 | parser.add_argument("--sample",type=int,default=1,help="Amount to sample conformations") 88 | args = parser.parse_args() 89 | 90 | rxnf = open(args.rxn) 91 | rxnsm = rxnf.readline().split()[0] #ignore any name 92 | rxn = AllChem.ReactionFromSmarts(rxnsm) 93 | rxn.Initialize() 94 | 95 | if rxn.GetNumProductTemplates() == 1: 96 | product = rxn.GetProductTemplate(0) 97 | reactants = list() 98 | for i in xrange(rxn.GetNumReactantTemplates()): 99 | reactants.append(rxn.GetReactantTemplate(i)) 100 | elif rxn.GetNumReactantTemplates() == 1: 101 | product = rxn.GetReactantTemplate(0) 102 | reactants = list() 103 | for i in xrange(rxn.GetNumProductTemplates()): 104 | reactants.append(rxn.GetProductTemplate(i)) 105 | else: 106 | print "Can have only one product" 107 | sys.exit(1) 108 | 109 | coref = open(args.core) 110 | corel = coref.readline() 111 | coreconnects = corel.split()[1:] 112 | core = AllChem.MolFromSmarts(corel.split()[0]) 113 | 114 | inmols = AllChem.SDMolSupplier(args.input) 115 | if inmols is None: 116 | print "Could not open ",args.input 117 | sys.exit(-1) 118 | 119 | sdwriter = AllChem.SDWriter(args.output) 120 | if sdwriter is None: 121 | print "Could not open ",args.output 122 | sys.exit(-1) 123 | 124 | smart = AllChem.MolToSmarts(product) 125 | pattern = AllChem.MolFromSmarts(smart) 126 | 127 | #figure out the indices of connected atoms in the smart core pattern 128 | connectIndices = list() 129 | for c in coreconnects: 130 | cm = AllChem.MolFromSmarts(c) 131 | a = cm.GetAtoms()[0] 132 | if a.HasProp('molAtomMapNumber'): 133 | mapnum = a.GetProp('molAtomMapNumber') 134 | for sma in core.GetAtoms(): 135 | if sma.HasProp('molAtomMapNumber') and sma.GetProp('molAtomMapNumber') == mapnum: 136 | connectIndices.append(sma.GetIdx()) 137 | 138 | #read all core scaffold molecules into memory 139 | mols = list() 140 | cnt = 0 141 | for mol in inmols: 142 | if cnt % args.sample == 0 and mol is not None: 143 | try: 144 | mol = AllChem.AddHs(mol) 145 | match = mol.GetSubstructMatch(pattern) #just one? why not, we're only sampling 146 | if match: 147 | sub = subMol(mol, match) 148 | cmatch = sub.GetSubstructMatch(core) 149 | if cmatch: 150 | sub = subMol(sub,cmatch) 151 | mols.append((sub,sub.GetSubstructMatch(core))) 152 | except (KeyboardInterrupt, SystemExit): 153 | raise 154 | except Exception as e: 155 | print "Exception occurred",mol.GetProp('_Name'),e 156 | cnt += 1 157 | 158 | if len(mols) == 0: 159 | print "No molecules!" 160 | sys.exit(-1) 161 | print "Done reading" 162 | clusters = list() #these are just defined by a list of all the scffolds assigned to the cluster 163 | (center, cmatch) = mols[0] 164 | 165 | while len(mols) > 0: 166 | (cluster, mols) = createCluster(center,cmatch,mols, pattern, core, args.rmsd, connectIndices, args.connect) 167 | clusters.append(cluster) 168 | (center, cmatch) = computeNext(clusters,mols) 169 | 170 | print len(clusters) 171 | for cl in clusters: 172 | cmol = cl[0][0] 173 | cmol.SetProp("ClusterSize",str(len(cl))) 174 | AllChem.GetBestRMS(clusters[0][0][0],cmol) #align to very first 175 | sdwriter.write(cmol) 176 | sdwriter.close() 177 | 178 | -------------------------------------------------------------------------------- /rdconf.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | 3 | import sys,string,argparse 4 | from rdkit.Chem import AllChem as Chem 5 | from optparse import OptionParser 6 | import os, gzip 7 | 8 | '''Given a smiles file, generate 3D conformers in output sdf. 9 | Energy minimizes and filters conformers to meet energy window and rms constraints. 10 | 11 | Some time ago I compared this to alternative conformer generators and 12 | it was quite competitive (especially after RDKit's UFF implementation 13 | added OOP terms). 14 | ''' 15 | 16 | #convert smiles to sdf 17 | def getRMS(mol, c1,c2): 18 | rms = Chem.GetBestRMS(mol,mol,c1,c2) 19 | return rms 20 | 21 | parser = OptionParser(usage="Usage: %prog [options] .smi .sdf") 22 | parser.add_option("--maxconfs", dest="maxconfs",action="store", 23 | help="maximum number of conformers to generate per a molecule (default 20)", default="20", type="int", metavar="CNT") 24 | parser.add_option("--sample_multiplier", dest="sample",action="store", 25 | help="sample N*maxconfs conformers and choose the maxconformers with lowest energy (default 1)", default="1", type="float", metavar="N") 26 | parser.add_option("--seed", dest="seed",action="store", 27 | help="random seed (default 9162006)", default="9162006", type="int", metavar="s") 28 | parser.add_option("--rms_threshold", dest="rms",action="store", 29 | help="filter based on rms (default 0.7)", default="0.7", type="float", metavar="R") 30 | parser.add_option("--energy_window", dest="energy",action="store", 31 | help="filter based on energy difference with lowest energy conformer", default="10", type="float", metavar="E") 32 | parser.add_option("-v","--verbose", dest="verbose",action="store_true",default=False, 33 | help="verbose output") 34 | parser.add_option("--mmff", dest="mmff",action="store_true",default=False, 35 | help="use MMFF forcefield instead of UFF") 36 | parser.add_option("--nomin", dest="nomin",action="store_true",default=False, 37 | help="don't perform energy minimization (bad idea)") 38 | parser.add_option("--etkdg", dest="etkdg",action="store_true",default=False, 39 | help="use new ETKDG knowledge-based method instead of distance geometry") 40 | 41 | 42 | (options, args) = parser.parse_args() 43 | 44 | if(len(args) < 2): 45 | parser.error("Need input and output") 46 | sys.exit(-1) 47 | 48 | input = args[0] 49 | output = args[1] 50 | smifile = open(input) 51 | if options.verbose: 52 | print("Generating a maximum of",options.maxconfs,"per a mol") 53 | 54 | if options.etkdg and not Chem.ETKDG: 55 | print("ETKDB does not appear to be implemented. Please upgrade RDKit.") 56 | sys.exit(1) 57 | 58 | split = os.path.splitext(output) 59 | if split[1] == '.gz': 60 | outf=gzip.open(output,'wt+') 61 | output = split[0] #strip .gz 62 | else: 63 | outf = open(output,'w+') 64 | 65 | 66 | if os.path.splitext(output)[1] == '.pdb': 67 | sdwriter = Chem.PDBWriter(outf) 68 | else: 69 | sdwriter = Chem.SDWriter(outf) 70 | 71 | if sdwriter is None: 72 | print("Could not open ".output) 73 | sys.exit(-1) 74 | 75 | for line in smifile: 76 | toks = line.split() 77 | smi = toks[0] 78 | name = ' '.join(toks[1:]) 79 | 80 | pieces = smi.split('.') 81 | if len(pieces) > 1: 82 | smi = max(pieces, key=len) #take largest component by length 83 | print("Taking largest component: %s\t%s" % (smi,name)) 84 | 85 | mol = Chem.MolFromSmiles(smi) 86 | if mol is not None: 87 | if options.verbose: 88 | print(smi) 89 | try: 90 | Chem.SanitizeMol(mol) 91 | mol = Chem.AddHs(mol) 92 | mol.SetProp("_Name",name); 93 | 94 | if options.etkdg: 95 | cids = Chem.EmbedMultipleConfs(mol, int(options.sample*options.maxconfs), Chem.ETKDG()) 96 | else: 97 | cids = Chem.EmbedMultipleConfs(mol, int(options.sample*options.maxconfs),randomSeed=options.seed) 98 | if options.verbose: 99 | print(len(cids),"conformers found") 100 | cenergy = [] 101 | for conf in cids: 102 | #not passing confID only minimizes the first conformer 103 | if options.nomin: 104 | cenergy.append(conf) 105 | elif options.mmff: 106 | converged = Chem.MMFFOptimizeMolecule(mol,confId=conf) 107 | mp = Chem.MMFFGetMoleculeProperties(mol) 108 | cenergy.append(Chem.MMFFGetMoleculeForceField(mol,mp,confId=conf).CalcEnergy()) 109 | else: 110 | converged = not Chem.UFFOptimizeMolecule(mol,confId=conf) 111 | cenergy.append(Chem.UFFGetMoleculeForceField(mol,confId=conf).CalcEnergy()) 112 | if options.verbose: 113 | print("Convergence of conformer",conf,converged,cenergy[-1]) 114 | 115 | mol = Chem.RemoveHs(mol) 116 | sortedcids = sorted(cids,key = lambda cid: cenergy[cid]) 117 | if len(sortedcids) > 0: 118 | mine = cenergy[sortedcids[0]] 119 | else: 120 | mine = 0 121 | if(options.rms == 0): 122 | cnt = 0; 123 | for conf in sortedcids: 124 | if(cnt >= options.maxconfs): 125 | break 126 | if(options.energy < 0) or cenergy[conf]-mine <= options.energy: 127 | sdwriter.write(mol,conf) 128 | cnt+=1 129 | else: 130 | written = {} 131 | for conf in sortedcids: 132 | if len(written) >= options.maxconfs: 133 | break 134 | #check rmsd 135 | passed = True 136 | for seenconf in written.keys(): 137 | rms = getRMS(mol,seenconf,conf) 138 | if(rms < options.rms) or (options.energy > 0 and cenergy[conf]-mine > options.energy): 139 | passed = False 140 | break 141 | if(passed): 142 | written[conf] = True 143 | sdwriter.write(mol,conf) 144 | except (KeyboardInterrupt, SystemExit): 145 | raise 146 | except Exception as e: 147 | print("Exception",e) 148 | else: 149 | print("ERROR:",smi) 150 | 151 | sdwriter.close() 152 | outf.close() 153 | -------------------------------------------------------------------------------- /rdallconf.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python 2 | 3 | import sys,string,math 4 | from rdkit.Chem import AllChem as Chem 5 | from rdkit.Chem import rdMolTransforms 6 | 7 | import argparse, traceback 8 | import os, gzip 9 | 10 | '''Given a smiles file, exhaustively enumerate 3D conformers in output sdf. 11 | Conformers are first sampled using rdkit's distance geometry based method 12 | combined with energy minimization. All conformers that, with identical torsions, 13 | have greater than an rmsd cutoff difference are kept (i.e., there are conformational 14 | differences such as ring pucker unrelated to torsions). 15 | 16 | For each one of these conformers, we exhaustively sample all possible torsions 17 | at a specified degree increment (beware exponential growth!). 18 | 19 | ''' 20 | 21 | #convert smiles to sdf 22 | def getRMS(mol, c1,c2): 23 | rms = Chem.GetBestRMS(mol,mol,c1,c2) 24 | return rms 25 | 26 | def getDihedralMatches(mol): 27 | '''return list of atom indices of dihedrals''' 28 | #this is rdkit's "strict" pattern 29 | pattern = r"*~[!$(*#*)&!D1&!$(C(F)(F)F)&!$(C(Cl)(Cl)Cl)&!$(C(Br)(Br)Br)&!$(C([CH3])([CH3])[CH3])&!$([CD3](=[N,O,S])-!@[#7,O,S!D1])&!$([#7,O,S!D1]-!@[CD3]=[N,O,S])&!$([CD3](=[N+])-!@[#7!D1])&!$([#7!D1]-!@[CD3]=[N+])]-!@[!$(*#*)&!D1&!$(C(F)(F)F)&!$(C(Cl)(Cl)Cl)&!$(C(Br)(Br)Br)&!$(C([CH3])([CH3])[CH3])]~*" 30 | qmol = Chem.MolFromSmarts(pattern) 31 | matches = mol.GetSubstructMatches(qmol); 32 | #these are all sets of 4 atoms, uniquify by middle two 33 | uniqmatches = [] 34 | seen = set() 35 | for (a,b,c,d) in matches: 36 | if (b,c) not in seen: 37 | seen.add((b,c)) 38 | uniqmatches.append((a,b,c,d)) 39 | return uniqmatches 40 | 41 | def genConformer_r(mol, conf, i, matches, degree, sdwriter): 42 | '''recursively enumerate all angles for matches dihedrals. i is where is 43 | which dihedral we are enumerating by degree to output conformers to out''' 44 | if i >= len(matches): #base case, torsions should be set in conf 45 | sdwriter.write(mol,conf) 46 | return 1 47 | else: 48 | incr = math.pi*degree / 180.0 49 | total = 0 50 | deg = 0 51 | while deg < 360.0: 52 | rad = math.pi*deg / 180.0 53 | rdMolTransforms.SetDihedralRad(mol.GetConformer(conf),*matches[i],value=rad) 54 | total += genConformer_r(mol, conf, i+1, matches, degree, sdwriter) 55 | deg += args.degree 56 | return total 57 | 58 | parser = argparse.ArgumentParser(description="Sample nontorsional conformations and exhaustively enumerate torsions to generate conformers. Lots and lots and lots and lots of conformers.") 59 | parser.add_argument("--sample", help="number of conformers to sample to get non-torsional differences (default 100)", default=100, type=int, metavar="sample") 60 | parser.add_argument("--seed", help="random seed (default 062609)", default="062609", type=int, metavar="s") 61 | parser.add_argument("--rms_threshold", help="cutoff for considering sampled conformers the same (default 0.25)", default="0.25", type=float, metavar="R") 62 | parser.add_argument("-v","--verbose",action="store_true",default=False, help="verbose output") 63 | parser.add_argument("-d","--degree", type=float,help="Amount, in degrees, to enumerate torsions by (default 15.0)",default=15.0) 64 | parser.add_argument("--etkdg", dest="etkdg",action="store_true",default=False, 65 | help="use new ETKDG knowledge-based method instead of distance geometry") 66 | parser.add_argument("--max_torsions",type=int,help="Skip any molecules with more than this many torsions (default 10)",default=10) 67 | parser.add_argument("input",help="Input smi file") 68 | parser.add_argument("output",help="Output sdf file") 69 | 70 | args = parser.parse_args() 71 | 72 | smifile = open(args.input) 73 | 74 | if args.etkdg and not Chem.ETKDG: 75 | print "ETKDB does not appear to be implemented. Please upgrade RDKit." 76 | sys.exit(1) 77 | 78 | split = os.path.splitext(args.output) 79 | if split[1] == '.gz': 80 | outf=gzip.open(args.output,'w+') 81 | else: 82 | outf = open(args.output,'w+') 83 | 84 | sdwriter = Chem.SDWriter(outf) 85 | if sdwriter is None: 86 | print "Could not open ".output 87 | sys.exit(-1) 88 | 89 | for line in smifile: 90 | toks = line.split() 91 | smi = toks[0] 92 | name = string.join(toks[1:]) 93 | 94 | pieces = smi.split('.') 95 | if len(pieces) > 1: 96 | smi = max(pieces, key=len) #take largest component by length 97 | print "Taking largest component: %s\t%s" % (smi,name) 98 | 99 | mol = Chem.MolFromSmiles(smi) 100 | if mol is not None: 101 | if args.verbose: 102 | print smi 103 | try: 104 | Chem.SanitizeMol(mol) 105 | mol = Chem.AddHs(mol) 106 | mol.SetProp("_Name",name); 107 | 108 | rotmatches = getDihedralMatches(mol) 109 | if(len(rotmatches) > args.max_torsions): 110 | print "Too many torsions (%d). Skipping %s" %(len(rotmatches),line.rstrip()) 111 | continue 112 | if args.etkdg: 113 | cids = Chem.EmbedMultipleConfs(mol, args.sample, Chem.ETKDG(),randomSeed=args.seed) 114 | else: 115 | cids = Chem.EmbedMultipleConfs(mol, args.sample,randomSeed=args.seed) 116 | if args.verbose: 117 | print len(cids),"conformers sampled" 118 | 119 | #energy minimize all to get more realistic results 120 | cenergy = [] 121 | for conf in cids: 122 | #not passing confID only minimizes the first conformer 123 | converged = not Chem.UFFOptimizeMolecule(mol,confId=conf) 124 | cenergy.append(Chem.UFFGetMoleculeForceField(mol,confId=conf).CalcEnergy()) 125 | 126 | #reduce to unique set 127 | sortedcids = sorted(cids,key = lambda cid: cenergy[cid]) 128 | selectedcids = [] 129 | for conf in sortedcids: 130 | #set torsions to zero 131 | for m in rotmatches: 132 | rdMolTransforms.SetDihedralRad(mol.GetConformer(conf),*m,value=0) 133 | #check rmsd 134 | for seenconf in selectedcids: 135 | rms = getRMS(mol,seenconf,conf) 136 | if rms < args.rms_threshold: 137 | break 138 | else: #loop completed normally - no break, included empty 139 | selectedcids.append(conf) 140 | 141 | #now exhaustively drive torsions of selected conformers 142 | if args.verbose: 143 | print len(selectedcids),"unique (ignoring torsions) starting conformers" 144 | 145 | total = 0 146 | for conf in selectedcids: 147 | total += genConformer_r(mol, conf, 0, rotmatches, args.degree, sdwriter) 148 | if args.verbose: 149 | print "%d total conformations generated"%total 150 | 151 | except (KeyboardInterrupt, SystemExit): 152 | raise 153 | except Exception as e: 154 | print traceback.print_exc() 155 | else: 156 | print "ERROR:",smi 157 | 158 | sdwriter.close() 159 | outf.close() 160 | -------------------------------------------------------------------------------- /pains.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | from rdkit.Chem import AllChem as Chem 4 | import sys 5 | 6 | 7 | #todo: update rdkit to get built in filtercatalog 8 | pains = '''c:1:c:c(:c:c:c:1-[#6;X4]-c:2:c:c:c(:c:c:2)-[#7&H2,$([#7;!H0]-[#6;X4]),$([#7](-[#6X4])-[#6X4])])-[#7&H2,$([#7;!H0]-[#6;X4]),$([#7](-[#6X4])-[#6X4])] 9 | c:1(:c(:c(:c(:c(:c:1-[#1])-[#1])-[#7](-[#1])-[#1])-[#1])-[#1])-[#6]=[#7]-[#7]-[#1] 10 | c1(nn(c([c;!H0,$(c-[#6;!H0])]1)-[#8]-[#1])-c:2:c(:c(:c(:c(:c:2-[#1])-[#1])-[#1])-[#1])-[#1])-[#6;X4] 11 | c:2(:c:1-[#16]-c:3:c(-[#7;!H0,$([#7]-[CH3]),$([#7]-[#6;!H0;!H1]-[#6;!H0])](-c:1:c(:c(:c:2-[#1])-[#1])-[#1])):[c;!H0,$(c~[#7](-[#1])-[#6;X4]),$(c~[#6]:[#6])](:[c;!H0,$(c~[#6]:[#6])]:[c;!H0,$(c-[#7](-[#1])-[#1]),$(c-[#8]-[#6;X4])]:c:3-[#1]))-[#1] 12 | [#6]-2-[#6]-c:1:c(:c:c:c:c:1)-[#6](-c:3:c:c:c:c:c-2:3)=[#6]-[#6] 13 | [#16]-1-[#6](=[#7]-[#6]:[#6])-[#7;!H0,$([#7]-[#6](-[#1])(-[#1])-[#6](-[#1])(-[#1])-[#8]),$([#7]-[#6]:[#6])]-[#6](=[#8])-[#6]-1=[#6](-[#1])-[$([#6]:[#6]:[#6]-[#17]),$([#6]:[!#6&!#1])] 14 | [#7](-[#1])(-[#1])-[#6]-1=[#6](-[#6]#[#7])-[#6](-[#1])(-[#6]:[#6])-[#6](=[#6](-[#6]=[#6])-[#8]-1)-[#6](-[#1])-[#1] 15 | [#8]=[#16](=[#8])-[#6](-[#6]#[#7])=[#7]-[#7]-[#1] 16 | c:1:c:c:c:c:c:1-[#7](-[#1])-[#6](=[#16])-[#7](-[#1])-[#6](-[#1])(-[#1])-[#6](-[#1])(-[#1])-[#6](-[#1])(-[#1])-[#7](-[#6](-[#1])-[#1])-c:2:c:c:c:c:c:2 17 | c:1:c(:c:c:c:c:1)-[#7](-[#1])-c:2:c(:c(:c(:s:2)-[$([#6]=[#8]),$([#6]#[#7]),$([#6](-[#8]-[#1])=[#6])])-[#7])-[$([#6]#[#7]),$([#6](:[#7]):[#7])] 18 | [#6;X4]-1-[#6](=[#8])-[#7]-[#7]-[#6]-1=[#8] 19 | c:1:c-3:c(:c:c:c:1)-[#6]:2:[#7]:[!#1]:[#6]:[#6]:[#6]:2-[#6]-3=[#8] 20 | [#6]-1(-[#6](=[#6](-[#6]#[#7])-[#6](~[#8])~[#7]~[#6]-1~[#8])-[#6](-[#1])-[#1])=[#6](-[#1])-[#6]:[#6] 21 | [#6]-1(=[#6](-!@[#6]=[#7])-[#16]-[#6](-[#7]-1)=[#8])-[$([F,Cl,Br,I]),$([#7+](:[#6]):[#6])] 22 | c:1:2:c(:c(:c(:c(:c:1-[#1])-[#1])-[#1])-[#1]):[!#6&!#1]:[#6;!H0,$([#6]-[OH]),$([#6]-[#6;H2,H3])](:[#6]:2-[#6](-[#1])=[#7]-[#7](-[#1])-[$([#6]:1:[#7]:[#6]:[#6](-[#1]):[#16]:1),$([#6]:[#6](-[#1]):[#6]-[#1]),$([#6]:[#7]:[#6]:[#7]:[#6]:[#7]),$([#6]:[#7]:[#7]:[#7]:[#7])]) 23 | [!#1]:[!#1]-[#6;!H0,$([#6]-[#6]#[#7])]=[#6]-1-[#6]=,:[#6]-[#6](=[$([#8]),$([#7;!R])])-[#6]=,:[#6]-1 24 | c:1:c:c-2:c(:c:c:1)-[#6]-[#6](-c:3:c(-[#16]-2):c(:c(-[#1]):[c;!H0,$(c-[#8]),$(c-[#16;X2]),$(c-[#6;X4]),$(c-[#7;H2,H3,$([#7!H0]-[#6;X4]),$([#7](-[#6;X4])-[#6;X4])])](:c:3-[#1]))-[#1])-[#7;H2,H3,$([#7;!H0]-[#6;X4]),$([#7](-[#6;X4])-[#6;X4])] 25 | [#6]-1(=[#8])-[#6](=[#6](-[#1])-[$([#6]:1:[#6]:[#6]:[#6]:[#6]:[#6]:1),$([#6]:1:[#6]:[#6]:[#6]:[!#6&!#1]:1)])-[#7]=[#6](-[!#1]:[!#1]:[!#1])-[$([#16]),$([#7]-[!#1]:[!#1])]-1 26 | [#7+](:[!#1]:[!#1]:[!#1])-[!#1]=[#8] 27 | [#6;X4]-[#7](-[#6;X4])-c:1:c(:c(:c(:c(:c:1-[#1])-[#1])-[#6]2=,:[#7][#6]:[#6]:[!#1]2)-[#1])-[#1] 28 | [#7;!H0,$([#7]-[#6;X4])]-1-[#6]=,:[#6](-[#6](=[#8])-[#6]:[#6]:[#6])-[#6](-[#6])-[#6](=[#6]-1-[#6](-[#1])(-[#1])-[#1])-[$([#6]=[#8]),$([#6]#[#7])] 29 | c:1:c:c:c:c:c:1-[#7](-[#1])-[#6](=[#16])-[#7](-[#1])-[#6](-[#1])(-[#1])-[#6](-[#1])(-[#1])-[#7](-[#6](-[#1])-[#1])-c:2:c:c:c:c:c:2 30 | c:1:3:c(:c(:c(:c(:c:1-[#1])-[#1])-[#7](-[#1])-[#6](-[#1])(-[#1])-c:2:c:c:c:c:c:2)-[#1]):n:c(-[#1]):n:3-[#6] 31 | c:1:c:c-2:c(:c:c:1)-[#7]=[#6]-[#6]-2=[#7;!R] 32 | c:1(:c:c:c:c:c:1)-[#7](-[#1])-[#6](=[#16])-[#7]-[#7](-[#1])-[#6](=[#8])-[#6]-,:2:[!#1]:[!#6&!#1]:[#6]:[#6]-,:2 33 | [#7;!R]=[#6]-2-[#6](=[#8])-c:1:c:c:c:c:c:1-[#16]-2 34 | [$([#7](-[#1])-[#1]),$([#8]-[#1])]-[#6]-2=[#6](-[#6]#[#7])-[#6](-[#1])(-[#6]:[#6])-c:1:c(:n(-[#6]):n:c:1)-[#8]-2 35 | [#7](-[#1])(-[#1])-c:1:c(:c(:c(:n:c:1-[#1])-[#8]-c:2:c:c:c:c:c:2)-[#1])-[#1] 36 | [#6](=[#8])-[#6]-1=[#6]-[#7]-c:2:c(-[#16]-1):c:c:c:c:2 37 | c:1:c:c-2:c(:c:c:1)-[#6](-c:3:c(-[$([#16;X2]),$([#6;X4])]-2):c:c:[c;!H0,$(c-[#17]),$(c-[#6;X4])](:c:3))=[#6]-[#6] 38 | [#6](-[#1])(-[#1])-[#16;X2]-c:1:n:c(:c(:n:1-!@[#6](-[#1])-[#1])-c:2:c:c:c:c:c:2)-[#1] 39 | [#6](-[#1])(-[#1])-[#7](-[#6](-[#1])-[#1])-[#6]-2=[#6](-[#1])-c:1:c(:c:c:c:c:1)-[#16;X2]-c:3:c-2:c:c:c:c:3 40 | [#16]-1-[#6](=!@[#7;!H0,$([#7]-[#7](-[#1])-[#6]:[#6])])-[#7;!H0,$([#7]-[#6]:[#7]:[#6]:[#6]:[#16])]-[#6](=[#8])-[#6]-1=[#6](-[#1])-[#6]:[#6]-[$([#17]),$([#8]-[#6]-[#1])] 41 | [#16]-1-[#6](=[#8])-[#7]-[#6](=[#16])-[#6]-1=[#6](-[#1])-[#6]:[#6] 42 | c:1:c(:c:c:c:c:1)-[#6](-[#1])(-[#1])-[#7](-[#1])-c:2:c(:c(:c(:c(:c:2-[#1])-[#1])-[#8]-[#1])-[#1])-[#1] 43 | n1(-[#6;X4])c(c(-[#1])c(c1-[#6]:[#6])-[#1])-[#6](-[#1])-[#1] 44 | c:1(:c:c:c:c:c:1)-[#7](-[#1])-[#6](=[#16])-[#7]-[#7](-[#1])-c:2:c:c:c:c:c:2 45 | [#7](-c:1:c:c:c:c:c:1)-c2[n+]c(cs2)-c:3:c:c:c:c:c:3 46 | n:1:c:c:c(:c:1-[#6](-[#1])-[#1])-[#6](-[#1])=[#6]-2-[#6](=[#8])-[#7]-[#6](=[!#6&!#1])-[#7]-2 47 | [#6]-,:1(=,:[#6](-[#6](-[#1])(-[#6])-[#6])-,:[#16]-,:[#6](-,:[#7;!H0,$([#7]-[#6;!H0;!H1])]-,:1)=[#8])-[#16]-[#6;R] 48 | [!#1]:,-1:[!#1]-,:2:[!#1](:[!#1]:[!#1]:[!#1]:,-1)-,:[#7](-[#1])-,:[#7](-,:[#6]-,:2=[#8])-[#6] 49 | c:1:c:c-2:c(:c:c:1)-[#6](=[#6](-[#6]-2=[#8])-[#6])-[#8]-[#1] 50 | c:2:c:c:1:n:n:c(:n:c:1:c:c:2)-[#6](-[#1])(-[#1])-[#6]=[#8] 51 | c:1:c:c:c:c:c:1-[#7](-[#1])-[#6](=[#16])-[#7](-[#1])-[#6](-[#1])(-[#1])-c:2:n:c:c:c:c:2 52 | [#6](-[#1])-[#6](-[#1])(-[#1])-c:1:c(:c(:c(:s:1)-[#7](-[#1])-[#6](=[#8])-[#6]-[#6]-[#6]=[#8])-[$([#6](=[#8])-[#8]),$([#6]#[#7])])-[#6](-[#1])-[#1] 53 | [#6](-c:1:c(:c(:[c;!H0,$(c-[#6;X4])]:c:c:1-[#1])-[#1])-[#1])(-c:2:c(:c(:[c;!H0,$(c-[#17])](:c(:c:2-[#1])-[#1]))-[#1])-[#1])=[$([#7]-[#8]-[#6](-[#1])(-[#1])-[#6](-[#1])(-[#1])-[#6](-[#1])(-[#1])-[#7](-[#6](-[#1])-[#1])-[#6](-[#1])-[#1]),$([#7]-[#8]-[#6](-[#1])(-[#1])-[#6](-[#1])(-[#1])-[#7](-[#6](-[#1])-[#1])-[#6](-[#1])-[#1]),$([#7]-[#7](-[#1])-[#6](=[#7]-[#1])-[#7](-[#1])-[#1]),$([#6](-[#1])-[#7])] 54 | [#8](-[#1])-[#6](=[#8])-c:1:c:c(:c:c:c:1)-[#6]:[!#1]:[#6]-[#6](-[#1])=[#6]-2-[#6](=[!#6&!#1])-[#7]-[#6](=[!#6&!#1])-[!#6&!#1]-2 55 | [#6]-1(=[#6]-[#6](-c:2:c:c(:c(:n:c-1:2)-[#7](-[#1])-[#1])-[#6]#[#7])=[#6])-[#6]#[#7] 56 | [#7](-[#1])(-[#1])-[#6]-1=[#6](-[#6]#[#7])-[#6](-[#1])(-[#6]:[#6])-[#6](=[#6](-[#6]:[#6])-[#8]-1)-[#6]#[#7] 57 | [#7]-2(-c:1:c:c:c:c:c:1)-[#7]=[#6](-[#6]=[#8])-[#6;X4]-[#6]-2=[#8] 58 | [#7]-1=[#6]-[#6](-[#6](-[#7]-1)=[#16])=[#6] 59 | c1(coc(c1-[#1])-[#6](=[#16])-[#7]-2-[#6](-[#1])(-[#1])-[#6](-[#1])(-[#1])-[!#1]-[#6](-[#1])(-[#1])-[#6]-2(-[#1])-[#1])-[#1] 60 | [#6]=[#6](-[#6]#[#7])-[#6](=[#7]-[#1])-[#7]-[#7] 61 | c:1(:c(:c(:[c;!H0,$(c-[#6;!H0;!H1])](:o:1))-[#1])-[#1])-[#6;!H0,$([#6]-[#6;!H0;!H1])]=[#7]-[#7](-[#1])-c:2:n:c:c:s:2 62 | c:1(:c(:c(:c(:c(:c:1-[#7](-[#1])-[#16](=[#8])(=[#8])-[#6]:2:[#6]:[!#1]:[#6]:[#6]:[#6]:2)-[#1])-[#7](-[#6](-[#1])-[#1])-[#6](-[#1])-[#1])-[#1])-[#1])-[#1] 63 | n2c1ccccn1c(c2-[$([#6](-[!#1])=[#6](-[#1])-[#6]:[#6]),$([#6]:[#8]:[#6])])-[#7]-[#6]:[#6] 64 | [#6]-1-[#7](-[#1])-[#7](-[#1])-[#6](=[#16])-[#7]-[#7]-1-[#1] 65 | c:1(:c:c:c:o:1)-[#6](-[#1])=!@[#6]-3-[#6](=[#8])-c:2:c:c:c:c:c:2-[!#6&!#1]-3 66 | [#8]=[#6]-1-[#6;X4]-[#6]-[#6](=[#8])-c:2:c:c:c:c:c-1:2 67 | c:1:c:c-2:c(:c:c:1)-[#6](-c3cccc4noc-2c34)=[#8] 68 | [#8](-[#1])-c:1:n:c(:c:c:c:1)-[#8]-[#1] 69 | c:1:2:c(:c(:c(:c(:c:1:c(:c(:c(:c:2-[#1])-[#1])-[#6]=[#7]-[#7](-[#1])-[$([#6]:[#6]),$([#6]=[#16])])-[#1])-[#1])-[#1])-[#1])-[#1] 70 | [#6]-,:1=,:[#6](-,:[#16]-,:[#6](-,:[#6]=,:[#6]-,:1)=[#16])-,:[#7] 71 | [#6]-1=[#6]-[#6](-[#8]-[#6]-1-[#8])(-[#8])-[#6] 72 | [#8]=[#6]-,:1-,:[#6](=,:[#6]-,:[#6](=,:[#7]-,:[#7]-,:1)-,:[#6]=[#8])-[#6]#[#7] 73 | c3cn1c(nc(c1-[#7]-[#6])-c:2:c:c:c:c:n:2)cc3 74 | [#7]-2-c:1:c:c:c:c:c:1-[#6](=[#7])-c:3:c-2:c:c:c:c:3 75 | c:1:c(:c:c:c:c:1)-[#7]-2-[#6](-[#1])-[#6](-[#1])-[#7](-[#6](-[#1])-[#6]-2-[#1])-[#16](=[#8])(=[#8])-c:3:c:c:c:c:4:n:s:n:c:3:4 76 | c:1(:c(:c-,:2:c(:c(:c:1-[#1])-[#1])-,:[#7](-,:[#6](-,:[#7]-,:2-[#1])=[#8])-[#1])-[#1])-[#7](-[#1])-[#6](-[#1])-[#1] 77 | c:1(:c(:c-3:c(:c(:c:1-[#7](-[#1])-[#16](=[#8])(=[#8])-c:2:c:c:c(:c:c:2)-[!#6&!#1])-[#1])-[#8]-[#6](-[#8]-3)(-[#1])-[#1])-[#1])-[#1] 78 | [#6](-[#1])-[#6]:2:[#7]:[#7](-c:1:c:c:c:c:c:1):[#16]:3:[!#6&!#1]:[!#1]:[#6]:[#6]:2:3 79 | [#8]=[#6]-[#6]=[#6](-[#1])-[#8]-[#1] 80 | [#7]-,:1-,:2-,:[#6](=,:[#7]-,:[#6](=[#8])-,:[#6](=,:[#7]-,:1)-[#6](-[#1])-[#1])-,:[#16]-,:[#6](=[#6](-[#1])-[#6]:[#6])-,:[#6]-,:2=[#8] 81 | [#6]:[#6]-[#6](-[#1])=[#6](-[#1])-[#6](-[#1])=[#7]-[#7](-[#6;X4])-[#6;X4] 82 | c:1:3:c(:c:c:c:c:1):c:2:n:n:c(-[#16]-[#6](-[#1])(-[#1])-[#6]=[#8]):n:c:2:n:3-[#6](-[#1])(-[#1])-[#6](-[#1])=[#6](-[#1])-[#1] 83 | n1(-[#6])c(c(-[#1])c(c1-[#6](-[#1])(-[#1])-[#7](-[#1])-[#6](=[#16])-[#7]-[#1])-[#1])-[#1] 84 | n2(-[#6]:1:[!#1]:[!#6&!#1]:[!#1]:[#6]:1-[#1])c(c(-[#1])c(c2-[#6;X4])-[#1])-[#6;X4] 85 | c:1(:c:c:c:c:c:1)-[#7](-[#1])-[#6](=[#16])-[#7]-[#7](-[#1])-[#6]([#7;R])[#7;R] 86 | c:1(:c(:c(:c(:c(:[c;!H0,$(c-[#6](-[#1])-[#1])]:1)-[#1])-[#8]-[#6](-[#1])-[#1])-[#6](-[#1])(-[#1])-[$([#7](-[#1])-[#6](=[#8])-[#6](-[#1])(-[#1])-[#6](-[#1])(-[#1])-[#6](-[#1])-[#1]),$([#6](-[#1])(-[#6](-[#1])-[#1])-[#7](-[#1])-[#6](=[#16])-[#7]-[#1])])-[#1])-[#8]-[#6](-[#1])-[#1] 87 | n2(-[#6]:1:[#6](-[#6]#[#7]):[#6]:[#6]:[!#6&!#1]:1)c(c(-[#1])c(c2)-[#1])-[#1] 88 | [#7](-[#1])(-[#1])-[#6]-2=[#6](-[#6]#[#7])-[#6](-[#1])(-[#6]:[#6])-c:1:c(:c:c:s:1)-[#8]-2 89 | [#7](-[#1])-c:1:n:c(:c:s:1)-c:2:c:n:c(-[#7](-[#1])-[#1]):s:2 90 | [#7]=[#6]-1-[#7](-[#1])-[#6](=[#6](-[#7]-[#1])-[#7]=[#7]-1)-[#7]-[#1] 91 | c:1:c(:c:2:c(:c:c:1):c:c:c:c:2)-[#8]-c:3:c(:c(:c(:c(:c:3-[#1])-[#1])-[#7]-[#1])-[#1])-[#1] 92 | c:1:c:c-2:c(:c:c:1)-[#6]-[#16]-c3c(-[#6]-2=[#6])ccs3 93 | c:2:c:c:c:1:c(:c:c:c:1):c:c:2 94 | c:1(:c(:c(:c(:o:1)-[#6](-[#1])-[#1])-[#6](-[#1])(-[#1])-[#8]-[#6]:[#6])-[#1])-[#6](=[#8])-[#8]-[#1] 95 | [!#1]:[#6]-[#6]-,:1=,:[#6](-[#1])-,:[#6](=,:[#6](-[#6]#[#7])-,:[#6](=[#8])-,:[#7]-,:1-[#1])-[#6]:[#8] 96 | [#6]-1-3=[#6](-[#6](-[#7]-c:2:c:c:c:c:c-1:2)(-[#6])-[#6])-[#16]-[#16]-[#6]-3=[!#1] 97 | c:1(:c(:c(:c(:c(:c:1-[#7](-[#1])-[#6](=[#8])-c:2:c:c:c:c:c:2)-[#1])-[#7](-[#6](-[#1])-[#1])-[#6](-[#1])-[#1])-[#1])-[#1])-[#1] 98 | [#6](-[#1])(-[#1])-[#16;X2]-c:1:n:n:c(:c(:n:1)-c:2:c(:c(:c(:o:2)-[#1])-[#1])-[#1])-c:3:c(:c(:c(:o:3)-[#1])-[#1])-[#1] 99 | [#6](-[#1])(-[#1])-[#7](-[#6](-[#1])-[#1])-[#6]-2=[#6]-c:1:c(:c:c:c:c:1)-[#6]-2(-[#1])-[#1] 100 | [#7](-[#1])(-c:1:c:c:c:c:c:1)-[#7]=[#6](-[#6](=[#8])-[#6](-[#1])-[#1])-[#7](-[#1])-[$([#7]-[#1]),$([#6]:[#6])] 101 | c:1:2:c(:c(:c(:c(:c:1-[#1])-[#1])-[#1])-[#1]):o:c:3:c(-[#1]):c(:c(-[#8]-[#6](-[#1])-[#1]):c(:c:2:3)-[#1])-[#7](-[#1])-[#6](-[#1])-[#1] 102 | [#16]=[#6]-,:1-,:[#7](-[#1])-,:[#6]=,:[#6]-,:[#6]-2=,:[#6]-,:1-[#6](=[#8])-[#8]-[#6]-2=[#6]-[#1] 103 | n2(-c:1:c(:c:c(:c(:c:1)-[#1])-[$([#7](-[#1])-[#1]),$([#6]:[#7])])-[#1])c(c(-[#1])c(c2-[#1])-[#1])-[#1] 104 | n1(-[#6])c(c(-[#1])c(c1-[#6](-[#1])=[#6]-2-[#6](=[#8])-[!#6&!#1]-[#6]=,:[!#1]-2)-[#1])-[#1] 105 | [#6]=[#6]-[#6](-[#6]#[#7])(-[#6]#[#7])-[#6](-[#6]#[#7])=[#6]-[#7](-[#1])-[#1] 106 | [#6]:[#6]-[#6](=[#16;X1])-[#16;X2]-[#6](-[#1])-[$([#6](-[#1])-[#1]),$([#6]:[#6])] 107 | [#8]=[#6]-3-[#6](=!@[#6](-[#1])-c:1:c:n:c:c:1)-c:2:c:c:c:c:c:2-[#7]-3 108 | c:1(:[c;!H0,$(c-[#6;!H0;!H1])](:c(:c(:s:1)-[#1])-[#1]))-[#6](-[#1])=[#7]-[#7](-[#1])-c:2:c:c:c:c:c:2 109 | [#6](-[#1])(-[#1])-[#16;X2]-[#6]-1=[#6](-[#6]#[#7])-[#6](-[#1])(-[#6]:[#6])-[#6](-[#6]#[#7])-[#6](=[#8])-[#7]-1 110 | [#7]-2(-c:1:c:c:c:c:c:1)-[#7]=[#6](-[#7](-[#1])-[#6]=[#8])-[#6](-[#1])(-[#1])-[#6]-2=[#8] 111 | [#6]:[#6]-[#6](-[#1])=[#6](-[#1])-[#6](-[#1])=[#7]-[#7]=[#6] 112 | c:1(:c:c:c(:c:c:1)-[#6](-[#1])-[#1])-c:2:c(:s:c(:n:2)-[#7](-[#1])-[#1])-[#6](-[#1])(-[#1])-[#1] 113 | [#6]-2(-[#6]=[#7]-c:1:c:c:c:c:c:1-[#7]-2)=[#6](-[#1])-[#6]=[#8] 114 | [#8](-c:1:c:c:c:c:c:1)-c:3:c:c:2:n:o:n:c:2:c:c:3 115 | [!#1]:1:[!#1]:[!#1]:[!#1](:[!#1]:[!#1]:1)-[#6](-[#1])=[#6](-[#1])-[#6](-[#7]-c:2:c:c:c:3:c(:c:2):c:c:c(:n:3)-[#7](-[#6])-[#6])=[#8] 116 | [#7](-[#1])(-[#1])-c:1:c(:c:c:c:n:1)-[#8]-[#6](-[#1])(-[#1])-[#6]:[#6] 117 | [#6]-[#16;X2]-c:1:n:c(:c:s:1)-[#1] 118 | c:1:c-3:c(:c:c:c:1)-[#7](-c:2:c:c:c:c:c:2-[#8]-3)-[#6](-[#1])(-[#1])-[#6](-[#1])-[#1] 119 | c:1(:c(:c(:c(:o:1)-[#6](-[#1])-[#1])-[#1])-[#1])-[#6](-[#1])(-[#8]-[#1])-[#6]#[#6]-[#6;X4] 120 | [#6]-1(-[#6](=[#6]-[#6]=[#6]-[#6]=[#6]-1)-[#7]-[#1])=[#7]-[#6] 121 | [#6](-[#1])(-[#1])-[#7](-[#6](-[#1])-[#1])-[#6](-[#1])=[#6]-[#6](=[#8])-c:1:c(-[#16;X2]):s:c(:c:1)-[$([#6]#[#7]),$([#6]=[#8])] 122 | c:1:3:c(:c:c:c:c:1)-[#7]-2-[#6](=[#8])-[#6](=[#6](-[F,Cl,Br,I])-[#6]-2=[#8])-[#7](-[#1])-[#6]:[#6]:[#6]:[#6](-[#8]-[#6](-[#1])-[#1]):[#6]:[#6]:3 123 | c:1-2:c(:c:c:c:c:1)-[#6](-[#1])(-[#1])-[#6](-[#1])(-[#1])-[#7]=[#6]-2-[#16;X2]-[#6](-[#1])(-[#1])-[#6](=[#8])-c:3:c:c:c:c:c:3 124 | [#7]-2(-c:1:c:c:c:c:c:1-[#6](-[#1])-[#1])-[#6](=[#16])-[#7](-[#6](-[#1])(-[#1])-[!#1]:[!#1]:[!#1]:[!#1]:[!#1])-[#6](-[#1])(-[#1])-[#6]-2=[#8] 125 | [#7]-2(-[#6](-[#1])-[#1])-[#6](=[#16])-[#7](-[#1])-[#6](=[#6](-[#1])-c:1:c:c:c:c(:c:1)-[Br])-[#6]-2=[#8] 126 | c:1(:c(:c:2:c(:s:1):c:c:c:c:2)-[#6](-[#1])-[#1])-[#6](=[#8])-[#6](-[#1])(-[#1])-[#6](-[#1])-[#1] 127 | [#7](-[#6](-[#1])-[#1])(-[#6](-[#1])-[#1])-[#6](-[#1])=[#7]-[#6](-[#6](-[#1])-[#1])=[#7]-[#7](-[#6](-[#1])-[#1])-[#6]:[#6] 128 | [#6]:2(:[#6](-[#6](-[#1])-[#1]):[#6]-,:1:[#6](-,:[#7]=,:[#6;!H0,$([#6]-[#16]-[#6](-[#1])-[#1])](-,:[#7](-,:[#6]-,:1=[!#6&!#1;X1])-[#6](-[#1])-[$([#6](=[#8])-[#8]),$([#6]:[#6])])):[!#6&!#1;X2]:2)-[#6](-[#1])(-[#1])-[#6](-[#1])-[#1] 129 | c:1(:n:c(:c(-[#1]):s:1)-[!#1]:[!#1]:[!#1](-[$([#8]-[#6](-[#1])-[#1]),$([#6](-[#1])-[#1])]):[!#1]:[!#1])-[#7](-[#1])-[#6](-[#1])(-[#1])-c:2:c(-[#1]):c(:c(-[#1]):o:2)-[#1] 130 | n:1:c(:c(:c(:c(:c:1-[#16]-[#6]-[#1])-[#6]#[#7])-c:2:c:c:c(:c:c:2)-[#8]-[#6](-[#1])-[#1])-[#1])-[#6]:[#6] 131 | c:1:4:c(:n:c(:n:c:1-[#7](-[#1])-[#6](-[#1])(-[#1])-c:2:c(:c(:c(:o:2)-[#1])-[#1])-[#1])-[#7](-[#1])-c:3:c:[c;!H0,$(c-[#6](-[#1])-[#1]),$(c-[#16;X2]),$(c-[#8]-[#6]-[#1]),$(c-[#7;X3])](:[c;!H0,$(c-[#6](-[#1])-[#1]),$(c-[#16;X2]),$(c-[#8]-[#6]-[#1]),$(c-[#7;X3])](:c:[c;!H0,$(c-[#6](-[#1])-[#1]),$(c-[#16;X2]),$(c-[#8]-[#6]-[#1]),$(c-[#7;X3])]:3))):c:c:c:c:4 132 | [#7](-[#1])(-[#6]:1:[#6]:[#6]:[!#1]:[#6]:[#6]:1)-c:2:c:c:c(:c:c:2)-[#7](-[#1])-[#6]-[#1] 133 | [#7]-2(-c:1:c:c:c:c:c:1)-[#6](=[#7]-[#6]=[#8])-[#16]-[#6](-[#1])(-[#1])-[#6]-2=[#8] 134 | [#6]=[#6]-[#6](=[#8])-[#7]-c:1:c(:c(:c(:s:1)-[#6](=[#8])-[#8])-[#6]-[#1])-[#6]#[#7] 135 | [#8;!H0,$([#8]-[#6](-[#1])-[#1])]-c:1:c(:c(:c(:c(:c:1-[#1])-[#1])-[#1])-[#1])-[#7](-[#1])-[#6](-[#1])(-[#1])-c:2:n:c:c:n:2 136 | [#6](-[#1])(-[#1])-[#16;X2]-c3nc1c(n(nc1-[#6](-[#1])-[#1])-c:2:c:c:c:c:c:2)nn3 137 | [#6]-[#6](=[#8])-[#6](-[#1])(-[#1])-[#16;X2]-c:3:n:n:c:2:c:1:c(:c(:c(:c(:c:1:n(:c:2:n:3)-[#1])-[#1])-[#1])-[#1])-[#1] 138 | s:1:c(:[n+](-[#6](-[#1])-[#1]):c(:c:1-[#1])-[#6])-[#7](-[#1])-c:2:c:c:c:c:c:2[$([#6](-[#1])-[#1]),$([#6]:[#6])] 139 | [#6]-,:2(=[#16])-,:[#7](-[#6](-[#1])(-[#1])-c:1:c:c:c:o:1)-,:[#6](=,:[#7]-,:[#7]-,:2-[#1])-[#6]:[#6] 140 | [#7]-,:2(-c:1:c:c:c:c:c:1)-,:[#6](=[#8])-,:[#6](=,:[#6]-,:[#6](=,:[#7]-,:2)-[#6]#[#7])-[#6]#[#7] 141 | [#7]-2(-c:1:c:c:c:c:c:1)-[#6](=[#8])-[#16]-[#6](-[#1])(-[#6](-[#1])(-[#1])-[#6](=[#8])-[#7](-[#1])-[#6]:[#6])-[#6]-2=[#8] 142 | [#6](-[#1])(-[#1])-[#7]-2-[#6](=[$([#16]),$([#7])])-[!#6&!#1]-[#6](=[#6]-1-[#6](=[#6](-[#1])-[#6]:[#6]-[#7]-1-[#6](-[#1])-[#1])-[#1])-[#6]-2=[#8] 143 | [#6]=[#7;!R]-c:1:c:c:c:c:c:1-[#8]-[#1] 144 | [#8]=[#6]-,:2-,:[#16]-,:c:1:c(:c(:c:c:c:1)-[#8]-[#6](-[#1])-[#1])-,:[#8]-,:2 145 | [#7]=,:[#6]-,:1-,:[#7]=,:[#6]-,:[#7]-,:[#16]-,:1 146 | [#7]-,:2-,:[#16]-,:[#6]-1=,:[#6](-[#6]:[#6]-[#7]-[#6]-1)-,:[#6]-,:2=[#16] 147 | [#6](-[#1])(-[#1])-[#7](-[#6](-[#1])-[#1])-c:1:c(:c(:c(:c(:c:1-[#1])-[#1])-[#6](-[#1])=[#7]-[#7]=[#6](-[#6])-[#6]:[#6])-[#1])-[#1] 148 | n1-2cccc1-[#6]=[#7](-[#6])-[#6]-[#6]-2 149 | [#6](-[#6]#[#7])(-[#6]#[#7])=[#6](-[#16])-[#16] 150 | [#6]-1(-[#6]#[#7])(-[#6]#[#7])-[#6](-[#1])(-[#6](=[#8])-[#6])-[#6]-1-[#1] 151 | [#6]-1=,:[#6]-[#6](-[#6](-[$([#8]),$([#16])]-1)=[#6]-[#6]=[#8])=[#8] 152 | [#6]:[#6]-[#6](=[#8])-[#7](-[#1])-[#6](=[#8])-[#6](-[#6]#[#7])=[#6](-[#1])-[#7](-[#1])-[#6]:[#6] 153 | c:1(:c:c:c:c:c:1)-[#7](-[#1])-[#6](=[#16])-[#7](-[#1])-[#7]=[#6]-c:2:c:n:c:c:2 154 | [#7](-[#1])(-[#1])-[#6]-2=[#6](-[#6]#[#7])-[#6](-[#1])(-c:1:c:c:c:s:1)-[#6](=[#6](-[#6](-[#1])-[#1])-[#8]-2)-[#6](=[#8])-[#8]-[#6] 155 | c:1:c-3:c(:c:c(:c:1)-[#6](=[#8])-[#7](-[#1])-c:2:c(:c:c:c:c:2)-[#6](=[#8])-[#8]-[#1])-[#6](-[#7](-[#6]-3=[#8])-[#6](-[#1])-[#1])=[#8] 156 | [Cl]-c:2:c:c:1:n:o:n:c:1:c:c:2 157 | [#6]-[#6](=[#16])-[#1] 158 | [#6;X4]-[#7](-[#1])-[#6](-[#6]:[#6])=[#6](-[#1])-[#6](=[#16])-[#7](-[#1])-c:1:c:c:c:c:c:1 159 | [#6](-[#1])(-[#1])-[#6](-[#1])(-[#1])-[#16]-[#6](-[#1])(-[#1])-c1cn(cn1)-[#1] 160 | [#8]=[#6]-[#7](-[#1])-c:1:c(-[#6]:[#6]):n:c(-[#6](-[#1])(-[#1])-[#6]#[#7]):s:1 161 | [#6](-[#1])-[#7](-[#1])-c:1:n:c(:c:s:1)-c2cnc3n2ccs3 162 | [#7]-,:1-,:[#6](=[#8])-,:[#6](=,:[#6](-[#6])-,:[#16]-,:[#6]-,:1=[#16])-[#1] 163 | [#6](-[#16])(-[#7])=[#6](-[#1])-[#6]=[#6](-[#1])-[#6]=[#8] 164 | [#8]=[#6]-3-c:1:c(:c:c:c:c:1)-[#6]-2=[#6](-[#8]-[#1])-[#6](=[#8])-[#7]-c:4:c-2:c-3:c:c:c:4 165 | c:1:2:c:c:c:c(:c:1:c(:c:c:c:2)-[$([#8]-[#1]),$([#7](-[#1])-[#1])])-[#6](-[#6])=[#8] 166 | [#6](-[#1])(-c:1:c:c:c:c:c:1)(-c:2:c:c:c:c:c:2)-[#6](=[#16])-[#7]-[#1] 167 | [#7]-2(-[#6](=[#8])-c:1:c(:c(:c(:c(:c:1-[#1])-[#6](=[#8])-[#8]-[#1])-[#1])-[#1])-[#6]-2=[#8])-c:3:c(:c:c(:c(:c:3)-[#1])-[#8])-[#1] 168 | c:1:c:c(:c:c:c:1-[#7](-[#1])-[#16](=[#8])=[#8])-[#7](-[#1])-[#16](=[#8])=[#8] 169 | [#6](-[#1])-[#7](-[#1])-c:1:c(:c(:c(:c(:c:1-[#1])-[#1])-[#1])-[#1])-[#7](-[#1])-[#6]-[#1] 170 | s1c(c(c-,:2c1-,:[#7](-[#1])-,:[#6](-,:[#6](=,:[#6]-,:2-[#1])-[#6](=[#8])-[#8]-[#1])=[#8])-[#7](-[#1])-[#1])-[#6](=[#8])-[#7]-[#1] 171 | c:2(:c:1:c(:c(:c(:c(:c:1:c(:c(:c:2-[#1])-[#1])-[#1])-[#1])-[#7](-[#1])-[#7](-[#1])-[#6]=[#8])-[#1])-[#1])-[#1] 172 | [#6](-[#1])(-[#1])-c:1:c(:c(:c(:c(:c:1-[#8]-[#6](-[#1])-[#1])-[#1])-[#1])-[#6](-[#1])(-[#1])-[#7](-[#1])-[#6;X4])-[#1] 173 | [#6]-1=[#6]-[#7]-[#6](-[#16]-[#6;X4]-1)=[#16] 174 | [#6](-[#7](-[#6]-[#1])-[#6]-[#1]):[#6]-[#7](-[#1])-[#6](=[#16])-[#6]-[#1] 175 | n2nc(c1cccc1c2-[#6])-[#6] 176 | s:1:c(:c(-[#1]):c(:c:1-[#6](=[#8])-[#7](-[#1])-[#7]-[#1])-[#8]-[#6](-[#1])-[#1])-[#1] 177 | [#6]-1:[#6]-[#7]=[#6]-[#6](=[#6]-[#7]-[#6])-[#16]-1 178 | [#6](-[#1])(-[#1])-[#6](-[#1])(-[#6]#[#7])-[#6](=[#8])-[#6] 179 | c2(c(-[#7](-[#1])-[#1])n(-c:1:c:c:c:c:c:1-[#6](=[#8])-[#8]-[#1])nc2-[#6]=[#8])-[$([#6]#[#7]),$([#6]=[#16])] 180 | c:2:c:1:c:c:c:c-,:3:c:1:c(:c:c:2)-,:[#7](-,:[#7]=,:[#6]-,:3)-[#1] 181 | c:2:c:1:c:c:c:c-,:3:c:1:c(:c:c:2)-,:[#7]-,:[#7]=,:[#7]-,:3 182 | c1csc(n1)-[#7]-[#7]-[#16](=[#8])=[#8] 183 | c:1:c:c:c:2:c(:c:1):n:c(:n:c:2)-[#7](-[#1])-[#6]-3=[#7]-[#6](-[#6]=[#6]-[#7]-3-[#1])(-[#6](-[#1])-[#1])-[#6](-[#1])-[#1] 184 | c:1-,:3:c(:c(:c(:c(:c:1)-[#8]-[#6]-[#1])-[#1])-[#1])-,:c:2:c(:c(:c(:c(:c:2-[#1])-[#1])-[#8]-[#6](-[#1])-[#1])-[#1])-,:[#6](=[#8])-,:[#8]-,:3 185 | c:12:c(:c:c:c:n:1)c(c(-[#6](=[#8])~[#8;X1])s2)-[#7](-[#1])-[#1] 186 | c:1:2:n:c(:c(:n:c:1:[#6]:[#6]:[#6]:[!#1]:2)-[#6](-[#1])=[#6](-[#8]-[#1])-[#6])-[#6](-[#1])=[#6](-[#8]-[#1])-[#6] 187 | c1csc(c1-[#7](-[#1])-[#1])-[#6](-[#1])=[#6](-[#1])-c2cccs2 188 | c:2:c:c:1:n:c:3:c(:n:c:1:c:c:2):c:c:c:4:c:3:c:c:c:c:4 189 | [#6]:[#6]-[#7](-[#1])-[#16](=[#8])(=[#8])-[#7](-[#1])-[#6]:[#6] 190 | c:1:c:c(:c:c:c:1-[#7](-[#1])-[#1])-[#7](-[#6;X3])-[#6;X3] 191 | [#7]-2=[#6](-c:1:c:c:c:c:c:1)-[#6](-[#1])(-[#1])-[#6](-[#8]-[#1])(-[#6](-[#9])(-[#9])-[#9])-[#7]-2-[$([#6]:[#6]:[#6]:[#6]:[#6]:[#6]),$([#6](=[#16])-[#6]:[#6]:[#6]:[#6]:[#6]:[#6])] 192 | c:1:c(:c:c:c:c:1)-[#6](=[#8])-[#6](-[#1])=[#6]-,:3-,:[#6](=[#8])-,:[#7](-[#1])-,:[#6](=[#8])-,:[#6](=[#6](-[#1])-c:2:c:c:c:c:c:2)-,:[#7]-,:3-[#1] 193 | [#8]=[#6]-4-[#6]-[#6]-[#6]-3-[#6]-2-[#6](=[#8])-[#6]-[#6]-1-[#6]-[#6]-[#6]-[#6]-1-[#6]-2-[#6]-[#6]-[#6]-3=[#6]-4 194 | c:1:2:c:3:c(:c(-[#8]-[#1]):c(:c:1:c(:c:n:2-[#6])-[#6]=[#8])-[#1]):n:c:n:3 195 | [#6;X4]-[#7+](-[#6;X4]-[#8]-[#1])=[#6]-[#16]-[#6]-[#1] 196 | [#6]-3(=[#8])-[#6](=[#6](-[#1])-[#7](-[#1])-c:1:c:c:c:c:c:1-[#6](=[#8])-[#8]-[#1])-[#7]=[#6](-c:2:c:c:c:c:c:2)-[#8]-3 197 | c:1(:c(:c(:[c;!H0,$(c-[#6;!H0;!H1])](:o:1))-[#1])-[#1])-[#6;!H0,$([#6]-[#6;!H0;!H1])]=[#7]-[#7](-[#1])-c:2:c:c:n:c:c:2 198 | c:1(:c(:c(:[c;!H0,$(c-[#6;!H0,!H1])](:s:1))-[#1])-[#1])-[#6;!H0,$([#6]-[#6;!H0;!H1])]-[#6](=[#8])-[#7](-[#1])-c:2:n:c:c:s:2 199 | [#6]:[#6]-[#6](-[#1])(-[#1])-[#6](-[#1])(-[#6]=[#8])-[#7]-2-[#6](=[#8])-[#6]-1(-[#1])-[#6](-[#1])(-[#1])-[#6]=[#6]-[#6](-[#1])(-[#1])-[#6]-1(-[#1])-[#6]-2=[#8] 200 | [#6]-1(-[#6]=[#8])(-[#6]:[#6])-[#16;X2]-[#6]=[#7]-[#7]-1-[#1] 201 | [#7](-[#1])(-[#1])-c:1:c(:c(:c(:s:1)-[#7](-[#1])-[#6](=[#8])-c:2:c:c:c:c:c:2)-[#6]#[#7])-[#6]:3:[!#1]:[!#1]:[!#1]:[!#1]:[!#1]:3 202 | [#6](-[#1])(-[#1])-[#8]-c:1:c(:c(:c(:c(:c:1-[#1])-[#1])-[#6](-[#1])-[#1])-[#1])-[#7](-[#1])-[#6](-[#1])(-[#1])-c:2:c:c:c:c:c:2-[$([#6](-[#1])-[#1]),$([#8]-[#6](-[#1])-[#1])] 203 | [#6](-[#1])(-[#1])(-[#1])-[#6](-[#6](-[#1])(-[#1])-[#1])(-[#6](-[#1])(-[#1])-[#1])-c:1:c(:c:c(:c(:c:1-[#1])-[#6](-[#6](-[#1])(-[#1])-[#1])(-[#6](-[#1])(-[#1])-[#1])-[#6](-[#1])(-[#1])-[#1])-[#8]-[#6](-[#1])-[#7])-[#1] 204 | c:1(:c(:o:c:c:1)-[#6]-[#1])-[#6]=[#7]-[#7](-[#1])-[#6](=[#16])-[#7]-[#1] 205 | [#7](-[#1])-c1nc(nc2nnc(n12)-[#16]-[#6])-[#7](-[#1])-[#6] 206 | c:1-,:2:c(:c:c:c:c:1-[#6](-[#1])(-[#1])-[#6](-[#1])=[#6](-[#1])-[#1])-,:[#6](=,:[#6](-[#6](=[#8])-[#7](-[#1])-[#6]:[#6])-,:[#6](=[#8])-,:[#8]-,:2)-[#1] 207 | [#6]-2(=[#16])-[#7]-1-[#6]:[#6]-[#7]=[#7]-[#6]-1=[#7]-[#7]-2-[#1] 208 | [#6]:[#6]:[#6]:[#6]:[#6]:[#6]-c:1:c:c(:c(:s:1)-[#7](-[#1])-[#6](=[#8])-[#6])-[#6](=[#8])-[#8]-[#1] 209 | [#7](-[#1])(-[#1])-c:1:c(:c(:c(:c:c:1-[#7](-[#1])-[#6](-[#1])(-[#6])-[#6](-[#1])-[#6](-[#1])-[#1])-[#1])-[#1])-[#1] 210 | [#16]=[#6]-,:2-,:[#7](-[#1])-,:[#7]=,:[#6](-c:1:c(:c(:c(:c(:c:1-[#1])-[#1])-[#8]-[#6](-[#1])-[#1])-[#1])-[#1])-,:[#8]-,:2 211 | [#16]=[#6]-c:1:c:c:c:2:c:c:c:c:n:1:2 212 | [#6]~1~[#6](~[#7]~[#7]~[#6](~[#6](-[#1])-[#1])~[#6](-[#1])-[#1])~[#7]~[#16]~[#6]~1 213 | [#6]-1(-[#6]=,:[#6]-[#6]=,:[#6]-[#6]-1=[!#6&!#1])=[!#6&!#1] 214 | [#6](-[#1])(-[#1])-[#7](-[#6](-[#1])-[#1])-c:1:c(-[#1]):c(:c(:o:1)-[#6](-[#1])=[#6]-[#6]#[#7])-[#1] 215 | [#8]=[#6]-1-[#6]:[#6]-[#6](-[#1])(-[#1])-[#7]-[#6]-1=[#6]-[#1] 216 | [#6]:[#6]-[#7]:2:[#7]:[#6]:1-[#6](-[#1])(-[#1])-[#16;X2]-[#6](-[#1])(-[#1])-[#6]:1:[#6]:2-[#7](-[#1])-[#6](=[#8])-[#6](-[#1])=[#6]-[#1] 217 | n:1:c(:n(:c:2:c:1:c:c:c:c:2)-[#6](-[#1])-[#1])-[#16]-[#6](-[#1])(-[#1])-[#6](=[#8])-[#7](-[#1])-[#7]=[#6](-[#1])-[#6](-[#1])=[#6]-[#1] 218 | c:1(:c:c(:c(:c:c:1)-[#8]-[#1])-[#6](=!@[#6]-[#7])-[#6]=[#8])-[#8]-[#1] 219 | c:1(:c:c(:c(:c:c:1)-[#7](-[#1])-[#6](=[#8])-[#6]:[#6])-[#6](=[#8])-[#8]-[#1])-[#8]-[#1] 220 | n2(-[#6](-[#1])-[#1])c-1c(-[#6]:[#6]-[#6]-1=[#8])cc2-[#6](-[#1])-[#1] 221 | [#6](-[#1])-[#7](-[#1])-c:1:c(:c(:c(:s:1)-[#6]-[#1])-[#6]-[#1])-[#6](=[#8])-[#7](-[#1])-[#6]:[#6] 222 | [#6]:[#6]-[#7;!R]=[#6]-2-[#6](=[!#6&!#1])-c:1:c:c:c:c:c:1-[#7]-2 223 | c:1:c:c:c:c:c:1-[#6](=[#8])-[#7](-[#1])-[#7]=[#6]-3-c:2:c:c:c:c:c:2-c:4:c:c:c:c:c-3:4 224 | c:1:c(:c:c:c:c:1)-[#7](-[#6](-[#1])-[#1])-[#6](-[#1])=[#6](-[#1])-[#6]=!@[#6](-[#1])-[#6](-[#1])=[#6]-[#6]=@[#7]-c:2:c:c:c:c:c:2 225 | [#6]:1:2:[!#1]:[#7+](:[!#1]:[#6;!H0,$([#6]-[*])](:[!#1]:1:[#6]:[#6]:[#6]:[#6]:2))~[#6]:[#6] 226 | [#7]-2(-c:1:c:c:c:c:c:1)-[#7]=[#6](-[#6](-[#1])-[#1])-[#6](-[#1])(-[#16]-[#6])-[#6]-2=[#8] 227 | c:1:c:c:c(:c:c:1-[#7](-[#1])-c2nc(c(-[#1])s2)-c:3:c:c:c(:c:c:3)-[#6](-[#1])(-[#6]-[#1])-[#6]-[#1])-[#6](=[#8])-[#8]-[#1] 228 | [#6](-[#1])(-[#1])-[#7](-[#1])-[#6]=[#7]-[#7](-[#1])-c1nc(c(-[#1])s1)-[#6]:[#6] 229 | [#6]:[#6]-[#7](-[#1])-[#6](=[#8])-c1c(snn1)-[#7](-[#1])-[#6]:[#6] 230 | [#8]=[#16](=[#8])(-[#6]:[#6])-[#7](-[#1])-c1nc(cs1)-[#6]:[#6] 231 | [#8]=[#16](=[#8])(-[#6]:[#6])-[#7](-[#1])-[#7](-[#1])-c1nc(cs1)-[#6]:[#6] 232 | s2c:1:n:c:n:c(:c:1c(c2-[#6](-[#1])-[#1])-[#6](-[#1])-[#1])-[#7]-[#7]=[#6]-c3ccco3 233 | [#6](=[#8])-[#6](-[#1])=[#6](-[#8]-[#1])-[#6](-[#8]-[#1])=[#6](-[#1])-[#6](=[#8])-[#6] 234 | c:2(:c:1-[#6](-[#6](-[#6](-c:1:c(:c(:c:2-[#1])-[#1])-[#1])(-[#1])-[#1])=[#8])=[#6](-[#6](-[#1])-[#1])-[#6](-[#1])-[#1])-[#1] 235 | [#6]:[#6]-[#7](-[#1])-[#7]=[#6](-[#6](-[#1])-[#1])-[#6](-[#1])(-[#1])-[#6](-[#6](-[#1])-[#1])=[#7]-[#7](-[#1])-[#6]:[#6] 236 | [#6;X4]-[#16;X2]-[#6](=[#7]-[!#1]:[!#1]:[!#1]:[!#1])-[#7](-[#1])-[#7]=[#6] 237 | [#6]-1(=[#7]-[#7](-[#6](-[#16]-1)=[#6](-[#1])-[#6]:[#6])-[#6]:[#6])-[#6]=[#8] 238 | c:1(:c(:c:2:c(:n:c:1-[#7](-[#1])-[#1]):c:c:c(:c:2-[#7](-[#1])-[#1])-[#6]#[#7])-[#6]#[#7])-[#6]#[#7] 239 | [!#1]:1:[!#1]:[!#1]:[!#1](:[!#1]:[!#1]:1)-[#6](-[#1])=[#6](-[#1])-[#6](-[#7](-[#1])-[#7](-[#1])-c2nnnn2-[#6])=[#8] 240 | c:1:2:c(:c(:c(:c(:c:1:c(:c(:c(:c:2-[#1])-[#1])-[#6](=[#7]-[#6]:[#6])-[#6](-[#1])-[#1])-[#8]-[#1])-[#1])-[#1])-[#1])-[#1] 241 | c:1(:c(:c:2:c(:c(:c:1-[#8]-[#6](-[#1])-[#1])-[#1]):c(:c(:c(:c:2-[#7](-[#1])-[#6](-[#1])(-[#1])-[#1])-[#1])-c:3:c(:c(:c(:c(:c:3-[#1])-[#1])-[#8]-[#6](-[#1])-[#1])-[#8]-[#6](-[#1])-[#1])-[#1])-[#1])-[#1])-[#8]-[#6](-[#1])-[#1] 242 | c:1:c:c-2:c(:c:c:1)-[#16]-c3c(-[#7]-2)cc(s3)-[#6](-[#1])-[#1] 243 | c:1:c:c:c-2:c(:c:1)-[#6](-[#6](-[#7]-2-[#6](-[#1])(-[#1])-[#6](-[#1])(-[#1])-[#7]-4-[#6](-c:3:c:c:c:c:c:3-[#6]-4=[#8])=[#8])(-[#1])-[#1])(-[#1])-[#1] 244 | c:1(:c:c:c(:c:c:1)-[#6]-,:3=,:[#6]-,:[#6](-,:c2cocc2-,:[#6](=,:[#6]-,:3)-[#8]-[#1])=[#8])-[#16]-[#6](-[#1])-[#1] 245 | [#6;X4]-c:1:c(:c(:c(:c(:c:1-[#1])-[#1])-[#6](=[#8])-[#7](-[#1])-[#6](-[#1])(-[#6](-[#1])(-[#1])-[#6](-[#1])(-[#1])-[#16]-[#6](-[#1])(-[#1])-[#1])-[#6](=[#8])-[#8]-[#1])-[#1])-[#1] 246 | n:1:c(:n(:c(:c:1-c:2:c:c:c:c:c:2)-c:3:c:c:c:c:c:3)-[#7]=!@[#6])-[#7](-[#1])-[#1] 247 | [#6](-c:1:c:c:c(:c:c:1)-[#8]-[#1])(-c:2:c:c:c(:c:c:2)-[#8]-[#1])-[#8]-[#16](=[#8])=[#8] 248 | c:2:c:c:1:n:c(:c(:n:c:1:c:c:2)-[#6](-[#1])(-[#1])-[#6](=[#8])-[#6]:[#6])-[#6](-[#1])(-[#1])-[#6](=[#8])-[#6]:[#6] 249 | c:1(:c(:c(:c(:c(:c:1-[#1])-[#8]-[#6](-[#1])-[#1])-[#8]-[#6](-[#1])-[#1])-[#1])-[#1])-[#6](=[#8])-[#6](-[#1])(-[#1])-[#7](-[#6](-[#1])-[#1])-c:2:c:c:c(-[#6](-[#1])-[#1])c:c:2 250 | [#6](-[#1])(-[#1])-c1nnnn1-c:2:c(:c(:c(:c(:c:2-[#1])-[#1])-[#8]-[#6](-[#1])(-[#1])-[#1])-[#1])-[#1] 251 | [#6]-2(=[#7]-c1c(c(nn1-[#6](-[#6]-2(-[#1])-[#1])=[#8])-[#7](-[#1])-[#1])-[#7](-[#1])-[#1])-[#6] 252 | [#6](-[#6]:[#6])(-[#6]:[#6])(-[#6]:[#6])-[#16]-[#6]:[#6]-[#6](=[#8])-[#8]-[#1] 253 | [#8]=[#6](-c:1:c(:c(:n:c(:c:1-[#1])-[#8]-[#6](-[#1])(-[#1])-[#1])-[#8]-[#6](-[#1])(-[#1])-[#1])-[#1])-[#7](-[#1])-[#6](-[#1])(-[#6](-[#1])-[#1])-[#6](-[#1])-[#1] 254 | [#7]-1=[#6](-[#7](-[#6](-[#6](-[#6]-1(-[#1])-[#6]:[#6])(-[#1])-[#1])=[#8])-[#1])-[#7]-[#1] 255 | [#6]-1(=[#6](-[#6](-[#6](-[#6](-[#6]-1(-[#1])-[#1])(-[#1])-[#6](=[#8])-[#6])(-[#1])-[#6](=[#8])-[#8]-[#1])(-[#1])-[#1])-[#6]:[#6])-[#6]:[#6] 256 | [#6](-[#1])(-c:1:c(:c(:c(:c(:c:1-[#1])-[#1])-[Cl])-[#1])-[#1])(-c:2:c(:c(:c(:c(:c:2-[#1])-[#1])-[Cl])-[#1])-[#1])-[#8]-[#6](-[#1])(-[#1])-[#6](-[#1])(-[#1])-[#6](-[#1])(-[#1])-c3nc(c(n3-[#6](-[#1])(-[#1])-[#1])-[#1])-[#1] 257 | n:1:c(:c(:c(:c(:c:1-[#1])-[#7](-[#1])-[#1])-[#1])-[#1])-[#7](-[#1])-[#6]:[#6] 258 | [#7](-[#1])(-c:1:c(:c(:c(:c(:c:1-[#1])-[#1])-[#1])-[#1])-[#8]-[#1])-[#6]-2=[#6](-[#8]-[#6](-[#7]=[#7]-2)=[#7])-[#7](-[#1])-[#1] 259 | [#7](-[#1])(-c:1:c(:c(:c(:c(:c:1-[#1])-[#1])-[#6](-[#1])-[#1])-[#1])-[#1])-[#6](-[#1])(-[#1])-[#6](-[#1])(-[#1])-c:2:c(:c(:c(:c(:c:2-[#1])-[#1])-[#8]-[#6](-[#1])-[#1])-[#1])-[#1] 260 | c:1:c:c-3:c(:c:c:1)-c:2:c:c:c(:c:c:2-[#6]-3=[#6](-[#1])-[#6])-[#7](-[#1])-[#1] 261 | c:1:c:c-2:c(:c:c:1)-[#7](-[#6](-[#8]-[#6]-2)(-[#6](=[#8])-[#8]-[#1])-[#6](-[#1])-[#1])-[#6](=[#8])-[#6](-[#1])-[#1] 262 | n:1:c(:c(:c(:c(:c:1-[#7](-[#1])-[#1])-[#6](-[#1])-[#1])-[#1])-[#6](-[#1])-[#1])-[#7](-[#1])-[#1] 263 | [#7](-[#1])(-c:1:c:c:c:c:c:1)-[#6](-[#6])(-[#6])-c:2:c(:c(:c(:c(:c:2-[#1])-[#1])-[#8]-[#6](-[#1])-[#1])-[#1])-[#1] 264 | [#7](-[#1])(-c:1:c(:c(:c(:c(:c:1-[#1])-[#1])-[#8]-[#6](-[#1])(-[#1])-[#1])-[#8]-[#6]-[#1])-[#1])-[#6](=[#8])-[#7](-[#1])-[#6](-[#1])(-[#1])-[#6](-[#1])(-[#1])-[#6](-[#1])(-[#1])-[#7](-[#6](-[#1])(-[#1])-[#1])-[#6]:[#6] 265 | c:1-2:c:c-3:c(:c:c:1-[#8]-[#6]-[#8]-2)-[#6]-[#6]-3 266 | c:1(:c(:c(:c(:c(:c:1-[#1])-[#1])-[#8]-[#6](-[#1])-[#1])-[#1])-[#6](=[#8])-[#8]-[#1])-[#7](-[#1])-[#6]:[#6] 267 | c:1(:c:4:c(:n:c(:c:1-[#6](-[#1])(-[#1])-[#7]-3-c:2:c(:c(:c(:c(:c:2-[#6](-[#1])(-[#1])-[#6]-3(-[#1])-[#1])-[#1])-[#1])-[#1])-[#1])-[#1]):c(:c(:c(:c:4-[#1])-[#1])-[#1])-[#1])-[#1] 268 | c:1:c(:c2:c(:c:c:1)c(c(n2-[#1])-[#6]:[#6])-[#6]:[#6])-[#6](=[#8])-[#8]-[#1] 269 | [#6]:[#6]-[#7](-[#6](-[#1])-[#1])-[#6](-[#1])(-[#1])-[#6](-[#1])(-[#1])-[#6](-[#1])(-[#1])-[#7](-[#1])-[#6](=[#16])-[#7](-[#1])-c:1:c(:c(:c(:c(:c:1-[F,Cl,Br,I])-[#1])-[#6](-[#1])-[#1])-[#1])-[#1] 270 | n:1:c3:c(:c:c2:c:1nc(s2)-[#7])sc(n3)-[#7] 271 | [#7]=[#6]-1-[#16]-[#6](=[#7])-[#7]=[#6]-1 272 | c:1:c(:n:c:c:c:1)-[#6](=[#16])-[#7](-[#1])-c:2:c(:c:c:c:c:2)-[#8]-[#6](-[#1])-[#1] 273 | c:1-2:c(:c(:c(:c(:c:1-[#6](-c:3:c(-[#16]-[#6]-2(-[#1])-[#1]):c(:c(-[#1]):c(:c:3-[#1])-[#1])-[#1])-[#8]-[#6]:[#6])-[#1])-[#1])-[#1])-[#1] 274 | [#6](-[#1])(-[#1])(-[#1])-c:1:c(:c(:c(:c(:n:1)-[#7](-[#1])-[#16](-c:2:c(:c(:c(:c(:c:2-[#1])-[#1])-[#8]-[#6](-[#1])(-[#1])-[#6](-[#1])(-[#1])-[#6](-[#1])-[#1])-[#1])-[#1])(=[#8])=[#8])-[#1])-[#1])-[#1] 275 | [#6](=[#8])(-[#7]-1-[#6]-[#6]-[#16]-[#6]-[#6]-1)-c:2:c(:c(:c(:c(:c:2-[#16]-[#6](-[#1])-[#1])-[#1])-[#1])-[#1])-[#1] 276 | c:1:c:c:3:c:2:c(:c:1)-[#6](-[#6]=[#6](-c:2:c:c:c:3)-[#8]-[#6](-[#1])-[#1])=[#8] 277 | c:1-3:c:2:c(:c(:c:c:1)-[#7]):c:c:c:c:2-[#6](-[#6]=[#6]-3-[#6](-[F])(-[F])-[F])=[#8] 278 | c:1:c:c:c:c:2:c:1:c:c:3:c(:n:2):n:c:4:c(:c:3-[#7]):c:c:c:c:4 279 | c:1:c-3:c(:c:c:c:1)-[#6]-2=[#7]-[!#1]=[#6]-[#6]-[#6]-2-[#6]-3=[#8] 280 | c:1-3:c(:c(:c(:c(:c:1-[#1])-[#1])-[#8]-[#6](-[#1])-[#1])-[#1])-[#6](=[#7]-[#7](-[#1])-c:2:c(:c(:c(:c(:c:2-[#1])-[#1])-[#6](=[#8])-[#8]-[#1])-[#1])-[#1])-c:4:c-3:c(:c(:c(:c:4-[#1])-[#8]-[#6](-[#1])-[#1])-[#1])-[#1] 281 | c:1(:c(:c(:c(:c(:c:1-[#1])-[#1])-[#7](-[#1])-[#1])-[#1])-[#1])-[#16](=[#8])(=[#8])-[#7](-[#1])-c:2:n:n:c(:c(:c:2-[#1])-[#1])-[#1] 282 | c2(c(-[#1])n(-[#6](-[#1])-[#1])c:3:c(:c(:c:1n(c(c(c:1:c2:3)-[#1])-[#1])-[#6](-[#1])-[#1])-[#8]-[#6](-[#1])-[#1])-[#8]-[#6](-[#1])-[#1])-[#1] 283 | c1(c-2c(c(n1-[#6](-[#8])=[#8])-[#6](-[#1])-[#1])-[#16]-[#6](-[#1])(-[#1])-[#16]-2)-[#6](-[#1])-[#1] 284 | s1ccnc1-c2c(n(nc2-[#1])-[#1])-[#7](-[#1])-[#1] 285 | c1(c(c(c(n1-[#1])-c:2:c(:c(:c(:c(:c:2-[#1])-[#1])-[#1])-[#1])-[#1])-[#6](-[#1])-[#1])-[#1])-[#6](=[#8])-[#8]-[#1] 286 | c:1:2(:c(:c(:c(:o:1)-[#6])-[#1])-[#1])-[#6](=[#8])-[#7](-[#1])-[#6]:[#6](-[#1]):[#6](-[#1]):[#6](-[#1]):[#6](-[#1]):[#6]:2-[#6](=[#8])-[#8]-[#1] 287 | [!#1]:[#6]-[#6](=[#16])-[#7](-[#1])-[#7](-[#1])-[#6]:[!#1] 288 | [#6]-1(=[#8])-[#6](-[#6](-[#6]#[#7])=[#6](-[#1])-[#7])-[#6](-[#7])-[#6]=[#6]-1 289 | c2(c-1n(-[#6](-[#6]=[#6]-[#7]-1)=[#8])nc2-c3cccn3)-[#6]#[#7] 290 | [#8]=[#6]-1-[#6](=[#7]-[#7]-[#6]-[#6]-1)-[#6]#[#7] 291 | c:2(:c:1:c:c:c:c:c:1:n:n:c:2)-[#6](-[#6]:[#6])-[#6]#[#7] 292 | c:1:c:c-2:c(:c:c:1)-[#6]=[#6]-[#6](-[#7]-2-[#6](=[#8])-[#7](-[#1])-c:3:c:c(:c(:c:c:3)-[#8]-[#6](-[#1])-[#1])-[#8]-[#6](-[#1])-[#1])(-[#6](-[#1])-[#1])-[#6](-[#1])-[#1] 293 | c:2:c:c:1:n:c(:c(:n:c:1:c:c:2)-c:3:c:c:c:c:c:3)-c:4:c:c:c:c:c:4-[#8]-[#1] 294 | [#6](-[#1])(-[#1])-[#6](-[#8]-[#1])=[#6](-[#6](=[#8])-[#6](-[#1])-[#1])-[#6](-[#1])-[#6]#[#6] 295 | c:1:c:4:c(:c:c2:c:1nc(n2-[#1])-[#6]-[#8]-[#6](=[#8])-c:3:c:c(:c:c(:c:3)-[#7](-[#1])-[#1])-[#7](-[#1])-[#1]):c:c:c:c:4 296 | c:2(:c:1:c:c:c:c-3:c:1:c(:c:c:2)-[#6]=[#6]-[#6]-3=[#7])-[#7] 297 | c:2(:c:1:c:c:c:c:c:1:c-3:c(:c:2)-[#6](-c:4:c:c:c:c:c-3:4)=[#8])-[#8]-[#1] 298 | [#6]-,:2(-,:[#6]=,:[#7]-,:c:1:c:c(:c:c:c:1-,:[#8]-,:2)-[Cl])=[#8] 299 | [#6]-1=[#6]-[#7](-[#6](-c:2:c-1:c:c:c:c:2)(-[#6]#[#7])-[#6](=[#16])-[#16])-[#6]=[#8] 300 | c2(nc:1:c(:c(:c(:c(:c:1-[#1])-[#1])-[#1])-[#1])n2-[#6])-[#7](-[#1])-[#6](-[#7](-[#1])-c:3:c(:c:c:c:c:3-[#1])-[#1])=[#8] 301 | [#7](-[#1])(-[#6]:[#6])-c:1:c(-[#6](=[#8])-[#8]-[#1]):c:c:c(:n:1)-,:[#6]:[#6] 302 | c:1-3:c(:c:c:c:c:1)-[#16]-[#6](=[#7]-[#7]=[#6]-2-[#6]=[#6]-[#6]=[#6]-[#6]=[#6]-2)-[#7]-3-[#6](-[#1])-[#1] 303 | c:1-2:c(:c(:c(:c(:c:1-[#1])-[#8]-[#6](-[#1])-[#1])-[#8]-[#6](-[#1])-[#1])-[#1])-[#6](=[#6](-[#6])-[#16]-[#6]-2(-[#1])-[#1])-[#6] 304 | c:12:c(:c(:c(:c(:c:1-[#1])-[#1])-[#1])-[#1])c(c(-[#6]:[#6])n2-!@[#6]:[#6])-[#6](-[#1])-[#1] 305 | [#7](-[#1])(-[#1])-c:1:c:c:c(:c:c:1-[#8]-[#1])-[#16](=[#8])(=[#8])-[#8]-[#1] 306 | s:1:c:c:c(:c:1-[#1])-c:2:c:s:c(:n:2)-[#7](-[#1])-[#1] 307 | c1c(-[#7](-[#1])-[#1])nnc1-c2c(-[#6](-[#1])-[#1])oc(c2-[#1])-[#1] 308 | n1nscc1-c2nc(no2)-[#6]:[#6] 309 | c:1(:c:c-3:c(:c:c:1)-[#7]-[#6]-4-c:2:c:c:c:c:c:2-[#6]-[#6]-3-4)-[#6;X4] 310 | c:1-2:c(:c(:c(:c(:c:1-[#1])-[#1])-[#1])-[#1])-[#6](=[#6](-[#1])-[#6]-3-[#6](-[#6]#[#7])-[#6](-[#1])(-[#1])-[#6](-[#1])-[#7]-2-3)-[#1] 311 | c:2-,:3:c(:c:c:1:c:c:c:c:c:1:c:2)-,:[#7](-[#6](-[#1])-[#1])-,:[#6](=[#8])-,:[#6](=,:[#7]-,:3)-[#6]:[#6]-[#7](-[#1])-[#6](-[#1])-[#1] 312 | [#6](-[#8]-[#1]):[#6]-[#6](=[#8])-[#6](-[#1])=[#6](-[#6])-[#6] 313 | c:1:2:c(:c(:c(:c(:c:1-[#1])-[#1])-[#7](-[#6](-[#1])-[#1])-[#6](-[#1])-[#1])-[#1]):c(:c(-[#1]):n:2-[#1])-[#16](=[#8])=[#8] 314 | c:1:2:c(:c(:c(:c(:c:1-[#1])-[#1])-[#7](-[#1])-[#1])-[#1]):c(:c(-[#1]):n:2-[#6](-[#1])-[#1])-[#1] 315 | [#16;X2]-1-[#6]=[#6](-[#6]#[#7])-[#6](-[#6])(-[#6]=[#8])-[#6](=[#6]-1-[#7](-[#1])-[#1])-[$([#6]=[#8]),$([#6]#[#7])] 316 | [#7]-2-[#6]=[#6](-[#6]=[#8])-[#6](-c:1:c:c:c(:c:c:1)-[#7](-[#6](-[#1])-[#1])-[#6](-[#1])-[#1])-[#6]~3=,:[#6]-2~[#7]~[#6](~[#16])~[#7]~[#6]~3~[#7] 317 | c:1:c(:c:c:c:c:1)-[#6](=[#8])-[#7](-[#1])-c:2:c(:c:c:c:c:2)-[#6](=[#8])-[#7](-[#1])-[#7](-[#1])-c:3:n:c:c:s:3 318 | c:1:c:2:c(:c:c:c:1):c(:c:3:c(:c:2):c:c:c:c:3)-[#6]=[#7]-[#7](-[#1])-c:4:c:c:c:c:c:4 319 | c:1:c(:c:c:c:c:1)-[#6](-[#1])-[#7]-[#6](=[#8])-[#6](-[#7](-[#1])-[#6](-[#1])-[#1])=[#6](-[#1])-[#6](=[#8])-c:2:c:c:c(:c:c:2)-[#8]-[#6](-[#1])-[#1] 320 | s:1:c(:c(-[#1]):c(:c:1-[#6]-3=[#7]-c:2:c:c:c:c:c:2-[#6](=[#7]-[#7]-3-[#1])-c:4:c:c:n:c:c:4)-[#1])-[#1] 321 | o:1:c(:c(-[#1]):c(:c:1-[#6](-[#1])(-[#1])-[#7](-[#1])-[#6](=[#16])-[#7](-[#6]-[#1])-[#6](-[#1])(-[#1])-c:2:c:c:c:c:c:2)-[#1])-[#1] 322 | c:1:c(:c:c:c:c:1)-[#7](-[#6]-[#1])-[#6](-[#1])-[#6](-[#1])-[#6](-[#1])-[#7](-[#1])-[#6](=[#8])-[#6]-,:2=,:[#6](-,:[#8]-,:[#6](-,:[#6](=,:[#6]-,:2-[#6](-[#1])-[#1])-[#1])=[#8])-[#6](-[#1])-[#1] 323 | c2-3:c:c:c:1:c:c:c:c:c:1:c2-[#6](-[#1])-[#6;X4]-[#7]-[#6]-3=[#6](-[#1])-[#6](=[#8])-[#7](-[#6](-[#1])-[#1])-[#6](-[#1])-[#1] 324 | c:1:c(:c:c:c:c:1)-[#6]-4=[#7]-[#7]:2:[#6](:[#7+]:c:3:c:2:c:c:c:c:3)-[#16]-[#6;X4]-4 325 | [#6]-2(=[#8])-[#6](=[#6](-[#6](-[#1])-[#1])-[#7](-[#1])-[#6](-[#1])(-[#1])-[#6](-[#1])(-[#1])-[#6](-[#1])-[#1])-[#7]=[#6](-c:1:c:c:c:c:c:1)-[#8]-2 326 | c:1:c(:c:c:c:c:1)-[#7]-2-[#6](=[#8])-[#6](=[#6](-[#1])-[#6]-2=[#8])-[#16]-c:3:c:c:c:c:c:3 327 | [#7]-,:1(-[#1])-,:[#7]=,:[#6](-[#7]-[#1])-,:[#16]-,:[#6](=,:[#6]-,:1-,:[#6]:[#6])-,:[#6]:[#6] 328 | c:1(:c(:c-3:c(:c(:c:1-[#7](-[#1])-[#6](=[#16])-[#7](-[#1])-[#6](-[#1])-c:2:c(:c(:c(:o:2)-[#6]-[#1])-[#1])-[#1])-[#1])-[#8]-[#6](-[#8]-3)(-[#1])-[#1])-[#1])-[#1] 329 | c:1(:c(:c(:c(:c(:c:1-[#7](-[#1])-[#6](=[#16])-[#7](-[#1])-c:2:c:c:c:c:c:2)-[#1])-[#7](-[#6](-[#1])-[#1])-[#6](-[#1])-[#1])-[#1])-[#1])-[#1] 330 | [#8]=[#6]-!@n:1:c:c:c-,:2:c:1-,:[#7](-[#1])-,:[#6](=[#16])-,:[#7]-,:2-[#1] 331 | [#6](-[F])(-[F])-[#6](=[#8])-[#7](-[#1])-c:1:c(-[#1]):n(-[#6](-[#1])(-[#1])-[#6](-[#1])(-[#1])-[#8]-[#6](-[#1])(-[#1])-[#6]:[#6]):n:c:1-[#1] 332 | [#7]-2=[#7]-[#6]:1:[#7]:[!#6&!#1]:[#7]:[#6]:1-[#7]=[#7]-[#6]:[#6]-2 333 | [#6]-2(-[#1])(-[#8]-[#1])-[#6]:1:[#7]:[!#6&!#1]:[#7]:[#6]:1-[#6](-[#1])(-[#8]-[#1])-[#6]=[#6]-2 334 | [#6]-1(-[#6](-[#1])(-[#1])-[#6]-1(-[#1])-[#1])(-[#6](=[#8])-[#7](-[#1])-c:2:c:c:c(:c:c:2)-[#8]-[#6](-[#1])(-[#1])-[#8])-[#16](=[#8])(=[#8])-[#6]:[#6] 335 | [#6]-1:[#6]-[#6](=[#8])-[#6]=[#6]-1-[#7]=[#6](-[#1])-[#7](-[#6;X4])-[#6;X4] 336 | c:1:c:c(:c:c-,:2:c:1-,:[#6](=,:[#6](-[#1])-,:[#6](=[#8])-,:[#8]-,:2)-c:3:c:c:c:c:c:3)-[#8]-[#6](-[#1])(-[#1])-[#6]:[#8]:[#6] 337 | c:1:c(:o:c(:c:1-[#6](-[#1])-[#1])-[#6](-[#1])-[#1])-[#6](-[#1])(-[#1])-[#7]-[#6](-[#1])(-[#1])-[#6](-[#1])(-[#8]-[#6](-[#1])-[#1])-[#6](-[#1])(-[#1])-[#8]-c:2:c:c-3:c(:c:c:2)-[#8]-[#6](-[#8]-3)(-[#1])-[#1] 338 | [#7]-4(-c:1:c:c:c:c:c:1)-[#6](=[#8])-[#16]-[#6](-[#1])(-[#7](-[#1])-c:2:c:c:c:c:3:c:c:c:c:c:2:3)-[#6]-4=[#8] 339 | [#7]-3(-[#6](=[#8])-c:1:c:c:c:c:c:1)-[#6](=[#7]-c:2:c:c:c:c:c:2)-[#16]-[#6](-[#1])(-[#1])-[#6]-3=[#8] 340 | [#7]-2(-c:1:c:c:c:c:c:1)-[#6](=[#8])-[#16]-[#6](-[#1])(-[#1])-[#6]-2=[#16] 341 | [#7]-1(-[#6](-[#1])-[#1])-[#6](=[#16])-[#7](-[#6]:[#6])-[#6](=[#7]-[#6]:[#6])-[#6]-1=[#7]-[#6]:[#6] 342 | [#16]-1-[#6](=[#7]-[#7]-[#1])-[#16]-[#6](=[#7]-[#6]:[#6])-[#6]-1=[#7]-[#6]:[#6] 343 | [#6]-2(=[#8])-[#6](=[#6](-[#1])-c:1:c(:c:c:c(:c:1)-[F,Cl,Br,I])-[#8]-[#6](-[#1])-[#1])-[#7]=[#6](-[#16]-[#6](-[#1])-[#1])-[#16]-2 344 | [#6](-[#1])(-[#1])-[#16]-[#6](=[#16])-[#7](-[#1])-[#6](-[#1])(-[#1])-[#6]:[#6] 345 | c:1(:c(:c(:c(:c(:c:1-[#1])-[#1])-[#6](-[#1])-[#1])-[#7](-[#1])-[#6](=[#8])-[#6](-[#1])(-[#1])-[#6](-[#1])(-[#1])-[#6]:[#6])-[#1])-[#7](-[#1])-[#6](=[#8])-[#6](-[#1])(-[#1])-[#6](-[#1])(-[#1])-[#6]:[#6] 346 | c:1(:c(:c(:c(:c(:c:1-[#6](-[#1])-[#1])-[#1])-[Br])-[#1])-[#6](-[#1])-[#1])-[#7](-[#1])-[#6](=[#8])-[#7](-[#1])-[#6](-[#1])(-[#1])-[#6](-[#1])(-[#1])-[#6](-[#1])-[#1] 347 | c:1-2:c(:c:c:c(:c:1-[#8]-[#6](-[#1])(-[#1])-[#7](-[#6]:[#6]-[#8]-[#6](-[#1])-[#1])-[#6]-2(-[#1])-[#1])-[#1])-[#1] 348 | c:1-2:c(:c(:c(:c(:c:1-[#8]-[#6](-[#1])(-[#1])-[#7](-[#6](-[#1])-[#1])-[#6]-2(-[#1])-[#1])-[#1])-[#8])-[#8])-[#1] 349 | [#7](-[#1])(-c:1:c(:c(:c(:c(:c:1-[#1])-[#1])-[#6](-[#1])(-[#6](-[#1])-[#1])-[#6](-[#1])-[#1])-[#1])-[#1])-[#6](-[#1])(-[#1])-[#6](-[#1])(-[#1])-[#7](-[#6](-[#1])-[#1])-[#6](-[#1])-[#1] 350 | n:1:2:c:c:c(:c:c:1:c:c(:c:2-[#6](=[#8])-[#6]:[#6])-[#6]:[#6])-[#6](~[#8])~[#8] 351 | c:1(:c(:c(:c(:c(:c:1-[#1])-[#1])-[#1])-[#6](=[#6](-[#1])-[#1])-[#6](-[#1])-[#1])-[#1])-[#6](-[#6;X4])(-[#6;X4])-[#7](-[#1])-[#6](=[#8])-[#7](-[#6](-[#1])(-[#1])-[#6](-[#1])-[#1])-[#6](-[#1])(-[#1])-[#6](-[#1])(-[#1])-[#6](-[#1])-[#6](-[#1])(-[#1])-[#6]:[#6] 352 | [#6]-3(-[#1])(-n:1:c(:n:c(:c:1-[#1])-[#1])-[#1])-c:2:c(:c(:c(:c(:c:2-[#1])-[Br])-[#1])-[#1])-[#6](-[#1])(-[#1])-[#6](-[#1])(-[#1])-c:4:c-3:c(:c(:c(:c:4-[#1])-[#1])-[#1])-[#1] 353 | [#6](=[#6](-[#1])-[#6](-[#1])(-[#1])-n:1:c(:n:c(:c:1-[#1])-[#1])-[#1])(-[#6]:[#6])-[#6]:[#6] 354 | c:1(:n:c(:c(-[#1]):s:1)-c:2:c:c:n:c:c:2)-[#7](-[#1])-[#6]:[#6]-[#6](-[#1])-[#1] 355 | c:1(:n:c(:c(-[#1]):s:1)-c:2:c:c:c:c:c:2)-[#6](-[#1])(-[#6](-[#1])-[#1])-[#6](-[#1])(-[#1])-[#6](-[#1])(-[#1])-[#7]-[#6](-[#1])(-[#1])-c:3:c:c:c:n:3-[#1] 356 | n:1(-[#1]):c(:c(-[#6](-[#1])-[#1]):c(:c:1-[#6](-[#1])(-[#1])-[#6](-[#1])-[#1])-[#6](-[#1])(-[#1])-[#6](-[#1])-[#1])-[#6](=[#8])-[#8]-[#6](-[#1])-[#1] 357 | c:2(:n:c:1:c(:c(:c:c(:c:1-[#1])-[F,Cl,Br,I])-[#1]):n:2-[#1])-[#16]-[#6](-[#1])(-[#1])-[#6](=[#8])-[#7](-[#1])-[#6]:[#6] 358 | c:1(:c(:c-2:c(:c(:c:1-[#8]-[#6](-[#1])-[#1])-[#1])-[#6]=[#6]-[#6](-[#1])-[#16]-2)-[#1])-[#8]-[#6](-[#1])-[#1] 359 | [#7]-1(-[#1])-[#6](=[#16])-[#6](-[#1])(-[#6]#[#7])-[#6](-[#1])(-[#6]:[#6])-[#6](=[#6]-1-[#6]:[#6])-[#1] 360 | n:1:c(:c(:c(:c(:c:1-[#16;X2]-c:2:c:c:c:c:c:2-[#7](-[#1])-[#1])-[#6]#[#7])-c:3:c:c:c:c:c:3)-[#6]#[#7])-[#7](-[#1])-[#1] 361 | [#7]-,:2(-c:1:c:c:c(:c:c:1)-[#8]-[#6](-[#1])-[#1])-,:[#6](=[#8])-,:[#6](=,:[#6]-,:[#6](=,:[#7]-,:2)-n:3:c:n:c:c:3)-[#6]#[#7] 362 | o:1:c(:c:c:2:c:1:c(:c(:c(:c:2-[#1])-[#8]-[#6](-[#1])-[#1])-[#8]-[#6](-[#1])-[#1])-[#1])-[#6](~[#8])~[#8] 363 | [#6]#[#6]-[#6](=[#8])-[#6]#[#6] 364 | c:2(:c:1:c(:c(:c(:c(:c:1:c(:c(:c:2-[#8]-[#1])-[#6]=[#8])-[#1])-[#1])-[#1])-[#1])-[#1])-[#7](-[#1])-[#1] 365 | c:1(:c(:c(:[c;!H0,$(c-[#6;!H0;!H1])](:o:1))-[#1])-[#1])-[#6](=[#8])-[#7](-[#1])-[#7]=[#6;!H0,$([#6]-[#6;!H0!H1])]-c:2:c:c:c:c(:c:2)-[*]-[*]-[*]-c:3:c:c:c:o:3 366 | [#16](=[#8])(=[#8])-[#7](-[#1])-c:1:c(:c(:c(:s:1)-[#6]-[#1])-[#6]-[#1])-[#6](=[#8])-[#7]-[#1] 367 | [#6](-[#1])(-[#1])-[#8]-c:1:c(:c(:c(:c(:c:1-[#1])-[#1])-[#1])-[#1])-[#7](-[#1])-[#6](-[#1])(-[#1])-[#6](-[#1])(-[#8]-[#1])-[#6](-[#1])-[#1] 368 | [#6](-[#1])(-[#1])-[#8]-c:1:c(:c(:c(:c(:c:1-[#1])-[#1])-[#1])-[#1])-[#7](-[#1])-[#6](-[#1])(-[#6]=[#8])-[#16] 369 | n1nnnc2cccc12 370 | c:1-,:2:c(-[#1]):s:c(:c:1-,:[#6](=[#8])-,:[#7]-,:[#7]=,:[#6]-,:2-[#7](-[#1])-[#1])-[#6]=[#8] 371 | c:1-,:3:c(:c:2:c(:c:c:1-[Br]):o:c:c:2)-,:[#6](=,:[#6]-,:[#6](=[#8])-,:[#8]-,:3)-[#1] 372 | c:1-,:3:c(:c:c:c:c:1)-,:[#6](=,:[#6](-[#6](=[#8])-[#7](-[#1])-c:2:n:o:c:c:2-[Br])-,:[#6](=[#8])-,:[#8]-,:3)-[#1] 373 | c:1-,:2:c(:c:c(:c:c:1-[F,Cl,Br,I])-[F,Cl,Br,I])-,:[#6](=,:[#6](-[#6](=[#8])-[#7](-[#1])-[#1])-,:[#6](=[#7]-[#1])-,:[#8]-,:2)-[#1] 374 | c:1-,:3:c(:c:c:c:c:1)-,:[#6](=,:[#6](-[#6](=[#8])-[#7](-[#1])-c:2:n:c(:c:s:2)-[#6]:[#16]:[#6]-[#1])-,:[#6](=[#8])-,:[#8]-,:3)-[#1] 375 | [#6](-[#1])(-[#1])-[#16;X2]-c:2:n:n:c:1-[#6]:[#6]-[#7]=[#6]-[#8]-c:1:n:2 376 | [#16](=[#8])(=[#8])(-c:1:c:n(-[#6](-[#1])-[#1]):c:n:1)-[#7](-[#1])-c:2:c:n(:n:c:2)-[#6](-[#1])(-[#1])-[#6]:[#6]-[#8]-[#6](-[#1])-[#1] 377 | c:1-2:c(:c(:c(:c(:c:1-[#8]-[#6](-[#1])(-[#1])-[#8]-2)-[#6](-[#1])(-[#1])-[#7]-3-[#6](-[#1])(-[#1])-[#6](-[#1])(-[#1])-[#6]:[#6]-3)-[#1])-[#1])-[#1] 378 | [#6](-[#1])(-[#1])-[#8]-[#6]:[#6]-[#6](-[#1])(-[#1])-[#7](-[#1])-c:2:c(:c(:c:1:n(:c(:n:c:1:c:2-[#1])-[#1])-[#6]-[#1])-[#1])-[#1] 379 | [#7]-4(-c:1:c:c:c:c:c:1)-[#6](=[#7+](-c:2:c:c:c:c:c:2)-[#6](=[#7]-c:3:c:c:c:c:c:3)-[#7]-4)-[#1] 380 | [#6](-[#1])(-[#1])-[#7](-[#6](-[#1])-[#1])-c:2:c:c:c:1:s:c(:n:c:1:c:2)-[#16]-[#6](-[#1])-[#1] 381 | c:1:2:c(:c(:c(:c(:c:1:c(:c(-[#1]):c(:c:2-[#1])-[#1])-[#6](-[#6](-[#1])-[#1])=[#7]-[#7](-[#1])-[#6](=[#16])-[#7](-[#1])-[#6]:[#6]:[#6])-[#1])-[#1])-[#1])-[#1] 382 | [#6]:1(:[#7]:[#6](:[#7]:[!#1]:[#7]:1)-c:2:c(:c(:c(:o:2)-[#1])-[#1])-[#1])-[#16]-[#6;X4] 383 | n:1:c(:n:c(:n:c:1-[#7](-[#6](-[#1])-[#1])-[#6](-[#1])-[#1])-[#7](-[#6](-[#1])-[#1])-[#6](-[#1])-[#1])-[#7](-[#6]-[#1])-[#6]=[#8] 384 | c:1(:n:s:c(:n:1)-[#7](-[#6](-[#1])-[#1])-[#6](-[#1])(-[#1])-[#6](-[#1])(-[#1])-[#7]-[#6](=[#8])-c:2:c:c:c:c:c:2-[#6](=[#8])-[#8]-[#1])-c:3:c:c:c:c:c:3 385 | n:1:c(:c(:c(:c(:c:1-[#1])-[#1])-[#1])-[#1])-[#6](=[#8])-[#7](-[#1])-[#7]=[#6](-[#1])-c:2:c:c:c:c:c:2-[#8]-[#6](-[#1])(-[#1])-[#6](=[#8])-[#8]-[#1] 386 | [#6](-[#1])(-[#1])(-[#1])-[#6](-[#6](-[#1])(-[#1])-[#1])(-[#6](-[#1])(-[#1])-[#1])-c:1:c(:c(:c(:c(:c:1-[#8]-[#1])-[#6](-[#6](-[#1])(-[#1])-[#1])(-[#6](-[#1])(-[#1])-[#1])-[#6](-[#1])(-[#1])-[#1])-[#1])-[#6](-[#1])(-[#1])-c:2:c:c:c(:c(:c:2-[#1])-[#1])-[#8]-[#1])-[#1] 387 | [#7](-[#1])(-[#1])-c:1:c(-[#7](-[#1])-[#1]):c(:c(-[#1]):c:2:n:o:n:c:1:2)-[#1] 388 | [#7](-[#1])(-[#1])-c:1:c(:c(:c(:c(:c:1-[#7](-[#1])-[#16](=[#8])=[#8])-[#1])-[#7](-[#1])-[#6](-[#1])-[#1])-[F,Cl,Br,I])-[#1] 389 | [#7](-[#1])(-[#1])-c:1:c(:c(:c(:c(:c:1-[#7]=[#6]-2-[#6](=[#6]~[#6]~[#6]=[#6]-2)-[#1])-[#1])-[#1])-[#1])-[#1] 390 | [#7](-[#1])(-[#1])-c:1:c(:c(:c(:c(:c:1-n:2:c:c:c:c:2)-[#1])-[#6](-[#1])-[#1])-[#6](-[#1])-[#1])-[#1] 391 | [#16]=[#6]-[#6](-[#6](-[#1])-[#1])=[#6](-[#6](-[#1])-[#1])-[#7](-[#6](-[#1])-[#1])-[#6](-[#1])-[#1] 392 | [#6]-1:[#6]-[#8]-[#6]-2-[#6](-[#1])(-[#1])-[#6](=[#8])-[#8]-[#6]-1-2 393 | [#8]-[#6](=[#8])-[#6](-[#1])(-[#1])-[#16;X2]-[#6](=[#7]-[#6]#[#7])-[#7](-[#1])-c:1:c:c:c:c:c:1 394 | [#8]=[#6]-[#6]-1=[#6](-[#16]-[#6](=[#6](-[#1])-[#6])-[#16]-1)-[#6]=[#8] 395 | [#8]=[#6]-1-[#7]-[#7]-[#6](=[#7]-[#6]-1=[#6]-[#1])-[!#1]:[!#1] 396 | [#8]=[#6]-[#6](-[#1])=[#6](-[#6]#[#7])-[#6] 397 | [#8](-[#1])-[#6](=[#8])-c:1:c(:c(:c(:c(:c:1-[#8]-[#1])-[#1])-c:2:c(-[#1]):c(:c(:o:2)-[#6](-[#1])=[#6](-[#6]#[#7])-c:3:n:c:c:n:3)-[#1])-[#1])-[#1] 398 | c:1:c(:c:c:c:c:1)-[#7](-c:2:c:c:c:c:c:2)-[#7]=[#6](-[#1])-[#6]:3:[#6](:[#6](:[#6](:[!#1]:3)-c:4:c:c:c:c(:c:4)-[#6](=[#8])-[#8]-[#1])-[#1])-[#1] 399 | [#7](-[#1])(-[#1])-c:1:c(:c(:c(:c(:c:1-[#1])-[#1])-c:2:c(-[#1]):c(:c(-[#6](-[#1])-[#1]):o:2)-[#6]=[#8])-[#1])-[#1] 400 | [#8](-[#1])-[#6](=[#8])-c:1:c:c:c(:c:c:1)-[#7]-[#7]=[#6](-[#1])-[#6]:2:[#6](:[#6](:[#6](:[!#1]:2)-c:3:c:c:c:c:c:3)-[#1])-[#1] 401 | [#8](-[#1])-[#6](=[#8])-c:1:c:c:c:c(:c:1)-[#6]:[!#1]:[#6]-[#6]=[#7]-[#7](-[#1])-[#6](=[#8])-[#6](-[#1])(-[#1])-[#8] 402 | [#8](-[#1])-[#6]:1:[#6](:[#6]:[!#1]:[#6](:[#7]:1)-[#7](-[#1])-[#1])-[#6](-[#1])(-[#1])-[#6](=[#8])-[#8] 403 | [#6]-1(=[!#6&!#1])-[#6](-[#7]=[#6]-[#16]-1)=[#8] 404 | n2(-c:1:c:c:c:c:c:1)c(c(-[#1])c(c2-[#6]=[#7]-[#8]-[#1])-[#1])-[#1] 405 | n2(-[#6](-[#1])-c:1:c(:c(:c:c(:c:1-[#1])-[#1])-[#1])-[#1])c(c(-[#1])c(c2-[#6]-[#1])-[#1])-[#6]-[#1] 406 | n1(-[#6](-[#1])-[#1])c(c(-[#6](=[#8])-[#6])c(c1-[#6]:[#6])-[#6])-[#6](-[#1])-[#1] 407 | n1(-[#6])c(c(-[#1])c(c1-[#6](-[#1])=[#6](-[#6]#[#7])-c:2:n:c:c:s:2)-[#1])-[#1] 408 | n3(-c:1:c:c:c:c:c:1-[#7](-[#1])-[#16](=[#8])(=[#8])-c:2:c:c:c:s:2)c(c(-[#1])c(c3-[#1])-[#1])-[#1] 409 | n2(-c:1:c(:c(:c(:c(:c:1-[#1])-[#1])-[#1])-[#1])-[#6](=[#8])-[#7](-[#1])-[#6](-[#1])(-[#6](-[#1])-[#1])-[#6](-[#1])(-[#1])-[#8]-[#6]:[#6])c(c(-[#1])c(c2-[#1])-[#1])-[#1] 410 | c:1(:c:c:c:c:c:1)-[#7](-[#1])-[#6](=[#16])-[#7]-[#7](-[#1])-[#6](-[#1])=[#6](-[#1])-[#6]=[#8] 411 | [#6]-1(-[#6](=[#8])-[#6](-[#1])(-[#1])-[#6]-[#6](-[#1])(-[#1])-[#6]-1=[#8])=[#6](-[#7]-[#1])-[#6]=[#8] 412 | [#7](-[#1])(-[#1])-[#6]-1=[#6](-[#6]#[#7])-[#6](-[#1])(-[#6]:[#6])-[#16]-[#6;X4]-[#16]-1 413 | [#6](-[#1])(-[#1])-[#8]-c:1:c(:c(:c(:c(:c:1-[#1])-[#1])-[#1])-[#1])-[#7](-[#1])-c:2:c:c:n:c:3:c(:c:c:c(:c:2:3)-[#8]-[#6](-[#1])-[#1])-[#8]-[#6](-[#1])-[#1] 414 | [#6](-[#1])(-[#1])-[#8]-c:1:c(:c(:c(:c(:c:1-[#1])-[#1])-[#8]-[#6](-[#1])-[#1])-[#1])-[#7](-[#1])-c:2:n:c(:c:s:2)-c:3:c:c:c(:c:c:3)-[#8]-[#6](-[#1])-[#1] 415 | [#6]~1~3~[#7](-[#6]:[#6])~[#6]~[#6]~[#6]~[#6]~1~[#6]~2~[#7]~[#6]~[#6]~[#6]~[#7+]~2~[#7]~3 416 | [#7]-3(-c:2:c:1:c:c:c:c:c:1:c:c:c:2)-[#7]=[#6](-[#6](-[#1])-[#1])-[#6](-[#1])(-[#1])-[#6]-3=[#8] 417 | [#6]-1(=[#6;!H0,$([#6]-[#6;!H0;!H1]),$([#6]-[#6]=[#8])]-[#16]-[#6](-[#7;!H0,$([#7]-[#6;!H0]),$([#7]-[#6]:[#6])]-1)=[#7;!R])-[$([#6](-[#1])-[#1]),$([#6]:[#6])] 418 | n2(-[#6]:1:[!#1]:[#6]:[#6]:[#6]:[#6]:1)c(cc(c2-[#6;X4])-[#1])-[#6;X4] 419 | c:1:c:c(:c(:c:c:1)-[#8]-[#1])-[#8]-[#1] 420 | [#6]-1(=[#6])-[#6](-[#7]=[#6]-[#16]-1)=[#8] 421 | [#6]-1=[!#1]-[!#6&!#1]-[#6](-[#6]-1=[!#6&!#1;!R])=[#8] 422 | [#6]-1(-[#6](-[#6]=[#6]-[!#6&!#1]-1)=[#6])=[!#6&!#1] 423 | [#6]-[#7]-1-[#6](-[#1])(-[#1])-[#6](-[#1])(-[#1])-[#7](-[#6](-[#1])(-[#1])-[#6]-1(-[#1])-[#1])-[#7]=[#6](-[#1])-[#6]:[!#1] 424 | c:1-2:c(:c:c:c:c:1)-[#6](=[#8])-[#6;X4]-[#6]-2=[#8] 425 | n1(-[#6])c(c(-[#1])c(c1-[#6]=[#7]-[#7])-[#1])-[#1] 426 | [#6]=!@[#6](-[!#1])-@[#6](=!@[!#6&!#1])-@[#6](=!@[#6])-[!#1] 427 | [#6](-[#6]#[#7])(-[#6]#[#7])-[#6](-[#7](-[#1])-[#1])=[#6]-[#6]#[#7] 428 | c:1-2:c(:c:c:c:c:1)-[#6](=[#8])-[#6](=[#6])-[#6]-2=[#8] 429 | [#6]-,:1(=,:[!#1]-,:[!#1]=,:[!#1]-,:[#7](-,:[#6]-,:1=[#16])-[#1])-[#6]#[#7] 430 | c:1:c:c-2:c(:c:c:1)-[#6]-3-[#6](-[#6]-[#7]-2)-[#6]-[#6]=[#6]-3 431 | c:1:c:2:c(:c:c:c:1):n:c:3:c(:c:2-[#7]):c:c:c:c:3 432 | [#6]-1(=[#6])-[#6](=[#8])-[#7]-[#7]-[#6]-1=[#8] 433 | [#7](-[#1])(-[#1])-c:1:c(:c(:c(:s:1)-[!#1])-[!#1])-[#6]=[#8] 434 | [#7]-[#6]=!@[#6]-2-[#6](=[#8])-c:1:c:c:c:c:c:1-[!#6&!#1]-2 435 | c:1(:c(:c(:c(:c(:c:1-[#8]-[#1])-[F,Cl,Br,I])-[#1])-[F,Cl,Br,I])-[#1])-[#16](=[#8])(=[#8])-[#7] 436 | [#6]-[#6](=[#16])-[#6] 437 | c:1:c:c(:c:c:c:1-[#8]-[#1])-[#7](-[#1])-[#16](=[#8])=[#8] 438 | c:1(:c(:c(:c(:c(:c:1-[#1])-[#1])-[$([#8]),$([#7]),$([#6](-[#1])-[#1])])-[#1])-[#1])-[#7](-[#1])-[#1] 439 | [c;!H0,$(c-[#6](-[#1])-[#1]),$(c-[#6]:[#6])]:1:c(:c(:c(:s:1)-[#7](-[#1])-[#6](=[#8])-[#6])-[#6](=[#8])-[#8])-[$([#6]:1:[#6]:[#6]:[#6]:[#6]:[#6]:1),$([#6]:1:[#16]:[#6]:[#6]:[#6]:1)] 440 | [#7+]:1(:[#6]:[#6]:[!#1]:c:2:c:1:c(:[c;!H0,$(c-[#7])]:c:c:2)-[#1])-[$([#6](-[#1])(-[#1])-[#1]),$([#8;X1]),$([#6](-[#1])(-[#1])-[#6](-[#1])=[#6](-[#1])-[#1]),$([#6](-[#1])(-[#1])-[#6](-[#1])(-[#1])-[#8]-[#1]),$([#6](-[#1])(-[#1])-[#6](=[#8])-[#6]),$([#6](-[#1])(-[#1])-[#6](=[#8])-[#7](-[#1])-[#6]:[#6]),$([#6](-[#1])(-[#1])-[#6](-[#1])(-[#1])-[#1])] 441 | c:1:c:c:c:c(:c:1-[#7&!H0;!H1,!$([#7]-[#6]=[#8])])-[#6](-[#6]:[#6])=[#8] 442 | [#7](-[#1])-[#7]=[#6](-[#6]#[#7])-[#6]=[!#6&!#1;!R] 443 | [#7](-c:1:c:c:c:c:c:1)-[#16](=[#8])(=[#8])-[#6]:2:[#6]:[#6]:[#6]:[#6]:3:[#7]:[$([#8]),$([#16])]:[#7]:[#6]:2:3 444 | [#6](-[#1])(-[#1])-[#7](-[#6](-[#1])-[#1])-c:1:c(:c(:c(:c(:c:1-[#1])-[#1])-[#6](-[#1])=[#7]-[#7]-[$([#6](=[#8])-[#6](-[#1])(-[#1])-[#16]-[#6]:[#7]),$([#6](=[#8])-[#6](-[#1])(-[#1])-[!#1]:[!#1]:[#7]),$([#6](=[#8])-[#6]:[#6]-[#8]-[#1]),$([#6]:[#7]),$([#6](-[#1])(-[#1])-[#6](-[#1])-[#8]-[#1])])-[#1])-[#1] 445 | [#7]-1-[#6](=[#16])-[#16]-[#6;X4]-[#6]-1=[#8] 446 | [#7](-[#1])-[#7]=[#6]-[#6;!H0,$([#6]-[#6])]=[#6](-[#6])-!@[$([#7]),$([#8]-[#1])] 447 | n2(-[#6]:1:[!#1]:[#6]:[#6]:[#6]:[#6]:1)c(cc(c2-[#6]:[#6])-[#1])-[#6;X4] 448 | s1ccc(c1)-[#8]-[#1] 449 | [#6]-,:1(=,:[#6](-,:[#6](=[#8])-,:[#7]-,:[#6](=,:[#7]-,:1)-,:[!#6&!#1])-[#6]#[#7])-[#6] 450 | [#6]-1(-[#6](=[#8])-[#7]-[#6](=[#8])-[#7]-[#6]-1=[#8])=[#7] 451 | [#6](-[#1])(-[#1])-[#7]([#6]:[#6])~[#6][#6]=,:[#6]-[#6]~[#6][#7] 452 | c:2:c:1:c:c:c:c-,:3:c:1:c(:c:c:2)-,:[#7]-,:[#6]=,:[#7]-,:3 453 | c:2:c:1:c:c:c:c-3:c:1:c(:c:c:2)-[#7](-[#6;X4]-[#7]-3-[#1])-[#1] 454 | [#6]-[#6](=[#8])-[#6](-[#1])=[#6](-[#7](-[#1])-[#6])-[#6](=[#8])-[#8]-[#6] 455 | [#16]=[#6]-1-[#6]=,:[#6]-[!#6&!#1]-[#6]=,:[#6]-1 456 | [#6](-[#6]#[#7])(-[#6]#[#7])-[#6](-[$([#6]#[#7]),$([#6]=[#7])])-[#6]#[#7] 457 | c:1:2:c(:c(:c(:c(:c:1:c(:c(:c(:c:2-[#1])-[#8]-[#1])-[#6](=[#8])-[#7](-[#1])-[#7]=[#6])-[#1])-[#1])-[#1])-[#1])-[#1] 458 | [#8]=[#6]-c2c1nc(-[#6](-[#1])-[#1])cc(-[#8]-[#1])n1nc2 459 | n:1:c(:n(:c(:c:1-c:2:c:c:c:c:c:2)-c:3:c:c:c:c:c:3)-[#1])-[#6]:[!#1] 460 | [#6](-[#6]#[#7])(-[#6]#[#7])=[#6]-c:1:c:c:c:c:c:1 461 | c:1(:c:c:c:c:c:1-[#7](-[#1])-[#7]=[#6])-[#6](=[#8])-[#8]-[#1] 462 | [#7+]([#6]:[#6])=,:[#6]-[#6](-[#1])=[#6]-[#7](-[#6;X4])-[#6] 463 | [#7](-[#1])(-[#1])-[#6]-1=[#6](-[#6]#[#7])-[#6](-[#1])(-[#6]:[#6])-[#6](=[#6](-[#7](-[#1])-[#1])-[#16]-1)-[#6]#[#7] 464 | [#7]~[#6]:1:[#7]:[#7]:[#6](:[$([#7]),$([#6]-[#1]),$([#6]-[#7]-[#1])]:[$([#7]),$([#6]-[#7])]:1)-[$([#7]-[#1]),$([#8]-[#6](-[#1])-[#1])] 465 | [#6]-[#6]=[#6](-[F,Cl,Br,I])-[#6](=[#8])-[#6] 466 | [#6](-[#6]#[#7])(-[#6]#[#7])=[#7]-[#7](-[#1])-c:1:c:c:c:c:c:1 467 | [#6]-,:1(=,:[#6](-!@[#6](=[#8])-[#7]-[#6](-[#1])-[#1])-,:[#16]-,:[#6](-,:[#7]-,:1-,:[$([#6](-[#1])(-[#1])-[#6](-[#1])=[#6](-[#1])-[#1]),$([#6]:[#6])])=[#16])-,:[$([#7]-[#6](=[#8])-[#6]:[#6]),$([#7](-[#1])-[#1])] 468 | [#16]-1-[#6](=[#8])-[#7]-[#6](=[#8])-[#6]-1=[#6](-[#1])-[$([#6]-[#35]),$([#6]:[#6](-[#1]):[#6](-[F,Cl,Br,I]):[#6]:[#6]-[F,Cl,Br,I]),$([#6]:[#6](-[#1]):[#6](-[#1]):[#6]-[#16]-[#6](-[#1])-[#1]),$([#6]:[#6]:[#6]:[#6]:[#6]:[#6]:[#6]:[#6]:[#6]:[#6]-[#8]-[#6](-[#1])-[#1]),$([#6]:1:[#6](-[#6](-[#1])-[#1]):[#7](-[#6](-[#1])-[#1]):[#6](-[#6](-[#1])-[#1]):[#6]:1)] 469 | [#8]-,:1-,:[#6](-,:[#16]-,:c:2:c-,:1:c:c:c(:c:2)-,:[$([#7]),$([#8])])=[$([#8]),$([#16])] 470 | [#7](-[#6](-[#1])-[#1])(-[#6](-[#1])-[#1])-c:1:c(:c(:c(:o:1)-[#6]=[#7]-[#7](-[#1])-[#6]=[!#6&!#1])-[#1])-[#1] 471 | c:1(:c:c:c:c:c:1)-[#6](-[#1])=!@[#6]-3-[#6](=[#8])-c:2:c:c:c:c:c:2-[#16]-3 472 | [#6]-1(-[#6](~[!#6&!#1]~[#6]-[!#6&!#1]-[#6]-1=[!#6&!#1])~[!#6&!#1])=[#6;!R]-[#1] 473 | c:1:c:c(:c(:c:c:1)-[#6]=[#7]-[#7])-[#8]-[#1] 474 | [#6](-[#1])(-[#1])-[#7](-[#6](-[#1])-[#1])-c:1:c:c(:c(:[c;!H0,$(c-[#6](-[#1])-[#1]),$(c-[#8]-[#6](-[#1])(-[#1])-[#6](-[#1])-[#1])](:c:1))-[#7])-[#1] 475 | [n;!H0,$(n-[#6;!H0;!H1])]:1(c(c(c:2:c:1:c:c:c:c:2-[#1])-[#6;X4]-[#1])-[$([#6](-[#1])-[#1]),$([#6]=,:[!#6&!#1]),$([#6](-[#1])-[#7]),$([#6](-[#1])(-[#6](-[#1])-[#1])-[#6](-[#1])(-[#1])-[#7](-[#1])-[#6](-[#1])-[#1])]) 476 | [!#6&!#1]=[#6]-1-[#6]=,:[#6]-[#6](=[!#6&!#1])-[#6]=,:[#6]-1 477 | [#7;!R]=[#7] 478 | [#6]-[#6](=[!#6&!#1;!R])-[#6](=[!#6&!#1;!R])-[$([#6]),$([#16](=[#8])=[#8])] 479 | [#7]-[#6;X4]-c:1:c:c:c:c:c:1-[#8]-[#1] 480 | c:1:c:c(:c:c:c:1-[#7](-[#6;X4])-[#6;X4])-[#6]=[#6] 481 | c:1:c:c(:c:c:c:1-[#8]-[#6;X4])-[#7;$([#7!H0]-[#6;X4]),$([#7](-[#6;X4])-[#6;X4])] 482 | [#7]-1-[#6](=[#16])-[#16]-[#6](=[#6])-[#6]-1=[#8] 483 | c:1(:c:c:c(:c:c:1)-[#6]=[#7]-[#7])-[#8]-[#1] 484 | [#6]-1(=[#6])-[#6]=[#7]-[!#6&!#1]-[#6]-1=[#8] 485 | c:1:c:c(:c:c:c:1-[#7](-[#6;X4])-[#6;X4])-[#6;X4]-[$([#8]-[#1]),$([#6]=[#6]-[#1]),$([#7]-[#6;X4])] 486 | [#8]=[#6]-2-[#6](=!@[#7]-[#7])-c:1:c:c:c:c:c:1-[#7]-2 487 | [#6](-[#1])-[#7](-[#6](-[#1])-[#1])-c:1:c(:c(:c(:[c;!H0,$(c-[#6](-[#1])-[#1])](:c:1-[#1]))-[#6&!H0;!H1,$([#6]-[#6;!H0])])-[#1])-[#1] 488 | ''' 489 | 490 | if len(sys.argv) <= 1: 491 | print "Need smiles file" 492 | sys.exit(1) 493 | 494 | #create query mols from smarts 495 | smarts = [] 496 | for smart in pains.split('\n'): 497 | smarts.append(Chem.MolFromSmarts(smart)) 498 | 499 | for line in open(sys.argv[1]): 500 | try: 501 | smi = line.split()[0].replace('$','') 502 | mol = Chem.MolFromSmiles(smi) 503 | paincnt = 0 504 | for smart in smarts: 505 | if mol.HasSubstructMatch(smart): 506 | paincnt += 1 507 | print line.rstrip(),paincnt 508 | except: 509 | pass 510 | --------------------------------------------------------------------------------